{"version":3,"sources":["webpack:///external \"moment\"","webpack:///external \"angular\"","webpack:///./app/src/state/gettext-extract-util.js","webpack:///./app/src/app.settings.js","webpack:///./app/src/auth.js","webpack:///./app/src/components/assetpicker/asset.multi.picker.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/command.models.js","webpack:///./app/src/pages/errors/general/error.html","webpack:///./app/src/pages/admin/assets/tagging/_delete.attr.confirmation.modal.html","webpack:///./app/lib/wellknown.js","webpack:///./app/src/pages/admin/security-groups/view/users/users-modal/users.modal.html","webpack:///./app/src/pages/reports/jobschedules/job/job.create.html","webpack:///./app/src/equipment/asset-details-dashboard/asset-details-dashboard.component.html","webpack:///./app/src/equipment/components/images-modal/equipment-images.modal.html","webpack:///./app/src/pages/devices/view/install-notes-modal/notes.modal.html","webpack:///./app/src/pages/reports/jobschedules/job/job.update.html","webpack:///./app/src/pages/reports/jobschedules/_delete.schedule.confirmation.modal.html","webpack:///./app/src/pages/alerts/dashboard/table/list/notes-modal/note.html","webpack:///./app/src/pages/maintenance/plans/create/assets/add-asset.html","webpack:///./app/src/pages/maintenance/plans/create/create.html","webpack:///./app/src/equipment/equipment.detail.edit.controller.html","webpack:///./app/src/equipment/components/equipment-details/equipment-details.component.html","webpack:///./app/src/equipment/components/date-range/date-range.html","webpack:///./app/src/equipment/equipment-update/common/attr-edit/attr-edit.html","webpack:///./app/src/equipment/equipment-update/common/columns-toggle/columns-toggle.html","webpack:///./app/src/equipment/equipment-update/components/bulk-equipment-update/b-equipment-update.html","webpack:///./app/src/equipment/equipment-update/components/single-equipment-update/s-equipment-update.html","webpack:///./app/src/equipment/equipment-update/modal/equipment-update.modal.html","webpack:///./app/src/components/confirm-modal/confirm-modal.html","webpack:///./app/src/pages/Sites/site-manage-view/site-manage-view.html","webpack:///./app/src/pages/Sites/asset-list-view/asset-list-view.html","webpack:///./app/src/pages/Sites/site-view/site-view.html","webpack:///./app/src/pages/Sites/sites-list/sites-list.html","webpack:///./app/src/pages/Sites/sites-main.html","webpack:///./app/src/pages/Sites/common/users-list-view/users-list-view.html","webpack:///./app/src/pages/Sites/common/site-filters/site-filters.component.html","webpack:///./app/src/pages/Sites/common/search-input/search-input.html","webpack:///./app/src/pages/Sites/common/applied-filters-view/applied-filters-view.html","webpack:///./app/src/pages/Sites/common/chart/chart.html","webpack:///./app/src/pages/Sites/common/map/ga-map.component.html","webpack:///./app/src/pages/Sites/common/table/table.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/device-diagnostics/device-diagnostics.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/maintenance/asset-maintenance.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/alerts/asset-alerts.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/pin-location-modal/set-asset-location.modal.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/asset-location.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/images/asset-image-upload.modal.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/images/asset-image-edit.modal.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/asset-details.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/series-table/series-table.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/chart/series-chart.component.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/asset-data.component.html","webpack:///./app/src/pages/devices/sync-runhours-component/confirm-modal/sync-confirm.modal.html","webpack:///./app/src/pages/devices/sync-runhours-component/sync-runhours.html","webpack:///./app/src/equipment/list/filters/attribute-filter/invalid-entry-messaging/invalid-entry-messaging.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/numeric-range-filter/numeric-range-filter.component.html","webpack:///./app/src/equipment/list/filters/filters.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/range-date/range-date.template.html","webpack:///./app/src/equipment/list/filters/filter-input/filter-input.template.html","webpack:///./app/src/equipment/list/filters/attribute-filter/range-filter/range-filter.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/date-filter/date-filter.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/list-filter/list-filter.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/freeform-filter/freeform-filter.component.html","webpack:///./app/src/equipment/list/filters/attribute-filter/attribute-filter.component.html","webpack:///./app/src/pages/admin/assets/tagging/tag.bulk.html","webpack:///./app/src/pages/admin/assets/tagging/tag.create.html","webpack:///./app/src/pages/admin/assets/tagging/tag.details.html","webpack:///./app/src/pages/admin/assets/sharing/manage/manage.revoke-shared.modal.html","webpack:///./app/src/pages/admin/sub-accounts/view.html","webpack:///./app/src/pages/admin/sub-accounts/create.html","webpack:///./app/src/pages/admin/sub-accounts/list.html","webpack:///./app/src/pages/reports/filters/filter-text-input/filter-text-input.html","webpack:///./app/src/pages/reports/filters/single-select-dropdown/single-select-dropdown.html","webpack:///./app/src/pages/reports/filters/multi-select-dropdown/multi-select-dropdown.html","webpack:///./app/src/pages/reports/filters/filter-date-picker/filter-date-picker.html","webpack:///./app/src/pages/reports/filters/filters-view/filters-view.html","webpack:///./app/src/pages/reports/delete-custom-view-popup/delete-custom-view-popup.html","webpack:///./app/src/pages/reports/overwrite-cutom-view-popup/overwrite-custom-view-popup.html","webpack:///./app/src/pages/reports/export-options-popup/export-options-popup.html","webpack:///./app/src/pages/reports/interactive-report-view/interactive-report-view.html","webpack:///./app/src/pages/reports/reports-list/reports-list.html","webpack:///./app/src/pages/reports/reportview/datapointSelector/datapoint.selector.html","webpack:///./app/src/pages/map/components/map-hover-popup/map-hover-popup.html","webpack:///./app/src/pages/map/view/equipment/details/equipment-detail.component.html","webpack:///./app/src/pages/access-management/components/group-delete-popup/am-group-delete-popup.html","webpack:///./app/src/pages/access-management/components/asset-list-select-popup/am-assets-list-popup.html","webpack:///./app/src/pages/access-management/components/operatos-list-select-popup/am-operators-list-select-popup.html","webpack:///./app/src/pages/access-management/components/operator-delete-popup/am-operator-delete-popup.html","webpack:///./app/src/pages/access-management/components/no-codes-warning-popup/no-codes-popup.html","webpack:///./app/src/pages/access-management/components/controls/ipaf-input/ipaf-input.html","webpack:///./app/src/pages/access-management/components/controls/search-input/search-input.html","webpack:///./app/src/pages/access-management/components/controls/add-input/add-input.html","webpack:///./app/src/pages/access-management/components/operator-assets-list/operator-assets-list.html","webpack:///./app/src/pages/access-management/components/asset-operators-list/am-asset-operators-list.component.html","webpack:///./app/src/pages/access-management/components/asset-view/am-asset-view.html","webpack:///./app/src/pages/access-management/components/asset-list-client/asset-list-client.component.html","webpack:///./app/src/pages/access-management/components/operators-list-table/am-operators-list-table.html","webpack:///./app/src/pages/access-management/components/assignments/am-assignments.html","webpack:///./app/src/pages/access-management/components/assets-list-table/am-assets-list-table.html","webpack:///./app/src/pages/access-management/components/operator-create/am-operator-create.html","webpack:///./app/src/pages/access-management/components/group-details-form/am-group-details-form.html","webpack:///./app/src/pages/access-management/components/operator-details-form/am-operator-details-form.html","webpack:///./app/src/pages/access-management/components/operator-codes/am-operator-codes.html","webpack:///./app/src/pages/access-management/components/operator-view/am-operator-view.html","webpack:///./app/src/pages/access-management/components/dashboard/am-dashboard.html","webpack:///./app/src/pages/access-management/components/bulk-upload-operators/am-bulk-upload-operators.html","webpack:///./app/src/pages/access-management/components/operators-list/am-operators-list.component.html","webpack:///./app/src/pages/access-management/components/assets-list/am-assets-list.component.html","webpack:///./app/src/pages/access-management/components/group-view/am-group-view.html","webpack:///./app/src/pages/access-management/components/group-create/am-group-create.html","webpack:///./app/src/pages/access-management/components/group-list/am-group-list.component.html","webpack:///./app/src/pages/access-management/access-management-base.html","webpack:///./app/src/components/communicated-at-filter/communicated-at-filter.html","webpack:///./app/src/components/last-seen-filter/last-seen-filter.html","webpack:///./app/src/components/timezone-selector/timezone-selector.html","webpack:///./app/src/components/steps/steps.component.html","webpack:///./app/src/components/ztr-date-picker/ztr-date-picker.html","webpack:///./app/src/components/tool-tip/tool-tip.template.html","webpack:///./app/src/components/modal/modal.template.html","webpack:///./app/src/components/maintenance-btn-group/maintenance-btn-group.template.html","webpack:///./app/src/components/alerts-btn-group/alerts-btn-group.template.html","webpack:///./app/src/components/pagination/pagination.html","webpack:///./app/src/components/asset-list/transfer.component.html","webpack:///./app/src/components/resolvable-geo-location/resolvable-geo-location.html","webpack:///./app/src/components/table-column-selector/table-column-selector.html","webpack:///./app/src/components/asset-search/history/history.component.html","webpack:///./app/src/components/asset-search/asset-search.component.html","webpack:///./app/src/components/asset-list/asset-list.component.html","webpack:///./app/src/pages/asset-dashboard/commands/confirm-modal/confirm.modal.html","webpack:///./app/src/pages/asset-dashboard/commands/status-check/status-check.html","webpack:///./app/src/pages/asset-dashboard/commands/feedback-history/feedback-history.html","webpack:///./app/src/pages/asset-dashboard/commands/commands.html","webpack:///./app/src/clients.js","webpack:///./app/src/config.route.js","webpack:///./app/src/config.module.js","webpack:///./app/src/app.settings.module.js","webpack:///./app/src/services/userinvite.service.js","webpack:///./app/src/services/transfers.service.js","webpack:///./app/src/services/savedsearch.service.js","webpack:///./app/src/state/action.js","webpack:///./app/src/state/security/security.action.js","webpack:///./app/src/services/securitygroups.service.js","webpack:///./app/src/services/savedfilter.service.js","webpack:///./app/src/services/reports.service.js","webpack:///./app/src/services/packages.service.js","webpack:///./app/src/services/mobile.service.js","webpack:///./app/src/services/nav/nav.util.service.js","webpack:///./app/src/services/nav/nav.service.js","webpack:///./app/src/services/loading.modal.service.js","webpack:///./app/src/services/languages.service.js","webpack:///./app/src/services/installation.note.service.js","webpack:///./app/src/services/fileUploader.service.js","webpack:///./app/src/services/devices.service.js","webpack:///./app/src/services/client.side.error.logging.service.js","webpack:///./app/src/services/app.notifications.service.js","webpack:///./app/src/services/alert.rules.service.js","webpack:///./app/src/api/assetTypeAttribute.js","webpack:///./app/src/state/search/search.state.js","webpack:///./app/src/constants.js","webpack:///./app/src/equipment/services/equipment-search.service.js","webpack:///./app/src/services/attrs-tags.service.js","webpack:///./app/src/services/attributes.service.js","webpack:///./app/src/services/device-diagnostic.service.js","webpack:///./app/src/services/service.module.js","webpack:///./app/src/services/attr.translate.service.js","webpack:///./app/src/services/markdown.service.js","webpack:///./app/src/services/photoSwipe.service.js","webpack:///./app/src/services/rounding.service.js","webpack:///./app/src/api/equipment.service.util.js","webpack:///./app/src/api/equipment.service.js","webpack:///./app/src/api/users.services.js","webpack:///./app/src/api/users.mock.services.js","webpack:///./app/src/api/alerts.mock.service.js","webpack:///./app/src/api/alerts.service.js","webpack:///./app/src/api/commands.repo.js","webpack:///./app/src/api/config.service.js","webpack:///./app/src/api/configurations.service.js","webpack:///./app/src/api/csvdataexport.service.js","webpack:///./app/src/api/equipment.mock.service.js","webpack:///./app/src/api/feature.service.js","webpack:///./app/src/api/geolocation.service.js","webpack:///./app/src/api/geozones.service.js","webpack:///./app/src/api/installations.mock.service.js","webpack:///./app/src/api/installations.service.js","webpack:///./app/src/api/jobscheduler.mock.service.js","webpack:///./app/src/api/jobscheduler.service.js","webpack:///./app/src/api/maintenance.mock.service.js","webpack:///./app/src/api/maintenance.service.js","webpack:///./app/src/api/media.service.js","webpack:///./app/src/api/roles.service.js","webpack:///./app/src/api/templates.service.js","webpack:///./app/src/api/transfers.service.js","webpack:///./app/src/api/searchFavourites.repo.js","webpack:///./app/src/api/accounts.repo.js","webpack:///./app/src/api/bulk-activation.service.js","webpack:///./app/src/api/access-management.api.js","webpack:///./app/src/api/operators.api.js","webpack:///./app/src/api/groups.api.js","webpack:///./app/src/api/reporting.api.js","webpack:///./app/src/api/time-series.api.js","webpack:///./app/src/api/api.module.js","webpack:///./app/src/pages/asset-dashboard/alerts-panel/alerts-panel.component.js","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.utility.js","webpack:///./app/src/pages/asset-dashboard/templates.service.js","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.vm.js","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.component.js","webpack:///./app/src/pages/asset-dashboard/components/gauge-builder/gauge-builder.component.js","webpack:///./app/src/pages/asset-dashboard/status/status.component.js","webpack:///./app/src/pages/asset-dashboard/alarms/alarms.component.js","webpack:///./app/src/pages/asset-dashboard/equipment-status/equipment-status.component.js","webpack:///./app/src/pages/asset-dashboard/commands/commands.component.js","webpack:///./app/src/pages/asset-dashboard/commands/feedback-history/feedback-history.js","webpack:///./app/src/pages/asset-dashboard/commands/status-check/status-check.component.js","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.route.js","webpack:///./app/src/pages/asset-dashboard/commands/confirm-modal/confirm.modal.js","webpack:///./app/src/pages/asset-dashboard/commands/commands.util.service.js","webpack:///./app/src/pages/asset-dashboard/Layouts/layout/layout.component.js","webpack:///./app/src/pages/asset-dashboard/Layouts/default/default.component.js","webpack:///./app/src/pages/asset-dashboard/Layouts/layouts.component.js","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.module.js","webpack:///./app/src/state/user/user.actions.js","webpack:///./app/src/pages/global-layouts/navigation/accounts-switching/accounts-switching.component.js","webpack:///./app/src/pages/global-layouts/navigation/mobile/mobile.component.js","webpack:///./app/src/pages/global-layouts/navigation/left/left.component.js","webpack:///./app/src/pages/global-layouts/navigation/main/main.directive.js","webpack:///./app/src/pages/admin/admin.nav.service.js","webpack:///./app/src/pages/alerts/alerts.nav.service.js","webpack:///./app/src/pages/devices/devices.nav.service.js","webpack:///./app/src/equipment/equipment.nav.service.js","webpack:///./app/src/pages/help/help.items.js","webpack:///./app/src/pages/help/help.nav.js","webpack:///./app/src/pages/help/services/admin.items.js","webpack:///./app/src/pages/help/services/alerts.items.js","webpack:///./app/src/pages/help/services/assets.items.js","webpack:///./app/src/pages/help/services/devices.items.js","webpack:///./app/src/pages/help/services/maintenance.items.js","webpack:///./app/src/pages/help/services/map.items.js","webpack:///./app/src/pages/help/services/reports.items.js","webpack:///./app/src/pages/help/services/users.items.js","webpack:///./app/src/pages/maintenance/nav.service.js","webpack:///./app/src/pages/map/map.nav.service.js","webpack:///./app/src/pages/reports/reports.nav.service.js","webpack:///./app/src/pages/t-series/t-series.nav.service.js","webpack:///./app/src/pages/user-profile/profile.nav.service.js","webpack:///./app/src/pages/access-management/access-managment.nav.service.js","webpack:///./app/src/pages/Sites/sites.nav.service.js","webpack:///./app/src/pages/global-layouts/navigation/nav.module.js","webpack:///./app/src/main/page.directive.js","webpack:///./app/src/pages/global-layouts/navigation/mobile/toggle-mobile.directive.js","webpack:///./app/src/components/buttons/table/remove/table-remove-button.js","webpack:///./app/src/components/buttons/toggle-button/toggle-button.js","webpack:///./app/src/components/buttons/buttons.module.js","webpack:///./app/src/components/buttons/assets/add/add-assets-button.js","webpack:///./app/src/components/buttons/add-users/add-users-button.js","webpack:///./app/src/components/buttons/cancel/cancel-button.js","webpack:///./app/src/components/buttons/create/create-button.js","webpack:///./app/src/components/buttons/delete/delete-button.js","webpack:///./app/src/components/buttons/edit/edit-button.js","webpack:///./app/src/components/buttons/export-csv/export-csv-button.js","webpack:///./app/src/components/buttons/remove-selected/remove-selected-button.js","webpack:///./app/src/components/buttons/save/save-button.js","webpack:///./app/src/components/buttons/assets/select/select-assets-button.js","webpack:///./app/src/components/buttons/table/order/table-order-buttons.js","webpack:///./app/src/state/state.module.js","webpack:///./app/src/state/assets/assets.action.js","webpack:///./app/src/state/search/search.action.js","webpack:///./app/src/state/table-columns/table-columns.action.js","webpack:///./app/src/components/asset-list/asset-list.component.js","webpack:///./app/src/components/asset-list/asset-list-footer/asset-list-footer.component.js","webpack:///./app/src/components/asset-list/asset-list.module.js","webpack:///./app/src/components/debounced-toggle.js","webpack:///./app/src/components/asset-search/asset-search.component.js","webpack:///./app/src/state/history/history.action.js","webpack:///./app/src/state/favourite/favourite.action.js","webpack:///./app/src/components/asset-search/history/history.component.js","webpack:///./app/src/utility/immutability.util.service.js","webpack:///./app/src/components/last-seen-filter/last-seen-filter.models.js","webpack:///./app/src/components/asset-search/history/filter-summary/filter-summary.component.js","webpack:///./app/src/components/asset-search/asset-search.module.js","webpack:///./app/src/components/table-column-selector/table-column-selector.component.js","webpack:///./app/src/components/table-column-selector/table-column-selector.module.js","webpack:///./app/src/components/sign-out.component.js","webpack:///./app/src/components/resolvable-geo-location/resolvable-geo-location.component.js","webpack:///./app/src/components/auto-complete/autoComplete.js","webpack:///./app/src/components/multi-emails/multi-emails.js","webpack:///./app/src/components/progress-bar/progress-bar.js","webpack:///./app/src/components/searchable-dropdown/searchable-dropdown.js","webpack:///./app/src/components/spark-line/spark-line.js","webpack:///./app/src/components/status-bar/status-bar.js","webpack:///./app/src/components/time-progress-bar/time-progress-bar.js","webpack:///./app/src/state/transfer/transfer.actions.js","webpack:///./app/src/components/asset-list/transfer.component.js","webpack:///./app/src/components/searchable-multi-select-dropdown/searchable-multi-select-dropdown.js","webpack:///./app/src/components/assetpicker/asset.multi.picker.controller.js","webpack:///./app/src/components/assetpicker/asset.picker.controller.js","webpack:///./app/src/state/notification/notification.action.js","webpack:///./app/src/components/browser-update-banner/browserUpdateBanner.component.js","webpack:///./app/src/components/browser-links/browser-links.component.js","webpack:///./app/src/components/pagination/pagination.component.js","webpack:///./app/src/components/alerts-btn-group/alerts-btn-group.component.js","webpack:///./app/src/components/maintenance-btn-group/maintenance-btn-group.component.js","webpack:///./app/src/components/modal/modal.component.js","webpack:///./app/src/components/tool-tip/tool-tip.component.js","webpack:///./app/src/components/ztr-date-picker/ztr-date-picker.component.js","webpack:///./app/src/components/steps/steps.component.js","webpack:///./app/src/components/timezone-selector/data.js","webpack:///./app/src/components/timezone-selector/timezone-selector.js","webpack:///./app/src/components/last-seen-filter/last-seen-filter.component.js","webpack:///./app/src/components/communicated-at-filter/communicated-at-filter.component.js","webpack:///./app/src/components/components.module.js","webpack:///./app/src/components/response-message/response-message.js","webpack:///./app/src/components/search-bar/search-bar.js","webpack:///./app/src/components/simple-tags/simple-tags.js","webpack:///./app/src/components/equipment-status/equipment-status.js","webpack:///./app/src/components/tag-url/tag-url.js","webpack:///./app/src/components/fields-required/fields-required.js","webpack:///./app/src/components/loading-indicator/loading-indicator.js","webpack:///./app/src/components/modal-dialog/modal-dialog.js","webpack:///./app/src/components/top_nav/top.nav.js","webpack:///./app/src/components/time-progress-bar/filters/milisecondsFormat.filter.js","webpack:///./app/src/utility/date.util.service.js","webpack:///./app/src/utility/object.util.service.js","webpack:///./app/src/utility/util.module.js","webpack:///./app/src/utility/array.util.service.js","webpack:///./app/src/utility/url.util.service.js","webpack:///./app/src/directives/autofocus.directive.js","webpack:///./app/src/directives/child-element-blur.directive.js","webpack:///./app/src/directives/confirm-on-exit.js","webpack:///./app/src/directives/date-greater-than.directive.js","webpack:///./app/src/directives/date-lower-than.directive.js","webpack:///./app/src/directives/date-range-greater-than.js","webpack:///./app/src/directives/date-range-lower-than.js","webpack:///./app/src/directives/focusMe.directive.js","webpack:///./app/src/directives/missing-features.js","webpack:///./app/src/directives/apply-class.directive.js","webpack:///./app/src/directives/open-select-on-focus.directive.js","webpack:///./app/src/directives/requires-features.directive.js","webpack:///./app/src/directives/select-set-focus-on.directive.js","webpack:///./app/src/directives/set-focus-on.directive.js","webpack:///./app/src/directives/tags-set-focus-on.directive.js","webpack:///./app/src/directives/expose-scope.directive.js","webpack:///./app/src/directives/scroll.directive.js","webpack:///./app/src/directives/pageSupport.directive.js","webpack:///./app/src/directives/infinite-loading.directive.js","webpack:///./app/src/directives/directives.module.js","webpack:///./app/src/directives/iframe-onload.directive.js","webpack:///./app/src/directives/ng-enter.directive.js","webpack:///./app/src/directives/numbers-only-input.directive.js","webpack:///./app/src/directives/stopPropagation.directive.js","webpack:///./app/src/directives/stringToNumber.directive.js","webpack:///./app/src/directives/valid-file.directive.js","webpack:///./app/src/pages/maintenance/maintenance.route.js","webpack:///./app/src/pages/maintenance/maintenance.controller.js","webpack:///./app/src/pages/maintenance/plans/create/create.controller.js","webpack:///./app/src/pages/maintenance/plans/plans.controller.js","webpack:///./app/src/pages/maintenance/plans/details/delete/delete.controller.js","webpack:///./app/src/pages/maintenance/plans/details/details.controller.js","webpack:///./app/src/pages/maintenance/plans/details/tasks/tasks.controller.js","webpack:///./app/src/pages/maintenance/plans/create/tasks/tasks.directive.js","webpack:///./app/src/pages/maintenance/plans/modals/intialize-assets.controller.js","webpack:///./app/src/pages/maintenance/plans/create/assets/assets.directive.js","webpack:///./app/src/pages/maintenance/plans/create/form/form.directive.js","webpack:///./app/src/pages/maintenance/plans/plans.module.js","webpack:///./app/src/pages/maintenance/plans/create/schedule/schedule.directive.js","webpack:///./app/src/pages/maintenance/history/history.controller.js","webpack:///./app/src/pages/maintenance/history/details/details.controller.js","webpack:///./app/src/pages/maintenance/history/history.module.js","webpack:///./app/src/pages/maintenance/board/board.controller.js","webpack:///./app/src/pages/maintenance/board/complete/complete.controller.js","webpack:///./app/src/pages/maintenance/board/board.module.js","webpack:///./app/src/pages/maintenance/maintenance.module.js","webpack:///./app/src/pages/access-management/access-management.route.js","webpack:///./app/src/pages/access-management/access-management.component.js","webpack:///./app/src/pages/access-management/core/models/am-helper.model.js","webpack:///./app/src/pages/access-management/components/group-list/am-group-list.component.js","webpack:///./app/src/pages/access-management/components/group-create/am-group-create.component.js","webpack:///./app/src/pages/access-management/core/utilities/am-helper.util.js","webpack:///./app/src/pages/access-management/components/group-view/am-group-view.component.js","webpack:///./app/src/pages/access-management/components/assets-list/am-assets-list.component.js","webpack:///./app/src/pages/access-management/core/utilities/am-operators.util.js","webpack:///./app/src/functions/search.functions.js","webpack:///./app/src/pages/access-management/components/operators-list/am-operators-list.component.js","webpack:///./app/src/pages/access-management/components/bulk-upload-operators/am-bulk-upload-operators.component.js","webpack:///./app/src/pages/access-management/components/dashboard/am-dashboard.component.js","webpack:///./app/src/pages/access-management/components/operator-view/am-operator-view.component.js","webpack:///./app/src/pages/access-management/core/models/operator.model.js","webpack:///./app/src/pages/access-management/components/operator-codes/am-operator-codes.component.js","webpack:///./app/src/pages/access-management/components/operator-details-form/am-operator-details-form.component.js","webpack:///./app/src/pages/access-management/components/group-details-form/am-group-details-form.component.js","webpack:///./app/src/pages/access-management/components/operator-create/am-operator-create.component.js","webpack:///./app/src/pages/access-management/components/am-list-table-base.controller.js","webpack:///./app/src/functions/table.functions.js","webpack:///./app/src/pages/access-management/components/assets-list-table/am-assets-list-table.component.js","webpack:///./app/src/pages/access-management/components/assignments/am-assignments.component.js","webpack:///./app/src/pages/access-management/components/operators-list-table/am-operators-list-table.component.js","webpack:///./app/src/pages/access-management/components/asset-list-client/asset-list-client.component.js","webpack:///./app/src/pages/access-management/components/asset-view/am-asset-view.component.js","webpack:///./app/src/pages/access-management/components/asset-operators-list/am-asset-operators-list.component.js","webpack:///./app/src/pages/access-management/components/operator-assets-list/operator-assets-list.component.js","webpack:///./app/src/pages/access-management/components/controls/add-input/add-input.component.js","webpack:///./app/src/pages/access-management/components/controls/search-input/search-input.component.js","webpack:///./app/src/pages/access-management/components/controls/ipaf-input/ipaf-input.component.js","webpack:///./app/src/pages/access-management/core/models/am-asset.model.js","webpack:///./app/src/pages/access-management/core/am-store.service.js","webpack:///./app/src/pages/access-management/core/access-management.service.js","webpack:///./app/src/pages/access-management/components/modal-popup-base/modal-popup-base.js","webpack:///./app/src/pages/access-management/components/operator-delete-popup/am-operator-delete-popup.componenet.js","webpack:///./app/src/pages/access-management/components/operatos-list-select-popup/am-operators-list-select-popup.js","webpack:///./app/src/pages/access-management/core/am-operators.service.js","webpack:///./app/src/pages/access-management/components/asset-list-select-popup/am-asset-list-popup.js","webpack:///./app/src/pages/access-management/core/am-assets.service.js","webpack:///./app/src/pages/access-management/components/group-delete-popup/am-group-delete-popup.component.js","webpack:///./app/src/pages/access-management/core/models/am-group.model.js","webpack:///./app/src/pages/access-management/core/am-groups.service.js","webpack:///./app/src/pages/access-management/core/am-filter-pagination.service.js","webpack:///./app/src/pages/access-management/core/am-assignments.service.js","webpack:///./app/src/pages/access-management/access-management.module.js","webpack:///./app/src/pages/app-notifications/app.notifications.controller.js","webpack:///./app/src/pages/app-notifications/app.notifications.module.js","webpack:///./app/src/pages/help/help.route.js","webpack:///./app/src/pages/help/help.controller.js","webpack:///./app/src/pages/help/translations/help-translation.service.js","webpack:///./app/src/pages/help/translations/help-translate.directive.js","webpack:///./app/src/pages/help/help.module.js","webpack:///./app/src/pages/help/filters/sortObject.filter.js","webpack:///./app/src/pages/map/map-controller.js","webpack:///./app/src/pages/map/map.route.js","webpack:///./app/src/utility/html.util.service.js","webpack:///./app/src/pages/map/view/equipment/equipment-list-fast.component.js","webpack:///./app/src/functions/asset.functions.js","webpack:///./app/src/pages/map/view/equipment/details/equipment-detail.controller.js","webpack:///./app/src/pages/map/view/equipment/equipment.module.js","webpack:///./app/src/pages/map/view/equipment/equipment-list-item.component.js","webpack:///./app/src/pages/map/view/equipment/details/equipment-detail.component.js","webpack:///./app/src/pages/map/view/map/map-equipment.controller.js","webpack:///./app/src/pages/map/view/map/map-equipment.module.js","webpack:///./app/src/pages/map/view/map/map-equipment-list.component.js","webpack:///./app/src/pages/map/view/map/map-equipment.component.js","webpack:///./app/src/pages/map/map.service.js","webpack:///./app/src/pages/map/components/map-hover-popup/map-hover-popup.component.js","webpack:///./app/src/pages/map/map-module.js","webpack:///./app/src/pages/map/map-directive.js","webpack:///./app/src/pages/map/components/map-search-bar.component.js","webpack:///./app/src/pages/map/popup/map-popup.component.js","webpack:///./app/src/pages/user-profile/edit-profile/edit.controller.js","webpack:///./app/src/pages/user-profile/edit-profile/editProfile.service.js","webpack:///./app/src/pages/user-profile/profile.route.js","webpack:///./app/src/pages/user-profile/edit-profile/email/verifyEmailChange.route.js","webpack:///./app/src/pages/user-profile/subscriptions/subscriptions.controller.js","webpack:///./app/src/pages/user-profile/profile.module.js","webpack:///./app/src/pages/reports/models/report.model.js","webpack:///./app/src/pages/reports/jobschedules/job/job.create.controller.js","webpack:///./app/src/pages/reports/jobschedules/job/job.detail.controller.js","webpack:///./app/src/pages/reports/jobschedules/job/job.update.controller.js","webpack:///./app/src/pages/reports/jobschedules/job/job.module.js","webpack:///./app/src/pages/reports/jobschedules/job/_form-schedule.directive.js","webpack:///./app/src/pages/reports/jobschedules/jobs.controller.js","webpack:///./app/src/pages/reports/jobschedules/job/filters/printScheduleDateRange.filter.js","webpack:///./app/src/pages/reports/jobschedules/jobschedules.module.js","webpack:///./app/src/pages/reports/reportview/reportparameters/_form.AssetList.controller.js","webpack:///./app/src/pages/reports/reportview/reportparameters/_form.drop_DateRange.controller.js","webpack:///./app/src/pages/reports/reportview/reportparameters/reportParameters.module.js","webpack:///./app/src/pages/reports/reportview/datapointspicker/datapoint.multi.picker.controller.js","webpack:///./app/src/pages/reports/reportview/datapointSelector/datapoint.selector.controller.js","webpack:///./app/src/pages/reports/reportview/reports.detail.controller.js","webpack:///./app/src/pages/reports/reportview/reportview.module.js","webpack:///./app/src/pages/reports/reports.route.js","webpack:///./app/src/pages/reports/services/reporting.service.js","webpack:///./app/src/pages/reports/reports-list/reports-list.component.js","webpack:///./app/src/pages/reports/interactive-report-view/interactive-report-view.component.js","webpack:///./app/src/pages/reports/reports.controller.js","webpack:///./app/src/pages/reports/filters/filters-view/filters-view.component.js","webpack:///./app/src/pages/reports/filters/filter-date-picker/filter-date-picker.component.js","webpack:///./app/src/pages/reports/filters/multi-select-dropdown/multi-select-dropdown.component.js","webpack:///./app/src/pages/reports/filters/single-select-dropdown/single-select-dropdown.component.js","webpack:///./app/src/pages/reports/filters/filter-text-input/filter-text-input.component.js","webpack:///./app/src/pages/reports/export-options-popup/export-options-popup.controller.js","webpack:///./app/src/pages/reports/delete-custom-view-popup/delete-custom-view-popup.controller.js","webpack:///./app/src/pages/reports/overwrite-cutom-view-popup/overwrite-custom-view-popup.controller.js","webpack:///./app/src/pages/reports/reports.module.js","webpack:///./app/src/pages/t-series/t-series-utilization/utilization.controller.js","webpack:///./app/src/pages/t-series/t-series-verification/verification.controller.js","webpack:///./app/src/pages/t-series/t-series.route.js","webpack:///./app/src/pages/t-series/dashboard.service.js","webpack:///./app/src/pages/t-series/t-series.module.js","webpack:///./app/src/pages/t-series/t-series-activity-feed/activity-feed.component.js","webpack:///./app/src/pages/t-series/t-series-inventory/inventory.component.js","webpack:///./app/src/pages/t-series/dashboard.controller.js","webpack:///./app/src/pages/t-series/t-series-utilization/utilization.directive.js","webpack:///./app/src/pages/t-series/t-series-verification/verification.directive.js","webpack:///./app/src/pages/admin/datapoint-display/list/list.controller.js","webpack:///./app/src/pages/admin/datapoint-display/datapoint.objects.js","webpack:///./app/src/pages/admin/datapoint-display/datapoint.service.js","webpack:///./app/src/pages/admin/datapoint-display/datapoint.module.js","webpack:///./app/src/pages/admin/role-management/create-role/create.controller.js","webpack:///./app/src/pages/admin/role-management/list/list.controller.js","webpack:///./app/src/pages/admin/role-management/view/delete-modal/delete.modal.controller.js","webpack:///./app/src/pages/admin/role-management/view/view.controller.js","webpack:///./app/src/pages/admin/role-management/view/details/details.users.controller.js","webpack:///./app/src/pages/admin/role-management/view/edit/edit.controller.js","webpack:///./app/src/pages/admin/role-management/role.module.js","webpack:///./app/src/state/accounts/accounts.actions.js","webpack:///./app/src/pages/admin/sub-accounts/list.component.js","webpack:///./app/src/pages/admin/sub-accounts/create.component.js","webpack:///./app/src/pages/admin/sub-accounts/view.component.js","webpack:///./app/src/pages/admin/sub-accounts/sub-accounts.module.js","webpack:///./app/src/pages/admin/security-groups/list/list.controller.js","webpack:///./app/src/pages/admin/security-groups/create-group/create.controller.js","webpack:///./app/src/pages/admin/security-groups/view/delete-modal/delete.modal.controller.js","webpack:///./app/src/pages/admin/security-groups/view/assets/assets.controller.js","webpack:///./app/src/pages/admin/security-groups/view/view.controller.js","webpack:///./app/src/pages/admin/security-groups/view/users/users.controller.js","webpack:///./app/src/pages/admin/security-groups/view/users/users-modal/users.modal.js","webpack:///./app/src/pages/admin/security-groups/securitygroups.module.js","webpack:///./app/src/pages/admin/user-management/manage-invites/view/revoke-modal/revoke.controller.js","webpack:///./app/src/pages/admin/user-management/manage-invites/list/list.controller.js","webpack:///./app/src/pages/admin/user-management/manage-invites/view.service.js","webpack:///./app/src/pages/admin/user-management/manage-invites/view/view.controller.js","webpack:///./app/src/pages/admin/user-management/invite-user/invite.controller.js","webpack:///./app/src/pages/admin/user-management/users/view/delete-modal/delete.modal.controller.js","webpack:///./app/src/pages/admin/user-management/users/view/view.controller.js","webpack:///./app/src/pages/admin/user-management/users/view/edit/edit.controller.js","webpack:///./app/src/pages/admin/user-management/users/list/list.controller.js","webpack:///./app/src/pages/admin/user-management/user.module.js","webpack:///./app/src/pages/admin/assets/products/product.delete.modal.controller.js","webpack:///./app/src/pages/admin/assets/products/products.controller.js","webpack:///./app/src/pages/admin/assets/products/products.create.controller.js","webpack:///./app/src/pages/admin/assets/products/products.detail.controller.js","webpack:///./app/src/pages/admin/assets/products/products.service.js","webpack:///./app/src/pages/admin/assets/products/products.module.js","webpack:///./app/src/pages/admin/assets/sharing/manage/manage.shared.assets.controller.js","webpack:///./app/src/pages/admin/assets/sharing/manage/manage.shared.assets.modal.controller.js","webpack:///./app/src/pages/admin/assets/sharing/share/share.assets.controller.js","webpack:///./app/src/pages/admin/assets/sharing/sharing.module.js","webpack:///./app/src/pages/admin/assets/tagging/tag.list.controller.js","webpack:///./app/src/pages/admin/assets/tagging/tag.details.component.js","webpack:///./app/src/state/attributes/attributes.action.js","webpack:///./app/src/pages/admin/assets/tagging/tag.delete.controller.js","webpack:///./app/src/pages/admin/assets/tagging/tag.create.component.js","webpack:///./app/src/pages/admin/assets/tagging/tag.bulk.component.js","webpack:///./app/src/pages/admin/assets/tagging/tagging.module.js","webpack:///./app/src/pages/admin/assets/tagging/components/text-table.component.js","webpack:///./app/src/pages/admin/assets/tagging/components/range.component.js","webpack:///./app/src/pages/admin/assets/tagging/components/number.component.js","webpack:///./app/src/pages/admin/assets/tagging/components/hyperlink-table.component.js","webpack:///./app/src/pages/admin/assets/tagging/components/expandable.component.js","webpack:///./app/src/pages/admin/assets/tagging/components/date-time.component.js","webpack:///./app/src/pages/admin/assets/assets.module.js","webpack:///./app/src/pages/admin/admin.controller.js","webpack:///./app/src/pages/admin/admin.route.js","webpack:///./app/src/pages/admin/admin.module.js","webpack:///./app/src/pages/alerts/alerts.route.js","webpack:///./app/src/pages/alerts/configurations/alerts/create/create.controller.js","webpack:///./app/src/pages/alerts/configurations/alerts/list/list.controller.js","webpack:///./app/src/pages/alerts/configurations/alerts/delete-modal/delete.controller.js","webpack:///./app/src/pages/alerts/configurations/alerts/view/details/view.controller.js","webpack:///./app/src/pages/alerts/configurations/alerts/view/assets/assets.controller.js","webpack:///./app/src/utility/gettext.util.service.js","webpack:///./app/src/pages/alerts/configurations/alerts/view/triggers/triggers.models.js","webpack:///./app/src/pages/alerts/configurations/alerts/view/triggers/triggers.util.js","webpack:///./app/src/pages/alerts/configurations/alerts/view/triggers/triggers.controller.js","webpack:///./app/src/pages/alerts/configurations/alerts/alerts.module.js","webpack:///./app/src/pages/alerts/configurations/faults/delete-modal/delete.controller.js","webpack:///./app/src/pages/alerts/configurations/faults/list/list.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/view/assets/assets.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/faults.repo.js","webpack:///./app/src/pages/alerts/configurations/faults/faults.service.js","webpack:///./app/src/pages/alerts/configurations/faults/faults.module.js","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/edit/edit.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/faults.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/view/view.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/create/create.directive.js","webpack:///./app/src/pages/alerts/configurations/faults/view/details/details.directive.js","webpack:///./app/src/pages/alerts/configurations/geozones/geozones.route.js","webpack:///./app/src/pages/alerts/configurations/geozones/create/create.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/geozone.details.event.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/list/list.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/view/assets/assets.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/view/view.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/view/logz/log.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/geozones.module.js","webpack:///./app/src/pages/alerts/configurations/geozones/delete-modal/delete.controller.js","webpack:///./app/src/pages/alerts/configurations/geozones/view/map/map.directive.js","webpack:///./app/src/pages/alerts/configurations/configurations.module.js","webpack:///./app/src/pages/alerts/configurations/filter.utility.js","webpack:///./app/src/pages/alerts/dashboard/dashboard.controller.js","webpack:///./app/src/pages/alerts/dashboard/table/list/notes-modal/note.controller.js","webpack:///./app/src/pages/alerts/dashboard/table/list/list.controller.js","webpack:///./app/src/pages/alerts/dashboard/table/list/list.component.js","webpack:///./app/src/pages/alerts/dashboard/chart/chart.controller.js","webpack:///./app/src/pages/alerts/dashboard/chart/chart.component.js","webpack:///./app/src/pages/alerts/dashboard/table/header-filters/header.component.js","webpack:///./app/src/pages/alerts/dashboard/dashboard.module.js","webpack:///./app/src/pages/alerts/historical-alerts/list/list.controller.js","webpack:///./app/src/pages/alerts/historical-alerts/view/view.controller.js","webpack:///./app/src/pages/alerts/historical-alerts/view/new-notes/new-note.controller.js","webpack:///./app/src/pages/alerts/historical-alerts/historical-alerts.module.js","webpack:///./app/src/pages/asset-dashboard/alerts-maintenance-history/alerts-maintenance-history.component.js","webpack:///./app/src/pages/alerts/alerts.module.js","webpack:///./app/src/equipment/list/filters/attribute-filter/attribute-filter.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/freeform-filter/freeform-filter.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/list-filter/list-filter.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/date-filter/date-filter.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/range-filter/range-filter.component.js","webpack:///./app/src/equipment/list/filters/filter-input/filter-input.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/range-date/range-date.component.js","webpack:///./app/src/equipment/list/list.controller.js","webpack:///./app/src/equipment/list/filters/attribute-filter/attribute-filter.models.js","webpack:///./app/src/equipment/list/filters/filters.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/numeric-range-filter/numeric-range-filter.component.js","webpack:///./app/src/equipment/list/filters/attribute-filter/invalid-entry-messaging/invalid-entry-messaging.component.js","webpack:///./app/src/equipment/list/notice/notice.component.js","webpack:///./app/src/equipment/list/notice/highlights/highlights.component.js","webpack:///./app/src/equipment/list/filter-overview/filter-overview.component.js","webpack:///./app/src/equipment/list/equipment.list.module.js","webpack:///./app/src/equipment/esn/esn.js","webpack:///./app/src/equipment/esn/equipment.esn.module.js","webpack:///./app/src/pages/devices/sync-runhours-component/sync-runhours.model.js","webpack:///./app/src/pages/devices/sync-runhours-component/confirm-modal/sync-confirm.modal.js","webpack:///./app/src/pages/devices/sync-runhours-component/sync-runhours.component.js","webpack:///./app/src/pages/devices/devices.route.js","webpack:///./app/src/pages/devices/activations/bulk/bulk.controller.js","webpack:///./app/src/pages/devices/activations/bulk-custom/bulk-custom.controller.js","webpack:///./app/src/pages/devices/activations/single/templates-modal/templates.modal.controller.js","webpack:///./app/src/pages/devices/activations/single/single.controller.js","webpack:///./app/src/pages/devices/devices.controller.js","webpack:///./app/src/pages/devices/view/deactivate-modal/deactivate.modal.controller.js","webpack:///./app/src/pages/devices/view/deactivate-modal/deactivate.modal.modal.controller.js","webpack:///./app/src/pages/devices/view/view.controller.js","webpack:///./app/src/pages/devices/list/list.controller.js","webpack:///./app/src/pages/devices/view/install-notes-modal/notes.modal.controller.js","webpack:///./app/src/pages/devices/devices.directive.js","webpack:///./app/src/pages/devices/activations/activations.service.js","webpack:///./app/src/pages/devices/activations/activations.repo.js","webpack:///./app/src/pages/devices/sync-runhours.service.js","webpack:///./app/src/pages/devices/devices.module.js","webpack:///./app/src/pages/devices/activations/activations.controller.js","webpack:///./app/src/pages/devices/devices.base.controller.js","webpack:///./app/src/filters/alerts.filter.js","webpack:///./app/src/filters/attrs.translate.filter.js","webpack:///./app/src/filters/attrs.translate.value.filter.js","webpack:///./app/src/filters/tableDate.filter.js","webpack:///./app/src/filters/date.filter.js","webpack:///./app/src/filters/attrs-friendly.filter.js","webpack:///./app/src/filters/filter.module.js","webpack:///./app/src/filters/attrs.capitalize.filter.js","webpack:///./app/src/filters/capitalizeFirstLetter.filter.js","webpack:///./app/src/filters/propsfilter.filter.js","webpack:///./app/src/filters/reverse.filter.js","webpack:///./app/src/filters/searchByName.filter.js","webpack:///./app/src/filters/startFrom.filter.js","webpack:///./app/src/filters/twoDecimal.filter.js","webpack:///./app/src/filters/toArray.filter.js","webpack:///./app/src/filters/removeWhiteSpace.filter.js","webpack:///./app/src/equipment/filters/chart.filter.js","webpack:///./app/src/equipment/filters/url.filter.js","webpack:///./app/src/equipment/filters/equipment.filters.module.js","webpack:///./app/src/equipment/filters/getIndexOf.filter.js","webpack:///./app/src/equipment/filters/limitObjectTo.filter.js","webpack:///./app/src/equipment/filters/objectKeysLength.filter.js","webpack:///./app/src/equipment/filters/attrs.searchformat.filter.js","webpack:///./app/src/equipment/filters/withoutNull.filter.js","webpack:///./app/src/pages/errors/errors.route.js","webpack:///./app/src/pages/errors/general/error.component.js","webpack:///./app/src/pages/errors/errors.module.js","webpack:///./app/src/pages/browser-policy/browser-policy.component.js","webpack:///./app/src/pages/browser-policy/browser-policy.route.js","webpack:///./app/src/pages/browser-policy/browser-policy.module.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/commands.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/commands.service.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/controls/controls.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/history/history.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/history/history.service.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/status/status.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/commands-text.service.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/command-translate.filter.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/commands.module.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/status/status.service.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/controls/controls.service.js","webpack:///./app/src/state/asset-details/asset-details.actions.js","webpack:///./app/src/equipment/asset-details-dashboard/asset-details-dashboard.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/asset-data.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/chart/series-chart.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/data/series-table/series-table.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/asset-details.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/asset-location-map.util.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/asset-location.helper.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/asset-location.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/alerts/asset-alerts.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/maintenance/asset-maintenance.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/device-diagnostics/device-diagnostics.component.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/images/asset-image-edit.modal.controller.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/details/images/asset-image-upload.modal.controller.js","webpack:///./app/src/equipment/asset-details-dashboard/tabs/location/pin-location-modal/set-asset-location.modal.controller.js","webpack:///./app/src/equipment/asset-details-dashboard/asset-details-dashboard.module.js","webpack:///./app/src/pages/Sites/sites.route.js","webpack:///./app/src/pages/Sites/common/table/table.js","webpack:///./app/src/pages/Sites/common/map/custom-marker.js","webpack:///./app/src/pages/Sites/common/map/google.maps.service.js","webpack:///./app/src/pages/Sites/common/map/cluster-marker.js","webpack:///./app/src/pages/Sites/common/map/asset-marker.js","webpack:///./app/src/pages/Sites/common/map/ga-map.component.js","webpack:///./app/src/pages/Sites/common/chart/chart.component.js","webpack:///./app/src/pages/Sites/common/applied-filters-view/applied-filters-view.component.js","webpack:///./app/src/pages/Sites/common/search-input/search-input.component.js","webpack:///./app/src/pages/Sites/common/site-filters/site-filters.component.js","webpack:///./app/src/pages/Sites/common/table/model/table-column.js","webpack:///./app/src/pages/Sites/common/users-list-view/users-list-view.component.js","webpack:///./app/src/pages/Sites/sites-main.component.js","webpack:///./app/src/pages/Sites/sites-list/sites-list.component.js","webpack:///./app/src/pages/Sites/models/views.models.js","webpack:///./app/src/pages/Sites/site-view/site-view.component.js","webpack:///./app/src/pages/Sites/asset-list-view/asset-list-view.component.js","webpack:///./app/src/pages/Sites/site-manage-view/site-manage-view.component.js","webpack:///./app/src/pages/Sites/models/site-models.js","webpack:///./app/src/pages/Sites/services/usage.service.js","webpack:///./app/src/components/confirm-modal/confirm-modal.js","webpack:///./app/src/pages/Sites/services/sites.service.js","webpack:///./app/src/pages/Sites/services/filters.service.js","webpack:///./app/src/pages/Sites/sites.module.js","webpack:///./app/src/equipment/equipment-update/modal/equipment-update.modal.js","webpack:///./app/src/equipment/equipment-update/services/equipment-update.service.js","webpack:///./app/src/equipment/equipment-update/services/keyboard-keys.service.js","webpack:///./app/src/equipment/equipment-update/components/single-equipment-update/s-equipment-update.component.js","webpack:///./app/src/equipment/equipment-update/components/bulk-equipment-update/b-equipment-update.component.js","webpack:///./app/src/equipment/equipment-update/common/columns-toggle/columns-toggle.component.js","webpack:///./app/src/equipment/equipment-update/common/attr-edit/attr-edit.component.js","webpack:///./app/src/equipment/equipment-update/equipment-update.module.js","webpack:///./app/src/equipment/equipment-update/common/ctrl-s.directive.js","webpack:///./app/src/equipment/equipment-update/common/attr-edit/number-model.directive.js","webpack:///./app/src/app.conversion.service.js","webpack:///./app/src/app.utility.service.js","webpack:///./app/src/auth.service.js","webpack:///./app/src/auth.interceptor.js","webpack:///./app/src/timezone.service.js","webpack:///./app/src/equipment/components/date-range/date-range.component.js","webpack:///./app/src/equipment/components/equipment-details/equipment-details.component.js","webpack:///./app/src/equipment/components/equipment-facet-filters.component.js","webpack:///./app/src/equipment/components/equipment-filters-summary.component.js","webpack:///./app/src/equipment/components/images-modal/equipment-images-delete.modal.controller.js","webpack:///./app/src/equipment/components/images-modal/equipment-images.modal.controller.js","webpack:///./app/src/equipment/components/polling/equipment-polling-component.js","webpack:///./app/src/equipment/equipment-filters.component.js","webpack:///./app/src/equipment/equipment-full-filters.component.js","webpack:///./app/src/pages/alerts/fault-csv/fault-csv.component.js","webpack:///./app/src/equipment/equipment.controller.js","webpack:///./app/src/equipment/equipment.detail.edit.controller.js","webpack:///./app/src/equipment/equipment.route.js","webpack:///./app/src/equipment/equipment.search.factory.js","webpack:///./app/src/equipment/savedfilters/save-filters-confirm-modal.controller.js","webpack:///./app/src/equipment/savedfilters/save-filters-modal.controller.js","webpack:///./app/src/equipment/savedfilters/saved-filters-delete-modal.controller.js","webpack:///./app/src/equipment/savedfilters/saved-filters-modal.controller.js","webpack:///./app/src/equipment/security-groups-filter.component.js","webpack:///./app/src/equipment/services/equipment-details.service.js","webpack:///./app/src/pages/help/toggle-nav.directive.js","webpack:///./app/src/main/app.controller.js","webpack:///./app/src/functions/app.functions.js","webpack:///./app/src/main/index.route.js","webpack:///./app/src/app.settings.service.js","webpack:///./app/src/app.module.js","webpack:///./app/src/http/subscriber.js","webpack:///./app/src/http/http.js","webpack:///./app/src/state/app/app.epics.js","webpack:///./app/src/state/app/app.actions.js","webpack:///./app/src/state/reports/reports.actions.js","webpack:///./app/src/state/reports/reports.epics.js","webpack:///./app/src/state/accounts/accounts.epics.js","webpack:///./app/src/state/user/user.epics.js","webpack:///./app/src/state/table-columns/table-columns.epic.js","webpack:///./app/src/state/history/history.epic.js","webpack:///./app/src/state/search/search.epic.js","webpack:///./app/src/state/security/security.epic.js","webpack:///./app/src/state/favourite/favourite.epic.js","webpack:///./app/src/state/assets/assets.epic.js","webpack:///./app/src/state/attributes/attributes.epic.js","webpack:///./app/src/state/transfer/transfer.reducer.js","webpack:///./app/src/state/transfer/transfer.epics.js","webpack:///./app/src/state/asset-details/asset-details.state.js","webpack:///./app/src/state/asset-details/asset-details.util.js","webpack:///./app/src/state/asset-details/asset-details.epics.js","webpack:///./app/src/state/accounts/accounts.reducer.js","webpack:///./app/src/state/app/app.reducer.js","webpack:///./app/src/state/asset-details/asset-details.reducer.js","webpack:///./app/src/state/reports/reports.reducer.js","webpack:///./app/src/state/assets/assets.state.js","webpack:///./app/src/state/search/search.reducer.js","webpack:///./app/src/state/attributes/attributes.state.js","webpack:///./app/src/state/table-columns/table-columns.state.js","webpack:///./app/src/state/table-columns/table-columns.reducer.js","webpack:///./app/src/state/security/security.state.js","webpack:///./app/src/state/favourite/favourite.state.js","webpack:///./app/src/state/history/history.state.js","webpack:///./app/src/state/history/history.reducer.js","webpack:///./app/src/state/user/user.state.js","webpack:///./app/src/state/notification/notification.state.js","webpack:///./app/src/state/root.reducer.js","webpack:///./app/src/state/assets/assets.reducer.js","webpack:///./app/src/state/attributes/attributes.reducer.js","webpack:///./app/src/state/security/security.reducer.js","webpack:///./app/src/state/favourite/favourite.reducer.js","webpack:///./app/src/state/user/user.reducer.js","webpack:///./app/src/state/notification/notification.reducer.js","webpack:///./app/src/state/history/history.analytics.js","webpack:///./app/src/state/favourite/favourite.analytics.js","webpack:///./app/src/state/search/search.analytics.js","webpack:///./app/src/state/assets/assets.analytics.js","webpack:///./app/src/state/table-columns/table-colmuns.analytics.js","webpack:///./app/src/state/attributes/attributes.analytics.js","webpack:///./app/src/state/security/security.analytics.js","webpack:///./app/src/state/state.saved.keys.js","webpack:///./app/src/state/store.js","webpack:///./app/src/state/create-catch.middleware.js","webpack:///./app/src/app.js","webpack:///./app/src/index.js","webpack:///./app/src/pages/app-notifications/app.notifications.modal.html","webpack:///./app/src/pages/help/toggle-nav.directive.html","webpack:///./app/src/equipment/security-groups-filter.component.html","webpack:///./app/src/equipment/savedfilters/saved-filters-delete-modal.html","webpack:///./app/src/equipment/savedfilters/save-filters-confirm-modal.html","webpack:///./app/src/equipment/esn/esn.html","webpack:///./app/src/equipment/list/list.html","webpack:///./app/src/equipment/equipment.main.html","webpack:///./app/src/pages/alerts/fault-csv/fault-csv.template.html","webpack:///./app/src/equipment/equipment-full-filters.component.html","webpack:///./app/src/equipment/equipment-filters.component.html","webpack:///./app/src/equipment/components/polling/equipment-polling.html","webpack:///./app/src/equipment/components/images-modal/equipment-images-delete.modal.html","webpack:///./app/src/equipment/components/equipment-filters-summary.html","webpack:///./app/src/equipment/savedfilters/save-filters-modal.html","webpack:///./app/src/equipment/savedfilters/saved-filters-modal.html","webpack:///./app/src/equipment/components/equipment-facet-filters.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/status/status.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/history/history.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/controls/controls.html","webpack:///./app/src/equipment/asset-details-dashboard/tabs/commands/commands.html","webpack:///./app/src/pages/browser-policy/browser-policy.template.html","webpack:///./app/src/pages/errors/unauthorized/unauthorized.html","webpack:///./app/src/pages/devices/view/deactivate-modal/deactivate.modal.html","webpack:///./app/src/pages/devices/view/deactivate-modal/deactivate.modal.modal.html","webpack:///./app/src/pages/devices/activations/single/templates-modal/templates.modal.html","webpack:///./app/src/pages/devices/activations/single/single.html","webpack:///./app/src/pages/devices/view/view.html","webpack:///./app/src/pages/devices/list/list.html","webpack:///./app/src/pages/devices/devices.html","webpack:///./app/src/equipment/list/filter-overview/filter-overview.html","webpack:///./app/src/equipment/list/notice/highlights/highlights.template.html","webpack:///./app/src/equipment/list/notice/notice.template.html","webpack:///./app/src/pages/asset-dashboard/alerts-maintenance-history/alerts-maintenance-history.html","webpack:///./app/src/pages/alerts/historical-alerts/view/new-notes/new-note.html","webpack:///./app/src/pages/alerts/historical-alerts/list/list.html","webpack:///./app/src/pages/alerts/dashboard/table/header-filters/header.html","webpack:///./app/src/pages/alerts/dashboard/chart/chart.html","webpack:///./app/src/pages/alerts/dashboard/table/list/list.html","webpack:///./app/src/pages/alerts/configurations/geozones/view/map/map.html","webpack:///./app/src/pages/alerts/configurations/geozones/delete-modal/delete.html","webpack:///./app/src/pages/alerts/configurations/geozones/create/create.html","webpack:///./app/src/pages/alerts/configurations/geozones/view/view.html","webpack:///./app/src/pages/alerts/configurations/geozones/list/list.html","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/view/view.html","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/faults.html","webpack:///./app/src/pages/alerts/configurations/faults/view/faults/edit/edit.html","webpack:///./app/src/pages/alerts/configurations/faults/delete-modal/delete.html","webpack:///./app/src/pages/alerts/configurations/faults/view/details/details.html","webpack:///./app/src/pages/alerts/configurations/faults/view/assets/assets.html","webpack:///./app/src/pages/alerts/configurations/faults/list/list.html","webpack:///./app/src/pages/alerts/configurations/faults/create/create.html","webpack:///./app/src/pages/alerts/configurations/alerts/delete-modal/delete.html","webpack:///./app/src/pages/alerts/configurations/alerts/create/create.html","webpack:///./app/src/pages/alerts/configurations/alerts/view/triggers/triggers.html","webpack:///./app/src/pages/alerts/configurations/alerts/view/assets/assets.html","webpack:///./app/src/pages/alerts/configurations/alerts/view/details/view.html","webpack:///./app/src/pages/alerts/configurations/alerts/list/list.html","webpack:///./app/src/pages/alerts/historical-alerts/view/view.html","webpack:///./app/src/pages/alerts/dashboard/dashboard.html","webpack:///./app/src/pages/alerts/alerts.main.html","webpack:///./app/src/pages/admin/assets/sharing/share/share.assets.html","webpack:///./app/src/pages/admin/assets/sharing/manage/manage.shared.assets.html","webpack:///./app/src/pages/admin/assets/products/equipment.create.html","webpack:///./app/src/pages/admin/assets/products/equipment.product.details.html","webpack:///./app/src/pages/admin/assets/products/equipment.products.html","webpack:///./app/src/pages/admin/user-management/manage-invites/view/view.html","webpack:///./app/src/pages/admin/security-groups/view/users/users.html","webpack:///./app/src/pages/admin/security-groups/create-group/create.html","webpack:///./app/src/pages/admin/security-groups/view/assets/assets.html","webpack:///./app/src/pages/admin/security-groups/view/view.html","webpack:///./app/src/pages/admin/security-groups/list/list.html","webpack:///./app/src/pages/admin/role-management/view/edit/edit.html","webpack:///./app/src/pages/admin/role-management/view/details/details.users.html","webpack:///./app/src/pages/admin/role-management/view/details/details.datapoints.html","webpack:///./app/src/pages/admin/role-management/view/details/details.permissions.html","webpack:///./app/src/pages/admin/role-management/view/view.html","webpack:///./app/src/pages/admin/role-management/create-role/create.html","webpack:///./app/src/pages/admin/role-management/list/list.html","webpack:///./app/src/pages/admin/user-management/invite-user/invite.html","webpack:///./app/src/pages/admin/user-management/users/view/edit/edit.html","webpack:///./app/src/pages/admin/user-management/users/view/view.html","webpack:///./app/src/pages/admin/user-management/users/list/list.html","webpack:///./app/src/pages/admin/datapoint-display/list/list.html","webpack:///./app/src/pages/admin/admin.main.html","webpack:///./app/src/pages/admin/assets/tagging/components/date-time.component.html","webpack:///./app/src/pages/admin/assets/tagging/components/expandable.component.html","webpack:///./app/src/pages/admin/assets/tagging/components/hyperlink-table.component.html","webpack:///./app/src/pages/admin/assets/tagging/components/number.component.html","webpack:///./app/src/pages/admin/assets/tagging/components/range.component.html","webpack:///./app/src/pages/admin/assets/tagging/components/text-table.component.html","webpack:///./app/src/pages/admin/assets/tagging/tag.list.html","webpack:///./app/src/pages/admin/assets/products/_delete.confirmation.modal.html","webpack:///./app/src/pages/admin/user-management/users/view/delete-modal/_delete.modal.html","webpack:///./app/src/pages/admin/user-management/manage-invites/view/revoke-modal/_revoke.modal.html","webpack:///./app/src/pages/admin/user-management/manage-invites/list/list.html","webpack:///./app/src/pages/admin/security-groups/view/delete-modal/_delete.modal.html","webpack:///./app/src/pages/admin/role-management/view/delete-modal/_delete.modal.html","webpack:///./app/src/pages/t-series/dashboard.html","webpack:///./app/src/pages/t-series/t-series-verification/verification.html","webpack:///./app/src/pages/t-series/t-series-utilization/utilization.html","webpack:///./app/src/pages/t-series/t-series-inventory/inventory.html","webpack:///./app/src/pages/t-series/t-series-activity-feed/activity-feed.component.html","webpack:///./app/src/pages/reports/reportview/reports.detail.html","webpack:///./app/src/pages/reports/jobschedules/job/job.detail.html","webpack:///./app/src/pages/reports/jobschedules/jobs.html","webpack:///./app/src/pages/reports/reports.html","webpack:///./app/src/pages/reports/reportview/datapointspicker/datapoint.multi.picker.html","webpack:///./app/src/pages/reports/jobschedules/job/_form-schedule.html","webpack:///./app/src/pages/user-profile/edit-profile/email/verifyEmailChange.html","webpack:///./app/src/pages/user-profile/subscriptions/subscriptions.html","webpack:///./app/src/pages/user-profile/edit-profile/email/email.html","webpack:///./app/src/pages/user-profile/edit-profile/password/password.html","webpack:///./app/src/pages/user-profile/edit-profile/info/info.html","webpack:///./app/src/pages/user-profile/edit-profile/editProfile.html","webpack:///./app/src/pages/user-profile/profile.html","webpack:///./app/src/pages/user-profile/edit-profile/email/email.modal.html","webpack:///./app/src/pages/map/components/map-search-bar.component.html","webpack:///./app/src/pages/map/popup/popup.html","webpack:///./app/src/pages/map/view/map/map-equipment.component.html","webpack:///./app/src/pages/map/view/map/map-equipment-list.component.html","webpack:///external \"$\"","webpack:///./app/src/pages/map/view/equipment/equipment-list-item.component.html","webpack:///./app/src/pages/map/map-main.html","webpack:///./app/src/pages/help/help.html","webpack:///./app/src/pages/maintenance/plans/create/form/form.directive.html","webpack:///./app/src/pages/maintenance/plans/create/assets/assets.html","webpack:///./app/src/pages/maintenance/plans/create/tasks/create.html","webpack:///./app/src/pages/maintenance/plans/create/tasks/edit.html","webpack:///./app/src/pages/maintenance/plans/create/tasks/tasks.html","webpack:///./app/src/pages/maintenance/plans/create/schedule/schedule.html","webpack:///./app/src/pages/maintenance/plans/details/edit/edit.html","webpack:///./app/src/pages/maintenance/plans/details/delete/delete.html","webpack:///./app/src/pages/maintenance/plans/details/assets/assets.html","webpack:///./app/src/pages/maintenance/plans/details/tasks/tasks.html","webpack:///./app/src/pages/maintenance/plans/details/details.html","webpack:///./app/src/pages/maintenance/plans/plans.html","webpack:///./app/src/pages/maintenance/board/board.html","webpack:///./app/src/pages/maintenance/history/details/details.html","webpack:///./app/src/pages/maintenance/history/history.html","webpack:///./app/src/pages/maintenance/maintenance.html","webpack:///./app/src/components/browser-links/browser-links.template.html","webpack:///./app/src/components/browser-update-banner/browserUpdateBanner.html","webpack:///./app/src/components/top_nav/top.nav.html","webpack:///./app/src/components/searchable-multi-select-dropdown/searchable-multi-select-dropdown.html","webpack:///./app/src/components/modal-dialog/modal-dialog.html","webpack:///./app/src/components/loading-indicator/loading-indicator.html","webpack:///./app/src/components/fields-required/fields-required.html","webpack:///./app/src/components/tag-url/tag-url.html","webpack:///./app/src/components/equipment-status/equipment-status.html","webpack:///./app/src/components/time-progress-bar/time-progress-bar.html","webpack:///./app/src/components/status-bar/status-bar.html","webpack:///./app/src/components/spark-line/spark-line.html","webpack:///./app/src/components/simple-tags/simple-tags.html","webpack:///./app/src/components/searchable-dropdown/searchable-dropdown.html","webpack:///./app/src/components/search-bar/search-bar.html","webpack:///./app/src/components/response-message/response-message.html","webpack:///./app/src/components/progress-bar/progress-bar.html","webpack:///./app/src/components/multi-emails/multi-emails.html","webpack:///./app/src/components/sign-out.html","webpack:///./app/src/components/asset-search/history/filter-summary/filter-summary.html","webpack:///./app/src/components/buttons/toggle-button/toggle-button.html","webpack:///./app/src/components/buttons/table/remove/table-remove-button.html","webpack:///./app/src/components/buttons/table/order/table-order-buttons.html","webpack:///./app/src/components/buttons/assets/select/select-assets-button.html","webpack:///./app/src/components/buttons/save/save-button.html","webpack:///./app/src/components/buttons/remove-selected/remove-selected-button.html","webpack:///./app/src/components/buttons/export-csv/export-csv-button.html","webpack:///./app/src/components/buttons/edit/edit-button.html","webpack:///./app/src/components/buttons/delete/delete-button.html","webpack:///./app/src/components/buttons/create/create-button.html","webpack:///./app/src/components/buttons/cancel/cancel-button.html","webpack:///./app/src/components/buttons/add-users/add-users-button.html","webpack:///./app/src/components/buttons/assets/add/add-assets-button.html","webpack:///./app/src/pages/global-layouts/navigation/left/left.component.html","webpack:///./app/src/pages/global-layouts/navigation/mobile/toggle-mobile.directive.html","webpack:///./app/src/pages/global-layouts/navigation/mobile/mobile.component.html","webpack:///./app/src/pages/global-layouts/navigation/accounts-switching/accounts-switching.html","webpack:///./app/src/pages/asset-dashboard/Layouts/layouts.html","webpack:///./app/src/pages/asset-dashboard/Layouts/default/default.html","webpack:///./app/src/pages/asset-dashboard/Layouts/layout/layout.html","webpack:///./app/src/pages/asset-dashboard/equipment-status/equipment-status.html","webpack:///./app/src/pages/asset-dashboard/alarms/alarms.html","webpack:///./app/src/pages/asset-dashboard/status/status.html","webpack:///./app/src/pages/asset-dashboard/components/gauge-builder/gauge-builder.html","webpack:///./app/src/pages/asset-dashboard/asset-dashboard.html","webpack:///./app/src/pages/asset-dashboard/alerts-panel/alerts-panel.html","webpack:///./app/src/pages/maintenance/board/complete/complete.html","webpack:///./app/src/services/loading.modal.html"],"names":["module","exports","moment","angular","__webpack_require__","d","__webpack_exports__","gettext","str","AppSettings","_createClass","_classCallCheck","this","environment","process","environments","local","staging","production","icebergUrl","BaseTugApiUrl","BaseIcebergUrl","RepotingApiUrl","IcebergApiUserInfoEndpoint","concat","IcebergApiTransfersEndpoint","IcebergApiAttributesEndpoint","IcebergApiPackagesEndpoint","IcebergApiInstallationsEndpoint","IcebergApiEquipmentEndpoint","IcebergApiDevicesEndpoint","IcebergApiDatapointsEndpoint","IcebergApiCommandsEndpoint","IcebergApiTimeSeries","AmplitudeAPIKEY","VikingEndpoint","BrandingImageUrl","BrandingFileUrl","MobileIconSizes","SupportedLanguages","option","des","LandingPages","id","description","state","a","Auth","url","URL","window","location","href","accessToken","localStorage","getItem","removeItem","baseOptions","authority","client_id","redirect_uri","post_logout_redirect_uri","silent_redirect_uri","protocol","host","automaticSilentRenew","loadUserInfo","response_type","scope","options","key","value","query","hasOwnProperty","forcelogout","manager","removeUser","signinRedirect","pathname","includes","signUserOut","_init","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this","wrap","_context","prev","next","abrupt","Promise","resolve","reject","hasAccessToken","setItem","acr_values","otp","prompt","initializeManager","checkForcedLogout","events","addSilentRenewError","startAuthentication","addUserLoaded","user","Oidc","Log","logger","console","stop","apply","arguments","client","detectClient","_objectSpread","UserManager","Clients","load","accountId","_userIsLoggedIn","_callee2","_this2","_context2","signinRedirectCallback","t0","catch","getUser","sent","expired","signoutRedirect","profile","token_type","access_token","token","JSON","parse","Buffer","from","split","toString","exp","alertStatus","AlertOption","_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default","n","_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__","_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default","_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__","_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default","error","warning","good","Condition","apicontrolStatusCondition","length","expression","trueMsg","falseMsg","apicontrolStatus","name","datapointIds","class","icon","errorMsg","conditions","map","apicondition","db","equipment","datapointId","onei3","series","last","v","calcStatus","result","_this$datapointIds","_slicedToArray","dbId0","dbId1","status","text","_this$getdatapointser","getdatapointseries","db0","value0","db1","_this$getdatapointser2","_this$getdatapointser3","value1","_this$conditions","firstcond","eval","require","e","t","r","s","o","u","i","f","Error","code","l","call","1","stringify","gj","pairWKT","c","ringWKT","join","ringsWKT","wrapParens","type","geometry","coordinates","geometries","numberRegexp","tuples","RegExp","source","input","obj","parts","_","pop","srid","shift","$","re","match","substring","white","multicoords","elem","depth","rings","stack","pointer","push","some","isNaN","Array","prototype","parseFloat","coords","item","pt","list","root","newCoordsFormat","indexOf","replace","crs","properties","_babel_runtime_helpers_objectSpread__WEBPACK_IMPORTED_MODULE_0__","_babel_runtime_helpers_objectSpread__WEBPACK_IMPORTED_MODULE_0___default","_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__","_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default","_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__","_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default","_auth__WEBPACK_IMPORTED_MODULE_3__","hostname","defaultConfig","clients","Map","set","get","KEY_LASTSTATE","ConfigRouteConfig","$urlRouterProvider","$compileProvider","$urlMatcherFactoryProvider","$breadcrumbProvider","$locationProvider","caseInsensitive","strictMode","html5Mode","hashPrefix","otherwise","$injector","$state","firstAccessibleTopNav","getFirstValidTopNavItem","go","sref","debugInfoEnabled","decode","myDateValue","timestamp","Date","is","setOptions","template","ConfigRunSetup","$rootScope","$location","navService","localStorageService","editableOptions","$ngRedux","theme","$on","event","toState","toParams","lastStateParams","params","format","flexPage","data","flex","leftNav","breadcrumb","evt","to","stateName","validSubItem","nextState","param","redirectTo","hideSideNav","isValidState","preventDefault","getFirstValidSubItemState","addToHomescreen","startDelay","reduxState","getState","_document$location$hr","document","_reduxState$app$redir","app","redirectToState","signInRedirectUri","exec","Object","defineProperty","appConfigModule","config","run","appSettingsModule","InviteService","$http","appSettings","postInvite","email","endpoint","post","TransferService","resourceUrl","getResourceUrl","getTransferKeys","transferResources","transferKey","resourcesArray","getMoreTransfers","moreLink","substr","getTransfers","limit","getTransferKeysToShare","InReachApiEndpoint","postEquipmentToShare","equipsShareObject","SavedSearchService","$q","savedSearches","savedSearchEndpoint","InReachApiSavedSearchEndpoint","getSearches","def","defer","securityGroups","alertStates","maintenanceStates","attrs","values","range","max","min","included","meta","total-pages","links","self","promise","saveSearch","search","deleteSearch","savedSearchID","delete","state_action","payload","fetch","Action","SecurityGroupsService","groupsEndpoint","userUrl","getUserUrl","getAllSecurityGroups","postNewGroup","endPoint","then","UpdateSecurityGroups","getSingleGroup","putGroupUpdate","put","patchEquipmentUserUpdate","deferred","patch","groupResponse","resource","tag","op","groupError","deleteGroup","response","getStore","dispatch","SecurityGroupActions","getSecurityGroupsByAttrs","attrsQueryString","keys","k","res","patchResources","SavedFilterService","savedFilters","savedFilterEndpoint","InReachApiSavedFilterEndpoint","getAllSavedFilters","getSavedFilter","savedFilterId","postSaveFilter","savedFilter","deleteSavedFilter","savedFilterID","updateSavedFilter","patchSavedFilter","ReportsRepository","getAllReports","uri","InReachApiReportEndpoint","getReport","excuteReport","reportName","PackagesService","gettextCatalog","getAllPackages","InReachApiPackagesEndpoint","getPackageById","packageid","getPackageByIds","packageIds","getDatapointsForPackage","getDatapointsForPackages","getString","promises","all","responseList","datapointSet","forEach","datapoint","datapointList","MobileService","$window","isMobile","innerWidth","$inject","lodash_es_orderBy","find","lodash_es_map","difference","union","intersection","getprefixes","reduce","prefixes","dotidx","lastIndexOf","isStateAuthorized","currentUser","features","requiresChangeEmail","changeEmail","requiredAdminRole","roles","filter","role","requiredPermissions","permissions","requiredFeatures","_toConsumableArray","parentState","parent","inheritedPermissions","_intersection","_union","_map","path","_difference","requiredDatapoints","userDatapoints","visibleDatapoints","dp","NavService","alertsNavService","adminNavService","devicesNavService","maintenanceNavService","mapNavService","equipmentNavService","tSeriesNavService","reportsNavService","accessManagemantNavService","usersService","userProfileNavService","siteNaveService","modules","entries","_ref","getModule","_showingNavService","isShowingSideNav","toggleSideNav","showSideNav","getModules","getModuleByState","_find","m","startsWith","getCurrentModule","current","items","_orderBy","loadingModalService","$uibModal","modalInstance","open","animation","ariaLabelledBy","ariaDescribedBy","windowClass","controller","$scope","size","close","dismiss","node_modules_axios","axios_default","LanguagesService","getSupportedLanguages","setCurrentLanguage","lang","_args","debug","loadRemote","InstallationNoteService","createNote","installationId","note","InReachApiInstallationsEndpoint","getInstallationNote","updateNote","noteId","deleteNote","patchInstallationAttrs","changeset","FileUploaderService","FileUploader","DevicesService","getAllDevices","getDevice","serialNumber","getDeviceModelBySerialNumber","telematicsSerialNumber","ExceptionLoggingService","$log","exception","cause","errorMessage","StackTrace","ajax","headers","Authorization","getAuthorizationHeader","contentType","message","stackTrace","loggingError","warn","log","AppNotificationsService","notificationUrl","getActiveAppNotifications","acknowledgeNotications","notificationsList","AlertRuleService","createAlertRule","alertModel","InReachApiAlertRulesEndpoint","getEquipmentByAlertRuleId","getRule","rule","updateRule","deleteRule","ruleId","ASSET_TYPE_VALUES","Undefined","Tool","Accessory","Material","Storage","COMMUNICATED_TAG","NEVER_COMMUNICATED_TAG","adaptFacets","searchState","alerts","maintenance","lastCommunicated","lastSeen","INITIAL_STATE","SearchStateModel","inProgress","filters","cursor","since","bounds","shareKey","initial","label","icon_color","_selected","title","group","never","tagFilters","modes","prefilter","queries","index","sort","direction","exportInProgress","accounts","ONEI3_SERVICE_ACCESS_MGMT","EquipmentSearchService","groupsEnum","freeze","security_groups","shares","buildSelectedTags","tagsArray","groupName","selectedTags","_forEach","facet","buildTagObject","tagString","tagObject","buildAttr","tagKey","tagValue","attr","assign","_typeof","equal","any","exists","between","value2","greaterThan","lessThan","buildAPIEquipmentFilterObject","facetCommunicated","communicatedAtObject","share","facets","accountsArray","tags","FACET_SECURITY_GROUPS_KEY","FACET_ALERT_PRIORITY_KEY","FACET_MAINTENANCE_KEY","FACET_LAST_COMM_KEY","communicatedAt","within","outside","FACET_LAST_SEEN_KEY","lastSeenFilter","coordsAt","facetLastSeen","_ref3","start","utc","subtract","end","_isArray","val","isSearchOutsideBound","nw","se","lng","lat","searchOutsideBound","isArray","_mergeWith","b","TagsService","generateTooltip","dateFormat","GetDateFormat","dateTimeFormat","tip","dataType","attrDataTypesText","integer","decimal","date","datetime","hyperlink","HasValue","getAttrShortHelpText","_ref2","_ref2$min","_ref2$max","toLowerCase","typeInfo","AttributesService","EquipmentService","_attrs","attrName","getAttributesList","attrsList","getAllTags","DeviceDiagnosticService","seriesEndpoint","None","Poor","Fair","Good","Excellent","Unavailable","Loading","Ideal","poor","SignalStatus","fair","excellent","ideal","esn","tagQuery","equipmentId","gps","getGpsStatusInfo","getSeriesByDevice","cellSignal","getCellSignalStatusInfo","gpsSeries","_ref7$fix_quality","fix_quality","fixQuality","GpsQuality","cellSignalSeries","dataId","serviceModule","service","translateKey","language","factory","provider","$get","exceptionLoggingService","markdownToUrl","urlToMarkdown","init","photosElement","images","closeElClasses","history","focus","zoomEl","tapToClose","closeOnScroll","closeOnVerticalDrag","clickToCloseNonZoomable","showAnimationDuration","hideAnimationDuration","PhotoSwipe","PhotoSwipeUI_Default","round","Math","NaN","lodash_es_isArray","helpers_toArray","toArray_default","findFaultDtcDescriptor","faultSeries","datapointDescriptorsByKey","_split","_split2","_toArray","serieskeyArraywithoutEquipPart","slice","formatFaultCode","faultCode","seriesAttr","spn","fmi","severity","toUpperCase","category","getLastCommunicationOptions","lscomm","EquipmentMockService","securityGroupsService","urlUtil","equipmentSearchService","FixturesModeEnabled","toArray","isDtcSeries","seriesItem","getEquipmentPriority","maxPriority","getEquipmentWithinBounds","q","InReachApiEquipmentEndpoint","getTimeseriesCsvData","timeRange","InReachApiTimeSeriesEndpoint","getEquipment","cancelDefer","includeList","uom","timeout","first","claims","unitOfMeasure","getEquipmentActiveFaults","seriesList","results","getDtcFaultDescriptor","fault","EquipmentServiceUtil","getEquipmentSeries","getSeriesByMultipleEquipment","equipmentIds","getEquipSeriesData","seriesIDs","interval","functions","requestData","ids","isString","toRangeParam","getEquipmentFacets","getEquipmentSearch","getEquipmentBySearchFilter","hits","locationRedirectFlag","getAllEquipmentSearch","putEquipment","batchPatchAttrs","getSingleEquipment","equipId","postEquipmentListByIds","equipIds","lower","getTagById","getTagNames","postNewTag","putEditTag","deleteTag","patchEquipmentProfileImage","image","body","UsersService","initialData","userInfoBaseUrl","datapointsBaseUrl","flatPermissions","_currentUser","currentUserAsync","getCurrentUser","hasRequiredFeatures","userFeatures","hasState","j","getUsers","getUserClaims","updateUserClaims","prefix","firstName","given_name","lastName","family_name","trim","patchCurrentUserClaims","changesets","newemail","patchUserInfo","updateUserInfo","userId","userInfo","postUserInfo","changePassword","model","getRoleDetails","deleteRoleDetails","putRoleDetails","getRolePolicies","getDatapoints","en_description","getDataPointsByRoleIds","patchUserRoles","changes","isUserAnAdministrator","isAdmin","canUserEditExpiry","approvedRoleIds","postUserRole","userRole","getRoles","AlertsMockService","getAllAlerts","getNotes","AlertsService","toastr","alertsEndpoint","InReachApiAlertsEndpoint","priority","getAlertAggregate","getAlert","alertId","getAllAlertHistory","getAlertHistoryDetails","updateAlert","singleAlert","method","Content-Type","getNote","getAllRules","getAlertCount","getRuleById","ruleID","updateAlertAcknowledge","updateAlertClear","instanceId","removeAlert","clearAlert","alert","attributes","acknowledgeAlert","updatedBy","instanceid","elementPos","x","splice","CommandsRepo","getCommandsForEquipment","getCommands","getEquipmentCommandHistory","getCommandHistoryItem","historyItemId","getLatestEquipmentCommandHistory","commandName","getCommandRecords","suffix","appendParam","isDefined","page","number","executeCommand","parameters","ConfigService","getDatapointDisplayList","getDatapointDisplayById","getDatapointDisplayForPackageAndModules","packageId","modulesIds","createDatapointDisplayForPackageAndModules","dpd","displayItems","updateDatapointDisplay","deleteDatapointDisplayById","ConfigurationsService","configurationsEndpoint","postConfiguration","configuration","getConfigurationById","getConfigurationByName","getAllConfigurations","putConfigurationUpdate","deleteConfiguration","patchConfiguration","configurationResponse","configurationError","patchConfigurationEquipment","postConfigurationTrigger","deleteConfigurationTrigger","triggerId","updateConfigurationTrigger","trigger","CSVDataExportService","baseUri","InReachApiCSVExportEndpoint","exportUri","createCSV","csv","req","updateCSV","getCSVs","getCSV","deleteCSV","FeatureService","getFeatures","GeolocationService","getLocationByIp","ip","statusText","GeozoneService","equipmentGeozoneSRVs","equipmentGeozonesEndpoint","InReachApiGeozonesEndpoint","getAllGeozones","getGeozoneById","geozoneid","getGeozoneByName","geozonename","putGeozoneById","newZone","getEquipmentInZone","geozoneId","postNewEquipmentGeozone","geozone","copy","alertRule","deleteEquipmentGeozone","addEquipmentInZone","equipmentIdList","changeSet","deleteEquipmentInZone","InstallationsMockService","getInstallations","getInstallationByequipID","InstallationsService","activationsRepo","base","deviceSerialNumber","queryString","getInstallationById","createInstallation","newInstallation","sgResource","X-Init-Security-Group","deleteInstallation","syncRunHours","runHours","syncRequest","createSyncRequest","JobSchedulerMockService","accessKeyId","SchedulerAWSAccessKey","secretAccessKey","SchedulerAWSSecretKey","sqsQueue","SchedulerAWSQueueUrl","createSchedule","schedule","InReachApiSchedulerEndpoint","actions","action","queue","JobSchedulerService","dateRangeTranslationTable","7d","MTD","30d","90d","frequencyTranslationTable","day","month","year","getEquipmentList","getDateRange","translated","dateRangeParsed","tooltip","reportParameters","drop_DateRange","translatedValue","getScheduleRecurrenceFrequency","recurrence","frequency","getNotificationEmails","arr","contacts","updateSchedule","getScheduleReportPath","reportPath","getSchedules","typeName","getSchedule","deleteSchedule","MaintenanceMockService","getPlans","getPlan","planId","updatePlan","plan","createPlan","deletePlan","getPlanTasks","getTaskInPlan","taskId","createTaskInPlan","task","updateTaskInPlan","deleteTaskInPlan","getStatus","MaintenanceService","showPopupForEquipmentPlan","equipmentData","baseURL","getEquipmentForPlan","updateEquipmentForPlan","equipmentChangeSet","getHistory","getServiceRecord","recordId","getServiceRecordTasks","newServiceRecord","record","completeTasks","tasks","getDashboardAggregate","getFacetHits","getPlanCsvData","cache","responseType","MediaService","InReachMediaEndpoint","deleteImage","imageId","updateImage","RoleService","createRole","updateRole","getAllUsersOfRole","roleId","assignable","getRole","TemplatesService","createTemplate","updateTemplate","deleteRole","TransfersService","transferSRVs","transfersEndpoint","InReachApiTransfersEndpoint","getKeysByFilter","SearchFavouritesRepository","http","InReachApiSearchFavouritesEndpoint","favourite","favouriteId","buildRestoreOperation","restoredFavourites","AccountsRepo","_currentAccount","account","_userAccounts","userAccounts","getCurrentAccount","getAccounts","getSubAccounts","acc","subAccounts","createSubAccount","accountName","updateSubAccountName","signInTo","BulkActivationService","bulkActivationEndpoint","InReachApiBulkActivation","bulkActivate","file","formData","FormData","append","transformRequest","identity","undefined","AccessManagementAPIService","assignmentEndpointUrl","accessEndpointUrl","assetIds","operatorsIds","command","assignments","operatorIds","assetId","operatorId","OperatorsAPIService","baseEndpointUrl","csvFile","endPointUrl","operatorsList","codes","autoGeneratePin","accessCodes","expiry","operator","autoGeneratePIN","GroupsAPIService","groupEndpointUrl","ReportingAPIService","reportingUrl","reportingEndpointUrl","reportId","TimeSeriesAPIService","$timeout","icebergApiTimeSeries","criteria","owners","seriesId","timezone","funcs","intr","tz","seriesID","equipmentID","dataPoint","valueType","isPinned","unpinLocation","createSeries","pinLocation","apiModule","UsersMockService","AccessManagementAPI","OperatorsAPI","AlertPanelComponent","restrict","controllerAs","vm","erroringSeries","$onChanges","currentValue","gauge","bindings","isStateDataPoint","descriptor","isSeriesHasLastValue","calculateStatusDatapoints","stateSeries","serie","order","sortAndReduce","calculateNumericDatapoints","sparkline","sparklines","sortBy","ToLowerCase","templates_service","packageids","statusSerie","numericSerie","templateName","getTemplate","dials","statuses","TEMPLATE_ELEMENTS","off","offCalc","row","removeStageThreeAndFour","twoStageCheck","serieUndefinedWhenOff","excludeSerie","alarms","y","alarm","inAlarmState","errorState","dial","relatedSerie","templateElementTypes","PACKAGE_TEMPLATE_MAPPINGS","1888644131362701965","946425127598293799","900583554071659341","1380404070363169353","940555193043387297","824466523073544286","1027458292986675380","1026736337010557713","1046994433532232327","1199335482937311645","1295593606043665017","2000670464992609252","2056796697866010811","2042281683352289994","1966808143153333206","2395104989652451496","2400225736544747560","PUMP","offBaseCalc","showMinMax","disabledWhenOff","power","pump","pump_m7","fan","chiller","DashboardViewModel","_id","_status","_numeric","_title","_packageIds","installation","packages","package_item","_runHours","run_time","_communicatedAt","templateService","_off","_alarms","_statuses","_dials","_dialTemplate","make","chrome","firefox","edge","getBrowserSupportList","browser","browserList","osname","osversion","AssetDashboardController","equipmentDetailsService","$stateParams","$interval","dashboardCommandsService","loading","newBrowsers","commandService","active","fetchEquipment","refreshing","ViewModel","_this$commandService$","getSupportedCommands","commands","total","showCommands","err","finally","expiryAt","getExpiry","expiryDate","unix","expiryIn","diff","dashboardLifetimecheck","timeCheckInterval","secondsLeft","timeInMins","ceil","cancel","updateAssetInterval","getDashboardLifetime","setRefreshInterval","_this3","time","fromNow","showCommandsView","asset_dashboard_component","gaugeBuilderComponent","disabled","foregroundColor","alarming","color","backgroundColor","getDialHeight","getSparkLineHeight","getSparkLineWidth","toFixed","iid","orientation","minThreshold","maxThreshold","StatusController","Off","On","status_component","AlarmController","alarms_component","equipmentStatusComponent","groupedGauges","$onDestroy","defineProperty_default","commands_commands","commands_default","CommandsController","getCommnadsFeedbackHistory","updateHistoryinterval","setUpdateHistoryinterval","commandsValueLookup","getcommandsValuesLookup","commandsHistoryStatus","confirm","sendDeviceCommand","sendingStatus","sendCommand","asset","newCommandFeedbackToShowInUI","newCommand","createdAt","toISOString","statusAt","commandsHistory","_this4","getAssetCommandsHistroy","_ref2$","_first$parameters","_second$parameters","_second$parameters2","second","isSameCommand","com","uiParam","constraints","ac","_defineProperty","commands_component","feedback_history","feedback_history_default","statusCssClasses","pending","completed","failed","CommandsFeedbackHistoryController","statusClasses","aborted","rejected","acknowledged","pendingAbort","statusMap","commandStatusMap","add","toDate","feedback_history_feedback_history","valuesLookup","status_check","status_check_default","preCheckList","bad","comAt","battery","_series$battery_poten","_series$battery_poten2","battery_potential","auto_mode","_series$auto_start_mp","_series$auto_start_mp2","_series$controller_mo","_series$controller_mo2","autoSetting","auto_start_mpc","controller_mode_mpc_pump","StatusCheckController","preCheck","_this$checked","checked","status_check_component","AssetDashboardRouteConfig","$stateProvider","confirm_modal","confirm_modal_default","confirm_modal_confirm_modal_default","_default","$uibModalInstance","CommandsDashboardService","commandsapiRepo","supportedPackagesCommandsMap","assetPackages","_equipment$relationsh","_equipment$relationsh2","assetcommandsList","relationships","deviceCommands","packagesCommands","getpackageSupportedCommands","supCommands","p","userInput","_command$parameters","bodyParams","parameter","modalHTml","modalControl","Layout1Controller","elements","el","layout_component","DefaultLayoutController","default_component","LAYOUT_TEMPLATES","groups","TEMPLATE_MAP","LayoutsController","layoutTemplate","layoutTemplateName","layouts_component","assetDashboardModule","component","alertsPanelComponent","assetDashboardComponent","statusComponent","alarmComponent","layout1Component","defaultLayoutComponent","layoutsComponent","commandsView","commandFeedbackHistory","statusCheck","DashboardCommandsService","REQUEST_USER","REQUEST_USER_FAIL","REQUEST_USER_SUCCESS","REQUEST_CLAIMS_SUCCESS","REQUEST_REFRESH_TOKEN","REQUEST_REFRESH_TOKEN_FAIL","REQUEST_REFRESH_TOKEN_SUCCESS","RECEIVE_USER_CLAIMS","REQUEST_USER_ACCOUNTS","REQUEST_USER_ACCOUNTS_FAIL","REQUEST_USER_ACCOUNTS_SUCCESS","ACCOUNT_REQUESTED","ACCOUNT_RECEIVED","REQUEST_DATAPOINTS_DESCRIPTORS","REQUEST_DATAPOINTS_DESCRIPTORS_FAIL","REQUEST_DATAPOINTS_DESCRIPTORS_SUCCESS","requestUser","requestUserSuccess","requestClaimsSuccess","receiveUserClaims","requestUserFailed","requestRefreshToken","refreshTokenSuccess","refreshTokenFail","retrieveAccount","retrieveDatapointsDescriptors","requestUserAccounts","requestUserAccountsSuccess","requestUserAccountsFail","requestDatapointsDescriptorsSuccess","requestDatapointsDescriptorsFail","AccountsSwitchingController","store","userAccount","currentUserAccounts","searchQuery","userMemberAccountsCount","filterAccounts","bind","filterTrack","unsubscribe","connect","mapStateToThis","UserActions","switchableAccounts","memberShipCount","currentAccount","userMembershipsCount","accountNameContains","switchAccount","accounts_switching_component","sub","NavMobileController","closeSideNav","goHelp","helpPage","helpItem","cs","hs","helpState","helpModuleId","selectedModule","userModule","moduleStyle","isActive","toggleUserModule","toggleModule","NavLeftController","groupList","ungroupedItems","itemKey","itemGroup","groupKey","itemMatch","toggleNavCollapsedMin","link","ele","on","hasClass","removeClass","addClass","$broadcast","AdminNavService","mobileName","AlertsNavService","DevicesNavService","navTitle","EquipmentNavService","DashboardFeatures","DashboardItemID","HelpItemsNavService","helpReportsItemsService","helpAdminItemsService","helpAlertsItemsService","helpAssetsItemsService","helpDevicesItemsService","helpMaintenanceItemsService","helpMapItemsService","helpUsersItemsService","navServices","isAccessible","moduleid","accessAllowed","isShowingHelpSideNav","toggleHelpSideNav","hideHelpSideNav","showHelpSideNav","HelpNavService","HelpAdminItemsService","orderid","itemid","helpitemid","templateUrl","HelpAlertsItemsService","HelpAssetsItemsService","HelpDevicesItemsService","HelpMaintenanceItemsService","HelpMapItemsService","HelpReportsItemsService","HelpUsersItemsService","MaintenanceNavService","MapNavService","ReportsNavService","TSeriesNavService","UserProfileNavService","hide","accessManagmentNavService","_module","sitesNavService","navModule","ApiModule","AccountsSwitchingComponent","directive","CustomPageController","$element","addBg","$watch","newVal","oldVal","transclude","click","$a","$aRest","$app","$lists","$nav","prevWidth","updateClass","subitems","children","not","$parent","width","slideUp","toggleClass","slideToggle","currentWidth","resize","clearTimeout","setTimeout","toggleNavCollapsedMinCtrl","$attrs","highlightActive","$li","$link","element","rootScope","showingSideNav","AccessManagemantNavService","SiteNaveService","TableRemoveButtonController","arrayUtil","remove","parseInt","ToggleButtonComponent","onOff","componentsButtonModule","editing","editMode","toggle","edit","moveTop","toTop","moveBottom","toBottom","moveUp","swapItems","moveDown","getIndex","disableDown","disableUp","bindToController","ng_redux","$ngReduxProvider","provideStore","App","stateModule","ngRedux","lodash_es_remove","lodash_es_includes","ASSETS_FAILED_TO_POPULATE","ASSETS_SELECTED","ASSET_VIEWED","PAGESIZE_UPDATED","PAGE_SELECTED","updatePageSize","failToPopulate","select","assets","viewed","selectPage","resetLastViewedAsset","SEARCH_SUCCESS","SEARCH_FAILURE","SEARCH_INITIATED","SEARCH_REQUESTED","SEARCH_UPDATED","UPDATE_SEARCH_PREREQUISITES","SEARCH_REFRESH","SEARCH_RESET","SEARCH_BEGIN","SEARCH_EXPORT","SEARCH_EXPORT_FAILURE","SEARCH_EXPORT_SUCCESS","FACET_SELECTED","FACET_SELECTED_EXCLUSIVE","FACET_DESELECTED","FACET_DESELECTED_EXCLUSIVE","SET_SELECTED_FACETS","SET_SELECTED_TAG_FILTERS","TAG_FILTERS_UPDATED","TAG_FILTER_ADDED","TAG_FILTER_REMOVED","QUERY_ADDED","QUERY_REMOVED","ACCOUNT_ADDED","ACCOUNT_REMOVED","SORT_UPDATED","LAST_SEEN_UPDATED","ALERTS_FACET_TYPE","SECURITY_GROUPS_FACET_TYPE","MAINTENANCE_STATUS_FACET_TYPE","COMMUNICATED_AT_FACET_TYPE","LAST_SEEN_FACET_TYPE","initiated","updated","refresh","requested","updatePrerequisites","prerequisites","searchSuccess","searchFailure","searchExport","searchExportFailure","searchExportSuccess","resetSearch","updateSort","addQuery","term","updateLastSeen","removeQuery","selectFacet","facetType","deselectFacet","updateTagFilters","addTAGFilter","tagFilter","removeTAGFilter","exclusiveDeselectFacet","exclusiveSelectFacet","addAccount","removeAccount","COLUMN_VISIBLE_TOGGLED","COLUMN_ORDERBY","COLUMN_SECURITY_GROUPS_SET","COLUMN_ATTRIBUTES_SET","SET_COLUMN_VISIBILTY","toggleColumn","column","setAttributes","setSecurityGroups","setColumnVisiblity","AssetListController","$filter","equipmentUpdateService","selectMode","allSelected","SearchActions","AssetActions","TableColumnActions","visibleAssets","goToAssetTimeout","lastCheckIndex","defaultBindings","tableColumns","security","_assets$list","accountNameLookup","every","selected","pageSize","totalCount","currentPage","totalPages","initialSearch","errorText","errorFlag","last_viewed_id","viewed_asset_id","columns","lastViewedId","viewedAssetId","accountsLookup","preSelectedIds","assetDetails","selectionChanged","sort_key","_includes","_remove","currentSelections","shiftKey","activeClass","selections","dataLayer","notice","hasMoreResults","now","lsn","days","duration","asDays","dateTime","timeZone","formattedDateTime","guess","openEditModal","assetListComponent","AssetListFooterController","selectedPage","numPages","pageSizes","totalAssetCount","showNotice","appStateModule","inherits","inherits_default","possibleConstructorReturn","possibleConstructorReturn_default","getPrototypeOf","getPrototypeOf_default","asset_search_component","asset_search_component_default","DebouncedToggle","_toggleInProgress","AssetSearchController","_DebouncedToggle","_inherits","_super","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","Super","NewTarget","constructor","_createSuper","showingHistory","searchString","helpContent","helpMe","assetCount","$event","stopPropagation","searchTimeoutPromise","openFilters","_preventBubbling","_debounceToggle","_ignore","assetSearchComponent","history_component","history_component_default","cloneDeep","HISTORY_UPDATED","HISTORY_ADDED","HISTORY_SELECTED","selectHistory","historyAdded","historyUpdated","FAVOURITES_FETCH_INITIATED","FAVOURITES_FETCH_SUCCESS","FAVOURITES_FETCH_FAILED","FAVOURITE_ADDED","FAVOURITE_ADD_SUCCESS","FAVOURITE_ADD_FAILED","FAVOURITE_REMOVED","FAVOURITE_REMOVE_SUCCESS","FAVOURITE_REMOVE_FAILED","FAVOURITE_SELECTED","FAVOURITE_AUDIT","FAVOURITE_UPDATED","FAVOURITE_UPDATE_SUCCESS","FAVOURITE_UPDATE_FAILED","FAVOURITE_RESTORE","FAVOURITE_RESTORE_SUCCESS","FAVOURITE_RESTORE_FAILED","FAVOURITE_OLD_SELECTED","favouriteAdd","favouriteAddSuccess","favouriteAddFailed","audit","favouriteUpdate","favouriteUpdateSuccess","favouriteUpdateFailed","favouriteRemove","favouriteRemoveSuccess","favouriteRemoveFailed","favouriteFetch","favouriteFetchSuccess","favouriteFetchFailed","favouriteSelect","selectOldFavourite","oldFavourite","favouriteRestore","favouriteRestoreSuccess","favouriteRestoreFailed","AssetSearchHistoryController","modifiedObject","HistoryActions","FavouriteActions","favourites","searchTime","removedFavourites","removedList","searchItem","hash","object","_cancelEdit","getMeta","isEditing","_cloneDeep","isCreating","isHistoryHovered","itemMeta","isDeleting","isHovered","_cancelDelete","_beginEdit","favAttrs","_setItemError","isFavourite","editFavourite","_hasKeys","closeHistory","assetSearchHistoryComponent","daysRange","LastSeenOptions","isSame","getLastSeenOptionByMinMax","minValue","maxValue","FilterSummaryComponent","filtersCount","_getFilterCount","_getFilters","_this$item","_this$item2","_this$item2$alerts","_this$item2$maintenan","_this$item2$lastCommu","_this$item2$securityG","_this$item2$accounts","_this$item2$lastSeen","frindlyalerts","getfriendlyObject","frindlymaintenance","frindlylastCommunicated","frindlysecurityGroups","frindlyAccounts","savedLastSeen","LastSeenFilter","collection","friendlyObject","translateval","fullObject","filter_summary_component","assetSearchModule","angularUiBootstrap","filterSummary","table_column_selector","table_column_selector_default","TableColumnSelectorController","showList","tableColumnSelectorComponent","SignOutComponent","sign_out_component","geoLocationController","address","displayAddress","mapURL","addToDataLayer","IsIOSDevice","updateCoords","setMapURL","universalGoogleMapUrlDirection","encodeURI","latitude","longitude","universalGoogleMapUrl","isoMapDirection","isoMap","mapURLDirection","Number","updateLocation","Match_addr","closeAddress","Address","L","esri","Geocoding","reverseGeocode","latlng","distance","eventData","resolveCoord","resolvable_geo_location_component","AutoCompleteDirective","autocomplete","uiItems","MultiEmailsController","emailsModel","maxEmails","placeholdertxt","emailsnum","msgText","$watchCollection","emails","generateEmails","formatContact","updateTags","$emit","onEmailChange","MultiEmailsComponent","ProgressBarComponent","onePercent","percentage","$onInit","change","percent","SearchableDropdownComponent","ngModel","displayAttr","onSelectionChanged","selectedItem","updateSelectedItem","selectedPackage","$setValidity","d3_d3","d3_default","SparkLineComponent","sparkLine","height","pointsToShow","chartColor","colorArray","chartData","chartOptions","chart","useInteractiveGuideline","showMinMaxPoints","showCurrentPoint","css","stroke-width","xAxis","yAxis","style","fill","currColorIndex","floor","random","mapped","getTime","unique","takeRight","StatusBarComponent","lowerThreshold","upperThreshold","lowerThresholdPercentage","upperThresholdPercentage","upper","TimeProgressBarController","timer","totalRange","dateStart","dateEnd","runTimer","progress","TimeProgressBarComponent","GET_TRANSFERKEYS","GET_TRANSFERKEYS_FAIL","GET_TRANSFERKEYS_SUCCESS","INITIATE_ASSET_TRANSFER","INITIATE_ASSET_TRANSFER_FAIL","TRANSFER_ASSETS","TRANSFER_ASSET_FAIL","TRANSFER_ASSET_SUCCESS","RESET_TRANSFERS","getTransferKeysSuccess","getTransferKeysFail","initiateAssetTransfer","initiateAssetTransferFail","transferAssets","installations","transferAssetSuccess","transferAssetFail","resetTransfers","TransferController","showFlyout","transferInitiated","verifyTransfer","targetAccountKey","showTransferDetails","TransferActions","TableColumnsActions","transfer","transferkeys","_transfer$transferAss","transferStatus","_tableColumns$selecte","transferAssetsList","accountsTransferkeys","transferableCol","transferrable","selectedCol","resetPrevious","getNumberOfSelectedAssets","getSelectedAsset","errorMessageId","asset_list_transfer_component","SearchableMultiselectComponent","selectedItems","allItems","readOnly","addItem","selectedItemChanged","isopen","toggleDropdown","updateSelectedItems","selectedObj","isItemSelected","tmpItem","commaDelimitedSelected","AssetMultiPickerController","equipmentRepository","selectedAssets","singleSelect","requiresSelection","maxSelection","pickerSettings","_selectedAssets","showSelected","allowConfirmAll","unavailableAssets","confirmAll","isDirty","pages","maxSize","firstPage","lastPage","infoMessage","selectLimit","filterCount","prevFilterCount","singleMode","currentPageSelectedAssets","bigCurrentPage","itemsPerPage","intialAssets","canSelectAll","onFacetsChanged","getSelectedAssets","pageChanged","displayAssetsByPage","showRequiredError","totalItems","numSelectedAssets","begin","responseData","assetsList","concurrentPages","showingLastPage","showingFirstPage","isAllAssetSelected","deselectAsset","selectAll","hasSelected","newValue","oldValue","submitQuery","keyword","selectAsset","isDisabled","removeAsset","clearSelected","toggleShowSelected","calculateRemovedAssets","currentAssets","previousAssets","calculateAddedAssets","submit","confirmedAll","added","removed","showFacets","showingFacets","AssetPickerController2","ok","yomomma","calculatePages","sinceForPage","NOTIFICATION_CHECK_SUPPORT","NOTIFICATION_DISMISS_TYPE","checkBrowserSupportNotification","visible","dismissNotification","BrowserUpdateBannerController","currentBrowser","NotificationActions","checkSupport","notification","supported","browserUpdateBanner_component","BrowserLinksController","browser_links_component","pagination","pagination_default","MAX_BUTTONS","PaginationComponent","widths","counts","button","buttonAmount","countHolder","getElementsByClassName","resizeObserver","ResizeObserver","onResized","observe","disconnect","getElementsByTagName","clientWidth","entry","target","contentRect","$apply","onChange","pagination_component","alerts_btn_group_template","alerts_btn_group_template_default","AlertsBtnGroupController","AlertsBtnGroupComponent","maintenance_btn_group_template","maintenance_btn_group_template_default","MaintenanceBtnGroupController","MaintenanceBtnGroupComponent","modal_template","modal_template_default","ModalController","onClose","ModalComponent","showModal","tool_tip_template","tool_tip_template_default","ToolTipController","toggleHelp","ToolTipComponent","position","ztr_date_picker","ztr_date_picker_default","ZTRDatePickerController","datepickerOptions","setDatepickerOptions","onPickerOpen","validateInputs","isOpen","onOpen","inputName","maxDate","minDate","selectedDate","isValid","ztr_date_picker_component","isRequired","placeHolder","steps_component","steps_component_default","StepsController","StepsComponent","stepData","stepActiveIndex","zones","cca2","countryByCCA2","groupBy","timezone_selector_default","timezone_selector","TimezoneSelector","translations","placeholder","zone","timezone_selector_timezone_selector","last_seen_filter","last_seen_filter_default","LastSeenFilterController","minRange","maxRange","LastSeenModels","onSelectionUpdated","isValidRange","last_seen_filter_component","communicated_at_filter","communicated_at_filter_default","CommunicatedFilterController","openCommunicated","openNotCommunicated","selectedOption","communicated","notCommunicated","onSelect","onDeselect","communicated_at_filter_component","componentsModule","assetListModule","tableColumnSelectorModule","reason","enabled","onClickButton","onClickFiltersButton","ngChange","showFilters","showingFilters","SimpleTagsController","hasUpdated","TransferComponent","SignoutComponent","ResolvableGeoLocationComponent","BrowserUpdateBanner","BrowserLinks","ZTRDatePickerComponent","timezoneSelector","lastSeenFilterComponent","CommunicatedAtFilterComponent","pullRight","show","dialogStyle","hideModal","ms","hours","minutes","seconds","MILLISECONDS_IN_A_DAY","forOwn","forOwn_default","lowerCaseKeysObject","newObj","utilModule","temp","removeItems","arrA","a_ele","findWhere","findValueByProperty","prop","isDateBetween","isBetweenDate","startOfRange","endOfRange","startOf","endOf","isBetween","dateMinusDays","numDays","milliseconds","daysInRange","dateFallsWithinDaysPriorFromToday","dateToCheck","today","isValidMinDateRange","fromDate","maxDays","timeDiff","abs","setDateFormatByLanguage","greaterThanToday","mergeInto","into","_forOwn","appendDefaultProtocol","AutofocusDirective","ChildElementBlurDirective","$parse","compile","fn","childElementBlur","leftFlag","ConfirmOnExitDirective","nodeName","onbeforeunload","defaultPrevented","DateGreaterThanDirective","utilitySevice","elm","ctrl","inputValue","dateGreaterThan","isValidDateRange","DateLowerThanDirective","dateLowerThan","DateRangeGreaterThanDirective","validateDateRange","dateRangeGreaterThan","$parsers","unshift","$formatters","$observe","$viewValue","DateRangeLowerThanDirective","dateRangeLowerThan","FocusMeDirective","MissingFeaturesDirective","ngShowDirective","ngShow","terminal","elt","ifEvaluator","$eval","missingFeatures","validComponent","initialNgIf","ApplyClassDirective","className","border","OpenSelectOnFocusDirective","uiSelect","autoopen","focusser","focusInput","activate","RequiresFeaturesDirectives","requiresFeatures","SelectSetFocusOnDirective","$select","selectSetFocusOn","setFocus","SetFocusOnDirective","setFocusOn","TagsSetFocusOnDirective","tagsSetFocusOn","isFunction","scrollDirective","callbackFunction","scrollIf","getElementById","containerId","animate","scrollTop","offset","top","_isFunction","pageSupport","support","supp","directivesModule","callBack","which","ngEnter","singleCharRegExp","numbersOnly","wholeWordRegExp","addEventListener","ctrlKey","metaKey","test","clipboardData","getData","$setViewValue","$render","ScrollDirective","PageSupportDirective","infiniteLoadingCallback","rawElement","offsetHeight","scrollHeight","MaintenanceRouteConfig","ncyBreadcrumb","skip","MaintenanceController","AMPLITUDE_EVENT_NAME","amplitude","track","menuItems","CreatePlanController","DATE","ODOMETER","RUNHOUR","MILES","KILOMETERS","MONTH","HOUR","MAINTENANCE_ERROR_MESSAGE","MAINTENANCE_ALREADY_EXIST","EVENT_TRACKING_ACTION","algorithm","rules","documentlinks","upcoming","totalEmails","args","meter_checked","Meter","date_checked","Calendar","MeterRules","CalendarRules","submitted","notValid","saveButtonPressed","userForm","$submitted","$valid","documentLinks","brand","getBrandClaim","maintenancePlanData","_MAINTENANCE_ALREADY_","_MAINTENANCE_ALREADY_2","frontMessage","tailMessage","formValidation","EVENT_TRACKING_ACTIONS","searchInputChanged","exportCSVClicked","tableSortingChange","paginationChanged","planClicked","MaintenancePlansController","searchText","maintenancePlans","filteredMaintenancePlans","predicate","reverse","orderMaintenacePlan","orderBy","descending","applyFilter","createButtonPressed","_response$data","schedule_type","onLoadErrorFlag","onLoadErrorText","statusData","totalList","getCsvData","confirmClicked","cancelClicked","MaintenancePlansDeleteModalController","deleting","editButtonClicked","deleteButtonClicked","MaintenancePlansDetailsController","initLoading","editingDocLinkFlag","disabledEditing","meter_rules","calendar_rules","deleteButtonPressed","deleted","putMaintenance","count","stringTagsArray","editButtonPressed","maintenancePlan","orderDocumentLinksFilter","docLinks","MaintenancePlansDetailsTasksController","addNewTaskButtonPressed","getTaskPlans","maintenanceplanId","tasksData","addTask","removeTask","inputChanged","selectedTask","editTask","editTaskModal","intialize_assets_controller","initialization","addedAssets","defaultServiceDate","loadingServiceReadings","buildAssetWithServiceReading","runtime","when","serviceReading","odometer","runhour","fetchServiceReadingsPromises","updateModelForDefaultServiceDate","setDateForAllChecked","setMaintenanceDateForAll","setDateForAll","calculateByDateClicked","clicked","calculateByHistoricalClicked","historicalAssetDateChanged","_asset$asset","dateChanged","historicalAssetOdometerChanged","_asset$serviceReading","_asset$asset2","odomoterChanged","historicalAssetRunhourChanged","_asset$serviceReading2","_asset$asset3","runhourChanged","PlanFormAssetsController","removeAssetsFromPlan","removedEquipmentChangeSet","removedAsset","existsAssets","assetSelected","filteredAssets","confirmed","serviceReadings","datepickerFormat","addAssets","openServiceModal","InitializeAssetsController","addedEquipmentChangeSet","initializeWith","assetClicked","removeSelectedButtonPressed","updatedAssets","Msg","PlanAssetDeleteModalController","nameChanged","descriptionChanged","addAssetsClicked","assetsAdded","assetModelClosed","tagAdded","tagRemoved","notifyEmailsChanged","scheduleTypeChanged","meterBasedChange","calendarBasedChange","meterToggleClicked","calendarToggleClicked","documentLinkNameChanged","documentLinkDescriptionChanged","documentLinkURLChanged","documentLinkAddClicked","documentLinkEditToggle","documentLinkRemoveClicked","documentLinkPaginationChanged","planModule","dateRangeOptions","meterBasedOptions","meterDisabled","meterRules","calendarDisabled","calendarRules","toggleFixed","toggleOffset","addAssetsButtonSelected","toggleMeterRules","check","toggleCalendarRules","PlanFormTasksController","selectAllToggle","filteredTasks","isRemoveDisabled","selectedTaskToggle","_task","toolbar","saved","cancelled","titleChanged","bodyChanged","promiseChain","onDeletion","updatedTasks","addTaskButtonPressed","inputOptions","inputDescription","inputs","validationRegex","FormMaintenanceController","dateOptions","initDate","starting-day","editDocLinkObject","documentLinkIndex","invalidUrl","planNameChanged","getCalendarRules","getMeterRules","scheduleType","retrieveSelectedAssets","canceledModal","numOfAssets","numberOfAssets","getOwnPropertyNames","addToEquipmentChangeSet","assetResult","assetObject","_$scope$plan$tags","numOfTags","_$scope$plan$tags2","emailsChanged","numberOfEmails","greaterThanZeroCheck","negativeCheck","validateUpcoming","isMeterUpcomingGreat","$modelValue","isCalendarUpcomingGreat","meterDueInputChanged","dueInterval","meterUpcomingChanged","upcomingInterval","meterOptionChanged","calendarDueInputChanged","calendarUpcomingInputChanged","calendarOptionChanged","addNewDocumentLink","validateUrl","deleteBtnClicked","toggleEditing","cancelEdit","updateDocumentLink","documentLink","invalidEditUrl","urlPattern","MaintenanceHistoryController","exportCSV","viewDetailsClicked","planNameClicked","assetNameClicked","orderTableChanged","filteredStatusData","orderStatusData","completedAt","getCsvFileName","Asset","Plan","Status","Completed At","MaintenanceHistoryDetailsController","expandArrowClicked","isSelected","downArrowClicked","planData","assetData","planDataPromise","planTasksPromise","completedTasks","entryData","ct","extend","_inputs","historyModule","MaintenanceBoardController","upcomingClicked","dueClicked","upcomingDueClicked","completeClicked","tableOrderChanged","completeModalClosed","completeModalResolved","topDuePlanClicked","topUpcomingPlanClicked","filterData","filterStatus","selectedStatus","filtering","dataAvailable","okay","statusDataByPage","onLoad","propertyOrder","statusEntry","displayStatusDataByPage","completeMaintenancePlan","statusPage","regSearch","_data$equipment$name","equipmentName","_data$nextService$run","nextService","runHour","_data$plan$name","planName","_data$status$descript","topFive","differenceArray","setPage","pageNo","upcomingCounter","dueCounter","requireMaintenance","handleGetStatusError","statusErrorFlag","statusErrorText","aggregateData","dueEquipmentCount","upcomingEquipmentCount","upcomingEquipmentPercent","dueEquipmentPercent","numOfUpcoming","numOfOthers","g","d3","arc","svg","innerRadius","radius","outerRadius","slices","layout","pie","product","empty","enter","numOfDue","chartErrorFlag","chartErrorText","fileName","filteredCSVData","csvData","Last Serviced","Next Service","_data$equipment$name2","_data$plan$name2","_data$status$descript2","lastService","csvLastServiced","csvNextService","filterMaintenanceOnStatus","statusCode","filterArray","upcomingSelected","both","due","bothClicked","dueSelected","toggleOptions","MaintenancePerformPopupController","openStart","startOpened","openEnd","endOpened","serviceRecord","workOrder","reading","dateType","odometerType","runhourType","getFormattedLink","$invalid","$pristine","submitting","inputsAsMap","planInfo","maintenancePlanDoucmentLinks","boardModule","maintenanceModule","MaintenancePlansModule","MaintenanceHistoryModule","MaintenanceBoardModule","AccessManagementRouteConfig","access_management_base","access_management_base_default","AcessManagementController","access_management_component","am_group_list_component","am_group_list_component_default","ordersBy","desc","Paging","currentpage","OperatorsOrdersBy","Assetsfilter","clientSideOrderBy","Operatorsfilter","AmGroupListComponent","amGroupsService","amFilterPaginationService","filteredGroups","createGroupStatus","filterPaginationService","groupService","paging","propertyKeys","getClaims","getGroups","retrieveGroups","getGroupsPaged","filterByTerm","reset","pageNumber","getPaged","saveGroup","createGroup","created","viewGroupDetail","createGroupStatusCode","group_list_am_group_list_component","AmGroupCreateController","createdGroup","am_group_create_component","objectToArray","selectedObject","keyVal","_keyVal","isArrayNotEmpty","inputArray","pollOnInterval","AmGroupViewComponent","amAssetsService","assetService","updatedGroup","getGroupData","updateInterval","getAssetsByGroupId","updateGroupMetadata","updateGroupAssets","findIndex","updateAssets","operation","_this5","openDeleteGroupPopup","am_group_view_component","AmAssetListController","amStoreService","selectedAsset","excludedAssetList","poll","uibModal","searchFilterConfig","getDefaultSearchFilterConfig","getAssets","queryTerm","getAssetFn","getAssetsWithAccessService","filterdAssets","_markfilterExculudedAssets","excluded","selectableList","unSelectableList","viewedAsset","attrsFilter","excludedIds","enable","showSearch","showFilter","assets_list_am_assets_list_component","onSelection","tableRows","enableFilter","showEnableAssets","am_operators_list_component","am_operators_list_component_default","lodash_get","get_default","GetAccessCodesType","co","identifier","GetCSVRowAccessCodesType","ArrayToString","isPrimaryUser","_get","feature","trimmedTerm","isPrefixMatch","isPostfixMatch","isPartialMatch","sanitizedTerm","objects","_step","_iterator","_createForOfIteratorHelper","done","propertyKeyValue","_step2","_iterator2","checkPredicate","filterObjects","partialMatchPredicate","prefixMatchPredicate","postfixMatchPredicate","exactMatchPredicate","AmOperatorsListController","amOperatorsService","opService","amStore","operators","operatorName","createOperatorStatus","createdOperator","isAdding","createForm","expiryTimespans","filteredOperators","selectedExpiry","getOperators","filterByExcludedIds","selectedTimeSpan","onExpiryChange","setVeiwedOperator","createOperator","expiryFilteredOperators","isBefore","isAfter","hour","minute","millisecond","future","onTriggerSearch","operators_list_am_operators_list_component","am_bulk_upload_operators","am_bulk_upload_operators_default","ValidationStatusEnum","validating","OperatorCsvValidationErrorEnum","noName","invalidCodeFormat","AmBulkUploadOperatorsController","uploader","selectedFile","someOperatorsHasNoCodes","validationStatus","validationError","validationErrorMessages","creating","operatorsData","errors","feed","resetFileUploader","updateCSVFileNames","destroy","clearQueue","queueLimit","onAfterAddingAll","afterFilesSelected","fileValidationStart","lastItem","operatorsCsvToJson","_file","setProperties","successResponseData","errorResponse","_ref$operators","responseOperators","AutoGeneratePIN","_ref2$errors","setValidationErrorMessages","bulkCreateOperators","updateFeed","failedOperators","createdOperators","datetimeStamp","createdOperatorsFileName","failedOperatorsFileName","csvFeedbackResult","opfeed","isCreated","generateCreatedOperatorsCsvData","errorData","Name","rowNumber","errorCode","generateFailedCreateOperatorsCsvData","resetValidationErrorMessages","getValidationErrorMessage","am_bulk_upload_operators_component","AMDashboardController","accessManagementService","updateUIData","storeData","am_dashboard_component","AmOperatorViewController","editName","editAttrs","viewedOperator","getOperatorData","setTab","getOperatorById","checkIPAFExpiry","types","ipaf","accessCard","getOperatorExpiryById","newExpiry","expires","currentExpiry","isIPAFExpiry","updateOperatorMetaData","update_status","updatedOperator","openDeleteOperatorPopup","newCodes","totalAssets","total_Assignments","am_operator_view_component","Operator","Code","AmOperatorCodesController","pins","ztr_rfids","ipafs","inCodes","filterCodes","getCodeType","updateOutCodes","aCodes","labelSet","Set","ipafLabels","ipafCodes","has","aType","newcode","createNewCode","saveCodeChanges","deleteCode","codeArray","indexOfCode","toBeRemoved","outCodes","openNoCodeWarningPopup","updateOperatorCodes","updateOperatorsCodes","onSaveSuccess","checkForOperatorIPAFExpiry","operatorModel","updatedIdentifier","updatedPins","updatedZtrRfids","updatedIpafs","onSave","am_operator_codes_component","am_operator_details_form","am_operator_details_form_default","AmOperatorDetailsController","outAttrs","hasOperatorExpiryPermission","formName","shouldHideExpiryForUser","hasOperatorEditExpiryPermission","am_operator_details_form_component","am_group_details_form","am_group_details_form_default","AmGroupDetailsController","emailPattern","outGroup","inGroup","am_group_details_form_component","showEmail","am_operator_create","am_operator_create_default","AmOperatorCreateController","autoPin","saveOperator","am_operator_create_component","AmSelectListController","util","Util","selectedIds","isAllListSelected","isSelectAll","isAllSelected","addSelectedItem","removeSelectedItem","getTableRow","overrides","header","headerIsClickable","valueIsClickable","headerOnClick","valueOnClick","getIcon","getHeaderClass","getRowClass","sortable","sortIcon","AmAssetListTableController","_AmSelectListControll","amAssignmentService","assignmentStatus","getDefaultTableRows","sortedBy","useSortExpr","unselectable","toggelSelection","onViewAsset","linkable","keypadStatus","accessSession","sortByColumn","clickable","text-bold","sortDirIcon","getAssignmentStatusFromAsset","iClass","codesSyncStatus","currentSortProp","currentDir","onSort","sortByEvent","am_assets_list_table_component","am_assignments","am_assignments_default","AMAssignmentsController","assignmentService","selectedOperators","steps","setCommand","nextStep","invalidInputs","validInputs","oprIds","SelectedOperatorsIdsArray","SelectedAssetsIdsArray","perform","totalAsset","totalOperator","resetSteps","resetStatus","ASSIGN","UNASSIGN","am_assignments_component","AmOperatorsListTableController","operatorsTableList","hasAccessOperatorExpiryFeature","secondaryGroups","security_context","view","secondary_groups","expiry_in","getExpiryInDays","expirydate","currenDate","am_operators_list_table_component","onView","isGroupVisible","asset_list_client_component","asset_list_client_component_default","AmAssetListClientController","filterPagingService","initializeAssets","assetsIn","getAssetsPaged","alreadyAddedAssets","getAssetIds","openSelectAssetPopup","resultAdd","hasSelection","removeAssets","asset_list_client_asset_list_client_component","assetsOut","am_asset_view","am_asset_view_default","AmAssetViewController","getAssetData","getAssetById","am_asset_view_component","AmAssetOperatorsListController","pagedOperators","selectedOperatorsToRemove","getOperatorsByAssetId","loadCurrentPage","getPagedOperators","openSelectOperatorsPopup","operatorsIdsToAdd","assignOperatorsToAsset","unassign","opsIds","SelectedArray","unassignOperatorsFromAsset","asset_operators_list_am_asset_operators_list_component","operator_assets_list","operator_assets_list_default","AmOperatorAssetListController","pagedAssets","getAssigndAssets","getAssetsByOperatorId","onUpdate","assetsTotal","getPagedAssets","assetsIds","assignAssetsToOperator","_this6","unassignAssets","operator_assets_list_component","onAdd","onRemove","onRefresh","add_input","add_input_default","AddInputController","add_input_component","maxNumber","minNumber","isEmpty","isEmpty_default","search_input","search_input_default","SearchInputController","showClear","_isEmpty","onTrigger","inValue","search_input_component","isSearching","ipaf_input","ipaf_input_default","IpafInputController","ipaf_input_component","AmAsset","session","accessOperator","accessLast","AmStoreService","CODE_SYNC_MAP","iclass","success","PIN","ZTR_RFID","IPAF","oprerator","AccessManagementService","accessManagementAPI","api","getDashboardData","respons","updateOperators","no_codes_popup","no_codes_popup_default","modal_popup_base_default","deleteOperator","AmOperatorsService","operatorsAPI","amAPI","operatorList","operatorFeed","pin","ztr_rfid","getOperatorMessages","invalid-code","invalid-code-format","no-name","generale","operatorCreate","createOperater","noCodePopupHtml","noCodePopupController","backdrop","keyboard","deleteOperatorPopupHtml","deleteOperatorController","deleteOperater","selectOperatorsPopupHtml","selectOperatorsController","getOperatorsByAsset","am_assets_list_popup","am_assets_list_popup_default","am_asset_list_popup_default","AmAssetsService","assetAPI","startFrom","apiFilter","EquipmentSearch","getAssetsBySearchFilter","selectAssetPopupHtml","selectAssetPopupController","groupId","assetsAsModel","getAssetsByOperator","getAssetListByIds","_ref$data","getAssetsByFilter","enableAssets","am_group_delete_popup_component_default","AmGroup","AmGroupsService","groupsAPI","securityGroupService","accessAssetsService","seviceResourceURl","sendInvite","_result$data$data","accessManagementGroups","filterGroupsByAttrs","_group$attrs","groupInfo","_groupInfo$users$","users","groupUser","_groupInfo$resources","resources","getAssetListByResources","accumulator","currentResource","_currentResource$type","_currentResource$id","applyOperationAssets","deleteGroupPopupHtml","deleteGroupPopupController","AmFilterPaginationService","AmAssingmentsService","dispatched","received","complete","assingmentcommand","performAssignments","accessManagementModule","AmAssignmentService","AddInputComponent","AmSearchInputComponent","AmIpafInputComponent","AccessManagementComponent","AmAssetsComponent","AmOperatorsComponent","AmGroupCreate","AmDashboardComponent","AmBulkUploadOperatorsComponent","AmOperatorViewComponent","AmOperatorCodesComponent","AmOperatorDetailsFormComponent","AmGroupDetailsFormComponent","AmOperatorCreateComponent","AmAssetTableComponent","AmAssignmentsComponent","AmOperatorsTableComponent","AmAssetListClientComponent","AmAssetViewComponent","AmAssetOperatorsListComponent","AmOperatorAssetsComponent","AppNotificationsController","activeNotifications","acknowledge","appNotificationModule","HelpRouteConfig","HelpController","helpItemsService","helpTranslationService","gotoAnchor","loadHelpTranslation","accessibleItems","helpItemExist","closeHelpNav","HelpTranslationService","translation","showMissingTag","userLanguage","getUserLanguage","HelpTranslateDirective","innerText","translateString","helpModule","field","filtered","HelpTranslation","lib_wellknown","wellknown_default","map_controller_arrayLikeToArray","len","arr2","MapMainController","$compile","mapService","geozoneFeatureGroup","geozoneFeatureGroupLabels","markersLayer","MAP_DEFAULT_LOCATION","isUpdatingPins","initMap","zoom","zoomControl","worldCopyJump","center","merge","weatherEnabled","timeDimension","timeDimensionControl","timeDimensionOptions","period","timeDimensionControlOptions","loopButton","autoPlay","playerOptions","buffer","transitionTime","loop","timeSliderDragUpdate","createMapDiv","setMaxBounds","featureGroup","MarkerClusterGroup","chunkedLoading","maxClusterRadius","iconCreateFunction","defineClusterIcon","zoomToBoundsOnClick","spiderfyOnMaxZoom","addLayer","oldBounds","updateFlag","panelOffscreen","setFacets","zoomLevel","overlayControl","getControlLayer","addOverlay","refreshPins","getBounds","setCurrentBounds","storeBounds","requestedCursor","mapRefreshTimeoutPromise","layer","refreshGeozones","currentZoom","getZoom","originalZoomLevel","currentZoomLevel","allowArrayLike","it","Symbol","iterator","minLen","F","_e","TypeError","normalCompletion","didErr","step","_e2","return","_loop","nwBounds","latLng","seBounds","latLngBounds","fitBounds","openedPopup","requestedEquipmentId","layerName","getSelectedOverlays","selectedOverlays","each","idx","textContent","overlayName","currentOverlays","getCenter","defineFeature","defineMarkerFeature","_e$latlng","newPosition","LatLng","flyTo","isDetailspopupOpen","_popup","hoveredAsset","bindPopup","hoverPopupComponent","minWidth","closeButton","autoClose","autoPan","openPopup","getPopup","passive","isUpdatingGeozones","isGeozonesDirty","setVisibleGeozones","clearLayers","visibleGeozones","geoJsonGeometry","wellknown","geoJsonData","geoJsonDataLabel","geoJson","geoJsonLabels","opacity","fillOpacity","bindTooltip","permanent","interactive","addTo","inBoundsSearch","searchMode","SEARCH_MODE","IN_MAP_BOUNDARY","selectedEquipment","showPopupForEquipment","mapMoved","currBounds","getApiBounds","getLimit","equipmentList","fitBoundsFlag","setEquipmentResponseData","hasLayer","getEquipmentGeoJson","pointToLayer","getSouthWest","getNorthEast","firstLoad","property","facetProperty","totalLimitedMapAssets","totalMapAssets","autorefreshTimeout","initRefreshTimer","appendPinToPopup","popup","svgContainer","_container","classed","bezierLine","line","interpolate","feMerge","closePopup","popupOptions","minHeight","point","closeOnClick","keepInView","autoPanPadding","setLatLng","openOn","setRequestedEquipmentId","setSelectedEquipment","cachedEquipment","equipmentResponseData","creatMapHoverPopupComponent","componentScope","$new","mapCenter","navigator","geolocation","getCurrentPosition","pos","keyEquipment","MapRouteConfig","entityMap","&","<",">","\"","'","/","escapeHTML","String","EquipmentListFastDirective","direct","html","msgUpcoming","msgAlertLow","msgAlertMed","msgAlertHigh","msgDue","msgShareinbound","msgMakeModelNA","closest","ACCESS_MGMT_FILTER_SERIES","isAccessDataPoint","dataPointId","MapEquipmentDetailController","alertsData","itemDisplayCount","showDate","faults","datapoints","hasImageFeature","equipmentDetail","visibleEquipment","showMoreAlerts","showMoreSeries","showMoreMaintenance","loadEquipmentImages","showMaintenancePopup","makeSparkLines","openNotesModal","openImageViewModal","pictureIndex","profilePictureId","profileImage","onDeleteImageCallback","alertAcknowledged","loadEqImages","assetLoading","display","equipmentDetails","legacyEquipmentModel","selectedEquipmentFull","slick","dots","arrows","speed","slidesToShow","prevArrow","nextArrow","responsive","breakpoint","settings","href64x64","sereiswithSparklines","imageIndex","dataProvider","AmCharts","makeChart","categoryField","autoMargins","marginLeft","marginRight","marginTop","marginBottom","graphs","valueField","bulletField","showBalloon","lineColor","valueAxes","gridAlpha","axisAlpha","categoryAxis","startOnAxis","equipmentListModule","panelOffScreen","MapEquipmentController","lastSearchQuery","showingMap","showFiltersMobile","currentResultPage","numPerPage","mapEquipmentListScrollY","isEquipmentDetail","toggleFilters","showingMapButtonPressed","isShowingMap","onEquipmentDetail","isLoading","facetFiltersShowing","filteredEquipment","isFiltered","clearSearch","refreshSearch","getIsMapLoaded","setTagFilters","clearFacets","facetItem","isFacetsApplied","pagedResults","broadcastResults","setFilters","setQueryString","selectEquipment","toggleEquipmentList","mapEquipmentModule","MapService","selectedGeozone","currentBounds","controlLayer","isMapLoaded","_northEast","_southWest","setCursor","getCursor","queryStringValue","setSelectedEquipmentFull","setSelectedGeozone","newFilters","setIsMapLoaded","flag","storedBaseLayer","divName","streets","basemapLayer","satellite","attribution","worldBoundariesAndPlaces","transportation","defaultMapView","mapView","satelliteTrans","streetsTrans","streetNameTrans","boundaryTrans","baseLayers","overlays","control","layers","zoomInTitle","zoomOutTitle","maxZoom","minZoom","home","defaultExtent","setCenter","setZoom","locate","locateOptions","showPopup","watch","strings","isImperial","scale","metric","imperial","arcgisOnline","arcgisOnlineProvider","geosearch","providers","useMapBounds","layerGroup","weather","equipmentGeoList","equip","_equipment$coords","promoted","generateFeature","myIcon","divIcon","iconSize","iconAnchor","marker","riseOnHover","popupAnchor","cluster","getAllChildMarkers","popupContent","left","right","leftName","rightName","_el$_latlng","_latlng","_el$feature$propertie","_el$feature$propertie2","assetName","leftPanel","rmax","iconDim","valueFunc","strokeWidth","pathClassFunc","pieClass","pieLabel","sum","pieLabelClass","origo","w","h","donut","createElementNS","vis","XMLSerializer","serializeToString","xml","nest","sortKeys","ascending","DivIcon","Point","MapHoverPopupController","map_hover_popup_component","mapModule","onClickFilters","MapEquipmentPopupController","popupEquipmentData","hasImagesRights","showLastCommDate","MapHoverPopupComponent","EmailConfirmModalCtrl","ProfileController","languagesService","singleSignOnFlag","landingPages","prefixOP","lookupCode","measureUnitOptions","mapViewOptions","languageOptions","forms","pass","ConfirmPassword","NewPassword","OldPassword","passwordPattern","phonePattern","personalErrorFlag","personalErrorText","personalSuccessFlag","emailErrorFlag","emailErrorText","passwordErrorFlag","passwordErrorText","passwordSuccessFlag","getUserInfo","editUser","setAndFormatDates","lastLoginAt","updatedAt","resetFlags","$setSubmitted","upload","$setPristine","locale","emailForm","emailChanging","userPassword","CurrentPassword","passdone","emailSuccessFlag","ProfileComponent","UserDataFactory","userDataFactory","baseUrl","UsersRouteConfig","OutsideCallRouteConfig","ProfileSubscriptionsController","currentStatus","agreement","userme","emailNotification","addRemoveEmailSubscribtion","chageset","sending","SuccessFlag","profileModule","ProfileRouteConfig","VerifyEmailRouteConfig","ProfileDataFactory","ParamterNames","Plant","SecurityContextId","AssetList","Datapoint","ConstantValues","All","reportHasAssetListParam","Report","apiReportModel","viewPath","exportOptions","requiredAssets","doNotSupportCustomRang","ReportAttrs","gtmEvents","analyticsScheduleReport","JobCreateController","scheduleAttributes","scheduleName","dateRange","firstCall","disableModalWindow","dropDownDates","selectedDateRange","jobName","reportDateName","startDate","deliveryTime","create","reportDoesNotRequireAssets","openDatePickers","isFirstOpen","isFirstDisabled","usersByPage","userData","filteredUserData","dt","clear","mode","getDay","formatYear","startingDay","formats","tomorrow","setDate","getDate","afterTomorrow","animationsEnabled","existingEquips","successFlag","equipments","postRemoval","removeFlags","filteredEquipmentList","equipmentByPage","equipmentPage","usersPage","toggleAnimation","update","setHours","getHours","getMinutes","endDate","datapointsSelected","dt_EndDate","dt_StartDate","username","startAt","scheme","gatherDataNewReq","validAssets","JobDetailController","JobDeleteModalController","analyticsDeleteScheduleReport","scheduleToDelete","$sce","reportsRepository","assetsSelected","report","parametersData","ssrsReport","defaultValues","rp","encodeURIComponent","iFrameReportPath","trustAsResourceUrl","getEmails","iframeReportCallBack","loadingReport","reportGenerated","parameterRequired","getParamPath","userUOM","timeZoneId","userTZ","userName","JobUpdateController","getScheduleRepresentation","reportParams","reportNeedAssets","validOptions","validValues","opt","dateRangeType","reportParam","exportList","startDateIndex","endDateIndex","unescaped","updating","newData","jobModule","CreateJobScheduleController","dropDowntimes","time1","showMeridian","hstep","mstep","ismeridian","toggleMode","changed","JobsController","disableView","schedules","filteredSchedules","schedulesByPage","orderSchedule","isAllChecked","schedulesInPage","bool","checkForRemoval","checkAllFilteredSchedulesforRemoval","selectedAll","applyChange","disableRemoveButton","refreshSchedules","deleteSelected","formatDate","strDate","setMinutes","getTimezoneOffset","toJSON","dateObj","amPM","PrintScheduleDateRange","optional1","optional2","jobSchedulesModule","jobSchedulesJobModule","FormAssetListController","selectAssetsButtonPressed","DEFAULT_MAX_DAYS","DEFAULT_MIN_MONTHS","MAX_HOURLY_USAGE_DAYS","MIN_HOURLY_USAGE_MONTHS","HOURLY_ASSET_UTILIZATION","FormDateRangeController","maxDaysInRange","maxDaysRange","minDateInMonths","isStartGreaterThanEnd","isEndendLowerThanStart","isExceededRange","fromPicker","dateAfterDateRange","maxDateRangeExceeded","exceededRange","endLowerThanStart","startGreaterThanEnd","initdate","endOnClick","startOnClick","isEndLowerThanStart","endDateLowerThanMin","reportForm","$error","csvForm","numMaximumDaysAllowed","lessThanMinDate","reportParameterModule","DatapointMultiPickerController","LOCATION_SIGNAL_DATAPOINT","checkedDatapoint","FIRMWARE_VERSION_DATAPOINT","CONFIGURATION_VERSION_DATAPOINT","selectedDatapoints","includeDiagnosticDatapoints","_selectedDatapoints","unavailableDatapoints","currentPageSelectedDatapoints","predicate1","reverse1","orderDataPoints","filteredDataPoints","displayDataPointsByPage","policyPage","dataPointsByPage","isDataPointsInthePageAllSelected","allDataPointsInthePage","displaySelectedDataPointsByPage","getSelectedDatapoints","deselectDatapoint","numSelectedDatapoints","isAllDatapointSelected","selectDatapoint","removeDatapoint","removeAllSelectedDataPoints","nameExists","roleName","existingNames","dataPointObjs","datapointsSelectedCount","originalDatapoints","rolePolicies","dataPointIdSet","noDuplicateDataPoints","hasGPS","ms_cell_signal","getDatapointsByAssetIds","datapointSelected","datapointsDenied","checkAllDatapoints","setAll","datapoint_selector_controller_default","datapointListCallback","preSelectedDatapoints","allDatapoints","selectedDatapoint","analyticsViewReport","analyticsDownloadReport","DATE_RANGE_STRINGS","_7D","_30D","_90D","_MTD","_CUSTOM","_CUSTOM_HOURLY","_1W","_2W","_3W","_4W","ReportsDetailController","reportingService","getReportPath","csvReport","csvGenerated","isLoadingParameters","selectedAssetsForDataPoints","selectDataPointsButtonEnabled","btn","pressurethreshold","dropDate","dateDrop","selectedAttributes","hideScheduleButton","reportLoading","setDateRange","todayMinusOffset","downloadReport","exportFormat","requiredFieldsFilled","serializeArray","ReportName","verb","form","createElement","appendChild","getIconForFormat","assetList","_loop2","selectedDateOption","required","nullable","_ret","numSelectedDataPoints","getReportById","reportData","exportListData","reportsPath","destination","getReportExportTypes","hidden","highid","lowid","getAttributeParamValidValues","contextId","allowViewReportAndExport","allow","csvFormValidation","$touched","validDateRange","checkNumberOfAssets","selectDataPoints","clickedDatapointModal","parameterDatapoints","getDatapointsFromParameters","getSingleSelectedEquipment","DatapointSelectorHtml","DatapointSelectorController","getDatapointsAndFilter","datapointIdsSelected","validValue","csvGenerating","generateCSV","paramSelected","contact","reportViewModule","reportParametersModule","ReportsRouteConfig","ReportingService","reportingAPI","attributesService","apiClient","equipmentService","getReportsList","_sortBy","groupedReports","_ref$name","_ref$ordinal","ordinal","reports","getAttributeValuesByName","valuesWithoutAllOption","_series$descriptor","descriptorTitle","acceptableDatapoints","getKeyedDatapointsByAssetIds","equipmentDatapoints","reports_list","reports_list_default","ReportsListController","getSortedGroupedReports","getGroupedReports","reports_list_component","REGEX_MATCH_EXPORT","MAX_CUSTOM_VIEWS","InteractiveReportController","iframeSrc","tableauFilters","viz","activeSheet","workbook","customViews","isDefault","customViewDropdownOpen","selectedCustomView","newCustomViewName","inputCustomViewOpen","isEditingCustomView","editViewName","maxCustomViews","isDefaultSelected","isTypingCustomViewName","showCustomViewNameError","updateFilter","leftNavNode","showExport","refreshUrl","callbackFunc","updateBreadcrumb","appLanguage","requests","getInteractiveReport","getSecurityGroupsNames","_result","reportResult","securityGroupsNames","initViz","changeDisplayLeftNav","getWorksheets","worksheet","getName","securityGroup","getCustomViewsAsync","parsedCustomViews","customView","getDefault","foundDefault","customViewName","tableauFunction","loggingOperation","showCustomViewAsync","removeCustomViewAsync","rememberCustomViewAsync","_this$selectedCustomV","customViewOperationTableau","isNew","resultCustomView","customViewNameAlreadyInUse","isCurrentlyDefault","deleteCustomView","setCurrentViewAsDefault","_this$workbook","setActiveCustomViewAsDefaultAsync","saveCustomView","_this7","controllerName","controllerAsName","_this8","_this9","popupCustomView","overwritePopupTemplate","_this10","deletePopupTemplate","isCurrentViewDefault","applyCustomView","_this11","containerDiv","hideTabs","hideToolbar","onFirstInteractive","getWorkbook","getActiveSheet","getCustomViews","getExportOptions","onFirstVizSizeKnown","_this11$usersService$2","securityMode","security_group_name","tableau","Viz","domNodes","showNav","_this12","worksheets","worksheetObject","tableauPromises","getParametersAsync","getFiltersAsync","allSettled","_values","paramResponse","filterResponse","populateFilterValues","isParameter","filterObject","filterName","getFieldName","filterValues","getAllowableValues","getAppliedValues","_this13","parametersMap","flattenTableauFilters","filtersMap","matchedArray","formattedValue","FilterUpdateType","REPLACE","applyFilterAsync","_ref2$value","changeParameterValueAsync","showExportPDFDialog","_this14","exportOptionsPopupTemplate","_this14$exportOptions","exportOption","_exportOption$replace","_selectedOption$value","showExportCrossTabDialog","showExportImageDialog","interactive_report_view_component","filters_view","filters_view_default","CUSTOM_REGEX_MATCH","DATE_FILTER_NAME","DATE_START_FILTER","DATE_END_FILTER","CONTRACT_START_FILTER","CONTRACT_END_FILTER","RADIO_BUTTON_TYPE_FILTER","MULTI_SELECT_TYPE_FILTER","INPUT_TEXT_TYPE","FiltersViewController","selectedParameters","dateFilterName","startDateName","endDateName","contractStartStr","contractEndStr","radioButtonType","multiSelectType","inputTextType","startDateVal","endDateVal","startDateOptions","endDateOptions","_this$loopIgnoreFilte","updateFilters","loaded","loopIgnoreFilters","filtersLoading","valueFilters","filterChanged","parameterObject","parameterName","changeParameter","filters_view_component","filter_date_picker","filter_date_picker_default","FilterDatePickerComponent","isPopupOpen","dateSelected","updateDate","filter_date_picker_component","multi_select_dropdown","multi_select_dropdown_default","MultiSelectDropdownController","filteredOptions","showDropdown","searchInput","dropdownPrompt","ADD","REMOVE","optionsChanged","filterOpt","updateSelection","dropdownName","isAllOptionsSelected","currentVal","regexSearch","multi_select_dropdown_component","single_select_dropdown","single_select_dropdown_default","SingleSelectController","isDropdownOpen","filterOptions","filterPrompt","_option$label","selectionChange","single_select_dropdown_component","translateValues","filter_text_input","filter_text_input_default","FilterTextInputComponent","updateValue","filter_text_input_component","ExportOptionsModalController","export","_ctrl$selectedOption","delete_custom_view_popup_controller_default","reportsModule","ExportOptionsPopupController","DeleteCustomViewPopupController","OverwriteCustomViewPopupController","ReportsListComponent","InteractiveReportComponent","FilterViewController","FilterDatePicker","SingleSelectDropdownController","TSeriesUtilizationController","TSeriesService","utilizations","utilizationcsvexportData","adjustBalloonText","graphDataItem","graph","dataContext","utilize","getUtilizationSummary","color_index","make_model","equipid","getChartready","getUtilizationDetail","utilizationDetails","startDuration","balloonText","fillAlphas","lineAlpha","colorField","balloonFunction","depth3D","chartCursor","categoryBalloonEnabled","cursorAlpha","zoomable","gridPosition","labelRotation","listeners","getFullYear","getMonth","utilizationDetailList","CsvData","ESN","Make","Model","Today","Lifetime","lifetime","csvObject","TSeriesVerficationController","validationSummary","errortext","csvexportData","getValidationSummary","getValidationDetail","validationDetails","getvalidationDetails","pullOutRadius","outlineAlpha","inactive","titleField","labelColorField","labelText","angle","allLabels","align","bold","legend","fontSize","verficationgetCsvFileName","veficatioDetailList","Last Communication","Previous Communication","Delta1","Delta2","lastcom","lastCommunication","precom","previousCommunication","delta1","lastCommDeltaMinutes","delta2","previousCommDeltaMinutes","TSeriesRouteConfig","tSeriesEndpoint","getInventorySummary","getInventoryDetail","getRecentFleetActivities","tSeriesModule","uomify","pluralify","singular","plural","separator","f1","hrs","sec","clientModel","serverModel","equipmentMake","equipmentModel","equipmentProfileImage","utilizationString","totalhrs","mns","scs","newEvents","arr1","hashset","ll","setView","disable","dot","circleMarker","setRadius","isFirstLoad","inventoryMessage","getInventoryDetails","inventorySummaryList","validateData","inventoryDetailList","Count","DatapointDisplayListController","DatapointdisplayObjects","DatapointdisplayService","chartTypeOptions","getChartTypes","aggregateFunctions","getAggregateFunctions","datapointDisplayStatus","packagesTable","modulesTable","applyingModule","selectedModules","modulesListForPackage","datapointsTitleMap","datapointDisplayListData","getSelectedPackageId","getSelectedModuleIds","moduleIds","setLookupTables","createPackagesLookupTable","createModulesLookupTable","updateStateParams","selectedPackageId","selectedModuleIds","toggleAggregate","datapointItem","aggregate","aggregates","applyModule","selectedPackageIds","saveDatapointdisplay","updateCashedDatapointdisplayData","getDatapointListForPackageAndModules","getDatapointListStatus","onSelectedPackageChange","getModulesForPackage","onSelectedModuleChange","getAllDatapointDisplayList","CreateDatapointMapObject","datapoint_objects_DatapointdisplayObjects","each_default","pull","pull_default","findIndex_default","xor","xor_default","lodash_find","find_default","groupBy_default","lodash_sortBy","sortBy_default","keyBy","keyBy_default","lodash_filter","filter_default","datapointDisplayByPackageTable","_groupBy","package","_xor","packageListData","_filter","_KeyBy","datapointDisplayConfig","datapointDict","selectedEntities","entity","unconfiguredItems","displayItem","unconfigured","func","formatCurrentDatapointDisplay","datapointDisplay","valueColorMap","0","newDatapointDisplay","savedConfigData","_findIndex","currentAggregateList","aggregatevalue","_pull","keyValueMap","_each","unConfiguredItems","datapointDisplayModule","DatapointDisplayObjects","DatapointDisplayService","RoleCreateController","GTM_DatapointChanges","totalFiltered","totalSelected","sortDirection","useSecurityGroups","previousQuery","sortedPermissions","getAllPermissions","currentUserFeatures","hasDisabledFeatures","getLeftPermissionPadding","permission","countPeriods","selectAllPermissions","checkParent","childPath","initialLoad","postingChange","roleForm","maxlength","newRole","featureList","dataPointsDenied","backToRoles","visibilityChanged","assetsVisible","RolesListController","GTM_ListChanged","filteredUserRoles","unavailable","previousSearchText","selectedName","userRolesByPage","orderRoles","createSuccessFlag","deleteSuccessFlag","roleSelected","RoleViewDeleteModalController","Message","RoleViewController","previousSearchQuery","GTM_DatapointListChanged","datapointPage","datapointsPerPage","allowRoleAssignment","roleData","unassignable","backdropClass","handleError","visibleDp","isDenied","RoleViewDetailsController","GTM_UsersListChanged","userhasremoveflag","roleUsers","removeFlag","filteredRoleUsers","roleUsersByPage","usersLoaded","setPredicate","isAnyUserSelected","toggleSelect","openSelectModal","modalScope","modalTitle","userCannotSelectHimself","selectedUsers","changeResult","alreadyPicked","submitUsers","newChange","removeUsers","userToRemove","newUserList","patchUser","RoleViewEditController","editingPermission","editingRoleData","useSecurityGroupsChanged","changeApplied","checkExistingPermissions","ncyBreadcrumbLabel","editDisabled","assetVisiblityChanged","roleManagementModule","sub_accounts_list","list_default","CREATE_SUBACCOUNT","CREATE_SUBACCOUNT_FAIL","CREATE_SUBACCOUNT_SUCCESS","GET_ACCOUNT","GET_ACCOUNT_FAIL","GET_ACCOUNT_SUCCESS","UPDATE_SUBACCOUNT","UPDATE_SUBACCOUNT_FAIL","UPDATE_SUBACCOUNT_SUCCESS","UPDATE_INHERITED_ROLES","UPDATE_INHERITED_ROLES_FAIL","UPDATE_INHERITED_ROLES_SUCCESS","GET_ROLES","GET_ROLES_FAIL","GET_ROLES_SUCCESS","createSubAccountSuccess","createSubAccountFail","getAccount","getAccountSuccess","getAccountFail","updateSubAccount","updateInheritedRoles","updateSubAccountSuccess","updateSubAccountFail","updateInheritedRolesSuccess","updateInheritedRolesFail","getAccountRoles","getAccountRolesSuccess","getAccountRolesFail","AccountListController","AccountsActions","exactMatch","selectedIndex","filteredAccounts","filterAccountNames","subaccounts","loading_account","viewing","viewing_account","creating_subaccount","list_component","sub_accounts_create","create_default","CreateSubAccountController","validationMessage","getFirstCreateAccountName","setValidationMessage","create_component","sub_accounts_view","view_default","SubAccountViewController","mapDispatchToTarget","editingName","selectedRoles","account_roles","inheritedRoles","updating_subaccount","editingAccount","props","rolesToUpdate","view_component","subAccountsModule","SubAccountViewComponent","CreateSubAccountComponent","AccountsListComponent","SecurityGroupsListController","GTM_GroupChanged","filteredSecurityGroups","selfRemovedSuccessFlag","selfRemoved","selfRemovedFlag","orderSecurityGroups","sg","concatData","concattags","SecurityGroupCreateController","tagsChanged","datamodelTags","securityGroupName","submitcreateNewSecurityGroupForm","createNewSecurityGroupForm","SecurityGroupViewDeleteModalController","SecurityGroupsViewAssetsController","GTM_AssetsChanged","removals","previousText","orderEquipmentList","initializeEquipments","$current","existingIds","saveEquipments","info","newEquipmentList","securityGroupId","checkRemovals","toggleRemoval","existed","SecurityGroupsViewController","populateUI","securityGroupDesc","securityGroupTags","Desc","Tags","formEditing","selectedRow","ncyBreadcrumbLink","nameDescUpdated","nameDescConfirmed","submitDetails","groupMenuItems","GTM_TagsChanged","isActiveState","TagAdded","TagRemoved","lodash_values","values_default","SecurityGroupsViewUsersController","filteredUsers","numSelectedUsers","orderSecurityGroupUsers","existingUser","selectedUser","removeSelected","checkMembership","dropdownEvents","onItemSelect","updateOnSelect","onItemDeselect","updateOnDropdownRemove","onSelectAll","updateOnSelectAll","onDeselectAll","updateOnRemoveAll","isAllUsersSelected","selectAllUsers","toggleUser","SecurityGroupViewUserSelectionModalController","_selectedUsers","userListPage","selectedUsersPage","displayUsersByPage","displaySelectedUsersByPage","userPageChanged","GTM_AvailableListChanged","selectedUserPageChanged","GTM_SelectedListChanged","deselectUser","selectUser","loadingUsers","verified","password","isSet","securityGroupsModule","ManageInviteViewRevokeModalController","invite","manageInvitesRepository","deleteInviteByEmail","ManageInvitesListController","invites","previousSearchString","filteredInvites","getInvites","GTM_ListChanges","getAllInvites","ManageInvitesListComponent","ManageInvitesRepository","getInviteByEmail","getInviteByKey","updateInvite","ManageInvitesViewController","successText","showGroups","roleModel","editRoleModel","groupModel","editGroupModel","rolePredicate","groupPredicate","roleReverse","groupReverse","rev","filteredRoles","displayRolesByPage","GTM_RolesChanged","orderGroups","displayGroupsByPage","GTM_GroupsChanged","totalRoles","rolesByPage","totalGroups","groupsByPage","rolePageChanged","groupPageChanged","applyRoleFilter","editRoles","applyGroupFilter","editGroups","userEmail","initRolesandGroups","cancelInvite","revoked","at","by","selectingAll","groupSelected","checkAllRoles","checkAllGroups","roleIds","groupIds","groupsRequired","typeOf","InviteUserController","inviteService","emailEditing","emailFormat","GTM_RoleChanges","GTM_GroupChanges","isFormValid","inviteuserForm","valid","sendInvitation","checkedAll","emailChanged","UserViewDeleteModalController","UserViewDetailsController","existingRoles","isSelf","toTitleCase","txt","charAt","removeButtonPressed","UserViewDetailsEditController","roleCount","groupCount","editedUserClaim","isStringOrEmpty","inputstring","save","changeSets","phoneNumber","updateSecurityGroupsFn","alreadyExists","prefixChanges","firstNameChanged","debounce","lastNameChanged","phoneNumberChanged","unitOfMeasureChanged","editUserForm","UserViewListController","userManagementModule","ProductDeleteModalController","productService","deleteProduct","ProductsController","allProducts","filteredProducts","selectName","getAllProducts","ProductCreateController","packagesService","hasPkgModules","selectedPackageModules","metadata","templateNames","addModuleToProduct","removeModuleFromProduct","getAllProductsNames","names","packageErrorFlag","pkg","isModule","packageErrorText","changeSelectedPackage","gm","pm","hasModulespkg","submitproductForm","productForm","gettingPackage","postNewProduct","prodname","makeChanged","modelChanged","ProductDetailController","hasPackageModules","updateProduct","backup","selectedModBackup","selectedPackageModBackup","deleteProductPressed","processProductResponse","selectedPackageModulesIds","ModuleChanged","_package","processPackagesResponse","getProductById","ProductService","productSRVs","packagesendpoint","datapointendpoint","productendpoint","InReachApiProductsEndpoint","productId","getTriggersBySchemaId","schemaId","getFriendlyDatapoint","addEquipment","productsModule","manage_revoke_shared_modal","manage_revoke_shared_modal_default","ManageSharedAssetsController","transfersService","revokeFlag","isEquipmentSelected","sharedAssets","revokedEquipment","searchBarResults","updateEquipmentList","openConfirmModal","modalTemplate","shareObj","manageCheckedList","GTMEvent","equipResponse","selectedEquip","shareAssetsPath","shareKeys","accountArray","accountMessage","ManageSharedAssetsModalController","revokeShare","ShareAssetsController","handleErrorForShare","hrefsConcatinated","equipsIds","refreshTable","postingData","filteredEquipments","displayEquipmentsByPage","equipsPage","sorDirection","equipmentsByPage","isAccountSelected","getAccountsToShare","openMultiAsstsModal","multiPickerTemplate","removeselectedEquips","newEquipList","shareEquipments","equipsHrefResource","hrefResources","accountChanged","sharingModule","TagListController","TimezoneService","stateParams","previouSearchText","filteredTags","getTags","TagListComponent","tag_details","tag_details_default","_delete_attr_confirmation_modal","_delete_attr_confirmation_modal_default","TagDetailsController","filteredTagValues","tagToUserTimezone","currentPageExisting","readonly","secured","readonlyAttributes","deleteConfirmModalTemplate","attributeKey","TagDetailsComponent","FETCH_ATTRIBUTES_BEGIN","FETCH_ATTRIBUTES_SUCCESS","FETCH_ATTRIBUTES_FAILURE","FETCH_ATTRIBUTE_SECURITY","FETCH_ATTRIBUTE_SECURITY_SUCCESS","FETCH_ATTRIBUTE_SECURITY_FAILURE","ATTRIBUTE_CREATED","ATTRIBUTE_REMOVED","createAttribute","removeAttribute","fetchSuccess","fetchFailure","fetchSecurity","fetchSecuritySuccess","fetchSecurityFailure","TagDeleteModalController","AttributeActions","errorStatusText","CreateTagController","tagNames","maxDescriptionLength","dataTypes","Text","Integer","Decimal","Datetime","Hyperlink","freeform","fetchTags","fetchTagNames","freeForm","tagForm","tab","validation","$dirty","invoke","putTag","postTag","me","_clone","CreateTagComponent","TagBulkApplyController","tagsService","opened","datetimedate","cachedAttrs","filteredAssetList","assetByPage","assetPredicate","assetReverse","assetPage","onlyNumbersReg","tagsFromResponse","errorFromResponse","allTags","GTM_AssetsListChanged","cacheAttrs","applyAssetFilter","newList","toDisplay","found","getDateValue","newTag","dateValue","selectedTag","setSeconds","getSeconds","valueForId","datetimeValidCheck","bulkForm","checkAllDatetimes","newTags","selectedTagId","selectedTagValue","toAdd","submitAssets","cached","TagBulkApplyComponent","taggingModule","TextTableComponentController","maxTextLength","valField","addFailed","valueExists","toLocaleLowerCase","textValid","validRow","addVal","getListIndex","pageIndex","keydown","keyCode","charCode","cancelBubble","returnValue","rowErrorCount","errorCount","$name","newTextValue","RangeController","GTM_StateChanged","onMinSave","onMaxSave","onHideMin","onHideMax","onShowMin","onShowMax","minChanged","maxChanged","rangeTypes","rangeType","showMin","showMax","hasError","HyperlinkTableController","originalObject","markdownService","convertToModel","convertToMarkdown","urlPlaceholder","textPlaceholder","validUrl","validator","isURL","clone","hyplinkForm","onHide","onShow","hideShow","DateTimeController","getUserTimezoneOffset","setFormValidity","dateTimeForm","showTime","setTime","setMilliseconds","year-format","convertToSameTimeInUserTimeZone","assetsModule","AdminController","AdminRouteConfig","reloadOnSearch","adminModule","subAccountModule","AlertsRouteConfig","isEditPage","lodash_cloneDeep","cloneDeep_default","AlertsCreateController","configurationsService","ConfigurationFilterService","contactsList","configurationId","dataPointDescriptors","datapointDescriptors","descriptorVisible","disableCancel","duplicateConditionText","eventPropertyName","hasTriggers","incompleteTriggerFlag","incompleteTriggerMsg","noTriggersSavedMsg","savedTriggers","sortedEvents","thresholdOptions","triggers","validationFlag","validationMsg","showKMLabel","alertConfigDataPoint","alertConfigCondition","alertConfigDelay","alertConfigPriority","alertConfigAutoClear","alertConfigNotifyOnReturn","addTrigger","default","copyVisibleDataPoints","visibleDataPoint","foundDpdesc","dpdesc","statesArray","filterInvalidDatapoints","valuesArray","combinedArrays","triggerIcons","classList","initSelect2","select2","priorityOptions","relationalSymbolsOptions","relationalSymbols","condition","relationalOperator","thresholdValue","unitOfTime","autoClear","notifyOnReturn","unitOfTimeOptions","clearOptions","notifyOnReturnOptions","disableEditButton","enableEditButton","checkIfString","checkNumericalValue","checkDurationValue","triggerForm","_triggerForm$$data","_triggerForm$$data$un","$data","saveTrigger","duplicateEventCondition","savedTrigger","savedTriggerCondition","removeTrigger","cancelTrigger","createConfigForm","createConfiguration","configurationExists","duplicateConfigName","triggerScope","AlertsListController","configurations","filteredConfigurations","getConfigurations","orderConfigurations","setSelectedRow","configData","AlertsViewDeleteController","AlertsViewEditController","contactsBackup","configurationMenuItems","loadConfigData","resetFormData","existingConfigurations","emailBackup","nameBackup","editConfigurationForm","submitEditConfigurationForm","configErrorFlag","configErrorText","AlertsViewPickAssetsController","removeLastAssetMsgFlag","removeLastAssetMsg","lodash_es_keyBy","Options","_priorityOptions","_relationalSymbolsOptions","stateRelational","_unitOfTimeOptions","_clearOptions","_notifyOnReturnOptions","_keyBy","TriggerView","valuesDescriptors","ApiTrigger","triggerView","_ref$dataPoint","validateTriggersData","visibleDatapointsIds","isSameTriggers","one","two","conditionOne","dataPointOne","conditionTwo","dataPointTwo","apiToTriggerView","apiTrigger","dataPointDescriptor","_condition","AlertsViewTriggersControllerCRUD","descriptors","displayTriggers","triggerData","datapointEvent","datapointDescriptor","dsc","filteredTriggerList","hasNewTrigger","deleteTriggerFlag","deleteTriggerText","duplicateConditionFlag","disableDataPointDropdown","orderTriggersList","validateTrigger","newTrigger","indexedPriorityOptions","indexedRelationalSymbolsOptions","indexedUnitOfTimeOptions","indexedClearOptions","indexedNotifyOnReturnOptions","ex","sortComparator","v1","v2","getDataPointInfoOnEdit","alertsConfigModule","FaultsViewDeleteController","configurationName","faultsService","deleteFaultConfig","FaultsListDirective","getAllFaultConfigs","assets_directive_arrayLikeToArray","FaultsViewEditAssetsDirective","patchFaultConfigEquipment","openModal","handleModalAssets","getConfigById","modalAssets","resultEquipmentList","FaultsRepo","faultsEndpoint","postFaultConfiguration","getFaultConfigurationById","getFaultConfigurationByName","getAllFaultConfigurations","updateFaultConfiguration","deleteFaultConfiguration","patchFaultConfiguration","patchFaultConfigurationEquipment","postFault","deleteFault","configId","faultId","updateFault","FaultsService","faultsRepo","faultEnums","Low","Medium","High","Immediately","OneDay","notify","true","false","faultOptionLists","createConfigApiModel","createAPITrigger","createViewTrigger","createConfig","apiModel","configResponse","getConfigByName","updateFaultConfig","newFault","getFaultOptions","faultOptions","faultsConfigModule","EditFaultFormController","copiedFault","editFault","saveFault","disableEditMode","isDuplicate","editForm","processing","removeIsDuplicateError","FaultTableController","addFault","resetFaultValidation","enableEditMode","isEditMode","faultsForm","faultToCheck","duplicate","duplicateFaultMsg","incompleteFaultMsg","noCompletedFaultsMsg","requiresFaultsFlag","requiresFaultsMsg","selectedFaultId","setSelected","changeEditFault","faultIndex","intervalCanceller","showRequiredFaultMsg","updateError","postNewFaultError","$$parentForm","isFaultInEditMode","CreateFaultConfigController","saveConfiguration","createConfigurationForm","faultConfigurationExists","EditFaultConfigController","tabs","selectedTab","editFaultConfigForm","GeozoneRouteConfig","GeozonesCreateController","equipmentGeozoneService","numSelectedAsset","errorOccured","existingGeozoneMsg","geozoneNameExists","geozoneRequired","validNameCharacters","createGeoZoneForm","submitGeozoneForm","equipmentDict","gname","notifyOnActive","autoclear","GeozoneDetailsEventController","alertConfig","GeozonesListController","geozoneList","filteredGeozones","orderGeozones","GeozoneAssetDeleteModalController","GeozonesViewTableAssetsModalController","mobileService","assetsByPage","assetsToRemove","assetsToAdd","RemoveEquipmentClicked","deleteEquipmentList","updateEquipment","AddAssetsClicked","noData","GeozonesViewTableController","saveEditedGeozone","toSubmit","postingEdit","editSuccessFlag","editErrorFlag","editErrorText","geozoneDetailsBreadcrumb","geozoneData","deleteErrorFlag","deleteErrorText","geozoneDetailsForm","onGeozoneEdit","GeozoneDetailsLogController","geozoneName","geozoneLogs","geozoneLogsByPage","filteredGeozoneLogs","geozoneLogPage","orderGeozoneLogs","displayGeozonesByPage","toDateString","columnArray","headerArray","rowArray","geozonesConfigModule","GeozonesViewTableLogController","GeozoneMapController","Observable","subscriber","pipe","switchMap","lastBounds","fromPromise","subscribe","invalidateSize","scrollWheelZoom","markerClusterGroup","overLays","assetTooltip","shapeTools","finish","undo","buttons","polygon","rectangle","drawLocal","draw","polygonHandles","cont","handlers","rectangleHandles","editTools","removeDisabled","editHandlers","subtext","allowIntersection","showArea","drawError","shapeOptions","polyline","circle","Control","Draw","Edit","PolyVerticesEdit","showPolygonArea","feat","toGeoJSON","onEdit","eachLayer","touchZoom","doubleClickZoom","dragging","latLngs","configurationsModule","_invalidDataPointIds","visibleDataPoints","invalidDataPointIds","invalidIds","DashboardMainPageController","alertsByPage","filteredAlerts","alertGetCleared","orderAlerts","displayAlertsByPage","alertPage","Priority","Time Active","AlertName","AlertEvent","DashboardNotesModalController","alertsRepository","editNote","creatingnote","noteCount","notes","getAlertNotes","_editable","noteUserId","createNewNote","noteText","enteredBy","newNote","isInvalidData","AlertsTableController","orderAlertsCol","addAlertsInteraction","calluUpdateAlert","displayAssetLink","changeFirstLoad","updatePredicate","priorityCustomOrder","DashboardAlertsListComponent","AlertDashboardChartController","drawDonutChart","numOne","numTwo","perc","color1","color2","percDivId","chartid","loadingChart","highPriorityNum","mediumPriorityNum","lowPriorityNum","lowPriorityCount","others","lowPrioritypercentage","lowPriorityPerc","mediumPriorityPerc","highPriorityPerc","mediumPriorityCount","mediumPrioritypercentage","highPriorityCount","highPrioritypercentage","DashboardChartComponent","AlertsBoardController","queryName","statusOptions","alertOptions","originalSearchText","setAlertsBtnGroup","alertFilter","setBtnGroup","filterBy","clickedOption","setPrioritiesBtnGroup","priorityFilter","setStatusBtnGroup","statusFilter","btnState","updateErrorFlag","updateErrorText","onClearAlert","Type","Time_Active","Description","activeTimeOfAlert","alertName","alertEvent","alertEventDescription","faultDescription","alertType","dataExist","optionsArray","optionsFilter","alertArray","allAlertsBtn","rej","priorityIcons","low","medium","high","Icon","Index","alertTypeTranslation","priorityTranslation","titleTranslation","faultDescriptionTranslation","statusTranslation","dtcName","geozones","triggerAlertsKeywordFiltering","dashboardModule","jstz","jstz_default","list_controller_arrayLikeToArray","changeTimeZone","M","getMilliseconds","HistoricalAlertsListController","alertsFilter","alertsPerPage","allAlerts","allStatus","assetPickerCount","filteredalerts","getAlertsFlag","invalidFlag","unfilteredalerts","currentFormat","maxStartDate","maxEndDate","minEndDate","minStartDate","endDateFormat","searchBackupCopy","startDateFormat","selectedAssetsArr","sessionPriority","sessionStatus","sessionFaults","showAlertList","determine","setSelectableDateRange","setSessionVariables","sessionStorage","faultFilter","filterAlertHistoryForm","StartDate","EndDate","returnthis","plusThirtyOneDays","maxStartTemp","faultsArray","allFitlerBtn","alertsArray","statusArray","allStatusBtn","historicalClass","pred","_e3","visibleDatapoint","newArray","alertHistoryItem","searchAlertEquipment","diagnosticTroubleCode","getAlertType","orderAlertHistory","addHistoricalAlertsInteraction","Event","HistoricalAlertsListComponent","HistoricalAlertsViewController","noteEditing","instance","instances","enteredAt","onError","isVisible","currentUserId","HistoricalAlertsViewNewNotesController","historicalModule","AlertsMaintenanceHistoryComponent","bar","margin","bottom","clipEdge","valueFormat","showMaxMin","tickFormat","axisLabel","axisLabelDistance","showControls","showLegend","stacked","showYAxis","showXAxis","alertsModule","attribute_filter_component","attribute_filter_component_default","AttributeFilterController","displayValidationError","TYPE","selectedValues","rawAttr","help","attributeFilterForm","validateForm","addFilter","closeModal","removeFilter","_every","getFormField","$index","formField","supportsError","hasRequiredError","validateFields","rootForm","formProp","formKey","valueForm","valueFormKey","$setTouched","attributeFilterComponent","editFilter","helpers_get","helpers_get_default","freeform_filter_component","freeform_filter_component_default","FreeformFilterController","_AttributeFilterContr","translateFilter","showPresets","showDates","setHelp","showTimes","setDateSelections","instructions","getHelp","anyValue","checkDateValidation","freeformFilterForm","_getPrototypeOf","isNumeric","isDate","isDatetime","getForm","parentErrorType","hasInvalidPattern","fieldRef","pattern","selectedRange","dynamicDates","freeformFilterComponent","list_filter_component","list_filter_component_default","ListFilterController","listFilterForm","listFilterComponent","date_filter_component","date_filter_component_default","DateFilterController","setSelectedRange","setRange","dateFilterForm","dateFilterComponent","range_filter_component","range_filter_component_default","RangeFilterController","inputType","rangeFilterComponent","filter_input_template","filter_input_template_default","FilterInputController","searchTerm","array","FilterInputComponent","range_date_template","range_date_template_default","RangeDateController","dateUtil","timeRangePresets","datepickerTimeFormat","invalidStartDate","invalidEndDate","timeSelected","setMinDate","setMaxDate","startRang","startRange","endRange","updateEndDate","updateStartDate","preset","blur","dateFromOption","RangeDateComponent","EquipmentListController","_transfer$transferkey","hasTransferKeys","uniq","filters_component","filters_component_default","attribute_filter_models_createSuper","FILTER_TYPES","validatorTypeMap","validatorMap","FreeformAttributeFilter","_AttributeFilter","AttributeFilter","applied","DateAttributeFilter","_FreeformAttributeFil","_super2","IntegerAttributeFilter","_FreeformAttributeFil2","_super4","DecimalAttributeFilter","_IntegerAttributeFilt","_super5","ListAttributeFilter","_FreeformAttributeFil3","_super6","noNulls","pluckValue","RangeAttributeFilter","_FreeformAttributeFil4","_super7","DateRangeAttributeFilter","_RangeAttributeFilter","_super8","IntegerRangeAttributeFilter","_RangeAttributeFilter2","_super9","DecimalRangeAttributeFilter","_IntegerRangeAttribut","_super10","mapFilter","adaptTagFilters","selectedFilters","filterObj","adaptRange","newRange","AssetFiltersController","communicatedLabel","selectedAttr","selectedAttrFilters","selectedSecurityGroups","currentState","_currentState$search","selectedAccounts","unSelectedAccounts","allAttrFilters","attrFilters","attrFilter","_tagFilters$key","filterItem","existingFilters","selectedFilter","existingFilter","_uniq","adaptedFilters","keep","filterGroup","currentSelectedValues","showAdvancedFilters","assetFiltersComponent","closeFilters","numeric_range_filter_component","numeric_range_filter_component_default","NumericRangeController","getTranslation","hasInvalidMin","hasInvalidMax","numericRangeFilterComponent","invalid_entry_messaging_component","invalid_entry_messaging_component_default","InvalidEntryMessagingController","invalidEntryMessagingComponent","errorType","NoticeComponent","notice_component","noResults","driver_min","driver_min_default","highlightsComponent","driver","Driver","highlight","popover","showButtons","closeBtnText","highlights_component","FilterOverviewComponent","appliedFilters","buildFilterReview","showOverview","panel","selectedAlerts","selectedMaintenance","selectedLastCommunicated","filter_overview_component","ESNController","transitionTo","ESNModule","sync_runhours","sync_runhours_default","StatusMessages","UPDATING","SUCCESS","ERROR","GET_RUNHOURS_ERROR","NOT_REPORTED","NOT_REPORTED_M5","NOT_REPORTED_Not_M5","sync_confirm_modal","sync_confirm_modal_default","confirm_modal_sync_confirm_modal_default","syncValue","datapointName","dtName","SyncRunHoursController","syncRunHoursService","setSyncStatus","messages","notcommStatus","syncStatus","runhoursSeries","getReportedRunHours","runhoursValue","getLastReportedRunHours","setRunHours","SyncRunHoursComponent","pageClass","deviceModel","DevicesRouteConfig","serial","serialId","DeviceActivationsBulkController","bulkActivationCsvUploaded","installationsService","pendingRows","showSubmitSpinner","canTransfer","isSecurityGroupOptional","currentRow","lastActivationId","onActivateSuccess","deviceSerial","DeviceSerialNumber","_success","activateNextRow","onActivateFailed","onTransferSuccess","onTransferFailed","getNumProcessedRows","rows","showSummaryReport","packagesIDs","_processed","device","EquipmentMake","EquipmentModel","model year","EquipmentModelYear","vin","EquipmentVin","errorRows","getRowsWithError","fileNameChanged","files","namesArr","csvFileError","preventFormSubmit","bulkActivateForm","addModuleToPackages","removeModuleFromPackages","getSuccessfulRows","getNumRowsWithError","transferErrorFlag","transferErrorText","transferKeys","hasSecurityGroups","fatalError","$digest","_validFormat","DeviceActivationsBulkCustomController","resetState","activationJob","uploadBulkActivation","DevicesActivationsSingleModalController","products","productDetails","productsByPage","productPage","displayProductsByPage","selectedProducts","packageName","DevicesActivationsWizardController","activationNoteCreated","activationInstallationCreated","devicesService","installationNoteService","mapCreated","iconUrl","hardware","canSyncRunHours","availableSecurityGroups","availableProducts","activationSuccessFlag","activationSuccessMsg","transferSuccessFlag","transferSuccessMsg","showActivationForm","templatesAvailable","isSGOptional","reloadingLastComm","checkBox","isChecked","isConnected","communicationActions","showActivationMap","loadingLocation","gpsLocationModel","gpsLocationAction","runHoursModel","runHoursAction","refreshingSeriesData","noSeriesData","seriesDataMsg","equipmentSeries","isLoadingTableData","lastcomm","tabularDatapoints","wantedSeriesList","validatingSerialNumber","userSelectedTemplatePackage","parsedTags","datetimeBounds","minMaxRequired","showTag","hasSyncFeature","setTimeHMS","targetDate","sourceDate","logUserActions","connected","run_hours","clearForm","deviceSerialNumberError","equipmentModelYear","equipmentVin","isTemplateSelected","activationForm","$setUntouched","serialNumberChanged","serialNum","isSeriesData","getDataPointValues","getInstallationLocation","packagesIds","getSyncRunHoursTag","syncRunHoursTag","getLastComm","activateWithTemplate","submitActivationForm","appendTag","removeTag","filterSelected","roundInt","checkValid","updateTimeBounds","returnTimeBound","checkMax","checkMin","keyPressHandler","checkInstallations","install","submitTags","tagVal","rollbackThisActivationIdInCaseOfFailure","newInstallationId","pkgId","showSelectProductsModal","isDeviceConnected","loadingLastComm","reloadLastComm","getGPSAction","reloadingLocation","reloadLocation","getRunHoursAction","refreshDataPointValues","seriesDataFilter","loadingSeries","seriesData","rootTag","reload","inherit","DevicesController","totalUsage","DevicesDeactivateModalController","modem","DevicesDeactivateModalModalController","DeviceDetailController","deviceDiagnosticService","selectedInstallationId","userActions","moduleViewModel","canDeactivate","getErrorMessage","defaultMsg","_error$data","_error$data$message","_error$data$Message","_error$status","_error$statusText","deactivateButtonPressed","_ref$equipment","_ref$device","gpsInfo","cellInfo","getLastReportedCellSignalSeries","cellData","getLastReportedGpsSeries","gpsData","basePkgs","pkgModules","pakageIds","packagesServiceResponse","m5device","pkgWithSyncDatapoint","allowsRunHoursSync","syncRunHourAvaliable","syncRunHoursDataPoint","runHoursSync","packagesServiceResponseResponse","parseTags","isBrowser","IE10","IE9","EDGE","showInstallationNotesModal","userAgent","parsedAttrs","datatype","DevicesListController","showSingleInstallPanel","showBulkInstallPanel","pagedInstallations","xMoreDataAvailable","canDelete","nextPageOffset","currentSearchTerm","nextPageSubscription","previousPage","showInstallationsSpinner","sortString","updateResults","isRefreshing","nextPage","refreshDevice","refreshErrorFlag","refreshErrorText","InstallationNotesModalController","_next","_current","getInstallationNotes","TelematicsSerialNumberDirective","ev","$commitViewValue","$asyncValidators","telematicsserialnumber","modelValue","packageList","moduleList","getPackages","packageResponse","deviceResponse","activationsService","syncBody","baseTag","devicesModule","ActivationsService","ActivationsRepo","SyncRunHoursService","AlertsFilter","AttrsTranslateFilter","conversionDict","generator_model","po","onei3:serial","onei3:model","conversion","Case","AttrsValueTranslateFilter","isNumber","isFinite","hideUOM","precision","decimals","includeMilliseconds","_moment$duration$_dat","_data","years","months","useGenericDtc","_input$attrs","src","valueDescriptor","isInteger","TableDateFilter","datetimeformat","DateFilter","formatOnly","convertToUserTimezone","FriendlyAttributesFilter","hasMin","hasMax","getValue","endsWith","_isObject","filterModule","out","itemMatches","toReturn","__proto__","ChartDateFilter","ChartLabelFilter","urlMarkDown","urlTextMarkdown","equipmentFilterModule","propertyName","nestedPropertyName","propertyValue","limitFrom","limitTo","ErrorsRouteConfig","general_error","error_default","ErrorController","error_component","ErrorsModule","ErrorComponent","BrowserPolicyController","notificationActions","back","browser_policy_component","BrowserPolicyRouteConfig","browserPolicyModule","BrowserPolicyComponent","CommandController","CommandHistoryService","CommandService","updatingHistory","updateHistory","commandList","historyStatus","commandGroups","commandAlertStatus","packageCommandsConfig","commandConfig","getHealthStatus","controlsStatus","CommandComponent","command_models","apicontrolsStatus","statusAlertOptions","alertDefaultOptions","controlstatus","alertOption","translateText","textParams","healthStatusTypes","c_date","CommandControlsController","selectedCommandGroup","confirmation","selectCommandsGroup","comand","submitForm","ControlsComponent","CommandHistoryController","progressPercent","progressMessage","messageFlage","classes","commandHistoryStatus","updatePending","CommandHistoryComponent","mapStatus","incompleteStatus","expectedEnd","comm","translationValue","_validValue$find","getvalueLabel","uiStatus","historyList","promiseList","historyItem","pendingItem","updatedItem","toUpdateIndex","listItem","updatePendingItem","CommandStatusComponent","healthStatus","showFirstError","alertStatuses","firstError","chain","health","showState","selectedState","CommandTextService","Battery Status","Unable to retrieve battery level.","Battery level is good.","Battery level is low.","Auto Mode","Unable to retrieve Key Position. The equipment may not be turned on.","The key is in auto start position.","The key is not in auto start position. No commands can be sent to the device until it is in Auto Start mode.","Modbus Status","Unable to retrieve Modbus status","Modbus has been detected.","Unable to detect Modbus. The equipment may needs to be turned on","commandControlsTemplateText","Engine Start/Stop","Start","Stop","Start/Stop","AutoStart Enable","Autostart Enable","Throttle Control","Desired RPM","Target RPM","commandNamesMap","14_pin_connector","270_deg_camera","2_piece_boom","Position 1","Position 2","Position 3","Position 4","Trime Engine Start","Trime Engine Stop","Trime Fault Reset","Trime GCB Off","Trime GCB On","Trime GCB Toggle","Trime Horn Reset","Trime MCB Off","Trime MCB On","Trime MCB Toggle","active_power_control","alarms_drive","alarms_lift","auto_grease","auto_tank","aux2_aux4_independent","aux_1","aux_1_pressure_adjustment","aux_2","aux_2_pressure_adjustment","aux_4","back_alarm","communication_mode","cummins_3_3_engine_start","cummins_3_3_engine_stop","drive_elev_fwd_max","drive_elev_rev_max","drive_fwd_max","drive_rev_max","enable_disable_engine","end_periodic_write","engine_auto_stop","engine_control","engine_control_c1","engine_speed_limit","foot_accelerator_pedal","high_flow","j1939_read","lift_height_max","lift_up_max","lockout","locnacelle_engine_start","locnacelle_engine_stop","lofa_autostart_enable","lofa_engine_start","lofa_engine_stop","lofa_throttle_control","multifunction_grip","optional_function_1","optional_function_2","output_control","outrigger","parking_brake","radio","read_fuel_level","read_oil_pressure","ride_control","set_accumulator","side_camera","start_periodic_write","telemetry_control","travel_alarm","travel_speed_control","ultrasonic_sensors","work_time","commandPrompts","14 Pin Connector","2 Piece Boom","270 Deg Camera","AUX 1","AUX 2","AUX 4","Active Power Control","Auto Grease","Auto Tank","Aux 1 Pressure Adjustment","Aux 2 Pressure Adjustment","Aux2 Aux4 Independent","Back Alarm","Change to","Communication Mode","Desired override duration (seconds)","Desired run speed (rpm)","Drive speed adjustment in the elevated position (%)","Engine Auto Stop","Engine Speed Limit","Foot Accelerator Pedal","Height adjustment (%)","High Flow","Maximum speed of lift (%)","Multifunction Grip","Optional Function 1","Optional Function 2","Output Control","Outrigger","Parking Brake","Position 1 Count","Position 2 Count","Position 3 Count","Position 4 Count","Radio","Ride Control","Side Camera","Speed adjustment (%)","Telemetry Control","Travel Alarm","Travel Speed Control","commandValidValues","ALL ON","Cancel Telemetry","Disable","Disable Lockout","Enable","Enable Lockout","Engine Speed Low","Engine Speed Mid","Engine Start Disable","Full","Limit Unlock","Momentary On 10 seconds","Momentary On 20 seconds","Momentary On 30 seconds","OFF","ON","ON - Down Only","ON - Forward Only","ON - Reverse Only","ON - Up Only","Output OFF","Output ON","Restricted","Start Engine","Stop Engine","Telemetry Start","commandsTextMap","CommandTranslateFilter","CommandsTextService","rest","assetDetailsDashboardModule","REFRESH_ASSET_DASH_BOARD_DATA","GET_ASSET_DATA","GET_ASSET_DATA_FAILED","GET_ASSET_DATA_SUCCESS","GET_SERIES_DATA","GET_SERIES_DATA_FAILED","GET_SERIES_DATA_SUCCESS","SELECT_SERIES","DESELECT_SERIES","SET_DATE_RANGE","SET_DATE_RANGE_BY_OPTION","SET_ACTIVE_DATA_TAB","UPDATE_ASSET_LOCATION","refreshAssetdashBoardData","getAssetDataSuccess","moreData","getAssetDataFailed","selectSeries","deselectSeries","setDateRangeByOption","optionValue","getSeriesData","updateDateRange","getSeriesDataSuccess","dataFor","getSeriesDataFailed","setActiveDataTab","tabKey","updateAssetLocation","lastgpsVal","AssetDetailsDashboardController","AssetDetailsActions","updateBreadcrumbBar","hasConfigCommandFeature","hasDevices","_state$asset_details","asset_details","dataDateRange","seriesDataStatus","selectedSeriesIds","activeDataTap","_ref$series","_ref$seriesData","chosenRunHours","ser","setRunhoursAvailable","hasSetAccumulatorCommand","assetState","detailsLoading","newName","asset_details_dashboard_asset_details_dashboard_component","AssetDataController","visibleSeries","underShowMoreSeries","displaySeries","_asset$currentValue$s","getDisplayedSeries","_this$getChartAndValu","getChartAndValuesData","_this$getChartAndValu2","valuesData","isSeriesSelected","chartDataobject","rollup","chartRollup","valuesDataobject","showMoreSelected","currentSeriesSelected","optionSelected","DataPoint","Value","Units","LastCommunicated","datapointname","lastValueObj","lastcommunicated","Unit","data_asset_data_component","activeTab","series_chart_component","series_chart_component_default","ChartController","VALUE_DELIMETER","CHART_DIV_ID","descriptiveColorArray","aggregatedDataColorMap","mean","delta","BALLOON_COLOR","requestedFunctions","stockChart","chartDiv","updateChartDivHeight","previousValue","createOrUpdateChart","updateChartStartAndEndDate","valueIndex","modifiedData","_this$createChartData","createChartDataset","dataset","mainDataSet","fieldMappings","panels","validateNow","creatAmStockCharts","write","chartUpdating","createOrUpdateChartAsync","chartZooming","numberOfCharts","stockChartDataset","stockPanel","baseHref","AmStockChart","stockParams","dataSets","categoryAxesSettings","CategoryAxesSettings","minPeriod","maxSeries","valueAxesSettings","ValueAxesSettings","inside","chartScrollbarSettings","ChartScrollbarSettings","dragIcon","dragIconHeight","dragIconWidth","chartCursorSettings","ChartCursorSettings","cursorColor","valueBalloonsEnabled","panelsSettings","PanelsSettings","menu","initHC","addListener","eventStartDate","eventEndDate","startDatesdiff","endDatesdiff","onDateRangeChange","valuesDict","datapointDisplayItem","_ref$interval","dataInterval","isObject","defineAggregatedChartGraphs","agggregateFunction","getDescriptiveColor","getIntervalColor","indexBy","finalResult","startDateChartItem","endDateChartItem","sortData","arrayData","seriesRollupObject","seriesAggregatedFunctions","displayAggergateFunction","aggergatedchartGraphFunctions","returnFunction","seriesDataArray","guides","lastRecordedValue","lastKnownValue","fillColor","fillAlpha","timeSeriseData","DataSet","getStockChartDataObject","percentHeight","_ref4$interval","getChartTitle","StockPanel","fontFamily","valueAxis","ValueAxis","useGraphSettings","fromField","toField","stockGraph","StockGraph","balloonColor","legendData","legendOptions","combineLegend","valueText","valueWidth","addLegend","fillColorsField","lineColorField","labelsEnabled","chartType","lineThickness","noStepRisers","numOfValues","maximum","minimum","bullet","bulletSize","bulletBorderAlpha","columnWidth","addStockGraph","getSeriesDataGuide","stockLegend","valueTextRegular","useMarkerColorForLabels","switchable","rangeMin","rangeMax","chartGraphFunctionsLines","dpdia","useDataSetColors","capitalizeFirstletter","addValueAxis","chartTitle","chartseriesData","serData","getSeries","innerHtml","formatNumericValue","numDecimals","formatDescriptiveVal","selectedDataInterval","chart_series_chart_component","loadingData","series_table_component","series_table_component_default","AssetSeriesTableController","exportSelected","timeStampOrderBy","assetSeries","getSeriesIdsForRetreivedData","timeValueDict","buildTimeValueDictionary","timeStamps","seriesDict","allSeries","allDataExporting","timeseriesExportAllData","seriesIds","timeValueMap","_item$data","headerSet","setCsvHeaderSet","setCsvHeaderArray","setCsvAssetInfoArray","assetAttrs","setCsvTimeSeriesData","_series$attrs","seriesColTitle","attrsRows","attrKey","_attrsRows","fistAttr","columnPushPosition","columnLength","dataDict","series_table_series_table_component","asset_details_component","asset_details_component_default","asset_image_edit_modal","asset_image_edit_modal_default","asset_image_upload_modal","asset_image_upload_modal_default","equipment_images_modal","equipment_images_modal_default","AssetDetailsController","_asset$currentValue","_asset$currentValue$a","_asset$currentValue$i","_asset$currentValue$u","showImageSection","runHoursSeries","classRef","assetImageEditTemplate","currentProfilePictureId","assetImageViewTemplate","onDeleteImage","defaultImageId","assetImageUploadTemplate","details_asset_details_component","asset_location","asset_location_default","set_asset_location_modal","set_asset_location_modal_default","LocationMapUtil","editableFeatureGroupLayers","pinLocationIcon","circlemarker","drawControl","diameter","pinned","gpsStatus","canUnpin","getBluetoothMarkerIcon","pinnedMarkerIcon","Marker","zIndexOffset","generatePinnedMarkerPopup","heading","pointNumber","_attrs$speed","_attrs$speed_uom","speed_uom","_attrs$distance","speedRow","distanceRow","_ref3$heading","_ref4","_ref5","breadcrumbMarkerHtml","getBreadcrumbMarkerIcon","pointList","gpsLocation","_ref6","_ref7","weight","smoothFactor","LocationDataHelper","isTseriesAsset","isValidGpsSeries","isAssetPinned","daysSinceCommunicated","AssetLocationController","timeSeriesAPI","mapUtil","helper","Helper","dataStatus","gpsCoordinates","lastGpsSeries","dates","dateOption","gpsCoordinatesPerPage","drawLayer","userCanSetLocation","locationSeries","setDatesByOption","createMap","_changes$refreshing","_changes$asset","currentLocation","previousLocation","getAssetGpsData","startObserver","updateMinMaxDates","endObserver","loadPage","getGpsCoordinatesByPage","fullscreen","isFullscreen","pinDropped","updateMapLastLocationMarker","FeatureGroup","createDrawPinControl","addMapDrawPinEventHandlers","querySelector","drawGpsMapMarkers","layerType","getLatLng","openAssetLocationConfirmModal","gpsSeriesId","getGpsSeriesData","getAssetGpsStatus","networkTechnology","isSameSeries","setupLocationHistory","updateMapLocationHistoryMarkers","openMarkerPopup","selectedMarker","lastLocation","createPinnedMarker","locationHistory","createBreadcrumbMarker","generatebreadcrumbMarkerPopup","createPolylinesLayer","_location$attrs","coord","Timestamp","Latitude","Longitude","setAssetLocation","_ref8","_self$locationSeries","setLocation","appendToElement","SetAssetLocationTemplate","isAssetLocationConfirmed","pinnedAssetEvent","pinnedAssetModel","appendTo","isConfirmed","asset_location_component","asset_alerts_component","asset_alerts_component_default","AssetAlertsController","onClearingAlert","alerts_asset_alerts_component","asset_maintenance_component","asset_maintenance_component_default","AssetMaintenanceController","activePlans","getMaintenanceHistory","_asset$currentValue$m","activePlane","loadingHistory","maintenance_asset_maintenance_component","device_diagnostics_component","device_diagnostics_component_default","AssetDeviceController","_cellSignal","getCellSignalInfo","signalStatus","_ref$packages","basePackages","modulePackages","_ref2$device","firmwareVer","firmware_ver","configVer","config_ver","device_diagnostics_device_diagnostics_component","EquipmentDetailImageEditModalController","EquipmentDetailsImageUploadController","fileUploaderService","isProfileImage","fileTypeValidation","errorFlagMaxImgs","errorFlagMaxImgSize","removeAfterUpload","uploading","onSuccessItem","isNewProfilePicture","onErrorItem","onBeforeUploadItem","uploadImage","uploadAll","SetAssetLocationModalController","CommandModule","AssetImageEditModalController","AssetImageUploadController","SetAssetLocationController","AssetDetailsDashboardComponent","AssetDataComponent","SeriesDataChartComponent","SeriesDataTableComponent","AssetDetailsSectionComponent","AssetLocationComponent","AssetAlertsComponent","AssetMaintenanceComponent","AssetDeviceDiagnosticsComponent","sitesRouteConfig","table","table_default","Table","previousCheckIndex","after","before","itemIndex","onCheckChange","onItemClick","table_table","onSortChange","allChecked","actionItems","ga_map_component","ga_map_component_default","index_esm","dist_index_esm","objectWithoutProperties","objectWithoutProperties_default","custom_marker_excluded","createCustomMarker","_ref$OverlayView","OverlayView","google","maps","_objectWithoutProperties","_excluded","_OverlayView","CustomMarker","infoPopup","setMap","div","innerHTML","addDomListener","getPanes","overlayMouseTarget","setContent","getProjection","fromLatLngToDivPixel","offsetWidth","createDiv","appendDivToOverlay","positionDiv","parentNode","removeChild","GOOGLE_MAPS_API_KEY","POLYGON_SETTINGS","strokeColor","MAP_OPTIONS","mapTypeId","styles","featureType","elementType","stylers","visibility","saturation","lightness","google_maps_service","GoogleMapsService","loader","Loader","apiKey","version","libraries","markers","drawingManager","polygons","markerOverlays","assetMap","scriptLoaded","loadMapScript","popupEl","allowEditGeoZone","mapType","mapOptions","markerCluster","MarkerClusterer","imagePath","clusterClass","mc","renderMarkers","initDrawingManager","InfoWindow","content","drawing","DrawingManager","drawingControlOptions","ControlPosition","TOP_CENTER","drawingModes","OverlayType","POLYGON","RECTANGLE","polygonOptions","editable","rectangleOptions","polygonComplete","setDrawingMode","initPolygon","showApplyChanges","ne","sw","polyPoints","Polygon","setPolygonEditable","polygonUpdated","getPath","setEditable","clearListeners","clearMarkers","LatLngBounds","onSiteMarkersPosition","offSiteMarkersPosition","onSite","addMarkers","clusters_","markers_","_this8$getClusterData","getClusterData","center_","createClusterMarker","assetType","clearGeoZone","points","assetsByType","getPaths","getArray","GeoJSON","poly","containsLocation","_ref9","_ref10","places","Autocomplete","bindTo","setFields","place","getPlace","viewport","SiteMapController","changingGeoZone","userMapType","_$rootScope$currentUs","_$rootScope$currentUs2","googleMapsService","controls","editActions","LEFT_BOTTOM","markerDescriptors","BOTTOM_CENTER","searchable","searchControl","RIGHT_TOP","setLocationSearch","setMarkers","setGeoZone","onUpdateGeometry","setPolygonsEditMode","newSite","applyGeoZoneChanges","getPolygonGeometry","map_ga_map_component","chart_default","dataModel","sitesService","colors","$id","ChartDiv","CreateChart","autoResize","percentPrecision","labelRadius","titles","onSliceClick","handelSliceClick","dataItem","rollOverSlice","clickSlice","chart_chart_component","applied_filters_view","applied_filters_view_default","AppliedFiltersViewController","applied_filters_view_component","search_input_search_input","search_input_search_input_default","trimStart","triggered","search_input_search_input_component","site_filters_component","site_filters_component_default","SiteFiltersController","clearFilters","site_filters_site_filters_component","users_list_view","users_list_view_default","Column","_args$field","selectable","_fields","boColor","render","sortKey","itemA","itemB","valueA","valueB","_value","rx","UsersListViewController","columnsDef","pagedList","pageNum","filteredList","col","sortList","users_list_view_component","onManageClicked","sites_main","sites_main_default","SiteMaineController","sites_main_component","sites_list","sites_list_default","SiteListController","defineTableProp","sites","filteredSites","goToView","hasFullControl","getSites","manageView","sites_list_component","site_view","site_view_default","commonColumnDef","valA","valB","onSiteStatusColor","onSiteStatus","ccLikeQtyOnSiteUsagePercent","ccLikeQtyOnSite","lastUsed","usedAt","views_models","overview","inventory","onsite","excludeChart","preDefineFilter","seenIn","usage","lastReportedUsageIn3d","usedIn","SiteViewController","filtersService","viewName","views","ListViews","getFilterByName","ViewPreDefineFilter","getSiteView","connection","registerView","unRegisterView","hideOnSiteChart","hideUsageChart","getFiltersByKeys","updateViews","totalInventory","onSitePercent","usedInPercent","filtersView","getAppliedFiltersView","usageStatus","usageDataLoaded","siteDataLoaded","siteStatus","getLastSeenChartData","lastSeenChartData","getUsageChartData","usageChartData","getSite","site","siteName","getSiteAssetsByIds","updateBindings","filtersKeys","_this$filtersService$","getDefaultFilters","_this$filtersService$2","onFiltersChanged","manage","site_view_component","AssetListViewController","sortCol","asset_list_view_component","site_manage_view","site_manage_view_default","SiteManageViewController","assetCols","assetsPerPage","removedAssets","updateAssetsStatus","siteId","updateProperties","setAssets","handleQueryChange","geoZone","createSite","openAssetSelector","updateSiteAssets","updateSite","update_error","deleteSite","openUsersSelector","finalUsers","updateUsersStatus","updateSiteUsers","site_manage_view_component","tool","accessory","material","storage","attachment","gateway","getTypeValue","cat","catClass","makeModel","UsageService","Usage_DataPointS","assetsUsageSeries","_ser$last","_ser$last2","_ser$last3","_ser$last4","_ser$last5","usageSeries","changedAt","usedAtInDays","getDaysNumberFromToday","lastReportedInDays","assetHasUsageDataPoints","num","assetsUsage","serObj","_series$last","_series$last2","_series$last3","_serObj$series","lastUsage","lastUsageAt","yesterday","14d","28d","confirm_modal_confirm_modal","components_confirm_modal_confirm_modal_default","ConfirmModal","confirmLabel","confirmClass","onConfirm","SiteService","usageService","reduxStore","seenIn3d","seenIn7d","seenIn14d","notSeenIn14d","offSite","usedIn3d","notUsedIn3d","notUsedIn7d","notUsedIn14d","onSiteStatusMap","LikelyOnSite","assetsIndexer","onei3:feature","creationDate","clearData","isPointInsideGaPolygon","getSeenInKey","lastSeenInDays","_this4$getOnsiteStatu","getOnsiteStatus","getOnsitePercent","getAssetUsageSeriesData","_ref4$data","getPolygon","_this5$getOnsiteStatu","xi","yi","xj","yj","getAssetSeries","getUsageSeriesForAssets","MAX_VALUE","usageInDays","getUsedInInKey","getUsedInPercent","updateAssetsWithLikeQtyData","aggregateDataPerPeriod","preDefinedFilter","filterAssets","onSiteTotal","toPrecision","seenInDays","assetsRet","csvHeader","headersKeyArray","usedInTotal","assetWithQty","calculateLikeQtyOnsite","_assetWithQty$assetId","qty","qtyPercent","catClassOnsite","catClassOnsiteUsedIn7days","assetsWithLikeQty","assetsOnSitQty","usedQtyPercent","attrF","attrG","newSec","assetsResources","userPrefix","usersResources","createNewSec","addedIds","removedIds","addedAssetsResources","removedAssetsResources","_this15","idsIndex","_this16","confirmTemplate","ConfirmDelete","appliedUsers","finalSelection","alreadyAdded","uid","addedUsersResources","removedUsersResources","FiltersService","filtersConfig","getDescription","filterNames","filterIndex","cur","siteModule","componentModules","SiteRouteConfig","tableComponent","mapComponent","ChartComponent","appliedFiltersViewComponent","SearchInputComponent","SiteFiltersComponent","UsersListView","sitesMainComponent","sitesListComponent","siteViewComponent","assetListViewComponent","siteManageViewComponent","equipment_update_modal","equipment_update_modal_default","EquipmentUpdateModal","EquipmentUpdateService","modelTemplate","modalController","normalizedAttrsObject","normalizeKey","originalVal","originalAttrs","readonlyList","_ref2$allAttr","allAttr","_ref2$attrsWithoutRea","attrsWithoutReadonly","_ref2$keyedAttrs","keyedAttrs","_attributes$secured","isSecuredLoaded","getAttributesFromStore","indexAttributes","KeyboardKeysService","$document","_ref$elem","onCtrlS","onCtrlZ","onKeyDown","unbind","_event$key","is_SKey","is_ZKey","ctrlDown","s_equipment_update","s_equipment_update_default","EquipmentUpdateController","protectedAttrs","initDataNeeded","refreshEdit","readonlyAttributesLoaded","availableTags","parsedTag","parsedTagIndex","parsedTagValue","parsedTagId","availableTag","parsedTagValueRecord","parsedDate","normalizedKey","attrValue","valueRecord","getDateTime","onCancel","detailForm","equipToSubmit","refreshDetails","onUpdated","gtmData","s_equipment_update_component","b_equipment_update","b_equipment_update_default","BulkEquipmentUpdateController","keyboardKeysService","selectedCols","changesState","lastChanges","getAttributes","undoLastChange","allAttrs","attributesList","attributesMap","getEditAssetsAttrsModel","unSet","addLastChange","tableErrors","updateAssetsAttrs","showSuccess","timeMessage","er","showError","changeKey","lastChange","_lastChange$split","_lastChange$split2","invalid","b_equipment_update_component","ColumnsToggleController","_item$key","columns_toggle_component","attr_edit","attr_edit_default","ToNumber","fVal","AttrEditController","emptyValue","onSubmit","elmType","_this$attrValue","_this$attr","_ref$min","_ref$max","inputMin","inputMax","_v$value","normalizeV","selectModel","inputPattern","attr_edit_component","EquipmentUpdateModule","SEquipmentUpdateComponent","bEquipmentUpdateComponent","columnsToggleComponent","attrEditComponent","conversionService","mathUnitDictionary","displayUnitDictionaty","degc","degf","mi/h","getDictionary","ConversionUtility","CONVERSIONTABLE_METRIC_TO_STANDARD","CONVERSIONTABLE_STANDARD_TO_METRIC","convertReportHeader","convertValue","setPreference","preference","returnModel","dictionary","cleanValue","cleanUom","getValues","uomValues","UtilitySevice","isValidDate","dateStr","getDateDifference","authService","getRefreshToken","async","setToken","setRefreshToken","refreshToken","AuthInterceptor","request","configPromise","requestError","rejection","responseError","usertimezone","utcOffset","dateformat","timezone_service_TimezoneService","date_range","date_range_default","DateRangeDirective","onUpdateOption","DateRangeController","checkIfSameTime","selectPreset","endTimeChanged","startTimeChanged","$root","EquipmentDetailsController","EquipmentDetailsComponent","LAST_SEEN_KEY","EquipmentFacetFiltersDirective","EquipmentFacetFiltersController","showMobile","onLoaded","onApplyClicked","onClearClicked","openclose","filterModels","onUpdateCommunicatedAt","triggerSearch","OnUpdateLastSeenFilter","lastSeenfilter","reservedKeys","updateFilterCount","_vm$filterModels","toFilter","refreshTagModels","tempMin","tempMax","_state$user$dateForma","dateTimeformat","toggleFacets","facetValue","updatedScope","tempFacets","tempFacet","_updatedBy","_response$data$data","maxStart","minStart","maxEnd","minEnd","applyTags","blurOnSelect","showIfHidden","rangeValid","rangeDefined","datetimeRangeValid","displayValue","output","alertPriority","isNotSelected","tagsValid","validInteger","validDecimal","tagDate","globalEventTag","hasTagsSelected","anyTagsApplied","is_globel_with_no_tagsFiters_changes","loadSavedFilters","selectedFilterModels","securityGroupIds","attrValueList","filtersCollection","selectedTagFilters","selectedTagFilter","lastCommKey","lastSeenKey","saveFiltersAs","EquipmentFiltersSummaryDirective","EquipmentFiltersSummaryController","numFilters","deselectFacets","deselectTags","tagsLength","selectedFacets","attrOutput","EquipmentImagesDeleteModalController","equipment_images_modal_controller_excluded","EquipmentImagesModalController","photoSwipeService","checkProfileImage","currIndex","gallery","getCurrentIndex","initialPosition","pswpElement","querySelectorAll","listen","img","Image","onload","updateSize","goTo","invalidateCurrItems","setAsDefault","imageObj","PollButtonDirective","PollController","canPoll","pollEquipmentData","buttonTitle","EquipmentFiltersDirective","EquipmentFiltersController","assetPicker","maintenanceOptions","alertPriorities","priorities","showclearFilters","EquipmentFullFiltersDirective","EquipmentFullFiltersController","applyButtonPressed","overdue","clearButtonPressed","file_download","file_download_default","FaultCsvController","getTimeRange","fileDownload","csvDownloaded","FaultCsvComponent","EquipmentController","timerColour","timerBgColour","totalTime","timeElapsed","lastUpdated","timerPause","previousSearchURL","isAssetSearchVisible","getLostEquipmentBySearchParam","searchParam","parseurl","nlat","slat","nlng","slng","pair","evalFunc","forceMapRefresh","equipment_detail_edit_controller","equipment_detail_edit_controller_default","EquipmentDetailEditController","dateFormatMoment","EquipmentDetailEditComponent","EquipmentRouteConfig","displayCharts","EquipmentSearchFactory","params_tags","storedTag","refreshFilterCount","getQueryString","getSearchOptions","ready","setResponseData","isSearchLoading","isMoreLoading","facetsToLoad","SaveFiltersConfirmModalController","savedFilterService","savedFiltersModels","updateExistingFilter","SaveFiltersModalController","buildPayload","fs","fa","fm","savedFiltersKeys","tf","Values","savedFiltersModelByPage","selectedSavedFilterId","filteredSavedFilters","isPaging","savedFiltersPage","showPaging","hidePaging","displaySavedFiltersByPage","updateFiltersList","getSavedFilters","saveFiltersForm","createSavedFilter","submitSavedFilters","patchSavedFilters","saveAsExistingFilter","nameExistError","SavedFiltersDeleteModalController","deleteFilter","SavedFiltersModalController","editSavedFilter","conflictErrorFlag","orderSavedFilter","savedFilterModel","filterDebouncer","editSavedFilterForm","disabledOnEdit","SecurityGroupsFilterDirective","SecurityGroupsFilterController","EquipmentDetailsService","findIncludedType","filterIncludedType","getSeriesEntities","visibleSeriesForUser","matchingDisplayItem","keyMetric","getDetails","attrTable","_indexBy","equipmentAttributes","details","detail","onei3Series","visibleAlerts","dtcFaultDescriptor","ToggleHelpNavDirective","AppController","appNotificationsService","delay","initialLoader","Element","removeLoadingScreenAfterDelay","master","identifyEvent","Identify","setOnce","setUserId","identify","org","_user$datapointDescri","descriptorsByKey","brandLogo","logoUrl","mobileUrl","cornerIcon","mapRequired","mapAccessible","route","navItems","openNotificationModal","_activeNotification","updatedAccepted","IndexRouteConfig","AppSettingsService","_$ngRedux$getState$us","appModule","equipmentESNModule","SitesModules","equipmentUpdateModule","app_module","AngularAppModule","constant","bowser","commentDirectivesEnabled","cssClassDirectivesEnabled","$qProvider","errorOnUnhandledRejections","$httpProvider","defaults","common","Cache-Control","Pragma","interceptors","getUrl","content-type","bootstrap","HttpSubscriber","_Subscriber","observer","requestConfiguration","requestId","axios","Subscriber","Http","requestOptions","observable","susbcribe","raw","initializeApp","action$","sources","catchError","throwError","ofType","concatMap","forkJoin","_storage$user","_user$account","initialDescriptors","Store","loadFromStorage","of","redirectUrl","AfterAppInitialized","state$","mergeMap","logAppErrorsThenRedirect","finalize","removeLoadingScreen","insertAdjacentHTML","errorTemplate","REQUEST_TABLEAU_REPORTS_SUCCESS","REQUEST_TABLEAU_REPORTS_FAILED","CREATE_TABLEAU_USER_SUCCESS","CREATE_TABLEAU_USER_FAILED","REQUEST_TRUSTED_TICKET_SUCCESS","REQUEST_TRUSTED_TICKET_FAILED","createTableauUserSuccess","requestTableauReports","ReportsActions","BaseTableauProxyUrl","reportsList","createTableauUser","securityContext","context","CreateSubAccount","accessMode","flatMap","UpdateSubAccount","GetAccount","UpdateInheritedRoles","GetAccountRoles","RequestUser","AfterRequestUserSuccess","requiredActions","landingPage","RequestUserAccounts","effectiveAccessMode","masterAcc","accessible","linkedAcc","flattenAccounts","memberShips","_currentAccount$attrs","genieProviderId","genieParentId","RetrieveDataPointsDescriptors","exhaustMap","mapToSetAttributes","TableColumns","mapToSetSecurityGroups","mapToSetSetColumnVisibility","store$","mapSearchToAddHistoryActions","mapToUpdateHistoryActions","FavouritesActions","mapToSearchRequested","actionTypes","Search","mapToUpdatePrerequisitesTOMakeNewSearch","newSearch","resetSelectedAssets","mapToUpdatePrerequisitesToRefreshSearch","REDUX_STORAGE_LOAD","mapToSearchUpdated","mapToSearchBegin","buildFetchAssetsObject","finalQuery","sortStringArray","assetQuery","searchBegin","exportSearch","FAV_URL","restore","mapToSearchPrerequisitesToGetMore","attrSources","Attributes","toFullAttribute","readonlyAttr","word","attributeResponse","attributeSecurity","attrSecurityRules","readonlyAsAttrs","TransferStatusEnum","TRANSFERRING","FAILED","PART_FAILED","AssetTransfer","updateStatus","getTransferringStatus","GetAccountTransferKeys","InitiateAssetTransfer","TransferAssets","transferResource","AfterTransferAssets","_store$$value","_assets$selections","successTransferAssetsIds","newSelections","cssClass","keyStatusMap","no_alerts","no_maintenance","StatusSummary","statusKey","setStatus","AssetModel","canPollData","showLocation","defaultChartedseriesIds","maintenanceStatus","hasCommandsToDisplay","DateRange","AssetDetailsState","chartLoading","valuesLoading","RUN_HOURS_DATAPOINTS","EXCLUDED_COMMANDS","AssetModelHelper","assetModel","includedTypes","_apiModel$included","_apiModel$data","_data$attributes","_data$relationships","_attributes$attrs","_attributes$coords","_relationships$datapo","_relationships$device","_relationships$profil","_user$visibleDatapoin","userVisibleDatapointIds","normalizedAttrs","flattenIncluded","flattenIncludedObjects","getIncludedType","_profileImage$data","imageData","getProfileImg","_this$getIncludedType","_this$getIncludedType2","_this$getIncludedType3","_this$getIncludedType4","_this$getIncludedType5","getSyncRunHours","allMaintenancePlans","_this$getMaintenance","getMaintenance","isPollCommandAvailable","deviceCommand","commandType","includedSeries","orderedSeriesList","applyDataPointDisplay","_this$filterSeries","filterSeries","communicatedIn_30d","getActivFaultsAndApplyDecsriptors","includedAlerts","_this$validateAlertsA","validateAlertsAndApplyDescriptor","_this$validateAlertsA2","validAlerts","alertsStatus","includedAttributes","buildAttrsAsAttributesObject","includedType","profileImageId","userPermissions","foundRunHoursDataPoints","seriesWithoutGps","operatingHours","DateRangeHelper","isDateWithinThirtyDayfromToday","indexOfRunHours","_Object$keys$sort","_Object$keys$sort2$","lowestIndex","runhourindex","alertsList","activeHighAlerts","activeMeduimAlerts","activeLowAlerts","_alert$series","_alert$priority","_alert$state","alertState","datapintId","setFaultDtcDescription","activeAlerts","faultsSeriesList","dueMaintenance","comingMaintenance","_item","_excluded2","activeMaitenance","indexedAttributes","indexed","attribute","returndSeries","seriesInAssetObject","datafor","dataOjectForcurrentSeries","endDateMinFromNow","rangDiffIndays","diffInDays","taskes","includeTask","thereIsMoreTask","includesUri","include","mapToGetSeriesData","seriesDataRequest","SeriesIds","_state$$value$asset_d","dataTasks","_state$asset_details$","getRangeAggregationInterval","chartTask","DataFor","valuesTask","dataTask","ckeckAssetDataIntegrity","_state$$value$asset_d2","validateAssetDataIntegrity","refreshAssetDashBoardData","observableAction","loading_account_error","updating_subaccount_error","create_sub_account_error","initialized","_toPropertyKey","arg","hint","typeof_default","prim","toPrimitive","_tags","tableauReportList","createUserError","requestingTrustedTicket","trustedTicketError","trustedTicket","lodash_es_keys","object_hash","object_hash_default","search_reducer_toPropertyKey","applySelected","hashCollection","immutability_helper","immutability_helper_default","orderable","last_communicated","activated_date","last_seen","bluetooth","device_id","url_prefix","shared_to","shared_from","columns_order","retrieveInProgress","History","getSelected","ls","accountsError","ReducersMap","ReportActions","ticket","create_subaccount_error","searchHash","_keys","createSearchHash","newQuery","newState","reduceFacets","_state$tagFilters","updatedSecurityGroups","existingItem","updateSecurityGroups","newChildren","$set","attrChildren","child","localeCompare","columnSelected","orderdArray","fav","$push","toUpdate","restored","newHistory","addOrUpdateHistory","syncWithFavourites","_payload$claims$data","userTimezone","setDefault","localDateFormat","localeData","longDateFormat","_payload$claims$data$","_payload$data$dateFor","newtransferAssets","updateFromInstallations","notTransferring","_payload$transferKeys","transfer_error","_state$asset","refreshDataNeeded","_state$selectedSeries","updateFromJsonApi","_state$selectedSeries2","_state$selectedSeries3","_state$asset2","_asset2$seriesData","remaindSelected","selectedId","_payload","setByRange","setByOption","_state$selectedSeries4","_state$dataDateRange","_dataDateRange$option","_state$asset$seriesDa","currentSeriesData","addOrUpdateSeriesData","_state$seriesDataStat","allEpics","AppEpics","ReportEpics","AccountsEpics","AssetsEpics","AttributesEpics","FavouriteEpics","HistoryEpics","SearchEpics","SecurityEpics","TableColumnsEpics","UserEpics","TransferEpics","AssetDetailsEpics","epics","RootReducer","combineReducers","RootEpic","_len","_key","epic","combineEpics","HistoryAnalytics","FavouriteAnalytics","_FavouriteAnalytics","hitType","eventCategory","eventAction","eventLabel","SearchAnalytics","_SearchAnalytics","prevState","hasFiltered","totalAssetsFiltered","eventValue","AssetsAnalytics","_AssetsAnalytics","TableColmunsAnalytics","AttributesAnalytics","securityGroupsAnalytics","CombinedWhiteListKeys","CombinedBlackListKeys","StorageEngine","createEngine","errorHandler","state_store","analyticsMiddleware","createAnalyticsMiddleware","analyticsLogger","storageMiddleware","epicMiddleware","createEpicMiddleware","catchMiddleware","middleware","thunk","composeEnhancers","compose","finalRootReducer","createStore","applyMiddleware","dist","dist_default","css_vars_ponyfill_esm","esm","app_arrayLikeToArray","axiosCancel","cssVars","userIsLoggedIn","loadBranding","configureAxios","configureAmplitude","use","defaultTracking","head","randomVersion","favicon","rel","brandCSSLink","webPortalCSSLink","mobileLink","brandLogoUrl","onei3CornerIcon","checkLocalStorageHack"],"mappings":"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","file":"main.ced2502d9786e36d52bf.js","sourcesContent":["module.exports = moment;","module.exports = angular;","/**\r\n * This Function will be used as a marker for gulp-angular-gettext to extract the string to the pot file\r\n * @param {*} str string that need to be translated\r\n */\r\n\r\nexport const gettext = str => str;\r\n","import { gettext } from './state/gettext-extract-util';\r\nclass AppSettings {\r\n constructor() {\r\n this.environment = process.env.NODE_ENV;\r\n this.environments = {\r\n local: 'local',\r\n staging: 'staging',\r\n production: 'production',\r\n };\r\n\r\n const icebergUrl = process.env.ICEBERG_BASE_URL;\r\n const tugApiUrl = process.env.TUGAPI_BASE_URL;\r\n const reportingApiUrl = process.env.REPORTING_API_URL;\r\n\r\n this.BaseTugApiUrl = tugApiUrl;\r\n this.BaseIcebergUrl = icebergUrl;\r\n this.RepotingApiUrl = reportingApiUrl;\r\n\r\n this.IcebergApiUserInfoEndpoint = `${icebergUrl}/2561`;\r\n this.IcebergApiTransfersEndpoint = `${icebergUrl}/2049`;\r\n this.IcebergApiAttributesEndpoint = `${icebergUrl}/4393`;\r\n this.IcebergApiPackagesEndpoint = `${icebergUrl}/1281`;\r\n this.IcebergApiInstallationsEndpoint = `${icebergUrl}/769`;\r\n this.IcebergApiEquipmentEndpoint = `${icebergUrl}/513`;\r\n this.IcebergApiDevicesEndpoint = `${icebergUrl}/257`;\r\n this.IcebergApiDatapointsEndpoint = `${icebergUrl}/1281`;\r\n this.IcebergApiCommandsEndpoint = `${icebergUrl}/2561`;\r\n this.IcebergApiTimeSeries = `${icebergUrl}/1537`;\r\n\r\n // GTM REMOVE\r\n // this.GoogleAnalyticsKey = process.env.GOOGLE_ANALYTICS_KEY;\r\n this.AmplitudeAPIKEY = process.env.AMPLITUDE_API_KEY;\r\n\r\n this.VikingEndpoint = process.env.VIKING_ENDPOINT;\r\n this.BrandingImageUrl = process.env.BRANDING_CDN_IMG_URL;\r\n this.BrandingFileUrl = process.env.BRANDING_CDN_FILE_URL;\r\n\r\n this.MobileIconSizes = [144, 114, 72, 57, 45];\r\n\r\n this.SupportedLanguages = [\r\n { option: 'en', des: 'English' },\r\n { option: 'de', des: 'Deutsch' },\r\n { option: 'fr', des: 'Français' },\r\n { option: 'ja', des: '日本語' },\r\n { option: 'nl', des: 'Nederlands' },\r\n { option: 'es', des: 'Español' },\r\n { option: 'it', des: 'Italiano' },\r\n { option: 'pt', des: 'Português' },\r\n ];\r\n\r\n this.LandingPages = [\r\n {\r\n id: 'map',\r\n description: gettext('Map'),\r\n state: 'map.equipment',\r\n },\r\n {\r\n id: 'assets',\r\n description: gettext('Asset List'),\r\n state: 'equipment.list',\r\n },\r\n {\r\n id: 'alerts',\r\n description: gettext('Alerts Dashboard'),\r\n state: 'alerts.dashboard',\r\n },\r\n {\r\n id: 'maintenance',\r\n description: gettext('Maintenance Dashboard'),\r\n state: 'maintenance.board',\r\n },\r\n ];\r\n }\r\n}\r\n\r\nexport default new AppSettings();\r\n","import Oidc from 'oidc-client';\r\nimport URL from 'url-parse';\r\nimport Clients from './clients';\r\nimport AppSettings from './app.settings';\r\n\r\nclass Auth {\r\n constructor() {\r\n this.url = new URL(window.location.href, true);\r\n\r\n // check localstorage for a hacky token for UR\r\n this.accessToken = localStorage.getItem('one-time-access-token');\r\n\r\n if (this.accessToken !== null) {\r\n localStorage.removeItem('one-time-access-token');\r\n }\r\n\r\n this.baseOptions = {\r\n authority: process.env.AUTH_SERVER_URL,\r\n client_id: null,\r\n redirect_uri: null,\r\n post_logout_redirect_uri: null,\r\n silent_redirect_uri: `${this.url.protocol}//${this.url.host}/home/silentrefresh/`,\r\n automaticSilentRenew: true,\r\n loadUserInfo: false,\r\n response_type: 'id_token token',\r\n scope: 'openid profile email core tenant_metadata',\r\n };\r\n\r\n this.options = {};\r\n }\r\n\r\n getUrl() {\r\n return this.url;\r\n }\r\n\r\n hasAccessToken() {\r\n return this.accessToken !== null;\r\n }\r\n\r\n checkForcedLogout() {\r\n if (this.url.query.hasOwnProperty('forcelogout') && this.url.query.forcelogout === 'true') {\r\n this.manager.removeUser();\r\n this.manager.signinRedirect(this.baseOptions);\r\n return true;\r\n }\r\n\r\n if (this.url.pathname.includes('logoff') || this.url.pathname.includes('logout')) {\r\n this.signUserOut();\r\n this.manager.signinRedirect(this.baseOptions);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n async init() {\r\n return new Promise((resolve, reject) => {\r\n // If we already have an access token from the URL, use that instead\r\n if (this.hasAccessToken()) {\r\n localStorage.setItem('portal-bypass', true);\r\n reject();\r\n return;\r\n }\r\n\r\n /**\r\n * At some point we're going to have to account for other\r\n * subdomains and change the clientid based on them\r\n */\r\n if (this.url.query.hasOwnProperty('otp')) {\r\n this.baseOptions.acr_values = `otp:${this.url.query.otp}`;\r\n this.baseOptions.prompt = 'login';\r\n }\r\n\r\n this.manager = this.initializeManager();\r\n\r\n if (this.url.query.hasOwnProperty('otp')) {\r\n this.manager.removeUser();\r\n this.manager.signinRedirect(this.baseOptions);\r\n return;\r\n }\r\n\r\n if (this.checkForcedLogout()) {\r\n return;\r\n }\r\n\r\n this.manager.events.addSilentRenewError(() => {\r\n this.startAuthentication();\r\n });\r\n\r\n this.manager.events.addUserLoaded((user) => {\r\n this.user = user;\r\n });\r\n\r\n if (process.env.NODE_ENV !== AppSettings.environments.production) {\r\n Oidc.Log.logger = console;\r\n }\r\n\r\n resolve();\r\n });\r\n }\r\n\r\n initializeManager() {\r\n const client = this.detectClient();\r\n\r\n this.options = {\r\n ...this.baseOptions,\r\n ...client,\r\n };\r\n\r\n return new Oidc.UserManager(this.options);\r\n }\r\n\r\n detectClient() {\r\n return Clients.load(this.url.host);\r\n }\r\n\r\n switchAccount(accountId) {\r\n this.options.acr_values = `tenant:${accountId}`;\r\n this.options.prompt = 'login';\r\n\r\n this.manager.removeUser();\r\n this.manager.signinRedirect(this.options);\r\n }\r\n\r\n async userIsLoggedIn() {\r\n try {\r\n await this.manager.signinRedirectCallback();\r\n } catch (error) {\r\n // noop\r\n }\r\n\r\n this.user = await this.manager.getUser();\r\n return new Promise((resolve) => {\r\n if (this.user != null && !this.user.expired) {\r\n return resolve(this.user);\r\n }\r\n\r\n return resolve(null);\r\n });\r\n }\r\n\r\n signUserOut() {\r\n this.manager.signoutRedirect();\r\n }\r\n\r\n getClaims() {\r\n if (!this.user) {\r\n return false;\r\n }\r\n\r\n return this.user.profile;\r\n }\r\n\r\n setUser(user) {\r\n this.user = user;\r\n }\r\n\r\n getBrandClaim() {\r\n return this.user.profile && this.user.profile['tenant:brand']\r\n ? this.user.profile['tenant:brand']\r\n : null;\r\n }\r\n\r\n getAuthorizationHeader() {\r\n if (this.hasAccessToken()) {\r\n return `Bearer ${this.accessToken}`;\r\n }\r\n\r\n return `${this.user.token_type} ${this.user.access_token}`;\r\n }\r\n\r\n startAuthentication() {\r\n // https://stackoverflow.com/questions/36953762/identity-server-3-mvc-client-state-parameter\r\n localStorage.setItem('sign-in-redirect-uri', window.location.href);\r\n return this.manager.signinRedirect();\r\n }\r\n\r\n getExpiry() {\r\n const token = this.accessToken || this.user.access_token;\r\n const { exp } = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());\r\n return exp;\r\n }\r\n}\r\n\r\nexport default new Auth();\r\n","module.exports = \"
\\r\\n
\\r\\n \\r\\n

{{(modalTitle || 'Select Assets') | translate}}

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n NameModel
\\r\\n \\r\\n {{asset.name}}\\r\\n
\\r\\n {{asset.attrs.make}} {{asset.attrs.model}}\\r\\n
\\r\\n
\\r\\n
No assets found
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
0\\\">{{infoMessage}}
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n At least one asset is required\\r\\n
\\r\\n
\\r\\n\\r\\n
\";","export const alertStatus = {\r\n\terror: 'error',\r\n\twarning: 'warning',\r\n\tgood: 'good'\r\n};\r\n\r\nclass Condition {\r\n\tconstructor(apicontrolStatusCondition = {}) {\r\n\t\tthis.expression = apicontrolStatusCondition.expression;\r\n\t\tthis.trueMsg = apicontrolStatusCondition.trueMsg;\r\n\t\tthis.falseMsg = apicontrolStatusCondition.falseMsg;\r\n\t}\r\n}\r\n\r\nexport class AlertOption {\r\n\tconstructor(apicontrolStatus = {}) {\r\n\t\t(this.name = apicontrolStatus.name),\r\n\t\t\t(this.datapointIds = apicontrolStatus.datapointIds || []),\r\n\t\t\t(this.class = apicontrolStatus.icon),\r\n\t\t\t(this.errorMsg = apicontrolStatus.errorMsg),\r\n\t\t\t(this.conditions = (apicontrolStatus.conditions || []).map(\r\n\t\t\t\tapicondition => new Condition(apicondition)\r\n\t\t\t));\r\n\t}\r\n\r\n\tgetdatapointseries(equipment = {}, datapointId) {\r\n\t\tlet db, value;\r\n\t\tdb =\r\n\t\t\tequipment.onei3 && equipment.onei3.series\r\n\t\t\t\t? equipment.onei3.series[datapointId]\r\n\t\t\t\t: 'undefined';\r\n\t\tvalue = db && db.last ? db.last.v : 'undefined';\r\n\t\treturn { db, value };\r\n\t}\r\n\r\n\t//function\r\n\tcalcStatus(equipment) {\r\n\t\tlet result = {};\r\n\r\n\t\tconst [dbId0, dbId1] = this.datapointIds;\r\n\r\n\t\tif (this.datapointIds.length === 0) {\r\n\t\t\tresult.status = alertStatus.error;\r\n\t\t\tresult.text = 'No data point specified!';\r\n\t\t\treturn result;\r\n\t\t} else if (this.datapointIds.length === 1) {\r\n\t\t\tvar { db: db0, value: value0 } = this.getdatapointseries(\r\n\t\t\t\tequipment,\r\n\t\t\t\tdbId0\r\n\t\t\t);\r\n\t\t\tvar db1 = true;\r\n\t\t} else {\r\n\t\t\tvar { db: db0, value: value0 } = this.getdatapointseries(\r\n\t\t\t\tequipment,\r\n\t\t\t\tdbId0\r\n\t\t\t);\r\n\t\t\tvar { db: db1, value: value1 } = this.getdatapointseries(\r\n\t\t\t\tequipment,\r\n\t\t\t\tdbId1\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (db0 && db1) {\r\n\t\t\tconst [firstcond] = this.conditions;\r\n\t\t\tif (!firstcond) {\r\n\t\t\t\tresult.status = alertStatus.good;\r\n\t\t\t\tresult.text = '';\r\n\t\t\t} else {\r\n\t\t\t\tif (eval(firstcond.expression)) {\r\n\t\t\t\t\tresult.status = alertStatus.good;\r\n\t\t\t\t\tresult.text = firstcond.trueMsg;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult.status = alertStatus.error;\r\n\t\t\t\t\tresult.text = firstcond.falseMsg;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tresult.status = alertStatus.error;\r\n\t\t\tresult.text = this.errorMsg;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n}\r\n","module.exports = \"
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n

Error

\\r\\n
\\r\\n There was an unexpected error. Please refresh the page and if the problem persists, contact support.\\r\\n

\\r\\n click here to try logging in again, or contact your administrator for support.\\r\\n

\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\";","module.exports = \"
\\r\\n
\\r\\n
Are you sure you want to delete
\\r\\n
\\r\\n {{tkey}}\\r\\n
\\r\\n
\\r\\n
\\r\\n

By deleting this attribute you will be unable to perform searches using it. Any assets with this attribute will retain it.

\\r\\n {{errorText}}\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\";","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.wellknown = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\\r\\n\\r\\n
\\r\\n \\r\\n

{{modalTitlee || ('Selecting users' | translate)}}

\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n Name\\r\\n \\r\\n Email\\r\\n
\\r\\n \\r\\n \\r\\n {{user.name}}\\r\\n \\r\\n
\\r\\n {{user.email}}\\r\\n
\\r\\n
\\r\\n No Users Found\\r\\n
\\r\\n \\r\\n
= 1\\\">\\r\\n
    \\r\\n\\r\\n
    \\r\\n
    \\r\\n\\r\\n
    \\r\\n\\r\\n
    \\r\\n \\r\\n
    \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n 0 \\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
    \\r\\n {{_selectedUsers[user].name}}\\r\\n \\r\\n \\r\\n\\r\\n
    \\r\\n\\r\\n No Users Selected\\r\\n
    \\r\\n
    \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n\";","module.exports = \"\\r\\n
      \\r\\n
      \\r\\n \\r\\n

      Create Scheduled Delivery

      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n

      \\r\\n {{vm.asset.name}}\\r\\n

      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{vm.asset.make}} {{vm.asset.model}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n ESN:\\r\\n {{vm.asset.esn}}\\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n Network:\\r\\n Bluetooth\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n {{vm.runHours.title | translate}}\\r\\n {{vm.runHours.last.v | attrsValueTranslate:vm.runHours }}\\r\\n Unavailable\\r\\n
      \\r\\n
      \\r\\n {{'Run Hours' | translate}}\\r\\n Unavailable\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n Last Communicated\\r\\n \\r\\n {{ vm.asset.communicatedAt |TableDateFilter}}\\r\\n Unavailable\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n Alerts\\r\\n {{vm.asset.alertStatus.label | translate}}\\r\\n {{total}} Alerts\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n Maintenance\\r\\n {{vm.asset.maintenanceStatus.label |translate}}\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n Error while getting asset data. Please try again.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n\\r\\n \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n

      View Images

      \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{errorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n

      Installation Notes

      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n {{installation.equipment.name}}\\r\\n

      \\r\\n \\r\\n Activation Date: \\r\\n \\r\\n {{installation.createdAt | TableDateFilter }}\\r\\n \\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{ note.enteredBy }}\\r\\n \\r\\n \\r\\n \\r\\n {{ note.updatedAt | TableDateFilter}}\\r\\n \\r\\n \\r\\n {{ note.enteredAt | TableDateFilter}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n {{note.text}}\\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{errorText}}\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{onLoadErrorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n All fields with * are required\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      {{errorText}}

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\";","module.exports = \"
      \\r\\n
      \\r\\n
      Are you sure you want to delete {{text}}?
      \\r\\n
      \\r\\n {{errorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"\\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n

      Notes

      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n {{alert.name}}\\r\\n

      \\r\\n \\r\\n Time Active: \\r\\n \\r\\n {{alert.timestamp | TableDateFilter }}\\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{note.enteredBy}}\\r\\n \\r\\n \\r\\n \\r\\n {{ note.updatedAt | TableDateFilter}}\\r\\n \\r\\n \\r\\n {{ note.enteredAt | TableDateFilter}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n {{note.text}}\\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{errorText}}\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{onLoadErrorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n

      Maintenance Planner

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      Calculate the next maintenance starting from this date.
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      Calculate the next maintenance from historical maintenance.
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n Name\\r\\n Date\\r\\n Odometer\\r\\n Run Hours\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n {{ addedAsset.asset.name }}\\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{errorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n Make a selection before confirming.\\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n Please note it can take up to 30 minutes for any changes to take effect\\r\\n

      \\r\\n
      \\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n {{errorText}}\\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n {{vm.onLoadErrorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n Asset name is required\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Invalid value.\\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      0\\\">\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n\\r\\n \\r\\n
      \\r\\n {{vm.errorText}}\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"\";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
        \\r\\n
      • \\r\\n
        \\r\\n
      • \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{vm.invalidStartMessage}}\\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
        \\r\\n
      • \\r\\n \\r\\n
      • \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{vm.invalidEndMessage}}\\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      {{vm.help}}
      \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n\\r\\n\";","module.exports = \"
      \\r\\n\\r\\n
      \\r\\n \\r\\n\\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
        \\r\\n
      • \\r\\n \\r\\n {{item.key}}\\r\\n
      • \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n\";","module.exports = \"\\r\\n\\r\\n
      \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n
      \\r\\n
      Name
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n {{bvm.attributesMap[key].key | translate}}\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n {{asset.name}}\\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n Select Assets\\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n
      Total: {{total}}
      \\r\\n
      Please fix all errors ({{num}})
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n\\r\\n\\r\\n
      \\r\\n \\r\\n Saved Successfully\\r\\n Failed to save, please try again\\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n\";","module.exports = \"
      \\r\\n \\r\\n \\r\\n {{vm.onLoadErrorText}}\\r\\n\\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n Asset name is required\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Invalid value.\\r\\n
      \\r\\n
      \\r\\n

      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

      \\r\\n
      \\r\\n Invalid value.\\r\\n
      \\r\\n Please enter a value.\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      0\\\">\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n {{vm.errorText}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n

      Update Asset

      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      {{modalVM.title}}
      \\r\\n
      \\r\\n

      {{message}}

      \\r\\n
      \\r\\n
      \\r\\n
      {{modalVM.message}}
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n Create New Site\\r\\n Manage Site\\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n
      \\r\\n
      {{siteMVm.site.name}}
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{siteMVm.site.description}}
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n Site name is required\\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n {{siteMVm.update_error}}\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n\\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n\\r\\n
      \\r\\n 0\\\" ng-model=\\\"siteMVm.query\\\"\\r\\n on-change=\\\"siteMVm.handleQueryChange()\\\" on-trigger=\\\"siteMVm.handleQueryChange()\\\"\\r\\n place-holder=\\\"{{'Search Assets'| translate}}\\\">\\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n Error updating site assets\\r\\n \\r\\n
      \\r\\n\\r\\n 0\\\" assets=\\\"siteMVm.filteredAssets\\\" columns-def=\\\"siteMVm.assetCols\\\" items-per-page=\\\"siteMVm.assetsPerPage\\\" search-string=\\\"siteMVm.query\\\">\\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n Error updating site users\\r\\n \\r\\n
      \\r\\n\\r\\n 0\\\" \\r\\n users=\\\"siteMVm.users\\\"\\r\\n items-per-page=\\\"5\\\";\\r\\n on-manage-clicked=\\\"siteMVm.openUsersSelector()\\\">\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n {{siteMVm.error}}\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
      \";","module.exports = \"
      \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
      \";","module.exports = \"
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n Error loading site data.\\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      {{siteVm.total}}
      \\r\\n
      {{siteVm.onSitePercent}}%
      \\r\\n
      {{siteVm.usedInPercent}}%
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n No assets Found\\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n\\r\\n\";","module.exports = \"
      \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n Total:\\r\\n {{vm.filteredSites.length}}\\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n No sites found for your current search.\\r\\n No sites found.\\r\\n \\r\\n \\r\\n Error occurred while retrieving sites.\\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n\\r\\n\";","module.exports = \"\\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n\\r\\n
      \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
      \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
      \";","module.exports = \"
      \\r\\n \\r\\n\\r\\n
      \\r\\n
      {{filter.label}}
      \\r\\n\\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n {{$select.selected.desc}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n Clear All\\r\\n
      \\r\\n
      \\r\\n {{filter.getDescription()}}\\r\\n \\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"\\r\\n\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n ({{item.value}})\\r\\n {{item.title}}\\r\\n
      \\r\\n
      \\r\\n\";","module.exports = \"
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Equipment
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Tool
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Storage
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Accessory
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Attachment
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Material
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      Gateway
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \";","module.exports = \"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n {{column.title | translate}}\\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
      1}\\\">\\r\\n \\r\\n
      \\r\\n
      \\r\\n
      1}\\\">\\r\\n \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n
      \\r\\n

      Device Details

      \\r\\n
        \\r\\n
      • \\r\\n \\r\\n {{deviceVm.packagesText || ('Unavailable' | translate)}}\\r\\n
      • \\r\\n
      • \\r\\n \\r\\n {{deviceVm.deviceAttrs.firmwareVer || ('Unavailable' | translate) }}\\r\\n
      • \\r\\n
      • \\r\\n \\r\\n {{deviceVm.deviceAttrs.configVer || ('Unavailable' | translate) }}\\r\\n
      • \\r\\n
      • \\r\\n \\r\\n {{deviceVm.cellSignal.status | translate}} \\r\\n \\r\\n \\r\\n
      • \\r\\n
      • \\r\\n \\r\\n {{deviceVm.gpsSignal.status | translate}} \\r\\n \\r\\n \\r\\n
      • \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \";","module.exports = \"
      \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n

      No maintenance found for this asset.

      \\r\\n
      \\r\\n\\r\\n
      \\r\\n
      \\r\\n Upcoming/Due Maintenance\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
      \\r\\n Plan\\r\\n \\r\\n Status\\r\\n \\r\\n Last Serviced\\r\\n \\r\\n Next Service\\r\\n
      \\r\\n \\r\\n {{s.name}}\\r\\n \\r\\n {{s.name}}\\r\\n is {{s.status.description | translate}}\\r\\n \\r\\n
      \\r\\n {{s.lastService.date | TableDateFilter}}\\r\\n or {{hour}} runhours\\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{s.nextService.date | TableDateFilter }}\\r\\n or {{hour}} runhours\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n \\r\\n {{s.name}}\\r\\n \\r\\n \\r\\n {{s.name}}\\r\\n \\r\\n \\r\\n {{s.status.description | translate}}\\r\\n \\r\\n {{s.lastService.date | TableDateFilter }}\\r\\n at {{hour}} run hours\\r\\n \\r\\n {{s.nextService.date | TableDateFilter }}\\r\\n or {{hour}} run hours\\r\\n \\r\\n {{hour}} run hours\\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n \\r\\n
        \\r\\n
        \\r\\n\\r\\n
        \\r\\n
        \\r\\n\\r\\n\\r\\n
        0 && !maintnanceVm.refreshing\\\">\\r\\n
        \\r\\n Past Maintenance\\r\\n
        \\r\\n
        \\r\\n
        \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
        \\r\\n Plan\\r\\n \\r\\n Status\\r\\n \\r\\n Completed At\\r\\n
        \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n Plan\\r\\n \\r\\n {{h.plan.name}}\\r\\n \\r\\n \\r\\n {{h.plan.name}}\\r\\n \\r\\n is {{h.completed |translate}}\\r\\n
        \\r\\n
        \\r\\n
        \\r\\n \\r\\n \\r\\n \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n \\r\\n {{h.plan.name}}\\r\\n \\r\\n \\r\\n {{h.plan.name}}\\r\\n \\r\\n \\r\\n {{h.completed |translate}}\\r\\n \\r\\n {{h.completedAt | TableDateFilter}}\\r\\n \\r\\n \\r\\n View Details\\r\\n \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n
        \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n

          {{maintnanceVm.error |translate}}

          \\r\\n
          \\r\\n\\r\\n
          \\r\\n\\r\\n \\r\\n
          \\r\\n
          \";","module.exports = \"
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n Active Faults\\r\\n ({{alertVm.asset.faults.length}})\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n {{datapoint.dtcFaultDescriptor.title}}\\r\\n
          \\r\\n \\r\\n {{datapoint.title}}\\r\\n \\r\\n
          {{datapoint.last.t | TableDateFilter}}
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n \\r\\n No active faults.\\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n\";","module.exports = \"\\r\\n
          \\r\\n
          \\r\\n \\r\\n

          Pin an Asset Location

          \\r\\n
          \\r\\n
          \\r\\n

          Warning

          \\r\\n

          Manually setting the asset location will disable automatic location updates for this asset. Once you have pinned an asset to a location, all future GPS coordinates reported by the asset will be ignored.

          \\r\\n

          Are you sure you want to pin the location of this asset?

          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\";","module.exports = \"\\r\\n\\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          Location History
          \\r\\n \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          Asset Location Pinned
          \\r\\n \\r\\n
          \\r\\n
          Pinned Location Details
          \\r\\n \\r\\n \\r\\n
          {{ lcVm.lastGpsSeries.last.t | TableDateFilter }}
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          Last Location
          \\r\\n \\r\\n \\r\\n
          {{ lcVm.lastGpsSeries.last.t | TableDateFilter }}
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n Location History\\r\\n
          \\r\\n \\r\\n\\r\\n
          \\r\\n
          Last Recorded Location
          \\r\\n \\r\\n
          {{ lcVm.lastGpsSeries.last.t | TableDateFilter }}
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          Location History
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n \\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
          \\r\\n Timestamp\\r\\n \\r\\n Latitude\\r\\n \\r\\n Longitude\\r\\n
          {{pos.title + 1}}{{ pos.t | TableDateFilter }}\\r\\n {{pos.v[1]}}\\r\\n \\r\\n {{pos.v[0]}}\\r\\n
          \\r\\n
            \\r\\n
          \\r\\n
          \\r\\n \\r\\n No data available for the selected range\\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n {{lcVm.errorText}}\\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \";","module.exports = \"
          \\r\\n
          \\r\\n \\r\\n

          Upload Image

          \\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n
          \\r\\n Only file types of .jpg or .png are allowed.\\r\\n
          \\r\\n *Maximum image file size is 10 MB.\\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n *Maximum of twenty images per asset\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n\";","module.exports = \"
          \\r\\n
          \\r\\n \\r\\n

          Edit Image

          \\r\\n
          \\r\\n
          \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n {{errorText}}\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n\";","module.exports = \"
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n Asset Details\\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n Sync Run Hours\\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n Images\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n
          \\r\\n
          \\r\\n \\r\\n No images associated with this asset.\\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n
          \\r\\n\\r\\n
          \\r\\n
          {{i.description}}
          \\r\\n
          \\r\\n Created At: {{date}}\\r\\n
          \\r\\n
          \\r\\n Updated At: {{date}}\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n {{detailVm.errorText}}\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\";","module.exports = \"
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n
          \\r\\n
          \\r\\n\\r\\n
          \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
          \\r\\n TIMESTAMP\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n {{dataValue.series.title | translate}}\\r\\n\\r\\n \\r\\n ({{dataValue.series.attrs.uom}})\\r\\n \\r\\n
          \\r\\n {{ datetime | TableDateFilter }}\\r\\n\\r\\n \\r\\n {{datavalue}}\\r\\n {{tableVm.timeValueDict[datetime][dataValue.series.id] | attrsValueTranslate:dataValue.series : true}}\\r\\n
          \\r\\n
          \\r\\n
          \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
          \\r\\n Error loading timeseries data for this asset.\\r\\n
          \\r\\n\\r\\n
          \\r\\n\\r\\n
          \\r\\n
          \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\";","module.exports = \"
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n Error while rendering the chart.\\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n\";","module.exports = \"
            \\r\\n
            \\r\\n

            No data currently available.

            \\r\\n
            \\r\\n \\r\\n\\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n {{entity.title |translate}}\\r\\n
            \\r\\n \\r\\n \\r\\n No Data Available\\r\\n \\r\\n \\r\\n No Data Available\\r\\n \\r\\n \\r\\n {{entity.last.v | attrsValueTranslate:entity }}\\r\\n
            \\r\\n \\r\\n {{ entity.last.t | TableDateFilter }}\\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n

            \\r\\n Timeseries Data\\r\\n

            \\r\\n
            \\r\\n \\r\\n CLOSE\\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n Please select a datapoint on the left in order to see a history of this assets timeseries\\r\\n information\\r\\n .\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n Error loading timeseries data for this asset.\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\\r\\n\";","module.exports = \"
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n \\r\\n

            \\r\\n NOTE: \\r\\n The current {{dtname}} value being configured must include any run hours that have occurred since the meter reading was taken. This will ensure the value being synchronized is correct and accurate.\\r\\n

            \\r\\n

            \\r\\n  CAUTION: \\r\\n Because the previous {{dtname}} value is being overwritten with this new value, any related reports involving {{dtname}} may present some data that looks abnormal due to the potential large value changes over a very short period of time. Similarly, maintenance tasks and schedules that have been configured in the maintenance planner will also be impacted due to the change in {{dtname}}.\\r\\n

            \\r\\n

            Are you sure you wish to sync the run hours?

            \\r\\n\\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\\r\\n\";","module.exports = \"
            \\r\\n
            \\r\\n

            Sync Run Hours

            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n {{vm.notcommStatus.message | translate}}\\r\\n
            {{vm.notcommStatus.info | translate}}
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            Currently Unavailable
            \\r\\n
            \\r\\n
            {{vm.runhoursSeries.last.v |attrsValueTranslate:vm.runhoursSeries}}
            \\r\\n
            {{vm.runhoursSeries.last.t | TableDateFilter}}
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n \\r\\n
            \\r\\n Run Hours should be a positive number\\r\\n Too many decimal\\r\\n Number is too big\\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n {{vm.syncStatus.message | translate}}\\r\\n
            {{vm.syncStatus.info | translate}}
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n\\r\\n\";","module.exports = \"
            \\r\\n Please enter a value, or click the 'Any Value' button to match all values\\r\\n Please enter a value less than or equal to {{vm.max}}\\r\\n Please enter a value greater than or equal to {{vm.min}}\\r\\n Please enter only numeric characters\\r\\n Please enter only numeric characters, optionally separated by a single decimal point\\r\\n
            \";","module.exports = \"\\r\\n \\r\\n
            \\r\\n \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n\\r\\n
            \\r\\n
            \";","module.exports = \"
            \\r\\n \\r\\n\\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n Advanced Filters\\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n\\r\\n\\r\\n \\r\\n \\r\\n\";","module.exports = \"
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n\\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
              \\r\\n
            • \\r\\n
              \\r\\n
            • \\r\\n
            \\r\\n
            \\r\\n\\r\\n \\r\\n\\r\\n
            \\r\\n \\r\\n \\r\\n
              \\r\\n
            • \\r\\n \\r\\n
            • \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \";","module.exports = \"
            \\r\\n
            \\r\\n
            \\r\\n {{vm.label}}\\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n \\r\\n
            \";","module.exports = \"
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \";","module.exports = \"\\r\\n \\r\\n \\r\\n\";","module.exports = \"\\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n
            \";","module.exports = \"\\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n
            \";","module.exports = \"\\r\\n
            \\r\\n

            \\r\\n \\r\\n
            \\r\\n\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n Please ensure all highlighted errors have been resolved before applying.\\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \";","module.exports = \"
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n \\r\\n \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n 0 && vm.assets.length > 0\\\"\\r\\n reason=\\\"'M'\\\">\\r\\n No assets selected matching\\r\\n '{{ text }}'.\\r\\n \\r\\n \\r\\n No assets currently selected.\\r\\n \\r\\n
            \\r\\n
            \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
            \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Existing Attributes\\r\\n
            \\r\\n \\r\\n \\r\\n {{ asset.name }}\\r\\n \\r\\n
            \\r\\n
            \\r\\n {{tag.key}}:{{tag.value}}\\r\\n
            \\r\\n
            \\r\\n {{tag.key}}:{{tag.value | urlTextMarkdown}}\\r\\n
            \\r\\n
            \\r\\n {{tag.key}}:{{tag.value|date:'MMMM d, y h:mm:ss a'}}\\r\\n
            \\r\\n
            \\r\\n {{tag.key}}:{{tag.value | date:'longDate'}}\\r\\n
            \\r\\n
            \\r\\n {{tag.key}}:{{tag.value}}\\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            \\r\\n
            = 1\\\">\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n At least one asset is required.\\r\\n \\r\\n\\r\\n
              \\r\\n\\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n Please enter a value.\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n Please enter a value.\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n\\r\\n \\r\\n \\r\\n
              \\r\\n Invalid value.\\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n Invalid value.\\r\\n
              \\r\\n Please enter a value.\\r\\n\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n\\r\\n
              \\r\\n
              0 && (vm.tags | filter:vm.filterSelected).length > 0\\\">\\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n\\r\\n\\r\\n
              \\r\\n \\r\\n At least one attribute is required.\\r\\n \\r\\n\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n {{errorText}}\\r\\n \\r\\n Attributes applied successfully.\\r\\n \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n\\r\\n\\r\\n
              \\r\\n
              \\r\\n\\r\\n
              \\r\\n\\r\\n\";","module.exports = \"
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n \\r\\n Attribute name is required\\r\\n Invalid name.\\r\\n Attribute name already exists\\r\\n Attribute name not allowed\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n\\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n\\r\\n
              \\r\\n \\r\\n
              \\r\\n \\r\\n (max. {{descriptionLength}} characters)\\r\\n Character limit exceeded.\\r\\n\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n \\r\\n
              \\r\\n {{vm.errorText}}\\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n\\r\\n
              \\r\\n
              \\r\\n {{vm.onLoadErrorText}}\\r\\n
              \\r\\n\\r\\n\\r\\n\";","module.exports = \"
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n \\r\\n \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n

              \\r\\n {{vm.tag.key}}\\r\\n

              \\r\\n
              \\r\\n

              {{vm.tag.description}}

              \\r\\n \\r\\n Data Type:\\r\\n \\r\\n {{vm.tag.dataType|translate}}\\r\\n Date & Time\\r\\n
              \\r\\n \\r\\n Value Type:\\r\\n \\r\\n \\r\\n Freeform\\r\\n \\r\\n \\r\\n Predefined\\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n Available Values:\\r\\n \\r\\n
              \\r\\n \\r\\n (no values defined)\\r\\n \\r\\n
              \\r\\n
              \\r\\n \\r\\n
              \\r\\n
              \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n
              \\r\\n
              {{value.value}}
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              \\r\\n
              = 1\\\">\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Minimum\\r\\n {{vm.tag.range.min}}\\r\\n {{vm.tag.range.min | DateFilter}}\\r\\n \\r\\n {{vm.tag.range.min | TableDateFilter}}\\r\\n \\r\\n \\r\\n , \\r\\n \\r\\n Maximum \\r\\n {{vm.tag.range.max}}\\r\\n {{vm.tag.range.max | DateFilter}}\\r\\n {{vm.tag.range.max | TableDateFilter}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{onLoadErrorText}}\\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Revoke Share

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                Are you sure you want to revoke asset?

                \\r\\n

                Revoking a shared asset will disrupt the associated alert configuration within the shared account.

                \\r\\n

                This action is not reversible.

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n

                Looking to edit roles, add users or administrate this account?

                \\r\\n \\r\\n \\r\\n Switch Into\\r\\n {{ vm.account.name}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                Assign Roles ({{num}} assigned)
                \\r\\n

                Assigning roles to a Sub Account allows the Administrator of that Sub Account to place users into the same roles as\\r\\n this parent account has. The roles will not be editable inside of the Sub Account.

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n

                Looks like you don't have any sub accounts!

                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n {{ vm.validationMessage }}\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n 0 ? ('Filter Sub Accounts'|translate) : ('Name Sub Account'|translate) }}\\\"\\r\\n ng-keyup=\\\"vm.updateAccountFilter()\\\" />\\r\\n \\r\\n
                \\r\\n
                  \\r\\n
                • 0 && vm.filteredAccounts.length === 0\\\">\\r\\n

                  \\r\\n No Sub Accounts found:\\r\\n

                  \\r\\n

                  \\\"{{ vm.query }}\\\"

                  \\r\\n

                  \\r\\n \\r\\n Press the + above to create it now.\\r\\n \\r\\n

                  \\r\\n
                • \\r\\n
                • \\r\\n

                  \\r\\n \\r\\n Creating Sub Account...\\r\\n

                  \\r\\n
                • \\r\\n
                • \\r\\n \\r\\n
                • \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n {{vm.label && vm.label !== ' ' ? (vm.label | translate) : vm.label}}\\r\\n
                {{vm.selectedOption}}
                \\r\\n \\r\\n {{vm.isDropdownOpen ? 'arrow_drop_up': 'arrow_drop_down'}}\\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                  \\r\\n
                • \\r\\n {{vm.translateValues ? (option.label | translate) : option.label}}\\r\\n
                • \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n {{vm.inputName | translate}}\\r\\n \\r\\n \\r\\n {{vm.showDropdown ? 'arrow_drop_up' : 'arrow_drop_down'}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                  \\r\\n
                • 0\\\">\\r\\n
                  \\r\\n \\r\\n All\\r\\n
                  \\r\\n
                • \\r\\n
                • \\r\\n
                  \\r\\n \\r\\n {{option.text}}\\r\\n
                  \\r\\n \\r\\n close\\r\\n \\r\\n
                • \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n {{'to' | translate}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n {{'to' | translate}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n

                Delete

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Are you sure you want to delete\\r\\n \\\"{{deletePopupVm.view.name}}\\\" ?\\r\\n Currently this custom view is default.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n
                \\r\\n
                \\r\\n

                Overwrite

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Are you sure you want to overwrite \\r\\n \\r\\n \\\"{{overwritePopupVm.view.name}}\\\" ?\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                {{'Export' | translate}}: CSV

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n {{customView.name}}\\r\\n Initial View\\r\\n Default\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n close\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n close\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n = $ctrl.maxCustomViews\\\">\\r\\n info\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                  \\r\\n \\r\\n
                • CSV
                • \\r\\n
                • PNG
                • \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n Custom view already exists!\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n report\\r\\n
                Something went wrong while getting the analytic report!
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Something went wrong while getting the reports\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n No reports available\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n {{group.groupName | translate}}\\r\\n

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n

                {{report.description | translate}}

                \\r\\n
                \\r\\n
                \\r\\n View\\r\\n \\r\\n View\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n {{group.groupName| translate}}\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n

                {{report.description | translate}}

                \\r\\n
                \\r\\n
                \\r\\n View\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                {{'Select Data Points'|translate}}

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n Datapoint\\r\\n \\r\\n
                \\r\\n \\r\\n = datapointSelectorVm.maxSelection\\\" ng-checked=\\\"datapoint.selected\\\">\\r\\n \\r\\n \\r\\n {{datapoint.title}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n {{hpVm.asset.name}}\\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n {{hpVm.asset.attrs.make}} {{ hpVm.asset.attrs.model}} {{ hpVm.asset.attrs.year}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n Last Communication\\r\\n \\r\\n \\r\\n Unavailable\\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n Network\\r\\n Bluetooth\\r\\n
                \\r\\n\\r\\n
                \";","module.exports = \"
                \\r\\n Back to results\\r\\n Close\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                Unable to fetch asset information. Please contact your administrator
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n {{detailVm.equipmentDetail.name}}\\r\\n \\r\\n \\r\\n {{detailVm.equipmentDetail.name}}\\r\\n \\r\\n

                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n {{detailVm.equipmentDetail.make}} {{ detailVm.equipmentDetail.model}} {{ detailVm.equipmentDetail.year}}\\r\\n

                \\r\\n
                \\r\\n \\r\\n Last Communication:\\r\\n \\r\\n \\r\\n {{ detailVm.equipmentDetail.communicatedAt | TableDateFilter }}\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Network: Bluetooth\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n\\r\\n \\r\\n
                0\\\">\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                {{entity.attributes.title |translate}}
                \\r\\n
                \\r\\n \\r\\n \\r\\n No Data Available\\r\\n \\r\\n \\r\\n No Data Available\\r\\n \\r\\n \\r\\n {{entity.attributes.last.v | attrsValueTranslate:entity }}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n {{ entity.attributes.last.t | TableDateFilter }}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                detailVm.itemDisplayCount\\\">\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Alerts ({{detailVm.equipmentDetail.alerts.length}})

                \\r\\n
                \\r\\n No active alerts found.\\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                {{a.attributes.name}}
                \\r\\n
                {{a.attributes.series.faultDescription}}
                \\r\\n
                {{a.attributes.series.title}}
                \\r\\n \\r\\n \\r\\n {{a.attributes.timestamp | TableDateFilter}}\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Cleared\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                detailVm.itemDisplayCount\\\">\\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                0\\\" requires-features=\\\"['images']\\\">\\r\\n
                \\r\\n\\r\\n

                \\r\\n Images\\r\\n

                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Maintenance ({{detailVm.equipmentDetail.maintenancePlans.length}})

                \\r\\n
                0\\\">\\r\\n \\r\\n No assigned maintenance plans.\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{plan.attributes.name}}\\r\\n \\r\\n \\r\\n \\r\\n (Overdue)\\r\\n \\r\\n \\r\\n (Upcoming)\\r\\n \\r\\n \\r\\n (Up to date)\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{plan.attributes.description}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                detailVm.itemDisplayCount\\\">\\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                0\\\">\\r\\n
                \\r\\n

                \\r\\n Active Faults ({{detailVm.equipmentDetail.faults.length}})

                \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                {{datapoint.dtcFaultDescriptor.title}}
                \\r\\n
                \\r\\n
                \\r\\n {{datapoint.attributes.title}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n {{datapoint.attributes.last.t | TableDateFilter}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                detailVm.itemDisplayCount\\\">\\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Details\\r\\n

                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n

                \\r\\n Device Information\\r\\n

                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                Telematics Serial Number
                \\r\\n
                {{detailVm.equipmentDetail.device.id}}
                \\r\\n
                Device Model
                \\r\\n
                {{detailVm.equipmentDetail.device.attributes.attrs.model}}
                \\r\\n
                Activation Date
                \\r\\n
                {{detailVm.equipmentDetail.installation.attributes.createdAt | TableDateFilter}}
                \\r\\n
                Last Communication
                \\r\\n
                \\r\\n \\r\\n \\r\\n {{detailVm.equipmentDetail.device.attributes.communicatedAt | TableDateFilter}}\\r\\n \\r\\n\\r\\n \\r\\n Unavailable\\r\\n
                \\r\\n\\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                Delete the group?

                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error deleting the group.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n This group cannot be deleted, it contains assets!\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n The group will be permenently deleted!\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                Select Assets
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                Select Operators

                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                Delete the operator?

                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error deleting the operator\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n The operator will be deleted and removed from all assigned assets.\\r\\n

                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                Save the operator without codes?

                \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n The operator will be saved without codes.\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n Error adding the assets\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error removing the assets\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading Assets!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n Selected: {{num}} |\\r\\n Total: {{num}}\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n Error Adding the operators\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error Removing the operators\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading operators data!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n {{num}} Selected | \\r\\n Total: {{num}}\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                {{assetVm.asset.name}}

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Current Session:\\r\\n
                \\r\\n
                {{assetVm.asset.accessSession?('Checked In'|translate):('Checked Out'|translate)}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Operator Name:\\r\\n
                \\r\\n
                {{assetVm.asset.accessOperator}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Keypad Connected:\\r\\n
                \\r\\n
                {{assetVm.asset.keypadStatus?('Yes'|translate):('No'|translate)}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Last:\\r\\n
                \\r\\n
                {{assetVm.asset.accessLast | TableDateFilter}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Model:\\r\\n
                \\r\\n
                {{assetVm.asset.model}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Make:\\r\\n
                \\r\\n
                {{assetVm.asset.make}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Year:\\r\\n
                \\r\\n
                {{assetVm.asset.year}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading Assets!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n No Assets found\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n \\r\\n Selected: {{assetVm.numberSelected() || 0}} |\\r\\n \\r\\n Total: {{num}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Operator Name\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n Group(s)Code TypeNumber of CodesAssigned AssetsCreation DateCompany Name\\r\\n Expiry Date\\r\\n Assignment StatusLast Status Update
                \\r\\n \\r\\n \\r\\n {{operator.name}}\\r\\n \\r\\n
                \\r\\n {{group}}\\r\\n
                \\r\\n
                \\r\\n info\\r\\n {{opsTbVm.util.ArrayToString(operator.codes.types)}}{{operator.codes.total}}{{operator.equipment.total_Assignments}}{{operator.createdAt | TableDateFilter}}{{operator.attrs.company_name}}\\r\\n 30\\\">\\r\\n {{operator.attrs.expiry|DateFilter}}\\r\\n \\r\\n \\r\\n 1 && (operator.expiry_in<30 || operator.expiry_in<30)\\\" translate-params-expiryin=\\\"operator.expiry_in\\\">Expires in {{expiryin}} days\\r\\n Expires today\\r\\n Expires tomorrow\\r\\n Expired\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{opsTbVm.assignmentStatus[operator.status].label |translate}}\\r\\n {{operator.statusTimestamp | TableDateFilter}}
                \\r\\n
                \\r\\n {{'No data found' | translate}}\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Selected: {{opsVm.SelectedNumber || 0}} |\\r\\n \\r\\n \\r\\n Total: {{opsTbVm.operatorsTableList.length}} / {{opsTbVm.total}}\\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n Successfully assigned assets to operators!\\r\\n \\r\\n \\r\\n Successfully unassigned assets to operators!\\r\\n \\r\\n \\r\\n \\r\\n There was an error. Please go back and try again.\\r\\n \\r\\n \\r\\n Performing...\\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n New Assignment\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n {{ tableRow.header }}\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n {{ tableRow.value(asset) | translate }}\\r\\n
                \\r\\n link\\r\\n \\r\\n {{ tableRow.value(addedAsset) | translate }}\\r\\n
                \\r\\n
                \\r\\n {{'No assets found' | translate}}\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n

                \\r\\n Create Operator\\r\\n

                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n Operator created successfully\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Error creating the operator\\r\\n

                \\r\\n Code already in use\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                {{opDTFVm.editAttrs.expiry | DateFilter}}
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n\\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{code.identifier}}\\r\\n \\r\\n \\r\\n \\r\\n close\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{code.identifier}}\\r\\n \\r\\n \\r\\n \\r\\n close\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n {{code.identifier}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n close\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error updating codes!\\r\\n \\r\\n {{idcode}} code already in use\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                {{opVm.operator.name}}

                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Codes:\\r\\n \\r\\n
                {{opVm.operator.codes.total}}
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Successfully Linked Assets:\\r\\n \\r\\n
                {{opVm.operator.successfullyLinkedAssets}}
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Created:\\r\\n \\r\\n
                {{opVm.operator.createdAt | TableDateFilter}}
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Company Name:\\r\\n \\r\\n
                {{opVm.operator.attrs.company_name}}
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n IPAF Expiry:\\r\\n \\r\\n \\r\\n Expiry:\\r\\n \\r\\n
                {{opVm.operator.attrs.expiry | DateFilter}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error updating operator data!\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n An error occurred while retrieving operator information\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n\\r\\n
                \\r\\n

                Download the

                   \\r\\n insert_drive_file\\r\\n CSV template\\r\\n \\r\\n   

                and upload it for processing.

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n\\r\\n \\r\\n
                {{bulkOpVm.selectedFile.name}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Validating...\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n Invalid File, please review and upload again.\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n Please note: \\r\\n You are about to create operators without codes.\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Something went wrong while creating operators.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n {{bulkOpVm.feed.total}}\\r\\n
                \\r\\n
                0}\\\">\\r\\n \\r\\n {{bulkOpVm.feed.createdOperators.length}}\\r\\n
                \\r\\n
                0}\\\">\\r\\n \\r\\n {{bulkOpVm.feed.failedOperators.length}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n The process may take seconds or minutes to complete, please don't close your\\r\\n browser.\\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n Error creating operator!\\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n \\r\\n close\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading operators data!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n No operators found\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading Assets!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Currently, you do not have access to any assets that have been enabled to use Access Management. Please contact your Administrator or ZTR Support for any questions.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n Selected :{{num}}\\r\\n \\r\\n | \\r\\n Total: {{num}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                {{groupVm.group.name}}

                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Email:\\r\\n \\r\\n
                {{groupVm.group.email}}
                \\r\\n
                \\r\\n Pending\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Linked Assets:\\r\\n \\r\\n
                {{groupVm.group.assets.length}}
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Created At:\\r\\n \\r\\n
                {{groupVm.group.createdAt | TableDateFilter }}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error updating group data!\\r\\n \\r\\n \\r\\n This group name already exists!\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n An error occurred while retreiving group information\\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Group created successfully\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n Error creating the group\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n close\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n This group name already exists!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n This email is already in use!\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error creating group!\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Error loading groups\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n No groups found\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                NameCreated At
                {{group.name}}{{ group.createdAt | TableDateFilter }}
                \\r\\n
                \\r\\n {{'No data found for the search' | translate}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                0\\\">\\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n Total: {{num}}\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n to\\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n\\r\\n
                \";","module.exports = \"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n {{(vm.selectedDate | DateFilter:'format-only') || vm.placeHolder}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n Use the calendars displayed by clicking the buttons to set the from and/or to date range.\\r\\n \\r\\n \\r\\n Enter a value indicated by the input box, for the minimum amount, and/or the maximum amount.\\r\\n \\r\\n \\r\\n Enter a value in the input box and click apply. To add additional values, click the 'Add value' button.\\r\\n \\r\\n \\r\\n Our apologies. There are not any instructions available at this time.\\r\\n \\r\\n \\r\\n \\r\\n Search Hints:\\r\\n \\r\\n Use ‘*’ for partial term matching:\\r\\n \\r\\n abc* returns anything starting with abc.\\r\\n \\r\\n \\r\\n *abc* returns anything that contains abc.\\r\\n \\r\\n \\r\\n \\r\\n Selecting a template will auto-fill the package, make, and model\\r\\n \\r\\n \\r\\n \\r\\n The source signal from the asset that will be used to trigger the alert. Can be based on a 'State' (i.e. On/Off) or a 'Value' (i.e. Analog/Sensor).\\r\\n \\r\\n \\r\\n \\r\\n The logic that is evaluated to determine an active alert.\\r\\n \\r\\n \\r\\n The duration of time the alert condition must be active for before it is pushed to the alert board and notifications are dispatched.\\r\\n \\r\\n \\r\\n Determines the mapping screen and alert board asset pin colour when the alert is active. (High = Red, Medium = Yellow, Low = Blue)\\r\\n \\r\\n \\r\\n Auto clear removes the alert from the alert board as soon as it is no longer active.\\r\\n \\r\\n \\r\\n Send a notification when the alert condition is no longer active.\\r\\n \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"\\r\\n\\r\\n
                \\r\\n \\r\\n Total:\\r\\n {{pagination.total}}\\r\\n \\r\\n
                \";","module.exports = \"\\r\\n\\r\\n
                \\r\\n

                \\r\\n Transfer Ownership\\r\\n
                \\r\\n \\r\\n
                \\r\\n

                \\r\\n\\r\\n
                \\r\\n

                Select assets in the list that you wish to transfer.

                \\r\\n

                0\\\" translate translate-params-num=\\\"vm.getNumberOfSelectedAssets()\\\">{{num}} Selected Assets will be\\r\\n transferred to:

                \\r\\n \\r\\n
                \\r\\n\\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n Transferring Assets...\\r\\n \\r\\n \\r\\n Assets transferred successfully\\r\\n \\r\\n \\r\\n Failed to transfer assets, view details\\r\\n \\r\\n \\r\\n Some assets failed to transfer, view details\\r\\n \\r\\n
                \\r\\n\\r\\n
                0\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{transferAsset.name}}, more details.\\r\\n
                {{transferAsset.message |translate}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n\";","module.exports = \"\\r\\n\";","module.exports = \"\\r\\n\\r\\n
                \\r\\n
                Recent
                \\r\\n
                  \\r\\n
                • \\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n\\r\\n
                  \\r\\n
                  No search term entered
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                • \\r\\n
                • \\r\\n
                  No recent searches
                  \\r\\n
                • \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                Favorites
                \\r\\n
                  \\r\\n
                • \\r\\n\\r\\n
                  \\r\\n\\r\\n \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n\\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n Remove this favorite?\\r\\n
                  Remove
                  \\r\\n
                  \\r\\n
                • \\r\\n\\r\\n
                • \\r\\n
                  No favorites saved
                  \\r\\n
                • \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                Recently Removed
                \\r\\n
                  \\r\\n
                • \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                • \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n To begin, please enter a search term above and hit the enter key\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                Status
                \\r\\n
                \\r\\n \\r\\n {{column.label | translate}}\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n {{asset.name}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{asset[column.key] | TableDateFilter}}\\r\\n \\r\\n \\r\\n done\\r\\n \\r\\n \\r\\n {{asset[column.key]}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{vm.errorText}}\\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n

                Are you sure you wish to send {{modalVm.option.label}} to the equipment?

                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n {{vm.checked.name}}:\\r\\n
                {{vm.checked[vm.checked.status]}}
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                0\\\">\\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n {{command.name | commandTranslateFilter}}:\\r\\n {{vm.valuesLookup[command.name+command.parameters['write-values']]}}\\r\\n {{vm.valuesLookup[command.name+command.parameters.value]}}\\r\\n
                \\r\\n
                {{command.createdAt | date: 'yyyy-MM-dd hh:mm:ss a'}}
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                {{vm.statusMap[command.status] | capitalize}}
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                {{command.statusAt | date: 'yyyy-MM-dd hh:mm:ss a'}}
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n Your session has expired.\\r\\n
                \\r\\n
                \\r\\n Sorry somthing went wrong. Please try again.\\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n {{$select.selected.label}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n {{$select.selected.label}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \";","import Auth from './auth';\r\n\r\nclass Clients {\r\n load(hostname) {\r\n const defaultConfig = {\r\n post_logout_redirect_uri: `${Auth.url.protocol}//${Auth.url.host}/home/`,\r\n redirect_uri: `${Auth.url.protocol}//${Auth.url.host}/home/`\r\n };\r\n\r\n let clients = new Map();\r\n\r\n if (process.env.NODE_ENV === 'local') {\r\n clients.set('default', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-3f4o7ssug4mu591q9ykxa4mmoi7yao13'\r\n });\r\n\r\n clients.set('takeuchi-us.localhost:89', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-sag8mckosq9ag6hocojeoqh13zwpqgnq',\r\n acr_values: 'tenant:429932458'\r\n });\r\n\r\n clients.set('genie.localhost:89', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-8jpkhteedzxr89fyckppkkgnumd6ob4g'\r\n });\r\n\r\n clients.set('trackpoint.localhost:89', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-m5wowrfxbqipru67r3syof154fdpdugw'\r\n });\r\n }\r\n\r\n if (process.env.NODE_ENV === 'staging') {\r\n clients.set('default', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-3f4o7ssug4mu591q9ykxa4mmoi7yao13'\r\n });\r\n\r\n clients.set('takeuchi-us-staging.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-6mi4osjbca6tnu4g1xe1imkb5cuwmrug',\r\n acr_values: 'tenant:429932458'\r\n });\r\n\r\n clients.set('liftconnect.staging.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-8jpkhteedzxr89fyckppkkgnumd6ob4g'\r\n });\r\n\r\n clients.set('trackpoint.staging.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-g6rojy9rgfb9mg1jc3qkiquit41h8aw9'\r\n });\r\n }\r\n\r\n if (process.env.NODE_ENV === 'production') {\r\n clients.set('default', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-3f4o7ssug4mu591q9ykxa4mmoi7yao13'\r\n });\r\n\r\n clients.set('takeuchi-us.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-r3mmmqpg9hsqw835877ui9xeaf588obx',\r\n acr_values: 'tenant:284689514'\r\n });\r\n\r\n clients.set('takeuchi-us-sandbox.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-qynxxnim4yattjyrhojqun6ftak139rh',\r\n acr_values: 'tenant:429932458'\r\n });\r\n\r\n clients.set('liftconnect.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-hbhd1h8xmou6htjqp7ssmekcfz93hjm1'\r\n });\r\n\r\n clients.set('trackpoint.onei3.com', {\r\n ...defaultConfig,\r\n client_id: '551341714070273570-zszth4819hb46qdco11dbzma4tkzjm5a'\r\n });\r\n }\r\n\r\n let client = clients.get(hostname);\r\n\r\n if (client !== undefined) {\r\n return client;\r\n }\r\n\r\n return clients.get('default');\r\n }\r\n}\r\n\r\nexport default new Clients();\r\n","import 'angular-breadcrumb';\r\nimport 'add-to-homescreen';\r\nimport moment from 'moment';\r\n\r\nconst KEY_LASTSTATE = 'last_state';\r\n\r\nexport function ConfigRouteConfig(\r\n $urlRouterProvider,\r\n $compileProvider,\r\n $urlMatcherFactoryProvider,\r\n $breadcrumbProvider,\r\n $locationProvider,\r\n) {\r\n 'ngInject';\r\n\r\n $urlMatcherFactoryProvider.caseInsensitive(true);\r\n $urlMatcherFactoryProvider.strictMode(false);\r\n\r\n $locationProvider.html5Mode(true);\r\n $locationProvider.hashPrefix('');\r\n\r\n $urlRouterProvider.otherwise(($injector) => {\r\n const $state = $injector.get('$state');\r\n const navService = $injector.get('navService');\r\n\r\n const firstAccessibleTopNav = navService.getFirstValidTopNavItem();\r\n\r\n if (firstAccessibleTopNav) {\r\n $state.go(firstAccessibleTopNav.sref);\r\n }\r\n });\r\n\r\n // set this to false for significant performance boost in production, but enabled when using debugging tools for angular in devmode\r\n $compileProvider.debugInfoEnabled(true);\r\n\r\n $urlMatcherFactoryProvider.type('timeStamp', {\r\n name: 'timeStamp',\r\n decode: (myDateValue) => {\r\n let timestamp;\r\n\r\n if (myDateValue instanceof Date) {\r\n return myDateValue;\r\n }\r\n\r\n timestamp = Date.parse(myDateValue);\r\n\r\n if (timestamp) {\r\n return moment(timestamp);\r\n }\r\n },\r\n /**\r\n * Detects whether a value is of a particular type. Accepts a native (decoded) value and determines whether\r\n * it matches the current Type object.\r\n * @see https://ui-router.github.io/ng1/docs/0.3.1/index.html#/api/ui.router\r\n * @see http://stackoverflow.com/questions/32867815/can-i-pass-datetime-parameters-in-ui-router\r\n */\r\n is: (myDateValue) => {\r\n return myDateValue && this.decode(myDateValue) === myDateValue;\r\n },\r\n });\r\n\r\n $breadcrumbProvider.setOptions({\r\n template:\r\n '
                  ' +\r\n '
                1. ' +\r\n '' +\r\n '
                2. ' +\r\n '
                3. ' +\r\n '' +\r\n '
                4. ' +\r\n '
                ',\r\n });\r\n}\r\n\r\nexport function ConfigRunSetup(\r\n $rootScope,\r\n $state,\r\n $location,\r\n navService,\r\n localStorageService,\r\n editableOptions,\r\n $ngRedux,\r\n) {\r\n 'ngInject';\r\n\r\n // Theme settings for x-editable form\r\n editableOptions.theme = 'bs3';\r\n\r\n $rootScope.$on('$stateChangeSuccess', (event, toState, toParams) => {\r\n const lastStateParams = {\r\n state: toState.name,\r\n params: toParams,\r\n timestamp: moment().format(),\r\n };\r\n\r\n if (toState.name !== 'index') {\r\n localStorageService.set(KEY_LASTSTATE, lastStateParams);\r\n }\r\n\r\n $rootScope.flexPage = toState.data && toState.data.flex;\r\n $rootScope.leftNav = toState.data && toState.data.leftNav;\r\n $rootScope.breadcrumb = toState.data && toState.data.breadcrumb;\r\n });\r\n\r\n $rootScope.$on('$stateChangeStart', (evt, to, params) => {\r\n const nextState = (name, param) => ({ name, params: param });\r\n\r\n const GetValidSubItemOrUnauthorized = (stateName) => {\r\n const validSubItem = navService.getFirstValidSubItemState(stateName);\r\n return validSubItem ? nextState(validSubItem.sref) : nextState('unauthorized');\r\n };\r\n\r\n const redirectTo = (state) => {\r\n return $state.go(state.name, state.params);\r\n };\r\n\r\n // Make sure that we hide the menus every time we change state\r\n navService.hideSideNav();\r\n\r\n if (to.redirectTo || !navService.isValidState(to.name)) {\r\n evt.preventDefault();\r\n\r\n if (to.redirectTo && navService.isValidState(to.redirectTo)) {\r\n return redirectTo(nextState(to.redirectTo, params));\r\n }\r\n\r\n return redirectTo(GetValidSubItemOrUnauthorized(to.name));\r\n }\r\n\r\n // pop up message to add bookmark to ios devices home screen\r\n // eslint-disable-next-line no-undef\r\n addToHomescreen({\r\n startDelay: 5,\r\n });\r\n });\r\n\r\n // send user to his prefferd landing page\r\n const reduxState = $ngRedux.getState();\r\n\r\n // we are not going to use document.referrer now, as it is always return referredFromAuthServer when referesh\r\n // todo(why): the line to update referrer at the bottom is working, but login server as referrer url coming back on refresh!\r\n // const referredFromAuthServer = document.referrer.includes(process.env.AUTH_SERVER_URL);\r\n\r\n const { href = '' } = document.location;\r\n const hereFromAuth = href.includes('/home/id_token=');\r\n\r\n if (hereFromAuth) {\r\n const {\r\n app: { redirectToState = null },\r\n } = reduxState;\r\n\r\n const signInRedirectUri = localStorage.getItem('sign-in-redirect-uri');\r\n let url = null;\r\n\r\n if (signInRedirectUri !== null) {\r\n localStorage.removeItem('sign-in-redirect-uri');\r\n const match = /\\/home\\/(.*)/.exec(signInRedirectUri);\r\n [, url] = match;\r\n }\r\n\r\n if (url) {\r\n Object.defineProperty(document, 'referrer', { get: () => window.location.href });\r\n $location.url(url);\r\n } else if (redirectToState && navService.isValidState(redirectToState)) {\r\n // This code prevents the referrer from getting in a loop and _always_ being from the login server\r\n // because angular is an SPA\r\n Object.defineProperty(document, 'referrer', { get: () => window.location.href });\r\n $state.go(redirectToState);\r\n }\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport { ConfigRouteConfig, ConfigRunSetup } from './config.route';\r\n\r\nconst appConfigModule = angular.module('app.config', [\r\n\t'ncy-angular-breadcrumb'\r\n]);\r\n\r\nappConfigModule.config(ConfigRouteConfig).run(ConfigRunSetup);\r\n\r\nexport default appConfigModule.name;\r\n","const appSettingsModule = angular.module('appSettingsModule', []);\r\n\r\nexport default appSettingsModule.name;","export default function InviteService($http, appSettings) {\r\n 'ngInject';\r\n this.postInvite = function (email, data) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/invites/email/' + email;\r\n return $http.post(endpoint, data);\r\n };\r\n}","export default function TransferService($http, appSettings) {\r\n 'ngInject';\r\n var resourceUrl = '/' + appSettings.IcebergApiEquipmentEndpoint.split('/')[3] + '/equipment/';\r\n\r\n this.getResourceUrl = function () {\r\n return resourceUrl;\r\n };\r\n\r\n this.getTransferKeys = function () {\r\n var endpoint = appSettings.IcebergApiTransfersEndpoint + '/keys';\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.transferResources = function (transferKey, resourcesArray) {\r\n var endpoint = appSettings.IcebergApiTransfersEndpoint + '/keys/' + transferKey;\r\n\r\n return $http.post(endpoint, resourcesArray);\r\n };\r\n\r\n this.getMoreTransfers = function (moreLink) {\r\n var endpoint = appSettings.IcebergApiTransfersEndpoint + '/' + moreLink.substr(moreLink.indexOf('/', 1) + 1);\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.getTransfers = function (query, limit) {\r\n var endpoint = appSettings.IcebergApiTransfersEndpoint + '/transfers?limit=' + limit + (query == '' ? '' : '&') + query;\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.getTransferKeysToShare = function () {\r\n var endpoint = appSettings.InReachApiEndpoint + '/transfers/keys?filter=equipment:share:outbound';\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.postEquipmentToShare = function (key, equipsShareObject) {\r\n var endpoint = appSettings.InReachApiEndpoint + '/share/' + key + '/execute';\r\n return $http.post(endpoint, equipsShareObject);\r\n };\r\n}","export default function SavedSearchService($http, appSettings, $q) {\r\n 'ngInject';\r\n var savedSearches = {};\r\n var savedSearchEndpoint = appSettings.InReachApiSavedSearchEndpoint;\r\n\r\n /**\r\n Retrieves all saved searches for the current user\r\n */\r\n savedSearches.getSearches = function () {\r\n\r\n var def = $q.defer();\r\n\r\n var savedSearchResult = {\r\n data: [{\r\n name: 'Nelson\\'s saved search',\r\n description: 'Very good, lots of security groups.',\r\n securityGroups: [\r\n '19283712309',\r\n '40192381233',\r\n '12329833123'\r\n ],\r\n alertStates: [\r\n 'low',\r\n 'medium'\r\n ],\r\n maintenanceStates: [\r\n 'overdue',\r\n 'upcoming'\r\n ],\r\n attrs: [{\r\n 'id': '519418005948745116',\r\n 'values': [\r\n 'Nate Dogg',\r\n 'Doggy Dogg'\r\n ]\r\n },\r\n {\r\n 'id': '519418005948745116',\r\n 'values': [\r\n '3.0'\r\n ]\r\n },\r\n {\r\n 'id': '519418005948745116',\r\n 'values': [\r\n '3.0'\r\n ],\r\n 'range': {\r\n 'max': '90/1920/1029',\r\n 'min': '90/1920/1029'\r\n }\r\n }\r\n ]\r\n }],\r\n included: [\r\n\r\n ],\r\n meta: {\r\n 'total-pages': 10\r\n },\r\n links: {\r\n 'self': 'https://onei3.com/api/savedsearches/',\r\n 'next': 'https://onei3.com/api/savedsearches?page[offset]=2',\r\n 'last': 'https://onei3.com/api/savedsearches?page[offset]=10'\r\n }\r\n };\r\n\r\n def.resolve(savedSearchResult);\r\n return def.promise;\r\n };\r\n\r\n /**\r\n Saves a new search in the API database\r\n */\r\n savedSearches.saveSearch = function (search) {\r\n return $http.post(savedSearchEndpoint + '/saved', search);\r\n };\r\n /**\r\n Deletes an existing search in the API database\r\n */\r\n savedSearches.deleteSearch = function (savedSearchID) {\r\n return $http.delete(savedSearchEndpoint + '/saved/delete/' + savedSearchID);\r\n };\r\n\r\n return savedSearches;\r\n}","export default (type, payload, error = false) => ({\r\n type,\r\n payload,\r\n error\r\n});\r\n","import Action from '../action';\r\n\r\nexport const SECURITY_GROUPS_RETRIEVAL_INITIATED = 'SECURITY_GROUPS_RETRIEVAL_INITIATED';\r\nexport const SECURITY_GROUPS_RETRIEVAL_FAILED = 'SECURITY_GROUPS_RETRIEVAL_FAILED';\r\nexport const SECURITY_GROUPS_RETRIEVED = 'SECURITY_GROUPS_RETRIEVED';\r\n\r\nexport const fetch = () => Action(SECURITY_GROUPS_RETRIEVAL_INITIATED);\r\nexport const fetchSuccess = groups => Action(SECURITY_GROUPS_RETRIEVED, groups);\r\nexport const fetchFailure = error => Action(SECURITY_GROUPS_RETRIEVAL_FAILED, error, true);\r\n","import * as SecurityGroupActions from '../state/security/security.action';\r\nimport app from '../app';\r\n\r\nexport default function SecurityGroupsService($q, $http, appSettings) {\r\n 'ngInject';\r\n\r\n const groupsEndpoint = `${appSettings.IcebergApiUserInfoEndpoint}/groups`;\r\n const resourceUrl = `/${appSettings.IcebergApiEquipmentEndpoint.split('/')[3]}/equipment/`;\r\n const userUrl = `/${appSettings.IcebergApiUserInfoEndpoint.split('/')[3]}/users/`;\r\n\r\n this.getResourceUrl = function () {\r\n return resourceUrl;\r\n };\r\n\r\n this.getUserUrl = function () {\r\n return userUrl;\r\n };\r\n\r\n this.getAllSecurityGroups = function () {\r\n const endpoint = groupsEndpoint;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.postNewGroup = function (data) {\r\n const endPoint = groupsEndpoint;\r\n return $http.post(endPoint, data).then(this.UpdateSecurityGroups);\r\n };\r\n\r\n this.getSingleGroup = function (id) {\r\n const endPoint = `${groupsEndpoint}/${id}`;\r\n return $http.get(endPoint);\r\n };\r\n\r\n this.putGroupUpdate = function (id, data) {\r\n const endPoint = `${groupsEndpoint}/${id}`;\r\n return $http.put(endPoint, data).then(this.UpdateSecurityGroups);\r\n };\r\n\r\n this.patchEquipmentUserUpdate = function (id, data) {\r\n const deferred = $q.defer();\r\n\r\n const endPoint = `${groupsEndpoint}/${id}`;\r\n\r\n // 1. Patch the security group.\r\n $http.patch(endPoint, data).then(\r\n function (groupResponse) {\r\n // Super hack to get this out the door ASAP.\r\n // 2. On success, iterate changesets and patch equipment tags with group.\r\n for (let i = 0; i < data.length; i++) {\r\n let item = data[i];\r\n if (!!item.value.resource && item.value.resource.indexOf('equipment') > -1) {\r\n // Patch them shits.\r\n let tag = `onei3:security:group:${id}`;\r\n $http.patch(`${appSettings.BaseIcebergUrl}${item.value.resource}/tags`, {\r\n op: item.op,\r\n values: [tag],\r\n });\r\n }\r\n }\r\n\r\n // Return group patch response.\r\n deferred.resolve(groupResponse);\r\n },\r\n function (groupError) {\r\n // Group patch error.\r\n deferred.reject(groupError);\r\n },\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n this.deleteGroup = function (id) {\r\n const endPoint = `${groupsEndpoint}/${id}`;\r\n return $http.delete(endPoint).then(this.UpdateSecurityGroups);\r\n };\r\n\r\n this.UpdateSecurityGroups = function (response) {\r\n app.getStore().dispatch(SecurityGroupActions.fetch());\r\n return response;\r\n };\r\n\r\n this.getSecurityGroupsByAttrs = (attrs) => {\r\n const attrsQueryString = Object.keys(attrs || {})\r\n .map((k) => `attr.${k}=${attrs[k]}`)\r\n .join('&');\r\n const endpoint = attrsQueryString ? `${groupsEndpoint}?${attrsQueryString}` : groupsEndpoint;\r\n return $http.get(endpoint).then((res) => res.data);\r\n };\r\n\r\n this.patchResources = (id, data) => {\r\n const endPoint = `${groupsEndpoint}/${id}`;\r\n return $http.patch(endPoint, data);\r\n };\r\n}\r\n","export default function SavedFilterService($http, appSettings) {\r\n 'ngInject';\r\n const savedFilters = {};\r\n const savedFilterEndpoint = appSettings.InReachApiSavedFilterEndpoint;\r\n\r\n /**\r\n * Retrieves all saved searches for the current user\r\n */\r\n savedFilters.getAllSavedFilters = function () {\r\n return $http.get(savedFilterEndpoint);\r\n };\r\n /**\r\n * Retrieves just one saved searches for the current user\r\n */\r\n savedFilters.getSavedFilter = function (savedFilterId) {\r\n return $http.get(savedFilterEndpoint + '/' + savedFilterId);\r\n };\r\n\r\n /**\r\n * Save\r\n */\r\n savedFilters.postSaveFilter = function (savedFilter) {\r\n return $http.post(savedFilterEndpoint, savedFilter);\r\n };\r\n /**\r\n * Delete\r\n */\r\n savedFilters.deleteSavedFilter = function (savedFilterID) {\r\n return $http.delete(savedFilterEndpoint + '/' + savedFilterID);\r\n };\r\n /**\r\n * Update\r\n */\r\n savedFilters.updateSavedFilter = function (savedFilterId, savedFilter) {\r\n return $http.put(savedFilterEndpoint + '/' + savedFilterId, savedFilter);\r\n };\r\n /**\r\n * Patch\r\n */\r\n savedFilters.patchSavedFilter = function (savedFilterId, savedFilter) {\r\n return $http.patch(savedFilterEndpoint + '/' + savedFilterId, savedFilter);\r\n };\r\n\r\n return savedFilters;\r\n}","export default function ReportsRepository($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n getAllReports: function () {\r\n const uri = `${appSettings.InReachApiReportEndpoint}?include=groups`;\r\n return $http.get(uri);\r\n },\r\n getReport: function (id) {\r\n const uri = `${appSettings.InReachApiReportEndpoint}/${id}`;\r\n return $http.get(uri);\r\n },\r\n excuteReport: function (reportName) {\r\n const uri = `${appSettings.VikingEndpoint}/default.aspx?path=${reportName}`;\r\n return $http.get(uri);\r\n }\r\n };\r\n}","export default function PackagesService($http, appSettings, $q, gettextCatalog) {\r\n 'ngInject';\r\n return {\r\n getAllPackages: function() {\r\n return $http.get(appSettings.InReachApiPackagesEndpoint);\r\n },\r\n getPackageById: function(packageid) {\r\n return $http.get(appSettings.InReachApiPackagesEndpoint + '/' + packageid);\r\n },\r\n getPackageByIds: function(packageIds = []) {\r\n return $http.post(`${appSettings.InReachApiPackagesEndpoint}/filter`, packageIds);\r\n },\r\n getDatapointsForPackage: function(packageid) {\r\n return $http.get(appSettings.InReachApiPackagesEndpoint + '/' + packageid + '/_datapoints');\r\n },\r\n getDatapointsForPackages: function(packageIds) {\r\n let def = $q.defer();\r\n if (packageIds == null) {\r\n def.reject(gettextCatalog.getString('Must specify at least one package'));\r\n\r\n return def.promise;\r\n }\r\n\r\n let promises = [];\r\n\r\n for (let i = 0; i < packageIds.length; i++) {\r\n promises.push(this.getDatapointsForPackage(packageIds[i]));\r\n }\r\n\r\n let mainPromise = $q.all(promises);\r\n\r\n mainPromise.then(\r\n function(responseList) {\r\n let datapointSet = {};\r\n responseList.forEach(response => {\r\n response.data.forEach(datapoint => {\r\n datapointSet[datapoint] = true;\r\n });\r\n });\r\n\r\n let datapointList = [];\r\n for (let key in datapointSet) {\r\n datapointList.push(key);\r\n }\r\n\r\n def.resolve(datapointList);\r\n },\r\n function(response) {\r\n def.reject(response);\r\n }\r\n );\r\n\r\n return def.promise;\r\n }\r\n };\r\n}\r\n","export default function MobileService($window) {\r\n 'ngInject';\r\n return {\r\n isMobile: function () {\r\n return $window.innerWidth < 768;\r\n }\r\n };\r\n}","import {intersection, union, difference, map} from 'lodash-es';\r\n\r\nexport const getprefixes = function(arr = []) {\r\n return arr.reduce((prefixes, item) => {\r\n const dotidx = item.lastIndexOf('.');\r\n\r\n if (dotidx > 0) {\r\n prefixes.push(item.substring(0, dotidx));\r\n }\r\n\r\n return prefixes;\r\n }, []);\r\n};\r\n\r\n// collect the permissions required by the given state, up to root state\r\nexport const collectPermissions = function(state) {\r\n let permissions = [];\r\n let prefixes = [];\r\n\r\n //load permissions from the init (given) state\r\n if (state.requiredFeatures) {\r\n permissions = [...permissions, ...state.requiredFeatures];\r\n prefixes = [...prefixes, ...getprefixes(state.requiredFeatures)];\r\n }\r\n\r\n let parentState = state.parent;\r\n\r\n // Merge required permissions from all parent states up to the root\r\n while (parentState) {\r\n if (parentState.requiredFeatures) {\r\n const inheritedPermissions = intersection(prefixes, parentState.requiredFeatures);\r\n\r\n if (inheritedPermissions.length) {\r\n permissions = [...permissions, ...inheritedPermissions];\r\n prefixes = union(prefixes, getprefixes(inheritedPermissions));\r\n }\r\n }\r\n\r\n parentState = parentState.parent;\r\n }\r\n\r\n return permissions;\r\n};\r\n\r\nexport const isStateAuthorized = (state, currentUser) => {\r\n if (!currentUser || !currentUser.features) {\r\n return false;\r\n }\r\n\r\n if (!state) {\r\n return false; //there was an error with the decorator for ui router\r\n }\r\n\r\n if (state.requiresChangeEmail) {\r\n if (!currentUser.changeEmail) {\r\n return false;\r\n }\r\n }\r\n\r\n if (state.requiredAdminRole) {\r\n if (\r\n currentUser.roles &&\r\n currentUser.roles.data &&\r\n currentUser.roles.data.filter(role => '' + role.id === '-1').length === 0\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n // collect the features required by the current state\r\n // ensure the user has all of them\r\n const requiredPermissions = collectPermissions(state);\r\n\r\n if (requiredPermissions.length) {\r\n const permissions = map(currentUser.features, f => f.path);\r\n if (difference(requiredPermissions, permissions).length > 0) {\r\n return false;\r\n }\r\n }\r\n\r\n // filter by data points\r\n if (state.requiredDatapoints) {\r\n const userDatapoints = map(currentUser.visibleDatapoints || [], dp => dp.id);\r\n if (difference(state.requiredDatapoints, userDatapoints).length > 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n};\r\n","import { find, orderBy } from 'lodash-es';\r\nimport { isStateAuthorized } from './nav.util.service';\r\n\r\nexport default function NavService(\r\n $state,\r\n $rootScope,\r\n alertsNavService,\r\n adminNavService,\r\n devicesNavService,\r\n maintenanceNavService,\r\n mapNavService,\r\n equipmentNavService,\r\n tSeriesNavService,\r\n reportsNavService,\r\n accessManagemantNavService,\r\n usersService,\r\n userProfileNavService,\r\n siteNaveService, //eslint-disable-line no-unused-vars\r\n) {\r\n 'ngInject';\r\n //Compile all of the modules based on the arguments of the nav services injected in here\r\n\r\n let modules = Object.entries(arguments).reduce((map, [, module]) => {\r\n if (typeof module.getModule === 'function') {\r\n let result = module.getModule();\r\n map[result.id] = result;\r\n }\r\n\r\n return map;\r\n }, {});\r\n\r\n let _showingNavService = false;\r\n\r\n this.isShowingSideNav = () => {\r\n return _showingNavService;\r\n };\r\n\r\n this.toggleSideNav = () => {\r\n _showingNavService = !_showingNavService;\r\n };\r\n\r\n this.hideSideNav = () => {\r\n _showingNavService = false;\r\n };\r\n\r\n this.showSideNav = () => {\r\n _showingNavService = true;\r\n };\r\n\r\n this.getModules = () => {\r\n return modules;\r\n };\r\n\r\n this.getModuleByState = (sref) => find(modules, (m) => sref.startsWith(m.sref));\r\n\r\n this.getCurrentModule = () => this.getModuleByState($state.current.name);\r\n\r\n this.getFirstValidSubItemState = (sref) => {\r\n const stateModule = this.getModuleByState(sref) || {};\r\n return (stateModule.items || []).find((item) => this.isValidState(item.sref));\r\n };\r\n\r\n this.getFirstValidTopNavItem = () => {\r\n return orderBy(\r\n Object.keys(modules).map((module) => modules[module]),\r\n 'priority',\r\n ['desc'],\r\n ).find((module) => this.isValidState(module.sref));\r\n };\r\n\r\n this.isValidState = (stateName) => {\r\n const currentUser = usersService.currentUser();\r\n //Means we haven't loaded the current user so its not a valid state\r\n if (!currentUser) {\r\n return false;\r\n }\r\n const state = $state.get(stateName);\r\n\r\n //this is a hard coded fix for the UR dashboard\r\n return state.name === 'assetdashboard' || isStateAuthorized(state, currentUser);\r\n };\r\n}\r\n","export default function loadingModalService($uibModal) {\r\n 'ngInject';\r\n var modalInstance = null;\r\n\r\n this.open = function (params) {\r\n\r\n modalInstance = $uibModal.open({\r\n animation: false,\r\n ariaLabelledBy: 'modal-title',\r\n ariaDescribedBy: 'modal-body',\r\n template: require('./loading.modal.html'),\r\n windowClass: 'modal-centered-vertical',\r\n resolve: {\r\n params: params\r\n },\r\n controller: function ($scope, params) {\r\n $scope.params = params;\r\n },\r\n size: 'lg'\r\n });\r\n };\r\n\r\n this.close = function () {\r\n if (modalInstance) {\r\n modalInstance.dismiss('closed');\r\n }\r\n };\r\n}","import axios from 'axios';\r\n\r\nexport default function LanguagesService(gettextCatalog, appSettings) {\r\n 'ngInject';\r\n\r\n this.getSupportedLanguages = () => appSettings.SupportedLanguages || [];\r\n\r\n this.setCurrentLanguage = async (lang = 'en') => {\r\n gettextCatalog.debug = appSettings.environment === appSettings.environments.local;\r\n\r\n gettextCatalog.setCurrentLanguage(lang);\r\n // gettextCatalog.baseLanguage is 'en'\r\n if (lang !== 'en') {\r\n return gettextCatalog.loadRemote(`${process.env.TRANSLATION_CDN_URL}/locale/${lang}.json`);\r\n }\r\n };\r\n}\r\n","export default function InstallationNoteService($http, appSettings) {\r\n 'ngInject';\r\n this.createNote = function (installationId, note) {\r\n var endpoint = appSettings.InReachApiInstallationsEndpoint + '/' + installationId + '/notes';\r\n return $http.post(endpoint, note);\r\n };\r\n\r\n this.getInstallationNote = function (installationId) {\r\n return $http.get(appSettings.InReachApiInstallationsEndpoint + '/' + installationId + '/notes');\r\n };\r\n\r\n this.updateNote = function (installationId, noteId, note) {\r\n return $http.put(appSettings.InReachApiInstallationsEndpoint + '/' + installationId + '/notes' + '/' + noteId, note);\r\n };\r\n\r\n this.deleteNote = function (installationId, noteId) {\r\n return $http.delete(appSettings.InReachApiInstallationsEndpoint + '/' + installationId + '/notes' + '/' + noteId);\r\n };\r\n\r\n this.patchInstallationAttrs = function (installationId, changeset) {\r\n var endpoint = appSettings.InReachApiInstallationsEndpoint + '/' + installationId + '/attrs';\r\n return $http.patch(endpoint, changeset);\r\n };\r\n\r\n}","export default function FileUploaderService(FileUploader) {\r\n 'ngInject';\r\n return new FileUploader();\r\n}","export default function DevicesService($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n getAllDevices: function () {\r\n return $http.get(appSettings.IcebergApiDevicesEndpoint + '/devices/');\r\n },\r\n getDevice: function (serialNumber) {\r\n return $http.get(appSettings.IcebergApiDevicesEndpoint + '/devices/' + serialNumber);\r\n },\r\n getDeviceModelBySerialNumber: function (telematicsSerialNumber) {\r\n var endpoint = appSettings.IcebergApiDevicesEndpoint + '/models/' + telematicsSerialNumber;\r\n return $http.get(endpoint);\r\n }\r\n };\r\n}","import Auth from '../auth';\r\nimport * as StackTrace from 'stacktrace-js';\r\nimport _ from 'lodash';\r\n//- See more at: http://engineering.talis.com/articles/client-side-error-logging/#sthash.SBQouIcL.dpuf\r\n\r\nexport function exceptionHandlerProvider() {\r\n return {\r\n $get: function(exceptionLoggingService) {\r\n 'ngInject';\r\n return exceptionLoggingService;\r\n }\r\n };\r\n}\r\n\r\nexport function ExceptionLoggingService($log, $window) {\r\n 'ngInject';\r\n function error(exception, cause) {\r\n // preserve the default behaviour which will log the error\r\n // to the console, and allow the application to continue running.\r\n $log.error.apply($log, arguments);\r\n\r\n // now try to log the error to the server side.\r\n try {\r\n let errorMessage = exception.toString();\r\n\r\n // use our traceService to generate a stack trace\r\n StackTrace.fromError(exception).then(stack => {\r\n $.ajax({\r\n type: 'POST',\r\n url: '/api/errorlog',\r\n headers: {\r\n Authorization: Auth.getAuthorizationHeader()\r\n },\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n url: $window.location.href,\r\n message: errorMessage,\r\n type: 'exception',\r\n stackTrace: _.map(stack, item => item.toString()),\r\n cause: cause || 'Not Available'\r\n })\r\n });\r\n });\r\n //alert(stackTrace);\r\n // use AJAX (in this example jQuery) and NOT\r\n // an angular service such as $http\r\n } catch (loggingError) {\r\n $log.warn('Error server-side logging failed');\r\n $log.log(loggingError);\r\n }\r\n }\r\n\r\n return error;\r\n}\r\n\r\n// As the comment I’ve placed in the code above highlights it is very important that, when posting the\r\n// log statement to your server, you do NOT use the AngularJS $http service. For two reasons, firstly\r\n// it will create a circular dependency which you really want to avoid, and secondly if the AngularJS\r\n// app is fubar’d you still have a chance of logging the error to your server.\r\n","export default function AppNotificationsService($http, appSettings) {\r\n 'ngInject';\r\n var notificationUrl = appSettings.InReachApiEndpoint + '/app/notifications';\r\n\r\n this.getActiveAppNotifications = function () {\r\n var endpoint = notificationUrl + '/active';\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.acknowledgeNotications = function (notificationsList) {\r\n var endpoint = notificationUrl + '/acknowledge';\r\n return $http.post(endpoint, notificationsList);\r\n };\r\n}","export default function AlertRuleService($http, appSettings) {\r\n 'ngInject';\r\n this.createAlertRule = function (alertModel) {\r\n var endpoint = appSettings.InReachApiAlertRulesEndpoint;\r\n\r\n return $http.post(endpoint, alertModel);\r\n };\r\n\r\n this.getEquipmentByAlertRuleId = function (id) {\r\n return $http.get(appSettings.InReachApiAlertRulesEndpoint + '/' + id + '/equipment');\r\n };\r\n\r\n this.getRule = function (rule) {\r\n\r\n if (!rule) return;\r\n\r\n if (!rule.id) {\r\n rule = {\r\n id: rule\r\n };\r\n }\r\n\r\n return $http.get(appSettings.InReachApiAlertRulesEndpoint + \"/\" + rule.id);\r\n };\r\n\r\n this.updateRule = function (rule) {\r\n return $http.put(appSettings.InReachApiAlertRulesEndpoint + \"/\" + rule.id, rule);\r\n };\r\n\r\n this.deleteRule = function (ruleId) {\r\n return $http.delete(appSettings.InReachApiAlertRulesEndpoint + '/' + ruleId);\r\n };\r\n}","const ASSET_TYPE_KEY = 'Asset Type';\r\n\r\nexport const ASSET_TYPE_VALUES = {\r\n Undefined: 'Undefined',\r\n Tool: 'Tool',\r\n Accessory: 'Accessory',\r\n Material: 'Material',\r\n Storage: 'Storage'\r\n};\r\n\r\nexport const ASSET_TYPE_ATTRIBUTE = {\r\n dataType: 'Text',\r\n freeform: false,\r\n key: ASSET_TYPE_KEY,\r\n id: ASSET_TYPE_KEY,\r\n values: Object.keys(ASSET_TYPE_VALUES).map(key => ({value: ASSET_TYPE_VALUES[key]}))\r\n};\r\n","import { gettext } from './../gettext-extract-util';\r\nimport { ASSET_TYPE_ATTRIBUTE, ASSET_TYPE_VALUES } from '../../api/assetTypeAttribute';\r\n\r\nexport const ROOT_SEARCH_STATE = 'search';\r\n\r\nexport const COMMUNICATED_TAG = 'lastcommunicated';\r\nexport const NOT_COMMUNICATED_TAG = 'notcommunicated';\r\nexport const NEVER_COMMUNICATED_TAG = 'nevercommunicated';\r\n/**\r\n * Adapt separated search facets into the shape expected by our repository / API\r\n * layer.\r\n * @param {*} searchState Application search state object\r\n */\r\nexport const adaptFacets = (searchState) => {\r\n const { alerts, maintenance, lastCommunicated, securityGroups, lastSeen } = searchState;\r\n return {\r\n alerts,\r\n maintenance,\r\n lastCommunicated,\r\n securityGroups,\r\n lastSeen,\r\n };\r\n};\r\n\r\nclass SearchStateModel {\r\n constructor() {\r\n this.inProgress = false;\r\n this.error = '';\r\n this.query = [];\r\n this.filters = [];\r\n this.cursor = 0;\r\n this.limit = 50;\r\n this.since = 0;\r\n this.bounds = [];\r\n this.shareKey = '';\r\n this.initial = true;\r\n this.securityGroups = [];\r\n this.alerts = [\r\n {\r\n label: gettext('Low'),\r\n id: 'low',\r\n icon_color: 'color-low-priority',\r\n _selected: false,\r\n title: gettext('Low alert'),\r\n },\r\n {\r\n label: gettext('Medium'),\r\n id: 'medium',\r\n icon_color: 'color-medium-priority',\r\n _selected: false,\r\n title: gettext('Medium alert'),\r\n },\r\n {\r\n label: gettext('High'),\r\n id: 'high',\r\n icon_color: 'color-high-priority',\r\n _selected: false,\r\n title: gettext('High alert'),\r\n },\r\n ];\r\n\r\n this.maintenance = [\r\n {\r\n label: gettext('Upcoming'),\r\n id: 'upcoming',\r\n icon_color: 'color-low-priority',\r\n _selected: false,\r\n title: gettext('Upcoming maintenance'),\r\n },\r\n {\r\n label: gettext('Due'),\r\n id: 'due',\r\n icon_color: 'color-high-priority',\r\n _selected: false,\r\n title: gettext('Due maintenance'),\r\n },\r\n ];\r\n\r\n this.lastCommunicated = [\r\n {\r\n group: gettext('Communicated'),\r\n label: gettext('within 24h'),\r\n id: 'lc-24h',\r\n range: { tag: '24h' },\r\n tag: COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n {\r\n group: gettext('Communicated'),\r\n label: gettext('within 7d'),\r\n id: 'lc-7d',\r\n range: { tag: '7d' },\r\n tag: COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n {\r\n group: gettext('Communicated'),\r\n label: gettext('within 30d'),\r\n id: 'lc-30d',\r\n range: { tag: '30d' },\r\n tag: COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n\r\n {\r\n group: gettext('Not Communicated'),\r\n label: gettext('within 24h'),\r\n id: 'nc-24h',\r\n range: { tag: '24h' },\r\n tag: NOT_COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n {\r\n group: gettext('Not Communicated'),\r\n label: gettext('within 7d'),\r\n id: 'nc-7d',\r\n range: { tag: '7d' },\r\n tag: NOT_COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n {\r\n group: gettext('Not Communicated'),\r\n label: gettext('within 30d'),\r\n id: 'nc-30d',\r\n range: { tag: '30d' },\r\n tag: NOT_COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n {\r\n group: gettext('Not Communicated'),\r\n label: gettext('ever'),\r\n id: 'nc-ever',\r\n range: { tag: { never: true } },\r\n tag: NEVER_COMMUNICATED_TAG,\r\n _selected: false,\r\n },\r\n ];\r\n this.tagFilters = {};\r\n this.modes = [];\r\n this.includes = [];\r\n this.prefilter = {\r\n queries: ['*'],\r\n index: 'equipment',\r\n };\r\n this.sort = { name: 'name.raw', direction: 'asc' };\r\n this.exportInProgress = false;\r\n this.accounts = [];\r\n this.lastSeen = [];\r\n }\r\n}\r\n\r\nexport const INITIAL_STATE = new SearchStateModel();\r\n\r\n//array of paths to keys need to be saved\r\nexport const SearchWhiteListKeys = [[ROOT_SEARCH_STATE]];\r\n\r\n//array of paths to keys need to be excluded from the ones that need to be saved\r\nexport const SearchBlackListKeys = [\r\n [ROOT_SEARCH_STATE, 'inProgress'],\r\n [ROOT_SEARCH_STATE, 'error'],\r\n [ROOT_SEARCH_STATE, 'cursor'],\r\n [ROOT_SEARCH_STATE, 'since'],\r\n [ROOT_SEARCH_STATE, 'initial'],\r\n];\r\n","/**\r\n * @file A place to put string constants. Extract into a constants folder organized by domain\r\n * should this ever become unwieldy.\r\n */\r\n\r\nconst onei3 = 'onei3';\r\n\r\nexport const ONEI3_SERVICE_ACCESS_MGMT = `${onei3}:service:access_management`;\r\n\r\nexport const ONEI3_ASSET_TYPE_ATTR_KEY = 'onei3:asset.type';\r\n","import _ from 'lodash';\r\nimport moment from 'moment';\r\nimport { COMMUNICATED_TAG, NEVER_COMMUNICATED_TAG } from '../../state/search/search.state';\r\nimport { ONEI3_ASSET_TYPE_ATTR_KEY } from '../../constants';\r\nimport { ASSET_TYPE_VALUES, ASSET_TYPE_ATTRIBUTE } from '../../api/assetTypeAttribute';\r\n\r\nexport default function EquipmentSearchService() {\r\n //keys for facets dictionary access\r\n const FACET_SECURITY_GROUPS_KEY = 'securityGroups';\r\n const FACET_MAINTENANCE_KEY = 'maintenance';\r\n const FACET_ALERT_PRIORITY_KEY = 'alerts';\r\n const FACET_LAST_COMM_KEY = 'lastCommunicated';\r\n const SEARCH_OUTSIDE_BOUNDS = 'searchOutsideBounds';\r\n const FACET_LAST_SEEN_KEY = 'lastSeen';\r\n\r\n const groupsEnum = Object.freeze({\r\n security_groups: 'security groups',\r\n maintenance: 'maintenance',\r\n alerts: 'alerts',\r\n shares: 'shares',\r\n });\r\n\r\n function buildAPIEquipmentFilterObject(\r\n query = [],\r\n options,\r\n bounds,\r\n share,\r\n facets,\r\n tagFilters,\r\n modes,\r\n prefilter,\r\n sort = ['name:asc'],\r\n accountsArray,\r\n ) {\r\n let filter = {\r\n attrs: [],\r\n tags: [],\r\n };\r\n\r\n // pass the query search string\r\n filter.queries = query;\r\n\r\n if (options) {\r\n if (!isNaN(options.limit)) {\r\n filter.limit = options.limit;\r\n }\r\n if (!isNaN(options.since)) {\r\n filter.since = options.since;\r\n }\r\n }\r\n\r\n //build tags\r\n filter.tags = buildTags(facets, share);\r\n\r\n //build communicatedAt\r\n if (facets) {\r\n //last communicated\r\n if (facets[FACET_LAST_COMM_KEY]) {\r\n filter.communicatedAt = buildCommunicatedAt(facets[FACET_LAST_COMM_KEY]);\r\n }\r\n if (facets[FACET_LAST_SEEN_KEY]) {\r\n const [lastSeenFilter] = facets[FACET_LAST_SEEN_KEY] || [];\r\n filter.coordsAt = buildCoordAt(lastSeenFilter);\r\n }\r\n }\r\n //build attrs\r\n if (tagFilters) {\r\n filter.attrs = buildAttrs(tagFilters);\r\n }\r\n\r\n const isSearchOutsideBound = (modes || []).includes(SEARCH_OUTSIDE_BOUNDS);\r\n\r\n //build within boundary\r\n if (bounds && bounds.nw && bounds.se && !isSearchOutsideBound) {\r\n filter.within = {\r\n nw: [bounds.nw.lng, bounds.nw.lat],\r\n se: [bounds.se.lng, bounds.se.lat],\r\n };\r\n }\r\n\r\n if (isSearchOutsideBound) {\r\n filter.searchOutsideBound = true;\r\n }\r\n\r\n //build sort\r\n filter.sort = sort;\r\n\r\n //build accounts\r\n if (Array.isArray(accountsArray)) {\r\n filter.accounts = accountsArray;\r\n }\r\n\r\n if (prefilter != null) {\r\n filter = mergePreFilter(filter, prefilter);\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n // private functions ---------------------------\r\n function buildTags(facets, share) {\r\n let tags = [];\r\n\r\n //build share tag\r\n if (share) {\r\n if (share.to) {\r\n tags.push(buildTagObject(`onei3:share:to:${share.to}`, groupsEnum.shares));\r\n }\r\n if (share.from) {\r\n tags.push(buildTagObject(`onei3:share:from:${share.from}`, groupsEnum.shares));\r\n }\r\n }\r\n\r\n //build facetted tags\r\n if (facets) {\r\n if (facets[FACET_SECURITY_GROUPS_KEY]) {\r\n tags = _.union(\r\n tags,\r\n buildSelectedTags(facets[FACET_SECURITY_GROUPS_KEY], groupsEnum.security_groups),\r\n );\r\n }\r\n if (facets[FACET_ALERT_PRIORITY_KEY]) {\r\n tags = _.union(\r\n tags,\r\n buildSelectedTags(facets[FACET_ALERT_PRIORITY_KEY], groupsEnum.alerts),\r\n );\r\n }\r\n if (facets[FACET_MAINTENANCE_KEY]) {\r\n tags = _.union(\r\n tags,\r\n buildSelectedTags(facets[FACET_MAINTENANCE_KEY], groupsEnum.maintenance),\r\n );\r\n }\r\n }\r\n\r\n return tags;\r\n }\r\n\r\n function buildSelectedTags(tagsArray, groupName) {\r\n let selectedTags = [];\r\n _.forEach(tagsArray, (facet) => {\r\n if (facet.tag && facet._selected) {\r\n selectedTags.push(buildTagObject(facet.tag, groupName));\r\n }\r\n });\r\n\r\n return selectedTags;\r\n }\r\n\r\n function buildTagObject(tagString, groupName) {\r\n let tagObject = {\r\n value: tagString || '',\r\n };\r\n\r\n if (groupName) {\r\n tagObject.group = groupName;\r\n }\r\n\r\n return tagObject;\r\n }\r\n\r\n function buildAttrValue(tagValue) {\r\n let obj = {};\r\n\r\n if (typeof tagValue !== 'object') {\r\n obj.equal = tagValue;\r\n } else if (tagValue.any) {\r\n obj.exists = true;\r\n } else if (tagValue.hasOwnProperty('max') && tagValue.hasOwnProperty('min')) {\r\n obj.between = {\r\n value1: tagValue.min,\r\n value2: tagValue.max,\r\n };\r\n } else if (!tagValue.hasOwnProperty('max') && tagValue.hasOwnProperty('min')) {\r\n obj.greaterThan = tagValue.min;\r\n } else if (tagValue.hasOwnProperty('max') && !tagValue.hasOwnProperty('min')) {\r\n obj.lessThan = tagValue.max;\r\n } else {\r\n obj.equal = tagValue;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n function buildAssetTypeAttr(tagKey, tagValue) {\r\n if (tagKey !== ASSET_TYPE_ATTRIBUTE.key) return;\r\n\r\n const assetTypeAttr = {\r\n name: ONEI3_ASSET_TYPE_ATTR_KEY,\r\n };\r\n\r\n if (tagValue.any) {\r\n assetTypeAttr.exists = true;\r\n } else if (tagValue === ASSET_TYPE_VALUES.Undefined) {\r\n assetTypeAttr.notExists = true;\r\n } else {\r\n assetTypeAttr.equal = tagValue.toLowerCase();\r\n }\r\n\r\n return assetTypeAttr;\r\n }\r\n\r\n function buildAttr(tagKey, tagValue) {\r\n let attr = {\r\n name: tagKey,\r\n };\r\n // Convert the human readable form for Asset Type to the id of the attr.\r\n // if (tagKey === ASSET_TYPE_ATTRIBUTE.key) {\r\n // return buildAssetTypeAttr(tagKey, tagValue);\r\n // }\r\n\r\n Object.assign(attr, buildAttrValue(tagValue));\r\n return attr;\r\n }\r\n\r\n function buildAttrs(filters) {\r\n let attrs = [];\r\n\r\n _.forEach(filters, (tagValue, tagKey) => {\r\n if (!tagKey) return;\r\n if (typeof tagValue === 'undefined' && tagValue === null) return;\r\n\r\n if (_.isArray(tagValue)) {\r\n _.forEach(tagValue, (val) => {\r\n attrs.push(buildAttr(tagKey, val));\r\n });\r\n } else {\r\n attrs.push(buildAttr(tagKey, tagValue));\r\n }\r\n });\r\n\r\n return attrs;\r\n }\r\n\r\n function buildCommunicatedAt(facetCommunicated) {\r\n let communicatedAtObject = null;\r\n //last communicated\r\n if (facetCommunicated) {\r\n _.forEach(facetCommunicated, (facet) => {\r\n if (facet.tag && facet.range && facet._selected) {\r\n if (facet.tag === NEVER_COMMUNICATED_TAG) {\r\n communicatedAtObject = { never: true };\r\n } else if (facet.tag === COMMUNICATED_TAG) {\r\n communicatedAtObject = {\r\n within: facet.range.tag,\r\n };\r\n } else {\r\n // not communicated\r\n communicatedAtObject = {\r\n outside: facet.range.tag,\r\n };\r\n }\r\n }\r\n });\r\n }\r\n\r\n return communicatedAtObject;\r\n }\r\n\r\n function buildCoordAt(facetLastSeen = {}) {\r\n if (facetLastSeen) {\r\n const { min, max, type } = facetLastSeen.range || {};\r\n switch (type) {\r\n case 'outside':\r\n return { outside: `${min}d` };\r\n case 'within':\r\n return { within: `${max}d` };\r\n case 'between': {\r\n if (!isNaN(min) && !isNaN(max)) {\r\n const utcStateDate = moment.utc().subtract(max, 'days');\r\n const utcEndData = moment.utc().subtract(min, 'days');\r\n\r\n return {\r\n between: {\r\n start: utcStateDate,\r\n end: utcEndData,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function mergePreFilter(filter, prefilter) {\r\n return _.mergeWith(filter, prefilter, (a, b) => {\r\n if (_.isArray(a)) {\r\n return a.concat(b);\r\n }\r\n\r\n return undefined;\r\n });\r\n }\r\n\r\n return {\r\n buildAPIEquipmentFilterObject: buildAPIEquipmentFilterObject,\r\n };\r\n}\r\n","import moment from 'moment';\r\nexport default function TagsService(gettextCatalog, appSettings, gettext) {\r\n 'ngInject';\r\n\r\n this.generateTooltip = (tag = {}, dateFormat) => {\r\n dateFormat = dateFormat || appSettings.GetDateFormat() || 'YYYY/MM/DD';\r\n const dateTimeFormat = `${dateFormat} h:mm:ss a`;\r\n let tip = '';\r\n switch (tag.dataType) {\r\n case 'Integer':\r\n tip = gettextCatalog.getString('Enter an integer ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n case 'Decimal':\r\n tip = gettextCatalog.getString('Enter a number ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n return tip;\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n case 'Date':\r\n tip = gettextCatalog.getString('Select a date ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('({{min}} or later)', {\r\n min: moment(tag.range.min).format(dateFormat),\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: moment(tag.range.min).format(dateFormat),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: moment(tag.range.max).format(dateFormat),\r\n });\r\n } else {\r\n tip += moment(tag.range.max).format(dateFormat);\r\n }\r\n }\r\n return tip;\r\n case 'Datetime':\r\n tip = gettextCatalog.getString('Select a date and time ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('({{min}} or later)', {\r\n min: moment(tag.range.min).format(dateTimeFormat),\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: moment(tag.range.min).format(dateTimeFormat),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: moment(tag.range.max).format(dateTimeFormat),\r\n });\r\n } else {\r\n tip += moment(tag.range.max).format(dateTimeFormat);\r\n }\r\n }\r\n return tip;\r\n }\r\n };\r\n\r\n const attrDataTypesText = {\r\n text: gettext('Text'),\r\n integer: gettext('Integer'),\r\n decimal: gettext('Number'),\r\n date: gettext('Date'),\r\n datetime: gettext('Datetime'),\r\n hyperlink: gettext('Hyperlink'),\r\n };\r\n\r\n const HasValue = (val) => !!val || val === 0;\r\n\r\n this.getAttrShortHelpText = (attr) => {\r\n const { dataType, range } = attr || {};\r\n const { min = undefined, max = undefined } = range || {};\r\n\r\n const type = attrDataTypesText[dataType?.toLowerCase()];\r\n if (!type) return;\r\n\r\n const typeInfo = gettextCatalog.getString(type);\r\n\r\n if (HasValue(min) && HasValue(max)) {\r\n return gettextCatalog.getString('{{typeInfo}} between [{{min}} - {{max}}]', {\r\n typeInfo,\r\n min,\r\n max,\r\n });\r\n }\r\n\r\n if (HasValue(min)) {\r\n return gettextCatalog.getString('{{typeInfo}} min {{min}}', { typeInfo, min });\r\n }\r\n\r\n if (HasValue(max)) {\r\n return gettextCatalog.getString('{{typeInfo}} max {{max}}', { typeInfo, max });\r\n }\r\n return gettextCatalog.getString('{{typeInfo}} value', { typeInfo });\r\n };\r\n}\r\n","export default class AttributesService {\r\n constructor($q, EquipmentService) {\r\n 'ngInject';\r\n\r\n this.$q = $q;\r\n this.EquipmentService = EquipmentService;\r\n this._attrs = undefined;\r\n }\r\n\r\n getAttributeValuesByName(attrName) {\r\n return this.getAttributesList().then(attrsList => {\r\n const attr = attrsList.find(attr => attr.key === attrName);\r\n return attr && attr.values && attr.values.map(v => v.value);\r\n });\r\n }\r\n\r\n getAttributesList() {\r\n if (!this._attrs) {\r\n return this.EquipmentService.getAllTags().then(response => {\r\n this._attrs = response.data.data;\r\n return this._attrs;\r\n });\r\n }\r\n return this.$q(resolve => resolve(this._attrs));\r\n }\r\n}\r\n","const cellSignalDataPointID = 'ms_cell_signal';\r\nconst gpsSignalSeriesID = 'gps';\r\n\r\nexport default class DeviceDiagnosticService {\r\n constructor(appSettings, $http, $q, gettext) {\r\n 'ngInject';\r\n\r\n this.seriesEndpoint = `${appSettings.BaseIcebergUrl}/1537/series`;\r\n this.$http = $http;\r\n this.gettext = gettext;\r\n }\r\n\r\n get SignalStatus() {\r\n return {\r\n None: this.gettext('None'),\r\n Poor: this.gettext('Poor'),\r\n Fair: this.gettext('Fair'),\r\n Good: this.gettext('Good'),\r\n Excellent: this.gettext('Excellent'),\r\n Unavailable: this.gettext('Unavailable'),\r\n Loading: this.gettext('Loading'),\r\n Error: this.gettext('Error'),\r\n Ideal: this.gettext('Ideal'),\r\n };\r\n }\r\n\r\n get GpsQuality() {\r\n // based on ticket comment https://onei3z.atlassian.net/browse/ESDA-1972?focusedCommentId=21019\r\n // got modified to text values in https://onei3z.atlassian.net/browse/ESDA-2421\r\n return {\r\n poor: this.SignalStatus.Poor,\r\n fair: this.SignalStatus.Fair,\r\n good: this.SignalStatus.Good,\r\n excellent: this.SignalStatus.Excellent,\r\n ideal: this.SignalStatus.Ideal,\r\n };\r\n }\r\n\r\n getSeriesByDevice(esn, tag) {\r\n const tagQuery = tag ? `&tag=${tag}` : '';\r\n const url = `${this.seriesEndpoint}?attr[device]=${esn}${tagQuery}`;\r\n return this.$http.get(url).then((res) => {\r\n return res.data;\r\n });\r\n }\r\n\r\n getLastReportedGpsSeries(equipmentId) {\r\n const url = `${this.seriesEndpoint}?attr[equipment]=${equipmentId}&tag=${gpsSignalSeriesID}`;\r\n return this.$http.get(url).then((res) => {\r\n const [gps] = res.data || [];\r\n return this.getGpsStatusInfo(gps);\r\n });\r\n }\r\n\r\n getLastReportedCellSignalSeries(esn) {\r\n return this.getSeriesByDevice(esn, cellSignalDataPointID).then(([cellSignal]) =>\r\n this.getCellSignalStatusInfo(cellSignal),\r\n );\r\n }\r\n\r\n /**\r\n * @param {*} gpsSeries\r\n * return {last, status}\r\n */\r\n getGpsStatusInfo(gpsSeries) {\r\n const { last } = gpsSeries || {};\r\n const { attrs } = last || {};\r\n const { fix_quality: fixQuality = null } = attrs || {};\r\n\r\n if (fixQuality === null) {\r\n return { last, status: this.SignalStatus.Unavailable };\r\n }\r\n const status = this.GpsQuality[fixQuality.toLowerCase()] || fixQuality;\r\n\r\n return { last, status };\r\n }\r\n\r\n /**\r\n * return object {last,status}\r\n * @param {*} cellSignalSeries\r\n */\r\n getCellSignalStatusInfo(cellSignalSeries) {\r\n const { last } = cellSignalSeries || {};\r\n\r\n if (!last) {\r\n return { status: this.SignalStatus.Unavailable };\r\n }\r\n\r\n const { v } = last || {};\r\n\r\n switch (true) {\r\n case v > 80:\r\n return { last, status: this.SignalStatus.Excellent };\r\n case v > 60:\r\n return { last, status: this.SignalStatus.Good };\r\n case v > 40:\r\n return { last, status: this.SignalStatus.Fair };\r\n case v > 20:\r\n return { last, status: this.SignalStatus.Poor };\r\n default:\r\n return { last, status: this.SignalStatus.None };\r\n }\r\n }\r\n\r\n filterGpsSeries(series = []) {\r\n return series.find((s) => s.dataId === gpsSignalSeriesID);\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport appSettingsModule from '../app.settings.module';\r\n\r\nimport InviteService from './userinvite.service';\r\nimport TransferService from './transfers.service';\r\nimport SavedSearchService from './savedsearch.service';\r\nimport SecurityGroupsService from './securitygroups.service';\r\nimport SavedFilterService from './savedfilter.service';\r\nimport RoundingService from './rounding.service';\r\nimport ReportsRepository from './reports.service';\r\nimport PhotoSwipeService from './photoSwipe.service';\r\nimport PackagesService from './packages.service';\r\nimport MobileService from './mobile.service';\r\nimport MarkdownService from './markdown.service';\r\nimport NavService from './nav/nav.service';\r\nimport loadingModalService from './loading.modal.service';\r\nimport LanguagesService from './languages.service';\r\nimport InstallationNoteService from './installation.note.service';\r\nimport FileUploaderService from './fileUploader.service';\r\nimport DevicesService from './devices.service';\r\nimport {exceptionHandlerProvider, ExceptionLoggingService} from './client.side.error.logging.service';\r\nimport AttrsTranslateService from './attr.translate.service';\r\nimport AppNotificationsService from './app.notifications.service';\r\nimport AlertRuleService from './alert.rules.service';\r\nimport EquipmentSearchService from '../equipment/services/equipment-search.service';\r\nimport TagsService from './attrs-tags.service';\r\nimport AttributesService from './attributes.service';\r\nimport DeviceDiagnosticService from './device-diagnostic.service';\r\n\r\nconst serviceModule = angular.module('app.service', [appSettingsModule]);\r\n\r\nserviceModule\r\n // Controllers\r\n .service('alertRuleService', AlertRuleService)\r\n .service('appNotificationsService', AppNotificationsService)\r\n .service('attrsTranslateService', AttrsTranslateService)\r\n /**\r\n * Exception Logging Service, currently only used by the $exceptionHandler\r\n * it preserves the default behaviour ( logging to the console) but\r\n * also posts the error server side after generating a stacktrace.\r\n */\r\n .factory('exceptionLoggingService', ExceptionLoggingService)\r\n /**\r\n * Override Angular's built in exception handler, and tell it to\r\n * use our new exceptionLoggingService which is defined below\r\n */\r\n .provider('$exceptionHandler', exceptionHandlerProvider)\r\n .factory('devicesService', DevicesService)\r\n .service('fileUploaderService', FileUploaderService)\r\n .service('installationNoteService', InstallationNoteService)\r\n .service('languagesService', LanguagesService)\r\n .service('loadingModalService', loadingModalService)\r\n .service('markdownService', MarkdownService)\r\n .factory('mobileService', MobileService)\r\n .service('navService', NavService)\r\n .factory('packagesService', PackagesService)\r\n .service('photoSwipeService', PhotoSwipeService)\r\n .service('reportsRepository', ReportsRepository)\r\n .service('roundingService', RoundingService)\r\n .factory('savedFilterService', SavedFilterService)\r\n .factory('savedSearchService', SavedSearchService)\r\n .service('securityGroupsService', SecurityGroupsService)\r\n .service('transfersService', TransferService)\r\n .service('inviteService', InviteService)\r\n .service('equipmentSearchService', EquipmentSearchService)\r\n .service('tagsService', TagsService)\r\n .service('attributesService', AttributesService)\r\n .service('deviceDiagnosticService', DeviceDiagnosticService);\r\n\r\nexport default serviceModule.name;\r\n","\r\nexport default function AttrsTranslateService() {\r\n\r\n return {\r\n translateKey: function (key, language) {\r\n\r\n if (!language) {\r\n language = 'EN';\r\n }\r\n\r\n return \"\";\r\n }\r\n };\r\n}\r\n","export default function MarkdownService() {\r\n function markdownToUrl(hyperlink) {\r\n var regex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/;\r\n var arr = regex.exec(hyperlink);\r\n const [, text, url] = arr || [];\r\n return {\r\n url: url || hyperlink,\r\n text: text || hyperlink\r\n };\r\n }\r\n\r\n function urlToMarkdown(hyperlink) {\r\n return `[${hyperlink.text}](${hyperlink.url})`;\r\n }\r\n\r\n return {\r\n markdownToUrl: markdownToUrl,\r\n urlToMarkdown: urlToMarkdown\r\n };\r\n}\r\n","import PhotoSwipe from 'photoswipe';\r\nimport PhotoSwipeUI_Default from 'photoswipe/dist/photoswipe-ui-default';\r\n\r\nexport default function PhotoSwipeService() {\r\n\r\n this.init = function (photosElement, images, index) {\r\n\r\n var options = {\r\n index: index,\r\n closeElClasses: [],\r\n history: false,\r\n focus: false,\r\n zoomEl: false,\r\n tapToClose: false,\r\n closeOnScroll: false,\r\n closeOnVerticalDrag: false,\r\n clickToCloseNonZoomable: false,\r\n showAnimationDuration: 0,\r\n hideAnimationDuration: 0,\r\n };\r\n\r\n return new PhotoSwipe(photosElement, PhotoSwipeUI_Default, images, options);\r\n };\r\n}\r\n","\r\nexport default function RoundingService() {\r\n this.round = function (value, exp) {\r\n if (typeof exp === 'undefined' || +exp === 0) {\r\n return Math.round(value);\r\n }\r\n\r\n value = +value;\r\n exp = +exp;\r\n\r\n if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))\r\n return NaN;\r\n\r\n // Shift\r\n value = value.toString().split('e');\r\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));\r\n\r\n // Shift back\r\n value = value.toString().split('e');\r\n return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));\r\n };\r\n}\r\n","export const findFaultDtcDescriptor = (faultSeries = {}, datapointDescriptorsByKey = {}) => {\r\n //create array of the series fault key without fist portial (equipment:76767676)\r\n const [throwFirstPart, ...serieskeyArraywithoutEquipPart] = (faultSeries.key || '').split('.'); //eslint-disable-line no-unused-vars\r\n\r\n if (serieskeyArraywithoutEquipPart.length === 0) {\r\n return undefined;\r\n }\r\n\r\n let key = serieskeyArraywithoutEquipPart.sort().join('.');\r\n return datapointDescriptorsByKey[key];\r\n};\r\n\r\nexport const formatFaultCode = (faultSeries = {}) => {\r\n let faultCode;\r\n //fault code is part of the series key and can be found in diff items in series attrs\r\n const seriesAttr = faultSeries.attrs || {};\r\n const dtc = 'DTC';\r\n switch (seriesAttr.type) {\r\n case 'j1939': {\r\n const spn = seriesAttr.spn ? `${seriesAttr.spn}` : '';\r\n const fmi = seriesAttr.fmi ? `${seriesAttr.fmi}` : '';\r\n const source = seriesAttr.source ? `${seriesAttr.source}` : '';\r\n faultCode = `${dtc}: j1939, SPN: ${spn}, FMI: ${fmi}, Source: ${source}`;\r\n break;\r\n }\r\n case 'obd2': {\r\n const code = faultSeries.attrs.code ? `${faultSeries.attrs.code}` : '';\r\n faultCode = `${dtc}: OBD2, Code: ${code}`;\r\n break;\r\n }\r\n case 'railway': {\r\n const code = faultSeries.attrs.code ? `${faultSeries.attrs.code}` : '';\r\n const source = faultSeries.attrs.source ? `${faultSeries.attrs.source}` : '';\r\n const severity = faultSeries.attrs.severity ? `${faultSeries.attrs.severity}` : '';\r\n faultCode = `${dtc}: Railway, Source: ${source.toUpperCase()}, Code: ${code}, Severity: ${severity}`;\r\n break;\r\n }\r\n case 'genie': {\r\n const code = faultSeries.attrs.code ? `${faultSeries.attrs.code}` : '';\r\n const source = faultSeries.attrs.source ? `${faultSeries.attrs.source}` : '';\r\n const category = faultSeries.attrs.category ? `${faultSeries.attrs.category}` : '';\r\n faultCode = `${dtc}: Genie, Code: ${code}, Category: ${category}, Source: ${source}`;\r\n break;\r\n }\r\n }\r\n\r\n return faultCode;\r\n};\r\n\r\nexport const IsTSeriesDevice = (attrs = {}) => {\r\n const deviceModel = attrs['onei3:model'];\r\n // t-series model start with t followed by numders (t25,t15)\r\n const tSeriesRegex = new RegExp('^(T|t)[0-9]+$');\r\n return tSeriesRegex.test(deviceModel);\r\n};\r\n","import angular from 'angular';\r\nimport { isArray } from 'lodash-es';\r\n\r\nimport * as EquipmentServiceUtil from './equipment.service.util';\r\n\r\nimport { INITIAL_STATE } from '../state/search/search.state';\r\nimport { ASSET_TYPE_ATTRIBUTE } from '../api/assetTypeAttribute';\r\n\r\nconst getLastCommunicationOptions = () =>\r\n INITIAL_STATE.lastCommunicated.map((lscomm) => ({ ...lscomm, _selected: false }));\r\n\r\nexport default function EquipmentService(\r\n $q,\r\n $http,\r\n appSettings,\r\n $rootScope,\r\n EquipmentMockService,\r\n securityGroupsService,\r\n gettextCatalog,\r\n urlUtil,\r\n equipmentSearchService,\r\n) {\r\n 'ngInject';\r\n\r\n if (appSettings.FixturesModeEnabled) {\r\n return EquipmentMockService;\r\n }\r\n\r\n const toArray = (input) => {\r\n input = !input ? [] : input;\r\n return Array.isArray(input) ? input : [input];\r\n };\r\n\r\n const lowercaseKeys = (item) => {\r\n _.forEach(item, function (value, key) {\r\n let lower = key.toLowerCase();\r\n // check if it already wasn't lowercase\r\n if (lower !== key) {\r\n item[lower] = item[key];\r\n delete item[key];\r\n }\r\n });\r\n return item;\r\n };\r\n\r\n //keys for facets dictionary access\r\n let FACET_SECURITY_GROUPS_KEY = 'securityGroups';\r\n let FACET_MAINTENANCE_KEY = 'maintenance';\r\n let FACET_ALERT_PRIORITY_KEY = 'alerts';\r\n let FACET_LAST_COMM_KEY = 'lastCommunicated';\r\n\r\n let isDtcSeries = function (seriesItem) {\r\n let filtered = true;\r\n\r\n if (seriesItem.tags != null && seriesItem.tags.length > 0) {\r\n for (let i = 0; i < seriesItem.tags.length; i++) {\r\n if (seriesItem.tags[i] === 'dtc') {\r\n return true;\r\n }\r\n }\r\n }\r\n return !filtered;\r\n };\r\n\r\n return {\r\n //UTILS\r\n //Get the equipment priority based on the properties\r\n getEquipmentPriority: function (equipment) {\r\n let maxPriority = 0;\r\n\r\n if (equipment && equipment.properties) {\r\n for (let i = 0; i < equipment.properties.length; i++) {\r\n let tag = equipment.properties[i];\r\n\r\n if (tag.indexOf('alert:high') !== -1) {\r\n maxPriority = Math.max(3, maxPriority);\r\n } else if (tag.indexOf('alert:medium') !== -1) {\r\n maxPriority = Math.max(2, maxPriority);\r\n }\r\n }\r\n }\r\n return maxPriority;\r\n },\r\n //API\r\n getEquipmentWithinBounds: function (nw, se, q) {\r\n if (q)\r\n return $http.get(\r\n appSettings.InReachApiEquipmentEndpoint +\r\n '/boundingbox/' +\r\n nw.lng +\r\n '/' +\r\n nw.lat +\r\n '/' +\r\n se.lng +\r\n '/' +\r\n se.lat +\r\n '/' +\r\n q,\r\n );\r\n else\r\n return $http.get(\r\n appSettings.InReachApiEquipmentEndpoint +\r\n '/boundingbox/' +\r\n nw.lng +\r\n '/' +\r\n nw.lat +\r\n '/' +\r\n se.lng +\r\n '/' +\r\n se.lat +\r\n '/',\r\n );\r\n },\r\n getTimeseriesCsvData: (equipmentId, timeRange) =>\r\n $http.get(\r\n `${appSettings.InReachApiTimeSeriesEndpoint}/csv/${equipmentId}?timeRange=${timeRange}`,\r\n ),\r\n getEquipment: function (equipmentId, cancelDefer, includeList, uom) {\r\n let options = {};\r\n if (cancelDefer) {\r\n options['timeout'] = cancelDefer;\r\n }\r\n let endpoint = appSettings.InReachApiEquipmentEndpoint + '/';\r\n\r\n if (equipmentId) {\r\n endpoint += equipmentId;\r\n }\r\n\r\n let first = true;\r\n\r\n if (Array.isArray(includeList)) {\r\n for (let i = 0; i < includeList.length; i++) {\r\n endpoint += (first ? '?' : '&') + 'include=' + includeList[i];\r\n first = false;\r\n }\r\n }\r\n if (!uom) {\r\n uom = $rootScope.currentUser.claims.data.unitOfMeasure;\r\n }\r\n\r\n if (uom) {\r\n endpoint += (first ? '?' : '&') + 'uom=' + uom;\r\n }\r\n\r\n return $http.get(endpoint, options);\r\n },\r\n\r\n getEquipmentActiveFaults: function (seriesList) {\r\n let results = [];\r\n\r\n for (let i = 0; i < seriesList.length; i++) {\r\n if (isDtcSeries(seriesList[i])) {\r\n if (seriesList[i].last && seriesList[i].last.v !== 0) {\r\n results.push(seriesList[i]);\r\n }\r\n }\r\n }\r\n return results;\r\n },\r\n\r\n getDtcFaultDescriptor: (fault = {}) =>\r\n EquipmentServiceUtil.findFaultDtcDescriptor(fault, $rootScope.datapointDescriptorsByKey),\r\n formatFaultCode: (fault = {}) => EquipmentServiceUtil.formatFaultCode(fault),\r\n getEquipmentSeries: function (equipmentId, tag) {\r\n let uom = $rootScope.currentUser.claims.data.unitOfMeasure;\r\n return $http.get(\r\n appSettings.InReachApiTimeSeriesEndpoint +\r\n '/?equipmentId=' +\r\n equipmentId +\r\n (tag ? '&tag=' + tag : '') +\r\n '&uom=' +\r\n uom,\r\n );\r\n },\r\n getSeriesByMultipleEquipment: function (equipmentIds) {\r\n if (equipmentIds.length === 0) return;\r\n let url = appSettings.InReachApiTimeSeriesEndpoint + '/filter';\r\n return $http.post(url, equipmentIds);\r\n },\r\n getEquipSeriesData: function (seriesIDs, range, interval, functions) {\r\n let url = appSettings.InReachApiTimeSeriesEndpoint + '/data?';\r\n\r\n let requestData = {\r\n ids: seriesIDs,\r\n uom: $rootScope.currentUser.claims.data.unitOfMeasure,\r\n interval: angular.isString(interval) ? interval : null,\r\n functions: Array.isArray(functions) ? functions : null,\r\n range:\r\n Array.isArray(range) && range.length === 2\r\n ? urlUtil.toRangeParam(range[0], range[1])\r\n : '1point',\r\n };\r\n\r\n return $http.post(url, requestData);\r\n },\r\n\r\n //Return a list of all the things we can facetted search on\r\n getEquipmentFacets: function () {\r\n let def = $q.defer();\r\n let result = {};\r\n\r\n function onError(response) {\r\n def.reject(response);\r\n }\r\n\r\n let alerts = [];\r\n alerts.push({\r\n name: gettextCatalog.getString('Low'),\r\n description: gettextCatalog.getString('Assets with active low priority alerts'),\r\n tag: 'onei3:alert:low',\r\n icon: 'fa fa-exclamation-circle color-low-priority',\r\n });\r\n alerts.push({\r\n name: gettextCatalog.getString('Medium'),\r\n tag: 'onei3:alert:medium',\r\n icon: 'fa fa-exclamation-circle color-medium-priority',\r\n description: gettextCatalog.getString('Assets with active medium priority alerts'),\r\n });\r\n alerts.push({\r\n name: gettextCatalog.getString('High'),\r\n tag: 'onei3:alert:high',\r\n description: gettextCatalog.getString('Assets with active high priority alerts'),\r\n icon: 'fa fa-exclamation-circle color-high-priority',\r\n });\r\n\r\n result[FACET_ALERT_PRIORITY_KEY] = alerts;\r\n\r\n let maintenance = [];\r\n\r\n maintenance.push({\r\n name: gettextCatalog.getString('Due'),\r\n tag: 'onei3:maintenance:due',\r\n icon: 'fa fa-wrench color-high-priority',\r\n description: gettextCatalog.getString('Assets with maintenance due'),\r\n });\r\n\r\n maintenance.push({\r\n name: gettextCatalog.getString('Upcoming'),\r\n tag: 'onei3:maintenance:upcoming',\r\n description: gettextCatalog.getString('Assets with maintenance upcoming'),\r\n icon: 'fa fa-wrench color-low-priority',\r\n });\r\n\r\n result[FACET_MAINTENANCE_KEY] = maintenance;\r\n\r\n //using state last communication options\r\n result[FACET_LAST_COMM_KEY] = getLastCommunicationOptions();\r\n\r\n securityGroupsService.getAllSecurityGroups().then(function (response) {\r\n let securityGroups = response.data.data;\r\n result[FACET_SECURITY_GROUPS_KEY] = [];\r\n let secGroupPrefix = 'onei3:security:group:';\r\n //Need to append the quantity from the tags\r\n for (let i = 0; i < securityGroups.length; i++) {\r\n let group = securityGroups[i];\r\n\r\n //create the facet object for securty groups\r\n result[FACET_SECURITY_GROUPS_KEY].push({\r\n name: group.name,\r\n tag: secGroupPrefix + group.id,\r\n description: group.attrs.description || group.name,\r\n });\r\n }\r\n\r\n def.resolve(result);\r\n }, onError);\r\n\r\n return def.promise;\r\n },\r\n\r\n getEquipmentSearch: function (\r\n query,\r\n options,\r\n filters,\r\n bounds,\r\n shareKey,\r\n facets,\r\n tagFilters,\r\n modes,\r\n includes,\r\n prefilter,\r\n sort,\r\n accounts,\r\n ) {\r\n let share = shareKey\r\n ? {\r\n to: shareKey,\r\n }\r\n : null;\r\n\r\n if (!query) {\r\n query = [];\r\n }\r\n\r\n query = toArray(query);\r\n\r\n let filter = equipmentSearchService.buildAPIEquipmentFilterObject(\r\n query,\r\n options,\r\n bounds,\r\n share,\r\n facets,\r\n tagFilters,\r\n modes,\r\n prefilter,\r\n sort,\r\n accounts,\r\n );\r\n return this.getEquipmentBySearchFilter(filter).then(function (response) {\r\n if (\r\n filter.searchOutsideBound &&\r\n isArray(response.data.hits) &&\r\n response.data.hits.length > 0\r\n ) {\r\n response.data.locationRedirectFlag = true;\r\n }\r\n return response;\r\n });\r\n },\r\n getAllEquipmentSearch: (\r\n query,\r\n options,\r\n filters,\r\n bounds,\r\n shareKey,\r\n facets,\r\n tagFilters,\r\n modes,\r\n includes,\r\n prefilter,\r\n sort,\r\n ) => {\r\n let share = shareKey\r\n ? {\r\n to: shareKey,\r\n }\r\n : null;\r\n\r\n query = toArray(query);\r\n\r\n let filter = equipmentSearchService.buildAPIEquipmentFilterObject(\r\n query,\r\n { limit: 2500 },\r\n bounds,\r\n share,\r\n facets,\r\n tagFilters,\r\n modes,\r\n prefilter,\r\n sort,\r\n );\r\n\r\n let endpoint = appSettings.InReachApiEquipmentEndpoint + '/all/filter';\r\n return $http.post(endpoint, filter).then(function (response) {\r\n if (\r\n filter.searchOutsideBound &&\r\n isArray(response.data.hits) &&\r\n response.data.hits.length > 0\r\n ) {\r\n response.data.locationRedirectFlag = true;\r\n }\r\n return response;\r\n });\r\n },\r\n putEquipment: function (equipment) {\r\n let url = appSettings.InReachApiEndpoint + '/equipment/' + equipment.id;\r\n return $http.put(url, equipment);\r\n },\r\n batchPatchAttrs: function (changeset) {\r\n let url = appSettings.InReachApiEndpoint + '/equipment/batchPatch';\r\n return $http.patch(url, changeset);\r\n },\r\n getSingleEquipment: function (equipId) {\r\n let endpoint = appSettings.InReachApiEndpoint + '/equipment/' + equipId;\r\n return $http.get(endpoint);\r\n },\r\n postEquipmentListByIds: function (equipIds) {\r\n let endpoint = appSettings.IcebergApiEquipmentEndpoint + '/equipment/_filter';\r\n return $http.post(endpoint, equipIds).then(function (response) {\r\n response.data.forEach((equipment) => {\r\n equipment.attrs = lowercaseKeys(equipment.attrs);\r\n });\r\n return response;\r\n });\r\n },\r\n getAllTags: function () {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs';\r\n return $http.get(endpoint).then((response) => {\r\n // Adding the asset type attr.\r\n //response.data.data.push(ASSET_TYPE_ATTRIBUTE);\r\n return response;\r\n });\r\n },\r\n getTagById: function (id) {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs/' + id;\r\n return $http.get(endpoint);\r\n },\r\n getTagNames: function () {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs/attr/names';\r\n return $http.get(endpoint);\r\n },\r\n postNewTag: function (tag) {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs';\r\n return $http.post(endpoint, tag);\r\n },\r\n putEditTag: function (id, tag) {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs/' + id;\r\n return $http.put(endpoint, tag);\r\n },\r\n deleteTag: function (id) {\r\n let endpoint = appSettings.IcebergApiAttributesEndpoint + '/attrs/' + id;\r\n return $http.delete(endpoint);\r\n },\r\n patchEquipmentProfileImage: function (equipId, image) {\r\n let endpoint =\r\n appSettings.InReachApiEquipmentEndpoint + '/' + equipId + '/relationships/profileimage';\r\n let body = {};\r\n body.data = {};\r\n body.data.id = image.id;\r\n return $http.patch(endpoint, body);\r\n },\r\n\r\n getEquipmentBySearchFilter: function (filter) {\r\n if (!filter) {\r\n filter = {\r\n queries: ['*'],\r\n };\r\n }\r\n let endpoint = appSettings.InReachApiEquipmentEndpoint + '/search/filter';\r\n return $http.post(endpoint, filter);\r\n },\r\n };\r\n}\r\n","export default function UsersService($http, appSettings, $q, initialData, gettextCatalog) {\r\n 'ngInject';\r\n const userInfoBaseUrl = `${appSettings.IcebergApiUserInfoEndpoint}`;\r\n const datapointsBaseUrl = `${appSettings.IcebergApiDatapointsEndpoint}`;\r\n\r\n const flatPermissions = (user) => {\r\n if (user) {\r\n user.permissions = (_currentUser.features || []).map((u) => u.path);\r\n }\r\n return user;\r\n };\r\n let _currentUser = initialData.currentUser;\r\n\r\n this.currentUser = () => flatPermissions(_currentUser);\r\n\r\n this.currentUserAsync = () => new Promise((resolve) => resolve(flatPermissions(_currentUser)));\r\n\r\n this.getCurrentUser = () => {\r\n const def = $q.defer();\r\n\r\n $http.get(`${appSettings.InReachApiEndpoint}/users/me`).then(\r\n (response) => {\r\n _currentUser = response.data;\r\n return def.resolve(response);\r\n },\r\n () => def.reject(gettextCatalog.getString('failed to get current user')),\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.hasRequiredFeatures = (features) => {\r\n let userFeatures = _currentUser ? _currentUser.features : [];\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n let s = features[i];\r\n\r\n let hasState = false;\r\n\r\n if (userFeatures) {\r\n for (let j = 0; j < userFeatures.length; j++) {\r\n if (userFeatures[j].path === s) {\r\n hasState = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!hasState) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n this.getUsers = () => $http.get(`${userInfoBaseUrl}/users`);\r\n\r\n this.getUserClaims = () => $http.get(`${userInfoBaseUrl}/users/me/claims`);\r\n\r\n this.updateUserClaims = (claims) => {\r\n // No nulls for prefix. That breaks stuff.\r\n claims.prefix = claims.prefix || '';\r\n\r\n // Hack for now until we deprecate firstName, lastName claims.\r\n if (claims.firstName) {\r\n claims.given_name = claims.firstName;\r\n } else {\r\n delete claims.given_name;\r\n }\r\n if (claims.lastName) {\r\n claims.family_name = claims.lastName;\r\n } else {\r\n delete claims.family_name;\r\n }\r\n if (claims.firstName || claims.lastName) {\r\n claims.name = (\r\n (claims.given_name ? claims.given_name : '') +\r\n ' ' +\r\n (claims.family_name ? claims.family_name : '')\r\n ).trim();\r\n } else {\r\n delete claims.name;\r\n }\r\n\r\n return $http.put(`${userInfoBaseUrl}/users/me/claims`, claims);\r\n };\r\n\r\n this.patchCurrentUserClaims = (changesets) =>\r\n $http.patch(`${userInfoBaseUrl}/users/me/claims`, changesets);\r\n\r\n this.changeEmail = (newemail) => $http.post(`${userInfoBaseUrl}/users/me/email`, newemail);\r\n\r\n this.getUser = function (id) {\r\n let deferred = $q.defer();\r\n\r\n if (!id) {\r\n deferred.reject(gettextCatalog.getString('No user specified.'));\r\n }\r\n\r\n $http.get(`${userInfoBaseUrl}/users/${id}`).then(\r\n function (response) {\r\n deferred.resolve(response);\r\n },\r\n function (error) {\r\n deferred.reject(error);\r\n },\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n this.patchUserInfo = (id, changesets) =>\r\n $http.patch(`${userInfoBaseUrl}/users/${id}/claims`, changesets);\r\n\r\n this.updateUserInfo = (id, firstName, lastName) => {\r\n if (!id) {\r\n return id;\r\n }\r\n const userId = id;\r\n const userInfo = [\r\n {\r\n op: 'update',\r\n claims: {\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n // IANA JWT claims.\r\n given_name: firstName || '',\r\n family_name: lastName || '',\r\n },\r\n },\r\n ];\r\n\r\n return $http.patch(`${userInfoBaseUrl}/users/${userId}/claims`, userInfo);\r\n };\r\n\r\n this.postUserInfo = (id, firstName, lastName) => {\r\n if (!id) {\r\n return id;\r\n }\r\n const userId = id;\r\n const userInfo = [\r\n {\r\n op: 'add',\r\n claims: {\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n // IANA JWT claims.\r\n given_name: firstName || '',\r\n family_name: lastName || '',\r\n },\r\n },\r\n ];\r\n\r\n return $http.patch(`${userInfoBaseUrl}/users/${userId}/claims`, userInfo);\r\n };\r\n\r\n this.removeUser = (id) => {\r\n const deferred = $q.defer();\r\n\r\n if (!id) {\r\n deferred.reject(gettextCatalog.getString('No user specified.'));\r\n }\r\n\r\n $http.delete(`${userInfoBaseUrl}/users/${id}`).then(\r\n function (response) {\r\n deferred.resolve(response);\r\n },\r\n function (error) {\r\n deferred.reject(error);\r\n },\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n this.changePassword = (model) => $http.post(`${userInfoBaseUrl}/users/me/password`, model);\r\n\r\n this.getRoleDetails = (id) => $http.get(`${userInfoBaseUrl}/roles/${id}`);\r\n\r\n this.deleteRoleDetails = (id) => $http.delete(`${userInfoBaseUrl}/roles/${id}`);\r\n\r\n this.putRoleDetails = (data) => {\r\n if (!data || !data.id) return; //Invalid role details\r\n return $http.put(`${userInfoBaseUrl}/roles/${data.id}`, data);\r\n };\r\n\r\n this.getRolePolicies = () => $http.get(`${userInfoBaseUrl}/policies`);\r\n\r\n this.getDatapoints = () =>\r\n $http.get(`${datapointsBaseUrl}/datapoints`).then((response) => {\r\n response.data.forEach((datapoint) => {\r\n datapoint.en_description = datapoint.description;\r\n datapoint.description = gettextCatalog.getString(datapoint.description);\r\n });\r\n return response;\r\n });\r\n\r\n this.getDataPointsByRoleIds = (ids) =>\r\n $http.get(`${datapointsBaseUrl}/datapoints`, {\r\n params: {\r\n role: JSON.stringify(ids),\r\n },\r\n });\r\n\r\n this.patchUserRoles = (id, changes) => {\r\n if (!id) {\r\n return id;\r\n }\r\n\r\n return $http.patch(`${userInfoBaseUrl}/users/${id}/roles`, changes);\r\n };\r\n\r\n this.isUserAnAdministrator = () => {\r\n let isAdmin = false;\r\n\r\n this.currentUser().roles.data.forEach((role) => {\r\n if (role.name === 'Administrator') {\r\n isAdmin = true;\r\n }\r\n });\r\n\r\n return isAdmin;\r\n };\r\n\r\n /*\r\n This role ID comparison is for Sunbelt UK Expiry feature, it is not to be used for other accounts and roles unless approved\r\n */\r\n this.canUserEditExpiry = () => {\r\n const user = this.currentUser();\r\n const approvedRoleIds = [-1, 1685525393803260437, 1642277373393525597];\r\n \r\n for (let i = 0; i < user.roles.data.length; ++i) {\r\n if (\r\n this.hasRequiredFeatures(['access.operator_expiry']) &&\r\n approvedRoleIds.includes(user.roles.data[i].id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n}\r\n","export default function UsersService($http, appSettings, $q, gettextCatalog) {\r\n 'ngInject';\r\n var _currentUser = null;\r\n\r\n this.currentUser = function () {\r\n return _currentUser;\r\n };\r\n\r\n this.getCurrentUser = function () {\r\n var endpoint = appSettings.InReachApiEndpoint + '/users/me';\r\n var def = $q.defer();\r\n\r\n $http.get(endpoint).then(\r\n response => {\r\n _currentUser = response.data;\r\n return def.resolve(response);\r\n },\r\n () => def.reject(gettextCatalog.getString('failed to get current user'))\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.getUsers = function () {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users';\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.getUserClaims = function () {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users/me/claims';\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.updateUserClaims = function (claims) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users/me/claims';\r\n\r\n return $http.put(endpoint, claims);\r\n };\r\n this.changeEmail = function (newemail) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users/me/email';\r\n\r\n return $http.post(endpoint, newemail);\r\n };\r\n\r\n this.getUser = function (id) {\r\n if (!id) {\r\n return id;\r\n }\r\n\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users/' + id;\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.updateUserInfo = function (id, firstName, lastName) {\r\n if (!id) {\r\n return id;\r\n }\r\n var userId = id;\r\n var userInfo = [{\r\n op: 'update',\r\n claims: {\r\n firstName: firstName || '',\r\n lastName: lastName || ''\r\n }\r\n }];\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users';\r\n\r\n return $http.patch(endpoint + '/' + userId + '/claims', userInfo);\r\n };\r\n\r\n this.postUserInfo = function (id, firstName, lastName) {\r\n if (!id) {\r\n return id;\r\n }\r\n var userId = id;\r\n var userInfo = [{\r\n op: 'add',\r\n claims: {\r\n firstName: firstName || '',\r\n lastName: lastName || ''\r\n }\r\n }];\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users';\r\n\r\n return $http.patch(endpoint + '/' + userId + '/claims', userInfo);\r\n };\r\n\r\n this.postUserRole = function (userRole) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/roles';\r\n return $http.post(endpoint, userRole);\r\n };\r\n\r\n this.changePassword = function (model) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users/me/password';\r\n return $http.post(endpoint, model);\r\n };\r\n\r\n this.getRoles = function () {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/roles';\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getRoleDetails = function (id) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/roles/' + id;\r\n\r\n return $http.get(endpoint);\r\n };\r\n this.deleteRoleDetails = function (id) {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/roles/' + id;\r\n\r\n return $http.delete(endpoint);\r\n };\r\n\r\n this.putRoleDetails = function (data) {\r\n if (!data || !data.id) return; //Invalid role details\r\n\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/roles/' + data.id;\r\n\r\n return $http.put(endpoint, data);\r\n };\r\n\r\n this.getRolePolicies = function () {\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/policies';\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getDatapoints = function () {\r\n var endpoint = appSettings.IcebergApiDatapointsEndpoint;\r\n return $http.get(endpoint + '/datapoints');\r\n };\r\n\r\n this.getDataPointsByRoleIds = function (ids) {\r\n var endpoint = appSettings.IcebergApiDatapointsEndpoint;\r\n return $http.get(endpoint + '/datapoints', {\r\n params: {\r\n role: JSON.stringify(ids)\r\n }\r\n });\r\n };\r\n\r\n this.patchUserRoles = function (id, changes) {\r\n if (!id) {\r\n return id;\r\n }\r\n var userId = id;\r\n var endpoint = appSettings.IcebergApiUserInfoEndpoint + '/users';\r\n\r\n return $http.patch(endpoint + '/' + userId + '/roles', changes);\r\n };\r\n}","export default function AlertsMockService($http) {\r\n 'ngInject';\r\n this.getAllAlerts = function () {\r\n return $http.get('./app/fixtures/alerts.json');\r\n };\r\n\r\n this.getNotes = function () {\r\n return $http.get('./app/fixtures/alerts/alerts.detail.notes.json');\r\n };\r\n}","export default function AlertsService($http, $q, $rootScope, appSettings, toastr, gettextCatalog) {\r\n 'ngInject';\r\n var alertsEndpoint = appSettings.InReachApiAlertsEndpoint + '/occurrences';\r\n return {\r\n // repository\r\n getAllAlerts: function(equipmentId, priority, status) {\r\n var q = '';\r\n if (equipmentId) {\r\n q = '?equipmentId=' + equipmentId;\r\n }\r\n if (priority && status && q.length > 0) {\r\n q += '&priority=' + priority + '&status=' + status;\r\n }\r\n if (priority && status && q === '') {\r\n q = '?priority=' + priority + '&status=' + status;\r\n }\r\n\r\n if (equipmentId || priority || status) {\r\n return $http.get(alertsEndpoint + '/active/lite' + q);\r\n }\r\n\r\n return $http.get(alertsEndpoint + '/active/lite');\r\n },\r\n getAlertAggregate: function() {\r\n return $http.get(alertsEndpoint + '/activecount');\r\n },\r\n getAlert: function(alertId) {\r\n return $http.get(alertsEndpoint + '/' + alertId);\r\n },\r\n getAllAlertHistory: function(data) {\r\n return $http.post(alertsEndpoint, data);\r\n },\r\n getAlertHistoryDetails: function(alertId) {\r\n return $http.get(alertsEndpoint + '/' + alertId + '/details');\r\n },\r\n updateAlert: function(alertId, singleAlert) {\r\n return $http.put(alertsEndpoint + '/' + alertId, singleAlert);\r\n },\r\n createNote: function(alertId, note) {\r\n return $http.post(alertsEndpoint + '/' + alertId + '/notes', note);\r\n },\r\n deleteNote: function(alertId, noteId, note) {\r\n return $http({\r\n method: 'DELETE',\r\n url: alertsEndpoint + '/' + alertId + '/notes/' + noteId,\r\n data: note,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n },\r\n updateNote: function(alertId, noteId, note) {\r\n return $http.put(alertsEndpoint + '/' + alertId + '/notes/' + noteId, note);\r\n },\r\n getNote: function(alertId) {\r\n return $http.get(alertsEndpoint + '/' + alertId + '/note');\r\n },\r\n getNotes: function(alertId) {\r\n return $http.get(alertsEndpoint + '/' + alertId + '/notes');\r\n },\r\n getAllRules: function() {\r\n return $http.get(appSettings.InReachApiAlertRulesEndpoint + '/all');\r\n },\r\n getAlertCount: function() {\r\n return $http.get(alertsEndpoint + '/count');\r\n },\r\n getRuleById: function(ruleID) {\r\n return $http.get(appSettings.InReachApiAlertRulesEndpoint + '/' + ruleID);\r\n },\r\n updateAlertAcknowledge: updateAlertAcknowledge,\r\n updateAlertClear: updateAlertClear,\r\n\r\n ////// service\r\n removeAlert: removeAlert,\r\n clearAlert: clearAlert,\r\n acknowledgeAlert: acknowledgeAlert\r\n };\r\n\r\n ////repository\r\n function updateAlertAcknowledge(instanceid) {\r\n return $q(function(resolve, reject) {\r\n $http.post(alertsEndpoint + '/' + instanceid + '/acknowledge').then(\r\n function(response) {\r\n resolve(response);\r\n },\r\n function(response) {\r\n toastr.error(\r\n gettextCatalog.getString('An error occured while acknowledging the alert. Please try again later.'),\r\n gettextCatalog.getString('Error')\r\n );\r\n reject(response);\r\n }\r\n );\r\n });\r\n }\r\n\r\n function updateAlertClear(instanceId) {\r\n return $q(function(resolve, reject) {\r\n $http.post(alertsEndpoint + '/' + instanceId + '/clear').then(\r\n function(response) {\r\n resolve(response);\r\n },\r\n function(response) {\r\n toastr.error(\r\n gettextCatalog.getString('An error occured while clearing the alert. Please try again later.'),\r\n gettextCatalog.getString('Error')\r\n );\r\n reject(response);\r\n }\r\n );\r\n });\r\n }\r\n\r\n ///service\r\n function removeAlert(alert, alerts) {\r\n var elementPos = alerts\r\n .map(function(x) {\r\n return x.attributes.instanceId;\r\n })\r\n .indexOf(alert.attributes.instanceId);\r\n\r\n if (elementPos != -1) {\r\n alerts.splice(elementPos, 1);\r\n }\r\n }\r\n\r\n function clearAlert(alert, alerts) {\r\n return this.updateAlertClear(alert.attributes.instanceId).then(() => removeAlert(alert, alerts));\r\n }\r\n\r\n function acknowledgeAlert(alert) {\r\n return updateAlertAcknowledge(alert.attributes.instanceId).then(() => {\r\n alert.attributes.updatedBy = $rootScope.currentUser.email;\r\n alert.attributes.status = 'Acknowledged';\r\n });\r\n }\r\n}\r\n","import angular from 'angular';\r\n\r\nexport default function CommandsRepo($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n getCommandsForEquipment: function (equipmentId) {\r\n return $http.get(appSettings.InReachApiEndpoint + '/equipment/' + equipmentId + '/commands/');\r\n },\r\n getCommands: function () {\r\n return $http.get(appSettings.InReachApiEndpoint + '/commands/');\r\n },\r\n getEquipmentCommandHistory: function (equipmentId) {\r\n var url = appSettings.InReachApiEndpoint + '/equipment/' + equipmentId + '/commands/history';\r\n return $http.get(url);\r\n },\r\n getCommandHistoryItem: function (historyItemId) {\r\n var url = appSettings.InReachApiEndpoint + '/equipment/commands/history/' + historyItemId;\r\n return $http.get(url);\r\n },\r\n getLatestEquipmentCommandHistory: function (equipmentId, commandName) {\r\n var url = appSettings.InReachApiEndpoint + '/equipment/' + equipmentId + '/commands/' + commandName + '/latest';\r\n return $http.get(url);\r\n },\r\n getCommandRecords: function (options) {\r\n var suffix = null;\r\n\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n function appendParam(key, value) {\r\n if (!suffix) {\r\n suffix = '?' + key + '=' + value;\r\n } else {\r\n suffix += '&' + key + '=' + value;\r\n }\r\n }\r\n\r\n if (!angular.isDefined(options.page)) {\r\n options.page = {\r\n number: 1,\r\n size: 20\r\n };\r\n }\r\n\r\n if (angular.isDefined(options.page.number)) {\r\n appendParam('page[number]', options.page.number);\r\n }\r\n\r\n if (angular.isDefined(options.page.size)) {\r\n appendParam('page[size]', options.page.size);\r\n }\r\n\r\n return $http.get(appSettings.InReachApiEndpoint + '/commandRecords/' + suffix);\r\n },\r\n executeCommand: function (equipmentId, commandName, params) {\r\n var body = {\r\n parameters: params\r\n };\r\n\r\n var url = appSettings.InReachApiEndpoint + '/equipment/' + equipmentId + '/commands/' + commandName;\r\n\r\n return $http.put(url, body);\r\n },\r\n getDevice: function (serialNumber) {\r\n return $http.get(appSettings.IcebergApiCommandsEndpoint + '/devices/' + serialNumber);\r\n }\r\n };\r\n}","export default function ConfigService($http, appSettings, $q, gettextCatalog) {\r\n 'ngInject';\r\n return {\r\n //Gets all of the possible configurations for datapoints with the packages that you have access to\r\n getDatapointDisplayList: function () {\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getDatapointDisplayById: function (id) {\r\n if (!id) {\r\n var res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display/' + id;\r\n\r\n return $http.get(endpoint);\r\n },\r\n getDatapointDisplayForPackageAndModules: function (packageId, modulesIds) {\r\n if (!packageId) {\r\n let res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n //validate that the module ids is a proper array\r\n if (!modulesIds || Object.prototype.toString.call(modulesIds) !== '[object Array]') {\r\n let res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display/?packageId=' + packageId;\r\n\r\n if (modulesIds && modulesIds.length > 0) {\r\n for (var i = 0; i < modulesIds.length; i++) {\r\n endpoint += 'moduleIds=' + modulesIds[i];\r\n }\r\n }\r\n\r\n return $http.get(endpoint);\r\n },\r\n createDatapointDisplayForPackageAndModules: function (packageId, modulesIds, dpd) {\r\n //Validated proper stuff parameters\r\n if (!packageId) {\r\n let res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n //validate that the module ids is a proper array\r\n if (!modulesIds || Object.prototype.toString.call(modulesIds) !== '[object Array]') {\r\n let res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n //Validate that the display items are specified\r\n if (!dpd || !dpd.displayItems) {\r\n let res = $q.defer();\r\n res.reject(gettextCatalog.getString('Please provide datapoint display items'));\r\n return res.promise;\r\n }\r\n\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display/?packageId=' + packageId;\r\n for (var i = 0; i < modulesIds.length; i++) {\r\n endpoint += '&moduleIds=' + modulesIds[i];\r\n }\r\n\r\n return $http.post(endpoint, dpd);\r\n },\r\n updateDatapointDisplay: function (dpd) {\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display/' + dpd.id + '/';\r\n\r\n return $http.put(endpoint, dpd);\r\n },\r\n deleteDatapointDisplayById: function (id) {\r\n if (!id) {\r\n let res = $q.defer();\r\n res.reject();\r\n return res.promise;\r\n }\r\n\r\n var endpoint = appSettings.InReachApiEndpoint + '/config/display/' + id;\r\n\r\n return $http.delete(endpoint);\r\n }\r\n };\r\n}","export default function ConfigurationsService($q, $http, appSettings) {\r\n 'ngInject';\r\n\r\n var configurationsEndpoint = appSettings.InReachApiAlertsEndpoint + '/configurations';\r\n\r\n this.postConfiguration = function (configuration) {\r\n var endpoint = configurationsEndpoint;\r\n return $http.post(endpoint, configuration);\r\n };\r\n\r\n this.getConfigurationById = function (id) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.get(endPoint);\r\n };\r\n\r\n this.getConfigurationByName = function (name) {\r\n var endPoint = configurationsEndpoint + '/name/' + name;\r\n return $http.get(endPoint);\r\n };\r\n\r\n this.getAllConfigurations = function () {\r\n var endpoint = configurationsEndpoint;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.putConfigurationUpdate = function (id, data) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.put(endPoint, data);\r\n };\r\n\r\n this.deleteConfiguration = function (id) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.delete(endPoint);\r\n };\r\n\r\n this.patchConfiguration = function (id, data) {\r\n\r\n var deferred = $q.defer();\r\n var endpoint = configurationsEndpoint + '/' + id;\r\n\r\n $http.patch(endpoint, data).then(function (configurationResponse) {\r\n //Return configuration patch response\r\n deferred.resolve(configurationResponse);\r\n }, function (configurationError) {\r\n //Configuration patch error\r\n deferred.reject(configurationError);\r\n });\r\n\r\n return deferred.promise;\r\n };\r\n\r\n this.patchConfigurationEquipment = function (id, data) {\r\n var endpoint = configurationsEndpoint + '/' + id + '/equipment';\r\n return $http.patch(endpoint, data);\r\n };\r\n\r\n this.postConfigurationTrigger = function (id, data) {\r\n var endpoint = configurationsEndpoint + '/' + id + '/triggers';\r\n return $http.post(endpoint, data);\r\n };\r\n\r\n this.deleteConfigurationTrigger = function (id, triggerId) {\r\n var endpoint = configurationsEndpoint + '/' + id + '/triggers/' + triggerId;\r\n return $http.delete(endpoint);\r\n };\r\n\r\n this.updateConfigurationTrigger = function (id, triggerId, trigger) {\r\n var endpoint = configurationsEndpoint + '/' + id + '/triggers/' + triggerId;\r\n return $http.put(endpoint, trigger);\r\n };\r\n\r\n}","export default function CSVDataExportService($http, appSettings) {\r\n 'ngInject';\r\n const baseUri = appSettings.InReachApiCSVExportEndpoint;\r\n const exportUri = baseUri + '/export';\r\n\r\n this.createCSV = function (csv) {\r\n if (!csv) {\r\n return;\r\n }\r\n var endpoint = baseUri;\r\n var req;\r\n if (csv) {\r\n req = {\r\n method: 'POST',\r\n url: endpoint,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify(csv.data)\r\n }; //end req\r\n }\r\n return $http(req);\r\n };\r\n\r\n this.updateCSV = function (csv) {\r\n var endpoint = exportUri + '/' + csv.id; // InReachApiSchedulerEndpoint\r\n let req = {\r\n method: 'PUT',\r\n url: endpoint,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify(csv.data)\r\n }; //end req\r\n return $http(req);\r\n };\r\n\r\n this.getCSVs = function () {\r\n var endpoint = exportUri;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getCSV = function (id) {\r\n var endpoint = exportUri + '/' + id;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.deleteCSV = function (csv) {\r\n if (!csv) return;\r\n var endpoint = exportUri + '/' + csv.id;\r\n return $http.delete(endpoint);\r\n };\r\n}","export default function EquipmentMockService($http, $q, gettextCatalog) {\r\n 'ngInject';\r\n\r\n this.getEquipment = function (equipmentId) {\r\n if (!equipmentId) {\r\n return $http.get('./app/fixtures/equipment.search.json');\r\n }\r\n\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/equipment.search.json').then(\r\n function (response) {\r\n for (var i = 0; i < response.data.hits.length; i++) {\r\n if (response.data.hits[i]) {\r\n if (response.data.hits[i].id == equipmentId) {\r\n response.data = response.data.hits[i];\r\n return def.resolve(response);\r\n }\r\n }\r\n }\r\n return def.reject(gettextCatalog.getString('Id not in fixtures'));\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.getEquipmentSearch = () => $http.get('./app/fixtures/equipment.search.json');\r\n this.getEquipmentSeries = () => $http.get('./app/fixtures/equipment.series.json');\r\n}","export default function FeatureService($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n getFeatures: function () {\r\n const endpoint = `${appSettings.InReachApiEndpoint}/features`;\r\n return $http.get(endpoint);\r\n }\r\n };\r\n}","// Geolocation Service factory function.\r\nexport default function GeolocationService($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n // GET /api/geolocation?ip=8.8.8.8\r\n getLocationByIp: function (ip) {\r\n if (!ip) {\r\n // If no IP param specified, used empty.\r\n ip = '';\r\n }\r\n\r\n const endpoint = `${appSettings.InReachApiEndpoint}/geolocation?ip=${ip}`;\r\n\r\n return $http.get(endpoint)\r\n .then(function (response) {\r\n // success\r\n return response.data;\r\n }, function (error) {\r\n // error\r\n return Promise.reject(error.statusText);\r\n });\r\n }\r\n };\r\n}","import angular from 'angular';\r\n\r\nexport default function GeozoneService($http, appSettings) {\r\n 'ngInject';\r\n\r\n var equipmentGeozoneSRVs = {};\r\n\r\n var equipmentGeozonesEndpoint = appSettings.InReachApiGeozonesEndpoint;\r\n\r\n equipmentGeozoneSRVs.getAllGeozones = function () {\r\n return $http.get(equipmentGeozonesEndpoint);\r\n };\r\n\r\n equipmentGeozoneSRVs.getGeozoneById = function (geozoneid) {\r\n return $http.get(equipmentGeozonesEndpoint + '/' + geozoneid);\r\n };\r\n\r\n equipmentGeozoneSRVs.getGeozoneByName = function (geozonename) {\r\n return $http.get(equipmentGeozonesEndpoint + '/' + geozonename);\r\n };\r\n\r\n equipmentGeozoneSRVs.putGeozoneById = function (geozoneid, newZone) {\r\n var endpoint = equipmentGeozonesEndpoint + '/' + geozoneid;\r\n\r\n return $http.put(endpoint, newZone);\r\n };\r\n\r\n //productSRVs.getTriggersBySchemaId = function (schemaId) {\r\n // return $http.get(equipmentGeozonesEndpoint + \"/\" + schemaId + \"/triggers\");\r\n //}\r\n\r\n equipmentGeozoneSRVs.getEquipmentInZone = function (geozoneId) {\r\n return $http.get(equipmentGeozonesEndpoint + '/' + geozoneId + '/equipment');\r\n };\r\n\r\n equipmentGeozoneSRVs.postNewEquipmentGeozone = function (geozone) {\r\n var body = angular.copy(geozone);\r\n if (geozone.alertRule.priority == '') {\r\n body.alertRule.priority = 'low';\r\n }\r\n return $http.post(equipmentGeozonesEndpoint, body);\r\n };\r\n\r\n equipmentGeozoneSRVs.deleteEquipmentGeozone = function (geozoneid) {\r\n return $http.delete(equipmentGeozonesEndpoint + '/' + geozoneid);\r\n };\r\n\r\n equipmentGeozoneSRVs.addEquipmentInZone = function (geozoneId, equipmentIdList) {\r\n var endpoint = equipmentGeozonesEndpoint + '/' + geozoneId + '/equipment';\r\n var changeSet = {};\r\n changeSet.op = 'add';\r\n changeSet.values = [];\r\n for (var i = 0; i < equipmentIdList.length; i++) {\r\n changeSet.values.push(equipmentIdList[i]);\r\n }\r\n\r\n return $http.patch(endpoint, changeSet);\r\n };\r\n\r\n equipmentGeozoneSRVs.deleteEquipmentInZone = function (geozoneId, equipmentIdList) {\r\n var endpoint = equipmentGeozonesEndpoint + '/' + geozoneId + '/equipment';\r\n var changeSet = {};\r\n changeSet.op = 'remove';\r\n changeSet.values = [];\r\n for (var i = 0; i < equipmentIdList.length; i++) {\r\n changeSet.values.push(equipmentIdList[i]);\r\n }\r\n\r\n return $http.patch(endpoint, changeSet);\r\n };\r\n\r\n equipmentGeozoneSRVs.log = function (geozoneId) {\r\n var endpoint = equipmentGeozonesEndpoint + '/' + geozoneId + '/log';\r\n return $http.get(endpoint);\r\n };\r\n\r\n return equipmentGeozoneSRVs;\r\n}","export default function InstallationsMockService($http) {\r\n 'ngInject';\r\n this.getInstallations = () => $http.get('./app/fixtures/installations.json');\r\n this.getInstallationByequipID = () => $http.get('./app/fixtures/installations.detail.json');\r\n}","export default function InstallationsService(\r\n $http,\r\n appSettings,\r\n InstallationsMockService,\r\n activationsRepo\r\n) {\r\n 'ngInject';\r\n const base = `${appSettings.IcebergApiInstallationsEndpoint}/installations`;\r\n\r\n if (appSettings.FixturesModeEnabled) {\r\n return InstallationsMockService;\r\n }\r\n\r\n // GET paged installations\r\n this.getInstallations = function (\r\n limit,\r\n sort,\r\n since,\r\n deviceSerialNumber,\r\n installationId\r\n ) {\r\n let endpoint = `${base}`;\r\n let queryString = new Array();\r\n\r\n if (limit) queryString.push('limit=' + limit);\r\n if (sort) queryString.push('sort=' + sort);\r\n if (since) queryString.push('since=' + since);\r\n if (deviceSerialNumber)\r\n queryString.push('device.serialnumber=' + deviceSerialNumber);\r\n if (installationId) queryString.push('ids=' + installationId);\r\n\r\n if (queryString.length > 0) endpoint += `?${queryString.join('&')}`;\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getInstallationById = function (id) {\r\n const endpoint = `${base}/${id}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.createInstallation = function (newInstallation, sgResource) {\r\n const endpoint = `${base}`;\r\n\r\n if (sgResource) {\r\n return $http({\r\n method: 'POST',\r\n url: endpoint,\r\n headers: {\r\n 'X-Init-Security-Group': sgResource\r\n },\r\n data: JSON.stringify(newInstallation)\r\n });\r\n } else {\r\n return $http.post(endpoint, newInstallation);\r\n }\r\n };\r\n\r\n this.deleteInstallation = function (installationId) {\r\n const endpoint = `${base}/${installationId}`;\r\n return $http.delete(endpoint);\r\n };\r\n this.getInstallationByequipID = function (equipId) {\r\n const endpoint = `${base}?equipment.id=${equipId}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.syncRunHours = function (installationId, runHours) {\r\n var syncRequest = this.createSyncRequest(installationId, runHours);\r\n return activationsRepo.syncRunHours(syncRequest).then(function (response) {\r\n return {\r\n value: parseFloat(response.data[0].value)\r\n };\r\n });\r\n };\r\n\r\n this.createSyncRequest = function (installationId, runHours) {\r\n var req = {\r\n method: 'POST',\r\n url: `${\r\n\t\t\t\tappSettings.InReachApiInstallationsEndpoint\r\n\t\t\t}/${installationId}/runhours`,\r\n data: JSON.stringify({\r\n value: runHours\r\n })\r\n };\r\n return req;\r\n };\r\n}","import angular from 'angular';\r\n\r\nexport default function JobSchedulerMockService($http, appSettings) {\r\n 'ngInject';\r\n var accessKeyId = appSettings.SchedulerAWSAccessKey;\r\n var secretAccessKey = appSettings.SchedulerAWSSecretKey;\r\n var sqsQueue = appSettings.SchedulerAWSQueueUrl;\r\n\r\n this.createSchedule = function (schedule) {\r\n const endpoint = appSettings.InReachApiSchedulerEndpoint + '/schedules/';\r\n let req = {};\r\n if (schedule) {\r\n angular.forEach(schedule.data.actions, function (action) {\r\n action.message.accessKeyId = accessKeyId;\r\n action.message.secretAccessKey = secretAccessKey;\r\n action.message.queue = sqsQueue;\r\n });\r\n req = {\r\n method: 'POST',\r\n url: endpoint,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify(schedule.data)\r\n }; //end req\r\n }\r\n\r\n return $http(req);\r\n };\r\n}","import angular from 'angular';\r\n\r\nexport default function JobSchedulerService($http, appSettings, JobSchedulerMockService) {\r\n 'ngInject';\r\n if (appSettings.FixturesModeEnabled) {\r\n return JobSchedulerMockService;\r\n }\r\n\r\n this.createSchedule = function(schedule) {\r\n let endpoint = `${appSettings.InReachApiReportEndpoint}/schedules`;\r\n let req;\r\n if (schedule) {\r\n req = {\r\n method: 'POST',\r\n url: endpoint,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify(schedule.data)\r\n }; //end req\r\n }\r\n\r\n return $http(req);\r\n };\r\n\r\n let dateRangeTranslationTable = {\r\n '7d': '7 days',\r\n MTD: 'Month to date',\r\n '30d': 'Last 30 Days',\r\n '90d': 'Last 90 Days'\r\n };\r\n\r\n let frequencyTranslationTable = {\r\n day: 'Occurs Daily',\r\n month: 'Occurs Monthly',\r\n year: 'Occurs Yearly'\r\n };\r\n\r\n this.getEquipmentList = function(schedule) {\r\n return schedule.equipment;\r\n };\r\n\r\n this.getDateRange = function(schedule, translated) {\r\n let dropDownDates = [\r\n {\r\n id: 1,\r\n label: '7d',\r\n reportName: 'Last 7 Days',\r\n tooltip: 'Last 7 Days'\r\n },\r\n {\r\n id: 2,\r\n label: 'MTD',\r\n reportName: 'Month-To-Date',\r\n tooltip: 'Month-To-Date'\r\n },\r\n {\r\n id: 3,\r\n label: '30d',\r\n reportName: 'Last 30 Days',\r\n tooltip: 'Last 30 Days'\r\n },\r\n {\r\n id: 4,\r\n label: '90d',\r\n reportName: 'Last 90 Days',\r\n tooltip: 'Last 90 Days'\r\n }\r\n ];\r\n let dateRangeParsed = dropDownDates[schedule.reportParameters.drop_DateRange - 1];\r\n if (!translated) {\r\n return dateRangeParsed;\r\n }\r\n\r\n let translatedValue = dateRangeTranslationTable[dateRangeParsed.label];\r\n\r\n if (!translated) {\r\n translatedValue = dateRangeParsed.reportName;\r\n }\r\n\r\n if (!translated) {\r\n translatedValue = dateRangeParsed.label;\r\n }\r\n\r\n return translatedValue;\r\n };\r\n\r\n this.getScheduleRecurrenceFrequency = function(schedule, translated) {\r\n if (!translated) {\r\n return schedule.recurrence.frequency;\r\n }\r\n\r\n return frequencyTranslationTable[schedule.recurrence.frequency];\r\n };\r\n\r\n this.getNotificationEmails = function(schedule) {\r\n if (!schedule) return null;\r\n let arr = [];\r\n try {\r\n angular.forEach(schedule.contacts, function(email) {\r\n arr.push(email.email);\r\n });\r\n } catch (e) {\r\n return null;\r\n }\r\n\r\n return arr;\r\n };\r\n\r\n this.updateSchedule = function(schedule) {\r\n let endpoint = `${appSettings.InReachApiReportEndpoint}/schedules/${schedule.id}`; // InReachApiSchedulerEndpoint\r\n let req = {\r\n method: 'PUT',\r\n url: endpoint,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify(schedule.data)\r\n }; //end req\r\n return $http(req);\r\n };\r\n\r\n //Gets a schedules report path\r\n this.getScheduleReportPath = function(schedule) {\r\n return schedule.reportPath;\r\n };\r\n\r\n this.getSchedules = function(typeName) {\r\n let endpoint = `${appSettings.InReachApiReportEndpoint}/schedules?tag=${typeName}`; //&attr[type]=report; attrs:{ \"type\":\"report\" } [reportName]\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getSchedule = function(id) {\r\n //schedules/{id}\r\n let endpoint = `${appSettings.InReachApiReportEndpoint}/schedules/${id}`; //&attr[type]=report; attrs:{ \"type\":\"report\" } [reportName]\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.deleteSchedule = function(schedule) {\r\n if (!schedule) return;\r\n let endpoint = `${appSettings.InReachApiReportEndpoint}/schedules/${schedule.id}`;\r\n return $http.delete(endpoint);\r\n };\r\n}\r\n","export default function MaintenanceMockService($http, $q, gettextCatalog, appSettings) {\r\n 'ngInject';\r\n this.getPlans = function () {\r\n return $http.get('./app/fixtures/maintenance/plans.json');\r\n };\r\n\r\n this.getPlan = function (planId) {\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/maintenance/plans.json').then(\r\n function (response) {\r\n for (var i = 0; i < response.data.length; i++) {\r\n if (response.data[i].id == planId) {\r\n response.data = response.data[i];\r\n return def.resolve(response);\r\n }\r\n }\r\n return def.reject(gettextCatalog.getString('Id not in fixtures'));\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.updatePlan = function (plan) {\r\n if (!plan) return;\r\n\r\n if (appSettings.FixturesModeEnabled) {\r\n return this.getPlan(plan.id);\r\n }\r\n\r\n var endpoint = appSettings.InReachApiEndpoint + '/maintenance/plans/' + plan.id;\r\n\r\n return $http.put(endpoint, plan);\r\n };\r\n\r\n this.createPlan = function (plan) {\r\n if (!plan) return;\r\n\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/maintenance/plans.json').then(\r\n function (response) {\r\n response.data = response.data[0];\r\n return def.resolve(response);\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.deletePlan = function (plan) {\r\n if (!plan) return;\r\n\r\n var def = $q.defer();\r\n def.resolve(gettextCatalog.getString('Deleted'));\r\n return def.promise;\r\n };\r\n\r\n this.getPlanTasks = function (plan) {\r\n if (!plan) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/maintenance/tasks.json').then(\r\n function (response) {\r\n return def.resolve(response);\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.getTaskInPlan = function (plan, taskId) {\r\n if (!plan || !taskId) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/maintenance/tasks.json').then(\r\n function (response) {\r\n for (var i = 0; i < response.data.length; i++) {\r\n if (response.data[i].id == taskId) {\r\n response.data = response.data[i];\r\n return def.resolve(response);\r\n }\r\n }\r\n\r\n return def.reject(gettextCatalog.getString('Id not in fixture data'));\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.createTaskInPlan = function (plan, task) {\r\n if (!plan || !task) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n var def = $q.defer();\r\n $http.get('./app/fixtures/maintenance/tasks.json').then(\r\n function (response) {\r\n response.data = response.data[0];\r\n return def.resolve(response);\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n return def.promise;\r\n };\r\n\r\n this.updateTaskInPlan = function (plan, task) {\r\n if (!plan || !task) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n var def = $q.defer;\r\n def.resolve(task);\r\n return def.promise;\r\n };\r\n\r\n this.deleteTaskInPlan = function (plan, taskId) {\r\n if (!plan || !taskId) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n var def = $q.defer();\r\n def.resolve('Deleted');\r\n return def.promise;\r\n };\r\n\r\n this.getStatus = () => {\r\n var def = $q.defer();\r\n\r\n $http.get('./app/fixtures/maintenance/status.json').then(\r\n function (response) {\r\n return def.resolve(response);\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n\r\n return def.promise;\r\n };\r\n}","export default function MaintenanceService($http, appSettings, MaintenanceMockService, $uibModal) {\r\n 'ngInject';\r\n if (appSettings.FixturesModeEnabled) {\r\n return MaintenanceMockService;\r\n }\r\n\r\n this.showPopupForEquipmentPlan = function(equipment, plan) {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../pages/maintenance/board/complete/complete.html'),\r\n controller: 'MaintenancePerformPopupController',\r\n size: 'md',\r\n windowClass: 'tr-maintenance-modal-dismiss',\r\n resolve: {\r\n equipmentData: equipment,\r\n plan: plan\r\n }\r\n });\r\n return modalInstance;\r\n };\r\n\r\n const baseURL = `${appSettings.InReachApiEndpoint}/maintenance`;\r\n\r\n this.getPlans = function() {\r\n const endpoint = `${baseURL}/plans`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getPlan = function(planId) {\r\n const endpoint = `${baseURL}/plans/${planId}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.updatePlan = function(plan) {\r\n if (!plan) return;\r\n const endpoint = `${baseURL}/plans/${plan.id}`;\r\n return $http.put(endpoint, plan);\r\n };\r\n\r\n this.getEquipmentForPlan = function(plan) {\r\n if (!plan) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/equipment`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.updateEquipmentForPlan = function(plan, equipmentChangeSet) {\r\n if (!plan) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/equipment`;\r\n return $http.patch(endpoint, equipmentChangeSet);\r\n };\r\n\r\n this.createPlan = function(plan) {\r\n if (!plan) return;\r\n\r\n let endpoint = `${baseURL}/plans`;\r\n return $http.post(endpoint, plan);\r\n };\r\n\r\n this.deletePlan = function(plan) {\r\n if (!plan) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}`;\r\n return $http.delete(endpoint);\r\n };\r\n\r\n this.getPlanTasks = function(plan) {\r\n if (!plan) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/tasks`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getTaskInPlan = function(plan, taskId) {\r\n if (!plan || !taskId) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/tasks/${taskId}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.createTaskInPlan = function(plan, task) {\r\n if (!plan || !task) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/tasks`;\r\n return $http.post(endpoint, task);\r\n };\r\n\r\n this.updateTaskInPlan = function(plan, task) {\r\n if (!plan || !task) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n let taskId = task.id;\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/tasks/${taskId}`;\r\n return $http.put(endpoint, task);\r\n };\r\n\r\n this.deleteTaskInPlan = function(plan, taskId) {\r\n if (!plan || !taskId) return;\r\n\r\n if (!plan.id) {\r\n plan = {\r\n id: plan\r\n };\r\n }\r\n\r\n if (taskId.id) {\r\n taskId = taskId.id;\r\n }\r\n\r\n const endpoint = `${baseURL}/plans/${plan.id}/tasks/${taskId}`;\r\n return $http.delete(endpoint);\r\n };\r\n\r\n //Get the maintenance status for this account...to display on the dashboard\r\n this.getStatus = function(query, equipIds, code) {\r\n let endpoint = `${baseURL}/status`;\r\n\r\n if (query) {\r\n endpoint += `?q=${query}`;\r\n } else {\r\n endpoint += '?q=*';\r\n }\r\n\r\n if (equipIds) {\r\n endpoint += '&queryequipmentids=';\r\n\r\n for (let i = 0; i < equipIds.length; i++) {\r\n if (i === equipIds.length - 1) {\r\n endpoint += equipIds[i];\r\n } else {\r\n endpoint += equipIds[i] + ',';\r\n }\r\n }\r\n }\r\n\r\n if (code) {\r\n endpoint += `&code=${code}`;\r\n }\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n //Get the maintenance status for this account...to display on the dashboard\r\n this.getHistory = function(query, equipIds) {\r\n let endpoint = `${baseURL}/service-records`;\r\n\r\n if (query) {\r\n endpoint += `?q=${query}`;\r\n } else {\r\n endpoint += '?q=*';\r\n }\r\n\r\n if (equipIds) {\r\n endpoint += '&queryequipmentids=';\r\n\r\n for (let i = 0; i < equipIds.length; i++) {\r\n if (i === equipIds.length - 1) {\r\n endpoint += equipIds[i];\r\n } else {\r\n endpoint += equipIds[i] + ',';\r\n }\r\n }\r\n }\r\n\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getServiceRecord = function(recordId) {\r\n if (!recordId) {\r\n return null;\r\n }\r\n\r\n const endpoint = `${baseURL}/service-records/${recordId}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getServiceRecordTasks = function(recordId) {\r\n if (!recordId) {\r\n return null;\r\n }\r\n\r\n const endpoint = `${baseURL}/service-records/${recordId}/tasks`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.newServiceRecord = function(record) {\r\n if (!record) {\r\n return null;\r\n }\r\n\r\n const endpoint = `${baseURL}/service-records`;\r\n return $http.post(endpoint, record);\r\n };\r\n\r\n this.completeTasks = function(recordId, tasks) {\r\n if (!recordId || !tasks) {\r\n return null;\r\n }\r\n\r\n const endpoint = `${baseURL}/service-records/${recordId}/tasks`;\r\n return $http.patch(endpoint, {\r\n op: 'complete',\r\n values: tasks\r\n });\r\n };\r\n\r\n this.getDashboardAggregate = function() {\r\n const endpoint = `${baseURL}/aggregate`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getFacetHits = function() {\r\n const endpoint = `${appSettings.IcebergApiEquipmentEndpoint}/equipment/search?q=*&facet.tags={buckets:[]}`;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.getPlanCsvData = function() {\r\n const endpoint = `${baseURL}/csvexport`;\r\n return $http({\r\n method: 'GET',\r\n cache: false,\r\n url: endpoint,\r\n responseType: 'arraybuffer'\r\n });\r\n };\r\n}\r\n","export default function MediaService($http, appSettings) {\r\n 'ngInject';\r\n const baseURL = `${appSettings.InReachMediaEndpoint}`;\r\n\r\n return {\r\n deleteImage: function (imageId) {\r\n const endpoint = `${baseURL}/images/${imageId}`;\r\n return $http.delete(endpoint);\r\n },\r\n\r\n updateImage: function (image) {\r\n const endpoint = `${baseURL}/images/${image.id}`;\r\n return $http.put(endpoint, image);\r\n }\r\n };\r\n}","export default function RoleService($http, appSettings) {\r\n 'ngInject';\r\n const baseURL = `${appSettings.InReachApiEndpoint}/roles`;\r\n\r\n return {\r\n createRole: role => {\r\n if (!role) {\r\n return;\r\n }\r\n\r\n const endpoint = `${baseURL}`;\r\n return $http.post(endpoint, role);\r\n },\r\n updateRole: role => {\r\n if (!role) {\r\n return;\r\n }\r\n\r\n const endpoint = `${baseURL}/${role.id}`;\r\n return $http.put(endpoint, role);\r\n },\r\n\r\n getAllUsersOfRole: roleId => $http.get(`${baseURL}/${roleId}/users`),\r\n\r\n getRoles: options => {\r\n var uri = `${baseURL}`;\r\n if (options && 'assignable' in options) {\r\n uri += '?assignable=' + !!options.assignable;\r\n }\r\n return $http.get(uri);\r\n },\r\n\r\n getRole: id => $http.get(`${baseURL}/${id}`)\r\n };\r\n}","export default function TemplatesService($http, appSettings) {\r\n 'ngInject';\r\n return {\r\n createTemplate: function (template) {\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const endpoint = `${appSettings.InReachApiEndpoint}/templates`;\r\n return $http.post(endpoint, template);\r\n },\r\n updateTemplate: function (template) {\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const endpoint = `${appSettings.InReachApiEndpoint}/template/${template.id}`;\r\n return $http.put(endpoint, template);\r\n },\r\n deleteRole: function (template) {\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const endpoint = `${appSettings.InReachApiEndpoint}/template/${template.id}`;\r\n return $http.delete(endpoint, template);\r\n }\r\n };\r\n}","export default function TransfersService($http, appSettings) {\r\n 'ngInject';\r\n var transferSRVs = {};\r\n\r\n const transfersEndpoint = appSettings.InReachApiTransfersEndpoint;\r\n\r\n transferSRVs.getKeysByFilter = function (filter) {\r\n return $http.get(`${transfersEndpoint}/keys?filter=${filter}`);\r\n };\r\n\r\n return transferSRVs;\r\n}","class SearchFavouritesRepository {\r\n\tconstructor($http, appSettings) {\r\n\t\t'ngInject';\r\n\t\tthis.http = $http;\r\n\t\tthis.endpoint = appSettings.InReachApiSearchFavouritesEndpoint;\r\n\t}\r\n\r\n\tcreate(favourite) {\r\n\t\treturn this.http.post(`${this.endpoint}`, favourite);\r\n\t}\r\n\r\n\tgetAll() {\r\n\t\treturn this.http.get(this.endpoint);\r\n\t}\r\n\r\n\tget(favouriteId) {\r\n\t\treturn this.http.get(`${this.endpoint}/${favouriteId}`);\r\n\t}\r\n\r\n\tupdate(favouriteId, favourite) {\r\n\t\treturn this.http.put(`${this.endpoint}/${favouriteId}`, favourite);\r\n\t}\r\n\r\n\tdelete(favouriteId) {\r\n\t\treturn this.http.delete(`${this.endpoint}/${favouriteId}`);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an array of ids representing favourites that were successfully restored for the user & account.\r\n\t * @param {number} favouriteId\r\n\t */\r\n\tundoDelete(favouriteId) {\r\n\t\treturn this.http\r\n\t\t\t.patch(`${this.endpoint}`, [SearchFavouritesRepository.buildRestoreOperation(favouriteId)])\r\n\t\t\t.then(response => {\r\n\t\t\t\tconst { data } = response;\r\n\t\t\t\tconst { restoredFavourites } = data;\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdata: restoredFavourites\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t}\r\n\r\n\tstatic buildRestoreOperation(favouriteId) {\r\n\t\treturn { name: 'restore', id: favouriteId };\r\n\t}\r\n}\r\n\r\nexport default SearchFavouritesRepository;\r\n","export default function AccountsRepo($http, appSettings, initialData) {\r\n\t'ngInject';\r\n\r\n\tconst _currentAccount = (initialData.currentUser || {}).account;\r\n\tconst _userAccounts = initialData.userAccounts;\r\n\r\n\treturn {\r\n\t\tgetCurrentAccount: function() {\r\n\t\t\treturn _currentAccount || {};\r\n\t\t},\r\n\t\tgetAccounts: function() {\r\n\t\t\treturn _userAccounts || [];\r\n\t\t},\r\n\t\tgetSubAccounts: function() {\r\n\t\t\tconst currentAccount = this.getAccounts().find(acc => acc.accountId === this.getCurrentAccount().id) || {};\r\n\t\t\treturn currentAccount.subAccounts;\r\n\t\t},\r\n\t\tcreateSubAccount: function(accountName) {\r\n\t\t\tconst endpoint = `${appSettings.InReachApiEndpoint}/accounts`;\r\n\t\t\treturn $http.post(endpoint, accountName);\r\n\t\t},\r\n\t\tupdateSubAccountName: function(accountName) {\r\n\t\t\tconst endpoint = `${appSettings.InReachApiEndpoint}/accounts`;\r\n\t\t\treturn $http.put(endpoint, accountName);\r\n\t\t},\r\n\t\tsignInTo: function(account) {\r\n\t\t\tconst endpoint = `${appSettings.InReachApiEndpoint}/accounts`;\r\n\t\t\treturn $http.get(endpoint);\r\n\t\t}\r\n\t};\r\n}\r\n","export default function BulkActivationService($http, appSettings) {\r\n\t'ngInject';\r\n\r\n const bulkActivationEndpoint = appSettings.InReachApiBulkActivation;\r\n\r\n return {\r\n bulkActivate:function(file) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n return $http.post(bulkActivationEndpoint, formData, { transformRequest: angular.identity,\r\n headers: {'Content-Type': undefined }});\r\n }\r\n };\r\n}","export default class AccessManagementAPIService {\r\n constructor($http, appSettings) {\r\n 'ngInject';\r\n this.$http = $http;\r\n this.appSettings = appSettings;\r\n this.assignmentEndpointUrl = `${this.appSettings.InReachApiEndpoint}access/assignments`;\r\n this.accessEndpointUrl = `${this.appSettings.InReachApiEndpoint}access`;\r\n }\r\n performAssignments(assetIds, operatorsIds, command) {\r\n const assignments = {\r\n equipmentIds: assetIds,\r\n operatorIds: operatorsIds,\r\n command: command,\r\n };\r\n return this.$http.patch(this.assignmentEndpointUrl, assignments);\r\n }\r\n getOperatorsByAsset(assetId) {\r\n const url = `${this.assignmentEndpointUrl}/by/equipment/${assetId}`;\r\n return this.$http.get(url);\r\n }\r\n getAssetsByOperator(operatorId) {\r\n const url = `${this.assignmentEndpointUrl}/by/operator/${operatorId}`;\r\n return this.$http.get(url);\r\n }\r\n getAssetsBySearchFilter(filter) {\r\n const url = `${this.accessEndpointUrl}/search/filter`;\r\n return this.$http.post(url, filter);\r\n }\r\n getAssetById(assetId) {\r\n const url = `${this.accessEndpointUrl}/equipment/${assetId}`;\r\n return this.$http.get(url);\r\n }\r\n getAssetListByIds(assetIds) {\r\n const url = `${this.accessEndpointUrl}/search/equipmentlist`;\r\n return this.$http.post(url, assetIds);\r\n }\r\n enableAssets(assetIds = []) {\r\n const url = `${this.accessEndpointUrl}/enable`;\r\n return this.$http.post(url, { ids: assetIds });\r\n }\r\n getAssetsByGroupId(id) {\r\n const url = `${this.accessEndpointUrl}/equipment/group/${id}`;\r\n return this.$http.get(url);\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport moment from 'moment';\r\nexport default class OperatorsAPIService {\r\n constructor($http, appSettings) {\r\n 'ngInject';\r\n this.$http = $http;\r\n this.appSettings = appSettings;\r\n this.baseEndpointUrl = `${this.appSettings.InReachApiEndpoint}access/operators`;\r\n }\r\n\r\n operatorsCsvToJson(csvFile) {\r\n const endPointUrl = `${this.baseEndpointUrl}/upload_csv`;\r\n const data = new FormData();\r\n data.append('csv-file', csvFile);\r\n return this.$http.post(endPointUrl, data, {\r\n transformRequest: angular.identity,\r\n headers: { 'Content-Type': undefined },\r\n });\r\n }\r\n\r\n bulkCreateOperators(operatorsList) {\r\n const endPointUrl = `${this.baseEndpointUrl}/bulk/create`;\r\n return this.$http.post(endPointUrl, operatorsList);\r\n }\r\n\r\n getOperators() {\r\n const endPointUrl = `${this.baseEndpointUrl}`;\r\n return this.$http.get(endPointUrl);\r\n }\r\n\r\n getOperatorById(id) {\r\n const endPointUrl = `${this.baseEndpointUrl}/${id}`;\r\n return this.$http.get(endPointUrl);\r\n }\r\n\r\n updateOperatorsCodes(operatorId, codes, autoGeneratePin) {\r\n const endPointUrl = `${this.baseEndpointUrl}/${operatorId}/codes`;\r\n return this.$http.put(endPointUrl, { autoGeneratePin, accessCodes: codes });\r\n }\r\n\r\n updateOperatorMetaData(operatorId, name, attrs) {\r\n if (attrs.expiry) {\r\n attrs.expiry = moment(attrs.expiry).utc(true).format('L');\r\n }\r\n\r\n const endPointUrl = `${this.baseEndpointUrl}/${operatorId}`;\r\n return this.$http.put(endPointUrl, { id: operatorId, name, attrs });\r\n }\r\n\r\n createOperater(operator) {\r\n const endPointUrl = `${this.baseEndpointUrl}`;\r\n return this.$http.post(endPointUrl, {\r\n name: operator.name,\r\n attrs: operator.attrs,\r\n accessCodes: operator.accessCodes,\r\n autoGeneratePIN: operator.autoGeneratePIN,\r\n });\r\n }\r\n\r\n deleteOperater(operatorId) {\r\n const endPointUrl = `${this.baseEndpointUrl}/${operatorId}?force=true`;\r\n return this.$http.delete(endPointUrl);\r\n }\r\n\r\n getOperatorExpiryById(id) {\r\n const endPointUrl = `${this.baseEndpointUrl}/expiry/${id}`;\r\n return this.$http.get(endPointUrl);\r\n }\r\n}\r\n","export default class GroupsAPIService {\r\n constructor($http, appSettings) {\r\n 'ngInject';\r\n this.$http = $http;\r\n this.appSettings = appSettings;\r\n this.groupEndpointUrl = `${this.appSettings.InReachApiEndpoint}access/operators`;\r\n }\r\n sendInvite(group) {\r\n return this.$http.post(this.groupEndpointUrl + '/invite', group);\r\n }\r\n}\r\n","export default class ReportingAPIService {\r\n constructor($http, appSettings) {\r\n 'ngInject';\r\n\r\n this.$http = $http;\r\n this.reportingUrl = appSettings.RepotingApiUrl;\r\n this.reportingEndpointUrl = `${appSettings.RepotingApiUrl}/reports`;\r\n }\r\n\r\n getReportsList() {\r\n const url = `${this.reportingEndpointUrl}`;\r\n return this.$http.get(url);\r\n }\r\n\r\n getReportById(reportId) {\r\n const url = `${this.reportingEndpointUrl}/${reportId}`;\r\n return this.$http.get(url);\r\n }\r\n\r\n refresh() {\r\n const url = `${this.reportingUrl}/refresh`;\r\n return this.$http.get(url);\r\n }\r\n}\r\n","export default class TimeSeriesAPIService {\r\n constructor($http, appSettings, $timeout) {\r\n 'ngInject';\r\n this.$http = $http;\r\n this.$timeout = $timeout;\r\n this.appSettings = appSettings;\r\n this.icebergApiTimeSeries = this.appSettings.IcebergApiTimeSeries;\r\n }\r\n\r\n getAssetSeries(assetIds = []) {\r\n const filter = {\r\n criteria: { owners: assetIds },\r\n };\r\n const endpoint = `${this.icebergApiTimeSeries}/series/_filter`;\r\n return this.$http.post(endpoint, filter).then((res) => res.data);\r\n }\r\n\r\n getSeriesData(range, seriesId = [], functions = [], interval, timezone) {\r\n const r = `range=${range}`;\r\n const ids = seriesId.length ? `&${seriesId.map((id) => `id=${id}`).join('&')}` : '';\r\n const funcs = functions.length ? `&functions=${functions.join(',')}` : '';\r\n const intr = interval ? `&interval=${interval}` : '';\r\n const tz = timezone ? `&tz=${timezone}` : '';\r\n const queryString = `${r}${ids}${funcs}${intr}${tz}`;\r\n\r\n const endpoint = `${this.icebergApiTimeSeries}/data?${queryString}`;\r\n return this.$http.get(endpoint).then((res) => res.data);\r\n }\r\n\r\n pinLocation(seriesID, coordinates) {\r\n return this.$http.put(`${this.icebergApiTimeSeries}/series/${seriesID}/data/pin`, coordinates);\r\n }\r\n\r\n unpinLocation(seriesID) {\r\n return this.$http.patch(`${this.icebergApiTimeSeries}/series/${seriesID}/data/unpin`);\r\n }\r\n\r\n createSeries(equipmentID, title, dataPoint, valueType) {\r\n const series = {\r\n key: `equipment:${equipmentID}.${dataPoint}`,\r\n title: title,\r\n tags: [dataPoint],\r\n valueType: valueType,\r\n attrs: {\r\n equipment: equipmentID,\r\n },\r\n };\r\n return this.$http.post(`${this.icebergApiTimeSeries}/series`, series);\r\n }\r\n\r\n setLocation(seriesID, isPinned = true, coordinates, equipmentID) {\r\n var promise;\r\n if (isPinned && !!seriesID)\r\n promise = this.unpinLocation(seriesID).then(() => {\r\n if (!coordinates) {\r\n // Timeout is needed so that when it is not repinning that it is able to get the last pinned location for the location history\r\n return this.$timeout(3000);\r\n }\r\n });\r\n\r\n if (coordinates) {\r\n if (!seriesID) {\r\n promise = this.createSeries(equipmentID, 'Location', 'gps', 4).then(({ data }) => {\r\n seriesID = data.id;\r\n // Time out is needed because pinning a location right after the series is created will not save it.\r\n return this.$timeout(3000);\r\n });\r\n }\r\n\r\n if (promise) {\r\n promise.then(() => {\r\n return this.pinLocation(seriesID, coordinates);\r\n });\r\n } else {\r\n promise = this.pinLocation(seriesID, coordinates);\r\n }\r\n }\r\n return promise;\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport appSettingsModule from '../app.settings.module';\r\nimport serviceModule from '../services/service.module';\r\nimport EquipmentService from './equipment.service';\r\nimport UsersService from './users.services';\r\nimport UsersMockService from './users.mock.services';\r\nimport AlertsMockService from './alerts.mock.service';\r\nimport AlertsService from './alerts.service';\r\nimport CommandsRepo from './commands.repo';\r\nimport ConfigService from './config.service';\r\nimport ConfigurationsService from './configurations.service';\r\nimport CSVDataExportService from './csvdataexport.service';\r\nimport EquipmentMockService from './equipment.mock.service';\r\nimport FeatureService from './feature.service';\r\nimport GeolocationService from './geolocation.service';\r\nimport GeozoneService from './geozones.service';\r\nimport InstallationsMockService from './installations.mock.service';\r\nimport InstallationsService from './installations.service';\r\nimport JobSchedulerMockService from './jobscheduler.mock.service';\r\nimport JobSchedulerService from './jobscheduler.service';\r\nimport MaintenanceMockService from './maintenance.mock.service';\r\nimport MaintenanceService from './maintenance.service';\r\nimport MediaService from './media.service';\r\nimport RoleService from './roles.service';\r\nimport TemplatesService from './templates.service';\r\nimport TransfersService from './transfers.service';\r\nimport SearchFavouritesRepository from './searchFavourites.repo';\r\nimport AccountsRepo from './accounts.repo';\r\nimport BulkActivationService from './bulk-activation.service';\r\nimport AccessManagementAPI from './access-management.api';\r\nimport OperatorsAPI from './operators.api';\r\nimport GroupsAPIService from './groups.api';\r\nimport ReportingAPIService from './reporting.api';\r\nimport TimeSeriesAPIService from './time-series.api';\r\n\r\nconst apiModule = angular.module('api', [appSettingsModule, serviceModule]);\r\n\r\napiModule\r\n .factory('equipmentRepository', EquipmentService)\r\n .service('EquipmentService', EquipmentService)\r\n .service('usersService', UsersService)\r\n .service('usersMockService', UsersMockService)\r\n .service('AlertsMockService', AlertsMockService)\r\n .service('AlertsService', AlertsService)\r\n .service('alertsRepository', AlertsService)\r\n .service('CommandsRepo', CommandsRepo)\r\n .service('ConfigService', ConfigService)\r\n .service('configurationsService', ConfigurationsService)\r\n .service('CSVDataExportService', CSVDataExportService)\r\n .service('EquipmentMockService', EquipmentMockService)\r\n .factory('FeatureService', FeatureService)\r\n .factory('geolocationService', GeolocationService)\r\n .service('GeozoneService', GeozoneService)\r\n .service('equipmentGeozoneService', GeozoneService)\r\n .service('InstallationsMockService', InstallationsMockService)\r\n .service('installationsService', InstallationsService)\r\n .service('InstallationsService', InstallationsService)\r\n .service('JobSchedulerMockService', JobSchedulerMockService)\r\n .service('JobSchedulerService', JobSchedulerService)\r\n .service('MaintenanceMockService', MaintenanceMockService)\r\n .service('MaintenanceService', MaintenanceService)\r\n .service('MediaService', MediaService)\r\n .service('RoleService', RoleService)\r\n .service('TemplatesService', TemplatesService)\r\n .service('TransfersService', TransfersService)\r\n .service('searchFavouritesRepo', SearchFavouritesRepository)\r\n .service('AccountsRepo', AccountsRepo)\r\n .service('BulkActivationService', BulkActivationService)\r\n .service('accessManagementAPI', AccessManagementAPI)\r\n .service('operatorsAPI', OperatorsAPI)\r\n .service('groupsAPI', GroupsAPIService)\r\n .service('reportingAPI', ReportingAPIService)\r\n .service('timeSeriesAPI', TimeSeriesAPIService);\r\n\r\nexport default apiModule.name;\r\n","\r\nconst AlertPanelComponent = {\r\n template: require(\"./alerts-panel.html\"),\r\n restrict: 'E',\r\n controllerAs: 'vm',\r\n controller: AlertPanelController,\r\n bindings: {\r\n series: '<'\r\n }\r\n};\r\n\r\nfunction AlertPanelController() {\r\n\r\n var vm = this;\r\n vm.erroringSeries = [];\r\n\r\n vm.$onChanges = function (changes) {\r\n if (changes.series && changes.series.currentValue) {\r\n vm.erroringSeries = _.filter(vm.series, function (series) {\r\n return series.gauge && (series.gauge.state.status === 'error' || series.gauge.state.status === 'warning');\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport default AlertPanelComponent;\r\n","const isStateDataPoint = series => {\r\n const {descriptor} = series || {};\r\n return descriptor && Object.keys(descriptor.values || {}).length > 0;\r\n};\r\n\r\nconst isSeriesHasLastValue = series => {\r\n const {last} = series || {};\r\n return last && last.hasOwnProperty('v');\r\n};\r\n\r\nexport const calculateStatusDatapoints = series => {\r\n const stateSeries = Object.keys(series)\r\n .map(key => series[key])\r\n .filter(serie => isStateDataPoint(serie) && isSeriesHasLastValue(serie))\r\n .map(x => ({\r\n id: x.dataId,\r\n value: x.descriptor.values[x.last.v],\r\n title: x.title,\r\n order: x.order\r\n }));\r\n\r\n return sortAndReduce(stateSeries);\r\n};\r\n\r\nexport const calculateNumericDatapoints = series => {\r\n const stateSeries = Object.keys(series)\r\n .map(key => series[key])\r\n .filter(serie => !isStateDataPoint(serie) && isSeriesHasLastValue(serie))\r\n .map(x => ({\r\n id: x.dataId,\r\n value: x.last.v,\r\n title: x.title,\r\n sparkline: x.meta.sparklines,\r\n order: x.order,\r\n uom: x.attrs.uom\r\n }));\r\n\r\n return sortAndReduce(stateSeries);\r\n};\r\n\r\nexport const sortAndReduce = series => {\r\n return _.sortBy(series, serie => serie.order).reduce((acc, item) => {\r\n acc[item.id] = item;\r\n return acc;\r\n }, {});\r\n};\r\n\r\nexport const ToLowerCase = (obj = {}) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\r\n","export default (packageids, statusSerie, numericSerie) => {\r\n const templateName = getTemplate(packageids);\r\n if (!templateName) {\r\n //when no template found will load series to be used with default layout\r\n return {\r\n dials: numericSerie ? Object.values(numericSerie) : undefined,\r\n statuses: statusSerie ? Object.values(statusSerie) : undefined,\r\n };\r\n }\r\n\r\n const template = TEMPLATE_ELEMENTS[templateName];\r\n\r\n let off = template.offCalc(statusSerie);\r\n\r\n const dials = template.dials.reduce((prev, item) => {\r\n const row = item === null ? null : { ...numericSerie[item.serie], ...item };\r\n prev.push(row);\r\n return prev;\r\n }, []);\r\n\r\n // Adding check for two stage and 4 stage chillers if sys_3_op_code is undefined that means we are in\r\n // a two stage chiller and we will need to filter it out\r\n let removeStageThreeAndFour = false;\r\n if (\r\n templateName === 'chiller' &&\r\n statusSerie[template.twoStageCheck.serieUndefinedWhenOff] !== undefined &&\r\n statusSerie[template.twoStageCheck.serieUndefinedWhenOff].value === undefined\r\n )\r\n removeStageThreeAndFour = true;\r\n\r\n const statuses = Object.values(statusSerie).filter((x) => {\r\n if (removeStageThreeAndFour === true && template.twoStageCheck.excludeSerie.includes(x.id))\r\n return false;\r\n\r\n return template.alarms.find((y) => y.serie === x.id) === undefined;\r\n });\r\n\r\n const alarms = template.alarms\r\n .filter((alarm) => statusSerie.hasOwnProperty(alarm.serie))\r\n .map((alarm) => ({\r\n ...alarm,\r\n ...statusSerie[alarm.serie],\r\n inAlarmState: statusSerie[alarm.serie]\r\n ? statusSerie[alarm.serie].value === alarm.errorState\r\n : false,\r\n }));\r\n\r\n dials.forEach((dial) => {\r\n if (dial && dial.serie) {\r\n const alarm = alarms.find((alarm) => alarm.relatedSerie === dial.serie);\r\n dial.inAlarmState = alarm && alarm.inAlarmState;\r\n }\r\n });\r\n\r\n return {\r\n off,\r\n dials,\r\n statuses,\r\n alarms,\r\n templateName,\r\n };\r\n};\r\n\r\nconst getTemplate = (packageIds) => {\r\n const templateElementTypes = packageIds.reduce((prev, id) => {\r\n if (PACKAGE_TEMPLATE_MAPPINGS[id]) {\r\n prev.push(PACKAGE_TEMPLATE_MAPPINGS[id]);\r\n }\r\n return prev;\r\n }, []);\r\n\r\n return templateElementTypes.length > 0 ? templateElementTypes[0] : null;\r\n};\r\n\r\nconst PACKAGE_TEMPLATE_MAPPINGS = {\r\n '1888644131362701965': 'power',\r\n '946425127598293799': 'power',\r\n '900583554071659341': 'power',\r\n '1380404070363169353': 'power',\r\n '940555193043387297': 'power',\r\n '824466523073544286': 'pump',\r\n '1027458292986675380': 'fan',\r\n '1026736337010557713': 'power',\r\n '1046994433532232327': 'power',\r\n '1199335482937311645': 'chiller',\r\n '1295593606043665017': 'chiller',\r\n '2000670464992609252': 'power',\r\n '2056796697866010811': 'fan',\r\n '2042281683352289994': 'pump_m7',\r\n '1966808143153333206': 'chiller',\r\n '2395104989652451496': 'pump_m7',\r\n '2400225736544747560': 'pump_m7',\r\n};\r\n\r\nconst PUMP = {\r\n offCalc: (statuses) => offBaseCalc('ctrl_pnl_state', 'Off', statuses),\r\n dials: [\r\n {\r\n title: 'Engine Speed',\r\n serie: 'eng_speed',\r\n min: 0,\r\n max: 2500,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Oil Pressure',\r\n serie: 'eng_oil_pr',\r\n min: 0,\r\n max: 140,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Coolant Temp',\r\n serie: 'eng_coolant_temp',\r\n min: 0,\r\n max: 280,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Engine Load',\r\n serie: 'eng_load',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Suction',\r\n serie: 'suct_pr',\r\n min: -30,\r\n max: 200,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Discharge',\r\n serie: 'dis_pr',\r\n min: 0,\r\n max: 300,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Flow Rate',\r\n serie: 'flow_rate',\r\n min: 0,\r\n max: 10000,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Battery Voltage',\r\n serie: 'battery_potential',\r\n min: 0,\r\n max: 30,\r\n showMinMax: true,\r\n disabledWhenOff: false,\r\n },\r\n {\r\n title: 'Fuel Level',\r\n serie: 'fuel_level',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n { title: 'Sump', serie: 'sys_lvl', min: 0, max: 50, showMinMax: true, disabledWhenOff: true },\r\n {\r\n title: 'DEF Fluid',\r\n serie: 'at1_scr_cat_tank_level',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n ],\r\n alarms: [\r\n {\r\n serie: 'battery_lo_state',\r\n errorState: 'Alarm',\r\n relatedSerie: 'battery_potential',\r\n disabledWhenOff: false,\r\n },\r\n { serie: 'canbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'modbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'engine_protect_sd_state', errorState: 'Alarm', disabledWhenOff: true },\r\n ],\r\n};\r\n\r\nconst TEMPLATE_ELEMENTS = {\r\n power: {\r\n offCalc: (statuses) => offBaseCalc('ctrl_pnl_state', 'Off', statuses),\r\n dials: [\r\n {\r\n title: 'L-L Volts',\r\n serie: 'gen_avg_ll_rms_voltage',\r\n min: 0,\r\n max: 600,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Avg Current',\r\n serie: 'gen_avg_ac_rms_current',\r\n min: 0,\r\n max: 1,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Coolant Temp',\r\n serie: 'eng_coolant_temp',\r\n min: 0,\r\n max: 280,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Power Load',\r\n serie: 'gen_tot_per_kw',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Oil Pressure',\r\n serie: 'eng_oil_pr',\r\n min: 0,\r\n max: 140,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Frequency',\r\n serie: 'gen_avg_ac_frequency',\r\n min: 0,\r\n max: 1,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n null,\r\n {\r\n title: 'Fuel Level',\r\n serie: 'fuel_level',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'DEF Fluid',\r\n serie: 'at1_scr_cat_tank_level',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Battery Voltage',\r\n serie: 'battery_potential',\r\n min: 0,\r\n max: 30,\r\n showMinMax: true,\r\n disabledWhenOff: false,\r\n },\r\n null,\r\n ],\r\n alarms: [\r\n { serie: 'canbus_comm_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'modbus_comm_state', errorState: 'Alarm', disabledWhenOff: true },\r\n {\r\n serie: 'battery_lo_state',\r\n errorState: 'Alarm',\r\n relatedSerie: 'battery_potential',\r\n disabledWhenOff: false,\r\n },\r\n { serie: 'canbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'modbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'check_genset', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'chrgr_ac_fail', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'common_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overcurr_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overload_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'underfreq_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'voltage_hi_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'voltage_lo_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'emergency_stop_state', errorState: 'Active', disabledWhenOff: true },\r\n { serie: 'overfreq_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'eng_temp_hi_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'oil_press_lo_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overspd_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'coolant_level_lo_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'fail_to_sync', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'close_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'gen_circuit_breaker_trip_state', errorState: 'Yes', disabledWhenOff: true },\r\n { serie: 'underfreq_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overfreq_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'voltage_lo_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'voltage_hi_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overcurr_state', errorState: 'Alarm', disabledWhenOff: true },\r\n { serie: 'overload_state', errorState: 'Alarm', disabledWhenOff: true },\r\n ],\r\n },\r\n pump: { ...PUMP },\r\n pump_m7: {\r\n ...PUMP,\r\n offCalc: (statuses) => offBaseCalc('dash_pnl_state', 'Off', statuses),\r\n },\r\n fan: {\r\n offCalc: (statuses) => offBaseCalc('ctrl_pnl_state', 'Off', statuses),\r\n dials: [\r\n {\r\n title: 'Supply Temp',\r\n serie: 'sup_air_temp',\r\n min: 0,\r\n max: 350,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Return Temp',\r\n serie: 'ret_air_temp',\r\n min: 0,\r\n max: 350,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'L-L Volts',\r\n serie: 'gen_ca_ll_rms_voltage',\r\n min: 0,\r\n max: 600,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Avg Current',\r\n serie: 'gen_a_ac_rms_current',\r\n min: 0,\r\n max: 1,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Rel. Hum',\r\n serie: 'rel_hum',\r\n min: 25,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Cool',\r\n serie: 'cooling_setpoint',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n { title: 'Set Point' },\r\n {\r\n title: 'Heat',\r\n serie: 'heating_setpoint',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Ambient Temperature',\r\n serie: 'ambnt_temp',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: false,\r\n },\r\n {\r\n title: 'Battery Voltage',\r\n serie: 'battery_potential',\r\n min: 0,\r\n max: 27,\r\n showMinMax: true,\r\n disabledWhenOff: false,\r\n },\r\n {\r\n title: 'Fuel Level',\r\n serie: 'fuel_level',\r\n min: 0,\r\n max: 100,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n ],\r\n alarms: [\r\n {\r\n serie: 'battery_lo_state',\r\n errorState: 'Alarm',\r\n relatedSerie: 'battery_potential',\r\n disabledWhenOff: false,\r\n },\r\n { serie: 'canbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'modbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n ],\r\n },\r\n chiller: {\r\n offCalc: (statuses) => offBaseCalc('ctrl_pnl_state', 'Off', statuses),\r\n dials: [\r\n {\r\n title: 'Supply Temp',\r\n serie: 'sup_air_temp',\r\n min: 0,\r\n max: 90,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Return Temp',\r\n serie: 'ret_air_temp',\r\n min: 0,\r\n max: 90,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'L-L Volts',\r\n serie: 'gen_ca_ll_rms_voltage',\r\n min: 0,\r\n max: 600,\r\n showMinMax: true,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Avg Current',\r\n serie: 'gen_a_ac_rms_current',\r\n min: 0,\r\n max: 1,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Flow (GPM)',\r\n serie: 'flow_rate',\r\n min: 3,\r\n max: 12000,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Local',\r\n serie: 'local_setpoint',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n { title: 'Set Point' },\r\n {\r\n title: 'Remote',\r\n serie: 'remote_setpoint',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: true,\r\n },\r\n {\r\n title: 'Ambient Temperature',\r\n serie: 'ambnt_temp',\r\n min: 0,\r\n max: 0,\r\n showMinMax: false,\r\n disabledWhenOff: false,\r\n },\r\n {\r\n title: 'Battery Voltage',\r\n serie: 'battery_potential',\r\n min: 0,\r\n max: 27,\r\n showMinMax: true,\r\n disabledWhenOff: false,\r\n },\r\n ],\r\n alarms: [\r\n {\r\n serie: 'battery_lo_state',\r\n errorState: 'Alarm',\r\n relatedSerie: 'battery_potential',\r\n disabledWhenOff: false,\r\n },\r\n { serie: 'canbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n { serie: 'modbus_comm_state', errorState: 'Error', disabledWhenOff: true },\r\n ],\r\n twoStageCheck: {\r\n serieUndefinedWhenOff: 'sys_3_op_code',\r\n excludeSerie: [\r\n 'sys_3_op_code',\r\n 'sys_3_fault_code',\r\n 'sys_4_op_code',\r\n 'sys_4_fault_code',\r\n 'system_3_status',\r\n 'system_4_status',\r\n ],\r\n },\r\n },\r\n};\r\n\r\nconst offBaseCalc = (datapointId, value, statuses) => {\r\n const dp = statuses[datapointId];\r\n return dp ? dp.value === value : true;\r\n};\r\n","import {calculateStatusDatapoints, calculateNumericDatapoints, ToLowerCase} from './asset-dashboard.utility';\r\nimport templateService from './templates.service';\r\n\r\nexport default class DashboardViewModel {\r\n constructor(equipment) {\r\n this._id = equipment.id;\r\n this._status = calculateStatusDatapoints(equipment.onei3.series);\r\n this._numeric = calculateNumericDatapoints(equipment.onei3.series);\r\n this._title = equipment.attributes.name;\r\n this._packageIds = equipment.installation\r\n ? Array.from(equipment.installation.attributes.packages.map(package_item => package_item.id))\r\n : null;\r\n this._runHours = equipment.onei3.series.run_time;\r\n this._communicatedAt = equipment.communicatedAt;\r\n\r\n const template = templateService(this._packageIds, this._status, this._numeric);\r\n\r\n this._off = template.off;\r\n this._alarms = template.alarms;\r\n this._statuses = template.statuses;\r\n this._dials = template.dials;\r\n this._dialTemplate = template.templateName;\r\n this._attrs = ToLowerCase(equipment.attributes.attrs);\r\n }\r\n\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n get off() {\r\n return this._off;\r\n }\r\n\r\n get status() {\r\n return this._status;\r\n }\r\n\r\n get statuses() {\r\n return this._statuses;\r\n }\r\n\r\n get dials() {\r\n return this._dials;\r\n }\r\n\r\n get numeric() {\r\n return this._numeric;\r\n }\r\n\r\n get alarms() {\r\n return this._alarms;\r\n }\r\n\r\n get dialTemplate() {\r\n return this._dialTemplate;\r\n }\r\n\r\n get title() {\r\n return this._title;\r\n }\r\n\r\n get packageIds() {\r\n return this._packageIds;\r\n }\r\n\r\n get runHours() {\r\n return this._runHours;\r\n }\r\n\r\n get communicatedAt() {\r\n return this._communicatedAt;\r\n }\r\n get make() {\r\n return this._attrs['make'];\r\n }\r\n get model() {\r\n return this._attrs['model'];\r\n }\r\n get description() {\r\n return this._attrs['description'];\r\n }\r\n}\r\n","import ViewModel from './asset-dashboard.vm';\r\nimport moment from 'moment';\r\nimport Auth from '../../auth';\r\n\r\nconst chrome = {\r\n name: 'Google Chrome',\r\n icon: 'fa-chrome',\r\n url: 'https://www.google.com/chrome/',\r\n};\r\n\r\nconst firefox = {\r\n name: 'Mozilla Firefox',\r\n icon: 'fa-firefox',\r\n url: 'https://www.mozilla.org/en-US/firefox/new/',\r\n};\r\n\r\nconst edge = {\r\n name: 'Microsoft Edge',\r\n icon: 'fa-edge',\r\n url: 'https://www.microsoft.com/en-ca/software-download/windows10',\r\n};\r\n\r\nconst getBrowserSupportList = (browser) => {\r\n const browserList = [chrome, firefox];\r\n\r\n if (browser.osname === 'Windows' && browser.osversion === '10') {\r\n browserList.push(edge);\r\n }\r\n\r\n return browserList;\r\n};\r\n\r\nclass AssetDashboardController {\r\n constructor(\r\n equipmentDetailsService,\r\n $stateParams,\r\n browser,\r\n $interval,\r\n dashboardCommandsService,\r\n usersService,\r\n ) {\r\n 'ngInject';\r\n\r\n this.model = {};\r\n this.loading = true;\r\n this.browser = browser;\r\n this.newBrowsers = getBrowserSupportList(browser);\r\n const equipmentId = $stateParams.equipmentId;\r\n this.equipmentDetailsService = equipmentDetailsService;\r\n this.commandService = dashboardCommandsService;\r\n this.usersService = usersService;\r\n this.$interval = $interval;\r\n this.active = true;\r\n\r\n this.fetchEquipment(equipmentId);\r\n }\r\n\r\n fetchEquipment(equipmentId) {\r\n this.refreshing = true;\r\n this.equipmentDetailsService\r\n .get(equipmentId, [\r\n 'series',\r\n 'alerts',\r\n 'series.sparklines',\r\n 'maintenancePlans',\r\n 'faults',\r\n 'attributes',\r\n 'deviceCommands',\r\n ])\r\n .then((equipment) => {\r\n //to avoid using incomplete data where the call returns 200 but some part of the call is empty due to token expiration\r\n if (this.model && !this.active) return;\r\n\r\n this.model = new ViewModel(equipment);\r\n\r\n this.series = equipment.onei3.series;\r\n const { commands, total } = this.commandService.getSupportedCommands(\r\n equipment,\r\n this.model.packageIds,\r\n );\r\n\r\n this.commands = commands;\r\n this.showCommands =\r\n total > 0 && this.usersService.hasRequiredFeatures(['commands.control']);\r\n })\r\n .catch((err) => {\r\n //to prevent the UI from showing the error in case the toke expired while the API call still in progress and returned error.\r\n if (this.active) {\r\n this.error = err;\r\n throw err;\r\n }\r\n })\r\n .finally(() => {\r\n this.loading = this.refreshing = false;\r\n });\r\n }\r\n\r\n getDashboardLifetime() {\r\n const expiryAt = Auth.getExpiry();\r\n this.expiryDate = moment.unix(expiryAt);\r\n this.expiryIn = moment(this.expiryDate).diff(moment(), 'seconds');\r\n\r\n this.dashboardLifetimecheck();\r\n }\r\n\r\n dashboardLifetimecheck() {\r\n this.timeCheckInterval = this.$interval(() => {\r\n this.secondsLeft = moment(this.expiryDate).diff(moment(), 'seconds', true);\r\n this.timeInMins = Math.ceil(this.secondsLeft / 60.0);\r\n\r\n if (this.secondsLeft < 1) {\r\n this.active = false;\r\n this.secondsLeft = -1;\r\n this.timeInMins = '';\r\n this.$interval.cancel(this.updateAssetInterval);\r\n this.$interval.cancel(this.timeCheckInterval);\r\n }\r\n }, 500);\r\n }\r\n\r\n $onInit() {\r\n this.getDashboardLifetime();\r\n this.updateAssetInterval = this.setRefreshInterval();\r\n }\r\n\r\n $onDestroy() {\r\n this.$interval.cancel(this.updateAssetInterval);\r\n this.$interval.cancel(this.timeCheckInterval);\r\n }\r\n\r\n setRefreshInterval() {\r\n return this.$interval(() => {\r\n //making sure not to fire another call when there is one in progress\r\n if (!this.refreshing) {\r\n this.fetchEquipment(this.model.id);\r\n }\r\n }, 5000); //5 sec\r\n }\r\n\r\n timeAgo(time) {\r\n return moment(time).fromNow();\r\n }\r\n\r\n toggelCommandsView() {\r\n this.showCommandsView = !this.showCommandsView;\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./asset-dashboard.html'),\r\n controller: AssetDashboardController,\r\n bindings: {},\r\n controllerAs: 'vm',\r\n};\r\n","import 'angularjs-gauge';\r\n\r\nconst gaugeBuilderComponent = {\r\n template: require('./gauge-builder.html'),\r\n restrict: 'E',\r\n controller: GaugeBuilderController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n iid: '<',\r\n value: '<',\r\n uom: '<',\r\n state: '<',\r\n orientation: '<',\r\n name: '<',\r\n sparklines: '<',\r\n min: '<',\r\n max: '<',\r\n type: '<',\r\n size: '<',\r\n minThreshold: '<',\r\n maxThreshold: '<',\r\n showMinMax: '<',\r\n alarming: '<'\r\n }\r\n};\r\n\r\nfunction GaugeBuilderController() {\r\n 'ngInject';\r\n\r\n let vm = this;\r\n vm.getDialHeight = getDialHeight;\r\n vm.getSparkLineHeight = getSparkLineHeight;\r\n vm.getSparkLineWidth = getSparkLineWidth;\r\n vm.disabled = true;\r\n vm.foregroundColor = foregroundColor(null);\r\n vm.backgroundColor = backgroundColor(null);\r\n\r\n vm.$onChanges = function(changes) {\r\n if (changes.value && changes.value.currentValue) {\r\n vm.value = parseFloat(vm.value.toFixed(vm.decimal));\r\n vm.disabled = disabled(vm.value);\r\n vm.foregroundColor = foregroundColor(vm.value, vm.alarming);\r\n vm.backgroundColor = backgroundColor(vm.value);\r\n }\r\n };\r\n\r\n function getDialHeight(size) {\r\n if (size === 'large') {\r\n return 500;\r\n } else if (size === 'medium') {\r\n return 300;\r\n } else if (size === 'small') {\r\n return 175;\r\n } else {\r\n return 150;\r\n }\r\n }\r\n\r\n function getSparkLineHeight(size) {\r\n if (size === 'large') {\r\n return 60;\r\n } else if (size === 'medium') {\r\n return 30;\r\n } else if (size === 'small') {\r\n return 15;\r\n }\r\n\r\n return 10;\r\n }\r\n\r\n function getSparkLineWidth(size) {\r\n if (size === 'large') {\r\n return 150;\r\n } else if (size === 'medium') {\r\n return 100;\r\n } else if (size === 'small') {\r\n return 60;\r\n }\r\n\r\n return 45;\r\n }\r\n\r\n function disabled(value) {\r\n return value === null || value === undefined;\r\n }\r\n\r\n function foregroundColor(value, alarming) {\r\n const color = disabled(value) ? 'rgba(173,173,173,0)' : 'rgb(25,144,191)';\r\n return alarming ? 'rgb(255, 4, 2)' : color;\r\n }\r\n\r\n function backgroundColor(value) {\r\n return disabled(value) ? 'rgba(173,173,173,0.5)' : 'rgb(173,173,173)';\r\n }\r\n}\r\n\r\nexport default gaugeBuilderComponent;\r\n","class StatusController {\r\n constructor() {\r\n this.model = undefined;\r\n this.statuses = {\r\n Off: 'Off',\r\n On: 'On'\r\n };\r\n }\r\n\r\n $onChanges(changes) {\r\n if (changes) {\r\n if (changes.series) {\r\n this.model = changes.series;\r\n }\r\n if (changes.off) {\r\n this.status = this.off ? this.statuses.Off : this.statuses.On;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./status.html'),\r\n restrict: 'E',\r\n controller: StatusController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n series: '<',\r\n off: '<'\r\n }\r\n};\r\n","class AlarmController {\r\n constructor() {\r\n this.model = undefined;\r\n }\r\n\r\n $onChanges(changes) {\r\n if (changes && changes.series) {\r\n this.series = (this.series || []).filter(\r\n serie => !(this.off && serie.disabledWhenOff) && serie.value === serie.errorState\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./alarms.html'),\r\n restrict: 'E',\r\n controller: AlarmController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n series: '<',\r\n off: '<'\r\n }\r\n};\r\n","const equipmentStatusComponent = {\r\n template: require('./equipment-status.html'),\r\n restrict: 'E',\r\n controller: EquipmentStatusController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n series: '<'\r\n }\r\n};\r\n\r\nfunction EquipmentStatusController() {\r\n 'ngInject';\r\n\r\n var vm = this;\r\n vm.groupedGauges = {};\r\n vm.stateSeries = [];\r\n\r\n vm.$onDestroy = function () {};\r\n\r\n vm.$onChanges = function () {};\r\n}\r\n\r\nexport default equipmentStatusComponent;","import moment from 'moment';\r\nimport template from './commands.html';\r\n\r\nconst isSameCommand = (first = {}, second = {}) => {\r\n return (\r\n first.name === second.name &&\r\n first.parameters?.value === second.parameters?.value ||\r\n first.parameters['write-values'] === second.parameters?.value &&\r\n moment(first.createdAt).diff(moment(second.createdAt), 'seconds') < 30\r\n //Hack to get this working for modbus commands write-values prop\r\n );\r\n};\r\n\r\nclass CommandsController {\r\n constructor($interval, dashboardCommandsService) {\r\n 'ngInject';\r\n\r\n this.$interval = $interval;\r\n\r\n this.commandService = dashboardCommandsService;\r\n }\r\n $onInit() {\r\n if (this.active) {\r\n this.getCommnadsFeedbackHistory(true);\r\n this.updateHistoryinterval = this.setUpdateHistoryinterval();\r\n }\r\n\r\n this.commandsValueLookup = this.getcommandsValuesLookup(this.commands);\r\n }\r\n\r\n setUpdateHistoryinterval() {\r\n return this.$interval(() => {\r\n if (!['loading', 'updating'].includes(this.commandsHistoryStatus)) {\r\n this.getCommnadsFeedbackHistory();\r\n }\r\n }, 15000); //15sec\r\n }\r\n\r\n $onChanges() {\r\n if (!this.active) {\r\n this.$interval.cancel(this.updateHistoryinterval);\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.$interval.cancel(this.updateHistoryinterval);\r\n }\r\n\r\n confirm(command, option) {\r\n if (!this.active || !option) return;\r\n\r\n this.commandService\r\n .confirm(command, option)\r\n .then((_) => {\r\n if (this.active) this.sendDeviceCommand(command, option);\r\n })\r\n .catch((_) => {});\r\n }\r\n\r\n sendDeviceCommand(command, option) {\r\n this.sendingStatus = 'sending';\r\n return this.commandService\r\n .sendCommand(this.asset.id, command, option.value)\r\n .then((_) => {\r\n //add the command to ui feedback til it come back in the api call\r\n this.newCommandFeedbackToShowInUI(command.key, option.value);\r\n })\r\n .catch((_) => {\r\n this.sendingStatus = 'error';\r\n })\r\n .finally((_) => {\r\n this.sendingStatus = '';\r\n });\r\n }\r\n\r\n newCommandFeedbackToShowInUI(name, value) {\r\n this.newCommand = {\r\n name,\r\n parameters: { value },\r\n createdAt: moment().toISOString(),\r\n status: 'pending',\r\n statusAt: moment().toISOString(),\r\n };\r\n this.commandsHistory = [this.newCommand, ...(this.commandsHistory || [])];\r\n }\r\n\r\n getCommnadsFeedbackHistory(init) {\r\n this.commandsHistoryStatus = init ? 'loading' : 'updating';\r\n return this.commandService\r\n .getAssetCommandsHistroy(this.asset.id)\r\n .then((res) => {\r\n if (this.newCommand) {\r\n const [firstInList = {}] = res || [];\r\n if (isSameCommand(firstInList, this.newCommand)) {\r\n this.newCommand = undefined;\r\n } else {\r\n res = [this.newCommand, ...res];\r\n }\r\n }\r\n\r\n this.commandsHistory = res;\r\n })\r\n .finally((_) => {\r\n this.commandsHistoryStatus = 'loaded';\r\n });\r\n }\r\n\r\n getcommandsValuesLookup(commands) {\r\n return Object.values(commands || []).reduce((acc, com) => {\r\n return {\r\n ...acc,\r\n ...com.uiParam.constraints.reduce(\r\n (ac, o) => ({ ...ac, [`${com.key}${o.value}`]: o.label }),\r\n {},\r\n ),\r\n };\r\n }, {});\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: CommandsController,\r\n controllerAs: 'cmdVm',\r\n bindings: {\r\n asset: '<',\r\n commands: '<',\r\n active: '<',\r\n series: '<',\r\n },\r\n};\r\n","import moment from 'moment';\r\n\r\n//\r\nimport template from './feedback-history.html';\r\n\r\nconst statusCssClasses = {\r\n pending: 'fa fa-spinner fa-pulse fa-md pending-icon',\r\n completed: 'fa fa-check succeeded-icon fa-md ',\r\n failed: 'fa fa-times failed-icon fa-md',\r\n};\r\n\r\nclass CommandsFeedbackHistoryController {\r\n constructor(dashboardCommandsService) {\r\n 'ngInject';\r\n\r\n this.commandService = dashboardCommandsService;\r\n\r\n this.statusClasses = {\r\n pending: statusCssClasses.pending,\r\n aborted: statusCssClasses.failed,\r\n completed: statusCssClasses.completed,\r\n rejected: statusCssClasses.failed,\r\n acknowledged: statusCssClasses.pending,\r\n pendingAbort: statusCssClasses.failed,\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.statusMap = this.commandService.commandStatusMap();\r\n }\r\n\r\n $onDestroy() {}\r\n\r\n getExpectedDate(date) {\r\n return moment(date).add(3, 'm').toDate();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: CommandsFeedbackHistoryController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n history: '<',\r\n loading: '<',\r\n valuesLookup: '<',\r\n },\r\n};\r\n","import moment from 'moment';\r\n\r\nimport template from './status-check.html';\r\n\r\nconst preCheckList = {\r\n communicatedAt: {\r\n key: 'communicatedAt',\r\n name: 'Communication',\r\n class: 'fa-exchange',\r\n status: '',\r\n bad: 'No communication has been made with the equipment in the last 2 hours',\r\n good: 'In good communication status',\r\n getStatus: (comAt) => {\r\n return (comAt && moment().diff(moment(comAt), 'hours')) > 2 ? 'bad' : 'good';\r\n },\r\n },\r\n battery: {\r\n key: 'battery',\r\n name: 'Battery Status',\r\n class: 'fa-battery-full',\r\n status: '',\r\n bad: 'Battery voltage is low.',\r\n good: 'Battery voltage is good.',\r\n getStatus: (series) => {\r\n const v = series['battery_potential']?.last?.v;\r\n return v > 10 ? 'good' : 'bad';\r\n },\r\n },\r\n auto_mode: {\r\n key: 'auto_mode',\r\n name: 'Remote Start Setting',\r\n class: 'fa-key',\r\n status: '',\r\n bad: 'Please make sure Autostart setting is in the Keypad Start position and the Controller Mode is in the Auto mode ',\r\n good: 'The Autostart Setting is in the Keypad Start position and the Controller Mode is in the Auto mode ',\r\n getStatus: (series) => {\r\n const autoSetting = series['auto_start_mpc']?.last?.v;\r\n const ctrlMode = series['controller_mode_mpc_pump']?.last?.v;\r\n //255 = auto, 1=Remote Start\r\n return ctrlMode === 255 && autoSetting === 1 ? 'good' : 'bad';\r\n },\r\n },\r\n};\r\n\r\nclass StatusCheckController {\r\n constructor(dashboardCommandsService) {\r\n 'ngInject';\r\n\r\n this.commandService = dashboardCommandsService;\r\n\r\n this.preCheck = preCheckList;\r\n }\r\n\r\n toggleMsg(key) {\r\n this.checked = this.checked?.key !== key ? this.preCheck[key] : undefined;\r\n }\r\n\r\n $onInit() {}\r\n\r\n $onChanges() {\r\n Object.keys(this.preCheck).forEach((key) => {\r\n if (key === 'communicatedAt') {\r\n this.preCheck[key].status = this.preCheck[key].getStatus(this.communicatedAt);\r\n } else {\r\n this.preCheck[key].status = this.preCheck[key].getStatus(this.series);\r\n }\r\n });\r\n }\r\n\r\n $onDestroy() {}\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: StatusCheckController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n series: '<',\r\n communicatedAt: '<',\r\n },\r\n};\r\n","export default function AssetDashboardRouteConfig($stateProvider) {\r\n\t'ngInject';\r\n\r\n\t$stateProvider.state('assetdashboard', {\r\n\t\turl: '/asset/{equipmentId}',\r\n\t\ttemplate: ``,\r\n\t\trequiredFeatures: ['assets.asset-dashboard']\r\n\t});\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, data) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.option = data.option;\r\n }\r\n ok() {\r\n this.$uibModalInstance.close();\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}\r\n","import modalHTml from './confirm-modal/confirm.modal.html';\r\nimport modalControl from './confirm-modal/confirm.modal';\r\n\r\nexport default class CommandsDashboardService {\r\n constructor($uibModal, CommandsRepo) {\r\n 'ngInject';\r\n this.$uibModal = $uibModal;\r\n this.commandsapiRepo = CommandsRepo;\r\n\r\n this.supportedPackagesCommandsMap = {\r\n '2042281683352289994': ['start_stop', 'throttle'],\r\n '2395104989652451496': ['dse_start_stop', 'dse_throttle']\r\n };\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} assetPackages\r\n * @returns commands list\r\n */\r\n getpackageSupportedCommands(assetPackages = []) {\r\n const packageId = Object.keys(this.supportedPackagesCommandsMap).find((k) =>\r\n (assetPackages || []).includes(k),\r\n );\r\n return packageId ? this.supportedPackagesCommandsMap[packageId] : [];\r\n }\r\n\r\n getSupportedCommands(equipment, assetPackages) {\r\n const assetcommandsList = equipment?.relationships?.deviceCommands?.data || [];\r\n this.packagesCommands = this.getpackageSupportedCommands(assetPackages);\r\n\r\n const supCommands = assetcommandsList\r\n .filter((c) => this.packagesCommands.includes(c.id))\r\n .reduce(\r\n (acc, c) => ({\r\n ...acc,\r\n [c.id]: {\r\n key: c.id,\r\n parameters: c.attributes.parameters,\r\n uiParam: c.attributes.parameters.find((p) => p.name === 'write-values' || p.name === 'value'),\r\n },\r\n }),\r\n {},\r\n );\r\n return { commands: supCommands, total: Object.keys(supCommands).length };\r\n }\r\n\r\n sendCommand(assetId, command, userInput) {\r\n const { key, parameters = [] } = command;\r\n const bodyParams = {};\r\n parameters.forEach((parameter) => {\r\n bodyParams[parameter.name] = `${parameter.value}`;\r\n });\r\n \r\n if (bodyParams['write-values'] === \"\") { \r\n bodyParams['write-values'] = `${userInput}`;\r\n } else {\r\n bodyParams['value'] = `${userInput}`;\r\n } \r\n\r\n return this.commandsapiRepo.executeCommand(assetId, key, bodyParams);\r\n }\r\n\r\n confirm(command, option) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'sm',\r\n template: modalHTml,\r\n controller: modalControl,\r\n controllerAs: 'modalVm',\r\n windowClass: 'd-com-modal',\r\n resolve: {\r\n data: () => ({ command, option }),\r\n },\r\n }).result;\r\n }\r\n\r\n //*** commmands ***//\r\n commandStatusMap() {\r\n return {\r\n pending: 'Initiated',\r\n aborted: 'Not Acknowledged',\r\n completed: 'Completed',\r\n rejected: 'Failed',\r\n acknowledged: 'Processing',\r\n pendingAbort: 'Not Acknowledged',\r\n };\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} assetId\r\n * @returns command feedback and history status filtered to dashboard supported commands only.\r\n */\r\n getAssetCommandsHistroy(assetId) {\r\n return this.commandsapiRepo\r\n .getEquipmentCommandHistory(assetId)\r\n .then((response = {}) =>\r\n (response.data || []).filter((history) => this.packagesCommands.includes(history.name)),\r\n );\r\n }\r\n}\r\n","class Layout1Controller {\r\n constructor() {}\r\n\r\n $onInit() {}\r\n\r\n $onChanges(changes) {\r\n if (changes.template) {\r\n this.template.elements.forEach(el => (el.value = el.disabledWhenOff && this.template.off ? null : el.value));\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./layout.html'),\r\n controller: Layout1Controller,\r\n bindings: {\r\n template: '<'\r\n },\r\n controllerAs: 'vm'\r\n};\r\n","class DefaultLayoutController {\r\n\tconstructor() {}\r\n\r\n\t$onInit() {}\r\n\r\n\t$onChanges(changes) {\r\n\t\t// if (changes.series && changes.series.currentValue) {\r\n\t\t// \tthis.seriesArray = Object.keys(changes.series.currentValue).map(prop => changes.series.currentValue[prop]);\r\n\t\t// }\r\n\t}\r\n}\r\n\r\nexport default {\r\n\ttemplate: require('./default.html'),\r\n\tcontroller: DefaultLayoutController,\r\n\tbindings: {\r\n\t\tseries: '<'\r\n\t},\r\n\tcontrollerAs: 'vm'\r\n};\r\n","const BASE_TEMPLATE_NAME = 'base';\r\nconst FAN_TEMPLATE_NAME = 'fan';\r\n\r\nconst LAYOUT_TEMPLATES = {\r\n fan: {\r\n name: FAN_TEMPLATE_NAME,\r\n elements: [\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'text-value' },\r\n { type: 'text' },\r\n { type: 'text-value' },\r\n { type: 'text-value' },\r\n { type: 'bar', orientation: 'vertical' },\r\n { type: 'bar', orientation: 'vertical' },\r\n ],\r\n groups: [\r\n { limit: 2, start: 0 },\r\n { limit: 3, start: 2 },\r\n { limit: 3, start: 5 },\r\n { limit: 1, start: 8 },\r\n { limit: 2, start: 9 },\r\n ],\r\n },\r\n base: {\r\n name: BASE_TEMPLATE_NAME,\r\n elements: [\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'medium' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'dial', size: 'small' },\r\n { type: 'bar', orientation: 'vertical' },\r\n { type: 'bar', orientation: 'vertical' },\r\n { type: 'bar', orientation: 'vertical' },\r\n { type: 'bar', orientation: 'vertical' },\r\n ],\r\n groups: [\r\n { limit: 4, start: 0 },\r\n { limit: 3, start: 4 },\r\n { limit: 4, start: 7 },\r\n ],\r\n },\r\n};\r\n\r\nconst TEMPLATE_MAP = {\r\n power: 'base',\r\n pump: 'base',\r\n fan: 'fan',\r\n chiller: 'fan',\r\n pump_m7: 'base',\r\n};\r\n\r\nconst mergeTemplateElement = (template, elements) =>\r\n template.map((value, index) => ({ ...template[index], ...elements[index] }));\r\n\r\nclass LayoutsController {\r\n constructor() {\r\n this.layoutTemplate = null;\r\n }\r\n\r\n $onInit() {}\r\n\r\n $onChanges(changes) {\r\n if (changes.series && this.template) {\r\n const layoutTemplateName = TEMPLATE_MAP[this.template];\r\n this.layoutTemplate = LAYOUT_TEMPLATES[layoutTemplateName];\r\n this.layoutTemplate.elements = [\r\n ...mergeTemplateElement(this.layoutTemplate.elements, this.series),\r\n ];\r\n this.layoutTemplate.off = this.off;\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./layouts.html'),\r\n controller: LayoutsController,\r\n bindings: {\r\n id: '<',\r\n template: '<',\r\n series: '<',\r\n off: '<',\r\n },\r\n controllerAs: 'vm',\r\n};\r\n","import angular from 'angular';\r\n\r\n/* Components */\r\nimport alertsPanelComponent from './alerts-panel/alerts-panel.component';\r\nimport assetDashboardComponent from './asset-dashboard.component';\r\nimport gaugeBuilderComponent from './components/gauge-builder/gauge-builder.component';\r\nimport statusComponent from './status/status.component';\r\nimport alarmComponent from './alarms/alarms.component';\r\nimport equipmentStatusComponent from './equipment-status/equipment-status.component';\r\n\r\n//commands ui\r\nimport commandsView from './commands/commands.component';\r\nimport commandFeedbackHistory from './commands/feedback-history/feedback-history';\r\nimport statusCheck from './commands/status-check/status-check.component';\r\n\r\n/* Services */\r\nimport AssetDashboardRouteConfig from './asset-dashboard.route';\r\nimport DashboardCommandsService from './commands/commands.util.service';\r\n\r\nimport layout1Component from './Layouts/layout/layout.component';\r\nimport defaultLayoutComponent from './Layouts/default/default.component';\r\nimport layoutsComponent from './Layouts/layouts.component';\r\n\r\nconst assetDashboardModule = angular\r\n .module('app.assetDash', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n /* Components */\r\n .component('alertsPanel', alertsPanelComponent)\r\n .component('assetDashboard', assetDashboardComponent)\r\n .component('gaugeBuilder', gaugeBuilderComponent)\r\n .component('status', statusComponent)\r\n .component('alarms', alarmComponent)\r\n .component('commandEquipmentStatus', equipmentStatusComponent)\r\n\r\n .component('layout', layout1Component)\r\n .component('defaultLayout', defaultLayoutComponent)\r\n .component('layouts', layoutsComponent)\r\n\r\n //command ui\r\n .component('dCommandsView', commandsView)\r\n .component('dCommandsFeedbackHistory', commandFeedbackHistory)\r\n .component('dStatusCheck', statusCheck)\r\n\r\n /* Services */\r\n .service('dashboardCommandsService', DashboardCommandsService)\r\n .config(AssetDashboardRouteConfig);\r\n\r\nexport default assetDashboardModule.name;\r\n","import Action from '../action';\r\n\r\nexport const REQUEST_USER = '@user/REQUEST_USER';\r\nexport const REQUEST_USER_FAIL = '@user/REQUEST_USER_FAIL';\r\nexport const REQUEST_USER_SUCCESS = '@user/REQUEST_USER_SUCCESS';\r\nexport const REQUEST_CLAIMS_SUCCESS = '@user/REQUEST_CLAIMS_SUCCESS';\r\n\r\nexport const REQUEST_REFRESH_TOKEN = '@user/REQUEST_REFRESH_TOKEN';\r\nexport const REQUEST_REFRESH_TOKEN_FAIL = '@user/REQUEST_REFRESH_TOKEN_FAIL';\r\nexport const REQUEST_REFRESH_TOKEN_SUCCESS = '@user/REQUEST_REFRESH_TOKEN_SUCCESS';\r\n\r\nexport const RECEIVE_USER_CLAIMS = '@user/RECEIVE_USER_CLAIMS';\r\n\r\nexport const REQUEST_USER_ACCOUNTS = '@user/REQUEST_USER_ACCOUNTS';\r\nexport const REQUEST_USER_ACCOUNTS_FAIL = '@user/REQUEST_USER_ACCOUNTS_FAIL';\r\nexport const REQUEST_USER_ACCOUNTS_SUCCESS = '@user/REQUEST_USER_ACCOUNTS_SUCCESS';\r\n\r\nexport const ACCOUNT_REQUESTED = '@account/ACCOUT_REQUESTED';\r\nexport const ACCOUNT_RECEIVED = '@account/ACCOUT_RECEIVED';\r\n\r\nexport const REQUEST_DATAPOINTS_DESCRIPTORS = '@account/REQUEST_DATAPOINTS_DESCRIPTORS';\r\nexport const REQUEST_DATAPOINTS_DESCRIPTORS_FAIL = '@account/REQUEST_DATAPOINTS_DESCRIPTORS_FAIL';\r\nexport const REQUEST_DATAPOINTS_DESCRIPTORS_SUCCESS = '@account/REQUEST_DATAPOINTS_DESCRIPTORS_SUCCESS';\r\n\r\nexport const requestUser = () => Action(REQUEST_USER);\r\nexport const requestUserSuccess = payload => Action(REQUEST_USER_SUCCESS, payload);\r\nexport const requestClaimsSuccess = payload => Action(REQUEST_CLAIMS_SUCCESS, payload);\r\nexport const receiveUserClaims = payload => Action(RECEIVE_USER_CLAIMS, payload);\r\nexport const requestUserFailed = error => Action(REQUEST_USER_FAIL, error, true);\r\nexport const requestRefreshToken = () => Action(REQUEST_REFRESH_TOKEN);\r\nexport const refreshTokenSuccess = payload => Action(REQUEST_REFRESH_TOKEN_SUCCESS, payload);\r\nexport const refreshTokenFail = error => Action(REQUEST_REFRESH_TOKEN_FAIL, error, true);\r\nexport const retrieveAccount = () => Action(ACCOUNT_REQUESTED);\r\nexport const retrieveDatapointsDescriptors = () => Action(REQUEST_DATAPOINTS_DESCRIPTORS);\r\nexport const requestUserAccounts = () => Action(REQUEST_USER_ACCOUNTS);\r\nexport const requestUserAccountsSuccess = payload => Action(REQUEST_USER_ACCOUNTS_SUCCESS, payload);\r\nexport const requestUserAccountsFail = error => Action(REQUEST_USER_ACCOUNTS_FAIL, error, true);\r\nexport const requestDatapointsDescriptorsSuccess = payload => Action(REQUEST_DATAPOINTS_DESCRIPTORS_SUCCESS, payload);\r\nexport const requestDatapointsDescriptorsFail = error => Action(REQUEST_DATAPOINTS_DESCRIPTORS_FAIL, error, true);\r\n","import * as UserActions from '../../../../state/user/user.actions';\r\nimport Auth from '../../../../auth';\r\n\r\nclass AccountsSwitchingController {\r\n constructor($ngRedux, navService) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n this.navService = navService;\r\n this.userAccount = {};\r\n this.currentUserAccounts = null;\r\n this.searchQuery = '';\r\n this.userMemberAccountsCount = 0;\r\n this.filterAccounts = this.filterAccounts.bind(this);\r\n this.filterTrack = '';\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, UserActions)(this);\r\n }\r\n\r\n toggled(open) {\r\n if (open) {\r\n this.navService.hideSideNav();\r\n }\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { user } = state;\r\n const { switchableAccounts, memberShipCount, currentAccount } = user;\r\n\r\n return {\r\n currentUserAccounts: switchableAccounts,\r\n userMembershipsCount: memberShipCount || 0,\r\n userAccount: currentAccount,\r\n };\r\n }\r\n\r\n filterAccounts(account) {\r\n if (!account) return;\r\n return accountNameContains(account, this.searchQuery);\r\n }\r\n\r\n gotoAccount(account) {\r\n if (account.id !== this.userAccount.id) {\r\n Auth.switchAccount(account.id);\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./accounts-switching.html'),\r\n restrict: 'E',\r\n controller: AccountsSwitchingController,\r\n controllerAs: 'vm',\r\n};\r\n\r\n//return true if the account name or one of it's sub account has the input text\r\nexport const accountNameContains = (account = {}, text) => {\r\n if (text) {\r\n text = text.toLowerCase();\r\n } else {\r\n return true;\r\n }\r\n\r\n const res =\r\n (account.name || '').toLowerCase().includes(text) ||\r\n (account.accounts || []).filter((sub) => (sub.name || '').toLowerCase().includes(text)).length >\r\n 0;\r\n\r\n return res;\r\n};\r\n","\r\nexport default function SideNavDirective() {\r\n return {\r\n template: require('./mobile.component.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n controller: NavMobileController\r\n };\r\n}\r\n\r\nclass NavMobileController {\r\n constructor($scope, $state, $location, navService) {\r\n\r\n 'ngInject';\r\n \r\n $scope.closeSideNav = function () {\r\n navService.hideSideNav();\r\n };\r\n\r\n //for redirecting to specific section on the help page\r\n $scope.goHelp = function () {\r\n //help variables for page selection\r\n var helpPage = '';\r\n var helpItem = '';\r\n\r\n //current state and parent state variable\r\n var cs = $state.current.name;\r\n cs = cs.replace(/[0-9]/gi, '');\r\n\r\n var hs = $state.current.helpState;\r\n\r\n //set the help variables for page section\r\n if (cs === \"help\") { //if help button is clicked from same page\r\n cs = $location.path();\r\n var page = cs.split('/');\r\n helpPage = page[2] || null;\r\n helpItem = page[3] || null;\r\n } else { // help clicked from other page on website\r\n if (hs) { // if parent state available\r\n var page = hs.split('.');\r\n helpPage = $state.current.helpModuleId || page[0];\r\n //remove integer and . from patent state to create id of the div\r\n hs = hs.replace(/[-.0-9]/gi, '');\r\n helpItem = hs;\r\n } else {\r\n var page = cs.split('.');\r\n helpPage = $state.current.helpModuleId || page[0];\r\n cs = cs.replace(/[-.]/gi, '');\r\n helpItem = cs;\r\n }\r\n }\r\n\r\n //convert to lowercase\r\n if (helpItem)\r\n helpItem = helpItem.toLowerCase();\r\n if (helpPage)\r\n helpPage = helpPage.toLowerCase();\r\n\r\n $state.go(\"help\", {\r\n helpPage: helpPage,\r\n helpItem: helpItem\r\n });\r\n };\r\n\r\n $scope.selectedModule = null;\r\n\r\n $scope.userModule = {\r\n \"id\": \"profile\"\r\n };\r\n\r\n $scope.moduleStyle = function (module) {\r\n\r\n var style = \"transition: all 0.5s;\";\r\n\r\n if (!$scope.isActive(module)) {\r\n return style;\r\n };\r\n\r\n return style;\r\n };\r\n\r\n $scope.isActive = function (module) {\r\n return $scope.selectedModule === module;\r\n };\r\n\r\n $scope.toggleUserModule = function () {\r\n $scope.toggleModule($scope.userModule);\r\n };\r\n\r\n $scope.toggleModule = function (module) {\r\n $scope.selectedModule = $scope.isActive(module) ?\r\n null :\r\n module;\r\n };\r\n }\r\n}\r\n","\r\nexport default function NavLeftDirective() {\r\n return {\r\n template: require('./left.component.html'),\r\n restrict: 'E',\r\n scope: {\r\n module: '=?'\r\n },\r\n controller: NavLeftController\r\n };\r\n}\r\n\r\nclass NavLeftController {\r\n constructor($scope, navService) {\r\n\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.navService = navService;\r\n\r\n this.$scope.module = this.navService.getCurrentModule();\r\n\r\n this.$scope.groupList = [];\r\n\r\n this.$scope.ungroupedItems = [];\r\n\r\n for (var key in this.$scope.module.groups) {\r\n this.$scope.groupList.push(this.$scope.module.groups[key]);\r\n }\r\n\r\n for (var itemKey in this.$scope.module.items) {\r\n\r\n //check to see if sub items are allowed\r\n if (!(navService.isValidState(this.$scope.module.items[itemKey].sref))) {\r\n continue;\r\n }\r\n\r\n //try and find the group that this belongs tooo\r\n let itemGroup = null;\r\n for (let groupKey in this.$scope.groupList) {\r\n if (this.$scope.groupList[groupKey].id === this.$scope.module.items[itemKey].group) {\r\n itemGroup = this.$scope.groupList[groupKey];\r\n break;\r\n }\r\n }\r\n\r\n if (itemGroup) {\r\n if (!itemGroup.items) {\r\n itemGroup.items = [];\r\n }\r\n // Only add the sub-items once.\r\n let itemMatch = false;\r\n for (var i = 0; i < itemGroup.items.length; i++) {\r\n if (itemGroup.items[i].sref === this.$scope.module.items[itemKey].sref) {\r\n itemMatch = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!itemMatch) {\r\n itemGroup.items.push(this.$scope.module.items[itemKey]);\r\n }\r\n } else {\r\n this.$scope.ungroupedItems.push(this.$scope.module.items[itemKey]);\r\n }\r\n }\r\n }\r\n}","\r\n// swtich for mini style NAV, realted to 'collapseNav' directive\r\nexport function toggleNavCollapsedMin($rootScope) {\r\n\r\n 'ngInject';\r\n\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n var app;\r\n\r\n app = $('#app');\r\n\r\n ele.on('click', function(e) {\r\n if (app.hasClass('nav-collapsed-min')) {\r\n app.removeClass('nav-collapsed-min');\r\n } else {\r\n app.addClass('nav-collapsed-min');\r\n $rootScope.$broadcast('nav:reset');\r\n }\r\n return e.preventDefault();\r\n }); \r\n }\r\n}\r\n\r\n\r\n// Add 'active' class to li based on url, muli-level supported, jquery free\r\nexport function highlightActive() {\r\n var directive = {\r\n restrict: 'A',\r\n controller: toggleNavCollapsedMinCtrl\r\n };\r\n\r\n return directive;\r\n\r\n function toggleNavCollapsedMinCtrl($scope, $element, $attrs, $location) {\r\n\r\n 'ngInject';\r\n\r\n var highlightActive, links, path;\r\n\r\n links = $element.find('a');\r\n\r\n path = function() {\r\n return $location.path();\r\n };\r\n\r\n highlightActive = function(links, path) {\r\n path = '#' + path;\r\n return angular.forEach(links, function(link) {\r\n var $li, $link, href;\r\n $link = angular.element(link);\r\n $li = $link.parent('li');\r\n href = $link.attr('href');\r\n if ($li.hasClass('active')) {\r\n $li.removeClass('active');\r\n }\r\n if (path.indexOf(href) === 0) {\r\n return $li.addClass('active');\r\n }\r\n });\r\n };\r\n\r\n highlightActive(links, $location.path());\r\n\r\n $scope.$watch(path, function(newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n return highlightActive(links, $location.path());\r\n });\r\n\r\n }\r\n\r\n}\r\n\r\n// toggle on-canvas for small screen, with CSS\r\nexport function toggleOffCanvas() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n ele.on('click', function () {\r\n rootScope.showingSideNav = !rootScope.showingSideNav;\r\n });\r\n }\r\n}\r\n\r\n//Toggle the menu for content pages...not the nav menu\r\nexport function toggleMenuOffCanvas() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n \r\n ele.on('click', function () {\r\n if ($('#app').hasClass(\"on-canvas-menu\"))\r\n $('#app').removeClass(\"on-canvas-menu\");\r\n else\r\n $('#app').addClass(\"on-canvas-menu\");\r\n });\r\n }\r\n}\r\n\r\n//Toggle the menu for content pages...not the nav menu\r\nexport function toggleFiltersOffCanvas() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n\r\n ele.on('click', function () {\r\n if ($('#app').hasClass(\"on-filters-menu\")) {\r\n $('#app').removeClass(\"on-filters-menu\");\r\n } else {\r\n $('#app').addClass(\"on-filters-menu\");\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n// toggle on-canvas for small screen, with CSS\r\nexport function toggleUserMenu() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n ele.on('click', function () {\r\n if ($('.g-profile-menu').hasClass(\"show\")) {\r\n return $('.g-profile-menu').removeClass(\"show\");\r\n } else {\r\n return $('.g-profile-menu').addClass(\"show\");\r\n }\r\n });\r\n }\r\n}\r\n\r\n//hide the user profile menu when it is navigated away from\r\nexport function hideUserMenu() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n ele.on('blur', function () {\r\n if ($('.g-profile-menu').hasClass(\"show\")) {\r\n setTimeout(() => $('.g-profile-menu').removeClass(\"show\"), 200);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function toggleCollapseableUserMenu() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n ele.on('click', function () {\r\n if ($('.g-user-menu-profile').hasClass(\"g-user-menu-hide\")) {\r\n \r\n $('#user-menu-state').removeClass(\"icon-arrowdown\");\r\n $('#user-menu-state').addClass(\"icon-arrowup\");\r\n \r\n return $('.g-user-menu-profile').removeClass(\"g-user-menu-hide\");\r\n } else {\r\n \r\n $('#user-menu-state').removeClass(\"icon-arrowup\");\r\n $('#user-menu-state').addClass(\"icon-arrowdown\");\r\n \r\n return $('.g-user-menu-profile').addClass(\"g-user-menu-hide\");\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n// for accordion/collapse style NAV\r\nexport function collapseNav() {\r\n var directive = {\r\n restrict: 'A',\r\n priority: 100,\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n\r\n 'ngInject';\r\n\r\n var $a, $aRest, $app, $lists, $listsRest, $nav, $window, Timer, prevWidth, slideTime, updateClass;\r\n\r\n slideTime = 250;\r\n\r\n $window = $(window);\r\n if (!scope.item.subitems) return;\r\n\r\n if(scope.item.subitems.length > 0) {\r\n\r\n $lists = ele.find('ul').parent('li');\r\n $lists.append('');\r\n\r\n $a = $lists.children('a');\r\n $listsRest = ele.children('li').not($lists);\r\n $aRest = $listsRest.children('a');\r\n \r\n $app = $('#app');\r\n $nav = $('#nav-container');\r\n\r\n $a.on('click', function(event) {\r\n var $parent, $this;\r\n if ($app.hasClass('nav-collapsed-min') || ($nav.hasClass('nav-horizontal') && $window.width() >= 768)) {\r\n return false;\r\n }\r\n $this = $(this);\r\n $parent = $this.parent('li');\r\n $lists.not($parent).removeClass('open').find('ul').slideUp(slideTime);\r\n $parent.toggleClass('open').find('ul').stop().slideToggle(slideTime);\r\n event.preventDefault();\r\n });\r\n\r\n $aRest.on('click', function(event) {\r\n $lists.removeClass('open').find('ul').slideUp(slideTime);\r\n });\r\n\r\n scope.$on('nav:reset', function(event) {\r\n $lists.removeClass('open').find('ul').slideUp(slideTime);\r\n });\r\n\r\n Timer = void 0;\r\n\r\n prevWidth = $window.width();\r\n\r\n updateClass = function() {\r\n var currentWidth;\r\n currentWidth = $window.width();\r\n if (currentWidth < 768) {\r\n $app.removeClass('nav-collapsed-min');\r\n }\r\n if (prevWidth < 768 && currentWidth >= 768 && $nav.hasClass('nav-horizontal')) {\r\n $lists.removeClass('open').find('ul').slideUp(slideTime);\r\n }\r\n prevWidth = currentWidth;\r\n };\r\n\r\n $window.resize(function() {\r\n var t;\r\n clearTimeout(t);\r\n t = setTimeout(updateClass, 300);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function removeOffCanvas() {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, ele, attrs) {\r\n ele.on('click', function () {\r\n if ($('#app').hasClass(\"on-canvas\")) {\r\n return $('#app').removeClass(\"on-canvas\");\r\n }\r\n });\r\n }\r\n}\r\n","export default function AdminNavService(gettext) {\r\n\t'ngInject';\r\n\r\n\t'ngInject';\r\n\r\n\tvar module = {\r\n\t\tid: 'admin',\r\n\t\tname: 'Admin',\r\n\t\tsref: 'admin',\r\n\t\ticon: 'fas fa-cog',\r\n\t\tpriority: 10,\r\n\t\titems: [\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Users'),\r\n\t\t\t\tmobileName: gettext('View Users'),\r\n\t\t\t\tsref: 'admin.userslist',\r\n\t\t\t\tgroup: 'userManagment'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Roles'),\r\n\t\t\t\tmobileName: gettext('View Roles'),\r\n\t\t\t\tsref: 'admin.usersRoleslist',\r\n\t\t\t\tgroup: 'userManagment'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Security'),\r\n\t\t\t\tmobileName: gettext('View Security Groups'),\r\n\t\t\t\tsref: 'admin.securitygroups',\r\n\t\t\t\tgroup: 'userManagment'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Sub Accounts'),\r\n\t\t\t\tsref: 'admin.subaccounts',\r\n\t\t\t\tgroup: 'accountManagement'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Templates'),\r\n\t\t\t\tmobileName: gettext('View Templates'),\r\n\t\t\t\tsref: 'admin.products-list',\r\n\t\t\t\tgroup: 'assets'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Sharing'),\r\n\t\t\t\tsref: 'admin.manage',\r\n\t\t\t\tgroup: 'assets'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tname: gettext('Attributes'),\r\n\t\t\t\tmobileName: gettext('View Attributes'),\r\n\t\t\t\tsref: 'admin.tag-list',\r\n\t\t\t\tgroup: 'assets'\r\n\t\t\t}\r\n\t\t],\r\n\t\tgroups: [\r\n\t\t\t{\r\n\t\t\t\tid: 'userManagment',\r\n\t\t\t\tname: gettext('User Management')\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: 'accountManagement',\r\n\t\t\t\tname: gettext('Account Management')\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: 'assets',\r\n\t\t\t\tname: gettext('Assets')\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\treturn {\r\n\t\tgetModule: () => module\r\n\t};\r\n}\r\n","/**\r\n * This service manages all of teh navigation\r\n */\r\n\r\nexport default function AlertsNavService(gettext) {\r\n 'ngInject';\r\n\r\n let module = {\r\n id: 'alerts',\r\n name: gettext('Alerts'),\r\n sref: 'alerts',\r\n icon: 'fas fa-exclamation-circle',\r\n priority: 70,\r\n items: [\r\n {\r\n name: gettext('Dashboard'),\r\n sref: 'alerts.dashboard',\r\n group: 'alerts'\r\n },\r\n {\r\n name: gettext('Historical Alerts'),\r\n mobileName: gettext('View Historical Alerts'),\r\n sref: 'alerts.history',\r\n group: 'alerts'\r\n },\r\n {\r\n name: gettext('Alert Configurations'),\r\n mobileName: gettext('Alert Configurations'),\r\n sref: 'alerts.configurations.list',\r\n group: 'configuration'\r\n },\r\n {\r\n name: gettext('Create Alert Configuration'),\r\n sref: 'alerts.configurations.create',\r\n group: 'configuration'\r\n },\r\n {\r\n name: gettext('Fault Configurations'),\r\n mobileName: gettext('Fault Configurations'),\r\n sref: 'alerts.faults.list',\r\n group: 'configuration'\r\n },\r\n {\r\n name: gettext('Create Fault Configuration'),\r\n sref: 'alerts.faults.create',\r\n group: 'configuration'\r\n },\r\n {\r\n name: gettext('GeoZone Configurations'),\r\n mobileName: gettext('GeoZone Configurations'),\r\n sref: 'alerts.geozone.list',\r\n group: 'geozones'\r\n },\r\n {\r\n name: gettext('Create GeoZone Configuration'),\r\n sref: 'alerts.geozone.create',\r\n group: 'geozones'\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: 'alerts',\r\n name: gettext('Alerts')\r\n },\r\n {\r\n id: 'configuration',\r\n name: gettext('Configurations')\r\n },\r\n {\r\n id: 'geozones',\r\n name: gettext('GeoZones')\r\n }\r\n ]\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n}\r\n","export default function DevicesNavService(gettext) {\r\n 'ngInject';\r\n\r\n const module = {\r\n id: 'devices',\r\n name: 'Devices',\r\n navTitle: gettext('Device Management'),\r\n sref: 'devices2',\r\n icon: 'ti-rss-alt',\r\n priority: 80,\r\n\r\n items: [\r\n {\r\n name: gettext('Devices'),\r\n mobileName: gettext('View Devices'),\r\n sref: 'devices2.base',\r\n group: 'devices'\r\n },\r\n {\r\n name: gettext('Single Activation'),\r\n sref: 'devices2.activations.single',\r\n group: 'activations'\r\n },\r\n {\r\n name: gettext('Bulk Activation'),\r\n sref: 'devices2.activations.bulk',\r\n group: 'activations'\r\n },\r\n {\r\n name: gettext('Bulk Activation'),\r\n sref: 'devices2.activations.custom',\r\n group: 'activations'\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: 'devices',\r\n name: gettext('Devices')\r\n },\r\n {\r\n id: 'activations',\r\n name: gettext('Activations')\r\n }\r\n ]\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n}\r\n","\r\nexport default function EquipmentNavService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n var module = {\r\n \"id\": \"equipment\",\r\n \"name\": gettext(\"Assets\"),\r\n \"sref\": \"equipment\",\r\n \"icon\": \"icon-can\",\r\n \"priority\": 90\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n\r\n}\r\n","const DashboardFeatures = [\r\n 'analytics.fault_summary_dashboard',\r\n 'analytics.asset_usage_summary_dashboard',\r\n 'analytics.vehicle_summary_dashboard',\r\n 'analytics.last_seen_explorer'\r\n];\r\n\r\nconst DashboardItemID = 'reportsDashboard';\r\n\r\nexport default function HelpItemsNavService(\r\n helpReportsItemsService,\r\n helpAdminItemsService,\r\n helpAlertsItemsService,\r\n helpAssetsItemsService,\r\n helpDevicesItemsService,\r\n helpMaintenanceItemsService,\r\n helpMapItemsService,\r\n helpUsersItemsService,\r\n $rootScope\r\n) {\r\n 'ngInject';\r\n\r\n var navServices = [];\r\n\r\n for (var i = 0; i < arguments.length; i++) {\r\n var value = arguments[i];\r\n if (typeof value.getModule === 'function') {\r\n navServices.push(value);\r\n }\r\n }\r\n\r\n this.isAccessible = function (moduleid) {\r\n var accessAllowed = false;\r\n var currentUser = $rootScope.currentUser;\r\n if (moduleid === DashboardItemID) {\r\n // Return true if user has at least one feature of dashboard.\r\n const userFeatures = (currentUser.features || []).map(f => f.path);\r\n return DashboardFeatures.filter(v => userFeatures.includes(v)).length > 0;\r\n }\r\n\r\n //Check state access for the account\r\n if (currentUser.features) {\r\n for (var i = 0; i < currentUser.features.length; i++) {\r\n if (moduleid === currentUser.features[i].path) {\r\n accessAllowed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return accessAllowed;\r\n };\r\n\r\n this.getModules = function () {\r\n //Compile all of the modules based on the arguments of the nav services injected in here\r\n var modules = {};\r\n for (var i = 0; i < navServices.length; i++) {\r\n var module = navServices[i].getModule();\r\n if (module.id) {\r\n modules[module.id] = module;\r\n }\r\n }\r\n\r\n return modules;\r\n };\r\n\r\n var _showingNavService = false;\r\n\r\n this.isShowingHelpSideNav = function () {\r\n return _showingNavService;\r\n };\r\n\r\n this.toggleHelpSideNav = function () {\r\n _showingNavService = !_showingNavService;\r\n };\r\n\r\n this.hideHelpSideNav = function () {\r\n _showingNavService = false;\r\n };\r\n\r\n this.showHelpSideNav = function () {\r\n _showingNavService = true;\r\n };\r\n}\r\n","\r\nexport default function HelpNavService(gettextCatalog) {\r\n\r\n 'ngInject';\r\n \r\n var module = {\r\n \"id\": \"help\",\r\n \"name\": gettextCatalog.getString(\"Help\"),\r\n \"sref\": \"help\",\r\n \"priority\": 60\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n\r\n}\r\n","/// \r\n\r\nexport default function HelpAdminItemsService(gettext) {\r\n\r\n\t'ngInject';\r\n\r\n\tthis.getModule = function () {\r\n\t\tvar module = {\r\n\t\t\t\"id\": \"admin\",\r\n\t\t\t\"name\": gettext(\"Admin\"),\r\n\t\t\t\"description\": gettext(\"The Admin section is where user, group and role administration is done.\"),\r\n\t\t\t\"icon\": \"fas fa-question-circle\",\r\n\t\t\t\"priority\": 8,\r\n\t\t\t\"items\": [{\r\n\t\t\t\t\"orderid\": 8.01,\r\n\t\t\t\t\"itemid\": \"adminuserslist\",\r\n\t\t\t\t\"helpitemid\": \"admin.users\",\r\n\t\t\t\t\"name\": gettext(\"View Users\"),\r\n\t\t\t\t\"templateUrl\": \"admin/view.users.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.02,\r\n\t\t\t\t\"itemid\": \"adminuserdetails\",\r\n\t\t\t\t\"helpitemid\": \"admin.users\",\r\n\t\t\t\t\"name\": gettext(\"User Details\"),\r\n\t\t\t\t\"templateUrl\": \"admin/view.users.details.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.03,\r\n\t\t\t\t\"itemid\": \"admininviteuser\",\r\n\t\t\t\t\"helpitemid\": \"admin.invite\",\r\n\t\t\t\t\"name\": gettext(\"Invite User\"),\r\n\t\t\t\t\"templateUrl\": \"admin/invite.users.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.04,\r\n\t\t\t\t\"itemid\": \"adminmanageinvites\",\r\n\t\t\t\t\"helpitemid\": \"admin.invite\",\r\n\t\t\t\t\"name\": gettext(\"Manage Invites\"),\r\n\t\t\t\t\"templateUrl\": \"admin/manage.invites.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.05,\r\n\t\t\t\t\"itemid\": \"admininvitedetails\",\r\n\t\t\t\t\"helpitemid\": \"admin.invite\",\r\n\t\t\t\t\"name\": gettext(\"Invite Details\"),\r\n\t\t\t\t\"templateUrl\": \"admin/invite.details.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.06,\r\n\t\t\t\t\"itemid\": \"adminusersroleslist\",\r\n\t\t\t\t\"helpitemid\": \"admin.roles\",\r\n\t\t\t\t\"name\": gettext(\"View Roles\"),\r\n\t\t\t\t\"templateUrl\": \"admin/view.roles.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.07,\r\n\t\t\t\t\"itemid\": \"adminuserroledetails\",\r\n\t\t\t\t\"helpitemid\": \"admin.roles\",\r\n\t\t\t\t\"name\": gettext(\"User Role Details\"),\r\n\t\t\t\t\"templateUrl\": \"admin/view.roles.details.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.08,\r\n\t\t\t\t\"itemid\": \"admincreateuserrole\",\r\n\t\t\t\t\"helpitemid\": \"admin.roles.manage\",\r\n\t\t\t\t\"name\": gettext(\"Create Role\"),\r\n\t\t\t\t\"templateUrl\": \"admin/create.role.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.09,\r\n\t\t\t\t\"itemid\": \"adminsecuritygroups\",\r\n\t\t\t\t\"helpitemid\": \"admin.securitygroups\",\r\n\t\t\t\t\"name\": gettext(\"View Security Groups\"),\r\n\t\t\t\t\"templateUrl\": \"admin/security.groups.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.10,\r\n\t\t\t\t\"itemid\": \"adminsecuritygroupbase\",\r\n\t\t\t\t\"helpitemid\": \"admin.securitygroups\",\r\n\t\t\t\t\"name\": gettext(\"Security Group Details\"),\r\n\t\t\t\t\"templateUrl\": \"admin/security.groups.details.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.11,\r\n\t\t\t\t\"itemid\": \"admincreatesecuritygroup\",\r\n\t\t\t\t\"helpitemid\": \"admin.securitygroups.manage\",\r\n\t\t\t\t\"name\": gettext(\"Create Security Group\"),\r\n\t\t\t\t\"templateUrl\": \"admin/create.security.group.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.12,\r\n\t\t\t\t\"itemid\": \"assetstemplates\",\r\n\t\t\t\t\"helpitemid\": \"assets.templates\",\r\n\t\t\t\t\"name\": gettext(\"Templates\"),\r\n\t\t\t\t\"templateUrl\": \"assets/assets.templates.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 8.13,\r\n\t\t\t\t\"itemid\": \"attributes\",\r\n\t\t\t\t\"helpitemid\": \"attributes\",\r\n\t\t\t\t\"name\": gettext(\"Attributes\"),\r\n\t\t\t\t\"templateUrl\": \"assets/assets.attrs.html\"\r\n\t\t\t}\r\n\t\t\t]\r\n\t\t};\r\n\r\n\t\treturn module;\r\n\t};\r\n}","export default function HelpAlertsItemsService(gettext) {\r\n\t'ngInject';\r\n\r\n\tthis.getModule = function () {\r\n\t\tvar module = {\r\n\t\t\tid: 'alerts',\r\n\t\t\tname: gettext('Alerts'),\r\n\t\t\tdescription: gettext(\r\n\t\t\t\t\"This is where alert configurations are created and managed. Alerts can be set to notify who you would like when they have triggered, and how they will affect the color of the asset's map pin.\"\r\n\t\t\t),\r\n\t\t\ticon: 'fas fa-question-circle',\r\n\t\t\tpriority: 5,\r\n\t\t\titems: [\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.01,\r\n\t\t\t\t\titemid: 'alertsdashboard',\r\n\t\t\t\t\thelpitemid: 'alerts',\r\n\t\t\t\t\tname: gettext('Alert Dashboard'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.dashboard.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.02,\r\n\t\t\t\t\titemid: 'alertshistory',\r\n\t\t\t\t\thelpitemid: 'alerts',\r\n\t\t\t\t\tname: gettext('View Historical Alerts'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.history.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.03,\r\n\t\t\t\t\titemid: 'alertsconfigurations',\r\n\t\t\t\t\thelpitemid: 'alerts.configurations',\r\n\t\t\t\t\tname: gettext('Alert Configurations'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.configuration.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.04,\r\n\t\t\t\t\titemid: 'alertsconfigurationsedit',\r\n\t\t\t\t\thelpitemid: 'alerts.configurations.edit',\r\n\t\t\t\t\tname: gettext('Alert Configuration Details'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.configuration.details.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.05,\r\n\t\t\t\t\titemid: 'alertsconfigurationscreate',\r\n\t\t\t\t\thelpitemid: 'alerts.configurations.edit',\r\n\t\t\t\t\tname: gettext('Create Alert Configuration'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.configuration.create.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.06,\r\n\t\t\t\t\titemid: 'alertsconfigurationsexamples',\r\n\t\t\t\t\thelpitemid: 'alerts.configurations.edit',\r\n\t\t\t\t\tname: gettext('Alert Configuration Examples'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/alerts.configuration.examples.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.07,\r\n\t\t\t\t\titemid: 'alertsfaults',\r\n\t\t\t\t\thelpitemid: 'alerts.faults',\r\n\t\t\t\t\tname: gettext('Fault Configurations'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/faults/faults.configuration.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.08,\r\n\t\t\t\t\titemid: 'alertsfaultsedit',\r\n\t\t\t\t\thelpitemid: 'alerts.faults.edit',\r\n\t\t\t\t\tname: gettext('Fault Configuration Details'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/faults/faults.configuration.details.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.09,\r\n\t\t\t\t\titemid: 'alertsfaultscreate',\r\n\t\t\t\t\thelpitemid: 'alerts.faults.edit',\r\n\t\t\t\t\tname: gettext('Create Fault Configuration'),\r\n\t\t\t\t\ttemplateUrl: 'alerts/faults/faults.configuration.create.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.1,\r\n\t\t\t\t\titemid: 'alertsgeozonelist',\r\n\t\t\t\t\thelpitemid: 'geozones',\r\n\t\t\t\t\tname: gettext('View GeoZones'),\r\n\t\t\t\t\ttemplateUrl: 'geozones/geozone.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.11,\r\n\t\t\t\t\titemid: 'alertsgeozonedetails',\r\n\t\t\t\t\thelpitemid: 'geozones',\r\n\t\t\t\t\tname: gettext('GeoZone Details'),\r\n\t\t\t\t\ttemplateUrl: 'geozones/geozone.details.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 5.12,\r\n\t\t\t\t\titemid: 'alertsgeozonecreate',\r\n\t\t\t\t\thelpitemid: 'geozones.manage',\r\n\t\t\t\t\tname: gettext('Create New GeoZone'),\r\n\t\t\t\t\ttemplateUrl: 'geozones/geozone.create.html'\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t}; //use the state as ID e.g., alerts.dashboard = \"\"alertsdashboard\"\"\r\n\r\n\t\treturn module;\r\n\t};\r\n}\r\n","export default function HelpAssetsItemsService(gettext) {\r\n\r\n\t'ngInject';\r\n\r\n\tthis.getModule = function () {\r\n\r\n\t\tvar module = {\r\n\t\t\t\"id\": \"assets\", //change to equipment from asset because we are using the state as the id for redirecting to selected pages' help \r\n\t\t\t\"name\": gettext(\"Assets\"),\r\n\t\t\t\"description\": gettext(\"The Assets area is used to view asset details and data.\"),\r\n\t\t\t\"icon\": \"fas fa-question-circle\",\r\n\t\t\t\"priority\": 2,\r\n\t\t\t\"items\": [{\r\n\t\t\t\t\"orderid\": 2.1,\r\n\t\t\t\t\"itemid\": \"assetslist\",\r\n\t\t\t\t\"helpitemid\": \"assets\",\r\n\t\t\t\t\"name\": gettext(\"View Assets\"),\r\n\t\t\t\t\"templateUrl\": \"assets/assets.html\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"orderid\": 2.2,\r\n\t\t\t\t\"itemid\": \"assetsdetail\",\r\n\t\t\t\t\"helpitemid\": \"assets\",\r\n\t\t\t\t\"name\": gettext(\"Asset Details\"),\r\n\t\t\t\t\"templateUrl\": \"assets/assets.details.html\"\r\n\t\t\t}\r\n\t\t\t]\r\n\t\t};\r\n\r\n\t\treturn module;\r\n\t};\r\n}","\r\nexport default function HelpDevicesItemsService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n this.getModule = function () {\r\n\r\n var module = {\r\n \"id\": \"devices\",\r\n \"name\": gettext(\"Devices\"),\r\n \"description\": gettext(\"This area is used to manage and activate telematics devices.\"),\r\n \"icon\": \"fas fa-question-circle\",\r\n \"priority\": 3,\r\n \"items\": [{\r\n \"orderid\": 3.1,\r\n \"itemid\": \"devicesbase\",\r\n \"helpitemid\": \"devices\",\r\n \"name\": gettext(\"View Devices\"),\r\n \"templateUrl\": \"devices/devices.html\"\r\n },\r\n {\r\n \"orderid\": 3.2,\r\n \"itemid\": \"devicesdetail\",\r\n \"helpitemid\": \"devices\",\r\n \"name\": gettext(\"Device Details\"),\r\n \"templateUrl\": \"devices/devices.details.html\"\r\n },\r\n {\r\n \"orderid\": 3.3,\r\n \"itemid\": \"devicesactivations\",\r\n \"helpitemid\": \"devices.activate\",\r\n \"name\": gettext(\"Activations\"),\r\n \"templateUrl\": \"devices/devices.activation.single.html\"\r\n },\r\n ]\r\n };\r\n\r\n return module;\r\n };\r\n}\r\n","/// \r\n\r\nexport default function HelpMaintenanceItemsService(gettext) {\r\n\t'ngInject';\r\n\r\n\tthis.getModule = function () {\r\n\t\tvar module = {\r\n\t\t\tid: 'maintenance',\r\n\t\t\tname: gettext('Maintenance'),\r\n\t\t\tdescription: gettext(\r\n\t\t\t\t'This is where maintenance plans are created and managed. Maintenance Plans are used to keep track of when maintenance must be performed on assets, and which tasks need to be completed as part of the maintenance plans.'\r\n\t\t\t),\r\n\t\t\ticon: 'fas fa-question-circle',\r\n\t\t\tpriority: 4,\r\n\t\t\titems: [\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.1,\r\n\t\t\t\t\titemid: 'maintenanceboard',\r\n\t\t\t\t\thelpitemid: 'maintenance',\r\n\t\t\t\t\tname: gettext('Dashboard'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.dashboard.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.2,\r\n\t\t\t\t\titemid: 'maintenancecomplete',\r\n\t\t\t\t\thelpitemid: 'maintenance.complete',\r\n\t\t\t\t\tname: gettext('Complete Maintenance'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.complete.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.3,\r\n\t\t\t\t\titemid: 'maintenancehistory',\r\n\t\t\t\t\thelpitemid: 'maintenance',\r\n\t\t\t\t\tname: gettext('Maintenance History'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.history.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.4,\r\n\t\t\t\t\titemid: 'maintenancehistorydetails',\r\n\t\t\t\t\thelpitemid: 'maintenance',\r\n\t\t\t\t\tname: gettext('Maintenance History Details'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.details.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.5,\r\n\t\t\t\t\titemid: 'maintenanceplans',\r\n\t\t\t\t\thelpitemid: 'maintenance.plans',\r\n\t\t\t\t\tname: gettext('View Existing Plans'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.plans.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.6,\r\n\t\t\t\t\titemid: 'maintenanceplansdetail',\r\n\t\t\t\t\thelpitemid: 'maintenance.plans',\r\n\t\t\t\t\tname: gettext('Maintenance Plan Details'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.plans.details.html'\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\torderid: 4.7,\r\n\t\t\t\t\titemid: 'maintenancecreateplan',\r\n\t\t\t\t\thelpitemid: 'maintenance.plans.manage',\r\n\t\t\t\t\tname: gettext('Create Maintenance Plan'),\r\n\t\t\t\t\ttemplateUrl: 'maintenance/maintenance.plans.create.html'\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t};\r\n\r\n\t\treturn module;\r\n\t};\r\n}\r\n","\r\nexport default function HelpMapItemsService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n this.getModule = function () {\r\n\r\n var module = {\r\n \"id\": \"map\",\r\n \"name\": gettext(\"Map\"),\r\n \"description\": gettext(\"The Map shows the location of all assets that have communicated a GPS location. Searching and filtering options are available to find the exact assets you are looking for.\"),\r\n \"icon\": \"fas fa-question-circle\",\r\n \"priority\": 1,\r\n \"items\": [{\r\n \"orderid\": 1.1,\r\n \"itemid\": \"mapcontrols\",\r\n \"helpitemid\": \"map\",\r\n \"name\": gettext(\"Map Controls\"),\r\n \"templateUrl\": \"map/map.controls.html\"\r\n },\r\n {\r\n \"orderid\": 1.2,\r\n \"itemid\": \"mapsearchpanel\",\r\n \"helpitemid\": \"map\",\r\n \"name\": gettext(\"Search Panel & Results\"),\r\n \"templateUrl\": \"map/map.search.html\"\r\n },\r\n {\r\n \"orderid\": 1.3,\r\n \"itemid\": \"mappins\",\r\n \"helpitemid\": \"map\",\r\n \"name\": gettext(\"Map Pins\"),\r\n \"templateUrl\": \"map/map.pins.html\"\r\n },\r\n {\r\n \"orderid\": 1.4,\r\n \"itemid\": \"mapassetinformation\",\r\n \"helpitemid\": \"map\",\r\n \"name\": gettext(\"Asset Information\"),\r\n \"templateUrl\": \"map/map.asset.information.html\"\r\n },\r\n ]\r\n };\r\n\r\n return module;\r\n };\r\n}\r\n","export default function HelpReportsItemsService(gettext) {\r\n 'ngInject';\r\n\r\n this.getModule = function () {\r\n let module = {\r\n id: 'analytics',\r\n name: gettext('Analytics'),\r\n description: gettext('The Analytics area is where reports can be generated and scheduled for delivery.'),\r\n icon: 'fas fa-question-circle',\r\n priority: 6,\r\n items: [\r\n {\r\n orderid: 6.1,\r\n itemid: 'reportsbase',\r\n helpitemid: 'analytics',\r\n name: gettext('Analytics'),\r\n templateUrl: 'reports/reports.html'\r\n },\r\n {\r\n orderid: 6.2,\r\n itemid: 'reportsDashboard',\r\n helpitemid: 'reportsDashboard',\r\n name: gettext('Dashboards'),\r\n templateUrl: 'reports/dashboard.html'\r\n },\r\n {\r\n orderid: 6.3,\r\n itemid: 'analyticsschedules',\r\n helpitemid: 'analytics.schedules',\r\n name: gettext('Analytics Schedules'),\r\n templateUrl: 'reports/reports.schedule.html'\r\n }\r\n ]\r\n };\r\n\r\n return module;\r\n };\r\n}\r\n","\r\nexport default function HelpUsersItemsService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n this.getModule = function () {\r\n var module = {\r\n \"id\": \"profile\",\r\n \"name\": gettext(\"Profile\"),\r\n \"description\": gettext(\"This is the information of the logged in user. It’s accessed by clicking the name of the logged in user on the top right of the page.\"),\r\n \"icon\": \"fas fa-question-circle\",\r\n \"priority\": 9,\r\n \"items\": [{\r\n \"orderid\": 9.1,\r\n \"itemid\": \"usersprofilepersonal\",\r\n \"helpitemid\": \"profile\",\r\n \"name\": gettext(\"Personal Information\"),\r\n \"templateUrl\": \"users/users.profile.html\"\r\n },\r\n {\r\n \"orderid\": 9.2,\r\n \"itemid\": \"usersprofilechangepassword\",\r\n \"helpitemid\": \"profile\",\r\n \"name\": gettext(\"Password\"),\r\n \"templateUrl\": \"users/users.profile.changepassword.html\"\r\n },\r\n {\r\n \"orderid\": 9.3,\r\n \"itemid\": \"usersprofilechangeemail\",\r\n \"helpitemid\": \"profile\",\r\n \"name\": gettext(\"Change Email Address\"),\r\n \"templateUrl\": \"users/users.profile.changeemail.html\"\r\n },\r\n {\r\n \"orderid\": 9.4,\r\n \"itemid\": \"userssubscriptions\",\r\n \"helpitemid\": \"profile\",\r\n \"name\": gettext(\"System Notifications\"),\r\n \"templateUrl\": \"users/users.notifications.html\"\r\n }\r\n ]\r\n };\r\n return module;\r\n };\r\n}\r\n","export default function MaintenanceNavService(gettext) {\r\n 'ngInject';\r\n\r\n let module = {\r\n id: 'maintenance',\r\n name: gettext('Maintenance'),\r\n sref: 'maintenance',\r\n icon: 'fas fa-wrench',\r\n priority: 60,\r\n items: [\r\n {\r\n name: gettext('Maintenance'),\r\n sref: 'maintenance.board',\r\n group: 'dashboard'\r\n },\r\n {\r\n name: gettext('Maintenance History'),\r\n sref: 'maintenance.history',\r\n group: 'dashboard'\r\n },\r\n {\r\n name: gettext('Plans'),\r\n mobileName: gettext('View Plans'),\r\n sref: 'maintenance.plans',\r\n group: 'plans'\r\n },\r\n {\r\n name: gettext('Create New Plan'),\r\n sref: 'maintenance.createplan',\r\n group: 'plans'\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: 'dashboard',\r\n name: gettext('Dashboard')\r\n },\r\n {\r\n id: 'plans',\r\n name: gettext('Plan Management')\r\n }\r\n ]\r\n };\r\n\r\n this.getModule = () => module;\r\n}\r\n","\r\nexport default function MapNavService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n const module = {\r\n \"id\": \"map\",\r\n \"name\": gettext(\"Map\"),\r\n \"sref\": \"map\",\r\n \"icon\": \"fas fa-map-marker-alt\",\r\n \"priority\": 100\r\n };\r\n\r\n return {\r\n getModule: () => module\r\n };\r\n}\r\n","export default class ReportsNavService {\r\n constructor(gettext) {\r\n 'ngInject';\r\n\r\n let module = {\r\n id: 'reports',\r\n name: gettext('Analytics'),\r\n sref: 'reports',\r\n icon: 'far fa-chart-line',\r\n priority: 50,\r\n items: [\r\n {\r\n name: gettext('Business Insights'),\r\n sref: 'reports.list',\r\n group: 'analytics'\r\n },\r\n {\r\n name: gettext('Scheduled Reports'),\r\n sref: 'reports.jobschedules',\r\n group: 'analytics'\r\n },\r\n {\r\n name: gettext('Dashboards'),\r\n sref: 'reports.dashboards',\r\n group: 'analytics'\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: 'analytics',\r\n name: gettext('Analytics')\r\n }\r\n ]\r\n };\r\n\r\n this.getModule = () => module;\r\n }\r\n}\r\n","\r\nexport default function TSeriesNavService(gettext) {\r\n\r\n 'ngInject';\r\n \r\n var module = {\r\n \"id\": \"tseries\",\r\n \"name\": gettext(\"T-Series\"),\r\n \"sref\": \"tseries\",\r\n \"icon\": \"ti-signal\",\r\n \"priority\": 30,\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n\r\n}\r\n","\r\nexport default function UserProfileNavService(gettext) {\r\n\r\n 'ngInject';\r\n\r\n var module = {\r\n \"id\": \"profile\",\r\n \"name\": gettext(\"Profile\"),\r\n \"sref\": \"users\",\r\n \"hide\": true,\r\n \"priority\": 9,\r\n \"items\": [\r\n {\r\n \"name\": gettext(\"Edit Profile\"),\r\n \"sref\": \"users.profile\",\r\n \"group\": \"Profile\"\r\n },\r\n {\r\n \"name\": gettext(\"Subscriptions\"),\r\n \"sref\": \"users.subscriptions\",\r\n \"group\": \"Profile\"\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: \"Profile\",\r\n name: gettext(\"Profile\")\r\n }\r\n ]\r\n };\r\n\r\n this.getModule = function () {\r\n return module;\r\n };\r\n\r\n}\r\n","export default function accessManagmentNavService(gettext) {\r\n 'ngInject';\r\n\r\n this._module = {\r\n id: 'access-management',\r\n name: gettext('Access Management'),\r\n sref: 'access-management',\r\n icon: 'fas fa-users-cog',\r\n priority: 9,\r\n items: [\r\n {\r\n name: gettext('Group List'),\r\n sref: 'access-management.group-list',\r\n group: 'groups'\r\n },\r\n {\r\n name: gettext('Asset List'),\r\n sref: 'access-management.assets-list',\r\n group: 'assets'\r\n },\r\n {\r\n name: gettext('Assignments'),\r\n sref: 'access-management.assignments',\r\n group: 'assets'\r\n },\r\n {\r\n name: gettext('Operator List'),\r\n sref: 'access-management.operators-list',\r\n group: 'operators'\r\n },\r\n {\r\n name: gettext('Bulk Upload Operators'),\r\n sref: 'access-management.operators-bulk-upload',\r\n group: 'operators'\r\n }\r\n ],\r\n groups: [\r\n {\r\n id: 'groups',\r\n name: gettext('Groups')\r\n },\r\n {\r\n id: 'assets',\r\n name: gettext('Assets')\r\n },\r\n {\r\n id: 'operators',\r\n name: gettext('Operators')\r\n }\r\n ]\r\n };\r\n\r\n return {\r\n getModule: () => this._module\r\n };\r\n}\r\n","export default class sitesNavService {\r\n constructor(gettext) {\r\n 'ngInject';\r\n\r\n this._module = {\r\n id: 'sites',\r\n name: gettext('Sites'),\r\n sref: 'sites',\r\n priority: 10,\r\n items: [],\r\n groups: [],\r\n };\r\n }\r\n\r\n getModule() {\r\n return this._module;\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport 'angular-gettext';\r\n\r\n/* Modules */\r\nimport ApiModule from './../../../api/api.module';\r\n\r\n/* Component */\r\nimport AccountsSwitchingComponent from './accounts-switching/accounts-switching.component';\r\n\r\n/* Directives */\r\nimport CustomPageDirective from '../../../main/page.directive';\r\nimport MobileNavDirective from './mobile/mobile.component';\r\nimport MobileNavToggleDirective from './mobile/toggle-mobile.directive';\r\nimport NavLeftDirective from './left/left.component';\r\nimport {\r\n toggleNavCollapsedMin,\r\n collapseNav,\r\n highlightActive,\r\n toggleOffCanvas,\r\n toggleMenuOffCanvas,\r\n toggleFiltersOffCanvas,\r\n removeOffCanvas,\r\n toggleUserMenu,\r\n hideUserMenu,\r\n toggleCollapseableUserMenu,\r\n} from './main/main.directive';\r\n\r\n/* Services */\r\nimport AdminNavService from '../../../pages/admin/admin.nav.service';\r\nimport AlertsNavService from '../../alerts/alerts.nav.service';\r\nimport DevicesNavService from '../../devices/devices.nav.service';\r\nimport EquipmentNavService from '../../../equipment/equipment.nav.service';\r\nimport HelpItemsNavService from '../../help/help.items';\r\nimport HelpNavService from '../../help/help.nav';\r\nimport HelpAdminItemsService from '../../help/services/admin.items';\r\nimport HelpAlertsItemsService from '../../help/services/alerts.items';\r\nimport HelpAssetsItemsService from '../../help/services/assets.items';\r\nimport HelpDevicesItemsService from '../../help/services/devices.items';\r\nimport HelpMaintenanceItemsService from '../../help/services/maintenance.items';\r\nimport HelpMapItemsService from '../../help/services/map.items';\r\nimport HelpReportsItemsService from '../../help/services/reports.items';\r\nimport HelpUsersItemsService from '../../help/services/users.items';\r\nimport MaintenanceNavService from '../../maintenance/nav.service';\r\nimport MapNavService from '../../map/map.nav.service';\r\nimport ReportsNavService from '../../reports/reports.nav.service';\r\nimport TSeriesNavService from '../../t-series/t-series.nav.service';\r\nimport UserProfileNavService from '../../user-profile/profile.nav.service';\r\nimport AccessManagemantNavService from './../../access-management/access-managment.nav.service';\r\nimport SiteNaveService from '../../Sites/sites.nav.service';\r\n\r\nconst navModule = angular\r\n .module('app.nav', ['gettext', ApiModule])\r\n .component('accountsSwitching', AccountsSwitchingComponent)\r\n /* Default Directives */\r\n .directive('customPage', CustomPageDirective)\r\n .directive('navLeft', NavLeftDirective)\r\n .directive('sideNav', MobileNavDirective)\r\n .directive('toggleSideNav', MobileNavToggleDirective)\r\n /* Named Directives */\r\n .directive('toggleNavCollapsedMin', toggleNavCollapsedMin)\r\n .directive('collapseNav', collapseNav)\r\n .directive('highlightActive', highlightActive)\r\n .directive('toggleOffCanvas', toggleOffCanvas)\r\n .directive('toggleMenuOffCanvas', toggleMenuOffCanvas)\r\n .directive('toggleFiltersOffCanvas', toggleFiltersOffCanvas)\r\n .directive('removeOffCanvas', removeOffCanvas)\r\n .directive('toggleUserMenu', toggleUserMenu)\r\n .directive('hideUserMenu', hideUserMenu)\r\n .directive('toggleCollapseableUserMenu', toggleCollapseableUserMenu)\r\n /* Services */\r\n .service('adminNavService', AdminNavService)\r\n .service('alertsNavService', AlertsNavService)\r\n .service('devicesNavService', DevicesNavService)\r\n .service('equipmentNavService', EquipmentNavService)\r\n .service('helpItemsService', HelpItemsNavService)\r\n .factory('helpNavService', HelpNavService)\r\n .service('helpAdminItemsService', HelpAdminItemsService)\r\n .service('helpAlertsItemsService', HelpAlertsItemsService)\r\n .service('helpAssetsItemsService', HelpAssetsItemsService)\r\n .service('helpDevicesItemsService', HelpDevicesItemsService)\r\n .service('helpMaintenanceItemsService', HelpMaintenanceItemsService)\r\n .service('helpMapItemsService', HelpMapItemsService)\r\n .service('helpReportsItemsService', HelpReportsItemsService)\r\n .service('helpUsersItemsService', HelpUsersItemsService)\r\n .service('maintenanceNavService', MaintenanceNavService)\r\n .service('mapNavService', MapNavService)\r\n .service('reportsNavService', ReportsNavService)\r\n .service('tSeriesNavService', TSeriesNavService)\r\n .service('userProfileNavService', UserProfileNavService)\r\n .service('accessManagemantNavService', AccessManagemantNavService)\r\n .service('siteNaveService', SiteNaveService);\r\n\r\nexport default navModule.name;\r\n","\r\n// add class for specific pages to achieve fullscreen, custom background etc.\r\nexport default function CustomPageDirective() {\r\n \r\n return {\r\n restrict: 'A',\r\n controller: CustomPageController\r\n };\r\n\r\n function CustomPageController($scope, $element, $location) {\r\n\r\n 'ngInject';\r\n \r\n const path = function() {\r\n return $location.path();\r\n };\r\n\r\n const addBg = function(path) {\r\n $element.removeClass('body-wide body-err body-lock body-auth');\r\n switch (path) {\r\n case '/404':\r\n case '/pages/404':\r\n case '/500':\r\n return $element.addClass('body-wide body-err');\r\n case '/pages/signin':\r\n case '/emailVerification':\r\n case '/pages/signup':\r\n case '/pages/forgot-password':\r\n return $element.addClass('body-wide body-auth');\r\n case '/pages/lock-screen':\r\n return $element.addClass('body-wide body-lock');\r\n }\r\n };\r\n\r\n addBg(path());\r\n\r\n $scope.$watch(path, function(newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n return addBg(path());\r\n });\r\n }\r\n}\r\n","\r\nexport default function ToggleSideNavDirective() {\r\n return {\r\n template: require('./toggle-mobile.directive.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n controller: function ($scope, navService) {\r\n\r\n 'ngInject';\r\n \r\n $scope.class = function () {\r\n return navService.isShowingSideNav() ? \"is-active\" : \"\";\r\n };\r\n\r\n $scope.click = function () {\r\n navService.toggleSideNav();\r\n };\r\n },\r\n };\r\n}\r\n","export default function TableRemoveButtonDirective() {\r\n return {\r\n template: require('./table-remove-button.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {\r\n values: '=',\r\n index: '@'\r\n },\r\n controller: TableRemoveButtonController,\r\n controllerAs: 'vm',\r\n bindToController: true\r\n };\r\n}\r\n\r\nfunction TableRemoveButtonController(arrayUtil) {\r\n 'ngInject';\r\n var vm = this;\r\n vm.remove = remove;\r\n\r\n function init() {\r\n vm.index = parseInt(vm.index);\r\n }\r\n\r\n function remove() {\r\n vm.values = arrayUtil.remove(vm.values, vm.index);\r\n }\r\n\r\n init();\r\n}","\r\nconst ToggleButtonComponent = {\r\n template: require('./toggle-button.html'),\r\n restrict: 'E',\r\n controllerAs: 'vm',\r\n bindings: {\r\n onOff: '<'\r\n }\r\n};\r\n\r\nexport default ToggleButtonComponent;\r\n","import AddAssetsButtonDirective from './assets/add/add-assets-button';\r\nimport AddUsersButtonDirective from './add-users/add-users-button';\r\nimport CancelButtonDirective from './cancel/cancel-button';\r\nimport CreateButtonDirective from './create/create-button';\r\nimport DeleteButtonDirective from './delete/delete-button';\r\nimport EditButtonDirective from './edit/edit-button';\r\nimport ExportCsvButtonDirective from './export-csv/export-csv-button';\r\nimport RemoveSelectedButtonDirective from './remove-selected/remove-selected-button';\r\nimport SaveButtonDirective from './save/save-button';\r\nimport SelectAssetsButtonDirective from './assets/select/select-assets-button';\r\nimport TableOrderButtonsDirective from './table/order/table-order-buttons';\r\nimport TableRemoveButtonDirective from './table/remove/table-remove-button';\r\nimport ToggleButtonComponent from './toggle-button/toggle-button';\r\n\r\nconst componentsButtonModule = angular.module('app.components.buttons', []);\r\ncomponentsButtonModule\r\n\t// Directives\r\n\t.directive('addAssetsButton', AddAssetsButtonDirective)\r\n\t.directive('addUsersButton', AddUsersButtonDirective)\r\n\t.directive('cancelButton', CancelButtonDirective)\r\n\t.directive('createButton', CreateButtonDirective)\r\n\t.directive('deleteButton', DeleteButtonDirective)\r\n\t.directive('editButton', EditButtonDirective)\r\n\t.directive('exportCsvButton', ExportCsvButtonDirective)\r\n\t.directive('removeSelectedButton', RemoveSelectedButtonDirective)\r\n\t.directive('saveButton', SaveButtonDirective)\r\n\t.directive('selectAssetsButton', SelectAssetsButtonDirective)\r\n\t.directive('tableOrderButtons', TableOrderButtonsDirective)\r\n\t.directive('tableRemoveButton', TableRemoveButtonDirective)\r\n\r\n\t// Components\r\n\t.component('toggleButton', ToggleButtonComponent);\r\n\r\nexport default componentsButtonModule.name;\r\n","\r\nexport default function AddAssetsButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./add-assets-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n disabled: '='\r\n }\r\n };\r\n}\r\n","\r\nexport default function AddUsersButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./add-users-button.html'),\r\n restrict: 'E',\r\n scope: {\r\n disabled: '=',\r\n }\r\n };\r\n}\r\n","\r\nexport default function CancelButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./cancel-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n disabled: '='\r\n }\r\n };\r\n}\r\n","\r\nexport default function CreateButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./create-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n disabled: '='\r\n }\r\n };\r\n}\r\n","\r\nexport default function DeleteButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./delete-button.html'),\r\n transclude: true,\r\n restrict: 'E'\r\n };\r\n}\r\n","\r\nexport default function EditButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./edit-button.html'),\r\n restrict: 'E',\r\n scope: {\r\n editing: '=',\r\n editMode: '=',\r\n },\r\n controller: ['$scope', function ($scope) {\r\n\r\n if ($scope.editMode) {\r\n $scope.toggle = function () {\r\n $scope.editing = !$scope.editing;\r\n };\r\n }\r\n }]\r\n };\r\n}\r\n","\r\nexport default function ExportCsvButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./export-csv-button.html'),\r\n transclude: true,\r\n restrict: 'E'\r\n };\r\n}\r\n","\r\nexport default function RemoveSelectedButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./remove-selected-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n disabled: '='\r\n }\r\n };\r\n}\r\n","\r\nexport default function SaveButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./save-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n edit: '=',\r\n disabled: '=',\r\n click: '&'\r\n }\r\n };\r\n}\r\n","\r\nexport default function SelectAssetsButtonDirective() {\r\n 'ngInject';\r\n return {\r\n template: require('./select-assets-button.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n disabled: '='\r\n }\r\n };\r\n}\r\n","export default function TableOrderButtonsDirective() {\r\n\treturn {\r\n\t\ttemplate: require('./table-order-buttons.html'),\r\n\t\ttransclude: true,\r\n\t\trestrict: 'AE',\r\n\t\tscope: {\r\n\t\t\tvalues: '=',\r\n\t\t\tindex: '@'\r\n\t\t},\r\n\t\tcontroller: function($scope, $element, $attrs, arrayUtil) {\r\n\t\t\t'ngInject';\r\n\t\t\tthis.moveTop = function() {\r\n\t\t\t\tarrayUtil.toTop(this.values, this.index);\r\n\t\t\t};\r\n\r\n\t\t\tthis.moveBottom = function() {\r\n\t\t\t\tarrayUtil.toBottom(this.values, this.index);\r\n\t\t\t};\r\n\r\n\t\t\tthis.moveUp = function() {\r\n\t\t\t\tarrayUtil.swapItems(this.values, this.index, this.index - 1);\r\n\t\t\t};\r\n\r\n\t\t\tthis.moveDown = function() {\r\n\t\t\t\tarrayUtil.swapItems(this.values, this.getIndex(), this.getIndex() + 1);\r\n\t\t\t};\r\n\r\n\t\t\tthis.getIndex = function() {\r\n\t\t\t\treturn parseInt(this.index);\r\n\t\t\t};\r\n\r\n\t\t\tthis.disableDown = function() {\r\n\t\t\t\treturn this.getIndex() === this.values.length - 1;\r\n\t\t\t};\r\n\r\n\t\t\tthis.disableUp = function() {\r\n\t\t\t\treturn this.getIndex() === 0;\r\n\t\t\t};\r\n\t\t},\r\n\t\tcontrollerAs: 'vm',\r\n\t\tbindToController: true\r\n\t};\r\n}\r\n","import angular from 'angular';\r\nimport ngRedux from 'ng-redux';\r\n\r\n// Import the app to get access to the store\r\nimport App from '../app';\r\n\r\nconst config = $ngReduxProvider => {\r\n 'ngInject';\r\n // Provide the pre-configured store to ngRedux\r\n $ngReduxProvider.provideStore(App.store);\r\n};\r\n\r\nconst stateModule = angular\r\n .module('app.state', [ngRedux])\r\n .config(config)\r\n .run();\r\n\r\nexport default stateModule.name;\r\n","import Action from '../action';\r\n\r\n// Asset population from repository (search results)\r\nexport const ASSETS_FAILED_TO_POPULATE = 'ASSETS_FAILED_TO_POPULATE';\r\n\r\n// Asset manipulation\r\nexport const ASSETS_SELECTED = 'ASSETS_SELECTED';\r\nexport const ASSET_VIEWED = 'ASSET_VIEWED';\r\n\r\n// Pagination\r\nexport const PAGESIZE_UPDATED = 'PAGESIZE_UPDATED';\r\nexport const PAGE_SELECTED = 'PAGE_SELECTED';\r\n\r\nexport const updatePageSize = value => Action(PAGESIZE_UPDATED, value);\r\nexport const failToPopulate = message => Action(ASSETS_FAILED_TO_POPULATE, message);\r\nexport const select = assets => Action(ASSETS_SELECTED, assets);\r\nexport const viewed = asset => Action(ASSET_VIEWED, asset);\r\nexport const selectPage = page => Action(PAGE_SELECTED, page);\r\nexport const resetLastViewedAsset = () => Action(ASSET_VIEWED, {id: ''});\r\n","import Action from '../action';\r\n\r\nexport const SEARCH_SUCCESS = 'SEARCH_SUCCESS';\r\nexport const SEARCH_FAILURE = 'SEARCH_FAILURE';\r\nexport const SEARCH_INITIATED = 'SEARCH_INITIATED';\r\nexport const SEARCH_REQUESTED = 'SEARCH_REQUESTED';\r\nexport const SEARCH_UPDATED = 'SEARCH_UPDATED';\r\nexport const UPDATE_SEARCH_PREREQUISITES = '@search/UPDATE_SEARCH_PREREQUISITES';\r\nexport const SEARCH_REFRESH = '@search/SEARCH_REFRESH';\r\nexport const SEARCH_RESET = 'SEARCH_RESET';\r\nexport const SEARCH_BEGIN = 'SEARCH_BEGIN';\r\nexport const SEARCH_EXPORT = 'SEARCH_EXPORT';\r\nexport const SEARCH_EXPORT_FAILURE = 'SEARCH_EXPORT_FAILURE';\r\nexport const SEARCH_EXPORT_SUCCESS = 'SEARCH_EXPORT_SUCCESS';\r\n\r\nexport const FACET_SELECTED = 'FACET_SELECTED';\r\nexport const FACET_SELECTED_EXCLUSIVE = 'FACET_SELECTED_EXCLUSIVE';\r\nexport const FACET_DESELECTED = 'FACET_DESELECTED';\r\nexport const FACET_DESELECTED_EXCLUSIVE = 'FACET_DESELECTED_EXCLUSIVE';\r\nexport const SET_SELECTED_FACETS = 'SET_SELECTED_FACETS';\r\n\r\nexport const SET_SELECTED_TAG_FILTERS = 'SET_SELECTED_TAG_FILTERS';\r\nexport const TAG_FILTERS_UPDATED = 'TAG_FILTERS_UPDATED';\r\n\r\nexport const TAG_FILTER_ADDED = 'TAG_FILTER_ADDED';\r\nexport const TAG_FILTER_REMOVED = 'TAG_FILTER_REMOVED';\r\n\r\nexport const QUERY_ADDED = 'QUERY_ADDED';\r\nexport const QUERY_REMOVED = 'QUERY_REMOVED';\r\n\r\nexport const ACCOUNT_ADDED = 'ACCOUNT_ADDED';\r\nexport const ACCOUNT_REMOVED = 'ACCOUNT_REMOVED';\r\n\r\nexport const SORT_UPDATED = 'SORT_UPDATED';\r\nexport const LAST_SEEN_UPDATED = 'LAST_SEEN_UPDATED';\r\n\r\nexport const ALERTS_FACET_TYPE = 'alerts';\r\nexport const SECURITY_GROUPS_FACET_TYPE = 'securityGroups';\r\nexport const MAINTENANCE_STATUS_FACET_TYPE = 'maintenance';\r\nexport const COMMUNICATED_AT_FACET_TYPE = 'lastCommunicated';\r\nexport const LAST_SEEN_FACET_TYPE = 'lastSeen';\r\n\r\nexport const initiated = search => Action(SEARCH_INITIATED, search);\r\nexport const updated = () => Action(SEARCH_UPDATED);\r\nexport const refresh = () => Action(SEARCH_REFRESH);\r\nexport const requested = () => Action(SEARCH_REQUESTED);\r\nexport const updatePrerequisites = prerequisites => Action(UPDATE_SEARCH_PREREQUISITES, prerequisites);\r\n\r\nexport const searchSuccess = payload => Action(SEARCH_SUCCESS, payload);\r\nexport const searchFailure = error => Action(SEARCH_FAILURE, error, true);\r\nexport const searchExport = () => Action(SEARCH_EXPORT);\r\nexport const searchExportFailure = () => Action(SEARCH_EXPORT_FAILURE);\r\nexport const searchExportSuccess = () => Action(SEARCH_EXPORT_SUCCESS);\r\nexport const resetSearch = () => Action(SEARCH_RESET);\r\nexport const updateSort = name => Action(SORT_UPDATED, name);\r\nexport const addQuery = term => Action(QUERY_ADDED, term);\r\nexport const updateLastSeen = lastSeen => Action(LAST_SEEN_UPDATED, lastSeen);\r\n\r\nexport const removeQuery = term => Action(QUERY_REMOVED, term);\r\nexport const selectFacet = (facetType, value) =>\r\n Action(FACET_SELECTED, {\r\n facetType,\r\n value\r\n });\r\n\r\nexport const deselectFacet = (facetType, value) =>\r\n Action(FACET_DESELECTED, {\r\n facetType,\r\n value\r\n });\r\n\r\nexport const updateTagFilters = filters => Action(TAG_FILTERS_UPDATED, filters);\r\nexport const addTAGFilter = tagFilter => Action(TAG_FILTER_ADDED, tagFilter);\r\nexport const removeTAGFilter = tagFilter => Action(TAG_FILTER_REMOVED, tagFilter);\r\nexport const exclusiveDeselectFacet = (facetType, value = {id: null}) =>\r\n Action(FACET_DESELECTED_EXCLUSIVE, {\r\n facetType,\r\n value\r\n });\r\n\r\nexport const exclusiveSelectFacet = (facetType, value) =>\r\n Action(FACET_SELECTED_EXCLUSIVE, {\r\n facetType,\r\n value\r\n });\r\n\r\nexport const addAccount = account => Action(ACCOUNT_ADDED, account);\r\nexport const removeAccount = account => Action(ACCOUNT_REMOVED, account);\r\n","import Action from '../action';\r\n\r\nexport const COLUMN_VISIBLE_TOGGLED = 'COLUMN_VISIBLE_TOGGLED';\r\nexport const COLUMN_ORDERBY = 'COLUMN_ORDERBY_ADDED';\r\n// export const COLUMN_SELECTED = 'COLUMN_SELECTED';\r\n// export const COLUMN_UNSELECTED = 'COLUMN_UNSELECTED';\r\nexport const COLUMN_SECURITY_GROUPS_SET = 'COLUMN_SET_SECURITY_GROUPS';\r\nexport const COLUMN_ATTRIBUTES_SET = 'COLUMN_ATTRIBUTES_SET';\r\n\r\nexport const SET_COLUMN_VISIBILTY = '@table-columns/SET_COLUMN_VISIBILTY';\r\n\r\nexport const toggleColumn = column => Action(COLUMN_VISIBLE_TOGGLED, column);\r\nexport const setAttributes = attributes => Action(COLUMN_ATTRIBUTES_SET, attributes);\r\nexport const setSecurityGroups = securityGroups => Action(COLUMN_SECURITY_GROUPS_SET, securityGroups);\r\nexport const setColumnVisiblity = user => Action(SET_COLUMN_VISIBILTY, user);\r\n// export const columnSelected = column => Action(COLUMN_SELECTED, column);\r\n// export const columnUnSelected = column => Action(COLUMN_UNSELECTED, column);\r\n\r\n","import { isArray, includes, remove } from 'lodash-es';\r\n\r\nimport * as AssetActions from '../../state/assets/assets.action';\r\nimport * as SearchActions from '../../state/search/search.action';\r\nimport * as TableColumnActions from '../../state/table-columns/table-columns.action';\r\nimport template from './asset-list.component.html';\r\n\r\nexport class AssetListController {\r\n constructor($ngRedux, $filter, equipmentUpdateService) {\r\n 'ngInject';\r\n\r\n this.selectMode = 'multi';\r\n this.allSelected = false;\r\n this.store = $ngRedux;\r\n this.SearchActions = SearchActions;\r\n this.AssetActions = AssetActions;\r\n this.TableColumnActions = TableColumnActions;\r\n this.$filter = $filter;\r\n this.visibleAssets = [];\r\n this.goToAssetTimeout = null;\r\n this.loading = true;\r\n this.equipmentUpdateService = equipmentUpdateService;\r\n this.lastCheckIndex = -1;\r\n\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, {\r\n ...AssetActions,\r\n ...SearchActions,\r\n ...TableColumnActions,\r\n })(this);\r\n\r\n this.defaultBindings();\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n $postLink() {}\r\n\r\n /**\r\n * Perform change detection on one-way bindings.\r\n * @param {any} change\r\n */\r\n $onChanges() {}\r\n\r\n /**\r\n * Map application state values to component properties\r\n * @param {*} state Application state\r\n */\r\n mapStateToThis(state) {\r\n const { search, assets, tableColumns, security, user } = state;\r\n const { list = [] } = assets;\r\n const { accountNameLookup } = user;\r\n this.allSelected = list.length > 0 ? list.every((asset) => asset.selected) : false;\r\n return {\r\n loading: search.inProgress,\r\n securityGroups: security.groups,\r\n assets: list,\r\n pageSize: 50,\r\n totalCount: assets.totalCount,\r\n currentPage: assets.currentPage,\r\n totalPages: assets.totalPages,\r\n initialSearch: assets.initial,\r\n errorText: search.error,\r\n errorFlag: !(search.error === ''),\r\n last_viewed_id: assets.viewed_asset_id,\r\n columns: tableColumns.selected,\r\n sort: search.sort,\r\n lastViewedId: assets.viewedAssetId,\r\n accountsLookup: accountNameLookup || {},\r\n };\r\n }\r\n\r\n /**\r\n * Set all bindings to their friendly defaults if they have not been supplied by parent (yet).\r\n */\r\n defaultBindings() {\r\n if (this.assets == null) {\r\n this.assets = [];\r\n }\r\n if (this.selectMode == null) {\r\n this.selectMode = 'multi';\r\n }\r\n if (this.preSelectedIds == null) {\r\n this.preSelectedIds = [];\r\n }\r\n if (this.assetDetails == null) {\r\n this.assetDetails = () => null;\r\n }\r\n if (this.selectionChanged == null) {\r\n this.selectionChanged = () => null;\r\n }\r\n }\r\n\r\n toggleOrderBy(column) {\r\n this.updateSort(column.sort_key);\r\n }\r\n\r\n toggleShowAsset(asset) {\r\n if (includes(this.visibleAssets, asset.id)) {\r\n this.visibleAssets = remove(this.visibleAssets, asset.id);\r\n } else {\r\n this.visibleAssets.push(asset.id);\r\n }\r\n }\r\n\r\n visibleAsset(asset) {\r\n return includes(this.visibleAssets, asset.id);\r\n }\r\n\r\n /**\r\n * Propagate selection changes to parent.\r\n */\r\n updateSelections(event, index) {\r\n //event.stopPropagation();\r\n if (this.selectMode && this.assets.length > 0) {\r\n let currentSelections = [];\r\n if (this.selectMode === 'multi') {\r\n if (index > -1 && this.assets[index].selected) {\r\n if (event && event.shiftKey && this.lastCheckIndex !== -1) {\r\n // do range select\r\n const [start, end] =\r\n this.lastCheckIndex > index\r\n ? [index, this.lastCheckIndex]\r\n : [this.lastCheckIndex, index];\r\n this.assets.forEach((asset, i) => {\r\n // set the range to true\r\n if (i >= start && i <= end) asset.selected = true;\r\n });\r\n }\r\n this.lastCheckIndex = index;\r\n }\r\n currentSelections = this.assets.filter((item) => item.selected);\r\n } else {\r\n // don't fire callback if the selectMode is 'none' or not supported.\r\n return;\r\n }\r\n // dispatch action\r\n this.select(currentSelections);\r\n }\r\n }\r\n\r\n /**\r\n * Decide whether to display equipment status based on asset properties.\r\n * @param {*} asset\r\n */\r\n showStatus(asset) {\r\n return (\r\n asset &&\r\n asset.properties &&\r\n isArray(asset.properties) &&\r\n (asset.properties.includes('alert:high') ||\r\n asset.properties.includes('alert:medium') ||\r\n asset.properties.includes('alert:low') ||\r\n asset.properties.includes('maintenance:upcoming') ||\r\n asset.properties.includes('maintenance:due') ||\r\n asset.properties.includes('sharestatus:inbound') ||\r\n asset.properties.includes('sharestatus:outbound'))\r\n );\r\n }\r\n\r\n getOrderClass(column) {\r\n const selected = this.sort.name === column.sort_key;\r\n const activeClass = selected ? 'active' : '';\r\n const direction = !selected ? 'asc' : this.sort.direction;\r\n\r\n const arrowClass = direction === 'asc' ? 'arrow-up' : 'arrow-down';\r\n\r\n return `fa fa-${arrowClass} ${activeClass}`;\r\n }\r\n\r\n deSelecteLastViewedAsset() {\r\n this.resetLastViewedAsset();\r\n }\r\n\r\n /**\r\n * Propagate asset row clicks up to parent\r\n * @param {*} asset\r\n */\r\n assetClicked(asset) {\r\n this.viewed(asset);\r\n this.assetDetails({\r\n asset,\r\n });\r\n }\r\n\r\n /**\r\n * Returns a boolean flag indicating whether asset rows should be shown on the UI\r\n */\r\n shouldDisplayAssets() {\r\n return this.assets && this.assets.length > 0;\r\n }\r\n\r\n /**\r\n * Returns a boolean flag indicating whether failure/no results should be shown on the UI.\r\n */\r\n shouldDisplayFailure() {\r\n return !this.loading && (!this.assets || this.assets.length === 0);\r\n }\r\n\r\n selectAll() {\r\n this.allSelected = !this.allSelected;\r\n this.assets.forEach((asset) => (asset.selected = this.allSelected));\r\n const selections = this.assets.filter((item) => item.selected);\r\n this.select(selections);\r\n // GTM UPDATE -> GTM UPDATED\r\n window.dataLayer.push({\r\n event: this.allSelected ? 'selectAllAssets' : 'unselectAllAssets',\r\n });\r\n }\r\n\r\n // GTM UPDATE -> GTM UPDATED\r\n singleSelected(asset) {\r\n window.dataLayer.push({\r\n event: asset.selected ? 'singleUnselect' : 'singleSelect',\r\n data: {\r\n id: asset.id || 'unknown',\r\n name: asset.name || 'unknown',\r\n },\r\n });\r\n }\r\n\r\n bulbNotice() {\r\n window.dataLayer.push({\r\n event: 'bulbNoticeOpen',\r\n });\r\n\r\n this.notice = true;\r\n }\r\n\r\n hasMoreResults() {\r\n return this.currentPage < this.totalPages;\r\n }\r\n\r\n loadMore() {\r\n if (!this.loading && this.hasMoreResults()) {\r\n this.store.dispatch(this.AssetActions.selectPage(this.currentPage + 1));\r\n }\r\n }\r\n\r\n getLastSeenColorClass(date) {\r\n if (date === '' || date === undefined) {\r\n return '';\r\n }\r\n\r\n const now = moment(new Date());\r\n const lsn = moment(date);\r\n const days = moment.duration(now.diff(lsn)).asDays();\r\n\r\n switch (true) {\r\n case 0 < days && days < 1:\r\n return 'seen-24h';\r\n case 1 < days && days < 3:\r\n return 'seen-1-3d';\r\n case 3 < days && days < 10:\r\n return 'seen-3-10d';\r\n case 10 < days && days < 30:\r\n return 'seen-in-10-30d';\r\n default:\r\n return 'not-seen-30d';\r\n }\r\n }\r\n\r\n formatDateTime(dateTime) {\r\n let timeZone = '';\r\n let formattedDateTime = '';\r\n if (dateTime) {\r\n timeZone = moment.tz.guess();\r\n formattedDateTime = moment.tz(dateTime, timeZone).format('MM/DD/YYYY hh:mm:ss A');\r\n }\r\n return formattedDateTime;\r\n }\r\n\r\n openUpdateAsset(asset) {\r\n // GTM\r\n window.dataLayer.push({\r\n event: 'assetList-SingleAssetUpdateOpen',\r\n data: {\r\n id: asset.id || 'unknown',\r\n name: asset.name || 'unknown',\r\n },\r\n });\r\n this.equipmentUpdateService.openEditModal(asset).catch(() => {\r\n window.dataLayer.push({\r\n event: 'assetList-SingleAssetUpdateDismiss',\r\n data: {\r\n id: asset.id || 'unknown',\r\n name: asset.name || 'unknown',\r\n },\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport const assetListComponent = {\r\n template,\r\n bindings: {\r\n assetDetails: '&',\r\n },\r\n controller: AssetListController,\r\n controllerAs: 'vm',\r\n};\r\n","import {find} from 'lodash-es';\r\n\r\nimport * as AssetActions from '../../../state/assets/assets.action';\r\nimport * as SearchActions from '../../../state/search/search.action';\r\n\r\nexport class AssetListFooterController {\r\n constructor($scope, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.store = $ngRedux;\r\n\r\n this.selectedPage = 1;\r\n this.numPages = 1;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, {...AssetActions, ...SearchActions})(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n export() {\r\n this.searchExport();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const {assets} = state;\r\n const {exportInProgress} = state.search;\r\n const pageSize = find(assets.pageSizes, item => item.value === assets.pageSize);\r\n\r\n return {\r\n totalAssetCount: assets.totalCount,\r\n selectedPage: assets.currentPage,\r\n numPages: assets.totalPages,\r\n pageSizes: assets.pageSizes,\r\n pageSize,\r\n exportInProgress\r\n };\r\n }\r\n\r\n hasMoreResults() {\r\n return this.selectedPage < this.numPages;\r\n }\r\n\r\n setPageSize() {\r\n this.store.dispatch(this.updatePageSize(this.pageSize.value));\r\n }\r\n\r\n selectPage() {\r\n // invoke bound search trigger function, passing the selected page index and result limit\r\n this.store.dispatch(this.selectPage(this.selectedPage));\r\n }\r\n\r\n previousPage() {\r\n this.selectPage(this.selectedPage - 1);\r\n }\r\n\r\n nextPage() {\r\n this.selectPage(this.selectedPage + 1);\r\n }\r\n\r\n sinceForPage(page, limit) {\r\n return (page - 1) * limit;\r\n }\r\n\r\n getNotice() {\r\n this.showNotice();\r\n }\r\n}\r\n\r\nexport const assetListFooterComponent = {\r\n restrict: 'E',\r\n bindings: {\r\n showNotice: '&'\r\n },\r\n controller: 'AssetListFooterController as vm'\r\n};\r\n","import angular from 'angular';\r\nimport ngRedux from 'ng-redux';\r\nimport 'angular-gettext';\r\n\r\nimport appStateModule from '../../state/state.module';\r\nimport apiModule from '../../api/api.module';\r\n\r\nimport {assetListComponent, AssetListController} from './asset-list.component';\r\nimport {assetListFooterComponent, AssetListFooterController} from './asset-list-footer/asset-list-footer.component';\r\n\r\n/** Asset List page module */\r\nexport default angular\r\n .module('components.asset-list', [appStateModule, apiModule, ngRedux, 'gettext'])\r\n // Asset List body\r\n .component('assetList', assetListComponent)\r\n .controller('AssetListController', AssetListController)\r\n\r\n // Asset List footer\r\n .component('assetListFooter', assetListFooterComponent)\r\n .controller('AssetListFooterController', AssetListFooterController).name;\r\n","export const millisecondsIn60Hz = 16;\r\n\r\nexport default class DebouncedToggle {\r\n\tconstructor($timeout) {\r\n\t\t'ngInject';\r\n\r\n\t\tthis._toggleInProgress = false;\r\n\t\tthis.$timeout = $timeout;\r\n\t}\r\n\r\n\t_debounceToggle() {\r\n\t\tif (this._toggleInProgress) {\r\n\t\t\treturn Promise.reject('Toggle already in progress!');\r\n\t\t}\r\n\r\n\t\tthis._toggleInProgress = true;\r\n\t\treturn this.$timeout(\r\n\t\t\t() => (this._toggleInProgress = false),\r\n\t\t\tmillisecondsIn60Hz\r\n\t\t);\r\n\t}\r\n\r\n\t_ignore() {\r\n\t\t// ignore promise rejection\r\n\t}\r\n}","import template from './asset-search.component.html';\r\nimport DebouncedToggle from '../debounced-toggle';\r\nimport * as SearchActions from '../../state/search/search.action';\r\n\r\nexport class AssetSearchController extends DebouncedToggle {\r\n constructor($timeout, $state, $stateParams, gettextCatalog, $ngRedux) {\r\n 'ngInject';\r\n\r\n super($timeout);\r\n\r\n this.$timeout = $timeout;\r\n this.$state = $state;\r\n this.$stateParams = $stateParams;\r\n this.gettextCatalog = gettextCatalog;\r\n\r\n this.store = $ngRedux;\r\n this.showingHistory = false;\r\n this.searchString = '';\r\n this.helpContent = { helpMe: 'search' };\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n }\r\n\r\n $postLink() {\r\n if (this.assetCount === 0) {\r\n this.refresh();\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { search, assets } = state;\r\n\r\n return {\r\n loading: search.inProgress,\r\n assetCount: assets.list.length\r\n };\r\n }\r\n\r\n _preventBubbling($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n triggerSearch() {\r\n if (this.searchTimeoutPromise) {\r\n this.$timeout.cancel(this.searchTimeoutPromise);\r\n }\r\n\r\n this.searchTimeoutPromise = this.$timeout(() => {\r\n this.search();\r\n }, 100);\r\n }\r\n\r\n search() {\r\n this.addQuery(this.searchString);\r\n window.dataLayer.push({\r\n event: 'search',\r\n attrs: {\r\n term: this.searchString\r\n }\r\n })\r\n this.searchString = '';\r\n }\r\n\r\n clearAll() {\r\n this.resetSearch();\r\n }\r\n\r\n navigateToAsset(asset) {\r\n this.$state.go('equipment.detail', {\r\n equipmentId: asset.id,\r\n title: asset.name\r\n });\r\n }\r\n\r\n toggleFilters() {\r\n this.openFilters();\r\n }\r\n\r\n toggleShowHistory($event) {\r\n this._preventBubbling($event);\r\n this._debounceToggle()\r\n .then(() => (this.showingHistory = !this.showingHistory))\r\n .catch(this._ignore);\r\n }\r\n\r\n hideHistory() {\r\n this._debounceToggle()\r\n .then(() => (this.showingHistory = false))\r\n .catch(this._ignore);\r\n }\r\n\r\n closeHistory() {\r\n this.showingHistory = false;\r\n }\r\n}\r\n\r\nexport const assetSearchComponent = {\r\n template,\r\n controller: 'AssetSearchController as vm',\r\n bindings: {\r\n openFilters: '&'\r\n }\r\n};\r\n","import Action from '../action';\r\n\r\nexport const HISTORY_UPDATED = 'HISTORY_UPDATED';\r\nexport const HISTORY_ADDED = 'HISTORY_ADDED';\r\nexport const HISTORY_SELECTED = 'HISTORY_SELECTED';\r\n\r\nexport const selectHistory = history => Action(HISTORY_SELECTED, history);\r\nexport const historyAdded = history => Action(HISTORY_ADDED, history);\r\nexport const historyUpdated = history => Action(HISTORY_UPDATED, history);\r\n","import Action from '../action';\r\n\r\n// Retrieve from the server\r\nexport const FAVOURITES_FETCH_INITIATED = 'FAVOURITES_FETCH_INIT';\r\nexport const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS';\r\nexport const FAVOURITES_FETCH_FAILED = 'FAVOURITES_FETCH_FAILED';\r\n\r\n// Interact on the client\r\nexport const FAVOURITE_ADDED = 'FAVOURITE_ADDED';\r\nexport const FAVOURITE_ADD_SUCCESS = 'FAVOURITE_ADD_SUCCESS';\r\nexport const FAVOURITE_ADD_FAILED = 'FAVOURITE_ADD_FAILED';\r\nexport const FAVOURITE_REMOVED = 'FAVOURITE_REMOVED';\r\nexport const FAVOURITE_REMOVE_SUCCESS = 'FAVOURITE_REMOVE_SUCCESS';\r\nexport const FAVOURITE_REMOVE_FAILED = 'FAVOURITE_REMOVE_FAILED';\r\nexport const FAVOURITE_SELECTED = 'FAVOURITE_SELECTED';\r\nexport const FAVOURITE_AUDIT = 'FAVOURITE_AUDIT';\r\nexport const FAVOURITE_UPDATED = 'FAVOURITE_UPDATED';\r\nexport const FAVOURITE_UPDATE_SUCCESS = 'FAVOURITE_UPDATE_SUCCESS';\r\nexport const FAVOURITE_UPDATE_FAILED = 'FAVOURITE_UPDATE_FAILED';\r\nexport const FAVOURITE_RESTORE = 'FAVOURITE_RESTORE';\r\nexport const FAVOURITE_RESTORE_SUCCESS = 'FAVOURITE_RESTORE_SUCCESS';\r\nexport const FAVOURITE_RESTORE_FAILED = 'FAVOURITE_RESTORE_FAILED';\r\nexport const FAVOURITE_OLD_SELECTED = 'FAVOURITE_OLD_SELECTED';\r\n\r\nexport const favouriteAdd = favourite => Action(FAVOURITE_ADDED, favourite);\r\nexport const favouriteAddSuccess = favourite => Action(FAVOURITE_ADD_SUCCESS, favourite);\r\nexport const favouriteAddFailed = error => Action(FAVOURITE_ADD_FAILED, error, true);\r\n\r\nexport const audit = search => Action(FAVOURITE_AUDIT, search);\r\n\r\nexport const favouriteUpdate = favourite => Action(FAVOURITE_UPDATED, favourite);\r\nexport const favouriteUpdateSuccess = favourite => Action(FAVOURITE_UPDATE_SUCCESS, favourite);\r\nexport const favouriteUpdateFailed = error => Action(FAVOURITE_UPDATE_FAILED, error, true);\r\n\r\nexport const favouriteRemove = favourite => Action(FAVOURITE_REMOVED, favourite);\r\nexport const favouriteRemoveSuccess = favourite => Action(FAVOURITE_REMOVE_SUCCESS, favourite);\r\nexport const favouriteRemoveFailed = error => Action(FAVOURITE_REMOVE_FAILED, error, true);\r\n\r\nexport const favouriteFetch = () => Action(FAVOURITES_FETCH_INITIATED);\r\nexport const favouriteFetchSuccess = payload => Action(FAVOURITES_FETCH_SUCCESS, payload);\r\nexport const favouriteFetchFailed = payload => Action(FAVOURITES_FETCH_FAILED, payload, true);\r\n\r\nexport const favouriteSelect = favourite => Action(FAVOURITE_SELECTED, favourite);\r\nexport const selectOldFavourite = oldFavourite => Action(FAVOURITE_OLD_SELECTED, oldFavourite);\r\n\r\nexport const favouriteRestore = id => Action(FAVOURITE_RESTORE, id);\r\nexport const favouriteRestoreSuccess = favourite => Action(FAVOURITE_RESTORE_SUCCESS, favourite);\r\nexport const favouriteRestoreFailed = error => Action(FAVOURITE_RESTORE_FAILED, error, true);\r\n","import template from './history.component.html';\r\nimport { clone } from '../../../utility/immutability.util.service';\r\nimport moment from 'moment';\r\n\r\nimport { orderBy } from 'lodash-es';\r\n\r\nimport * as HistoryActions from '../../../state/history/history.action';\r\nimport * as FavouriteActions from '../../../state/favourite/favourite.action';\r\n\r\nexport class AssetSearchHistoryController {\r\n constructor($ngRedux, gettextCatalog, gettext) {\r\n 'ngInject';\r\n\r\n this.gettextCatalog = gettextCatalog;\r\n this.gettext = gettext;\r\n\r\n this.store = $ngRedux;\r\n\r\n this._toggleInProgress = false;\r\n\r\n this.meta = {};\r\n this.modifiedObject = {};\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, { ...HistoryActions, ...FavouriteActions })(this);\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { favourites, history, search } = state;\r\n return {\r\n history: orderBy(history.list, history => moment(history.search.searchTime).toDate(), ['desc']),\r\n favourites: orderBy(favourites.list, favourite => moment(favourite.search.searchTime).toDate(), ['desc']),\r\n removedFavourites: favourites.removedList,\r\n search\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n getMeta(searchItem) {\r\n if (searchItem == null) {\r\n return;\r\n }\r\n\r\n const { hash } = searchItem.search;\r\n if (!this.meta[hash]) {\r\n this.meta[hash] = {};\r\n }\r\n\r\n return this.meta[hash];\r\n }\r\n\r\n _preventBubbling($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n _beginEdit(searchItem) {\r\n this._cancelEdit();\r\n const itemMeta = this.getMeta(searchItem);\r\n\r\n itemMeta.isEditing = true;\r\n this.modifiedObject = clone(searchItem);\r\n }\r\n\r\n _cancelEdit() {\r\n Object.keys(this.meta).forEach(key => {\r\n this.meta[key].isEditing = false;\r\n this.meta[key].isCreating = false;\r\n this.meta[key].isHistoryHovered = false;\r\n });\r\n }\r\n\r\n _beginDelete(searchItem) {\r\n this._cancelEdit(searchItem);\r\n const itemMeta = this.getMeta(searchItem);\r\n\r\n itemMeta.isDeleting = true;\r\n itemMeta.isHovered = false;\r\n }\r\n\r\n _cancelDelete(searchItem) {\r\n const itemMeta = this.getMeta(searchItem);\r\n\r\n itemMeta.isDeleting = false;\r\n itemMeta.isHovered = false;\r\n }\r\n\r\n _restore(searchItem) {\r\n this.favouriteRestore(searchItem.id);\r\n }\r\n\r\n _setItemError(searchItem, error) {\r\n const itemMeta = this.getMeta(searchItem);\r\n\r\n itemMeta.error = this.gettextCatalog.getString(error);\r\n }\r\n\r\n _hasName(searchItem) {\r\n return !!searchItem.name && searchItem.name.length > 0;\r\n }\r\n\r\n unFavourite($event, searchItem) {\r\n // prevent click from bubbling to avoid history closing when favourite is removed\r\n this._preventBubbling($event);\r\n this.favouriteRemove(searchItem);\r\n this._cancelDelete(searchItem);\r\n }\r\n\r\n editFavourite(searchItem) {\r\n this._beginEdit(searchItem);\r\n }\r\n\r\n saveFavourite() {\r\n if (!this.modifiedObject.name || this.modifiedObject.name === '') {\r\n this._setItemError(this.modifiedObject, this.gettext('You must provide a name to save a search favorite'));\r\n return;\r\n }\r\n\r\n this.favouriteAdd(this.modifiedObject);\r\n this._cancelEdit();\r\n // GTM UPDATE -> GTM UPDATED\r\n window.dataLayer.push({\r\n event: 'saveFavourite',\r\n favAttrs: {\r\n term: this.modifiedObject.name\r\n }\r\n })\r\n }\r\n\r\n renameFavourite() {\r\n if (!this.modifiedObject.name || this.modifiedObject.name === '') {\r\n this._setItemError(this.modifiedObject, this.gettext('You must provide a name to save a search favourite'));\r\n return;\r\n }\r\n\r\n this.favouriteUpdate(this.modifiedObject);\r\n this._cancelEdit();\r\n }\r\n\r\n cancelFavourite(searchItem) {\r\n this._cancelEdit(searchItem);\r\n }\r\n\r\n createFavourite(searchItem) {\r\n if (!searchItem.isFavourite) {\r\n this._beginEdit(searchItem);\r\n this.getMeta(searchItem).isCreating = true;\r\n }\r\n }\r\n\r\n toggleFavourite(searchItem) {\r\n this.editFavourite(searchItem);\r\n }\r\n\r\n _hasKeys(obj) {\r\n return obj && Object.keys(obj).length > 0;\r\n }\r\n\r\n hasHistory() {\r\n return this._hasKeys(this.history);\r\n }\r\n\r\n hasFavourites() {\r\n return this._hasKeys(this.favourites);\r\n }\r\n\r\n hasRecentDeletions() {\r\n return this._hasKeys(this.removedFavourites);\r\n }\r\n\r\n historyClicked(history) {\r\n this.selectHistory(history, this.favourites);\r\n this.closeHistory();\r\n }\r\n\r\n favouriteClicked(favourite) {\r\n this.favouriteSelect(favourite);\r\n this.closeHistory();\r\n }\r\n}\r\n\r\nexport const assetSearchHistoryComponent = {\r\n template,\r\n bindings: {\r\n closeHistory: '&'\r\n },\r\n controller: 'AssetSearchHistoryController as vm'\r\n};\r\n\r\nexport default assetSearchHistoryComponent;\r\n","import { cloneDeep } from 'lodash-es';\r\n\r\n/***\r\n * @returns deep copy of an input object\r\n *\r\n */\r\n\r\nexport const clone = object => cloneDeep(object);\r\n","import {gettext} from '../../state/gettext-extract-util';\r\n\r\n/**\r\n * return string indicate range boundary type\r\n * @param {*} min range min\r\n * @param {*} max range max\r\n */\r\nconst getRangeType = (min, max) => {\r\n if (min && max) {\r\n return 'between';\r\n } else if (max) {\r\n return 'within';\r\n } else if (min) {\r\n return 'outside';\r\n } else {\r\n return '';\r\n }\r\n};\r\nconst daysRange = (min, max) => {\r\n return {\r\n min,\r\n max,\r\n type: getRangeType(min, max)\r\n };\r\n};\r\n\r\nexport const LastSeenOptions = [\r\n {\r\n label: gettext('within 24h'),\r\n id: 'seen-24h',\r\n range: daysRange(0, 1)\r\n },\r\n {\r\n label: gettext('1-3 Days'),\r\n id: 'seen-1-3d',\r\n range: daysRange(1, 3)\r\n },\r\n {\r\n label: gettext('3-10 Days'),\r\n id: 'seen-3-10d',\r\n range: daysRange(3, 10)\r\n },\r\n {\r\n label: gettext('10-30 Days'),\r\n id: 'seen-in-10-30d',\r\n range: daysRange(10, 30)\r\n },\r\n {\r\n label: gettext('30+ Days'),\r\n id: 'not-seen-30d',\r\n range: daysRange(30, null)\r\n }\r\n];\r\n\r\nconst customOption = (min, max) => {\r\n return {\r\n id: 'custom',\r\n range: daysRange(min || 0, max)\r\n };\r\n};\r\n\r\nconst isSame = (a, b) => {\r\n //will cast ( 0, undefined,'') to null as they are all same in the range\r\n a = a || null;\r\n b = b || null;\r\n return a === b;\r\n};\r\n\r\nexport const getLastSeenOptionByMinMax = (minValue, maxValue) => {\r\n const matchOption = LastSeenOptions.find(\r\n option => isSame(option.range.max, maxValue) && isSame(option.range.min, minValue)\r\n );\r\n return matchOption ? matchOption : customOption(minValue, maxValue);\r\n};\r\n","import {getLastSeenOptionByMinMax} from '../../../last-seen-filter/last-seen-filter.models';\r\n\r\nclass FilterSummaryComponent {\r\n constructor() {}\r\n\r\n $onInit() {\r\n this.filtersCount = this._getFilterCount();\r\n this.filters = this._getFilters();\r\n }\r\n\r\n _getFilterCount() {\r\n const {query, alerts, maintenance, lastCommunicated, securityGroups, tagFilters, accounts, lastSeen} = this.item;\r\n const tagFilterCount = Object.keys(tagFilters || {}).length;\r\n const queryCount = (query || []).length;\r\n const secCount = (securityGroups || []).length;\r\n const alertsCount = (alerts || []).length;\r\n const maintenCount = (maintenance || []).length;\r\n const comCount = (lastCommunicated || []).length;\r\n const accountCount = (accounts || []).length;\r\n const lastSeenCount = (lastSeen || []).length;\r\n return (\r\n tagFilterCount + queryCount + secCount + alertsCount + maintenCount + comCount + accountCount + lastSeenCount\r\n );\r\n }\r\n\r\n _getFilters() {\r\n const {\r\n query,\r\n alerts = [],\r\n maintenance = [],\r\n lastCommunicated = [],\r\n securityGroups = [],\r\n tagFilters,\r\n accounts = [],\r\n lastSeen = []\r\n } = this.item;\r\n let filters = [];\r\n const frindlyalerts = alerts.map(item => getfriendlyObject(item, this.search.alerts, 'alerts'));\r\n filters.push(...frindlyalerts);\r\n const frindlymaintenance = maintenance.map(item => getfriendlyObject(item, this.search.maintenance, 'maintenance'));\r\n filters.push(...frindlymaintenance);\r\n const frindlylastCommunicated = lastCommunicated.map(item =>\r\n getfriendlyObject(item, this.search.lastCommunicated, 'lastCommunicated')\r\n );\r\n filters.push(...frindlylastCommunicated);\r\n const frindlysecurityGroups = securityGroups.map(item =>\r\n getfriendlyObject(item, this.search.securityGroups, 'securityGroups')\r\n );\r\n filters.push(...frindlysecurityGroups);\r\n\r\n const frindlyAccounts = accounts.map(item => getfriendlyObject(item, this.search.accounts, 'accounts'));\r\n filters.push(...frindlyAccounts);\r\n\r\n const [savedLastSeen] = lastSeen || [];\r\n const LastSeenFilter = savedLastSeen ? getLastSeenOptionByMinMax(savedLastSeen.min, savedLastSeen.max) : '';\r\n return {\r\n queries: query,\r\n filters,\r\n tags: tagFilters,\r\n LastSeenFilter\r\n };\r\n }\r\n}\r\n\r\nconst getfriendlyObject = (item, collection = [], type) => {\r\n const friendlyObject = {title: '', value: item.id, translateval: true};\r\n const fullObject = collection.find(obj => obj.id === item.id);\r\n if (!fullObject) {\r\n return friendlyObject;\r\n }\r\n switch (type) {\r\n case 'alerts': {\r\n return {\r\n ...friendlyObject,\r\n title: 'Alert',\r\n value: fullObject.label\r\n };\r\n }\r\n case 'maintenance': {\r\n return {\r\n ...friendlyObject,\r\n title: 'Maintenance',\r\n value: fullObject.label\r\n };\r\n }\r\n case 'lastCommunicated': {\r\n return {\r\n ...friendlyObject,\r\n title: fullObject.group,\r\n value: fullObject.label\r\n };\r\n }\r\n case 'securityGroups': {\r\n return {\r\n ...friendlyObject,\r\n title: 'Security Group',\r\n value: fullObject.name,\r\n translateval: false\r\n };\r\n }\r\n case 'accounts': {\r\n return {\r\n ...friendlyObject,\r\n title: 'Account',\r\n value: fullObject.name,\r\n translateval: false\r\n };\r\n }\r\n }\r\n\r\n return friendlyObject;\r\n};\r\nexport default {\r\n template: require('./filter-summary.html'),\r\n controller: FilterSummaryComponent,\r\n controllerAs: 'vm',\r\n bindings: {\r\n item: '<',\r\n search: '<'\r\n }\r\n};\r\n","import angular from 'angular';\r\nimport ngRedux from 'ng-redux';\r\nimport angularUiBootstrap from 'angular-ui-bootstrap';\r\nimport 'angular-gettext';\r\nimport 'ui-select';\r\n\r\nimport 'angular-click-outside';\r\n\r\nimport apiModule from '../../api/api.module';\r\nimport appStateModule from '../../state/state.module';\r\n\r\nimport { assetSearchComponent, AssetSearchController } from './asset-search.component';\r\nimport { assetSearchHistoryComponent, AssetSearchHistoryController } from './history/history.component';\r\n\r\nimport filterSummary from './history/filter-summary/filter-summary.component';\r\n// import { summaryComponent, SearchSummaryController } from './summary/summary.component';\r\n\r\nconst assetSearchModule = angular.module('assetSearch', [\r\n\tapiModule,\r\n\tappStateModule,\r\n\r\n\tngRedux,\r\n\tangularUiBootstrap,\r\n\t'tw.directives.clickOutside',\r\n\t'gettext',\r\n\t'ui.select'\r\n]);\r\n\r\nassetSearchModule\r\n\r\n\t// Asset Search\r\n\t.component('assetSearch', assetSearchComponent)\r\n\t.controller('AssetSearchController', AssetSearchController)\r\n\r\n\t// Search history / favourites\r\n\t.component('assetSearchHistory', assetSearchHistoryComponent)\r\n\t.component('filterSummary', filterSummary)\r\n\t.controller('AssetSearchHistoryController', AssetSearchHistoryController);\r\n\r\nexport default assetSearchModule.name;\r\n","import { find } from 'lodash-es';\r\nimport DebouncedToggle from '../debounced-toggle';\r\n\r\nimport template from './table-column-selector.html';\r\nimport * as TableColumnActions from '../../state/table-columns/table-columns.action';\r\n\r\nexport class TableColumnSelectorController extends DebouncedToggle {\r\n constructor($ngRedux, $timeout) {\r\n 'ngInject';\r\n super($timeout);\r\n\r\n this.store = $ngRedux;\r\n this.$timeout = $timeout;\r\n this._toggleInProgress = false;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, TableColumnActions)(this);\r\n\r\n this.defaultBindings();\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { attributes, tableColumns } = state;\r\n\r\n return {\r\n attributes: attributes,\r\n tableColumns: tableColumns\r\n };\r\n }\r\n\r\n hideList() {\r\n this._debounceToggle()\r\n .then(() => (this.showList = false))\r\n .catch(this._ignore);\r\n }\r\n\r\n toggleShowList() {\r\n this._debounceToggle()\r\n .then(() => (this.showList = !this.showList))\r\n .catch(this._ignore);\r\n }\r\n\r\n defaultBindings() {\r\n if (this.attributes == null) {\r\n this.attributes = {};\r\n }\r\n\r\n if (this.tableColumns == null) {\r\n this.tableColumns = {};\r\n }\r\n }\r\n\r\n selected(column) {\r\n return find(this.tableColumns.selected, selected => selected.key === column.key);\r\n }\r\n}\r\n\r\nexport const tableColumnSelectorComponent = {\r\n template,\r\n restrict: 'E',\r\n replace: true,\r\n bindings: {},\r\n controller: 'TableColumnSelectorController as vm'\r\n};\r\n","import angular from 'angular';\r\nimport ngRedux from 'ng-redux';\r\nimport 'angular-gettext';\r\n\r\nimport appStateModule from '../../state/state.module';\r\n\r\nimport {\r\n\ttableColumnSelectorComponent,\r\n\tTableColumnSelectorController\r\n} from './table-column-selector.component';\r\n\r\n/** Asset List page module */\r\nexport default angular\r\n\t.module('components.table-column-selector', [\r\n\t\tappStateModule,\r\n\t\tngRedux,\r\n\t\t'gettext'\r\n\t])\r\n\t// Asset List body\r\n\t.component('tableColumnSelector', tableColumnSelectorComponent)\r\n\t.controller('TableColumnSelectorController', TableColumnSelectorController)\r\n\t.name;\r\n","import Auth from '../auth';\r\n\r\nclass SignOutComponent {\r\n signOut() {\r\n Auth.signUserOut();\r\n }\r\n}\r\n\r\nexport default {\r\n restrict: 'E',\r\n template: require(\"./sign-out.html\"),\r\n controllerAs: 'vm',\r\n controller: SignOutComponent\r\n};","import template from './resolvable-geo-location.html';\r\n\r\nclass geoLocationController {\r\n constructor(gettextCatalog, $q, browser, $state) {\r\n 'ngInject';\r\n this.gettextCatalog = gettextCatalog;\r\n this.address = '';\r\n this.coords = '';\r\n this.displayAddress = false;\r\n this.$q = $q;\r\n this.mapURL = '#';\r\n this.browser = browser;\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n this.$state = $state;\r\n }\r\n\r\n $onInit() {\r\n this.IsIOSDevice = (this.browser.osname || '').toLowerCase() === 'ios';\r\n this.updateCoords();\r\n this.setMapURL();\r\n }\r\n\r\n $onChanges() {\r\n this.address = '';\r\n this.updateCoords();\r\n this.setMapURL();\r\n }\r\n\r\n setMapURL() {\r\n const universalGoogleMapUrlDirection = encodeURI(\r\n `https://www.google.com/maps/dir/?api=1&destination=${this.latitude},${this.longitude}`\r\n );\r\n const universalGoogleMapUrl = encodeURI(\r\n `https://www.google.com/maps/search/?api=1&query=${this.latitude},${this.longitude}`\r\n );\r\n const isoMapDirection = encodeURI(`http://maps.apple.com/?daddr=${this.latitude},${this.longitude}`);\r\n const isoMap = encodeURI(`http://maps.apple.com/?q=${this.latitude},${this.longitude}`);\r\n this.mapURL = this.IsIOSDevice ? isoMap : universalGoogleMapUrl;\r\n this.mapURLDirection = this.IsIOSDevice ? isoMapDirection : universalGoogleMapUrlDirection;\r\n }\r\n\r\n updateCoords() {\r\n this.coords = `${Number(this.latitude).toFixed(5)},${Number(this.longitude).toFixed(5)}`;\r\n }\r\n\r\n handleRsolveResult(error, result) {\r\n if (error) {\r\n this.updateLocation(this.gettextCatalog.getString('Unknown Address'));\r\n } else if (result.address.Match_addr) {\r\n this.updateLocation(result.address.Match_addr);\r\n } else {\r\n const closeAddress = `${this.gettextCatalog.getString('Closest Address ')}:${result.address.Address}`;\r\n this.updateLocation(closeAddress);\r\n }\r\n }\r\n\r\n resolveCoord() {\r\n return this.$q(resolve => {\r\n L.esri.Geocoding.reverseGeocode()\r\n .latlng([this.latitude, this.longitude])\r\n .distance(5000)\r\n .language('EN')\r\n .run((error, result) => {\r\n if (error) {\r\n resolve(this.gettextCatalog.getString('Unknown Address'));\r\n } else if (result.address.Match_addr) {\r\n resolve(result.address.Match_addr);\r\n } else {\r\n const closeAddress = `${this.gettextCatalog.getString('Closest Address ')}:${result.address.Address}`;\r\n resolve(closeAddress);\r\n }\r\n });\r\n });\r\n }\r\n\r\n getLocation() {\r\n return this.displayAddress ? this.address || this.coords : this.coords;\r\n }\r\n\r\n toggleCoordAddress() {\r\n const eventData = { displayAddress: true, page: this.$state.current.name };\r\n\r\n if (!this.displayAddress) {\r\n !this.address\r\n ? this.resolveCoord().then(address => {\r\n this.address = address;\r\n //delay set displayAddress til resolve call get back\r\n this.displayAddress = true;\r\n })\r\n : (this.displayAddress = true);\r\n } else {\r\n this.displayAddress = false;\r\n eventData.displayAddress = false;\r\n }\r\n\r\n this.addToDataLayer({\r\n event: 'toggleCoordAddress',\r\n data: eventData,\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n bindings: {\r\n latitude: '<',\r\n longitude: '<',\r\n lastSeen: ' 1 ? gettextCatalog.getString('addresses') : gettextCatalog.getString('address')\r\n });\r\n\r\n $scope.$watchCollection('vm.emails', emails => {\r\n if (emails ) {\r\n generateEmails();\r\n }\r\n });\r\n\r\n const generateEmails = () => {\r\n vm.emailsModel = [];\r\n\r\n vm.emails.forEach(value => {\r\n vm.formatContact ? vm.emailsModel.push({\r\n text: value.email\r\n }) : vm.emailsModel.push({\r\n text: value\r\n });\r\n });\r\n };\r\n\r\n vm.updateTags = () => {\r\n const result = [];\r\n\r\n vm.emailsModel.forEach(email => {\r\n vm.formatContact ? result.push({\r\n email: email.text\r\n }) : result.push(email.text);\r\n });\r\n\r\n if (result.length > vm.maxEmails) {\r\n $scope.$emit('totalEmails', {\r\n length: vm.maxEmails\r\n });\r\n }\r\n\r\n vm.onEmailChange({\r\n $event: {\r\n emails: result\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport default MultiEmailsComponent;","\r\nconst ProgressBarComponent = {\r\n restrict: 'E',\r\n template: require('./progress-bar.html'),\r\n bindings: {\r\n max: '<',\r\n current: '<',\r\n message: '@'\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n function progressBarController() {\r\n \r\n var onePercent = 100;\r\n var vm = this;\r\n vm.percentage = 0;\r\n \r\n vm.$onInit = function () {\r\n onePercent = 100 / vm.max;\r\n };\r\n \r\n vm.$onChanges = function (change) {\r\n if (change.current && change.current.currentValue) {\r\n var percent = onePercent * change.current.currentValue;\r\n vm.percentage = (percent > 100 ? 100 : percent) + \"%\";\r\n }\r\n };\r\n }\r\n ]\r\n};\r\n\r\nexport default ProgressBarComponent;\r\n","const SearchableDropdownComponent = {\r\n\ttemplate: require('./searchable-dropdown.html'),\r\n\trequire: {\r\n\t\tngModel: '?ngModel'\r\n\t},\r\n\tbindings: {\r\n\t\tdisplayAttr: '@',\r\n\t\titems: '<',\r\n\t\tonSelectionChanged: '&',\r\n\t\tselectedItem: ' Action(GET_TRANSFERKEYS);\r\nexport const getTransferKeysSuccess = payload => Action(GET_TRANSFERKEYS_SUCCESS, payload);\r\nexport const getTransferKeysFail = error => Action(GET_TRANSFERKEYS_FAIL, error, true);\r\nexport const initiateAssetTransfer = (assets = [], key) =>\r\n Action(INITIATE_ASSET_TRANSFER, {\r\n key,\r\n assets\r\n });\r\nexport const initiateAssetTransferFail = error => Action(INITIATE_ASSET_TRANSFER_FAIL, error, true);\r\nexport const transferAssets = (key, installations) =>\r\n Action(TRANSFER_ASSETS, {\r\n key,\r\n installations\r\n });\r\nexport const transferAssetSuccess = payload => Action(TRANSFER_ASSET_SUCCESS, payload);\r\nexport const transferAssetFail = (installationId, error) => Action(TRANSFER_ASSET_FAIL, {installationId, error}, true);\r\nexport const resetTransfers = () => Action(RESET_TRANSFERS);\r\n","import template from './transfer.component.html';\r\nimport * as TransferActions from '../../state/transfer/transfer.actions';\r\nimport * as TableColumnsActions from '../../state/table-columns/table-columns.action';\r\n\r\nclass TransferController {\r\n constructor($ngRedux, $timeout) {\r\n 'ngInject';\r\n this.showFlyout = false;\r\n this.transferInitiated = this.verifyTransfer = false;\r\n this.targetAccountKey = null;\r\n this.errorMessage = null;\r\n this.showTransferDetails = false;\r\n this.timeout = $timeout;\r\n\r\n this.store = $ngRedux;\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, { ...TransferActions, ...TableColumnsActions })(this);\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { transfer, tableColumns } = state;\r\n const { transferkeys, transferAssets = [], transferStatus } = transfer;\r\n const { columns, selected = [] } = tableColumns;\r\n\r\n return {\r\n transferAssetsList: transferAssets,\r\n accountsTransferkeys: transferkeys,\r\n columns,\r\n selected,\r\n transferStatus\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.resetTransfers();\r\n this.unsubscribe();\r\n }\r\n\r\n toggleFlyout() {\r\n this.showFlyout = !this.showFlyout;\r\n if (this.showFlyout) {\r\n const transferableCol = this.columns.transferrable;\r\n if (!this.selected.find(selectedCol => selectedCol.key === transferableCol.key)) {\r\n this.toggleColumn(transferableCol);\r\n }\r\n } else {\r\n this.resetPrevious();\r\n }\r\n }\r\n\r\n initiateTransfer() {\r\n this.resetPrevious();\r\n this.transferInitiated = true;\r\n this.timeout(() => {\r\n this.verifyTransfer = true;\r\n }, 200);\r\n }\r\n\r\n resetPrevious() {\r\n this.resetTransfers();\r\n }\r\n\r\n cancelTransfer() {\r\n this.transferInitiated = this.verifyTransfer = false;\r\n }\r\n\r\n confirmTransfer() {\r\n if (this.getNumberOfSelectedAssets() > 0 && this.targetAccountKey) {\r\n this.transferInitiated = this.verifyTransfer = false;\r\n this.initiateAssetTransfer(this.getSelectedAsset(), this.targetAccountKey);\r\n }\r\n }\r\n\r\n getSelectedAsset() {\r\n return this.assets.filter(asset => asset.selected && asset.selected === true);\r\n }\r\n\r\n getNumberOfSelectedAssets() {\r\n return this.assets.filter(asset => asset.selected && asset.selected === true).length;\r\n }\r\n\r\n showErrorMessage(id) {\r\n if (this.errorMessageId === id) {\r\n this.errorMessageId = null;\r\n } else {\r\n this.errorMessageId = id;\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n restrict: 'E',\r\n bindings: {\r\n assets: '<'\r\n },\r\n controller: TransferController,\r\n controllerAs: 'vm'\r\n};\r\n","export default function SearchableMultiselectComponent(gettextCatalog) {\r\n 'ngInject';\r\n return {\r\n template: require('./searchable-multi-select-dropdown.html'),\r\n restrict: 'AE',\r\n scope: {\r\n displayAttr: '@',\r\n selectedItems: '=',\r\n allItems: '=',\r\n readOnly: '=',\r\n addItem: '&',\r\n removeItem: '&',\r\n selectedItemChanged: '&'\r\n },\r\n link: function (scope, element, attrs) {\r\n element.bind('click', function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n scope.status = {\r\n isopen: false\r\n };\r\n\r\n scope.toggleDropdown = function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n $scope.status.isopen = !$scope.status.isopen;\r\n };\r\n\r\n scope.updateSelectedItems = function (obj) {\r\n var selectedObj;\r\n for (let i = 0; typeof scope.selectedItems !== 'undefined' && i < scope.selectedItems.length; i++) {\r\n if (scope.selectedItems[i][scope.displayAttr].toUpperCase() === obj[scope.displayAttr].toUpperCase()) {\r\n selectedObj = scope.selectedItems[i];\r\n break;\r\n }\r\n }\r\n if (typeof selectedObj === 'undefined') {\r\n scope.addItem({\r\n item: obj\r\n });\r\n } else {\r\n scope.removeItem({\r\n item: selectedObj\r\n });\r\n }\r\n };\r\n\r\n scope.isItemSelected = function (item) {\r\n if (typeof scope.selectedItems === 'undefined') return false;\r\n\r\n let tmpItem;\r\n for (let i = 0; i < scope.selectedItems.length; i++) {\r\n tmpItem = scope.selectedItems[i];\r\n if (typeof tmpItem !== 'undefined' &&\r\n typeof tmpItem[scope.displayAttr] !== 'undefined' &&\r\n typeof item[scope.displayAttr] !== 'undefined' &&\r\n tmpItem[scope.displayAttr].toUpperCase() === item[scope.displayAttr].toUpperCase()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n scope.commaDelimitedSelected = function () {\r\n var list = \"\";\r\n angular.forEach(scope.selectedItems, function (item, index) {\r\n list += item[scope.displayAttr];\r\n if (index < scope.selectedItems.length - 1) list += ', ';\r\n });\r\n return list.length ? list : gettextCatalog.getString(\"Nothing Selected\");\r\n };\r\n }\r\n };\r\n}","export default function AssetMultiPickerController(\r\n $rootScope,\r\n $scope,\r\n equipmentRepository,\r\n $uibModalInstance,\r\n selectedAssets,\r\n singleSelect,\r\n requiresSelection,\r\n maxSelection,\r\n gettextCatalog,\r\n prefilter,\r\n pickerSettings,\r\n $state,\r\n) {\r\n 'ngInject';\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n //INIT LOCAL VARIABLES\r\n selectedAssets = selectedAssets ? selectedAssets : {};\r\n $scope._selectedAssets = { ...selectedAssets };\r\n $scope.showSelected = false;\r\n $scope.allowConfirmAll = true;\r\n $scope.unavailableAssets = {};\r\n $scope.confirmAll = false;\r\n $scope.isDirty = false;\r\n $scope.filters = {};\r\n $scope.currentPage = 1;\r\n $scope.pages = [];\r\n $scope.limit = 15;\r\n $scope.maxSize = 1;\r\n $scope.firstPage = 'First';\r\n $scope.lastPage = 'Last';\r\n $scope.select = {};\r\n $scope.select.all = false;\r\n $scope.infoMessage = '';\r\n $scope.selectLimit = parseInt(maxSelection);\r\n $scope.filterCount = 0;\r\n $scope.prevFilterCount = 0;\r\n $scope.singleMode = singleSelect;\r\n //Pagination\r\n $scope.currentPageSelectedAssets = [];\r\n $scope.bigCurrentPage = 1;\r\n $scope.itemsPerPage = 15;\r\n\r\n $scope.facets = null;\r\n $scope.intialAssets = { ...selectedAssets };\r\n $scope.canSelectAll = pickerSettings.canSelectAll && $scope.selectLimit !== 1;\r\n $scope.onFacetsChanged = function () {\r\n refresh();\r\n };\r\n\r\n $scope.getSelectedAssets = function () {\r\n let assets = [];\r\n for (let key in $scope._selectedAssets) {\r\n if ($scope._selectedAssets.hasOwnProperty(key)) {\r\n assets.push(key);\r\n $scope.size++;\r\n }\r\n }\r\n return assets;\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n $scope.select.all = false;\r\n $scope.displayAssetsByPage();\r\n };\r\n\r\n $scope.showRequiredError = () =>\r\n requiresSelection && Object.keys($scope._selectedAssets).length === 0;\r\n\r\n $scope.displayAssetsByPage = function () {\r\n $scope.totalItems = $scope.numSelectedAssets();\r\n let begin = ($scope.bigCurrentPage - 1) * $scope.itemsPerPage;\r\n let end = begin + $scope.itemsPerPage;\r\n let arr = Object.keys($scope._selectedAssets).slice(begin, end);\r\n for (let i = 0; i < arr.length; i++) {\r\n if (arr[i] === 'undefined') {\r\n delete $scope._selectedAssets[arr[i]];\r\n }\r\n }\r\n return Object.keys($scope._selectedAssets).slice(begin, end);\r\n };\r\n\r\n let sinceForPage = function (page, limit) {\r\n return (page - 1) * limit;\r\n };\r\n\r\n let calculatePages = function () {\r\n $scope.pages = [];\r\n\r\n $scope.numPages = Math.ceil($scope.responseData.data.total / $scope.limit);\r\n //if the number of assets is lower then the limit, must be on the first page.\r\n if ($scope.responseData.data.cursor < $scope.limit) {\r\n $scope.currentPage = 1;\r\n }\r\n //always return a page higher if not equally divisible\r\n else $scope.currentPage = Math.ceil($scope.responseData.data.cursor / $scope.limit);\r\n\r\n let concurrentPages = 1;\r\n\r\n let cursor = $scope.currentPage - Math.ceil(concurrentPages / 2);\r\n\r\n if (cursor < 0) {\r\n cursor = 0;\r\n }\r\n\r\n $scope.showingLastPage = false;\r\n $scope.showingFirstPage = false;\r\n\r\n while ($scope.pages.length < concurrentPages) {\r\n if (cursor < $scope.numPages) {\r\n $scope.pages.push(cursor + 1);\r\n cursor++;\r\n\r\n if (cursor === 1) {\r\n $scope.showingFirstPage = true;\r\n }\r\n\r\n if (cursor === $scope.numPages) {\r\n $scope.showingLastPage = true;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const refresh = () => {\r\n $scope.select.all = false;\r\n $scope.infoMessage = '';\r\n\r\n if ($scope.loading) {\r\n $scope.isDirty = true;\r\n return;\r\n }\r\n $scope.loading = true;\r\n\r\n let options = {};\r\n options.limit = $scope.limit || 500;\r\n if ($scope.selectedPage) {\r\n options.since = sinceForPage($scope.selectedPage, $scope.limit);\r\n }\r\n\r\n equipmentRepository\r\n .getEquipmentSearch(\r\n $scope.queryString,\r\n options,\r\n $scope.filters,\r\n null,\r\n null,\r\n $scope.facets,\r\n $scope.tagFilters,\r\n null,\r\n null,\r\n prefilter,\r\n )\r\n .then(\r\n (response) => {\r\n $scope.responseData = response;\r\n\r\n $scope.assetsList = response.data.hits;\r\n\r\n calculatePages();\r\n $scope.select.all = $scope.isAllAssetSelected();\r\n $scope.error = null;\r\n },\r\n () => {\r\n $scope.error = gettextCatalog.getString('Error loading assets');\r\n },\r\n )\r\n .finally(() => {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n let deselectAsset = (asset) => {\r\n if (!asset) return;\r\n if ($scope.unavailableAssets[asset.id]) return;\r\n asset.selected = false;\r\n\r\n delete $scope._selectedAssets[asset.id];\r\n $scope.select.all = false;\r\n };\r\n\r\n $scope.selectAll = function () {\r\n if (!$scope.showSelected) {\r\n if ($scope.select.all) {\r\n for (let i = 0; i < $scope.responseData.data.hits.length; i++) {\r\n if ($scope.selectLimit > 0 && $scope.numSelectedAssets() >= $scope.selectLimit) {\r\n $scope.infoMessage =\r\n gettextCatalog.getString('Only ') +\r\n maxSelection +\r\n gettextCatalog.getString(' asset(s) can be selected at this time.');\r\n break;\r\n }\r\n $scope._selectedAssets[$scope.responseData.data.hits[i].id] =\r\n $scope.responseData.data.hits[i];\r\n }\r\n } else {\r\n $scope.responseData.data.hits.forEach((value, index) => {\r\n deselectAsset($scope.responseData.data.hits[index]);\r\n $scope.infoMessage = '';\r\n });\r\n }\r\n } else {\r\n $scope._selectedAssets = {};\r\n $scope.infoMessage = '';\r\n\r\n if ($scope.select.all) {\r\n $scope._selectedAssets = {};\r\n $scope.assetsList.forEach((asset) => {\r\n $scope._selectedAssets[asset.id] = asset;\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.isAllAssetSelected = () => {\r\n for (let i = 0; i < $scope.responseData.data.hits.length; i++) {\r\n let hasSelected = false;\r\n for (let key in $scope._selectedAssets) {\r\n if ($scope.responseData.data.hits[i].id === key) {\r\n hasSelected = true;\r\n break;\r\n }\r\n }\r\n if (!hasSelected) return false;\r\n }\r\n return true;\r\n };\r\n\r\n //WATCH FUNCTIONS\r\n $scope.$watch(\r\n 'filters',\r\n (newValue, oldValue) => {\r\n $scope.currentPage = 1;\r\n if (newValue !== oldValue) {\r\n refresh();\r\n }\r\n },\r\n true,\r\n );\r\n\r\n //PUBLIC METHODS\r\n $scope.selectPage = function (page) {\r\n $scope.select.all = false;\r\n $scope.selectedPage = page;\r\n refresh();\r\n };\r\n\r\n $scope.submitQuery = function () {\r\n $scope.selectedPage = 1;\r\n refresh();\r\n\r\n addToDataLayer({\r\n event: 'assetPickerAssetSearching',\r\n data: {\r\n keyword: $scope.queryString,\r\n page: $state.current.name,\r\n },\r\n });\r\n };\r\n\r\n $rootScope.selectAsset = function (asset) {\r\n if (!asset) return;\r\n if ($scope.unavailableAssets[asset.id]) return;\r\n if (!singleSelect) {\r\n if (!$scope._selectedAssets[asset.id]) {\r\n if (parseInt(maxSelection) === 0) {\r\n $scope._selectedAssets[asset.id] = asset;\r\n } else if ($scope.numSelectedAssets() >= parseInt(maxSelection)) {\r\n $scope.infoMessage =\r\n gettextCatalog.getString('Only ') +\r\n maxSelection +\r\n gettextCatalog.getString(' asset(s) can be selected at this time.');\r\n } else {\r\n $scope._selectedAssets[asset.id] = asset;\r\n if ($scope.numSelectedAssets() == parseInt(maxSelection)) {\r\n $scope.infoMessage =\r\n gettextCatalog.getString('Only ') +\r\n maxSelection +\r\n gettextCatalog.getString(' asset(s) can be selected at this time.');\r\n }\r\n }\r\n } else {\r\n deselectAsset(asset);\r\n if ($scope.numSelectedAssets() < parseInt(maxSelection)) {\r\n $scope.infoMessage = '';\r\n }\r\n }\r\n } else {\r\n if (!$scope._selectedAssets[asset.id]) {\r\n $scope._selectedAssets = {};\r\n $scope._selectedAssets[asset.id] = asset;\r\n } else {\r\n delete $scope._selectedAssets[asset.id];\r\n }\r\n }\r\n\r\n $scope.select.all = $scope.isAllAssetSelected();\r\n };\r\n\r\n $scope.isDisabled = function (asset) {\r\n if (maxSelection === 0) {\r\n return false;\r\n }\r\n return (\r\n $scope.numSelectedAssets() >= parseInt(maxSelection) && !$scope._selectedAssets[asset.id]\r\n );\r\n };\r\n\r\n $scope.removeAsset = function (asset) {\r\n if (!asset) return;\r\n\r\n deselectAsset(asset);\r\n };\r\n\r\n $scope.numSelectedAssets = function () {\r\n return Object.keys($scope._selectedAssets).length || 0;\r\n };\r\n\r\n $scope.clearSelected = () => {\r\n $scope._selectedAssets = {};\r\n };\r\n\r\n $scope.toggleShowSelected = () => {\r\n $scope.showSelected = !$scope.showSelected;\r\n\r\n if ($scope.showSelected) {\r\n $scope.select.all = true;\r\n $scope.assetsList = Object.values($scope._selectedAssets);\r\n return;\r\n }\r\n $scope.select.all = $scope.isAllAssetSelected();\r\n $scope.assetsList = $scope.responseData.data.hits;\r\n };\r\n\r\n $scope.calculateRemovedAssets = (currentAssets, previousAssets) =>\r\n Object.keys(previousAssets).reduce((arr, assetId) => {\r\n if (!currentAssets.hasOwnProperty(assetId)) {\r\n arr.push(assetId);\r\n }\r\n return arr;\r\n }, []);\r\n\r\n $scope.calculateAddedAssets = (currentAssets, previousAssets) =>\r\n Object.keys(currentAssets).reduce((arr, assetId) => {\r\n if (!previousAssets.hasOwnProperty(assetId)) {\r\n arr.push(assetId);\r\n }\r\n return arr;\r\n }, []);\r\n\r\n //BUTTON EVENTS\r\n $scope.confirm = function () {\r\n $scope.submit = true;\r\n if (!$scope.confirmedAll && $scope.showRequiredError()) {\r\n return;\r\n }\r\n\r\n const added = $scope.calculateAddedAssets($scope._selectedAssets, $scope.intialAssets);\r\n\r\n const removed = $scope.calculateRemovedAssets($scope._selectedAssets, $scope.intialAssets);\r\n\r\n $uibModalInstance.close({\r\n result: $scope._selectedAssets,\r\n added,\r\n removed,\r\n });\r\n };\r\n\r\n // Confirm ALL assets from the query\r\n $scope.confirmAll = () => {\r\n $scope.confirmedAll = true;\r\n $scope.loading = true;\r\n\r\n let elasticSearchMaxResults = 9999;\r\n\r\n if ($scope.responseData.data.total > elasticSearchMaxResults) {\r\n $scope.infoMessage =\r\n 'Note: We cannot currently export more than 10,000 units, we will fetch as many as we can. Try searching to narrow down the results.';\r\n }\r\n\r\n equipmentRepository\r\n .getAllEquipmentSearch(\r\n $scope.queryString,\r\n {},\r\n $scope.filters,\r\n null,\r\n null,\r\n $scope.facets,\r\n $scope.tagFilters,\r\n null,\r\n null,\r\n prefilter,\r\n )\r\n .then(\r\n (response) => {\r\n $scope.responseData = response;\r\n\r\n $scope._selectedAssets = response.data.hits.reduce((assets, asset) => {\r\n assets[asset.id] = asset;\r\n return assets;\r\n }, {});\r\n\r\n $scope.loading = false;\r\n $scope.confirm();\r\n },\r\n () => {\r\n $scope.infoMessage = '';\r\n $scope.error = gettextCatalog.getString('Error loading assets');\r\n },\r\n )\r\n .finally(() => {\r\n $scope.loading = false;\r\n $scope.infoMessage = '';\r\n });\r\n };\r\n\r\n $scope.cancel = () => {\r\n $uibModalInstance.close({\r\n result: selectedAssets,\r\n added: [],\r\n removed: [],\r\n });\r\n };\r\n\r\n $scope.$on('$locationChangeStart', (event) => {\r\n // Here you can take the control and call your own functions:\r\n\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n $scope.showFacets = () => {\r\n $scope.showingFacets = !$scope.showingFacets;\r\n };\r\n\r\n refresh();\r\n}\r\n","export default function AssetPickerController2(\r\n $scope,\r\n equipmentRepository\r\n) {\r\n 'ngInject';\r\n\r\n $scope.ok = function () {\r\n $uibModalInstance.close({\r\n yomomma: 'asdfasdf'\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.calculatePages = function () {\r\n $scope.pages = [];\r\n\r\n $scope.numPages = Math.ceil($scope.responseData.data.total / $scope.limit);\r\n\r\n //if the number of assets is lower then the limit, must be on the first page.\r\n if ($scope.responseData.data.cursor < $scope.limit) {\r\n $scope.currentPage = 1;\r\n } else\r\n //always return a page higher if not equally divisible\r\n $scope.currentPage = Math.ceil(\r\n $scope.responseData.data.cursor / $scope.limit\r\n );\r\n\r\n var concurrentPages = 3;\r\n\r\n var cursor = $scope.currentPage - Math.ceil(concurrentPages / 2);\r\n var addedPages = 0;\r\n\r\n if (cursor < 0) {\r\n cursor = 0;\r\n }\r\n\r\n $scope.showingLastPage = false;\r\n $scope.showingFirstPage = false;\r\n\r\n while ($scope.pages.length < concurrentPages) {\r\n if (cursor < $scope.numPages) {\r\n $scope.pages.push(cursor + 1);\r\n cursor++;\r\n\r\n if (cursor == 1) {\r\n $scope.showingFirstPage = true;\r\n }\r\n\r\n if (cursor == $scope.numPages) {\r\n $scope.showingLastPage = true;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n };\r\n\r\n $scope.selectPage = function (page) {\r\n $scope.selectedPage = page;\r\n $scope.search();\r\n };\r\n\r\n $scope.sinceForPage = function (page, limit) {\r\n return (page - 1) * limit;\r\n };\r\n\r\n $scope.search = function () {\r\n if ($scope.loading) {\r\n $scope.isDirty = true;\r\n return;\r\n }\r\n\r\n $scope.loading = true;\r\n $scope.isDirty = false;\r\n\r\n var queryString = '*';\r\n\r\n var options = {};\r\n options.limit = $scope.limit || 500;\r\n if ($scope.selectedPage) {\r\n options.since = $scope.sinceForPage($scope.selectedPage, $scope.limit);\r\n }\r\n\r\n equipmentRepository.getEquipmentSearch(queryString, options).then(\r\n function (response, status, headers) {\r\n $scope.responseData = response;\r\n $scope.loading = false;\r\n\r\n $scope.calculatePages();\r\n\r\n if ($scope.isDirty) {\r\n $scope.search();\r\n }\r\n },\r\n function (data) {\r\n $scope.responseData = data;\r\n $scope.loading = false;\r\n\r\n if ($scope.isDirty) {\r\n $scope.search();\r\n }\r\n }\r\n );\r\n };\r\n\r\n $scope.init = function () {\r\n $scope.search();\r\n };\r\n\r\n $scope.init();\r\n}","import Action from '../action';\r\n\r\nexport const NOTIFICATION_CHECK_SUPPORT = 'NOTIFICATION_CHECK_SUPPORT';\r\nexport const NOTIFICATION_DISMISS_TYPE = 'NOTIFICATION_DISMISS_TYPE';\r\n\r\nexport const checkBrowserSupportNotification = visible => Action(NOTIFICATION_CHECK_SUPPORT, visible);\r\nexport const dismissNotification = () => Action(NOTIFICATION_DISMISS_TYPE);\r\n","import * as NotificationActions from '../../state/notification/notification.action';\r\n\r\nclass BrowserUpdateBannerController {\r\n constructor(browser, $window, $state, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.$window = $window;\r\n this.$state = $state;\r\n this.store = $ngRedux;\r\n this.currentBrowser = browser;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, NotificationActions)(this);\r\n }\r\n\r\n $postLink() {\r\n this.checkSupport();\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n let { visible } = state.notification;\r\n return { visible };\r\n }\r\n\r\n checkSupport() {\r\n this.checkBrowserSupportNotification(!this.currentBrowser.supported);\r\n }\r\n\r\n dismiss() {\r\n this.dismissNotification();\r\n }\r\n browserPolicy() {\r\n this.$state.go('browser-policy');\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./browserUpdateBanner.html'),\r\n controller: BrowserUpdateBannerController,\r\n bindings: {},\r\n controllerAs: 'vm'\r\n};\r\n","const chrome = {\r\n\tname: 'Google Chrome',\r\n\ticon: 'fa-chrome',\r\n\turl: 'https://www.google.com/chrome/'\r\n};\r\n\r\nconst firefox = {\r\n\tname: 'Mozilla Firefox',\r\n\ticon: 'fa-firefox',\r\n\turl: 'https://www.mozilla.org/en-US/firefox/new/'\r\n};\r\n\r\nconst edge = {\r\n\tname: 'Microsoft Edge',\r\n\ticon: 'fa-edge',\r\n\turl: 'https://www.microsoft.com/en-ca/software-download/windows10'\r\n};\r\n\r\nconst getBrowserSupportList = browser => {\r\n\tconst browserList = [chrome, firefox];\r\n\r\n\tif (browser.osname === 'Windows' && browser.osversion === '10') {\r\n\t\tbrowserList.push(edge);\r\n\t}\r\n\r\n\treturn browserList;\r\n};\r\n\r\nclass BrowserLinksController {\r\n\tconstructor(browser, $window) {\r\n\t\t'ngInject';\r\n\r\n\t\tthis.$window = $window;\r\n\t\tthis.currentBrowser = browser;\r\n\t\tif (!browser.supported) this.newBrowsers = getBrowserSupportList(browser);\r\n\t}\r\n\r\n}\r\n\r\nexport default {\r\n\ttemplate: require('./browser-links.template.html'),\r\n\tcontroller: BrowserLinksController,\r\n\tbindings: {},\r\n\tcontrollerAs: 'vm'\r\n};\r\n","import template from './pagination.html';\r\n\r\nconst MAX_BUTTONS = 15;\r\nconst MIN_BUTTONS = 0;\r\nclass PaginationComponent {\r\n constructor($element, $scope) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.element = $element[0];\r\n this.widths = {\r\n self: 0,\r\n counts: 0,\r\n button: 0,\r\n };\r\n\r\n this.buttonAmount = MAX_BUTTONS;\r\n this.countHolder = this.element.getElementsByClassName('count-holder')[0];\r\n this.resizeObserver = new ResizeObserver(this.onResized.bind(this));\r\n }\r\n\r\n $onInit() {\r\n this.resizeObserver.observe(this.element);\r\n this.resizeObserver.observe(this.countHolder);\r\n }\r\n\r\n $onDestroy() {\r\n this.resizeObserver.disconnect;\r\n }\r\n\r\n onResized(entries) {\r\n if (!this.widths.button)\r\n this.widths.button = this.element.getElementsByTagName('li')[0].clientWidth;\r\n\r\n entries.forEach((entry) => {\r\n if (entry.target === this.element) this.widths.self = entry.contentRect.width;\r\n else if (entry.target === this.countHolder) this.widths.counts = entry.contentRect.width;\r\n });\r\n\r\n const width = this.widths.self - this.widths.counts - this.widths.button * 4;\r\n let buttonAmount = Math.max(\r\n Math.min(Math.floor(width / this.widths.button), MAX_BUTTONS),\r\n MIN_BUTTONS,\r\n );\r\n\r\n if (this.buttonAmount !== buttonAmount) {\r\n this.$scope.$apply(() => {\r\n this.buttonAmount = buttonAmount;\r\n });\r\n }\r\n }\r\n\r\n onPageChange() {\r\n this.onChange(this.currentPage);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: PaginationComponent,\r\n controllerAs: 'pagination',\r\n bindings: {\r\n total: '<',\r\n currentPage: '<',\r\n itemsPerPage: '<',\r\n onChange: '<',\r\n },\r\n};\r\n","import * as SearchActions from '../../state/search/search.action';\r\n\r\nimport template from './alerts-btn-group.template.html';\r\n\r\nexport class AlertsBtnGroupController {\r\n constructor($ngRedux) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { alerts } = state.search;\r\n return { alerts };\r\n }\r\n\r\n updateAlertFacet(option) {\r\n if (option._selected) {\r\n this.selectFacet(SearchActions.ALERTS_FACET_TYPE, option);\r\n } else {\r\n this.deselectFacet(SearchActions.ALERTS_FACET_TYPE, option);\r\n }\r\n }\r\n}\r\n\r\nexport const AlertsBtnGroupComponent = {\r\n template,\r\n bindings: {},\r\n controller: 'AlertsBtnGroupController as vm'\r\n};\r\n","import * as SearchActions from '../../state/search/search.action';\r\n\r\nimport template from './maintenance-btn-group.template.html';\r\n\r\nexport class MaintenanceBtnGroupController {\r\n constructor($ngRedux) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const {maintenance} = state.search;\r\n return {maintenance};\r\n }\r\n\r\n updateMaintenanceFacet(status) {\r\n if (status._selected) {\r\n this.selectFacet(SearchActions.MAINTENANCE_STATUS_FACET_TYPE, status);\r\n } else {\r\n this.deselectFacet(SearchActions.MAINTENANCE_STATUS_FACET_TYPE, status);\r\n }\r\n }\r\n}\r\n\r\nexport const MaintenanceBtnGroupComponent = {\r\n template,\r\n bindings: {},\r\n controller: 'MaintenanceBtnGroupController as vm'\r\n};\r\n","import template from './modal.template.html';\r\nimport DebouncedToggle from '../debounced-toggle';\r\n\r\nexport class ModalController extends DebouncedToggle {\r\n\tconstructor($timeout) {\r\n\t\t'ngInject';\r\n\r\n\t\tsuper($timeout);\r\n\t}\r\n\r\n\t$onInit() {}\r\n\r\n\tcloseModal() {\r\n\t\tthis._debounceToggle()\r\n\t\t\t.then(() => {\r\n\t\t\t\tthis.onClose();\r\n\t\t\t})\r\n\t\t\t.catch(this._ignore);\r\n\t}\r\n}\r\n\r\nexport const ModalComponent = {\r\n\ttemplate,\r\n\tbindings: {\r\n\t\tshowModal: '<',\r\n\t\tonClose: '&?'\r\n\t},\r\n\ttransclude: true,\r\n\tcontroller: 'ModalController as vm'\r\n};\r\n","import template from './tool-tip.template.html';\r\nimport DebouncedToggle from '../debounced-toggle';\r\n\r\nexport class ToolTipController extends DebouncedToggle {\r\n\tconstructor($timeout) {\r\n\t\t'ngInject';\r\n\t\tsuper($timeout);\r\n\t\tthis.toggleHelp = false;\r\n\t}\r\n\r\n\t$onInit() {}\r\n\r\n\t// toggleInstructions() {\r\n\t// \tthis.toggleHelp = !this.toggleHelp;\r\n\t// }\r\n\r\n\t// closeTip() {\r\n\t// \tthis._debounceToggle()\r\n\t// \t\t.then(() => {\r\n\t// \t\t\tthis.toggleHelp = false;\r\n\t// \t\t})\r\n\t// \t\t.catch(this._ignore);\r\n\t// }\r\n}\r\n\r\nexport const ToolTipComponent = {\r\n\ttemplate,\r\n\tcontroller: ToolTipController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\thelpContent: '<',\r\n\t\tposition: '<'\r\n\t}\r\n};\r\n","import template from './ztr-date-picker.html';\r\nimport moment from 'moment';\r\n\r\nclass ZTRDatePickerController {\r\n constructor($timeout) {\r\n 'ngInject';\r\n this.datepickerOptions = {};\r\n this.$timeout = $timeout;\r\n }\r\n\r\n $onInit() {\r\n this.setDatepickerOptions();\r\n this.onPickerOpen();\r\n this.validateInputs();\r\n }\r\n\r\n $onChanges() {\r\n this.onPickerOpen();\r\n this.setDatepickerOptions();\r\n this.validateInputs();\r\n }\r\n\r\n toggleOpen() {\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n onPickerOpen() {\r\n if (this.isOpen && typeof this.onOpen === 'function') {\r\n this.onOpen();\r\n }\r\n }\r\n onDateChange() {\r\n //$timeout is important to delay onchang one cycle so ng-model will be updateed in the parent scope.\r\n this.$timeout(() => {\r\n if (typeof this.onChange === 'function') {\r\n this.onChange();\r\n }\r\n });\r\n }\r\n\r\n setDatepickerOptions() {\r\n this.inputName = this.inputName || 'datepicker';\r\n this.datepickerOptions = this.datepickerOptions || {};\r\n this.datepickerOptions = {\r\n ...this.datepickerOptions,\r\n maxDate: (this.maxDate ? moment(this.maxDate).toDate() : this.datepickerOptions.maxDate) || null,\r\n minDate: (this.minDate ? moment(this.minDate).toDate() : this.datepickerOptions.minDate) || null\r\n };\r\n }\r\n\r\n validateInputs() {\r\n /* eslint-disable no-console */\r\n if (this.onOpen && typeof this.onOpen !== 'function') {\r\n console.warn(`ztr-date-picker: on-open (${this.onOpen}) is not a function for ${this.inputName}`);\r\n }\r\n if (this.onChange && typeof this.onChange !== 'function') {\r\n console.warn(`ztr-date-picker: on-change (${this.onChange}) is not a function for ${this.inputName}`);\r\n }\r\n if (this.selectedDate && !moment(this.selectedDate).isValid()) {\r\n console.warn(`ztr-date-picker: ng-model (${this.selectedDate}) is not a valid date for ${this.inputName}`);\r\n }\r\n if (this.minDate && !moment(this.minDate).isValid()) {\r\n console.warn(`ztr-date-picker: min-date (${this.minDate}) is not a valid date for ${this.inputName}`);\r\n }\r\n if (this.maxDate && !moment(this.maxDate).isValid()) {\r\n console.warn(`ztr-date-picker: max-date (${this.maxDate}) is not a valid date for ${this.inputName}`);\r\n }\r\n /* eslint-enable no-console */\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n bindings: {\r\n selectedDate: '=ngModel',\r\n isOpen: '=isOpen',\r\n isRequired: ' [code.cca2, code.name]).reduce((o, k) => ((o[k] = k), o), {});\r\nexport const zoneByCCA2 = _.groupBy(zones, 'cca2');\r\n","import {countryByCCA2, zones} from './data';\r\nimport template from './timezone-selector.html';\r\n\r\nclass TimezoneSelector {\r\n constructor(gettextCatalog) {\r\n 'ngInject';\r\n\r\n this.zones = zones;\r\n this.translations = {placeholder: gettextCatalog.getString('Select a timezone')};\r\n }\r\n\r\n getCCA2Label(zone) {\r\n return countryByCCA2[zone.cca2];\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n bindings: {\r\n ngModel: '='\r\n },\r\n controller: TimezoneSelector,\r\n controllerAs: 'ctrl'\r\n};\r\n","import template from './last-seen-filter.html';\r\nimport * as LastSeenModels from './last-seen-filter.models';\r\n\r\nclass LastSeenFilterController {\r\n constructor() {\r\n 'ngInject';\r\n this.open = false;\r\n this.minRange = null;\r\n this.maxRange = null;\r\n this.options = LastSeenModels.LastSeenOptions;\r\n }\r\n\r\n $onInit() {}\r\n $onDestroy() {}\r\n $onChanges() {\r\n const {range} = this.selected || {};\r\n const {min, max} = range || {};\r\n this.minRange = min;\r\n this.maxRange = max;\r\n }\r\n\r\n toggleOpen() {\r\n this.open = !this.open;\r\n }\r\n close() {\r\n this.open = false;\r\n }\r\n\r\n toggleOptionSelection(option) {\r\n //clear the option if its been selected\r\n if (this.selected && option && this.selected.id === option.id) {\r\n this.onSelectionUpdated(null);\r\n } else {\r\n this.onSelectionUpdated({option});\r\n }\r\n this.close();\r\n }\r\n\r\n isValidRange() {\r\n const diff = this.maxRange - this.minRange;\r\n return this.maxRange && this.maxRange < 1000 && diff > 0;\r\n }\r\n\r\n applyCustomRange() {\r\n if (this.isValidRange()) {\r\n const min = this.minRange ? Number(this.minRange) : null;\r\n const max = this.maxRange ? Number(this.maxRange) : null;\r\n const option = LastSeenModels.getLastSeenOptionByMinMax(min, max);\r\n this.onSelectionUpdated({option});\r\n }\r\n this.close();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: LastSeenFilterController,\r\n controllerAs: 'lsfVm',\r\n bindings: {\r\n selected: '<',\r\n onSelectionUpdated: '&'\r\n }\r\n};\r\n","import DebouncedToggle from '../debounced-toggle';\r\nimport * as SearchActions from '../../state/search/search.action';\r\n\r\nimport template from './communicated-at-filter.html';\r\n\r\nexport class CommunicatedFilterController extends DebouncedToggle {\r\n constructor($timeout) {\r\n 'ngInject';\r\n super($timeout);\r\n this.openCommunicated = this.openNotCommunicated = false;\r\n }\r\n\r\n $onInit() {}\r\n\r\n $onDestroy() {}\r\n\r\n get communicated() {\r\n return this.options.filter(option => option.group === 'Communicated');\r\n }\r\n\r\n get notCommunicated() {\r\n return this.options.filter(option => option.group === 'Not Communicated');\r\n }\r\n\r\n get selected() {\r\n const selectedOption = this.options.find(option => option._selected);\r\n const communicated = selectedOption && selectedOption.group === 'Communicated' ? selectedOption : null;\r\n const notCommunicated = selectedOption && selectedOption.group === 'Not Communicated' ? selectedOption : null;\r\n return {\r\n communicated,\r\n notCommunicated\r\n };\r\n }\r\n\r\n toggleCommunicatedAtOption(option) {\r\n option._selected = !option._selected;\r\n if (option._selected) {\r\n this.onSelect({option});\r\n } else {\r\n this.onDeselect({option});\r\n }\r\n\r\n this.openCommunicated = this.openNotCommunicated = false;\r\n }\r\n\r\n //click event handler to open the dropdown\r\n toggleCommunicated() {\r\n this.openCommunicated = true;\r\n }\r\n\r\n hideCommunicated() {\r\n this._debounceToggle()\r\n .then(() => (this.openCommunicated = false))\r\n .catch(this._ignore);\r\n }\r\n\r\n //click event handler to open the dropdown\r\n toggleNotCommunicated() {\r\n this.openNotCommunicated = true;\r\n }\r\n\r\n hideNotCommunicated() {\r\n this._debounceToggle()\r\n .then(() => (this.openNotCommunicated = false))\r\n .catch(this._ignore);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: CommunicatedFilterController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n options: '<',\r\n onSelect: '&',\r\n onDeselect: '&'\r\n }\r\n};\r\n","import angular from 'angular';\r\n\r\n// Imported Modules\r\nimport componentsButtonModule from './buttons/buttons.module';\r\nimport assetListModule from './asset-list/asset-list.module';\r\nimport assetSearchModule from './asset-search/asset-search.module';\r\nimport tableColumnSelectorModule from './table-column-selector/table-column-selector.module';\r\nimport SignoutComponent from './sign-out.component';\r\nimport ResolvableGeoLocationComponent from './resolvable-geo-location/resolvable-geo-location.component';\r\n\r\nimport AutoCompleteDirective from './auto-complete/autoComplete';\r\nimport MultiEmailsComponent from './multi-emails/multi-emails';\r\nimport ProgressBarComponent from './progress-bar/progress-bar';\r\nimport ResponseMessageDirective from './response-message/response-message';\r\nimport SearchBarDirective from './search-bar/search-bar';\r\nimport SearchableDropdownComponent from './searchable-dropdown/searchable-dropdown';\r\nimport SimpleTagsComponent from './simple-tags/simple-tags';\r\nimport SparkLineComponent from './spark-line/spark-line';\r\nimport StatusBarComponent from './status-bar/status-bar';\r\nimport TimeProgressBarComponent from './time-progress-bar/time-progress-bar';\r\nimport TransferComponent from './asset-list/transfer.component';\r\n\r\n// New imports from Directives folder\r\nimport EquipmentStatusComponent from './equipment-status/equipment-status';\r\nimport TagUrlComponent from './tag-url/tag-url';\r\nimport FieldsRequiredComponent from './fields-required/fields-required';\r\nimport LoadingIndicatorComponent from './loading-indicator/loading-indicator';\r\nimport ModalDialogComponent from './modal-dialog/modal-dialog';\r\nimport SearchableMultiselectComponent from './searchable-multi-select-dropdown/searchable-multi-select-dropdown';\r\nimport TopModuleNavComponent from './top_nav/top.nav';\r\nimport AssetMultiPickerController from './assetpicker/asset.multi.picker.controller';\r\nimport AssetPickerController2 from './assetpicker/asset.picker.controller';\r\n\r\nimport BrowserUpdateBanner from './browser-update-banner/browserUpdateBanner.component';\r\nimport BrowserLinks from './browser-links/browser-links.component';\r\n\r\nimport PaginationComponent from './pagination/pagination.component';\r\n\r\n// Import filters from app.module\r\nimport MiliSecondsFormatFilter from './time-progress-bar/filters/milisecondsFormat.filter';\r\nimport {\r\n AlertsBtnGroupComponent,\r\n AlertsBtnGroupController,\r\n} from './alerts-btn-group/alerts-btn-group.component';\r\nimport {\r\n MaintenanceBtnGroupComponent,\r\n MaintenanceBtnGroupController,\r\n} from './maintenance-btn-group/maintenance-btn-group.component';\r\nimport { ModalComponent, ModalController } from './modal/modal.component';\r\nimport { ToolTipComponent, ToolTipController } from './tool-tip/tool-tip.component';\r\nimport ZTRDatePickerComponent from './ztr-date-picker/ztr-date-picker.component';\r\nimport StepsComponent from './steps/steps.component';\r\nimport timezoneSelector from './timezone-selector/timezone-selector';\r\nimport lastSeenFilterComponent from './last-seen-filter/last-seen-filter.component';\r\nimport CommunicatedAtFilterComponent from './communicated-at-filter/communicated-at-filter.component';\r\n\r\nconst componentsModule = angular.module('app.components', [\r\n // INTERNAL\r\n componentsButtonModule,\r\n assetListModule,\r\n assetSearchModule,\r\n tableColumnSelectorModule,\r\n\r\n // EXTERNAL\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext',\r\n]);\r\n\r\ncomponentsModule\r\n // Controllers\r\n .controller('AlertsBtnGroupController', AlertsBtnGroupController)\r\n .controller('MaintenanceBtnGroupController', MaintenanceBtnGroupController)\r\n .controller('ModalController', ModalController)\r\n .controller('ToolTipController', ToolTipController)\r\n\r\n // Directives\r\n .directive('autoComplete', AutoCompleteDirective)\r\n .directive('responseMessage', ResponseMessageDirective)\r\n .directive('searchBar', SearchBarDirective)\r\n .directive('simpleTags', SimpleTagsComponent)\r\n\r\n // Components\r\n .component('multiEmails', MultiEmailsComponent)\r\n .component('ztrProgressBar', ProgressBarComponent)\r\n .component('searchableDropdown', SearchableDropdownComponent)\r\n .component('sparkLine', SparkLineComponent)\r\n .component('ztrStatusBar', StatusBarComponent)\r\n .component('timeProgressBar', TimeProgressBarComponent)\r\n .component('alertsBtnGroup', AlertsBtnGroupComponent)\r\n .component('maintenanceBtnGroup', MaintenanceBtnGroupComponent)\r\n .component('modal', ModalComponent)\r\n .component('ztrToolTip', ToolTipComponent)\r\n .component('assetTransfer', TransferComponent)\r\n .component('signout', SignoutComponent)\r\n .component('resolvableLocation', ResolvableGeoLocationComponent)\r\n .component('stepsComponent', StepsComponent)\r\n\r\n .controller('AssetMultiPickerController', AssetMultiPickerController)\r\n .controller('AssetPickerController2', AssetPickerController2)\r\n .component('browserUpdateBanner', BrowserUpdateBanner)\r\n .component('browserLinks', BrowserLinks)\r\n .component('ztrDatePicker', ZTRDatePickerComponent)\r\n .component('timezoneSelector', timezoneSelector)\r\n .component('lastSeenFilter', lastSeenFilterComponent)\r\n .component('communicatedAtFilter', CommunicatedAtFilterComponent)\r\n .component('zPagination', PaginationComponent)\r\n\r\n // Directives moved from directives folder\r\n .directive('equipmentStatus', EquipmentStatusComponent)\r\n .directive('tagUrl', TagUrlComponent)\r\n .directive('fieldsRequired', FieldsRequiredComponent)\r\n .directive('loadingIndicator', LoadingIndicatorComponent)\r\n .directive('modalDialog', ModalDialogComponent)\r\n .directive('searchableMultiselect', SearchableMultiselectComponent)\r\n .directive('topModuleNav', TopModuleNavComponent)\r\n\r\n // Filters\r\n .filter('millisecondsFormat', MiliSecondsFormatFilter);\r\nexport default componentsModule.name;\r\n","\r\nexport default function ResponseMessageDirective() {\r\n 'ngInject'; \r\n return {\r\n template: require('./response-message.html'),\r\n restrict: 'E',\r\n transclude: true,\r\n scope: {\r\n /*\r\n \"Reason\" values to determine style of alert:\r\n 'E' - 'error', should be used if we get an error back from an api call\r\n 'M' - 'message', should be used in cases where result isn't an error but might be unexpected eg. if result of a search query is empty\r\n 'S' - 'success', should be used for successful form submissions, property edits, etc.\r\n */\r\n reason: '='\r\n }\r\n };\r\n}\r\n","\r\nexport default function SearchBarDirective() {\r\n 'ngInject';\r\n return {\r\n template: require(\"./search-bar.html\"),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n enabled: '=',\r\n loading: '=',\r\n placeholder: '@',\r\n onClickButton: '&',\r\n onClickFiltersButton: '&',\r\n ngModel: '=',\r\n ngChange: '=',\r\n showFilters: '=',\r\n showingFilters: '=',\r\n filterCount: '=',\r\n }\r\n };\r\n}\r\n","export default function SimpleTagsComponent() {\r\n return {\r\n require: 'ngModel',\r\n template: require('./simple-tags.html'),\r\n restrict: 'E',\r\n scope: {\r\n ngModel: '=',\r\n name: '='\r\n },\r\n controller: SimpleTagsController\r\n };\r\n\r\n\r\n function SimpleTagsController($scope) {\r\n 'ngInject';\r\n var generateEmails = function () {\r\n if ($scope.ngModel) {\r\n $scope.emailsModel = [];\r\n\r\n angular.forEach($scope.ngModel, function (value) {\r\n\r\n $scope.emailsModel.push({\r\n \"text\": value\r\n });\r\n\r\n });\r\n\r\n } else {\r\n $scope.emailsModel = [];\r\n }\r\n };\r\n\r\n var hasUpdated = false;\r\n\r\n $scope.$watch('ngModel', function (val) {\r\n if (val && !hasUpdated) {\r\n generateEmails();\r\n hasUpdated = true;\r\n }\r\n });\r\n\r\n $scope.updateTags = function () {\r\n\r\n var result = [];\r\n angular.forEach($scope.emailsModel, function (value) {\r\n\r\n result.push(value.text);\r\n\r\n });\r\n\r\n $scope.ngModel = result;\r\n };\r\n }\r\n}","export default function EquipmentStatusComponent() {\r\n 'ngInject';\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n equipment: '=',\r\n pullRight: '='\r\n },\r\n template: require('./equipment-status.html')\r\n };\r\n}\r\n","\r\nexport default function TagUrlComponent() {\r\n 'ngInject';\r\n return {\r\n restrict: 'E',\r\n template: require('./tag-url.html'),\r\n scope: {},\r\n bindToController: {\r\n protocol: '@',\r\n url: '@',\r\n text: '@'\r\n },\r\n controllerAs: 'vm',\r\n controller: function () {\r\n this.hyperlink = this.protocol + \"://\" + this.url;\r\n }\r\n };\r\n}\r\n","export default function FieldsRequiredComponent() {\r\n\t'ngInject';\r\n\treturn {\r\n\t\ttemplate: require('./fields-required.html'),\r\n\t\trestrict: 'E',\r\n\t\ttransclude: true,\r\n\t\tscope: false\r\n\t};\r\n}\r\n","export default function LoadingIndicatorComponent() {\r\n\t'ngInject';\r\n\treturn {\r\n\t\trestrict: 'E',\r\n\t\tscope: {\r\n\t\t\tloading: '<'\r\n\t\t},\r\n\t\ttemplate: require('./loading-indicator.html')\r\n\t};\r\n}\r\n","\r\nexport default function ModalDialogComponent() {\r\n 'ngInject';\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n show: '='\r\n },\r\n replace: true, // Replace with the template below\r\n transclude: true, // we want to insert custom content inside the directive\r\n link: function (scope, element, attrs) {\r\n scope.dialogStyle = {};\r\n if (attrs.width)\r\n scope.dialogStyle.width = attrs.width;\r\n if (attrs.height)\r\n scope.dialogStyle.height = attrs.height;\r\n\r\n scope.hideModal = function () {\r\n scope.show = false;\r\n };\r\n },\r\n template: require('./modal-dialog.html')\r\n };\r\n}\r\n","export default function TopModuleNavComponent() {\r\n\t'ngInject';\r\n\treturn {\r\n\t\trestrict: 'E',\r\n\t\ttemplate: require('./top.nav.html'),\r\n\t\tscope: {\r\n\t\t\tmodule: '='\r\n\t\t}\r\n\t};\r\n}\r\n","// MiliSecondsFormatFilter\r\nexport default function MiliSecondsFormatFilter() {\r\n return function(ms) {\r\n if (!isNaN(ms)) {\r\n const msInHour = 3600000;\r\n const msInMinute = 60000;\r\n const msInSecond = 1000;\r\n //need to put logic for adding 0 infront somewhere else\r\n //millisecond conversion needs to be done somewhere else\r\n\r\n let hours = Math.floor(ms / msInHour);\r\n hours = hours > 9 ? hours : '0' + hours;\r\n let minutes = Math.floor((ms % msInHour) / msInMinute);\r\n minutes = minutes > 9 ? minutes : '0' + minutes;\r\n let seconds = Math.floor(((ms % msInHour) % msInMinute) / msInSecond);\r\n seconds = seconds > 9 ? seconds : '0' + seconds;\r\n return hours + 'h ' + minutes + 'm ' + seconds + 's ';\r\n }\r\n };\r\n}\r\n","import 'moment';\r\nexport const MILLISECONDS_IN_A_MINUTE = 60000;\r\nexport const MILLISECONDS_IN_A_DAY = 86400000;\r\n\r\nexport default function DateUtilService() {\r\n\r\n this.dateFallsWithinDaysPriorFromToday = dateFallsWithinDaysPriorFromToday;\r\n this.isDateBetween = isDateBetween;\r\n this.dateMinusDays = dateMinusDays;\r\n this.daysInRange = daysInRange;\r\n this.isValidMinDateRange = isValidMinDateRange;\r\n this.setDateFormatByLanguage = setDateFormatByLanguage;\r\n\r\n var millisecondsInOneDay = 86400000;\r\n this.greaterThanToday = greaterThanToday;\r\n this.daysInRange = daysInRange;\r\n\r\n function dateFallsWithinDaysPriorFromToday(numDays, dateToCheck) {\r\n var today = new moment();\r\n var startOfRange = dateMinusDays(numDays, today);\r\n\r\n return isDateBetween(moment(dateToCheck), moment(startOfRange), today);\r\n }\r\n\r\n function isDateBetween(isBetweenDate, startOfRange, endOfRange) {\r\n startOfRange.startOf('day');\r\n endOfRange.endOf('day');\r\n var inclusivity = '[]'; // inclusive\r\n return isBetweenDate.isBetween(startOfRange, endOfRange, null, inclusivity);\r\n }\r\n\r\n function daysInMilliseconds(numDays) {\r\n return numDays * MILLISECONDS_IN_A_DAY;\r\n }\r\n\r\n function dateMinusDays(numDays, date) {\r\n\r\n var milliseconds = daysInMilliseconds(numDays);\r\n return moment(moment(date) - milliseconds).toDate();\r\n }\r\n\r\n function greaterThanToday(date) {\r\n if (date) {\r\n date = new Date(date);\r\n return date.getTime() > new Date().getTime();\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n function daysInRange(dateStart, dateEnd) {\r\n if (dateEnd && dateStart) {\r\n return (dateEnd - dateStart) / MILLISECONDS_IN_A_DAY;\r\n }\r\n }\r\n\r\n function isValidMinDateRange(fromDate, toDate, maxDays) {\r\n var from = new Date(fromDate);\r\n var to = new Date(toDate);\r\n var timeDiff = Math.abs(from.getTime() - to.getTime());\r\n var dayDiff = Math.ceil(timeDiff / (1000 * 3600 * 24));\r\n if (dayDiff >= maxDays)\r\n return false;\r\n return true;\r\n };\r\n\r\n function setDateFormatByLanguage(lang) {\r\n if (lang === 'en')\r\n return 'MM/dd/yy';\r\n else if (lang === 'de')\r\n return 'dd-MM-yyyy';\r\n else if (lang === 'fr')\r\n return 'dd/MM/yyyy';\r\n }\r\n\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport default function ObjectUtilService() {\r\n this.mergeInto = mergeInto;\r\n\r\n function mergeInto(from, into) {\r\n _.forOwn(from, function (value, key) {\r\n var exists = into.hasOwnProperty(key);\r\n if (!exists) {\r\n into[key] = value;\r\n }\r\n });\r\n\r\n return into;\r\n }\r\n}\r\n\r\nexport const lowerCaseKeysObject = (obj = {}) =>\r\n Object.keys(obj).reduce((newObj, key) => {\r\n newObj[key.toLowerCase()] = obj[key];\r\n return newObj;\r\n }, {});\r\n","import angular from 'angular';\r\nimport ArrayUtilService from './array.util.service';\r\nimport DateUtilService from './date.util.service';\r\nimport ObjectUtilService from './object.util.service';\r\nimport UrlUtilService from './url.util.service';\r\n\r\nconst utilModule = angular.module('app.util', ['appSettingsModule']);\r\n\r\nutilModule\r\n .service('arrayUtil', ArrayUtilService)\r\n .service('dateUtil', DateUtilService)\r\n .service('objectUtil', ObjectUtilService)\r\n .service('urlUtil', UrlUtilService);\r\n\r\nexport default utilModule.name;\r\n","\r\nexport default function ArrayUtilService() {\r\n this.swapItems = swapItems;\r\n this.toTop = toTop;\r\n this.toBottom = toBottom;\r\n this.remove = remove;\r\n this.removeItems = removeItems;\r\n this.findValueByProperty = findValueByProperty;\r\n\r\n function swapItems(arr, a, b) {\r\n if ((a >= 0 && a < arr.length) && (b >= 0 && b < arr.length)) {\r\n var temp = arr[b];\r\n arr[b] = arr[a];\r\n arr[a] = temp;\r\n }\r\n }\r\n\r\n function toTop(arr, index) {\r\n var item = arr[index];\r\n arr.splice(index, 1);\r\n arr.splice(0, 0, item);\r\n }\r\n\r\n function toBottom(arr, index) {\r\n var item = arr[index];\r\n arr.splice(index, 1);\r\n arr.splice(arr.length, 0, item);\r\n }\r\n\r\n function remove(arr, index) {\r\n if (index >= 0 && index < arr.length) {\r\n arr.splice(index, 1);\r\n\r\n return arr;\r\n }\r\n }\r\n\r\n function removeItems(arrA, items) {\r\n return _.filter(arrA, function (a_ele) {\r\n return !_.findWhere(items, a_ele);\r\n });\r\n }\r\n\r\n function findValueByProperty(arr, prop, value) {\r\n return _.some(arr, function (ele) {\r\n return ele[prop] === value;\r\n });\r\n }\r\n}\r\n","export default function UrlUtilService() {\r\n function appendDefaultProtocol(hyperlink) {\r\n if (hyperlink.indexOf('://') === -1) {\r\n return 'https://' + hyperlink;\r\n }\r\n return hyperlink;\r\n }\r\n\r\n function toRangeParam(start, end) {\r\n var startDateFormat = start.toISOString();\r\n var endDateFormat = end.toISOString();\r\n\r\n return startDateFormat + '/' + endDateFormat;\r\n }\r\n\r\n return {\r\n appendDefaultProtocol: appendDefaultProtocol,\r\n toRangeParam: toRangeParam,\r\n };\r\n}\r\n","export default function AutofocusDirective($timeout) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tlink: function($scope, $element) {\r\n\t\t\t$timeout(function() {\r\n\t\t\t\t$element[0].focus();\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\t};\r\n}\r\n","export default function ChildElementBlurDirective($parse, $timeout) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tcompile: function($element, attrs) {\r\n\t\t\tvar fn = $parse(attrs.childElementBlur);\r\n\t\t\tvar leftFlag = false;\r\n\t\t\treturn function handler(scope, element) {\r\n\t\t\t\telement.on('focusout', function(event) {\r\n\t\t\t\t\tleftFlag = true;\r\n\t\t\t\t\t$timeout(function() {\r\n\t\t\t\t\t\tscope.$apply(function() {\r\n\t\t\t\t\t\t\tif (leftFlag) {\r\n\t\t\t\t\t\t\t\tfn(scope, { $event: event });\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}, 1);\r\n\t\t\t\t});\r\n\t\t\t\telement.on('focusin', function(event) {\r\n\t\t\t\t\tleftFlag = false;\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n}\r\n","export default function ConfirmOnExitDirective(gettextCatalog) {\r\n\t'ngInject';\r\n\r\n\treturn function($scope, elem, attrs) {\r\n\t\tif (elem[0].nodeName === 'FORM') {\r\n\t\t\twindow.onbeforeunload = function() {\r\n\t\t\t\tif (\r\n\t\t\t\t\tangular.element(elem[0]).hasClass('ng-dirty') &&\r\n\t\t\t\t\t!angular.element(elem[0]).hasClass('ng-submitted')\r\n\t\t\t\t) {\r\n\t\t\t\t\treturn gettextCatalog.getString(\r\n\t\t\t\t\t\t'You have unsaved changes. Are you sure you want to leave the page?'\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t$scope.$on('$stateChangeStart', function(event, next, current) {\r\n\t\t\t\tif (!event.defaultPrevented) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tangular.element(elem[0]).hasClass('ng-dirty') &&\r\n\t\t\t\t\t\t!angular.element(elem[0]).hasClass('ng-submitted')\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!confirm(\r\n\t\t\t\t\t\t\t\tgettextCatalog.getString(\r\n\t\t\t\t\t\t\t\t\t'You have unsaved changes. Are you sure you want to leave the page?'\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function DateGreaterThanDirective($filter, utilitySevice) {\r\n 'ngInject';\r\n\r\n return {\r\n require: 'ngModel',\r\n link(scope, elm, attrs, ctrl) {\r\n const validateDateRange = function (inputValue) {\r\n const fromDate = $filter('date')(attrs.dateGreaterThan, 'short');\r\n const toDate = $filter('date')(inputValue, 'short');\r\n const isValid = utilitySevice.isValidDateRange(fromDate, toDate);\r\n ctrl.$setValidity('dateGreaterThan', isValid);\r\n return inputValue;\r\n };\r\n\r\n scope.$watch(attrs.ngModel, (newValue) => {\r\n validateDateRange(newValue);\r\n });\r\n },\r\n };\r\n}\r\n","export default function DateLowerThanDirective($filter, utilitySevice) {\r\n 'ngInject';\r\n\r\n return {\r\n require: 'ngModel',\r\n link(scope, elm, attrs, ctrl) {\r\n const validateDateRange = function (inputValue) {\r\n const fromDate = $filter('date')(inputValue, 'short');\r\n const toDate = $filter('date')(attrs.dateLowerThan, 'short');\r\n const isValid = utilitySevice.isValidDateRange(fromDate, toDate);\r\n ctrl.$setValidity('dateLowerThan', isValid);\r\n return inputValue;\r\n };\r\n\r\n scope.$watch(attrs.ngModel, (newValue) => {\r\n validateDateRange(newValue);\r\n });\r\n },\r\n };\r\n}\r\n","export default function DateRangeGreaterThanDirective($filter, utilitySevice) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function(scope, elm, attrs, ctrl) {\r\n\t\t\tvar validateDateRange = function(inputValue) {\r\n\t\t\t\tvar fromDate = $filter('date')(attrs.dateRangeGreaterThan, 'short');\r\n\t\t\t\tvar toDate = $filter('date')(inputValue, 'short');\r\n\t\t\t\tvar isValid = utilitySevice.isValidMinDateRange(fromDate, toDate);\r\n\t\t\t\tctrl.$setValidity('dateRangeGreaterThan', isValid);\r\n\t\t\t\treturn inputValue;\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.unshift(validateDateRange);\r\n\t\t\tctrl.$formatters.push(validateDateRange);\r\n\t\t\tattrs.$observe('dateRangeGreaterThan', function() {\r\n\t\t\t\tvalidateDateRange(ctrl.$viewValue);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function DateRangeLowerThanDirective($filter, utilitySevice) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function(scope, elm, attrs, ctrl) {\r\n\t\t\tvar validateDateRange = function(inputValue) {\r\n\t\t\t\tvar fromDate = $filter('date')(inputValue, 'short');\r\n\t\t\t\tvar toDate = $filter('date')(attrs.dateRangeLowerThan, 'short');\r\n\t\t\t\tvar isValid = utilitySevice.isValidMinDateRange(fromDate, toDate);\r\n\t\t\t\tctrl.$setValidity('dateRangeLowerThan', isValid);\r\n\t\t\t\treturn inputValue;\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.unshift(validateDateRange);\r\n\t\t\tctrl.$formatters.push(validateDateRange);\r\n\t\t\tattrs.$observe('dateRangeLowerThan', function() {\r\n\t\t\t\tvalidateDateRange(ctrl.$viewValue);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function FocusMeDirective($timeout) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\tscope: { trigger: '=focusMe' },\r\n\t\tlink: function(scope, element) {\r\n\t\t\tscope.$watch('trigger', function(value) {\r\n\t\t\t\tif (value === true) {\r\n\t\t\t\t\t$timeout(function() {\r\n\t\t\t\t\t\telement[0].focus();\r\n\t\t\t\t\t}, 0);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function MissingFeaturesDirective(\r\n\tusersService,\r\n\tngShowDirective\r\n) {\r\n\t'ngInject';\r\n\r\n\tvar ngShow = ngShowDirective[0];\r\n\treturn {\r\n\t\ttransclude: ngShow.transclude,\r\n\t\tpriority: ngShow.priority - 1,\r\n\t\tterminal: ngShow.terminal,\r\n\t\trestrict: ngShow.restrict,\r\n\t\tscope: false,\r\n\t\tlink: function(scope, elt, attrs) {\r\n\t\t\tvar features = scope.$eval(attrs.missingFeatures);\r\n\r\n\t\t\tvar user = usersService.currentUser();\r\n\t\t\tvar userFeatures = user ? user.features : [];\r\n\r\n\t\t\tvar validComponent = function() {\r\n\t\t\t\tfor (var i = 0; i < features.length; i++) {\r\n\t\t\t\t\tvar s = features[i];\r\n\r\n\t\t\t\t\tvar hasState = false;\r\n\r\n\t\t\t\t\tfor (var j = 0; j < userFeatures.length; j++) {\r\n\t\t\t\t\t\tif (userFeatures[j].path == s) {\r\n\t\t\t\t\t\t\thasState = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!hasState) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t};\r\n\r\n\t\t\tvar initialNgIf = attrs.ngShow,\r\n\t\t\t\tifEvaluator;\r\n\t\t\t// if it exists, evaluates ngShow && ifAuthenticated\r\n\t\t\tif (initialNgIf) {\r\n\t\t\t\tifEvaluator = function() {\r\n\t\t\t\t\treturn scope.$eval(initialNgIf) && !validComponent();\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\t// if there's no ng-if, process normally\r\n\t\t\t\tifEvaluator = function() {\r\n\t\t\t\t\treturn !validComponent();\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tattrs.ngShow = ifEvaluator;\r\n\t\t\tngShow.link.apply(ngShow, arguments);\r\n\t\t}\r\n\t};\r\n}\r\n","export default function ApplyClassDirective($location) {\r\n 'ngInject';\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n className: '@'\r\n },\r\n link: function($scope, $element) {\r\n let border = $location.search()['border'] || null;\r\n if (border) {\r\n $element.addClass($scope.className);\r\n }\r\n }\r\n };\r\n}\r\n","export default function OpenSelectOnFocusDirective($timeout) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trequire: 'uiSelect',\r\n\t\trestrict: 'A',\r\n\t\tlink: function($scope, el, attrs, uiSelect) {\r\n\t\t\tvar autoopen = true;\r\n\r\n\t\t\tangular\r\n\t\t\t\t.element(uiSelect.focusser || uiSelect.focusInput)\r\n\t\t\t\t.on('focus', function() {\r\n\t\t\t\t\tif (autoopen) {\r\n\t\t\t\t\t\tuiSelect.activate();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t// Disable the auto open when this select element has been activated.\r\n\t\t\t$scope.$on('uis:activate', function() {\r\n\t\t\t\tautoopen = false;\r\n\t\t\t});\r\n\r\n\t\t\t// Re-enable the auto open after the select element has been closed\r\n\t\t\t$scope.$on('uis:close', function() {\r\n\t\t\t\tautoopen = false;\r\n\t\t\t\t$timeout(function() {\r\n\t\t\t\t\tautoopen = true;\r\n\t\t\t\t}, 250);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function RequiresFeaturesDirectives(\r\n\tusersService,\r\n\tngShowDirective\r\n) {\r\n\t'ngInject';\r\n\r\n\tvar ngShow = ngShowDirective[0];\r\n\treturn {\r\n\t\ttransclude: ngShow.transclude,\r\n\t\tpriority: ngShow.priority - 1,\r\n\t\tterminal: ngShow.terminal,\r\n\t\trestrict: ngShow.restrict,\r\n\t\tscope: false,\r\n\t\tlink: function(scope, elt, attrs) {\r\n\t\t\tvar features = scope.$eval(attrs.requiresFeatures);\r\n\r\n\t\t\tvar validComponent = usersService.hasRequiredFeatures;\r\n\r\n\t\t\tvar initialNgIf = attrs.ngShow,\r\n\t\t\t\tifEvaluator;\r\n\t\t\t// if it exists, evaluates ngShow && ifAuthenticated\r\n\t\t\tif (initialNgIf) {\r\n\t\t\t\tifEvaluator = function() {\r\n\t\t\t\t\treturn scope.$eval(initialNgIf) && validComponent(features);\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\t// if there's no ng-if, process normally\r\n\t\t\t\tifEvaluator = function() {\r\n\t\t\t\t\treturn validComponent(features);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tattrs.ngShow = ifEvaluator;\r\n\t\t\tngShow.link.apply(ngShow, arguments);\r\n\t\t}\r\n\t};\r\n}\r\n","export default function SelectSetFocusOnDirective($timeout, $parse) {\r\n 'ngInject';\r\n\r\n return {\r\n require: 'uiSelect',\r\n restrict: 'A',\r\n link: function(scope, element, attrs, $select) {\r\n var model = $parse(attrs.selectSetFocusOn);\r\n scope.$watch(model, function(currentValue) {\r\n if (currentValue === true) {\r\n $timeout(function() {\r\n $select.setFocus();\r\n });\r\n }\r\n });\r\n element.bind('blur', function() {\r\n if (model.assign) {\r\n // use timeout to avoid [$rootScope:inprog] error\r\n $timeout(() => scope.$apply(model.assign(scope, false)), 0, false);\r\n }\r\n });\r\n },\r\n };\r\n}\r\n","export default function SetFocusOnDirective($timeout, $parse) {\r\n 'ngInject';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n var model = $parse(attrs.setFocusOn);\r\n scope.$watch(model, function(currentValue) {\r\n if (currentValue === true) {\r\n $timeout(function() {\r\n element[0].focus();\r\n });\r\n }\r\n });\r\n element.bind('blur', function() {\r\n if (model.assign) {\r\n // use timeout to avoid [$rootScope:inprog] error\r\n $timeout(() => scope.$apply(model.assign(scope, false)), 0, false);\r\n }\r\n });\r\n },\r\n };\r\n}\r\n","export default function TagsSetFocusOnDirective($timeout, $parse) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tlink: function(scope, element, attrs) {\r\n\t\t\tvar model = $parse(attrs.tagsSetFocusOn);\r\n\t\t\tvar input = element.find('input');\r\n\t\t\tscope.$watch(model, function(currentValue) {\r\n\t\t\t\tif (currentValue === true) {\r\n\t\t\t\t\t$timeout(function() {\r\n\t\t\t\t\t\tinput[0].focus();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\telement.bind('blur', function() {\r\n\t\t\t\tif (model.assign) {\r\n\t\t\t\t\tscope.$apply(model.assign(scope, false));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","/**\r\n * Exposes an element's scope as an HTML5 data DOM property.\r\n * Usage: const myScope = angular.element(ele).data('$scope');\r\n */\r\nexport default () => ({\r\n\trestrict: 'A',\r\n\tscope: false,\r\n\tlink: (scope, elem) => elem.data('$scope', scope)\r\n});\r\n","import { isFunction } from 'lodash-es';\r\nexport default function scrollDirective($timeout) {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tscope: {\r\n\t\t\tcallbackFunction: '&scrollThen'\r\n\t\t},\r\n\t\tlink: function(scope, element, attrs) {\r\n\t\t\tif (attrs.scrollIf === 'true') {\r\n\t\t\t\t$timeout(() => {\r\n\t\t\t\t\tconst parent = $(document.getElementById(attrs.containerId));\r\n\t\t\t\t\tparent.stop().animate(\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tscrollTop: element.offset().top - parent.offset().top\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t1000\r\n\t\t\t\t\t);\r\n\t\t\t\t\telement.addClass('removehighlighted');\r\n\t\t\t\t\tif (isFunction(scope.callbackFunction)) {\r\n\t\t\t\t\t\tscope.callbackFunction();\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 500);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n","export default function pageSupport($rootScope) {\r\n 'ngInject';\r\n\r\n return {\r\n scope: {},\r\n link: function () {\r\n const el = $('html');\r\n const support = [{\r\n support: 'flexPage',\r\n class: 'support-flex-page'\r\n },\r\n {\r\n support: 'breadcrumb',\r\n class: 'support-breadcrumb'\r\n },\r\n {\r\n support: 'leftNav',\r\n class: 'support-left-nav'\r\n }\r\n ];\r\n\r\n if (el) {\r\n support.forEach(supp => {\r\n if ($rootScope[supp.support]) {\r\n el.addClass(supp.class);\r\n } else {\r\n el.removeClass(supp.class);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n}","export default () => {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n infiniteLoadingCallback: '&infiniteLoading'\r\n },\r\n link: (scope, element) => {\r\n let rawElement = element[0];\r\n\r\n element.bind('scroll', () => {\r\n if (rawElement.scrollTop + rawElement.offsetHeight >= (rawElement.scrollHeight - 50)) {\r\n scope.$apply(scope.infiniteLoadingCallback);\r\n }\r\n });\r\n }\r\n };\r\n};","import angular from 'angular';\r\n\r\n/* Module Imports */\r\nimport utilModule from '../utility/util.module';\r\nimport apiModule from '../api/api.module';\r\n\r\n/* Directive Imports */\r\nimport AutofocusDirective from './autofocus.directive';\r\nimport ChildElementBlurDirective from './child-element-blur.directive';\r\nimport ConfirmOnExitDirective from './confirm-on-exit';\r\nimport DateGreaterThanDirective from './date-greater-than.directive';\r\nimport DateLowerThanDirective from './date-lower-than.directive';\r\nimport DateRangeGreaterThanDirective from './date-range-greater-than';\r\nimport DateRangeLowerThanDirective from './date-range-lower-than';\r\nimport FocusMeDirective from './focusMe.directive';\r\nimport iframeOnLoadDirective from './iframe-onload.directive';\r\nimport MissingFeaturesDirective from './missing-features';\r\nimport NgEnterDirective from './ng-enter.directive';\r\nimport ApplyClassDirective from './apply-class.directive';\r\nimport NumbersOnlyDirective from './numbers-only-input.directive';\r\nimport OpenSelectOnFocusDirective from './open-select-on-focus.directive';\r\nimport RequiresFeaturesDirectives from './requires-features.directive';\r\nimport SelectSetFocusOnDirective from './select-set-focus-on.directive';\r\nimport SetFocusOnDirective from './set-focus-on.directive';\r\nimport StopPropagationDirective from './stopPropagation.directive';\r\nimport StringToNumberDirective from './stringToNumber.directive';\r\nimport TagsSetFocusOnDirective from './tags-set-focus-on.directive';\r\nimport ValidFileDirective from './valid-file.directive';\r\nimport ExposeScopeDirective from './expose-scope.directive';\r\nimport ScrollDirective from './scroll.directive';\r\nimport PageSupportDirective from './pageSupport.directive';\r\nimport InfiniteLoadingDirective from './infinite-loading.directive';\r\n\r\nconst directivesModule = angular\r\n .module('app.directives', ['ui.bootstrap', 'ui.router', 'gettext', utilModule, apiModule])\r\n .directive('autofocus', AutofocusDirective)\r\n .directive('applyClass', ApplyClassDirective)\r\n .directive('childElementBlur', ChildElementBlurDirective)\r\n .directive('confirmOnExit', ConfirmOnExitDirective)\r\n .directive('dateGreaterThan', DateGreaterThanDirective)\r\n .directive('dateLowerThan', DateLowerThanDirective)\r\n .directive('dateRangeGreaterThan', DateRangeGreaterThanDirective)\r\n .directive('dateRangeLowerThan', DateRangeLowerThanDirective)\r\n .directive('focusMe', FocusMeDirective)\r\n .directive('iframeOnload', iframeOnLoadDirective)\r\n .directive('missingFeatures', MissingFeaturesDirective)\r\n .directive('ngEnter', NgEnterDirective)\r\n .directive('exposeScope', ExposeScopeDirective)\r\n .directive('numbersOnly', NumbersOnlyDirective)\r\n .directive('openSelectOnFocus', OpenSelectOnFocusDirective)\r\n .directive('requiresFeatures', RequiresFeaturesDirectives)\r\n .directive('selectSetFocusOn', SelectSetFocusOnDirective)\r\n .directive('setFocusOn', SetFocusOnDirective)\r\n .directive('stopPropagation', StopPropagationDirective)\r\n .directive('stringToNumber', StringToNumberDirective)\r\n .directive('tagsSetFocusOn', TagsSetFocusOnDirective)\r\n .directive('validFile', ValidFileDirective)\r\n .directive('scroll', ScrollDirective)\r\n .directive('pageSupport', PageSupportDirective)\r\n .directive('infiniteLoading', InfiniteLoadingDirective);\r\n\r\nexport default directivesModule.name;\r\n","export default function iframeOnLoadDirective() {\r\n\t'ngInject';\r\n\r\n\treturn {\r\n\t\tscope: {\r\n\t\t\tcallBack: '&iframeOnload'\r\n\t\t},\r\n\t\tlink: function(scope, element, attrs) {\r\n\t\t\telement.on('load', function() {\r\n\t\t\t\treturn scope.callBack();\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function NgEnterDirective() {\r\n return function (scope, element, attrs) {\r\n element.bind('keydown keypress', function (event) {\r\n if (event.which === 13) {\r\n scope.$apply(function () {\r\n scope.$eval(attrs.ngEnter);\r\n });\r\n\r\n event.preventDefault();\r\n }\r\n });\r\n };\r\n}","/**\r\n * Function: Restrict type=\"number\" inputs to allow only numbers from [0 - 9].\r\n * Purpose: Prevent special characters such as (., -, e) from being permitted in a number input.\r\n * Date: Tuesday, Novemeber 21, 2017.\r\n * Author: OJ\r\n */\r\nexport default function NumbersOnlyDirective() {\r\n return {\r\n restrict: 'A',\r\n link: (scope, element, attrs) => {\r\n const singleCharRegExp = RegExp(attrs.numbersOnly);\r\n const wholeWordRegExp = new RegExp(`^${attrs.numbersOnly}+$`);\r\n const ele = element[0];\r\n\r\n if (!ele) {\r\n console.warn('No element found for NumbersOnlyDirective');\r\n return;\r\n }\r\n\r\n // Fired on keydown\r\n ele.addEventListener('keydown', event => onKeydown(singleCharRegExp, event));\r\n\r\n // Fired on right click > paste\r\n ele.addEventListener('paste', event => onPaste(wholeWordRegExp, event));\r\n }\r\n };\r\n}\r\n\r\nfunction onKeydown(re, event) {\r\n const input = event.key;\r\n const exclude = /Backspace|Tab|Delete|Del|ArrowUp|Up|ArrowDown|Down|Control/;\r\n const isCopyPaste = (event.ctrlKey || event.metaKey) && ['c', 'v', 'x'].includes(input);\r\n\r\n if (!isCopyPaste && !exclude.test(input) && !re.test(input)) {\r\n event.preventDefault();\r\n }\r\n}\r\n\r\nfunction onPaste(re, event) {\r\n const input = (event.clipboardData || window.clipboardData).getData('text');\r\n\r\n if (!re.test(input)) {\r\n event.preventDefault();\r\n }\r\n}\r\n","export default function StopPropagationDirective() {\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tlink: function(scope, element, attr) {\r\n\t\t\tif (attr && attr.stopPropagation) {\r\n\t\t\t\telement.bind(attr.stopPropagation, function(e) {\r\n\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n","export default function StringToNumberDirective() {\r\n\treturn {\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function(scope, element, attrs, ngModel) {\r\n\t\t\tngModel.$parsers.push(function(value) {\r\n\t\t\t\treturn '' + value;\r\n\t\t\t});\r\n\t\t\tngModel.$formatters.push(function(value) {\r\n\t\t\t\treturn parseFloat(value);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function ValidFileDirective() {\r\n\treturn {\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function(scope, el, attrs, ngModel) {\r\n\t\t\t//change event is fired when file is selected\r\n\t\t\tel.bind('change', () => {\r\n\t\t\t\tscope.$apply(() => {\r\n\t\t\t\t\tngModel.$setViewValue(el.val());\r\n\t\t\t\t\tngModel.$render();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n","export default function MaintenanceRouteConfig($stateProvider, gettext) {\r\n 'ngInject';\r\n\r\n let maintPerform = gettext('Performing Maintenance'),\r\n maintHistory = gettext('Maintenance History'),\r\n maintDetails = gettext('Details'),\r\n maintDashboard = gettext('Dashboard'),\r\n plans = gettext('Plans'),\r\n plansCreate = gettext('Create');\r\n\r\n $stateProvider\r\n .state('maintenance', {\r\n url: '/maintenance',\r\n template: require('./maintenance.html'),\r\n controller: 'MaintenanceController',\r\n redirectTo: 'maintenance.board',\r\n ncyBreadcrumb: {\r\n label: \"{{'Maintenance' | translate}}\"\r\n },\r\n requiredFeatures: ['maintenance']\r\n })\r\n .state('maintenance.history', {\r\n url: '/history',\r\n template: require('./history/history.html'),\r\n controller: 'MaintenanceHistoryController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Maintenance History' | translate}}\"\r\n },\r\n requiredFeatures: ['maintenance']\r\n })\r\n .state('maintenance.history-details', {\r\n url: '/details?serviceRecord={id}',\r\n template: require('./history/details/details.html'),\r\n controller: 'MaintenanceHistoryDetailsController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Details' | translate}}\",\r\n parent: 'maintenance.history'\r\n },\r\n requiredFeatures: ['maintenance']\r\n })\r\n .state('maintenance.board', {\r\n url: '/dashboard',\r\n template: require('./board/board.html'),\r\n controller: 'MaintenanceBoardController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Dashboard' | translate}}\"\r\n },\r\n requiredFeatures: ['maintenance']\r\n })\r\n .state('maintenance.board-detail', {\r\n url: '/dashboard/{id}',\r\n ncyBreadcrumb: {\r\n label: \"{{'Details' | translate}}\",\r\n parent: 'maintenance.board'\r\n },\r\n requiredFeatures: ['maintenance']\r\n })\r\n .state('maintenance.plans', {\r\n url: '/plans',\r\n template: require('./plans/plans.html'),\r\n controller: 'MaintenancePlansController',\r\n ncyBreadcrumb: {\r\n parent: 'maintenance',\r\n label: \"{{'Plans' | translate}}\"\r\n },\r\n requiredFeatures: ['maintenance.plans']\r\n })\r\n .state('maintenance.createplan', {\r\n url: '/plans/create',\r\n template: require('./plans/create/create.html'),\r\n controller: 'CreatePlanController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Create New Plan' | translate}}\"\r\n },\r\n requiredFeatures: ['maintenance.plans.manage', 'maintenance.plans.manage']\r\n })\r\n .state('maintenance.plans-detail', {\r\n url: '/plans/{id}',\r\n template: require('./plans/details/details.html'),\r\n controller: 'MaintenancePlansDetailsController',\r\n redirectTo: 'maintenance.plans-detail.tasks',\r\n ncyBreadcrumb: {\r\n label: '{{maintenancePlanData.name}}',\r\n parent: 'maintenance.plans',\r\n name: \"{{'Detail'| translate}}\"\r\n },\r\n requiredFeatures: ['maintenance.plans']\r\n })\r\n .state('maintenance.plans-detail.tasks', {\r\n url: '/tasks',\r\n helpState: 'maintenance.plansdetail',\r\n template: require('./plans/details/tasks/tasks.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n },\r\n requiredFeatures: ['maintenance.plans']\r\n })\r\n .state('maintenance.plans-detail.assets', {\r\n url: '/assets',\r\n helpState: 'maintenance.plansdetail',\r\n template: require('./plans/details/assets/assets.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n }\r\n });\r\n}\r\n","import App from '../../app';\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Maintenance\";\r\nexport default function MaintenanceController($scope, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.title = \"Maintenance\";\r\n\r\n this.$onInit = () => {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n\r\n $scope.menuItems = [{\r\n \"title\": gettextCatalog.getString(\"Board\"),\r\n \"sref\": \"maintenance.maintenanceboard\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"Plans\"),\r\n \"sref\": \"maintenance.plans\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"Plans\"),\r\n \"sref\": \"maintenance.plans\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"Completed Tasks\"),\r\n \"sref\": \"maintenance.maintenanceCompletedtasks\"\r\n }];\r\n}","import Auth from '../../../../auth';\r\n\r\nconst DATE = 'date';\r\nconst ODOMETER = 'odometer';\r\nconst RUNHOUR = 'runhour';\r\nconst MILES = 'miles';\r\nconst KILOMETERS = 'kilometers';\r\nconst MONTH = 'month';\r\nconst HOUR = 'hour';\r\nconst MAINTENANCE_ERROR_MESSAGE = 'An error occurred while creating the maintenance plan';\r\nconst MAINTENANCE_ALREADY_EXIST = 'The plan _ already exists. Please rename the Maintenance Plan.';\r\n\r\nconst EVENT_TRACKING_NAME = 'MaintenancePlanCreation';\r\nconst EVENT_TRACKING_ACTION = 'createButtonPressed';\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data }\r\n });\r\n}\r\n\r\nexport default function CreatePlanController(\r\n $scope,\r\n $rootScope,\r\n $state,\r\n MaintenanceService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Initial variables\r\n $scope.maxEmails = 10;\r\n $scope.selectedAssets = [];\r\n\r\n $scope.plan = {};\r\n $scope.emails = [];\r\n $scope.plan.tasks = [];\r\n $scope.plan.tags = [];\r\n $scope.plan.recurrence = {};\r\n $scope.plan.recurrence.algorithm = 'Offset';\r\n $scope.plan.recurrence.rules = [];\r\n $scope.plan.documentlinks = [];\r\n $scope.plan.recurrence.rules.push({\r\n type: DATE,\r\n frequency: MONTH,\r\n interval: 3,\r\n upcoming: 2,\r\n });\r\n $scope.$on('totalEmails', (event, totalEmails) => {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n $scope.plan.recurrence.rules.push({\r\n type: RUNHOUR,\r\n frequency: HOUR,\r\n interval: 1000,\r\n upcoming: 50,\r\n }); //push at least one static rule\r\n\r\n $scope.plan.attrs = {};\r\n\r\n $scope.tags = [];\r\n\r\n $scope.$on('disableMeter', (event, args) => {\r\n $scope.meter_checked = args.Meter;\r\n });\r\n\r\n $scope.$on('disableDate', (event, args) => {\r\n $scope.date_checked = args.Calendar;\r\n });\r\n\r\n $scope.$on('meterRulesChange', (event, args) => {\r\n $scope.plan.recurrence.rules = $scope.plan.recurrence.rules.map(rule => {\r\n if (rule.type && (rule.type === ODOMETER || rule.type === RUNHOUR)) rule = args.MeterRules[0];\r\n return rule;\r\n });\r\n });\r\n\r\n $scope.$on('calendarRulesChange', (event, args) => {\r\n $scope.plan.recurrence.rules = $scope.plan.recurrence.rules.map(rule => {\r\n if (rule.type && rule.type === DATE) rule = args.CalendarRules[0];\r\n return rule;\r\n });\r\n });\r\n\r\n $scope.submitted = false;\r\n $scope.plan.contacts = [];\r\n $scope.meter_checked = false;\r\n $scope.notValid = false;\r\n\r\n $scope.saveButtonPressed = () => {\r\n $scope.userForm.$submitted = true;\r\n if (!$scope.equipmentChangeSet) return;\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTION,\r\n });\r\n\r\n if (($scope.meter_checked || $scope.date_checked) && $scope.userForm.$valid) {\r\n $scope.notValid = false;\r\n\r\n $scope.plan.recurrence.rules = $scope.plan.recurrence.rules.filter(rule => {\r\n if (!$scope.meter_checked) return rule.type !== ODOMETER && rule.type !== RUNHOUR;\r\n\r\n if (!$scope.date_checked) return rule.type !== DATE;\r\n\r\n return true;\r\n });\r\n\r\n $scope.plan.recurrence.rules = $scope.plan.recurrence.rules.map(rule => {\r\n if (rule.frequency === MILES || rule.frequency === KILOMETERS) rule.type = ODOMETER;\r\n return rule;\r\n });\r\n\r\n $scope.plan.tags = $scope.plan.tags.map(tag => tag.text.toLowerCase());\r\n\r\n if ($scope.documentLinks && $scope.documentLinks.length >= 0) {\r\n $scope.plan.documentlinks = $scope.documentLinks;\r\n }\r\n\r\n const brand = Auth.getBrandClaim();\r\n if (brand != null) {\r\n $scope.plan.attrs.brand = brand;\r\n }\r\n\r\n if ($scope.plan.contacts.length <= $scope.maxEmails) {\r\n $scope.loading = true;\r\n MaintenanceService.createPlan($scope.plan, $scope.equipmentChangeSet)\r\n .then(response => {\r\n $rootScope.maintenancePlanData = response.data;\r\n $scope.plan.id = $rootScope.maintenancePlanData.id;\r\n return MaintenanceService.updateEquipmentForPlan(\r\n $scope.plan,\r\n $scope.equipmentChangeSet,\r\n );\r\n })\r\n .then(() => {\r\n $state.go('maintenance.plans-detail', {\r\n id: $scope.plan.id,\r\n });\r\n })\r\n .catch(error => {\r\n let errorMsg = gettextCatalog.getString(MAINTENANCE_ERROR_MESSAGE);\r\n if (error.status === 409) {\r\n const [frontMessage, tailMessage] = MAINTENANCE_ALREADY_EXIST.split('_');\r\n\r\n errorMsg =\r\n gettextCatalog.getString(frontMessage) +\r\n $scope.plan.name +\r\n gettextCatalog.getString(tailMessage);\r\n }\r\n if ((error.data || error.status) && error.status !== 409) {\r\n errorMsg = `${error.data || ''} ${error.statusText ||\r\n ''} : ${error.status.toString()}`;\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.loading = false;\r\n\r\n $scope.userForm.title.$setValidity('unique', false);\r\n });\r\n }\r\n } else {\r\n if (!($scope.meter_checked || $scope.date_checked)) {\r\n $scope.notValid = true;\r\n }\r\n }\r\n };\r\n\r\n $scope.formValidation = $scope.userForm;\r\n}\r\n","const EVENT_TRACKING_NAME = 'MaintenancePlans';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n searchInputChanged: 'searchInputChanged',\r\n exportCSVClicked: 'exportCSVClicked',\r\n tableSortingChange: 'tableSortingChange',\r\n paginationChanged: 'paginationChanged',\r\n planClicked: 'planClicked',\r\n};\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n};\r\nexport default function MaintenancePlansController(\r\n $scope,\r\n $filter,\r\n $uibModal,\r\n MaintenanceService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.loading = true;\r\n\r\n //Local Variables\r\n $scope.searchText = '';\r\n $scope.maintenancePlans = [];\r\n $scope.filteredMaintenancePlans = [];\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 30;\r\n $scope.maxSize = 3;\r\n\r\n //Sort filteredMaintenancePlans\r\n $scope.orderMaintenacePlan = function (predicate) {\r\n $scope.reverse = predicate === $scope.predicate ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n\r\n // Maintenance GTM tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.tableSortingChange,\r\n orderBy: predicate,\r\n descending: $scope.reverse,\r\n });\r\n };\r\n\r\n //applyFilter searchs the maintenancePlans[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.searchText) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.searchInputChanged,\r\n });\r\n }\r\n $scope.filteredMaintenancePlans = $filter('filter')($scope.maintenancePlans, $scope.searchText);\r\n };\r\n\r\n $scope.createButtonPressed = function () {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./create/create.html'),\r\n controller: 'CreatePlanController',\r\n size: 'lg',\r\n });\r\n };\r\n\r\n MaintenanceService.getPlans().then(\r\n function (response) {\r\n $scope.maintenancePlans = response?.data?.map((plan) => {\r\n return {\r\n ...plan,\r\n frequency: (plan.recurrence.rules || [])\r\n .map(({ frequency, interval }) => `${interval} ${gettextCatalog.getString(frequency)}`)\r\n .join(` ${gettextCatalog.getString('or')} `),\r\n schedule_type: gettextCatalog.getString(plan.recurrence.algorithm),\r\n };\r\n });\r\n $scope.filteredMaintenancePlans = $scope.maintenancePlans.slice();\r\n $scope.loading = false;\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving maintenance plans',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n },\r\n );\r\n\r\n let getEquipmentStatus = function () {\r\n function handleError(response) {\r\n $scope.error = gettextCatalog.getString('There was an error');\r\n }\r\n MaintenanceService.getStatus().then(function (response) {\r\n $scope.statusData = [];\r\n\r\n $scope.totalList = response.data;\r\n }, handleError);\r\n };\r\n\r\n getEquipmentStatus();\r\n\r\n //================csv ==============\r\n\r\n $scope.getCsvData = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportCSVClicked,\r\n });\r\n return [\r\n {\r\n name: gettextCatalog.getString('Name'),\r\n description: gettextCatalog.getString('Description'),\r\n tags: gettextCatalog.getString('Tags'),\r\n frequency: gettextCatalog.getString('Frequency'),\r\n schedule_type: gettextCatalog.getString('Schedule Type'),\r\n },\r\n ...GetOrderedCSVList(),\r\n ];\r\n };\r\n\r\n function GetOrderedCSVList() {\r\n const list = $filter('orderBy')(\r\n $scope.filteredMaintenancePlans,\r\n $scope.predicate,\r\n $scope.reverse,\r\n );\r\n return list.map((plan) => {\r\n return {\r\n name: plan.name,\r\n description: plan.description,\r\n tags: (plan.tags || []).join(','),\r\n frequency: plan.frequency,\r\n schedule_type: plan.schedule_type,\r\n };\r\n });\r\n }\r\n\r\n $scope.paginationChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.paginationChanged,\r\n currentPage: $scope.currentPage,\r\n });\r\n };\r\n\r\n $scope.planClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.planClicked,\r\n planId: id,\r\n });\r\n };\r\n}\r\n","const EVENT_TRACKING_NAME = 'MaitenanceDeleteModal';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n confirmClicked: 'confirmClicked',\r\n cancelClicked: 'cancelClicked',\r\n}\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n}\r\nexport default function MaintenancePlansDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n plan,\r\n $state,\r\n MaintenanceService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.plan = plan;\r\n $scope.deleting = false;\r\n\r\n $scope.ok = function() {\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.confirmClicked,\r\n });\r\n\r\n $scope.deleting = true;\r\n $scope.errorFlag = false;\r\n MaintenanceService.deletePlan($scope.plan).then(\r\n function(response) {\r\n $state.go('maintenance.plans');\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting the maintenance plan');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.deleting = false;\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n }\r\n );\r\n };\r\n\r\n $scope.cancel = function() {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.cancelClicked,\r\n });\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n $scope.cancel();\r\n });\r\n}\r\n","import Auth from '../../../../auth';\r\n\r\nconst EVENT_TRACKING_NAME = 'MaintenancePlanDetails';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n editButtonClicked: 'editButtonClicked',\r\n deleteButtonClicked: 'deleteButtonClicked',\r\n}\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n })\r\n}\r\nexport default function MaintenancePlansDetailsController(\r\n $scope,\r\n $stateParams,\r\n $uibModal,\r\n MaintenanceService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n //Pagination of document links\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 5;\r\n $scope.maxSize = 1;\r\n $scope.documentLinks = [];\r\n $scope.maxEmails = 10;\r\n $scope.initLoading = true;\r\n /**\r\n -- Edit/Cancel Button --\r\n */\r\n $scope.editButtonClicked = function() {\r\n \r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editButtonClicked,\r\n });\r\n\r\n $scope.isEditing = !$scope.isEditing;\r\n\r\n $scope.editingDocLinkFlag = {}; //for maintenance doc link\r\n $scope.disabledEditing = false; //for maintennace doc link\r\n\r\n if ($scope.isEditing) {\r\n $scope.plan = angular.copy($scope.maintenancePlanData);\r\n }\r\n };\r\n $scope.$on('totalEmails', function(event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n\r\n $scope.$on('disableMeter', function(event, args) {\r\n $scope.meter_checked = args.Meter;\r\n });\r\n\r\n $scope.$on('disableDate', function(event, args) {\r\n $scope.date_checked = args.Calendar;\r\n });\r\n\r\n $scope.$on('meterRulesChange', function(event, args) {\r\n $scope.meter_rules = args.MeterRules;\r\n });\r\n\r\n $scope.$on('calendarRulesChange', function(event, args) {\r\n $scope.calendar_rules = args.CalendarRules;\r\n });\r\n\r\n $scope.deleteButtonPressed = function() {\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.deleteButtonClicked,\r\n });\r\n\r\n $scope.deleted = true;\r\n\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./delete/delete.html'),\r\n controller: 'MaintenancePlansDeleteModalController',\r\n resolve: {\r\n plan: () => $scope.maintenancePlanData\r\n },\r\n size: 'md'\r\n });\r\n };\r\n $scope.notValid = false;\r\n $scope.putMaintenance = function() {\r\n $scope.userForm.$submitted = true;\r\n $scope.errorFlag = false;\r\n //One or the other must be checked\r\n if (($scope.meter_checked || $scope.date_checked) && $scope.userForm.$valid) {\r\n //Check to see if the number of emails in the plan is greater than the max\r\n if ($scope.plan.contacts.length <= $scope.maxEmails) {\r\n if ($scope.meter_checked == true) {\r\n var count = 0;\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if (\r\n $scope.plan.recurrence.rules[i].type == 'odometer' ||\r\n $scope.plan.recurrence.rules[i].type == 'runhour'\r\n ) {\r\n $scope.plan.recurrence.rules[i] = $scope.meter_rules[0];\r\n } else {\r\n count++;\r\n }\r\n }\r\n if (count == $scope.plan.recurrence.rules.length) {\r\n $scope.plan.recurrence.rules.push($scope.meter_rules[0]);\r\n }\r\n } else if ($scope.meter_checked == false) {\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if (\r\n $scope.plan.recurrence.rules[i].type == 'odometer' ||\r\n $scope.plan.recurrence.rules[i].type == 'runhour'\r\n ) {\r\n $scope.plan.recurrence.rules.splice(i, 1);\r\n }\r\n }\r\n }\r\n if ($scope.date_checked == true) {\r\n var count = 0;\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.recurrence.rules[i].type == 'date') {\r\n $scope.plan.recurrence.rules[i] = $scope.calendar_rules[0];\r\n } else {\r\n count++;\r\n }\r\n }\r\n if (count == $scope.plan.recurrence.rules.length) {\r\n $scope.plan.recurrence.rules.push($scope.calendar_rules[0]);\r\n }\r\n } else if ($scope.date_checked == false) {\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.recurrence.rules[i].type == 'date') {\r\n $scope.plan.recurrence.rules.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n //tag-input directive will change plane.tags to array of objects after editing\r\n //need to put it back to array of string\r\n let stringTagsArray = $scope.plan.tags.map(function(tag) {\r\n return tag.text.toLowerCase();\r\n });\r\n $scope.plan.tags = stringTagsArray;\r\n\r\n if ($scope.documentLinks.length >= 1) {\r\n $scope.plan.documentLinks = $scope.documentLinks;\r\n }\r\n\r\n const brand = Auth.getBrandClaim();\r\n if (brand != null && $scope.plan.attrs.brand === undefined) {\r\n $scope.plan.attrs.brand = brand;\r\n }\r\n\r\n $scope.loading = true;\r\n MaintenanceService.updatePlan($scope.plan).then(\r\n function(response) {\r\n $scope.notValid = false;\r\n $scope.maintenancePlanData = response.data;\r\n //Set editing plan to be false after we have sucessfully finished the put\r\n $scope.isEditing = false;\r\n $scope.loading = false;\r\n },\r\n function(error) {\r\n $scope.loading = false;\r\n $scope.isEditing = true;\r\n let errorMsg = gettextCatalog.getString('An error occurred while editing the maintenance plan');\r\n if (error.status == 409) {\r\n errorMsg =\r\n gettextCatalog.getString('The name ') +\r\n $scope.plan.name +\r\n gettextCatalog.getString(' already exists. Please rename the Maintenance Plan.');\r\n }\r\n if ((error.data || error.status) && error.status != 409) {\r\n if (error.data && error.statusText) {\r\n errorMsg = error.data + ' ' + error.statusText + ' : ' + error.status.toString();\r\n }\r\n if (error.data) {\r\n errorMsg = error.data + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n }\r\n );\r\n }\r\n } else {\r\n if (!($scope.meter_checked || $scope.date_checked)) {\r\n $scope.notValid = true;\r\n }\r\n }\r\n };\r\n\r\n $scope.editButtonPressed = function() {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./edit/edit.html'),\r\n controller: function(maintenancePlan) {},\r\n size: 'md',\r\n resolve: {\r\n maintenancePlan: function() {\r\n return $scope.maintenancePlanData;\r\n }\r\n }\r\n });\r\n };\r\n\r\n let refresh = function() {\r\n MaintenanceService.getPlan($stateParams.id).then(\r\n function(response) {\r\n $scope.initLoading = false;\r\n $scope.maintenancePlanData = response.data;\r\n\r\n $scope.$emit('$viewContentLoaded');\r\n\r\n if ($scope.maintenancePlanData.documentLinks.length >= 1) {\r\n $scope.documentLinks = $scope.maintenancePlanData.documentLinks;\r\n }\r\n\r\n for (let i = 0; i < $scope.maintenancePlanData.recurrence.rules.length; i++) {\r\n if (\r\n $scope.maintenancePlanData.recurrence.rules[i].type == 'odometer' ||\r\n $scope.maintenancePlanData.recurrence.rules[i].type == 'runhour'\r\n ) {\r\n $scope.meter_checked = true;\r\n }\r\n if ($scope.maintenancePlanData.recurrence.rules[i].type == 'date') {\r\n $scope.date_checked = true;\r\n }\r\n }\r\n },\r\n function(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving maintenance plan data');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.initLoading = false;\r\n }\r\n );\r\n };\r\n\r\n //Sort doc links\r\n $scope.orderDocumentLinksFilter = function(predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n\r\n angular.forEach($scope.documentLinks, function(docLinks) {\r\n docLinks[predicate] = docLinks[predicate];\r\n });\r\n\r\n $scope.documentLinks = $filter('orderBy')($scope.documentLinks, predicate, $scope.reverse);\r\n };\r\n\r\n refresh();\r\n}\r\n","export default function MaintenancePlansDetailsTasksController($scope, $stateParams, MaintenanceService) {\r\n\r\n 'ngInject';\r\n\r\n $scope.addNewTaskButtonPressed = () => {};\r\n\r\n MaintenanceService\r\n .getTaskPlans($stateParams.maintenanceplanId)\r\n .then(response => {\r\n $scope.tasksData = response.data;\r\n }, error => {\r\n // console.log(\"Failed to load tasks\");\r\n // TODO need better error handling here!\r\n });\r\n}","const EVENT_TRACKING_NAME = 'MaintenanceTasks';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n addTask: 'addTaskClicked',\r\n removeTask: 'removeTaskClicked',\r\n inputChanged: 'inputChanged',\r\n selectedTask: 'selectedTask',\r\n editTask: 'editTaskClicked',\r\n editTaskModal: 'editTaskModal',\r\n paginationChanged: 'paginationChanged',\r\n\r\n}\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n}\r\n\r\nexport default function PlanFormTasksDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./tasks.html'),\r\n scope: {\r\n plan: '=',\r\n tasks: '=?',\r\n },\r\n controller: PlanFormTasksController,\r\n };\r\n\r\n function PlanFormTasksController(\r\n $scope,\r\n $q,\r\n $uibModal,\r\n $filter,\r\n MaintenanceService,\r\n gettextCatalog,\r\n ) {\r\n 'ngInject';\r\n\r\n $scope.selectAllToggle = function () {};\r\n const self = this;\r\n\r\n // containers for filtering and pagination\r\n $scope.filteredTasks = [];\r\n $scope.searchText = '';\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n $scope.paginationChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.paginationChanged,\r\n currentPage: $scope.currentPage,\r\n })\r\n }\r\n\r\n //applyFilter searchs to tasks for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if (!$scope.tasks) return;\r\n\r\n if ($scope.searchText) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.inputChanged,\r\n });\r\n }\r\n\r\n $scope.filteredTasks = $filter('filter')($scope.tasks, $scope.searchText);\r\n };\r\n\r\n $scope.predicate = 'title';\r\n $scope.reverse = false;\r\n\r\n $scope.orderBy = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.isRemoveDisabled = function () {\r\n return !$scope.tasks || $scope.tasks.filter((task) => task._selected).length === 0;\r\n };\r\n\r\n var deleteSelected = function () {\r\n $scope.errorFlag = false;\r\n var promiseChain = $q.when();\r\n\r\n function onDeletion(task) {\r\n return function () {\r\n var defer = $q.defer();\r\n\r\n MaintenanceService.deleteTaskInPlan($scope.plan, task).then(\r\n function (response) {\r\n return defer.resolve(response);\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting a task');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n return defer.reject(error);\r\n },\r\n );\r\n\r\n return defer.promise;\r\n };\r\n }\r\n\r\n function onDeletionFailed() {}\r\n\r\n var updatedTasks = []; //Updated tasks will have all of the tasks not set for deletion\r\n\r\n if ($scope.plan.id) {\r\n for (var i = 0; i < $scope.tasks.length; i++) {\r\n if ($scope.tasks[i]._selected) {\r\n promiseChain = promiseChain.then(onDeletion($scope.tasks[i], onDeletionFailed));\r\n } else {\r\n updatedTasks.push($scope.tasks[i]);\r\n }\r\n }\r\n } else {\r\n //If we are deleting locally just assume we are good.\r\n $q.resolve();\r\n }\r\n\r\n $scope.tasks = updatedTasks;\r\n\r\n $scope.filteredTasks = $scope.tasks.slice();\r\n $scope.applyFilter();\r\n\r\n return promiseChain;\r\n };\r\n\r\n $scope.selectedTaskToggle = (task) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.selectedTask,\r\n selected: task?._selected,\r\n taskId: task?.id\r\n });\r\n\r\n }\r\n\r\n $scope.editTask = function (selectedTask) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editTask,\r\n });\r\n $scope.errorFlag = false;\r\n\r\n function editTask(task) {\r\n for (var i = 0; i < $scope.tasks.length; i++) {\r\n if ($scope.tasks[i].id == task.id) {\r\n $scope.tasks[i] = task;\r\n }\r\n }\r\n }\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./edit.html'),\r\n controller: function ($scope, $uibModalInstance, MaintenanceService, task) {\r\n $scope._task = task;\r\n\r\n $scope.toolbar = [\r\n ['p', 'pre', 'quote'],\r\n ['bold', 'italics', 'underline', 'ul', 'ol', 'redo', 'undo', 'clear'],\r\n ['justifyLeft', 'justifyCenter', 'justifyRight', 'indent', 'outdent'],\r\n ['html', 'insertImage', 'insertLink'],\r\n ];\r\n\r\n $scope.value = $('#some-textarea').val();\r\n\r\n $scope.ok = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editTaskModal,\r\n saved: true,\r\n })\r\n $uibModalInstance.close($scope._task);\r\n };\r\n\r\n $scope.cancel = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editTaskModal,\r\n cancelled: true,\r\n });\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.titleChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editTaskModal,\r\n titleChanged: true,\r\n });\r\n }\r\n\r\n $scope.bodyChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editTaskModal,\r\n bodyChanged: true,\r\n })\r\n }\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n },\r\n size: 'md',\r\n resolve: {\r\n task: function () {\r\n return angular.copy(selectedTask);\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(\r\n function (task) {\r\n //If the plan already exists in the db...\r\n $scope.errorFlag = false;\r\n if ($scope.plan.id) {\r\n MaintenanceService.updateTaskInPlan($scope.plan, task).then(\r\n function (response) {\r\n editTask(response.data);\r\n },\r\n function (error) {\r\n //failed for some reason\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating the task',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n },\r\n );\r\n }\r\n },\r\n function () {\r\n //Modal hasbeen canceleled...show some kind of error represnting reason why it was cancelled\r\n },\r\n );\r\n };\r\n\r\n $scope.removeSelectedButtonPressed = function () {\r\n addToDataLayer({\r\n event: EVENT_TRACKING_ACTIONS.removeTask,\r\n });\r\n //Create a giant chain of deletions for all of the tasks that we have selected\r\n deleteSelected().then(\r\n function (response) {\r\n //refresh();\r\n },\r\n function (response) {\r\n // refresh();\r\n },\r\n );\r\n };\r\n\r\n $scope.addTaskButtonPressed = function () {\r\n addToDataLayer({\r\n event: EVENT_TRACKING_ACTIONS.addTask,\r\n });\r\n $scope.errorFlag = false;\r\n\r\n function addTask(task) {\r\n if (!$scope.tasks) {\r\n $scope.tasks = [];\r\n }\r\n $scope.tasks.push(task);\r\n //update the table\r\n $scope.filteredTasks = $scope.tasks.slice();\r\n $scope.applyFilter();\r\n }\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./create.html'),\r\n controller: function ($scope, $uibModalInstance, MaintenanceService) {\r\n $scope.toolbar = [\r\n ['p', 'pre', 'quote'],\r\n ['bold', 'italics', 'underline', 'ul', 'ol', 'redo', 'undo', 'clear'],\r\n ['justifyLeft', 'justifyCenter', 'justifyRight', 'indent', 'outdent'],\r\n ['html', 'insertImage', 'insertLink'],\r\n ];\r\n\r\n $scope._task = {};\r\n\r\n $scope.inputOptions = [\r\n {\r\n type: null,\r\n label: gettextCatalog.getString('None'),\r\n },\r\n {\r\n type: 'integer',\r\n key: 'runhours',\r\n label: gettextCatalog.getString('Run Hours'),\r\n },\r\n {\r\n type: 'integer',\r\n label: gettextCatalog.getString('Integer'),\r\n },\r\n {\r\n type: 'number',\r\n label: gettextCatalog.getString('Number'),\r\n },\r\n {\r\n type: 'boolean',\r\n label: gettextCatalog.getString('Checkbox'),\r\n },\r\n {\r\n type: 'string',\r\n label: gettextCatalog.getString('Text'),\r\n },\r\n ];\r\n\r\n //todo: this is tempory, we need to add only a notes field for now as this is to complex for end users\r\n $scope._task.input = {\r\n key: 'notes',\r\n type: 'string',\r\n inputDescription: 'Notes',\r\n };\r\n //old $scope._task.input = $scope.inputOptions[0];\r\n\r\n //Take the form input and put it into the correct json model for the task\r\n function composeTask() {\r\n $scope.task = {};\r\n $scope.task.inputs = [];\r\n if ($scope._task.input.type) {\r\n var input = {};\r\n\r\n input.type = $scope._task.input.type;\r\n\r\n $scope._task.input = $scope.inputOptions[5];\r\n\r\n if ($scope._task.inputDescription) {\r\n input.description = $scope._task.inputDescription;\r\n } else {\r\n input.description = '';\r\n }\r\n\r\n input.validationRegex = '';\r\n $scope.task.inputs = [input];\r\n } else {\r\n input.key = 'note';\r\n }\r\n\r\n $scope.task.title = $scope._task.title;\r\n $scope.task.body = $scope._task.body;\r\n }\r\n\r\n $scope.ok = function () {\r\n composeTask();\r\n $uibModalInstance.close($scope.task);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n },\r\n size: 'md',\r\n resolve: {},\r\n });\r\n\r\n modalInstance.result.then(\r\n function (task) {\r\n //If the plan already exists in the db...\r\n if ($scope.plan.id) {\r\n $scope.loading = true;\r\n MaintenanceService.createTaskInPlan($scope.plan, task)\r\n .then(\r\n function (response) {\r\n addTask(response.data);\r\n },\r\n function (error) {\r\n //failed for some reason\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while adding the task',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n },\r\n )\r\n .finally(function (result) {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n addTask(task);\r\n }\r\n },\r\n function () {\r\n //Modal hasbeen canceleled...show some kind of error represnting reason why it was cancelled\r\n },\r\n );\r\n };\r\n\r\n self.refresh = function () {\r\n if ($scope.plan && $scope.plan.id) {\r\n $scope.loading = true;\r\n MaintenanceService.getPlanTasks($scope.plan).then(\r\n function (response) {\r\n $scope.tasks = response.data || [];\r\n //update the table\r\n $scope.filteredTasks = $scope.tasks.slice();\r\n $scope.applyFilter();\r\n $scope.loading = false;\r\n },\r\n function (error) {\r\n /**ESD-18577 [Bug] [Maintenance Plans] 404 on maintenance Tasks\r\n remove this for now. This is causing error to be displayed for the task tab\r\n **/\r\n //var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving tasks\");\r\n //if (error.data || error.status) {\r\n // if (error.data.message) {\r\n // errorMsg = error.data.message + \" \" + (error.status.toString());\r\n // }\r\n // else {\r\n // errorMsg += \": \" + (error.status.toString());\r\n // }\r\n //}\r\n //else {\r\n // errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n //}\r\n //$scope.onLoadErrorText = errorMsg;\r\n //$scope.onLoadErrorFlag = true;\r\n //$scope.loading = false;\r\n },\r\n );\r\n }\r\n };\r\n\r\n //ON INIT\r\n //If the plan currently exists try and get the associated tasks\r\n\r\n $scope.$watch('plan', function (newVal, oldVal) {\r\n self.refresh();\r\n });\r\n }\r\n}\r\n","import moment from 'moment';\r\nconst EVENT_TRACKING_NAME = 'maintenanceAssetModal';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n calculateByDate: 'calculateByDate',\r\n calculateByHistorical: 'calculateByHistorical',\r\n cancelClicked: 'cancelClicked',\r\n confirmClicked: 'confirmClicked',\r\n};\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data }\r\n });\r\n} \r\n\r\nexport default ($scope, $uibModalInstance, selected, equipmentDetailsService, gettextCatalog, $q) => {\r\n 'ngInject';\r\n\r\n $scope.initialization = '';\r\n $scope.addedAssets = [];\r\n $scope.defaultServiceDate = moment().toDate();\r\n $scope.loadingServiceReadings = true;\r\n $scope.selectedAssets = selected;\r\n\r\n const buildAssetWithServiceReading = asset => {\r\n const runtime = asset.onei3.series.run_time ? asset.onei3.series.run_time.last : undefined;\r\n\r\n return $q.when({\r\n asset: {\r\n id: asset.id,\r\n name: asset.name\r\n },\r\n serviceReading: {\r\n odometer: asset.onei3.series.odometer ? parseInt(asset.onei3.series.odometer.last.v) : 0,\r\n runhour: runtime ? parseInt(asset.onei3.series.run_time.last.v) : 0,\r\n date: runtime ? moment(asset.onei3.series.run_time.last.t).toDate() : moment().toDate()\r\n }\r\n });\r\n };\r\n\r\n const setupServiceReadings = selected => {\r\n const fetchServiceReadingsPromises = [];\r\n\r\n selected.added.forEach(added => {\r\n const promise = equipmentDetailsService\r\n .get(added, ['series'], null)\r\n .then(buildAssetWithServiceReading)\r\n .then(asset => $scope.addedAssets.push(asset));\r\n\r\n fetchServiceReadingsPromises.push(promise);\r\n });\r\n\r\n $q.all(fetchServiceReadingsPromises)\r\n .catch(() => {\r\n $scope.errorText = gettextCatalog.getString('An error occurred while retrieving timeseries data');\r\n $scope.errorFlag = true;\r\n $scope.loadingServiceReadings = false;\r\n })\r\n .finally(() => {\r\n $scope.loadingServiceReadings = false;\r\n });\r\n };\r\n\r\n setupServiceReadings(selected);\r\n $scope.updateModelForDefaultServiceDate = function(date) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByDate,\r\n date: date,\r\n });\r\n $scope.defaultServiceDate = date;\r\n };\r\n\r\n $scope.setDateForAllChecked = function(checked) {\r\n $scope.setMaintenanceDateForAll = checked;\r\n };\r\n\r\n $scope.ok = function() {\r\n addToDataLayer({\r\n event: EVENT_TRACKING_ACTIONS.confirmClicked,\r\n });\r\n\r\n $scope.addedAssets.forEach(asset => {\r\n //max value for integer = 2147483647\r\n if (\r\n asset.serviceReading.odometer > 2147483647 ||\r\n asset.serviceReading.odometer === undefined ||\r\n asset.serviceReading.runhour > 2147483647 || asset.serviceReading.runhour === undefined\r\n ) {\r\n $scope.errorText = gettextCatalog.getString(\r\n 'Odometer or Run Hours number is too large. Please ensure the Odometer and Run Hours are below 2,147,483,647'\r\n );\r\n $scope.errorFlag = true;\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n $uibModalInstance.close({\r\n assets: $scope.addedAssets,\r\n setDateForAll: $scope.initialization === 'date',\r\n defaultServiceDate: $scope.defaultServiceDate,\r\n selectedAssets: $scope.selectedAssets\r\n });\r\n };\r\n\r\n $scope.cancel = function() {\r\n addToDataLayer({\r\n event: EVENT_TRACKING_ACTIONS.cancelClicked,\r\n });\r\n\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n $scope.$on('$locationChangeStart', function(event) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n $scope.calculateByDateClicked = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByDate,\r\n clicked: true,\r\n });\r\n }\r\n\r\n $scope.calculateByHistoricalClicked = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByHistorical,\r\n clicked: true,\r\n });\r\n }\r\n\r\n $scope.historicalAssetDateChanged = (asset) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByHistorical,\r\n dateChanged: true,\r\n assetId: asset?.asset?.id\r\n });\r\n }\r\n\r\n $scope.historicalAssetOdometerChanged = (asset ) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByHistorical,\r\n odomoterChanged: asset.serviceReading?.odometer,\r\n assetId: asset?.asset?.id\r\n });\r\n }\r\n\r\n $scope.historicalAssetRunhourChanged = (asset) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calculateByHistorical,\r\n runhourChanged: asset.serviceReading?.runhour,\r\n assetId: asset?.asset?.id\r\n });\r\n }\r\n};\r\n","import InitializeAssetsController from '../../modals/intialize-assets.controller';\r\n\r\nexport const PlanFormAssetsDirective = () => {\r\n return {\r\n restrict: 'E',\r\n template: require('./assets.html'),\r\n transclude: true,\r\n scope: {\r\n plan: '=',\r\n assets: '=?'\r\n },\r\n controller: 'PlanFormAssetsController'\r\n };\r\n};\r\n\r\nexport const PlanFormAssetsController = ($scope, $uibModal, $filter, gettextCatalog, MaintenanceService) => {\r\n 'ngInject';\r\n\r\n //Public\r\n $scope.error = {};\r\n $scope.error.equipment = false;\r\n $scope.confirmed = false;\r\n $scope.existsAssets = false;\r\n $scope.assetSelected = false;\r\n $scope.filteredAssets = [];\r\n $scope.serviceReadings = [];\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n $scope.datepickerFormat = 'M/d/yy';\r\n $scope.loadingServiceReadings = false;\r\n $scope.orderBy = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.applyFilter = function () {\r\n if (!$scope.assets) return;\r\n $scope.filteredAssets = $filter('filter')($scope.assets, $scope.searchText);\r\n };\r\n\r\n $scope.addAssets = function () {\r\n $scope.errorFlag = false;\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n selectedAssets: () => {\r\n let obj = {};\r\n $scope.assets.forEach(asset => {\r\n obj[asset.id] = asset;\r\n });\r\n return obj;\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(\r\n function (selectedAssets) {\r\n if ((selectedAssets.added && selectedAssets.added.length > 0) && selectedAssets.removed.length === 0) {\r\n $scope.openServiceModal(selectedAssets);\r\n }\r\n else if ((selectedAssets.removed && selectedAssets.removed.length > 0) && selectedAssets.added.length === 0) {\r\n removeAssetsFromPlan(selectedAssets);\r\n }\r\n else if (selectedAssets.added.length > 0 && selectedAssets.removed.length > 0) {\r\n $scope.openServiceModal(selectedAssets);\r\n }\r\n },\r\n function () { }\r\n );\r\n };\r\n\r\n $scope.openServiceModal = selectedAssets => {\r\n $scope.error.equipment = false;\r\n $scope.errorFlag = false;\r\n\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n size: 'lg',\r\n template: require('./add-asset.html'),\r\n controller: InitializeAssetsController,\r\n resolve: {\r\n selected: function () {\r\n return selectedAssets;\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(function (result) {\r\n if (result.selectedAssets.removed && result.selectedAssets.removed.length > 0) {\r\n removeAssetsFromPlan(result.selectedAssets);\r\n }\r\n\r\n let addedEquipmentChangeSet = {\r\n op: 'add',\r\n values: []\r\n };\r\n\r\n if (result.assets.length > 0) {\r\n for (let j in result.assets) {\r\n if (result.setDateForAll === true) {\r\n addedEquipmentChangeSet.values.push({\r\n equipmentId: result.assets[j].asset.id,\r\n initializeWith: {\r\n odometer: result.assets[j].serviceReading.odometer,\r\n runhour: result.assets[j].serviceReading.runhour,\r\n date: result.defaultServiceDate\r\n }\r\n });\r\n } else {\r\n addedEquipmentChangeSet.values.push({\r\n equipmentId: result.assets[j].asset.id,\r\n initializeWith: result.assets[j].serviceReading\r\n });\r\n }\r\n }\r\n addAssetsToPlan(addedEquipmentChangeSet); \r\n }\r\n });\r\n };\r\n\r\n function addAssetsToPlan(addedEquipmentChangeSet) {\r\n MaintenanceService.updateEquipmentForPlan($scope.plan, addedEquipmentChangeSet)\r\n .then(function () {\r\n return MaintenanceService.getEquipmentForPlan($scope.plan);\r\n })\r\n .then(function (response) {\r\n $scope.assets = [];\r\n $scope.existsAssets = false;\r\n $scope.assetSelected = false;\r\n _.forEach(response.data, function (asset) {\r\n $scope.assets.push(asset);\r\n });\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.applyFilter();\r\n if ($scope.assets.length > 0) $scope.existsAssets = true;\r\n })\r\n .catch(function () {\r\n $scope.errorText = gettextCatalog.getString(\r\n 'An error occurred while trying to add assets to the maintenance plan.'\r\n );\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n function removeAssetsFromPlan(selectedAssets) {\r\n let removedEquipmentChangeSet = { op: 'remove', values: [] };\r\n selectedAssets.removed.forEach((removedAsset) => {\r\n removedEquipmentChangeSet.values.push({\r\n equipmentId: removedAsset\r\n });\r\n });\r\n MaintenanceService.updateEquipmentForPlan($scope.plan, removedEquipmentChangeSet)\r\n .then(function () {\r\n return MaintenanceService.getEquipmentForPlan($scope.plan);\r\n })\r\n .then(function (response) {\r\n $scope.assets = [];\r\n $scope.existsAssets = false;\r\n $scope.assetSelected = false;\r\n response.data.forEach((asset) => {\r\n $scope.assets.push(asset);\r\n });\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.applyFilter();\r\n $scope.existsAssets = $scope.assets.length > 0;\r\n })\r\n .catch(function (error) {\r\n $scope.errorText = gettextCatalog.getString(\r\n 'An error occurred while trying to remove assets from the maintenance plan'\r\n );\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n\r\n $scope.assetClicked = function () {\r\n let count = 0;\r\n for (let i = 0; i < $scope.assets.length; i++) {\r\n if ($scope.assets[i]._selected) {\r\n $scope.assetSelected = true;\r\n } else {\r\n count++;\r\n }\r\n if (count === $scope.assets.length) {\r\n $scope.assetSelected = false;\r\n }\r\n }\r\n };\r\n\r\n $scope.removeSelectedButtonPressed = function () {\r\n $scope.errorFlag = false;\r\n $scope.error.equipment = false;\r\n let equipmentChangeSet = {\r\n op: 'remove',\r\n values: []\r\n };\r\n let updatedAssets = [];\r\n\r\n for (let i in $scope.assets) {\r\n if ($scope.assets[i]._selected) {\r\n $scope.assetSelected = true;\r\n equipmentChangeSet.values.push({\r\n equipmentId: $scope.assets[i].id\r\n });\r\n } else {\r\n updatedAssets.push($scope.assets[i]);\r\n }\r\n }\r\n if (\r\n equipmentChangeSet.values.length !== 0 &&\r\n equipmentChangeSet.values.length === $scope.assets.length &&\r\n !$scope.confirmed\r\n ) {\r\n $scope.error.equipment = true;\r\n $scope.error.Msg = gettextCatalog.getString('You must have at least one Asset per configuration.');\r\n $scope.loading = false;\r\n return;\r\n }\r\n $scope.loading = true;\r\n\r\n MaintenanceService.updateEquipmentForPlan($scope.plan, equipmentChangeSet)\r\n .then(function () {\r\n $scope.assetSelected = false;\r\n $scope.assets = updatedAssets;\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.applyFilter();\r\n if ($scope.assets.length > 0) {\r\n $scope.existsAssets = true;\r\n } else {\r\n $scope.existsAssets = false;\r\n }\r\n $scope.loading = false;\r\n })\r\n .catch(function () {\r\n $scope.errorText = gettextCatalog.getString('An error occurred while retrieving tasks');\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n $scope.$watch('plan', function () {\r\n if ($scope.plan) {\r\n if ($scope.plan.id) {\r\n $scope.loading = true;\r\n $scope.existsAssets = false;\r\n MaintenanceService.getEquipmentForPlan($scope.plan)\r\n .then(function (response) {\r\n $scope.assets = response.data || [];\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.applyFilter();\r\n if ($scope.assets.length > 0) $scope.existsAssets = true;\r\n $scope.loading = false;\r\n })\r\n .catch(function () {\r\n $scope.onLoadErrorText = gettextCatalog.getString('An error occurred while retrieving assets');\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n });\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const PlanAssetDeleteModalController = ($scope, $uibModalInstance) => {\r\n 'ngInject';\r\n\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.confirmed = false;\r\n\r\n $scope.ok = function () {\r\n $scope.confirmed = true;\r\n $uibModalInstance.close($scope.confirmed);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n};","import moment from 'moment';\r\nimport InitializeAssetsController from '../../modals/intialize-assets.controller';\r\n\r\nconst EVENT_TRACKING_NAME = 'MaintenanceForm';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n nameChanged: 'nameChanged',\r\n descriptionChanged: 'descriptionChanged',\r\n addAssetsClicked: 'addAssetsClicked',\r\n assetsAdded: 'assetsAdded',\r\n assetModelClosed: 'assetModelClosed',\r\n tagAdded: 'tagAdded',\r\n tagRemoved: 'tagRemoved',\r\n notifyEmailsChanged: 'notifyEmailChanged',\r\n scheduleTypeChanged: 'scheduleTypeChange',\r\n meterBasedChange: 'meterBasedChange',\r\n calendarBasedChange: 'calendarBasedChange',\r\n meterToggleClicked: 'meterToggleClicked',\r\n calendarToggleClicked: 'calendarToggleClicked',\r\n documentLinkNameChanged: 'documentLinkChanged',\r\n documentLinkDescriptionChanged: 'documentLinkDescriptionChanged',\r\n documentLinkURLChanged: 'documentLinkURLChanged',\r\n documentLinkAddClicked: 'documentLinkAddClicked',\r\n documentLinkEditToggle: 'documentLinkEditToggle',\r\n documentLinkRemoveClicked: 'documentLinkRemoveClicked',\r\n documentLinkPaginationChanged: 'documentLinkPaginationChanged',\r\n}\r\n\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data }\r\n });\r\n}\r\n\r\nexport default function FormMaintenanceDirective() {\r\n return {\r\n template: require('./form.directive.html'),\r\n restrict: 'E',\r\n transclude: true,\r\n scope: false,\r\n controller: FormMaintenanceController,\r\n };\r\n\r\n function FormMaintenanceController(gettextCatalog, $scope, $uibModal, $filter) {\r\n 'ngInject';\r\n\r\n let self = this;\r\n\r\n $scope.numSelectedAssets = 0;\r\n $scope.maxSelection = 1;\r\n $scope.assets = [];\r\n $scope.loading = false;\r\n $scope.Meter = false;\r\n $scope.Calendar = false;\r\n $scope.dateOptions = {\r\n initDate: moment().toDate(),\r\n 'starting-day': 1,\r\n };\r\n //manage document link\r\n $scope.documentLinks = [];\r\n $scope.document = {};\r\n $scope.document.name = '';\r\n $scope.document.description = '';\r\n $scope.document.href = '';\r\n\r\n $scope.editDocLinkObject = [];\r\n $scope.disabledEditing = false;\r\n\r\n $scope.reverse = false;\r\n $scope.documentLinkIndex = 0;\r\n $scope.editingDocLinkFlag = []; //flag for hiding and showing info\r\n\r\n //Pagination for document links\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 5;\r\n $scope.maxSize = 1;\r\n\r\n //flag for url\r\n $scope.invalidUrl = false;\r\n\r\n $scope.planNameChanged = () => {\r\n // If the name is clear, change the submitted to false.\r\n if (!$scope.plan.name) {\r\n $scope.userForm.$submitted = false;\r\n }\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.nameChanged,\r\n });\r\n\r\n // Clear the unique validation when changing the name.\r\n $scope.userForm.title.$setValidity('unique', true);\r\n };\r\n\r\n $scope.descriptionChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.descriptionChanged,\r\n })\r\n }\r\n\r\n $scope.dateRangeOptions = [\r\n {\r\n label: gettextCatalog.getString('Days'),\r\n value: 'day',\r\n },\r\n {\r\n label: gettextCatalog.getString('Weeks'),\r\n value: 'week',\r\n },\r\n {\r\n label: gettextCatalog.getString('Months'),\r\n value: 'month',\r\n },\r\n {\r\n label: gettextCatalog.getString('Years'),\r\n value: 'year',\r\n },\r\n ];\r\n\r\n //Constants\r\n $scope.meterBasedOptions = [\r\n {\r\n value: 'hour',\r\n label: gettextCatalog.getString('Run Hours'),\r\n },\r\n {\r\n value: 'miles',\r\n label: gettextCatalog.getString('Miles'),\r\n },\r\n {\r\n label: gettextCatalog.getString('Kilometers'),\r\n value: 'kilometers',\r\n },\r\n ];\r\n\r\n $scope.$emit('disableMeter', {\r\n Meter: $scope.Meter,\r\n });\r\n $scope.$emit('disableDate', {\r\n Calendar: $scope.Calendar,\r\n });\r\n\r\n self.getCalendarRules = function () {\r\n let result = [];\r\n if (!$scope.plan) {\r\n result = [];\r\n }\r\n $scope.Calendar = false;\r\n for (let i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.id) {\r\n if ($scope.plan.recurrence.rules[i].type === 'date') {\r\n $scope.Calendar = true;\r\n result.push($scope.plan.recurrence.rules[i]);\r\n }\r\n }\r\n }\r\n\r\n if (!result || result.length <= 0) {\r\n $scope.calendarDisabled = true;\r\n $scope.Calendar = false;\r\n result = [\r\n {\r\n type: 'date',\r\n frequency: 'month',\r\n interval: 3,\r\n upcoming: 2,\r\n },\r\n ];\r\n }\r\n\r\n $scope.calendarRules = result;\r\n };\r\n\r\n self.getMeterRules = function () {\r\n let result = [];\r\n\r\n if (!$scope.plan) result = [];\r\n\r\n if (!$scope.plan.id) {\r\n $scope.meterDisabled = true;\r\n $scope.calendarDisabled = true;\r\n }\r\n\r\n $scope.Meter = false;\r\n for (let i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.id) {\r\n if (\r\n $scope.plan.recurrence.rules[i].type === 'odometer' ||\r\n $scope.plan.recurrence.rules[i].type === 'runhour'\r\n ) {\r\n $scope.Meter = true;\r\n }\r\n }\r\n let rule = $scope.plan.recurrence.rules[i];\r\n\r\n for (let j = 0; j < $scope.meterBasedOptions.length; j++) {\r\n if (rule.frequency === $scope.meterBasedOptions[j].value) {\r\n if (rule.frequency === 'hour') {\r\n rule.type = 'runhour';\r\n } else if (rule.frequency === 'miles' || rule.frequency === 'kilometers') {\r\n rule.type = 'odometer';\r\n }\r\n result.push(rule);\r\n }\r\n }\r\n }\r\n\r\n if (!result || result.length <= 0) {\r\n $scope.meterDisabled = true;\r\n $scope.Meter = false;\r\n result = [\r\n {\r\n type: 'runhour',\r\n frequency: 'hour',\r\n interval: 1000,\r\n upcoming: 50,\r\n },\r\n ];\r\n }\r\n $scope.meterRules = result;\r\n };\r\n\r\n self.refresh = function () {\r\n if ($scope.plan) {\r\n $scope.documentLinks = $scope.plan.documentLinks;\r\n }\r\n self.getMeterRules();\r\n self.getCalendarRules();\r\n };\r\n\r\n $scope.toggleFixed = function () {\r\n const fixedType = 'Fixed';\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.scheduleTypeChanged,\r\n scheduleType: fixedType,\r\n });\r\n\r\n $scope.plan.recurrence.algorithm = fixedType;\r\n };\r\n\r\n $scope.toggleOffset = function () {\r\n const offsetType = 'Offset';\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.scheduleTypeChanged,\r\n scheduleType: offsetType,\r\n });\r\n\r\n $scope.plan.recurrence.algorithm = 'Offset';\r\n };\r\n\r\n $scope.$watch('plan', function (val) {\r\n if (val) self.refresh();\r\n });\r\n\r\n $scope.deleteRule = function (rule) {\r\n let index = $scope.plan.recurrence.rules.indexOf(rule);\r\n if (index >= 0) $scope.plan.recurrence.rules.splice(index, 1);\r\n };\r\n\r\n $scope.addAssets = () => {\r\n // Maintenace GTM tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.addAssetsClicked,\r\n });\r\n\r\n $scope.errorFlag = false;\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: () => 0,\r\n selectedAssets: () => $scope.assets,\r\n },\r\n size: 'lg',\r\n });\r\n modalInstance.result.then(retrieveSelectedAssets, canceledModal);\r\n };\r\n\r\n const retrieveSelectedAssets = (selectedAssets) => {\r\n const numOfAssets = selectedAssets.result ? Object.keys(selectedAssets.result).length : 0;\r\n\r\n // Maintenance GTM tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.assetsAdded,\r\n numberOfAssets: numOfAssets,\r\n });\r\n\r\n if (numOfAssets > 0) {\r\n $scope.assets = selectedAssets.result;\r\n $scope.numSelectedAssets = numOfAssets;\r\n let assetIds = Object.getOwnPropertyNames(selectedAssets.result);\r\n openServiceModal(assetIds);\r\n }\r\n };\r\n\r\n const canceledModal = (reason) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.assetModelClosed,\r\n reason: reason || ''\r\n })\r\n }\r\n\r\n const openServiceModal = (assetIds) => {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n bindToController: true,\r\n size: 'lg',\r\n template: require('../assets/add-asset.html'),\r\n controller: InitializeAssetsController,\r\n resolve: {\r\n selected: () => ({ added: assetIds }),\r\n },\r\n });\r\n modalInstance.result.then(addToEquipmentChangeSet, () => { });\r\n };\r\n\r\n const addToEquipmentChangeSet = (assetResult) => {\r\n $scope.equipmentChangeSet = {\r\n op: 'add',\r\n values: [],\r\n };\r\n\r\n assetResult.assets.forEach((asset) => {\r\n let assetObject = {\r\n equipmentId: asset.asset.id,\r\n initializeWith: asset.serviceReading,\r\n };\r\n if (assetResult.setDateForAll === true)\r\n assetObject.initializeWith.date = assetResult.defaultServiceDate;\r\n\r\n $scope.equipmentChangeSet.values.push(assetObject);\r\n });\r\n };\r\n\r\n $scope.tagAdded = (tag) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.tagAdded,\r\n numOfTags: $scope.plan.tags?.length || 0,\r\n })\r\n }\r\n\r\n $scope.tagRemoved = (tag) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.tagRemoved,\r\n numOfTags: $scope.plan.tags?.length || 0,\r\n })\r\n }\r\n $scope.emailsChanged = (emails) => {\r\n $scope.plan.contacts = emails;\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.notifyEmailsChanged,\r\n numberOfEmails: $scope.plan.contacts.length || 0,\r\n })\r\n\r\n }\r\n\r\n $scope.toggleMeterRules = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.meterBasedChange,\r\n });\r\n $scope.$emit('disableMeter', {\r\n Meter: $scope.Meter,\r\n });\r\n };\r\n\r\n $scope.toggleCalendarRules = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calendarToggleClicked,\r\n });\r\n $scope.$emit('disableDate', {\r\n Calendar: $scope.Calendar,\r\n CalendarRules: $scope.calendarRules,\r\n });\r\n };\r\n\r\n $scope.$watch('meterRules', function () {\r\n $scope.$emit('meterRulesChange', {\r\n MeterRules: $scope.meterRules,\r\n });\r\n });\r\n\r\n $scope.$watch('calendarRules', function () {\r\n $scope.$emit('calendarRulesChange', {\r\n CalendarRules: $scope.calendarRules,\r\n });\r\n });\r\n\r\n $scope.greaterThanZeroCheck = function (value, component) {\r\n if (value > 0) {\r\n component.$setValidity('min', true);\r\n } else {\r\n component.$setValidity('min', false);\r\n }\r\n };\r\n\r\n $scope.negativeCheck = function (value, component) {\r\n if (value >= 0) {\r\n component.$setValidity('min', true);\r\n } else {\r\n component.$setValidity('min', false);\r\n }\r\n };\r\n\r\n $scope.validateUpcoming = function (component, interval, frequency) {\r\n if (frequency.match(/^(hour|miles|kilometers)$/))\r\n $scope.isMeterUpcomingGreat = (component.$modelValue > interval ? true : false);\r\n\r\n if (!frequency.match(/^(day)$/)) {\r\n $scope.isCalendarUpcomingGreat = false;\r\n } else {\r\n $scope.isCalendarUpcomingGreat = (component.$modelValue > interval ? true : false);\r\n }\r\n };\r\n $scope.meterDueInputChanged = (interval) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.meterBasedChange,\r\n dueInterval: interval\r\n });\r\n }\r\n\r\n $scope.meterUpcomingChanged = (interval) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.meterBasedChange,\r\n upcomingInterval: interval\r\n });\r\n }\r\n\r\n $scope.meterOptionChanged = (frequency) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.meterBasedChange,\r\n unitOfMeasure: frequency,\r\n });\r\n }\r\n\r\n $scope.calendarDueInputChanged = (interval) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calendarBasedChange,\r\n dueInterval: interval\r\n })\r\n }\r\n\r\n $scope.calendarUpcomingInputChanged = (interval) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calendarBasedChange,\r\n upcomingInterval: interval\r\n });\r\n }\r\n\r\n $scope.calendarOptionChanged = (frequency) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.calendarBasedChange,\r\n unitOfMeasure: frequency,\r\n });\r\n }\r\n\r\n //add new document link\r\n $scope.addNewDocumentLink = function (document) {\r\n if (\r\n document.name.length <= 0 &&\r\n document.description.length <= 0 &&\r\n document.href.length <= 0\r\n ) {\r\n return;\r\n }\r\n\r\n if (!validateUrl(document.href)) {\r\n $scope.invalidUrl = true;\r\n return;\r\n } else {\r\n $scope.invalidUrl = false;\r\n }\r\n\r\n $scope.document = document;\r\n\r\n if (!$scope.documentLinks) {\r\n $scope.documentLinks = [];\r\n }\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkAddClicked,\r\n });\r\n\r\n $scope.documentLinks.push({\r\n name: $scope.document.name,\r\n description: $scope.document.description,\r\n href: $scope.document.href,\r\n });\r\n $scope.document.name = '';\r\n $scope.document.description = '';\r\n $scope.document.href = '';\r\n };\r\n \r\n $scope.documentLinkNameChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkNameChanged,\r\n });\r\n }\r\n\r\n $scope.documentLinkDescriptionChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkDescriptionChanged,\r\n });\r\n }\r\n\r\n $scope.documentLinkURLChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkURLChanged,\r\n });\r\n }\r\n\r\n $scope.deleteBtnClicked = function (index) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkRemoveClicked,\r\n index: index,\r\n });\r\n $scope.documentLinks.splice(index, 1);\r\n };\r\n\r\n //Editing document link\r\n $scope.toggleEditing = function (index) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkEditToggle,\r\n index: index,\r\n });\r\n\r\n $scope.editingDocLinkFlag[index] = !$scope.editingDocLinkFlag[index];\r\n $scope.editDocLinkObject[index] = {};\r\n $scope.editDocLinkObject[index].name = $scope.documentLinks[index].name;\r\n $scope.editDocLinkObject[index].description = $scope.documentLinks[index].description;\r\n $scope.editDocLinkObject[index].href = $scope.documentLinks[index].href;\r\n $scope.disabledEditing = true;\r\n };\r\n\r\n $scope.documentLinkPaginationChanged = () => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkPaginationChanged,\r\n currentPage: $scope.currentPage,\r\n })\r\n }\r\n\r\n $scope.cancelEdit = function (index) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.documentLinkEditToggle,\r\n index: index,\r\n })\r\n $scope.editingDocLinkFlag[index] = !$scope.editingDocLinkFlag[index];\r\n $scope.editDocLinkObject[index] = {};\r\n $scope.disabledEditing = false;\r\n };\r\n\r\n $scope.updateDocumentLink = function (documentLink, index) {\r\n $scope.documentLinks[index] = documentLink;\r\n if (!validateUrl(documentLink.href)) {\r\n $scope.invalidEditUrl = true;\r\n return;\r\n } else {\r\n $scope.invalidEditUrl = false;\r\n $scope.editingDocLinkFlag[index] = !$scope.editingDocLinkFlag[index];\r\n $scope.editDocLinkObject[index] = {};\r\n $scope.disabledEditing = false;\r\n }\r\n };\r\n\r\n //validate url for maintenance doc link\r\n let validateUrl = (url) => {\r\n //var url = url.toLowerCase();\r\n let urlPattern = new RegExp('https?://([-a-z.A-Z0-9@:%_+.~#?&//=]*)');\r\n let validUrl = url.toLowerCase().match(urlPattern);\r\n return validUrl; //return true if valid ; flase if invalid\r\n };\r\n\r\n //calculate the index for array object\r\n $scope.getIndex = function (index) {\r\n return ($scope.currentPage - 1) * $scope.itemsPerPage + index;\r\n };\r\n\r\n //Sort doc links\r\n $scope.orderDocumentLinksFilter = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n\r\n $scope.documentLinks.forEach((docLinks) => {\r\n docLinks[predicate] = docLinks[predicate];\r\n });\r\n\r\n $scope.documentLinks = $filter('orderBy')($scope.documentLinks, predicate, $scope.reverse);\r\n };\r\n }\r\n}\r\n","import angular from 'angular';\r\n\r\n/* Controller Imports */\r\nimport CreatePlanController from './create/create.controller';\r\nimport MaintenancePlansController from './plans.controller';\r\nimport MaintenancePlansDeleteModalController from './details/delete/delete.controller';\r\nimport MaintenancePlansDetailsController from './details/details.controller';\r\nimport MaintenancePlansDetailsTasksController from './details/tasks/tasks.controller';\r\n/* Directive Imports */\r\nimport PlanFormScheduleDirective from './create/schedule/schedule.directive';\r\nimport PlanFormTasksDirective from './create/tasks/tasks.directive';\r\n/* Named/Mix Imports */\r\nimport {\r\n PlanAssetDeleteModalController,\r\n PlanFormAssetsController,\r\n PlanFormAssetsDirective\r\n} from './create/assets/assets.directive';\r\n\r\nimport FormMaintenanceDirective from './create/form/form.directive';\r\n\r\nconst planModule = angular\r\n .module('app.maintenance.plans', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n .controller('CreatePlanController', CreatePlanController)\r\n .controller('MaintenancePlansController', MaintenancePlansController)\r\n .controller('MaintenancePlansDeleteModalController', MaintenancePlansDeleteModalController)\r\n .controller('MaintenancePlansDetailsController', MaintenancePlansDetailsController)\r\n .controller('MaintenancePlansDetailsTasksController', MaintenancePlansDetailsTasksController)\r\n .controller('PlanAssetDeleteModalController', PlanAssetDeleteModalController)\r\n .controller('PlanFormAssetsController', PlanFormAssetsController)\r\n /* Directives */\r\n .directive('planFormAssets', PlanFormAssetsDirective)\r\n .directive('planFormSchedule', PlanFormScheduleDirective)\r\n .directive('planFormTasks', PlanFormTasksDirective)\r\n .directive('formMaintenance', FormMaintenanceDirective);\r\n\r\nexport default planModule.name;\r\n","\r\nexport default function PlanFormScheduleDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./schedule.html'),\r\n scope: {\r\n plan: '=',\r\n edit: '='\r\n },\r\n controller: function ($scope, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n var self = this;\r\n //Constants\r\n $scope.dateRangeOptions = [{\r\n label: gettextCatalog.getString('Days'),\r\n value: 'day'\r\n }, {\r\n\r\n label: gettextCatalog.getString('Weeks'),\r\n value: 'week'\r\n },\r\n {\r\n label: gettextCatalog.getString('Months'),\r\n value: 'month'\r\n },\r\n {\r\n label: gettextCatalog.getString('Years'),\r\n value: 'year'\r\n }\r\n ];\r\n\r\n //Constants\r\n $scope.meterBasedOptions = [{\r\n value: 'hour',\r\n label: gettextCatalog.getString('Run Hours')\r\n\r\n }, {\r\n value: 'miles',\r\n label: gettextCatalog.getString('Miles')\r\n\r\n },\r\n {\r\n label: gettextCatalog.getString('Kilometers'),\r\n value: 'kilometers'\r\n }\r\n ];\r\n\r\n $scope.Meter = false;\r\n $scope.Calendar = true;\r\n $scope.$emit('disableMeter', {\r\n Meter: $scope.Meter\r\n });\r\n $scope.$emit('disableDate', {\r\n Calendar: $scope.Calendar\r\n });\r\n\r\n var getCalendarRules = function () {\r\n var result = [];\r\n\r\n if (!$scope.plan) {\r\n result = [];\r\n }\r\n\r\n $scope.Calendar = false;\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.id) {\r\n if ($scope.plan.recurrence.rules[i].type == \"date\") {\r\n $scope.Calendar = true;\r\n $scope.calendarDisabled = false;\r\n result.push($scope.plan.recurrence.rules[i]);\r\n }\r\n }\r\n }\r\n\r\n if (!result || result.length <= 0) {\r\n $scope.calendarDisabled = true;\r\n $scope.Calendar = false;\r\n result = [{\r\n \"type\": \"date\",\r\n \"frequency\": \"month\",\r\n \"interval\": 3,\r\n \"upcoming\": 2\r\n }];\r\n\r\n }\r\n\r\n $scope.calendarRules = result;\r\n };\r\n\r\n var getMeterRules = function () {\r\n var result = [];\r\n\r\n if (!$scope.plan) result = [];\r\n\r\n if (!$scope.plan.id) {\r\n $scope.meterDisabled = true;\r\n }\r\n\r\n $scope.Meter = false;\r\n for (var i = 0; i < $scope.plan.recurrence.rules.length; i++) {\r\n if ($scope.plan.id) {\r\n if ($scope.plan.recurrence.rules[i].type == \"odometer\" || $scope.plan.recurrence.rules[i].type == \"runhour\") {\r\n $scope.Meter = true;\r\n $scope.meterDisabled = false;\r\n }\r\n }\r\n var rule = $scope.plan.recurrence.rules[i];\r\n\r\n for (var j = 0; j < $scope.meterBasedOptions.length; j++) {\r\n\r\n if (rule.frequency == $scope.meterBasedOptions[j].value) {\r\n if (rule.frequency == \"hour\") {\r\n rule.type = \"runhour\";\r\n } else if (rule.frequency == \"miles\" || rule.frequency == \"kilometers\") {\r\n rule.type = \"odometer\";\r\n }\r\n result.push(rule);\r\n }\r\n }\r\n }\r\n\r\n if (!result || result.length <= 0) {\r\n $scope.meterDisabled = true;\r\n $scope.Meter = false;\r\n result = [{\r\n \"type\": \"runhour\",\r\n \"frequency\": \"hour\",\r\n \"interval\": 1000,\r\n \"upcoming\": 50\r\n }];\r\n }\r\n $scope.meterRules = result;\r\n };\r\n\r\n self.refresh = function () {\r\n getMeterRules();\r\n getCalendarRules();\r\n };\r\n\r\n $scope.toggleFixed = function () {\r\n $scope.plan.recurrence.algorithm = \"Fixed\";\r\n };\r\n\r\n $scope.toggleOffset = function () {\r\n $scope.plan.recurrence.algorithm = \"Offset\";\r\n };\r\n\r\n $scope.$watch('plan', function (val) {\r\n if (val) self.refresh();\r\n });\r\n\r\n $scope.deleteRule = function (rule) {\r\n var index = $scope.plan.recurrence.rules.indexOf(rule);\r\n if (index >= 0) $scope.plan.recurrence.rules.splice(index, 1);\r\n };\r\n\r\n $scope.addAssetsButtonSelected = function () {\r\n\r\n };\r\n\r\n $scope.toggleMeterRules = function (check) {\r\n $scope.meterDisabled = !check;\r\n $scope.$emit('disableMeter', {\r\n Meter: $scope.Meter\r\n });\r\n\r\n };\r\n\r\n $scope.toggleCalendarRules = function (check) {\r\n $scope.calendarDisabled = !check;\r\n $scope.$emit('disableDate', {\r\n Calendar: $scope.Calendar,\r\n CalendarRules: $scope.calendarRules\r\n });\r\n };\r\n\r\n $scope.$watch('meterRules', function (val) {\r\n $scope.$emit('meterRulesChange', {\r\n MeterRules: $scope.meterRules\r\n });\r\n });\r\n\r\n $scope.$watch('calendarRules', function (val) {\r\n $scope.$emit('calendarRulesChange', {\r\n CalendarRules: $scope.calendarRules\r\n });\r\n });\r\n }\r\n };\r\n}\r\n","const EVENT_TRACKING_NAME = 'MaintenanceHistory';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n searchInputChanged: 'searchInputChanged',\r\n exportCSV: 'exportCSV',\r\n viewDetailsClicked: 'viewDetailsClicked',\r\n paginationChanged: 'paginationChanged',\r\n planNameClicked: 'planNameClicked',\r\n assetNameClicked: 'assetNameClicked',\r\n orderTableChanged: 'orderTableChanged',\r\n};\r\nconst addToDataLayer = (data) => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n};\r\nexport default function MaintenanceHistoryController(\r\n $scope,\r\n $filter,\r\n MaintenanceService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Local Variables\r\n $scope.searchText = '';\r\n $scope.statusData = [];\r\n $scope.filteredStatusData = [];\r\n\r\n //Sorting\r\n $scope.predicate = 'equipment.name';\r\n $scope.reverse = true;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n //Sort filteredStatusData\r\n $scope.orderStatusData = function (predicate) {\r\n $scope.reverse = predicate === $scope.predicate ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.orderTableChanged,\r\n orderBy: predicate,\r\n descending: $scope.reverse,\r\n });\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.paginationChanged,\r\n currentPage: $scope.currentPage,\r\n });\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.searchText) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.searchInputChanged,\r\n });\r\n }\r\n\r\n $scope.filteredStatusData = $filter('filter')($scope.statusData, $scope.searchText);\r\n };\r\n\r\n //$scope.statusData = [];\r\n //ON INIT\r\n var refresh = function () {\r\n $scope.loading = true;\r\n MaintenanceService.getHistory()\r\n .then(\r\n function (response) {\r\n $scope.statusData = response?.data?.map((item) => {\r\n return {\r\n ...item,\r\n completedAt: typeof item.completedAt === \"undefined\"?\"\":new Date($filter('TableDateFilter')(item.completedAt)),\r\n completed: item.completed\r\n ? gettextCatalog.getString('Completed')\r\n : gettextCatalog.getString('Incomplete'),\r\n };\r\n });\r\n\r\n $scope.filteredStatusData = $scope.statusData.slice();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving maintenance history data',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n )\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n refresh();\r\n\r\n //CSV file\r\n $scope.getCsvFileName = function () {\r\n if (!$scope.statusData) return '';\r\n\r\n var fileName = gettextCatalog.getString('data_export');\r\n var name = gettextCatalog.getString('Maintenance History');\r\n return fileName + '.' + name + '.csv';\r\n };\r\n\r\n $scope.getCsvData = function () {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportCSV,\r\n });\r\n return [\r\n {\r\n Asset: 'Asset',\r\n Plan: 'Plan',\r\n Status: 'Status',\r\n 'Completed At': 'Completed At',\r\n },\r\n ...GetOrderedCSVList(),\r\n ];\r\n };\r\n\r\n function GetOrderedCSVList() {\r\n const list = $filter('orderBy')($scope.filteredStatusData, $scope.predicate, $scope.reverse);\r\n return list.map((item) => {\r\n return {\r\n Asset: item.equipment.name,\r\n Plan: item.plan.name,\r\n Status: item.completed,\r\n completedAt: item.completedAt,\r\n };\r\n });\r\n }\r\n\r\n $scope.viewDetailsClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.viewDetailsClicked,\r\n id: id,\r\n });\r\n };\r\n\r\n $scope.assetNameClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.assetNameClicked,\r\n equipmentId: id,\r\n });\r\n };\r\n\r\n $scope.planNameClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.planNameClicked,\r\n planId: id,\r\n });\r\n };\r\n}\r\n","export default function MaintenanceHistoryDetailsController($scope, $stateParams, $q, MaintenanceService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n var vm = this;\r\n vm.$onInit = function () {\r\n refresh();\r\n };\r\n\r\n $scope.expandArrowClicked = function (id) {\r\n for (var i = 0; i < $scope.tasks.length; i++) {\r\n if ($scope.tasks[i].id === id) {\r\n $scope.tasks[i].isSelected = true;\r\n }\r\n }\r\n };\r\n\r\n $scope.downArrowClicked = function (id) {\r\n for (var i = 0; i < $scope.tasks.length; i++) {\r\n if ($scope.tasks[i].id === id) {\r\n $scope.tasks[i].isSelected = !$scope.tasks[i].isSelected;\r\n }\r\n }\r\n };\r\n\r\n $scope.loading = true;\r\n var refresh = function () {\r\n function handleError(error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving maintenance history data\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n return $q.reject();\r\n }\r\n\r\n $scope.loading = true;\r\n\r\n MaintenanceService.getServiceRecord($stateParams.id).then(function (response) {\r\n\r\n $scope.record = response.data;\r\n $scope.planData = response.data.plan;\r\n $scope.assetData = response.data.equipment;\r\n\r\n var planDataPromise = MaintenanceService.getServiceRecordTasks($stateParams.id);\r\n var planTasksPromise = MaintenanceService.getPlanTasks($scope.planData.id);\r\n\r\n return $q.all([planDataPromise, planTasksPromise]);\r\n }).then(function (response) {\r\n $scope.tasks = [];\r\n $scope.completedTasks = response[0].data;\r\n\r\n //lets merge the completed task with the plan task for all properties\r\n //inputs belongs to each object, in the case for a completed task its {key, value}\r\n response.forEach(function (entry) {\r\n entry.data.forEach(function (entryData) {\r\n var completed = _.filter($scope.completedTasks, function (ct) {\r\n return ct.taskId === entryData.id;\r\n });\r\n\r\n if (completed.length !== 0) {\r\n $scope.tasks.push(angular.extend(entryData, {\r\n _inputs: completed[0].inputs\r\n }));\r\n }\r\n\r\n });\r\n });\r\n\r\n $scope.loading = false;\r\n }).catch(handleError);\r\n };\r\n}","/* Controllers */\r\nimport MaintenanceHistoryController from './history.controller';\r\nimport MaintenanceHistoryDetailsController from './details/details.controller';\r\n\r\nconst historyModule = angular.module('app.maintenance.history', [\r\n\t'ui.bootstrap',\r\n\t'ui.router',\r\n\t'gettext'\r\n]);\r\n\r\nhistoryModule\r\n// Controllers of the history module\r\n.controller('MaintenanceHistoryController', MaintenanceHistoryController)\r\n.controller('MaintenanceHistoryDetailsController', MaintenanceHistoryDetailsController);\r\n\r\nexport default historyModule.name;\r\n","const EVENT_TRACKING_NAME = 'MaintenanceBoard';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n upcomingClicked: 'upcomingClicked',\r\n dueClicked: 'dueClicked',\r\n upcomingDueClicked: 'upcomingDueClicked',\r\n exportCSVClicked: 'exportCSVClicked',\r\n inputChanged: 'inputChanged',\r\n completeClicked: 'completeClicked',\r\n paginationChanged: 'paginationChanged',\r\n tableOrderChanged: 'tableOrderChanged',\r\n assetNameClicked: 'assetNameClicked',\r\n planNameClicked: 'planNameClicked',\r\n completeModalClosed: 'completeModalClosed',\r\n completeModalResolved: 'completeModalResolved',\r\n topDuePlanClicked: 'topDuePlanClicked',\r\n topUpcomingPlanClicked: 'topUpcomingPlanClicked',\r\n};\r\n// Add to data layer\r\nconst addToDataLayer = data => {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n};\r\nexport default function MaintenanceBoardController(\r\n $scope,\r\n $filter,\r\n MaintenanceService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.filterData = true;\r\n $scope.filterStatus = 2;\r\n $scope.selectedStatus = 'Upcoming';\r\n $scope.loading = true;\r\n $scope.filtering = true;\r\n $scope.dataAvailable = false;\r\n $scope.okay = true;\r\n $scope.query = '';\r\n\r\n //Local Variables\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.statusData = [];\r\n $scope.filteredStatusData = [];\r\n $scope.statusDataByPage = [];\r\n\r\n //Sorting\r\n $scope.predicate = 'equipment.name';\r\n $scope.reverse = true;\r\n var orderBy = $filter('orderBy');\r\n\r\n\r\n //Sort filteredStatusData\r\n $scope.orderStatusData = function(predicate, onLoad) {\r\n $scope.predicate = predicate;\r\n\r\n if (!onLoad) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.tableOrderChanged,\r\n propertyOrder: predicate,\r\n descending: $scope.reverse,\r\n });\r\n }\r\n\r\n angular.forEach($scope.filteredStatusData, function(statusEntry) {\r\n statusEntry[predicate] = statusEntry[predicate];\r\n });\r\n $scope.filteredStatusData = orderBy($scope.filteredStatusData, predicate, $scope.reverse);\r\n\r\n $scope.displayStatusDataByPage();\r\n };\r\n\r\n $scope.completeMaintenancePlan = (statusEntry) => {\r\n const {\r\n equipment,\r\n plan\r\n } = statusEntry;\r\n\r\n // Maintance Tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.completeClicked,\r\n equipmentId: equipment.id,\r\n planId: plan.id\r\n });\r\n\r\n const equipmentData = {\r\n data: {\r\n id: equipment.id,\r\n attributes: equipment,\r\n },\r\n };\r\n\r\n const planData = {\r\n id: plan.id,\r\n attributes: plan,\r\n };\r\n\r\n MaintenanceService\r\n .showPopupForEquipmentPlan(equipmentData.data, planData)\r\n .result\r\n .then(\r\n (response) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.completeModalResolved\r\n });\r\n refresh();\r\n\r\n },\r\n (reason) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.completeModalClosed,\r\n reason: reason || '',\r\n });\r\n }\r\n );\r\n\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n statusPage: 1,\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //displaySecurityGroupsByPage() is used to set the legnth of paging needed for filteredSecurityGroups.\r\n $scope.displayStatusDataByPage = function() {\r\n $scope.totalItems = $scope.filteredStatusData.length;\r\n var begin = ($scope.current.statusPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.statusDataByPage = $scope.filteredStatusData.slice(begin, end);\r\n $scope.loading = false;\r\n $scope.filtering = false;\r\n };\r\n\r\n //Calls displaySecurityGroupsByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function() {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.paginationChanged,\r\n currentPage: $scope.current.statusPage || 0\r\n });\r\n $scope.displayStatusDataByPage();\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = () => {\r\n\r\n if ($scope.search.text) {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.inputChanged,\r\n });\r\n }\r\n\r\n // Ignore case search input\r\n const regSearch = new RegExp($scope.search.text, 'i');\r\n\r\n $scope.filteredStatusData = $scope.statusData.filter(data => {\r\n const {\r\n equipment: { name: equipmentName = '' },\r\n nextService: { runHour = 0 },\r\n plan: { name: planName = '' },\r\n status: { description = '' },\r\n } = data;\r\n\r\n return (\r\n regSearch.test(equipmentName) ||\r\n regSearch.test(runHour) ||\r\n regSearch.test(planName) ||\r\n regSearch.test(description)\r\n );\r\n });\r\n\r\n $scope.displayStatusDataByPage();\r\n };\r\n\r\n var drawMaintenanceChart = function() {\r\n var numOfUpcoming = $scope.aggregateData.upcomingEquipmentCount;\r\n var numOfOthers = $scope.aggregateData.dueEquipmentCount;\r\n var percentage = $scope.aggregateData.upcomingEquipmentPercent;\r\n\r\n if (numOfUpcoming == 0 && numOfOthers == 0) {\r\n numOfOthers = 100;\r\n percentage = 0;\r\n }\r\n\r\n var width = 100;\r\n var height = 100;\r\n var radius = 50;\r\n var donutWidth = 10;\r\n\r\n var svg = d3\r\n .select('#donutchartMaintenance')\r\n .append('svg')\r\n .attr('style', 'margin-left:auto; margin-right:auto; display:block;')\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n var g = svg.append('g').attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');\r\n\r\n var text = g\r\n .append('text')\r\n .attr('text-anchor', 'middle')\r\n .attr('style', 'font-size:2.0em;')\r\n .attr('dy', '0.5em');\r\n\r\n text.text('' + percentage + '%');\r\n\r\n var arc = d3.svg\r\n .arc()\r\n .innerRadius(radius - donutWidth) // UPDATED\r\n .outerRadius(radius);\r\n\r\n var pie = d3.layout\r\n .pie()\r\n .value(function(d) {\r\n return d.count;\r\n })\r\n .sort(null);\r\n\r\n var dataset = [\r\n {\r\n product: 'Maintenance Plans',\r\n count: numOfUpcoming,\r\n color: '#1e88e5',\r\n },\r\n {\r\n product: 'Other',\r\n count: numOfOthers,\r\n empty: true,\r\n color: '#BDBDBD',\r\n },\r\n ];\r\n\r\n var slices = pie(dataset);\r\n\r\n var path = g\r\n .selectAll('path')\r\n .data(slices)\r\n .enter()\r\n .append('path')\r\n .attr('class', 'slice')\r\n\r\n .attr('d', arc)\r\n .attr('fill', function(d, i) {\r\n return d.data.color;\r\n });\r\n };\r\n\r\n var drawDueMaintenanceChart = function() {\r\n var numOfDue = $scope.aggregateData.dueEquipmentCount;\r\n var numOfOthers = $scope.aggregateData.upcomingEquipmentCount;\r\n var percentage = $scope.aggregateData.dueEquipmentPercent;\r\n\r\n if (numOfDue == 0 && numOfOthers == 0) {\r\n numOfOthers = 100;\r\n percentage = 0;\r\n }\r\n\r\n var width = 100;\r\n var height = 100;\r\n var radius = 50;\r\n var donutWidth = 10;\r\n\r\n var svg = d3\r\n .select('#donutchartDue')\r\n .append('svg')\r\n .attr('style', 'margin-left:auto; margin-right:auto; display:block;')\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n var g = svg.append('g').attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');\r\n\r\n var text = g\r\n .append('text')\r\n .attr('text-anchor', 'middle')\r\n .attr('style', 'font-size:2.0em;')\r\n .attr('dy', '0.5em');\r\n\r\n text.text('' + percentage + '%');\r\n\r\n var arc = d3.svg\r\n .arc()\r\n .innerRadius(radius - donutWidth) // UPDATED\r\n .outerRadius(radius);\r\n\r\n var pie = d3.layout\r\n .pie()\r\n .value(function(d) {\r\n return d.count;\r\n })\r\n .sort(null);\r\n\r\n var dataset = [\r\n {\r\n product: 'Maintenance Plans',\r\n count: numOfDue,\r\n color: '#ffb74d',\r\n },\r\n {\r\n product: 'Other',\r\n count: numOfOthers,\r\n empty: true,\r\n color: '#BDBDBD',\r\n },\r\n ];\r\n\r\n var slices = pie(dataset);\r\n\r\n var path = g\r\n .selectAll('path')\r\n .data(slices)\r\n .enter()\r\n .append('path')\r\n .attr('class', 'slice')\r\n\r\n .attr('d', arc)\r\n .attr('fill', function(d, i) {\r\n return d.data.color;\r\n });\r\n };\r\n\r\n var myReadyHandlerTwo = function() {\r\n //alert('worked!');\r\n };\r\n\r\n $scope.topFive = [];\r\n\r\n $scope.differenceArray = [];\r\n\r\n $scope.setPage = function(pageNo) {\r\n $scope.currentPage = pageNo;\r\n };\r\n\r\n $scope.pageChanged = function() {\r\n // $log.log('Page changed to: ' + $scope.currentPage);\r\n $scope.displayStatusDataByPage();\r\n };\r\n\r\n $scope.search = function(asset) {\r\n if ($scope.query.length <= 0) return true;\r\n var query = ('' + $scope.query).toLowerCase(),\r\n fullname = [asset.equipment.name].join(' ').toLowerCase();\r\n return fullname.indexOf(query) > -1;\r\n };\r\n\r\n //ON INIT\r\n //$scope.statusData = [];\r\n $scope.upcomingCounter = 0;\r\n $scope.dueCounter = 0;\r\n $scope.requireMaintenance = 0;\r\n\r\n var handleGetStatusError = function(error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving maintenance status data',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.statusErrorFlag = true;\r\n $scope.statusErrorText = errorMsg;\r\n $scope.loading = false;\r\n };\r\n\r\n var refresh = function() {\r\n MaintenanceService.getStatus().then(function(response) {\r\n $scope.statusData = [];\r\n\r\n for (let i = 0; i < response.data.length; i++) {\r\n const description = response.data[i].status.description.toLowerCase();\r\n if (description === 'upcoming' || description === 'due') {\r\n $scope.statusData.push(response.data[i]);\r\n }\r\n }\r\n\r\n if ($scope.statusData.length > 0) {\r\n $scope.dataAvailable = true;\r\n } else {\r\n $scope.dataAvailable = false;\r\n }\r\n\r\n $scope.filteredStatusData = $scope.statusData.slice();\r\n $scope.orderStatusData($scope.predicate, true);\r\n $scope.loading = false;\r\n $scope.displayStatusDataByPage();\r\n if ($scope.search.text && $scope.filteredStatusData.length >= 0) $scope.applyFilter();\r\n }, handleGetStatusError);\r\n\r\n //no need to chain these, they are not dependent on each other\r\n MaintenanceService.getDashboardAggregate().then(\r\n function(response) {\r\n if (angular.element('#donutchartMaintenance').length) {\r\n $scope.aggregateData = response.data;\r\n\r\n //add percentages ( use to be in api )\r\n var total =\r\n $scope.aggregateData.dueEquipmentCount + $scope.aggregateData.upcomingEquipmentCount;\r\n\r\n $scope.aggregateData.upcomingEquipmentPercent = Math.round(\r\n ($scope.aggregateData.upcomingEquipmentCount / total) * 100,\r\n );\r\n $scope.aggregateData.dueEquipmentPercent =\r\n 100 - $scope.aggregateData.upcomingEquipmentPercent;\r\n\r\n drawMaintenanceChart();\r\n drawDueMaintenanceChart();\r\n\r\n $scope.loading = false;\r\n }\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving maintenance chart data',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.chartErrorFlag = true;\r\n $scope.chartErrorText = errorMsg;\r\n $scope.loading = false;\r\n },\r\n );\r\n };\r\n\r\n //CSV file\r\n $scope.getCsvFileName = function() {\r\n if (!$scope.statusData) return '';\r\n\r\n var fileName = gettextCatalog.getString('data_export');\r\n var name = gettextCatalog.getString('Overdue&Upcoming Maintenance Plans');\r\n fileName += '.' + name;\r\n return fileName + '.csv';\r\n };\r\n\r\n $scope.getCsvData = () => {\r\n // Maintenance GTM tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportCSVClicked,\r\n });\r\n\r\n const filteredCSVData = $scope.filteredStatusData || [];\r\n\r\n let csvData = [].concat({\r\n Asset: 'Asset',\r\n Plan: 'Plan',\r\n Status: 'Status',\r\n 'Last Serviced': 'Last Serviced',\r\n 'Next Service': 'Next Service'\r\n });\r\n\r\n filteredCSVData.forEach(data => {\r\n const {\r\n equipment: { name: equipmentName = '' },\r\n plan: { name: planName = '' },\r\n status: { description = '' },\r\n lastService,\r\n nextService \r\n } = data;\r\n\r\n let csvLastServiced = lastService ? $filter('TableDateFilter')(lastService.date):'';\r\n let csvNextService = nextService ? $filter('TableDateFilter')(nextService.date):'';\r\n\r\n if (nextService && nextService.runHour) {\r\n if (lastService) \r\n csvLastServiced += ` at ${lastService.runHour} runhours`;\r\n\r\n if (nextService)\r\n csvNextService += ` or ${nextService.runHour} runhours`;\r\n }\r\n\r\n csvData.push({\r\n Asset: equipmentName,\r\n Plan: planName,\r\n Status: description,\r\n 'Last Serviced': csvLastServiced,\r\n 'Next Service': csvNextService\r\n });\r\n });\r\n\r\n return csvData;\r\n };\r\n\r\n var filterMaintenanceOnStatus = function(statusCode) {\r\n $scope.filterArray = [];\r\n MaintenanceService.getStatus(null, null, statusCode).then(function(response) {\r\n $scope.result = response.data;\r\n for (var i = 0; i < response.data.length; i++) {\r\n $scope.filterArray.push($scope.result[i]);\r\n }\r\n if ($scope.filterArray.length == 0) {\r\n $scope.filterData = false;\r\n } else {\r\n $scope.filterData = true;\r\n }\r\n $scope.statusData = $scope.filterArray;\r\n //$scope.bigTotalItems = $scope.statusData.length;\r\n\r\n $scope.filtering = false;\r\n\r\n $scope.filteredStatusData = $scope.statusData;\r\n $scope.orderStatusData($scope.predicate, true);\r\n\r\n $scope.displayStatusDataByPage();\r\n if ($scope.search.text && $scope.filteredStatusData.length >= 0) {\r\n $scope.applyFilter();\r\n }\r\n }, handleGetStatusError);\r\n };\r\n\r\n $scope.upcomingClicked = function() {\r\n const upcomingSelected = $scope.upcoming;\r\n $scope.upcoming = !upcomingSelected;\r\n $scope.filtering = true;\r\n\r\n // Maintenance tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.upcomingClicked,\r\n selected: $scope.upcoming,\r\n });\r\n\r\n if (upcomingSelected) {\r\n if ($scope.both) {\r\n $scope.both = !$scope.both;\r\n $scope.due = false;\r\n $scope.dueClicked();\r\n } else refresh();\r\n } else {\r\n $scope.filterStatus = 2;\r\n $scope.selectedStatus = 'Upcoming';\r\n\r\n if ($scope.due) $scope.bothClicked();\r\n else filterMaintenanceOnStatus($scope.filterStatus);\r\n }\r\n };\r\n\r\n $scope.bothClicked = () => {\r\n const both = $scope.both;\r\n\r\n $scope.upcoming = !both;\r\n $scope.due = !both;\r\n $scope.both = !both;\r\n $scope.filtering = true;\r\n $scope.selectedStatus = null;\r\n $scope.filterStatus = 0;\r\n\r\n // Maintenace Tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.upcomingDueClicked,\r\n selected: $scope.both,\r\n });\r\n refresh();\r\n };\r\n\r\n $scope.dueClicked = () => {\r\n const dueSelected = $scope.due;\r\n\r\n $scope.filtering = true;\r\n $scope.due = !$scope.due;\r\n\r\n // Maintenace Tracking\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.dueClicked,\r\n selected: $scope.due,\r\n });\r\n\r\n if (dueSelected) {\r\n if ($scope.both) {\r\n $scope.both = false;\r\n $scope.upcoming = false;\r\n $scope.upcomingClicked();\r\n } else refresh();\r\n } else {\r\n $scope.filterStatus = 4;\r\n $scope.selectedStatus = 'Due';\r\n if ($scope.upcoming) $scope.bothClicked();\r\n else filterMaintenanceOnStatus($scope.filterStatus);\r\n }\r\n };\r\n\r\n $scope.toggleOptions = () => {\r\n if ($scope.due && $scope.upcoming) $scope.bothClicked();\r\n else {\r\n if ($scope.both) {\r\n $scope.both = false;\r\n\r\n if ($scope.upcoming) {\r\n $scope.upcoming = false;\r\n $scope.upcomingClicked();\r\n }\r\n\r\n if ($scope.due) {\r\n $scope.due = false;\r\n $scope.dueClicked();\r\n }\r\n }\r\n if ($scope.due) {\r\n $scope.filterStatus = 4;\r\n $scope.selectedStatus = 'Due';\r\n filterMaintenanceOnStatus($scope.filterStatus);\r\n }\r\n if ($scope.upcoming) {\r\n $scope.filterStatus = 2;\r\n $scope.selectedStatus = 'Upcoming';\r\n filterMaintenanceOnStatus($scope.filterStatus);\r\n } else refresh();\r\n }\r\n };\r\n\r\n $scope.assetNameClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.assetNameClicked,\r\n equipmentId: id\r\n })\r\n };\r\n\r\n $scope.planNameClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.planNameClicked,\r\n planId: id\r\n })\r\n };\r\n\r\n $scope.topDuePlanClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.topDuePlanClicked,\r\n planId: id\r\n })\r\n }\r\n\r\n $scope.topUpcomingPlanClicked = (id) => {\r\n addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.topUpcomingPlanClicked,\r\n planId: id\r\n })\r\n }\r\n refresh();\r\n}\r\n","export default function MaintenancePerformPopupController(\r\n equipmentData,\r\n plan,\r\n $uibModalInstance,\r\n $scope,\r\n $state,\r\n MaintenanceService,\r\n equipmentRepository\r\n) {\r\n 'ngInject';\r\n\r\n $scope.equipmentData = equipmentData;\r\n $scope.plan = plan;\r\n\r\n $scope.openStart = function() {\r\n $scope.startOpened = true;\r\n };\r\n\r\n $scope.openEnd = function() {\r\n $scope.endOpened = true;\r\n };\r\n\r\n $scope.serviceRecord = {};\r\n $scope.serviceRecord.tags = [];\r\n $scope.serviceRecord.workOrder = '';\r\n $scope.serviceRecord.reading = {\r\n date: new Date()\r\n };\r\n $scope.maxDate = new Date();\r\n\r\n $scope.dateType = false;\r\n $scope.odometerType = false;\r\n $scope.runhourType = false;\r\n $scope.submitted = false;\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.dismiss('Cancelled');\r\n };\r\n\r\n $scope.getFormattedLink = function(link) {\r\n if (_.startsWith(link, 'https://') || _.startsWith(link, 'http://')) {\r\n return link;\r\n }\r\n\r\n return '//' + link;\r\n };\r\n\r\n $scope.confirm = function() {\r\n $scope.submitted = true;\r\n\r\n $scope.serviceRecord.planId = $scope.plan.id;\r\n $scope.serviceRecord.equipmentId = $scope.equipmentData.id;\r\n\r\n if (!$scope.odometerType && $scope.userForm.runhour.$valid && $scope.userForm.workOrder.$valid) {\r\n $scope.userForm.odometer.$valid = true;\r\n $scope.userForm.odometer.$invalid = false;\r\n $scope.userForm.odometer.$pristine = false;\r\n $scope.userForm.$valid = true;\r\n }\r\n if (!$scope.runhourType && $scope.userForm.odometer.$valid && $scope.userForm.workOrder.$valid) {\r\n $scope.userForm.runhour.$valid = true;\r\n $scope.userForm.runhour.$invalid = false;\r\n $scope.userForm.runhour.$pristine = false;\r\n $scope.userForm.$valid = true;\r\n }\r\n if (!$scope.runhourType && !$scope.odometerType && $scope.userForm.workOrder.$valid) {\r\n $scope.userForm.$valid = true;\r\n }\r\n\r\n if ($scope.userForm.$valid) {\r\n $scope.submitting = true;\r\n\r\n MaintenanceService.newServiceRecord($scope.serviceRecord)\r\n .then(function(response) {\r\n if (response.status !== 200) {\r\n return null;\r\n }\r\n\r\n var tasks = _.map($scope.tasksData, function(t) {\r\n var inputsAsMap = {};\r\n if (t.inputs.length > 0) {\r\n angular.forEach(t.inputs, function(i) {\r\n if (i.value) {\r\n inputsAsMap[i.key] = i.value.toString();\r\n }\r\n });\r\n }\r\n return {\r\n id: t.id,\r\n inputs: inputsAsMap\r\n };\r\n });\r\n\r\n $scope.serviceRecord.id = response.data.id;\r\n\r\n return MaintenanceService.completeTasks(response.data.id, tasks);\r\n })\r\n .then(function(response) {\r\n if (response.status === 202) {\r\n $state.go('maintenance.history-details', {\r\n id: $scope.serviceRecord.id\r\n });\r\n $uibModalInstance.close($scope.serviceRecord.id);\r\n } else {\r\n $uibModalInstance.dismiss('Error completing maintenance plan');\r\n }\r\n })\r\n .finally(function() {\r\n $scope.submitting = false;\r\n });\r\n } else {\r\n $scope.submitted = true;\r\n }\r\n };\r\n\r\n $scope.openStart = function() {\r\n $scope.startOpened = true;\r\n };\r\n\r\n $scope.statusData = [];\r\n\r\n var getRunhoursVal = function() {\r\n equipmentRepository.getEquipmentSeries(equipmentData.id).then(\r\n function(series) {\r\n var data = series.data;\r\n\r\n for (var i = 0; i < series.data.length; i++) {\r\n if (series.data[i].last) {\r\n if (data[i].tags[0] === 'odometer') {\r\n $scope.serviceRecord.reading.odometer = Math.round(data[i].last.v);\r\n }\r\n if (data[i].tags[0] === 'run_time') {\r\n $scope.serviceRecord.reading.runhour = Math.round(data[i].last.v);\r\n }\r\n }\r\n }\r\n },\r\n function(response) {\r\n console.log('error getting series data');\r\n }\r\n );\r\n };\r\n\r\n var refresh = function() {\r\n $scope.loading = true;\r\n MaintenanceService.getPlan($scope.plan.id)\r\n .then(function(response) {\r\n $scope.plan.attributes = response.data;\r\n\r\n var recurrence = $scope.plan.attributes.recurrence;\r\n\r\n for (var i = 0; i < recurrence.rules.length; i++) {\r\n if (recurrence.rules[i].type == 'date') {\r\n $scope.dateType = true;\r\n }\r\n if (recurrence.rules[i].type == 'odometer') {\r\n $scope.odometerType = true;\r\n }\r\n if (recurrence.rules[i].type == 'runhour') {\r\n $scope.runhourType = true;\r\n\r\n getRunhoursVal();\r\n }\r\n }\r\n\r\n return MaintenanceService.getPlanTasks($scope.plan.id);\r\n })\r\n .then(\r\n function(response) {\r\n $scope.tasksData = response.data;\r\n return MaintenanceService.getPlan($scope.plan.id);\r\n },\r\n function(response) {\r\n $scope.error = true;\r\n }\r\n )\r\n .then(\r\n function(response) {\r\n var planInfo = response.data;\r\n $scope.maintenancePlanDoucmentLinks = planInfo.documentLinks;\r\n },\r\n function(error) {\r\n $scope.error = true;\r\n }\r\n )\r\n .finally(function(response) {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n refresh();\r\n}\r\n","import 'angular-ui-bootstrap';\r\n// import 'angular-ui-router';\r\n\r\n//New Imports from the controllers.\r\nimport MaintenanceBoardController from './board.controller';\r\nimport MaintenancePerformPopupController from './complete/complete.controller';\r\n\r\nconst boardModule = angular.module('app.maintenance.board', ['ui.bootstrap', 'ui.router', 'gettext']);\r\n\r\nboardModule\r\n\t//Controllers\r\n\t.controller('MaintenanceBoardController', MaintenanceBoardController)\r\n\t.controller('MaintenancePerformPopupController', MaintenancePerformPopupController);\r\n\r\nexport default boardModule.name;\r\n","import angular from 'angular';\r\n\r\n/* Configuration Imports */\r\nimport MaintenanceRouteConfig from './maintenance.route';\r\n/* Controller Imports */\r\nimport MaintenanceController from './maintenance.controller';\r\n\r\n/* Module Imports */\r\nimport MaintenancePlansModule from './plans/plans.module';\r\nimport MaintenanceHistoryModule from './history/history.module';\r\nimport MaintenanceBoardModule from './board/board.module';\r\nconst maintenanceModule = angular.module('app.maintenance', [\r\n //INTERNAL\r\n MaintenancePlansModule,\r\n MaintenanceHistoryModule,\r\n MaintenanceBoardModule,\r\n //THIRD PARTY\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext'\r\n]);\r\n\r\nmaintenanceModule\r\n /* Configurations */\r\n .config(MaintenanceRouteConfig)\r\n /* Controllers */\r\n .controller('MaintenanceController', MaintenanceController);\r\n\r\nexport default maintenanceModule.name;\r\n","import { userIsGroupAdmin } from '../../functions/user.functions';\r\n\r\nexport default function AccessManagementRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('access-management', {\r\n url: '/access-management',\r\n template: ``,\r\n redirectTo: 'access-management.assets-list',\r\n ncyBreadcrumb: {\r\n label: \"{{'Access Management' | translate}}\",\r\n },\r\n requiredFeatures: ['access'],\r\n })\r\n .state('access-management.group-list', {\r\n url: '/group-list',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Groups' | translate}}\",\r\n },\r\n requiredFeatures: ['access.group_admin'],\r\n })\r\n .state('access-management.group-view', {\r\n url: '/group-view/:id',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Group Details' | translate}}\",\r\n parent: 'access-management.group-list',\r\n },\r\n requiredFeatures: ['access.group_admin'],\r\n })\r\n .state('access-management.group-create', {\r\n url: '/group-create',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Create Group' | translate}}\",\r\n },\r\n requiredFeatures: ['access.group_admin'],\r\n })\r\n .state('access-management.operators-list', {\r\n url: '/operators',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Operators' | translate}}\",\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.operator-view', {\r\n url: '/operator/:id',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Operator Details' | translate}}\",\r\n parent: 'access-management.operators-list',\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.operators-bulk-upload', {\r\n url: '/create/operator/bulk',\r\n template: ' ',\r\n ncyBreadcrumb: {\r\n label: \"{{'Create Operators' | translate}}\",\r\n parent: 'access-management',\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.operator-create', {\r\n url: '/create/operator',\r\n template: ' ',\r\n ncyBreadcrumb: {\r\n label: \"{{'Create Operator' | translate}}\",\r\n parent: 'access-management',\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.assets-list', {\r\n url: '/assets',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Assets' | translate}}\",\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.asset-view', {\r\n url: '/assets/:id',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Asset Details' | translate}}\",\r\n parent: 'access-management.assets-list',\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n })\r\n .state('access-management.assignments', {\r\n url: '/assignments',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Assignments' | translate}}\",\r\n },\r\n requiredFeatures: ['access.operator_admin'],\r\n });\r\n}\r\n","import template from './access-management-base.html';\r\nimport App from '../../app';\r\n\r\nconst AMPLITUDE_EVENT_NAME = \"Page View: Access Management\";\r\nclass AcessManagementController {\r\n constructor() {\r\n 'ngInject';\r\n }\r\n\r\n $onInit() {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n}\r\nexport default {\r\n template,\r\n controller: AcessManagementController,\r\n controllerAs: 'vm'\r\n};\r\n","export const ordersBy = {\r\n name: {\r\n attr: 'name',\r\n desc: false,\r\n },\r\n codesSyncStatus: {\r\n attr: 'codesSyncStatus',\r\n desc: false,\r\n },\r\n};\r\n\r\nexport class Paging {\r\n constructor(pageSize, currentpage) {\r\n this.currentPage = currentpage || 1;\r\n this.pageSize = pageSize || 100;\r\n }\r\n get startFrom() {\r\n return (this.currentPage - 1) * this.pageSize;\r\n }\r\n reset() {\r\n this.currentPage = 1;\r\n }\r\n}\r\n\r\nexport const OperatorsOrdersBy = {\r\n name: {\r\n attr: 'name',\r\n desc: false,\r\n },\r\n};\r\nexport class Assetsfilter {\r\n constructor() {\r\n this.queries = ['*'];\r\n this.orderBy = ordersBy.name;\r\n this.securityGroups = [];\r\n this.facet = {};\r\n this.attrs = {};\r\n this.clientSideOrderBy = ordersBy.codesSyncStatus;\r\n }\r\n}\r\n\r\nexport class Operatorsfilter {\r\n constructor() {\r\n this.query = '';\r\n this.orderBy = OperatorsOrdersBy.name;\r\n }\r\n}\r\n","import template from './am-group-list.component.html';\r\nimport { Paging } from '../../core/models/am-helper.model';\r\nimport Auth from '../../../../auth';\r\nclass AmGroupListComponent {\r\n constructor(amGroupsService, amFilterPaginationService, $state) {\r\n 'ngInject';\r\n this.groups = [];\r\n this.group = {};\r\n this.filteredGroups = [];\r\n this.status = '';\r\n this.createGroupStatus = '';\r\n this.$state = $state;\r\n this.filterPaginationService = amFilterPaginationService;\r\n this.groupService = amGroupsService;\r\n this.paging = new Paging(7, 1);\r\n this.filter = {\r\n query: '',\r\n orderBy: 'name',\r\n desc: false,\r\n };\r\n this.propertyKeys = ['name'];\r\n this.email = '';\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n $onInit() {\r\n this.getClaims();\r\n this.getGroups();\r\n }\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n getClaims() {\r\n const claims = Auth.getClaims();\r\n this.email = claims.email;\r\n }\r\n\r\n getGroups() {\r\n this.status = 'loading';\r\n this.groupService\r\n .retrieveGroups()\r\n .then((groups) => {\r\n this.groups = groups || [];\r\n this.status = this.groups.length ? '' : 'no-data';\r\n this.getGroupsPaged();\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n\r\n onTriggerSearch(term) {\r\n this.filter.query = term;\r\n this.filteredGroups = this.filterPaginationService.filterByTerm(\r\n this.groups,\r\n this.filter.query,\r\n this.propertyKeys,\r\n );\r\n this.paging.reset();\r\n\r\n if (term !== '') {\r\n this.addToDataLayer({\r\n event: 'accessManagementGroupSearching',\r\n data: {\r\n keyword: term,\r\n },\r\n });\r\n }\r\n }\r\n\r\n loadPage(pageNumber) {\r\n this.paging.currentPage = pageNumber;\r\n this.getGroupsPaged();\r\n }\r\n\r\n getGroupsPaged() {\r\n this.filterPaginationService\r\n .getPaged(this.filter, this.paging, this.groups, this.propertyKeys)\r\n .then((result) => {\r\n this.filteredGroups = result.data;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n viewGroupDetail(group) {\r\n if (group) {\r\n this.$state.go('access-management.group-view', {\r\n id: group.id,\r\n name: group.name,\r\n });\r\n }\r\n }\r\n createGroup() {\r\n if (!this.group.name || !this.group.email) return;\r\n this.saveGroup();\r\n }\r\n\r\n saveGroup() {\r\n this.createGroupStatus = 'creating';\r\n // Call the service\r\n this.groupService\r\n .createGroup(this.group)\r\n .then((created) => {\r\n this.createGroupStatus = 'success';\r\n this.viewGroupDetail(created);\r\n })\r\n .catch((error) => {\r\n this.createGroupStatus = 'error';\r\n if (this.group.email === this.email) {\r\n this.createGroupStatusCode = 'invalid-email';\r\n return;\r\n }\r\n this.createGroupStatusCode = error.status;\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmGroupListComponent,\r\n controllerAs: 'groupListVm',\r\n bindings: {},\r\n};\r\n","import template from './am-group-create.html';\r\nclass AmGroupCreateController {\r\n constructor($state, amGroupsService) {\r\n 'ngInject';\r\n this.$state = $state;\r\n this.status = '';\r\n this.group = {};\r\n this.groupService = amGroupsService;\r\n }\r\n $onInit() { }\r\n $onChanges() { }\r\n $onDestroy() { }\r\n\r\n createGroup() {\r\n if (!this.group.name || !this.group.email) return;\r\n this.saveGroup();\r\n }\r\n\r\n saveGroup() {\r\n this.status = 'creating';\r\n // Call the service\r\n this.groupService\r\n .createGroup(this.group)\r\n .then(created => {\r\n this.createdGroup = created;\r\n this.status = 'success';\r\n this.$state.go('access-management.group-list');\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmGroupCreateController,\r\n controllerAs: 'groupCreateVm',\r\n bindings: {}\r\n};\r\n","export const indexedById = (selected = []) => {\r\n return selected.reduce((indexedObject, selectedItem) => {\r\n indexedObject[selectedItem.id] = selectedItem;\r\n return indexedObject;\r\n }, {});\r\n};\r\n\r\nexport const objectToArray = (selectedObject = {}) => {\r\n return Object.entries(selectedObject).map((keyVal) => {\r\n const [key, value] = keyVal;\r\n return value;\r\n });\r\n};\r\n\r\nexport const isArrayNotEmpty = (inputArray) => Array.isArray(inputArray) && inputArray.length > 0;\r\n\r\nexport const DEFAULT_POLLING_MS = 30000;\r\n\r\n/**\r\n * Sets up a polling interval for the provided callback function.\r\n * @param {Function} $interval AngularJS interval service\r\n * @param {Function} fn Callback function\r\n * @param {number} intervalMs Delay between invocations\r\n */\r\nexport const pollOnInterval = ($interval, fn, intervalMs = DEFAULT_POLLING_MS) => {\r\n return $interval(() => {\r\n fn();\r\n }, intervalMs);\r\n};\r\n","import template from './am-group-view.html';\r\nimport { Paging, Assetsfilter } from '../../core/models/am-helper.model';\r\nimport { pollOnInterval } from '../../core/utilities/am-helper.util';\r\n\r\nclass AmGroupViewComponent {\r\n constructor(amGroupsService, amAssetsService, $stateParams, $state, $interval) {\r\n 'ngInject';\r\n this.groupService = amGroupsService;\r\n this.assetService = amAssetsService;\r\n this.$stateParams = $stateParams;\r\n this.$state = $state;\r\n this.status = '';\r\n this.editMode = '';\r\n this.onLoadErrorFlag = false;\r\n this.group = {};\r\n // Pagination\r\n this.total = null;\r\n this.filter = new Assetsfilter();\r\n this.paging = new Paging(15, 1);\r\n this.interval = $interval;\r\n\r\n this.updatedGroup = {};\r\n }\r\n\r\n $onInit() {\r\n this.status = 'loading';\r\n this.group.id = this.$stateParams.id;\r\n this.getGroupData().then(() => {\r\n this.updateInterval = pollOnInterval(this.interval, () => this.getGroupData());\r\n });\r\n\r\n if (!this.group.assets) this.group.assets = [];\r\n }\r\n\r\n $onChanges() { }\r\n\r\n $onDestroy() {\r\n if (this.updateInterval) {\r\n this.interval.cancel(this.updateInterval);\r\n }\r\n }\r\n\r\n getGroupData() {\r\n return this.assetService.getAssetsByGroupId(this.group.id).then(result => {\r\n this.group.assets = result.assets || [];\r\n this.group.name = result.name || '';\r\n this.group.email = result.email || '';\r\n this.group.createdAt = result.createdAt || '';\r\n this.group.attrs = result.attrs || {};\r\n this.status = '';\r\n this.onLoadErrorFlag = false;\r\n }).catch(() => {\r\n this.onLoadErrorFlag = true;\r\n });\r\n }\r\n\r\n showEditForm() {\r\n this.editMode = true;\r\n }\r\n\r\n cancelEdit() {\r\n this.editMode = false;\r\n }\r\n\r\n hasAssets() {\r\n return this.group.assets.length !== 0;\r\n }\r\n\r\n updateGroupMetaData(updatedGroup) {\r\n if (!updatedGroup.name) return;\r\n this.group.name = updatedGroup.name;\r\n this.status = 'updating';\r\n this.groupService\r\n .updateGroupMetadata(this.group.id, this.group)\r\n .then(() => {\r\n this.status = '';\r\n this.cancelEdit();\r\n })\r\n .catch(error => {\r\n this.status = 'error';\r\n this.statusCode = error.status;\r\n });\r\n }\r\n\r\n addAssets(assets) {\r\n this.updateGroupAssets(assets, 'add');\r\n this.group.assets = this.group.assets.concat(assets);\r\n }\r\n removeAssets(assets) {\r\n this.updateGroupAssets(assets, 'remove');\r\n this.group.assets = this.group.assets.filter(\r\n asset => assets.findIndex(selected => selected.id === asset.id) === -1\r\n );\r\n }\r\n updateGroupAssets(updateAssets, operation) {\r\n if (!this.group.assets) return;\r\n // Set status\r\n this.status = 'uploading';\r\n\r\n // Call the service to update the assets\r\n this.groupService\r\n .updateGroupAssets(this.group.id, updateAssets, operation)\r\n .then(() => {\r\n this.status = '';\r\n // this.group.assets = angular.copy(resultAssets);\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n confirmThenDelete() {\r\n this.groupService\r\n .openDeleteGroupPopup(this.group)\r\n .then(() => {\r\n this.$state.go('access-management.group-list');\r\n })\r\n .catch(() => { });\r\n }\r\n viewAsset(asset) {\r\n if (asset) {\r\n this.$state.go('access-management.asset-view', {\r\n id: asset.id\r\n });\r\n }\r\n }\r\n groupHasEmail() {\r\n return this.group && this.group.email != null && this.group.email !== \"\";\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmGroupViewComponent,\r\n controllerAs: 'groupVm',\r\n bindings: {}\r\n};\r\n","import template from './am-assets-list.component.html';\r\nimport { Paging, Assetsfilter } from '../../core/models/am-helper.model';\r\nimport { pollOnInterval } from '../../core/utilities/am-helper.util';\r\n\r\nclass AmAssetListController {\r\n constructor(amAssetsService, $state, amStoreService, $interval, $uibModal) {\r\n 'ngInject';\r\n\r\n this.assetService = amAssetsService;\r\n this.filter = new Assetsfilter();\r\n this.filter.facet = null;\r\n this.paging = new Paging(15, 1);\r\n this.status = '';\r\n this.total = null;\r\n this.$state = $state;\r\n this.store = amStoreService;\r\n this.selectedAsset = {};\r\n this.filtersCount = null;\r\n this.excludedAssetList = [];\r\n this.interval = $interval;\r\n this.poll = false;\r\n this.uibModal = $uibModal;\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n\r\n get SelectedIds() {\r\n return Object.keys(this.selectedAsset || {});\r\n }\r\n\r\n $onInit() {\r\n this.searchFilterConfig = this.searchFilterConfig || this.getDefaultSearchFilterConfig();\r\n this.status = 'loading';\r\n this.getAssets().then(() => {\r\n if (this.poll === true) {\r\n this.updateInterval = pollOnInterval(this.interval, () => this.getAssets());\r\n }\r\n });\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {\r\n if (this.poll === true && this.updateInterval) {\r\n this.interval.cancel(this.updateInterval);\r\n }\r\n }\r\n\r\n updateSearchQuery(queryTerm) {\r\n this.filter.queries = [queryTerm ? `*${queryTerm}*` : '*'];\r\n this.getAssets();\r\n\r\n this.addToDataLayer({\r\n event: 'assetSearching',\r\n data: {\r\n keyword: queryTerm,\r\n page: this.$state.current.name,\r\n },\r\n });\r\n }\r\n\r\n getAssets() {\r\n let assetFnPromise;\r\n\r\n if (this.getAssetFn) {\r\n assetFnPromise = this.getAssetFn(this.filter, this.paging);\r\n } else {\r\n assetFnPromise = this.assetService.getAssetsWithAccessService(this.filter, this.paging);\r\n }\r\n\r\n return assetFnPromise\r\n .then((res) => {\r\n const filterdAssets = this._markfilterExculudedAssets(res.assets, this.excluded);\r\n this.assetsList = filterdAssets.selectableList;\r\n this.excludedAssetList = filterdAssets.unSelectableList;\r\n this.total = res.total;\r\n this.status =\r\n res.total === 0 && this.filter.queries[0] === '*' && this.filtersCount === 0\r\n ? 'no-enabled-data'\r\n : '';\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n\r\n loadPage(pageNumber) {\r\n this.paging.currentPage = pageNumber;\r\n this.getAssets();\r\n }\r\n\r\n viewAsset(asset) {\r\n if (asset) {\r\n this.store.viewedAsset = asset;\r\n this.$state.go('access-management.asset-view', {\r\n id: asset.id,\r\n });\r\n }\r\n }\r\n\r\n //filters using filters in map page\r\n onFilterChanged() {\r\n this.filter.facet = this.facet || {};\r\n this.filter.attrs = this.attrsFilter;\r\n this.getAssets();\r\n }\r\n\r\n //filter code\r\n toggleShowFilters(event) {\r\n this._preventBubbling(event);\r\n // Toggle the visibility state of the filters\r\n this.showFilters = !this.showFilters;\r\n }\r\n\r\n hideFilters() {\r\n // Make the filters not visible\r\n this.showFilters = false;\r\n }\r\n\r\n _preventBubbling(event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n _markfilterExculudedAssets(assetsList = [], excludedIds = []) {\r\n const selectableList = [];\r\n const unSelectableList = [];\r\n assetsList.forEach((asset) => {\r\n excludedIds.includes(asset.id) ? unSelectableList.push(asset) : selectableList.push(asset);\r\n });\r\n return { selectableList, unSelectableList };\r\n }\r\n\r\n getDefaultSearchFilterConfig() {\r\n return {\r\n enable: true,\r\n showSearch: true,\r\n showFilter: true,\r\n };\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmAssetListController,\r\n controllerAs: 'assetsVm',\r\n bindings: {\r\n selectMode: '<',\r\n selectedAsset: '=?',\r\n excluded: '<',\r\n poll: '<',\r\n onSelection: '&',\r\n tableRows: '<',\r\n enableFilter: '<',\r\n getAssetFn: '<',\r\n searchFilterConfig: '<',\r\n showEnableAssets: '<',\r\n },\r\n};\r\n","import _ from 'lodash';\r\n\r\nexport const GetAccessCodesType = (operator = {}, type) => {\r\n return operator && operator.codes && operator.codes.accessCodes\r\n ? operator.codes.accessCodes.filter(code => code.type === type).map(co => co.identifier)\r\n : [];\r\n};\r\n\r\nexport const GetCSVRowAccessCodesType = (row = {}, type = '') => {\r\n const lowerCaseKeysRow = Object.keys(row).reduce((acc, k) => ((acc[k.toLowerCase()] = row[k]), acc), {});\r\n return lowerCaseKeysRow[type.toLowerCase()] || '';\r\n};\r\n\r\nexport const ArrayToString = (data = []) => (Array.isArray(data) ? data.join(', ').replace('_', ' ') : '');\r\n\r\nexport const isPrimaryUser = user => {\r\n return _.get(user, 'features', []).some(feature => feature.path === 'access.group_admin');\r\n};\r\n","import _ from 'lodash';\r\n\r\nexport function filterData(data = [], term = '', propertyKeys = []) {\r\n const matcher = '*';\r\n\r\n const trimmedTerm = term.trim();\r\n const lastCharIndex = term.length > 0 ? term.length - 1 : 0;\r\n\r\n const isPrefixMatch = trimmedTerm[lastCharIndex] === matcher;\r\n const isPostfixMatch = trimmedTerm[0] === matcher;\r\n const isPartialMatch = isPrefixMatch && isPostfixMatch;\r\n\r\n const sanitizedTerm = trimmedTerm.replace(/\\*/g, '').toLowerCase();\r\n\r\n if (sanitizedTerm === '') {\r\n return data;\r\n } else if (isPartialMatch) {\r\n return filterObjects(data, sanitizedTerm, propertyKeys, partialMatchPredicate);\r\n } else if (isPrefixMatch) {\r\n return filterObjects(data, sanitizedTerm, propertyKeys, prefixMatchPredicate);\r\n } else if (isPostfixMatch) {\r\n return filterObjects(data, sanitizedTerm, propertyKeys, postfixMatchPredicate);\r\n } else {\r\n return filterObjects(data, sanitizedTerm, propertyKeys, exactMatchPredicate);\r\n }\r\n}\r\n\r\nfunction filterObjects(\r\n objects = [],\r\n term = '',\r\n propertyKeys = [],\r\n predicate = (value, term) => false,\r\n) {\r\n return objects.filter((obj) => {\r\n for (const key of propertyKeys) {\r\n const propertyKeyValue = _.get(obj, key);\r\n\r\n if (!propertyKeyValue) {\r\n console.warn(`Value not found for ${key} in filterObjects`);\r\n }\r\n\r\n const valueIsArray = Array.isArray(propertyKeyValue);\r\n\r\n if (valueIsArray) {\r\n for (const value of propertyKeyValue) {\r\n if (checkPredicate(value, term, predicate)) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (checkPredicate(propertyKeyValue, term, predicate)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n}\r\n\r\nfunction checkPredicate(value = '', term, predicate) {\r\n value = value.toLowerCase();\r\n return predicate(value, term);\r\n}\r\n\r\nfunction partialMatchPredicate(value = '', term = '') {\r\n return value.indexOf(term) >= 0;\r\n}\r\n\r\nfunction prefixMatchPredicate(value = '', term = '') {\r\n return value.indexOf(term) === 0;\r\n}\r\n\r\nfunction postfixMatchPredicate(value = '', term = '') {\r\n return value.indexOf(term) > 0;\r\n}\r\n\r\nfunction exactMatchPredicate(value = '', term = '') {\r\n const split = value.split(' ');\r\n return split.includes(term);\r\n}\r\n","import moment from 'moment';\r\nimport template from './am-operators-list.component.html';\r\nimport { isPrimaryUser } from '../../core/utilities/am-operators.util';\r\nimport { Operatorsfilter } from '../../core/models/am-helper.model';\r\nimport { filterData } from '../../../../functions/search.functions';\r\n\r\nclass AmOperatorsListController {\r\n constructor(amOperatorsService, amStoreService, usersService, $state, $scope, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.opService = amOperatorsService;\r\n this.amStore = amStoreService;\r\n this.usersService = usersService;\r\n this.$state = $state;\r\n this.operators = [];\r\n this.status = '';\r\n // holed operators ids need to excluded from the list\r\n this.excluded = [];\r\n this.operatorName = '';\r\n this.createOperatorStatus = '';\r\n this.createdOperator = null;\r\n this.isAdding = false;\r\n this.scope = $scope;\r\n this.store = $ngRedux;\r\n this.createForm = 'createForm';\r\n this.attrs = {};\r\n this.operatorName = '';\r\n this.expiryTimespans = [\r\n { id: 1, label: 'In a week', days: 7 },\r\n { id: 2, label: 'In 2 weeks', days: 14 },\r\n { id: 3, label: 'In a month', days: 30 },\r\n { id: 4, label: 'In 2 months', days: 60 },\r\n { id: 5, label: 'After 2 months', days: 60 },\r\n { id: 6, label: 'No expiry date', days: null },\r\n { id: 7, label: 'Expired', days: 0 },\r\n ];\r\n\r\n this.filter = new Operatorsfilter();\r\n this.filteredOperators = [];\r\n this.selectedExpiry = null;\r\n\r\n this.propertyKeys = ['name', 'codes.types', 'attrs.company_name'];\r\n\r\n this.addToDataLayer = (data) => window.dataLayer.push(data); // Google Analytics\r\n }\r\n\r\n get SelectedNumber() {\r\n return Object.keys(this.selected || {}).length;\r\n }\r\n\r\n get isPrimaryUser() {\r\n return isPrimaryUser(this.user);\r\n }\r\n\r\n $onInit() {\r\n this.getOperators();\r\n const unsubscribe = this.store.connect((state) => {\r\n const { user } = state;\r\n return { user };\r\n }, null)(this);\r\n this.scope.$on('$destroy', unsubscribe);\r\n }\r\n\r\n getOperators() {\r\n this.status = 'loading';\r\n this.opService\r\n .getOperators()\r\n .then((operators) => {\r\n this.operators = this.opService.filterByExcludedIds(operators, this.excluded);\r\n this.status = this.operators.length ? '' : 'no-data';\r\n this.filteredOperators = this.operators;\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n\r\n onTriggerSearch(term, selectedTimeSpan) {\r\n this.filter.query = term ? `*${term}*` : '*';\r\n\r\n this.filteredOperators = filterData(this.operators, this.filter.query, this.propertyKeys);\r\n\r\n if (selectedTimeSpan) {\r\n this.onExpiryChange(selectedTimeSpan);\r\n }\r\n\r\n this.addToDataLayer({\r\n event: 'operatorSearching',\r\n data: {\r\n keyword: term,\r\n page: this.$state.current.name,\r\n },\r\n });\r\n }\r\n\r\n viewOperator(operator) {\r\n if (operator) {\r\n this.amStore.setVeiwedOperator(operator);\r\n this.$state.go('access-management.operator-view', {\r\n id: operator.id,\r\n name: operator.name,\r\n });\r\n }\r\n }\r\n\r\n openCreate() {\r\n this.isAdding = false;\r\n this.operatorName = '';\r\n this.attrs = {};\r\n }\r\n\r\n createOperatorRedirect() {\r\n if (!this.operatorName && this.operatorName === '') return;\r\n if (this.attrs.expiry) {\r\n this.attrs.expiry = moment.utc(this.attrs.expiry).format('L');\r\n }\r\n const operator = {\r\n name: this.operatorName,\r\n attrs: this.attrs,\r\n autoGeneratePIN: false,\r\n accessCodes: [],\r\n };\r\n this.createOperatorStatus = 'creating';\r\n this.opService\r\n .createOperator(operator)\r\n .then((created) => {\r\n this.createdOperator = created;\r\n this.createOperatorStatus = 'success';\r\n this.$state.go('access-management.operator-view', {\r\n id: created.id,\r\n });\r\n })\r\n .catch(() => {\r\n this.createOperatorStatus = 'failed';\r\n });\r\n }\r\n\r\n onExpiryChange(selectedTimeSpan) {\r\n this.selectedExpiry = selectedTimeSpan;\r\n const expiryFilteredOperators = [];\r\n\r\n if (selectedTimeSpan.days === null) {\r\n this.filteredOperators.forEach((op) => {\r\n if (!op.attrs.expiry) {\r\n expiryFilteredOperators.push(op);\r\n }\r\n });\r\n } else if (selectedTimeSpan.days === 0) {\r\n this.filteredOperators.forEach((op) => {\r\n if (op.attrs.expiry) {\r\n if (moment(op.attrs.expiry).isBefore(moment(), 'day')) {\r\n expiryFilteredOperators.push(op);\r\n }\r\n }\r\n });\r\n } else if (selectedTimeSpan.id === 5) {\r\n this.filteredOperators.forEach((op) => {\r\n if (op.attrs.expiry) {\r\n if (moment(op.attrs.expiry).isAfter(moment().add(selectedTimeSpan.days, 'days'))) {\r\n expiryFilteredOperators.push(op);\r\n }\r\n }\r\n });\r\n } else {\r\n this.filteredOperators.forEach((op) => {\r\n if (op.attrs.expiry) {\r\n // Makes sure that the time is 1 millisecond before today because moment isBetween will return false if it is 00:00:00:000\r\n const today = moment()\r\n .hour(0)\r\n .minute(0)\r\n .second(0)\r\n .millisecond(0)\r\n .subtract(1, 'millisecond');\r\n // Makes sure that the time is 1 millisecond after the specified date because moment isBetween will return false if it is 23:59:59:999\r\n const future = moment()\r\n .add(selectedTimeSpan.days, 'days')\r\n .hour(23)\r\n .minute(59)\r\n .second(59)\r\n .millisecond(999)\r\n .add(1, 'millisecond');\r\n\r\n if (moment(op.attrs.expiry).isBetween(today, future, 'days')) {\r\n expiryFilteredOperators.push(op);\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.filteredOperators = expiryFilteredOperators;\r\n }\r\n\r\n clearFilters() {\r\n this.selectedExpiry = null;\r\n\r\n this.onTriggerSearch(this.filter.query);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorsListController,\r\n controllerAs: 'opsVm',\r\n bindings: {\r\n selectMode: '<',\r\n selected: '=?',\r\n excluded: '<',\r\n },\r\n};\r\n","import moment from 'moment';\r\nimport _ from 'lodash';\r\nimport template from './am-bulk-upload-operators.html';\r\n\r\nconst ValidationStatusEnum = Object.freeze({\r\n validating: \"validating\",\r\n error: \"error\",\r\n warning: \"warning\",\r\n ok: null\r\n});\r\n\r\nconst OperatorCsvValidationErrorEnum = Object.freeze({\r\n noName: \"no-name\",\r\n invalidCodeFormat: \"invalid-code-format\",\r\n});\r\n\r\nclass AmBulkUploadOperatorsController {\r\n constructor(FileUploader, amOperatorsService) {\r\n 'ngInject';\r\n this.service = amOperatorsService;\r\n this.FileUploader = FileUploader;\r\n this.uploader = new FileUploader();\r\n this.selectedFile = null;\r\n this.someOperatorsHasNoCodes = false;\r\n this.validationStatus = ValidationStatusEnum.ok;\r\n this.validationError = null;\r\n this.validationErrorMessages = [];\r\n this.creating = false;\r\n // will hold a list of operators ready to be created\r\n this.operatorsData = [];\r\n // holds successful response errors for user review\r\n this.errors = [];\r\n this.feed = {};\r\n }\r\n\r\n $onInit() {\r\n this.resetFileUploader();\r\n this.updateCSVFileNames();\r\n }\r\n $onChanges() { }\r\n $onDestroy() {\r\n this.uploader.destroy();\r\n }\r\n resetFileUploader() {\r\n this.uploader.clearQueue();\r\n this.uploader.queueLimit = 1;\r\n this.uploader.onAfterAddingAll = this.afterFilesSelected.bind(this);\r\n }\r\n afterFilesSelected() {\r\n this.fileValidationStart();\r\n let lastItem = this.uploader.queue.pop();\r\n this.service\r\n .operatorsCsvToJson(lastItem._file)\r\n .then(response => {\r\n //set the selected file and any warning message\r\n this.setProperties(lastItem._file, response.data);\r\n })\r\n .catch(error => {\r\n this.setProperties(null, null, error);\r\n });\r\n }\r\n fileValidationStart() {\r\n this.validationStatus = ValidationStatusEnum.validating;\r\n this.selectedFile = null;\r\n this.operatorsData = [];\r\n this.validationError = null;\r\n this.validationErrorMessages = [];\r\n }\r\n setProperties(file, successResponseData, errorResponse) {\r\n this.selectedFile = file;\r\n const { operators: responseOperators = [] } = successResponseData || {};\r\n this.operatorsData = responseOperators;\r\n\r\n if (errorResponse) {\r\n this.validationStatus = ValidationStatusEnum.error;\r\n this.validationError = errorResponse.data;\r\n } else {\r\n const someOperatorsHasNoCodes = this.operatorsData.some(\r\n op => _.get(op, 'AccessCodes', []).length === 0 && !op.AutoGeneratePIN\r\n );\r\n\r\n const { errors = [] } = successResponseData || {};\r\n\r\n this.errors = errors;\r\n const successHasErrors = this.errors.length > 0;\r\n\r\n if (successHasErrors) {\r\n this.validationStatus = ValidationStatusEnum.error;\r\n this.setValidationErrorMessages();\r\n } else {\r\n this.validationStatus = someOperatorsHasNoCodes ? ValidationStatusEnum.warning : null;\r\n }\r\n }\r\n }\r\n openFileLoader() {\r\n this.feed = {};\r\n this.resetFileUploader();\r\n const fileElem = document.getElementById('file-input');\r\n //reset value of file input for uploader to allow reselecting the same file\r\n fileElem.value = '';\r\n }\r\n createOperators() {\r\n if (this.operatorsData && this.operatorsData.length < 1) return;\r\n this.feed = {};\r\n this.creating = true;\r\n this.feed.total = this.operatorsData.length;\r\n this.service\r\n .bulkCreateOperators(this.operatorsData)\r\n .then(response => {\r\n //set feed back to the user\r\n this.updateFeed(response.data);\r\n //reset processed operators data and validationStatus but keep file name\r\n this.setProperties(this.selectedFile);\r\n })\r\n .catch(() => {\r\n this.feed.error = true;\r\n this.feed.failedOperators = this.operatorsData.slice();\r\n this.feed.createdOperators = [];\r\n })\r\n .finally(() => {\r\n this.creating = false;\r\n this.updateCSVFileNames();\r\n });\r\n }\r\n\r\n updateCSVFileNames() {\r\n const datetimeStamp = moment()\r\n .utc()\r\n .format('YY-MM-DDTHH:mm:ss');\r\n this.createdOperatorsFileName = `created-operators-${datetimeStamp}.csv`;\r\n this.failedOperatorsFileName = `operators-errors-${datetimeStamp}.csv`;\r\n }\r\n\r\n updateFeed(csvFeedbackResult = []) {\r\n if (!this.feed) {\r\n this.feed = {\r\n failedOperators: [],\r\n createdOperators: []\r\n };\r\n }\r\n\r\n const failedOperators = csvFeedbackResult.filter(opfeed => !opfeed.isCreated);\r\n const createdOperators = csvFeedbackResult.filter(opfeed => opfeed.isCreated);\r\n\r\n this.feed.failedOperators = [...failedOperators];\r\n this.feed.createdOperators = [...createdOperators];\r\n }\r\n\r\n getCreatedOperatorsCsvData() {\r\n return this.service.generateCreatedOperatorsCsvData(this.feed.createdOperators);\r\n }\r\n\r\n getInvalidCsvData() {\r\n const errorData = this.errors.map(error => ({\r\n row: error.row,\r\n name: error.row.Name,\r\n rowNumber: error.rowNumber,\r\n errorCode: error.code\r\n }));\r\n\r\n return this.service.generateFailedCreateOperatorsCsvData(errorData);\r\n }\r\n\r\n getFailedCsvData() {\r\n return this.service.generateFailedCreateOperatorsCsvData(this.feed.failedOperators);\r\n }\r\n\r\n getValidationErrorMessage(err = {}) {\r\n const rowNumber = err.rowNumber || \"\";\r\n const errCode = err.code || undefined;\r\n\r\n switch (errCode) {\r\n case OperatorCsvValidationErrorEnum.noName:\r\n return `The operator at row ${rowNumber} is missing a name.`;\r\n case OperatorCsvValidationErrorEnum.invalidCodeFormat:\r\n return `The operator at row ${rowNumber} has an invalid code.`;\r\n default:\r\n return \"Something went wrong with one or more of the uploaded operators.\";\r\n }\r\n }\r\n\r\n setValidationErrorMessages() {\r\n this.resetValidationErrorMessages();\r\n this.validationErrorMessages = this.errors.map(err => this.getValidationErrorMessage(err));\r\n }\r\n\r\n resetValidationErrorMessages() {\r\n this.validationErrorMessages = [];\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmBulkUploadOperatorsController,\r\n controllerAs: 'bulkOpVm',\r\n bindings: {}\r\n};\r\n","import template from './am-dashboard.html';\r\nclass AMDashboardController {\r\n constructor(accessManagementService) {\r\n 'ngInject';\r\n this.accessManagementService = accessManagementService;\r\n this.assets = [];\r\n this.operators = [];\r\n this.errorMsg = null;\r\n }\r\n\r\n $onInit() {\r\n this.getAssets();\r\n this.getOperators();\r\n }\r\n getAssets() {\r\n this.accessManagementService\r\n .getAssets()\r\n .then(data => {\r\n this.updateUIData(data);\r\n })\r\n .catch(e => {\r\n this.errorMsg = 'Error loading assets Data';\r\n });\r\n }\r\n getOperators() {\r\n this.accessManagementService\r\n .getOperators()\r\n .then(data => {\r\n this.updateUIData(data);\r\n })\r\n .catch(e => {\r\n this.errorMsg = 'Error loading operators Data';\r\n });\r\n }\r\n updateUIData(storeData) {\r\n this.assets = storeData.assets;\r\n this.operators = storeData.operators;\r\n }\r\n}\r\nexport default {\r\n template,\r\n controller: AMDashboardController,\r\n controllerAs: 'vm',\r\n bindings: {}\r\n};\r\n","import moment from 'moment';\r\nimport template from './am-operator-view.html';\r\n\r\nclass AmOperatorViewController {\r\n constructor(amOperatorsService, amStoreService, usersService, $stateParams, $state) {\r\n 'ngInject';\r\n\r\n this.opService = amOperatorsService;\r\n this.usersService = usersService;\r\n this.store = amStoreService;\r\n this.$stateParams = $stateParams;\r\n this.$state = $state;\r\n this.status = '';\r\n this.editMode = '';\r\n this.onLoadErrorFlag = false;\r\n this.editName = '';\r\n this.editAttrs = {};\r\n }\r\n\r\n $onInit() {\r\n this.operator = this.store.viewedOperator;\r\n this.getOperatorData(this.$stateParams.id);\r\n this.setTab = 'codes';\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n getOperatorData(id) {\r\n this.status = 'loading';\r\n this.opService\r\n .getOperatorById(id)\r\n .then((operator) => {\r\n this.status = '';\r\n this.operator = operator;\r\n this.editName = operator.name;\r\n this.editAttrs = { ...operator.attrs };\r\n this.onLoadErrorFlag = false;\r\n this.checkIPAFExpiry();\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n this.onLoadErrorFlag = true;\r\n });\r\n }\r\n\r\n showEditForm() {\r\n this.editMode = true;\r\n }\r\n\r\n cancelEdit() {\r\n this.editMode = false;\r\n this.editName = this.operator.name;\r\n this.editAttrs = { ...this.operator.attrs };\r\n }\r\n\r\n checkIPAFExpiry() {\r\n if (\r\n this.usersService.hasRequiredFeatures(['access.operator_expiry']) &&\r\n this.operator.codes.types.includes('IPAF')\r\n ) {\r\n const ipaf = this.operator.codes.accessCodes.filter((code) => code.type === 'IPAF')[0]\r\n .accessCard.label;\r\n if (ipaf) {\r\n this.opService.getOperatorExpiryById(ipaf).then((expiry) => {\r\n const newExpiry = moment(moment.utc(expiry.expires).format('L'));\r\n const currentExpiry = moment(this.operator.attrs.expiry);\r\n if (newExpiry.isAfter(currentExpiry)) {\r\n this.editAttrs.expiry = newExpiry;\r\n this.editAttrs.isIPAFExpiry = true;\r\n this.updateOperatorMetaData(this.operator.name, {\r\n ...this.operator.attrs,\r\n expiry: newExpiry,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n updateOperatorMetaData(name, attrs) {\r\n if (!name) return;\r\n this.update_status = 'updating';\r\n this.opService\r\n .updateOperatorMetaData(this.operator.id, name, attrs)\r\n .then((updatedOperator) => {\r\n this.update_status = '';\r\n this.operator.name = updatedOperator.name;\r\n this.operator.attrs = updatedOperator.attrs;\r\n this.cancelEdit();\r\n })\r\n .catch(() => {\r\n this.update_status = 'error';\r\n });\r\n }\r\n\r\n confirmThenDelete() {\r\n this.opService\r\n .openDeleteOperatorPopup(this.operator)\r\n .then(() => {\r\n // delete done successfully go back to the operators list;\r\n this.$state.go('access-management.operators-list');\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n updateCodes(newCodes) {\r\n this.operator.codes = newCodes;\r\n }\r\n\r\n updateAssets(totalAssets) {\r\n this.operator.equipment.total_Assignments = totalAssets;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorViewController,\r\n controllerAs: 'opVm',\r\n bindings: {},\r\n};\r\n","export class Operator {\r\n constructor(operator = {}) {\r\n this.id = operator.id;\r\n this.name = operator.name;\r\n this.createdAt = operator.createdAt;\r\n this.codes = (operator.codes || []).map(code => new Code(code.value, code.type));\r\n this.assets = operator.assets || [];\r\n }\r\n}\r\n\r\nexport class Code {\r\n constructor(value, type) {\r\n type = (type || '').toUpperCase();\r\n this.value = value;\r\n this.type = type;\r\n }\r\n}\r\n\r\nexport const CODE_TYPE_ENUM = {\r\n PIN: 'PIN',\r\n ZTR_RFID: 'ZTR_RFID',\r\n IPAF: 'IPAF'\r\n};\r\n","import moment from 'moment';\r\nimport template from './am-operator-codes.html';\r\nimport { CODE_TYPE_ENUM } from '../../core/models/operator.model';\r\n\r\nclass AmOperatorCodesController {\r\n constructor(amOperatorsService, usersService) {\r\n 'ngInject';\r\n\r\n this.opService = amOperatorsService;\r\n this.status = '';\r\n this.pins = [];\r\n this.ztr_rfids = [];\r\n this.ipafs = [];\r\n this.autoGeneratePin = false;\r\n this.usersService = usersService;\r\n }\r\n\r\n $onInit() {}\r\n\r\n $onChanges(changes) {\r\n const { inCodes } = changes;\r\n if (inCodes) {\r\n this.filterCodes();\r\n }\r\n }\r\n\r\n $onDestroy() {}\r\n\r\n filterCodes() {\r\n const codes = Array.isArray(this.inCodes) ? this.inCodes : [];\r\n\r\n this.pins = this.getCodeType(codes, CODE_TYPE_ENUM.PIN);\r\n this.ztr_rfids = this.getCodeType(codes, CODE_TYPE_ENUM.ZTR_RFID);\r\n this.ipafs = this.getCodeType(codes, CODE_TYPE_ENUM.IPAF);\r\n\r\n this.updateOutCodes();\r\n }\r\n\r\n getCodeType(aCodes = [], aType = '') {\r\n const type = aType.toUpperCase();\r\n const codes = aCodes.filter((code) => code.type.toUpperCase() === type);\r\n\r\n // Display label for IPAF cards\r\n if (type === CODE_TYPE_ENUM.IPAF) {\r\n const labelSet = new Set();\r\n const ipafLabels = [];\r\n const ipafCodes = [];\r\n\r\n codes.forEach((code) => {\r\n if (code.accessCard) {\r\n const { label } = code.accessCard;\r\n\r\n if (!labelSet.has(label)) {\r\n labelSet.add(label);\r\n ipafLabels.push({ type: CODE_TYPE_ENUM.IPAF, identifier: label });\r\n }\r\n } else {\r\n ipafCodes.push({ type: CODE_TYPE_ENUM.IPAF, identifier: code.identifier, error: true });\r\n }\r\n });\r\n\r\n return [...ipafLabels, ...ipafCodes];\r\n }\r\n\r\n return codes;\r\n }\r\n\r\n addNewCode(identifier, aType) {\r\n if (identifier < 0) return;\r\n\r\n const type = aType.toUpperCase();\r\n\r\n switch (type) {\r\n case CODE_TYPE_ENUM.PIN: {\r\n const newcode = this.createNewCode(CODE_TYPE_ENUM.PIN, identifier);\r\n this.pins.push(newcode);\r\n break;\r\n }\r\n case CODE_TYPE_ENUM.ZTR_RFID: {\r\n const newcode = this.createNewCode(CODE_TYPE_ENUM.ZTR_RFID, identifier);\r\n this.ztr_rfids.push(newcode);\r\n break;\r\n }\r\n case CODE_TYPE_ENUM.IPAF: {\r\n const newcode = this.createNewCode(CODE_TYPE_ENUM.IPAF, identifier);\r\n this.ipafs.push(newcode);\r\n break;\r\n }\r\n }\r\n\r\n this.updateOutCodes();\r\n this.saveCodeChanges(identifier);\r\n }\r\n\r\n createNewCode(type, identifier) {\r\n return {\r\n type,\r\n identifier,\r\n loading: true,\r\n };\r\n }\r\n\r\n deleteCodeType(code, aType) {\r\n const type = aType.toUpperCase();\r\n\r\n switch (type) {\r\n case CODE_TYPE_ENUM.PIN: {\r\n this.pins = this.deleteCode(this.pins, code);\r\n break;\r\n }\r\n case CODE_TYPE_ENUM.ZTR_RFID: {\r\n this.ztr_rfids = this.deleteCode(this.ztr_rfids, code);\r\n break;\r\n }\r\n case CODE_TYPE_ENUM.IPAF: {\r\n this.ipafs = this.deleteCode(this.ipafs, code);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n\r\n this.updateOutCodes();\r\n this.saveCodeChanges();\r\n }\r\n\r\n deleteCode(codeArray, code) {\r\n if (!code) return codeArray;\r\n const indexOfCode = codeArray.findIndex((c) => c.identifier === code.identifier);\r\n if (indexOfCode > -1) {\r\n codeArray[indexOfCode].toBeRemoved = true;\r\n codeArray[indexOfCode].loading = true;\r\n }\r\n return codeArray;\r\n }\r\n\r\n saveCodeChanges(identifier) {\r\n // show warning popup if user try to save with no codes\r\n if (!this.autoGeneratePin && this.outCodes.length < 1) {\r\n this.opService\r\n .openNoCodeWarningPopup()\r\n .then(() => {\r\n this.updateOperatorCodes();\r\n })\r\n .catch(() => {\r\n this.inCodes.forEach((code) => {\r\n if (code.loading) code.loading = false;\r\n if (code.toBeRemoved) code.toBeRemoved = false;\r\n });\r\n\r\n // to reset\r\n this.filterCodes();\r\n });\r\n } else {\r\n this.updateOperatorCodes(identifier);\r\n }\r\n }\r\n\r\n updateOperatorCodes(identifier) {\r\n this.status = 'updating';\r\n this.opService\r\n .updateOperatorsCodes(this.operatorId, this.outCodes, this.autoGeneratePin)\r\n .then((result) => {\r\n this.autoGeneratePin = false;\r\n this.status = 'success';\r\n this.onSaveSuccess({ codes: result });\r\n // If user has the correct expiry feature update the operator with the expired code from SQEP\r\n if (this.usersService.hasRequiredFeatures(['access.operator_expiry'])) {\r\n if (result.types.includes('IPAF')) {\r\n this.checkForOperatorIPAFExpiry(result.accessCodes, identifier);\r\n } else if (this.operatorModel.attrs.isIPAFExpiry) {\r\n delete this.operatorModel.attrs.isIPAFExpiry;\r\n delete this.editAttrs.isIPAFExpiry;\r\n this.opService.updateOperatorMetaData(\r\n this.operatorId,\r\n this.operatorModel.name,\r\n this.operatorModel.attrs,\r\n );\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n this.errorCode = error.status;\r\n this.updatedIdentifier = identifier;\r\n this.status = 'error';\r\n // to reset\r\n this.filterCodes();\r\n });\r\n }\r\n\r\n updateOutCodes() {\r\n const updatedPins = this.pins\r\n .filter((c) => !c.toBeRemoved)\r\n .map((c) => ({ type: CODE_TYPE_ENUM.PIN, identifier: c.identifier }));\r\n\r\n const updatedZtrRfids = this.ztr_rfids\r\n .filter((c) => !c.toBeRemoved)\r\n .map((c) => ({ type: CODE_TYPE_ENUM.ZTR_RFID, identifier: c.identifier }));\r\n\r\n const updatedIpafs = this.ipafs\r\n .filter((c) => !c.toBeRemoved)\r\n .map((c) => ({ type: CODE_TYPE_ENUM.IPAF, identifier: c.identifier }));\r\n\r\n this.outCodes = [...updatedPins, ...updatedZtrRfids, ...updatedIpafs];\r\n }\r\n\r\n generateCodeClick() {\r\n this.autoGeneratePin = true;\r\n if (this.operatorId) {\r\n this.updateOperatorCodes();\r\n } else {\r\n this.onSave();\r\n }\r\n }\r\n\r\n checkForOperatorIPAFExpiry(accessCodes, identifier) {\r\n for (let i = 0; i < accessCodes.length; i++) {\r\n if (accessCodes[i].type === 'IPAF') {\r\n this.opService\r\n .getOperatorExpiryById(accessCodes[i].accessCard.label)\r\n .then((expiry) => {\r\n const expiryDate = moment(expiry.expires);\r\n\r\n this.operatorModel.attrs.expiry = expiryDate.toISOString();\r\n this.operatorModel.attrs.isIPAFExpiry = true;\r\n\r\n this.editAttrs.expiry = expiryDate.toISOString();\r\n this.editAttrs.isIPAFExpiry = true;\r\n\r\n this.opService.updateOperatorMetaData(\r\n this.operatorId,\r\n this.operatorModel.name,\r\n this.operatorModel.attrs,\r\n );\r\n })\r\n .catch((error) => {\r\n this.errorCode = error.status;\r\n this.updatedIdentifier = identifier;\r\n this.status = 'error';\r\n // to reset\r\n this.filterCodes();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorCodesController,\r\n controllerAs: 'opCodesVm',\r\n bindings: {\r\n operatorId: '<',\r\n operatorModel: '=',\r\n editAttrs: '=',\r\n inCodes: '<',\r\n outCodes: '=?',\r\n autoGeneratePin: '=?',\r\n onSaveSuccess: '&',\r\n onSave: '&',\r\n },\r\n};\r\n","import template from './am-operator-details-form.html';\r\n\r\nclass AmOperatorDetailsController {\r\n constructor(amOperatorsService, amStoreService, usersService) {\r\n 'ngInject';\r\n\r\n this.opService = amOperatorsService;\r\n this.store = amStoreService;\r\n this.status = '';\r\n this.outAttrs = {};\r\n this.usersService = usersService;\r\n this.hasOperatorExpiryPermission = false;\r\n\r\n // date picker\r\n this.minDate = null;\r\n this.maxDate = null;\r\n }\r\n\r\n $onInit() {\r\n this.formName = this.formName || 'operatorDetailsForm';\r\n\r\n this.shouldHideExpiryForUser();\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n /*\r\n This role ID comparison is for Sunbelt UK Expiry feature, it is not to be used for other accounts and roles unless approved\r\n */\r\n shouldHideExpiryForUser() {\r\n this.hasOperatorEditExpiryPermission = this.usersService.canUserEditExpiry();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorDetailsController,\r\n controllerAs: 'opDTFVm',\r\n bindings: {\r\n editName: '=',\r\n editAttrs: '=',\r\n formName: '=',\r\n },\r\n};\r\n","import template from './am-group-details-form.html';\r\nclass AmGroupDetailsController {\r\n constructor() {\r\n 'ngInject';\r\n this.status = '';\r\n this.group = {};\r\n this.emailPattern = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n }\r\n $onInit() {\r\n this.formName = this.formName || 'contractDetailsForm';\r\n this.outGroup = {};\r\n this.status = '';\r\n }\r\n $onChanges(changes) {\r\n const { inGroup } = changes;\r\n\r\n if (inGroup && inGroup.currentValue) {\r\n this.outGroup = inGroup.currentValue;\r\n }\r\n }\r\n $onDestroy() { }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmGroupDetailsController,\r\n controllerAs: 'groupDTFVm',\r\n bindings: {\r\n inGroup: '<',\r\n outGroup: '=',\r\n showEmail: '=',\r\n formName: '='\r\n }\r\n};\r\n","import template from './am-operator-create.html';\r\nclass AmOperatorCreateController {\r\n constructor(amOperatorsService, amStoreService, $state) {\r\n 'ngInject';\r\n this.opService = amOperatorsService;\r\n this.store = amStoreService;\r\n this.$state = $state;\r\n this.status = '';\r\n this.operatorName = '';\r\n this.autoPin = false;\r\n this.attrs = {};\r\n this.codes = [];\r\n this.createdOperator = null;\r\n }\r\n $onInit() {}\r\n $onChanges() {}\r\n $onDestroy() {}\r\n\r\n createOperater() {\r\n if (!this.operatorName) return;\r\n //show warning popup if user try to save with no codes\r\n if (!this.autoPin && this.codes.length < 1) {\r\n this.opService\r\n .openNoCodeWarningPopup()\r\n .then(() => {\r\n this.saveOperator();\r\n })\r\n .catch(() => {});\r\n } else {\r\n this.saveOperator();\r\n }\r\n }\r\n saveOperator() {\r\n const operator = {\r\n name: this.operatorName,\r\n attrs: this.attrs,\r\n autoGeneratePIN: this.autoPin,\r\n accessCodes: this.codes\r\n };\r\n this.status = 'creating';\r\n this.opService\r\n .createOperator(operator)\r\n .then(created => {\r\n this.createdOperator = created;\r\n this.autoPin = false;\r\n this.status = 'success';\r\n })\r\n .catch(error => {\r\n this.errorCode = error.status;\r\n this.status = 'error';\r\n });\r\n }\r\n resetForNewOperator() {\r\n this.status = '';\r\n this.operatorName = '';\r\n this.autoPin = false;\r\n this.attrs = {};\r\n this.codes = [];\r\n this.createdOperator = null;\r\n }\r\n goToDetails() {\r\n if (this.createdOperator && this.createdOperator.id) {\r\n this.$state.go('access-management.operator-view', {\r\n id: this.createdOperator.id,\r\n name: this.createdOperator.name\r\n });\r\n }\r\n }\r\n goToList() {\r\n this.$state.go('access-management.operators-list');\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorCreateController,\r\n controllerAs: 'opCreateVm',\r\n bindings: {}\r\n};\r\n","import * as Util from '../core/utilities/am-operators.util';\r\n\r\nexport class AmSelectListController {\r\n constructor() {\r\n this.selected = {};\r\n this.util = Util;\r\n this.list = [];\r\n }\r\n\r\n $onInit() {\r\n this.onSelection = this.onSelection || undefined;\r\n if (!this.selected) {\r\n this.selected = {};\r\n }\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n get isAllSelected() {\r\n const selectedIds = Object.keys(this.selected);\r\n return this.isAllListSelected(selectedIds);\r\n }\r\n\r\n toggelSelectAllPage(event) {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n const isSelectAll = !this.isAllSelected;\r\n this.list.forEach((item) => {\r\n isSelectAll ? this.addSelectedItem(item) : this.removeSelectedItem(item);\r\n });\r\n\r\n if (this.onSelection) {\r\n this.onSelection({ selected: this.selected });\r\n }\r\n }\r\n\r\n toggelSelection(item, event) {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n if (item.id in this.selected) {\r\n this.removeSelectedItem(item);\r\n } else {\r\n this.addSelectedItem(item);\r\n }\r\n\r\n if (this.onSelection) {\r\n this.onSelection({ selected: this.selected });\r\n }\r\n }\r\n\r\n removeSelectedItem(item) {\r\n delete this.selected[item.id];\r\n // this.updateSelectedResult();\r\n }\r\n\r\n addSelectedItem(item) {\r\n this.selected[item.id] = item;\r\n // this.updateSelectedResult();\r\n }\r\n\r\n isAllListSelected(selectedIds = []) {\r\n return this.list.length && this.list.every((a) => selectedIds.includes(`${a.id}`));\r\n }\r\n}\r\n","/**\r\n * getTableRow returns an object intended for usage in a generic table view. Currently, only\r\n * the asset table utilizes this functionality. Properties of this object prescribe the behaviour\r\n * of a particular header and all rows for that header.\r\n * \r\n * For example, whether that column should be shown (show), or a handler for when a row is\r\n * clicked (valueOnClick).\r\n * \r\n */\r\nexport function getTableRow(overrides = {}) {\r\n return {\r\n header: '',\r\n icon: false,\r\n headerIsClickable: false,\r\n valueIsClickable: false,\r\n value: (prop) => prop[`${overrides.header}`.toLowerCase()],\r\n show: () => true,\r\n headerOnClick: () => {},\r\n valueOnClick: () => {},\r\n getIcon: (prop) => undefined,\r\n getHeaderClass: () => '',\r\n getRowClass: () => '',\r\n sortable: () => false,\r\n sortIcon: () => undefined,\r\n ...overrides\r\n }\r\n}","import template from './am-assets-list-table.html';\r\nimport { AmSelectListController } from '../am-list-table-base.controller';\r\nimport { getTableRow } from '../../../../functions/table.functions';\r\nimport { ordersBy } from '../../core/models/am-helper.model';\r\n\r\nclass AmAssetListTableController extends AmSelectListController {\r\n constructor(amAssignmentService) {\r\n 'ngInject';\r\n\r\n super();\r\n this.assignmentStatus = amAssignmentService.assignmentStatus;\r\n }\r\n\r\n $onInit() {\r\n this.onSelection = this.onSelection || undefined;\r\n this.tableRows = this.tableRows || this.getDefaultTableRows();\r\n // if sortedBy not supplied will default the sorting on codesSyncStatus (assignment status)\r\n // and enable the filtering by ng-repeat\r\n if (!this.sortedBy) {\r\n this.useSortExpr = true;\r\n this.sortedBy = ordersBy.codesSyncStatus;\r\n }\r\n }\r\n\r\n // build sort expression to use in ng-repeat for spots where we are not using the service for client side filtering\r\n get sortExpr() {\r\n return this.useSortExpr ? `${this.sortedBy.desc ? '-' : '+'}${this.sortedBy.attr}` : undefined;\r\n }\r\n\r\n toggelSelectAsset(asset, event) {\r\n if (asset.unselectable) return;\r\n this.toggelSelection(asset, event);\r\n }\r\n\r\n getDefaultTableRows() {\r\n return [\r\n getTableRow({\r\n header: 'Name',\r\n valueIsClickable: !this.selectMode,\r\n valueOnClick: (obj) => this.onViewAsset(obj),\r\n getRowClass: () => (this.selectMode ? '' : { linkable: true }),\r\n }),\r\n getTableRow({\r\n header: 'Make',\r\n }),\r\n getTableRow({\r\n header: 'Model',\r\n }),\r\n getTableRow({\r\n header: 'Year',\r\n }),\r\n getTableRow({\r\n header: 'Keypad Connected',\r\n value: (prop) => (prop.keypadStatus ? 'Yes' : 'No'),\r\n }),\r\n getTableRow({\r\n header: 'Current Session',\r\n show: () => this.selectMode === false,\r\n value: (prop) => (prop.accessSession ? 'Checked In' : 'Checked Out'),\r\n }),\r\n getTableRow({\r\n header: 'Assignment Status',\r\n headerIsClickable: true,\r\n headerOnClick: () => this.sortByColumn('codesSyncStatus'),\r\n getHeaderClass: () => ({\r\n clickable: true,\r\n 'text-bold': this.sortedBy && this.sortedBy.attr === 'codesSyncStatus',\r\n }),\r\n sortable: () => this.sortedBy && this.sortedBy.attr === 'codesSyncStatus',\r\n sortIcon: () => this.sortDirIcon,\r\n value: (prop) => this.getAssignmentStatusFromAsset(prop).label,\r\n icon: true,\r\n getIcon: (prop) => this.getAssignmentStatusFromAsset(prop).iClass,\r\n }),\r\n ];\r\n }\r\n\r\n getAssignmentStatusFromAsset({ codesSyncStatus }) {\r\n const maybeAssignmentStatus = this.assignmentStatus[codesSyncStatus];\r\n return maybeAssignmentStatus || { label: '', iClass: '' };\r\n }\r\n\r\n sortByColumn(name) {\r\n const { attr: currentSortProp, desc: currentDir } = this.sortedBy || {};\r\n this.sortedBy = {\r\n attr: name,\r\n desc: name === currentSortProp && !currentDir,\r\n };\r\n if (this.onSort) {\r\n this.onSort({ sortByEvent: this.sortedBy });\r\n }\r\n }\r\n\r\n get sortDirIcon() {\r\n return this.sortedBy && this.sortedBy.desc ? 'z-arrowdown' : 'z-arrowup';\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmAssetListTableController,\r\n controllerAs: 'assetsTbVm',\r\n bindings: {\r\n list: '<',\r\n tableRows: '<',\r\n onViewAsset: '&',\r\n selectMode: '<',\r\n selected: '=?',\r\n unSelectableList: '<',\r\n onSelection: '&',\r\n sortedBy: '<',\r\n onSort: '&',\r\n },\r\n};\r\n","import template from './am-assignments.html';\r\nimport { Paging, Assetsfilter } from '../../core/models/am-helper.model';\r\nimport { gettext } from '../../../../state/gettext-extract-util';\r\n\r\nclass AMAssignmentsController {\r\n constructor(amAssetsService, amOperatorsService, amAssignmentService) {\r\n 'ngInject';\r\n\r\n this.assetService = amAssetsService;\r\n this.opService = amOperatorsService;\r\n this.assignmentService = amAssignmentService;\r\n this.selectedAsset = {};\r\n this.selectedOperators = {};\r\n this.command = '';\r\n this.status = '';\r\n\r\n this.total = null;\r\n this.filter = new Assetsfilter();\r\n this.filter.facet = null;\r\n this.paging = new Paging(15, 1);\r\n this.steps = [\r\n {\r\n name: gettext('Select Assets'),\r\n },\r\n {\r\n name: gettext('Select Operators'),\r\n },\r\n {\r\n name: gettext('Done'),\r\n },\r\n ];\r\n this.stepActiveIndex = 0;\r\n\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n\r\n get SelectedOperatorsIdsArray() {\r\n return Object.keys(this.selectedOperators || {});\r\n }\r\n\r\n get SelectedAssetsIdsArray() {\r\n return Object.keys(this.selectedAsset || {});\r\n }\r\n\r\n $onInit() {\r\n this.setCommand('assign');\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n isObjectEmpty(obj) {\r\n return Object.entries(obj).length === 0;\r\n }\r\n\r\n nextStep() {\r\n this.stepActiveIndex++;\r\n }\r\n\r\n prevStep() {\r\n this.stepActiveIndex--;\r\n }\r\n\r\n perform() {\r\n this.nextStep();\r\n this.invalidInputs = !this.validInputs();\r\n if (this.invalidInputs) {\r\n return;\r\n }\r\n const oprIds = this.SelectedOperatorsIdsArray;\r\n const assetIds = this.SelectedAssetsIdsArray;\r\n this.status = 'performing';\r\n this.assignmentService\r\n .perform(assetIds, oprIds, this.command)\r\n .then(() => {\r\n this.stepActiveIndex = null;\r\n this.status = 'success';\r\n\r\n this.addToDataLayer({\r\n event: 'updateAssignmentSucceeded',\r\n data: {\r\n totalAsset: assetIds.length,\r\n totalOperator: oprIds.length,\r\n command: this.command,\r\n },\r\n });\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n\r\n this.addToDataLayer({\r\n event: 'updateAssignmentfailed',\r\n data: {\r\n totalAsset: assetIds.length,\r\n totalOperator: oprIds.length,\r\n command: this.command,\r\n },\r\n });\r\n });\r\n }\r\n\r\n validInputs() {\r\n return (\r\n this.SelectedOperatorsIdsArray.length && this.SelectedAssetsIdsArray.length && this.command\r\n );\r\n }\r\n\r\n reset() {\r\n this.selectedOperators = {};\r\n this.selectedAsset = {};\r\n this.resetSteps();\r\n this.resetStatus();\r\n }\r\n\r\n setCommand(value) {\r\n switch (value) {\r\n case 'assign':\r\n this.command = this.assignmentService.commands.ASSIGN;\r\n break;\r\n case 'unassign':\r\n this.command = this.assignmentService.commands.UNASSIGN;\r\n break;\r\n default:\r\n this.command = '';\r\n }\r\n this.reset();\r\n }\r\n\r\n resetStatus() {\r\n this.status = '';\r\n }\r\n\r\n resetSteps() {\r\n this.stepActiveIndex = 0;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AMAssignmentsController,\r\n controllerAs: 'assignVm',\r\n bindings: {},\r\n};\r\n","import _ from 'lodash';\r\nimport moment from 'moment';\r\nimport template from './am-operators-list-table.html';\r\nimport { Paging, OperatorsOrdersBy } from '../../core/models/am-helper.model';\r\nimport { AmSelectListController } from '../am-list-table-base.controller';\r\n\r\nclass AmOperatorsListTableController extends AmSelectListController {\r\n constructor(amAssignmentService, amOperatorsService, usersService, $filter) {\r\n 'ngInject';\r\n\r\n super();\r\n this.opService = amOperatorsService;\r\n this.assignmentStatus = amAssignmentService.assignmentStatus;\r\n this.usersService = usersService;\r\n this.sortedBy = OperatorsOrdersBy.name;\r\n // paging\r\n this.paging = new Paging(10, 1);\r\n this.$filter = $filter;\r\n this.operatorsTableList = [];\r\n this.hasAccessOperatorExpiryFeature = false;\r\n }\r\n\r\n $onInit() {\r\n this.hasAccessOperatorExpiryFeature = this.usersService.hasRequiredFeatures([\r\n 'access.operator_expiry',\r\n ]);\r\n }\r\n\r\n $onChanges() {\r\n // Project the operator model into a simpler structure for retrieving the secondary group\r\n this.operatorsTableList = this.list.map((op) => {\r\n const secondaryGroups = _.get(op.security_context, 'groups', []).map((group) => group.name);\r\n if (this.view === 'asset-view') {\r\n return {\r\n ...op,\r\n secondary_groups: secondaryGroups,\r\n };\r\n }\r\n return {\r\n ...op,\r\n secondary_groups: secondaryGroups,\r\n expiry_in: this.getExpiryInDays(op.attrs.expiry),\r\n };\r\n });\r\n\r\n this.sortByColumn();\r\n }\r\n\r\n get sortExpr() {\r\n return `${this.sortedBy.desc ? '-' : '+'}${this.sortedBy.attr}`;\r\n }\r\n\r\n sortByColumn(name) {\r\n if (name) {\r\n const { attr, desc } = this.sortedBy || {};\r\n this.sortedBy = {\r\n attr: name,\r\n desc: name === attr && !desc,\r\n };\r\n }\r\n\r\n if (this.sortedBy.attr === 'attrs.expiry') {\r\n this.operatorsTableList = this.operatorsTableList.sort((a, b) => {\r\n if (a.expiry_in === null && b.expiry_in === null) return 0;\r\n if (a.expiry_in === null) return 1;\r\n if (b.expiry_in === null) return -1;\r\n\r\n if (this.sortedBy.desc) return b.expiry_in - a.expiry_in;\r\n return a.expiry_in - b.expiry_in;\r\n });\r\n } else {\r\n this.operatorsTableList = this.$filter('orderBy')(\r\n this.operatorsTableList,\r\n this.sortedBy.attr,\r\n this.sortedBy.desc,\r\n );\r\n }\r\n }\r\n\r\n get sortDirIcon() {\r\n return this.sortedBy && this.sortedBy.desc ? 'z-arrowdown' : 'z-arrowup';\r\n }\r\n\r\n getExpiryInDays(expirydate) {\r\n if (expirydate == null || expirydate == undefined) {\r\n return null;\r\n }\r\n let expiryDate = moment(expirydate);\r\n let currenDate = moment();\r\n return expiryDate.diff(currenDate, 'days');\r\n }\r\n\r\n //takes expiry days as input\r\n getExpiryTextcssClass(expiryIn) {\r\n if (expiryIn > 20 && expiryIn <= 30) {\r\n return 'expiry-msg expiry-msg_yellow';\r\n } else if (expiryIn > 10 && expiryIn <= 20) {\r\n return 'expiry-msg expiry-msg_orange';\r\n } else if ((expiryIn >= 0 && expiryIn <= 10) || expiryIn < 0) {\r\n return 'expiry-msg expiry-msg_red';\r\n }\r\n return '';\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorsListTableController,\r\n controllerAs: 'opsTbVm',\r\n bindings: {\r\n list: '<',\r\n total: '<',\r\n onView: '&',\r\n selectMode: '<',\r\n view: '@',\r\n selected: '=?', // object will hold selected as {id:item}\r\n isGroupVisible: '<',\r\n },\r\n};\r\n","import { Paging, Assetsfilter } from '../../core/models/am-helper.model';\r\nimport template from './asset-list-client.component.html';\r\nimport * as util from '../../core/utilities/am-helper.util';\r\n\r\nclass AmAssetListClientController {\r\n constructor($state, amFilterPaginationService, amAssetsService) {\r\n 'ngInject';\r\n\r\n this.assets = [];\r\n this.filteredAssets = [];\r\n this.selectedAssets = {};\r\n this.status = '';\r\n this.total = 0;\r\n this.$state = $state;\r\n this.filterPagingService = amFilterPaginationService;\r\n this.assetService = amAssetsService;\r\n this.selectMode = true;\r\n this.paging = new Paging(7, 1);\r\n this.total = null;\r\n\r\n this.filter = new Assetsfilter();\r\n this.propertyKeys = ['name', 'make', 'model', 'year', 'codesSyncStatus'];\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n\r\n $onInit() {}\r\n\r\n $onChanges(changes) {\r\n this.initializeAssets(changes.assetsIn.currentValue);\r\n }\r\n\r\n $onDestroy() {}\r\n\r\n initializeAssets(assets) {\r\n if (!assets) return;\r\n this.assets = assets;\r\n this.total = this.assets.length;\r\n this.status = '';\r\n this.filterPagingService\r\n .getPaged(this.filter, this.paging, this.assets, this.propertyKeys)\r\n .then((result) => {\r\n this.filteredAssets = result.data;\r\n });\r\n }\r\n\r\n loadPage(pageNumber) {\r\n this.paging.currentPage = pageNumber;\r\n this.getAssetsPaged();\r\n }\r\n\r\n onTriggerSearch(term) {\r\n this.filter.query = term ? `*${term}*` : '*';\r\n this.filteredAssets = this.filterPagingService.filterByTerm(\r\n this.groups,\r\n term,\r\n this.propertyKeys,\r\n );\r\n this.paging.reset();\r\n }\r\n\r\n viewAsset(asset) {\r\n if (asset) {\r\n this.$state.go('access-management.asset-view', {\r\n id: asset.id,\r\n });\r\n }\r\n }\r\n\r\n openSelectAssetsPopup() {\r\n const alreadyAddedAssets = this.getAssetIds();\r\n this.assetService\r\n .openSelectAssetPopup({}, alreadyAddedAssets)\r\n .then((result) => {\r\n this.status = 'loading';\r\n // Filter the assets that were already selected;\r\n\r\n const selected = util.objectToArray(result);\r\n const resultAdd = selected.filter(\r\n (selectedAsset) => this.assets.findIndex((asset) => asset.id === selectedAsset.id) === -1,\r\n );\r\n // Update the parent controller to add Assets.\r\n if (resultAdd.length > 0) this.addAssets({ assets: resultAdd });\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n hasSelection() {\r\n return Object.keys(this.selectedAssets).length > 0;\r\n }\r\n\r\n numberSelected() {\r\n return Object.keys(this.selectedAssets).length;\r\n }\r\n\r\n removeSelected() {\r\n if (!this.hasSelection()) return;\r\n this.status = 'loading';\r\n // Convert the selected assets to array\r\n const selected = util.objectToArray(this.selectedAssets);\r\n this.removeAssets({ assets: selected });\r\n this.selectedAssets = {};\r\n }\r\n\r\n getAssetsPaged() {\r\n this.filterPagingService\r\n .getPaged(this.filter, this.paging, this.assets, this.propertyKeys)\r\n .then((result) => {\r\n this.filteredAssets = result.data;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n updateSearchQuery(query) {\r\n this.filter.query = query;\r\n if (query === '') {\r\n this.getAssetsPaged();\r\n this.paging.currentPage = 1;\r\n } else {\r\n this.filteredAssets = this.filterPagingService.filterByTerm(\r\n this.assets,\r\n query,\r\n this.propertyKeys,\r\n );\r\n this.paging.reset();\r\n\r\n this.addToDataLayer({\r\n event: 'assetSearching',\r\n data: {\r\n keyword: query,\r\n page: this.$state.current.name,\r\n },\r\n });\r\n }\r\n }\r\n\r\n getAssetIds() {\r\n return this.assets.map((asset) => asset.id);\r\n }\r\n\r\n sortBy(sortByEvent) {\r\n this.filter.clientSideOrderBy = sortByEvent;\r\n this.getAssetsPaged();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmAssetListClientController,\r\n controllerAs: 'assetVm',\r\n bindings: {\r\n assetsIn: '<',\r\n assetsOut: '&',\r\n addAssets: '&',\r\n removeAssets: '&',\r\n },\r\n};\r\n","import template from './am-asset-view.html';\r\nclass AmAssetViewController {\r\n constructor(amAssetsService, $stateParams, $state, amStoreService) {\r\n 'ngInject';\r\n this.assetService = amAssetsService;\r\n this.$stateParams = $stateParams;\r\n this.$state = $state;\r\n this.status = '';\r\n this.store = amStoreService;\r\n }\r\n $onInit() {\r\n this.asset = this.store.viewedAsset;\r\n this.getAssetData(this.$stateParams.id);\r\n }\r\n $onChanges() {}\r\n $onDestroy() {}\r\n getAssetData(id) {\r\n this.status = 'loading';\r\n this.assetService\r\n .getAssetById(id)\r\n .then(asset => {\r\n this.status = '';\r\n this.asset = asset;\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmAssetViewController,\r\n controllerAs: 'assetVm',\r\n bindings: {}\r\n};\r\n","import template from './am-asset-operators-list.component.html';\r\nimport { Paging, Operatorsfilter } from '../../core/models/am-helper.model';\r\nimport { isPrimaryUser } from '../../core/utilities/am-operators.util';\r\n\r\nclass AmAssetOperatorsListController {\r\n constructor(amOperatorsService, amAssignmentService, $scope, $ngRedux) {\r\n 'ngInject';\r\n this.opService = amOperatorsService;\r\n this.assignmentService = amAssignmentService;\r\n this.operators = [];\r\n this.pagedOperators = [];\r\n this.status = '';\r\n this.paging = new Paging(10, 1);\r\n this.filter = new Operatorsfilter();\r\n this.selectedOperatorsToRemove = {};\r\n this.scope = $scope;\r\n this.store = $ngRedux;\r\n this.propertyKeys = ['name'];\r\n }\r\n get SelectedArray() {\r\n return Object.keys(this.selectedOperatorsToRemove || {});\r\n }\r\n\r\n get isPrimaryUser() {\r\n return isPrimaryUser(this.user);\r\n }\r\n\r\n $onInit() {\r\n this.getOperators();\r\n const unsubscribe = this.store.connect(this.mapStateToThis, null)(this);\r\n this.scope.$on('$destroy', unsubscribe);\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n mapStateToThis(state) {\r\n const { user } = state;\r\n return { user };\r\n }\r\n\r\n getOperators() {\r\n this.status = 'loading';\r\n this.opService\r\n .getOperatorsByAssetId(this.assetId)\r\n .then((operators) => {\r\n this.operators = operators || [];\r\n this.loadCurrentPage();\r\n this.status = this.operators.length ? '' : 'no-data';\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n\r\n onTriggerSearch(term) {\r\n this.filter.query = term ? `*${term}*` : '*';\r\n this.paging.reset();\r\n this.loadCurrentPage();\r\n }\r\n\r\n loadCurrentPage() {\r\n this.opService\r\n .getPagedOperators(this.filter, this.paging, this.operators, this.propertyKeys)\r\n .then((result) => {\r\n this.pagedOperators = result.data;\r\n this.total = result.total;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n addOperators() {\r\n this.opService\r\n .openSelectOperatorsPopup(\r\n [],\r\n this.operators.map((op) => op.id),\r\n )\r\n .then((result) => {\r\n const operatorsIdsToAdd = Object.keys(result);\r\n if (operatorsIdsToAdd.length) {\r\n this.assignOperatorsToAsset(operatorsIdsToAdd);\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n assignOperatorsToAsset(operatorsIds = []) {\r\n this.assignmentService\r\n .assign([this.assetId], operatorsIds)\r\n .then((result) => {\r\n //assign success\r\n this.getOperators();\r\n })\r\n .catch(() => {\r\n this.status = 'add-error';\r\n });\r\n }\r\n unassignOperatorsFromAsset(operatorsIds = []) {\r\n this.assignmentService\r\n .unassign([this.assetId], operatorsIds)\r\n .then((result) => {\r\n //unassign success\r\n this.selectedOperatorsToRemove = {};\r\n this.getOperators();\r\n })\r\n .catch(() => {\r\n //error removing operators\r\n this.status = 'remove-error';\r\n });\r\n }\r\n removeSelectedOperators() {\r\n const opsIds = this.SelectedArray;\r\n this.unassignOperatorsFromAsset(opsIds);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmAssetOperatorsListController,\r\n controllerAs: 'assetOpsVm',\r\n bindings: {\r\n assetId: '<',\r\n },\r\n};\r\n","import { Paging, Assetsfilter } from '../../core/models/am-helper.model';\r\nimport template from './operator-assets-list.html';\r\nimport { isArrayNotEmpty, pollOnInterval } from '../../core/utilities/am-helper.util';\r\n\r\nclass AmOperatorAssetListController {\r\n constructor($state, amAssetsService, amAssignmentService, $interval) {\r\n 'ngInject';\r\n\r\n this.assets = [];\r\n this.pagedAssets = [];\r\n this.selectedAssets = {};\r\n this.status = '';\r\n this.$state = $state;\r\n this.assetService = amAssetsService;\r\n this.assignmentService = amAssignmentService;\r\n this.paging = new Paging(10, 1);\r\n this.total = 0;\r\n this.filter = new Assetsfilter();\r\n this.interval = $interval;\r\n this.propertyKeys = ['name', 'make', 'model', 'year'];\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n\r\n get SelectedArray() {\r\n return Object.keys(this.selectedAssets || {});\r\n }\r\n\r\n $onInit() {\r\n this.status = 'loading';\r\n this.getAssigndAssets().then(() => {\r\n this.updateInterval = pollOnInterval(this.interval, () => this.getAssigndAssets());\r\n });\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {\r\n if (this.updateInterval) {\r\n this.interval.cancel(this.updateInterval);\r\n }\r\n }\r\n\r\n getAssigndAssets() {\r\n return this.assetService\r\n .getAssetsByOperatorId(this.operatorId)\r\n .then((result) => {\r\n this.assets = result.assets || [];\r\n this.loadCurrentPage();\r\n this.status = '';\r\n this.onUpdate({ assetsTotal: this.assets.length });\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n\r\n onTriggerSearch(term) {\r\n this.filter.query = term ? `*${term}*` : '*';\r\n this.paging.reset();\r\n this.loadCurrentPage();\r\n\r\n this.addToDataLayer({\r\n event: 'assetSearching',\r\n data: {\r\n keyword: term,\r\n page: this.$state.current.name,\r\n },\r\n });\r\n }\r\n\r\n loadCurrentPage() {\r\n this.assetService\r\n .getPagedAssets(this.filter, this.paging, this.assets, this.propertyKeys)\r\n .then((result) => {\r\n this.pagedAssets = result.data;\r\n this.total = result.total;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n viewAsset(asset) {\r\n if (asset) {\r\n this.$state.go('access-management.asset-view', {\r\n id: asset.id,\r\n });\r\n }\r\n }\r\n\r\n addAssets() {\r\n const alreadyAddedAssets = (this.assets || []).map((asset) => asset.id);\r\n this.assetService\r\n .openSelectAssetPopup({}, alreadyAddedAssets)\r\n .then((result) => {\r\n const assetsIds = Object.keys(result);\r\n this.assignAssetsToOperator(assetsIds);\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n assignAssetsToOperator(assetsIds = []) {\r\n // validate input\r\n if (!isArrayNotEmpty(assetsIds)) return;\r\n\r\n this.assignmentService\r\n .assign(assetsIds, [this.operatorId])\r\n .then((result) => {\r\n this.getAssigndAssets();\r\n })\r\n .catch(() => {\r\n this.status = 'add-error';\r\n });\r\n }\r\n\r\n unassignAssets(assetsIds = []) {\r\n if (!isArrayNotEmpty(assetsIds)) return;\r\n this.assignmentService\r\n .unassign(assetsIds, [this.operatorId])\r\n .then((result) => {\r\n this.selectedAssets = {};\r\n this.getAssigndAssets();\r\n })\r\n .catch(() => {\r\n this.status = 'remove-error';\r\n });\r\n }\r\n\r\n removeSelected() {\r\n const assetsIds = this.SelectedArray;\r\n this.unassignAssets(assetsIds);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AmOperatorAssetListController,\r\n controllerAs: 'opAssetsVm',\r\n bindings: {\r\n operatorId: '<',\r\n assets: '<',\r\n onAdd: '&',\r\n onRemove: '&',\r\n status: '<',\r\n onRefresh: '&',\r\n onUpdate: '&',\r\n },\r\n};\r\n","import template from './add-input.html';\r\nclass AddInputController {\r\n constructor() {\r\n this.value = null;\r\n }\r\n $onInit() {\r\n this.formName = `inputAddForm${Math.floor(Math.random() * 100)}`;\r\n }\r\n $onChanges() { }\r\n $onDestroy() { }\r\n add() {\r\n if (this.formName.$invalid) return;\r\n this.onAdd({ value: this.value });\r\n this.value = null;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AddInputController,\r\n controllerAs: 'addInputVm',\r\n bindings: {\r\n onAdd: '&',\r\n maxNumber: '<',\r\n minNumber: '<',\r\n placeHolder: '@'\r\n }\r\n};\r\n","import template from './search-input.html';\r\nimport _ from 'lodash';\r\n\r\nclass SearchInputController {\r\n constructor() {\r\n this.loading = false;\r\n this.showClear = !_.isEmpty(this.query);\r\n }\r\n\r\n searchSubmit(search) {\r\n this.onTrigger({ query: search });\r\n this.showClear = !_.isEmpty(search);\r\n this.query = search;\r\n }\r\n\r\n $onChanges(changes) {\r\n const { inValue } = changes;\r\n if (inValue) {\r\n this.query = this.inValue;\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SearchInputController,\r\n controllerAs: 'searchInputVm',\r\n bindings: {\r\n onTrigger: '&',\r\n onChange: '&',\r\n isSearching: '<',\r\n placeHolder: '@',\r\n inValue: '<',\r\n },\r\n};\r\n","import template from './ipaf-input.html';\r\n\r\nclass IpafInputController {\r\n constructor() {\r\n this.value = null;\r\n }\r\n\r\n $onInit() {\r\n this.formName = `inputAddForm${Math.floor(Math.random() * 100)}`;\r\n }\r\n\r\n add() {\r\n if (this.formName.$invalid) return;\r\n this.onAdd({ value: this.value });\r\n this.value = null;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: IpafInputController,\r\n controllerAs: 'ipafInputVm',\r\n bindings: {\r\n onAdd: '&',\r\n },\r\n};\r\n","\r\nconst lowerCaseKeysObject = (obj = {}) =>\r\n Object.keys(obj).reduce((newObj, key) => {\r\n newObj[key.toLowerCase()] = obj[key];\r\n return newObj;\r\n }, {});\r\n\r\nexport class AmAsset {\r\n constructor(asset) {\r\n asset = asset || {};\r\n asset.session = asset.session || {};\r\n const attrs = lowerCaseKeysObject(asset.attrs);\r\n this.id = asset.equipmentId;\r\n this.name = asset.name;\r\n this.attrs = asset.attrs;\r\n this.make = attrs['make'];\r\n this.model = attrs['model'];\r\n this.year = attrs['model year'];\r\n this.keypadStatus = asset.keypadStatus;\r\n this.accessSession = asset.session['status'];\r\n this.accessOperator = asset.session['operatorName'] || '';\r\n this.accessLast = asset.session['last'] || '';\r\n this.operators = asset.operators || [];\r\n //to be determined for now its (pending,success,failed)\r\n this.codesSyncStatus = asset.status;\r\n this.selected = false;\r\n }\r\n}\r\n","import {AmAsset} from './models/am-asset.model';\r\nimport {Operator} from './models/operator.model';\r\n\r\n/**\r\n * serice will holed sharable data between the different components\r\n */\r\nexport default class AmStoreService {\r\n constructor(gettext) {\r\n 'ngInject';\r\n this.assets = [];\r\n this.operators = [];\r\n this.CODE_SYNC_MAP = {\r\n pending: {label: gettext('Pending'), iclass: ''},\r\n failed: {label: gettext('Failed'), iclass: ''},\r\n success: {label: gettext('Successful'), iclass: ''}\r\n };\r\n this.viewedOperator = null;\r\n this.viewedAsset = null;\r\n }\r\n get CodeTypes() {\r\n const CODE_TYPE_ENUM = {\r\n PIN: 'PIN',\r\n ZTR_RFID: 'ZTR_RFID',\r\n IPAF: 'IPAF'\r\n };\r\n return CODE_TYPE_ENUM;\r\n }\r\n getStore() {\r\n return this;\r\n }\r\n updateAssets(assetData = []) {\r\n this.assets = assetData.map(asset => new AmAsset(asset));\r\n }\r\n updateOperators(operatorsData = []) {\r\n this.operators = operatorsData.map(oprerator => new Operator(oprerator));\r\n }\r\n setVeiwedOperator(operator) {\r\n this.viewedOperator = operator;\r\n }\r\n}\r\n","export default class AccessManagementService {\r\n constructor(accessManagementAPI, amStoreService) {\r\n 'ngInject';\r\n this.api = accessManagementAPI;\r\n this.amStoreService = amStoreService;\r\n }\r\n getOperators() {\r\n return this.api.getDashboardData().then(respons => {\r\n const operators = respons.data.operators;\r\n //update the store data.\r\n this.amStoreService.updateOperators(operators);\r\n\r\n return this.amStoreService.getStore();\r\n });\r\n }\r\n getAssets() {\r\n return this.api.getDashboardData().then(respons => {\r\n const assets = respons.data.assets;\r\n //update the store.\r\n this.amStoreService.updateAssets(assets);\r\n\r\n return this.amStoreService.getStore();\r\n });\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n }\r\n ok() {\r\n this.$uibModalInstance.close();\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, amOperatorsService, operator) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.opService = amOperatorsService;\r\n this.operator = operator;\r\n this.status = '';\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n //on delete successfully just close the popup\r\n deleteOperator() {\r\n if (!this.operator) return;\r\n this.status = 'deleting';\r\n this.opService\r\n .deleteOperator(this.operator.id)\r\n .then(() => {\r\n this.$uibModalInstance.close();\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, selected, excluded) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.selected = selected ? {...selected} : {};\r\n this.excluded = excluded;\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n //on delete successfully just close the popup\r\n confirm() {\r\n this.$uibModalInstance.close(this.selected);\r\n }\r\n}\r\n","import * as Util from './utilities/am-operators.util';\r\n\r\n//popups\r\nimport noCodePopupHtml from '../components/no-codes-warning-popup/no-codes-popup.html';\r\nimport noCodePopupController from '../components/modal-popup-base/modal-popup-base';\r\nimport deleteOperatorPopupHtml from '../components/operator-delete-popup/am-operator-delete-popup.html';\r\nimport deleteOperatorController from '../components/operator-delete-popup/am-operator-delete-popup.componenet';\r\nimport selectOperatorsPopupHtml from '../components/operatos-list-select-popup/am-operators-list-select-popup.html';\r\nimport selectOperatorsController from '../components/operatos-list-select-popup/am-operators-list-select-popup';\r\n\r\nimport { filterData } from '../../../functions/search.functions';\r\n\r\nexport default class AmOperatorsService {\r\n constructor(\r\n $q,\r\n operatorsAPI,\r\n amStoreService,\r\n gettext,\r\n $filter,\r\n $uibModal,\r\n accessManagementAPI,\r\n amFilterPaginationService,\r\n ) {\r\n 'ngInject';\r\n this.$q = $q;\r\n this.api = operatorsAPI;\r\n this.amStoreService = amStoreService;\r\n this.gettext = gettext;\r\n this.$filter = $filter;\r\n this.$uibModal = $uibModal;\r\n this.amAPI = accessManagementAPI;\r\n this.amFilterPaginationService = amFilterPaginationService;\r\n }\r\n\r\n operatorsCsvToJson(csvFile) {\r\n return this.api.operatorsCsvToJson(csvFile);\r\n }\r\n\r\n bulkCreateOperators(operatorList) {\r\n return this.api.bulkCreateOperators(operatorList);\r\n }\r\n generateCreatedOperatorsCsvData(createdOperatorsFeedback = []) {\r\n const header = {\r\n row: 'Row',\r\n name: 'Name',\r\n pin: 'PIN',\r\n ztr_rfid: 'ZTR_RFID',\r\n ipaf: 'IPAF',\r\n };\r\n const data = createdOperatorsFeedback.map((operatorFeed) => {\r\n const pins = Util.GetAccessCodesType(operatorFeed.operator, 'PIN').join(' - ');\r\n const ztr_rfids = Util.GetAccessCodesType(operatorFeed.operator, 'ZTR_RFID').join(' - ');\r\n const ipafs = Util.GetAccessCodesType(operatorFeed.operator, 'IPAF').join(' - ');\r\n return {\r\n row: operatorFeed.rowNumber,\r\n name: operatorFeed.operator.name,\r\n pin: pins,\r\n ztr_rfid: ztr_rfids,\r\n ipaf: ipafs,\r\n };\r\n });\r\n return [header, ...data];\r\n }\r\n generateFailedCreateOperatorsCsvData(failedOperatorsFeedback = []) {\r\n const header = {\r\n row: 'Row',\r\n name: 'Name',\r\n pin: 'PIN',\r\n ztr_rfid: 'ZTR_RFID',\r\n ipaf: 'IPAF',\r\n error: 'Error',\r\n };\r\n const data = failedOperatorsFeedback.map((operatorFeed) => {\r\n const pins = Util.GetCSVRowAccessCodesType(operatorFeed.row, 'PIN');\r\n const ztr_rfids = Util.GetCSVRowAccessCodesType(operatorFeed.row, 'ZTR_RFID');\r\n const ipafs = Util.GetCSVRowAccessCodesType(operatorFeed.row, 'IPAF');\r\n return {\r\n row: operatorFeed.rowNumber,\r\n name: operatorFeed.name,\r\n pin: pins,\r\n ztr_rfid: ztr_rfids,\r\n ipaf: ipafs,\r\n error: this.getOperatorMessages()[operatorFeed.errorCode] || '',\r\n };\r\n });\r\n return [header, ...data];\r\n }\r\n\r\n getOperatorMessages() {\r\n return {\r\n 'invalid-code': this.gettext('Invalid code'),\r\n 'invalid-code-format': this.gettext('Invalid code format'),\r\n 'no-name': this.gettext('No name'),\r\n generale: this.gettext('Problem creating operator'),\r\n };\r\n }\r\n\r\n getOperators() {\r\n return this.api.getOperators().then((respons) => {\r\n return respons.data;\r\n //update the store data.\r\n // this.amStoreService.updateOperators(operators);\r\n // return this.amStoreService.getStore();\r\n });\r\n }\r\n\r\n filterByTerm(data = [], term = '', propertyKeys = []) {\r\n return filterData(data, term, propertyKeys);\r\n }\r\n\r\n getOperatorById(id) {\r\n return this.api.getOperatorById(id).then((respons) => respons.data);\r\n }\r\n\r\n updateOperatorsCodes(operatorId, outCodes, autoGeneratePin) {\r\n return this.api.updateOperatorsCodes(operatorId, outCodes, autoGeneratePin).then((respons) => {\r\n //TODO update viewed operator in the store\r\n return respons.data;\r\n });\r\n }\r\n\r\n updateOperatorMetaData(operatorId, name, attrs) {\r\n return this.api.updateOperatorMetaData(operatorId, name, attrs).then((respons) => {\r\n //TODO update viewed operator in the store\r\n return respons.data;\r\n });\r\n }\r\n createOperator(operatorCreate) {\r\n return this.api.createOperater(operatorCreate).then((respons) => {\r\n return respons.data;\r\n });\r\n }\r\n openNoCodeWarningPopup() {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'md',\r\n template: noCodePopupHtml,\r\n controller: noCodePopupController,\r\n controllerAs: 'popupVm',\r\n resolve: {},\r\n }).result;\r\n }\r\n //this modal will be closed by cancel or close btn only.\r\n openDeleteOperatorPopup(operator) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'md',\r\n backdrop: 'static',\r\n keyboard: false,\r\n template: deleteOperatorPopupHtml,\r\n controller: deleteOperatorController,\r\n controllerAs: 'deletePopupVm',\r\n resolve: {\r\n operator: () => operator,\r\n },\r\n }).result;\r\n }\r\n deleteOperator(operatorId) {\r\n return this.api.deleteOperater(operatorId).then((respons) => {\r\n return respons.data;\r\n });\r\n }\r\n\r\n getPagedOperators(filter, paging = {}, data = [], propertyKeys = []) {\r\n return this.amFilterPaginationService.getPaged(filter, paging, data, propertyKeys);\r\n }\r\n\r\n openSelectOperatorsPopup(selected = [], excluded = []) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'lg',\r\n template: selectOperatorsPopupHtml,\r\n controller: selectOperatorsController,\r\n controllerAs: 'opsPopupVm',\r\n resolve: {\r\n selected: () => selected || [],\r\n excluded: () => excluded || [],\r\n },\r\n }).result;\r\n }\r\n\r\n getOperatorsByAssetId(assetId) {\r\n return this.amAPI.getOperatorsByAsset(assetId).then((respons) => {\r\n return respons.data;\r\n });\r\n }\r\n\r\n filterByExcludedIds(operators = [], excludedIds = []) {\r\n return operators.filter((op) => !excludedIds.includes(op.id));\r\n }\r\n\r\n getOperatorExpiryById(id) {\r\n return this.api.getOperatorExpiryById(id).then((response) => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, selected, excluded) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.selected = selected ? {...selected} : {};\r\n this.excluded = excluded;\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n //on delete successfully just close the popup\r\n confirm() {\r\n this.$uibModalInstance.close(this.selected);\r\n }\r\n}\r\n","import EquipmentSearch from '../../../equipment/services/equipment-search.service';\r\nimport { AmAsset } from './models/am-asset.model';\r\nimport selectAssetPopupHtml from '../components/asset-list-select-popup/am-assets-list-popup.html';\r\nimport selectAssetPopupController from '../components/asset-list-select-popup/am-asset-list-popup';\r\nimport { ONEI3_SERVICE_ACCESS_MGMT } from '../../../constants';\r\n\r\nexport default class AmAssetsService {\r\n constructor(\r\n EquipmentService,\r\n gettext,\r\n $q,\r\n $filter,\r\n $uibModal,\r\n amFilterPaginationService,\r\n accessManagementAPI,\r\n ) {\r\n 'ngInject';\r\n\r\n this.assetAPI = EquipmentService;\r\n this.gettext = gettext;\r\n this.$filter = $filter;\r\n this.$uibModal = $uibModal;\r\n this.$q = $q;\r\n this.amFilterPaginationService = amFilterPaginationService;\r\n this.amAPI = accessManagementAPI;\r\n }\r\n\r\n getAssetsByFilter(filter, paging = {}) {\r\n const since = paging.startFrom;\r\n const limit = paging.pageSize;\r\n const orderBy = `${filter.orderBy.attr}:${filter.orderBy.desc ? 'desc' : 'asc'}`;\r\n const sort = [orderBy];\r\n const apiFilter = EquipmentSearch().buildAPIEquipmentFilterObject(\r\n filter.queries,\r\n { since, limit },\r\n null,\r\n null,\r\n filter.facet,\r\n filter.attrs,\r\n null,\r\n null,\r\n sort,\r\n null,\r\n );\r\n return this.amAPI.getAssetsBySearchFilter(apiFilter).then((response) => {\r\n const data = response.data || {};\r\n const assets = (data.data || []).map((asset) => new AmAsset(asset));\r\n return {\r\n total: data.total,\r\n assets,\r\n };\r\n });\r\n }\r\n\r\n openSelectAssetPopup(selected = {}, excluded = []) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'lg',\r\n template: selectAssetPopupHtml,\r\n controller: selectAssetPopupController,\r\n controllerAs: 'assetPopupVm',\r\n windowClass: 'tr-am-asset-list-modal-dismiss',\r\n resolve: {\r\n selected: () => selected,\r\n excluded: () => excluded,\r\n },\r\n }).result;\r\n }\r\n\r\n getAssetById(assetId) {\r\n return this.amAPI.getAssetById(assetId).then((response) => {\r\n const data = response.data || {};\r\n const asset = new AmAsset(data);\r\n return asset;\r\n });\r\n }\r\n\r\n getAssetsByGroupId(groupId) {\r\n return this.amAPI.getAssetsByGroupId(groupId).then((response) => {\r\n const data = response.data || {};\r\n const assetsAsModel = data.assets.map((asset) => new AmAsset(asset));\r\n data.assets = assetsAsModel;\r\n return data;\r\n });\r\n }\r\n\r\n getAssetsByOperatorId(operatorId) {\r\n return this.amAPI.getAssetsByOperator(operatorId).then((response) => {\r\n const data = response.data || [];\r\n const assets = data.map((asset) => new AmAsset(asset));\r\n return {\r\n total: data.total,\r\n assets,\r\n };\r\n });\r\n }\r\n getPagedAssets(filter, paging = {}, data = [], propertyKeys = []) {\r\n return this.amFilterPaginationService.getPaged(filter, paging, data, propertyKeys);\r\n }\r\n\r\n getAssetListByIds(assetIds = []) {\r\n if (!assetIds.length) return this.$q((resolve) => resolve([]));\r\n\r\n return this.amAPI.getAssetListByIds(assetIds).then((response) => {\r\n const { data = [] } = response.data || {};\r\n const assets = data.map((asset) => new AmAsset(asset));\r\n return {\r\n total: data.total,\r\n assets,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * @summary Retrieves an array of assets that do not have the onei3 \"enabled\" tag.\r\n * @param {any} filter Filtering options to pass to the server\r\n * @param {any} paging Pagination options to pass to the server\r\n */\r\n getAssetsForEnablement(filter = {}, paging = {}) {\r\n filter = { ...filter };\r\n filter.queries = [...filter.queries, `NOT ${ONEI3_SERVICE_ACCESS_MGMT}`];\r\n return this.getAssetsByFilter(filter, paging);\r\n }\r\n\r\n /**\r\n * @summary Retrieves an array of assets that do have the onei3 \"enabled\" tag.\r\n * @param {any} filter Filtering options to pass to the server\r\n * @param {any} paging Pagination options to pass to the server\r\n */\r\n getAssetsWithAccessService(filter = {}, paging = {}) {\r\n filter = { ...filter };\r\n filter.queries = [...filter.queries, `${ONEI3_SERVICE_ACCESS_MGMT}`];\r\n return this.getAssetsByFilter(filter, paging);\r\n }\r\n\r\n /**\r\n * @summary Submits a list of asset identifiers to the back-end to be enabled\r\n * @param {number[]} assetIds An array of asset ids to submit for enablement\r\n * @returns {Promise} A `$q` instance containing a list of successfully enabled IDs and an object containing the failed IDs and an error message\r\n */\r\n enableAssets(assetIds = []) {\r\n return this.amAPI\r\n .enableAssets(assetIds.filter((id) => id != null && id !== ''))\r\n .then((response) => response.data);\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, amGroupsService, group) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.groupService = amGroupsService;\r\n this.group = group;\r\n this.status = '';\r\n }\r\n $onInit() {\r\n if(this.group.assets && this.group.assets.length > 0) this.status = 'has-assets';\r\n }\r\n\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n\r\n deleteGroup() {\r\n if (!this.group) return;\r\n this.status = 'deleting';\r\n this.groupService\r\n .deleteGroup(this.group.id)\r\n .then(() => {\r\n this.$uibModalInstance.close();\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n}\r\n","export class AmGroup {\r\n constructor(group) {\r\n group = group || {};\r\n this.id = group.id;\r\n this.name = group.name;\r\n this.assets = group.assets;\r\n this.email = group.email;\r\n this.createdAt = group.createdAt;\r\n this.attrs = group.attrs;\r\n this.tags = group.tags;\r\n }\r\n}\r\n","import deleteGroupPopupController from '../components/group-delete-popup/am-group-delete-popup.component';\r\nimport deleteGroupPopupHtml from '../components/group-delete-popup/am-group-delete-popup.html';\r\nimport { AmGroup } from '../core/models/am-group.model';\r\n// Required constants to filter and create groups\r\nconst roleId = '1295741015663050786';\r\nconst attrsName = 'onei3:feature';\r\nconst attrsValue = 'access.mgmt';\r\nexport default class AmGroupsService {\r\n constructor($q, $filter, securityGroupsService, groupsAPI, amAssetsService, $uibModal) {\r\n 'ngInject';\r\n this.$filter = $filter;\r\n this.$q = $q;\r\n this.securityGroupService = securityGroupsService;\r\n this.accessAssetsService = amAssetsService;\r\n this.groupsAPI = groupsAPI;\r\n this.seviceResourceURl = this.securityGroupService.getResourceUrl();\r\n this.$uibModal = $uibModal;\r\n }\r\n createGroup(group) {\r\n // Hardcode for now the roleId\r\n group.roleId = roleId;\r\n return this.groupsAPI.sendInvite(group).then(res => res.data);\r\n }\r\n\r\n retrieveGroups() {\r\n return this.$q((resolve, reject) => {\r\n // Return a promise with the parsed groups\r\n this.securityGroupService\r\n .getAllSecurityGroups()\r\n .then(result => {\r\n const { data: groups = [] } = result.data;\r\n\r\n const accessManagementGroups = this.filterGroupsByAttrs(groups);\r\n return resolve(accessManagementGroups);\r\n })\r\n .catch(error => reject(error));\r\n });\r\n }\r\n filterGroupsByAttrs(groups) {\r\n return groups\r\n .filter(group => {\r\n const { attrs = {} } = group;\r\n return attrs[attrsName] && attrs[attrsName] === attrsValue;\r\n })\r\n .map(\r\n group =>\r\n new AmGroup({\r\n id: group.id,\r\n name: group.name,\r\n createdAt: group.createdAt,\r\n assets: [],\r\n attrs: group.attrs\r\n })\r\n );\r\n }\r\n\r\n getGroupById(id) {\r\n return this.$q((resolve, reject) => {\r\n this.securityGroupService\r\n .getSingleGroup(id)\r\n .then(result => {\r\n const { data: groupInfo } = result;\r\n const [groupUser = {}] = groupInfo.users;\r\n const { resources = [] } = groupInfo;\r\n\r\n let group = new AmGroup({\r\n id: groupInfo.id,\r\n name: groupInfo.name,\r\n email: groupUser.email || '',\r\n attrs: groupInfo.attrs || {},\r\n createdAt: groupInfo.createdAt,\r\n assets: []\r\n });\r\n\r\n if (resources.length === 0) return resolve(group);\r\n\r\n this.getAssetListByResources(resources)\r\n .then(result => (group.assets = result.assets || []))\r\n .finally(() => resolve(group));\r\n })\r\n .catch(error => reject(error));\r\n });\r\n }\r\n getAssetListByResources(resources) {\r\n const assetsIds = resources.reduce((accumulator, currentResource) => {\r\n const { type = '', id = '' } = currentResource;\r\n\r\n return type === 'equipment' && id !== '' ? [...accumulator, id] : [...accumulator];\r\n }, []);\r\n\r\n return this.accessAssetsService.getAssetListByIds(assetsIds);\r\n }\r\n\r\n updateGroupMetadata(id, group) {\r\n return this.securityGroupService.putGroupUpdate(id, group);\r\n }\r\n\r\n applyOperationAssets(assets, op = 'add') {\r\n return assets.map(asset => ({ op: op, value: { resource: this.seviceResourceURl + asset.id } }));\r\n }\r\n\r\n updateGroupAssets(id, assets, operation) {\r\n const payload = this.applyOperationAssets(assets, operation);\r\n return this.securityGroupService.patchEquipmentUserUpdate(id, payload);\r\n }\r\n\r\n openDeleteGroupPopup(group) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'md',\r\n backdrop: 'static',\r\n keyboard: false,\r\n template: deleteGroupPopupHtml,\r\n controller: deleteGroupPopupController,\r\n controllerAs: 'deletePopupVm',\r\n resolve: {\r\n group: () => group\r\n }\r\n }).result;\r\n }\r\n\r\n deleteGroup(id) {\r\n return this.securityGroupService.deleteGroup(id);\r\n }\r\n}\r\n","import { filterData } from '../../../functions/search.functions';\r\n\r\nexport default class AmFilterPaginationService {\r\n constructor($q, $filter) {\r\n 'ngInject';\r\n this.$q = $q;\r\n this.$filter = $filter;\r\n }\r\n filterByTerm(data = [], term = '', propertyKeys = []) {\r\n return filterData(data, term, propertyKeys);\r\n }\r\n\r\n getPaged(filter, paging = {}, data = [], propertyKeys = []) {\r\n return this.$q((resolve) => {\r\n if (filter.query) {\r\n data = filterData(data, filter.query, propertyKeys);\r\n }\r\n const total = data.length;\r\n if (filter.orderBy) {\r\n data = this.$filter('orderBy')(data, filter.orderBy.attr, filter.orderBy.desc);\r\n }\r\n if (filter.clientSideOrderBy) {\r\n data = this.$filter('orderBy')(\r\n data,\r\n filter.clientSideOrderBy.attr,\r\n filter.clientSideOrderBy.desc,\r\n );\r\n }\r\n let end = paging.startFrom + paging.pageSize;\r\n if (end >= total) end = undefined;\r\n const result = data.slice(paging.startFrom, end);\r\n resolve({ data: result, total });\r\n });\r\n }\r\n}\r\n","export default class AmAssingmentsService {\r\n constructor(accessManagementAPI, gettext) {\r\n 'ngInject';\r\n this.amAPI = accessManagementAPI;\r\n this.commands = {\r\n ASSIGN: 'assign',\r\n UNASSIGN: 'unassign'\r\n };\r\n this.assignmentStatus = {\r\n dispatched: {\r\n label: gettext('Pending'),\r\n iClass: 'material-icons pending color-low-priority',\r\n color: 'color-low-priority'\r\n },\r\n received: {\r\n label: gettext('Pending'),\r\n iClass: 'material-icons pending color-low-priority',\r\n color: 'color-low-priority'\r\n },\r\n complete: {\r\n label: gettext('Successful'),\r\n iClass: 'material-icons success success-green',\r\n color: 'success-green'\r\n },\r\n failed: {\r\n label: gettext('Failed'),\r\n iClass: 'material-icons failed color-high-priority',\r\n color: 'color-high-priority'\r\n }\r\n };\r\n }\r\n\r\n perform(assetsIds = [], operatorsIds = [], assingmentcommand) {\r\n return this.amAPI.performAssignments(assetsIds, operatorsIds, assingmentcommand);\r\n }\r\n assign(assetsIds = [], operatorsIds = []) {\r\n return this.amAPI.performAssignments(assetsIds, operatorsIds, this.commands.ASSIGN);\r\n }\r\n unassign(assetsIds = [], operatorsIds = []) {\r\n return this.amAPI.performAssignments(assetsIds, operatorsIds, this.commands.UNASSIGN);\r\n }\r\n}\r\n","import angular from 'angular';\r\n\r\n/* Configuration Imports */\r\nimport AccessManagementRouteConfig from './access-management.route';\r\n/* Component Imports */\r\nimport AccessManagementComponent from './access-management.component';\r\nimport AmGroupListComponent from './components/group-list/am-group-list.component';\r\nimport AmGroupCreate from './components/group-create/am-group-create.component';\r\nimport AmGroupViewComponent from './components/group-view/am-group-view.component';\r\nimport AmAssetsComponent from './components/assets-list/am-assets-list.component';\r\nimport AmOperatorsComponent from './components/operators-list/am-operators-list.component';\r\nimport AmBulkUploadOperatorsComponent from './components/bulk-upload-operators/am-bulk-upload-operators.component';\r\nimport AmDashboardComponent from './components/dashboard/am-dashboard.component';\r\nimport AmOperatorViewComponent from './components/operator-view/am-operator-view.component';\r\nimport AmOperatorCodesComponent from './components/operator-codes/am-operator-codes.component';\r\nimport AmOperatorDetailsFormComponent from './components/operator-details-form/am-operator-details-form.component';\r\nimport AmGroupDetailsFormComponent from './components/group-details-form/am-group-details-form.component';\r\nimport AmOperatorCreateComponent from './components/operator-create/am-operator-create.component';\r\nimport AmAssetTableComponent from './components/assets-list-table/am-assets-list-table.component';\r\nimport AmAssignmentsComponent from './components/assignments/am-assignments.component';\r\nimport AmOperatorsTableComponent from './components/operators-list-table/am-operators-list-table.component';\r\nimport AmAssetListClientComponent from './components/asset-list-client/asset-list-client.component';\r\nimport AmAssetViewComponent from './components/asset-view/am-asset-view.component';\r\nimport AmAssetOperatorsListComponent from './components/asset-operators-list/am-asset-operators-list.component';\r\nimport AmOperatorAssetsComponent from './components/operator-assets-list/operator-assets-list.component';\r\n\r\nimport AddInputComponent from './components/controls/add-input/add-input.component';\r\nimport AmSearchInputComponent from './components/controls/search-input/search-input.component';\r\nimport AmIpafInputComponent from './components/controls/ipaf-input/ipaf-input.component';\r\n\r\n//--- services\r\nimport AmStoreService from './core/am-store.service';\r\nimport AccessManagementService from './core/access-management.service';\r\nimport AmOperatorsService from './core/am-operators.service';\r\nimport AmAssetsService from './core/am-assets.service';\r\nimport AmGroupsService from './core/am-groups.service';\r\nimport AmFilterPaginationService from './core/am-filter-pagination.service';\r\nimport AmAssignmentService from './core/am-assignments.service';\r\n/* Module Imports */\r\nimport apiModule from '../../api/api.module';\r\n\r\nconst accessManagementModule = angular.module('app.access-management', [\r\n //INTERNAL\r\n apiModule,\r\n //THIRD PARTY\r\n]);\r\n\r\naccessManagementModule\r\n /* Configurations */\r\n .config(AccessManagementRouteConfig)\r\n // --- Services ---\r\n .service('amStoreService', AmStoreService)\r\n .service('accessManagementService', AccessManagementService)\r\n .service('amOperatorsService', AmOperatorsService)\r\n .service('amAssetsService', AmAssetsService)\r\n .service('amGroupsService', AmGroupsService)\r\n .service('amFilterPaginationService', AmFilterPaginationService)\r\n .service('amAssignmentService', AmAssignmentService)\r\n /* Controls */\r\n .component('amAddInput', AddInputComponent)\r\n .component('amSearchInput', AmSearchInputComponent)\r\n .component('amIpafInput', AmIpafInputComponent)\r\n /* components */\r\n .component('accessManagement', AccessManagementComponent)\r\n .component('amAssetsList', AmAssetsComponent)\r\n .component('amOperatorsList', AmOperatorsComponent)\r\n .component('amGroupList', AmGroupListComponent)\r\n .component('amGroupView', AmGroupViewComponent)\r\n .component('amGroupCreate', AmGroupCreate)\r\n .component('amDashboard', AmDashboardComponent)\r\n .component('amBulkUploadOperators', AmBulkUploadOperatorsComponent)\r\n .component('amOperatorView', AmOperatorViewComponent)\r\n .component('amOperatorCodes', AmOperatorCodesComponent)\r\n .component('amOperatorDetailsForm', AmOperatorDetailsFormComponent)\r\n .component('amGroupDetailsForm', AmGroupDetailsFormComponent)\r\n .component('amOperatorCreate', AmOperatorCreateComponent)\r\n .component('amAssetTable', AmAssetTableComponent)\r\n .component('amAssignments', AmAssignmentsComponent)\r\n .component('amOperatorsTable', AmOperatorsTableComponent)\r\n .component('amAssetListClient', AmAssetListClientComponent)\r\n .component('amAssetView', AmAssetViewComponent)\r\n .component('amAssetOperatorsList', AmAssetOperatorsListComponent)\r\n .component('amOperatorAssetsList', AmOperatorAssetsComponent);\r\n\r\nexport default accessManagementModule.name;\r\n","\r\nexport default function AppNotificationsController($scope, $uibModalInstance, notification) {\r\n 'ngInject';\r\n $scope.activeNotifications = notification;\r\n\r\n $scope.acknowledge = function () {\r\n\t$uibModalInstance.close($scope.activeNotifications);\r\n };\r\n\r\n $scope.cancel = function () {\r\n\t$uibModalInstance.dismiss('cancel');\r\n }\r\n}\r\n","import AppNotificationsController from './app.notifications.controller';\r\n\r\nconst appNotificationModule = angular.module('app.appNotification',[\r\n\t//THIRD PARTY\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext'\r\n])\r\n.controller('AppNotificationsController', AppNotificationsController)\r\n;\r\n\r\nexport default appNotificationModule.name;","export default function HelpRouteConfig($stateProvider) {\r\n\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('help', {\r\n template: require('./help.html'),\r\n params: {\r\n helpPage: null,\r\n helpItem: null\r\n },\r\n controller: 'HelpController',\r\n url: \"/help\"\r\n });\r\n}","export default function HelpController(\r\n $scope,\r\n $stateParams,\r\n $timeout,\r\n $location,\r\n helpItemsService,\r\n helpTranslationService\r\n) {\r\n 'ngInject';\r\n\r\n $scope.modules = [];\r\n $scope.selected = {};\r\n\r\n //get all help modules\r\n $scope.getModules = function () {\r\n return helpItemsService.getModules();\r\n };\r\n\r\n //use to scroll to the content on click\r\n $scope.gotoAnchor = function (x) {\r\n $location.hash(x);\r\n };\r\n\r\n /***\r\n * function will take modules object then filter the items that user don't have access to it\r\n * and update the items templateUrl to help pages location\r\n * return accessible modules array\r\n */\r\n let getAccessiblemodules = (modules = {}) => {\r\n const accessibleModules = Object.keys(modules).reduce((accumulator, key) => {\r\n const accessibleItems = modules[key].items\r\n .filter(item => helpItemsService.isAccessible(item.helpitemid))\r\n //prefix the url from where we are going to load the lelp pages\r\n .map(item => ({\r\n ...item,\r\n templateUrl: `content/help/en/${item.templateUrl}`\r\n }));\r\n //will give the user access to the module as long he/she has access to one item in that module\r\n if (accessibleItems.length) {\r\n accumulator.push({ ...modules[key], items: accessibleItems });\r\n }\r\n return accumulator;\r\n }, []);\r\n\r\n return accessibleModules;\r\n };\r\n\r\n let refresh = function () {\r\n $scope.modules = getAccessiblemodules($scope.getModules());\r\n\r\n //for redirection to specific section\r\n if ($stateParams.helpItem || $stateParams.helpPage) {\r\n let modules = $scope.modules;\r\n\r\n //to open the nav sub module based on the page it redirected from\r\n $scope.selected.header = $stateParams.helpPage;\r\n\r\n //variable to check sub help section exist\r\n let helpItemExist = false;\r\n\r\n //going through each module to find the sub help section\r\n for (let key in modules) {\r\n if (modules[key].id === $stateParams.helpPage) {\r\n for (let i = 0; i < modules[key].items.length; i++) {\r\n let item = modules[key].items[i];\r\n if (item.itemid === $stateParams.helpItem) {\r\n helpItemExist = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //default item if none exist\r\n let helpItem = 'map';\r\n if (helpItemExist) {\r\n // if sub help exist go to the section\r\n helpItem = $stateParams.helpItem;\r\n } // go to the main section\r\n else helpItem = $stateParams.helpPage;\r\n\r\n //wait for DOM to load\r\n $timeout(function () {\r\n $scope.gotoAnchor(helpItem);\r\n });\r\n }\r\n };\r\n\r\n //load translation content then load the help pages\r\n const init = () => {\r\n helpTranslationService.loadHelpTranslation().finally(() => {\r\n refresh();\r\n });\r\n };\r\n\r\n init();\r\n\r\n //for toggling side menu\r\n $scope.class = function () {\r\n return helpItemsService.isShowingHelpSideNav() ? 'is-active' : '';\r\n };\r\n $scope.click = function () {\r\n helpItemsService.toggleHelpSideNav();\r\n };\r\n $scope.isShowingHelpSideNav = function () {\r\n return helpItemsService.isShowingHelpSideNav();\r\n };\r\n $scope.closeHelpNav = function () {\r\n helpItemsService.hideHelpSideNav();\r\n };\r\n\r\n $scope.toggleModule = function (module) {\r\n if ($scope.selectedModule === module) {\r\n $scope.selectedModule = null;\r\n } else {\r\n $scope.selectedModule = module;\r\n }\r\n };\r\n\r\n $scope.moduleStyle = function (module) {\r\n let style = 'transition: all 0.5s;';\r\n\r\n if (!$scope.isActive(module)) {\r\n return style;\r\n }\r\n\r\n style += 'height:' + module.items.length * 40 + 'px;';\r\n\r\n return style;\r\n };\r\n\r\n $scope.isActive = function (module) {\r\n return $scope.selectedModule === module;\r\n };\r\n}\r\n","import {get} from 'lodash-es';\r\nexport default class HelpTranslationService {\r\n constructor($q, $http, $rootScope, appSettings) {\r\n 'ngInject';\r\n this.$q = $q;\r\n this.$http = $http;\r\n this.$rootScope = $rootScope;\r\n this.translation = {};\r\n this.showMissingTag = appSettings.environment === appSettings.environments.local;\r\n }\r\n getUserLanguage() {\r\n return get(this.$rootScope, 'currentUser.claims.data.language', 'en');\r\n }\r\n loadHelpTranslation() {\r\n const userLanguage = this.getUserLanguage();\r\n if (userLanguage === 'en') {\r\n return this.$q(resolve => resolve()).then(() => {\r\n this.translation = {};\r\n });\r\n }\r\n const path = `content/help/${userLanguage}.json`;\r\n return this.$http.get(path).then(res => {\r\n this.translation = res.data;\r\n return res.data;\r\n });\r\n }\r\n}\r\n","export default function HelpTranslateDirective(helpTranslationService) {\r\n 'ngInject';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n const input = element[0].innerText;\r\n if (input in helpTranslationService.translation) {\r\n const translateString =\r\n helpTranslationService.translation[input] ||\r\n (helpTranslationService.showMissingTag ? `[[ N/A ]] ${input}` : input);\r\n element.text(translateString);\r\n }\r\n },\r\n };\r\n}\r\n","import angular from 'angular';\r\n/* Config Imports */\r\nimport HelpRouteConfig from './help.route';\r\n/* Controller Imports */\r\nimport HelpController from './help.controller';\r\nimport sortObject from './filters/sortObject.filter';\r\nimport HelpTranslationService from './translations/help-translation.service';\r\nimport HelpTranslation from './translations/help-translate.directive';\r\n\r\nconst helpModule = angular\r\n .module('app.help', [\r\n //THIRD PARTY\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext'\r\n ])\r\n /* Filters */\r\n .filter('sortObject', sortObject)\r\n /* Configurations */\r\n .config(HelpRouteConfig)\r\n .service('helpTranslationService', HelpTranslationService)\r\n .directive('helpTranslate', HelpTranslation)\r\n /* Controllers */\r\n .controller('HelpController', HelpController);\r\n\r\nexport default helpModule.name;\r\n","// Sort Object\r\nexport default function sortObject() {\r\n\treturn function(items, field, reverse) {\r\n\t\tvar filtered = [];\r\n\t\tangular.forEach(items, function(item) {\r\n\t\t filtered.push(item);\r\n\t\t});\r\n\t\tfiltered.sort(function(a, b) {\r\n\t\t return a[field] > b[field] ? 1 : -1;\r\n\t\t});\r\n\t\tif (reverse) filtered.reverse();\r\n\t\treturn filtered;\r\n\t };\r\n}","import angular from 'angular';\r\nimport d3 from 'd3';\r\nimport wellknown from '../../../lib/wellknown';\r\nimport App from '../../app';\r\n\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Map\";\r\nexport default function MapMainController(\r\n GeozoneService,\r\n usersService,\r\n $scope,\r\n $window,\r\n $rootScope,\r\n $state,\r\n $stateParams,\r\n $compile,\r\n $timeout,\r\n $location,\r\n mapService,\r\n equipmentRepository,\r\n localStorageService,\r\n gettextCatalog,\r\n $q,\r\n) {\r\n 'ngInject';\r\n\r\n const self = this; // to maintain reference in closures\r\n\r\n // Local storage keys for saving map position and zoom\r\n const KEY_MAP_CENTER = 'map_center';\r\n const KEY_MAP_ZOOM = 'map_zoom';\r\n\r\n // Local storage key for equipment object\r\n const KEY_EQUIPMENT = 'equipment';\r\n\r\n const REFRESH_TIMEOUT_MINS = 5;\r\n\r\n // cluster marker properties\r\n const CLUSTER_MAX_RADIUS = 80;\r\n\r\n const MAP_MOVE_DEBOUNCE_TIME = 1500; // in (ms)\r\n\r\n const MAP_DEFAULT_LOCATION = [40.737, -73.923]; // NYC\r\n const MAP_DEFAULT_ZOOM = 3;\r\n\r\n /* Used to check which map is being used. */\r\n const KEY_LOCALSTOREAGE_MAP_BASELAYER = 'baselayer';\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n // State variables\r\n let isUpdatingPins = false;\r\n\r\n let geozoneFeatureGroup;\r\n let geozoneFeatureGroupLabels;\r\n let markersLayer;\r\n\r\n // Loads the starting position for the map\r\n function getInitialPosition() {\r\n return new Promise((resolve) => {\r\n // Attempt to retrieve the last saved position from localStorage\r\n let mapCenter = null;\r\n try {\r\n mapCenter = JSON.parse(localStorageService.get(KEY_MAP_CENTER));\r\n } catch (err) {}\r\n\r\n // If the position was successfully retrieved from localStorage, exit the function\r\n if (mapCenter !== null) {\r\n resolve(mapCenter);\r\n return;\r\n }\r\n\r\n // Try and get the user's geolocation\r\n if ('geolocation' in navigator) {\r\n navigator.geolocation.getCurrentPosition(\r\n (position) => resolve([position.coords.latitude, position.coords.longitude]),\r\n () => resolve(MAP_DEFAULT_LOCATION),\r\n );\r\n } else {\r\n resolve(MAP_DEFAULT_LOCATION);\r\n }\r\n });\r\n }\r\n\r\n self.$onInit = function() {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n\r\n // Create the map object\r\n self.initMap = function (position, zoom) {\r\n if (self.map) {\r\n return;\r\n }\r\n\r\n // Set the default options for hte map\r\n let options = {\r\n zoomControl: false,\r\n worldCopyJump: true,\r\n center: position || MAP_DEFAULT_LOCATION,\r\n zoom: zoom || MAP_DEFAULT_ZOOM,\r\n };\r\n\r\n // Commented out until the weather control plugin fixes https issue\r\n // Feature flag the weather and time dimension control\r\n if (usersService.hasRequiredFeatures(['map.weather'])) {\r\n // use flag 'map.weather' to add weather control to map\r\n options = _.merge(options, {\r\n weatherEnabled: true,\r\n timeDimension: true,\r\n timeDimensionControl: true, // adds timed dimension control to the map control. set true to add control\r\n timeDimensionOptions: {\r\n period: 'PT1M', //one minute duration\r\n },\r\n timeDimensionControlOptions: {\r\n position: 'bottomright',\r\n loopButton: true,\r\n autoPlay: true,\r\n playerOptions: {\r\n buffer: 10,\r\n transitionTime: 250,\r\n loop: true,\r\n },\r\n timeSliderDragUpdate: true, //update the map on slide move\r\n },\r\n });\r\n }\r\n\r\n self.map = mapService.createMapDiv('map', options); // options will add the time dimension control\r\n self.map.setMaxBounds([\r\n [-85, -2000],\r\n [85, 2000],\r\n ]); //world view so user doesnt lose the map\r\n\r\n // Initialize the geozone feature group, but don't add it to the map\r\n geozoneFeatureGroup = L.featureGroup();\r\n geozoneFeatureGroupLabels = L.featureGroup();\r\n\r\n // This is the clustered markers layer\r\n markersLayer = new L.MarkerClusterGroup({\r\n chunkedLoading: true,\r\n maxClusterRadius: CLUSTER_MAX_RADIUS,\r\n iconCreateFunction: mapService.defineClusterIcon, // this is where the magic happens for graph icons.\r\n zoomToBoundsOnClick: true,\r\n spiderfyOnMaxZoom: true,\r\n });\r\n\r\n // add the clusters to map\r\n self.map.addLayer(markersLayer);\r\n\r\n // variables to make sure the api is not called many time when moving around the map\r\n $scope.oldBounds = {};\r\n $scope.updateFlag = true;\r\n // Set the list panel to be offscreen by default\r\n $scope.panelOffscreen = true;\r\n\r\n // make sure there is no filtering on load\r\n mapService.setFacets({});\r\n // For asset type filtering, tags on the service need to be kept.\r\n //mapService.setTagFilters({});\r\n\r\n const overlayControl = mapService.getControlLayer();\r\n\r\n if (usersService.hasRequiredFeatures(['geozones'])) {\r\n overlayControl.addOverlay(geozoneFeatureGroup, gettextCatalog.getString('Geozones'));\r\n overlayControl.addOverlay(\r\n geozoneFeatureGroupLabels,\r\n gettextCatalog.getString('Geozone Labels'),\r\n );\r\n }\r\n\r\n // MAP EVENTS\r\n self.map.on('load', function () {\r\n self.refreshPins(false);\r\n });\r\n\r\n self.map.on('locationfound', function () {\r\n // Once we've got a position get data and set the updated date.\r\n $rootScope.$broadcast('map-locationfound');\r\n });\r\n\r\n self.map.on('locationerror', function () {\r\n $rootScope.$broadcast('map-locationerror');\r\n });\r\n\r\n self.map.on('moveend', function () {\r\n const bounds = self.map.getBounds();\r\n mapService.setCurrentBounds(bounds);\r\n self.storeBounds();\r\n\r\n if ($scope.updateFlag) {\r\n if (JSON.stringify($scope.oldBounds) !== JSON.stringify(bounds)) {\r\n // Find new local assets...\r\n $rootScope.$broadcast('map-moveend', {\r\n bounds: self.map.getBounds(),\r\n });\r\n mapService.requestedCursor = 0;\r\n updateOnMapMove();\r\n $scope.oldBounds = bounds;\r\n }\r\n }\r\n\r\n addToDataLayer({\r\n event: 'mapMoved',\r\n });\r\n });\r\n\r\n self.map.on('layerremove', function () {});\r\n\r\n self.map.on('layeradd', function (event) {\r\n if (event.layer === geozoneFeatureGroup || event.layer === geozoneFeatureGroupLabels) {\r\n self.refreshGeozones();\r\n }\r\n\r\n const currentMap = localStorageService.get(KEY_LOCALSTOREAGE_MAP_BASELAYER);\r\n\r\n switch (currentMap) {\r\n case 'satellite':\r\n $('.asset-icon').removeClass('asset-icon-streets').addClass('asset-icon-satellite');\r\n break;\r\n case 'streets':\r\n $('.asset-icon').removeClass('asset-icon-satellite').addClass('asset-icon-streets');\r\n break;\r\n }\r\n });\r\n\r\n let zoomLevel;\r\n\r\n self.map.on('zoomend', function () {\r\n const currentZoom = self.map.getZoom();\r\n\r\n if (currentZoom !== zoomLevel) {\r\n addToDataLayer({\r\n event: 'mapZoomed',\r\n data: {\r\n originalZoomLevel: zoomLevel,\r\n currentZoomLevel: currentZoom,\r\n },\r\n });\r\n }\r\n\r\n $rootScope.$broadcast('map-zoomend');\r\n });\r\n\r\n self.map.on('zoomstart', function () {\r\n zoomLevel = self.map.getZoom();\r\n $rootScope.$broadcast('map-zoomstart');\r\n });\r\n\r\n self.map.on('popupopen', function () {\r\n const popupItems = document.getElementsByClassName('popupItem');\r\n\r\n for (const item of popupItems) {\r\n item.addEventListener('click', () => {\r\n const lat = parseFloat(item.attributes.lat.value);\r\n const lng = parseFloat(item.attributes.lng.value);\r\n\r\n const BOUNDS_OFF_SET = 0.0005;\r\n\r\n const nwBounds = L.latLng(lat + BOUNDS_OFF_SET, lng - BOUNDS_OFF_SET);\r\n const seBounds = L.latLng(lat - BOUNDS_OFF_SET, lng + BOUNDS_OFF_SET);\r\n\r\n const bounds = L.latLngBounds(nwBounds, seBounds);\r\n\r\n self.map.fitBounds(bounds);\r\n\r\n $state.go('map.equipment.detail', {\r\n equipmentId: item.id,\r\n });\r\n\r\n addToDataLayer({\r\n event: 'clickItemInAssetListPopup',\r\n });\r\n });\r\n }\r\n\r\n $rootScope.$broadcast('map-popupopen', {\r\n map: self.map,\r\n });\r\n });\r\n\r\n self.map.on('popupclose', function () {\r\n L.openedPopup = null;\r\n });\r\n\r\n self.map.on('click', function (e) {\r\n if ($window.innerWidth > 900) {\r\n L.openedPopup = null;\r\n $rootScope.$broadcast('map-click');\r\n mapService.requestedEquipmentId = null;\r\n $state.go('map.equipment');\r\n }\r\n\r\n addToDataLayer({\r\n event: 'clickOnMap',\r\n });\r\n });\r\n\r\n self.map.on('baselayerchange', function (event) {\r\n const layerName = event.name.toLowerCase();\r\n localStorageService.set(KEY_LOCALSTOREAGE_MAP_BASELAYER, layerName);\r\n\r\n addToDataLayer({\r\n event: 'mapBaseLayerChanged',\r\n data: {\r\n layerName,\r\n },\r\n });\r\n });\r\n\r\n const getSelectedOverlays = () => {\r\n const selectedOverlays = [];\r\n // This is not cool, but there isn't a map api call to get selected overlays\r\n $('.leaflet-control-layers-overlays .leaflet-control-layers-selector:checked')\r\n .next()\r\n .each((idx, el) => {\r\n selectedOverlays.push(el.textContent.trim());\r\n });\r\n\r\n $('.leaflet-control-weather-overlays .leaflet-control-weather-selector:checked')\r\n .next()\r\n .each((idx, el) => {\r\n selectedOverlays.push(el.textContent.trim());\r\n });\r\n\r\n return selectedOverlays;\r\n };\r\n\r\n self.map.on('overlayadd', (e) => {\r\n addToDataLayer({\r\n event: 'mapOverlayChanged',\r\n data: {\r\n overlayName: e.name,\r\n selected: true,\r\n currentOverlays: getSelectedOverlays(),\r\n },\r\n });\r\n });\r\n\r\n self.map.on('overlayremove', (e) => {\r\n addToDataLayer({\r\n event: 'mapOverlayChanged',\r\n data: {\r\n overlayName: e.name,\r\n selected: false,\r\n currentOverlays: getSelectedOverlays(),\r\n },\r\n });\r\n });\r\n };\r\n\r\n // keep track of bounds\r\n self.storeBounds = function () {\r\n const center = self.map.getCenter();\r\n const zoom = self.map.getZoom();\r\n if (center) {\r\n localStorageService.set(KEY_MAP_CENTER, JSON.stringify(center));\r\n }\r\n if (zoom) {\r\n localStorageService.set(KEY_MAP_ZOOM, zoom);\r\n }\r\n };\r\n\r\n const defineFeature = function (feature, latlng) {\r\n const result = mapService.defineMarkerFeature(feature, latlng, $scope);\r\n\r\n result.on('click', function (e) {\r\n const { latlng = {} } = e;\r\n const currentZoomLevel = self.map.getZoom();\r\n const newPosition = new L.LatLng(latlng.lat, latlng.lng);\r\n self.map.flyTo(newPosition, currentZoomLevel, { animation: true });\r\n\r\n $state.go('map.equipment.detail', {\r\n equipmentId: e.target.feature.properties.id,\r\n });\r\n\r\n addToDataLayer({\r\n event: 'clickAssetOnMap',\r\n });\r\n });\r\n\r\n result.on(\r\n 'mouseover',\r\n function () {\r\n const isDetailspopupOpen = L.openedPopup;\r\n // ignore if the hover popup opened already or details popup opened\r\n if ((result._popup && result._popup.isOpen()) || isDetailspopupOpen) {\r\n return;\r\n }\r\n\r\n // make sure to update hovered asset scope as its been binded to the hoverPopupComponent first then open the popup\r\n $q((resolve) => {\r\n $scope.hoveredAsset = feature.properties;\r\n resolve();\r\n }).then(() => {\r\n const popupOptions = {\r\n minWidth: 350,\r\n closeButton: true,\r\n autoClose: true,\r\n autoPan: false,\r\n };\r\n\r\n result.bindPopup(self.hoverPopupComponent, popupOptions);\r\n result.openPopup();\r\n\r\n result.getPopup().on('remove', () => {\r\n addToDataLayer({\r\n event: 'assetPopupClosed',\r\n });\r\n });\r\n });\r\n\r\n addToDataLayer({\r\n event: 'showAssetPopupOnMap',\r\n });\r\n },\r\n { passive: true },\r\n );\r\n\r\n return result;\r\n };\r\n // Refresh the equipment data\r\n const refreshMapData = function (equipmentList, fitBoundsFlag) {\r\n if (self.map.hasLayer(geozoneFeatureGroup) || self.map.hasLayer(geozoneFeatureGroupLabels)) {\r\n self.refreshGeozones();\r\n }\r\n\r\n markersLayer.clearLayers();\r\n\r\n markersLayer.addLayer(\r\n L.geoJson(mapService.getEquipmentGeoJson(equipmentList), {\r\n pointToLayer: defineFeature,\r\n }),\r\n );\r\n\r\n if (fitBoundsFlag) {\r\n $scope.updateFlag = false; // do not want to update the map after fitting bounds\r\n if (\r\n markersLayer.getBounds().getSouthWest() !== undefined ||\r\n markersLayer.getBounds().getNorthEast() !== undefined\r\n ) {\r\n self.map.fitBounds(\r\n [\r\n markersLayer.getBounds().getSouthWest().wrap(),\r\n markersLayer.getBounds().getNorthEast().wrap(),\r\n ],\r\n 5,\r\n );\r\n }\r\n\r\n // because there is no way to tell when fitBounds has finished, the flag used to tell the map to update on move (moveend)\r\n // must be put into a timeout since there is no other way to ensure fitBounds has finished but this isnt guaranteed\r\n $timeout(function () {\r\n $scope.updateFlag = true;\r\n }, 700); // .7 s\r\n } else {\r\n $scope.firstLoad = false;\r\n }\r\n };\r\n\r\n let isUpdatingGeozones = false;\r\n\r\n let isGeozonesDirty = false;\r\n\r\n self.refreshGeozones = function () {\r\n if (isUpdatingGeozones) {\r\n isGeozonesDirty = true;\r\n return;\r\n }\r\n\r\n isGeozonesDirty = false;\r\n isUpdatingGeozones = true;\r\n\r\n GeozoneService.getAllGeozones()\r\n .then(\r\n function (response) {\r\n mapService.setVisibleGeozones(response.data);\r\n\r\n geozoneFeatureGroup.clearLayers();\r\n geozoneFeatureGroupLabels.clearLayers();\r\n\r\n angular.forEach(mapService.visibleGeozones, function (geozone) {\r\n if (geozone.geometry) {\r\n // Parse the geozone geometry to well known text\r\n const geoJsonGeometry = wellknown.parse(geozone.geometry);\r\n\r\n if (geoJsonGeometry) {\r\n const geoJsonData = {\r\n type: 'Feature',\r\n geometry: geoJsonGeometry,\r\n properties: {\r\n name: `${geozone.name}`,\r\n },\r\n geozone,\r\n };\r\n\r\n const geoJsonDataLabel = {\r\n type: 'Feature',\r\n geometry: geoJsonGeometry,\r\n properties: {\r\n name: `${geozone.name}`,\r\n },\r\n geozone,\r\n };\r\n const hideGeometry = {\r\n opacity: 0,\r\n fillOpacity: 0,\r\n };\r\n\r\n const geoJson = L.geoJson(geoJsonData).on('click', function () {\r\n $location.path(`/alerts/geozone/detail/${geozone.id}`);\r\n });\r\n const geoJsonLabels = L.geoJson(geoJsonDataLabel, {\r\n style: hideGeometry,\r\n })\r\n .bindTooltip(\r\n function (layer) {\r\n return layer.feature.properties.name;\r\n },\r\n {\r\n direction: 'center',\r\n permanent: true,\r\n interactive: true,\r\n className: 'labelstyle',\r\n },\r\n )\r\n .on('click', function () {\r\n $location.path(`/alerts/geozone/detail/${geozone.id}`);\r\n });\r\n\r\n geoJson.addTo(geozoneFeatureGroup);\r\n geoJsonLabels.addTo(geozoneFeatureGroupLabels);\r\n }\r\n }\r\n });\r\n\r\n if (isGeozonesDirty) {\r\n self.refreshGeozones();\r\n }\r\n },\r\n function () {},\r\n )\r\n .finally(function () {\r\n isUpdatingGeozones = false;\r\n });\r\n };\r\n\r\n $scope.$on('assets-onupdate', function (event, payload) {\r\n const inBoundsSearch = payload && payload.searchMode === mapService.SEARCH_MODE.IN_MAP_BOUNDARY;\r\n self.refreshPins(inBoundsSearch);\r\n });\r\n // Called when updated asset detail (this probably shouldn't be here any more and could probalby be replaced with a watch on mapservice\r\n $scope.$on('asset-onupdate', function () {\r\n const equipment = mapService.selectedEquipment;\r\n self.showPopupForEquipment(equipment);\r\n });\r\n\r\n // On selected page in the list panel\r\n $scope.$on('selected-page', function () {\r\n self.refreshPins(false);\r\n });\r\n\r\n // Does a query for equipment on the map\r\n self.refreshPins = function (mapMoved) {\r\n if (isUpdatingPins) {\r\n return;\r\n }\r\n\r\n isUpdatingPins = true;\r\n\r\n const cursor = mapService.requestedCursor;\r\n\r\n mapService.loading = true;\r\n $scope.errorFlag = false;\r\n\r\n mapService.setCurrentBounds(self.map.getBounds());\r\n\r\n let currBounds = mapService.getApiBounds();\r\n\r\n if (self.map.getZoom() < 3) {\r\n currBounds = null;\r\n }\r\n const modes = [];\r\n if (!mapMoved) {\r\n modes.push('searchOutsideBounds');\r\n }\r\n\r\n const includes = ['images'];\r\n\r\n equipmentRepository\r\n .getEquipmentSearch(\r\n mapService.queryString || '*',\r\n {\r\n limit: mapService.getLimit(),\r\n since: cursor,\r\n },\r\n mapService.filters,\r\n currBounds,\r\n null,\r\n mapService.facets,\r\n mapService.tagFilters,\r\n modes,\r\n includes,\r\n )\r\n .then(\r\n function (response) {\r\n isUpdatingPins = false;\r\n mapService.setEquipmentResponseData(response);\r\n mapService.cursor = cursor;\r\n $scope.$broadcast('mapservice-updated');\r\n\r\n refreshMapData(response.data.hits, response.data.locationRedirectFlag);\r\n\r\n // Collect data for analytics\r\n if (response.data.hits !== undefined) {\r\n const facets = {};\r\n\r\n if (mapService.facets !== undefined) {\r\n const facetAbstractionProperties = [\r\n { name: 'alerts', property: 'name' },\r\n { name: 'maintenance', property: 'name' },\r\n { name: 'securityGroups', property: 'name' },\r\n { name: 'lastCommunicated', property: 'label' },\r\n { name: 'lastSeen', property: 'range' },\r\n ];\r\n\r\n facetAbstractionProperties.forEach((facetProperty) => {\r\n if (mapService.facets[facetProperty.name] !== undefined) {\r\n const facet = mapService.facets[facetProperty.name]\r\n .filter((item) => item._selected === true)\r\n .map((item) => item[facetProperty.property]);\r\n\r\n if (facet.length > 0) facets[facetProperty.name] = facet;\r\n }\r\n });\r\n }\r\n\r\n addToDataLayer({\r\n event: 'assetsSearching',\r\n data: {\r\n keyword: mapService.queryString,\r\n since: cursor,\r\n bounds: currBounds,\r\n facets,\r\n attributes: mapService.tagFilters,\r\n totalLimitedMapAssets: response.data.hits.length,\r\n totalMapAssets: response.data.total,\r\n },\r\n });\r\n }\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving asset data');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${error.data.message} ${error.status.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.$broadcast('equip-search-error', {\r\n text: errorMsg,\r\n });\r\n },\r\n )\r\n .finally(function () {\r\n isUpdatingPins = false;\r\n mapService.loading = false;\r\n });\r\n };\r\n\r\n $scope.autorefreshTimeout = null;\r\n\r\n function autoRefresh() {\r\n // if not on the map page cancel the timer -note: change $location.path() from $location.url() so timer does not stop when adding search obj to url\r\n if ($location.path() !== '/map') {\r\n return false;\r\n }\r\n $scope.autorefreshTimeout = $timeout(function () {\r\n self.refreshPins(false);\r\n }, 1000 * 60 * REFRESH_TIMEOUT_MINS); // 5mins\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n if ($scope.autorefreshTimeout) {\r\n $timeout.cancel($scope.autorefreshTimeout);\r\n }\r\n });\r\n\r\n self.initRefreshTimer = function () {\r\n $scope.autorefreshTimeout = $timeout(function () {\r\n autoRefresh();\r\n }, 1000 * 60 * REFRESH_TIMEOUT_MINS); // 5mins\r\n };\r\n\r\n function updateOnMapMove() {\r\n if ($scope.mapRefreshTimeoutPromise) {\r\n $timeout.cancel($scope.mapRefreshTimeoutPromise);\r\n }\r\n\r\n $scope.mapRefreshTimeoutPromise = $timeout(function () {\r\n self.refreshPins(true);\r\n }, MAP_MOVE_DEBOUNCE_TIME);\r\n }\r\n\r\n // apends pin that will only appear on mobile to the pin\r\n self.appendPinToPopup = function (popup) {\r\n const width = 50;\r\n\r\n const halfWidth = width / 2;\r\n\r\n const height = 60;\r\n\r\n const svgContainer = d3\r\n .select(popup._container)\r\n .append('svg')\r\n .attr('width', width)\r\n .attr('height', height)\r\n .attr('viewBox', '0 0 50 60')\r\n .style('margin-top', `${-height / 2 - 15}px`) // height + size of pin\r\n .style('margin-left', `${-halfWidth}px`)\r\n .style('position', 'absolute')\r\n .classed('mobile-pin', true);\r\n\r\n const g = svgContainer.append('g').attr('transform', `translate(${0},${0})`);\r\n\r\n const strokeWidth = 2;\r\n\r\n const bezierLine = d3.svg\r\n .line()\r\n .x(function (d) {\r\n return d[0];\r\n })\r\n .y(function (d) {\r\n return d[1];\r\n })\r\n .interpolate('basis-closed');\r\n\r\n const points = [\r\n [halfWidth, height],\r\n [width, height * 0.3],\r\n [halfWidth, 0],\r\n [0, height * 0.3],\r\n [halfWidth, height],\r\n ];\r\n\r\n const path = g\r\n .append('path')\r\n .attr('d', bezierLine(points))\r\n .attr('stroke', 'white')\r\n .attr('stroke-width', strokeWidth)\r\n .attr('fill', '#000');\r\n\r\n const filter = path.append('filter').attr('id', 'drop-shadow').attr('height', '130%');\r\n\r\n filter\r\n .append('feGaussianBlur')\r\n .attr('in', 'SourceAlpha')\r\n .attr('stdDeviation', 5)\r\n .attr('result', 'blur');\r\n\r\n filter\r\n .append('feOffset')\r\n .attr('in', 'blur')\r\n .attr('dx', 5)\r\n .attr('dy', 5)\r\n .attr('result', 'offsetBlur');\r\n\r\n const feMerge = filter.append('feMerge');\r\n\r\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\r\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\r\n\r\n const circleContainer = svgContainer.append('g').attr('stroke', 'white').attr('fill', 'white');\r\n\r\n const circle = circleContainer.append('circle').attr('id', 'centerCircle');\r\n\r\n circle\r\n .attr('cx', '25')\r\n .attr('cy', '22')\r\n .attr('r', '5')\r\n .attr('stroke', '#fff')\r\n .attr('stroke-width', '3')\r\n .attr('fill', '#fff');\r\n\r\n // Adding equipment object to local storage.\r\n localStorageService.set(KEY_EQUIPMENT, popup.equipment);\r\n };\r\n\r\n // PUBLIC FUNCTIONS\r\n self.showPopupForEquipment = function (equipment) {\r\n // If we don't have the required equipment info, we can't show the popup.\r\n if (!equipment || !equipment.coords || equipment.coords.length < 2) {\r\n self.map.closePopup();\r\n return false;\r\n }\r\n\r\n // Verify the requested equipment matches the current state. If not, do nothing.\r\n if ($stateParams.equipmentId !== equipment.id) {\r\n return false;\r\n }\r\n\r\n // No need to continue if the popup is already open with the requested equipment.\r\n if (L.openedPopup && L.openedPopup.equipment && L.openedPopup.equipment.id === equipment.id) {\r\n return false;\r\n }\r\n\r\n // let html = '',\r\n // linkFunction = $compile(angular.element(html)),\r\n // newScope = $scope.$new();\r\n // newScope.equipment = equipment;\r\n\r\n const latLng = L.latLng(equipment.coords[1], equipment.coords[0]);\r\n\r\n // http://leafletjs.com/reference.html#popup\r\n // bind openedPopup to the L varible which is conveniently located in the gloabal namespace.\r\n // we will use this in the quickview controller to make it fit when we expand\r\n const popupWidth = 0;\r\n\r\n const popupOptions = {\r\n minWidth: popupWidth,\r\n closeButton: false,\r\n minHeight: 500,\r\n offset: L.point(0, 5),\r\n closeOnClick: false,\r\n keepInView: false,\r\n className: 'assetpopup',\r\n autoPanPadding: L.point(100, 100),\r\n };\r\n\r\n L.openedPopup = L.popup(popupOptions)\r\n .setLatLng(latLng)\r\n // .setContent(linkFunction(newScope)[0]) //\r\n .openOn(self.map);\r\n\r\n L.openedPopup.equipment = equipment;\r\n\r\n self.appendPinToPopup(L.openedPopup);\r\n return true;\r\n };\r\n\r\n $rootScope.$on('$stateChangeStart', function (e, toState, toParams) {\r\n if (toState.name === 'map.equipment.detail') {\r\n mapService.setRequestedEquipmentId(toParams.equipmentId);\r\n } else {\r\n mapService.setSelectedEquipment(null);\r\n }\r\n });\r\n\r\n $rootScope.$on('$stateChangeSuccess', function () {\r\n // Close the popup if we are not on the equipment page\r\n if ($state.current.name === 'map.equipment') {\r\n // Set euqiment to null and trigger and asset update so that the popup will disappear\r\n mapService.setSelectedEquipment(null);\r\n $rootScope.$broadcast('asset-onupdate');\r\n // we don't want to show a popup for equipment or eozones when we are on a list page\r\n self.map.closePopup();\r\n } else if ($state.includes('map.equipment.detail')) {\r\n mapService.requestedEquipmentId = $stateParams.equipmentId;\r\n\r\n const cachedEquipment = _.find(mapService.equipmentResponseData.data.hits, function (e) {\r\n return e.id === $stateParams.equipmentId;\r\n });\r\n\r\n if (cachedEquipment) {\r\n mapService.setSelectedEquipment(cachedEquipment);\r\n $rootScope.$broadcast('asset-onupdate');\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * compile map-hover-popup once and bind it to $scope.hoveredAsset\r\n */\r\n self.creatMapHoverPopupComponent = () => {\r\n const popuphtml = ``;\r\n const componentScope = $scope.$new();\r\n self.hoverPopupComponent = $compile(angular.element(popuphtml))(componentScope)[0];\r\n };\r\n // Main initialization function\r\n self.init = function () {\r\n getInitialPosition().then((pos) => {\r\n const zoom = localStorageService.get(KEY_MAP_ZOOM) || MAP_DEFAULT_ZOOM;\r\n self.initMap(pos, zoom);\r\n // Loading equipment object from local storage and call showPopupForEquipment that renders the Pin\r\n const keyEquipment = localStorageService.get(KEY_EQUIPMENT);\r\n if (keyEquipment != null) {\r\n self.showPopupForEquipment(JSON.parse(JSON.stringify(keyEquipment)));\r\n }\r\n self.creatMapHoverPopupComponent();\r\n // pass true will make the call to get equipment based on map bound then the map will not update the view based on the returnd equipment\r\n // todo : self.refreshPins() been called in diff spot causing to call api many times,\r\n // in some cases it passed fales which cased the map to set bound based on returnd equipment => need to be cleaned\r\n self.refreshPins(true);\r\n self.initRefreshTimer();\r\n });\r\n };\r\n\r\n self.init();\r\n}\r\n","export default function MapRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('map', {\r\n url: '/map',\r\n template: '',\r\n redirectTo: 'map.equipment',\r\n requiredDatapoints: ['gps'],\r\n requiredFeatures: ['map']\r\n })\r\n .state('map.equipment', {\r\n url: '/assets',\r\n template: '',\r\n requiredDatapoints: ['gps'],\r\n requiredFeatures: ['map']\r\n })\r\n .state('map.equipment.detail', {\r\n url: '/{equipmentId}',\r\n template: '',\r\n requiredDatapoints: ['gps'],\r\n requiredFeatures: ['map']\r\n });\r\n}","const entityMap = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '/': '/',\r\n};\r\n\r\nexport const escapeHTML = (str) => {\r\n return String(str).replace(/[&<>\"'/]/g, (s) => {\r\n return entityMap[s];\r\n });\r\n};\r\n","import { escapeHTML } from '../../../../utility/html.util.service';\r\n\r\nexport default function EquipmentListFastDirective($state, gettextCatalog, mapService) {\r\n 'ngInject';\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n equipmentList: '=',\r\n direct: '=',\r\n },\r\n replace: true,\r\n transclude: false,\r\n link: (scope, element) => {\r\n let html = ``;\r\n\r\n // For translating messages\r\n const msgUpcoming = gettextCatalog.getString('This asset has a maintenance plan upcoming');\r\n const msgAlertLow = gettextCatalog.getString('This asset has a low priority alert');\r\n const msgAlertMed = gettextCatalog.getString('This asset has a medium priority alert');\r\n const msgAlertHigh = gettextCatalog.getString('This asset has a high priority alert');\r\n const msgDue = gettextCatalog.getString('This asset has a due maintenance plan');\r\n const msgShareinbound = gettextCatalog.getString(\r\n 'This asset has been shared to your account',\r\n );\r\n const msgMakeModelNA = gettextCatalog.getString('Make and Model N/A');\r\n\r\n const onClickItem = (event) => {\r\n // eslint-disable-next-line no-undef\r\n const equipmentId = $(event.target).closest('.g-result').attr('data-equipment');\r\n\r\n if (scope.equipmentList) {\r\n // eslint-disable-next-line no-undef\r\n const equipment = _.find(scope.equipmentList, (e) => {\r\n // eslint-disable-next-line eqeqeq\r\n return e.id == equipmentId;\r\n });\r\n\r\n if (equipment) {\r\n if (scope.direct) {\r\n $state.go('equipment.detail', {\r\n equipmentId,\r\n });\r\n } else {\r\n // Stay on the map!\r\n mapService.setSelectedEquipment(equipment);\r\n $state.go('map.equipment.detail', {\r\n equipmentId,\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (scope.equipmentList) {\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < scope.equipmentList.length; i++) {\r\n const equipment = scope.equipmentList[i];\r\n html += `\r\n
                \r\n
                \r\n
                \r\n
                \r\n
                \r\n
                \r\n
                ${escapeHTML(equipment.name) || 'N/A'}
                \r\n `;\r\n\r\n if (equipment.attrs.make || equipment.attrs.model) {\r\n let text = '';\r\n\r\n if (equipment.attrs.make) {\r\n text += equipment.attrs.make;\r\n }\r\n\r\n if (equipment.attrs.model) {\r\n if (equipment.attrs.make) {\r\n text += ' ';\r\n }\r\n text += equipment.attrs.model;\r\n }\r\n\r\n html += `
                ${escapeHTML(text)}
                `;\r\n } else {\r\n html += `
                ${msgMakeModelNA}
                `;\r\n }\r\n\r\n html += `
                `;\r\n\r\n // Equipment status\r\n\r\n if (equipment.properties.indexOf('alert:low') >= 0) {\r\n html += ``;\r\n }\r\n if (equipment.properties.indexOf('alert:medium') >= 0) {\r\n html += ``;\r\n }\r\n if (equipment.properties.indexOf('alert:high') >= 0) {\r\n html += ``;\r\n }\r\n if (equipment.properties.indexOf('maintenance:upcoming') >= 0) {\r\n html += ``;\r\n }\r\n\r\n if (equipment.properties.indexOf('maintenance:due') >= 0) {\r\n html += ``;\r\n }\r\n\r\n if (equipment.properties.indexOf('sharestatus:inbound') >= 0) {\r\n html += ``;\r\n }\r\n html += `
                `;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-undef\r\n element.append(html);\r\n element.on('click', '.g-result', onClickItem);\r\n },\r\n };\r\n}\r\n","const ACCESS_MGMT_FILTER_SERIES = new Set([\r\n 'access_session',\r\n 'keypad_state',\r\n 'access_code_refused',\r\n]);\r\n\r\n/**\r\n * Identify access management data points so they can be filtered out on some pages\r\n * @param dataPointId\r\n * @returns {boolean}\r\n */\r\n\r\nexport function isAccessDataPoint(dataPointId) {\r\n return ACCESS_MGMT_FILTER_SERIES.has(dataPointId);\r\n}\r\n","import 'slick-carousel';\r\nimport { isAccessDataPoint } from '../../../../../functions/asset.functions';\r\n\r\nexport default function MapEquipmentDetailController(\r\n $timeout,\r\n MaintenanceService,\r\n $stateParams,\r\n mapService,\r\n $uibModal,\r\n AlertsService,\r\n usersService,\r\n equipmentDetailsService,\r\n) {\r\n 'ngInject';\r\n let vm = this;\r\n vm.alertsData = [];\r\n\r\n vm.itemDisplayCount = 5; //only show a maximum number of items\r\n vm.showDate = {}; // change states of show dates globally instead of individualy in ng-repeat\r\n vm.showDate.faults = false;\r\n vm.showDate.datapoints = false;\r\n vm.showDate.alerts = false;\r\n vm.hasImageFeature = usersService.hasRequiredFeatures(['images']); //Images enabled?\r\n vm.equipmentDetail = 'yo';\r\n vm.visibleEquipment = [];\r\n\r\n vm.loading = false;\r\n vm.errorFlag = false;\r\n vm.errorText = '';\r\n vm.showMoreAlerts = false;\r\n vm.showMoreSeries = false;\r\n vm.showMoreMaintenance = false;\r\n vm.loadEquipmentImages = true;\r\n\r\n vm.showMaintenancePopup = showMaintenancePopup;\r\n vm.makeSparkLines = makeSparkLines;\r\n vm.openNotesModal = openNotesModal;\r\n vm.openImageViewModal = openImageViewModal;\r\n vm.alertAcknowledged = alertAcknowledged;\r\n vm.acknowledgeAlert = acknowledgeAlert;\r\n vm.clearAlert = clearAlert;\r\n vm.refresh = refresh;\r\n\r\n //Make the sparklines for each series\r\n let colorArray = [\r\n '#67b7dc',\r\n '#fdd400',\r\n '#84b761',\r\n '#cc4748',\r\n '#cd82ad',\r\n '#2f4074',\r\n '#448e4d',\r\n '#b7b83f',\r\n '#b9783f',\r\n '#b93e3d',\r\n '#913167',\r\n '#666',\r\n '#777',\r\n ];\r\n let currColorIndex = 0;\r\n\r\n init();\r\n\r\n function init() {\r\n return vm.refresh();\r\n }\r\n\r\n function showMaintenancePopup(plan) {\r\n MaintenanceService.showPopupForEquipmentPlan(vm.equipmentDetail, plan)\r\n .result.then(vm.refresh)\r\n .catch(() => {});\r\n }\r\n\r\n function deleteImage(imageId, imageIndex) {\r\n $('#slickequipment').slick('slickRemove', imageIndex);\r\n equipmentDetailsService.deleteImage(imageId, imageIndex, vm.equipmentDetail);\r\n }\r\n\r\n function initSlick() {\r\n $timeout(function () {\r\n var element = $('#slickequipment');\r\n\r\n if (element.hasClass('slick-initialized')) element.slick('unslick');\r\n element.slick({\r\n dots: false,\r\n arrows: true,\r\n speed: 500,\r\n slidesToShow: 4,\r\n prevArrow: '',\r\n nextArrow: '',\r\n responsive: [\r\n {\r\n breakpoint: 1200,\r\n settings: {\r\n slidesToShow: 3,\r\n },\r\n },\r\n ],\r\n });\r\n\r\n vm.equipmentDetail.images.forEach((image, index) => {\r\n element.slick(\r\n 'slickAdd',\r\n `
                `,\r\n );\r\n });\r\n\r\n element.find('img').on('click', function (event) {\r\n vm.openImageViewModal(parseInt($(this).attr('data-index')));\r\n });\r\n }, 50);\r\n }\r\n\r\n function refresh(loadEqImages) {\r\n vm.loading = mapService.assetLoading = true;\r\n vm.errorFlag = false;\r\n return equipmentDetailsService\r\n .get($stateParams.equipmentId, [\r\n 'faults',\r\n 'series',\r\n 'alerts',\r\n 'maintenancePlans',\r\n 'attributes',\r\n 'images',\r\n 'users',\r\n ])\r\n .then(function (equipmentDetail) {\r\n vm.visibleEquipment = _.filter(equipmentDetail.series, function (series) {\r\n return series.display === true && isAccessDataPoint(series.attributes.dataId) === false;\r\n });\r\n vm.equipmentDetail = equipmentDetail;\r\n //Necessary in case where we are clicking and request finishes after started another request, also for updating/refreshing telematics\r\n setMapData(equipmentDetail);\r\n vm.loading = mapService.assetLoading = false;\r\n initSlick();\r\n return getSparklinesData();\r\n })\r\n .catch(function (error) {\r\n vm.errorFlag = true;\r\n vm.errorText = error;\r\n })\r\n .finally(function () {\r\n vm.loading = mapService.assetLoading = false;\r\n });\r\n }\r\n\r\n function setMapData(equipmentDetails) {\r\n if (\r\n !mapService.requestedEquipmentId ||\r\n mapService.requestedEquipmentId == equipmentDetails.id\r\n ) {\r\n let legacyEquipmentModel = equipmentDetails.attributes;\r\n legacyEquipmentModel.id = equipmentDetails.id;\r\n mapService.setSelectedEquipment(legacyEquipmentModel);\r\n mapService.selectedEquipmentFull = equipmentDetails;\r\n }\r\n }\r\n\r\n function alertAcknowledged(alert) {\r\n return alert.attributes.status.toLowerCase() === 'acknowledged';\r\n }\r\n\r\n function acknowledgeAlert(alert) {\r\n alert.isDisabled = true;\r\n\r\n return AlertsService.acknowledgeAlert(alert).finally(function () {\r\n alert.isDisabled = false;\r\n });\r\n }\r\n\r\n function clearAlert(alert) {\r\n alert.isDisabled = true;\r\n return AlertsService.clearAlert(alert, vm.equipmentDetail.alerts).finally(function () {\r\n alert.isDisabled = false;\r\n });\r\n }\r\n\r\n /*************************** Modals ***************************/\r\n\r\n //ALERT NOTES\r\n function openNotesModal(alert) {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../pages/alerts/dashboard/table/list/notes-modal/note.html'),\r\n controller: 'DashboardNotesModalController',\r\n size: 'md',\r\n resolve: {\r\n alert: function () {\r\n return alert.attributes;\r\n },\r\n },\r\n });\r\n\r\n // This is needed because angular is complaining that there is no catch for the resulting cancel promise\r\n // because there is a form in the modal window\r\n modalInstance.result.catch(function () {});\r\n }\r\n\r\n function openImageViewModal(pictureIndex) {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../equipment/components/images-modal/equipment-images.modal.html'),\r\n controller: 'EquipmentImagesModalController',\r\n size: 'lg',\r\n windowClass: 'tr-map-image-modal-dismiss',\r\n resolve: {\r\n items: function () {\r\n return vm.equipmentDetail.images;\r\n },\r\n index: pictureIndex,\r\n users: function () {\r\n return vm.equipmentDetail.users;\r\n },\r\n equipId: function () {\r\n return vm.equipmentDetail.id;\r\n },\r\n profilePictureId: function () {\r\n if (vm.equipmentDetail.relationships.profileImage) {\r\n return vm.equipmentDetail.relationships.profileImage.data.id;\r\n } else {\r\n return 0;\r\n }\r\n },\r\n onDeleteImageCallback: function () {\r\n return deleteImage;\r\n },\r\n },\r\n });\r\n }\r\n\r\n function getSparklinesData() {\r\n return equipmentDetailsService\r\n .get($stateParams.equipmentId, ['series', 'series.sparklines'])\r\n .then(function (equipmentDetail) {\r\n //update existing series with sparklines data\r\n vm.visibleEquipment.forEach((series) => {\r\n const sereiswithSparklines = equipmentDetail.series.find((s) => s.id === series.id);\r\n if (sereiswithSparklines) {\r\n series.meta.sparklines = sereiswithSparklines.meta.sparklines;\r\n }\r\n });\r\n\r\n //draw chart for the ones already appear on the UI\r\n vm.visibleEquipment.forEach((series) => {\r\n makeSparkLines(series);\r\n });\r\n })\r\n .catch(() => {\r\n console.error(error);\r\n });\r\n }\r\n\r\n function makeSparkLines(series) {\r\n $timeout(function () {\r\n let dataProvider = _.map(series.meta.sparklines, function (e) {\r\n return {\r\n timestamp: new Date(e.t),\r\n value: e.v,\r\n };\r\n });\r\n\r\n let chartColor = colorArray[currColorIndex];\r\n\r\n currColorIndex++;\r\n currColorIndex %= colorArray.length;\r\n\r\n AmCharts.makeChart('sparkline_' + series.id, {\r\n type: 'serial',\r\n theme: 'light',\r\n\r\n dataProvider: dataProvider,\r\n categoryField: 'timestamp',\r\n autoMargins: false,\r\n marginLeft: 0,\r\n marginRight: 5,\r\n marginTop: 0,\r\n marginBottom: 0,\r\n graphs: [\r\n {\r\n valueField: 'value',\r\n bulletField: 'bullet',\r\n showBalloon: false,\r\n lineColor: chartColor,\r\n },\r\n ],\r\n valueAxes: [\r\n {\r\n gridAlpha: 0,\r\n axisAlpha: 0,\r\n },\r\n ],\r\n categoryAxis: {\r\n gridAlpha: 0,\r\n axisAlpha: 0,\r\n startOnAxis: true,\r\n },\r\n });\r\n }, 1);\r\n }\r\n}\r\n","import EquipmentListFastDirective from './equipment-list-fast.component';\r\nimport EquipmentListItem from './equipment-list-item.component';\r\n\r\n//Details\r\nimport MapEquipmentDetailDirective from './details/equipment-detail.component';\r\nimport MapEquipmentDetailController from './details/equipment-detail.controller';\r\n\r\n\r\nconst equipmentListModule = angular.module('app.map.equipmentlist',[\r\n\t//THIRD PARTY\r\n\t'ui.router',\r\n\t'ui.bootstrap',\r\n\t'ui.router',\r\n\t'ncy-angular-breadcrumb',\r\n\t'gettext'\r\n]);\r\n\r\nequipmentListModule\r\n\t.controller('MapEquipmentDetailController', MapEquipmentDetailController)\r\n\t.directive('equipmentListFast',\tEquipmentListFastDirective)\r\n\t.directive('equipmentListItem', EquipmentListItem)\t\r\n .directive('mapEquipmentDetail', MapEquipmentDetailDirective)\r\n ;\r\n\r\nexport default equipmentListModule.name;","\r\nexport default function EquipmentListItem() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-list-item.component.html'),\r\n scope: {\r\n equipment: '='\r\n }\r\n };\r\n}\r\n","import MapEquipmentDetailController from './equipment-detail.controller';\r\nimport template from './equipment-detail.component.html';\r\n\r\nexport default function MapEquipmentDetailDirective() {\r\n return {\r\n restrict: 'E',\r\n template,\r\n scope: {\r\n asset: '=',\r\n panelOffScreen: '<'\r\n },\r\n controller: MapEquipmentDetailController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'detailVm'\r\n };\r\n}\r\n","export default function MapEquipmentController(\r\n $scope,\r\n $rootScope,\r\n $timeout,\r\n mapService,\r\n $state,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n $scope.savedSearches = []; //holds the saved searches list\r\n $scope.lastSearchQuery;\r\n\r\n $scope.showingMap = true;\r\n $scope.showFiltersMobile = true;\r\n\r\n $scope.panelOffscreen = true;\r\n\r\n $scope.currentPage = 1;\r\n $scope.currentResultPage = 1; //the client paging (out of the result set)\r\n $scope.pages = [];\r\n $scope.numPerPage = 20;\r\n $scope.firstPage = gettextCatalog.getString('First');\r\n $scope.lastPage = gettextCatalog.getString('Last');\r\n //Equipment that we have currently selected in the asset search widget (only one)\r\n $scope.selectedEquipment = null;\r\n\r\n $scope.filterCount = 0;\r\n $scope.showingFilters = false;\r\n\r\n $scope.mapEquipmentListScrollY = 0;\r\n\r\n $scope.data = {};\r\n $scope.data.queryString = '';\r\n $scope.data.facets = {};\r\n $scope.data.tagFilters = [];\r\n\r\n $scope.tagFilters = {};\r\n\r\n // Needed for asset type attribute filter.\r\n const assetTypeSettting = () => {\r\n $scope.tagFilters = mapService.tagFilters;\r\n };\r\n\r\n assetTypeSettting();\r\n $scope.isEquipmentDetail = function () {\r\n return $state.includes('map.equipment.detail');\r\n };\r\n $scope.toggleFilters = function () {\r\n $scope.showingFilters = !$scope.showingFilters;\r\n };\r\n\r\n //Get all of the filters\r\n $scope.showingMapButtonPressed = function () {\r\n if ($state.includes('map.equipment.detail')) {\r\n $scope.showingMap = false;\r\n $scope.panelOffscreen = false;\r\n $state.go('map.equipment');\r\n } else {\r\n $scope.panelOffscreen = !$scope.panelOffscreen;\r\n $scope.showingMap = !$scope.showingMap;\r\n }\r\n };\r\n\r\n $scope.isShowingMap = function () {\r\n let onEquipmentDetail = $state.includes('map.equipment.detail');\r\n\r\n return $scope.showingMap || onEquipmentDetail;\r\n };\r\n\r\n //NOTE: these scope on event listeners should in time be replaced by watches on the map service.\r\n $scope.$on('map-moveend', function (event, args) {\r\n $scope.search(false); //Don't udpate the map on move........the map will do this itself\r\n });\r\n\r\n $scope.isLoading = function () {\r\n return mapService.loading || !mapService.equipmentResponseData;\r\n };\r\n\r\n $scope.$on('map-click', function (event, args) {\r\n if ($scope.facetFiltersShowing === true) {\r\n $scope.toggleFilters();\r\n }\r\n\r\n $scope.facetFiltersShowing = false;\r\n $scope.$apply();\r\n });\r\n\r\n //when the map service has updated its assets\r\n $scope.$on('mapservice-updated', function (event, args) {\r\n $scope.errorFlag = false;\r\n\r\n $scope.responseData = mapService.equipmentResponseData;\r\n\r\n $scope.calculatePages();\r\n });\r\n\r\n $scope.$on('equip-search-error', function (event, args) {\r\n $scope.errorFlag = true;\r\n $scope.errorText = args.text;\r\n });\r\n\r\n $scope.filteredEquipment = [];\r\n\r\n $scope.isFiltered = false;\r\n\r\n $scope.clearSearch = function () {\r\n $scope.isFiltered = false;\r\n $scope.data.queryString = '*';\r\n };\r\n\r\n //Refresh the entire search query...and reset hte pages\r\n $scope.refreshSearch = function () {\r\n $scope.currentPage = 1;\r\n $scope.selectedPage = 1;\r\n\r\n //This is where we would do the map move broadcast event\r\n $scope.search(true);\r\n };\r\n\r\n $scope.$on('map-filter-update', function () {\r\n if (mapService.getIsMapLoaded()) {\r\n mapService.setFacets($scope.facets);\r\n mapService.setTagFilters($scope.tagFilters);\r\n\r\n mapService.setSelectedEquipment(null);\r\n //when no filters applied will pass SEARCH_MODE.IN_MAP_BOUNDARY flag in the event to prevent map zooming out\r\n const payload =\r\n $scope.filterCount === 0\r\n ? { searchMode: mapService.SEARCH_MODE.IN_MAP_BOUNDARY }\r\n : undefined;\r\n $scope.$emit('assets-onupdate', payload);\r\n $state.go('map.equipment');\r\n }\r\n });\r\n $scope.clearFacets = function () {\r\n for (let facet in $scope.facets) {\r\n for (let facetItem in $scope.facets[facet]) {\r\n $scope.facets[facet][facetItem]._selected = false;\r\n }\r\n }\r\n mapService.setFacets($scope.facets);\r\n $scope.$emit('assets-onupdate');\r\n };\r\n\r\n $scope.isFacetsApplied = function () {\r\n for (let facet in $scope.facets) {\r\n for (let facetItem in $scope.facets[facet]) {\r\n if ($scope.facets[facet][facetItem]._selected) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n $scope.onClickFiltersButton = function () {\r\n $scope.facetFiltersShowing = !$scope.facetFiltersShowing;\r\n };\r\n\r\n //calculate the number of pages and paged result set for client\r\n $scope.calculatePages = function () {\r\n if (!mapService.equipmentResponseData) return;\r\n if (!mapService.equipmentResponseData.data.hits) return;\r\n\r\n delete $scope.pagedResults;\r\n\r\n let responseData = mapService.equipmentResponseData;\r\n\r\n $scope.pages = [];\r\n $scope.numPages = Math.ceil(responseData.data.total / mapService.getLimit());\r\n $scope.currentPage = Math.floor(\r\n (responseData.data.cursor / responseData.data.total) * $scope.numPages,\r\n );\r\n\r\n let concurrentPages = 1;\r\n let cursor = $scope.currentPage - Math.ceil(concurrentPages / 2);\r\n let addedPages = 0;\r\n\r\n if (cursor < 0) {\r\n cursor = 0;\r\n }\r\n\r\n $scope.showingLastPage = false;\r\n $scope.showingFirstPage = false;\r\n\r\n while ($scope.pages.length < concurrentPages) {\r\n if (cursor < $scope.numPages) {\r\n $scope.pages.push(cursor + 1);\r\n cursor++;\r\n\r\n if (cursor === 1) {\r\n $scope.showingFirstPage = true;\r\n }\r\n\r\n if (cursor === $scope.numPages) {\r\n $scope.showingLastPage = true;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n $timeout(function () {\r\n $scope.pagedResults = angular.copy(responseData.data.hits);\r\n }, 1);\r\n };\r\n\r\n $scope.selectPage = function (page) {\r\n $scope.selectedPage = page;\r\n\r\n mapService.requestedCursor = ($scope.selectedPage - 1) * mapService.getLimit();\r\n $rootScope.$broadcast('selected-page');\r\n\r\n $scope.calculatePages();\r\n };\r\n\r\n $scope.sinceForPage = function (page, limit) {\r\n return (page - 1) * limit;\r\n };\r\n\r\n $scope.isDirty = false;\r\n\r\n //call the equipment search api if it is users first call erase old filteredAssets\r\n //if usergroups-page then add new key to assets returned to keep track if which ones are picked or not.\r\n //else just return the assets.\r\n //If broadcast results this will update the map and other parent scopes\r\n $scope.search = function (broadcastResults) {\r\n $scope.isDirty = false;\r\n\r\n let options = {};\r\n options.limit = $scope.limit || 500;\r\n if ($scope.selectedPage) {\r\n options.since = $scope.sinceForPage($scope.selectedPage, $scope.limit);\r\n }\r\n\r\n mapService.setFilters($scope.filters);\r\n mapService.setQueryString($scope.data.queryString);\r\n\r\n if (broadcastResults) {\r\n $rootScope.$broadcast('assets-onupdate');\r\n }\r\n };\r\n\r\n $scope.selectEquipment = function (equipment) {\r\n mapService.setSelectedEquipment(equipment);\r\n $rootScope.$broadcast('asset-onupdate');\r\n };\r\n\r\n $scope.showSearch = true;\r\n\r\n $scope.submitQuery = function () {\r\n $state.go('map.equipment');\r\n $scope.panelOffscreen = false;\r\n $scope.showingMap = false;\r\n $scope.refreshSearch();\r\n };\r\n\r\n $scope.toggleEquipmentList = () => {\r\n const event = $scope.panelOffscreen ? 'mapEquipmentListExpanded' : 'mapEquipmentListCollapsed';\r\n $scope.panelOffscreen = !$scope.panelOffscreen;\r\n\r\n addToDataLayer({\r\n event,\r\n });\r\n };\r\n}\r\n","import MapEquipmentListDirective from './map-equipment-list.component';\r\nimport MapEquipmentDirective from './map-equipment.component';\r\nimport MapEquipmentController from './map-equipment.controller';\r\nimport equipmentListModule from '../equipment/equipment.module';\r\nconst mapEquipmentModule = angular.module('app.map.mapEquipment', [\r\n equipmentListModule,\r\n //THIRD PARTY\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext'\r\n]);\r\n\r\nmapEquipmentModule\r\n .controller('MapEquipmentController', MapEquipmentController)\r\n\r\n .directive('mapEquipmentList', MapEquipmentListDirective)\r\n .directive('mapEquipment', MapEquipmentDirective);\r\n\r\nexport default mapEquipmentModule.name;","export default function MapEquipmentListDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./map-equipment-list.component.html'),\r\n transclude: true\r\n };\r\n}","\r\nexport default function MapEquipmentDirective() {\r\n return {\r\n template: require('./map-equipment.component.html'),\r\n transclude: true,\r\n controller: 'MapEquipmentController',\r\n restrict: 'E'\r\n };\r\n}\r\n","import d3 from 'd3';\r\nimport moment from 'moment';\r\n\r\n/**\r\n * The map service is a singleton that is used on the map module taht keeps track of the current context of the map as well as helper functions\r\n * The map service must NOT contain any div or layout related variables and is intended to help organize the context variables of the scope...such that they can be accessed throughout.\r\n */\r\nexport default function MapService(\r\n $rootScope,\r\n gettextCatalog,\r\n localStorageService,\r\n $location,\r\n usersService,\r\n) {\r\n 'ngInject';\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n const self = this;\r\n\r\n self.filters = [];\r\n self.queryString = '*';\r\n self.visibleGeozones = [];\r\n self.selectedGeozone = {};\r\n self.selectedEquipment = null;\r\n self.selectedEquipmentFull = null;\r\n self.currentBounds = null;\r\n\r\n self.equipmentResponseData = null;\r\n\r\n self.cursor = 0;\r\n self.requestedCursor = 0;\r\n\r\n self.loading = false;\r\n self.assetLoading = false;\r\n\r\n self.facets = null;\r\n self.tagFilters = null;\r\n\r\n self.controlLayer = null;\r\n\r\n self.isMapLoaded = false; // too many watches calling map before map can load\r\n\r\n self.requestedEquipmentId = null;\r\n\r\n self.SEARCH_MODE = {\r\n IN_MAP_BOUNDARY: 'in-map-boundary',\r\n };\r\n\r\n // Gets boundaries in format friendly to apis\r\n self.getApiBounds = function () {\r\n if (!self.currentBounds) return null;\r\n\r\n const nw = {\r\n lat: self.currentBounds._northEast.lat,\r\n lng: self.currentBounds._southWest.lng,\r\n };\r\n const se = {\r\n lat: self.currentBounds._southWest.lat,\r\n lng: self.currentBounds._northEast.lng,\r\n };\r\n return {\r\n nw,\r\n se,\r\n };\r\n };\r\n\r\n self.setEquipmentResponseData = function (responseData) {\r\n self.equipmentResponseData = responseData;\r\n };\r\n\r\n self.setFacets = function (facets) {\r\n self.facets = facets;\r\n };\r\n\r\n self.setTagFilters = function (tagFilters) {\r\n self.tagFilters = tagFilters;\r\n };\r\n\r\n self.getLimit = function () {\r\n return 2500;\r\n };\r\n\r\n self.setCursor = function (cursor) {\r\n self.cursor = cursor;\r\n };\r\n\r\n self.getCursor = function () {\r\n return self.cursor;\r\n };\r\n\r\n self.getControlLayer = function () {\r\n return self.controlLayer;\r\n };\r\n\r\n self.setCurrentBounds = function (bounds) {\r\n self.currentBounds = bounds;\r\n };\r\n\r\n self.setRequestedEquipmentId = function (equipmentId) {\r\n self.requestedEquipmentId = equipmentId;\r\n };\r\n\r\n self.setSelectedEquipment = function (equipment) {\r\n self.selectedEquipment = equipment;\r\n };\r\n\r\n self.setQueryString = function (queryString) {\r\n self.queryString = queryString;\r\n\r\n let queryStringValue = null;\r\n\r\n if (queryString !== '*') {\r\n queryStringValue = queryString;\r\n }\r\n $location.search('q', queryStringValue);\r\n };\r\n\r\n self.setSelectedEquipmentFull = function () {\r\n return self.selectedEquipmentFull;\r\n };\r\n\r\n self.setVisibleGeozones = function (visibleGeozones) {\r\n self.visibleGeozones = visibleGeozones;\r\n };\r\n\r\n self.setSelectedGeozone = function (selectedGeozone) {\r\n self.selectedGeozone = selectedGeozone;\r\n };\r\n\r\n self.setFilters = function (newFilters) {\r\n self.filters = newFilters;\r\n };\r\n\r\n self.setIsMapLoaded = function (flag) {\r\n self.isMapLoaded = flag;\r\n };\r\n\r\n self.getIsMapLoaded = function () {\r\n return self.isMapLoaded;\r\n };\r\n\r\n let storedBaseLayer = null;\r\n\r\n self.createMapDiv = function (divName, options) {\r\n // Arcgis Layers\r\n const streets = L.esri.basemapLayer('Streets');\r\n const satellite = L.esri.basemapLayer('Imagery');\r\n\r\n // clear attribution because it fills the screen on mobile\r\n streets.options.attribution = ' ';\r\n satellite.options.attribution = ' ';\r\n\r\n // ArcGIS Overlays\r\n const worldBoundariesAndPlaces = L.esri.basemapLayer('ImageryLabels');\r\n const transportation = L.esri.basemapLayer('ImageryTransportation');\r\n\r\n if (options == null) {\r\n options = {\r\n zoomControl: false,\r\n worldCopyJump: true,\r\n };\r\n }\r\n\r\n let defaultMapView = $rootScope.currentUser.claims.data.mapView;\r\n if (!defaultMapView) defaultMapView = 'streets';\r\n if (!storedBaseLayer) storedBaseLayer = defaultMapView;\r\n\r\n // Map\r\n const map = L.map(divName, options, storedBaseLayer);\r\n\r\n if (storedBaseLayer === 'streets') {\r\n streets.addTo(map);\r\n } else {\r\n satellite.addTo(map);\r\n }\r\n\r\n self.setIsMapLoaded(true);\r\n\r\n // Add layers that are on at app startup\r\n worldBoundariesAndPlaces.addTo(map); // defaultOverlay\r\n\r\n // translated controls names\r\n const satelliteTrans = gettextCatalog.getString('Satellite');\r\n const streetsTrans = gettextCatalog.getString('Streets');\r\n const streetNameTrans = gettextCatalog.getString('Street Names');\r\n const boundaryTrans = gettextCatalog.getString('Boundaries and Places');\r\n\r\n // BaseMap Layer Control\r\n const baseLayers = {};\r\n baseLayers[satelliteTrans] = satellite;\r\n baseLayers[streetsTrans] = streets;\r\n\r\n // BaseMap Overlays\r\n const overlays = {};\r\n overlays[streetNameTrans] = transportation;\r\n overlays[boundaryTrans] = worldBoundariesAndPlaces;\r\n\r\n // Basemap Layer controls\r\n self.controlLayer = L.control.layers(baseLayers, overlays).addTo(map);\r\n\r\n // add zoom control with your options\r\n L.control\r\n .zoom({\r\n position: 'topright',\r\n zoomInTitle: gettextCatalog.getString('Zoom in'),\r\n zoomOutTitle: gettextCatalog.getString('Zoom out'),\r\n })\r\n .addTo(map);\r\n\r\n // Set Min/Max Zoom levels\r\n map.options.maxZoom = 19;\r\n map.options.minZoom = 3;\r\n map.options.reset = true;\r\n\r\n // Zoom Home Tool\r\n const home = L.control\r\n .defaultExtent({\r\n position: 'topright',\r\n title: gettextCatalog.getString('Zoom to Home'),\r\n })\r\n .addTo(map);\r\n\r\n const center = L.latLng(40, -74.5); // set home position here\r\n home.setCenter(center);\r\n home.setZoom(3); // set home zoom level here\r\n\r\n // Locate Tool\r\n L.control\r\n .locate({\r\n position: 'topright',\r\n locateOptions: {\r\n maxZoom: 17,\r\n },\r\n showPopup: false,\r\n watch: false,\r\n strings: {\r\n title: gettextCatalog.getString('Show me where I am'),\r\n },\r\n icon: 'z-location-icon',\r\n })\r\n .addTo(map);\r\n\r\n // Scale\r\n\r\n usersService.getUserClaims().then((result) => {\r\n const claims = result.data;\r\n const isImperial = claims.unitOfMeasure === 'imperial';\r\n L.control\r\n .scale({\r\n position: 'bottomleft',\r\n metric: !isImperial,\r\n imperial: isImperial,\r\n })\r\n .addTo(map);\r\n });\r\n\r\n // Search\r\n const arcgisOnline = L.esri.Geocoding.arcgisOnlineProvider();\r\n\r\n // create the geocoding control and add it to the map\r\n // add searchControl\r\n const searchControl = L.esri.Geocoding.geosearch({\r\n providers: [arcgisOnline],\r\n position: 'topright',\r\n useMapBounds: false,\r\n placeholder: gettextCatalog.getString('Search for places or addresses'),\r\n title: gettextCatalog.getString('Location Search'),\r\n }).addTo(map);\r\n\r\n searchControl.on('results', () => {\r\n addToDataLayer({\r\n event: 'searchLocationFound',\r\n });\r\n });\r\n\r\n // create an empty layer group to store the results and add it to the map\r\n L.layerGroup().addTo(map);\r\n\r\n if (options.weatherEnabled === true) {\r\n // Add Weather Control\r\n L.control.weather().addTo(map);\r\n }\r\n\r\n map.on('baselayerchange', (e) => {\r\n storedBaseLayer = e.name.toLowerCase();\r\n });\r\n\r\n return map;\r\n };\r\n\r\n // Generates an array of geojson objects for leaflet to draw on the map from an array of equiment objects\r\n self.getEquipmentGeoJson = function (equipmentList) {\r\n // Filtering invalid coords\r\n equipmentList = equipmentList.filter((equip) => equip && Array.isArray(equip.coords));\r\n\r\n const equipmentGeoList = [];\r\n\r\n equipmentList.forEach((equipment) => {\r\n // get lat lng =>first item in coord should be lat and the second lng\r\n const [lat, lng] = equipment.coords;\r\n\r\n equipment.promoted = true;\r\n\r\n if (L.latLng(lat, lng)) {\r\n equipmentGeoList.push({\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [lat, lng],\r\n },\r\n properties: equipment,\r\n });\r\n }\r\n });\r\n return equipmentGeoList;\r\n };\r\n\r\n self.generateFeature = function (feature, latlng) {\r\n const myIcon = L.divIcon({\r\n className: 'marker',\r\n iconSize: L.point(22, 50),\r\n iconAnchor: [0, 24],\r\n html: '
                ',\r\n });\r\n\r\n const result = L.marker(latlng, {\r\n icon: myIcon,\r\n riseOnHover: false,\r\n });\r\n return result;\r\n };\r\n\r\n self.defineMarkerFeature = function (feature, latlng) {\r\n let className = 'asset-icon';\r\n\r\n let maxPriority = 0;\r\n\r\n const equipment = feature.properties;\r\n\r\n if (equipment && equipment.properties) {\r\n for (let i = 0; i < equipment.properties.length; i++) {\r\n const tag = equipment.properties[i];\r\n\r\n if (tag.indexOf('alert:high') !== -1) {\r\n maxPriority = Math.max(3, maxPriority);\r\n } else if (tag.indexOf('alert:medium') !== -1) {\r\n maxPriority = Math.max(2, maxPriority);\r\n } else if (tag.indexOf('alert:low') !== -1) {\r\n maxPriority = Math.max(1, maxPriority);\r\n }\r\n }\r\n }\r\n\r\n if (maxPriority === 3) {\r\n className += ' asset-icon-red icon';\r\n } else if (maxPriority === 2) {\r\n className += ' asset-icon-yellow icon';\r\n } else if (maxPriority === 1) {\r\n className += ' asset-icon-blue icon';\r\n } else {\r\n className += ' asset-icon-green icon';\r\n }\r\n\r\n const html =\r\n '';\r\n const iconSize = 18;\r\n\r\n const result = L.marker(latlng, {\r\n icon: L.divIcon({\r\n className,\r\n html,\r\n iconSize: [iconSize, iconSize],\r\n iconAnchor: [iconSize / 2, iconSize / 2],\r\n popupAnchor: [0, 0],\r\n }),\r\n riseOnHover: false,\r\n });\r\n\r\n return result;\r\n };\r\n\r\n self.defineClusterIcon = function (cluster) {\r\n function bakeThePie(options) {\r\n /* data and valueFunc are required */\r\n if (!options.data || !options.valueFunc) {\r\n return '';\r\n }\r\n\r\n options.strokeWidth = 1.5;\r\n\r\n const outerStrokeWidth = 2;\r\n\r\n const { data } = options;\r\n const { valueFunc } = options;\r\n const r = options.outerRadius ? options.outerRadius : 28; // Default outer radius = 28px\r\n const strokeWidth = options.strokeWidth ? options.strokeWidth : 1; // Default stroke is 1\r\n const pathClassFunc = options.pathClassFunc\r\n ? options.pathClassFunc\r\n : function () {\r\n return '';\r\n }; // Class for each path\r\n // pathTitleFunc = options.pathTitleFunc?options.pathTitleFunc:function(){return '';}, //Title for each path\r\n const pieClass = options.pieClass ? options.pieClass : 'marker-cluster-pie'; // Class for the whole pie\r\n const pieLabel = options.pieLabel ? options.pieLabel : d3.sum(data, valueFunc); // Label for the whole pie\r\n const pieLabelClass = options.pieLabelClass\r\n ? options.pieLabelClass\r\n : 'marker-cluster-pie-label'; // Class for the pie label\r\n const origo = r + strokeWidth + outerStrokeWidth; // Center coordinate\r\n const w = origo * 2; // width and height of the svg element\r\n const h = w;\r\n const donut = d3.layout.pie();\r\n const arc = d3.svg\r\n .arc()\r\n .innerRadius(r - 2)\r\n .outerRadius(r);\r\n\r\n // Create an svg element\r\n const svg = document.createElementNS('d3svg', 'svg');\r\n // Create the pie chart\r\n const vis = d3\r\n .select(svg)\r\n .data([data])\r\n .attr('class', pieClass)\r\n .attr('width', w)\r\n .attr('height', h);\r\n\r\n vis\r\n .append('circle')\r\n .attr('cx', origo)\r\n .attr('cy', origo)\r\n .attr('r', origo - 3)\r\n .attr('fill-opacity', '0.7')\r\n .attr('fill', '#000000');\r\n\r\n vis\r\n .append('circle')\r\n .attr('cx', origo)\r\n .attr('cy', origo)\r\n .attr('r', origo - 1)\r\n .attr('fill-opacity', '0.0')\r\n .attr('stroke', 'white')\r\n .attr('stroke-width', outerStrokeWidth);\r\n\r\n const arcs = vis\r\n .selectAll('g.arc')\r\n .data(donut.value(valueFunc))\r\n .enter()\r\n .append('svg:g')\r\n .attr('class', 'arc')\r\n .attr('transform', `translate(${origo},${origo})`);\r\n\r\n arcs\r\n .append('svg:path')\r\n .attr('class', pathClassFunc)\r\n .attr('stroke-width', strokeWidth + 1)\r\n .attr('d', arc)\r\n .append('svg:title');\r\n\r\n vis\r\n .append('text')\r\n .attr('x', origo)\r\n .attr('y', origo)\r\n .attr('class', pieLabelClass)\r\n .attr('text-anchor', 'middle')\r\n // .attr('dominant-baseline', 'central')\r\n // IE doesn't seem to support dominant-baseline, but setting dy to .3em does the trick\r\n .attr('dy', '.3em')\r\n .text(pieLabel);\r\n\r\n // Return the svg-markup rather than the actual element\r\n if (typeof window.XMLSerializer !== 'undefined') {\r\n return new window.XMLSerializer().serializeToString(svg);\r\n }\r\n if (typeof svg.xml !== 'undefined') {\r\n return svg.xml;\r\n }\r\n return '';\r\n }\r\n\r\n const children = cluster.getAllChildMarkers();\r\n\r\n let popupContent = `
                `;\r\n popupContent += ``;\r\n popupContent += `
                `;\r\n popupContent += `
                `;\r\n popupContent += `
                  `;\r\n\r\n children.sort((left, right) => {\r\n const leftName = left.feature.properties.name.toLowerCase();\r\n const rightName = right.feature.properties.name.toLowerCase();\r\n\r\n if (leftName < rightName) {\r\n return -1;\r\n }\r\n if (rightName < leftName) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n children.forEach((el) => {\r\n /* Capture each asset name / equipment id from each asset. */\r\n const {\r\n _latlng: { lat, lng },\r\n feature: {\r\n properties: { name: assetName = '', id: equipmentId },\r\n },\r\n } = el;\r\n\r\n popupContent += `
                • ${assetName}
                • `;\r\n });\r\n\r\n popupContent += `
                `;\r\n popupContent += `
                `;\r\n\r\n /* Adjust marker settings and add the pushpin to its container. */\r\n cluster.bindPopup(popupContent, {\r\n closeButton: true,\r\n autoClose: true,\r\n });\r\n\r\n /* If it is the main map page allow a popup to show on hover over marker. This is\r\n * only if the popup is not already open. Otherwise, ignore the listener because\r\n * the current map is not the main one. */\r\n const mainMap = document.getElementsByClassName('page-map');\r\n\r\n if (mainMap.length > 0) {\r\n cluster.on('mouseover', function () {\r\n const leftPanel = document.getElementsByClassName('sidepanel-content-full');\r\n\r\n if (!cluster._popup.isOpen() && leftPanel.length === 0) {\r\n this.openPopup();\r\n\r\n addToDataLayer({\r\n event: 'showAssetListPopupOnMap',\r\n data: {\r\n totalAssets: children.length,\r\n },\r\n });\r\n }\r\n });\r\n }\r\n\r\n cluster.getPopup().on('remove', () => {\r\n addToDataLayer({\r\n event: 'assetListPopupClosed',\r\n });\r\n });\r\n\r\n const n = children.length; // Get number of markers in cluster\r\n const rmax = 30; // Maximum radius for cluster pies\r\n const strokeWidth = 1; // Set clusterpie stroke width\r\n const r = rmax - 2 * strokeWidth - (n < 10 ? 12 : n < 100 ? 8 : n < 1000 ? 4 : 0); // Calculate clusterpie radius...\r\n const iconDim = (r + strokeWidth) * 2; // ...and divIcon dimensions (leaflet really want to know the size)\r\n const data = d3\r\n .nest() // Build a dataset for the pie chart\r\n .key(function (d) {\r\n let category = 'healthy';\r\n\r\n let maxPriority = 0;\r\n\r\n const equipment = d.feature.properties;\r\n\r\n if (equipment && equipment.properties) {\r\n for (let i = 0; i < equipment.properties.length; i++) {\r\n const tag = equipment.properties[i];\r\n\r\n if (tag.indexOf('alert:high') !== -1) {\r\n maxPriority = Math.max(3, maxPriority);\r\n } else if (tag.indexOf('alert:medium') !== -1) {\r\n maxPriority = Math.max(2, maxPriority);\r\n } else if (tag.indexOf('alert:low') !== -1) {\r\n maxPriority = Math.max(1, maxPriority);\r\n }\r\n }\r\n }\r\n\r\n if (maxPriority === 3) {\r\n category = 'alarming';\r\n } else if (maxPriority === 2) {\r\n category = 'faulting';\r\n } else if (maxPriority === 1) {\r\n category = 'low-alarming';\r\n }\r\n\r\n return category;\r\n })\r\n .sortKeys(d3.ascending)\r\n .entries(children, d3.map);\r\n // bake some svg markup\r\n const html = bakeThePie({\r\n data,\r\n valueFunc(d) {\r\n return d.values.length;\r\n },\r\n strokeWidth: 1,\r\n outerRadius: r,\r\n pieClass: 'cluster-pie',\r\n pieLabel: n,\r\n pieLabelClass: 'marker-cluster-pie-label',\r\n pathClassFunc(d) {\r\n return `category-${d.data.key}`; // todo: make it dynamic return \"category-\" + d.data.key;\r\n },\r\n // pathTitleFunc: function(d){return metadata.fields[categoryField].lookup[d.data.key]+' ('+d.data.values.length+' accident'+(d.data.values.length!=1?'s':'')+')';}\r\n });\r\n // Create a new divIcon and assign the svg markup to the html property\r\n const myIcon = new L.DivIcon({\r\n html,\r\n className: 'marker-cluster',\r\n iconSize: new L.Point(iconDim, iconDim),\r\n });\r\n return myIcon;\r\n };\r\n}\r\n","import template from './map-hover-popup.html';\r\n\r\nclass MapHoverPopupController {\r\n constructor() {}\r\n\r\n $onInit() {}\r\n\r\n $onDestroy() {\r\n this.asset = undefined;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controllerAs: 'hpVm',\r\n controller: MapHoverPopupController,\r\n bindings: {\r\n asset: '<'\r\n }\r\n};\r\n","import MapMainController from './map-controller';\r\nimport MapMainDirective from './map-directive';\r\nimport MapRouteConfig from './map.route';\r\n\r\nimport equipmentListModule from './view/equipment/equipment.module.js';\r\nimport mapEquipmentModule from './view/map/map-equipment.module';\r\nimport MapEquipmentPopupDirective from './popup/map-popup.component';\r\nimport MapSearchBarDirective from './components/map-search-bar.component';\r\nimport MapService from './map.service';\r\n\r\nimport MapHoverPopupComponent from './components/map-hover-popup/map-hover-popup.component';\r\n\r\nconst mapModule = angular.module('app.map', [\r\n equipmentListModule,\r\n mapEquipmentModule,\r\n\r\n //THIRD PARTY\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'ncy-angular-breadcrumb',\r\n 'gettext'\r\n]);\r\n\r\nmapModule\r\n .config(MapRouteConfig)\r\n\r\n .controller('MapMainController', MapMainController)\r\n\r\n .directive('mapMain', MapMainDirective)\r\n .directive('mapSearchBar', MapSearchBarDirective)\r\n .directive('mapEquipmentPopup', MapEquipmentPopupDirective)\r\n .component('mapHoverPopup', MapHoverPopupComponent)\r\n .service('mapService', MapService);\r\n\r\nexport default mapModule.name;\r\n","\r\nexport default function MapMainDirective() {\r\n return {\r\n template: require('./map-main.html'),\r\n controller: \"MapMainController\",\r\n transclude: true,\r\n restrict: 'E'\r\n };\r\n}\r\n","\r\nexport default function MapSearchBarDirective() {\r\n return {\r\n template: require('./map-search-bar.component.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n enabled: '=',\r\n loading: '=',\r\n placeholder: '@',\r\n onClickButton: '&',\r\n onClickFilters: '&',\r\n ngModel: '=',\r\n ngChange: '=',\r\n showingFilters: '=',\r\n filterCount: '='\r\n }\r\n };\r\n}\r\n","export default function MapEquipmentPopupDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./popup.html'),\r\n transclude: false,\r\n controllerAs: 'vm',\r\n controller: MapEquipmentPopupController\r\n };\r\n\r\n function MapEquipmentPopupController($scope, mapService, $stateParams, usersService) {\r\n 'ngInject';\r\n let vm = this;\r\n vm.popupEquipmentData = null;\r\n vm.profileImage = null;\r\n vm.hasImagesRights = hasImagesRights;\r\n vm.showLastCommDate = false;\r\n\r\n // ToDo: These watches need to be removed and equipment & loading need to passed into the component. Once using 1.5.8 we can use $onChange\r\n $scope.$watch(\r\n function() {\r\n return mapService.selectedEquipmentFull;\r\n },\r\n function(newVal) {\r\n if (!mapService.selectedEquipmentFull) return;\r\n if ($stateParams.equipmentId == newVal.id) {\r\n vm.popupEquipmentData = newVal;\r\n }\r\n }\r\n );\r\n\r\n $scope.$watch(\r\n function() {\r\n return mapService.assetLoading;\r\n },\r\n function(newVal) {\r\n vm.loading = newVal;\r\n }\r\n );\r\n\r\n function hasImagesRights() {\r\n return usersService.hasRequiredFeatures(['images']);\r\n }\r\n }\r\n}\r\n","// @ts-check\r\n\r\nimport 'chosen-js';\r\nimport angular from 'angular';\r\nimport moment from 'moment';\r\nimport * as requestClaimsSuccess from '../../../state/user/user.actions';\r\nimport AppSettings from '../../../app.settings';\r\nimport Auth from '../../../auth';\r\n\r\nexport class ProfileController {\r\n constructor(\r\n $scope,\r\n $rootScope,\r\n $window,\r\n $uibModal,\r\n usersService,\r\n languagesService,\r\n gettext,\r\n gettextCatalog,\r\n $ngRedux,\r\n $filter,\r\n navService,\r\n ) {\r\n 'ngInject';\r\n\r\n this.$filter = $filter;\r\n this.$scope = $scope;\r\n this.store = $ngRedux;\r\n this.requestClaimsSuccess = requestClaimsSuccess;\r\n this.$rootScope = $rootScope;\r\n this.$window = $window;\r\n this.$uibModal = $uibModal;\r\n this.usersService = usersService;\r\n this.languagesService = languagesService;\r\n this.gettext = gettext;\r\n this.gettextCatalog = gettextCatalog;\r\n this.singleSignOnFlag = $scope.$parent.show.singleSignOnFlag;\r\n\r\n this.landingPages = (AppSettings.LandingPages || []).filter((option) =>\r\n navService.isValidState(option.state),\r\n );\r\n\r\n this.prefixOP = [\r\n {\r\n lookupCode: 'Mr',\r\n description: gettext('Mr.'),\r\n },\r\n {\r\n lookupCode: 'Ms',\r\n description: gettext('Ms.'),\r\n },\r\n {\r\n lookupCode: 'Dr',\r\n description: gettext('Dr.'),\r\n },\r\n {\r\n lookupCode: 'Mrs',\r\n description: gettext('Mrs.'),\r\n },\r\n ];\r\n\r\n this.measureUnitOptions = [\r\n {\r\n option: 'metric',\r\n des: gettext('Metric'),\r\n },\r\n {\r\n option: 'imperial',\r\n des: gettext('Imperial'),\r\n },\r\n {\r\n option: 'none',\r\n des: gettext('None'),\r\n },\r\n ];\r\n\r\n this.dateOptions = [\r\n {\r\n option: 'DD/MM/YYYY',\r\n des: gettext('DD/MM/YYYY'),\r\n },\r\n {\r\n option: 'MM/DD/YYYY',\r\n des: gettext('MM/DD/YYYY'),\r\n },\r\n {\r\n option: 'YYYY/MM/DD',\r\n des: gettext('YYYY/MM/DD'),\r\n },\r\n {\r\n option: 'DD.MM.YYYY',\r\n des: gettext('DD.MM.YYYY'),\r\n },\r\n ];\r\n\r\n this.mapViewOptions = [\r\n {\r\n option: 'streets',\r\n des: gettext('Streets'),\r\n },\r\n {\r\n option: 'satellite',\r\n des: gettext('Satellite'),\r\n },\r\n ];\r\n\r\n this.languageOptions = languagesService.getSupportedLanguages();\r\n this.forms = {};\r\n this.pass = {\r\n ConfirmPassword: '',\r\n NewPassword: '',\r\n OldPassword: '',\r\n };\r\n this.passwordPattern = /(?=^.{6,}$)((?=.*[A-Z])|(?=.*[a-z]))((?=.*\\W)|(?=.*\\d)).*$/;\r\n\r\n // Phone Input Requirements\r\n this.phonePattern = /^[0-9]{1,15}$/;\r\n this.min = 7;\r\n this.max = 15;\r\n\r\n this.personalErrorFlag = false;\r\n this.personalErrorText = '';\r\n this.personalSuccessFlag = false;\r\n this.emailErrorFlag = false;\r\n this.emailErrorText = '';\r\n this.passwordErrorFlag = false;\r\n this.passwordErrorText = '';\r\n this.passwordSuccessFlag = false;\r\n }\r\n\r\n $onInit() {\r\n // to get user information from the server\r\n this.getUserInfo();\r\n\r\n // Set default map view\r\n if (!this.editUser.claims.data.mapView) {\r\n this.editUser.claims.data.mapView = 'streets';\r\n }\r\n\r\n this.unsubscribe = this.store.connect(\r\n () => {\r\n return {};\r\n },\r\n {\r\n ...requestClaimsSuccess,\r\n },\r\n )(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n getUserInfo() {\r\n this.user = this.$rootScope.currentUser;\r\n this.setAndFormatDates();\r\n this.editUser = angular.copy(this.user);\r\n this.updated = {\r\n email: this.user.email,\r\n };\r\n }\r\n\r\n // apply filter in js to rerun when dataformat changed, as in html will run once or when date changes\r\n setAndFormatDates() {\r\n this.lastLoginAt = this.$filter('TableDateFilter')(this.user.lastLoginAt);\r\n this.updatedAt = this.$filter('TableDateFilter')(this.user.updatedAt);\r\n }\r\n\r\n submitPersonalInfo() {\r\n this.resetFlags();\r\n\r\n this.forms.userForm.$setSubmitted();\r\n\r\n if (this.forms.userForm.$invalid || this.upload) {\r\n return;\r\n }\r\n\r\n this.upload = true;\r\n\r\n const claims = this.editUser.claims.data;\r\n\r\n for (const key in claims) {\r\n if (!claims[key]) {\r\n delete claims[key];\r\n }\r\n }\r\n\r\n this.usersService\r\n .updateUserClaims(claims)\r\n .then(\r\n (response) => {\r\n this.upload = false;\r\n this.personalSuccessFlag = true;\r\n this.user = angular.copy(this.editUser);\r\n this.forms.userForm.$setPristine();\r\n this.requestClaimsSuccess(response);\r\n this.$rootScope.currentUser.claims.data = response.data;\r\n this.languagesService.setCurrentLanguage(response.data.language);\r\n moment.locale(response.data.language);\r\n },\r\n (error) => {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while updating your profile',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.personalErrorFlag = true;\r\n this.personalErrorText = errorMsg;\r\n },\r\n )\r\n .finally(() => {\r\n this.upload = false;\r\n this.getUserInfo();\r\n });\r\n }\r\n\r\n submitEmail() {\r\n if (this.forms.emailForm.email.$invalid || this.emailChanging) {\r\n return;\r\n }\r\n\r\n this.item = {};\r\n\r\n angular.copy(this.updated, this.item);\r\n\r\n const modalInstance = this.$uibModal.open({\r\n template: require('./email/email.modal.html'),\r\n controller: 'EmailConfirmModalCtrl as vm',\r\n resolve: {\r\n item: () => {\r\n return this.item;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(\r\n () => {\r\n // after confirm\r\n // sending the verficaton email to user\r\n const newemail = {\r\n email: this.updated.email,\r\n };\r\n\r\n this.resetFlags();\r\n\r\n this.emailChanging = true;\r\n\r\n return this.usersService.changeEmail(newemail).then(\r\n () => {\r\n this.emailChanging = false;\r\n Auth.manager.removeUser();\r\n this.$window.location.href = 'LogoffMessage';\r\n },\r\n (error) => {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while updating your email',\r\n );\r\n\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.emailErrorFlag = true;\r\n this.emailErrorText = errorMsg;\r\n this.emailChanging = false;\r\n },\r\n );\r\n },\r\n () => {\r\n // change was cancelled\r\n },\r\n );\r\n }\r\n\r\n setUsersDateFormat() {\r\n this.editUser.claims.data = {\r\n ...this.editUser.claims.data,\r\n ...{ dateFormat: this.dateFormat },\r\n };\r\n }\r\n\r\n submitPasswordInfo() {\r\n if (this.forms.userPassword.$invalid || this.upload) {\r\n this.resetFlags();\r\n return;\r\n }\r\n\r\n if (this.pass.NewPassword === this.pass.OldPassword) {\r\n this.passwordErrorFlag = true;\r\n this.passwordErrorText = this.gettextCatalog.getString(\r\n 'New password cannot match current password',\r\n );\r\n return;\r\n }\r\n\r\n if (this.pass.ConfirmPassword !== this.pass.NewPassword) {\r\n this.resetFlags();\r\n return;\r\n }\r\n\r\n this.upload = true;\r\n this.resetFlags();\r\n\r\n this.usersService\r\n .changePassword({\r\n CurrentPassword: this.pass.OldPassword,\r\n NewPassword: this.pass.NewPassword,\r\n })\r\n .then(\r\n () => {\r\n this.passdone = true;\r\n this.user.updatedAt = Date.now();\r\n this.passwordSuccessFlag = true;\r\n this.forms.userPassword.$setPristine();\r\n this.pass.OldPassword = '';\r\n this.pass.NewPassword = '';\r\n this.pass.ConfirmPassword = '';\r\n this.usersService.getCurrentUser(); // update currentUser object with new \"last updated\" value\r\n },\r\n () => {\r\n this.resetFlags();\r\n this.passwordErrorFlag = true;\r\n this.passwordErrorText = this.gettextCatalog.getString('Invalid current password');\r\n this.passdone = false;\r\n },\r\n )\r\n .finally(() => {\r\n this.upload = false;\r\n });\r\n }\r\n\r\n changeTab() {\r\n this.getUserInfo();\r\n this.resetFlags();\r\n }\r\n\r\n resetFlags() {\r\n this.personalErrorFlag = false;\r\n this.personalErrorText = '';\r\n this.personalSuccessFlag = false;\r\n this.emailErrorFlag = false;\r\n this.emailErrorText = '';\r\n this.emailSuccessFlag = false;\r\n this.passwordErrorFlag = false;\r\n this.passwordErrorText = '';\r\n this.passwordSuccessFlag = false;\r\n }\r\n}\r\n\r\nexport function EmailConfirmModalCtrl($scope, $uibModalInstance, item) {\r\n 'ngInject';\r\n\r\n this.item = item;\r\n this.confirm = () => {\r\n $uibModalInstance.close();\r\n };\r\n\r\n this.cancel = () => {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n}\r\n\r\nexport const ProfileComponent = {\r\n template: require('../profile.html'),\r\n bindings: {},\r\n controller: ProfileController,\r\n controllerAs: 'vm',\r\n};\r\n","\r\nexport default function UserDataFactory($http, appSettings) {\r\n\r\n 'ngInject';\r\n\r\n var userDataFactory = {};\r\n var baseUrl = appSettings.IcebergApiUserInfoEndpoint + '/users';\r\n\r\n userDataFactory.getUserInfo = function () {\r\n return $http.get(baseUrl + '/me');\r\n };\r\n userDataFactory.getUserClaims = function () {\r\n return $http.get(baseUrl + '/me/claims');\r\n };\r\n userDataFactory.updateUserClaims = function (claims) {\r\n return $http.put(baseUrl + '/me/claims', claims);\r\n };\r\n\r\n userDataFactory.changeEmail = function (newemail) {\r\n return $http.post(baseUrl + '/me/email', newemail);\r\n };\r\n\r\n userDataFactory.updateUserInfo = function (id, firstName, lastName) {\r\n\r\n if (!id) {\r\n return id;\r\n }\r\n var userId = id;\r\n var userInfo = [{\r\n \"op\": \"update\",\r\n \"claims\": {\r\n \"firstName\": firstName || \"\",\r\n \"lastName\": lastName || \"\",\r\n // IANA JWT claims.\r\n \"given_name\": firstName || \"\",\r\n \"family_name\": lastName || \"\"\r\n }\r\n }];\r\n return $http.patch(baseUrl + '/' + userId + '/claims', userInfo);\r\n };\r\n\r\n userDataFactory.postUserInfo = function (id, firstName, lastName) {\r\n\r\n if (!id) {\r\n return id;\r\n }\r\n var userId = id;\r\n var userInfo = [{\r\n \"op\": \"add\",\r\n \"claims\": {\r\n \"firstName\": firstName || \"\",\r\n \"lastName\": lastName || \"\",\r\n // IANA JWT claims.\r\n \"given_name\": firstName || \"\",\r\n \"family_name\": lastName || \"\"\r\n }\r\n }];\r\n return $http.patch(baseUrl + '/' + userId + '/claims', userInfo);\r\n };\r\n\r\n userDataFactory.postUserRole = function (userRole) {\r\n return $http.post(appSettings.IcebergApiUserInfoEndpoint + '/roles', userRole);\r\n };\r\n\r\n userDataFactory.changePassword = function (model) {\r\n return $http.post(baseUrl + '/me/password', model);\r\n };\r\n\r\n return userDataFactory;\r\n}\r\n","export default function UsersRouteConfig($stateProvider, gettext) {\r\n 'ngInject';\r\n\r\n let profileEdit = gettext('Edit Profile'),\r\n profileSub = gettext('Subscriptions');\r\n\r\n $stateProvider\r\n .state('users', {\r\n url: '/users',\r\n template: ``,\r\n redirectTo: 'users.profile',\r\n ncyBreadcrumb: {\r\n label: \"{{'Profile' | translate}}\"\r\n },\r\n requiredFeatures: ['profile']\r\n })\r\n .state('users.profile', {\r\n url: '/profile',\r\n template: require('./edit-profile/editProfile.html'),\r\n redirectTo: 'users.profile.personal',\r\n ncyBreadcrumb: {\r\n label: \"{{'Edit Profile' | translate}}\"\r\n }\r\n })\r\n .state('users.profile.personal', {\r\n url: '/personal',\r\n helpModuleId: 'profile',\r\n helpState: 'users.profile.personal',\r\n template: require('./edit-profile/info/info.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n }\r\n })\r\n .state('users.profile.changePassword', {\r\n url: '/changePassword',\r\n helpModuleId: 'profile',\r\n helpState: 'users.profile.changePassword',\r\n template: require('./edit-profile/password/password.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n }\r\n })\r\n .state('users.profile.changeEmail', {\r\n url: '/changeEmail',\r\n helpModuleId: 'profile',\r\n helpState: 'users.profile.changeEmail',\r\n template: require('./edit-profile/email/email.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n }\r\n })\r\n .state('users.subscriptions', {\r\n url: '/subscriptions',\r\n helpModuleId: 'profile',\r\n helpState: 'users.subscriptions',\r\n template: require('./subscriptions/subscriptions.html'),\r\n controller: 'ProfileSubscriptionsController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Subscriptions' | translate}}\"\r\n },\r\n requiresChangeEmail: true\r\n });\r\n}\r\n","export default function OutsideCallRouteConfig($stateProvider) {\r\n\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('emailVerification', {\r\n url: '/emailVerification',\r\n template: require('./verifyEmailChange.html'),\r\n controller: 'VerifyChangeEmail'\r\n });\r\n}","export default function ProfileSubscriptionsController(\r\n $scope,\r\n $rootScope,\r\n usersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.currentStatus = null;\r\n $scope.agreement;\r\n\r\n function getUserInfo() {\r\n $scope.userme = $rootScope.currentUser;\r\n try {\r\n $scope.currentStatus = $scope.userme.claims.data.emailNotification\r\n ? 'Subscribe'\r\n : 'Unsubscribe';\r\n } catch (e) {\r\n $scope.currentStatus = 'Unsubscribe';\r\n }\r\n }\r\n\r\n // to get user information\r\n getUserInfo();\r\n\r\n $scope.addRemoveEmailSubscribtion = function () {\r\n var chageset = {};\r\n $scope.resetFlags();\r\n\r\n if ($scope.currentStatus == 'Unsubscribe' && $scope.agreement) {\r\n chageset = {\r\n op: 'add',\r\n claims: {\r\n emailNotification: true,\r\n },\r\n };\r\n } else if ($scope.currentStatus == 'Subscribe' && !$scope.agreement) {\r\n chageset = {\r\n op: 'remove',\r\n claims: {\r\n emailNotification: true,\r\n },\r\n };\r\n } else {\r\n return;\r\n }\r\n\r\n $scope.sending = true;\r\n usersService\r\n .patchCurrentUserClaims([chageset])\r\n .then(\r\n function (result) {\r\n //get updated info\r\n if (result.data) {\r\n $scope.userme.claims.data.emailNotification = result.data.hasOwnProperty(\r\n 'emailNotification',\r\n );\r\n $scope.currentStatus = $scope.userme.claims.data.emailNotification\r\n ? 'Subscribe'\r\n : 'Unsubscribe';\r\n }\r\n $scope.SuccessFlag = true;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating your subscription',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n },\r\n )\r\n .finally(function () {\r\n $scope.sending = false;\r\n });\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.errorFlag = false;\r\n $scope.SuccessFlag = false;\r\n };\r\n\r\n $scope.$watch('currentStatus', function () {\r\n if ($scope.currentStatus == 'Subscribe') {\r\n $scope.agreement = true;\r\n } else {\r\n $scope.agreement = false;\r\n }\r\n });\r\n}\r\n","import angular from 'angular';\r\nimport ngRedux from 'ng-redux';\r\n\r\n/* Controller Imports */\r\nimport {ProfileComponent, ProfileController, EmailConfirmModalCtrl} from './edit-profile/edit.controller';\r\nimport ProfileDataFactory from './edit-profile/editProfile.service';\r\n/* Service Imports */\r\nimport ProfileRouteConfig from './profile.route';\r\nimport VerifyEmailRouteConfig from './edit-profile/email/verifyEmailChange.route';\r\nimport ProfileSubscriptionsController from './subscriptions/subscriptions.controller';\r\n\r\nconst profileModule = angular\r\n .module('app.profile', [ngRedux, 'ui.bootstrap', 'ui.router', 'gettext'])\r\n .component('profileUser', ProfileComponent)\r\n /* Controllers */\r\n .controller('ProfileController', ProfileController)\r\n .controller('EmailConfirmModalCtrl', EmailConfirmModalCtrl)\r\n .controller('ProfileSubscriptionsController', ProfileSubscriptionsController)\r\n /* Services */\r\n .config(ProfileRouteConfig)\r\n .config(VerifyEmailRouteConfig)\r\n .factory('userDataFactory', ProfileDataFactory);\r\n\r\nexport default profileModule.name;\r\n","const ReportAttrs = {\r\n WithoutCustomDateRange: 'withoutCustomDateRange'\r\n};\r\nexport const ParamterNames = {\r\n Plant: 'Plant',\r\n SecurityContextId: 'SecurityContextId',\r\n AssetList: 'AssetList',\r\n Datapoint: 'DataPointList',\r\n};\r\n\r\nexport const ConstantValues = {\r\n All: 'All'\r\n};\r\n\r\nexport const reportHasAssetListParam = (params = []) => !!(params || []).find(p => p.name === ParamterNames.AssetList);\r\nexport const doNotSupportCustomRang = attrs => !!(attrs && attrs[ReportAttrs.WithoutCustomDateRange]);\r\nexport class Report {\r\n constructor(apiReportModel) {\r\n apiReportModel = apiReportModel || {};\r\n this.id = apiReportModel.id;\r\n this.name = apiReportModel.name;\r\n this.viewPath = apiReportModel.viewPath;\r\n this.parameters = apiReportModel.parameters;\r\n this.attrs = apiReportModel.attrs;\r\n this.exportOptions = apiReportModel.exportOptions;\r\n this.description = apiReportModel.description;\r\n this.type = apiReportModel.type;\r\n this.filters = apiReportModel.filters || [];\r\n this.requiredAssets = reportHasAssetListParam(this.parameters);\r\n this.doNotSupportCustomRang = doNotSupportCustomRang(this.attrs);\r\n }\r\n}\r\n","import moment from 'moment';\r\nimport { ParamterNames } from '../../models/report.model';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n analyticsScheduleReport: 'analyticsScheduleReport',\r\n};\r\n\r\nexport default function JobCreateController(\r\n $scope,\r\n $rootScope,\r\n $uibModal,\r\n $uibModalInstance,\r\n JobSchedulerService,\r\n $state,\r\n $filter,\r\n securityGroupsService,\r\n usersService,\r\n scheduleAttributes,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //defualt onei3 schedule report tag\r\n $scope.tag = 'onei3:schedule:report';\r\n $scope.scheduleName = scheduleAttributes.reportName;\r\n scheduleAttributes.dateRange = scheduleAttributes.dateRange ? scheduleAttributes.dateRange : {};\r\n scheduleAttributes.selectedAssets = scheduleAttributes.selectedAssets\r\n ? scheduleAttributes.selectedAssets\r\n : [];\r\n $scope.firstCall = false;\r\n $scope.user = usersService.currentUser();\r\n $scope.disableModalWindow = false;\r\n $scope.selectedAssets = [];\r\n //reportPath has to be passed from the parent controller\r\n $scope.reportPath = scheduleAttributes.reportPath;\r\n\r\n $scope.$on('totalEmails', function (event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n\r\n ///Dates, short forms 7d = 7 Days, MTD = Month to date\r\n $scope.dropDownDates = [\r\n {\r\n id: 1,\r\n label: gettextCatalog.getString('7d'),\r\n reportName: gettextCatalog.getString('Last 7 Days'),\r\n tooltip: gettextCatalog.getString('Last 7 Days'),\r\n },\r\n {\r\n id: 2,\r\n label: gettextCatalog.getString('MTD'),\r\n reportName: gettextCatalog.getString('Month-To-Date'),\r\n tooltip: gettextCatalog.getString('Month-To-Date'),\r\n },\r\n {\r\n id: 3,\r\n label: gettextCatalog.getString('30d'),\r\n reportName: gettextCatalog.getString('Last 30 Days'),\r\n tooltip: gettextCatalog.getString('Last 30 Days'),\r\n },\r\n {\r\n id: 4,\r\n label: gettextCatalog.getString('90d'),\r\n reportName: gettextCatalog.getString('Last 90 Days'),\r\n tooltip: gettextCatalog.getString('Last 90 Days'),\r\n },\r\n ];\r\n\r\n $scope.selectedDateRange = scheduleAttributes.dateRange\r\n ? $scope.dropDownDates[scheduleAttributes.dateRange.id - 1]\r\n : $scope.dropDownDates[0];\r\n\r\n const getPlantName = () => {\r\n return scheduleAttributes.reportParameters[ParamterNames.Plant]\r\n ? `- ${scheduleAttributes.reportParameters[ParamterNames.Plant]}`\r\n : '';\r\n };\r\n $scope.schedule = {\r\n jobName: scheduleAttributes.reportName\r\n ? `${scheduleAttributes.reportName} - ${\r\n scheduleAttributes.dateRange.reportDateName\r\n } ${getPlantName()}`\r\n : undefined,\r\n startDate: moment().toDate(),\r\n recurrence: 'Day',\r\n dateRange: $scope.selectedDateRange,\r\n selectedAssets: scheduleAttributes.selectedAssets,\r\n deliveryTime: undefined,\r\n actions: [],\r\n reportParameters: scheduleAttributes.reportParameters,\r\n enabled: true,\r\n contacts: [],\r\n create: true,\r\n reportPath: scheduleAttributes.reportPath,\r\n reportName: scheduleAttributes.reportName,\r\n reportDoesNotRequireAssets: scheduleAttributes.reportDoesNotRequireAssets,\r\n };\r\n\r\n $scope.numSelectedAssets =\r\n $scope.schedule.selectedAssets.length > 0 ? $scope.schedule.selectedAssets.length : undefined;\r\n\r\n $scope.openDatePickers = {};\r\n\r\n $scope.status = {\r\n isFirstOpen: false,\r\n isFirstDisabled: false,\r\n };\r\n\r\n //Local variables\r\n $scope.usersByPage = [];\r\n $scope.userData = [];\r\n $scope.filteredUserData = [];\r\n $scope.query = '';\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.loading = false;\r\n\r\n //Pagination\r\n $scope.currentPage = {};\r\n $scope.bigCurrentPage = 1;\r\n $scope.itemsPerPage = 10;\r\n $scope.maxSize = 1;\r\n\r\n $scope.today = function () {\r\n $scope.dt = moment().toDate();\r\n };\r\n $scope.today();\r\n\r\n $scope.clear = function () {\r\n $scope.dt = null;\r\n };\r\n\r\n // Disable weekend selection\r\n $scope.disabled = function (date, mode) {\r\n return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6);\r\n };\r\n\r\n $scope.dateOptions = {\r\n formatYear: 'yy',\r\n startingDay: 1,\r\n };\r\n\r\n $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];\r\n $scope.format = $scope.formats[3];\r\n\r\n $scope.status = {\r\n //opened: false\r\n isFirstOpen: false,\r\n isFirstDisabled: false,\r\n };\r\n\r\n let tomorrow = moment().toDate();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n let afterTomorrow = moment().toDate();\r\n afterTomorrow.setDate(tomorrow.getDate() + 2);\r\n $scope.events = [\r\n {\r\n date: tomorrow,\r\n status: 'full',\r\n },\r\n {\r\n date: afterTomorrow,\r\n status: 'partially',\r\n },\r\n ];\r\n\r\n $scope.emails = [];\r\n $scope.$on('disableDate', function (event, args) {\r\n $scope.date_checked = args.Calendar;\r\n });\r\n\r\n $scope.submitted = false;\r\n\r\n $scope.resourceUrl = securityGroupsService.getResourceUrl();\r\n $scope.animationsEnabled = true;\r\n $scope.existingEquips = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.successFlag = false;\r\n\r\n $scope.equipments = []; //list of equipments to send to the database\r\n $scope.postRemoval = [];\r\n $scope.removeFlags = {};\r\n $scope.filteredEquipmentList = [];\r\n $scope.equipmentByPage = [];\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.loading = true;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n //Pagination\r\n $scope.current = {\r\n equipmentPage: 1,\r\n usersPage: 1,\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n $scope.toggleAnimation = function () {\r\n $scope.animationsEnabled = !$scope.animationsEnabled;\r\n };\r\n\r\n let gatherDataNewReq = function (scheduleAttributes) {\r\n $scope.schedule = scheduleAttributes;\r\n $scope.schedule.startDate = moment($scope.schedule.startDate).toDate();\r\n $scope.schedule.startDate.setHours(\r\n $scope.schedule.deliveryTime.dateTime.getHours(),\r\n $scope.schedule.deliveryTime.dateTime.getMinutes(),\r\n );\r\n\r\n if ($scope.schedule.reportName.includes('Raw Asset Data')) {\r\n addCSVParams();\r\n }\r\n\r\n for (let key in $scope.schedule.reportParameters) {\r\n if ($scope.schedule.reportParameters.hasOwnProperty(key)) {\r\n switch ($scope.schedule.reportParameters[key]) {\r\n case 'AccountId':\r\n $scope.schedule.reportParameters[key] = $scope.user.account.id;\r\n break;\r\n case 'UserName':\r\n $scope.schedule.reportParameters[key] = $scope.user.username;\r\n break;\r\n case 'drop_DateRange':\r\n $scope.schedule.reportParameters[key] = $scope.schedule.dateRange.id;\r\n break;\r\n case 'UserTZ':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.timezone\r\n ? moment.tz(Date.now(), $scope.user.claims.data.timezone).format('z')\r\n : 'UTC';\r\n break;\r\n case 'UserUOM':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.unitOfMeasure;\r\n break;\r\n case 'TimeZoneId':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.timezone\r\n ? $scope.user.claims.data.timezone\r\n : 'UTC';\r\n break;\r\n }\r\n }\r\n }\r\n let data = {\r\n jobName: $scope.schedule.jobName,\r\n reportPath: $scope.schedule.reportPath, //$stateParams.folder + \"/\" + $stateParams.name,\r\n reportName: $scope.scheduleName, //$stateParams.name,\r\n startAt: $scope.schedule.startDate,\r\n recurrence: {\r\n frequency: $scope.schedule.recurrence,\r\n interval: 1,\r\n },\r\n contacts: $scope.schedule.contacts,\r\n reportParameters: $scope.schedule.reportParameters,\r\n tags: [$scope.tag],\r\n\r\n attrs: {\r\n scheme: 'reports',\r\n type: $scope.scheduleName ? $scope.scheduleName : '',\r\n },\r\n equipment: (function () {\r\n let arr = [];\r\n $scope.schedule.selectedAssets.forEach((asset) => {\r\n if (typeof asset === 'string') {\r\n arr.push({\r\n id: asset,\r\n name: asset,\r\n });\r\n } else {\r\n arr.push({\r\n id: asset.id,\r\n name: asset.name,\r\n });\r\n }\r\n });\r\n return arr;\r\n })(),\r\n };\r\n $scope.schedule.data = data;\r\n return $scope.schedule;\r\n };\r\n\r\n //If a scheduled csv export is being processed add the additional parameters needed\r\n //for the csv export to be performed. (datapoints and range)\r\n function addCSVParams() {\r\n var today = new Date(),\r\n offset,\r\n startDate,\r\n endDate,\r\n temp;\r\n temp = today.getDate();\r\n var datapoints = (function () {\r\n var arr = [];\r\n angular.forEach(Object.keys($rootScope.datapointsSelected), function (datapoint) {\r\n arr.push(datapoint);\r\n });\r\n return arr;\r\n })();\r\n datapoints = datapoints.join(',');\r\n $scope.schedule.reportParameters['datapoint'] = datapoints;\r\n endDate = today.toISOString();\r\n $scope.schedule.reportParameters['dt_EndDate'] = endDate;\r\n\r\n if ($scope.schedule.dateRange.label === '7d') {\r\n offset = 7;\r\n } else if ($scope.schedule.dateRange.label === '30d') {\r\n offset = 30;\r\n } else if ($scope.schedule.dateRange.label === '90d') {\r\n offset = 90;\r\n }\r\n\r\n if ($scope.schedule.dateRange.label === 'MTD') {\r\n startDate = today.setDate(1);\r\n } else {\r\n startDate = today.setDate(temp - offset);\r\n }\r\n\r\n temp = new Date(startDate);\r\n startDate = temp.toISOString();\r\n $scope.schedule.reportParameters['dt_StartDate'] = startDate;\r\n }\r\n\r\n //PUBLIC METHODS\r\n $scope.ok = function (update) {\r\n $scope.submitted = true;\r\n $scope.schedule.deliveryTime = $scope.schedule.deliveryTime;\r\n $scope.numSelectedAssets = $scope.schedule.selectedAssets.length;\r\n $scope.maxEmails = $scope.maxEmails ? $scope.maxEmails : $scope.schedule.contacts.length;\r\n \r\n if (!isValid($scope.schedule)) {\r\n return false;\r\n }\r\n\r\n const params = gatherDataNewReq($scope.schedule);\r\n \r\n dataLayer.push({\r\n event: gtmEvents.analyticsScheduleReport,\r\n data: params,\r\n });\r\n\r\n if (update) {\r\n JobSchedulerService.updateSchedule(params).then(\r\n function () {\r\n $uibModalInstance.close($scope.schedule);\r\n $scope.error = false;\r\n },\r\n function () {\r\n $uibModalInstance.dismiss('cancel');\r\n $scope.error = gettextCatalog.getString('Error creating job schedule for this report.');\r\n },\r\n );\r\n } else {\r\n JobSchedulerService.createSchedule(params).then(\r\n function (response) {\r\n $uibModalInstance.close($scope.schedule);\r\n $state.go('reports.jobscheduledetail', {\r\n id: response.data.id,\r\n });\r\n $scope.error = false;\r\n },\r\n function () {\r\n //In the case of an error...it should show an error message to the end user\r\n $scope.error = true;\r\n // $uibModalInstance.dismiss('cancel');\r\n },\r\n );\r\n }\r\n\r\n scheduleAttributes.selectedAssets = $scope.schedule.selectedAssets;\r\n scheduleAttributes.dateRange = $scope.schedule.dateRange;\r\n $scope.disableModalWindow = true;\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n const isValid = function (schedule) {\r\n let diff = $scope.schedule.startDate.getTime() - $scope.schedule.minDate.getTime();\r\n let minDifference = -60000;\r\n const validAssets = schedule.reportDoesNotRequireAssets\r\n ? true\r\n : schedule.selectedAssets.length > 0;\r\n if (\r\n schedule.jobName &&\r\n validAssets &&\r\n schedule.contacts.length > 0 &&\r\n schedule.contacts.length <= $scope.maxEmails &&\r\n schedule.dateRange &&\r\n schedule.startDate &&\r\n schedule.deliveryTime.dateTime &&\r\n diff > minDifference\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n}\r\n","import moment from 'moment';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n analyticsDeleteScheduleReport: 'analyticsDeleteScheduleReport',\r\n};\r\n\r\nexport function JobDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n scheduleToDelete,\r\n JobSchedulerService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.schedule = scheduleToDelete;\r\n\r\n $scope.ok = function () {\r\n $scope.loading = true;\r\n\r\n dataLayer.push({\r\n event: gtmEvents.analyticsDeleteScheduleReport,\r\n data: {\r\n ...scheduleToDelete,\r\n },\r\n });\r\n\r\n JobSchedulerService.deleteSchedule(scheduleToDelete)\r\n .then(function () {\r\n $uibModalInstance.close(scheduleToDelete);\r\n })\r\n .catch(function () {\r\n $uibModalInstance.dismiss(gettextCatalog.getString('Error deleting schedule'));\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n };\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n}\r\n\r\nexport function JobDetailController(\r\n $scope,\r\n $q,\r\n $sce,\r\n $rootScope,\r\n $uibModal,\r\n $stateParams,\r\n JobSchedulerService,\r\n $state,\r\n $filter,\r\n securityGroupsService,\r\n equipmentRepository,\r\n reportsRepository,\r\n appSettings,\r\n $log,\r\n usersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.date = {};\r\n\r\n const refresh = function () {\r\n $scope.loading = true;\r\n\r\n JobSchedulerService.getSchedule($stateParams.id)\r\n .then(function (response) {\r\n $scope.schedule = response.data;\r\n const assetIds = [];\r\n for (let i = 0; i < $scope.schedule.equipment.length; i++) {\r\n assetIds.push($scope.schedule.equipment[i].id);\r\n }\r\n $scope.assetsSelected = assetIds.toString();\r\n $scope.reportPath = $scope.schedule.reportId;\r\n return reportsRepository.getReport($scope.reportPath);\r\n })\r\n .then(function (response) {\r\n $scope.report = response.data;\r\n $scope.parametersData =\r\n $scope.report.data.relationships.ssrsReport.data.attributes.parameters;\r\n setDateRangeValue($scope.parametersData);\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString('Failed to get schedule');\r\n })\r\n .finally(function () {\r\n const rp = `${appSettings.VikingEndpoint}/default?path=${encodeURIComponent(\r\n $scope.schedule.reportPath,\r\n )}`;\r\n $scope.iFrameReportPath = $sce.trustAsResourceUrl(rp);\r\n $scope.$emit('$viewContentLoaded');\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n function setDateRangeValue(parametersData) {\r\n if (!parametersData) return;\r\n for (let i = 0; i < parametersData.length; i++) {\r\n const param = parametersData[i];\r\n if (param.name === 'drop_DateRange') {\r\n param.defaultValues[0] = $scope.schedule.reportParameters.drop_DateRange;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n refresh();\r\n $scope.getEmails = function () {\r\n return JobSchedulerService.getNotificationEmails($scope.schedule);\r\n };\r\n\r\n $scope.iframeReportCallBack = function () {\r\n $scope.loadingReport = false;\r\n $scope.reportGenerated = true;\r\n $scope.$apply();\r\n };\r\n\r\n $scope.parameterRequired = function (name) {\r\n if (!$scope.parametersData) {\r\n return false;\r\n }\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if ($scope.parametersData[i].name === name) {\r\n return true;\r\n // break;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Gets the path of the template for the parameters, some inputs are hidden from the UI\r\n // this is because we need form inputs to be able to POST to a iFrame\r\n $scope.getParamPath = function (name) {\r\n if (name.indexOf('drop_') === 0) {\r\n return 'pages/reports/reportview/reportparameters/_form.drop_.html';\r\n }\r\n if (name === 'dt_EndDate') {\r\n $scope.date.end = moment().format('YYYY-MM-DD');\r\n return 'pages/reports/reportview/reportparameters/_form.drop_DateRange.html';\r\n }\r\n if (name === 'AssetList') {\r\n let assetIds = '';\r\n\r\n for (let i = 0; i < $scope.schedule.equipment.length; i++) {\r\n if (i === 0) assetIds = $scope.schedule.equipment[i].id;\r\n else assetIds = `${assetIds },${ $scope.schedule.equipment[i].id}`;\r\n }\r\n\r\n $scope.assetsSelected = assetIds;\r\n\r\n return 'pages/reports/reportview/reportparameters/_form.AssetList.html';\r\n }\r\n if (name === 'UnitOfMeasure') {\r\n $scope.unitOfMeasure = usersService.currentUser().claims.data.unitOfMeasure;\r\n return 'pages/reports/reportview/reportparameters/_form.user_unit_of_measure.html';\r\n }\r\n // not sure if needed keeping around for legacy purposes\r\n if (name === 'UserUOM') {\r\n $scope.userUOM = usersService.currentUser().claims.data.unitOfMeasure;\r\n return 'pages/reports/reportview/reportparameters/_form.user_uom.html';\r\n }\r\n if (name === 'TimeZoneId') {\r\n $scope.timeZoneId = usersService.currentUser().claims.data.timezone;\r\n return 'pages/reports/reportview/reportparameters/_form.time_zone_id.html';\r\n }\r\n if (name === 'UserTZ') {\r\n $scope.userTZ = moment\r\n .tz(Date.now(), usersService.currentUser().claims.data.timezone)\r\n .format('z');\r\n return 'pages/reports/reportview/reportparameters/_form.user_time_zone.html';\r\n }\r\n if (name === 'UserName') {\r\n $scope.userName = usersService.currentUser().username;\r\n return 'pages/reports/reportview/reportparameters/_form.user_name.html';\r\n }\r\n if (name === 'AccountId') {\r\n $scope.accountId = parseInt(usersService.currentUser().account.id);\r\n return 'pages/reports/reportview/reportparameters/_form.account_id.html';\r\n }\r\n\r\n return '';\r\n };\r\n\r\n $scope.deleteButtonPressed = function () {\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n keyboard: false,\r\n backdrop: 'static',\r\n template: require('../_delete.schedule.confirmation.modal.html'),\r\n controller: 'JobDeleteModalController',\r\n size: 'sm',\r\n resolve: {\r\n scheduleToDelete() {\r\n return $scope.schedule;\r\n },\r\n },\r\n });\r\n modalInstance.result.then(\r\n function () {\r\n $state.go('reports.jobschedules');\r\n },\r\n function () {\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString('Error deleting schedule');\r\n },\r\n );\r\n };\r\n}\r\n","import moment from 'moment';\r\nimport angular from 'angular';\r\nimport {reportHasAssetListParam, doNotSupportCustomRang} from '../../models/report.model';\r\nimport {get} from 'lodash-es';\r\n\r\nexport default function JobUpdateController(\r\n $scope,\r\n $uibModal,\r\n $stateParams,\r\n JobSchedulerService,\r\n $state,\r\n $filter,\r\n securityGroupsService,\r\n reportsRepository,\r\n $log,\r\n usersService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.$on('totalEmails', function(event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n //defualt onei3 schedule report tag\r\n $scope.tag = 'onei3:schedule:report';\r\n\r\n $scope.submitted = false;\r\n $scope.resourceUrl = securityGroupsService.getResourceUrl();\r\n $scope.animationsEnabled = true;\r\n $scope.existingEquips = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.successFlag = false;\r\n\r\n $scope.equipments = []; //list of equipments to send to the database\r\n $scope.postRemoval = [];\r\n $scope.removeFlags = {};\r\n $scope.filteredEquipmentList = [];\r\n $scope.equipmentByPage = [];\r\n $scope.search = {\r\n text: ''\r\n };\r\n $scope.loading = true;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n $scope.dropDownDates = [\r\n {\r\n id: 1,\r\n label: gettextCatalog.getString('7d'),\r\n reportName: 'Last 7 Days',\r\n tooltip: gettextCatalog.getString('Last 7 Days')\r\n },\r\n {\r\n id: 2,\r\n label: gettextCatalog.getString('MTD'),\r\n reportName: 'Month-To-Date',\r\n tooltip: gettextCatalog.getString('Month-To-Date')\r\n },\r\n {\r\n id: 3,\r\n label: gettextCatalog.getString('30d'),\r\n reportName: 'Last 30 Days',\r\n tooltip: gettextCatalog.getString('Last 30 Days')\r\n },\r\n {\r\n id: 4,\r\n label: gettextCatalog.getString('90d'),\r\n reportName: 'Last 90 Days',\r\n tooltip: gettextCatalog.getString('Last 90 Days')\r\n }\r\n ];\r\n\r\n const updateSchedulerRequiredAssetProp = reportParams => {\r\n const reportNeedAssets = reportHasAssetListParam(reportParams);\r\n $scope.schedule = {...($scope.schedule || {}), reportDoesNotRequireAssets: !reportNeedAssets};\r\n };\r\n\r\n let getSchedule = function() {\r\n JobSchedulerService.getSchedule($stateParams.id)\r\n .then(\r\n function(response) {\r\n $scope.loading = true;\r\n let data = response.data;\r\n getScheduleRepresentation(data);\r\n $scope.selectedDateRange = $scope.schedule.dateRange;\r\n return reportsRepository.getReport(data.reportId);\r\n },\r\n function() {\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString('Unexpected error occurred while getting the schedule');\r\n }\r\n )\r\n .then(\r\n function(response) {\r\n let attrs = response.data.data.attributes.attrs;\r\n const reportParams = get(response, 'data.data.relationships.ssrsReport.data.attributes.parameters', []);\r\n updateSchedulerRequiredAssetProp(reportParams);\r\n const validDateRangeOption = (reportParams.find(p => p.name === 'drop_DateRange') || {}).validValues || [];\r\n const validOptions = validDateRangeOption.map(op => op.value);\r\n if (validOptions.length) {\r\n $scope.dropDownDates = $scope.dropDownDates.filter(opt => validOptions.includes(`${opt.id}`));\r\n }\r\n\r\n $scope.prefilter = attrs.prefilter;\r\n $scope.dateRangeType = attrs.dateRange ? attrs.dateRange : '';\r\n $scope.maxSelection =\r\n attrs.prefilter && attrs.prefilter.indexOf('onei3:model') && attrs.prefilter.indexOf('m3') ? 1 : undefined;\r\n },\r\n function() {\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString('Unexpected error occurred while getting the report');\r\n }\r\n )\r\n .finally(function() {\r\n $scope.loading = false;\r\n $scope.$emit('$viewContentLoaded');\r\n });\r\n };\r\n\r\n getSchedule($stateParams.id);\r\n\r\n let getScheduleRepresentation = function(data) {\r\n $scope.schedule = {\r\n id: data.id,\r\n jobName: data.jobName,\r\n startDate: moment(data.startAt).toDate(),\r\n dateRange: $scope.dropDownDates.find(opt => `${opt.id}` === data.reportParameters.drop_DateRange),\r\n selectedAssets: data.equipment,\r\n reportPath: data.reportPath,\r\n reportName: data.reportName,\r\n type: data.attrs.type,\r\n deliveryTime: {\r\n dateTime: moment(data.startAt).toDate()\r\n },\r\n reportParameters: data.reportParameters,\r\n enabled: true,\r\n contacts: data.contacts,\r\n recurrence: data.recurrence.frequency,\r\n reportDoesNotRequireAssets: false\r\n };\r\n };\r\n\r\n $scope.firstCall = false;\r\n $scope.user = usersService.currentUser();\r\n $scope.selectedAssets = [];\r\n $scope.openDatePickers = {};\r\n $scope.status = {\r\n isFirstOpen: false,\r\n isFirstDisabled: false\r\n };\r\n $scope.reportParam = [];\r\n $scope.exportList = [];\r\n $scope.startDateIndex = -1;\r\n $scope.endDateIndex = -1;\r\n\r\n //Local variables\r\n $scope.usersByPage = [];\r\n $scope.userData = [];\r\n $scope.filteredUserData = [];\r\n $scope.query = '';\r\n $scope.search = {\r\n text: ''\r\n };\r\n $scope.loading = false;\r\n\r\n //Pagination\r\n $scope.currentPage = {};\r\n $scope.bigCurrentPage = 1;\r\n $scope.itemsPerPage = 10;\r\n $scope.maxSize = 1;\r\n\r\n $scope.today = function() {\r\n $scope.dt = moment().toDate();\r\n };\r\n $scope.today();\r\n\r\n $scope.clear = function() {\r\n $scope.dt = null;\r\n };\r\n\r\n // Disable weekend selection\r\n $scope.disabled = function(date, mode) {\r\n return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6);\r\n };\r\n\r\n $scope.dateOptions = {\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];\r\n $scope.format = $scope.formats[3];\r\n\r\n $scope.status = {\r\n //opened: false\r\n isFirstOpen: false,\r\n isFirstDisabled: false\r\n };\r\n\r\n $scope.emails = [];\r\n $scope.$on('disableDate', function(event, args) {\r\n $scope.date_checked = args.Calendar;\r\n });\r\n\r\n function processPreFilter(input) {\r\n let prefilter = {};\r\n if (typeof input === 'string') {\r\n let unescaped = (input || '').replace(/\\\\/g, '\"');\r\n prefilter = JSON.parse(unescaped);\r\n } else if (typeof input === 'object') {\r\n prefilter = input;\r\n }\r\n\r\n return prefilter;\r\n }\r\n\r\n //Pagination\r\n $scope.current = {\r\n equipmentPage: 1,\r\n usersPage: 1\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n $scope.open = function() {\r\n let modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: $scope.maxSelection === 1,\r\n requiresSelection: false,\r\n prefilter: function() {\r\n return processPreFilter($scope.prefilter);\r\n },\r\n maxSelection: function() {\r\n return $scope.maxSelection;\r\n },\r\n selectedAssets: function() {\r\n let selected = {};\r\n\r\n if ($scope.schedule.selectedAssets) {\r\n for (let i = 0; i < $scope.schedule.selectedAssets.length; i++) {\r\n let e = $scope.schedule.selectedAssets[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n pickerSettings: () => ({canSelectAll: true})\r\n }\r\n });\r\n\r\n modalInstance.result.then(function(selectedAssets) {\r\n let arr = [];\r\n for (let key in selectedAssets.result) {\r\n arr.push(selectedAssets.result[key]);\r\n }\r\n $scope.schedule.selectedAssets = arr;\r\n $scope.numSelectedAssets = $scope.schedule.selectedAssets.length;\r\n });\r\n };\r\n\r\n $scope.toggleAnimation = function() {\r\n $scope.animationsEnabled = !$scope.animationsEnabled;\r\n };\r\n\r\n let gatherDataNewReq = function(scheduleAttributes) {\r\n $scope.schedule = scheduleAttributes;\r\n $scope.schedule.startDate = moment($scope.schedule.startDate).toDate();\r\n $scope.schedule.startDate.setHours(\r\n $scope.schedule.deliveryTime.dateTime.getHours(),\r\n $scope.schedule.deliveryTime.dateTime.getMinutes()\r\n );\r\n for (let key in $scope.schedule.reportParameters) {\r\n if ($scope.schedule.reportParameters.hasOwnProperty(key)) {\r\n switch (key) {\r\n case 'AccountId':\r\n $scope.schedule.reportParameters[key] = $scope.user.account.id;\r\n break;\r\n case 'UserName':\r\n $scope.schedule.reportParameters[key] = $scope.user.username;\r\n break;\r\n case 'drop_DateRange':\r\n $scope.schedule.reportParameters[key] = $scope.schedule.dateRange.id;\r\n break;\r\n case 'UserTZ':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.timezone\r\n ? moment.tz(Date.now(), $scope.user.claims.data.timezone).format('z')\r\n : 'UTC';\r\n break;\r\n case 'UserUOM':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.unitOfMeasure;\r\n break;\r\n case 'TimeZoneId':\r\n $scope.schedule.reportParameters[key] = $scope.user.claims.data.timezone\r\n ? $scope.user.claims.data.timezone\r\n : 'UTC';\r\n break;\r\n }\r\n }\r\n }\r\n let data = {\r\n jobName: $scope.schedule.jobName,\r\n reportPath: $scope.schedule.reportPath,\r\n reportName: $scope.schedule.reportName,\r\n startAt: $scope.schedule.startDate,\r\n recurrence: {\r\n frequency: $scope.schedule.recurrence,\r\n interval: 1\r\n },\r\n contacts: $scope.schedule.contacts,\r\n reportParameters: $scope.schedule.reportParameters,\r\n tags: [$scope.tag],\r\n\r\n attrs: {\r\n scheme: 'reports',\r\n type: $scope.schedule.type\r\n },\r\n equipment: (function() {\r\n let arr = [];\r\n angular.forEach($scope.schedule.selectedAssets, function(asset) {\r\n if (typeof asset === 'string') {\r\n arr.push({\r\n id: asset,\r\n name: asset\r\n });\r\n } else {\r\n arr.push({\r\n id: asset.id,\r\n name: asset.name\r\n });\r\n }\r\n });\r\n return arr;\r\n })()\r\n };\r\n $scope.schedule.data = data;\r\n return $scope.schedule;\r\n };\r\n let isValid = function(schedule) {\r\n let diff = schedule.startDate.getTime() - schedule.minDate.getTime();\r\n let minDifference = -60000;\r\n const validAssets = schedule.reportDoesNotRequireAssets ? true : schedule.selectedAssets.length > 0;\r\n if (\r\n schedule.jobName &&\r\n validAssets &&\r\n schedule.contacts.length > 0 &&\r\n schedule.contacts.length <= $scope.maxEmails &&\r\n schedule.dateRange &&\r\n schedule.startDate &&\r\n schedule.deliveryTime.dateTime &&\r\n diff > minDifference\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.updateSchedule = function() {\r\n //update\r\n $scope.submitted = true;\r\n $scope.numSelectedAssets = $scope.schedule.selectedAssets.length;\r\n $scope.schedule.minDate = moment().toDate();\r\n if ($scope.schedule.minDate > $scope.schedule.startDate) {\r\n $scope.schedule.minDate = $scope.schedule.startDate;\r\n }\r\n $scope.maxEmails = $scope.maxEmails ? $scope.maxEmails : $scope.schedule.contacts.length;\r\n if (!isValid($scope.schedule)) {\r\n return false;\r\n }\r\n $scope.updating = true;\r\n\r\n let newData = gatherDataNewReq($scope.schedule);\r\n JobSchedulerService.updateSchedule(newData).then(\r\n function() {\r\n $scope.updating = false;\r\n $state.go('reports.jobscheduledetail', {\r\n id: $scope.schedule.id\r\n });\r\n },\r\n function() {\r\n $scope.updating = false;\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString('Unexpected error occurred while updating the schedule');\r\n }\r\n );\r\n };\r\n}\r\n","\r\nimport 'angular-jquery-timepicker';\r\nimport CreateJobScheduleDirective from './_form-schedule.directive';\r\nimport JobCreateController from './job.create.controller';\r\nimport { JobDeleteModalController, JobDetailController } from './job.detail.controller';\r\nimport JobUpdateController from './job.update.controller';\r\n\r\nconst jobModule = angular.module('app.jobschedules.job', [\r\n 'ui.timepicker'\r\n])\r\n.directive('createJobSchedule', [ CreateJobScheduleDirective ])\r\n.controller('JobCreateController', JobCreateController)\r\n.controller('JobDeleteModalController', JobDeleteModalController)\r\n.controller('JobDetailController', JobDetailController)\r\n.controller('JobUpdateController', JobUpdateController);\r\n\r\nexport default jobModule.name;\r\n","import moment from 'moment';\r\nexport default function CreateJobScheduleDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./_form-schedule.html'),\r\n scope: {\r\n schedule: '=',\r\n edit: '=',\r\n dropDowntimes: '=',\r\n submitted: '='\r\n },\r\n controller: CreateJobScheduleController\r\n };\r\n\r\n function CreateJobScheduleController($scope, gettextCatalog) {\r\n 'ngInject';\r\n $scope.$on('totalEmails', function(event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n $scope.$emit('totalEmails', {\r\n length: $scope.maxEmails\r\n });\r\n });\r\n\r\n $scope.time1 = $scope.schedule.deliveryTime\r\n ? moment($scope.schedule.deliveryTime.dateTime).toDate()\r\n : moment('May 19, 2016 00:00:00').toDate(); // only the hours and minutes are cared\r\n let today = moment().toDate();\r\n today.setHours(0, 0);\r\n\r\n $scope.showMeridian = true;\r\n $scope.startDate = moment().toDate();\r\n $scope.endDate = moment().toDate();\r\n\r\n $scope.hstep = 1;\r\n $scope.mstep = 15;\r\n $scope.options = {\r\n hstep: [1, 2, 3],\r\n mstep: [1, 5, 10, 15, 25, 30]\r\n };\r\n $scope.ismeridian = true;\r\n $scope.toggleMode = function() {\r\n $scope.ismeridian = !$scope.ismeridian;\r\n };\r\n\r\n $scope.changed = function() {\r\n $scope.schedule.deliveryTime.dateTime = $scope.time1;\r\n };\r\n\r\n $scope.clear = function() {\r\n $scope.schedule.deliveryTime.dateTime = null;\r\n };\r\n\r\n //Constants\r\n $scope.dateRangeOptions = [\r\n {\r\n label: gettextCatalog.getString('Days'),\r\n value: 'day'\r\n },\r\n {\r\n label: gettextCatalog.getString('Weeks'),\r\n value: 'week'\r\n },\r\n {\r\n label: gettextCatalog.getString('Months'),\r\n value: 'month'\r\n },\r\n {\r\n label: gettextCatalog.getString('Years'),\r\n value: 'year'\r\n }\r\n ];\r\n\r\n function prefetchTime() {\r\n $scope.schedule.deliveryTime = {};\r\n $scope.schedule.deliveryTime.dateTime = $scope.time1;\r\n }\r\n\r\n $scope.formats = ['MM-dd-yyyy', 'yyyy/MM/dd', 'MM/dd/yyyy', 'dd.MM.yyyy', 'shortDate'];\r\n $scope.format = $scope.formats[1];\r\n\r\n // today.setHours(0,0);\r\n let minDate = $scope.schedule.deliveryTime ? $scope.schedule.deliveryTime.dateTime : today;\r\n if (minDate > today) {\r\n minDate = today;\r\n }\r\n $scope.schedule.minDate = minDate;\r\n $scope.schedule.startDate = moment($scope.schedule.startDate).toDate();\r\n if ($scope.schedule.startDate === 'Invalid Date') {\r\n $scope.schedule.startDate = undefined;\r\n } else {\r\n $scope.schedule.startDate.setHours(0, 0);\r\n $scope.schedule.minDate.setHours(0, 0);\r\n }\r\n\r\n $scope.dateOptions = {\r\n formatYear: 'yy',\r\n maxDate: moment()\r\n .add(5, 'years')\r\n .toDate(),\r\n minDate: moment(minDate).toDate(),\r\n startingDay: 1\r\n };\r\n\r\n $scope.openStart = function() {\r\n $scope.startOpened = true;\r\n };\r\n\r\n $scope.openEnd = function() {\r\n $scope.endOpened = true;\r\n };\r\n prefetchTime();\r\n }\r\n}\r\n","export default function JobsController(\r\n $scope,\r\n $filter,\r\n $uibModal,\r\n JobSchedulerService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.disableView = false;\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n $scope.query = '';\r\n $scope.schedule = {};\r\n\r\n //defualt onei3 schedule report tag\r\n $scope.tag = 'onei3:schedule:report';\r\n\r\n //Local Variables\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.schedules = [];\r\n $scope.filteredSchedules = [];\r\n $scope.schedulesByPage = [];\r\n //Sorting\r\n $scope.predicate = 'jobName';\r\n $scope.reverse = true;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 25;\r\n $scope.maxSize = 3;\r\n\r\n //Sort filteredSchedules\r\n $scope.orderSchedule = function (predicate, toggle) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : toggle;\r\n $scope.predicate = predicate;\r\n };\r\n\r\n var isAllChecked = function (schedulesInPage) {\r\n var bool = true;\r\n for (var i = 0; i < schedulesInPage.length; i++) {\r\n if (\r\n schedulesInPage[i].checkForRemoval == undefined ||\r\n schedulesInPage[i].checkForRemoval == false\r\n ) {\r\n bool = false;\r\n break;\r\n }\r\n }\r\n return bool;\r\n };\r\n\r\n $scope.checkAllFilteredSchedulesforRemoval = function () {\r\n if ($scope.selectedAll) {\r\n $scope.selectedAll = true;\r\n } else {\r\n $scope.selectedAll = false;\r\n }\r\n angular.forEach($scope.schedulesByPage, function (schedule) {\r\n schedule.checkForRemoval = $scope.selectedAll;\r\n });\r\n };\r\n $scope.applyChange = function () {\r\n $scope.selectedAll = isAllChecked($scope.schedulesByPage);\r\n };\r\n\r\n $scope.getNotificationEmails = function (schedule) {\r\n return JobSchedulerService.getNotificationEmails(schedule);\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n $scope.selectedAll = isAllChecked($scope.schedulesByPage);\r\n };\r\n\r\n //applyFilter searchs the Schedules[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredSchedules = $filter('filter')($scope.schedules, $scope.search.text);\r\n };\r\n $scope.disableRemoveButton = function () {\r\n var bool = true;\r\n for (var i = 0; i < $scope.schedules.length; i++) {\r\n if ($scope.schedules[i].checkForRemoval == true) {\r\n bool = false;\r\n break;\r\n }\r\n }\r\n return bool;\r\n };\r\n\r\n $scope.search = function (schedule) {\r\n if ($scope.query.length <= 0) return true;\r\n var query = ('' + $scope.query).toLowerCase(),\r\n fullname = [schedule.name].join(' ').toLowerCase();\r\n return fullname.indexOf(query) > -1;\r\n };\r\n\r\n $scope.order = function (predicate) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.removeSelectedButtonPressed = function () {\r\n $scope.disableView = true;\r\n angular.forEach($scope.schedules, function (schedule) {\r\n if (schedule.checkForRemoval == true) {\r\n JobSchedulerService.deleteSchedule(schedule);\r\n }\r\n });\r\n setTimeout(refreshSchedules, 2000);\r\n };\r\n\r\n $scope.deleteSelected = function (scheduleToDelete) {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n keyboard: false,\r\n backdrop: 'static',\r\n template: require('./_delete.schedule.confirmation.modal.html'),\r\n controller: function ($scope, $uibModalInstance, $state, scheduleToDelete) {\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.schedule = scheduleToDelete;\r\n\r\n $scope.ok = function () {\r\n $scope.loading = true;\r\n\r\n JobSchedulerService.deleteSchedule(scheduleToDelete)\r\n .then(\r\n function (response) {\r\n $uibModalInstance.close(scheduleToDelete);\r\n },\r\n function (response) {\r\n $uibModalInstance.dismiss(gettextCatalog.getString('Error deleting schedule'));\r\n $scope.errorFlag = true;\r\n },\r\n )\r\n .finally(function (result) {\r\n $scope.loading = false;\r\n });\r\n };\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n },\r\n size: 'sm',\r\n resolve: {\r\n scheduleToDelete: function () {\r\n return scheduleToDelete;\r\n },\r\n },\r\n });\r\n modalInstance.result.then(\r\n function (scheduleToDelete) {\r\n refreshSchedules();\r\n },\r\n function (result) {\r\n $scope.$broadcast('refreshSchedules', true);\r\n },\r\n );\r\n };\r\n\r\n var refreshSchedules = function () {\r\n $scope.loading = true;\r\n\r\n JobSchedulerService.getSchedules($scope.tag)\r\n .then(\r\n function (response) {\r\n $scope.schedules = response.data.data;\r\n $scope.filteredSchedules = $scope.schedules.slice();\r\n $scope.disableView = false;\r\n //add additional properties to the filteredSchedules\r\n angular.forEach($scope.filteredSchedules, function (schedule) {\r\n schedule.checkForRemoval = false;\r\n schedule.recurrence = schedule.recurrence.frequency;\r\n schedule.emails = $scope.getNotificationEmails(schedule);\r\n });\r\n $scope.orderSchedule($scope.predicate, $scope.reverse);\r\n },\r\n function (response) {\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString(\r\n 'Sorry for the inconvenience. The scheduler service is down. Please try again later.',\r\n );\r\n },\r\n )\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n };\r\n refreshSchedules();\r\n $scope.$on('refreshSchedules', function (event, data) {\r\n refreshSchedules();\r\n });\r\n\r\n //modal overlay update schedule\r\n $scope.updateSchedule = function (schedule) {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n keyboard: false,\r\n backdrop: 'static',\r\n template: require('./job/job.update.html'),\r\n controller: 'JobCreateController',\r\n size: 'lg',\r\n resolve: {\r\n scheduleAttributes: function () {\r\n return $scope.schedule;\r\n },\r\n },\r\n });\r\n modalInstance.result.then(\r\n function (scheduleAttributes) {\r\n refreshSchedules();\r\n },\r\n function () {\r\n console.log('update error');\r\n $scope.$broadcast('refreshSchedules', true);\r\n },\r\n );\r\n }; //modal overlay update schedule\r\n\r\n //modal overlay create schedule\r\n $scope.createSchedule = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n keyboard: false,\r\n backdrop: 'static',\r\n template: require('./job/job.create.html'),\r\n controller: 'JobCreateController',\r\n size: 'lg',\r\n resolve: {\r\n scheduleAttributes: function () {\r\n return $scope.schedule;\r\n },\r\n },\r\n });\r\n modalInstance.result.then(\r\n function (scheduleAttributes) {\r\n refreshSchedules();\r\n },\r\n function () {},\r\n );\r\n }; // end modal overlay create schedule\r\n\r\n $scope.formatDate = function (date) {\r\n // return date;\r\n if (date == undefined) return '';\r\n var date = new Date(date);\r\n var strDate = toJSONLocal(date);\r\n strDate = strDate.split('-');\r\n return strDate[1] + '/' + strDate[2] + '/' + strDate[0] + ' ' + formatTime(date);\r\n };\r\n\r\n function toJSONLocal(date) {\r\n var local = new Date(date);\r\n local.setMinutes(date.getMinutes() - date.getTimezoneOffset());\r\n return local.toJSON().slice(0, 10);\r\n }\r\n\r\n function toLocal(date) {\r\n var local = new Date(date);\r\n local.setMinutes(date.getMinutes() - date.getTimezoneOffset());\r\n return local.toJSON();\r\n }\r\n\r\n function formatTime(dateObj) {\r\n // formats a javascript Date object into a 12h AM/PM time string\r\n var hour = dateObj.getHours();\r\n var minute = dateObj.getMinutes();\r\n var amPM = hour > 11 ? ' PM' : ' AM';\r\n if (hour > 12) {\r\n hour -= 12;\r\n } else if (hour == 0) {\r\n hour = '12';\r\n }\r\n if (minute < 10) {\r\n minute = '0' + minute;\r\n }\r\n if (hour < 10) {\r\n hour = '0' + hour;\r\n }\r\n return hour + ':' + minute + amPM;\r\n }\r\n}\r\n","// PrintScheduleDateRange\r\n\r\nexport default function PrintScheduleDateRange( JobSchedulerService ) {\r\n\t\"ngInject\";\r\n\treturn function ( input, optional1, optional2 ) {\r\n if ( !input ) return \"\";\r\n\r\n return JobSchedulerService.getDateRange( input, true );\r\n };\r\n}\r\n","import 'angular-ui-router';\r\nimport 'angular-ui-bootstrap';\r\nimport 'angular-breadcrumb';\r\n\r\n/* Module Imports */\r\nimport jobSchedulesJobModule from './job/job.module';\r\n\r\n/* Additional Imports */\r\nimport JobsController from './jobs.controller';\r\n\r\n/* Filters */\r\nimport PrintScheduleDateRange from './job/filters/printScheduleDateRange.filter';\r\n\r\nconst jobSchedulesModule = angular\r\n\t.module('app.jobschedules', [\r\n\t\t//INTERNAL\r\n\t\tjobSchedulesJobModule,\r\n\r\n\t\t//THIRD PARTY\r\n\t\t'ui.router',\r\n\t\t'ui.bootstrap',\r\n\t\t'ncy-angular-breadcrumb'\r\n\t])\r\n\t.controller('JobsController', JobsController)\r\n\t.filter('printScheduleDateRange', PrintScheduleDateRange);\r\n\r\nexport default jobSchedulesModule.name;\r\n","export default function FormAssetListController($rootScope, $scope, $uibModal) {\r\n 'ngInject';\r\n\r\n let flag = false;\r\n\r\n $scope.numSelectedAssets = function() {\r\n if (!$scope.param._selected || !$scope.param) return 0;\r\n\r\n return Object.keys($scope.param._selected).length;\r\n };\r\n\r\n $scope.selectedAssets = function() {\r\n return $scope.param._selected;\r\n };\r\n\r\n function processPreFilter(input) {\r\n let prefilter = {};\r\n if (typeof input === 'string') {\r\n let unescaped = (input || '').replace(/\\\\/g, '\"');\r\n prefilter = JSON.parse(unescaped);\r\n } else if (typeof input === 'object') {\r\n prefilter = input;\r\n }\r\n\r\n return prefilter;\r\n }\r\n\r\n $scope.selectAssetsButtonPressed = function() {\r\n if (parseInt($scope.maxSelection) === 1) {\r\n flag = true;\r\n }\r\n $rootScope.datapointsSelected = [];\r\n\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: flag,\r\n requiresSelection: false,\r\n prefilter: function() {\r\n return processPreFilter($scope.prefilter);\r\n },\r\n maxSelection: function() {\r\n return $scope.maxSelection;\r\n },\r\n selectedAssets: function() {\r\n return {...$scope.param._selected};\r\n },\r\n pickerSettings: () => ({canSelectAll: !flag})\r\n }\r\n });\r\n\r\n modalInstance.result.then(function(selectedAssets) {\r\n $scope.param._selected = selectedAssets.result;\r\n $rootScope.assetsSelected = selectedAssets.result;\r\n let assets = Object.keys(selectedAssets.result);\r\n\r\n for (let i = 0; i < assets.length; i++) {\r\n if (i === 0) {\r\n $scope.assetsSelected = assets[i];\r\n } else {\r\n $scope.assetsSelected = $scope.assetsSelected + ',' + assets[i];\r\n }\r\n }\r\n });\r\n };\r\n}\r\n","import moment from 'moment';\r\nimport 'moment-range';\r\nimport 'moment-timezone';\r\n\r\nconst DEFAULT_MAX_DAYS = 90;\r\nconst DEFAULT_MIN_MONTHS = 13;\r\nconst MAX_HOURLY_USAGE_DAYS = 30;\r\nconst MIN_HOURLY_USAGE_MONTHS = 1;\r\nconst HOURLY_ASSET_UTILIZATION = 'Hourly Asset Utilization';\r\n\r\nexport default function FormDateRangeController($scope) {\r\n 'ngInject';\r\n\r\n let vm = this;\r\n let maxDaysInRange =\r\n $scope.reportName === HOURLY_ASSET_UTILIZATION ? MAX_HOURLY_USAGE_DAYS : DEFAULT_MAX_DAYS;\r\n\r\n vm.maxDaysRange = maxDaysInRange;\r\n vm.minDateInMonths =\r\n $scope.reportName === HOURLY_ASSET_UTILIZATION ? MIN_HOURLY_USAGE_MONTHS : DEFAULT_MIN_MONTHS;\r\n\r\n // Public Variables\r\n\r\n vm.dateOptions = {\r\n fromDate: {\r\n formatYear: 'yy',\r\n startingDay: 1,\r\n initDate: moment().subtract(1, 'days').toDate(),\r\n minDate: moment().subtract(vm.minDateInMonths, 'months').toDate(),\r\n maxDate: moment().subtract(1, 'days').toDate(),\r\n },\r\n toDate: {\r\n formatYear: 'yy',\r\n startingDay: 1,\r\n initDate: moment().toDate(),\r\n minDate: moment().subtract(vm.minDateInMonths, 'months').toDate(),\r\n maxDate: moment().toDate(),\r\n },\r\n };\r\n\r\n vm.isSelected = {};\r\n vm.isStartGreaterThanEnd = false;\r\n vm.isEndendLowerThanStart = false;\r\n vm.isExceededRange = false;\r\n\r\n vm.dateChanged = dateChanged;\r\n vm.endOnClick = endOnClick;\r\n vm.startOnClick = startOnClick;\r\n vm.endLowerThanStart = endLowerThanStart;\r\n vm.startGreaterThanEnd = startGreaterThanEnd;\r\n vm.endDateLowerThanMin = endDateLowerThanMin;\r\n vm.exceededRange = exceededRange;\r\n vm.greaterThanToday = greaterThanToday;\r\n vm.lessThanMinDate = lessThanMinDate;\r\n\r\n vm.$onInit = () => {\r\n refresh();\r\n };\r\n\r\n // Public Functions\r\n function dateChanged(val, fromPicker) {\r\n if (val) {\r\n let today = moment();\r\n let dateAfterDateRange = moment();\r\n\r\n if (fromPicker) {\r\n dateAfterDateRange = moment(val).add(maxDaysInRange, 'days');\r\n } else {\r\n dateAfterDateRange = moment(val).subtract(maxDaysInRange, 'days'); // allow from date\r\n vm.dateOptions.fromDate.initDate = dateAfterDateRange.toDate();\r\n }\r\n\r\n if (fromPicker) {\r\n // make sure the range between from and to date doesn't exceed today date or the allowed range\r\n if (moment(dateAfterDateRange.toDate()).isAfter(today.toDate())) {\r\n vm.dateOptions.toDate.maxDate = today.toDate();\r\n vm.dateOptions.toDate.initDate = today.toDate();\r\n } else {\r\n vm.dateOptions.toDate.maxDate = dateAfterDateRange.toDate();\r\n vm.dateOptions.toDate.initDate = dateAfterDateRange.toDate();\r\n }\r\n //when to date has been set up before from\r\n if ($scope.date.end) {\r\n if (moment($scope.date.end).isAfter(dateAfterDateRange.toDate())) {\r\n $scope.date.end = null;\r\n vm.maxDateRangeExceeded = true;\r\n }\r\n }\r\n }\r\n\r\n //more validations\r\n vm.exceededRange(maxDaysInRange);\r\n if ($scope.date.end) {\r\n vm.endLowerThanStart();\r\n }\r\n if ($scope.date.start) {\r\n vm.startGreaterThanEnd();\r\n }\r\n } else {\r\n vm.dateOptions.toDate.maxDate = moment().toDate();\r\n vm.dateOptions.toDate.initdate = moment().toDate();\r\n }\r\n }\r\n\r\n function endOnClick() {\r\n openEnd();\r\n vm.isSelected.toDate = false;\r\n vm.isSelected.fromDate = true;\r\n }\r\n\r\n function startOnClick() {\r\n openStart();\r\n vm.isSelected.toDate = true;\r\n vm.isSelected.fromDate = false;\r\n }\r\n\r\n function exceededRange(numMaximumDaysAllowed) {\r\n if (numMaximumDaysAllowed && $scope.date.end && $scope.date.start) {\r\n const range = moment.range($scope.date.start, $scope.date.end);\r\n const diff = range.diff('days');\r\n vm.isExceededRange = diff > numMaximumDaysAllowed;\r\n if (vm.isExceededRange) return;\r\n }\r\n if (vm.maxDateRangeExceeded) {\r\n vm.maxDateRangeExceeded = !vm.maxDateRangeExceeded;\r\n }\r\n vm.isExceededRange = vm.maxDateRangeExceeded;\r\n }\r\n\r\n function greaterThanToday(date) {\r\n return moment(date).isAfter(moment().endOf('day'));\r\n }\r\n\r\n function lessThanMinDate(date) {\r\n if (date && vm.dateOptions.fromDate.minDate) {\r\n // uses 'day' for granularity so that it does not compare teh time\r\n return moment(date).isBefore(vm.dateOptions.fromDate.minDate, 'day');\r\n }\r\n }\r\n\r\n function endLowerThanStart() {\r\n vm.isEndLowerThanStart = moment($scope.date.start).isAfter($scope.date.end, 'day');\r\n }\r\n\r\n function endDateLowerThanMin() {\r\n if (\r\n (($scope.date.end && $scope.reportForm.dt_EndDate.$error.dateGreaterThan) ||\r\n $scope.csvForm.dt_EndDate.$error.dateGreaterThan) &&\r\n vm.isSelected.fromDate\r\n ) {\r\n //ending 7 day period field\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n function startGreaterThanEnd() {\r\n if (\r\n $scope.date.start &&\r\n $scope.date.end &&\r\n moment($scope.date.start).isAfter($scope.date.end) &&\r\n vm.isSelected.toDate\r\n ) {\r\n vm.isStartGreaterThanEnd = true;\r\n } else {\r\n vm.isStartGreaterThanEnd = false;\r\n }\r\n }\r\n\r\n // Private Functions\r\n\r\n function refresh() {\r\n let minDate;\r\n //reset the end date when the templates are swapped or residual value interferes in the form validation\r\n $scope.date.end = null; // the scope value is defined in the parent controller\r\n\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if ($scope.parametersData[i].name === 'dt_StartDate') {\r\n $scope.date.start = $scope.parametersData[i].defaultValues[0];\r\n } else if ($scope.parametersData[i].name === 'dt_EndDate') {\r\n $scope.date.end === $scope.parametersData[i].defaultValues[0];\r\n } else if ($scope.parametersData[i].name === 'date_PickRange') {\r\n minDate = $scope.parametersData[i].defaultValues[0];\r\n maxDaysInRange = parseInt(minDate);\r\n }\r\n }\r\n }\r\n\r\n function openEnd() {\r\n vm.endOpened = true;\r\n }\r\n\r\n function openStart() {\r\n vm.startOpened = true;\r\n }\r\n}\r\n","/* Additional Imports */\r\nimport FormAssetListController from './_form.AssetList.controller';\r\nimport FormDateRangeController from './_form.drop_DateRange.controller';\r\n\r\nconst reportParameterModule = angular\r\n\t.module('app.reportPara', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n\t.controller('FormAssetListController', FormAssetListController)\r\n\t.controller('FormDateRangeController', FormDateRangeController);\r\n\r\nexport default reportParameterModule.name;\r\n","const LOCATION_SIGNAL_DATAPOINT = {\r\n id: 'fix_quality',\r\n description: 'Location Signal Quality',\r\n checkedDatapoint: false\r\n};\r\n\r\nconst FIRMWARE_VERSION_DATAPOINT = {\r\n id: 'firmware_ver',\r\n description: 'Device Firmware Version',\r\n checkedDatapoint: false\r\n};\r\n\r\nconst CONFIGURATION_VERSION_DATAPOINT = {\r\n id: 'config_ver',\r\n description: 'Device Configuration Version',\r\n checkedDatapoint: false\r\n};\r\n\r\nexport default function DatapointMultiPickerController(\r\n $rootScope,\r\n $scope,\r\n $filter,\r\n usersService,\r\n EquipmentService,\r\n $uibModalInstance,\r\n selectedDatapoints,\r\n assetsSelected,\r\n singleSelect,\r\n maxSelection,\r\n includeDiagnosticDatapoints,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n var tag = 'DatapointMultiPickerController';\r\n\r\n //INIT LOCAL VARIABLES\r\n $scope.loading = true;\r\n $scope.success = false;\r\n $scope._selectedDatapoints = selectedDatapoints ? selectedDatapoints : {};\r\n $scope.unavailableDatapoints = {};\r\n if (singleSelect) {\r\n $scope.unavailableDatapoints = angular.copy($scope._selectedDatapoints);\r\n $scope._selectedDatapoints = {};\r\n }\r\n\r\n $scope.isDirty = false;\r\n\r\n $scope.filters = {};\r\n $scope.currentPage = 1;\r\n $scope.pages = [];\r\n $scope.limit = 15;\r\n $scope.maxSize = 1;\r\n $scope.firstPage = 'First';\r\n $scope.lastPage = 'Last';\r\n $scope.select = {};\r\n $scope.select.all = false;\r\n $scope.infoMessage = '';\r\n $scope.selectLimit = parseInt(maxSelection);\r\n $scope.filterCount = 0;\r\n $scope.singleMode = singleSelect;\r\n //Pagination\r\n $scope.currentPageSelectedDatapoints = [];\r\n $scope.bigCurrentPage = 1;\r\n $scope.itemsPerPage = 300;\r\n\r\n $scope.facets = null;\r\n\r\n //Sorting\r\n $scope.predicate1 = 'description';\r\n $scope.reverse1 = true;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderDataPoints = function(predicate1) {\r\n $scope.predicate1 = predicate1;\r\n $scope.reverse1 = $scope.predicate1 === predicate1 ? !$scope.reverse1 : false;\r\n\r\n angular.forEach($scope.filteredDataPoints, function(datapoint) {\r\n datapoint[predicate1] = datapoint[predicate1];\r\n });\r\n $scope.filteredDataPoints = orderBy($scope.filteredDataPoints, predicate1, $scope.reverse1);\r\n $scope.displayDataPointsByPage();\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n page: 1,\r\n policyPage: 1\r\n };\r\n $scope.maxSize = 1;\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredUserRoles.\r\n $scope.displayDataPointsByPage = function() {\r\n $scope.totalItems = $scope.filteredDataPoints.length;\r\n var begin = ($scope.current.page - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.dataPointsByPage = $scope.filteredDataPoints.slice(begin, end);\r\n $scope.select.all = isDataPointsInthePageAllSelected($scope.dataPointsByPage);\r\n $scope.loading = false;\r\n };\r\n\r\n var isDataPointsInthePageAllSelected = function(allDataPointsInthePage) {\r\n var arr = Object.keys($scope._selectedDatapoints);\r\n for (var i = 0; i < allDataPointsInthePage.length; i++) {\r\n if (!$scope._selectedDatapoints[allDataPointsInthePage[i].id]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredUserRoles.\r\n $scope.displaySelectedDataPointsByPage = function() {\r\n // $scope.totalItems = $scope.numSelectedDatapoints();\r\n var begin = ($scope.bigCurrentPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n var arr = Object.keys($scope._selectedDatapoints).slice(begin, end);\r\n for (var i = 0; i < arr.length; i++) {\r\n if (arr[i] === 'undefined') {\r\n delete $scope._selectedDatapoints[arr[i]];\r\n }\r\n }\r\n return Object.keys($scope._selectedDatapoints).slice(begin, end);\r\n };\r\n //Calls displayUserRolesByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function() {\r\n $scope.select.all = false;\r\n $scope.displayDataPointsByPage();\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function() {\r\n if ($scope.search === undefined) {\r\n $scope.search = {};\r\n $scope.search.query = '';\r\n }\r\n $scope.filteredDataPoints = $filter('filter')($scope.datapoints, $scope.search.query);\r\n $scope.displayDataPointsByPage();\r\n };\r\n\r\n $scope.getSelectedDatapoints = function() {\r\n var datapoints = [];\r\n for (var key in $scope._selectedDatapoints) {\r\n if ($scope._selectedDatapoints.hasOwnProperty(key)) {\r\n datapoints.push(key);\r\n $scope.size++;\r\n }\r\n }\r\n return datapoints;\r\n };\r\n\r\n var deselectDatapoint = function(datapoint) {\r\n if (!datapoint) return;\r\n if ($scope.unavailableDatapoints[datapoint.id]) return;\r\n datapoint.selected = false;\r\n\r\n delete $scope._selectedDatapoints[datapoint.id];\r\n $scope.select.all = false;\r\n };\r\n\r\n $scope.selectAll = function() {\r\n if ($scope.select.all) {\r\n for (var i = 0; i < $scope.dataPointsByPage.length; i++) {\r\n if ($scope.selectLimit > 0 && $scope.numSelectedDatapoints() >= $scope.selectLimit) {\r\n $scope.infoMessage = 'Only ' + maxSelection + ' datapoint(s) can be selected at this time.';\r\n break;\r\n }\r\n $scope._selectedDatapoints[$scope.dataPointsByPage[i].id] = $scope.dataPointsByPage[i];\r\n }\r\n } else if (!$scope.select.all) {\r\n for (var i = 0; i < $scope.dataPointsByPage.length; i++) {\r\n deselectDatapoint($scope.dataPointsByPage[i]);\r\n }\r\n }\r\n };\r\n\r\n $scope.isAllDatapointSelected = function() {\r\n for (var i = 0; i < $scope.datapoints.length; i++) {\r\n var hasSelected = false;\r\n for (var key in $scope._selectedDatapoints) {\r\n if ($scope.datapoints[i].id == key) {\r\n hasSelected = true;\r\n break;\r\n }\r\n }\r\n if (!hasSelected) return false;\r\n }\r\n return true;\r\n };\r\n\r\n //WATCH FUNCTIONS\r\n $scope.$watch(\r\n 'filters',\r\n function(newValue, oldValue) {\r\n $scope.currentPage = 1;\r\n // refresh();\r\n },\r\n true\r\n );\r\n\r\n //PUBLIC METHODS\r\n $scope.selectPage = function(page) {\r\n $scope.select.all = false;\r\n $scope.selectedPage = page;\r\n // refresh();\r\n };\r\n\r\n $scope.submitQuery = function(searchString) {\r\n $scope.filters.queryString = searchString;\r\n $scope.selectedPage = 1;\r\n $scope.lastSearchQuery = searchString; //store the search value entered in the textbox, so that it can be saved as part of the saved search\r\n };\r\n\r\n $rootScope.selectDatapoint = function(datapoint) {\r\n if (!datapoint) return;\r\n if ($scope.unavailableDatapoints[datapoint.id]) return;\r\n\r\n if (!singleSelect) {\r\n if (!$scope._selectedDatapoints[datapoint.id]) {\r\n if (parseInt(maxSelection) === 0) {\r\n datapoint.checkedDatapoint = true;\r\n $scope._selectedDatapoints[datapoint.id] = datapoint;\r\n } else if ($scope.numSelectedDatapoints() >= parseInt(maxSelection)) {\r\n $scope.infoMessage = 'Only ' + maxSelection + ' datapoint(s) can be selected at this time.';\r\n } else {\r\n $scope._selectedDatapoints[datapoint.id] = datapoint;\r\n }\r\n } else {\r\n deselectDatapoint(datapoint);\r\n\r\n if ($scope.numSelectedDatapoints() < maxSelection) {\r\n $scope.infoMessage = '';\r\n }\r\n }\r\n } else {\r\n if (!$scope._selectedDatapoints[datapoint.id]) {\r\n $scope._selectedDatapoints = {};\r\n $scope._selectedDatapoints[datapoint.id] = datapoint;\r\n } else {\r\n delete $scope._selectedDatapoints[datapoint.id];\r\n }\r\n }\r\n\r\n $scope.select.all = $scope.isAllDatapointSelected();\r\n };\r\n\r\n $scope.removeDatapoint = function(datapoint, e) {\r\n if (!datapoint) return;\r\n\r\n deselectDatapoint(datapoint);\r\n };\r\n\r\n $scope.removeAllSelectedDataPoints = function() {\r\n // _selectedDatapoints[datapoint]\r\n $scope._selectedDatapoints = {};\r\n $scope.select.all = false;\r\n };\r\n\r\n $scope.numSelectedDatapoints = function() {\r\n // return $scope.datapointsSelectedCount;\r\n return Object.keys($scope._selectedDatapoints).length;\r\n };\r\n\r\n //BUTTON EVENTS\r\n $scope.confirm = function() {\r\n $uibModalInstance.close($scope._selectedDatapoints);\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n var closeModal = function() {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n // Here you can take the control and call your own functions:\r\n\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n function preselectDatapoints(data) {\r\n angular.forEach($scope.displayDataPointsByPage(), function(datapoint) {\r\n angular.forEach($rootScope.selectedDatapoints, function(datapointId) {\r\n if (Datapoint.id == DatapointId) {\r\n $scope._selectedDatapoints[datapointId] = datapoint;\r\n }\r\n });\r\n });\r\n }\r\n\r\n function preselectEquips(alreadyPickedEquips) {\r\n angular.forEach(alreadyPickedEquips, function(equip) {\r\n // equip object\r\n var datapoint = {};\r\n if (typeof equip === 'string') {\r\n datapoint = {\r\n id: equip,\r\n name: equip,\r\n pick: 'picked'\r\n };\r\n } else {\r\n datapoint = {\r\n id: equip.id,\r\n name: equip.name,\r\n pick: 'picked'\r\n };\r\n }\r\n $scope._selectedDatapoints[datapoint.id] = datapoint;\r\n });\r\n }\r\n\r\n const getRoleDatapoints = function() {\r\n usersService.getDatapoints().then(\r\n function(response) {\r\n const dataPointObjs = {};\r\n\r\n $scope.datapoints = response.data;\r\n\r\n angular.forEach($scope.datapoints, function(obj) {\r\n obj['checkedDatapoint'] = false;\r\n dataPointObjs[obj.id] = obj;\r\n });\r\n\r\n $scope.datapointsSelectedCount = $scope.datapoints.length;\r\n\r\n $scope.originalDatapoints = angular.copy($scope.datapoints);\r\n $scope.filteredDataPoints = $scope.datapoints;\r\n $scope.orderDataPoints('description', false);\r\n $scope.loading = false;\r\n $scope.displayDataPointsByPage();\r\n if ($scope.existingNames && $scope.rolePolicies) {\r\n $scope.loading = false;\r\n }\r\n getDatapointsByAssetIds(assetsSelected, dataPointObjs);\r\n },\r\n function(error) {\r\n var errorMsg = 'An error occurred';\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n const getDatapointsByAssetIds = function (assetIds, dataPointObjs) {\r\n $scope.loading = true;\r\n\r\n EquipmentService.getSeriesByMultipleEquipment(Object.keys(assetIds)).then(\r\n (response) => {\r\n const dataPointIdSet = new Set();\r\n const noDuplicateDataPoints = [];\r\n const seriesData = response.data;\r\n let hasGPS = false;\r\n\r\n seriesData.forEach((item) => {\r\n const dataId = item.tags[0];\r\n\r\n if (dataPointIdSet.has(dataId) === false) {\r\n dataPointIdSet.add(dataId);\r\n\r\n const dataPoint = { ...dataPointObjs[dataId] };\r\n\r\n // Override series title with descriptor one, make sure data point name is consistent\r\n // between data point picker and asset detail page\r\n if (item.descriptor && item.descriptor.title) {\r\n dataPoint.en_description = item.descriptor.title;\r\n } else {\r\n dataPoint.en_description = item.title;\r\n }\r\n\r\n dataPoint.description = gettextCatalog.getString(dataPoint.en_description);\r\n\r\n noDuplicateDataPoints.push(dataPoint);\r\n if (dataId === 'gps') hasGPS = true;\r\n }\r\n });\r\n\r\n if (\r\n includeDiagnosticDatapoints &&\r\n usersService.hasRequiredFeatures(['assets.diagnostics'])\r\n ) {\r\n const cellSignal = dataPointObjs['ms_cell_signal'];\r\n if (cellSignal) {\r\n noDuplicateDataPoints.push(cellSignal);\r\n }\r\n\r\n if (hasGPS) {\r\n noDuplicateDataPoints.push(LOCATION_SIGNAL_DATAPOINT);\r\n }\r\n\r\n noDuplicateDataPoints.push(FIRMWARE_VERSION_DATAPOINT);\r\n noDuplicateDataPoints.push(CONFIGURATION_VERSION_DATAPOINT);\r\n }\r\n\r\n $scope.datapoints = noDuplicateDataPoints;\r\n $scope.applyFilter();\r\n $scope.loading = false;\r\n $scope.success = true;\r\n },\r\n (error) => {\r\n let errorMsg = 'An error occurred';\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n $scope.nameExists = function() {\r\n if (!$scope.roleName) {\r\n return false;\r\n }\r\n for (var i = 0; i < $scope.existingNames.length; i++) {\r\n if ($scope.roleName.toLowerCase() === $scope.existingNames[i].toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n // getExistingNames();\r\n getRoleDatapoints();\r\n\r\n $scope.datapointSelected = function(id) {\r\n for (var i = 0; i < $scope.datapointsDenied.length; i++) {\r\n if ($scope.datapointsDenied[i] === id) {\r\n $scope.datapointsDenied.splice(i, 1);\r\n // _selectedDatapoints[id] = $scope.datapointsDenied[i];\r\n $scope.datapointsSelectedCount++;\r\n return;\r\n }\r\n }\r\n $scope.datapointsDenied.push(id);\r\n // delete $scope._selectedDatapoints[id];\r\n $scope.datapointsSelectedCount--;\r\n };\r\n\r\n $scope.datapointsDenied = [];\r\n $scope.checkAllDatapoints = function() {\r\n $scope.datapointsDenied = [];\r\n\r\n for (var i = 0; i < $scope.filteredDataPoints.length; i++) {\r\n $scope.filteredDataPoints[i].checkedDatapoint = $scope.setAll.datapoints;\r\n\r\n if (!$scope.filteredDataPoints[i].checkedDatapoint) {\r\n $scope.datapointsDenied.push($scope.filteredDataPoints[i].id);\r\n }\r\n }\r\n\r\n if ($scope.setAll.datapoints) {\r\n $scope.datapointsSelectedCount = $scope.filteredDataPoints.length;\r\n } else $scope.datapointsSelectedCount = 0;\r\n };\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, datapointListCallback, preSelectedDatapoints, maxSelection) {\r\n 'ngInject';\r\n\r\n this.$uibModalInstance = $uibModalInstance;\r\n\r\n this.datapointListCallback = datapointListCallback();\r\n this.allDatapoints = [];\r\n this.selectedDatapoints = [...preSelectedDatapoints];\r\n this.loading = true;\r\n this.maxSelection = maxSelection;\r\n }\r\n\r\n $onInit() {\r\n this.datapointListCallback.then((result) => {\r\n if (result) {\r\n this.loading = false;\r\n this.allDatapoints = result || [];\r\n this.allDatapoints = this.allDatapoints\r\n .map((datapoint) => {\r\n return {\r\n ...datapoint,\r\n selected: !!this.selectedDatapoints.find(\r\n (selected) => selected.key === datapoint.key,\r\n ),\r\n };\r\n })\r\n .sort((a, b) => (a.title.toLowerCase() >= b.title.toLowerCase() ? 1 : -1));\r\n }\r\n });\r\n }\r\n\r\n confirm() {\r\n this.$uibModalInstance.close(this.selectedDatapoints);\r\n }\r\n\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n\r\n clickedDatapoint(datapoint) {\r\n const isAlreadySelected = this.selectedDatapoints.find(\r\n (selectedDatapoint) => selectedDatapoint.dataId === datapoint.dataId,\r\n );\r\n\r\n if (isAlreadySelected) {\r\n this.selectedDatapoints = this.selectedDatapoints.filter(\r\n (selectedDatapoint) => selectedDatapoint.dataId !== datapoint.dataId,\r\n );\r\n datapoint.selected = false;\r\n } else if (this.selectedDatapoints.length < this.maxSelection) {\r\n this.selectedDatapoints.push(datapoint);\r\n datapoint.selected = true;\r\n }\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport moment from 'moment';\r\nimport 'moment-range';\r\nimport 'moment-timezone';\r\nimport DatapointSelectorController from './datapointSelector/datapoint.selector.controller';\r\nimport DatapointSelectorHtml from './datapointSelector/datapoint.selector.html';\r\n\r\nimport { ParamterNames, ConstantValues } from '../models/report.model';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n analyticsViewReport: 'analyticsViewReport',\r\n analyticsDownloadReport: 'analyticsDownloadReport',\r\n analyticsScheduleReport: 'analyticsScheduleReport',\r\n};\r\n\r\nconst DATE_RANGE_STRINGS = {\r\n _7D: { value: '7d', tooltip: 'Last 7 days' },\r\n _30D: { value: '30d', tooltip: 'Last 30 days' },\r\n _90D: { value: '90d', tooltip: 'Last 90 days' },\r\n _MTD: { value: 'MTD', tooltip: 'Month to date' },\r\n _CUSTOM: {\r\n value: 'Custom',\r\n tooltip: 'Select a custom date window from the past 13 months for up to 90 days',\r\n },\r\n _CUSTOM_HOURLY: {\r\n value: 'Custom',\r\n tooltip: 'Only last 4 weeks of data is available',\r\n },\r\n _1W: { value: 'Last 1 Week', tooltip: 'Last 1 Week' },\r\n _2W: { value: 'Last 2 Weeks', tooltip: 'Last 2 Weeks' },\r\n _3W: { value: 'Last 3 Weeks', tooltip: 'Last 3 Weeks' },\r\n _4W: { value: 'Last 4 Weeks', tooltip: 'Last 4 Weeks' },\r\n};\r\n\r\nconst HOURLY_ASSET_UTILIZATION = 'Hourly Asset Utilization';\r\n\r\nexport default function ReportsDetailController(\r\n $scope,\r\n $sce,\r\n $q,\r\n $stateParams,\r\n usersService,\r\n appSettings,\r\n $uibModal,\r\n $rootScope,\r\n gettextCatalog,\r\n CSVDataExportService,\r\n reportingService,\r\n EquipmentService,\r\n) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n const DATE_FORMAT = 'YYYY-MM-DD';\r\n // const supportedLanguages = new Set(['fr', 'de']);\r\n\r\n function getReportPath() {\r\n // Quick hack for now just to prove that we can do translated reports.\r\n // Today we only have translated version for Asset Utilization Summary report.\r\n // In reality, this will be data-driven somehow.\r\n\r\n // Support for other languages has been removed\r\n // The languages that were supported for Asset Utilization Summary\r\n // only retrieved an empty report\r\n // All reports are now redirected to english.\r\n\r\n // const currentLanguage = gettextCatalog.currentLanguage;\r\n // let reportPath = $scope.reportPath;\r\n\r\n // if ($scope.reportName.includes('Asset Utilization Summary') && supportedLanguages.has(currentLanguage))\r\n // reportPath = `${reportPath} ${currentLanguage}`;\r\n // return reportPath;\r\n\r\n return $scope.reportPath;\r\n }\r\n\r\n vm.getReportPath = getReportPath;\r\n $scope.csvReport = {\r\n contacts: [],\r\n };\r\n $scope.maxEmails = 10;\r\n $scope.csvGenerated = false;\r\n $scope.reportName = $stateParams.reportName;\r\n $scope.reportId = $stateParams.reportId;\r\n $scope.isLoadingParameters = false;\r\n $scope.dateRangeType = undefined;\r\n $scope.attrs = {};\r\n\r\n $rootScope.datapointsSelected = {};\r\n $rootScope.selectedAssetsForDataPoints = [];\r\n $rootScope.selectDataPointsButtonEnabled = false;\r\n // report parameters\r\n $scope.reportParam = [];\r\n $scope.exportList = [];\r\n $scope.title = $scope.reportName;\r\n $scope.typeName = $stateParams.typeName;\r\n $scope.reportGenerated = false;\r\n $scope.btn = {};\r\n $scope.date = {};\r\n $scope.unitOfMeasure = '';\r\n $scope.maxSelection = 0;\r\n $scope.pressurethreshold = {};\r\n $scope.dropDate = false;\r\n\r\n // use to disable or enable button\r\n $scope.isValid = {\r\n startDate: false,\r\n endDate: false,\r\n dateDrop: true,\r\n };\r\n\r\n // because most our report will require asset except Arcoler report\r\n $scope.selectedAttributes = {\r\n dateRange: undefined,\r\n selectedAssets: [],\r\n reportParameters: {},\r\n typeName: $scope.typeName,\r\n reportDoesNotRequireAssets: false,\r\n };\r\n\r\n if ($rootScope.currentUser.email) {\r\n $scope.csvReport.contacts.push({\r\n email: $rootScope.currentUser.email,\r\n });\r\n }\r\n\r\n $scope.report = {\r\n name: $scope.reportName,\r\n };\r\n\r\n $scope.hideScheduleButton = function () {\r\n return (\r\n !$scope.dropDate ||\r\n ($scope.dateRangeType && $scope.dateRangeType.toLowerCase() === 'weekly') ||\r\n $scope.reportName === HOURLY_ASSET_UTILIZATION\r\n );\r\n };\r\n // Gets the path of the template for the parameters, some inputs are hidden from the UI\r\n // this is because we need form inputs to be able to POST to a iFrame\r\n $scope.getParamPath = function (name) {\r\n if (name.indexOf('drop_') === 0) {\r\n return 'pages/reports/reportview/reportparameters/_form.drop_.html';\r\n }\r\n if (name === 'dt_EndDate') {\r\n $scope.dateRangeType = $scope.dateRangeType || '';\r\n return `pages/reports/reportview/reportparameters/_form.drop_DateRange${$scope.dateRangeType}.html`;\r\n }\r\n if (name === 'AssetList') {\r\n return 'pages/reports/reportview/reportparameters/_form.AssetList.html';\r\n }\r\n if (name === 'UnitOfMeasure') {\r\n $scope.unitOfMeasure = usersService.currentUser().claims.data.unitOfMeasure;\r\n return 'pages/reports/reportview/reportparameters/_form.user_unit_of_measure.html';\r\n }\r\n if (name === 'UserUOM') {\r\n // not sure if needed keeping around for legacy purposes\r\n $scope.userUOM = usersService.currentUser().claims.data.unitOfMeasure;\r\n return 'pages/reports/reportview/reportparameters/_form.user_uom.html';\r\n }\r\n if (name === 'TimeZoneId') {\r\n $scope.timeZoneId = usersService.currentUser().claims.data.timezone;\r\n return 'pages/reports/reportview/reportparameters/_form.time_zone_id.html';\r\n }\r\n if (name === 'UserTZ') {\r\n $scope.userTZ = moment().format('z');\r\n return 'pages/reports/reportview/reportparameters/_form.user_time_zone.html';\r\n }\r\n if (name === 'UserName') {\r\n $scope.userName = usersService.currentUser().username;\r\n return 'pages/reports/reportview/reportparameters/_form.user_name.html';\r\n }\r\n if (name === 'AccountId') {\r\n $scope.accountId = parseInt(usersService.currentUser().account.id);\r\n return 'pages/reports/reportview/reportparameters/_form.account_id.html';\r\n }\r\n if (name === 'LowPressureThreshold') {\r\n return 'pages/reports/reportview/reportparameters/_form.low_pressure_threshold.html';\r\n }\r\n if (name === 'HighPressureThreshold') {\r\n return 'pages/reports/reportview/reportparameters/_form.high_pressure_threshold.html';\r\n }\r\n if (name === 'Currency') {\r\n return 'pages/reports/reportview/reportparameters/_form.dropdown.html';\r\n }\r\n if (name === 'FuelPrice') {\r\n return 'pages/reports/reportview/reportparameters/_form.number_input_textbox.html';\r\n }\r\n if (name === ParamterNames.Plant) {\r\n return 'pages/reports/reportview/reportparameters/_form.attrsType.html';\r\n }\r\n if (name === ParamterNames.SecurityContextId) {\r\n return 'pages/reports/reportview/reportparameters/_form.hiddenInput.html';\r\n }\r\n if (name === ParamterNames.Datapoint) {\r\n return 'pages/reports/reportview/reportparameters/_form.DatapointSelector.html';\r\n }\r\n return '';\r\n };\r\n\r\n $scope.iframeReportCallBack = function () {\r\n if ($scope.isLoadingParameters) return;\r\n $scope.reportLoading = false;\r\n $scope.reportGenerated = true;\r\n $scope.$apply();\r\n };\r\n\r\n // get the report parameters\r\n const getReportParameters = function () {\r\n $scope.isLoadingParameters = true;\r\n\r\n reportingService\r\n .getReportById($stateParams.reportId)\r\n .then(\r\n function (reportData) {\r\n $scope.attrs = reportData.attrs;\r\n $scope.prefilter = reportData.attrs.prefilter;\r\n $scope.dateRangeType = reportData.attrs.dateRange || '';\r\n $scope.parametersData = reportData.parameters;\r\n $scope.reportPath = reportData.viewPath;\r\n $scope.selectedAttributes.reportPath = $scope.reportPath;\r\n $scope.selectedAttributes.reportDoesNotRequireAssets = !reportData.requiredAssets;\r\n $scope.reportName = reportData.name;\r\n $scope.exportListData = reportData.exportOptions;\r\n // url to pass to the iframe\r\n const rp = `${appSettings.VikingEndpoint}/default?path=${encodeURIComponent(\r\n getReportPath(),\r\n )}`;\r\n $scope.reportsPath = $sce.trustAsResourceUrl(rp);\r\n getReportExportTypes();\r\n\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if ($scope.parametersData[i].name === 'MaxSelection') {\r\n $scope.maxSelection = $scope.parametersData[i].defaultValues[0];\r\n } else if ($scope.parametersData[i].name === 'UnitOfMeasure') {\r\n $scope.unitOfMeasure = $rootScope.currentUser.claims.data.unitOfMeasure;\r\n } else if ($scope.parametersData[i].name === 'drop_DateRange') {\r\n if (!reportData.doNotSupportCustomRang) {\r\n $scope.parametersData[i].validValues.push({\r\n label: 'Custom',\r\n value: '5',\r\n });\r\n }\r\n $scope.dropDate = true;\r\n // Hourly Asset Utilization report doesn't need to show the Custom button,\r\n // so its hidden ony for this report.\r\n if ($scope.reportName === HOURLY_ASSET_UTILIZATION) {\r\n $scope.parametersData[i].hidden = true;\r\n }\r\n } else if ($scope.parametersData[i].name === 'HighPressureThreshold') {\r\n $scope.parametersData[i]._selected = parseInt(\r\n $scope.parametersData[i].defaultValues[0],\r\n );\r\n $scope.pressurethreshold.highid = i;\r\n } else if ($scope.parametersData[i].name === 'dt_StartDate') {\r\n $scope.parametersData[i]._selected = moment().format(DATE_FORMAT);\r\n } else if ($scope.parametersData[i].name === 'LowPressureThreshold') {\r\n $scope.parametersData[i]._selected = parseInt(\r\n $scope.parametersData[i].defaultValues[0],\r\n );\r\n $scope.pressurethreshold.lowid = i;\r\n } else if ($scope.parametersData[i].name === ParamterNames.Plant) {\r\n [$scope.parametersData[i]._selected = ConstantValues.All] =\r\n $scope.parametersData[i].defaultValues || [];\r\n reportingService\r\n .getAttributeParamValidValues(ParamterNames.Plant)\r\n .then((validValues) => {\r\n $scope.parametersData[i].validValues = validValues;\r\n });\r\n } else if ($scope.parametersData[i].name === ParamterNames.SecurityContextId) {\r\n const { contextId } = usersService.currentUser();\r\n $scope.parametersData[i]._selected = contextId;\r\n } else if ($scope.parametersData[i].name === 'Currency') {\r\n $scope.parametersData[i]._selected = $scope.parametersData[i].defaultValues[0];\r\n }\r\n }\r\n },\r\n function () {},\r\n )\r\n .finally(function () {\r\n $scope.isLoadingParameters = false;\r\n $scope.$emit('$viewContentLoaded');\r\n });\r\n };\r\n\r\n // get formats this report can export\r\n const getReportExportTypes = function () {\r\n for (let i = 0; i < $scope.exportListData.length; i++) {\r\n const obj = {\r\n label: $scope.exportListData[i],\r\n format: $scope.exportListData[i],\r\n destination: $scope.reportPath,\r\n };\r\n $scope.exportListData[i] = obj;\r\n }\r\n return $scope.exportListData;\r\n };\r\n\r\n // verb : 'GET'|'POST'\r\n // target : an optional opening target (a name, or \"_blank\"), defaults to \"_self\"\r\n const reportDownloadParams = (verb, url, data, target) => {\r\n const form = document.createElement('form');\r\n form.action = url;\r\n form.method = verb;\r\n form.target = target || '_self';\r\n if (data) {\r\n for (let i = 0; i < data.length; i += 1) {\r\n const input = document.createElement('textarea');\r\n input.name = data[i].name;\r\n input.value = data[i].value;\r\n form.appendChild(input);\r\n }\r\n }\r\n form.style.display = 'none';\r\n document.body.appendChild(form);\r\n form.submit();\r\n };\r\n\r\n $scope.downloadReport = (exportFormat) => {\r\n if ($scope.requiredFieldsFilled()) {\r\n const url = `${appSettings.VikingEndpoint}/Export?path=${encodeURIComponent(\r\n getReportPath(),\r\n )}&format=${encodeURIComponent(exportFormat)}`;\r\n\r\n const formData = $('form#reportForm').serializeArray();\r\n\r\n dataLayer.push({\r\n event: gtmEvents.analyticsDownloadReport,\r\n data: {\r\n ReportName: $scope.reportName,\r\n ...formData,\r\n },\r\n });\r\n\r\n reportDownloadParams('POST', url, formData, '_blank');\r\n }\r\n };\r\n\r\n $scope.getIconForFormat = function (format) {\r\n format = format.toLowerCase();\r\n if (format === 'excel') {\r\n return 'fa fa-file-excel-o';\r\n }\r\n if (format === 'pdf') {\r\n return 'fa fa-file-pdf-o';\r\n }\r\n return null;\r\n };\r\n\r\n const checkIfAnyAssetsSelected = function () {\r\n if (!$scope.parametersData || !$scope.reportForm) return false;\r\n\r\n const assetList = $scope.parametersData.find(function (param) {\r\n return param.name === 'AssetList';\r\n });\r\n if (!assetList) return false;\r\n\r\n return assetList._selected && Object.keys(assetList._selected).length > 0;\r\n };\r\n\r\n // Check to see if all of the required fields are field in\r\n $scope.requiredFieldsFilled = function () {\r\n let bool = true;\r\n // check for having any assets selected before making the array empty for proper enabling/disabling data points button\r\n $rootScope.selectDataPointsButtonEnabled = checkIfAnyAssetsSelected();\r\n\r\n $scope.selectedAttributes.selectedAssets = [];\r\n $rootScope.selectedAssetsForDataPoints = [];\r\n if (!$scope.parametersData) return false;\r\n if (!$scope.reportForm || $scope.reportForm.$invalid) return false; // handle undefined and null pointers\r\n\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n const param = $scope.parametersData[i];\r\n if (param.name === 'drop_DateRange') {\r\n for (let j = 0; j < param.validValues.length; j++) {\r\n const item = param.validValues[j];\r\n switch (item.label) {\r\n case '7d':\r\n item.tooltip = gettextCatalog.getString('Last 7 days');\r\n break;\r\n case 'MTD':\r\n item.tooltip = gettextCatalog.getString('Month to date');\r\n break;\r\n case '30d':\r\n item.tooltip = gettextCatalog.getString('Last 30 days');\r\n break;\r\n case '90d':\r\n item.tooltip = gettextCatalog.getString('Last 90 days');\r\n break;\r\n case DATE_RANGE_STRINGS._CUSTOM.value:\r\n if ($scope.reportName === HOURLY_ASSET_UTILIZATION) {\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._CUSTOM_HOURLY.tooltip);\r\n } else {\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._CUSTOM.tooltip);\r\n }\r\n break;\r\n case DATE_RANGE_STRINGS._1W.value:\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._1W.tooltip);\r\n break;\r\n case DATE_RANGE_STRINGS._2W.value:\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._2W.tooltip);\r\n break;\r\n case DATE_RANGE_STRINGS._3W.value:\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._3W.tooltip);\r\n break;\r\n case DATE_RANGE_STRINGS._4W.value:\r\n item.tooltip = gettextCatalog.getString(DATE_RANGE_STRINGS._4W.tooltip);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n if (param._selected) {\r\n const selectedDateOption =\r\n (param.validValues || []).find((op) => op.value === param._selected) || {};\r\n $scope.selectedAttributes.dateRange = {\r\n id: param._selected,\r\n label: selectedDateOption.label,\r\n reportDateName: selectedDateOption.tooltip,\r\n };\r\n }\r\n // if there is no default value for the drop_dateRange component and another value has not been selected\r\n // set the default value to be 0 so the \"7 days\" option is selected automatically\r\n else if (\r\n param.defaultValues.length <= 0 &&\r\n !param._selected &&\r\n param.name === 'drop_DateRange'\r\n ) {\r\n param.defaultValues.push('1');\r\n }\r\n } else if (\r\n param.name === 'UserTZ' ||\r\n param.name === 'UserUOM' ||\r\n param.name === 'UserName' ||\r\n param.name === 'TimeZoneId' ||\r\n param.name === 'date_PickRange'\r\n ) {\r\n continue;\r\n } else if (param.name === 'AssetList') {\r\n if (!param._selected || Object.keys(param._selected).length <= 0) {\r\n bool = false;\r\n continue;\r\n } else {\r\n const keys = Object.keys(param._selected);\r\n for (let x = 0; x < keys.length; x++) {\r\n $scope.selectedAttributes.selectedAssets.push({\r\n id: keys[x],\r\n name: param._selected[keys[x]].name,\r\n }); // param._selected[key]);\r\n $rootScope.selectedAssetsForDataPoints.push({\r\n id: keys[x],\r\n name: param._selected[keys[x]].name,\r\n });\r\n }\r\n }\r\n continue;\r\n } else if (\r\n param.name === 'dt_StartDate' &&\r\n param.required &&\r\n !param._selected &&\r\n $scope.dateRangeType.indexOf('Weekly') !== -1\r\n ) {\r\n return false;\r\n } else if (\r\n param.name === 'dt_EndDate' &&\r\n param.required &&\r\n !param._selected &&\r\n $scope.dateRangeType.indexOf('Weekly') !== -1\r\n ) {\r\n return false;\r\n } else if (param.nullable) {\r\n // If the parameter is nullable we dont' need to verify it.\r\n continue;\r\n } else if (param.name === 'FuelPrice') {\r\n if (param._selected === '' || param._selected === undefined) {\r\n bool = false;\r\n continue;\r\n }\r\n }\r\n }\r\n if ($scope.numSelectedDataPoints() <= 0 && $scope.reportName === HOURLY_ASSET_UTILIZATION) {\r\n return false;\r\n }\r\n return bool;\r\n };\r\n\r\n // INIT METHODS\r\n getReportParameters();\r\n\r\n // WATCH\r\n $scope.$watch('btn.radio', function (val) {\r\n if (val != null) {\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if (\r\n ($scope.parametersData[i]._selected && $scope.parametersData[i].name === 'dt_EndDate') ||\r\n $scope.parametersData[i].name === 'dt_StartDate'\r\n ) {\r\n $scope.parametersData[i]._selected = null;\r\n $scope.isValid.startDate = false;\r\n $scope.isValid.endDate = false;\r\n $scope.isValid.dateDrop = true;\r\n }\r\n }\r\n $scope.date.end = null;\r\n $scope.date.start = null;\r\n }\r\n });\r\n\r\n $scope.$watch('date.end', function (val) {\r\n if ($scope.parametersData) {\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if (\r\n $scope.parametersData[i]._selected &&\r\n $scope.parametersData[i].name === 'drop_DateRange'\r\n ) {\r\n $scope.isValid.dateDrop = false;\r\n }\r\n\r\n if ($scope.parametersData[i].name === 'dt_EndDate') {\r\n if (val) {\r\n $scope.parametersData[i]._selected = moment(val).format(DATE_FORMAT);\r\n } else {\r\n $scope.parametersData[i]._selected = null;\r\n }\r\n $scope.parametersData[i].required = true; // this is required for the date.end or why the user should access this control\r\n\r\n $scope.isValid.startDate = $scope.isValid.endDate =\r\n $scope.date.start && $scope.date.end ? $scope.date.end >= $scope.date.start : false;\r\n\r\n if ($scope.reportForm && $scope.reportForm.dt_EndDate) {\r\n $scope.reportForm.dt_EndDate.$error.dateLowerThan = $scope.isValid.endDate;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.$watch('date.start', function (val) {\r\n if (val != null && $scope.parametersData) {\r\n for (let i = 0; i < $scope.parametersData.length; i++) {\r\n if (\r\n $scope.parametersData[i]._selected &&\r\n $scope.parametersData[i].name === 'drop_DateRange'\r\n ) {\r\n $scope.isValid.dateDrop = false;\r\n }\r\n\r\n if ($scope.parametersData[i].name === 'dt_StartDate') {\r\n $scope.parametersData[i]._selected = moment(val).format(DATE_FORMAT);\r\n $scope.isValid.startDate = $scope.isValid.endDate =\r\n $scope.date.start && $scope.date.end ? $scope.date.end >= $scope.date.start : false;\r\n if ($scope.reportForm && $scope.reportForm.dt_StartDate) {\r\n $scope.reportForm.dt_StartDate.$error.dateGreaterThan = $scope.isValid.startDate;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.allowViewReportAndExport = function () {\r\n let allow = $scope.requiredFieldsFilled();\r\n if (\r\n allow &&\r\n $scope.selectedAttributes.dateRange &&\r\n $scope.selectedAttributes.dateRange.label === 'Custom'\r\n ) {\r\n allow =\r\n allow &&\r\n $scope.date.start &&\r\n $scope.date.end &&\r\n $scope.isValid.endDate &&\r\n $scope.isValid.startDate;\r\n }\r\n return allow;\r\n };\r\n\r\n $scope.csvFormValidation = function () {\r\n if ($scope.csvForm.dt_StartDate) {\r\n $scope.csvForm.dt_StartDate.$touched = true;\r\n }\r\n if ($scope.csvForm.dt_EndDate) {\r\n $scope.csvForm.dt_EndDate.$touched = true;\r\n }\r\n const valid =\r\n $scope.selectedAttributes.selectedAssets.length > 0 &&\r\n $scope.allowViewReportAndExport() &&\r\n $scope.csvReport.contacts.length > 0 &&\r\n $scope.csvReport.contacts.length <= 10 &&\r\n $scope.numSelectedDataPoints() > 0 &&\r\n $scope.validDateRange(90);\r\n return valid;\r\n };\r\n\r\n // modal overlay create schedule\r\n $scope.createSchedule = () => {\r\n // check for selected assets if assetList present as report param\r\n if (\r\n !$scope.selectedAttributes.reportDoesNotRequireAssets &&\r\n !($scope.selectedAttributes.selectedAssets.length > 0)\r\n ) {\r\n return;\r\n }\r\n\r\n $scope.selectedAttributes.reportName = $scope.reportName;\r\n // get report parameters and populate their values\r\n $scope.parametersData.forEach((value) => {\r\n switch (value.name) {\r\n case 'AssetList':\r\n break;\r\n case 'date_PickRange':\r\n break;\r\n case 'dt_StartDate':\r\n break;\r\n case 'dt_EndDate':\r\n if ($scope.dateRangeType.indexOf('Weekly') !== -1) {\r\n $scope.selectedAttributes.reportParameters[value.name] = $scope.date.end;\r\n }\r\n break;\r\n case 'drop_DateRange':\r\n if (!$scope.dateRangeType.indexOf('Weekly') !== -1) {\r\n $scope.selectedAttributes.reportParameters[value.name] = value.name;\r\n }\r\n break;\r\n case ParamterNames.Plant:\r\n $scope.selectedAttributes.reportParameters[value.name] = value._selected;\r\n break;\r\n default:\r\n $scope.selectedAttributes.reportParameters[value.name] = value.name;\r\n break;\r\n }\r\n });\r\n\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n keyboard: false,\r\n backdrop: 'static',\r\n template: require('../jobschedules/job/job.create.html'),\r\n controller: 'JobCreateController',\r\n size: 'lg',\r\n resolve: {\r\n scheduleAttributes() {\r\n return $scope.selectedAttributes;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(\r\n function (scheduleAttributes) {\r\n $scope.selectedAttributes.selectedAssets = scheduleAttributes.selectedAssets;\r\n $scope.selectedAttributes.dateRange = scheduleAttributes.dateRange;\r\n $scope.$broadcast('refreshSchedules', true);\r\n },\r\n function () {\r\n $scope.$broadcast('refreshSchedules', true);\r\n },\r\n );\r\n }; // end modal overlay create schedule\r\n\r\n $scope.checkNumberOfAssets = function () {\r\n if ($scope.selectedAttributes.selectedAssets.length <= 0) {\r\n $scope.errorMessage = true;\r\n }\r\n };\r\n\r\n /** ---modal overlay select data points --- */\r\n $scope.selectDataPoints = function () {\r\n let flag = false;\r\n if ($scope.maxSelection === 1) {\r\n flag = true;\r\n }\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./datapointspicker/datapoint.multi.picker.html'),\r\n controller: 'DatapointMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: flag,\r\n includeDiagnosticDatapoints: $scope.report.name === 'Current Asset Data',\r\n maxSelection() {\r\n return $scope.maxSelection;\r\n },\r\n assetsSelected: $rootScope.assetsSelected,\r\n selectedDatapoints() {\r\n return $rootScope.datapointsSelected;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result\r\n .then(function (selectedDatapoints) {\r\n $rootScope.datapointsSelected = selectedDatapoints;\r\n })\r\n .catch(() => {});\r\n }; // end modal overlay for selecting data points\r\n\r\n // Added modal for the Hourly Asset Utilization\r\n $scope.clickedDatapointModal = function () {\r\n // Get equipment datapoints\r\n const parameterDatapoints = $scope.getDatapointsFromParameters();\r\n const assetIds = $scope.getSingleSelectedEquipment();\r\n if (!assetIds) return;\r\n\r\n\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n template: DatapointSelectorHtml,\r\n controller: DatapointSelectorController,\r\n controllerAs: 'datapointSelectorVm',\r\n size: 'lg',\r\n resolve: {\r\n datapointListCallback: () => {\r\n return () => {\r\n return reportingService.getDatapointsAndFilter(assetIds, parameterDatapoints);\r\n };\r\n },\r\n preSelectedDatapoints: () => $rootScope.datapointsSelected,\r\n maxSelection: () => 10,\r\n },\r\n });\r\n\r\n modalInstance.result\r\n .then((selectedDatapoints) => {\r\n $rootScope.datapointsSelected = selectedDatapoints;\r\n $rootScope.datapointIdsSelected = selectedDatapoints.map((datapoint) => {\r\n return datapoint.dataId;\r\n });\r\n })\r\n .catch((error) => { });\r\n $scope.isDirty = true;\r\n };\r\n\r\n $scope.getDatapointsFromParameters = () => {\r\n const { validValues } =\r\n $scope.parametersData.find((param) => param.name === ParamterNames.Datapoint) || [];\r\n return validValues.map((validValue) => validValue.value);\r\n };\r\n\r\n $scope.getSingleSelectedEquipment = () => {\r\n const assetIds = Object.keys($rootScope.assetsSelected);\r\n return assetIds || [];\r\n };\r\n\r\n $scope.numSelectedDataPoints = () => {\r\n return Object.keys($rootScope.datapointsSelected || {}).length;\r\n };\r\n $scope.csvGenerating = false;\r\n\r\n $scope.generateCSV = function () {\r\n if (!$scope.csvFormValidation()) {\r\n $scope.errorMessage = true;\r\n return;\r\n }\r\n $scope.error = false;\r\n $scope.csvGenerating = true;\r\n $scope.csvGenerated = false;\r\n CSVDataExportService.createCSV(gatherCSVData()).then(\r\n function () {\r\n $scope.csvGenerated = true;\r\n },\r\n function () {\r\n // In the case of an error...it should show an error message to the end user\r\n $scope.error = true;\r\n },\r\n );\r\n };\r\n\r\n $scope.validDateRange = function (offset) {\r\n if ($scope.date.start && $scope.date.end) {\r\n const fromDate = moment($scope.date.start);\r\n const toDate = moment($scope.date.end);\r\n const range = moment().range(fromDate, toDate);\r\n const diff = range.diff('days');\r\n\r\n if (diff > offset) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return true;\r\n };\r\n\r\n function setDateRange(offset) {\r\n const todayMinusOffset = moment().subtract(offset, 'days');\r\n $scope.date.start = todayMinusOffset;\r\n $scope.date.end = moment();\r\n }\r\n\r\n function getDateRangeForCSVExport(paramSelected) {\r\n switch (paramSelected.id) {\r\n case '1': // 7d\r\n setDateRange(7);\r\n break;\r\n case '2': // MTD\r\n case '3': // 30d\r\n setDateRange(30);\r\n break;\r\n case '4': // 90d\r\n setDateRange(90);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n function getDateRangeString() {\r\n if ($scope.date && $scope.date.start && $scope.date.end) {\r\n const startDate = moment($scope.date.start).format(DATE_FORMAT);\r\n const endDate = moment($scope.date.end).format(DATE_FORMAT);\r\n return `${startDate}/${endDate}`;\r\n }\r\n return undefined;\r\n }\r\n\r\n function gatherCSVData() {\r\n if ($scope.selectedAttributes.dateRange) {\r\n getDateRangeForCSVExport($scope.selectedAttributes.dateRange);\r\n }\r\n const csv = {};\r\n\r\n const data = {\r\n email: [...$scope.csvReport.contacts.map((contact) => contact.email)],\r\n range: getDateRangeString(),\r\n equipment: (function () {\r\n const arr = [];\r\n angular.forEach($scope.selectedAttributes.selectedAssets, function (asset) {\r\n if (typeof asset === 'string') {\r\n arr.push(asset);\r\n } else {\r\n arr.push(asset.id);\r\n }\r\n });\r\n return arr;\r\n })(),\r\n datapoint: (function () {\r\n const arr = [];\r\n angular.forEach(Object.keys($rootScope.datapointsSelected), function (datapoint) {\r\n arr.push(datapoint);\r\n });\r\n return arr;\r\n })(),\r\n };\r\n csv.data = data;\r\n return csv;\r\n }\r\n}\r\n","import angular from 'angular';\r\n/* Module Imports */\r\nimport reportParametersModule from './reportparameters/reportParameters.module';\r\n\r\n/* Additional Imports */\r\nimport DatapointMultiPickerController from './datapointspicker/datapoint.multi.picker.controller';\r\nimport ReportsDetailController from './reports.detail.controller';\r\n\r\nconst reportViewModule = angular\r\n .module('app.reportview', ['ui.bootstrap', 'ui.router', 'gettext', reportParametersModule])\r\n .controller('DatapointMultiPickerController', DatapointMultiPickerController)\r\n .controller('ReportsDetailController', ReportsDetailController);\r\n\r\nexport default reportViewModule.name;\r\n","export default function ReportsRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('reports', {\r\n url: '/reports',\r\n template: require('./reports.html'),\r\n controller: 'ReportsController',\r\n redirectTo: 'reports.list',\r\n ncyBreadcrumb: {\r\n label: \"{{'Analytics' | translate}}\"\r\n },\r\n requiredFeatures: ['analytics']\r\n })\r\n .state('reports.dashboards', {\r\n url: '/dashboards',\r\n helpModuleId: 'analytics',\r\n helpState: 'report.dashboards',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Dashboards' | translate}}\"\r\n },\r\n requiredFeatures: ['analytics', 'analytics.tableau']\r\n })\r\n .state('reports.list', {\r\n url: '',\r\n helpModuleId: 'analytics',\r\n helpState: 'report.base',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Business Insights' | translate}}\"\r\n },\r\n requiredFeatures: ['analytics']\r\n })\r\n .state('reports.jobschedules', {\r\n template: require('./jobschedules/jobs.html'),\r\n controller: 'JobsController',\r\n url: '/jobschedules',\r\n helpModuleId: 'analytics',\r\n helpState: 'analyticsschedules',\r\n ncyBreadcrumb: {\r\n label: \"{{'Scheduled Reports' | translate}}\"\r\n },\r\n requiredFeatures: ['analytics.schedules']\r\n })\r\n .state('reports.jobschedulesjob', {\r\n template: require('./jobschedules/job/job.create.html'),\r\n controller: 'JobCreateController',\r\n url: '/jobschedules/job',\r\n helpModuleId: 'analytics',\r\n helpState: 'analyticsschedules',\r\n ncyBreadcrumb: {\r\n parent: 'report.jobschedules',\r\n label: \"{{'Job' | translate}}\"\r\n },\r\n requiredFeatures: ['analytics.schedules.manage']\r\n })\r\n .state('reports.jobscheduledetail', {\r\n url: '/jobschedules/job/{id}',\r\n template: require('./jobschedules/job/job.detail.html'),\r\n controller: 'JobDetailController',\r\n helpModuleId: 'analytics',\r\n helpState: 'analyticsschedules',\r\n ncyBreadcrumb: {\r\n label: '{{schedule.jobName}}',\r\n parent: 'reports.jobschedules'\r\n },\r\n requiredFeatures: ['analytics.schedules']\r\n })\r\n .state('reports.jobschedule-edit', {\r\n url: '/jobschedules/job/{id}/edit',\r\n template: require('./jobschedules/job/job.update.html'),\r\n controller: 'JobUpdateController',\r\n helpModuleId: 'analytics',\r\n ncyBreadcrumb: {\r\n label: \"{{'Edit' | translate}}\",\r\n parent: 'reports.jobscheduledetail'\r\n },\r\n requiredFeatures: ['analytics.schedules.manage']\r\n })\r\n .state('reports.detail', {\r\n url: '/detail/?reportId',\r\n helpModuleId: 'analytics',\r\n helpState: 'report.detail',\r\n template: require('./reportview/reports.detail.html'),\r\n controller: 'ReportsDetailController',\r\n ncyBreadcrumb: {\r\n parent: 'reports.list',\r\n label: '{{reportName | translate}}'\r\n },\r\n params: {\r\n reportName: ''\r\n }\r\n })\r\n .state('reports.interactive-report', {\r\n url: '/detail/interactive/:reportId',\r\n helpModuleId: 'analytics',\r\n helpState: 'report.detail',\r\n params: {\r\n reportName: ''\r\n },\r\n template: '',\r\n ncyBreadcrumb: {\r\n parent: 'reports.list',\r\n label: '{{$ctrl.reportName | translate}}'\r\n }\r\n });\r\n}\r\n","import { sortBy } from 'lodash-es';\r\nimport { Report, ConstantValues } from '../models/report.model';\r\n\r\n/**\r\n *\r\n * @param {*} list ={}\r\n * return list of groups objects {groupName,ordinal,reports} with their reports\r\n */\r\nconst groupReports = (list = []) => {\r\n const groupedReports = {};\r\n list.forEach((report) => {\r\n // ungrouped just to be used as key but not in as group name\r\n const { name: groupName = 'ungrouped', ordinal = 999 } = report.group || {};\r\n if (groupName in groupedReports) {\r\n groupedReports[groupName].reports.push(new Report(report));\r\n } else {\r\n groupedReports[groupName] = {\r\n groupName: groupName !== 'ungrouped' ? groupName : '',\r\n ordinal,\r\n reports: [new Report(report)],\r\n };\r\n }\r\n });\r\n return Object.values(groupedReports);\r\n};\r\n\r\nexport default class ReportingService {\r\n constructor(reportingAPI, attributesService, EquipmentService) {\r\n 'ngInject';\r\n\r\n this.apiClient = reportingAPI;\r\n this.attributesService = attributesService;\r\n this.equipmentService = EquipmentService;\r\n }\r\n\r\n getGroupedReports() {\r\n return this.apiClient.getReportsList().then((res) => sortBy(groupReports(res.data), 'ordinal'));\r\n }\r\n\r\n getReportById(id) {\r\n return this.apiClient.getReportById(id).then((res) => new Report(res.data));\r\n }\r\n\r\n refresh() {\r\n return this.apiClient.refresh();\r\n }\r\n\r\n /**\r\n * @param {*} attrName\r\n * return list of { value , label }\r\n * will add 'All' option\r\n */\r\n getAttributeParamValidValues(attrName) {\r\n return this.attributesService.getAttributeValuesByName(attrName).then((values) => {\r\n // sort options then put 'All' in the top of the list\r\n const valuesWithoutAllOption = (values || []).filter((v) => v !== ConstantValues.All).sort();\r\n values = [ConstantValues.All, ...valuesWithoutAllOption];\r\n return values.map((val) => ({ value: val, label: val }));\r\n });\r\n }\r\n\r\n getKeyedDatapointsByAssetIds(assetIds) {\r\n // Datapoint visibility is checked in the inReach API level, no need to check in UI.\r\n return this.equipmentService.getSeriesByMultipleEquipment(assetIds).then((response) => {\r\n const { data: seriesData = [] } = response;\r\n\r\n const indexedSeries = seriesData.reduce((accumulator, series) => {\r\n const { dataId, title, descriptor: { title: descriptorTitle } = {} } = series;\r\n accumulator[dataId] = { ...series, title: descriptorTitle || title };\r\n return accumulator;\r\n }, {});\r\n\r\n return indexedSeries;\r\n });\r\n }\r\n\r\n getDatapointsAndFilter(assetIds, acceptableDatapoints = []) {\r\n return this.getKeyedDatapointsByAssetIds(assetIds).then((equipmentDatapoints) => {\r\n const datapointList = Object.values(equipmentDatapoints).filter((series) =>\r\n acceptableDatapoints.includes(series.dataId),\r\n );\r\n return datapointList;\r\n });\r\n }\r\n}\r\n","import template from './reports-list.html';\r\n\r\nclass ReportsListController {\r\n constructor(reportingService) {\r\n 'ngInject';\r\n\r\n this.reportingService = reportingService;\r\n this.status = '';\r\n }\r\n\r\n $onInit() {\r\n this.getSortedGroupedReports();\r\n }\r\n\r\n $onChanges() {}\r\n\r\n $onDestroy() {}\r\n\r\n getSortedGroupedReports() {\r\n this.status = 'loading';\r\n this.reportingService\r\n .getGroupedReports()\r\n .then((reports) => {\r\n this.status = '';\r\n this.groupedReports = reports;\r\n })\r\n .catch(() => {\r\n this.status = 'error';\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: ReportsListController,\r\n bindings: {},\r\n};\r\n","import template from './interactive-report-view.html';\r\nimport { get } from 'lodash-es';\r\nimport exportOptionsPopupTemplate from '../export-options-popup/export-options-popup.html';\r\nimport overwritePopupTemplate from '../overwrite-cutom-view-popup/overwrite-custom-view-popup.html';\r\nimport deletePopupTemplate from '../delete-custom-view-popup/delete-custom-view-popup.html';\r\n\r\nconst REGEX_MATCH_EXPORT = /.*- Export/;\r\n\r\nconst CUSTOM_VIEWS_OPERATIONS = {\r\n REMOVE: 'REMOVE',\r\n APPLY: 'APPLY',\r\n SAVE: 'SAVE',\r\n};\r\nconst MAX_CUSTOM_VIEWS = 60;\r\nclass InteractiveReportController {\r\n constructor(\r\n reportingService,\r\n securityGroupsService,\r\n usersService,\r\n $stateParams,\r\n $sce,\r\n $scope,\r\n $q,\r\n $timeout,\r\n appSettings,\r\n $rootScope,\r\n $uibModal,\r\n gettextCatalog,\r\n ) {\r\n 'ngInject';\r\n this.reportingService = reportingService;\r\n this.securityGroupsService = securityGroupsService;\r\n this.usersService = usersService;\r\n this.$stateParams = $stateParams;\r\n this.$sce = $sce;\r\n this.iframeSrc = '';\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.$timeout = $timeout;\r\n this.appSettings = appSettings;\r\n this.$rootScope = $rootScope;\r\n this.$uibModal = $uibModal;\r\n this.language = 'en';\r\n this.gettextCatalog = gettextCatalog;\r\n\r\n // Tableau specifics\r\n this.tableauFilters = [];\r\n this.viz;\r\n this.activeSheet = null;\r\n this.workbook = null;\r\n // Exporting and Custom Views\r\n this.exportOptions = [];\r\n this.customViews = [{ name: '', isDefault: true }];\r\n this.customViewDropdownOpen = false;\r\n this.selectedCustomView = this.customViews[0];\r\n this.newCustomViewName = '';\r\n this.inputCustomViewOpen = false;\r\n this.isEditingCustomView = false;\r\n this.editViewName = '';\r\n this.maxCustomViews = MAX_CUSTOM_VIEWS;\r\n this.isDefaultSelected = false;\r\n this.isTypingCustomViewName = false;\r\n this.showCustomViewNameError = false;\r\n\r\n this.updateFilter = null;\r\n this.leftNavNode = null;\r\n this.showExport = false;\r\n\r\n this.refreshUrl = this.$sce.trustAsResourceUrl(`${appSettings.RepotingApiUrl}/refresh`);\r\n\r\n this.callbackFunction = (callbackFunc) => {\r\n callbackFunc();\r\n };\r\n }\r\n $onInit() {\r\n this.status = 'loading';\r\n this.reportId = this.$stateParams.reportId;\r\n this.updateBreadcrumb(this.$stateParams.reportName);\r\n this.language = this.appLanguage;\r\n //this.getLeftNavNode();\r\n //this.changeDisplayLeftNav(false);\r\n }\r\n\r\n //un alternet way to $postLink() could be using timeout in $onInit\r\n //will get the report after the ifram has made the call to reset the cookie\r\n $postLink() {\r\n const requests = [this.getInteractiveReport(this.reportId), this.getSecurityGroupsNames()];\r\n this.$q\r\n .all(requests)\r\n .then(result => {\r\n\r\n const [reportResult, securityGroupsNames] = result;\r\n\r\n this.status = '';\r\n let path = reportResult.viewPath ? `${reportResult.viewPath}` : '';\r\n this.iframeSrc = this.$sce.trustAsResourceUrl(path);\r\n this.updateBreadcrumb(reportResult.name);\r\n this.initViz(path, securityGroupsNames);\r\n this.tableauFilters = reportResult.filters || [];\r\n })\r\n .catch(error => {\r\n this.status = 'error';\r\n this.iframeSrc = '';\r\n })\r\n }\r\n $onChanges() {}\r\n\r\n $onDestroy() {\r\n this.changeDisplayLeftNav(true);\r\n }\r\n\r\n getExportOptions() {\r\n if (this.activeSheet) {\r\n this.exportOptions = this.activeSheet\r\n .getWorksheets()\r\n .filter((worksheet) => REGEX_MATCH_EXPORT.test(worksheet.getName()))\r\n .map((worksheet) => worksheet.getName());\r\n }\r\n }\r\n\r\n getSecurityGroupsNames() {\r\n return this.securityGroupsService.getAllSecurityGroups().then(response => {\r\n const { data: {\r\n data: securityGroups\r\n } } = response;\r\n\r\n return securityGroups.map(securityGroup => securityGroup.name);\r\n });\r\n }\r\n\r\n getCustomViews() {\r\n if (this.viz && this.workbook) {\r\n this.workbook.getCustomViewsAsync().then((result) => {\r\n this.$scope.$apply(() => {\r\n const parsedCustomViews = result?.map((customView) => ({\r\n name: customView?.getName(),\r\n isDefault: customView.getDefault(),\r\n }));\r\n this.customViews = [...this.customViews, ...parsedCustomViews];\r\n // Select Default custom view\r\n const foundDefault = parsedCustomViews.find((customView) => customView.isDefault);\r\n if (foundDefault) {\r\n this.selectedCustomView = foundDefault;\r\n this.customViews[0].isDefault = false;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n customViewOperationTableau(operation, customViewName, callbackFunction) {\r\n let tableauFunction = null;\r\n let loggingOperation = '';\r\n\r\n switch (operation) {\r\n case CUSTOM_VIEWS_OPERATIONS.APPLY:\r\n tableauFunction = this.workbook.showCustomViewAsync(customViewName);\r\n loggingOperation = 'applied';\r\n break;\r\n case CUSTOM_VIEWS_OPERATIONS.REMOVE:\r\n tableauFunction = this.workbook.removeCustomViewAsync(customViewName);\r\n loggingOperation = 'removed';\r\n break;\r\n case CUSTOM_VIEWS_OPERATIONS.SAVE:\r\n tableauFunction = this.workbook.rememberCustomViewAsync(customViewName);\r\n loggingOperation = 'saved';\r\n break;\r\n }\r\n\r\n tableauFunction.then((result) => {\r\n if (tableauFunction) callbackFunction(result);\r\n console.log(`Custom view : '${result?.getName()}' ${loggingOperation} successfully`);\r\n });\r\n }\r\n\r\n applyCustomView(customView, callbackFunction = null) {\r\n this.selectedCustomView = customView;\r\n\r\n this.customViewOperationTableau(\r\n CUSTOM_VIEWS_OPERATIONS.APPLY,\r\n this.selectedCustomView?.name,\r\n callbackFunction,\r\n );\r\n }\r\n\r\n saveCustomView(customViewName, isNew) {\r\n this.customViewOperationTableau(CUSTOM_VIEWS_OPERATIONS.SAVE, customViewName, (result) => {\r\n if (isNew) {\r\n this.$scope.$apply(() => {\r\n const resultCustomView = { name: result?.getName(), isDefault: result?.getDefault() };\r\n this.customViews.push(resultCustomView);\r\n this.selectedCustomView = resultCustomView;\r\n });\r\n }\r\n });\r\n }\r\n\r\n editCurrentCustomView() {\r\n this.isTypingCustomViewName = false;\r\n // Check if already in use name\r\n const alreadyInUse = this.customViewNameAlreadyInUse();\r\n if (alreadyInUse || this.gettextCatalog.getString(\"Initial View\") === this.editViewName) {\r\n this.showCustomViewNameError = true;\r\n return;\r\n }\r\n\r\n const isCurrentlyDefault = this.selectedCustomView.isDefault;\r\n // Delete the current custom view\r\n this.deleteCustomView();\r\n // Save current state with different name;\r\n this.customViewOperationTableau(CUSTOM_VIEWS_OPERATIONS.SAVE, this.editViewName, (result) => {\r\n this.$scope.$apply(() => {\r\n this.customViews.push({ name: result?.getName(), isDefault: result?.getDefault() });\r\n this.selectedCustomView.name = result?.getName();\r\n if (isCurrentlyDefault) this.setCurrentViewAsDefault();\r\n });\r\n });\r\n this.toggleEditing();\r\n }\r\n\r\n deleteCustomView() {\r\n this.customViewOperationTableau(\r\n CUSTOM_VIEWS_OPERATIONS.REMOVE,\r\n this.selectedCustomView.name,\r\n null,\r\n );\r\n\r\n this.customViews = this.customViews.filter(\r\n (customView) => customView.name !== this.selectedCustomView.name,\r\n );\r\n }\r\n\r\n setCurrentViewAsDefault() {\r\n this.selectedCustomView = { ...this.selectedCustomView, isDefault: true };\r\n this.customViews = this.customViews.map((customView) => ({\r\n ...customView,\r\n isDefault: this.selectedCustomView.name === customView.name,\r\n }));\r\n this.workbook?.setActiveCustomViewAsDefaultAsync().then(() => {});\r\n }\r\n\r\n customViewButtonClicked() {\r\n if (this.inputCustomViewOpen && this.newCustomViewName) {\r\n this.isTypingCustomViewName = false;\r\n //Check if custom view name is already in use\r\n const alreadyInUse = this.customViewNameAlreadyInUse();\r\n\r\n if (alreadyInUse || this.gettextCatalog.getString(\"Initial View\") === this.newCustomViewName) {\r\n this.showCustomViewNameError = true;\r\n return;\r\n }\r\n this.saveCustomView(this.newCustomViewName, true);\r\n this.newCustomViewName = '';\r\n }\r\n this.inputCustomViewOpen = !this.inputCustomViewOpen;\r\n }\r\n\r\n toggleEditing() {\r\n this.isEditingCustomView = !this.isEditingCustomView;\r\n this.editViewName = this.isEditingCustomView ? this.selectedCustomView.name : '';\r\n }\r\n toggleErrorMessage() {\r\n this.$timeout(() => this.showCustomViewNameError = false, 2);\r\n return true;\r\n }\r\n\r\n popupCustomView(template, controllerName, controllerAsName) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n template: template,\r\n controller: controllerName,\r\n controllerAs: controllerAsName,\r\n resolve: {\r\n view: () => this.selectedCustomView,\r\n },\r\n size: 'sm',\r\n }).result;\r\n }\r\n\r\n overwriteCustomView() {\r\n this.popupCustomView(\r\n overwritePopupTemplate,\r\n 'OverwriteCustomViewPopupController',\r\n 'overwritePopupVm',\r\n )\r\n .then((result) => {\r\n this.saveCustomView(this.selectedCustomView.name, false);\r\n })\r\n .catch((error) => {\r\n console.log(`Overwrite modal closed by: ${error}`);\r\n });\r\n }\r\n promptRemoveCustomView() {\r\n this.popupCustomView(deletePopupTemplate, 'DeleteCustomViewPopupController', 'deletePopupVm')\r\n .then((result) => {\r\n const isCurrentViewDefault = this.selectedCustomView.isDefault;\r\n this.deleteCustomView();\r\n\r\n if (isCurrentViewDefault) {\r\n this.selectedCustomView = { name: '', isDefault: isCurrentViewDefault };\r\n this.customViews[0].isDefault = isCurrentViewDefault;\r\n }\r\n this.applyCustomView(this.customViews[0]);\r\n this.toggleEditing();\r\n })\r\n .catch((error) => {\r\n console.log(`Remove popup closed by: ${error}`);\r\n });\r\n }\r\n\r\n closeCustomViewCreation() {\r\n this.newCustomViewName = '';\r\n this.inputCustomViewOpen = false;\r\n }\r\n\r\n getInteractiveReport(id) {\r\n return this.reportingService.getReportById(id);\r\n }\r\n\r\n initViz(viewPath, securityGroupsNames) {\r\n angular.element(() => {\r\n const containerDiv = document.getElementById('vizContainer');\r\n const url = viewPath;\r\n const options = {\r\n hideTabs: false,\r\n hideToolbar: true,\r\n onFirstInteractive: () => {\r\n this.workbook = this.viz.getWorkbook();\r\n this.activeSheet = this.workbook.getActiveSheet();\r\n //this.getAllFilters();\r\n this.$scope.$apply(() => (this.showExport = true));\r\n this.getCustomViews();\r\n this.getExportOptions();\r\n },\r\n onFirstVizSizeKnown: () => {\r\n console.log('onFirstVizSizeKnown');\r\n },\r\n language: this.language,\r\n };\r\n\r\n const { securityMode = \"\"} = this.usersService.currentUser();\r\n\r\n\r\n if (securityGroupsNames.length > 0 && securityMode !== \"Open\") {\r\n options[\"security_group_name\"] = [...securityGroupsNames];\r\n }\r\n\r\n this.viz = new tableau.Viz(containerDiv, url, options);\r\n });\r\n }\r\n\r\n updateBreadcrumb(reportName) {\r\n this.reportName = reportName;\r\n //fire this for breadcrumb to update itself after setting report name\r\n this.$scope.$emit('$viewContentLoaded');\r\n }\r\n getLeftNavNode() {\r\n const domNodes = document.getElementsByClassName('fixed-left-nav');\r\n\r\n if (domNodes.length > 0) {\r\n this.leftNavNode = domNodes[0];\r\n }\r\n }\r\n\r\n changeDisplayLeftNav(showNav = true) {\r\n if (this.leftNavNode) {\r\n this.leftNavNode.style.display = showNav ? 'block' : 'none';\r\n }\r\n }\r\n\r\n getAllFilters() {\r\n const worksheets = this.activeSheet.getWorksheets();\r\n\r\n if (Array.isArray(worksheets) && worksheets.length > 1) {\r\n const worksheetObject = worksheets[1];\r\n\r\n const tableauPromises = [\r\n this.workbook.getParametersAsync(),\r\n worksheetObject.getFiltersAsync(),\r\n ];\r\n\r\n Promise.allSettled(tableauPromises).then((values) => {\r\n const [paramResponse, filterResponse] = values;\r\n\r\n this.populateFilterValues(paramResponse.value, filterResponse.value);\r\n this.updateFilter(this.tableauFilters);\r\n });\r\n }\r\n }\r\n\r\n flattenTableauFilters(filters = [], isParameter = false) {\r\n const filterObject = {};\r\n for (const filter of filters) {\r\n const filterName = isParameter ? filter.getName() : filter.getFieldName();\r\n const filterValues = isParameter ? filter.getAllowableValues() : filter.getAppliedValues();\r\n\r\n if (filterName && Array.isArray(filterValues) && filterValues.length > 0) {\r\n filterObject[filterName] = filterValues;\r\n }\r\n }\r\n return filterObject;\r\n }\r\n customViewNameAlreadyInUse() {\r\n return (\r\n this.customViews.filter((customView) => {\r\n const customViewToCheck = !this.isEditingCustomView\r\n ? this.newCustomViewName\r\n : this.editViewName;\r\n return customViewToCheck === customView.name;\r\n }).length > 0\r\n );\r\n }\r\n\r\n populateFilterValues(parameters = [], filters = []) {\r\n const parametersMap = this.flattenTableauFilters(parameters, true);\r\n const filtersMap = this.flattenTableauFilters(filters, false);\r\n\r\n this.tableauFilters = this.tableauFilters.map((filter) => {\r\n const { isParameter, name: filterName } = filter;\r\n let matchedArray = isParameter ? parametersMap[filterName] : filtersMap[filterName];\r\n\r\n if (matchedArray) {\r\n // Filter null\r\n matchedArray = matchedArray.filter((match) => match.value !== null);\r\n\r\n filter.values = isParameter\r\n ? matchedArray.map((match) => ({ label: match.formattedValue, value: match.value }))\r\n : matchedArray.map((match) => ({ selected: true, text: match.value }));\r\n }\r\n return filter;\r\n });\r\n }\r\n\r\n get appLanguage() {\r\n return get(this.$rootScope, 'currentUser.claims.data.language', 'en');\r\n }\r\n\r\n applyFilter(filter) {\r\n const { name, values } = filter || {};\r\n\r\n if (name && values && this.activeSheet) {\r\n let type = filter.type;\r\n\r\n if (!type) {\r\n type = tableau.FilterUpdateType.REPLACE;\r\n }\r\n\r\n this.activeSheet.getWorksheets()[1].applyFilterAsync(name, values, type);\r\n }\r\n }\r\n\r\n changeParameter(parameter) {\r\n const { name, value = null } = parameter || {};\r\n\r\n if (name && value !== null && this.workbook) {\r\n this.workbook.changeParameterValueAsync(name, value);\r\n }\r\n }\r\n\r\n exportToPDF() {\r\n if (this.viz) {\r\n this.viz.showExportPDFDialog();\r\n }\r\n }\r\n\r\n exportToCSV() {\r\n const modalInstance = this.$uibModal.open({\r\n animation: true,\r\n template: exportOptionsPopupTemplate,\r\n controller: 'ExportOptionsPopupController',\r\n controllerAs: 'exportOptionsPopupVm',\r\n resolve: {\r\n exportOptions: () =>\r\n this.exportOptions?.map((exportOption) => ({\r\n label: this.gettextCatalog.getString(exportOption.replace('- Export', '')?.trim()),\r\n value: exportOption,\r\n })),\r\n },\r\n size: 'sm',\r\n });\r\n\r\n modalInstance.result\r\n .then((selectedOption) => {\r\n const { value = '' } = selectedOption;\r\n if (this.viz && this.activeSheet && value) {\r\n if (value === '__all__') {\r\n this.exportOptions.forEach((option) => {\r\n this.viz.showExportCrossTabDialog(option);\r\n });\r\n } else {\r\n this.viz.showExportCrossTabDialog(value);\r\n }\r\n }\r\n })\r\n .catch((error) => console.log('Modal error: ' + error));\r\n }\r\n\r\n exportToImage() {\r\n if (this.viz && this.activeSheet) {\r\n this.viz.showExportImageDialog();\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: InteractiveReportController,\r\n bindings: {},\r\n};\r\n","import App from '../../app';\r\n\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Analytics\";\r\n\r\nexport default function ReportsController() {\r\n\r\n 'ngInject';\r\n\r\n this.$onInit = () => {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n\r\n}","import template from './filters-view.html';\r\nimport moment from 'moment';\r\n\r\n// Constants\r\nconst CUSTOM_REGEX_MATCH = /Custom.*/;\r\nconst DATE_FILTER_NAME = 'Date Filter';\r\nconst DATE_START_FILTER = 'Start Date';\r\nconst DATE_END_FILTER = 'End Date';\r\nconst CONTRACT_START_FILTER = 'Contract Start';\r\nconst CONTRACT_END_FILTER = 'Contract End';\r\nconst RADIO_BUTTON_TYPE_FILTER = 'radio_button';\r\nconst MULTI_SELECT_TYPE_FILTER = 'multiselect';\r\nconst INPUT_TEXT_TYPE = 'input_text';\r\n\r\nclass FiltersViewController {\r\n constructor($timeout) {\r\n 'ngInject';\r\n this.selectedParameters = {};\r\n this.$timeout = $timeout;\r\n\r\n this.dateFilterName = DATE_FILTER_NAME;\r\n this.startDateName = DATE_START_FILTER;\r\n this.endDateName = DATE_END_FILTER;\r\n this.contractStartStr = CONTRACT_START_FILTER;\r\n this.contractEndStr = CONTRACT_END_FILTER;\r\n this.radioButtonType = RADIO_BUTTON_TYPE_FILTER;\r\n this.multiSelectType = MULTI_SELECT_TYPE_FILTER;\r\n this.inputTextType = INPUT_TEXT_TYPE;\r\n\r\n // For date-filter\r\n // 3 Months limit ( tableau side )\r\n this.startDateVal = moment()\r\n .subtract(1, 'day')\r\n .toDate();\r\n this.endDateVal = moment().toDate();\r\n\r\n this.startDateOptions = {minDate: moment().subtract(3, 'months'), maxDate: moment().subtract(1, 'day')};\r\n this.endDateOptions = {minDate: this.startDateVal, maxDate: moment()};\r\n }\r\n $onInit() {\r\n // Setting callback from parent to child to update the values.\r\n this.updateFilter = filters => this.updateFilters(filters);\r\n this.loaded = true;\r\n // Ignore those filters as they have different layout\r\n this.loopIgnoreFilters = {\r\n [DATE_START_FILTER]: true,\r\n [DATE_END_FILTER]: true,\r\n [CONTRACT_END_FILTER]: true\r\n };\r\n this.filtersLoading = true;\r\n }\r\n $onChanges() {\r\n this.tableauFilters = this.filters || [];\r\n }\r\n isCustomDate(filterName) {\r\n return CUSTOM_REGEX_MATCH.test(this.selectedParameters[filterName] || '');\r\n }\r\n\r\n updateFilters(valueFilters) {\r\n this.$timeout(() => (this.filtersLoading = false), 100);\r\n this.tableauFilters = valueFilters;\r\n }\r\n\r\n filterHasChanged(filterObject) {\r\n this.filterChanged({filter: filterObject});\r\n }\r\n\r\n parameterChanged(parameterObject) {\r\n const {name: parameterName, value} = parameterObject;\r\n\r\n if (parameterName && value) {\r\n this.selectedParameters[parameterName] = value;\r\n }\r\n\r\n this.changeParameter({parameter: parameterObject});\r\n }\r\n\r\n // Date update val\r\n updateStartDate() {\r\n this.endDateOptions.minDate = this.startDateVal;\r\n this.changeParameter({parameter: {name: DATE_START_FILTER, value: this.startDateVal}});\r\n }\r\n updateEndDate() {\r\n this.startDateOptions.maxDate = this.endDateVal;\r\n this.changeParameter({parameter: {name: DATE_END_FILTER, value: this.endDateVal}});\r\n }\r\n}\r\nexport default {\r\n template,\r\n controller: FiltersViewController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n filters: '<',\r\n filterChanged: '&',\r\n changeParameter: '&',\r\n updateFilter: '='\r\n }\r\n};\r\n","import template from './filter-date-picker.html';\r\n\r\nclass FilterDatePickerComponent {\r\n constructor() {\r\n this.isPopupOpen = false;\r\n this.dateFormat = 'yyyy/MM/dd';\r\n this.openPopup = () => {\r\n this.isPopupOpen = true;\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.dateSelected = this.selected;\r\n }\r\n\r\n dateChanged() {\r\n setTimeout(() => this.updateDate(), 0);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: FilterDatePickerComponent,\r\n controllerAs: 'vm',\r\n bindings: {\r\n updateDate: '&',\r\n options: '=',\r\n selected: '='\r\n }\r\n};\r\n","import template from './multi-select-dropdown.html';\r\n\r\nclass MultiSelectDropdownController {\r\n constructor() {\r\n this.filteredOptions = [];\r\n this.showDropdown = false;\r\n this.searchInput = {};\r\n this.filteredOptions = [];\r\n this.isAllSelected = true;\r\n }\r\n\r\n $onChanges() {\r\n this.inputName = this.dropdownPrompt || '';\r\n this.filteredOptions = this.options || [];\r\n }\r\n\r\n toggleDropdown($event) {\r\n this.showDropdown = !this.showDropdown;\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n allSelectedChanged() {\r\n const type = this.isAllSelected\r\n ? tableau.FilterUpdateType.ADD\r\n : tableau.FilterUpdateType.REMOVE;\r\n\r\n const optionsChanged = this.options\r\n .filter((option) => option.selected !== this.isAllSelected)\r\n .map((option) => option.text);\r\n\r\n if (optionsChanged.length > 0) {\r\n this.options = this.options.map((option) => {\r\n option.selected = this.isAllSelected;\r\n return option;\r\n });\r\n this.filteredOptions = this.filteredOptions.map((filterOpt) => {\r\n filterOpt.selected = this.isAllSelected;\r\n return filterOpt;\r\n });\r\n\r\n this.updateSelection({\r\n filterObject: {\r\n name: this.dropdownName,\r\n values: [...optionsChanged],\r\n type: type,\r\n },\r\n });\r\n }\r\n }\r\n\r\n selectionChanged(option) {\r\n const type = option.selected ? tableau.FilterUpdateType.ADD : tableau.FilterUpdateType.REMOVE;\r\n\r\n this.options = this.options.map((opt) => {\r\n if (opt.text === option.text) opt.selected = option.selected;\r\n return opt;\r\n });\r\n\r\n // Check if everything is selected\r\n\r\n const numberOfSelected = this.options.reduce((accumulator, currentVal) => {\r\n if (currentVal.selected) accumulator++;\r\n return accumulator;\r\n }, 0);\r\n\r\n const isAllOptionsSelected = numberOfSelected === this.options.length;\r\n\r\n this.isAllSelected = isAllOptionsSelected;\r\n\r\n this.updateSelection({\r\n filterObject: {\r\n name: this.dropdownName,\r\n values: [option.text],\r\n type: type,\r\n },\r\n });\r\n }\r\n\r\n searchInputChanged($event) {\r\n // Option 'i' case insensitive\r\n const regexSearch = new RegExp(this.searchInput.value, 'i');\r\n this.filteredOptions = this.options.filter((option) => regexSearch.test(option.text));\r\n }\r\n\r\n removeSelection(option) {\r\n option.selected = false;\r\n\r\n this.updateSelection({\r\n filterObject: {\r\n name: this.dropdownName,\r\n values: [option.text],\r\n type: tableau.FilterUpdateType.REMOVE,\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: MultiSelectDropdownController,\r\n bindings: {\r\n dropdownName: '<',\r\n dropdownPrompt: '<',\r\n options: '<',\r\n updateSelection: '&',\r\n },\r\n controllerAs: 'vm',\r\n};\r\n","import template from './single-select-dropdown.html';\r\nclass SingleSelectController {\r\n constructor() {\r\n this.isDropdownOpen = false;\r\n this.selectedOption = '';\r\n this.filterOptions = [];\r\n }\r\n $onChanges() {\r\n this.filterName = this.filterName || '';\r\n this.filterOptions = this.options || [];\r\n this.label = this.label || this.filterPrompt;\r\n }\r\n\r\n // Functions\r\n\r\n toggleDropdown() {\r\n this.isDropdownOpen = !this.isDropdownOpen;\r\n }\r\n\r\n selectionChanged(option) {\r\n const { label = '' } = option;\r\n this.selectedOption = label;\r\n this.selectionChange({ parameterObject: { name: this.filterName, value: label } });\r\n this.toggleDropdown();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SingleSelectController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n filterName: '@',\r\n filterPrompt: '@',\r\n translateValues: ' 1) {\r\n ctrl.exportOptions.push({ label: gettextCatalog.getString('Export All'), value: '__all__' });\r\n }\r\n \r\n ctrl.selectedOption = ctrl.exportOptions[0];\r\n\r\n ctrl.export = () => {\r\n\r\n if (ctrl.selectedOption?.value !== '') {\r\n $uibModalInstance.close(ctrl.selectedOption);\r\n }\r\n }\r\n\r\n ctrl.cancel = () => {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n}\r\n","export default class {\r\n constructor($uibModalInstance, view) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.view = view;\r\n }\r\n\r\n delete() {\r\n this.$uibModalInstance.close();\r\n }\r\n\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}","export default class {\r\n constructor($uibModalInstance, view) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.view = view || { name: 'The current view'};\r\n }\r\n\r\n overwrite() {\r\n this.$uibModalInstance.close();\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}","import angular from 'angular';\r\n/* Module Imports */\r\nimport jobSchedulesJobModule from './jobschedules/jobschedules.module';\r\nimport reportViewModule from './reportview/reportview.module';\r\n\r\n/* Additional Imports */\r\nimport ReportsRouteConfig from './reports.route';\r\n\r\nimport ReportingService from './services/reporting.service';\r\n\r\nimport ReportsListComponent from './reports-list/reports-list.component';\r\nimport InteractiveReportComponent from './interactive-report-view/interactive-report-view.component';\r\n\r\nimport ReportsController from './reports.controller';\r\nimport FilterViewController from './filters/filters-view/filters-view.component';\r\nimport FilterDatePicker from './filters/filter-date-picker/filter-date-picker.component';\r\nimport MultiSelectDropdownController from './filters/multi-select-dropdown/multi-select-dropdown.component';\r\nimport SingleSelectDropdownController from './filters/single-select-dropdown/single-select-dropdown.component';\r\nimport FilterTextInputComponent from './filters/filter-text-input/filter-text-input.component';\r\nimport ExportOptionsPopupController from \"./export-options-popup/export-options-popup.controller\";\r\nimport DeleteCustomViewPopupController from './delete-custom-view-popup/delete-custom-view-popup.controller'\r\nimport OverwriteCustomViewPopupController from './overwrite-cutom-view-popup/overwrite-custom-view-popup.controller'\r\n\r\nconst reportsModule = angular\r\n .module('app.reports', ['ui.bootstrap', 'ui.router', 'gettext', jobSchedulesJobModule, reportViewModule])\r\n .config(ReportsRouteConfig)\r\n .controller('ReportsController', ReportsController)\r\n .controller('ExportOptionsPopupController', ExportOptionsPopupController)\r\n .controller('DeleteCustomViewPopupController', DeleteCustomViewPopupController)\r\n .controller('OverwriteCustomViewPopupController', OverwriteCustomViewPopupController)\r\n\r\n .service('reportingService', ReportingService)\r\n\r\n .component('reportsList', ReportsListComponent)\r\n .component('interactiveReport', InteractiveReportComponent)\r\n .component('filtersView', FilterViewController)\r\n .component('filterDatePicker', FilterDatePicker)\r\n .component('multiSelectDropdown', MultiSelectDropdownController)\r\n .component('singleSelectDropdown', SingleSelectDropdownController)\r\n .component('filterTextInput', FilterTextInputComponent);\r\n\r\nexport default reportsModule.name;\r\n","export default function TSeriesUtilizationController(\r\n $scope,\r\n TSeriesService,\r\n $q,\r\n $timeout,\r\n $state,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n // variable\r\n var self = this;\r\n $scope.utilizations = [];\r\n $scope.utilizationcsvexportData = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = gettextCatalog.getString('Oops! Somthing went wrong.');\r\n var timer = null;\r\n\r\n // column colors\r\n var colorArray = ['#FF0F00', '#FF6600', '#04D215', '#F8FF01', '#0D8ECF', '#2A0CD0', '#CD0D74'];\r\n\r\n self.init = function () {\r\n $scope.loading = true;\r\n $scope.errorFlag = false;\r\n\r\n TSeriesService.getUtilizationSummary()\r\n .then(\r\n function (response) {\r\n $scope.utilizations = [];\r\n var color_index = 0;\r\n if (response.data) {\r\n for (var i = 0; i < response.data.length; i++) {\r\n if (color_index == colorArray.length) {\r\n color_index = 0;\r\n }\r\n var name = response.data[i].name ? response.data[i].name : response.data[i].esn;\r\n var model = response.data[i].model ? response.data[i].model : '';\r\n var make = response.data[i].make ? response.data[i].make : '';\r\n\r\n $scope.utilizations.push({\r\n name: name,\r\n make_model: make + ' ' + model,\r\n equipid: response.data[i].equipmentId,\r\n model: model,\r\n make: make,\r\n utilize: response.data[i].today,\r\n color: colorArray[color_index++]\r\n });\r\n }\r\n }\r\n\r\n self.getChartready();\r\n },\r\n function (error) {\r\n $scope.errorFlag = true;\r\n $scope.errorText = gettextCatalog.getString('Oops! Somthing went wrong.');\r\n }\r\n )\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n\r\n TSeriesService.getUtilizationDetail().then(\r\n function (response) {\r\n var utilizationDetails = response.data || [];\r\n var csvData = self.getCsvData(utilizationDetails);\r\n $scope.utilizationcsvexportData = csvData;\r\n },\r\n function (error) {\r\n $scope.utilizationcsvexportData = [];\r\n }\r\n );\r\n\r\n // run refresh\r\n timer = $timeout(function () {\r\n self.init();\r\n }, 60000); // 1 min\r\n };\r\n\r\n // return utilization details for reports\r\n $scope.getUtilizationDetail = function () {\r\n // use defeerd object so download will wait till callback done\r\n var deferred = $q.defer();\r\n var csvData = [];\r\n TSeriesService.getUtilizationDetail().then(\r\n function (response) {\r\n var utilizationDetails = response.data;\r\n csvData = self.getCsvData(utilizationDetails);\r\n deferred.resolve(csvData);\r\n },\r\n function (error) {\r\n deferred.reject();\r\n }\r\n );\r\n return deferred.promise;\r\n };\r\n\r\n // return custom tooltip text for the gragh\r\n function adjustBalloonText(graphDataItem, graph) {\r\n return (\r\n graphDataItem.dataContext.name +\r\n '
                ' +\r\n graphDataItem.dataContext.make +\r\n ' ' +\r\n graphDataItem.dataContext.model +\r\n '
                ' +\r\n graphDataItem.dataContext.utilize +\r\n ''\r\n );\r\n }\r\n\r\n // make chart\r\n self.getChartready = function () {\r\n var chart = new AmCharts.makeChart('utilizationChart', {\r\n theme: 'light',\r\n type: 'serial',\r\n startDuration: 0,\r\n dataProvider: $scope.utilizations,\r\n graphs: [{\r\n balloonText: '[[category]]
                [[value]]',\r\n fillAlphas: 1,\r\n lineAlpha: 0.1,\r\n type: 'column',\r\n colorField: 'color',\r\n balloonFunction: adjustBalloonText,\r\n valueField: 'utilize'\r\n }],\r\n valueAxes: [{\r\n axisAlpha: 0,\r\n position: 'left',\r\n gridAlpha: 0\r\n }],\r\n depth3D: 0,\r\n chartCursor: {\r\n categoryBalloonEnabled: false,\r\n cursorAlpha: 0,\r\n zoomable: false\r\n },\r\n categoryField: 'name',\r\n categoryAxis: {\r\n gridPosition: 'start',\r\n axisAlpha: 0,\r\n gridAlpha: 0,\r\n labelRotation: 30\r\n },\r\n export: {\r\n enabled: false\r\n },\r\n listeners: [{\r\n event: 'clickGraphItem',\r\n method: function (event) {\r\n if (event.item.dataContext.equipid) {\r\n $state.go('equipment.detail.overview', {\r\n equipmentId: event.item.dataContext.equipid\r\n });\r\n }\r\n }\r\n }]\r\n });\r\n };\r\n\r\n $scope.getCsvFileName = function () {\r\n var fileName = gettextCatalog.getString('T_series_Utilization_');\r\n var d = new Date();\r\n var date =\r\n d.getFullYear() + '_' + (d.getMonth() + 1) + '_' + d.getDate() + '_' + d.getHours() + '-' + d.getMinutes();\r\n\r\n fileName += date;\r\n return fileName + '.csv';\r\n };\r\n\r\n self.getCsvData = function (utilizationDetailList) {\r\n var CsvData = [];\r\n\r\n var headers = {\r\n ESN: 'ESN',\r\n Name: 'Name',\r\n Make: 'Make',\r\n Model: 'Model',\r\n Today: 'Today (Hours)',\r\n Lifetime: 'Life Time (Hours)'\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n for (var i = 0; i < utilizationDetailList.length; i++) {\r\n var esn = utilizationDetailList[i].esn;\r\n var name = utilizationDetailList[i].name;\r\n var make = utilizationDetailList[i].make;\r\n var model = utilizationDetailList[i].model;\r\n var today = utilizationDetailList[i].today;\r\n var lifetime = utilizationDetailList[i].lifetime;\r\n\r\n var csvObject = {\r\n ESN: esn,\r\n Name: name,\r\n Make: make,\r\n Model: model,\r\n Today: typeof today === 'number' ? today.toFixed(2) : today,\r\n lifetime: typeof lifetime === 'number' ? lifetime.toFixed(2) : lifetime\r\n };\r\n\r\n CsvData.push(csvObject);\r\n }\r\n return CsvData;\r\n };\r\n\r\n self.init();\r\n\r\n // cancel the timer when navigate away.\r\n $scope.$on('$destroy', function () {\r\n if (timer) {\r\n $timeout.cancel(timer);\r\n }\r\n });\r\n}","export default function TSeriesVerficationController(\r\n $scope,\r\n TSeriesService,\r\n $filter,\r\n $q,\r\n $timeout,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n // variable\r\n var self = this;\r\n $scope.validationSummary = {};\r\n $scope.error = false;\r\n $scope.errortext = gettextCatalog.getString('Oops! Somthing went wrong.');\r\n $scope.csvexportData = [];\r\n var timer = null;\r\n\r\n self.init = function () {\r\n $scope.loading = true;\r\n TSeriesService.getValidationSummary()\r\n .then(\r\n function (response) {\r\n $scope.validationSummary = response.data;\r\n self.getChartready();\r\n },\r\n function (error) {\r\n $scope.error = true;\r\n }\r\n )\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n\r\n TSeriesService.getValidationDetail().then(\r\n function (response) {\r\n var validationDetails = response.data;\r\n var csvData = self.getCsvData(validationDetails);\r\n $scope.csvexportData = csvData;\r\n },\r\n function (error) {\r\n $scope.csvexportData = [];\r\n }\r\n );\r\n\r\n // run refresh\r\n timer = $timeout(function () {\r\n self.init();\r\n }, 60000); // 1 min\r\n };\r\n\r\n $scope.getvalidationDetails = function () {\r\n // use defeerd object so download will wait till callback done\r\n var deferred = $q.defer();\r\n var csvData = [];\r\n TSeriesService.getValidationDetail().then(\r\n function (response) {\r\n var validationDetails = response.data;\r\n csvData = self.getCsvData(validationDetails);\r\n\r\n deferred.resolve(csvData);\r\n },\r\n function (error) {\r\n deferred.reject();\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n self.getChartready = function () {\r\n var chart = new AmCharts.makeChart('vericationChart', {\r\n type: 'pie',\r\n theme: 'light',\r\n innerRadius: '70%',\r\n pullOutRadius: '30%',\r\n outlineAlpha: 0,\r\n dataProvider: [{\r\n state: 'Verfied',\r\n count: $scope.validationSummary.active,\r\n color: '#12981c'\r\n },\r\n {\r\n state: 'Unverfied',\r\n count: $scope.validationSummary.inactive,\r\n color: '#d2d2d2'\r\n }\r\n ],\r\n valueField: 'count',\r\n titleField: 'state',\r\n colorField: 'color',\r\n labelColorField: 'color',\r\n radius: '45%',\r\n startDuration: 0,\r\n depth3D: 0,\r\n labelText: '',\r\n balloonText: \"[[value]]
                ([[percents]]%)
                \",\r\n angle: 0,\r\n allLabels: [{\r\n y: '40%',\r\n align: 'center',\r\n size: 22,\r\n bold: true,\r\n text: $scope.validationSummary.active,\r\n color: '#12981c'\r\n }],\r\n legend: {\r\n data: [{\r\n title: 'Total:',\r\n value: $scope.validationSummary.active + $scope.validationSummary.inactive,\r\n color: '#fff'\r\n }],\r\n position: 'bottom',\r\n autoMargins: false,\r\n align: 'center',\r\n fontSize: 18\r\n },\r\n export: {\r\n enabled: false\r\n }\r\n });\r\n };\r\n\r\n $scope.verficationgetCsvFileName = function () {\r\n var fileName = gettextCatalog.getString('T_series_Verfication_');\r\n var d = new Date();\r\n var date =\r\n d.getFullYear() + '_' + (d.getMonth() + 1) + '_' + d.getDate() + '_' + d.getHours() + '-' + d.getMinutes();\r\n\r\n fileName += date;\r\n return fileName + '.csv';\r\n };\r\n\r\n self.getCsvData = function (veficatioDetailList) {\r\n var CsvData = [];\r\n\r\n var headers = {\r\n ESN: 'ESN',\r\n Name: 'Name',\r\n Make: 'Make',\r\n Model: 'Model',\r\n 'Last Communication': 'Last Communication',\r\n 'Previous Communication': 'Previous Communication',\r\n Delta1: 'Delta 1 (minutes)',\r\n Delta2: 'Delta 2 (minutes)'\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n for (var i = 0; i < veficatioDetailList.length; i++) {\r\n var esn = veficatioDetailList[i].esn;\r\n var name = veficatioDetailList[i].name;\r\n var make = veficatioDetailList[i].make;\r\n var model = veficatioDetailList[i].model;\r\n var lastcom = $filter('TableDateFilter')(veficatioDetailList[i].lastCommunication);\r\n var precom = $filter('TableDateFilter')(veficatioDetailList[i].previousCommunication);\r\n var delta1 = veficatioDetailList[i].lastCommDeltaMinutes;\r\n var delta2 = veficatioDetailList[i].previousCommDeltaMinutes;\r\n\r\n var csvObject = {\r\n ESN: esn,\r\n Name: name,\r\n Make: make,\r\n Model: model,\r\n 'Last Communication': lastcom,\r\n 'Previous Communication': precom,\r\n Delta1: typeof delta1 === 'number' ? delta1.toFixed(2) : '',\r\n Delta2: typeof delta2 === 'number' ? delta2.toFixed(2) : ''\r\n };\r\n\r\n CsvData.push(csvObject);\r\n }\r\n\r\n return CsvData;\r\n };\r\n\r\n self.init();\r\n\r\n // cancel the timer when navigate away.\r\n $scope.$on('$destroy', function () {\r\n if (timer) {\r\n $timeout.cancel(timer);\r\n }\r\n });\r\n}","export default function TSeriesRouteConfig($stateProvider, gettext) {\r\n\r\n 'ngInject';\r\n\r\n var tSeriesDashboard = gettext('Dashboard');\r\n\r\n $stateProvider\r\n .state('tseries', {\r\n url: '/tseries',\r\n controller: 'TSeriesDashboardController',\r\n template: require('./dashboard.html'),\r\n ncyBreadcrumb: {\r\n skip: true\r\n },\r\n requiredFeatures: ['tseries']\r\n });\r\n}","export default function TSeriesService($http, appSettings) {\r\n\r\n 'ngInject';\r\n\r\n var tSeriesEndpoint = appSettings.InReachApiEndpoint + '/tseries';\r\n\r\n return {\r\n\r\n getValidationSummary: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=validationsummary';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getValidationDetail: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=ValidationDetail';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getUtilizationSummary: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=UtilizationSummary';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getUtilizationDetail: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=UtilizationDetail';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getInventorySummary: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=InventorySummary';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getInventoryDetail: function () {\r\n var endpoint = tSeriesEndpoint + '/report?type=InventoryDetail';\r\n\r\n return $http.get(endpoint);\r\n },\r\n getRecentFleetActivities: function (size) {\r\n var endpoint = tSeriesEndpoint + '/activity';\r\n if (size && parseInt(size, 10) > 0) endpoint += '?size=' + size;\r\n return $http.get(endpoint);\r\n }\r\n };\r\n}","import angular from 'angular';\r\n\r\n/* Component Imports */\r\nimport { TSeriesActivityFeed, TSeriesMiniMap } from './t-series-activity-feed/activity-feed.component';\r\nimport TSeriesInventory from './t-series-inventory/inventory.component';\r\n/* Controller Imports */\r\nimport TSeriesDashboardController from './dashboard.controller';\r\nimport TSeriesUtilizationController from './t-series-utilization/utilization.controller';\r\nimport TSeriesVerficationController from './t-series-verification/verification.controller';\r\n/* Directive Imports */\r\nimport TSeriesUtilizationDirective from './t-series-utilization/utilization.directive';\r\nimport TSeriesVerificationDirective from './t-series-verification/verification.directive';\r\n/* Service Imports */\r\nimport TSeriesRouteConfig from './t-series.route';\r\nimport TSeriesService from './dashboard.service';\r\n\r\nconst tSeriesModule = angular.module('app.tSeries', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\"\r\n])\r\n/* Components */\r\n.directive('tSeriesActivityFeed', TSeriesActivityFeed)\r\n.directive('tSeriesMiniMap', TSeriesMiniMap)\r\n.directive('tSeriesInventory', TSeriesInventory)\r\n/* Controllers */\r\n.controller('TSeriesDashboardController', TSeriesDashboardController)\r\n.controller('TSeriesUtilizationController', TSeriesUtilizationController)\r\n.controller('TSeriesVerficationController', TSeriesVerficationController)\r\n/* Directives */\r\n.directive('tseriesUtilizationComponent', TSeriesUtilizationDirective)\r\n.directive('tseriesVerficationComponent', TSeriesVerificationDirective)\r\n/* Services */\r\n.config(TSeriesRouteConfig)\r\n.service('TSeriesService', TSeriesService);\r\n\r\nexport default tSeriesModule.name;","import _ from 'lodash';\r\n\r\nexport function TSeriesActivityFeed() {\r\n const REFRESH_SECONDS = 10;\r\n const uomify = (() => {\r\n function equals(f1, f2) {\r\n if (f1 < f2) return false;\r\n if (f2 < f1) return false;\r\n return true;\r\n }\r\n\r\n function pluralify(singular, plural, value, separator) {\r\n separator = separator == null ? ' ' : separator;\r\n if (equals(value, 1)) return '' + value + separator + singular;\r\n return '' + value + separator + plural;\r\n }\r\n\r\n return {\r\n hrs: pluralify.bind(null, 'hour', 'hours'),\r\n min: pluralify.bind(null, 'min', 'mins'),\r\n sec: pluralify.bind(null, 'sec', 'secs')\r\n };\r\n })();\r\n\r\n function clientModel(serverModel) {\r\n return {\r\n id: serverModel.id,\r\n type: serverModel.type,\r\n timestamp: serverModel.time, // will be formatted in template\r\n equipment: {\r\n id: serverModel.equipmentId,\r\n name: serverModel.equipmentName,\r\n meta: {\r\n make: serverModel.equipmentMake,\r\n model: serverModel.equipmentModel,\r\n profile: serverModel.equipmentProfileImage\r\n }\r\n },\r\n location: (serverModel.location || []).length >= 2 ? {\r\n lat: serverModel.location[1],\r\n lng: serverModel.location[0]\r\n } : null,\r\n value: serverModel.value\r\n };\r\n }\r\n\r\n return {\r\n template: require('./activity-feed.component.html'),\r\n restrict: 'E',\r\n scope: {\r\n //events: '='\r\n },\r\n controller: function ($scope, TSeriesService) {\r\n\r\n 'ngInject';\r\n\r\n $scope.events = [];\r\n var timer = null;\r\n\r\n $scope.utilizationString = function (totalhrs) {\r\n totalhrs = parseFloat(totalhrs);\r\n\r\n var hrs = totalhrs | 0,\r\n mns = totalhrs * 60 % 60 | 0,\r\n scs = totalhrs * 60 * 60 % 60 | 0,\r\n parts = [];\r\n\r\n hrs && parts.push(uomify.hrs(hrs));\r\n mns && parts.push(uomify.min(mns));\r\n scs && parts.push(uomify.sec(scs));\r\n\r\n return parts.join(', ');\r\n };\r\n\r\n function diff(arr1, arr2) {\r\n var r = [],\r\n identity = function (e) {\r\n return e.id;\r\n },\r\n hashset = _.map(arr1, identity);\r\n for (var i = 0; i < arr2.length; i++) {\r\n var item = arr2[i],\r\n id = identity(item);\r\n if (hashset.indexOf(id) < 0) {\r\n hashset.push(id);\r\n r.push(item);\r\n }\r\n }\r\n return r;\r\n }\r\n\r\n function fetch() {\r\n TSeriesService\r\n .getRecentFleetActivities(100)\r\n .then(function (r) {\r\n var events = _.map(r.data, clientModel);\r\n var newEvents = diff($scope.events, events);\r\n [].unshift.apply($scope.events, newEvents);\r\n if ($scope.events.length > 100) $scope.events.length = 100;\r\n timer = setTimeout(fetch, REFRESH_SECONDS * 1000);\r\n });\r\n }\r\n\r\n fetch();\r\n\r\n // cancel the timer when navigate away.\r\n $scope.$on('$destroy', function () {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport function TSeriesMiniMap() {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n location: '='\r\n },\r\n template: '',\r\n replace: true,\r\n link: function (scope, element) {\r\n var ll = scope.location;\r\n if (!ll) return;\r\n\r\n var d = document.createElement('div');\r\n element.append(d);\r\n var map = L.map(d, {\r\n zoomControl: false\r\n }).setView([ll.lat, ll.lng], 15);\r\n L.esri.basemapLayer('Streets').addTo(map);\r\n _.forEach(['dragging', 'touchZoom', 'doubleClickZoom', 'scrollWheelZoom', 'boxZoom', 'keyboard', 'tap'],\r\n function (feature) {\r\n map[feature] && map[feature].disable();\r\n }\r\n );\r\n\r\n var dot = L.circleMarker([ll.lat, ll.lng], {\r\n clickable: false\r\n });\r\n dot.setRadius(8);\r\n dot.addTo(map);\r\n }\r\n };\r\n}\r\n","export default function TSeriesInventory() {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n template: require('./inventory.html'),\r\n\r\n controller: function ($scope, $interval, TSeriesService, gettextCatalog) {\r\n 'ngInject';\r\n\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = false;\r\n $scope.isFirstLoad = true;\r\n $scope.inventoryMessage = gettextCatalog.getString('No inventory reported today.');\r\n var timer = null;\r\n\r\n //Refreash the Top 5 Inventory Chart on a 1 minute interval\r\n var c = 0;\r\n timer = $interval(function () {\r\n c++;\r\n if (c === 60 && $scope.isFirstLoad == false) {\r\n c = 0;\r\n getInventorySummary();\r\n getInventoryDetails();\r\n }\r\n }, 1000);\r\n\r\n var populateInventoryChart = function () {\r\n var chart = AmCharts.makeChart('inventoryChart', {\r\n type: 'pie',\r\n theme: 'light',\r\n dataProvider: $scope.inventorySummaryList,\r\n valueField: 'count',\r\n labelText: '[[make_model]]',\r\n titleField: 'make_model',\r\n outlineAlpha: 0.4,\r\n depth3D: 0,\r\n radius: '35%',\r\n startDuration: 0,\r\n balloonText: \"[[make_model]]
                [[count]]\",\r\n angle: 0,\r\n export: {\r\n enabled: false\r\n },\r\n listeners: [{\r\n event: 'init',\r\n method: function (event) {\r\n // apply slice colors to their labels\r\n var chart = event.chart;\r\n if (chart.labelColorField === undefined) chart.labelColorField = 'labelColor';\r\n for (var i = 0; i < chart.chartData.length; i++) {\r\n chart.dataProvider[i][chart.labelColorField] = chart.chartData[i].color;\r\n }\r\n chart.validateData();\r\n }\r\n }]\r\n });\r\n };\r\n //Add Legend to the Inventory Top 5 Chart\r\n //var legend = new AmCharts.AmLegend();\r\n //chart.addLegend(legend, \"inventorylegenddiv\");\r\n\r\n //Request Inventory Summary for Top 5 T-Series\r\n var getInventorySummary = function () {\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.isFirstLoad = false;\r\n $scope.loading = true;\r\n TSeriesService.getInventorySummary()\r\n .then(function (response) {\r\n $scope.inventorySummaryList = [];\r\n for (var i = 0; i < response.data.length; i++) {\r\n $scope.inventorySummaryList.push({\r\n make_model: response.data[i].make + ' ' + response.data[i].model,\r\n count: response.data[i].count\r\n });\r\n }\r\n\r\n $scope.loading = false;\r\n populateInventoryChart();\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString('Unable to retrive T-Series Inventory Summary.');\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }; //getTSeriesInventory\r\n\r\n getInventorySummary();\r\n\r\n ////Request Inventory Details for CSV Export\r\n var getInventoryDetails = function () {\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n TSeriesService.getInventoryDetail()\r\n .then(function (response) {\r\n $scope.inventoryDetailList = [];\r\n for (var i = 0; i < response.data.length; i++) {\r\n $scope.inventoryDetailList.push(response.data[i]);\r\n }\r\n\r\n $scope.loading = false;\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString('Unable to retrieve T-Series Inventory Details.');\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }; //getTSeriesInventory\r\n\r\n getInventoryDetails();\r\n\r\n //Give the csv file it's respective name and append the datetime\r\n $scope.getCsvFileName = function () {\r\n if (!$scope.inventoryDetailList) return '';\r\n\r\n var fileName = gettextCatalog.getString('T-Series Inventory');\r\n var d = new Date();\r\n var date =\r\n d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + '-' + d.getHours() + '-' + d.getMinutes();\r\n fileName += '.' + date;\r\n return fileName + '.csv';\r\n };\r\n\r\n $scope.getCsvData = function () {\r\n var CsvData = [];\r\n\r\n var headers = {\r\n Make: 'Make',\r\n Model: 'Model',\r\n Count: 'Count'\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n for (var i = 0; i < $scope.inventoryDetailList.length; i++) {\r\n var make = $scope.inventoryDetailList[i].make;\r\n var model = $scope.inventoryDetailList[i].model;\r\n var count = $scope.inventoryDetailList[i].count;\r\n\r\n var csvObject = {\r\n Make: make,\r\n Model: model,\r\n Count: count\r\n };\r\n\r\n CsvData.push(csvObject);\r\n }\r\n return CsvData;\r\n };\r\n // cancel the timer when navigate away.\r\n $scope.$on('$destroy', function () {\r\n if (timer) {\r\n $interval.cancel(timer);\r\n }\r\n });\r\n }\r\n };\r\n}","export default function TSeriesDashboardController() {\r\n\r\n 'ngInject';\r\n\r\n}","\r\nexport default function TSeriesUtilizationDirective() {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: 'TSeriesUtilizationController',\r\n template: require('./utilization.html'),\r\n };\r\n}\r\n","\r\nexport default function TSeriesVerificationDirective() {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: 'TSeriesVerficationController',\r\n template: require('./verification.html'),\r\n };\r\n}\r\n","export default function DatapointDisplayListController(\r\n\t$state,\r\n\t$stateParams,\r\n\tgettextCatalog,\r\n\tDatapointdisplayObjects,\r\n\tDatapointdisplayService\r\n) {\r\n\t'ngInject';\r\n\r\n\tvar vm = this;\r\n\r\n\t//Bounded variables\r\n\tvm.loaded = false;\r\n\tvm.loading = false;\r\n\tvm.chartTypeOptions = DatapointdisplayObjects.getChartTypes();\r\n\tvm.aggregateFunctions = DatapointdisplayObjects.getAggregateFunctions();\r\n\tvm.datapointDisplayStatus = null;\r\n\tvm.packagesTable = {};\r\n\tvm.modulesTable = {};\r\n\tvm.error = '';\r\n\tvm.applyingModule = false;\r\n\tvm.datapointList = [];\r\n\tvm.data = { selectedModules: [], selectedPackage: null };\r\n\tvm.modulesListForPackage = [];\r\n\tvm.datapointsTitleMap = {};\r\n\r\n\t//local variables\r\n\tvar datapointDisplayListData = {};\r\n\r\n\t// Bounded functions\r\n\tvm.toggleAggregate = toggleAggregate;\r\n\tvm.applyModule = applyModule; //apply the configuration\r\n\tvm.onSelectedPackageChange = onSelectedPackageChange;\r\n\tvm.onSelectedModuleChange = onSelectedModuleChange;\r\n\r\n\t//init\r\n\tvm.$onInit = init;\r\n\r\n\tfunction toggleAggregate(datapointItem, aggregate) {\r\n\t\tdatapointItem.aggregates = DatapointdisplayService.toggleAggregate(datapointItem.aggregates, aggregate.value);\r\n\t}\r\n\r\n\tfunction getSelectedPackageId() {\r\n\t\treturn vm.data.selectedPackage;\r\n\t}\r\n\r\n\tfunction getSelectedModuleIds() {\r\n\t\tvar moduleIds = [];\r\n\r\n\t\tfor (var i = 0; i < vm.data.selectedModules.length; i++) {\r\n\t\t\tmoduleIds.push(vm.data.selectedModules[i].id);\r\n\t\t}\r\n\t\treturn moduleIds;\r\n\t}\r\n\r\n\tfunction onSelectedPackageChange() {\r\n\t\tvm.data.selectedModules = [];\r\n\r\n\t\tvar selectedPackage = getSelectedPackageId();\r\n\t\tvar selectedModules = getSelectedModuleIds();\r\n\r\n\t\tvm.modulesListForPackage = DatapointdisplayService.getModulesForPackage(\r\n\t\t\tselectedPackage,\r\n\t\t\tvm.packagesTable,\r\n\t\t\tvm.modulesTable\r\n\t\t);\r\n\r\n\t\tvm.datapointList = DatapointdisplayService.getDatapointListForPackageAndModules(\r\n\t\t\tselectedPackage,\r\n\t\t\tselectedModules,\r\n\t\t\tdatapointDisplayListData.data,\r\n\t\t\tvm.packagesTable,\r\n\t\t\tvm.modulesTable\r\n\t\t);\r\n\r\n\t\t//update the status\r\n\t\t// //vm.datapointDisplayStatus = DatapointdisplayService.getDatapointListStatus(vm.datapointList);\r\n\r\n\t\tif (selectedPackage) {\r\n\t\t\tupdateStateParams();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction onSelectedModuleChange() {\r\n\t\tvar selectedModules = getSelectedModuleIds();\r\n\r\n\t\tvar selectedPackage = getSelectedPackageId();\r\n\r\n\t\tif (vm.data.selectedModules) {\r\n\t\t\tupdateStateParams();\r\n\t\t\tvm.datapointList = DatapointdisplayService.getDatapointListForPackageAndModules(\r\n\t\t\t\tselectedPackage,\r\n\t\t\t\tselectedModules,\r\n\t\t\t\tdatapointDisplayListData.data,\r\n\t\t\t\tvm.packagesTable,\r\n\t\t\t\tvm.modulesTable\r\n\t\t\t);\r\n\r\n\t\t\t//update the status\r\n\t\t\tvm.datapointDisplayStatus = DatapointdisplayService.getDatapointListStatus(vm.datapointList);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction applyModule() {\r\n\t\tif (vm.applyingModule) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvm.applyingModule = true;\r\n\r\n\t\tvar selectedPackageIds = getSelectedPackageId();\r\n\r\n\t\tvar selectedModuleIds = getSelectedModuleIds();\r\n\r\n\t\tDatapointdisplayService.saveDatapointdisplay(selectedPackageIds, selectedModuleIds, vm.datapointList)\r\n\t\t\t.then(\r\n\t\t\t\tfunction(response) {\r\n\t\t\t\t\tdatapointDisplayListData.data = DatapointdisplayService.updateCashedDatapointdisplayData(\r\n\t\t\t\t\t\tdatapointDisplayListData.data,\r\n\t\t\t\t\t\tresponse.data.data\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t//update lookup tables\r\n\t\t\t\t\tsetLookupTables();\r\n\r\n\t\t\t\t\t//update datapoint list\r\n\t\t\t\t\tvm.datapointList = DatapointdisplayService.getDatapointListForPackageAndModules(\r\n\t\t\t\t\t\tselectedPackageIds,\r\n\t\t\t\t\t\tselectedModuleIds,\r\n\t\t\t\t\t\tdatapointDisplayListData.data,\r\n\t\t\t\t\t\tvm.packagesTable,\r\n\t\t\t\t\t\tvm.modulesTable\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t//update the status\r\n\t\t\t\t\tvm.datapointDisplayStatus = DatapointdisplayService.getDatapointListStatus(vm.datapointList);\r\n\t\t\t\t},\r\n\t\t\t\tfunction(error) {}\r\n\t\t\t)\r\n\t\t\t.finally(function() {\r\n\t\t\t\tvm.applyingModule = false;\r\n\t\t\t});\r\n\t}\r\n\r\n\tfunction setLookupTables() {\r\n\t\tvm.packagesTable = DatapointdisplayService.createPackagesLookupTable(datapointDisplayListData.included);\r\n\r\n\t\tvm.modulesTable = DatapointdisplayService.createModulesLookupTable(datapointDisplayListData.included);\r\n\t}\r\n\r\n function updateStateParams() {\r\n if (vm.loaded) {\r\n const selectedPackageId = getSelectedPackageId();\r\n const selectedModuleIds = getSelectedModuleIds();\r\n //if different do this:\r\n if ($stateParams.packageId !== selectedPackageId || $stateParams.moduleIds !== selectedModuleIds) {\r\n var params = {\r\n packageId: selectedPackageId,\r\n moduleIds: selectedModuleIds\r\n };\r\n $state.go('.', params);\r\n }\r\n }\r\n }\r\n\r\n\r\n function loadStateParams() {\r\n var param = {\r\n packageId: $stateParams.packageId,\r\n moduleIds: $stateParams.moduleIds\r\n };\r\n vm.data.selectedPackage = param.packageId;\r\n\r\n if (param && param.packageId) {\r\n vm.onSelectedPackageChange();\r\n }\r\n\r\n if (param && param.moduleIds) {\r\n if (Array.isArray(param.moduleIds)) {\r\n for (var i = 0; i < param.moduleIds.length; i++) {\r\n vm.data.selectedModules.push({\r\n id: param.moduleIds[i]\r\n });\r\n }\r\n } else {\r\n vm.data.selectedModules.push({\r\n id: param.moduleIds\r\n });\r\n }\r\n vm.onSelectedModuleChange();\r\n }\r\n }\r\n\r\n\tfunction init() {\r\n\t\tvm.loading = true;\r\n\t\tDatapointdisplayService.getAllDatapointDisplayList()\r\n\t\t\t.then(\r\n\t\t\t\tfunction(response) {\r\n\t\t\t\t\tdatapointDisplayListData = response.data;\r\n\r\n\t\t\t\t\tsetLookupTables();\r\n\r\n\t\t\t\t\tvm.loaded = true;\r\n\r\n\t\t\t\t\tvm.datapointsTitleMap = DatapointdisplayService.CreateDatapointMapObject();\r\n\t\t\t\t\tloadStateParams();\r\n\t\t\t\t},\r\n\t\t\t\tfunction(response) {\r\n\t\t\t\t\tvm.error = gettextCatalog.getString('Error getting datapoint list' + response.data);\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t\t\t.finally(function(response) {\r\n\t\t\t\tvm.loading = false;\r\n\t\t\t});\r\n\t}\r\n}\r\n","export default function DatapointdisplayObjects(gettextCatalog) {\r\n\t'ngInject';\r\n\r\n\tvar service = {\r\n\t\tgetChartTypes: _getChartTypes,\r\n\t\tgetAggregateFunctions: _getAggregateFunctions\r\n\t};\r\n\r\n\tfunction _getChartTypes() {\r\n\t\tvar chartTypeOptions = [\r\n\t\t\t{\r\n\t\t\t\tlabel: '---',\r\n\t\t\t\tvalue: null,\r\n\t\t\t\tdescription: ''\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Line Chart'),\r\n\t\t\t\tvalue: 'line',\r\n\t\t\t\tdescription: gettextCatalog.getString('Standard line chart with multiple aggregates on single chart.')\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Step Chart'),\r\n\t\t\t\tvalue: 'step',\r\n\t\t\t\tdescription: gettextCatalog.getString('Step chart for state values.')\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Step Chart - Disconnected'),\r\n\t\t\t\tvalue: 'step_disconnected',\r\n\t\t\t\tdescription: gettextCatalog.getString(\r\n\t\t\t\t\t'Step chart for state values where connection is not appropriate. (E.g. more than 3 states)'\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t];\r\n\r\n\t\treturn chartTypeOptions;\r\n\t}\r\n\r\n\tfunction _getAggregateFunctions() {\r\n\t\tvar aggregateFunctions = [\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Mean'),\r\n\t\t\t\tvalue: 'mean'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Min'),\r\n\t\t\t\tvalue: 'min'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Max'),\r\n\t\t\t\tvalue: 'max'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('First'),\r\n\t\t\t\tvalue: 'first'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Last'),\r\n\t\t\t\tvalue: 'last'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Count'),\r\n\t\t\t\tvalue: 'count'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: gettextCatalog.getString('Delta'),\r\n\t\t\t\tvalue: 'delta'\r\n\t\t\t}\r\n\t\t];\r\n\r\n\t\treturn aggregateFunctions;\r\n\t}\r\n\r\n\treturn service;\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport default function DatapointdisplayService(ConfigService, DatapointdisplayObjects, $rootScope) {\r\n\t'ngInject';\r\n\r\n\tvar service = {\r\n\t\tgetAllDatapointDisplayList: getAllDatapointDisplayList,\r\n\t\tgetDatapointDisplayForPackageAndModules: getDatapointDisplayForPackageAndModules,\r\n\t\tcreatePackagesLookupTable: createPackagesLookupTable,\r\n\t\tcreateModulesLookupTable: createModulesLookupTable,\r\n\t\tgetDatapointListForPackageAndModules: getDatapointListForPackageAndModules,\r\n\t\tformatCurrentDatapointDisplay: formatCurrentDatapointDisplay,\r\n\t\tgetModulesForPackage: getModulesForPackage,\r\n\t\tsaveDatapointdisplay: saveDatapointdisplay,\r\n\t\tupdateCashedDatapointdisplayData: updateCashedDatapointdisplayData,\r\n\t\ttoggleAggregate: toggleAggregate,\r\n\t\tCreateDatapointMapObject: CreateDatapointMapObject,\r\n\t\tgetDatapointListStatus: getDatapointListStatus\r\n\t};\r\n\r\n\t///===================\r\n\tfunction getAllDatapointDisplayList() {\r\n\t\treturn ConfigService.getDatapointDisplayList();\r\n\t}\r\n\r\n\tfunction createPackagesLookupTable(packageListData) {\r\n\t\tvar packages = _.filter(packageListData, function(e) {\r\n\t\t\treturn e.type === 'package';\r\n\t\t});\r\n\t\treturn _.KeyBy(_.sortBy(packages, 'attributes.name'), 'id');\r\n\t}\r\n\r\n\tfunction createModulesLookupTable(packageListData) {\r\n\t\treturn _.KeyBy(\r\n\t\t\t_.filter(packageListData, function(e) {\r\n\t\t\t\treturn e.type === 'module';\r\n\t\t\t}),\r\n\t\t\t'id'\r\n\t\t);\r\n\t}\r\n\r\n\t// return data point display for the combination of package and modules if exist\r\n\tfunction getDatapointDisplayForPackageAndModules(packageId, moduleIds, datapointDisplayListData) {\r\n\t\tif (!packageId) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!_.isArray(moduleIds)) moduleIds = [];\r\n\r\n\t\tif (!datapointDisplayListData) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar datapointDisplayByPackageTable = _.groupBy(datapointDisplayListData, function(item) {\r\n\t\t\treturn item.relationships.package.data.id;\r\n\t\t});\r\n\r\n\t\tvar dpd = _.find(datapointDisplayByPackageTable[packageId], function(entry) {\r\n\t\t\treturn (\r\n\t\t\t\t_.xor(\r\n\t\t\t\t\t_.map(entry.relationships.modules.data, function(module) {\r\n\t\t\t\t\t\treturn module.id;\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tmoduleIds\r\n\t\t\t\t).length === 0\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn dpd;\r\n\t}\r\n\r\n\t//return a list of conmbined datapoints in the package and modules configured by datapointdisplay object if exist\r\n\tfunction getDatapointListForPackageAndModules(\r\n\t\tselectedPackageId,\r\n\t\tselectedModuleIds,\r\n\t\tdatapointDisplayListData,\r\n\t\tpackagesTable,\r\n\t\tmodulesTable\r\n\t) {\r\n\t\tif (!selectedPackageId) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (!_.isArray(selectedModuleIds)) selectedModuleIds = [];\r\n\r\n\t\tvar datapointDisplayConfig = getDatapointDisplayForPackageAndModules(\r\n\t\t\tselectedPackageId,\r\n\t\t\tselectedModuleIds,\r\n\t\t\tdatapointDisplayListData\r\n\t\t);\r\n\r\n\t\tvar datapointDict = {};\r\n\r\n\t\tvar selectedEntities = [];\r\n\r\n\t\tvar datapointList = [];\r\n\r\n\t\tif (selectedModuleIds.length > 0) {\r\n\t\t\tfor (var i = 0; i < selectedModuleIds.length; i++) {\r\n\t\t\t\tselectedEntities.push(modulesTable[selectedModuleIds[i]]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (selectedPackageId) {\r\n\t\t\tselectedEntities.push(packagesTable[selectedPackageId]);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < selectedEntities.length; i++) {\r\n\t\t\tconst entity = selectedEntities[i];\r\n\r\n\t\t\tif (entity) {\r\n\t\t\t\tif (entity.relationships) {\r\n\t\t\t\t\tif (entity.relationships.datapoints) {\r\n\t\t\t\t\t\tfor (var j = 0; j < entity.relationships.datapoints.data.length; j++) {\r\n\t\t\t\t\t\t\tdatapointDict[entity.relationships.datapoints.data[j].id] = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar keys = Object.keys(datapointDict);\r\n\r\n\t\t//Manually add speed and gps\r\n\r\n\t\tkeys.push('gps');\r\n\t\tkeys.push('speed');\r\n\r\n\t\tvar unconfiguredItems = [];\r\n\r\n\t\tif (datapointDisplayConfig) {\r\n\t\t\t//Iterate through the datapoints that have been configured on this current configuration\r\n\t\t\t//Sort by the display items\r\n\t\t\tconst sortedDisplayItems = _.sortBy(datapointDisplayConfig.attributes.displayItems, 'ordinal');\r\n\r\n\t\t\tconst items = sortedDisplayItems\r\n\t\t\t\t.map(item => ({\r\n\t\t\t\t\tid: item.dataId,\r\n\t\t\t\t\tdisplayItem: item\r\n\t\t\t\t}))\r\n\t\t\t\t.filter(item => item.displayItem.dataId != null && item.displayItem.dataId.length > 0);\r\n\r\n\t\t\tfor (let i = 0; i < items.length; i++) {\r\n\t\t\t\tdatapointList.push(items[i]);\r\n\t\t\t}\r\n\r\n\t\t\t//Add all of the datapoints in the keys that aren't in the display items data id field\r\n\t\t\tunconfiguredItems = keys.filter(\r\n\t\t\t\tkey => !datapointDisplayConfig.attributes.displayItems.find(f => f.dataId === key)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tunconfiguredItems = keys;\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < unconfiguredItems.length; i++) {\r\n\t\t\tvar aggregateFunctions = DatapointdisplayObjects.getAggregateFunctions();\r\n\t\t\tdatapointList.push({\r\n\t\t\t\tid: unconfiguredItems[i],\r\n\t\t\t\tunconfigured: true,\r\n\t\t\t\tdisplayItem: {\r\n\t\t\t\t\tvisible: true,\r\n\t\t\t\t\tdataId: unconfiguredItems[i],\r\n\t\t\t\t\taggregates: aggregateFunctions.map(func => func.value)\r\n\t\t\t\t} //Empty object with defaults\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn datapointList;\r\n\t}\r\n\r\n\t// //Format the current view variables to a datapoint display model for the api\r\n\tfunction formatCurrentDatapointDisplay(datapointList) {\r\n\t\tif (!_.isArray(datapointList)) {\r\n\t\t\tdatapointList = [];\r\n\t\t}\r\n\t\tvar datapointDisplay = {};\r\n\r\n\t\tdatapointDisplay.displayItems = [];\r\n\t\t//Push all of the items onto the datapoint display\r\n\t\tfor (var i = 0; i < datapointList.length; i++) {\r\n\t\t\tvar item = datapointList[i];\r\n\t\t\titem.displayItem.ordinal = i;\r\n\r\n\t\t\titem.displayItem.valueColorMap = {\r\n\t\t\t\t'0': '#ffffff',\r\n\t\t\t\t'1': '#000000'\r\n\t\t\t};\r\n\r\n\t\t\tdatapointDisplay.displayItems.push(item.displayItem);\r\n\t\t}\r\n\t\treturn datapointDisplay;\r\n\t}\r\n\r\n\t//return modules list that can be apply to the package\r\n\tfunction getModulesForPackage(packageId, packagesTable, modulesTable) {\r\n\t\tif (!packageId) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (!packagesTable[packageId]) return [];\r\n\r\n\t\tvar modules = packagesTable[packageId].relationships.modules.data;\r\n\t\tvar mapped = _.map(modules, function(e) {\r\n\t\t\treturn modulesTable[e.id];\r\n\t\t});\r\n\r\n\t\tvar sorted = _.sortBy(mapped, function(e) {\r\n\t\t\t//null check\r\n\t\t\tif (angular.isDefined(e)) {\r\n\t\t\t\tif (e.attributes) {\r\n\t\t\t\t\treturn e.attributes.name.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn '';\r\n\t\t});\r\n\r\n\t\treturn sorted;\r\n\t}\r\n\r\n\tfunction saveDatapointdisplay(selectedPackageIds, selectedModuleIds, datapointList) {\r\n\t\tvar newDatapointDisplay = this.formatCurrentDatapointDisplay(datapointList);\r\n\t\treturn ConfigService.createDatapointDisplayForPackageAndModules(\r\n\t\t\tselectedPackageIds,\r\n\t\t\tselectedModuleIds,\r\n\t\t\tnewDatapointDisplay\r\n\t\t);\r\n\t}\r\n\r\n\tfunction updateCashedDatapointdisplayData(datapointDisplayListData, savedConfigData) {\r\n\t\tvar index = _.findIndex(datapointDisplayListData, function(config) {\r\n\t\t\treturn config.id == savedConfigData.id;\r\n\t\t});\r\n\r\n\t\tif (index >= 0) {\r\n\t\t\tdatapointDisplayListData[index] = savedConfigData;\r\n\t\t} else {\r\n\t\t\tdatapointDisplayListData.push(savedConfigData);\r\n\t\t}\r\n\r\n\t\treturn datapointDisplayListData;\r\n\t}\r\n\r\n\tfunction toggleAggregate(currentAggregateList, aggregatevalue) {\r\n\t\tcurrentAggregateList = !_.isArray(currentAggregateList) ? ['mean'] : currentAggregateList;\r\n\r\n\t\tif (currentAggregateList.indexOf(aggregatevalue) < 0) {\r\n\t\t\tcurrentAggregateList.push(aggregatevalue);\r\n\t\t} else {\r\n\t\t\tif (currentAggregateList.length > 1) {\r\n\t\t\t\t_.pull(currentAggregateList, aggregatevalue);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn currentAggregateList;\r\n\t}\r\n\r\n\tfunction CreateDatapointMapObject() {\r\n\t\tvar datapointList = $rootScope.currentUser.visibleDatapoints;\r\n\t\tvar keyValueMap = {};\r\n\t\t_.each(datapointList, function(e) {\r\n\t\t\tkeyValueMap[e.id] = e.description;\r\n\t\t});\r\n\t\treturn keyValueMap;\r\n\t}\r\n\r\n\tfunction getDatapointListStatus(datapointList) {\r\n\t\tif (!_.isArray(datapointList)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tvar unConfiguredItems = _.filter(datapointList, function(item) {\r\n\t\t\treturn item.unconfigured;\r\n\t\t});\r\n\r\n\t\tif (unConfiguredItems.length === datapointList.length) {\r\n\t\t\treturn null;\r\n\t\t} else if (unConfiguredItems.length == 0) {\r\n\t\t\treturn 'all-configured';\r\n\t\t} else {\r\n\t\t\treturn 'part-configured';\r\n\t\t}\r\n\t}\r\n\r\n\treturn service;\r\n}\r\n","import angular from 'angular';\r\nimport 'angular-drag-and-drop-lists';\r\n\r\nimport DatapointDisplayListController from './list/list.controller';\r\nimport DatapointDisplayObjects from './datapoint.objects';\r\nimport DatapointDisplayService from './datapoint.service';\r\nimport ConfigService from './../../../api/api.module';\r\n\r\nconst datapointDisplayModule = angular\r\n\t.module('datapointDisplay', ['ui.bootstrap', 'ui.router', 'gettext', 'dndLists', ConfigService])\r\n\t.controller('DatapointDisplayListController', DatapointDisplayListController)\r\n\t.service('DatapointdisplayObjects', DatapointDisplayObjects)\r\n\t.service('DatapointdisplayService', DatapointDisplayService);\r\nexport default datapointDisplayModule.name;\r\n","export default function RoleCreateController(\r\n $scope,\r\n $location,\r\n $state,\r\n $filter,\r\n usersService,\r\n RoleService,\r\n FeatureService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.roleName = '';\r\n $scope.description = '';\r\n $scope.filteredDataPoints = [];\r\n $scope.dataPointsByPage = [];\r\n $scope.datapointsDenied = [];\r\n $scope.useSecurityGroups = true;\r\n $scope.search = {\r\n previousQuery: '',\r\n query: '',\r\n text: '',\r\n };\r\n $scope.errorText = '';\r\n $scope.errorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.setAll = {};\r\n $scope.loading = true;\r\n $scope.datapointsSelectedCount = 0;\r\n\r\n $scope.features = [];\r\n $scope.sortedPermissions = [];\r\n\r\n $scope.getAllPermissions = function () {\r\n FeatureService.getFeatures().then(\r\n function (response) {\r\n const currentUserFeatures = usersService.currentUser().permissions;\r\n //set disabled based on user permission\r\n const features = response.data.map((f) => ({\r\n ...f,\r\n disabled: !currentUserFeatures.includes(f.path),\r\n }));\r\n $scope.hasDisabledFeatures = features.filter((f) => f.disabled).length > 0;\r\n\r\n $scope.features = features;\r\n $scope.sortedPermissions = features;\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred getting role data');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.sending = false;\r\n },\r\n );\r\n };\r\n\r\n $scope.getAllPermissions();\r\n\r\n $scope.getLeftPermissionPadding = function (permission) {\r\n if (!permission.path) return 0;\r\n\r\n return $scope.countPeriods(permission.path) * 50;\r\n };\r\n\r\n $scope.countPeriods = function (input) {\r\n let result = 0;\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n if (input[i] == '.') {\r\n result++;\r\n }\r\n }\r\n return result;\r\n }; //countPeriods\r\n\r\n $scope.selectAllPermissions = function (flag) {\r\n for (let i = 0; i < $scope.sortedPermissions.length; i++) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n\r\n window.dataLayer.push({\r\n event: flag ? 'rolePermissionAllSelected' : 'rolePermissionAllDeselected',\r\n });\r\n };\r\n\r\n $scope.checkParent = function (path, flag) {\r\n let name = path.substr(0, path.indexOf('.'));\r\n\r\n if (flag && name.length > 0) {\r\n let childPath = '';\r\n\r\n if ($scope.countPeriods(path) > 1) {\r\n childPath = path.substr(0, path.lastIndexOf('.'));\r\n }\r\n\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n if (\r\n $scope.sortedPermissions[i].path === name ||\r\n $scope.sortedPermissions[i].path == childPath\r\n ) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n }\r\n //if parent is unchecked, uncheck all the children of the parent\r\n else if (name.length === 0 && !flag) {\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n let childName = $scope.sortedPermissions[i].path.substr(\r\n 0,\r\n $scope.sortedPermissions[i].path.indexOf('.'),\r\n );\r\n if (path === childName) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n } else if (!flag) {\r\n //check to see if path has children\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n if ($scope.sortedPermissions[i].path.indexOf(path) > -1) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n }\r\n window.dataLayer.push({\r\n event: 'rolePermissionChanged',\r\n data: {\r\n permission: path,\r\n checked: flag,\r\n },\r\n });\r\n }; //checkParent\r\n\r\n //Sorting\r\n $scope.predicate1 = 'description';\r\n $scope.reverse1 = true;\r\n let orderBy = $filter('orderBy');\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderDataPoints = function (predicate1) {\r\n if (predicate1 === $scope.predicate1) {\r\n $scope.reverse1 = !$scope.reverse1;\r\n } else {\r\n $scope.reverse1 = false;\r\n }\r\n $scope.predicate1 = predicate1;\r\n GTM_DatapointChanges('roleDatapointsOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n page: 1,\r\n policyPage: 1,\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function (initialLoad) {\r\n if (typeof initialLoad === 'undefined' && $scope.search.previousQuery === $scope.search.query)\r\n return;\r\n $scope.filteredDataPoints = $filter('filter')($scope.datapoints, $scope.search.query);\r\n $scope.search.previousQuery = $scope.search.query;\r\n GTM_DatapointChanges(initialLoad ? 'roleDatapointsLoaded' : 'roleDatapointsFiltered');\r\n };\r\n\r\n $scope.createButtonPressed = function () {\r\n $scope.errorFlag = false;\r\n if (\r\n !($scope.roleName.length > 0 && !$scope.nameExists()) ||\r\n $scope.postingChange ||\r\n $scope.roleForm.$error.maxlength\r\n ) {\r\n return;\r\n }\r\n if ($scope.roleName || $scope.roleName.length === 0) {\r\n $scope.newRole = {\r\n name: $scope.roleName,\r\n description: $scope.description,\r\n featureList: [],\r\n dataPointsDenied: $scope.datapointsDenied,\r\n useSecurityGroups: $scope.useSecurityGroups,\r\n };\r\n\r\n //loop through the sort permissions to find the checked permissions and push them into the PUT object\r\n for (let i = 0; i < $scope.sortedPermissions.length; i++) {\r\n if ($scope.sortedPermissions[i].checked) {\r\n $scope.newRole.featureList.push($scope.sortedPermissions[i]);\r\n }\r\n } //out for\r\n\r\n $scope.postingChange = true;\r\n RoleService.createRole($scope.newRole).then(\r\n function (response) {\r\n $scope.postingChange = false;\r\n $state.go('admin.userroledetails', {\r\n roleId: response.data.id,\r\n });\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while creating the role');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.postingChange = false;\r\n },\r\n );\r\n }\r\n };\r\n\r\n let getExistingNames = function () {\r\n RoleService.getRoles().then(\r\n function onSuccess(response) {\r\n $scope.existingNames = [];\r\n for (let i = 0; i < response.data.length; i++) {\r\n $scope.existingNames.push(response.data[i].name);\r\n }\r\n if ($scope.datapoints && $scope.rolePolicies) {\r\n $scope.loading = false;\r\n }\r\n },\r\n function onError(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n let getRoleDatapoints = function () {\r\n usersService.getDatapoints().then(\r\n function (response) {\r\n $scope.datapoints = response.data;\r\n\r\n angular.forEach($scope.datapoints, function (obj) {\r\n obj['checkedDatapoint'] = true;\r\n });\r\n\r\n $scope.datapointsSelectedCount = $scope.datapoints.length;\r\n\r\n $scope.originalDatapoints = angular.copy($scope.datapoints);\r\n $scope.loading = false;\r\n $scope.applyFilter(true);\r\n if ($scope.existingNames && $scope.rolePolicies) {\r\n $scope.loading = false;\r\n }\r\n },\r\n function (error) {\r\n let errorMsg = 'An error occurred';\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n $scope.datapointSelected = function (id) {\r\n for (let i = 0; i < $scope.datapointsDenied.length; i++) {\r\n if ($scope.datapointsDenied[i] === id) {\r\n $scope.datapointsDenied.splice(i, 1);\r\n $scope.datapointsSelectedCount++;\r\n GTM_DatapointChanges('roleDatapointSelected');\r\n return;\r\n }\r\n }\r\n $scope.datapointsDenied.push(id);\r\n $scope.datapointsSelectedCount--;\r\n GTM_DatapointChanges('roleDatapointDeselected');\r\n };\r\n\r\n $scope.nameExists = function () {\r\n if (!$scope.roleName) {\r\n return false;\r\n }\r\n for (let i = 0; i < $scope.existingNames.length; i++) {\r\n if ($scope.roleName.toLowerCase() === $scope.existingNames[i].toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n getExistingNames();\r\n getRoleDatapoints();\r\n\r\n $scope.checkAllDatapoints = function () {\r\n $scope.datapointsDenied = [];\r\n\r\n for (let i = 0; i < $scope.datapoints.length; i++) {\r\n $scope.datapoints[i].checkedDatapoint = $scope.setAll.datapoints;\r\n\r\n if (!$scope.datapoints[i].checkedDatapoint) {\r\n $scope.datapointsDenied.push($scope.datapoints[i].id);\r\n }\r\n }\r\n\r\n if ($scope.setAll.datapoints) {\r\n $scope.datapointsSelectedCount = $scope.datapoints.length;\r\n } else $scope.datapointsSelectedCount = 0;\r\n\r\n GTM_DatapointChanges(\r\n $scope.setAll.datapoints ? 'roleDatapointsAllSelected' : 'roleDatapointsAllDeselected',\r\n );\r\n };\r\n\r\n $scope.backToRoles = function () {\r\n $location.path('/admin/roles');\r\n };\r\n\r\n $scope.nameChanged = function () {\r\n window.dataLayer.push({\r\n event: 'roleNameChanged',\r\n });\r\n };\r\n\r\n $scope.visibilityChanged = function () {\r\n window.dataLayer.push({\r\n event: 'roleVisibilityChanged',\r\n data: {\r\n assetsVisible: $scope.useSecurityGroups,\r\n },\r\n });\r\n };\r\n\r\n $scope.descriptionChanged = function () {\r\n window.dataLayer.push({\r\n event: 'roleDescriptionChanged',\r\n });\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n GTM_DatapointChanges('roleDatapointsPageChanged');\r\n };\r\n\r\n function GTM_DatapointChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.datapoints.length,\r\n totalFiltered: $scope.filteredDataPoints.length,\r\n totalSelected: $scope.datapointsSelectedCount,\r\n sortDirection: $scope.reverse1 ? 'descending' : 'ascending',\r\n pageNumber: $scope.current.page,\r\n },\r\n });\r\n }\r\n}\r\n","export default function RolesListController(\r\n $scope,\r\n $filter,\r\n $stateParams,\r\n $state,\r\n RoleService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Local Variables\r\n $scope.unavailable = 'Unavailable';\r\n $scope.searchText = '';\r\n $scope.previousSearchText = '';\r\n $scope.selectedName = '';\r\n $scope.roles = [];\r\n $scope.filteredUserRoles = [];\r\n $scope.userRolesByPage = [];\r\n $scope.itemsPerPage = 25;\r\n $scope.maxSize = 3;\r\n $scope.currentPage = 1;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n //Sort filteredUserData\r\n $scope.orderRoles = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n GTM_ListChanged('rolesOrderChanged');\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.previousSearchText === $scope.searchText) return;\r\n $scope.filteredUserRoles = $filter('filter')($scope.roles, $scope.searchText);\r\n $scope.previousSearchText = $scope.searchText;\r\n GTM_ListChanged('rolesFiltered');\r\n };\r\n\r\n $scope.createSuccessFlag = false;\r\n $scope.deleteSuccessFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n\r\n if ($stateParams.create) {\r\n $scope.createSuccessFlag = true;\r\n } else if ($stateParams.deleted) {\r\n $scope.deleteSuccessFlag = true;\r\n }\r\n\r\n $scope.resetFlags = function () {\r\n $scope.createSuccessFlag = false;\r\n $scope.deleteSuccessFlag = false;\r\n };\r\n\r\n //Tracks the selected row of the userRoles table\r\n $scope.roleSelected = function (name) {\r\n $scope.selectedName = name;\r\n };\r\n\r\n //Get all userRoles\r\n RoleService.getRoles({ assignable: true }).then(function (response) {\r\n $scope.roles = response.data;\r\n $scope.filteredUserRoles = $scope.roles.slice();\r\n $scope.loading = false;\r\n GTM_ListChanged('rolesLoaded');\r\n }, handleError);\r\n\r\n //general error handler.\r\n function handleError(error) {\r\n $scope.loading = false;\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving role information');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n }\r\n\r\n $scope.pageChanged = function () {\r\n GTM_ListChanged('rolesPageChanged');\r\n };\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.roles.length,\r\n totalFiltered: $scope.filteredUserRoles.length,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n pageNumber: $scope.currentPage,\r\n },\r\n });\r\n }\r\n}\r\n","export default function RoleViewDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n roleName,\r\n roleId,\r\n $state,\r\n usersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.roleName = roleName;\r\n\r\n $scope.ok = function () {\r\n usersService.deleteRoleDetails(roleId).then(\r\n function (response) {\r\n $state.go('admin.usersRoleslist', { create: false, deleted: true });\r\n },\r\n function (error) {\r\n var errorMsg;\r\n if (error.status === 409 && error.data.Message.indexOf('role_in_use') === 0) {\r\n errorMsg = gettextCatalog.getString(\r\n 'This role is currently in use, all users must be removed from a role before it can be deleted. If the problem persists please contact your admin!',\r\n );\r\n } else {\r\n errorMsg = gettextCatalog.getString(\r\n 'An error occurred while deleting role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.Message) {\r\n errorMsg =\r\n error.data.Message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n },\r\n );\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n });\r\n}\r\n","export default function RoleViewController(\r\n $scope,\r\n $stateParams,\r\n $filter,\r\n usersService,\r\n $uibModal,\r\n RoleService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.filteredDataPoints = [];\r\n $scope.loading = true;\r\n $scope.dataPointsByPage = [];\r\n $scope.search = {\r\n query: '',\r\n };\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.searchQuery = '';\r\n $scope.previousSearchQuery = '';\r\n\r\n ///Sorting\r\n $scope.predicate = 'description';\r\n $scope.reverse = true;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderDataPoints = function (predicate1, loading = false) {\r\n $scope.predicate1 = predicate1;\r\n $scope.reverse1 = $scope.predicate1 === predicate1 ? !$scope.reverse1 : false;\r\n\r\n angular.forEach($scope.filteredDataPoints, function (datapoint) {\r\n datapoint[predicate1] = datapoint[predicate1];\r\n });\r\n $scope.filteredDataPoints = orderBy($scope.filteredDataPoints, predicate1, $scope.reverse1);\r\n $scope.displayDataPointsByPage();\r\n if (!loading) GTM_DatapointListChanged('roleDatapointsOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n datapointPage: 1,\r\n };\r\n $scope.datapointsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n $scope.allowRoleAssignment = function () {\r\n return (\r\n usersService.hasRequiredFeatures(['admin.roles.users']) &&\r\n ($scope.roleData == null || !$scope.roleData.unassignable)\r\n );\r\n };\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredDataPoints.\r\n $scope.displayDataPointsByPage = function () {\r\n if ($scope.filteredDataPoints) {\r\n $scope.totalItems = $scope.filteredDataPoints.length;\r\n var begin = ($scope.current.datapointPage - 1) * $scope.datapointsPerPage;\r\n var end = begin + $scope.datapointsPerPage;\r\n $scope.dataPointsByPage = $scope.filteredDataPoints.slice(begin, end);\r\n }\r\n };\r\n\r\n //Calls displayDataPointsByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function () {\r\n $scope.displayDataPointsByPage();\r\n GTM_DatapointListChanged('roleDatapointsPageChanged');\r\n };\r\n\r\n //applyFilter() searches the dataPoints[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.previousSearchQuery === $scope.searchQuery) return;\r\n $scope.filteredDataPoints = $filter('filter')($scope.datapointList, $scope.searchQuery);\r\n $scope.displayDataPointsByPage();\r\n $scope.previousSearchQuery = $scope.searchQuery;\r\n GTM_DatapointListChanged('roleDatapointsFiltered');\r\n };\r\n\r\n $scope.deleteButtonPressed = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./delete-modal/_delete.modal.html'),\r\n controller: 'RoleViewDeleteModalController',\r\n backdropClass: 'tr-role-delete-dismiss',\r\n resolve: {\r\n roleName: function () {\r\n return $scope.roleData.name;\r\n },\r\n roleId: function () {\r\n return $stateParams.roleId;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n };\r\n\r\n $scope.getLeftPermissionPadding = function (permission) {\r\n if (!permission.path) return 0;\r\n\r\n function countPeriods(input) {\r\n var result = 0;\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n if (input[i] == '.') {\r\n result++;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n return countPeriods(permission.path) * 50;\r\n };\r\n\r\n var refresh = function () {\r\n RoleService.getRole($stateParams.roleId)\r\n .then(function (response) {\r\n $scope.roleData = response.data;\r\n\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n\r\n return usersService.getDatapoints();\r\n }, handleError)\r\n .then(function (response) {\r\n var visibleDatapoints = response.data;\r\n $scope.datapointList = [];\r\n //only show my visible datapoints\r\n angular.forEach(visibleDatapoints, function (visibleDp) {\r\n var isDenied = false;\r\n if ($scope.roleData.dataPointsDenied) {\r\n for (var i = 0; i < $scope.roleData.dataPointsDenied.length; i++) {\r\n var deniedDp = $scope.roleData.dataPointsDenied[i];\r\n if (deniedDp === visibleDp.id) {\r\n isDenied = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!isDenied) $scope.datapointList.push(visibleDp);\r\n });\r\n $scope.filteredDataPoints = $scope.datapointList;\r\n $scope.orderDataPoints('description', true);\r\n $scope.displayDataPointsByPage();\r\n $scope.loading = false;\r\n GTM_DatapointListChanged('roleDatapointsLoaded');\r\n }, handleError);\r\n };\r\n refresh();\r\n\r\n var handleError = function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving role information');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n };\r\n\r\n function GTM_DatapointListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.datapointList.length,\r\n totalFiltered: $scope.filteredDataPoints.length,\r\n pageNumber: $scope.current.datapointPage,\r\n sortDirection: $scope.reverse1 ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n","import angular from 'angular';\r\nexport default function RoleViewDetailsController(\r\n $q,\r\n $stateParams,\r\n $log,\r\n $scope,\r\n $filter,\r\n $uibModal,\r\n usersService,\r\n RoleService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n let vm = this;\r\n // local scopes variables\r\n $scope.roleUsers = []; // all user in role\r\n $scope.filteredRoleUsers = [];\r\n $scope.roleUsersByPage = [];\r\n\r\n $scope.searchString = '';\r\n\r\n $scope.usersLoaded = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.successFlag = false;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = true;\r\n\r\n //Pagination\r\n $scope.current = {\r\n usersPage: 1,\r\n };\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n //Sort users in the role\r\n $scope.setPredicate = function (predicate, loading = false) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n if (!loading) GTM_UsersListChanged('roleUsersOrderChanged');\r\n };\r\n\r\n //applyFilter searchs on roleUsers[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredRoleUsers = $filter('filter')($scope.roleUsers, $scope.searchString);\r\n GTM_UsersListChanged('roleUsersFiltered');\r\n };\r\n\r\n // rest flages\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n // function return true if any user selected for remove\r\n $scope.isAnyUserSelected = function () {\r\n let userhasremoveflag = $scope.roleUsers.filter(function (user) {\r\n return user.removeFlag;\r\n });\r\n\r\n return userhasremoveflag.length > 0 ? true : false;\r\n };\r\n\r\n //clicking on the row will taggel the removeFlag for the user\r\n $scope.toggleSelect = function (user) {\r\n $scope.resetFlags();\r\n if (user) {\r\n user.removeFlag = !user.removeFlag;\r\n GTM_UsersListChanged('roleUserSelectionChanged');\r\n }\r\n };\r\n\r\n // called after change happend to roleUsers to update the table\r\n let updateUserstable = function () {\r\n $scope.filteredRoleUsers = $scope.roleUsers.slice();\r\n };\r\n\r\n // watch seach then apply it\r\n $scope.$watch('searchString', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.applyFilter();\r\n }\r\n });\r\n\r\n // watch roleUsers then create model with remove fags\r\n $scope.$watch('roleUsers', function () {\r\n updateUserstable();\r\n });\r\n\r\n // function calls the api to get users that has the current role\r\n let loadRoleUsers = function () {\r\n $scope.loading = true;\r\n $scope.setPredicate($scope.predicate, true);\r\n\r\n RoleService.getAllUsersOfRole($stateParams.roleId).then(\r\n function (result) {\r\n $scope.roleUsers = result.data || [];\r\n $scope.loading = false;\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred when loading users');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n $scope.roleUsers = [];\r\n },\r\n );\r\n };\r\n\r\n vm.$onInit = () => {\r\n const hasUsersfeature = usersService.hasRequiredFeatures(['admin.users']);\r\n if (hasUsersfeature) {\r\n //get users role\r\n loadRoleUsers();\r\n }\r\n };\r\n\r\n // open users model\r\n $scope.openSelectModal = function () {\r\n let roleName = $scope.$parent.roleData ? $scope.$parent.roleData.name : '';\r\n let modalScope = $scope.$new();\r\n modalScope.modalTitle = gettextCatalog.getString('Select users for Role : ') + roleName;\r\n modalScope.userCannotSelectHimself = true;\r\n\r\n $scope.resetFlags();\r\n let modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('../../../security-groups/view/users/users-modal/users.modal.html'),\r\n controller: 'SecurityGroupViewUserSelectionModalController',\r\n size: 'lg',\r\n scope: modalScope,\r\n resolve: {\r\n singleSelect: false,\r\n selectedUsers: function () {\r\n let selected = {};\r\n\r\n if ($scope.roleUsers) {\r\n for (let i = 0; i < $scope.roleUsers.length; i++) {\r\n let e = $scope.roleUsers[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n },\r\n });\r\n // handle return result of users model\r\n modalInstance.result\r\n .then(function (selectedUsers) {\r\n let changes = [];\r\n let changeResult = $scope.roleUsers.slice() || [];\r\n for (let key in selectedUsers) {\r\n let alreadyPicked = false;\r\n for (let i = 0; i < $scope.roleUsers.length; i++) {\r\n if (key === $scope.roleUsers[i].id) {\r\n alreadyPicked = true;\r\n break;\r\n }\r\n }\r\n if (!alreadyPicked) {\r\n changeResult.push(selectedUsers[key]);\r\n $scope.applyChange(\r\n {\r\n op: 'add',\r\n value: {\r\n userId: key,\r\n },\r\n },\r\n changes,\r\n );\r\n }\r\n }\r\n for (let i = 0; i < changeResult.length; i++) {\r\n let remove = true;\r\n for (let key in selectedUsers) {\r\n if (key === changeResult[i].id) {\r\n remove = false;\r\n break;\r\n }\r\n }\r\n if (remove) {\r\n $scope.applyChange(\r\n {\r\n op: 'remove',\r\n value: {\r\n userId: changeResult[i].id,\r\n },\r\n },\r\n changes,\r\n );\r\n changeResult.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n $scope.submitUsers(changeResult, changes);\r\n })\r\n .catch(() => {});\r\n };\r\n\r\n $scope.applyChange = function (newChange, changeset) {\r\n for (let i = 0; i < changeset.length; i++) {\r\n //handle behaviour when multiple changes requested for same resource\r\n if (changeset[i].value && changeset[i].value.userId === newChange.value.userId) {\r\n if (changeset[i].op === newChange.op) {\r\n //only apply one add or remove per resource\r\n return;\r\n } else {\r\n //if ops are different, changes will cancel out (ie. adding and removing a resource in the same request will have no net effect)\r\n changeset.splice(i, 1);\r\n return;\r\n }\r\n }\r\n }\r\n changeset.push(newChange);\r\n };\r\n\r\n // call on remove btn\r\n $scope.removeUsers = function () {\r\n let userToRemove = [];\r\n let newUserList = [];\r\n angular.forEach($scope.roleUsers, function (user) {\r\n if (user.removeFlag) {\r\n $scope.applyChange(\r\n {\r\n op: 'remove',\r\n value: {\r\n userId: user.id,\r\n },\r\n },\r\n userToRemove,\r\n );\r\n } else {\r\n newUserList.push(user);\r\n }\r\n });\r\n $scope.submitUsers(newUserList, userToRemove);\r\n };\r\n\r\n // add or remov the current role from the selected users\r\n $scope.submitUsers = function (newUserList, changeset) {\r\n if (!changeset || changeset.length === 0) {\r\n return;\r\n }\r\n $scope.resetFlags();\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n let promises = [];\r\n\r\n angular.forEach(changeset, function (patchUser) {\r\n let promise = usersService.patchUserRoles(patchUser.value.userId, [\r\n {\r\n op: patchUser.op,\r\n roles: [\r\n {\r\n id: $stateParams.roleId,\r\n },\r\n ],\r\n },\r\n ]);\r\n promises.push(promise);\r\n });\r\n\r\n $q.all(promises).then(\r\n function () {\r\n if (newUserList) {\r\n $scope.roleUsers = newUserList.slice();\r\n }\r\n $scope.successFlag = true;\r\n $scope.loading = false;\r\n GTM_UsersListChanged('roleUsersLoaded');\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while adding/removing users');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n },\r\n );\r\n return true;\r\n }; // end submit users\r\n\r\n $scope.pageChanged = function () {\r\n GTM_UsersListChanged('roleUsersPageChanged');\r\n };\r\n\r\n function GTM_UsersListChanged(event) {\r\n let userhasremoveflag = $scope.roleUsers.filter(function (user) {\r\n return user.removeFlag;\r\n });\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.roleUsers,\r\n totalFiltered: $scope.filteredRoleUsers.length,\r\n totalSelected: userhasremoveflag.length,\r\n pageNumber: $scope.current.usersPage,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n","export default function RoleViewEditController(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $filter,\r\n usersService,\r\n RoleService,\r\n FeatureService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.dataPointsByPage = [];\r\n $scope.filteredDataPoints = [];\r\n $scope.datapointsDenied = [];\r\n $scope.editingPermission = false;\r\n $scope.editingRoleData = {};\r\n $scope.useSecurityGroupsChanged = false;\r\n $scope.existingNames = [];\r\n $scope.search = {\r\n query: '',\r\n text: '',\r\n };\r\n $scope.successFlag = false;\r\n $scope.changeApplied = false;\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n $scope.sending = false;\r\n $scope.setAll = {};\r\n $scope.datapointsSelectedCount = 0;\r\n\r\n $scope.features = [];\r\n $scope.sortedPermissions = [];\r\n\r\n $scope.getAllPermissions = function () {\r\n FeatureService.getFeatures().then(\r\n function (response) {\r\n const currentUserFeatures = usersService.currentUser().permissions;\r\n //set disabled based on user permission\r\n const features = response.data.map((f) => ({\r\n ...f,\r\n disabled: !currentUserFeatures.includes(f.path),\r\n }));\r\n $scope.hasDisabledFeatures = features.filter((f) => f.disabled).length > 0;\r\n\r\n $scope.features = features;\r\n $scope.sortedPermissions = features;\r\n $scope.checkExistingPermissions($scope.editingRoleData.featureList);\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred getting role data');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.sending = false;\r\n },\r\n );\r\n };\r\n\r\n $scope.getLeftPermissionPadding = function (permission) {\r\n if (!permission.path) return 0;\r\n\r\n return $scope.countPeriods(permission.path) * 50;\r\n };\r\n\r\n $scope.countPeriods = function (input) {\r\n let result = 0;\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n if (input[i] == '.') {\r\n result++;\r\n }\r\n }\r\n return result;\r\n }; //countPeriods\r\n\r\n $scope.selectAllPermissions = function (flag) {\r\n for (let i = 0; i < $scope.sortedPermissions.length; i++) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n window.dataLayer.push({\r\n event: flag ? 'rolePermissionAllSelected' : 'rolePermissionAllDeselected',\r\n });\r\n };\r\n\r\n $scope.checkParent = function (path, flag) {\r\n let name = path.substr(0, path.indexOf('.'));\r\n\r\n if (flag && name.length > 0) {\r\n let childPath = '';\r\n\r\n if ($scope.countPeriods(path) > 1) {\r\n childPath = path.substr(0, path.lastIndexOf('.'));\r\n }\r\n\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n if (\r\n $scope.sortedPermissions[i].path === name ||\r\n $scope.sortedPermissions[i].path == childPath\r\n ) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n }\r\n //if parent is unchecked, uncheck all the children of the parent\r\n else if (name.length === 0 && !flag) {\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n let childName = $scope.sortedPermissions[i].path.substr(\r\n 0,\r\n $scope.sortedPermissions[i].path.indexOf('.'),\r\n );\r\n if (path === childName) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n } else if (!flag) {\r\n //check to see if path has children\r\n for (var i = 0; i < $scope.sortedPermissions.length; i++) {\r\n if ($scope.sortedPermissions[i].path.indexOf(path) > -1) {\r\n $scope.sortedPermissions[i].checked = flag;\r\n }\r\n }\r\n }\r\n\r\n window.dataLayer.push({\r\n event: 'rolePermissionChanged',\r\n data: {\r\n permission: path,\r\n checked: flag,\r\n },\r\n });\r\n }; //checkParent\r\n\r\n //Sorting\r\n $scope.predicate1 = 'description';\r\n $scope.reverse1 = true;\r\n let orderBy = $filter('orderBy');\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderDataPoints = function (predicate1, loaded = false) {\r\n $scope.predicate1 = predicate1;\r\n $scope.reverse1 = $scope.predicate1 === predicate1 ? !$scope.reverse1 : false;\r\n\r\n angular.forEach($scope.filteredDataPoints, function (datapoint) {\r\n datapoint[predicate1] = datapoint[predicate1];\r\n });\r\n $scope.filteredDataPoints = orderBy($scope.filteredDataPoints, predicate1, $scope.reverse1);\r\n $scope.displayDataPointsByPage();\r\n if (!loaded) GTM_DatapointChanges('roleDatapointsOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n page: 1,\r\n policyPage: 1,\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredDataPoints.\r\n $scope.displayDataPointsByPage = function () {\r\n $scope.totalItems = $scope.filteredDataPoints.length;\r\n let begin = ($scope.current.page - 1) * $scope.itemsPerPage;\r\n let end = begin + $scope.itemsPerPage;\r\n $scope.dataPointsByPage = $scope.filteredDataPoints.slice(begin, end);\r\n };\r\n\r\n //Calls displayDataPointsByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function () {\r\n $scope.displayDataPointsByPage();\r\n GTM_DatapointChanges('roleDatapointsPageChanged');\r\n };\r\n\r\n //applyFilter() searches the dataPoints[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredDataPoints = $filter('filter')($scope.datapoints, $scope.search.query);\r\n $scope.displayDataPointsByPage();\r\n GTM_DatapointChanges('roleDatapointsFiltered');\r\n };\r\n\r\n $scope.applyChange = function () {\r\n $scope.resetFlags();\r\n $scope.changeApplied = true;\r\n };\r\n\r\n $scope.saveButtonPressed = function () {\r\n if ($scope.roleForm.$invalid || $scope.sending || $scope.roleForm.$error.maxlength) {\r\n return;\r\n }\r\n $scope.sending = true;\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.editingRoleData.featureList = [];\r\n\r\n //loop through the sort permissions to find the checked permissions and push them into the PUT object\r\n for (let i = 0; i < $scope.sortedPermissions.length; i++) {\r\n for (let x = 0; x < $scope.features.length; x++) {\r\n if (\r\n $scope.sortedPermissions[i].path === $scope.features[x].path &&\r\n $scope.sortedPermissions[i].checked\r\n ) {\r\n $scope.editingRoleData.featureList.push($scope.features[x]);\r\n }\r\n } //inner for\r\n } //out for\r\n\r\n RoleService.updateRole($scope.editingRoleData).then(\r\n function (response) {\r\n $scope.changeApplied = false;\r\n $scope.successFlag = true;\r\n $scope.sending = false;\r\n $state.go('admin.userroledetails', {\r\n roleId: response.data.id,\r\n });\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.sending = false;\r\n },\r\n );\r\n };\r\n\r\n let getExistingNames = function () {\r\n RoleService.getRoles().then(\r\n function onSuccess(response) {\r\n $scope.existingNames = [];\r\n for (let i = 0; i < response.data.length; i++) {\r\n $scope.existingNames.push(response.data[i].name);\r\n }\r\n if ($scope.datapoints && $scope.rolePolicies) {\r\n $scope.loading = false;\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n }\r\n },\r\n function onError(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n }\r\n },\r\n );\r\n };\r\n\r\n let getRoleData = function () {\r\n RoleService.getRole($stateParams.roleId).then(\r\n function (response) {\r\n $scope.roleData = response.data;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n $state.current.ncyBreadcrumbLabel = $scope.roleData.name;\r\n }\r\n if (!$scope.roleData.dataPointsDenied) {\r\n $scope.roleData.dataPointsDenied = [];\r\n }\r\n $scope.editingRoleData = angular.copy($scope.roleData);\r\n getExistingNames();\r\n getRoleDatapoints();\r\n $scope.getAllPermissions();\r\n },\r\n function (error) {\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = 'Error';\r\n }\r\n }\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n let getRoleDatapoints = function () {\r\n usersService.getDatapoints().then(\r\n function (response) {\r\n $scope.datapoints = response.data;\r\n\r\n angular.forEach($scope.datapoints, function (obj) {\r\n obj['checkedDatapoint'] = true;\r\n });\r\n\r\n if ($scope.roleData.dataPointsDenied) {\r\n for (let i = 0; i < $scope.datapoints.length; i++) {\r\n for (let j = 0; j < $scope.roleData.dataPointsDenied.length; j++) {\r\n if ($scope.datapoints[i].id === $scope.roleData.dataPointsDenied[j]) {\r\n $scope.datapoints[i].checkedDatapoint = false;\r\n break;\r\n }\r\n }\r\n }\r\n $scope.editingRoleData.dataPointsDenied = angular.copy($scope.roleData.dataPointsDenied);\r\n }\r\n\r\n $scope.datapointsSelectedCount =\r\n $scope.datapoints.length - $scope.editingRoleData.dataPointsDenied.length;\r\n\r\n $scope.originalDatapoints = angular.copy($scope.datapoints);\r\n $scope.filteredDataPoints = $scope.datapoints;\r\n $scope.orderDataPoints('description', true);\r\n $scope.displayDataPointsByPage();\r\n if ($scope.rolePolicies && $scope.existingNames) {\r\n $scope.loading = false;\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n }\r\n if ($scope.loading) {\r\n $scope.loading = false;\r\n }\r\n GTM_DatapointChanges('roleDatapointsLoaded');\r\n },\r\n function (error) {\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = gettextCatalog.getString('Error');\r\n }\r\n }\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n if ($scope.loading) {\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n }\r\n },\r\n );\r\n };\r\n\r\n $scope.datapointSelected = function (id) {\r\n $scope.resetFlags();\r\n for (let i = 0; i < $scope.editingRoleData.dataPointsDenied.length; i++) {\r\n if ($scope.editingRoleData.dataPointsDenied[i] === id) {\r\n $scope.editingRoleData.dataPointsDenied.splice(i, 1);\r\n $scope.datapointsSelectedCount++;\r\n $scope.applyChange();\r\n GTM_DatapointChanges('roleDatapointSelected');\r\n return;\r\n }\r\n }\r\n $scope.editingRoleData.dataPointsDenied.push(id);\r\n $scope.datapointsSelectedCount--;\r\n $scope.applyChange();\r\n GTM_DatapointChanges('roleDatapointDeselected');\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n getRoleData();\r\n\r\n $scope.nameExists = function () {\r\n if (!$scope.editingRoleData.name) {\r\n return false;\r\n }\r\n if ($scope.editingRoleData.name.toLowerCase() === $scope.roleData.name.toLowerCase()) {\r\n return false;\r\n }\r\n for (let i = 0; i < $scope.existingNames.length; i++) {\r\n if ($scope.editingRoleData.name.toLowerCase() === $scope.existingNames[i].toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n $scope.checkAllDatapoints = function () {\r\n $scope.resetFlags();\r\n $scope.editingRoleData.dataPointsDenied = [];\r\n\r\n for (let i = 0; i < $scope.datapoints.length; i++) {\r\n $scope.datapoints[i].checkedDatapoint = $scope.setAll.datapoints;\r\n\r\n if (!$scope.setAll.datapoints) {\r\n $scope.editingRoleData.dataPointsDenied.push($scope.datapoints[i].id);\r\n }\r\n $scope.applyChange();\r\n }\r\n\r\n if ($scope.setAll.datapoints) {\r\n $scope.datapointsSelectedCount = $scope.datapoints.length;\r\n } else $scope.datapointsSelectedCount = 0;\r\n\r\n GTM_DatapointChanges(\r\n $scope.setAll.datapoints ? 'roleDatapointsAllSelected' : 'roleDatapointsAllDeselected',\r\n );\r\n };\r\n\r\n $scope.editDisabled = function () {\r\n if (!$scope.editingRoleData.name) return true;\r\n return $scope.editingRoleData.name.length == 0 || $scope.nameExists() || $scope.sending;\r\n };\r\n\r\n $scope.checkExistingPermissions = function (featureList) {\r\n for (let i = 0; i < $scope.sortedPermissions.length; i++) {\r\n for (let x = 0; x < featureList.length; x++) {\r\n if ($scope.sortedPermissions[i].path === featureList[x].path) {\r\n $scope.sortedPermissions[i].checked = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.nameChanged = function () {\r\n $scope.resetFlags();\r\n window.dataLayer.push({\r\n event: 'roleNameChanged',\r\n });\r\n };\r\n\r\n $scope.assetVisiblityChanged = function () {\r\n $scope.useSecurityGroupsChanged = true;\r\n window.dataLayer.push({\r\n event: 'roleVisiblityChanged',\r\n data: {\r\n assetsVisible: $scope.editingRoleData.useSecurityGroups,\r\n },\r\n });\r\n };\r\n\r\n $scope.descriptionChanged = function () {\r\n window.dataLayer.push({\r\n event: 'roleDescriptionChanged',\r\n });\r\n };\r\n\r\n function GTM_DatapointChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.datapoints.length,\r\n totalFiltered: $scope.filteredDataPoints.length,\r\n totalSelected: $scope.datapointsSelectedCount,\r\n sortDirection: $scope.reverse1 ? 'descending' : 'ascending',\r\n pageNumber: $scope.current.page,\r\n },\r\n });\r\n }\r\n}\r\n","\r\n/* Controller Imports */\r\nimport RoleCreateController from './create-role/create.controller';\r\nimport RolesListController from './list/list.controller';\r\nimport RoleViewDeleteModalController from './view/delete-modal/delete.modal.controller';\r\nimport RoleViewController from './view/view.controller';\r\nimport RoleViewDetailsController from './view/details/details.users.controller';\r\nimport RoleViewEditController from './view/edit/edit.controller';\r\n\r\nconst roleManagementModule = angular.module('app.roleManagement', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\"\r\n])\r\n.controller('RoleCreateController', RoleCreateController)\r\n.controller('RolesListController', RolesListController)\r\n.controller('RoleViewDeleteModalController', RoleViewDeleteModalController)\r\n.controller('RoleViewController', RoleViewController)\r\n.controller('RoleViewDetailsController', RoleViewDetailsController)\r\n.controller('RoleViewEditController', RoleViewEditController)\r\n;\r\nexport default roleManagementModule.name;","import Action from '../action';\r\n\r\nexport const ACCOUNT_REQUESTED = 'ACCOUT_REQUESTED';\r\nexport const ACCOUNT_RECEIVED = 'ACCOUT_RECEIVED';\r\n\r\nexport const CREATE_SUBACCOUNT = '@accounts/CREATE_SUBACCOUNT';\r\nexport const CREATE_SUBACCOUNT_FAIL = `${CREATE_SUBACCOUNT}_FAIL`;\r\nexport const CREATE_SUBACCOUNT_SUCCESS = `${CREATE_SUBACCOUNT}_SUCCESS`;\r\n\r\nexport const GET_ACCOUNT = '@accounts/GET_ACCOUNT';\r\nexport const GET_ACCOUNT_FAIL = `${GET_ACCOUNT}_FAIL`;\r\nexport const GET_ACCOUNT_SUCCESS = `${GET_ACCOUNT}_SUCCESS`;\r\n\r\nexport const UPDATE_SUBACCOUNT = '@accounts/UPDATE_SUBACCOUNT';\r\nexport const UPDATE_SUBACCOUNT_FAIL = `${UPDATE_SUBACCOUNT}_FAIL`;\r\nexport const UPDATE_SUBACCOUNT_SUCCESS = `${UPDATE_SUBACCOUNT}_SUCCESS`;\r\n\r\nexport const UPDATE_INHERITED_ROLES = '@accounts/UPDATE_INHERITED_ROLES';\r\nexport const UPDATE_INHERITED_ROLES_FAIL = `${UPDATE_INHERITED_ROLES}_FAIL`;\r\nexport const UPDATE_INHERITED_ROLES_SUCCESS = `${UPDATE_INHERITED_ROLES}_SUCCESS`;\r\n\r\nexport const GET_ROLES = '@accounts/GET_ROLES';\r\nexport const GET_ROLES_FAIL = `${GET_ROLES}_FAIL`;\r\nexport const GET_ROLES_SUCCESS = `${GET_ROLES}_SUCCESS`;\r\n\r\nexport const createSubAccount = name => Action(CREATE_SUBACCOUNT, {name});\r\nexport const createSubAccountSuccess = payload => Action(CREATE_SUBACCOUNT_SUCCESS, payload);\r\nexport const createSubAccountFail = error => Action(CREATE_SUBACCOUNT_FAIL, error, true);\r\nexport const getAccount = id => Action(GET_ACCOUNT, {id});\r\nexport const getAccountSuccess = payload => Action(GET_ACCOUNT_SUCCESS, payload);\r\nexport const getAccountFail = error => Action(GET_ACCOUNT_FAIL, error, true);\r\nexport const updateSubAccount = payload => Action(UPDATE_SUBACCOUNT, payload);\r\nexport const updateInheritedRoles = (account, roles) =>\r\n Action(UPDATE_INHERITED_ROLES, {\r\n account,\r\n roles\r\n });\r\nexport const updateSubAccountSuccess = payload => Action(UPDATE_SUBACCOUNT_SUCCESS, payload);\r\nexport const updateSubAccountFail = error => Action(UPDATE_SUBACCOUNT_FAIL, error, true);\r\nexport const updateInheritedRolesSuccess = payload => Action(UPDATE_INHERITED_ROLES_SUCCESS, payload);\r\nexport const updateInheritedRolesFail = error => Action(UPDATE_INHERITED_ROLES_FAIL, error, true);\r\nexport const getAccountRoles = () => Action(GET_ROLES);\r\nexport const getAccountRolesSuccess = payload => Action(GET_ROLES_SUCCESS, payload);\r\nexport const getAccountRolesFail = error => Action(GET_ROLES_FAIL, error, true);\r\n","import template from './list.html';\r\nimport * as AccountsActions from '../../../state/accounts/accounts.actions';\r\n\r\nexport class AccountListController {\r\n constructor($scope, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.scope = $scope;\r\n this.store = $ngRedux;\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, AccountsActions)(this);\r\n this.query = '';\r\n this.exactMatch = false;\r\n this.selectedIndex = null;\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n this.filteredAccounts = this.filterAccountNames(state.accounts.subaccounts).map((account) => {\r\n account.loading = account.id === state.accounts.loading_account;\r\n return account;\r\n });\r\n\r\n return {\r\n viewing: state.accounts.viewing_account,\r\n creating: state.accounts.creating_subaccount,\r\n accounts: state.accounts.subaccounts,\r\n };\r\n }\r\n\r\n updateAccountFilter() {\r\n this.filteredAccounts = this.filterAccountNames(this.accounts);\r\n window.dataLayer.push({\r\n event: 'subaccountsFiltered',\r\n data: {\r\n total: this.accounts.length,\r\n totalFiltered: this.filteredAccounts.length,\r\n exactMatch: this.exactMatch,\r\n },\r\n });\r\n }\r\n\r\n filterAccountNames(accounts) {\r\n this.exactMatch = false;\r\n\r\n if (!this.query || this.query === '') {\r\n return [...accounts];\r\n }\r\n\r\n let filteredAccounts = accounts.filter((account) => {\r\n if (account.name.toLowerCase() === this.query.toLowerCase()) this.exactMatch = true;\r\n return account.name.toLowerCase().includes(this.query.toLowerCase());\r\n });\r\n\r\n return filteredAccounts;\r\n }\r\n\r\n createNewSubAccount() {\r\n this.createSubAccount(this.query);\r\n this.query = '';\r\n }\r\n\r\n selectAccount(index) {\r\n this.selectedIndex = index;\r\n let account = this.filteredAccounts[index];\r\n this.getAccount(account.id);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n replace: true,\r\n controller: AccountListController,\r\n controllerAs: 'vm',\r\n};\r\n","import template from './create.html';\r\nimport { createSubAccount } from '../../../state/accounts/accounts.actions';\r\n\r\nexport class CreateSubAccountController {\r\n\r\n constructor($ngRedux) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, {createSubAccount})(this);\r\n this.validationMessage = null; \r\n }\r\n\r\n mapStateToThis(state) {\r\n return {\r\n loading: state.accounts.creating_subaccount\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n checkNameValidation() {\r\n let name = this.getFirstCreateAccountName();\r\n\r\n if (name === \"\" || name.length <= 3) {\r\n this.setValidationMessage(\"Name cannot be empty, and must be longer than 3 characters.\");\r\n return;\r\n }\r\n\r\n this.setValidationMessage(null);\r\n }\r\n\r\n createFirstSubAccount() {\r\n if (this.validationMessage === null) {\r\n this.createSubAccount(this.getFirstCreateAccountName());\r\n }\r\n }\r\n\r\n getFirstCreateAccountName() {\r\n return document.getElementById('first_sub_account_name').value.trim();\r\n }\r\n\r\n setValidationMessage(message) {\r\n this.validationMessage = message;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n replace: true,\r\n controller: CreateSubAccountController,\r\n controllerAs: 'vm'\r\n};","import template from './view.html';\r\nimport * as AccountsActions from '../../../state/accounts/accounts.actions';\r\nimport Auth from '../../../auth';\r\n\r\nexport class SubAccountViewController {\r\n constructor($ngRedux) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, this.mapDispatchToTarget)(this);\r\n this.editingName = false;\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n let selectedRoles = state.accounts.account_roles;\r\n\r\n if (state.accounts.viewing_account) {\r\n let inheritedRoles = state.accounts.viewing_account.inheritedRoles.map((role) => role.id);\r\n\r\n selectedRoles = state.accounts.account_roles.map((role) => {\r\n role.selected = inheritedRoles.includes(role.id);\r\n return role;\r\n });\r\n }\r\n\r\n return {\r\n updating: state.accounts.updating_subaccount,\r\n account: { ...state.accounts.viewing_account },\r\n editingAccount: { ...state.accounts.viewing_account },\r\n roles: selectedRoles,\r\n };\r\n }\r\n\r\n goToAccount(account) {\r\n Auth.switchAccount(account.id);\r\n }\r\n\r\n mapDispatchToTarget(dispatch) {\r\n return {\r\n updateSubAccount: (props) => dispatch(AccountsActions.updateSubAccount(props)),\r\n updateInheritedRoles: (account, roles) =>\r\n dispatch(AccountsActions.updateInheritedRoles(account, roles)),\r\n };\r\n }\r\n\r\n updateSubAccountName() {\r\n if (this.editingAccount.name) {\r\n this.updateSubAccount({ ...this.account, name: this.editingAccount.name });\r\n this.editingName = false;\r\n }\r\n }\r\n\r\n editName() {\r\n this.editingName = true;\r\n }\r\n\r\n nameChanged() {\r\n window.dataLayer.push({\r\n event: 'subaccountNameChanged',\r\n });\r\n }\r\n\r\n cancelEditName() {\r\n this.editingName = false;\r\n }\r\n\r\n updateRoles() {\r\n let roles = [...this.roles];\r\n\r\n let rolesToUpdate = roles\r\n .filter((role) => role.selected)\r\n .map((role) => {\r\n delete role.selected;\r\n return role;\r\n });\r\n\r\n this.updateInheritedRoles(this.account, rolesToUpdate);\r\n window.dataLayer.push({\r\n event: 'subaccountRolesUpdated',\r\n data: {\r\n total: roles.length,\r\n totalSelected: rolesToUpdate.length,\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n replace: true,\r\n bindings: {\r\n account: '<',\r\n },\r\n controller: SubAccountViewController,\r\n controllerAs: 'vm',\r\n};\r\n","import angular from 'angular';\r\n\r\nimport AccountsListComponent from './list.component';\r\nimport CreateSubAccountComponent from './create.component';\r\nimport SubAccountViewComponent from './view.component';\r\n\r\nlet subAccountsModule = angular\r\n .module('admin.sub-accounts', [])\r\n .component('subAccountView', SubAccountViewComponent)\r\n .component('createSubAccount', CreateSubAccountComponent)\r\n .component('accountsList', AccountsListComponent);\r\n\r\nexport default subAccountsModule.name;\r\n","import _ from 'lodash';\r\n\r\nexport default function SecurityGroupsListController(\r\n $scope,\r\n $filter,\r\n $state,\r\n $stateParams,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Local Variables\r\n $scope.searchText = '';\r\n $scope.previousSearchText = '';\r\n $scope.unavailable = gettextCatalog.getString('Unavailable');\r\n $scope.securityGroups = [];\r\n $scope.filteredSecurityGroups = [];\r\n $scope.createSuccessFlag = false;\r\n $scope.deleteSuccessFlag = false;\r\n $scope.selfRemovedSuccessFlag = false;\r\n\r\n if ($stateParams) {\r\n if ($stateParams.create) {\r\n $scope.createSuccessFlag = true;\r\n }\r\n if ($stateParams.deleted) {\r\n $scope.deleteSuccessFlag = true;\r\n }\r\n if ($stateParams.selfRemoved) {\r\n $scope.selfRemovedFlag = true;\r\n }\r\n }\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredSecurityGroups\r\n $scope.orderSecurityGroups = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n GTM_GroupChanged('securityOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.previousSearchText === $scope.searchText) return;\r\n $scope.filteredSecurityGroups = $filter('filter')($scope.securityGroups, $scope.searchText);\r\n $scope.previousSearchText = $scope.searchText;\r\n GTM_GroupChanged('securityFiltered');\r\n };\r\n\r\n //Capture errors and display a message to the user below the form if errors exist\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n\r\n //reset flags after user selects a new row\r\n $scope.resetFlags = function () {\r\n $scope.createSuccessFlag = false;\r\n $scope.deleteSuccessFlag = false;\r\n $scope.selfRemovedSuccessFlag = false;\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n GTM_GroupChanged('securityPageChanged');\r\n };\r\n\r\n //Get all Security Groups\r\n securityGroupsService.getAllSecurityGroups().then(function (response) {\r\n $scope.securityGroups = response.data.data;\r\n\r\n //add concatnat tags for sorting\r\n if ($scope.securityGroups) {\r\n _.each($scope.securityGroups, function (sg) {\r\n sg.tags.sort(function (a, b) {\r\n var x = a.toLowerCase();\r\n var y = b.toLowerCase();\r\n if (x < y) {\r\n return -1;\r\n }\r\n if (x > y) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n var concatData = _.map(sg.tags, function (tag) {\r\n return tag.toLowerCase();\r\n });\r\n sg['concattags'] = concatData.join();\r\n });\r\n }\r\n\r\n $scope.filteredSecurityGroups = $scope.securityGroups.slice();\r\n $scope.$broadcast('groupListLoaded');\r\n $scope.loading = false;\r\n GTM_GroupChanged('securityLoaded');\r\n }, handleError);\r\n\r\n //General Error Handler\r\n function handleError(error) {\r\n $scope.loading = false;\r\n\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving security groups');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n }\r\n\r\n function GTM_GroupChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.securityGroups.length,\r\n totalFiltered: $scope.filteredSecurityGroups.length,\r\n pageNumber: $scope.currentPage,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n","export default function SecurityGroupCreateController(\r\n $scope,\r\n $location,\r\n $state,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.securityGroupName = '';\r\n $scope.datamodelTags = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.existingNames = {};\r\n\r\n securityGroupsService.getAllSecurityGroups().then(function (response) {\r\n $scope.existingNames = {};\r\n response.data.data.forEach((group) => {\r\n $scope.existingNames[group.name.toLowerCase()] = true;\r\n });\r\n });\r\n\r\n $scope.nameExists = function () {\r\n return $scope.existingNames[($scope.securityGroupName || '').toLowerCase()];\r\n };\r\n\r\n $scope.submitcreateNewSecurityGroupForm = function () {\r\n if (\r\n $scope.securityGroupName &&\r\n $scope.securityGroupName.length > 0 &&\r\n !$scope.sending &&\r\n !$scope.createNewSecurityGroupForm.$error.maxlength\r\n ) {\r\n $scope.errorFlag = false;\r\n $scope.sending = true;\r\n var data = {\r\n name: $scope.securityGroupName,\r\n attrs: {\r\n description: $scope.description,\r\n },\r\n tags: (function () {\r\n var arr = [];\r\n for (var i = 0; i < $scope.datamodelTags.length; i++) {\r\n arr.push($scope.datamodelTags[i].text);\r\n }\r\n return arr;\r\n })(),\r\n };\r\n securityGroupsService.postNewGroup(data).then(\r\n function successCallback() {\r\n $scope.sending = false;\r\n $state.go('admin.securitygroups', {\r\n create: true,\r\n });\r\n },\r\n function errorCallback(error) {\r\n $scope.sending = false;\r\n var errorMsg = gettextCatalog.getString('An error occurred while creating the group');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message;\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n },\r\n );\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.nameChanged = function () {\r\n window.dataLayer.push({\r\n event: 'securityNameChanged',\r\n });\r\n };\r\n\r\n $scope.descriptionChanged = function () {\r\n window.dataLayer.push({\r\n event: 'securityDescriptionChanged',\r\n });\r\n };\r\n\r\n $scope.tagAdded = function () {\r\n tagsChanged('securityTagAdded');\r\n };\r\n $scope.tagRemoved = function () {\r\n tagsChanged('securityTagRemoved');\r\n };\r\n\r\n function tagsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.datamodelTags.length,\r\n },\r\n });\r\n }\r\n}\r\n","export default function SecurityGroupViewDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n group,\r\n $state,\r\n securityGroupsService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.group = group;\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n\r\n $scope.ok = function() {\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n securityGroupsService.deleteGroup($scope.group.id).then(\r\n function(response) {\r\n $uibModalInstance.close();\r\n $state.go('admin.securitygroups', {deleted: true});\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting the group');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n if (error.status && error.status === 403 && error.data.message === 'insufficient_scope') {\r\n errorMsg = gettextCatalog.getString('Not authorized to delete group.');\r\n } else {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.loading = false;\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n }\r\n );\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n $scope.cancel();\r\n });\r\n}\r\n","export default function SecurityGroupsViewAssetsController(\r\n $uibModal,\r\n $log,\r\n $state,\r\n $scope,\r\n $filter,\r\n securityGroupsService,\r\n equipmentRepository,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.resourceUrl = securityGroupsService.getResourceUrl();\r\n $scope.animationsEnabled = true;\r\n $scope.existingEquips = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.successFlag = false;\r\n\r\n $scope.equipments = []; //list of equipments to send to the database\r\n $scope.postRemoval = [];\r\n $scope.removals = [];\r\n $scope.removeFlags = {};\r\n $scope.filteredEquipmentList = [];\r\n $scope.equipmentByPage = [];\r\n $scope.search = {};\r\n $scope.search.text = '';\r\n $scope.search.previousText = '';\r\n $scope.loading = true;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredEquipmentList\r\n $scope.orderEquipmentList = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n GTM_AssetsChanged('securityAssetsOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n //applyFilter searchs the equipments[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.search.previousText === $scope.search.text) return;\r\n $scope.filteredEquipmentList = $filter('filter')($scope.equipments, $scope.search.text);\r\n $scope.search.previousText = $scope.search.text;\r\n GTM_AssetsChanged('securityAssetsFiltered');\r\n };\r\n\r\n $scope.initializeEquipments = function () {\r\n $scope.existingEquips = $scope.$parent.group.resources.slice();\r\n if (!$state.$current.parent.self.ncyBreadcrumbLabel) {\r\n $state.$current.parent.self.ncyBreadcrumbLabel = $scope.$parent.group.name;\r\n }\r\n $scope.equipments = $scope.existingEquips.slice();\r\n var existingIds = {\r\n criteria: {\r\n ids: [],\r\n },\r\n };\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n existingIds.criteria.ids.push($scope.equipments[i].id);\r\n $scope.removeFlags[$scope.equipments[i].id] = false;\r\n }\r\n if (existingIds.criteria.ids.length > 0) {\r\n equipmentRepository.postEquipmentListByIds(existingIds).then(\r\n function (response) {\r\n $scope.loading = false;\r\n $scope.existingEquips = response.data.slice();\r\n $scope.equipments = $scope.existingEquips.slice();\r\n $scope.postRemoval = $scope.existingEquips.slice();\r\n $scope.filteredEquipmentList = $scope.equipments.slice();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving Asset info');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.loading = false;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n );\r\n } else {\r\n $scope.loading = false;\r\n }\r\n GTM_AssetsChanged('securityAssetsLoaded');\r\n };\r\n\r\n if ($scope.$parent.group) {\r\n //if group.base is already loaded, the group and its resources will be available\r\n $scope.initializeEquipments();\r\n }\r\n $scope.$on('groupLoaded', function (event) {\r\n //listen for event broadcasted by group.base on pageload to know when the group and its properties have been retrieved\r\n $scope.initializeEquipments();\r\n });\r\n\r\n $scope.open = function (size) {\r\n var modalScope = $scope.$new();\r\n modalScope.modalTitle =\r\n gettextCatalog.getString('Select Assets for Security Group: ') + $scope.group.name;\r\n\r\n $scope.resetFlags();\r\n var modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n scope: modalScope,\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: false,\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n selectedAssets: function () {\r\n var selected = {};\r\n\r\n if ($scope.equipments) {\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n var e = $scope.equipments[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(\r\n function (selectedAssets) {\r\n var changes = [];\r\n var changeResult = $scope.equipments.slice();\r\n for (var key in selectedAssets.result) {\r\n var alreadyPicked = false;\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n if (key === $scope.equipments[i].id) {\r\n alreadyPicked = true;\r\n break;\r\n }\r\n }\r\n if (!alreadyPicked) {\r\n changeResult.push(selectedAssets.result[key]);\r\n $scope.applyChange(\r\n {\r\n op: 'add',\r\n value: {\r\n resource: $scope.resourceUrl + key,\r\n },\r\n },\r\n changes,\r\n );\r\n }\r\n }\r\n for (var i = 0; i < changeResult.length; i++) {\r\n var remove = true;\r\n for (var key in selectedAssets.result) {\r\n if (key === changeResult[i].id) {\r\n remove = false;\r\n break;\r\n }\r\n }\r\n if (remove) {\r\n $scope.applyChange(\r\n {\r\n op: 'remove',\r\n value: {\r\n resource: $scope.resourceUrl + changeResult[i].id,\r\n },\r\n },\r\n changes,\r\n );\r\n changeResult.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n $scope.saveEquipments(changeResult, changes);\r\n },\r\n function () {\r\n $log.info(\r\n gettextCatalog.getString('Modal dismissed at: {{date}}', {\r\n date: new Date(),\r\n }),\r\n );\r\n },\r\n );\r\n };\r\n\r\n $scope.toggleAnimation = function () {\r\n $scope.animationsEnabled = !$scope.animationsEnabled;\r\n };\r\n\r\n $scope.saveEquipments = function (newEquipmentList, changeset) {\r\n if (changeset.length == 0 || $scope.sending) {\r\n return;\r\n }\r\n $scope.errorFlag = false;\r\n var data = changeset;\r\n $scope.sending = true;\r\n\r\n securityGroupsService.patchEquipmentUserUpdate($scope.securityGroupId, data).then(\r\n function (response) {\r\n if (newEquipmentList) {\r\n $scope.equipments = newEquipmentList.slice();\r\n }\r\n $scope.$parent.group.resources = $scope.equipments.slice();\r\n $scope.existingEquips = $scope.equipments.slice();\r\n $scope.filteredEquipmentList = $scope.equipments.slice();\r\n $scope.checkRemovals();\r\n $scope.applyFilter();\r\n $scope.orderEquipmentList($scope.predicate, false);\r\n $scope.successFlag = true;\r\n $scope.sending = false;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while editing Asset');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.sending = false;\r\n },\r\n );\r\n return true;\r\n };\r\n\r\n $scope.toggleRemoval = function (equip) {\r\n $scope.resetFlags();\r\n for (var i = 0; i < $scope.postRemoval.length; i++) {\r\n if ($scope.postRemoval[i].id === equip.id) {\r\n $scope.postRemoval.splice(i, 1);\r\n $scope.applyChange(\r\n {\r\n op: 'remove',\r\n value: {\r\n resource: $scope.resourceUrl + equip.id,\r\n },\r\n },\r\n $scope.removals,\r\n );\r\n GTM_AssetsChanged('securityAssetSelected');\r\n return;\r\n }\r\n }\r\n //if we're toggling the checkbox off, put that equipment back into the post-removal list\r\n $scope.postRemoval.push(equip);\r\n $scope.applyChange(\r\n {\r\n op: 'add',\r\n value: {\r\n resource: $scope.resourceUrl + equip.id,\r\n },\r\n },\r\n $scope.removals,\r\n ); //will cancel out the \"remove\" operation for that equip\r\n GTM_AssetsChanged('securityAssetDeselected');\r\n };\r\n\r\n $scope.checkRemovals = function () {\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n //initialize checkbox models for new equipment\r\n var existed = false;\r\n for (var key in $scope.removeFlags) {\r\n if (key === $scope.equipments[i].id) {\r\n existed = true;\r\n break;\r\n }\r\n }\r\n if (!existed) {\r\n $scope.removeFlags[$scope.equipments[i].id] = false;\r\n $scope.postRemoval.push($scope.equipments[i]);\r\n }\r\n }\r\n $scope.removals = [];\r\n for (var key in $scope.removeFlags) {\r\n //clear checkbox models and changes (if necessary) for removed equipment\r\n var exists = false;\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n if (key === $scope.equipments[i].id) {\r\n exists = true;\r\n break;\r\n }\r\n }\r\n if (!exists) {\r\n for (var i = 0; i < $scope.postRemoval.length; i++) {\r\n if ($scope.postRemoval[i].id === key) {\r\n $scope.postRemoval.splice(i, 1);\r\n break;\r\n }\r\n }\r\n delete $scope.removeFlags[key];\r\n }\r\n if ($scope.removeFlags[key]) {\r\n $scope.applyChange(\r\n {\r\n op: 'remove',\r\n value: {\r\n resource: $scope.resourceUrl + key,\r\n },\r\n },\r\n $scope.removals,\r\n );\r\n }\r\n }\r\n };\r\n\r\n $scope.applyChange = function (newChange, changeset) {\r\n for (var i = 0; i < changeset.length; i++) {\r\n //handle behaviour when multiple changes requested for same resource\r\n if (\r\n changeset[i].value &&\r\n changeset[i].value.resource.split('/')[3] === newChange.value.resource.split('/')[3]\r\n ) {\r\n if (changeset[i].op === newChange.op) {\r\n //only apply one add or remove per resource\r\n return;\r\n } else {\r\n //if ops are different, changes will cancel out (ie. adding and removing a resource in the same request will have no net effect)\r\n changeset.splice(i, 1);\r\n return;\r\n }\r\n }\r\n }\r\n changeset.push(newChange);\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.errorFlag = false;\r\n $scope.successFlag = false;\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n GTM_AssetsChanged('securityAssetsPageChanged');\r\n };\r\n\r\n function GTM_AssetsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.equipments.length,\r\n totalFiltered: $scope.filteredEquipmentList.length,\r\n totalSelected: $scope.removals.length,\r\n pageNumber: $scope.currentPage,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n","export default function SecurityGroupsViewController(\r\n $stateParams,\r\n $state,\r\n $scope,\r\n $uibModal,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.onLoadErrorFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.successFlag = false;\r\n $scope.onLoadErrorText = ''; //error text to display when group cannot be loaded\r\n $scope.errorText = ''; //error text for other error cases ie. detail update submission\r\n $scope.loading = true;\r\n $scope.data = {\r\n formEditing: false,\r\n };\r\n $scope.update = {};\r\n\r\n /** Edit/Cancel Button */\r\n $scope.editButtonClicked = function (editing) {\r\n populateUI();\r\n };\r\n\r\n /**\r\n * Loads the UI with the data that is stored in $scope.group\r\n */\r\n function populateUI() {\r\n $scope.securityGroupId = $stateParams.securityGroupId;\r\n $scope.securityGroupDesc = $scope.group.attrs.description ? $scope.group.attrs.description : '';\r\n $scope.securityGroupName = $scope.group.name;\r\n $scope.securityGroupTags = [];\r\n\r\n for (let i = 0; i < $scope.group.tags.length; i++) {\r\n $scope.securityGroupTags[i] = {\r\n text: $scope.group.tags[i],\r\n };\r\n }\r\n\r\n $scope.update.Name = $scope.securityGroupName;\r\n $scope.update.Desc = $scope.securityGroupDesc;\r\n $scope.update.Tags = $scope.securityGroupTags.slice();\r\n }\r\n\r\n if ($stateParams.securityGroupId) {\r\n securityGroupsService.getSingleGroup($stateParams.securityGroupId).then(\r\n function (response) {\r\n $scope.loading = false;\r\n $scope.group = response.data;\r\n\r\n //Refresh the UI with the returned data\r\n populateUI();\r\n\r\n $scope.$broadcast('groupLoaded');\r\n },\r\n function (error) {\r\n $scope.loading = false;\r\n if (!$state.$current.parent.self.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedRow) {\r\n $state.$current.parent.self.ncyBreadcrumbLabel = $scope.$parent.selectedRow;\r\n } else {\r\n $state.$current.parent.self.ncyBreadcrumbLabel = 'Error';\r\n $state.$current.parent.self.ncyBreadcrumbLink =\r\n $state.$current.parent.parent.self.ncyBreadcrumbLink;\r\n }\r\n }\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving group information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n );\r\n } else {\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = gettextCatalog.getString(\r\n 'Could not load page: no security group ID provided.',\r\n );\r\n }\r\n\r\n $scope.existingNames = [];\r\n\r\n if ($scope.$parent.securityGroups) {\r\n for (let i = 0; i < $scope.$parent.securityGroups.length; i++) {\r\n $scope.existingNames.push($scope.$parent.securityGroups[i].name);\r\n }\r\n }\r\n $scope.$on('groupListLoaded', function () {\r\n for (let i = 0; i < $scope.$parent.securityGroups.length; i++) {\r\n $scope.existingNames.push($scope.$parent.securityGroups[i].name);\r\n }\r\n });\r\n\r\n $scope.nameExists = function () {\r\n if (!$scope.group) {\r\n return false;\r\n }\r\n for (let i = 0; i < $scope.existingNames.length; i++) {\r\n if (\r\n $scope.update.Name.toLowerCase() === $scope.existingNames[i].toLowerCase() &&\r\n !($scope.update.Name.toLowerCase() === $scope.group.name.toLowerCase())\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n $scope.editing = false;\r\n $scope.nameDescUpdated = false; //true if name and description form inputs have been updated\r\n $scope.nameDescConfirmed = false; //true if name and description changes have been confirmed (user clicks check mark)\r\n\r\n $scope.submitDetails = function (form) {\r\n $scope.errorFlag = false;\r\n // I think some of this validation is redundant. Looks like $scope.update.Name is undefined if it is invalid.\r\n if (\r\n !$scope.update.Name ||\r\n $scope.update.Name.length === 0 ||\r\n $scope.sending ||\r\n form.name.$error.maxlength\r\n ) {\r\n return;\r\n }\r\n $scope.sending = true;\r\n //update only description and preserve other properties\r\n const attrs = { ...($scope.group.attrs || {}), description: $scope.update.Desc };\r\n const tags = $scope.update.Tags.map((t) => t.text);\r\n let data = {\r\n name: $scope.update.Name,\r\n attrs,\r\n tags,\r\n };\r\n\r\n securityGroupsService\r\n .putGroupUpdate($scope.securityGroupId, data)\r\n .then(function (response) {\r\n $scope.group = _.merge($scope.group, response.config.data);\r\n $scope.securityGroupDesc = $scope.group.attrs.description\r\n ? $scope.group.attrs.description\r\n : '';\r\n $scope.securityGroupName = $scope.group.name;\r\n $scope.group.tags = response.config.data.tags.slice();\r\n $scope.securityGroupTags = [];\r\n\r\n for (let i = 0; i < $scope.group.tags.length; i++) {\r\n $scope.securityGroupTags[i] = {\r\n text: $scope.group.tags[i],\r\n };\r\n }\r\n\r\n $scope.update.Name = $scope.securityGroupName;\r\n $scope.update.Desc = $scope.securityGroupDesc;\r\n $scope.update.Tags = $scope.securityGroupTags.slice();\r\n $scope.nameDescConfirmed = false;\r\n $scope.data.formEditing = false;\r\n })\r\n .catch(function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while editing group details');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.sending = false;\r\n });\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n $scope.deleteButtonPressed = function () {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./delete-modal/_delete.modal.html'),\r\n controller: 'SecurityGroupViewDeleteModalController',\r\n resolve: {\r\n group: function () {\r\n return $scope.group;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n };\r\n\r\n let groupMenuItems = [\r\n {\r\n title: gettextCatalog.getString('Manage Assets'),\r\n sref: 'admin.securitygroupbase.equipment({securityGroupId:securityGroupId})',\r\n },\r\n {\r\n title: gettextCatalog.getString('Manage Users'),\r\n sref: 'admin.securitygroupbase.users({securityGroupId:securityGroupId})',\r\n },\r\n ];\r\n\r\n $scope.groupMenuItems = groupMenuItems;\r\n\r\n $scope.isActiveState = function (state) {\r\n return true;\r\n };\r\n\r\n $scope.nameChanged = function () {\r\n window.dataLayer.push({\r\n event: 'securityEditNameChanged',\r\n });\r\n };\r\n\r\n $scope.descriptionChanged = function () {\r\n window.dataLayer.push({\r\n event: 'securityEditDescriptionChanged',\r\n });\r\n };\r\n\r\n $scope.TagAdded = function () {\r\n $scope.resetFlags();\r\n GTM_TagsChanged('securityEditTagAdded');\r\n };\r\n\r\n $scope.TagRemoved = function () {\r\n $scope.resetFlags();\r\n GTM_TagsChanged('securityEditTagRemoved');\r\n };\r\n\r\n function GTM_TagsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.update.Tags.length,\r\n },\r\n });\r\n }\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport default function SecurityGroupsViewUsersController(\r\n $state,\r\n $log,\r\n $scope,\r\n $rootScope,\r\n $filter,\r\n $uibModal,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.userUrl = securityGroupsService.getUserUrl();\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n $scope.searchText = '';\r\n $scope.previousSearchText = '';\r\n $scope.filteredUsers = $scope.group.users;\r\n\r\n //Sorting\r\n $scope.predicate = 'name'; //for ngsortby\r\n $scope.reverse = false;\r\n\r\n //Sort security group users\r\n $scope.orderSecurityGroupUsers = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n GTM_AssetsChanged('securityUsersOrderChanged');\r\n };\r\n\r\n $scope.applyFilter = function (loading = false) {\r\n if (!loading && $scope.previousSearchText === $scope.searchText) return;\r\n $scope.filteredUsers = $filter('filter')($scope.group.users, $scope.searchText);\r\n $scope.previousSearchText = $scope.searchText;\r\n if (!loading) GTM_AssetsChanged('securityUsersFiltered');\r\n };\r\n\r\n $scope.openSelectModal = function () {\r\n var modalScope = $scope.$new();\r\n modalScope.modalTitle =\r\n gettextCatalog.getString('Select users for Security Group: ') + $scope.group.name;\r\n\r\n $scope.resetFlags();\r\n var modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('./users-modal/users.modal.html'),\r\n controller: 'SecurityGroupViewUserSelectionModalController',\r\n size: 'lg',\r\n scope: modalScope,\r\n resolve: {\r\n singleSelect: false,\r\n selectedUsers: function () {\r\n var selected = {};\r\n\r\n if ($scope.group.users) {\r\n for (var i = 0; i < $scope.group.users.length; i++) {\r\n var e = $scope.group.users[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(\r\n function (selectedUsers) {\r\n var changeSet = [];\r\n\r\n //If the selectedusers are not already in the groups users list then an add entry must be added to the changeset\r\n for (var key in selectedUsers) {\r\n if (\r\n !_.find($scope.group.users, function (e) {\r\n return key == e.id;\r\n })\r\n ) {\r\n changeSet.push({\r\n op: 'add',\r\n value: {\r\n user: $scope.userUrl + key,\r\n },\r\n });\r\n }\r\n }\r\n\r\n //If the selected user was in the previous group, but is not in the newly selectd list of users..then we need to remove it in the changeset\r\n _.forEach($scope.group.users, function (existingUser) {\r\n if (\r\n !_.find(selectedUsers, function (selectedUser) {\r\n return selectedUser.id == existingUser.id;\r\n })\r\n ) {\r\n changeSet.push({\r\n op: 'remove',\r\n value: {\r\n user: $scope.userUrl + existingUser.id,\r\n },\r\n });\r\n }\r\n });\r\n\r\n $scope.submitUsers(_.values(selectedUsers), changeSet);\r\n },\r\n function () {\r\n $log.info(\r\n gettextCatalog.getString('Modal dismissed at: {{date}}', {\r\n date: new Date(),\r\n }),\r\n );\r\n },\r\n );\r\n };\r\n\r\n //Remove all of the selected users\r\n $scope.removeSelected = function () {\r\n var newUserList = _.filter($scope.group.users, function (e) {\r\n return !e.selected;\r\n });\r\n\r\n var changeSet = _.map(\r\n _.filter($scope.group.users, function (e) {\r\n return e.selected;\r\n }),\r\n function (selectedUser) {\r\n return {\r\n op: 'remove',\r\n value: {\r\n user: $scope.userUrl + selectedUser.id,\r\n },\r\n };\r\n },\r\n );\r\n\r\n $scope.submitUsers(newUserList, changeSet);\r\n };\r\n\r\n $scope.submitUsers = function (newUserList, changeset) {\r\n $scope.errorFlag = false;\r\n var data = changeset;\r\n if (changeset.length == 0 || $scope.sending) {\r\n return;\r\n }\r\n $scope.sending = true;\r\n\r\n securityGroupsService\r\n .patchEquipmentUserUpdate($scope.securityGroupId, data)\r\n .then(\r\n function (response) {\r\n if (newUserList) {\r\n $scope.group.users = newUserList;\r\n $scope.applyFilter(true);\r\n }\r\n $scope.errorFlag = false;\r\n $scope.checkMembership();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while editing users');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n },\r\n )\r\n .finally(function () {\r\n $scope.sending = false;\r\n });\r\n return true;\r\n };\r\n\r\n $scope.checkMembership = function () {\r\n //if a user is discretionary and has removed themselves from the group, kick them back to the group list (this group effectively no longer exists for them)\r\n if ($rootScope.currentUser.securityMode !== 'Discretionary') {\r\n return;\r\n }\r\n\r\n //Check to see if we still in the group and have not removed ourself. If so, do nothing and return\r\n if (\r\n _.find($scope.group.users, function (e) {\r\n return e.id == $rootScope.currentUser.id;\r\n })\r\n )\r\n return;\r\n\r\n $state.go('admin.securitygroups', {\r\n create: false,\r\n deleted: false,\r\n selfRemoved: true,\r\n });\r\n };\r\n\r\n $scope.dropdownEvents = {\r\n onItemSelect: $scope.updateOnSelect,\r\n onItemDeselect: $scope.updateOnDropdownRemove,\r\n onSelectAll: $scope.updateOnSelectAll,\r\n onDeselectAll: $scope.updateOnRemoveAll,\r\n };\r\n\r\n $scope.isAllUsersSelected = function () {\r\n return !_.find($scope.group.users, function (e) {\r\n return !e.selected;\r\n });\r\n };\r\n\r\n $scope.numSelectedUsers = function () {\r\n return _.filter($scope.group.users, function (e) {\r\n return e.selected;\r\n }).length;\r\n };\r\n\r\n $scope.selectAllUsers = function () {\r\n var flag = !$scope.isAllUsersSelected();\r\n _.forEach($scope.group.users, function (e) {\r\n e.selected = flag;\r\n });\r\n\r\n GTM_AssetsChanged(flag ? 'securityUsersAllSelected' : 'securityUsersAllDeselected');\r\n };\r\n\r\n $scope.toggleUser = function (user) {\r\n user.selected = !user.selected;\r\n\r\n GTM_AssetsChanged(user.selected ? 'securityUserSelected' : 'securityUserDeselected');\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n GTM_AssetsChanged('securityUsersPageChanged');\r\n };\r\n\r\n function GTM_AssetsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.group.users.length,\r\n totalFiltered: $scope.filteredUsers.length,\r\n totalSelected: $scope.numSelectedUsers(),\r\n pageNumber: $scope.currentPage,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n","export default function SecurityGroupViewUserSelectionModalController(\r\n $rootScope,\r\n $scope,\r\n $uibModal,\r\n $stateParams,\r\n $filter,\r\n usersService,\r\n $uibModalInstance,\r\n selectedUsers,\r\n singleSelect,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope._selectedUsers = selectedUsers ? selectedUsers : {};\r\n $scope.filteredUsers = [];\r\n\r\n //Pagination\r\n $scope.current = { userListPage: 1, selectedUsersPage: 1 };\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 3;\r\n\r\n //displayUsersByPage() is used to set the legnth of paging needed for filteredUsers.\r\n $scope.displayUsersByPage = function () {\r\n $scope.totalItems = $scope.filteredUsers.length;\r\n var begin = ($scope.current.userListPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.usersByPage = $scope.filteredUsers.slice(begin, end);\r\n };\r\n\r\n $scope.displaySelectedUsersByPage = function () {\r\n var begin = ($scope.current.selectedUsersPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n return Object.keys($scope._selectedUsers).slice(begin, end);\r\n };\r\n\r\n //Calls displayUsersByPage(), everytime the the user changes the page.\r\n $scope.userPageChanged = function () {\r\n $scope.displayUsersByPage();\r\n GTM_AvailableListChanged('userModalAvailablePageChanged');\r\n };\r\n\r\n $scope.selectedUserPageChanged = function () {\r\n $scope.displaySelectedUsersByPage();\r\n GTM_SelectedListChanged('userModalSelectedPageChanged');\r\n };\r\n\r\n //applyFilter searchs the userData[] for anything matching the search input.\r\n $scope.applyFilter = function (loading = false) {\r\n $scope.filteredUsers = $filter('filter')($scope.users, $scope.searchString);\r\n $scope.displayUsersByPage();\r\n GTM_AvailableListChanged(loading ? 'userModalAvailableLoaded' : 'userModalAvailableFiltered');\r\n };\r\n\r\n var refresh = function () {\r\n if ($scope.loading) {\r\n $scope.isDirty = true;\r\n return;\r\n }\r\n\r\n $scope.loadingUsers = true;\r\n usersService\r\n .getUsers()\r\n .then(\r\n function (response, status, headers) {\r\n $scope.users = response.data;\r\n for (var i = 0; i < $scope.users.length; i++) {\r\n if ($scope.users[i].verified && !$scope.users[i].password.isSet) {\r\n $scope.users.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n $scope.filteredUsers = $scope.users.slice();\r\n $scope.applyFilter(true);\r\n $scope.displaySelectedUsersByPage();\r\n $scope.loading = false;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving user info');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n )\r\n .finally(function () {\r\n $scope.loadingUsers = false;\r\n });\r\n };\r\n\r\n var deselectUser = function (user) {\r\n if (!user) return;\r\n\r\n delete $scope._selectedUsers[user];\r\n $scope.displaySelectedUsersByPage();\r\n };\r\n\r\n $scope.selectUser = function (user) {\r\n if (!user) return;\r\n\r\n //if user cann't select himself userCannotSelectHimself should pass in when openning the modal\r\n if ($scope.userCannotSelectHimself && $rootScope.currentUser.id === user.id) {\r\n return;\r\n }\r\n\r\n if (!singleSelect) {\r\n if (!$scope._selectedUsers[user.id]) {\r\n $scope._selectedUsers[user.id] = user;\r\n GTM_AvailableListChanged('userModalAvailableUserSelected');\r\n } else {\r\n deselectUser(user.id);\r\n GTM_AvailableListChanged('userModalAvailableUserUnselected');\r\n }\r\n } else {\r\n $scope._selectedUsers = {};\r\n $scope._selectedUsers[user.id] = user;\r\n GTM_AvailableListChanged('userModalAvailableSingleUserSelected');\r\n }\r\n $scope.displaySelectedUsersByPage();\r\n };\r\n\r\n $scope.removeUser = function (user) {\r\n if (!user) return;\r\n\r\n deselectUser(user);\r\n GTM_SelectedListChanged('userModalSelectedRemovedUser');\r\n };\r\n\r\n $scope.numSelectedUsers = function () {\r\n return Object.keys($scope._selectedUsers).length;\r\n };\r\n\r\n //BUTTON EVENTS\r\n $scope.confirm = function () {\r\n $uibModalInstance.close($scope._selectedUsers);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n // Here you can take the control and call your own functions:\r\n\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n //INIT\r\n refresh();\r\n\r\n function GTM_SelectedListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.numSelectedUsers(),\r\n pageNumber: $scope.current.selectedUsersPage,\r\n },\r\n });\r\n }\r\n\r\n function GTM_AvailableListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.users.length,\r\n totalFiltered: $scope.filteredUsers.length,\r\n totalSelected: $scope.numSelectedUsers(),\r\n pageNumber: $scope.current.userListPage,\r\n },\r\n });\r\n }\r\n}\r\n","/* Controller Imports */\r\nimport SecurityGroupsListController from './list/list.controller';\r\nimport SecurityGroupCreateController from './create-group/create.controller';\r\nimport SecurityGroupViewDeleteModalController from './view/delete-modal/delete.modal.controller';\r\nimport SecurityGroupsViewAssetsController from './view/assets/assets.controller';\r\n\r\nimport SecurityGroupsViewController from './view/view.controller';\r\nimport SecurityGroupsViewUsersController from './view/users/users.controller';\r\nimport SecurityGroupViewUserSelectionModalController from './view/users/users-modal/users.modal';\r\n\r\nconst securityGroupsModule = angular\r\n .module('app.securityGroupManagement', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n .controller('SecurityGroupsListController', SecurityGroupsListController)\r\n .controller('SecurityGroupCreateController', SecurityGroupCreateController)\r\n .controller('SecurityGroupViewDeleteModalController', SecurityGroupViewDeleteModalController)\r\n .controller('SecurityGroupsViewAssetsController', SecurityGroupsViewAssetsController)\r\n\r\n .controller('SecurityGroupsViewController', SecurityGroupsViewController)\r\n .controller('SecurityGroupsViewUsersController', SecurityGroupsViewUsersController)\r\n .controller(\r\n 'SecurityGroupViewUserSelectionModalController',\r\n SecurityGroupViewUserSelectionModalController,\r\n );\r\nexport default securityGroupsModule.name;\r\n","\r\nexport default function ManageInviteViewRevokeModalController($scope, $uibModalInstance, invite, manageInvitesRepository, gettextCatalog) {\r\n \r\n 'ngInject';\r\n \r\n $scope.invite = invite;\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = \"\";\r\n\r\n $scope.ok = function () {\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n manageInvitesRepository.deleteInviteByEmail($scope.invite.email)\r\n .then(function (response) {\r\n $uibModalInstance.close();\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while revoking the invite. Please try again later.\");\r\n if (!!error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n else if (!!error.status && !!error.statusText) {\r\n errorMsg = gettextCatalog.getString(\"An error occurred while revoking the invite: \") + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n}\r\n","class ManageInvitesListController {\r\n constructor($ngRedux, $filter, manageInvitesRepository, gettextCatalog) {\r\n 'ngInject';\r\n this.filter = $filter;\r\n this.manageInvitesRepository = manageInvitesRepository;\r\n this.gettextCatalog = gettextCatalog;\r\n this.currentPage = 1;\r\n this.itemsPerPage = 10;\r\n this.maxSize = 1;\r\n this.loading = true;\r\n this.predicate = 'sent.at';\r\n this.reverse = true;\r\n this.invites;\r\n this.errorFlag = false;\r\n this.errorText = '';\r\n this.onLoadErrorFlag = false;\r\n this.onLoadErrorText = '';\r\n this.searchString = '';\r\n this.previousSearchString = '';\r\n this.filteredInvites = [];\r\n }\r\n\r\n $onInit() {\r\n this.getInvites();\r\n }\r\n\r\n orderInvites(predicate) {\r\n if (predicate === this.predicate) {\r\n this.reverse = !this.reverse;\r\n } else {\r\n this.reverse = false;\r\n }\r\n this.predicate = predicate;\r\n this.GTM_ListChanges('invitesOrderChanged');\r\n }\r\n\r\n pageChanged() {\r\n this.GTM_ListChanges('invitesPageChanged');\r\n }\r\n\r\n applyFilter(initialLoad) {\r\n if (\r\n !this.invites ||\r\n (typeof initialLoad === 'undefined' && this.previousSearchString === this.searchString)\r\n )\r\n return;\r\n this.filteredInvites = this.filter('filter')(this.invites, this.searchString);\r\n this.previousSearchString = this.searchString;\r\n this.GTM_ListChanges(initialLoad ? 'invitesLoaded' : 'invitesFiltered');\r\n }\r\n\r\n getInvites() {\r\n this.manageInvitesRepository.getAllInvites().then(\r\n (invites) => {\r\n this.invites = invites.data;\r\n this.applyFilter(true);\r\n this.loading = false;\r\n },\r\n (error) => {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving invite information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.onLoadErrorText = errorMsg;\r\n this.onLoadErrorFlag = true;\r\n this.loading = false;\r\n },\r\n );\r\n }\r\n\r\n GTM_ListChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: this.invites.length,\r\n totalFiltered: this.filteredInvites.length,\r\n pageNumber: this.currentPage,\r\n orderBy: this.predicate,\r\n sortDirection: this.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport const ManageInvitesListComponent = {\r\n template: require('./list.html'),\r\n bindings: {},\r\n controller: ManageInvitesListController,\r\n controllerAs: 'vm',\r\n};\r\n","\r\nexport default function ManageInvitesRepository($http, appSettings) {\r\n\r\n 'ngInject';\r\n \r\n return {\r\n getAllInvites: function () {\r\n return $http.get(appSettings.IcebergApiUserInfoEndpoint + '/invites/email');\r\n },\r\n getInviteByEmail: function (email) {\r\n return $http.get(appSettings.IcebergApiUserInfoEndpoint + '/invites/email/' + email);\r\n },\r\n\r\n getInviteByKey: function (key) {\r\n return $http.get(appSettings.IcebergApiUserInfoEndpoint + '/invites/key/' + key);\r\n },\r\n\r\n deleteInviteByEmail: function (email) {\r\n return $http.delete(appSettings.IcebergApiUserInfoEndpoint + '/invites/email/' + email);\r\n },\r\n\r\n updateInvite: function (email, data) {\r\n return $http.put(appSettings.IcebergApiUserInfoEndpoint + '/invites/email/' + email, data);\r\n }\r\n };\r\n}\r\n","export default function ManageInvitesViewController(\r\n $scope,\r\n $rootScope,\r\n $q,\r\n $filter,\r\n $stateParams,\r\n $uibModal,\r\n $log,\r\n manageInvitesRepository,\r\n RoleService,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.successFlag = false;\r\n $scope.successText = '';\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.showGroups = false;\r\n $scope.setAll = {};\r\n $scope.roleModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n $scope.editRoleModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n $scope.groupModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n $scope.editGroupModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n $scope.loading = true;\r\n $scope.sending = false;\r\n var currentUser = $rootScope.currentUser;\r\n\r\n //Sorting\r\n $scope.search = {\r\n query: {\r\n role: '',\r\n group: '',\r\n },\r\n };\r\n $scope.rolePredicate = 'name';\r\n $scope.groupPredicate = 'name';\r\n $scope.roleReverse = false;\r\n $scope.groupReverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredRolePolicies\r\n $scope.orderRoles = function (predicate, rev, filtered = false) {\r\n $scope.rolePredicate = predicate;\r\n if (rev) $scope.roleReverse = $scope.rolePredicate === predicate ? !$scope.roleReverse : false;\r\n\r\n angular.forEach($scope.filteredRoles, function (role) {\r\n role[predicate] = role[predicate];\r\n });\r\n $scope.filteredRoles = orderBy($scope.filteredRoles, $scope.rolePredicate, $scope.roleReverse);\r\n $scope.displayRolesByPage();\r\n GTM_RolesChanged(filtered ? 'inviteRolesFiltered' : 'inviteRolesOrderChanged');\r\n };\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderGroups = function (predicate, rev, filtered = false) {\r\n $scope.groupPredicate = predicate;\r\n if (rev)\r\n $scope.groupReverse = $scope.groupPredicate === predicate ? !$scope.groupReverse : false;\r\n\r\n angular.forEach($scope.filteredGroups, function (group) {\r\n group[predicate] = group[predicate];\r\n });\r\n $scope.filteredGroups = orderBy(\r\n $scope.filteredGroups,\r\n $scope.groupPredicate,\r\n $scope.groupReverse,\r\n );\r\n $scope.displayGroupsByPage();\r\n GTM_GroupsChanged(filtered ? 'inviteGroupsFiltered' : 'inviteGroupsOrderChanged');\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n roles: {\r\n page: 1,\r\n },\r\n groups: {\r\n page: 1,\r\n },\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredDataPoints.\r\n $scope.displayRolesByPage = function () {\r\n $scope.totalRoles = $scope.filteredRoles.length;\r\n var begin = ($scope.current.roles.page - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.rolesByPage = $scope.filteredRoles.slice(begin, end);\r\n };\r\n\r\n //displayRolePoliciesByPage() is used to set the legnth of paging needed for filteredRolePolicies.\r\n $scope.displayGroupsByPage = function () {\r\n $scope.totalGroups = $scope.filteredGroups.length;\r\n var begin = ($scope.current.groups.page - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.groupsByPage = $scope.filteredGroups.slice(begin, end);\r\n };\r\n\r\n //Calls displayDataPointsByPage(), everytime the the user changes the page.\r\n $scope.rolePageChanged = function () {\r\n $scope.displayRolesByPage();\r\n GTM_RolesChanged('inviteRolesPageChanged');\r\n };\r\n\r\n //Calls displayRolePoliciesByPage(), everytime the the user changes the page.\r\n $scope.groupPageChanged = function () {\r\n $scope.displayGroupsByPage();\r\n GTM_GroupsChanged('inviteGroupsPageChanged');\r\n };\r\n\r\n //applyFilter() searches the dataPoints[] for anything matching the search input.\r\n $scope.applyRoleFilter = function () {\r\n $scope.filteredRoles = $filter('filter')($scope.editRoles, {\r\n name: $scope.search.query.role,\r\n });\r\n $scope.orderRoles($scope.rolePredicate, false);\r\n };\r\n\r\n //applyPoliciesFilter() searches the rolePolicies[] for anything matching the search input.\r\n $scope.applyGroupFilter = function () {\r\n $scope.filteredGroups = $filter('filter')($scope.editGroups, {\r\n name: $scope.search.query.group,\r\n });\r\n $scope.orderGroups($scope.groupPredicate, false);\r\n };\r\n\r\n var init = function () {\r\n if ($stateParams.userEmail) {\r\n $scope.email = $stateParams.userEmail;\r\n manageInvitesRepository.getInviteByEmail($scope.email).then(\r\n function (invites) {\r\n $scope.invite = invites.data;\r\n\r\n $scope.$emit('$viewContentLoaded'); //breadcrumbs fix\r\n\r\n initRolesandGroups().then(\r\n function (response) {\r\n $scope.loading = false;\r\n },\r\n function (errorMsg) {\r\n $scope.loading = false;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n );\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving invite information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n },\r\n );\r\n } else {\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = gettextCatalog.getString(\r\n 'Could not load page: no recipient email provided.',\r\n );\r\n $scope.loading = false;\r\n }\r\n };\r\n\r\n var initRolesandGroups = function () {\r\n var defer = $q.defer();\r\n RoleService.getRoles().then(\r\n function onSuccess(response) {\r\n $scope.roles = response.data.slice();\r\n\r\n for (var i = 0; i < $scope.roles.length; i++) {\r\n for (var j = 0; j < $scope.invite.roles.length; j++) {\r\n if ($scope.roles[i].id === $scope.invite.roles[j]) {\r\n $scope.roles[i]._selected = true;\r\n $scope.invite.roles[j] = $scope.roles[i];\r\n $scope.roleModel.data[$scope.roles[i].id] = $scope.roles[i];\r\n $scope.roleModel.count++;\r\n break;\r\n }\r\n }\r\n }\r\n $scope.editRoles = angular.copy($scope.roles);\r\n $scope.filteredRoles = $scope.editRoles.slice();\r\n $scope.applyRoleFilter();\r\n $scope.editRoleModel = angular.copy($scope.roleModel);\r\n if (!$scope.showGroups) {\r\n defer.resolve();\r\n } else {\r\n return securityGroupsService.getAllSecurityGroups().then(\r\n function (response) {\r\n $scope.groups = response.data.data.slice();\r\n for (var i = 0; i < $scope.groups.length; i++) {\r\n for (var j = 0; j < $scope.invite.groups.length; j++) {\r\n if ($scope.groups[i].id === $scope.invite.groups[j]) {\r\n $scope.groups[i]._selected = true;\r\n $scope.invite.groups[j] = $scope.groups[i];\r\n $scope.groupModel.data[$scope.groups[i].id] = $scope.groups[i];\r\n $scope.groupModel.count++;\r\n break;\r\n }\r\n }\r\n }\r\n $scope.editGroups = angular.copy($scope.groups);\r\n $scope.filteredGroups = $scope.editGroups.slice();\r\n $scope.applyGroupFilter();\r\n $scope.editGroupModel = angular.copy($scope.groupModel);\r\n if ($scope.groupModel.count == 0 && currentUser.securityMode !== 'Open') {\r\n //if user is discretionary and doesn't belong to a group (ie. no results when querying for groups), don't let them edit an invite\r\n defer.reject(\r\n gettextCatalog.getString(\r\n 'Cannot edit an invite if not belonging to a security group.',\r\n ),\r\n );\r\n }\r\n defer.resolve();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving group information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg +=\r\n ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Cannot assign groups at this time.');\r\n }\r\n defer.reject(errorMsg);\r\n },\r\n );\r\n }\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n defer.reject(errorMsg);\r\n },\r\n );\r\n return defer.promise;\r\n };\r\n\r\n //cancel a invite\r\n $scope.cancelInvite = function () {\r\n $scope.resetFlags();\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./revoke-modal/_revoke.modal.html'),\r\n controller: 'ManageInviteViewRevokeModalController',\r\n backdropClass: 'tr-invite-revoke-dismiss',\r\n resolve: {\r\n invite: function () {\r\n return $scope.invite;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n\r\n modalInstance.result.then(\r\n function () {\r\n //show invite as being cancelled\r\n $scope.invite.status = gettextCatalog.getString('revoked');\r\n $scope.invite.revoked = {\r\n at: Date.now(),\r\n by: currentUser.email,\r\n };\r\n $scope.isEditing = false;\r\n $scope.successText = gettextCatalog.getString('Invite revoked successfully.');\r\n $scope.successFlag = true;\r\n },\r\n function () {\r\n $log.info(\r\n gettextCatalog.getString('Modal dismissed at: {{date}}', {\r\n date: new Date(),\r\n }),\r\n );\r\n },\r\n );\r\n };\r\n\r\n $scope.editButtonPressed = function () {\r\n $scope.resetFlags();\r\n if (!$scope.isEditing) {\r\n $scope.setAll = {};\r\n $scope.editRoles = angular.copy($scope.roles);\r\n $scope.filteredRoles = $scope.editRoles.slice();\r\n $scope.applyRoleFilter();\r\n $scope.editRoleModel = angular.copy($scope.roleModel);\r\n if ($scope.editGroups) {\r\n $scope.editGroups = angular.copy($scope.groups);\r\n $scope.filteredGroups = $scope.editGroups.slice();\r\n $scope.applyGroupFilter();\r\n $scope.editGroupModel = angular.copy($scope.groupModel);\r\n }\r\n }\r\n };\r\n\r\n $scope.roleSelected = function (role, model, selectingAll = false) {\r\n if (role._selected) {\r\n model.data[role.id] = role;\r\n model.count++;\r\n } else {\r\n delete model.data[role.id];\r\n model.count--;\r\n }\r\n\r\n if (!selectingAll) {\r\n GTM_RolesChanged(role._selected ? 'inviteRoleSelected' : 'inviteRoleDeselected');\r\n }\r\n };\r\n\r\n $scope.groupSelected = function (group, model, selectingAll = false) {\r\n if (group._selected) {\r\n model.data[group.id] = group;\r\n model.count++;\r\n } else {\r\n delete model.data[group.id];\r\n model.count--;\r\n }\r\n if (!selectingAll) {\r\n GTM_GroupsChanged(group._selected ? 'inviteGroupSelected' : 'inviteGroupDeselected');\r\n }\r\n };\r\n\r\n $scope.checkAllRoles = function () {\r\n for (var i = 0; i < $scope.editRoles.length; i++) {\r\n $scope.editRoles[i]._selected = $scope.setAll.roles;\r\n $scope.roleSelected($scope.editRoles[i], $scope.editRoleModel, true);\r\n }\r\n GTM_RolesChanged($scope.setAll.roles ? 'inviteRoleAllSelected' : 'inviteRoleAllDeselected');\r\n };\r\n\r\n $scope.checkAllGroups = function () {\r\n for (var i = 0; i < $scope.editGroups.length; i++) {\r\n $scope.editGroups[i]._selected = $scope.setAll.groups;\r\n $scope.groupSelected($scope.editGroups[i], $scope.editGroupModel, true);\r\n }\r\n GTM_GroupsChanged($scope.setAll.groups ? 'inviteGroupAllSelected' : 'inviteGroupAllDeselected');\r\n };\r\n\r\n $scope.saveButtonPressed = function () {\r\n if ($scope.editDisabled()) {\r\n return;\r\n }\r\n $scope.sending = true;\r\n $scope.resetFlags();\r\n var roleIds = [];\r\n var groupIds = [];\r\n for (var key in $scope.editRoleModel.data) {\r\n roleIds.push(key);\r\n }\r\n for (var key in $scope.editGroupModel.data) {\r\n groupIds.push(key);\r\n }\r\n var data = {\r\n roles: roleIds,\r\n groups: groupIds,\r\n };\r\n //save the updated roles and groups information\r\n manageInvitesRepository.updateInvite($stateParams.userEmail, data).then(\r\n function (response) {\r\n $scope.invite.roles = angular.copy($scope.editRoleModel.data);\r\n $scope.invite.groups = angular.copy($scope.editGroupModel.data);\r\n $scope.roles = angular.copy($scope.editRoles);\r\n $scope.groups = angular.copy($scope.editGroups);\r\n $scope.roleModel = angular.copy($scope.editRoleModel);\r\n $scope.groupModel = angular.copy($scope.editGroupModel);\r\n $scope.successFlag = true;\r\n $scope.successText = gettextCatalog.getString('Invite edited successfully.');\r\n $scope.isEditing = false;\r\n $scope.sending = false;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while updating the invite.');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.sending = false;\r\n },\r\n );\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n $scope.editDisabled = function () {\r\n return (\r\n !(\r\n $scope.editRoleModel.count > 0 &&\r\n (!$scope.groupsRequired || $scope.editGroupModel.count > 0)\r\n ) || $scope.sending\r\n );\r\n };\r\n\r\n $scope.typeOf = function (item) {\r\n return typeof item;\r\n };\r\n\r\n if (currentUser) {\r\n if (currentUser.account.securityMode !== 'Open') {\r\n //only allow groups to be selected if the account is discretionary\r\n $scope.showGroups = true;\r\n if (currentUser.securityMode !== 'Open') {\r\n //if the user is discretionary, they must select at least one group\r\n $scope.groupsRequired = true;\r\n }\r\n }\r\n init();\r\n }\r\n\r\n $rootScope.$watch('currentUser', function (newVal, oldVal) {\r\n if (newVal && typeof oldVal === 'undefined') {\r\n currentUser = $rootScope.currentUser;\r\n if (currentUser.account.securityMode !== 'Open') {\r\n //only allow groups to be selected if the account is discretionary\r\n $scope.showGroups = true;\r\n if (currentUser.securityMode !== 'Open') {\r\n //if the user is discretionary, they must select at least one group\r\n $scope.groupsRequired = true;\r\n }\r\n }\r\n init();\r\n }\r\n });\r\n\r\n function GTM_RolesChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.roles.length,\r\n totalFiltered: $scope.filteredRoles.length,\r\n totalSelected: $scope.roleModel.count,\r\n sortDirection: $scope.roleReverse ? 'descending' : 'ascending',\r\n pageNumber: $scope.current.roles.page,\r\n },\r\n });\r\n }\r\n\r\n function GTM_GroupsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.groups.length,\r\n totalFiltered: $scope.filteredGroups.length,\r\n totalSelected: $scope.groupModel.count,\r\n sortDirection: $scope.groupReverse ? 'descending' : 'ascending',\r\n pageNumber: $scope.current.groups.page,\r\n },\r\n });\r\n }\r\n}\r\n","export default function InviteUserController(\r\n $scope,\r\n $filter,\r\n $rootScope,\r\n $q,\r\n $state,\r\n inviteService,\r\n RoleService,\r\n securityGroupsService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.successFlag = false;\r\n $scope.successText = '';\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.sending = false;\r\n $scope.groupsRequired = false;\r\n $scope.setAll = {};\r\n $scope.loading = true;\r\n $scope.emailEditing = false;\r\n $scope.emailFormat = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n $scope.roleModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n $scope.groupModel = {\r\n data: {},\r\n count: 0,\r\n };\r\n var currentUser = $rootScope.currentUser;\r\n\r\n //Sorting\r\n $scope.search = {\r\n query: {\r\n role: '',\r\n group: '',\r\n },\r\n };\r\n $scope.rolePredicate = 'name';\r\n $scope.groupPredicate = 'name';\r\n $scope.roleReverse = false;\r\n $scope.groupReverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredRolePolicies\r\n $scope.orderRoles = function (predicate, rev) {\r\n $scope.rolePredicate = predicate;\r\n if (rev) {\r\n $scope.roleReverse = $scope.rolePredicate === predicate ? !$scope.roleReverse : false;\r\n }\r\n\r\n angular.forEach($scope.filteredRoles, function (role) {\r\n role[predicate] = role[predicate];\r\n });\r\n $scope.filteredRoles = orderBy($scope.filteredRoles, $scope.rolePredicate, $scope.roleReverse);\r\n $scope.displayRolesByPage();\r\n };\r\n\r\n //Sort filteredDataPoints\r\n $scope.orderGroups = function (predicate, rev) {\r\n $scope.groupPredicate = predicate;\r\n if (rev)\r\n $scope.groupReverse = $scope.groupPredicate === predicate ? !$scope.groupReverse : false;\r\n\r\n angular.forEach($scope.filteredGroups, function (group) {\r\n group[predicate] = group[predicate];\r\n });\r\n $scope.filteredGroups = orderBy(\r\n $scope.filteredGroups,\r\n $scope.groupPredicate,\r\n $scope.groupReverse,\r\n );\r\n $scope.displayGroupsByPage();\r\n };\r\n\r\n //Pagination\r\n $scope.current = {\r\n roles: {\r\n page: 1,\r\n },\r\n groups: {\r\n page: 1,\r\n },\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //displayDataPointsByPage() is used to set the legnth of paging needed for filteredDataPoints.\r\n $scope.displayRolesByPage = function () {\r\n $scope.totalRoles = $scope.filteredRoles.length;\r\n var begin = ($scope.current.roles.page - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.rolesByPage = $scope.filteredRoles.slice(begin, end);\r\n };\r\n\r\n //displayRolePoliciesByPage() is used to set the legnth of paging needed for filteredRolePolicies.\r\n $scope.displayGroupsByPage = function () {\r\n $scope.totalGroups = $scope.filteredGroups.length;\r\n var begin = ($scope.current.groups.page - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.groupsByPage = $scope.filteredGroups.slice(begin, end);\r\n };\r\n\r\n //Calls displayDataPointsByPage(), everytime the the user changes the page.\r\n $scope.rolePageChanged = function () {\r\n $scope.displayRolesByPage();\r\n GTM_RoleChanges('newUserRolesPageChanged');\r\n };\r\n\r\n //Calls displayRolePoliciesByPage(), everytime the the user changes the page.\r\n $scope.groupPageChanged = function () {\r\n $scope.displayGroupsByPage();\r\n GTM_GroupChanges('newUserGroupsPageChanged');\r\n };\r\n\r\n //applyFilter() searches the dataPoints[] for anything matching the search input.\r\n $scope.applyRoleFilter = function (initialLoad = false) {\r\n $scope.filteredRoles = $filter('filter')($scope.roles, {\r\n name: $scope.search.query.role,\r\n });\r\n $scope.orderRoles($scope.rolePredicate, false);\r\n $scope.displayRolesByPage();\r\n\r\n GTM_RoleChanges(initialLoad ? 'newUserRolesLoaded' : 'newUserRolesFilterChanged');\r\n };\r\n\r\n //applyPoliciesFilter() searches the rolePolicies[] for anything matching the search input.\r\n $scope.applyGroupFilter = function (initialLoad = false) {\r\n $scope.filteredGroups = $filter('filter')($scope.groups, {\r\n name: $scope.search.query.group,\r\n });\r\n $scope.orderGroups($scope.groupPredicate, false);\r\n $scope.displayGroupsByPage();\r\n\r\n GTM_GroupChanges(initialLoad ? 'newUserGroupsLoaded' : 'newUserGroupsFilterChanged');\r\n };\r\n\r\n $scope.initial = {\r\n roles: [],\r\n groups: [],\r\n };\r\n\r\n $scope.showGroups = false;\r\n\r\n var init = function () {\r\n var defer = $q.defer();\r\n RoleService.getRoles({ assignable: true }).then(\r\n function onSuccess(response) {\r\n $scope.roles = response.data.slice();\r\n $scope.filteredRoles = $scope.roles.slice();\r\n $scope.applyRoleFilter(true);\r\n if (!$scope.showGroups) {\r\n defer.resolve();\r\n } else {\r\n return securityGroupsService.getAllSecurityGroups().then(\r\n function (response) {\r\n $scope.groups = response.data.data.slice();\r\n $scope.filteredGroups = $scope.groups.slice();\r\n $scope.applyGroupFilter(true);\r\n if ($scope.groups.length == 0 && currentUser.securityMode !== 'Open') {\r\n //if user is discretionary and doesn't belong to a group (ie. no results when querying for groups), don't let them send an invite\r\n defer.reject(\r\n gettextCatalog.getString(\r\n 'Cannot invite a user if not belonging to a security group.',\r\n ),\r\n );\r\n }\r\n defer.resolve();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving group information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg +=\r\n ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n defer.reject(errorMsg);\r\n },\r\n );\r\n }\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n defer.reject(errorMsg);\r\n },\r\n );\r\n\r\n return defer.promise;\r\n };\r\n\r\n $scope.user = {\r\n email: '',\r\n };\r\n\r\n $scope.isFormValid = function (inviteuserForm) {\r\n $scope.inviteuserForm.$setSubmitted();\r\n\r\n window.dataLayer.push({\r\n event: 'newUserSendInvite',\r\n data: {\r\n valid: !inviteuserForm.$invalid,\r\n },\r\n });\r\n\r\n if (inviteuserForm.$invalid) {\r\n $scope.loading = false;\r\n return;\r\n } else {\r\n sendInvitation();\r\n }\r\n };\r\n\r\n // send invite button\r\n var sendInvitation = function () {\r\n if (\r\n !(\r\n ($scope.user.email.length > 0 || $scope.user.email.$valid) &&\r\n $scope.roleModel.count > 0 &&\r\n (!$scope.groupsRequired || $scope.groupModel.count > 0)\r\n ) ||\r\n $scope.sending\r\n ) {\r\n return;\r\n }\r\n $scope.resetFlags();\r\n $scope.sending = true;\r\n var roleIds = [];\r\n var groupIds = [];\r\n for (var key in $scope.roleModel.data) {\r\n roleIds.push(key);\r\n }\r\n for (var key in $scope.groupModel.data) {\r\n groupIds.push(key);\r\n }\r\n var data = {\r\n roles: roleIds,\r\n groups: groupIds,\r\n };\r\n inviteService.postInvite($scope.user.email, data).then(function onSuccess(response) {\r\n if (response.data.status === 'AlreadyMember') {\r\n $scope.successText = gettextCatalog.getString(\r\n 'That user is already a member of this Onei3 account.',\r\n );\r\n } else if (response.data.status === 'AlreadyInvited') {\r\n $scope.successText = gettextCatalog.getString('That user already has a pending invite.');\r\n } else if (response.data.status === 'AutoAccepted') {\r\n $scope.successText = gettextCatalog.getString(\r\n 'This user has been added, no further action is required on their part.',\r\n );\r\n } else {\r\n $scope.successText = gettextCatalog.getString('Invite sent successfully.');\r\n $state.go('admin.userinvitehistory', {\r\n userEmail: $scope.user.email,\r\n });\r\n }\r\n $scope.successFlag = true;\r\n $scope.sending = false;\r\n }, handleError);\r\n };\r\n\r\n //general error handler.\r\n function handleError(error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while sending the invite');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.sending = false;\r\n }\r\n\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n $scope.roleSelected = function (role, checkedAll = false) {\r\n if (role._selected) {\r\n $scope.roleModel.data[role.id] = role;\r\n $scope.roleModel.count++;\r\n } else {\r\n delete $scope.roleModel.data[role.id];\r\n $scope.roleModel.count--;\r\n }\r\n if (!checkedAll) {\r\n GTM_RoleChanges(role._selected ? 'newUserRoleSelected' : 'newUserRoleDeselected');\r\n }\r\n };\r\n\r\n $scope.groupSelected = function (group, checkedAll = false) {\r\n if (group._selected) {\r\n $scope.groupModel.data[group.id] = group;\r\n $scope.groupModel.count++;\r\n } else {\r\n delete $scope.groupModel.data[group.id];\r\n $scope.groupModel.count--;\r\n }\r\n\r\n if (!checkedAll) {\r\n GTM_GroupChanges(group._selected ? 'newUserGroupSelected' : 'newUserGroupDeselected');\r\n }\r\n };\r\n\r\n $scope.checkAllRoles = function () {\r\n for (var i = 0; i < $scope.roles.length; i++) {\r\n $scope.roles[i]._selected = $scope.setAll.roles;\r\n $scope.roleSelected($scope.roles[i], true);\r\n }\r\n GTM_RoleChanges($scope.setAll.roles ? 'newUserRolesAllSelected' : 'newUserRolesAllDeselected');\r\n };\r\n\r\n $scope.checkAllGroups = function () {\r\n for (var i = 0; i < $scope.groups.length; i++) {\r\n $scope.groups[i]._selected = $scope.setAll.groups;\r\n $scope.groupSelected($scope.groups[i], true);\r\n }\r\n\r\n GTM_GroupChanges(\r\n $scope.setAll.groups ? 'newUserGroupsAllSelected' : 'newUserGroupsAllDeselected',\r\n );\r\n };\r\n\r\n function GTM_RoleChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.roles.length,\r\n totalSelected: $scope.roleModel.count,\r\n totalFiltered: $scope.filteredRoles.length,\r\n pageNumber: $scope.current.roles.page,\r\n sortDirection: $scope.roleReverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n\r\n function GTM_GroupChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.groups.length,\r\n totalSelected: $scope.groupModel.count,\r\n totalFiltered: $scope.filteredGroups.length,\r\n pageNumber: $scope.current.groups.page,\r\n sortDirection: $scope.groupReverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n\r\n if (currentUser) {\r\n if (currentUser.account.securityMode !== 'Open') {\r\n //only allow groups to be selected if the account is discretionary\r\n $scope.showGroups = true;\r\n if (currentUser.securityMode !== 'Open') {\r\n //if the user is discretionary, they must select at least one group\r\n $scope.groupsRequired = true;\r\n }\r\n }\r\n init().then(\r\n function (response) {\r\n $scope.loading = false;\r\n },\r\n function (errorMsg) {\r\n $scope.loading = false;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n );\r\n }\r\n\r\n $rootScope.$watch('currentUser', function (newVal, oldVal) {\r\n if (newVal && typeof oldVal === 'undefined') {\r\n currentUser = $rootScope.currentUser;\r\n\r\n if (currentUser.account.securityMode !== 'Open') {\r\n $scope.showGroups = true;\r\n if (currentUser.securityMode !== 'Open') {\r\n $scope.groupsRequired = true;\r\n }\r\n }\r\n init().then(\r\n function (response) {\r\n $scope.loading = false;\r\n },\r\n function (errorMsg) {\r\n $scope.loading = false;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n );\r\n }\r\n });\r\n\r\n $scope.emailChanged = function () {\r\n window.dataLayer.push({\r\n event: 'newUserEmailChanged',\r\n });\r\n };\r\n}\r\n","\r\nexport default function UserViewDeleteModalController($scope, $uibModalInstance, user, $state, usersService, gettextCatalog) {\r\n\r\n 'ngInject'; \r\n \r\n $scope.user = user;\r\n\r\n $scope.ok = function () {\r\n usersService.removeUser($scope.user.id).then(function (response) {\r\n $state.go('admin.userslist');\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while removing user information\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n }\r\n else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.close();\r\n event.preventDefault();\r\n });\r\n}\r\n","export default function UserViewDetailsController(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n $uibModal,\r\n usersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.key = $stateParams.key;\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n $scope.roles = [];\r\n $scope.existingRoles = [];\r\n $scope.changes = [\r\n { op: 'add', roles: [] },\r\n { op: 'remove', roles: [] },\r\n ];\r\n $scope.userId = $stateParams.userId;\r\n var currentUser = $rootScope.currentUser;\r\n $scope.isSelf = false;\r\n\r\n //Scope functions\r\n var refresh = function () {\r\n usersService.getUser($stateParams.userId).then(\r\n function (response) {\r\n $scope.successFlag = $stateParams.success;\r\n $scope.user = response.data;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n $state.current.ncyBreadcrumbLabel = $scope.user.name;\r\n }\r\n $scope.firstName = $scope.user.claims.data.firstName;\r\n $scope.lastName = $scope.user.claims.data.lastName;\r\n\r\n $scope.roles = response.data.roles;\r\n $scope.groups = response.data.groups;\r\n $scope.loading = false;\r\n if ($scope.user.id === currentUser.id) {\r\n $scope.isSelf = true;\r\n }\r\n $scope.$emit('$viewContentLoaded'); //breadcrumb fix;\r\n },\r\n function (error) {\r\n $scope.loading = false;\r\n $scope.user = null;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = 'Error';\r\n }\r\n }\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving user information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n );\r\n };\r\n\r\n if (currentUser) {\r\n refresh();\r\n }\r\n\r\n $rootScope.$watch('currentUser', function (newVal, oldVal) {\r\n if (newVal && !oldVal) {\r\n currentUser = $rootScope.currentUser;\r\n refresh();\r\n }\r\n });\r\n\r\n $scope.toTitleCase = function (input) {\r\n input = input || '';\r\n return input.replace(/\\w\\S*/g, function (txt) {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n };\r\n\r\n $scope.removeButtonPressed = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./delete-modal/_delete.modal.html'),\r\n controller: 'UserViewDeleteModalController',\r\n backdropClass: 'tr-user-remove-dismiss',\r\n resolve: {\r\n user: function () {\r\n return $scope.user;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n //modalInstance.catch(function () {});\r\n };\r\n}\r\n","export default function UserViewDetailsEditController(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $rootScope,\r\n usersService,\r\n RoleService,\r\n securityGroupsService,\r\n $q,\r\n gettextCatalog,\r\n languagesService,\r\n) {\r\n 'ngInject';\r\n\r\n //scope variables\r\n $scope.userId = $stateParams.userId;\r\n $scope.changes = [\r\n { op: 'add', roles: [] },\r\n { op: 'remove', roles: [] },\r\n ];\r\n $scope.loading = true;\r\n $scope.roles = [];\r\n $scope.existingRoles = [];\r\n $scope.selectedUser = {};\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.sending = false;\r\n $scope.key = $stateParams.key;\r\n $scope.setAll = {};\r\n var currentUser = $rootScope.currentUser;\r\n $scope.isSelf = false;\r\n $scope.roleCount = 0;\r\n $scope.groupCount = 0;\r\n $scope.editedUserClaim = {};\r\n\r\n $scope.prefixOP = [\r\n { lookupCode: 'Mr', description: 'Mr.' },\r\n { lookupCode: 'Ms', description: 'Ms.' },\r\n { lookupCode: 'Dr', description: 'Dr.' },\r\n { lookupCode: 'Mrs', description: 'Mrs.' },\r\n ];\r\n\r\n $scope.measureUnitOptions = [\r\n { option: 'metric', des: 'Metric' },\r\n { option: 'imperial', des: 'Imperial' },\r\n { option: 'none', des: 'None' },\r\n ];\r\n\r\n $scope.languageOptions = languagesService.getSupportedLanguages();\r\n\r\n // function return true if string empty or has value\r\n var isStringOrEmpty = function (inputstring) {\r\n return !!inputstring || inputstring == '' ? true : false;\r\n };\r\n\r\n //Returns a promise when all fields have been updated asyncly\r\n var save = function () {\r\n $scope.resetFlags();\r\n $scope.sending = true;\r\n\r\n // Handle patch operation for each claim.\r\n var changeSets = [];\r\n if ($scope.editedUserClaim.firstName || $scope.editedUserClaim.firstName === '') {\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.firstName) ? 'update' : 'add',\r\n claims: { firstName: $scope.editedUserClaim.firstName },\r\n });\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.given_name) ? 'update' : 'add',\r\n claims: { given_name: $scope.editedUserClaim.firstName },\r\n });\r\n } else if ($scope.user.claims.data.firstName) {\r\n changeSets.push({ op: 'remove', claims: { firstName: $scope.user.claims.data.firstName } });\r\n changeSets.push({ op: 'remove', claims: { given_name: $scope.user.claims.data.given_name } });\r\n }\r\n if ($scope.editedUserClaim.lastName || $scope.editedUserClaim.lastName === '') {\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.lastName) ? 'update' : 'add',\r\n claims: { lastName: $scope.editedUserClaim.lastName },\r\n });\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.family_name) ? 'update' : 'add',\r\n claims: { family_name: $scope.editedUserClaim.lastName },\r\n });\r\n } else if ($scope.user.claims.data.lastName) {\r\n changeSets.push({ op: 'remove', claims: { lastName: $scope.user.claims.data.lastName } });\r\n changeSets.push({\r\n op: 'remove',\r\n claims: { family_name: $scope.user.claims.data.family_name },\r\n });\r\n }\r\n\r\n if (\r\n $scope.editedUserClaim.firstName ||\r\n $scope.editedUserClaim.lastName ||\r\n $scope.editedUserClaim.firstName === '' ||\r\n $scope.editedUserClaim.lastName === ''\r\n ) {\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.name) ? 'update' : 'add',\r\n claims: {\r\n name: (\r\n ($scope.editedUserClaim.firstName ? $scope.editedUserClaim.firstName : '') +\r\n ' ' +\r\n ($scope.editedUserClaim.lastName ? $scope.editedUserClaim.lastName : '')\r\n ).trim(),\r\n },\r\n });\r\n } else if ($scope.user.claims.data.firstName || $scope.user.claims.data.lastName) {\r\n changeSets.push({ op: 'remove', claims: { name: $scope.user.claims.data.name } });\r\n }\r\n\r\n if ($scope.editedUserClaim.phoneNumber || $scope.user.claims.data.phoneNumber)\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.phoneNumber) ? 'update' : 'add',\r\n claims: { phoneNumber: $scope.editedUserClaim.phoneNumber },\r\n });\r\n if ($scope.editedUserClaim.unitOfMeasure || $scope.user.claims.data.unitOfMeasure)\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.unitOfMeasure) ? 'update' : 'add',\r\n claims: { unitOfMeasure: $scope.editedUserClaim.unitOfMeasure },\r\n });\r\n if ($scope.editedUserClaim.timezone || $scope.user.claims.data.timezone)\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.timezone) ? 'update' : 'add',\r\n claims: { timezone: $scope.editedUserClaim.timezone },\r\n });\r\n if ($scope.editedUserClaim.language || $scope.user.claims.data.language)\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.language) ? 'update' : 'add',\r\n claims: { language: $scope.editedUserClaim.language },\r\n });\r\n if ($scope.editedUserClaim.prefix || $scope.user.claims.data.prefix)\r\n changeSets.push({\r\n op: isStringOrEmpty($scope.user.claims.data.prefix) ? 'update' : 'add',\r\n claims: { prefix: $scope.editedUserClaim.prefix || '' },\r\n }); // no null prefix\r\n\r\n var defer = $q.defer();\r\n\r\n //Returns a promise to update a security group\r\n function updateSecurityGroup(group) {\r\n var alreadyExists = false; //Make sure that we don't update something hasn't been updateed\r\n var def = $q.defer();\r\n\r\n for (var x = 0; x < $scope.user.groups.data.length; x++) {\r\n if ($scope.user.groups.data[x].id === group.id) {\r\n alreadyExists = true;\r\n break;\r\n }\r\n } //end for\r\n\r\n //Return either a patch or a remove request based on the change\r\n if (group._selected && !alreadyExists) {\r\n var data = [\r\n { op: 'add', value: { user: securityGroupsService.getUserUrl() + $scope.user.id } },\r\n ];\r\n return securityGroupsService.patchEquipmentUserUpdate(group.id, data);\r\n } //inner if\r\n else if (!group._selected && alreadyExists) {\r\n //remove\r\n var data = [\r\n { op: 'remove', value: { user: securityGroupsService.getUserUrl() + $scope.user.id } },\r\n ];\r\n return securityGroupsService.patchEquipmentUserUpdate(group.id, data);\r\n } //else\r\n\r\n //no changes do not need to call API\r\n def.resolve(gettextCatalog.getString('Not necessary'));\r\n\r\n return def.promise;\r\n }\r\n\r\n var index = 0;\r\n //Recursive functino to update security groups\r\n function updateSecurityGroupsFn(index, defer) {\r\n if (!$scope.groups) {\r\n defer.resolve(gettextCatalog.getString('Not necessary'));\r\n }\r\n if (index < $scope.groups.length) {\r\n updateSecurityGroup($scope.groups[index]).then(\r\n function (response) {\r\n updateSecurityGroupsFn(++index, defer);\r\n },\r\n function (error) {\r\n defer.reject(error);\r\n //error updating the security group\r\n },\r\n );\r\n } else {\r\n defer.resolve(gettextCatalog.getString('Success'));\r\n }\r\n }\r\n\r\n var currentGroupIndex = 0;\r\n\r\n usersService\r\n .patchUserInfo($stateParams.userId, changeSets)\r\n .then(\r\n function (response) {\r\n for (var i = 0; i < $scope.roles.length; i++) {\r\n if ($scope.roles[i]._selected) {\r\n $scope.applyChange({ op: 'add', id: $scope.roles[i].id.toString() });\r\n } else if (!$scope.roles[i]._selected) {\r\n $scope.applyChange({ op: 'remove', id: $scope.roles[i].id.toString() });\r\n }\r\n }\r\n\r\n return usersService\r\n .patchUserRoles($stateParams.userId, $scope.changes)\r\n .then(null, function (error) {\r\n $scope.editing = false;\r\n $scope.sending = false;\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating user roles',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg +=\r\n ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n defer.reject(errorMsg);\r\n });\r\n },\r\n function (error) {\r\n $scope.editing = false;\r\n $scope.sending = false;\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating user information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n\r\n defer.reject(errorMsg);\r\n },\r\n )\r\n .then(function (response) {\r\n var def = $q.defer();\r\n //check security groups.\r\n updateSecurityGroupsFn(0, def);\r\n return def.promise.then(null, function (error) {\r\n $scope.editing = false;\r\n $scope.sending = false;\r\n var errorMsg = gettextCatalog.getString(\r\n \"An error occurred while updating user's security groups\",\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n defer.reject(errorMsg);\r\n });\r\n })\r\n .then(function (response) {\r\n defer.resolve(gettextCatalog.getString('User updated successfully.'));\r\n })\r\n .finally(function () {\r\n $scope.editing = false;\r\n $scope.sending = false;\r\n });\r\n\r\n return defer.promise;\r\n };\r\n\r\n $scope.prefixChanges = function () {\r\n window.dataLayer.push({\r\n event: 'userPrefixChanged',\r\n data: {\r\n prefix: $scope.editedUserClaim.prefix,\r\n },\r\n });\r\n };\r\n\r\n $scope.firstNameChanged = _.debounce(function () {\r\n window.dataLayer.push({\r\n event: 'userFirstNameChanged',\r\n });\r\n }, 1000);\r\n\r\n $scope.lastNameChanged = _.debounce(function () {\r\n window.dataLayer.push({\r\n event: 'userLastNameChanged',\r\n });\r\n }, 1000);\r\n\r\n $scope.phoneNumberChanged = _.debounce(function () {\r\n window.dataLayer.push({\r\n event: 'userPhoneNumberChanged',\r\n });\r\n }, 1000);\r\n\r\n $scope.unitOfMeasureChanged = function () {\r\n window.dataLayer.push({\r\n event: 'userUnitOfMeasureChanged',\r\n data: {\r\n unitOfMeasure: $scope.editedUserClaim.unitOfMeasure,\r\n },\r\n });\r\n };\r\n\r\n $scope.saveButtonPressed = function () {\r\n if (\r\n $scope.sending ||\r\n $scope.roleCount == 0 ||\r\n ($scope.groupsRequired && $scope.groupCount == 0) ||\r\n $scope.editUserForm.$invalid\r\n ) {\r\n return;\r\n }\r\n //wait for all promises to finish and return to detail page if finished\r\n save().then(\r\n function (response) {\r\n $scope.sending = false;\r\n $state.go('admin.userdetails', { userId: $scope.userId, success: true });\r\n },\r\n function (errorMsg) {\r\n $scope.sending = false;\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n console.log('Failed to save');\r\n },\r\n );\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.successFlag = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n //Scope functions\r\n var refresh = function () {\r\n if (currentUser.id === $stateParams.userId) {\r\n $scope.onLoadErrorText = gettextCatalog.getString(\r\n 'Cannot change your own permissions. To change your name and personal info, navigate to your profile page.',\r\n );\r\n $scope.onLoadErrorFlag = true;\r\n $scope.loading = false;\r\n return;\r\n }\r\n usersService\r\n .getUser($stateParams.userId)\r\n .then(\r\n function (response) {\r\n $scope.user = response.data;\r\n $scope.$emit('$viewContentLoaded');\r\n\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n $state.current.ncyBreadcrumbLabel = $scope.user.name;\r\n }\r\n $scope.editedUserClaim = angular.copy($scope.user.claims.data);\r\n\r\n return RoleService.getRoles(null, function (error) {\r\n $scope.loading = false;\r\n $scope.user = null;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = gettextCatalog.getString('Error');\r\n }\r\n }\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving user role information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n });\r\n },\r\n function (error) {\r\n $scope.loading = false;\r\n $scope.user = null;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = gettextCatalog.getString('Error');\r\n }\r\n }\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving user information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n )\r\n .then(function (response) {\r\n $scope.existingRoles = $scope.user.roles.data;\r\n $scope.roles = response.data;\r\n\r\n for (var i = 0; i < $scope.existingRoles.length; i++) {\r\n for (var j = 0; j < $scope.roles.length; j++) {\r\n if ($scope.roles[j].id === $scope.existingRoles[i].id) {\r\n $scope.roles[j]._selected = true;\r\n $scope.roleCount++;\r\n continue;\r\n }\r\n }\r\n }\r\n if ($scope.roleCount === $scope.roles.length) {\r\n $scope.setAll.roles = true;\r\n }\r\n\r\n if (currentUser.account.securityMode !== 'Open') {\r\n securityGroupsService.getAllSecurityGroups().then(\r\n function (response) {\r\n $scope.groups = response.data.data;\r\n\r\n if ($scope.user.groups) {\r\n for (var i = 0; i < $scope.user.groups.data.length; i++) {\r\n for (var j = 0; j < $scope.groups.length; j++) {\r\n if ($scope.groups[j].id === $scope.user.groups.data[i].id) {\r\n $scope.groups[j]._selected = true;\r\n $scope.groupCount++;\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.groupCount === $scope.groups.length) {\r\n $scope.setAll.groups = true;\r\n }\r\n }\r\n $scope.loading = false;\r\n if (currentUser.securityMode !== 'Open') {\r\n $scope.groupsRequired = true;\r\n }\r\n },\r\n function (error) {\r\n $scope.loading = false;\r\n $scope.user = null;\r\n if (!$state.current.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedName) {\r\n $state.current.ncyBreadcrumbLabel = $scope.$parent.selectedName;\r\n } else {\r\n $state.current.ncyBreadcrumbLabel = gettextCatalog.getString('Error');\r\n }\r\n }\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving security groups',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg +=\r\n ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n );\r\n } else {\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n if (currentUser) {\r\n refresh();\r\n }\r\n\r\n $rootScope.$watch('currentUser', function (newVal, oldVal) {\r\n if (newVal && !oldVal) {\r\n currentUser = $rootScope.currentUser;\r\n refresh();\r\n }\r\n });\r\n\r\n $scope.roleSelected = function (role, selectingAll = false) {\r\n if (role._selected) {\r\n $scope.roleCount++;\r\n if ($scope.roleCount == $scope.roles.length) {\r\n $scope.setAll.roles = true;\r\n }\r\n } else {\r\n $scope.roleCount--;\r\n if ($scope.roleCount == 0 || $scope.roleCount < $scope.roles.length) {\r\n $scope.setAll.roles = false;\r\n }\r\n }\r\n if (!selectingAll) {\r\n GTM_RoleChanges(role._selected ? 'userRoleSelected' : 'userRoleDeselected');\r\n }\r\n };\r\n\r\n $scope.groupSelected = function (group, selectingAll) {\r\n if (group._selected) {\r\n $scope.groupCount++;\r\n if ($scope.groupCount == $scope.groups.length) {\r\n $scope.setAll.groups = true;\r\n }\r\n } else {\r\n $scope.groupCount--;\r\n if ($scope.groupCount == 0 || $scope.groupCount < $scope.groups.length) {\r\n $scope.setAll.groups = false;\r\n }\r\n }\r\n if (!selectingAll) {\r\n GTM_GroupChanges(\r\n group._selected ? 'userSecurityGroupSelected' : 'userSecurityGroupDeselected',\r\n );\r\n }\r\n };\r\n\r\n $scope.checkAllRoles = function () {\r\n for (var i = 0; i < $scope.roles.length; i++) {\r\n if ($scope.roles[i]._selected == $scope.setAll.roles) {\r\n continue;\r\n }\r\n $scope.roles[i]._selected = $scope.setAll.roles;\r\n $scope.roleSelected($scope.roles[i], true);\r\n }\r\n GTM_RoleChanges($scope.setAll.roles ? 'userRolesAllSelected' : 'userRolesAllDeselected');\r\n };\r\n\r\n $scope.checkAllGroups = function () {\r\n for (var i = 0; i < $scope.groups.length; i++) {\r\n if ($scope.groups[i]._selected == $scope.setAll.groups) {\r\n continue;\r\n }\r\n $scope.groups[i]._selected = $scope.setAll.groups;\r\n $scope.groupSelected($scope.groups[i], true);\r\n }\r\n GTM_GroupChanges(\r\n $scope.setAll.groups ? 'userSecurityGroupsAllSelected' : 'userSecurityGroupsAllDeselected',\r\n );\r\n };\r\n\r\n $scope.applyChange = function (newChange) {\r\n for (var i = 0; i < $scope.changes.length; i++) {\r\n for (var j = 0; j < $scope.changes[i].roles.length; j++) {\r\n if ($scope.changes[i].roles[j].id === newChange.id) {\r\n if ($scope.changes[i].op === newChange.op) {\r\n return;\r\n } else {\r\n $scope.changes[i].roles.splice(j, 1);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (newChange.op === 'add') {\r\n //don't attempt to add a role that the user already has\r\n for (var i = 0; i < $scope.existingRoles.length; i++) {\r\n if ($scope.existingRoles[i].id === newChange.id) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (newChange.op === 'remove') {\r\n for (var i = 0; i < $scope.existingRoles.length; i++) {\r\n if ($scope.existingRoles[i].id === newChange.id) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n for (var i = 0; i < $scope.changes.length; i++) {\r\n if ($scope.changes[i].op === newChange.op) {\r\n $scope.changes[i].roles.push({ id: newChange.id });\r\n return;\r\n }\r\n }\r\n };\r\n\r\n function GTM_RoleChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.roles.length,\r\n totalSelected: $scope.roleCount,\r\n },\r\n });\r\n }\r\n\r\n function GTM_GroupChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.groups.length,\r\n totalSelected: $scope.groupCount,\r\n },\r\n });\r\n }\r\n}\r\n","export default function UserViewListController(\r\n $scope,\r\n $state,\r\n $filter,\r\n usersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Local variables\r\n $scope.searchText = '';\r\n $scope.previousSearchText = '';\r\n $scope.unavailable = 'Unavailable';\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 10;\r\n $scope.maxSize = 3;\r\n\r\n //Sort filteredUserData\r\n $scope.orderBy = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n GTM_ListChanges('usersOrderChanged');\r\n };\r\n\r\n //applyFilter searchs the userData[] for anything matching the search input.\r\n $scope.applyFilter = function (initialLoad) {\r\n if (\r\n !$scope.userData ||\r\n (typeof initialLoad === 'undefined' && $scope.previousSearchText === $scope.searchText)\r\n )\r\n return;\r\n $scope.filteredUserData = $filter('filter')($scope.userData, $scope.searchText);\r\n $scope.previousSearchText = $scope.searchText;\r\n GTM_ListChanges(\r\n typeof initialLoad === 'undefined'\r\n ? 'usersfiltered'\r\n : initialLoad\r\n ? 'usersLoaded'\r\n : 'usersRefreshed',\r\n );\r\n };\r\n\r\n var refresh = function (initialLoad = false) {\r\n $scope.loading = true;\r\n\r\n //general error handler.\r\n function handleError(error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving user information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n }\r\n\r\n //Get all users\r\n usersService\r\n .getUsers()\r\n .then(function (response) {\r\n $scope.userData = response.data;\r\n for (var i = 0; i < $scope.userData.length; i++) {\r\n if ($scope.userData[i].verified && !$scope.userData[i].password.isSet) {\r\n $scope.userData.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n if ($scope.userData) {\r\n for (var i = 0; i < $scope.userData.length; i++) {\r\n $scope.userData[i].roles.data.sort(function (a, b) {\r\n var x = a.name.toLowerCase();\r\n var y = b.name.toLowerCase();\r\n if (x < y) {\r\n return -1;\r\n }\r\n if (x > y) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n var concatData = [];\r\n for (var j = 0; j < $scope.userData[i].roles.data.length; j++) {\r\n concatData.push($scope.userData[i].roles.data[j].name);\r\n }\r\n $scope.userData[i].roles['concatData'] = concatData.join();\r\n }\r\n }\r\n $scope.applyFilter(initialLoad);\r\n }, handleError)\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n $scope.pageChanged = function () {\r\n GTM_ListChanges('usersPageChanged');\r\n };\r\n\r\n function GTM_ListChanges(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.userData.length,\r\n totalFiltered: $scope.filteredUserData.length,\r\n pageNumber: $scope.currentPage,\r\n orderBy: $scope.predicate,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n\r\n refresh(true);\r\n}\r\n","/* Controller Imports */\r\nimport angular from 'angular';\r\nimport ManageInviteViewRevokeModalController from './manage-invites/view/revoke-modal/revoke.controller';\r\nimport {ManageInvitesListComponent} from './manage-invites/list/list.controller';\r\nimport ManageInvitesRepository from './manage-invites/view.service';\r\nimport ManageInvitesViewController from './manage-invites/view/view.controller';\r\nimport InviteUserController from './invite-user/invite.controller';\r\nimport UserViewDeleteModalController from './users/view/delete-modal/delete.modal.controller';\r\nimport UserViewDetailsController from './users/view/view.controller';\r\nimport UserViewDetailsEditController from './users/view/edit/edit.controller';\r\nimport UserViewListController from './users/list/list.controller';\r\n\r\nconst userManagementModule = angular\r\n .module('app.userManagement', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n .component('manageInvites', ManageInvitesListComponent)\r\n .controller('ManageInvitesViewController', ManageInvitesViewController)\r\n .controller('ManageInviteViewRevokeModalController', ManageInviteViewRevokeModalController)\r\n .factory('manageInvitesRepository', ManageInvitesRepository)\r\n .controller('InviteUserController', InviteUserController)\r\n .controller('UserViewDeleteModalController', UserViewDeleteModalController)\r\n .controller('UserViewDetailsController', UserViewDetailsController)\r\n .controller('UserViewDetailsEditController', UserViewDetailsEditController)\r\n .controller('UserViewListController', UserViewListController);\r\nexport default userManagementModule.name;\r\n","export default function ProductDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n product,\r\n $state,\r\n productService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n $scope.product = product;\r\n\r\n $scope.ok = function() {\r\n $scope.errorFlag = false;\r\n $scope.deleting = true;\r\n productService.deleteProduct($scope.product.id).then(\r\n function(response) {\r\n $scope.$emit('productsUpdated');\r\n $uibModalInstance.close();\r\n $state.go('admin.products');\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting the template.');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.deleting = false;\r\n }\r\n );\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n $scope.cancel();\r\n });\r\n}\r\n","export default function ProductsController(\r\n $scope,\r\n $filter,\r\n $state,\r\n productService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n //Local Variables\r\n $scope.allProducts = [];\r\n $scope.filteredProducts = [];\r\n $scope.searchText = '';\r\n $scope.previousSearchText = '';\r\n $scope.selectName = '';\r\n $scope.loading = true;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 20;\r\n $scope.maxSize = 3;\r\n\r\n $scope.pageChanged = function () {\r\n GTM_ListChanged('templatesPageChanged');\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n if ($scope.previousSearchText === $scope.searchText) return;\r\n $scope.filteredProducts = $filter('filter')($scope.allProducts, $scope.searchText);\r\n $scope.previousSearchText = $scope.searchText;\r\n GTM_ListChanged('templatesFiltered');\r\n };\r\n\r\n //order() is used to sort the table based on it's column names, currently defaulted to the 'name' column.\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n $scope.order = function (predicate) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n GTM_ListChanged('templatesOrderChanged');\r\n };\r\n\r\n productService.getAllProducts().then(function (response) {\r\n $scope.allProducts = response.data;\r\n $scope.filteredProducts = $scope.allProducts.slice();\r\n $scope.loading = false;\r\n GTM_ListChanged('templatesLoaded');\r\n }, handleError);\r\n\r\n //general error handler.\r\n function handleError(error) {\r\n $scope.loading = false;\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving template information.',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n }\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.allProducts.length,\r\n totalFiltered: $scope.filteredProducts.length,\r\n pageNumber: $scope.currentPage,\r\n sortDirection: $scope.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n} //end products controller\r\n","export default function ProductCreateController(\r\n $scope,\r\n $location,\r\n $state,\r\n productService,\r\n packagesService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.loading = true;\r\n //bool for showing modules dropdown if modules exist for currently selected package\r\n $scope.hasPkgModules = false;\r\n // ceate an array to hold the modules selected in the dropdown list\r\n $scope.selectedModules = [];\r\n //container to hold the modules from the selected package in the dropdown\r\n $scope.selectedPackageModules = [];\r\n //cup other containers to hold base packages and modules\r\n $scope.packages = []; //holds any package containing a tag ('base')\r\n $scope.modules = []; //holds any package containing a tag ('module')\r\n //build out the product model\r\n $scope.product = {\r\n name: '',\r\n metadata: {},\r\n package: {\r\n modules: [],\r\n },\r\n modules: [],\r\n tags: [],\r\n };\r\n $scope.templateNames = {};\r\n $scope.selectedPackage = null;\r\n\r\n $scope.addModuleToProduct = function (module, selectedModules) {\r\n $scope.selectedModules.push(module);\r\n };\r\n\r\n $scope.removeModuleFromProduct = function (module, selectedModules) {\r\n var idx = $scope.selectedModules.indexOf(module);\r\n $scope.selectedModules.splice(idx, 1);\r\n };\r\n\r\n /*************************************************************/\r\n\r\n var init = function () {\r\n productService\r\n .getAllProductsNames()\r\n .then(function (names) {\r\n $scope.templateNames = names;\r\n })\r\n .catch(() => {});\r\n packagesService.getAllPackages().then(\r\n function (response) {\r\n $scope.packageErrorFlag = false;\r\n $scope.packages = new Array();\r\n for (var i = 0; i < response.data.length; i++) {\r\n var pkg = response.data[i];\r\n if (!pkg.inactive) {\r\n if (pkg.tags) {\r\n if (pkg.isModule) {\r\n $scope.modules.push(pkg);\r\n continue;\r\n }\r\n }\r\n $scope.packages.push(pkg);\r\n }\r\n }\r\n },\r\n function (error) {\r\n $scope.packages = new Array();\r\n $scope.modules = new Array();\r\n var errorMsg = gettextCatalog.getString('Error retrieving packages from the i3 API ');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.packageErrorFlag = true;\r\n $scope.packageErrorText = errorMsg;\r\n },\r\n );\r\n\r\n $scope.loading = false;\r\n };\r\n\r\n init();\r\n\r\n $scope.changeSelectedPackage = function (selectedPackage) {\r\n $scope.product.package = selectedPackage;\r\n $scope.selectedItemChanged();\r\n window.dataLayer.push({\r\n event: 'newTemplatePackageChanged',\r\n });\r\n };\r\n\r\n //selectedItemChanged() will traverse the modules[] and the packages.modules[], compare the modules list in\r\n //both result sets and determine wether or not the selectedPackage has compatible modules to display to the user.\r\n $scope.selectedItemChanged = function () {\r\n $scope.selectedPackageModules = [];\r\n $scope.selectedModules = [];\r\n if ($scope.product.package.modules.length >= 1) {\r\n angular.forEach($scope.modules, function (gm) {\r\n angular.forEach($scope.product.package.modules, function (pm) {\r\n if (gm.id === pm) {\r\n $scope.selectedPackageModules.push(gm);\r\n }\r\n });\r\n });\r\n }\r\n //set hide or show the modules dropdown\r\n if ($scope.selectedPackageModules.length > 0) {\r\n $scope.hasModulespkg = true;\r\n } else {\r\n //We need to remove the existing values from the model and selectedPackageModules when hasModules is false.\r\n $scope.hasModulespkg = false;\r\n $scope.selectedModules = [];\r\n $scope.selectedPackageModules = [];\r\n }\r\n };\r\n\r\n // add or update a product\r\n $scope.submitproductForm = function () {\r\n if (\r\n $scope.productForm.$invalid ||\r\n $scope.packageErrorFlag ||\r\n $scope.gettingPackage ||\r\n $scope.loading\r\n ) {\r\n return;\r\n }\r\n $scope.errorFlag = false;\r\n\r\n //get the hardware from modules, because of the multiselect we use we cannot return the entire object\r\n //instead only the id is return so we have to go through the selected and compare them to all the modules\r\n if ($scope.selectedModules.length > 0) {\r\n for (var i = 0; i < $scope.modules.length; i++) {\r\n for (var j = 0; j < $scope.selectedModules.length; j++) {\r\n if ($scope.selectedModules[j].id === $scope.modules[i].id) {\r\n $scope.product.modules.push($scope.modules[i]);\r\n } //inner if .\r\n } //inner for\r\n } //outer for\r\n } //out if\r\n\r\n $scope.loading = true;\r\n productService\r\n .postNewProduct($scope.product)\r\n .then(\r\n function (response) {\r\n //If successfull go to the details page for this product\r\n $state.go('admin.products-edit', {\r\n id: response.data.id,\r\n });\r\n },\r\n function (error) {\r\n //if failed... show an error message\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving package information.',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n },\r\n )\r\n .finally(function (result) {\r\n $scope.loading = false;\r\n });\r\n }; // end submitproductForm\r\n\r\n $scope.nameChanged = function () {\r\n $scope.productForm.prodname.exists = !!$scope.templateNames[$scope.product.name.toLowerCase()];\r\n window.dataLayer.push({\r\n event: 'newTemplateNameChanged',\r\n });\r\n };\r\n\r\n $scope.makeChanged = function () {\r\n window.dataLayer.push({\r\n event: 'newTemplateMakeChanged',\r\n });\r\n };\r\n\r\n $scope.modelChanged = function () {\r\n window.dataLayer.push({\r\n event: 'newTemplateModelChanged',\r\n });\r\n };\r\n}\r\n","export default function ProductDetailController(\r\n $q,\r\n $scope,\r\n $stateParams,\r\n productService,\r\n packagesService,\r\n $uibModal,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n $scope.loading = true;\r\n //bool for showing modules dropdown if modules exist for currently selected package\r\n $scope.hasPackageModules = false;\r\n // ceate an array to hold the modules selected in the dropdown list\r\n $scope.selectedModules = [];\r\n //container to hold the modules from the selected package in the dropdown\r\n $scope.selectedPackageModules = [];\r\n //cup other containers to hold base packages and modules\r\n $scope.packages = []; //holds any package containing a tag ('base')\r\n $scope.modules = []; //holds any package containing a tag ('module')\r\n //build out the product model\r\n $scope.product = {};\r\n $scope.selectedPackage = {};\r\n $scope.templateNames = {};\r\n\r\n // add or update a product\r\n $scope.submitproductForm = function () {\r\n if ($scope.productForm.$invalid || $scope.loading) {\r\n return;\r\n }\r\n $scope.errorFlag = false;\r\n $scope.product.modules = [];\r\n\r\n //multiselect does not return the entire module object, so we use the selected module.ids and compare them to all the modules\r\n if ($scope.selectedModules.length > 0 && $scope.modules.length > 0) {\r\n for (var i = 0; i < $scope.modules.length; i++) {\r\n for (var j = 0; j < $scope.selectedModules.length; j++) {\r\n if ($scope.selectedModules[j].id === $scope.modules[i].id) {\r\n $scope.product.modules.push($scope.modules[i]);\r\n } //inner if .\r\n } //inner for\r\n } //outer for\r\n } //out if\r\n else {\r\n $scope.hasPackageModules = false;\r\n }\r\n\r\n $scope.loading = true;\r\n productService\r\n .updateProduct($scope.product)\r\n .then(function (response) {\r\n $scope.product = response.data;\r\n $scope.isEditing = false;\r\n $scope.loading = false;\r\n })\r\n .catch(function (error) {\r\n handleError(error, 'An error occurred while updating the template.');\r\n });\r\n }; // end submitproductForm\r\n\r\n //Edit/Cancel Button\r\n $scope.editButtonClicked = function (editing) {\r\n if (editing === true) {\r\n //Edit Button clicked, so store a copy of the data model\r\n $scope.backup = angular.copy($scope.product);\r\n $scope.selectedModBackup = angular.copy($scope.selectedModules);\r\n $scope.selectedPackageModBackup = angular.copy($scope.selectedPackageModules);\r\n } else {\r\n //Cancelled, so copy data back\r\n $scope.product = $scope.backup;\r\n $scope.selectedModules = $scope.selectedModBackup;\r\n $scope.selectedPackageModules = $scope.selectedPackageModBackup;\r\n }\r\n };\r\n\r\n $scope.deleteProductPressed = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./_delete.confirmation.modal.html'),\r\n controller: 'ProductDeleteModalController',\r\n backdropClass: 'tr-template-delete-dismiss',\r\n resolve: {\r\n product: function () {\r\n return $scope.product;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n };\r\n\r\n var getProduct = function (id) {\r\n id = id || $stateParams.id; // default to $stateParams.id if we don't have a value passed in\r\n $scope.isEditing = false;\r\n return productService\r\n .getProductById(id)\r\n .then(processProductResponse)\r\n .catch(function (error) {\r\n handleError(error, 'An error occurred while retrieving product information.');\r\n });\r\n };\r\n\r\n var processProductResponse = function (response) {\r\n $scope.product = response.data;\r\n\r\n $scope.selectedModules = [];\r\n $scope.selectedPackageModules = [];\r\n $scope.selectedPackageModulesIds = [];\r\n $scope.$emit('$viewContentLoaded'); // breadcrumbs notification\r\n\r\n if ($scope.product.package) {\r\n $scope.selectedPackage = $scope.product.package;\r\n for (let i = 0; i < $scope.packages.length; i++) {\r\n if ($scope.product.package.id === $scope.packages[i].id) {\r\n $scope.selectedPackageModulesIds.push($scope.packages[i].modules);\r\n } //inner if\r\n } //outer for\r\n } //out if\r\n\r\n for (let i = 0; i < $scope.modules.length; i++) {\r\n for (let j = 0; j < $scope.selectedPackageModulesIds[0].length; j++) {\r\n if ($scope.selectedPackageModulesIds[0][j] === $scope.modules[i].id) {\r\n $scope.selectedPackageModules.push($scope.modules[i]);\r\n } //inner if .\r\n } //inner for\r\n } //outer for\r\n\r\n if ($scope.product.modules.length > 0 && $scope.modules.length > 0) {\r\n $scope.hasPackageModules = true;\r\n for (let i = 0; i < $scope.modules.length; i++) {\r\n for (let j = 0; j < $scope.product.modules.length; j++) {\r\n if ($scope.product.modules[j].id === $scope.modules[i].id) {\r\n $scope.selectedModules.push($scope.modules[i]);\r\n } //inner if .\r\n } //inner for\r\n } //outer for\r\n } //out if\r\n else {\r\n $scope.hasPackageModules = false;\r\n $scope.selectedModules = [];\r\n }\r\n\r\n $scope.loading = false;\r\n };\r\n\r\n /**\r\n * Handle an error in a remote call\r\n * @param {any} error\r\n * @param {string} message\r\n */\r\n var handleError = function (error, message) {\r\n $scope.product = {};\r\n var errorMsg = gettextCatalog.getString(message);\r\n\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n\r\n return $q.reject();\r\n };\r\n\r\n var getTemplateNames = function () {\r\n productService\r\n .getAllProductsNames()\r\n .then(function (names) {\r\n $scope.templateNames = names;\r\n })\r\n .catch(() => {});\r\n };\r\n\r\n var getPackages = function () {\r\n return packagesService\r\n .getAllPackages()\r\n .then((response) => {\r\n processPackagesResponse(response);\r\n getProduct($stateParams.id);\r\n })\r\n .catch(function (error) {\r\n handleError(error, 'An error occurred while retrieving package information.');\r\n });\r\n };\r\n\r\n var processPackagesResponse = function (response) {\r\n //Resolve the packages\r\n $scope.packages = [];\r\n $scope.modules = [];\r\n\r\n for (var i = 0; i < response.data.length; i++) {\r\n var _package = response.data[i];\r\n if (!_package.inactive) {\r\n if (_package.tags) {\r\n if (_package.isModule) {\r\n $scope.modules.push(_package);\r\n continue;\r\n }\r\n }\r\n\r\n $scope.packages.push(_package);\r\n }\r\n }\r\n };\r\n getTemplateNames();\r\n getPackages();\r\n\r\n $scope.changeSelectedPackage = function (selectedPackage) {\r\n $scope.product.package = selectedPackage;\r\n $scope.selectedItemChanged();\r\n window.dataLayer.push({\r\n event: 'templatePackageChanged',\r\n });\r\n };\r\n\r\n $scope.addModuleToProduct = function (module) {\r\n $scope.selectedModules.push(module);\r\n ModuleChanged('templateAddModuleChanged');\r\n };\r\n\r\n $scope.removeModuleFromProduct = function (module) {\r\n var idx = $scope.selectedModules.indexOf(module);\r\n $scope.selectedModules.splice(idx, 1);\r\n ModuleChanged('templateRemoveModuleChanged');\r\n };\r\n\r\n function ModuleChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: $scope.selectedModules.length,\r\n },\r\n });\r\n }\r\n\r\n //selectedItemChanged() will traverse the modules[] and the packages.modules[], compare the modules list in\r\n //both result sets and determine wether or not the selectedPackage has compatible modules to display to the user.\r\n $scope.selectedItemChanged = function () {\r\n $scope.selectedPackageModules = [];\r\n $scope.selectedModules = [];\r\n if ($scope.product.package.modules && $scope.product.package.modules.length >= 1) {\r\n angular.forEach($scope.modules, function (gm) {\r\n angular.forEach($scope.product.package.modules, function (pm) {\r\n if (gm.id === pm) {\r\n $scope.selectedPackageModules.push(gm);\r\n }\r\n });\r\n });\r\n }\r\n //set hide or show the modules dropdown\r\n if ($scope.selectedPackageModules.length > 0) {\r\n $scope.hasPackageModules = true;\r\n } else {\r\n //We need to remove the existing values from the model and selectedPackageModules when hasModules is false.\r\n $scope.hasPackageModules = false;\r\n $scope.selectedModules = [];\r\n $scope.selectedPackageModules = [];\r\n }\r\n };\r\n\r\n $scope.nameChanged = function () {\r\n let template = $scope.templateNames[$scope.product.name.toLowerCase()];\r\n $scope.productForm.prodname.exists = !!template && template.id !== $scope.product.id;\r\n window.dataLayer.push({\r\n event: 'templateNameChanged',\r\n });\r\n };\r\n\r\n $scope.makeChanged = function () {\r\n window.dataLayer.push({\r\n event: 'templateMakeChanged',\r\n });\r\n };\r\n\r\n $scope.modelChanged = function () {\r\n window.dataLayer.push({\r\n event: 'templateModelChanged',\r\n });\r\n };\r\n}\r\n","export default function ProductService($http, appSettings) {\r\n 'ngInject';\r\n const productSRVs = {};\r\n const packagesendpoint = `${appSettings.IcebergApiPackagesEndpoint}/packages`;\r\n const datapointendpoint = appSettings.IcebergApiDatapointsEndpoint;\r\n const productendpoint = appSettings.InReachApiProductsEndpoint;\r\n\r\n productSRVs.getAllPackages = function () {\r\n return $http.get(packagesendpoint);\r\n };\r\n\r\n productSRVs.getPackageById = function (packageid) {\r\n return $http.get(`${packagesendpoint}/${packageid}`);\r\n };\r\n\r\n productSRVs.getAllProducts = function () {\r\n return $http.get(productendpoint);\r\n };\r\n\r\n productSRVs.getAllProductsNames = function () {\r\n return new Promise((resolve, reject) => {\r\n productSRVs.getAllProducts().then((response) => {\r\n let names = {};\r\n response.data.forEach((template) => {\r\n names[template.name.toLowerCase()] = template;\r\n });\r\n resolve(names);\r\n }, reject);\r\n });\r\n };\r\n\r\n productSRVs.getProductById = function (productId) {\r\n return $http.get(`${productendpoint}/${productId}`);\r\n };\r\n\r\n productSRVs.getTriggersBySchemaId = function (schemaId) {\r\n return $http.get(`${productendpoint}/${schemaId}/triggers`);\r\n };\r\n\r\n productSRVs.getFriendlyDatapoint = function () {\r\n return $http.get(datapointendpoint);\r\n };\r\n\r\n productSRVs.postNewProduct = function (product) {\r\n return $http.post(productendpoint, product);\r\n };\r\n\r\n productSRVs.deleteProduct = function (productId) {\r\n return $http.delete(`${productendpoint}/${productId}`);\r\n };\r\n\r\n productSRVs.addEquipment = function (productId, equipmentId) {\r\n return $http.put(`${productendpoint}/${productId}/equipment/${equipmentId}`);\r\n };\r\n\r\n productSRVs.updateProduct = function (product) {\r\n return $http.put(`${productendpoint}/${product.id}`, product);\r\n };\r\n\r\n return productSRVs;\r\n}\r\n","import angular from 'angular';\r\n\r\nimport appSettingsModule from '../../../../app.settings.module';\r\n\r\nimport ProductDeleteModalController from './product.delete.modal.controller';\r\nimport ProductsController from './products.controller';\r\nimport ProductCreateController from './products.create.controller';\r\nimport ProductDetailController from './products.detail.controller';\r\nimport ProductService from './products.service';\r\n\r\nconst productsModule = angular.module('admin.assets.products', [\r\n\tappSettingsModule\r\n]);\r\n\r\nproductsModule\r\n\t.controller('ProductDeleteModalController', ProductDeleteModalController)\r\n\t.controller('ProductsController', ProductsController)\r\n\t.controller('ProductCreateController', ProductCreateController)\r\n\t.controller('ProductDetailController', ProductDetailController)\r\n\r\n\t.service('productService', ProductService);\r\n\r\nexport default productsModule.name;\r\n","import modalTemplate from './manage.revoke-shared.modal.html';\r\n\r\nexport default function ManageSharedAssetsController(\r\n $uibModal,\r\n $filter,\r\n transfersService,\r\n equipmentRepository,\r\n arrayUtil,\r\n gettextCatalog,\r\n $state,\r\n) {\r\n 'ngInject';\r\n\r\n let vm = this;\r\n let options = {\r\n limit: 2500,\r\n since: 0,\r\n };\r\n let queryString = '';\r\n //public\r\n vm.loading = true;\r\n vm.errorText = '';\r\n vm.errorFlag = false;\r\n vm.revokeFlag = false;\r\n vm.accounts = [];\r\n vm.sharedAssets = [];\r\n vm.selectedEquipment = [];\r\n vm.revokedEquipment = [];\r\n vm.searchString = '';\r\n vm.isEquipmentSelected = true;\r\n vm.shareKey = null;\r\n\r\n //paging\r\n vm.itemsPerPage = 15;\r\n vm.currentPage = {\r\n responseData: null,\r\n };\r\n vm.maxSize = 1;\r\n\r\n vm.searchBarResults = searchBarResults;\r\n vm.openConfirmModal = openConfirmModal;\r\n vm.manageCheckedList = manageCheckedList;\r\n vm.updateEquipmentList = updateEquipmentList;\r\n vm.resetFlags = resetFlags;\r\n vm.shareAssetsPath = shareAssetsPath;\r\n\r\n vm.$onInit = function () {\r\n vm.currentPage.responseData = 1;\r\n getShareKeys();\r\n };\r\n\r\n function shareAssetsPath() {\r\n $state.go('admin.share');\r\n }\r\n\r\n function getShareKeys() {\r\n transfersService\r\n .getTransferKeysToShare()\r\n .then(function (response) {\r\n //vm.keys = response.data; // for \"View Assets Shared To:\" option selection\r\n let shareKeys = response.data || [];\r\n vm.accounts = buildAccountDropdown(shareKeys);\r\n })\r\n .catch(function () {\r\n vm.errorText = gettextCatalog.getString(\r\n 'An error occurred while trying to retrieve transfer keys.',\r\n );\r\n vm.errorFlag = true;\r\n })\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n // back to page one to display result properly\r\n function searchBarResults() {\r\n vm.currentPage.responseData = 1;\r\n vm.updateEquipmentList(vm.shareKey, 'shareFiltered');\r\n }\r\n\r\n function openConfirmModal() {\r\n resetFlags();\r\n if (vm.selectedEquipment.length <= 0) {\r\n vm.isEquipmentSelected = false;\r\n return;\r\n }\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: modalTemplate,\r\n controller: 'ManageSharedAssetsModalController',\r\n backdropClass: 'tr-share-revoke-dismiss',\r\n size: 'md',\r\n });\r\n modalInstance.result\r\n .then(function () {\r\n revokeShare();\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n function revokeShare() {\r\n if (vm.selectedEquipment.length <= 0) {\r\n return;\r\n }\r\n if (!vm.shareKey) {\r\n vm.errorText = gettextCatalog.getString('Missing share key.');\r\n vm.errorFlag = true;\r\n return;\r\n }\r\n let shareObj = getShareObject();\r\n transfersService\r\n .postEquipmentToShare(vm.shareKey, shareObj)\r\n .then(function () {\r\n vm.revokeFlag = true;\r\n vm.revokedEquipment = vm.selectedEquipment.splice(0);\r\n vm.updateEquipmentList(vm.shareKey, 'shareRevoked');\r\n })\r\n .catch(function () {\r\n vm.errorText = gettextCatalog.getString(\r\n 'An error occurred while trying to revoke the share.',\r\n );\r\n vm.errorFlag = true;\r\n });\r\n }\r\n\r\n function getShareObject() {\r\n let shareObj = {\r\n action: 'revoke',\r\n resources: [],\r\n };\r\n vm.selectedEquipment.forEach((selected) => {\r\n shareObj.resources.push(transfersService.getResourceUrl() + selected.id);\r\n });\r\n return shareObj;\r\n }\r\n\r\n function manageCheckedList(equip) {\r\n equip.checked = !equip.checked;\r\n if (equip.checked) {\r\n vm.selectedEquipment.push(equip);\r\n resetFlags();\r\n } else {\r\n // un-checked\r\n vm.selectedEquipment = vm.selectedEquipment.filter((asset) => asset.id !== equip.id);\r\n }\r\n GTM_ListChanged(equip.checked ? 'shareAssetSelected' : 'shareAssetDeselected');\r\n }\r\n\r\n function updateEquipmentList(key, GTMEvent) {\r\n vm.shareKey = key;\r\n vm.selectedEquipment = [];\r\n queryString = vm.searchString && vm.searchString.length > 0 ? vm.searchString : '*';\r\n equipmentRepository\r\n .getEquipmentSearch(queryString, options, null, null, vm.shareKey)\r\n .then(function (response) {\r\n let equipResponse = response.data.hits;\r\n vm.sharedAssets = vm.revokeFlag\r\n ? arrayUtil.removeItems(equipResponse, vm.revokedEquipment)\r\n : persistSelected(equipResponse);\r\n GTM_ListChanged(GTMEvent);\r\n })\r\n .catch(function () {\r\n vm.errorText = gettextCatalog.getString(\r\n 'An error occurred while trying to retrieve asset information.',\r\n );\r\n vm.errorFlag = true;\r\n });\r\n }\r\n\r\n function persistSelected(equipResponse) {\r\n if (vm.selectedEquipment.length > 0) {\r\n vm.selectedEquipment.forEach((selectedEquip) => {\r\n equipResponse.forEach((equip) => {\r\n if (selectedEquip.id === equip.id) {\r\n equipResponse.checked = true;\r\n }\r\n });\r\n });\r\n }\r\n return equipResponse;\r\n }\r\n\r\n function resetFlags() {\r\n vm.revokeFlag = false;\r\n vm.errorFlag = false;\r\n vm.isEquipmentSelected = true;\r\n }\r\n\r\n function buildAccountDropdown(shareKeys = []) {\r\n let accountArray = [];\r\n shareKeys.forEach(function (shareKey) {\r\n if (shareKey.attrs && shareKey.attrs.name) {\r\n accountArray.push({\r\n key: shareKey.key,\r\n name: shareKey.account + ' - ' + shareKey.attrs.name,\r\n });\r\n } else {\r\n accountArray.push({\r\n key: shareKey.key,\r\n name: shareKey.account,\r\n });\r\n }\r\n });\r\n let accounts = $filter('orderBy')(accountArray, 'name', false); // sort the acccount in dropdown by account name\r\n vm.accountMessage =\r\n accounts.length === 0\r\n ? gettextCatalog.getString('No accounts available to share to')\r\n : gettextCatalog.getString('Select Account...');\r\n\r\n return accounts;\r\n }\r\n\r\n vm.pageChanged = function () {\r\n GTM_ListChanged('sharePageChanged');\r\n };\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: vm.sharedAssets.length,\r\n totalSelected: vm.selectedEquipment.length,\r\n pageNumber: vm.currentPage.responseData,\r\n },\r\n });\r\n }\r\n}\r\n","export default function ManageSharedAssetsModalController($scope, $uibModalInstance) {\r\n 'ngInject';\r\n $scope.revokeShare = function() {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.dismiss();\r\n };\r\n}\r\n","import multiPickerTemplate from '../../../../../components/assetpicker/asset.multi.picker.html';\r\n\r\nexport default function ShareAssetsController(\r\n $filter,\r\n $uibModal,\r\n transfersService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n let vm = this;\r\n // local scopes variables\r\n vm.accounts = [];\r\n vm.equipments = [];\r\n vm.filteredEquipments = [];\r\n vm.equipmentsByPage = [];\r\n vm.errorText = '';\r\n vm.errorFlag = false;\r\n vm.loading = true;\r\n vm.successFlag = false;\r\n vm.postingData = false;\r\n vm.accountMessage = '';\r\n vm.searchString = '';\r\n vm.previousSearchString = '';\r\n vm.isAccountSelected = true;\r\n\r\n //Pagination\r\n vm.current = {\r\n equipsPage: 1,\r\n };\r\n vm.itemsPerPage = 8;\r\n vm.totalItems = 0;\r\n vm.predicate = 'name';\r\n vm.reverse = true;\r\n\r\n vm.getAccountsToShare = getAccountsToShare;\r\n vm.setPredicate = setPredicate;\r\n vm.displayEquipmentsByPage = displayEquipmentsByPage;\r\n vm.resetFlags = resetFlags;\r\n vm.openMultiAsstsModal = openMultiAsstsModal;\r\n vm.removeselectedEquips = removeselectedEquips;\r\n vm.shareEquipments = shareEquipments;\r\n vm.refreshSearch = refreshSearch;\r\n\r\n vm.$onInit = function () {\r\n vm.setPredicate(vm.predicate, true);\r\n vm.getAccountsToShare();\r\n };\r\n\r\n // Fill \"Share To:\" drop down\r\n function getAccountsToShare() {\r\n vm.loading = true;\r\n transfersService\r\n .getTransferKeysToShare()\r\n .then(function (response) {\r\n let shareKeys = response.data || [];\r\n vm.accounts = buildAccountDropdown(shareKeys);\r\n }, handleError)\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n // rest messages flages\r\n function resetFlags() {\r\n vm.successFlag = false;\r\n vm.errorFlag = false;\r\n vm.isAccountSelected = true;\r\n }\r\n\r\n // open multi assets picker\r\n function openMultiAsstsModal() {\r\n vm.resetFlags();\r\n let modalInstance = $uibModal.open({\r\n template: multiPickerTemplate,\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n prefilter: () => ({\r\n queries: ['NOT onei3:share:from:*'],\r\n }),\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: function () {\r\n return 50;\r\n },\r\n selectedAssets: function () {\r\n let selected = {};\r\n if (vm.equipments) {\r\n for (let i = 0; i < vm.equipments.length; i++) {\r\n let e = vm.equipments[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n },\r\n });\r\n\r\n // handel the modals return\r\n modalInstance.result.then(function (selectedAssets) {\r\n vm.equipments = [];\r\n for (let key in selectedAssets.result) {\r\n vm.equipments.push(selectedAssets.result[key]);\r\n }\r\n refreshTable();\r\n GTM_ListChanged('shareToAssetsSelectionChanged');\r\n });\r\n } // end openMultiAsset\r\n\r\n function removeselectedEquips(equip) {\r\n let newEquipList = [];\r\n angular.forEach(vm.equipments, function (equipment, key) {\r\n if (equip !== equipment.id) {\r\n newEquipList.push(equipment);\r\n }\r\n });\r\n\r\n vm.equipments = newEquipList.slice();\r\n refreshTable();\r\n GTM_ListChanged('shareToAssetRemoved');\r\n }\r\n\r\n // post the equipments to share api\r\n function shareEquipments(account) {\r\n if (!account) {\r\n vm.isAccountSelected = false;\r\n return;\r\n }\r\n let hrefResources = getEquipsHrefResource();\r\n\r\n if (!vm.postingData) {\r\n vm.postingData = true;\r\n transfersService\r\n .postEquipmentToShare(account, {\r\n action: 'share',\r\n resources: hrefResources,\r\n })\r\n .then(function (result) {\r\n vm.equipments = [];\r\n refreshTable();\r\n vm.successFlag = true;\r\n vm.postingData = false;\r\n }, handleErrorForShare);\r\n }\r\n }\r\n\r\n function handleErrorForShare(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred when sharing Assets');\r\n if (error.data)\r\n errorMsg += getEquipsFromHrefResource(error.data);\r\n else\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n vm.equipments = [];\r\n refreshTable();\r\n vm.errorText = errorMsg;\r\n vm.errorFlag = true;\r\n vm.postingData = false;\r\n }\r\n\r\n\r\n // get url for equipment\r\n function getEquipsHrefResource() {\r\n let equipsHrefResource = [];\r\n vm.equipments.forEach((equipment) => {\r\n equipsHrefResource.push(transfersService.getResourceUrl() + equipment.id);\r\n });\r\n return equipsHrefResource;\r\n }\r\n\r\n // get equipment from url\r\n function getEquipsFromHrefResource(hrefsConcatinated) {\r\n let equipsIds=\" \";\r\n let hrefs = hrefsConcatinated.split(',');\r\n hrefs.forEach((href) => {\r\n href = href.replace(transfersService.getResourceUrl(), \" \");\r\n href= href.trim();\r\n equipsIds += \" \" + (vm.equipments.find(x => x.id == href).name);\r\n });\r\n return equipsIds;\r\n }\r\n\r\n // Sort column ascending or descending\r\n function setPredicate(predicate, loading = false) {\r\n vm.reverse = vm.predicate === predicate ? !vm.reverse : false;\r\n vm.predicate = predicate;\r\n if (!loading) GTM_ListChanged('shareToAssetsOrderChanged');\r\n }\r\n\r\n function displayEquipmentsByPage() {\r\n vm.totalItems = vm.equipments.length;\r\n let begin = (vm.current.equipsPage - 1) * vm.itemsPerPage;\r\n let end = begin + vm.itemsPerPage;\r\n vm.equipmentsByPage = vm.filteredEquipments.slice(begin, end);\r\n }\r\n\r\n // submit search bar string\r\n function refreshSearch() {\r\n if (vm.previousSearchString === vm.searchString) return;\r\n vm.filteredEquipments = $filter('filter')(vm.equipments, vm.searchString);\r\n vm.previousSearchString = vm.searchString;\r\n vm.displayEquipmentsByPage();\r\n GTM_ListChanged('shareToAssetsFiltered');\r\n }\r\n\r\n //can call this after updating $scope.equipments to reflect changes on the table\r\n function refreshTable() {\r\n vm.filteredEquipments = $filter('filter')(vm.equipments, vm.searchString);\r\n vm.displayEquipmentsByPage();\r\n }\r\n\r\n function handleError(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred when loading Accounts');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } (${error.status.toString()} - ${error.statusText.toString()})`;\r\n } else {\r\n errorMsg += `: (${error.status.toString()} - ${error.statusText.toString()})`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n vm.accounts = [];\r\n vm.errorText = errorMsg;\r\n vm.errorFlag = true;\r\n }\r\n\r\n function buildAccountDropdown(shareKeys = []) {\r\n let accountArray = [];\r\n shareKeys.forEach(function (shareKey) {\r\n if (shareKey.attrs && shareKey.attrs.name) {\r\n accountArray.push({\r\n key: shareKey.key,\r\n name: shareKey.account + ' - ' + shareKey.attrs.name,\r\n });\r\n } else {\r\n accountArray.push({\r\n key: shareKey.key,\r\n name: shareKey.account,\r\n });\r\n }\r\n });\r\n let accounts = $filter('orderBy')(accountArray, 'name', false); // sort the acccount in dropdown by account name\r\n vm.accountMessage =\r\n accounts.length === 0\r\n ? gettextCatalog.getString('No accounts available to share to')\r\n : gettextCatalog.getString('Select Account...');\r\n return accounts;\r\n }\r\n\r\n vm.accountChanged = function () {\r\n vm.resetFlags();\r\n\r\n window.dataLayer.push({\r\n event: 'shareToAccountChanged',\r\n });\r\n };\r\n\r\n vm.pageChanged = function () {\r\n GTM_ListChanged('shareToAssetsPageChanged');\r\n };\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: vm.equipments.length,\r\n totalFiltered: vm.filteredEquipments.length,\r\n pageNumber: vm.current.equipsPage,\r\n orderBy: vm.predicate,\r\n sorDirection: vm.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n} // end controller\r\n","import angular from 'angular';\r\nimport ManageSharedAssetsController from './manage/manage.shared.assets.controller';\r\nimport ManageSharedAssetsModalController from './manage/manage.shared.assets.modal.controller';\r\nimport ShareAssetsController from './share/share.assets.controller';\r\n\r\nconst sharingModule = angular\r\n .module('admin.assets.sharing', [\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'gettext'\r\n ])\r\n .controller('ManageSharedAssetsController', ManageSharedAssetsController)\r\n .controller('ManageSharedAssetsModalController', ManageSharedAssetsModalController)\r\n .controller('ShareAssetsController', ShareAssetsController);\r\n\r\nexport default sharingModule.name;","class TagListController {\r\n constructor($filter, $stateParams, $state, EquipmentService, TimezoneService, gettextCatalog) {\r\n 'ngInject';\r\n this.filter = $filter;\r\n this.stateParams = $stateParams;\r\n this.state = $state;\r\n this.equipmentService = EquipmentService;\r\n this.TimezoneService = TimezoneService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.searchText = '';\r\n this.previouSearchText = '';\r\n this.tags = [];\r\n this.filteredTags = [];\r\n this.currentPage = 1;\r\n this.itemsPerPage = 10;\r\n this.maxSize = 1;\r\n this.predicate = 'key';\r\n this.reverse = false;\r\n this.orderBy = $filter('orderBy');\r\n this.createSuccessFlag = false;\r\n this.deleteSuccessFlag = false;\r\n this.loading = true;\r\n }\r\n\r\n $onInit() {\r\n this.getTags();\r\n if (this.stateParams.create) {\r\n this.createSuccessFlag = true;\r\n } else if (this.stateParams.deleted) {\r\n this.deleteSuccessFlag = true;\r\n }\r\n }\r\n\r\n //Sort filteredUserData\r\n orderTags(predicate) {\r\n if (predicate === this.predicate) {\r\n this.reverse = !this.reverse;\r\n } else {\r\n this.reverse = false;\r\n }\r\n this.predicate = predicate;\r\n this.GTM_ListChanged('attributesOrderChange');\r\n }\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n applyFilter() {\r\n if (this.previouSearchText === this.searchText) return;\r\n this.filteredTags = this.filter('filter')(this.tags, this.searchText);\r\n this.previouSearchText = this.searchText;\r\n this.GTM_ListChanged('attributesFiltered');\r\n }\r\n\r\n resetFlags() {\r\n this.createSuccessFlag = false;\r\n this.deleteSuccessFlag = false;\r\n }\r\n\r\n //Get all tags\r\n getTags() {\r\n this.equipmentService.getAllTags().then((response) => {\r\n this.tags = response.data.data;\r\n this.filteredTags = this.tags.slice();\r\n this.loading = false;\r\n this.GTM_ListChanged('attributesLoaded');\r\n }, this.handleError);\r\n }\r\n\r\n //general error handler.\r\n handleError(error) {\r\n this.loading = false;\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving attribute information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.onLoadErrorFlag = true;\r\n this.onLoadErrorText = errorMsg;\r\n }\r\n\r\n pageChanged() {\r\n this.GTM_ListChanged('attributesPageChanged');\r\n }\r\n\r\n GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: this.tags.length,\r\n totalFiltered: this.filteredTags.length,\r\n pageNumber: this.currentPage,\r\n orderBy: this.predicate,\r\n sorDirection: this.reverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport const TagListComponent = {\r\n template: require('./tag.list.html'),\r\n bindings: {},\r\n controller: TagListController,\r\n controllerAs: 'vm',\r\n};\r\n","import angular from 'angular';\r\n\r\nimport template from './tag.details.html';\r\nimport deleteConfirmModalTemplate from './_delete.attr.confirmation.modal.html';\r\n\r\nclass TagDetailsController {\r\n constructor(\r\n $scope,\r\n $filter,\r\n $state,\r\n $stateParams,\r\n $q,\r\n $uibModal,\r\n EquipmentService,\r\n TimezoneService,\r\n gettextCatalog,\r\n $ngRedux\r\n ) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.$filter = $filter;\r\n this.$state = $state;\r\n this.$stateParams = $stateParams;\r\n this.$q = $q;\r\n this.$uibModal = $uibModal;\r\n this.EquipmentService = EquipmentService;\r\n this.TimezoneService = TimezoneService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.store = $ngRedux;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis)(this);\r\n\r\n this.EquipmentService.getTagById(this.$stateParams.id).then(\r\n response => {\r\n this.tag = response.data;\r\n this.filteredTagValues = angular.copy(this.tag.values);\r\n if (this.tag.dataType === 'Datetime') {\r\n if (this.tag.range.min) {\r\n this.tag.range.min = this.TimezoneService.tagToUserTimezone(this.tag.range.min);\r\n }\r\n if (this.tag.range.max) {\r\n this.tag.range.max = this.TimezoneService.tagToUserTimezone(this.tag.range.max);\r\n }\r\n }\r\n this.$scope.$emit('$viewContentLoaded'); //breadcrumb fix;\r\n this.loading = false;\r\n },\r\n error => {\r\n this.loading = false;\r\n let errorMsg = this.gettextCatalog.getString('An error occurred while retrieving attribute information');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${error.data.message} ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.onLoadErrorFlag = true;\r\n this.onLoadErrorText = errorMsg;\r\n return $q.reject();\r\n }\r\n );\r\n\r\n this.values = [];\r\n this.loading = true;\r\n this.tag = {\r\n key: '',\r\n properties: {\r\n constraints: {},\r\n values: []\r\n }\r\n };\r\n\r\n //Pagination\r\n this.currentPage = 1;\r\n this.currentPageExisting = 1;\r\n this.itemsPerPage = 25;\r\n this.maxSize = 1;\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const {attributes} = state;\r\n\r\n let readonly = [];\r\n if (attributes != null && attributes.secured != null && attributes.secured.readonly) {\r\n readonly = readonly.concat(attributes.secured.readonly);\r\n }\r\n\r\n return {\r\n readonlyAttributes: readonly\r\n };\r\n }\r\n\r\n applyFilter() {\r\n this.filteredTagValues = this.$filter('filter')(this.tag.values, this.searchText);\r\n }\r\n\r\n editButtonClicked() {\r\n this.$state.go('admin.tag-edit', {\r\n id: this.$stateParams.id\r\n });\r\n }\r\n\r\n deleteButtonClicked() {\r\n const tag = this.tag;\r\n this.$uibModal.open({\r\n animation: true,\r\n template: deleteConfirmModalTemplate,\r\n controller: 'TagDeleteModalController',\r\n resolve: {\r\n tag: function() {\r\n return tag;\r\n }\r\n },\r\n size: 'md'\r\n });\r\n }\r\n\r\n isEditable() {\r\n const attributeKey = this.tag.key.toLowerCase();\r\n return this.readonlyAttributes.length === 0 || this.readonlyAttributes.indexOf(attributeKey) === -1;\r\n }\r\n}\r\n\r\nexport const TagDetailsComponent = {\r\n template,\r\n controller: TagDetailsController,\r\n controllerAs: 'vm',\r\n bindings: {}\r\n};\r\n","import Action from '../action';\r\n\r\nexport const FETCH_ATTRIBUTES_BEGIN = 'FETCH_ATTRIBUTES_BEGIN';\r\nexport const FETCH_ATTRIBUTES_SUCCESS = 'FETCH_ATTRIBUTES_SUCCESS';\r\nexport const FETCH_ATTRIBUTES_FAILURE = 'FETCH_ATTRIBUTES_FAILURE';\r\n\r\nexport const FETCH_ATTRIBUTE_SECURITY = 'FETCH_ATTRIBUTE_SECURITY';\r\nexport const FETCH_ATTRIBUTE_SECURITY_SUCCESS = 'FETCH_ATTRIBUTE_SECURITY_SUCCESS';\r\nexport const FETCH_ATTRIBUTE_SECURITY_FAILURE = 'FETCH_ATTRIBUTE_SECURITY_FAILURE';\r\n\r\nexport const ATTRIBUTE_CREATED = 'ATTRIBUTE_CREATED';\r\nexport const ATTRIBUTE_REMOVED = 'ATTRIBUTE_REMOVED';\r\n\r\nexport const createAttribute = () => Action(ATTRIBUTE_CREATED);\r\nexport const removeAttribute = () => Action(ATTRIBUTE_REMOVED);\r\n\r\nexport const fetch = () => Action(FETCH_ATTRIBUTES_BEGIN);\r\nexport const fetchSuccess = payload => Action(FETCH_ATTRIBUTES_SUCCESS, payload);\r\nexport const fetchFailure = payload => Action(FETCH_ATTRIBUTES_FAILURE, payload, true);\r\n\r\nexport const fetchSecurity = () => Action(FETCH_ATTRIBUTE_SECURITY);\r\nexport const fetchSecuritySuccess = payload => Action(FETCH_ATTRIBUTE_SECURITY_SUCCESS, payload);\r\nexport const fetchSecurityFailure = payload => Action(FETCH_ATTRIBUTE_SECURITY_FAILURE, payload, true);\r\n","import * as AttributeActions from '../../../../state/attributes/attributes.action';\r\n\r\nexport default function TagDeleteModalController(\r\n $scope,\r\n $uibModalInstance,\r\n tag,\r\n $state,\r\n EquipmentService,\r\n gettextCatalog,\r\n $ngRedux,\r\n) {\r\n 'ngInject';\r\n $scope.tag = tag;\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n\r\n function dispatchRemove() {\r\n $ngRedux.dispatch(AttributeActions.removeAttribute());\r\n }\r\n\r\n $scope.ok = function () {\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n EquipmentService.deleteTag($scope.tag.id).then(\r\n () => {\r\n $uibModalInstance.close();\r\n $state.go('admin.tag-list');\r\n dispatchRemove();\r\n },\r\n (error) => {\r\n $scope.loading = false;\r\n let errorMsg = gettextCatalog.getString('An error occurred while deleting the attribute');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n },\r\n );\r\n };\r\n\r\n $scope.cancel = () => {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', (event) => {\r\n $scope.cancel();\r\n });\r\n}\r\n","import * as AttributeActions from '../../../../state/attributes/attributes.action';\r\nimport _ from 'lodash';\r\n\r\nimport template from './tag.create.html';\r\nimport deleteConfirmModalTemplate from './_delete.attr.confirmation.modal.html';\r\n\r\nconst errorStatusText = (error) => (error.statusText ? ` - ${error.statusText}` : '');\r\n\r\nclass CreateTagController {\r\n constructor(\r\n $scope,\r\n $state,\r\n $stateParams,\r\n $location,\r\n EquipmentService,\r\n TimezoneService,\r\n gettextCatalog,\r\n $uibModal,\r\n $ngRedux,\r\n ) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.$stateParams = $stateParams;\r\n this.$location = $location;\r\n this.EquipmentService = EquipmentService;\r\n this.TimezoneService = TimezoneService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.$uibModal = $uibModal;\r\n this.store = $ngRedux;\r\n\r\n this.range = {};\r\n this.onSave = {};\r\n this.loading = true;\r\n this.tagNames = [];\r\n this.maxDescriptionLength = 255;\r\n this.dataTypes = {\r\n Text: 'Text',\r\n Integer: 'Integer',\r\n Decimal: 'Decimal',\r\n Date: 'Date',\r\n Datetime: 'Datetime',\r\n Hyperlink: 'Hyperlink',\r\n };\r\n this.tag = {\r\n id: null,\r\n key: '',\r\n freeform: false,\r\n dataType: this.dataTypes.Text,\r\n values: [],\r\n range: {},\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, AttributeActions)(this);\r\n\r\n if (this.$stateParams.id) {\r\n this.fetchTags();\r\n }\r\n\r\n this.fetchTagNames();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { attributes } = state;\r\n\r\n let readonly = [];\r\n if (attributes != null && attributes.secured != null && attributes.secured.readonly) {\r\n readonly = readonly.concat(attributes.secured.readonly);\r\n }\r\n\r\n return {\r\n readonlyAttributes: readonly,\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n //Public Methods\r\n edit() {\r\n return this.tag.id !== null;\r\n }\r\n\r\n toggleEntryType(freeForm) {\r\n this.tag.freeform = freeForm;\r\n\r\n window.dataLayer.push({\r\n event: 'attributeEntryTypeChanged',\r\n data: {\r\n freeForm: this.tag.freeform,\r\n },\r\n });\r\n }\r\n\r\n setDataType(dataType) {\r\n this.tagForm.$submitted = false;\r\n this.tag.range = {};\r\n this.tag.values = [];\r\n this.tag.dataType = dataType;\r\n window.dataLayer.push({\r\n event: 'attributeDataTypeChanged',\r\n data: {\r\n dataType: this.tag.dataType,\r\n },\r\n });\r\n }\r\n\r\n getButtonClass(tab) {\r\n return tab === this.tag.dataType ? 'btn-primary' : 'btn-default';\r\n }\r\n\r\n nameExists(name) {\r\n return (\r\n name &&\r\n -1 !== this.tagNames.indexOf(name.toLowerCase()) &&\r\n name.toLowerCase() !== this.tag.key.toLowerCase()\r\n );\r\n }\r\n\r\n valid(name) {\r\n return name != null && this.readonlyAttributes.indexOf(name.toLowerCase()) === -1;\r\n }\r\n\r\n hasError(field, validation) {\r\n if (validation) {\r\n return (\r\n (this.tagForm[field].$dirty && this.tagForm[field].$error[validation]) ||\r\n (this.tagForm.$submitted && this.tagForm[field].$error[validation])\r\n );\r\n }\r\n return (\r\n (this.tagForm[field].$dirty && this.tagForm[field].$invalid) ||\r\n (this.tagForm.$submitted && this.tagForm[field].$invalid)\r\n );\r\n }\r\n\r\n submittagForm() {\r\n if (\r\n this.tagForm.$invalid ||\r\n !this.valid(this.tag.key) ||\r\n this.nameExists(this.tag.key) ||\r\n this.sending\r\n ) {\r\n return;\r\n }\r\n this.sending = true;\r\n if (!this.tag.freeform) {\r\n this.onSave.invoke();\r\n }\r\n\r\n this.edit() ? this.putTag() : this.postTag();\r\n }\r\n\r\n delete() {\r\n const tag = this.tag;\r\n this.$uibModal.open({\r\n animation: true,\r\n template: deleteConfirmModalTemplate,\r\n backdropClass: 'tr-attribute-delete-dismiss',\r\n controller: 'TagDeleteModalController',\r\n resolve: {\r\n tag: function () {\r\n return tag;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n }\r\n\r\n cancel() {\r\n this.$state.go('admin.tag-details', {\r\n id: this.tag.id,\r\n });\r\n }\r\n\r\n //Private Methods\r\n handleError(error) {\r\n let errorMsg = this.gettextCatalog.getString('An error occurred');\r\n if (error.data || error.status) {\r\n if (error.data.Message) {\r\n if (error.data.Message.includes('already exists'))\r\n errorMsg = 'Attribute name already exists.';\r\n else errorMsg = error.data.Message + errorStatusText(error);\r\n } else {\r\n errorMsg += errorStatusText(error);\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.errorFlag = true;\r\n this.errorText = errorMsg;\r\n this.sending = false;\r\n this.loading = false;\r\n }\r\n\r\n fetchTags() {\r\n const me = this;\r\n return this.EquipmentService.getTagById(this.$stateParams.id).then((response) => {\r\n me.tag = response.data;\r\n\r\n if (me.tag.dataType === me.dataTypes.Datetime) {\r\n if (me.tag.range.min) {\r\n me.tag.range.min = me.TimezoneService.tagToUserTimezone(me.tag.range.min);\r\n }\r\n if (me.tag.range.max) {\r\n me.tag.range.max = me.TimezoneService.tagToUserTimezone(me.tag.range.max);\r\n }\r\n }\r\n me.$scope.$emit('$viewContentLoaded'); //breadcrumb fix;\r\n }, this.handleError);\r\n }\r\n\r\n fetchTagNames() {\r\n const me = this;\r\n return this.EquipmentService.getTagNames().then((response) => {\r\n me.tagNames = response.data;\r\n for (let i = 0; i < me.tagNames.length; i++) {\r\n me.tagNames[i] = me.tagNames[i].toLowerCase();\r\n }\r\n me.loading = false;\r\n }, this.handleError);\r\n }\r\n\r\n putTag() {\r\n const me = this;\r\n this.EquipmentService.putEditTag(this.tag.id, this.tag).then((response) => {\r\n me.createAttribute();\r\n\r\n me.$state.go('admin.tag-details', {\r\n id: response.data.id,\r\n });\r\n }, this.handleError.bind(this));\r\n }\r\n\r\n postTag() {\r\n let tag = _.clone(this.tag, true);\r\n const me = this;\r\n this.EquipmentService.postNewTag(tag).then((response) => {\r\n me.createAttribute();\r\n\r\n me.$state.go('admin.tag-details', {\r\n id: response.data.id,\r\n });\r\n }, this.handleError.bind(this));\r\n }\r\n\r\n nameChanged() {\r\n window.dataLayer.push({\r\n event: this.edit() ? 'attributeEditNameChanged' : 'attributeNameChanged',\r\n });\r\n }\r\n\r\n descriptionChanged() {\r\n window.dataLayer.push({\r\n event: this.edit() ? 'attributeEditDescriptionChanged' : 'attributeDescriptionChanged',\r\n });\r\n }\r\n}\r\n\r\nexport const CreateTagComponent = {\r\n template,\r\n controller: CreateTagController,\r\n controllerAs: 'vm',\r\n bindings: {},\r\n};\r\n","import moment from 'moment';\r\nimport angular from 'angular';\r\n\r\nimport multiPickerTemplate from '../../../../components/assetpicker/asset.multi.picker.html';\r\nimport template from './tag.bulk.html';\r\n\r\nconst DATETIME = 'Datetime';\r\nconst DATE = 'Date';\r\nconst HYPERLINK = 'Hyperlink';\r\nconst TEXT = 'Text';\r\nconst INTEGER = 'Integer';\r\nconst DECIMAL = 'Decimal';\r\n\r\nclass TagBulkApplyController {\r\n constructor(\r\n $scope,\r\n $uibModal,\r\n $filter,\r\n EquipmentService,\r\n TimezoneService,\r\n gettextCatalog,\r\n appSettings,\r\n tagsService,\r\n $ngRedux,\r\n ) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.$uibModal = $uibModal;\r\n this.$filter = $filter;\r\n this.EquipmentService = EquipmentService;\r\n this.TimezoneService = TimezoneService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.appSettings = appSettings;\r\n this.tagsService = tagsService;\r\n this.store = $ngRedux;\r\n\r\n this.loading = true;\r\n this.animationsEnabled = true;\r\n this.selectedTags = [];\r\n this.values = {};\r\n this.opened = {};\r\n this.focus = {};\r\n this.datetimedate = {};\r\n this.cachedAttrs = {};\r\n\r\n this.assets = []; //list of equipments to send to the database\r\n this.postRemoval = [];\r\n this.removeFlags = {};\r\n this.filteredAssetList = [];\r\n this.assetByPage = [];\r\n this.searchText = '';\r\n this.previousSearchText = '';\r\n\r\n this.assetPredicate = 'name';\r\n this.assetReverse = false;\r\n\r\n this.assetPage = 1;\r\n this.itemsPerPage = 5;\r\n this.maxSize = 3;\r\n\r\n this.onlyNumbersReg = /[0-9]+/;\r\n\r\n this.isAllSelected = false;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis)(this);\r\n\r\n this.EquipmentService.getAllTags().then(\r\n (response) => this.tagsFromResponse(response),\r\n (error) => {\r\n let errorMsg = this.errorFromResponse(error);\r\n\r\n this.onLoadErrorFlag = true;\r\n this.onLoadErrorText = errorMsg;\r\n this.loading = false;\r\n },\r\n );\r\n\r\n this.dateFormat = this.appSettings.GetDateFormat();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { attributes } = state;\r\n\r\n let readonly = [];\r\n if (attributes != null && attributes.secured != null && attributes.secured.readonly) {\r\n readonly = readonly.concat(attributes.secured.readonly);\r\n }\r\n\r\n return {\r\n readonlyAttributes: readonly,\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n // Populate tags from API\r\n tagsFromResponse(response) {\r\n const allTags = response.data.data;\r\n this.tags = allTags\r\n .filter((t) => t.key != null && this.readonlyAttributes.indexOf(t.key.toLowerCase()) === -1)\r\n .map((tag) => {\r\n if (tag.dataType === DATETIME) {\r\n const { min, max } = tag.range || {};\r\n\r\n if (min) tag.range.min = moment(min).toDate();\r\n if (max) tag.range.max = moment(max).toDate();\r\n }\r\n return tag;\r\n });\r\n\r\n this.loading = false;\r\n }\r\n\r\n // Error from API\r\n errorFromResponse(error) {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving attribute information',\r\n );\r\n\r\n const {\r\n data: { message },\r\n status,\r\n statusText,\r\n } = error || {};\r\n\r\n if (status)\r\n errorMsg = `${\r\n message ? message : errorMsg\r\n } : ${status.toString()} - ${statusText.toString()}`;\r\n else errorMsg += this.gettextCatalog.getString('. Please try again later');\r\n return errorMsg;\r\n }\r\n\r\n //Sort filteredEquipmentList\r\n orderAssetList(predicate) {\r\n if (predicate === this.assetPredicate) {\r\n this.assetReverse = !this.assetReverse;\r\n } else {\r\n this.assetReverse = false;\r\n }\r\n this.assetPredicate = predicate;\r\n this.GTM_AssetsListChanged('attributesBulkApplyAssetsOrderChanged');\r\n }\r\n\r\n //applyFilter searchs the equipments[] for anything matching the search input.\r\n applyAssetFilter(event) {\r\n if (!event && this.previousSearchText === this.searchText) return;\r\n this.filteredAssetList = this.$filter('filter')(this.assets, this.searchText);\r\n this.previousSearchText = this.searchText;\r\n this.GTM_AssetsListChanged(event || 'attributesBulkApplyAssetsFiltered');\r\n }\r\n\r\n openAssets() {\r\n const assets = this.assets;\r\n const modalInstance = this.$uibModal.open({\r\n animation: this.animationsEnabled,\r\n template: multiPickerTemplate,\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n selectedAssets: function () {\r\n const selected = {};\r\n\r\n if (assets) {\r\n for (let i = 0; i < assets.length; i++) {\r\n let e = assets[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then((selectedAssets) => {\r\n this.assets = [];\r\n for (let key in selectedAssets.result) {\r\n this.assets.push(selectedAssets.result[key]);\r\n }\r\n this.cachedAttrs = {};\r\n this.cacheAttrs(selectedAssets.result);\r\n this.isAllSelected = false;\r\n this.applyAssetFilter('attributesBulkApplyAssetsChanged');\r\n });\r\n }\r\n\r\n selectAllAssets() {\r\n if (this.assets.length > 0) {\r\n this.assets.forEach((asset) => {\r\n this.removeFlags[asset.id] = this.isAllSelected;\r\n });\r\n }\r\n this.GTM_AssetsListChanged(\r\n this.isAllSelected\r\n ? 'attributesBulkApplyAssetsAllSelected'\r\n : 'attributesBulkApplyAssetsAllDeselected',\r\n );\r\n }\r\n\r\n removeAssets() {\r\n if (this.sending) {\r\n return;\r\n }\r\n const newList = [];\r\n this.assets.forEach((asset) => {\r\n if (!this.removeFlags[asset.id]) {\r\n newList.push(asset);\r\n }\r\n });\r\n this.assets = angular.copy(newList);\r\n this.removeFlags = {};\r\n this.applyAssetFilter('attributesBulkApplyAssetsSelectedRemoved');\r\n }\r\n\r\n parseTags(asset) {\r\n const toDisplay = [];\r\n for (let key in asset.attrs) {\r\n for (let j = 0; j < this.tags.length; j++) {\r\n const tag = this.tags[j];\r\n if (key.toLowerCase() === tag.key.toLowerCase()) {\r\n toDisplay.push({\r\n key: tag.key,\r\n value: asset.attrs[key],\r\n index: j,\r\n dataType: tag.dataType,\r\n id: tag.id,\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n return toDisplay;\r\n }\r\n\r\n cacheAttrs(assets) {\r\n for (const key in assets) {\r\n this.cachedAttrs[key] = {};\r\n for (let attr in assets[key].attrs) {\r\n let found = false;\r\n for (let j = 0; j < this.tags.length; j++) {\r\n if (attr.toLowerCase() === this.tags[j].key.toLowerCase()) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n this.cachedAttrs[key][attr] = assets[key].attrs[attr];\r\n }\r\n }\r\n }\r\n }\r\n\r\n appendTag(tag) {\r\n const { id, dataType, freeform, range } = tag;\r\n\r\n this.selectedTags.push(tag);\r\n this.values[id] = {\r\n tag: id,\r\n };\r\n\r\n if (dataType === DATE || dataType === DATETIME) {\r\n this.opened[id] = false;\r\n\r\n const result = this.getDateValue(range, freeform, dataType);\r\n\r\n this.values[id] = { ...result };\r\n\r\n if (result.maxValue || result.minValue) {\r\n this.values[id].value = result.maxValue ? result.maxValue : result.minValue;\r\n this.datetimedate[id] = this.values[id].value;\r\n }\r\n }\r\n\r\n tag.selected = true;\r\n this.newTag = undefined;\r\n this.focus[id] = true;\r\n this.GTM_TagsChanged('attributesBulkApplyAttributeAdded');\r\n }\r\n\r\n getDateValue(range = {}, freeform, dataType) {\r\n let dateValue = {\r\n value: moment().toDate(),\r\n };\r\n\r\n if (freeform) {\r\n return dateValue;\r\n } else {\r\n if (range.min) {\r\n const minRange = moment(range.min).toDate();\r\n dateValue.value = minRange;\r\n\r\n if (dataType === DATETIME) {\r\n dateValue.minValue = minRange;\r\n }\r\n }\r\n\r\n if (range.max) {\r\n const maxRange = moment(range.max).toDate();\r\n dateValue.value = maxRange;\r\n\r\n if (dataType === DATETIME) {\r\n dateValue.maxValue = maxRange;\r\n }\r\n }\r\n }\r\n return dateValue;\r\n }\r\n\r\n removeTag(index) {\r\n const selectedTag = this.selectedTags[index];\r\n selectedTag.selected = false;\r\n delete this.values[selectedTag.id];\r\n delete this.focus[selectedTag.id];\r\n this.selectedTags.splice(index, 1);\r\n this.GTM_TagsChanged('attributesBulkApplyAttributeRemoved');\r\n }\r\n\r\n filterSelected(tag) {\r\n if (tag.selected) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n roundInt(val) {\r\n if (val) {\r\n return Math.floor(val);\r\n }\r\n }\r\n\r\n open(index) {\r\n this.opened[index] = true;\r\n }\r\n\r\n datetimeValidCheck(id) {\r\n if (!this.datetimedate[id]) return false;\r\n const temp = moment(this.datetimedate[id]).toDate();\r\n const value = this.values[id].value;\r\n if (value) {\r\n temp.setHours(value.getHours());\r\n temp.setMinutes(value.getMinutes());\r\n temp.setSeconds(value.getSeconds());\r\n }\r\n\r\n const valueForId = this.values[id];\r\n return (\r\n (valueForId.minValue == null || temp >= valueForId.minValue) &&\r\n (valueForId.maxValue == null || temp <= valueForId.maxValue)\r\n );\r\n }\r\n\r\n checkAllDatetimes() {\r\n for (let selectedTag in this.selectedTags) {\r\n if (selectedTag.dataType === DATETIME && !selectedTag.freeform) {\r\n if (!this.datetimeValidCheck(selectedTag.id));\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n generateTooltip(tag) {\r\n return this.tagsService.generateTooltip(tag, this.dateFormat);\r\n }\r\n\r\n applyTags() {\r\n this.successFlag = false;\r\n\r\n if (\r\n this.sending ||\r\n this.$scope.bulkForm.$invalid ||\r\n !this.checkAllDatetimes() ||\r\n this.assets.length <= 0 ||\r\n !this.selectedTags.length\r\n ) {\r\n return;\r\n }\r\n\r\n this.sending = true;\r\n this.errorFlag = false;\r\n\r\n const newTags = {};\r\n for (let j = 0; j < this.selectedTags.length; j++) {\r\n const selectedTag = this.selectedTags[j];\r\n const selectedTagId = selectedTag.id;\r\n const selectedTagValue = this.values[selectedTagId].value;\r\n let toAdd = {\r\n key: selectedTag.key.substring(0, 1).toLowerCase() + selectedTag.key.substring(1),\r\n };\r\n switch (selectedTag.dataType) {\r\n case HYPERLINK:\r\n case TEXT:\r\n case INTEGER:\r\n case DECIMAL:\r\n toAdd.v = selectedTagValue;\r\n break;\r\n case DATE:\r\n toAdd.v = this.$filter('date')(selectedTagValue, 'yyyy-MM-dd');\r\n break;\r\n case DATETIME:\r\n if (typeof selectedTagValue === 'string') {\r\n toAdd.v = selectedTagValue;\r\n } else {\r\n toAdd.v = moment(this.datetimedate[selectedTagId]).set({\r\n hour: selectedTagValue.getHours(),\r\n minutes: selectedTagValue.getMinutes(),\r\n seconds: selectedTagValue.getSeconds(),\r\n milliseconds: 0,\r\n });\r\n }\r\n break;\r\n }\r\n newTags[toAdd.key] = toAdd.v;\r\n }\r\n\r\n const changeset = [];\r\n const submitAssets = angular.copy(this.assets);\r\n for (let i = 0; i < submitAssets.length; i++) {\r\n const asset = submitAssets[i] || {};\r\n\r\n for (let tag in newTags) {\r\n asset.attrs[tag] = newTags[tag];\r\n }\r\n\r\n for (let cached in this.cachedAttrs[asset.id]) {\r\n asset.attrs[cached] = this.cachedAttrs[asset.id][cached];\r\n }\r\n\r\n const toAdd = {\r\n id: asset.id,\r\n op: 'overwrite',\r\n values: asset.attrs,\r\n };\r\n\r\n changeset.push(toAdd);\r\n }\r\n\r\n this.EquipmentService.batchPatchAttrs(changeset).then(\r\n (response) => {\r\n this.isEditing = false;\r\n this.sending = false;\r\n this.successFlag = true;\r\n this.assets = response.data;\r\n this.applyAssetFilter('attributesBulkApplyAssetsApplied');\r\n this.removeFlags = {};\r\n },\r\n (error) => {\r\n let errorMsg = this.errorFromResponse(error);\r\n\r\n this.errorFlag = true;\r\n this.errorText = errorMsg;\r\n this.sending = false;\r\n },\r\n );\r\n }\r\n\r\n toggleRemoval(asset) {\r\n this.applyAssetFilter(\r\n this.removeFlags[asset.id]\r\n ? 'attributesBulkApplyAssetSelected'\r\n : 'attributesBulkApplyAssetDeselected',\r\n );\r\n }\r\n\r\n GTM_TagsChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: this.selectedTags.length,\r\n },\r\n });\r\n }\r\n\r\n GTM_AssetsListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: this.assets.length,\r\n totalFiltered: this.filteredAssetList.length,\r\n totalSelected: this.assets.filter((asset) => this.removeFlags[asset.id]).length,\r\n pageNumber: this.assetPage,\r\n sortDirection: this.assetReverse ? 'descending' : 'ascending',\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport const TagBulkApplyComponent = {\r\n template: template,\r\n controller: TagBulkApplyController,\r\n controllerAs: 'vm',\r\n bindings: {},\r\n};\r\n","import angular from 'angular';\r\nimport 'angular-ui-bootstrap';\r\n\r\nimport {TagListComponent} from './tag.list.controller';\r\nimport {TagDetailsComponent} from './tag.details.component';\r\nimport TagDeleteModalController from './tag.delete.controller';\r\nimport {CreateTagComponent} from './tag.create.component';\r\nimport {TagBulkApplyComponent} from './tag.bulk.component';\r\nimport TextTableDirective from './components/text-table.component';\r\nimport RangeDirective from './components/range.component';\r\nimport NumberInputDirective from './components/number.component';\r\nimport HyperlinkTableDirective from './components/hyperlink-table.component';\r\nimport ExpandableDirective from './components/expandable.component';\r\nimport DateTimeDirective from './components/date-time.component';\r\n\r\nconst taggingModule = angular.module('admin.assets.tagging', ['ui.bootstrap']);\r\n\r\ntaggingModule\r\n .component('tagList', TagListComponent)\r\n .component('tagDetails', TagDetailsComponent)\r\n .component('tagBulkApply', TagBulkApplyComponent)\r\n .component('createTag', CreateTagComponent)\r\n .controller('TagDeleteModalController', TagDeleteModalController)\r\n\r\n .directive('textTable', TextTableDirective)\r\n .directive('range', RangeDirective)\r\n .directive('numberInput', NumberInputDirective)\r\n .directive('hyperlinkTable', HyperlinkTableDirective)\r\n .directive('expandable', ExpandableDirective)\r\n .directive('dateTime', DateTimeDirective);\r\n\r\nexport default taggingModule.name;\r\n","export default function TextTableDirective() {\r\n return {\r\n template: require('./text-table.component.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {\r\n values: '=',\r\n submitted: '=?',\r\n form: '=',\r\n onSave: '=',\r\n },\r\n controllerAs: 'vm',\r\n bindToController: true,\r\n controller: TextTableComponentController,\r\n };\r\n\r\n function TextTableComponentController($scope) {\r\n 'ngInject';\r\n let vm = this;\r\n\r\n vm.currentPage = 1;\r\n vm.maxTextLength = 255;\r\n vm.valField = false;\r\n vm.maxSize = 3;\r\n vm.itemsPerPage = 10;\r\n\r\n vm.newVal = {\r\n value: '',\r\n attrs: {},\r\n };\r\n\r\n vm.addFailed = false;\r\n vm.valueExists = valueExists;\r\n vm.textValid = textValid;\r\n vm.validRow = validRow;\r\n vm.addVal = addVal;\r\n vm.getListIndex = getListIndex;\r\n vm.keydown = keydown;\r\n vm.rowErrorCount = rowErrorCount;\r\n\r\n vm.$onInit = () => {\r\n vm.submitted = vm.form.$submitted;\r\n if (!vm.onSave.invoke) {\r\n vm.onSave.invoke = () => {};\r\n }\r\n };\r\n\r\n $scope.$watch(\r\n function () {\r\n return vm.values;\r\n },\r\n function () {\r\n vm.form.newTextValue.$setValidity('required', !vm.values || vm.values.length > 0);\r\n },\r\n true,\r\n );\r\n\r\n function textValid() {\r\n return vm.values && vm.values.length > 0;\r\n }\r\n\r\n function validRow(val) {\r\n return val && val.length > 0;\r\n }\r\n\r\n function addVal(value) {\r\n if (!value || !value.value || value.value.length === 0 || vm.valueExists()) {\r\n vm.addFailed = true;\r\n return;\r\n }\r\n vm.values.push(JSON.parse(JSON.stringify(value)));\r\n vm.newVal.value = '';\r\n vm.addFailed = false;\r\n\r\n GTM_ListChanged('attributeTextValueAdded');\r\n }\r\n\r\n function getListIndex(pageIndex) {\r\n return pageIndex + (vm.currentPage - 1) * vm.itemsPerPage;\r\n }\r\n\r\n function keydown() {\r\n let keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;\r\n if (keyCode === 13) {\r\n let e = window.event;\r\n\r\n e.cancelBubble = true;\r\n e.returnValue = false;\r\n\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n if (vm.valField) {\r\n vm.addVal(vm.newVal);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function rowErrorCount() {\r\n let errorCount = 0;\r\n if (vm.form.$error.required) {\r\n for (let i = 0; i < vm.form.$error.required.length; i++) {\r\n let error = vm.form.$error.required[i];\r\n if (error.$name === 'textForm') {\r\n errorCount = errorCount + 1;\r\n }\r\n }\r\n }\r\n return errorCount;\r\n }\r\n\r\n function valueExists() {\r\n if (vm.newVal.value) {\r\n for (let i = 0; i < vm.values.length; i++) {\r\n if (\r\n vm.values[i].value &&\r\n vm.values[i].value.toLocaleLowerCase() === vm.newVal.value.toLocaleLowerCase()\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n vm.pageChanged = function () {\r\n GTM_ListChanged('attributeTextPageChanged');\r\n };\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: vm.values.length,\r\n pageNumber: vm.currentPage,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","export default function RangeDirective() {\r\n return {\r\n template: require('./range.component.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {\r\n range: '=ngModel',\r\n type: '=',\r\n form: '=',\r\n onSave: '=',\r\n },\r\n bindToController: true,\r\n controllerAs: 'vm',\r\n controller: RangeController,\r\n };\r\n\r\n function RangeController($scope) {\r\n 'ngInject';\r\n let vm = this;\r\n\r\n vm.onMinSave = {};\r\n vm.onMaxSave = {};\r\n vm.onHideMin = onHideMin;\r\n vm.onHideMax = onHideMax;\r\n vm.onShowMin = onShowMin;\r\n vm.onShowMax = onShowMax;\r\n vm.minChanged = minChanged;\r\n vm.maxChanged = maxChanged;\r\n vm.rangeTypes = {\r\n number: 'number',\r\n date: 'date',\r\n };\r\n vm.$onInit = () => {\r\n vm.rangeType = getRangeType();\r\n\r\n vm.onSave.invoke = () => {\r\n if (vm.range.hasOwnProperty('min')) {\r\n vm.onMinSave.invoke();\r\n }\r\n\r\n if (vm.range.hasOwnProperty('max')) {\r\n vm.onMaxSave.invoke();\r\n }\r\n };\r\n };\r\n\r\n $scope.$watch(\r\n function () {\r\n return vm.range;\r\n },\r\n function () {\r\n vm.showMin = vm.range.hasOwnProperty('min');\r\n vm.showMax = vm.range.hasOwnProperty('max');\r\n },\r\n );\r\n\r\n function getRangeType() {\r\n switch (vm.type) {\r\n case 'Decimal':\r\n case 'Integer':\r\n return vm.rangeTypes.number;\r\n case 'Date':\r\n case 'Datetime':\r\n return vm.rangeTypes.date;\r\n }\r\n }\r\n\r\n function onHideMax() {\r\n delete vm.range['max'];\r\n GTM_StateChanged('MaxHidden');\r\n }\r\n\r\n function onHideMin() {\r\n delete vm.range['min'];\r\n GTM_StateChanged('MinHidden');\r\n }\r\n\r\n function onShowMax() {\r\n GTM_StateChanged('MaxShown');\r\n }\r\n\r\n function onShowMin() {\r\n GTM_StateChanged('MinShown');\r\n }\r\n\r\n function minChanged() {\r\n GTM_StateChanged('MinChanged');\r\n }\r\n function maxChanged() {\r\n GTM_StateChanged('MaxChanged');\r\n }\r\n\r\n function GTM_StateChanged(event) {\r\n window.dataLayer.push({\r\n event: `attributeRange${vm.type}${event}`,\r\n });\r\n }\r\n }\r\n}\r\n","export default function NumberInputDirective() {\r\n return {\r\n template: require('./number.component.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {\r\n value: '=ngModel',\r\n type: '=',\r\n form: '=',\r\n hasError: '=',\r\n min: '=',\r\n max: '=',\r\n onSave: '=',\r\n onChange: '=',\r\n },\r\n bindToController: true,\r\n controllerAs: 'vm',\r\n controller: function () {\r\n let vm = this;\r\n vm.round = round;\r\n vm.$onInit = () => {\r\n vm.onSave.invoke = function () {};\r\n };\r\n\r\n function round() {\r\n vm.value = Math.round(vm.value);\r\n }\r\n },\r\n };\r\n}\r\n","import validator from 'validator';\r\n\r\nexport default function HyperlinkTableDirective() {\r\n return {\r\n template: require('./hyperlink-table.component.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {\r\n form: '=',\r\n onSave: '=',\r\n originalObject: '=',\r\n },\r\n controller: HyperlinkTableController,\r\n controllerAs: 'vm',\r\n bindToController: true,\r\n };\r\n\r\n function HyperlinkTableController($scope, urlUtil, markdownService) {\r\n 'ngInject';\r\n let vm = this;\r\n vm.hyperlink = {\r\n text: '',\r\n url: '',\r\n };\r\n vm.currentPage = 1;\r\n vm.maxTextLength = 150;\r\n vm.maxSize = 3;\r\n vm.itemsPerPage = 10;\r\n vm.urlPlaceholder = 'Url';\r\n vm.textPlaceholder = 'Display Text';\r\n vm.values = [];\r\n vm.valField = false;\r\n\r\n vm.validUrl = validUrl;\r\n vm.getListIndex = getListIndex;\r\n vm.add = add;\r\n vm.keydown = keydown;\r\n vm.rowErrorCount = rowErrorCount;\r\n\r\n vm.$onInit = () => {\r\n vm.onSave.invoke = function () {\r\n vm.originalObject.values = _.map(vm.values, convertToMarkdown);\r\n };\r\n };\r\n\r\n $scope.$watch(\r\n function () {\r\n return vm.values;\r\n },\r\n function () {\r\n vm.hyplinkForm.text.$setValidity('required', vm.values.length > 0);\r\n vm.hyplinkForm.url.$setValidity('required', vm.values.length > 0);\r\n },\r\n true,\r\n );\r\n\r\n $scope.$watch(\r\n function () {\r\n return vm.originalObject;\r\n },\r\n function () {\r\n vm.values = _.map(vm.originalObject.values, convertToModel);\r\n },\r\n );\r\n\r\n function convertToModel(url) {\r\n return markdownService.markdownToUrl(url.value);\r\n }\r\n\r\n function convertToMarkdown(url) {\r\n let markdown = markdownService.urlToMarkdown(url);\r\n return {\r\n value: markdown,\r\n attrs: {},\r\n };\r\n }\r\n\r\n function validUrl(url) {\r\n if (url) {\r\n return validator.isURL(url);\r\n }\r\n return false;\r\n }\r\n\r\n function getListIndex(pageIndex) {\r\n let listIndex = pageIndex + (vm.currentPage - 1) * vm.itemsPerPage;\r\n return listIndex;\r\n }\r\n\r\n function add() {\r\n if (vm.hyperlink.text.length === 0) {\r\n vm.addFailed = true;\r\n document.getElementById('hyperlinkDisplayText').focus();\r\n return;\r\n }\r\n if (vm.hyperlink.url.length === 0) {\r\n vm.addFailed = true;\r\n document.getElementById('hyperlinkTextbox').focus();\r\n return;\r\n }\r\n if (!vm.validUrl(vm.hyperlink.url)) {\r\n vm.addFailed = true;\r\n document.getElementById('hyperlinkTextbox').focus();\r\n return;\r\n }\r\n vm.hyperlink.url = urlUtil.appendDefaultProtocol(vm.hyperlink.url);\r\n vm.values.push(_.clone(vm.hyperlink, true));\r\n vm.hyperlink.text = '';\r\n vm.hyperlink.url = '';\r\n vm.addFailed = false;\r\n GTM_ListChanged('attributeHyperlinkValueAdded');\r\n }\r\n\r\n function keydown() {\r\n let keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;\r\n if (keyCode === 13) {\r\n let e = window.event;\r\n\r\n e.cancelBubble = true;\r\n e.returnValue = false;\r\n\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n if (vm.valField) {\r\n vm.add(vm.hyperlink);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function rowErrorCount() {\r\n let errorCount = 0;\r\n if (vm.form.$error.required) {\r\n for (let i = 0; i < vm.form.$error.required.length; i++) {\r\n let error = vm.form.$error.required[i];\r\n if (error.$name === 'hyperlinkForm') {\r\n errorCount = errorCount + 1;\r\n }\r\n }\r\n }\r\n return errorCount;\r\n }\r\n\r\n vm.pageChanged = function () {\r\n GTM_ListChanged('attributeHyperlinkPageChanged');\r\n };\r\n\r\n function GTM_ListChanged(event) {\r\n window.dataLayer.push({\r\n event: event,\r\n data: {\r\n total: vm.values.length,\r\n pageNumber: vm.currentPage,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","export default function ExpandableDirective() {\r\n return {\r\n template: require('./expandable.component.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {\r\n required: '=',\r\n show: '=',\r\n onHide: '&',\r\n onShow: '&',\r\n title: '@'\r\n },\r\n bindToController: true,\r\n controllerAs: 'vm',\r\n controller: function () {\r\n var vm = this;\r\n init();\r\n\r\n function init() {\r\n if (vm.show !== true || vm.show !== false) {\r\n vm.show = true;\r\n }\r\n }\r\n\r\n vm.hideShow = function () {\r\n vm.show = !vm.show;\r\n if (!vm.show) {\r\n vm.onHide();\r\n } else if (vm.show) {\r\n vm.onShow();\r\n }\r\n };\r\n }\r\n };\r\n}","import moment from 'moment';\r\n\r\nexport default function DateTimeDirective() {\r\n return {\r\n template: require('./date-time.component.html'),\r\n transclude: true,\r\n restrict: 'AE',\r\n scope: {},\r\n bindToController: {\r\n date: '=ngModel',\r\n form: '=',\r\n maxDate: '=',\r\n minDate: '=',\r\n hasError: '=',\r\n type: '=',\r\n onSave: '=',\r\n onChange: '=',\r\n },\r\n controllerAs: 'vm',\r\n controller: DateTimeController,\r\n };\r\n\r\n function DateTimeController($scope, $filter, TimezoneService) {\r\n 'ngInject';\r\n let vm = this;\r\n vm.dateOptions = {\r\n 'year-format': \"'yy'\",\r\n 'starting-day': 1,\r\n };\r\n vm.$onInit = () => {\r\n init();\r\n };\r\n $scope.$watch(\r\n function () {\r\n return vm.date;\r\n },\r\n function () {\r\n setFormValidity();\r\n },\r\n );\r\n $scope.$watch(\r\n function () {\r\n return vm.minDate;\r\n },\r\n function () {\r\n setFormValidity();\r\n },\r\n );\r\n\r\n $scope.$watch(\r\n function () {\r\n return vm.maxDate;\r\n },\r\n function () {\r\n setFormValidity();\r\n },\r\n );\r\n\r\n function init() {\r\n vm.showTime = vm.type === 'Datetime';\r\n vm.dateChanged = dateChanged;\r\n vm.onSave.invoke = onSave;\r\n\r\n if (!vm.date) {\r\n vm.date = moment().toDate();\r\n\r\n if (vm.maxDate) {\r\n setTime(vm.date, -24, 0, 0, 0);\r\n } else if (vm.minDate) {\r\n setTime(vm.date, 24, 0, 0, 0);\r\n }\r\n } else {\r\n vm.date = moment(vm.date).toDate();\r\n }\r\n vm.date = TimezoneService.convertToSameTimeInUserTimeZone(vm.date).toDate();\r\n }\r\n\r\n function onSave() {\r\n if (vm.type === 'date') {\r\n vm.date = vm.date ? $filter('date')(vm.range.min, 'yyyy-MM-dd') : undefined;\r\n } else if (vm.type === 'dateTime') {\r\n //TODO: this needs looking into. should be done with moment\r\n vm.date = vm.date\r\n ? new Date(\r\n new Date(vm.range.min).getTime() -\r\n new Date(vm.range.min).getTimezoneOffset() * 60000 -\r\n TimezoneService.getUserTimezoneOffset(new Date(vm.range.min)) * 60000,\r\n )\r\n : undefined;\r\n }\r\n }\r\n\r\n function setFormValidity() {\r\n vm.dateTimeForm.date.$setValidity('min', !vm.minDate || vm.minDate < vm.date);\r\n vm.dateTimeForm.date.$setValidity('max', !vm.maxDate || vm.maxDate > vm.date);\r\n }\r\n\r\n function dateChanged() {\r\n if (!vm.showTime) {\r\n setTime(vm.date, 0, 0, 0, 0);\r\n }\r\n vm.onChange();\r\n }\r\n\r\n function setTime(date, hours, minutes, seconds, milliseconds) {\r\n if (!date) return;\r\n date.setHours(hours);\r\n date.setMinutes(minutes);\r\n date.setSeconds(seconds);\r\n date.setMilliseconds(milliseconds);\r\n }\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport productsModule from './products/products.module';\r\nimport sharingModule from './sharing/sharing.module';\r\nimport taggingModule from './tagging/tagging.module';\r\n\r\nconst assetsModule = angular.module('admin.assets', [\r\n\tproductsModule,\r\n\tsharingModule,\r\n\ttaggingModule\r\n]);\r\n\r\nexport default assetsModule.name;\r\n","import App from '../../app';\r\n\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Admin\";\r\n\r\nexport default function AdminController($scope, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.title = \"Admin\";\r\n\r\n var menuItems = [{\r\n \"title\": gettextCatalog.getString(\"Users\"),\r\n \"sref\": \"admin.userslist\",\r\n \"icon\": \"fas fa-users\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"Security Groups\"),\r\n \"sref\": \"admin.securitygroups\",\r\n \"icon\": \"fas fa-users\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"Manage Invites\"),\r\n \"sref\": \"admin.manageinvites\",\r\n \"icon\": \"fa fa-briefcase\"\r\n }, {\r\n \"title\": gettextCatalog.getString(\"User Roles\"),\r\n \"sref\": \"admin.usersRoleslist\",\r\n \"icon\": \"fas fa-users\"\r\n }];\r\n\r\n $scope.menuItems = menuItems;\r\n\r\n $scope.isActiveState = function (state) {\r\n return true;\r\n };\r\n\r\n this.$onInit = () => {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n}","export default function AdminRouteConfig($stateProvider, gettext) {\r\n 'ngInject';\r\n\r\n //admin breadcrumb names, need to declare this way to make sure the labels get put into the pot file.\r\n let admin = gettext('Users'); // eslint-disable-line no-unused-vars\r\n let adminEdit = gettext('Edit'); // eslint-disable-line no-unused-vars\r\n let adminInvite = gettext('Invite a User'); // eslint-disable-line no-unused-vars\r\n let adminRoles = gettext('Roles'); // eslint-disable-line no-unused-vars\r\n let adminCreate = gettext('Create'); // eslint-disable-line no-unused-vars\r\n let adminSecurityGroups = gettext('Security Groups'); // eslint-disable-line no-unused-vars\r\n let adminManageInvites = gettext('Manage Invites'); // eslint-disable-line no-unused-vars\r\n gettext('Invite New User');\r\n gettext('Create New Role');\r\n\r\n $stateProvider\r\n .state('admin', {\r\n template: require('./admin.main.html'),\r\n url: '/admin',\r\n redirectTo: 'admin.userslist',\r\n ncyBreadcrumb: {\r\n label: \"{{'Admin' | translate}}\",\r\n },\r\n requiredFeatures: ['admin'],\r\n })\r\n .state('admin.datapointdisplay-list', {\r\n template: require('./datapoint-display/list/list.html'),\r\n controller: 'DatapointDisplayListController',\r\n controllerAs: 'vm',\r\n url: '/datapointdisplay?packageId&moduleIds',\r\n reloadOnSearch: false,\r\n ncyBreadcrumb: {\r\n label: \"{{'Datapoint Displays' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.datapointdisplay'],\r\n })\r\n .state('admin.userslist', {\r\n url: '/users',\r\n template: require('./user-management/users/list/list.html'),\r\n controller: 'UserViewListController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Users' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.users'],\r\n })\r\n .state('admin.userdetails', {\r\n url: '/users/{userId}?success',\r\n template: require('./user-management/users/view/view.html'),\r\n controller: 'UserViewDetailsController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.userslist',\r\n label: '{{user ? (user.name || \"N/A\") : \"\"}}',\r\n },\r\n requiredFeatures: ['admin.users'],\r\n })\r\n .state('admin.userdetailsedit', {\r\n url: '/users/{userId}/edit',\r\n template: require('./user-management/users/view/edit/edit.html'),\r\n controller: 'UserViewDetailsEditController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.userdetails',\r\n label: \"{{'Edit' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.users.edit'],\r\n })\r\n .state('admin.inviteuser', {\r\n url: '/inviteUser',\r\n template: require('./user-management/invite-user/invite.html'),\r\n controller: 'InviteUserController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.userslist',\r\n label: \"{{'Invite New User' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.invite'],\r\n })\r\n .state('admin.usersRoleslist', {\r\n url: '/roles',\r\n template: require('./role-management/list/list.html'),\r\n controller: 'RolesListController',\r\n params: {\r\n create: false,\r\n deleted: false,\r\n },\r\n ncyBreadcrumb: {\r\n label: \"{{'Roles' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.roles'],\r\n })\r\n .state('admin.createUserRole', {\r\n url: '/createRole',\r\n template: require('./role-management/create-role/create.html'),\r\n controller: 'RoleCreateController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.usersRoleslist',\r\n label: \"{{'Create New Role' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.roles', 'admin.roles.manage'],\r\n })\r\n .state('admin.userroledetails', {\r\n url: '/usersRoles/{roleId}',\r\n template: require('./role-management/view/view.html'),\r\n controller: 'RoleViewController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.usersRoleslist',\r\n label: '{{roleData.name}}',\r\n },\r\n redirectTo: 'admin.userroledetails.permissions',\r\n requiredFeatures: ['admin.roles'],\r\n })\r\n .state('admin.userroledetails.permissions', {\r\n url: '/permissions',\r\n helpState: 'admin.userroledetails',\r\n template: require('./role-management/view/details/details.permissions.html'),\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('admin.userroledetails.datapoints', {\r\n url: '/datapoints',\r\n helpState: 'admin.userroledetails',\r\n template: require('./role-management/view/details/details.datapoints.html'),\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('admin.userroledetails.users', {\r\n url: '/users',\r\n helpState: 'admin.userroledetails',\r\n template: require('./role-management/view/details/details.users.html'),\r\n controller: 'RoleViewDetailsController',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('admin.userroleedit', {\r\n url: '/usersRoles/{roleId}/edit',\r\n helpState: 'admin.userroledetails',\r\n template: require('./role-management/view/edit/edit.html'),\r\n controller: 'RoleViewEditController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.userroledetails',\r\n label: \"{{'Edit' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.roles', 'admin.roles.manage'],\r\n })\r\n .state('admin.securitygroups', {\r\n url: '/securitygroups',\r\n template: require('./security-groups/list/list.html'),\r\n controller: 'SecurityGroupsListController',\r\n params: {\r\n create: false,\r\n deleted: false,\r\n selfRemoved: false,\r\n },\r\n ncyBreadcrumb: {\r\n label: \"{{'Security' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.securitygroups'],\r\n })\r\n .state('admin.securitygroupbase', {\r\n url: '/securitygroups/{securityGroupId}',\r\n template: require('./security-groups/view/view.html'),\r\n controller: 'SecurityGroupsViewController',\r\n redirectTo: 'admin.securitygroupbase.equipment',\r\n ncyBreadcrumb: {\r\n parent: 'admin.securitygroups',\r\n label: '{{group.name}}',\r\n },\r\n requiredFeatures: ['admin.securitygroups'],\r\n })\r\n .state('admin.securitygroupbase.equipment', {\r\n url: '/equipments',\r\n helpState: 'admin.securitygroupbase',\r\n template: require('./security-groups/view/assets/assets.html'),\r\n controller: 'SecurityGroupsViewAssetsController',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('admin.createSecurityGroup', {\r\n url: '/createSecurityGroup',\r\n template: require('./security-groups/create-group/create.html'),\r\n controller: 'SecurityGroupCreateController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.securitygroups',\r\n label: \"{{'Create Security Group' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.securitygroups', 'admin.securitygroups.manage'],\r\n })\r\n .state('admin.securitygroupbase.users', {\r\n url: '/users',\r\n helpState: 'admin.securitygroupbase',\r\n template: require('./security-groups/view/users/users.html'),\r\n controller: 'SecurityGroupsViewUsersController',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('admin.manageinvites', {\r\n url: '/manageinvites',\r\n template: ``,\r\n ncyBreadcrumb: {\r\n parent: 'admin.userslist',\r\n label: \"{{'Manage Invites' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.invite'],\r\n })\r\n .state('admin.userinvitehistory', {\r\n url: '/manageinvites/{userEmail}',\r\n template: require('./user-management/manage-invites/view/view.html'),\r\n controller: 'ManageInvitesViewController',\r\n ncyBreadcrumb: {\r\n parent: 'admin.manageinvites',\r\n label: '{{email}}',\r\n },\r\n requiredFeatures: ['admin.invite'],\r\n })\r\n .state('admin.products', {\r\n url: '/templates',\r\n redirectTo: 'admin.products-list',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.templates',\r\n requiredFeatures: ['assets.templates'],\r\n ncyBreadcrumb: {\r\n label: \"{{'Templates' | translate}}\",\r\n },\r\n })\r\n .state('admin.products-list', {\r\n url: '/templates-list',\r\n template: require('./assets/products/equipment.products.html'),\r\n controller: 'ProductsController',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.templates',\r\n requiredFeatures: ['assets.templates'],\r\n ncyBreadcrumb: {\r\n label: \"{{'Templates' | translate}}\",\r\n },\r\n })\r\n .state('admin.products-edit', {\r\n url: '/templates-list/{id}',\r\n template: require('./assets/products/equipment.product.details.html'),\r\n controller: 'ProductDetailController',\r\n ncyBreadcrumb: {\r\n label: '{{product.name}}',\r\n parent: 'admin.products-list',\r\n },\r\n helpModuleId: 'assets',\r\n helpState: 'assets.templates',\r\n requiredFeatures: ['assets.templates'],\r\n })\r\n .state('admin.products-create', {\r\n url: '/templates-create',\r\n template: require('./assets/products/equipment.create.html'),\r\n controller: 'ProductCreateController',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.templates',\r\n requiredFeatures: ['assets.templates', 'assets.templates.manage'],\r\n ncyBreadcrumb: {\r\n parent: 'admin.products-list',\r\n label: \"{{'Create New Template' | translate}}\",\r\n },\r\n })\r\n .state('admin.manage', {\r\n url: '/manage',\r\n template: require('./assets/sharing/manage/manage.shared.assets.html'),\r\n controller: 'ManageSharedAssetsController',\r\n controllerAs: 'vm',\r\n ncyBreadcrumb: {\r\n label: \"{{'Manage Shared Assets' | translate}}\",\r\n },\r\n requiredFeatures: ['assets.share'],\r\n })\r\n .state('admin.share', {\r\n url: '/share',\r\n template: require('./assets/sharing/share/share.assets.html'),\r\n controller: 'ShareAssetsController',\r\n controllerAs: 'vm',\r\n ncyBreadcrumb: {\r\n parent: 'admin.manage',\r\n label: \"{{'Share Assets' | translate}}\",\r\n },\r\n requiredFeatures: ['assets.share'],\r\n })\r\n .state('admin.tag-list', {\r\n url: '/attributes',\r\n helpModuleId: 'assets',\r\n helpState: 'attributes',\r\n template: ``,\r\n ncyBreadcrumb: {\r\n label: \"{{'Attributes' | translate}}\",\r\n },\r\n requiredFeatures: ['attributes'],\r\n })\r\n .state('admin.tag-details', {\r\n url: '/attributes/{id}',\r\n template: '',\r\n helpModuleId: 'assets',\r\n helpState: 'attributes',\r\n ncyBreadcrumb: {\r\n parent: 'admin.tag-list',\r\n label: '{{vm.tag.key}}',\r\n },\r\n requiredFeatures: ['attributes'],\r\n })\r\n .state('admin.tag-edit', {\r\n url: '/attribute/{id}/edit',\r\n template: '',\r\n helpModuleId: 'assets',\r\n helpState: 'attributes',\r\n ncyBreadcrumb: {\r\n label: '{{vm.tag.key}}',\r\n },\r\n requiredFeatures: ['attributes', 'attributes.manage'],\r\n })\r\n .state('admin.tag-create', {\r\n url: '/createAttribute/{id}',\r\n template: '',\r\n helpModuleId: 'assets',\r\n helpState: 'attributes',\r\n ncyBreadcrumb: {\r\n parent: 'admin.tag-list',\r\n label: \"{{'Create Attribute' | translate}}\",\r\n },\r\n requiredFeatures: ['attributes', 'attributes.manage'],\r\n })\r\n .state('admin.tag-bulk', {\r\n url: '/bulkAttributes',\r\n template: '',\r\n helpModuleId: 'assets',\r\n helpState: 'attributes',\r\n ncyBreadcrumb: {\r\n parent: 'admin.tag-list',\r\n label: \"{{'Bulk Apply Attributes' | translate}}\",\r\n },\r\n requiredFeatures: ['attributes', 'assets.edit.bulk'],\r\n })\r\n .state('admin.subaccounts', {\r\n url: '/subAccounts',\r\n template: '',\r\n ncyBreadcrumb: {\r\n parent: 'admin',\r\n label: \"{{'Manage Sub Accounts' | translate}}\",\r\n },\r\n requiredFeatures: ['admin.subaccounts'],\r\n });\r\n}\r\n","import angular from 'angular';\r\n\r\nimport stateModule from '../../state/state.module';\r\n\r\n/* Module Imports */\r\nimport datapointDisplayModule from './datapoint-display/datapoint.module';\r\nimport roleManagementModule from './role-management/role.module';\r\nimport subAccountModule from './sub-accounts/sub-accounts.module';\r\nimport securityGroupsModule from './security-groups/securitygroups.module';\r\nimport userManagementModule from './user-management/user.module';\r\nimport assetsModule from './assets/assets.module';\r\n\r\n/* Controller - Route Imports */\r\nimport AdminController from './admin.controller';\r\nimport AdminRouteConfig from './admin.route';\r\n\r\nconst adminModule = angular\r\n\t.module('app.admin', [\r\n\t\t'ui.bootstrap',\r\n\t\t'ui.router',\r\n\t\t'gettext',\r\n\t\tstateModule,\r\n\t\tdatapointDisplayModule,\r\n\t\troleManagementModule,\r\n\t\tsecurityGroupsModule,\r\n\t\tuserManagementModule,\r\n\t\tassetsModule,\r\n\t\tsubAccountModule\r\n\t])\r\n\t.controller('AdminController', AdminController)\r\n\t.config(AdminRouteConfig);\r\n\r\nexport default adminModule.name;\r\n","export default function AlertsRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('alerts', {\r\n url: '/alerts',\r\n template: require('./alerts.main.html'),\r\n redirectTo: 'alerts.dashboard',\r\n ncyBreadcrumb: {\r\n label: \"{{'Alerts' | translate}}\",\r\n },\r\n requiredFeatures: ['alerts'],\r\n })\r\n .state('alerts.dashboard', {\r\n url: '/dashboard',\r\n controller: 'DashboardMainPageController',\r\n template: require('./dashboard/dashboard.html'),\r\n ncyBreadcrumb: {\r\n label: `{{'Dashboard' | translate}}`,\r\n },\r\n requiredFeatures: ['alerts'],\r\n })\r\n .state('alerts.history', {\r\n url: '/history',\r\n template: ``,\r\n ncyBreadcrumb: {\r\n label: `{{'Historical Alerts' | translate}}`,\r\n },\r\n requiredFeatures: ['alerts'],\r\n })\r\n .state('alerts.history.details', {\r\n url: '/details/{instanceId}',\r\n template: require('./historical-alerts/view/view.html'),\r\n controller: 'HistoricalAlertsViewController',\r\n ncyBreadcrumb: {\r\n label: '{{title}} ' + `{{'Details' | translate}}`,\r\n parent: 'alerts.history',\r\n },\r\n params: {\r\n alert: null,\r\n },\r\n requiredFeatures: ['alerts'],\r\n })\r\n .state('alerts.configurations', {\r\n url: '/configurations',\r\n template: '',\r\n redirectTo: 'alerts.configurations.list',\r\n ncyBreadcrumb: {\r\n label: `{{'Alert Configurations' | translate}}`,\r\n },\r\n requiredFeatures: ['alerts', 'alerts.configurations'],\r\n })\r\n .state('alerts.configurations.list', {\r\n url: '/',\r\n template: require('./configurations/alerts/list/list.html'),\r\n helpState: 'alerts.configurations',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n controller: 'AlertsListController',\r\n requiredFeatures: ['alerts', 'alerts.configurations'],\r\n })\r\n .state('alerts.configurations.edit', {\r\n url: '/edit/{configurationId}',\r\n template: require('./configurations/alerts/view/details/view.html'),\r\n controller: 'AlertsViewEditController',\r\n helpState: 'alerts.configurations',\r\n redirectTo: 'alerts.configurations.edit.equipment',\r\n ncyBreadcrumb: {\r\n parent: 'alerts.configurations.list',\r\n label: '{{configuration.name}}',\r\n },\r\n requiredFeatures: ['alerts', 'alerts.configurations'],\r\n })\r\n .state('alerts.configurations.edit.equipment', {\r\n url: '/equipment',\r\n helpState: 'alerts.configurations',\r\n template: require('./configurations/alerts/view/assets/assets.html'),\r\n controller: 'AlertsViewPickAssetsController',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('alerts.configurations.edit.triggers', {\r\n url: '/triggers',\r\n helpState: 'alerts.configurations',\r\n template: require('./configurations/alerts/view/triggers/triggers.html'),\r\n controller: 'AlertsViewTriggersControllerCRUD',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('alerts.configurations.create', {\r\n url: '/create',\r\n template: require('./configurations/alerts/create/create.html'),\r\n controller: 'AlertsCreateController',\r\n ncyBreadcrumb: {\r\n label: `{{'Create Alert Configuration' | translate}}`,\r\n parent: 'alerts',\r\n },\r\n params: {\r\n rule: null,\r\n },\r\n requiredFeatures: ['alerts', 'alerts.configurations.edit'],\r\n })\r\n .state('alerts.faults', {\r\n url: '/faults',\r\n template: '',\r\n redirectTo: 'alerts.faults.list',\r\n ncyBreadcrumb: {\r\n label: `{{'Fault Configurations' | translate}}`,\r\n },\r\n requiredFeatures: ['alerts', 'alerts.faults'],\r\n })\r\n .state('alerts.faults.list', {\r\n url: '/',\r\n template: '',\r\n helpState: 'alerts.faults',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['alerts', 'alerts.faults'],\r\n })\r\n .state('alerts.faults.edit', {\r\n url: '/edit/{configurationId}',\r\n template: '',\r\n helpState: 'alerts.faults',\r\n params: {\r\n isEditPage: true,\r\n },\r\n ncyBreadcrumb: {\r\n parent: 'alerts.faults.list',\r\n label: '{{vm.configuration.name}}',\r\n },\r\n requiredFeatures: ['alerts', 'alerts.faults'],\r\n })\r\n .state('alerts.faults.create', {\r\n url: '/create',\r\n template: '',\r\n params: {\r\n isEditPage: false,\r\n },\r\n ncyBreadcrumb: {\r\n label: `{{'Create Fault Configuration' | translate}}`,\r\n parent: 'alerts',\r\n },\r\n requiredFeatures: ['alerts', 'alerts.faults.edit'],\r\n });\r\n}\r\n","import Auth from '../../../../../auth';\r\nimport _ from 'lodash';\r\nexport default function AlertsCreateController(\r\n $scope,\r\n $rootScope,\r\n $state,\r\n $filter,\r\n $uibModal,\r\n configurationsService,\r\n gettextCatalog,\r\n ConfigurationFilterService\r\n) {\r\n 'ngInject';\r\n\r\n //Local Variables\r\n const currentUser = $rootScope.currentUser;\r\n //Changed to use ES6 variables\r\n const orderBy = $filter('orderBy');\r\n\r\n //Public Variables\r\n $scope.contactsList = [];\r\n $scope.configurationId = {};\r\n $scope.dataPointDescriptors = _.cloneDeep($rootScope.datapointDescriptors);\r\n $scope.descriptorVisible = false;\r\n $scope.disableCancel = false;\r\n $scope.duplicateConditionText = gettextCatalog.getString(\r\n 'When creating multiple triggers while using the same data point, the condition must be unique. Please change the condition and try again.'\r\n );\r\n $scope.editMode = true;\r\n $scope.equipmentData = [];\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.eventPropertyName = 'description'; //sort datapoint dropdown\r\n $scope.hasTriggers = true;\r\n $scope.incompleteTriggerFlag = false;\r\n $scope.incompleteTriggerMsg = gettextCatalog.getString(\r\n 'Please save or cancel the trigger before trying to create a configuration'\r\n );\r\n $scope.noTriggersSavedMsg = gettextCatalog.getString(\r\n 'Please create at least one trigger before creating a configuration.'\r\n );\r\n $scope.param = {};\r\n $scope.savedTriggers = [];\r\n $scope.selectedEquipment = {};\r\n $scope.sortedEvents = [];\r\n\r\n $scope.thresholdOptions = [];\r\n $scope.triggers = [];\r\n $scope.validationFlag = false;\r\n $scope.validationMsg = gettextCatalog.getString('All fields are required');\r\n $scope.showKMLabel = false;\r\n $scope.alertConfigDataPoint = {\r\n helpMe: 'alertConfigDataPoint'\r\n };\r\n $scope.alertConfigCondition = {\r\n helpMe: 'alertConfigCondition'\r\n };\r\n $scope.alertConfigDelay = {\r\n helpMe: 'alertConfigDelay'\r\n };\r\n $scope.alertConfigPriority = {\r\n helpMe: 'alertConfigPriority'\r\n };\r\n $scope.alertConfigAutoClear = {\r\n helpMe: 'alertConfigAutoClear'\r\n };\r\n $scope.alertConfigNotifyOnReturn = {\r\n helpMe: 'alertConfigNotifyOnReturn'\r\n };\r\n\r\n //public methods\r\n $scope.addTrigger = addTrigger;\r\n init();\r\n\r\n function init() {\r\n filterDefaultDataPointDescriptors($scope.dataPointDescriptors);\r\n getDatapoints();\r\n addTrigger(); //Add a row to the trigger table on page load\r\n\r\n //replace default tool tip icons with the light versions\r\n let triggerIcons = document.getElementsByClassName('fa-info-circle');\r\n Array.from(triggerIcons).forEach(function (icon) {\r\n icon.classList.add('far');\r\n icon.classList.remove('fa');\r\n });\r\n }\r\n\r\n //function to turn the editableselect into a searchable dropdown\r\n //.25 of a second timeout because the page finishes loading before the editableselect gets added to the page\r\n $scope.initSelect2 = function () {\r\n setTimeout(function () {\r\n $('#data-point').select2();\r\n }, 250);\r\n };\r\n\r\n // Function to filter all datapointDescriptors that have a default on them. Default to an empty array(in test $scope.datapointDescriptor is undefined)\r\n function filterDefaultDataPointDescriptors(descriptors = []) {\r\n descriptors.forEach(descriptor => {\r\n if (descriptor.values.hasOwnProperty('default')) {\r\n delete descriptor.values['default'];\r\n }\r\n });\r\n }\r\n //Dropdown menu Models\r\n $scope.priorityOptions = [\r\n {\r\n value: 'Low',\r\n label: gettextCatalog.getString('Low')\r\n },\r\n {\r\n value: 'Medium',\r\n label: gettextCatalog.getString('Medium')\r\n },\r\n {\r\n value: 'High',\r\n label: gettextCatalog.getString('High')\r\n }\r\n ];\r\n //for UI\r\n $scope.relationalSymbolsOptions = [\r\n {\r\n value: '<',\r\n label: '<',\r\n description: gettextCatalog.getString('Less Than')\r\n },\r\n {\r\n value: '<=',\r\n label: '<=',\r\n description: gettextCatalog.getString('Less Than or Equal to')\r\n },\r\n {\r\n value: '>',\r\n label: '>',\r\n description: gettextCatalog.getString('Greater Than')\r\n },\r\n {\r\n value: '>=',\r\n label: '>=',\r\n description: gettextCatalog.getString('Greater Than or equal to')\r\n },\r\n {\r\n value: '==',\r\n label: '=',\r\n description: gettextCatalog.getString('Equal to')\r\n },\r\n {\r\n value: '!=',\r\n label: '!=',\r\n description: gettextCatalog.getString('Not Equal to')\r\n }\r\n ];\r\n //for validation and building triggers to submit\r\n const relationalSymbols = [\r\n {\r\n value: '<',\r\n label: '<',\r\n description: gettextCatalog.getString('Less Than')\r\n },\r\n {\r\n value: '<=',\r\n label: '<=',\r\n description: gettextCatalog.getString('Less Than or Equal to')\r\n },\r\n {\r\n value: '>',\r\n label: '>',\r\n description: gettextCatalog.getString('Greater Than')\r\n },\r\n {\r\n value: '>=',\r\n label: '>=',\r\n description: gettextCatalog.getString('Greater Than or equal to')\r\n },\r\n {\r\n value: '==',\r\n label: '=',\r\n description: gettextCatalog.getString('Equal to')\r\n },\r\n {\r\n value: '!=',\r\n label: '!=',\r\n description: gettextCatalog.getString('Not Equal to')\r\n }\r\n ];\r\n\r\n $scope.unitOfTimeOptions = [\r\n {\r\n value: 'seconds',\r\n label: gettextCatalog.getString('Second(s)')\r\n },\r\n {\r\n value: 'minutes',\r\n label: gettextCatalog.getString('Minute(s)')\r\n },\r\n {\r\n value: 'hours',\r\n label: gettextCatalog.getString('Hour(s)')\r\n }\r\n ];\r\n\r\n $scope.clearOptions = [\r\n {\r\n value: '1',\r\n label: gettextCatalog.getString('Immediately')\r\n },\r\n {\r\n value: '2',\r\n label: gettextCatalog.getString('After 24hrs')\r\n }\r\n ];\r\n\r\n $scope.notifyOnReturnOptions = [\r\n {\r\n value: true,\r\n label: gettextCatalog.getString('Yes')\r\n },\r\n {\r\n value: false,\r\n label: gettextCatalog.getString('No')\r\n }\r\n ];\r\n\r\n $scope.$on('totalEmails', function (event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n\r\n //called when trigger form is open\r\n $scope.disableEditButton = function () {\r\n //enables edit and delete buttons\r\n $scope.editMode = true;\r\n };\r\n\r\n //called when trigger from is closed\r\n $scope.enableEditButton = function () {\r\n //disables edit and delete buttons\r\n $scope.editMode = false;\r\n };\r\n //get list of datapoints to display in UI.\r\n function getDatapoints() {\r\n // Creating placeholder for the datapoints and dapapoints descriptors\r\n const copyVisibleDataPoints = _.cloneDeep(currentUser.visibleDatapoints);\r\n const dataPointDescriptors = $scope.datapointDescriptors;\r\n\r\n let events = copyVisibleDataPoints.map(visibleDataPoint => {\r\n let foundDpdesc = dataPointDescriptors.find(dpdesc => dpdesc.key === visibleDataPoint.id);\r\n // Assign the value of visibleDatapoint.descriptor if a match is found. Else keep the original value\r\n visibleDataPoint.description =\r\n foundDpdesc && foundDpdesc.title ? foundDpdesc.title : visibleDataPoint.description;\r\n\r\n if (foundDpdesc !== undefined) {\r\n if (foundDpdesc.hasOwnProperty('values')) {\r\n visibleDataPoint.state = 'States';\r\n } else {\r\n visibleDataPoint.state = 'Values';\r\n }\r\n } else {\r\n visibleDataPoint.state = 'Values';\r\n }\r\n\r\n return visibleDataPoint;\r\n });\r\n events = ConfigurationFilterService.filterInvalidDatapoints(events);\r\n\r\n //filter out the states and values into their own separate arrays to make alphatical sorting easier\r\n let statesArray = events.filter(a => a.state === 'States');\r\n let valuesArray = events.filter(a => a.state === 'Values');\r\n\r\n statesArray = orderBy(statesArray, $scope.eventPropertyName);\r\n valuesArray = orderBy(valuesArray, $scope.eventPropertyName);\r\n\r\n let combinedArrays = statesArray.concat(valuesArray);\r\n\r\n $scope.sortedEvents = combinedArrays;\r\n }\r\n\r\n //Trigger Form Validation - Checks the values of each editable control before submitting the form.\r\n $scope.checkIfString = function (data) {\r\n if (data === '' || data === null) {\r\n $scope.validationFlag = true;\r\n return gettextCatalog.getString('required');\r\n }\r\n };\r\n\r\n $scope.checkNumericalValue = function (data) {\r\n if (isNaN(data)) {\r\n return gettextCatalog.getString('invalid number');\r\n } else {\r\n return $scope.checkIfString(data);\r\n }\r\n };\r\n\r\n //Validate the duration input before saving the trigger model to make sure we have not exceeded 24hrs\r\n //Need to disable the cancel button to force the user to change the duration\r\n $scope.checkDurationValue = function (data, triggerForm) {\r\n const maxTime = {\r\n hours: 24,\r\n minutes: 1440,\r\n seconds: 86200\r\n };\r\n const max = maxTime[triggerForm.$data?.unitOfTime?.value];\r\n if (isNaN(data)) {\r\n return gettextCatalog.getString('invalid number');\r\n } else if (data > max) {\r\n $scope.disableCancel = true;\r\n return gettextCatalog.getString('max limit ' + max);\r\n } else {\r\n $scope.disableCancel = false;\r\n return $scope.checkIfString(data);\r\n }\r\n };\r\n\r\n //Adds a new row to the triggers table\r\n function addTrigger() {\r\n $scope.trigger = {\r\n id: $scope.triggers.length,\r\n datapoint: '',\r\n condition: {\r\n relationalOperator: '',\r\n thresholdValue: '',\r\n duration: '',\r\n unitOfTime: ''\r\n },\r\n priority: '',\r\n autoClear: '',\r\n notifyOnReturn: ''\r\n };\r\n $scope.triggers.push($scope.trigger);\r\n $scope.isDisabled = true;\r\n $scope.descriptorVisible = false;\r\n }\r\n\r\n //Before saving a new trigger we want to check the triggers[] to prevent saving duplicate trigger conditons for the same event\r\n $scope.saveTrigger = function (data, index, id) {\r\n $scope.validationFlag = false;\r\n $scope.incompleteTriggerFlag = false;\r\n\r\n //Flag to hide or show duplicate condition message\r\n $scope.duplicateEventCondition = false;\r\n\r\n //Triggers to be saved with configuration\r\n const savedTrigger = {\r\n id: id,\r\n datapoint: data.datapoint,\r\n condition: {\r\n relationalOperator: data.relationalOperator,\r\n thresholdValue: data.thresholdValue,\r\n duration: data.duration,\r\n unitOfTime: data.unitOfTime\r\n },\r\n priority: data.priority,\r\n autoClear: data.autoClear,\r\n notifyOnReturn: data.notifyOnReturn\r\n };\r\n\r\n //remove duplicate trigger from savedTriggers array\r\n for (let i = 0; i < $scope.savedTriggers.length; i++) {\r\n if (id === $scope.savedTriggers[i].id) {\r\n $scope.savedTriggers.splice(index, 1);\r\n }\r\n }\r\n\r\n //validate the datapoint and condition\r\n if ($scope.savedTriggers.length >= 1) {\r\n for (let i = 0; i < $scope.savedTriggers.length; i++) {\r\n let savedTriggerCondition = $scope.savedTriggers[i].condition;\r\n if (\r\n data.datapoint.id === $scope.savedTriggers[i].datapoint.id &&\r\n data.relationalOperator.value === savedTriggerCondition.relationalOperator.value &&\r\n data.thresholdValue === savedTriggerCondition.thresholdValue &&\r\n data.duration === savedTriggerCondition.duration &&\r\n data.unitOfTime.value === savedTriggerCondition.unitOfTime.value\r\n ) {\r\n $scope.duplicateEventCondition = true;\r\n return 'Duplicate Condition';\r\n }\r\n }\r\n }\r\n\r\n if ($scope.duplicateEventCondition === false) {\r\n //push savedTrigger model\r\n $scope.savedTriggers.push(savedTrigger);\r\n //reset trigger model\r\n $scope.trigger = {};\r\n //enable add trigger button\r\n $scope.isDisabled = false;\r\n $scope.hasTriggers = true;\r\n }\r\n };\r\n\r\n //removes triggers from both contains\r\n $scope.removeTrigger = function (index) {\r\n $scope.triggers.splice(index, 1);\r\n $scope.savedTriggers.splice(index, 1);\r\n };\r\n\r\n //remove trigger before saved if cancel button is clicked\r\n $scope.cancelTrigger = function (index) {\r\n if ($scope.triggers.length > $scope.savedTriggers.length) {\r\n $scope.triggers.splice(index, 1);\r\n }\r\n };\r\n\r\n //display the number of assets selected from the picker\r\n $scope.numSelectedAssets = function () {\r\n if (!$scope.param._selected || !$scope.param) return 0;\r\n\r\n return Object.keys($scope.param._selected).length;\r\n };\r\n\r\n //Select Asset Modal\r\n $scope.selectAssetsButtonPressed = function () {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n selectedAssets: function () {\r\n let selected = {};\r\n\r\n if ($scope.equipmentData) {\r\n for (let i = 0; i < $scope.equipmentData.length; i++) {\r\n let e = $scope.equipmentData[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(\r\n function (selectedAssets) {\r\n $scope.equipmentData = [];\r\n for (let key in selectedAssets.result) {\r\n $scope.equipmentData.push(selectedAssets.result[key]);\r\n }\r\n },\r\n function () { }\r\n );\r\n };\r\n\r\n //filter through the list of datapointDescriptors using datapoint of selected row\r\n //or new row and display proper values for the condition dropdowns\r\n $scope.datapointSelected = function (data) {\r\n if (data) {\r\n let datapoint = data;\r\n $scope.showKMLabel = datapoint.description === 'Speed' ? true : false;\r\n $scope.thresholdOptions = [];\r\n for (let i = 0; i < $scope.dataPointDescriptors.length; i++) {\r\n if (datapoint.id === $scope.dataPointDescriptors[i].key) {\r\n for (let key in $scope.dataPointDescriptors[i].values) {\r\n let option = {\r\n value: parseInt(key),\r\n label: $scope.dataPointDescriptors[i].values[key]\r\n };\r\n $scope.thresholdOptions.push(option);\r\n }\r\n\r\n //Changes the dropdown options shown in the condition\r\n if ($scope.thresholdOptions && $scope.thresholdOptions.length !== 0) {\r\n $scope.descriptorVisible = true;\r\n $scope.relationalSymbolsOptions = [\r\n {\r\n value: '==',\r\n label: '=',\r\n description: gettextCatalog.getString('Equal to')\r\n },\r\n {\r\n value: '!=',\r\n label: '!=',\r\n description: gettextCatalog.getString('Not Equal to')\r\n }\r\n ];\r\n } else {\r\n $scope.descriptorVisible = false;\r\n $scope.relationalSymbolsOptions = relationalSymbols;\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n $scope.descriptorVisible = false;\r\n $scope.relationalSymbolsOptions = [\r\n {\r\n value: '<',\r\n label: '<',\r\n description: gettextCatalog.getString('Less Than')\r\n },\r\n {\r\n value: '<=',\r\n label: '<=',\r\n description: gettextCatalog.getString('Less Than or Equal to')\r\n },\r\n {\r\n value: '>',\r\n label: '>',\r\n description: gettextCatalog.getString('Greater Than')\r\n },\r\n {\r\n value: '>=',\r\n label: '>=',\r\n description: gettextCatalog.getString('Greater Than or equal to')\r\n },\r\n {\r\n value: '==',\r\n label: '=',\r\n description: gettextCatalog.getString('Equal to')\r\n },\r\n {\r\n value: '!=',\r\n label: '!=',\r\n description: gettextCatalog.getString('Not Equal to')\r\n }\r\n ];\r\n }\r\n };\r\n\r\n //Validate the form on submission then run the API call\r\n $scope.isFormValid = function (createConfigForm) {\r\n createConfigForm.$setSubmitted();\r\n if (createConfigForm.$invalid) {\r\n $scope.loading = false;\r\n return;\r\n }\r\n if ($scope.equipmentData.length === 0) {\r\n $scope.loading = false;\r\n return;\r\n }\r\n if ($scope.savedTriggers.length === 0) {\r\n $scope.loading = false;\r\n $scope.hasTriggers = false;\r\n return;\r\n }\r\n if ($scope.editMode === true) {\r\n $scope.incompleteTriggerFlag = true;\r\n return;\r\n } else {\r\n $scope.createConfiguration();\r\n }\r\n };\r\n\r\n $scope.configurationExists = function () {\r\n $scope.duplicateConfigName = false;\r\n configurationsService.getConfigurationByName($scope.configuration.name).then(function (response) {\r\n if (response.data.name === $scope.configuration.name) {\r\n $scope.duplicateConfigName = true;\r\n }\r\n }).catch(err => {\r\n if (404 != err.status)\r\n console.log(err)\r\n });\r\n }\r\n\r\n //Post Configuration\r\n $scope.createConfiguration = function () {\r\n $scope.loading = true;\r\n $scope.errorFlag = false;\r\n\r\n let configuration = {\r\n name: '',\r\n equipment: [],\r\n contacts: [],\r\n triggers: [],\r\n brand: ''\r\n };\r\n\r\n //get name\r\n configuration.name = $scope.configuration.name;\r\n\r\n const brand = Auth.getBrandClaim();\r\n if (brand != null) {\r\n configuration.brand = brand;\r\n }\r\n\r\n //get list of equipment ids\r\n if ($scope.equipmentData.length > 0) {\r\n for (let i = 0; i < $scope.equipmentData.length; i++) {\r\n configuration.equipment.push($scope.equipmentData[i].id);\r\n }\r\n }\r\n\r\n //get list of contacts\r\n for (let i = 0; i < $scope.contactsList.length; i++) {\r\n configuration.contacts.push($scope.contactsList[i].email);\r\n }\r\n\r\n //build the condition for each trigger in $scope.triggers\r\n let triggerScope = $scope.triggers;\r\n\r\n if (triggerScope && triggerScope.length > 0) {\r\n triggerScope.forEach(t => {\r\n let trigger = {\r\n datapoint: '',\r\n condition: ['IF', '[value]', '', '', 'FOR', '', ''],\r\n priority: '',\r\n autoClear: '',\r\n notifyOnReturn: ''\r\n };\r\n\r\n //trigger.datapoint\r\n for (let k = 0; k < currentUser.visibleDatapoints.length; k++) {\r\n if (t.datapoint.id === currentUser.visibleDatapoints[k].id) {\r\n trigger.datapoint = currentUser.visibleDatapoints[k].id;\r\n }\r\n }\r\n\r\n //trigger.condition[2]\r\n for (let j = 0; j < relationalSymbols.length; j++) {\r\n if (t.condition.relationalOperator.value === relationalSymbols[j].value) {\r\n trigger.condition[2] = relationalSymbols[j].value;\r\n }\r\n }\r\n\r\n //t.condition[3]\r\n if (isNaN(t.condition.thresholdValue)) {\r\n for (let p = 0; p < $scope.datapointDescriptors.length; p++) {\r\n if (t.datapoint.id === $scope.dataPointDescriptors[p].key) {\r\n for (let key in $scope.dataPointDescriptors[p].values) {\r\n if (t.condition.thresholdValue === $scope.dataPointDescriptors[p].values[key]) {\r\n trigger.condition[3] = key;\r\n }\r\n }\r\n }\r\n }\r\n } else if (typeof t.condition.thresholdValue === 'number' && t.condition.thresholdValue % 1 === 0) {\r\n trigger.condition[3] = parseInt(t.condition.thresholdValue);\r\n } else {\r\n trigger.condition[3] = parseFloat(t.condition.thresholdValue);\r\n }\r\n\r\n //t.condtion[5]\r\n trigger.condition[5] = parseInt(t.condition.duration);\r\n\r\n //t.condition[6]\r\n for (let m = 0; m < $scope.unitOfTimeOptions.length; m++) {\r\n if (t.condition.unitOfTime.value === $scope.unitOfTimeOptions[m].value) {\r\n trigger.condition[6] = $scope.unitOfTimeOptions[m].value;\r\n }\r\n }\r\n\r\n let condition = trigger.condition.join(' ');\r\n\r\n //t.priority\r\n for (let m = 0; m < $scope.priorityOptions.length; m++) {\r\n if (t.priority.value === $scope.priorityOptions[m].value) {\r\n trigger.priority = $scope.priorityOptions[m].value;\r\n }\r\n }\r\n\r\n //t.autoClear\r\n if (t.autoClear.value === $scope.clearOptions[0].value) {\r\n trigger.autoClear = $scope.clearOptions[0].value;\r\n } else {\r\n trigger.autoClear = $scope.clearOptions[1].value;\r\n }\r\n\r\n //t.notify\r\n if (t.notifyOnReturn.value === $scope.notifyOnReturnOptions[0].value) {\r\n trigger.notifyOnReturn = $scope.notifyOnReturnOptions[0].value;\r\n } else {\r\n trigger.notifyOnReturn = $scope.notifyOnReturnOptions[1].value;\r\n }\r\n\r\n configuration.triggers.push({\r\n datapoint: trigger.datapoint,\r\n condition: condition,\r\n priority: trigger.priority,\r\n autoClear: trigger.autoClear,\r\n notifyOnReturn: trigger.notifyOnReturn\r\n });\r\n });\r\n }\r\n\r\n //Create Configuration\r\n configurationsService.postConfiguration(configuration).then(\r\n function (response) {\r\n $scope.loading = false;\r\n $state.go('alerts.configurations.edit', {\r\n configurationId: response.data.id\r\n });\r\n },\r\n function () {\r\n const errorMsg = gettextCatalog.getString('An error occurred while creating the Configuration');\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n }\r\n );\r\n }; //End createConfiguration\r\n}\r\n","export default function AlertsListController($scope, $rootScope, $filter, configurationsService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.configurations = [];\r\n $scope.filteredConfigurations = [];\r\n var currentUser = $rootScope.currentUser;\r\n $scope.searchText = '';\r\n $scope.errorFlag = false;\r\n $scope.errorText = \"\";\r\n $scope.loading = true;\r\n $scope.onLoadErrorText = '';\r\n $scope.onLoadErrorFlag = false;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 1;\r\n\r\n $scope.orderConfigurations = function (predicate) {\r\n\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = true;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.applyFilter = function () {\r\n $scope.filteredConfigurations = $filter('filter')($scope.configurations, $scope.searchText);\r\n };\r\n\r\n //reset flags after user selects a new row\r\n $scope.resetFlags = function () {\r\n $scope.errorFlag = false;\r\n $scope.errorText = \"\";\r\n };\r\n\r\n //Tracks the selected row.\r\n $scope.setSelectedRow = function (configData) {\r\n $scope.selectedRow = configData.name;\r\n $scope.resetFlags();\r\n };\r\n\r\n function getConfigurations() {\r\n configurationsService.getAllConfigurations()\r\n .then(function (response) {\r\n $scope.loading = true;\r\n $scope.configurations = response.data;\r\n $scope.applyFilter();\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving configurations\");\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n if (currentUser != null) {\r\n getConfigurations();\r\n }\r\n $scope.$watch(function () {\r\n return $rootScope.currentUser;\r\n }, function (newVal, oldVal) { //if currentUser (with visible datapoints) isn't defined on page load, wait to populate the datapoint list until it is\r\n if (typeof oldVal === 'undefined') {\r\n if (!(typeof newVal === 'undefined')) {\r\n currentUser = $rootScope.currentUser;\r\n getConfigurations();\r\n }\r\n }\r\n });\r\n}","export default function AlertsViewDeleteController(\r\n $scope,\r\n $uibModalInstance,\r\n configuration,\r\n $state,\r\n configurationsService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.configuration = configuration;\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n\r\n $scope.ok = function() {\r\n $scope.loading = true;\r\n configurationsService.deleteConfiguration($scope.configuration.id).then(\r\n function(response) {\r\n $uibModalInstance.close();\r\n $state.go('alerts.configurations.list');\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting the configuration');\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.loading = false;\r\n }\r\n );\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n $scope.cancel();\r\n });\r\n}\r\n","import Auth from '../../../../../../auth';\r\nexport default function AlertsViewEditController($scope, $state, $stateParams, $uibModal, configurationsService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.contacts = [];\r\n $scope.contactsBackup = [];\r\n const configurationMenuItems = [];\r\n $scope.existingConfigurations = [];\r\n $scope.emailBackup = '';\r\n $scope.loading = true;\r\n $scope.maxEmails = 10;\r\n $scope.nameBackup = '';\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = \"\";\r\n\r\n //public methods\r\n $scope.editButtonClicked = editButtonClicked;\r\n $scope.isFormValid = isFormValid;\r\n\r\n init();\r\n\r\n function init() {\r\n getConfigurationById();\r\n }\r\n\r\n $scope.$on('totalEmails', function (event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n\r\n //Switch to edit mode\r\n function editButtonClicked() {\r\n $scope.isEditing = !$scope.isEditing;\r\n if (!$scope.isEditing) {\r\n resetFormData();\r\n }\r\n }\r\n\r\n function loadConfigData() {\r\n $scope.contacts = [];\r\n //Provide a list of email objects for the multi-emails directive\r\n for (var i = 0; i < $scope.configuration.contacts.length; i++) {\r\n $scope.contacts.push({\r\n \"email\": $scope.configuration.contacts[i]\r\n });\r\n }\r\n resetFormData();\r\n }\r\n\r\n const resetFormData = () => {\r\n $scope.nameBackup = angular.copy($scope.configuration.name);\r\n $scope.emailBackup = angular.copy($scope.contacts);\r\n }\r\n\r\n //Validate the form on submission then run the API call\r\n function isFormValid(editConfigurationForm) {\r\n editConfigurationForm.$setSubmitted();\r\n if (editConfigurationForm.$invalid) {\r\n $scope.loading = false;\r\n return;\r\n } else {\r\n $scope.submitEditConfigurationForm();\r\n }\r\n }\r\n\r\n $scope.configurationExists = function () {\r\n $scope.duplicateConfigName = false;\r\n configurationsService.getConfigurationByName($scope.configuration.name).then(function (response) {\r\n if ((response.data.name === $scope.configuration.name) && (response.data.id != $scope.configuration.id)) {\r\n $scope.duplicateConfigName = true;\r\n }\r\n }).catch(err => {\r\n if (404 != err.status)\r\n console.log(err)\r\n });\r\n }\r\n\r\n //Update the configuration name and contacts\r\n $scope.submitEditConfigurationForm = function () {\r\n $scope.loading = true;\r\n $scope.configErrorFlag = false;\r\n\r\n var id = $scope.configuration.id;\r\n var config = {\r\n name: '',\r\n contacts: [],\r\n brand: '',\r\n };\r\n\r\n config.name = $scope.nameBackup;\r\n\r\n for (var i = 0; i < $scope.emailBackup.length; i++) {\r\n config.contacts.push($scope.emailBackup[i].email);\r\n }\r\n\r\n const brand = Auth.getBrandClaim();\r\n\r\n if (brand != null) {\r\n config.brand = brand;\r\n }\r\n\r\n configurationsService.patchConfiguration(id, config)\r\n .then(function (response) {\r\n\r\n $scope.configuration.name = response.data.name;\r\n $scope.configuration.contacts = response.data.contacts;\r\n loadConfigData();\r\n $scope.loading = false;\r\n $scope.isEditing = false;\r\n\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while updating the configuration\");\r\n $scope.configErrorText = errorMsg;\r\n $scope.configErrorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }; //End submitEditConfigurationForm\r\n\r\n $scope.deleteButtonPressed = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../delete-modal/delete.html'),\r\n controller: 'AlertsViewDeleteController',\r\n resolve: {\r\n configuration: function () {\r\n return $scope.configuration;\r\n }\r\n },\r\n size: 'md'\r\n });\r\n };\r\n\r\n function getConfigurationById() {\r\n if ($stateParams.configurationId) {\r\n\r\n //Do a call for the configuration data\r\n configurationsService.getConfigurationById($stateParams.configurationId)\r\n .then(function (response) {\r\n\r\n $scope.loading = false;\r\n $scope.configuration = response.data;\r\n\r\n //Populate Ui\r\n loadConfigData();\r\n\r\n //To let breadcrumbs directive know that the data for label has been loaded\r\n $scope.$emit('$viewContentLoaded');\r\n })\r\n .catch(function (error) {\r\n if (!$state.$current.parent.self.ncyBreadcrumbLabel) {\r\n if ($scope.$parent.selectedRow) {\r\n $state.$current.parent.self.ncyBreadcrumbLabel = $scope.$parent.selectedRow;\r\n } else {\r\n $state.$current.parent.self.ncyBreadcrumbLabel = \"Error\";\r\n $state.$current.parent.self.ncyBreadcrumbLink = $state.$current.parent.parent.self.ncyBreadcrumbLink;\r\n }\r\n }\r\n var errorMsg = gettextCatalog.getString(\"Unable to retrive Configuration information.\");\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n $scope.loading = false;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = gettextCatalog.getString(\"Could not load page: no configuration Id provided.\");\r\n }\r\n }\r\n\r\n configurationMenuItems.push({\r\n \"title\": \"Manage Assets\",\r\n \"sref\": \"alerts.configurations.edit.equipment({configuration: configuration.id})\"\r\n });\r\n\r\n configurationMenuItems.push({\r\n \"title\": \"Manage Triggers\",\r\n \"sref\": \"alerts.configurations.edit.triggers({configuration: configuration.id})\"\r\n });\r\n\r\n $scope.configurationMenuItems = configurationMenuItems;\r\n\r\n $scope.isActiveState = function (state) {\r\n return true;\r\n };\r\n}","export default function AlertsViewPickAssetsController(\r\n $uibModal,\r\n $timeout,\r\n $stateParams,\r\n $scope,\r\n $filter,\r\n configurationsService,\r\n equipmentRepository,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.animationsEnabled = true;\r\n $scope.equipmentByPage = [];\r\n $scope.equipments = []; //list of equipments to send to the database\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.filteredEquipmentList = [];\r\n $scope.loading = true;\r\n $scope.onLoadErrorFlag = false;\r\n $scope.onLoadErrorText = '';\r\n $scope.postRemoval = [];\r\n $scope.removeFlags = {};\r\n $scope.removeLastAssetMsgFlag = false;\r\n $scope.removeLastAssetMsg = gettextCatalog.getString('You must have at least one Asset per Configuration.');\r\n $scope.removals = [];\r\n $scope.search = {\r\n text: ''\r\n };\r\n $scope.successFlag = false;\r\n\r\n var configurationId = $stateParams.configurationId;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 1;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredEquipmentList\r\n $scope.orderEquipmentList = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n //applyFilter searchs the equipments[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredEquipmentList = $filter('filter')($scope.equipments, $scope.search.text);\r\n };\r\n\r\n $scope.initializeEquipments = function () {\r\n var existingIds = {\r\n criteria: {\r\n ids: []\r\n }\r\n };\r\n if ($scope.$parent.configuration) {\r\n $scope.equipments = $scope.$parent.configuration.equipment.data.slice();\r\n } else {\r\n $scope.equipments = $scope.equipmentData;\r\n }\r\n\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n existingIds.criteria.ids.push($scope.equipments[i].id);\r\n $scope.removeFlags[$scope.equipments[i].id] = false;\r\n }\r\n if (existingIds.criteria.ids.length > 0) {\r\n equipmentRepository.postEquipmentListByIds(existingIds).then(\r\n function (response) {\r\n $scope.loading = false;\r\n $scope.equipments = response.data;\r\n $scope.postRemoval = $scope.equipments.slice();\r\n $scope.filteredEquipmentList = $scope.equipments.slice();\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('Unable to retrieve Asset information');\r\n $scope.loading = false;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n }\r\n );\r\n } else {\r\n $scope.loading = false;\r\n }\r\n };\r\n\r\n function init() {\r\n //if edit configurations page is already loaded, the configuration and its resources will be available\r\n if ($scope.$parent.configuration) {\r\n $scope.initializeEquipments();\r\n } else {\r\n getConfigurationEquipmentData();\r\n }\r\n }\r\n\r\n init();\r\n\r\n function getConfigurationEquipmentData() {\r\n if (configurationId) {\r\n $scope.loading = true;\r\n configurationsService\r\n .getConfigurationById(configurationId)\r\n .then(function (response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n $scope.equipmentData = [];\r\n for (var j = 0; j < response.data.equipment.data.length; j++) {\r\n $scope.equipmentData.push(response.data.equipment.data[j]);\r\n }\r\n $scope.initializeEquipments();\r\n })\r\n .catch(function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving configuration information.');\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n $scope.loading = false;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = gettextCatalog.getString('Could not load page: no configuration Id provided.');\r\n }\r\n }\r\n\r\n //Asset Picker - Add/Remove equipment to/from configuration\r\n $scope.open = function (size) {\r\n var modalScope = $scope.$new();\r\n modalScope.modalTitle = 'Select Assets for Configuration: ' + $scope.$parent.configuration.name;\r\n\r\n $scope.resetFlags();\r\n var modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('../../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n scope: modalScope,\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n selectedAssets: function () {\r\n var selected = {};\r\n\r\n if ($scope.equipments) {\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n var e = $scope.equipments[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(function (selectedAssets) {\r\n var changes = [];\r\n var changeResult = $scope.equipments.slice();\r\n for (var key in selectedAssets.result) {\r\n var alreadyPicked = false;\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n if (key === $scope.equipments[i].id) {\r\n alreadyPicked = true;\r\n break;\r\n }\r\n }\r\n if (!alreadyPicked) {\r\n changeResult.push(selectedAssets.result[key]);\r\n $scope.applyChange({\r\n op: 'add',\r\n equipId: key\r\n }, changes);\r\n }\r\n }\r\n for (var i = 0; i < changeResult.length; i++) {\r\n var remove = true;\r\n for (var key in selectedAssets.result) {\r\n if (key === changeResult[i].id) {\r\n remove = false;\r\n break;\r\n }\r\n }\r\n if (remove) {\r\n $scope.applyChange({\r\n op: 'remove',\r\n equipId: changeResult[i].id\r\n }, changes);\r\n changeResult.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n $scope.saveEquipments(changeResult, changes);\r\n });\r\n };\r\n\r\n $scope.toggleAnimation = function () {\r\n $scope.animationsEnabled = !$scope.animationsEnabled;\r\n };\r\n\r\n $scope.saveEquipments = function (newEquipmentList, changeset) {\r\n if (changeset.length == 0 || $scope.sending) {\r\n return;\r\n }\r\n if (newEquipmentList.length === 0 || $scope.equipments.length === newEquipmentList.length) {\r\n $scope.removeLastAssetMsgFlag = true;\r\n return;\r\n }\r\n $scope.errorFlag = false;\r\n var data = {\r\n changeset: changeset\r\n };\r\n $scope.sending = true;\r\n\r\n configurationsService.patchConfigurationEquipment($scope.$parent.configuration.id, data).then(\r\n function (response) {\r\n if (newEquipmentList) {\r\n $scope.equipments = newEquipmentList.slice();\r\n }\r\n $scope.$parent.configuration.equipment.data = $scope.equipments.slice();\r\n $scope.filteredEquipmentList = $scope.equipments.slice();\r\n $scope.checkRemovals();\r\n $scope.applyFilter();\r\n $scope.orderEquipmentList($scope.predicate, false);\r\n $scope.successFlag = true;\r\n $scope.sending = false;\r\n $timeout(function () {\r\n $scope.resetFlags();\r\n }, 2500);\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while editing Assets');\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.sending = false;\r\n }\r\n );\r\n return true;\r\n };\r\n\r\n $scope.toggleRemoval = function (equip) {\r\n $scope.resetFlags();\r\n for (var i = 0; i < $scope.postRemoval.length; i++) {\r\n if ($scope.postRemoval[i].id === equip.id) {\r\n $scope.postRemoval.splice(i, 1);\r\n $scope.applyChange({\r\n op: 'remove',\r\n equipId: equip.id\r\n }, $scope.removals);\r\n return;\r\n }\r\n }\r\n //if we're toggling the checkbox off, put that equipment back into the post-removal list\r\n $scope.postRemoval.push(equip);\r\n $scope.applyChange({\r\n op: 'add',\r\n equipId: equip.id\r\n }, $scope.removals); //will cancel out the \"remove\" operation for that equip\r\n };\r\n\r\n $scope.checkRemovals = function () {\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n //initialize checkbox models for new equipment\r\n var existed = false;\r\n for (var key in $scope.removeFlags) {\r\n if (key === $scope.equipments[i].id) {\r\n existed = true;\r\n break;\r\n }\r\n }\r\n if (!existed) {\r\n $scope.removeFlags[$scope.equipments[i].id] = false;\r\n $scope.postRemoval.push($scope.equipments[i]);\r\n }\r\n }\r\n $scope.removals = [];\r\n for (var key in $scope.removeFlags) {\r\n //clear checkbox models and changes (if necessary) for removed equipment\r\n var exists = false;\r\n for (var i = 0; i < $scope.equipments.length; i++) {\r\n if (key === $scope.equipments[i].id) {\r\n exists = true;\r\n break;\r\n }\r\n }\r\n if (!exists) {\r\n for (var i = 0; i < $scope.postRemoval.length; i++) {\r\n if ($scope.postRemoval[i].id === key) {\r\n $scope.postRemoval.splice(i, 1);\r\n break;\r\n }\r\n }\r\n delete $scope.removeFlags[key];\r\n }\r\n if ($scope.removeFlags[key]) {\r\n $scope.applyChange({\r\n op: 'remove',\r\n equipId: key\r\n }, $scope.removals);\r\n }\r\n }\r\n };\r\n\r\n $scope.applyChange = function (newChange, changeset) {\r\n $scope.resetFlags();\r\n for (var i = 0; i < changeset.length; i++) {\r\n //handle behaviour when multiple changes requested for same resource\r\n if (changeset[i].equipId && changeset[i].equipId === newChange.equipId) {\r\n if (changeset[i].op === newChange.op) {\r\n //only apply one add or remove per resource\r\n return;\r\n } else {\r\n //if ops are different, changes will cancel out (ie. adding and removing a resource in the same request will have no net effect)\r\n changeset.splice(i, 1);\r\n return;\r\n }\r\n }\r\n }\r\n changeset.push(newChange);\r\n };\r\n\r\n $scope.resetFlags = function () {\r\n $scope.errorFlag = false;\r\n $scope.successFlag = false;\r\n $scope.removeLastAssetMsgFlag = false;\r\n };\r\n}","//just define a marker for extracting the text for translation\r\nexport const gettext = str => str;\r\n","import {keyBy} from 'lodash-es';\r\nimport {gettext} from '../../../../../../utility/gettext.util.service';\r\n\r\nclass Options {\r\n constructor() {\r\n this._priorityOptions = [\r\n {\r\n value: 'Low',\r\n label: gettext('Low')\r\n },\r\n {\r\n value: 'Medium',\r\n label: gettext('Medium')\r\n },\r\n {\r\n value: 'High',\r\n label: gettext('High')\r\n }\r\n ];\r\n\r\n this._relationalSymbolsOptions = [\r\n {\r\n value: '<',\r\n label: '<',\r\n description: gettext('Less Than')\r\n },\r\n {\r\n value: '<=',\r\n label: '<=',\r\n description: gettext('Less Than or Equal to')\r\n },\r\n {\r\n value: '>',\r\n label: '>',\r\n description: gettext('Greater Than')\r\n },\r\n {\r\n value: '>=',\r\n label: '>=',\r\n description: gettext('Greater Than or equal to')\r\n },\r\n {\r\n value: '==',\r\n label: '=',\r\n description: gettext('Equal to'),\r\n stateRelational: true\r\n },\r\n {\r\n value: '!=',\r\n label: '!=',\r\n description: gettext('Not Equal to'),\r\n stateRelational: true\r\n }\r\n ];\r\n\r\n this._unitOfTimeOptions = [\r\n {\r\n value: 'seconds',\r\n label: gettext('Second(s)')\r\n },\r\n {\r\n value: 'minutes',\r\n label: gettext('Minute(s)')\r\n },\r\n {\r\n value: 'hours',\r\n label: gettext('Hour(s)')\r\n }\r\n ];\r\n this._clearOptions = [\r\n {\r\n value: 'Immediately',\r\n label: gettext('Immediately')\r\n },\r\n {\r\n value: 'OneDay',\r\n label: gettext('After 24hrs')\r\n }\r\n ];\r\n this._notifyOnReturnOptions = [\r\n {\r\n value: true,\r\n label: gettext('Yes')\r\n },\r\n {\r\n value: false,\r\n label: gettext('No')\r\n }\r\n ];\r\n }\r\n get priorityOptions() {\r\n return this._priorityOptions;\r\n }\r\n get relationalSymbolsOptions() {\r\n return this._relationalSymbolsOptions;\r\n }\r\n get unitOfTimeOptions() {\r\n return this._unitOfTimeOptions;\r\n }\r\n get clearOptions() {\r\n return this._clearOptions;\r\n }\r\n get notifyOnReturnOptions() {\r\n return this._notifyOnReturnOptions;\r\n }\r\n get indexedPriorityOptions() {\r\n return keyBy(this._priorityOptions, 'value');\r\n }\r\n get indexedRelationalSymbolsOptions() {\r\n return keyBy(this._relationalSymbolsOptions, 'value');\r\n }\r\n get indexedUnitOfTimeOptions() {\r\n return keyBy(this._unitOfTimeOptions, 'value');\r\n }\r\n get indexedClearOptions() {\r\n return keyBy(this._clearOptions, 'value');\r\n }\r\n get indexedNotifyOnReturnOptions() {\r\n return keyBy(this._notifyOnReturnOptions, 'value');\r\n }\r\n}\r\n\r\nexport const options = new Options();\r\n\r\nexport class TriggerView {\r\n constructor(id) {\r\n this.id = id;\r\n this.dataPoint = '';\r\n this.condition = {\r\n relationalOperator: '',\r\n thresholdValue: '',\r\n duration: '',\r\n unitOfTime: ''\r\n };\r\n this.priority = '';\r\n this.autoClear = '';\r\n this.notifyOnReturn = '';\r\n this.valuesDescriptors = undefined;\r\n }\r\n}\r\n\r\nexport class ApiTrigger {\r\n constructor(triggerView = {}) {\r\n this.id = triggerView.id;\r\n const {dataPoint = {}} = triggerView || {};\r\n this.dataPoint = dataPoint.id;\r\n this.priority = triggerView.priority;\r\n this.autoClear = triggerView.autoClear;\r\n this.notifyOnReturn = triggerView.notifyOnReturn;\r\n const {relationalOperator, thresholdValue, duration, unitOfTime} = triggerView.condition || {};\r\n this.condition = `IF [value] ${relationalOperator} ${thresholdValue} FOR ${duration} ${unitOfTime}`;\r\n }\r\n}\r\n","import {TriggerView} from './triggers.models';\r\n\r\nexport const validateTriggersData = (data = [], visibleDatapoints = []) => {\r\n const visibleDatapointsIds = visibleDatapoints.map(datapoint => datapoint.id);\r\n return data.filter(trigger => visibleDatapointsIds.includes(trigger.dataPoint));\r\n};\r\n\r\nexport const isSameTriggers = (one, two) => {\r\n const {condition: conditionOne, dataPoint: dataPointOne} = one || {};\r\n const {condition: conditionTwo, dataPoint: dataPointTwo} = two || {};\r\n return (\r\n dataPointOne.id === dataPointTwo.id &&\r\n conditionOne.relationalOperator === conditionTwo.relationalOperator &&\r\n conditionOne.thresholdValue === conditionTwo.thresholdValue &&\r\n conditionOne.duration === conditionTwo.duration &&\r\n conditionOne.unitOfTime === conditionTwo.unitOfTime\r\n );\r\n};\r\n\r\nexport const apiToTriggerView = (apiTrigger = {}, dataPoint = {}, dataPointDescriptor = {}) => {\r\n let trigger = new TriggerView(apiTrigger.id);\r\n trigger.dataPoint = dataPoint;\r\n //t.ValuesDescriptors\r\n if (dataPointDescriptor && dataPointDescriptor.values && Object.keys(dataPointDescriptor.values).length > 0) {\r\n trigger.valuesDescriptors = dataPointDescriptor.values;\r\n }\r\n //used to hold the condition after being split into an array\r\n const condition = apiTrigger.condition.split(' ');\r\n //read the array in this order [if, [value], >, 100 ,for, 2 ,seconds]\r\n const [, , relationalOperator, thresholdValue, , duration, unitOfTime] = condition;\r\n //t.condition[2]\r\n trigger.condition.relationalOperator = relationalOperator;\r\n //t.condition[3]\r\n if (thresholdValue && thresholdValue.indexOf('.') !== -1) {\r\n trigger.condition.thresholdValue = parseFloat(thresholdValue);\r\n } else {\r\n trigger.condition.thresholdValue = thresholdValue;\r\n }\r\n //t.condtion[5]\r\n trigger.condition.duration = parseInt(duration);\r\n //t.condition[6]\r\n trigger.condition.unitOfTime = unitOfTime;\r\n //t.priority\r\n trigger.priority = apiTrigger.priority;\r\n //t.autoClear\r\n trigger.autoClear = apiTrigger.autoClear;\r\n //t.notify\r\n trigger.notifyOnReturn = apiTrigger.notifyOnReturn;\r\n\r\n return trigger;\r\n};\r\n","import { cloneDeep } from 'lodash-es';\r\nimport { options, TriggerView, ApiTrigger } from './triggers.models';\r\nimport * as Util from './triggers.util';\r\n\r\nexport default function AlertsViewTriggersControllerCRUD(\r\n $scope,\r\n $rootScope,\r\n $stateParams,\r\n $filter,\r\n configurationsService,\r\n gettextCatalog,\r\n ConfigurationFilterService,\r\n) {\r\n 'ngInject';\r\n\r\n //Local Varaiables\r\n let currentUser = $rootScope.currentUser;\r\n let configurationId = $stateParams.configurationId;\r\n let orderBy = $filter('orderBy');\r\n\r\n const vm = this;\r\n\r\n let filterDefaultDataPointDescriptors = () => {\r\n let descriptors = cloneDeep($rootScope.datapointDescriptors);\r\n descriptors.forEach(descriptor => {\r\n if (descriptor.values.hasOwnProperty('default')) {\r\n delete descriptor.values['default'];\r\n }\r\n });\r\n return descriptors;\r\n };\r\n //Public Variables\r\n $scope.dataPointDescriptors = filterDefaultDataPointDescriptors();\r\n $scope.descriptorVisible = false; //used to change the thresholdValue input from select dropdown to numerical input\r\n $scope.deleteTriggerFlag = false; //hide or show deleteTriggerMessage\r\n $scope.deleteTriggerText = gettextCatalog.getString(\r\n 'You must have at least one Trigger per Configuration.',\r\n );\r\n $scope.duplicateConditionFlag = false;\r\n $scope.duplicateConditionText = gettextCatalog.getString(\r\n 'The condition must be unique when using the same data point on multiple triggers. Change the condition and try saving the trigger again.',\r\n );\r\n $scope.filteredTriggerList = []; //Container for triggers that meet search criteria\r\n $scope.hasNewTrigger = false;\r\n $scope.loading = false;\r\n $scope.savedTriggers = [];\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.sortedEvents = [];\r\n $scope.triggerData = [];\r\n $scope.triggers = [];\r\n $scope.disableDataPointDropdown = true;\r\n $scope.validationFlag = false;\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 1;\r\n\r\n //Sorting\r\n $scope.eventPropertyName = 'description'; //sort datapoint dropdown\r\n $scope.predicate = 'dataPoint.description'; //sort triggers by datapoint\r\n $scope.reverse = true;\r\n\r\n $scope.showKMLabel = false;\r\n\r\n /** Public Functions */\r\n //Sort filteredTriggerList\r\n $scope.orderTriggersList = function(predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = true;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n //applyFilter searchs the triggers[] for anything matching the search input.\r\n $scope.applyFilter = function() {\r\n $scope.filteredTriggerList = $filter('filter')($scope.triggers, $scope.search.text);\r\n\r\n if ($scope.search.text !== '' && $scope.hasNewTrigger) {\r\n // This ensure that if the user has input some search criteria that the new trigger row will always show\r\n // first item in the list is always the new trigger\r\n $scope.filteredTriggerList = [$scope.triggers[0], ...$scope.filteredTriggerList];\r\n }\r\n };\r\n\r\n //Adds a new row to the triggers table\r\n $scope.addTrigger = function() {\r\n $scope.currentPage = 1;\r\n if (!$scope.hasNewTrigger) {\r\n $scope.showKMLabel = false;\r\n $scope.trigger = new TriggerView($scope.triggers.length + 1);\r\n $scope.triggers.unshift($scope.trigger);\r\n $scope.disableDataPointDropdown = false;\r\n $scope.hasNewTrigger = true;\r\n $scope.deleteTriggerFlag = false;\r\n $scope.descriptorVisible = false;\r\n }\r\n };\r\n\r\n //Trigger Form Validation - Checks the values of each editable control before submitting the form.\r\n $scope.checkIfString = function(data) {\r\n if (data === '' || data === null) {\r\n $scope.validationFlag = true;\r\n return gettextCatalog.getString('required');\r\n }\r\n };\r\n\r\n $scope.checkNumericalValue = function(data) {\r\n if (isNaN(data)) {\r\n return gettextCatalog.getString('invalid number');\r\n } else {\r\n return $scope.checkIfString(data);\r\n }\r\n };\r\n\r\n //Validate the duration input before saving the trigger model to make sure we have not exceeded 24hrs\r\n //Need to disable the cancel button to force the user to change the duration\r\n $scope.checkDurationValue = function(data, triggerForm) {\r\n let maxTime = {\r\n hours: 24,\r\n minutes: 1440,\r\n seconds: 86400,\r\n };\r\n let max = maxTime[triggerForm.$data.unitOfTime];\r\n if (isNaN(data)) {\r\n return gettextCatalog.getString('invalid number');\r\n } else if (data > max) {\r\n $scope.disableCancel = true;\r\n return gettextCatalog.getString('max limit ' + max);\r\n } else {\r\n $scope.disableCancel = false;\r\n return $scope.checkIfString(data);\r\n }\r\n };\r\n\r\n //Before saving a new trigger we want to check the triggers[] to prevent saving duplicate trigger conditons for the same event\r\n $scope.validateTrigger = function(trigger) {\r\n $scope.duplicateConditionFlag = false;\r\n $scope.deleteTriggerFlag = false;\r\n $scope.hasNewTrigger = false;\r\n\r\n //remove duplicate trigger from savedTriggers array\r\n for (let i = 0; i < $scope.savedTriggers.length; i++) {\r\n if (trigger.id && trigger.id === $scope.savedTriggers[i].id) {\r\n $scope.savedTriggers.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n //validate the datapoint and condition\r\n if ($scope.savedTriggers.length >= 1) {\r\n const sameTriggers = $scope.savedTriggers.filter(saved =>\r\n Util.isSameTriggers(trigger, saved),\r\n );\r\n if (sameTriggers.length > 0) {\r\n $scope.duplicateConditionFlag = true;\r\n $scope.hasNewTrigger = true;\r\n return 'Duplicate Condition';\r\n }\r\n }\r\n\r\n if ($scope.duplicateConditionFlag === false) {\r\n //push savedTrigger model\r\n $scope.savedTriggers.push(trigger);\r\n //reset trigger model\r\n $scope.trigger = {};\r\n //enable add trigger button\r\n $scope.hasNewTrigger = false;\r\n createTrigger(trigger);\r\n $scope.disableDataPointDropdown = true;\r\n }\r\n };\r\n\r\n vm.$onInit = () => {\r\n $scope.priorityOptions = options.priorityOptions;\r\n $scope.relationalSymbolsOptions = options.relationalSymbolsOptions;\r\n $scope.unitOfTimeOptions = options.unitOfTimeOptions;\r\n $scope.clearOptions = options.clearOptions;\r\n $scope.notifyOnReturnOptions = options.notifyOnReturnOptions;\r\n\r\n //create indexed objects for easy retrieve\r\n $scope.indexedPriorityOptions = options.indexedPriorityOptions;\r\n $scope.indexedRelationalSymbolsOptions = options.indexedRelationalSymbolsOptions;\r\n $scope.indexedUnitOfTimeOptions = options.indexedUnitOfTimeOptions;\r\n $scope.indexedClearOptions = options.indexedClearOptions;\r\n $scope.indexedNotifyOnReturnOptions = options.indexedNotifyOnReturnOptions;\r\n\r\n getConfigurationTriggersData();\r\n };\r\n\r\n //Remove all of the selected users\r\n $scope.removeTrigger = function(triggerId) {\r\n if ($scope.triggers && $scope.triggers.length !== 1) {\r\n configurationsService\r\n .deleteConfigurationTrigger(configurationId, triggerId)\r\n .then(function() {\r\n return configurationsService.getConfigurationById(configurationId);\r\n })\r\n .then(function(response) {\r\n if (!response) {\r\n return;\r\n }\r\n $scope.triggerData = Util.validateTriggersData(\r\n response.data.triggers.data,\r\n currentUser.visibleDatapoints,\r\n );\r\n displayTriggers();\r\n })\r\n .catch(function() {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving configuration information.',\r\n );\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function() {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n $scope.deleteTriggerFlag = true;\r\n }\r\n };\r\n\r\n $scope.cancelTrigger = function() {\r\n if ($scope.triggers.length > $scope.savedTriggers.length) {\r\n $scope.triggers.splice(0, 1);\r\n }\r\n $scope.hasNewTrigger = false;\r\n };\r\n\r\n $scope.sortComparator = function(v1, v2) {\r\n // This ensure that when sorting that the new trigger row is always the first in the list no matter which direction\r\n if (typeof v1.value === 'undefined') {\r\n return $scope.reverse ? 1 : -1;\r\n } else if (typeof v2.value === 'undefined') {\r\n return $scope.reverse ? -1 : 1;\r\n }\r\n\r\n return v1.index < v2.index ? -1 : 1;\r\n };\r\n\r\n /**\r\n * when selected of data point changes\r\n * dropdowns options in condition section should change\r\n */\r\n $scope.datapointSelected = function(data = {}, trigger = {}) {\r\n $scope.showKMLabel = data.id === 'speed' ? true : false;\r\n //Changes the dropdown options shown in the condition\r\n const datapointDescriptor = $scope.dataPointDescriptors.find(\r\n dsc => data.id && data.id === dsc.key,\r\n );\r\n if (\r\n datapointDescriptor &&\r\n datapointDescriptor.values &&\r\n Object.keys(datapointDescriptor.values).length > 0\r\n ) {\r\n $scope.relationalSymbolsOptions = options.relationalSymbolsOptions.filter(\r\n option => option.stateRelational,\r\n );\r\n trigger.valuesDescriptors = datapointDescriptor.values;\r\n } else {\r\n $scope.relationalSymbolsOptions = options.relationalSymbolsOptions;\r\n trigger.valuesDescriptors = undefined;\r\n }\r\n };\r\n /**\r\n * on edit the row\r\n * dropdowns options in condition section should reset to what suit data point\r\n */\r\n $scope.getDataPointInfoOnEdit = function(trigger) {\r\n $scope.cancelTrigger();\r\n $scope.showKMLabel = trigger.dataPoint.id === 'speed' ? true : false;\r\n if (trigger && trigger.valuesDescriptors) {\r\n $scope.relationalSymbolsOptions = options.relationalSymbolsOptions.filter(\r\n option => option.stateRelational,\r\n );\r\n } else {\r\n $scope.relationalSymbolsOptions = options.relationalSymbolsOptions;\r\n }\r\n };\r\n\r\n //Post new trigger to configuration\r\n function submitTrigger(newTrigger) {\r\n $scope.errorFlag = false;\r\n\r\n configurationsService\r\n .postConfigurationTrigger(configurationId, newTrigger)\r\n .then(function() {\r\n return configurationsService.getConfigurationById(configurationId);\r\n })\r\n .then(function(response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n $scope.triggerData = Util.validateTriggersData(\r\n response.data.triggers.data,\r\n currentUser.visibleDatapoints,\r\n );\r\n displayTriggers();\r\n })\r\n .catch(function() {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving configuration information.',\r\n );\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function() {\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n function displayTriggers() {\r\n $scope.triggers = [];\r\n $scope.savedTriggers = [];\r\n getDataPoints();\r\n\r\n //Take each property found in each trigger and make them readable to the user\r\n $scope.triggerData.forEach(apiTrigger => {\r\n //use sortedEvents as it has all visible data points after applying data point descriptor to it\r\n const dataPoint = $scope.sortedEvents.find(\r\n datapointEvent => apiTrigger.dataPoint === datapointEvent.id,\r\n );\r\n const datapointDescriptor = $scope.dataPointDescriptors.find(\r\n dsc => apiTrigger.dataPoint === dsc.key,\r\n );\r\n const trigger = Util.apiToTriggerView(apiTrigger, dataPoint, datapointDescriptor);\r\n $scope.triggers.push(trigger);\r\n $scope.savedTriggers.push(trigger);\r\n });\r\n\r\n $scope.filteredTriggerList = $scope.triggers.slice();\r\n $scope.applyFilter();\r\n $scope.hasNewTrigger = false;\r\n }\r\n\r\n //get list of datapoints to display in UI.\r\n function getDataPoints() {\r\n const copyVisibleDataPoints = cloneDeep(currentUser.visibleDatapoints);\r\n const dataPointDescriptors = $scope.dataPointDescriptors;\r\n\r\n let events = copyVisibleDataPoints.map(visibleDataPoint => {\r\n let foundDpdesc = dataPointDescriptors.find(dpdesc => dpdesc.key === visibleDataPoint.id);\r\n\r\n // Assign the value of visibleDatapoint.descriptor if a match is found. Else keep the original value\r\n visibleDataPoint.description =\r\n foundDpdesc && foundDpdesc.title ? foundDpdesc.title : visibleDataPoint.description;\r\n return visibleDataPoint;\r\n });\r\n\r\n events = ConfigurationFilterService.filterInvalidDatapoints(events);\r\n\r\n $scope.sortedEvents = orderBy(events, $scope.eventPropertyName);\r\n return $scope.sortedEvents;\r\n }\r\n\r\n function createTrigger(trigger) {\r\n const newTrigger = new ApiTrigger(trigger);\r\n\r\n if (newTrigger.id === $scope.triggers.length) {\r\n submitTrigger(newTrigger);\r\n } else {\r\n updateTrigger(trigger, newTrigger);\r\n }\r\n }\r\n\r\n function updateTrigger(trigger, newTrigger) {\r\n $scope.errorFlag = false;\r\n\r\n configurationsService\r\n .updateConfigurationTrigger(configurationId, trigger.id, newTrigger)\r\n .then(function() {\r\n return configurationsService.getConfigurationById(configurationId);\r\n })\r\n .then(function(response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n $scope.triggerData = Util.validateTriggersData(\r\n response.data.triggers.data,\r\n currentUser.visibleDatapoints,\r\n );\r\n displayTriggers();\r\n })\r\n .catch(function() {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving configuration information.',\r\n );\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function() {\r\n $scope.loading = false;\r\n });\r\n }\r\n\r\n function getConfigurationTriggersData() {\r\n if (configurationId) {\r\n $scope.loading = true;\r\n configurationsService\r\n .getConfigurationById(configurationId)\r\n .then(function(response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n $scope.triggerData = Util.validateTriggersData(\r\n response.data.triggers.data,\r\n currentUser.visibleDatapoints,\r\n );\r\n displayTriggers();\r\n })\r\n .catch(function(ex) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving configuration information.',\r\n );\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n })\r\n .finally(function() {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n $scope.loading = false;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = gettextCatalog.getString(\r\n 'Could not load page: no configuration Id provided.',\r\n );\r\n }\r\n }\r\n}\r\n","\r\n/* Controller Imports */\r\nimport AlertsCreateController from './create/create.controller';\r\nimport AlertsListController from './list/list.controller'; \r\nimport AlertsViewDeleteController from './delete-modal/delete.controller'; \r\nimport AlertsViewEditController from './view/details/view.controller'; \r\nimport AlertsViewPickAssetsController from './view/assets/assets.controller'; \r\nimport AlertsViewTriggersControllerCRUD from './view/triggers/triggers.controller'; \r\n\r\nconst alertsConfigModule = angular.module('app.configAlerts', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\" \r\n])\r\n/* Controllers */\r\n.controller('AlertsCreateController', AlertsCreateController)\r\n.controller('AlertsListController', AlertsListController)\r\n.controller('AlertsViewDeleteController', AlertsViewDeleteController)\r\n.controller('AlertsViewEditController', AlertsViewEditController)\r\n.controller('AlertsViewPickAssetsController', AlertsViewPickAssetsController)\r\n.controller('AlertsViewTriggersControllerCRUD', AlertsViewTriggersControllerCRUD);\r\n\r\nexport default alertsConfigModule.name;","export default function FaultsViewDeleteController(\r\n $scope,\r\n $uibModalInstance,\r\n configurationId,\r\n configurationName,\r\n $state,\r\n faultsService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n var vm = this;\r\n\r\n vm.configurationName = configurationName;\r\n vm.loading = false;\r\n vm.errorText = '';\r\n\r\n vm.ok = ok;\r\n vm.cancel = cancel;\r\n\r\n function ok() {\r\n vm.loading = true;\r\n vm.errorText = null;\r\n faultsService\r\n .deleteFaultConfig(configurationId)\r\n .then(function(response) {\r\n $uibModalInstance.close();\r\n $state.go('alerts.faults.list');\r\n })\r\n .catch(function(error) {\r\n vm.errorText = gettextCatalog.getString('An error occurred while deleting the configuration');\r\n })\r\n .finally(function() {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.close('cancel');\r\n }\r\n\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n cancel();\r\n });\r\n}\r\n","\r\nexport default function FaultsListDirective(gettextCatalog, $filter, faultsService) {\r\n\r\n 'ngInject';\r\n \r\n return {\r\n template: require('./list.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: { },\r\n controller: ListFaultConfigController,\r\n controllerAs: 'vm',\r\n bindToController: {\r\n faults: '='\r\n }\r\n };\r\n\r\n function ListFaultConfigController() {\r\n\r\n var vm = this;\r\n\r\n vm.configurations = [];\r\n vm.filteredConfigurations = [];\r\n vm.searchText = '';\r\n vm.errorFlag = false;\r\n vm.errorText = '';\r\n vm.loading = true;\r\n vm.onLoadErrorText = '';\r\n vm.onLoadErrorFlag = false;\r\n\r\n vm.pagination = {\r\n currentPage: 1,\r\n itemsPerPage: 15,\r\n maxSize: 1,\r\n startFrom: startFrom\r\n };\r\n\r\n //Sorting\r\n vm.predicate = 'name';\r\n vm.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n vm.orderConfigurations = orderConfigurations;\r\n vm.applyFilter = applyFilter;\r\n vm.resetFlags = resetFlags;\r\n\r\n function init() {\r\n getFaultConfiguration();\r\n };\r\n\r\n init();\r\n\r\n function getFaultConfiguration() {\r\n vm.onLoadErrorText = null;\r\n vm.loading = true;\r\n\r\n return faultsService.getAllFaultConfigs()\r\n .then(function (configurations) {\r\n vm.configurations = configurations.data;\r\n applyFilter();\r\n })\r\n .catch(function (error) {\r\n vm.onLoadErrorText = gettextCatalog.getString('An error occurred while retrieving configurations');\r\n })\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function orderConfigurations(predicate) {\r\n\r\n if (predicate === vm.predicate) {\r\n vm.reverse = !vm.reverse;\r\n }\r\n else {\r\n vm.reverse = true;\r\n }\r\n vm.predicate = predicate;\r\n }\r\n\r\n function applyFilter() {\r\n vm.filteredConfigurations = $filter('filter')(vm.configurations, vm.searchText);\r\n }\r\n\r\n //reset flags after user selects a new row\r\n function resetFlags() {\r\n vm.errorFlag = false;\r\n vm.errorText = '';\r\n }\r\n\r\n //Tracks the selected row.\r\n function setSelectedRow(configData) {\r\n vm.selectedRow = configData.name;\r\n resetFlags();\r\n }\r\n\r\n function startFrom() {\r\n return (vm.pagination.currentPage - 1) * vm.pagination.itemsPerPage;\r\n }\r\n }\r\n}\r\n","export default function FaultsViewEditAssetsDirective(\r\n $uibModal,\r\n $timeout,\r\n $stateParams,\r\n $filter,\r\n $rootScope,\r\n faultsService,\r\n equipmentRepository,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n return {\r\n template: require('./assets.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {},\r\n controller: EditFaultAssetsController,\r\n controllerAs: 'vm',\r\n bindToController: {\r\n assets: '='\r\n }\r\n };\r\n\r\n function EditFaultAssetsController() {\r\n let vm = this;\r\n let configurationId = $stateParams.configurationId;\r\n const resetFlags = () => {\r\n vm.errorFlag = false;\r\n vm.successFlag = false;\r\n vm.removeLastAssetMsgFlag = false;\r\n };\r\n\r\n vm.assets = [];\r\n vm.animationsEnabled = true;\r\n vm.configurationName = '';\r\n vm.equipmentByPage = [];\r\n vm.equipments = []; //list of equipments to send to the database\r\n vm.errorFlag = false;\r\n vm.errorText = '';\r\n vm.loading = true;\r\n vm.onLoadErrorFlag = false;\r\n vm.onLoadErrorText = '';\r\n vm.postRemoval = [];\r\n vm.removeLastAssetMsgFlag = false;\r\n vm.removeLastAssetMsg = gettextCatalog.getString('You must have at least one Asset per Configuration.');\r\n vm.removals = [];\r\n vm.searchText = '';\r\n vm.successFlag = false;\r\n //Sorting\r\n vm.predicate = 'name';\r\n vm.reverse = false;\r\n //Pagination\r\n vm.pagination = {\r\n currentPage: 1,\r\n itemsPerPage: 15,\r\n maxSize: 1,\r\n startFrom: startFrom\r\n };\r\n\r\n //Local Functions\r\n vm.initializeEquipments = initializeEquipments;\r\n vm.orderEquipmentList = orderEquipmentList;\r\n vm.toggleAnimation = toggleAnimation;\r\n vm.saveEquipments = saveEquipments;\r\n vm.toggleRemoval = toggleRemoval;\r\n vm.applyChange = applyChange;\r\n vm.openModal = openModal;\r\n\r\n //Sort filteredEquipmentList\r\n function orderEquipmentList(predicate) {\r\n if (predicate === vm.predicate) {\r\n vm.reverse = !vm.reverse;\r\n } else {\r\n vm.reverse = false;\r\n }\r\n vm.predicate = predicate;\r\n }\r\n\r\n function initializeEquipments() {\r\n let existingIds = {\r\n criteria: {\r\n ids: []\r\n }\r\n };\r\n vm.equipments = vm.equipmentData;\r\n\r\n for (let i = 0; i < vm.equipments.length; i++) {\r\n existingIds.criteria.ids.push(vm.equipments[i]);\r\n }\r\n if (existingIds.criteria.ids.length > 0) {\r\n equipmentRepository.postEquipmentListByIds(existingIds).then(\r\n function(response) {\r\n vm.loading = false;\r\n vm.equipments = response.data;\r\n vm.postRemoval = vm.equipments.slice();\r\n },\r\n function(error) {\r\n let errorMsg = gettextCatalog.getString('Unable to retrieve Asset information');\r\n vm.loading = false;\r\n vm.onLoadErrorText = errorMsg;\r\n vm.onLoadErrorFlag = true;\r\n }\r\n );\r\n } else {\r\n vm.loading = false;\r\n }\r\n }\r\n\r\n function init() {\r\n getConfigurationEquipmentData();\r\n }\r\n init();\r\n\r\n function getConfigurationEquipmentData() {\r\n if (vm.assets && vm.assets.length > 0) {\r\n vm.loading = true;\r\n vm.equipmentData = [];\r\n for (let j = 0; j < vm.assets.length; j++) {\r\n vm.equipmentData.push(vm.assets[j].id);\r\n }\r\n vm.initializeEquipments();\r\n } else if (configurationId) {\r\n faultsService\r\n .getConfigById(configurationId)\r\n .then(function(response) {\r\n if (!response) {\r\n return;\r\n }\r\n vm.configurationName = response.name;\r\n vm.equipmentData = [];\r\n for (let j = 0; j < response.equipment.length; j++) {\r\n vm.equipmentData.push(response.equipment[j]);\r\n }\r\n initializeEquipments();\r\n })\r\n .catch(function(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving configuration information.');\r\n vm.errorText = errorMsg;\r\n vm.errorFlag = true;\r\n })\r\n .finally(function() {\r\n vm.loading = false;\r\n });\r\n } else {\r\n vm.loading = false;\r\n vm.onLoadErrorFlag = true;\r\n vm.onLoadErrorText = gettextCatalog.getString('Could not load page: no configuration Id provided.');\r\n }\r\n }\r\n\r\n //Asset Picker - Add/Remove equipment to/from configuration\r\n function openModal(size) {\r\n let modalScope = $rootScope.$new();\r\n modalScope.modalTitle = 'Select Assets for Configuration: ' + vm.configurationName;\r\n resetFlags();\r\n let modalInstance = $uibModal.open({\r\n animation: vm.animationsEnabled,\r\n template: require('../../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n scope: modalScope,\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: () => 0,\r\n selectedAssets: () => {\r\n let selected = {};\r\n\r\n if (vm.equipments) {\r\n for (let equipment of vm.equipments) selected[equipment.id] = equipment;\r\n }\r\n return selected;\r\n }\r\n }\r\n });\r\n\r\n modalInstance.result.then(handleModalAssets);\r\n }\r\n\r\n const handleModalAssets = modalAssets => {\r\n let changeSet = [];\r\n let resultEquipmentList = [];\r\n\r\n if (modalAssets.added && Array.isArray(modalAssets.added)) {\r\n modalAssets.added.forEach(added => changeSet.push({equipId: added, op: 'add'}));\r\n }\r\n\r\n if (modalAssets.removed && Array.isArray(modalAssets.removed)) {\r\n modalAssets.removed.forEach(removed => changeSet.push({equipId: removed, op: 'remove'}));\r\n }\r\n\r\n for (let assetId in modalAssets.result) resultEquipmentList.push(modalAssets.result[assetId]);\r\n\r\n vm.saveEquipments(resultEquipmentList, changeSet);\r\n };\r\n\r\n function toggleAnimation() {\r\n vm.animationsEnabled = !vm.animationsEnabled;\r\n }\r\n\r\n function saveEquipments(newEquipmentList, changeset) {\r\n if (changeset.length === 0 || vm.sending) {\r\n return;\r\n }\r\n if (newEquipmentList.length === 0 || vm.equipments.length === newEquipmentList.length) {\r\n vm.removeLastAssetMsgFlag = true;\r\n return;\r\n }\r\n vm.errorFlag = false;\r\n let data = {\r\n changeset: changeset\r\n };\r\n vm.sending = true;\r\n\r\n faultsService.patchFaultConfigEquipment(configurationId, data).then(\r\n function(response) {\r\n if (newEquipmentList) {\r\n vm.equipments = newEquipmentList.slice();\r\n vm.postRemoval = vm.equipments.slice();\r\n }\r\n orderEquipmentList(vm.predicate, false);\r\n vm.successFlag = true;\r\n vm.sending = false;\r\n $timeout(function() {\r\n resetFlags();\r\n }, 2500);\r\n },\r\n function(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while editing Assets');\r\n vm.errorText = errorMsg;\r\n vm.errorFlag = true;\r\n vm.sending = false;\r\n }\r\n );\r\n return true;\r\n }\r\n\r\n function toggleRemoval(equip) {\r\n resetFlags();\r\n for (let i = 0; i < vm.postRemoval.length; i++) {\r\n if (vm.postRemoval[i].id === equip.id) {\r\n vm.postRemoval.splice(i, 1);\r\n applyChange(\r\n {\r\n op: 'remove',\r\n equipId: equip.id\r\n },\r\n vm.removals\r\n );\r\n return;\r\n }\r\n }\r\n //if we're toggling the checkbox off, put that equipment back into the post-removal list\r\n vm.postRemoval.push(equip);\r\n applyChange(\r\n {\r\n op: 'add',\r\n equipId: equip.id\r\n },\r\n vm.removals\r\n ); //will cancel out the 'remove' operation for that equip\r\n }\r\n\r\n function applyChange(newChange, changeset) {\r\n resetFlags();\r\n for (let i = 0; i < changeset.length; i++) {\r\n //handle behaviour when multiple changes requested for same resource\r\n if (changeset[i].equipId && changeset[i].equipId === newChange.equipId) {\r\n if (changeset[i].op === newChange.op) {\r\n //only apply one add or remove per resource\r\n } else {\r\n //if ops are different, changes will cancel out (ie. adding and removing a resource in the same request will have no net effect)\r\n changeset.splice(i, 1);\r\n }\r\n return;\r\n }\r\n changeset.push(newChange);\r\n }\r\n\r\n changeset.push(newChange);\r\n }\r\n\r\n function startFrom() {\r\n return (vm.pagination.currentPage - 1) * vm.pagination.itemsPerPage;\r\n }\r\n }\r\n}\r\n","export default function FaultsRepo($http, appSettings) {\r\n\r\n 'ngInject';\r\n\r\n var faultsEndpoint = appSettings.InReachApiAlertsEndpoint + '/configurations/faults';\r\n var configurationsEndpoint = appSettings.InReachApiAlertsEndpoint + '/configurations';\r\n\r\n this.postFaultConfiguration = function (fault) {\r\n var endpoint = faultsEndpoint;\r\n return $http.post(endpoint, fault);\r\n };\r\n\r\n this.getFaultConfigurationById = function (id) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.get(endPoint);\r\n };\r\n\r\n this.getFaultConfigurationByName = function (name) {\r\n var endPoint = faultsEndpoint + '/name/' + name;\r\n return $http.get(endPoint);\r\n };\r\n\r\n this.getAllFaultConfigurations = function () {\r\n var endpoint = faultsEndpoint;\r\n return $http.get(endpoint);\r\n };\r\n\r\n this.updateFaultConfiguration = function (id, data) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.put(endPoint, data);\r\n };\r\n\r\n this.deleteFaultConfiguration = function (id) {\r\n var endPoint = configurationsEndpoint + '/' + id;\r\n return $http.delete(endPoint);\r\n };\r\n\r\n this.patchFaultConfiguration = function (id, data) {\r\n var endpoint = configurationsEndpoint + '/' + id;\r\n\r\n return $http.patch(endpoint, data).then(function (response) {\r\n return response.data;\r\n }, function (error) {\r\n\r\n });\r\n };\r\n\r\n this.patchFaultConfigurationEquipment = function (id, data) {\r\n var endpoint = configurationsEndpoint + '/' + id + '/equipment';\r\n return $http.patch(endpoint, data);\r\n };\r\n\r\n this.postFault = function (id, fault) {\r\n var endpoint = faultsEndpoint + '/' + id + '/triggers';\r\n return $http.post(endpoint, fault);\r\n };\r\n\r\n this.deleteFault = function (configId, faultId) {\r\n var endpoint = configurationsEndpoint + '/' + configId + '/triggers/' + faultId;\r\n return $http.delete(endpoint);\r\n };\r\n\r\n this.updateFault = function (id, faultId, fault) {\r\n var endpoint = faultsEndpoint + '/' + id + '/triggers/' + faultId;\r\n return $http.put(endpoint, fault);\r\n };\r\n}","export default function FaultsService(faultsRepo, gettextCatalog) {\r\n 'ngInject';\r\n\r\n var faultEnums = {\r\n priority: {\r\n Low: {\r\n label: gettextCatalog.getString('Low'),\r\n value: 'Low',\r\n },\r\n Medium: {\r\n label: gettextCatalog.getString('Medium'),\r\n value: 'Medium',\r\n },\r\n High: {\r\n label: gettextCatalog.getString('High'),\r\n value: 'High',\r\n },\r\n },\r\n clear: {\r\n Immediately: {\r\n label: gettextCatalog.getString('Immediately'),\r\n value: 'Immediately',\r\n },\r\n OneDay: {\r\n label: gettextCatalog.getString('After 24hrs'),\r\n value: 'OneDay',\r\n },\r\n },\r\n notify: {\r\n true: {\r\n label: gettextCatalog.getString('Yes'),\r\n value: true,\r\n },\r\n false: {\r\n label: gettextCatalog.getString('No'),\r\n value: false,\r\n },\r\n },\r\n };\r\n\r\n const faultOptionLists = {\r\n priority: [faultEnums.priority.Low, faultEnums.priority.Medium, faultEnums.priority.High],\r\n clear: [faultEnums.clear.Immediately, faultEnums.clear.OneDay],\r\n notify: [faultEnums.notify.true, faultEnums.notify.false],\r\n };\r\n\r\n function createConfig(name, contacts, equipment, faults, brand) {\r\n var apiModel = createConfigApiModel(name, contacts, equipment, faults, brand);\r\n return faultsRepo.postFaultConfiguration(apiModel);\r\n }\r\n\r\n function getConfigById(configId) {\r\n return faultsRepo.getFaultConfigurationById(configId).then(function (configResponse) {\r\n return createConfigViewModel(configResponse);\r\n });\r\n }\r\n\r\n function getConfigByName(name) {\r\n return faultsRepo.getFaultConfigurationByName(name);\r\n }\r\n\r\n function getAllFaultConfigs() {\r\n return faultsRepo.getAllFaultConfigurations();\r\n }\r\n\r\n function updateFaultConfig(id, name, contacts, brand) {\r\n var config = {\r\n name,\r\n contacts: [],\r\n brand,\r\n };\r\n\r\n for (var i = 0; i < contacts.length; i++) {\r\n config.contacts.push(contacts[i].email);\r\n }\r\n return faultsRepo.patchFaultConfiguration(id, config);\r\n }\r\n\r\n function deleteFaultConfig(id) {\r\n return faultsRepo.deleteFaultConfiguration(id);\r\n }\r\n\r\n function deleteFault(configId, faultId) {\r\n return faultsRepo.deleteFault(configId, faultId);\r\n }\r\n\r\n function postFault(configurationId, newFault) {\r\n var trigger = createAPITrigger(newFault);\r\n\r\n return faultsRepo.postFault(configurationId, trigger);\r\n }\r\n\r\n function updateFault(configurationId, faultId, fault) {\r\n var trigger = createAPITrigger(fault);\r\n return faultsRepo.updateFault(configurationId, faultId, trigger).then(function (response) {\r\n return createViewTrigger(response.data);\r\n });\r\n }\r\n\r\n function patchFaultConfigEquipment(id, data) {\r\n return faultsRepo.patchFaultConfigurationEquipment(id, data);\r\n }\r\n\r\n function createConfigApiModel(name, contacts, equipment, faults, brand) {\r\n var configuration = {\r\n name,\r\n equipment: [],\r\n contacts: [],\r\n triggers: [],\r\n brand,\r\n };\r\n\r\n for (var i = 0; i < equipment.length; i++) {\r\n configuration.equipment.push(equipment[i].id);\r\n }\r\n\r\n for (var i = 0; i < contacts.length; i++) {\r\n configuration.contacts.push(contacts[i].email);\r\n }\r\n\r\n if (faults) {\r\n _.forEach(faults, function (f) {\r\n var trigger = createAPITrigger(f);\r\n configuration.triggers.push(trigger);\r\n });\r\n }\r\n\r\n return configuration;\r\n }\r\n\r\n function createAPITrigger(fault) {\r\n var trigger = {\r\n type: '',\r\n code: {},\r\n priority: '',\r\n autoClear: '',\r\n notifyOnReturn: '',\r\n };\r\n\r\n trigger.type = fault.type;\r\n trigger.code = fault.code;\r\n trigger.autoClear = fault.autoClear.value;\r\n trigger.notifyOnReturn = fault.notifyOnReturn.value;\r\n trigger.priority = fault.priority.value;\r\n return trigger;\r\n }\r\n\r\n function createConfigViewModel(configResponse) {\r\n var configuration = {\r\n name: '',\r\n contacts: [],\r\n equipment: [],\r\n triggers: [],\r\n };\r\n\r\n configuration.name = configResponse.data.name;\r\n\r\n for (var i = 0; i < configResponse.data.contacts.length; i++) {\r\n configuration.contacts.push(configResponse.data.contacts[i]);\r\n }\r\n\r\n for (var i = 0; i < configResponse.data.equipment.data.length; i++) {\r\n configuration.equipment.push(configResponse.data.equipment.data[i].id);\r\n }\r\n\r\n _.forEach(configResponse.data.triggers.data, function (t) {\r\n var trigger = createViewTrigger(t);\r\n configuration.triggers.push(trigger);\r\n });\r\n\r\n return configuration;\r\n }\r\n\r\n function createViewTrigger(fault) {\r\n var trigger = {\r\n id: '',\r\n type: '',\r\n code: {\r\n spn: '',\r\n fmi: '',\r\n source: '',\r\n },\r\n priority: '',\r\n autoClear: '',\r\n notifyOnReturn: '',\r\n };\r\n\r\n trigger.id = fault.id;\r\n trigger.type = fault.type;\r\n trigger.code.spn = parseInt(fault.code.spn);\r\n trigger.code.fmi = parseInt(fault.code.fmi);\r\n trigger.code.source = parseInt(fault.code.source);\r\n trigger.autoClear = faultEnums.clear[fault.autoClear];\r\n trigger.notifyOnReturn = faultEnums.notify[fault.notifyOnReturn];\r\n trigger.priority = faultEnums.priority[fault.priority];\r\n return trigger;\r\n }\r\n\r\n function getFaultOptions() {\r\n var faultOptions = {};\r\n faultOptions.priority = faultOptionLists.priority;\r\n faultOptions.clear = faultOptionLists.clear;\r\n faultOptions.notify = faultOptionLists.notify;\r\n return faultOptions;\r\n }\r\n\r\n return {\r\n createConfig: createConfig,\r\n createConfigApiModel: createConfigApiModel,\r\n createAPITrigger: createAPITrigger,\r\n getConfigById: getConfigById,\r\n getConfigByName: getConfigByName,\r\n getAllFaultConfigs: getAllFaultConfigs,\r\n updateFaultConfig: updateFaultConfig,\r\n deleteFaultConfig: deleteFaultConfig,\r\n postFault: postFault,\r\n deleteFault: deleteFault,\r\n updateFault: updateFault,\r\n patchFaultConfigEquipment: patchFaultConfigEquipment,\r\n getFaultOptions: getFaultOptions,\r\n };\r\n}\r\n","\r\n/* Controller Imports */\r\nimport FaultsViewDeleteController from './delete-modal/delete.controller'; \r\n/* Directive Imports */\r\nimport FaultsCreateDirective from './create/create.directive'; \r\nimport FaultsListDirective from './list/list.directive'; \r\nimport FaultsViewEditAssetsDirective from './view/assets/assets.directive'; \r\nimport FaultsViewEditDetailsDirective from './view/details/details.directive'; \r\nimport FaultsViewEditRowDirective from './view/faults/edit/edit.directive'; \r\nimport FaultsViewFaultsTabDirective from './view/faults/faults.directive'; \r\nimport FaultsViewRowDisplayDirective from './view/faults/view/view.directive'; \r\n/* Service Imports */\r\nimport FaultsRepo from './faults.repo'; \r\nimport FaultsService from './faults.service'; \r\n\r\nconst faultsConfigModule = angular.module('app.configFaults', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\"\r\n])\r\n/* Controllers */\r\n.controller('FaultsViewDeleteController', FaultsViewDeleteController)\r\n/* Directives */\r\n.directive('editFaultForm', FaultsViewEditRowDirective)\r\n.directive('faultTable', FaultsViewFaultsTabDirective)\r\n.directive('viewFaultForm', FaultsViewRowDisplayDirective)\r\n.directive('createFaultConfig', FaultsCreateDirective)\r\n.directive('editFaultAssets', FaultsViewEditAssetsDirective)\r\n.directive('editFaultConfig', FaultsViewEditDetailsDirective)\r\n.directive('listFaultConfig', FaultsListDirective)\r\n/* Services */\r\n.service('faultsRepo', FaultsRepo)\r\n.service('faultsService', FaultsService);\r\n\r\nexport default faultsConfigModule.name;","//import _ from 'lodash';\r\n\r\nexport default function FaultsViewEditRowDirective() {\r\n return {\r\n template: require('./edit.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {},\r\n controller: EditFaultFormController,\r\n controllerAs: 'vm',\r\n bindToController: {\r\n fault: '=',\r\n copiedFault: '=',\r\n isEditPage: '=',\r\n editFault: '&',\r\n deleteFault: '&',\r\n saveFault: '&',\r\n disableEditMode: '&',\r\n isDuplicate: '&',\r\n },\r\n };\r\n\r\n function EditFaultFormController($stateParams, faultsService) {\r\n 'ngInject';\r\n\r\n var vm = this;\r\n //var existingFault = {};\r\n //var configurationId = $stateParams.configurationId;\r\n vm.faultOptions = [];\r\n\r\n //Public Functions\r\n vm.cancelEdit = cancelEdit;\r\n vm.save = save;\r\n vm.removeIsDuplicateError = removeIsDuplicateError;\r\n vm.processing = false;\r\n\r\n function init() {\r\n //let existingFault = _.clone(vm.fault);\r\n vm.faultOptions = faultsService.getFaultOptions();\r\n }\r\n init();\r\n\r\n function cancelEdit() {\r\n if (vm.fault.isNew) {\r\n vm.deleteFault(vm.fault);\r\n } else {\r\n resetFault();\r\n vm.disableEditMode();\r\n }\r\n }\r\n\r\n function resetFault() {\r\n vm.fault.type = vm.copiedFault.type;\r\n vm.fault.code = vm.copiedFault.code;\r\n vm.fault.priority = vm.copiedFault.priority;\r\n vm.fault.autoClear = vm.copiedFault.autoClear;\r\n vm.fault.notifyOnReturn = vm.copiedFault.notifyOnReturn;\r\n }\r\n\r\n function removeIsDuplicateError() {\r\n vm.editForm.$setValidity('duplicate', true);\r\n vm.editForm.spn.$setValidity('duplicate', true);\r\n vm.editForm.fmi.$setValidity('duplicate', true);\r\n vm.editForm.source.$setValidity('duplicate', true);\r\n }\r\n\r\n function save() {\r\n vm.editForm.$submitted = true;\r\n\r\n if (vm.isDuplicate()) {\r\n vm.editForm.$setValidity('duplicate', false);\r\n vm.editForm.spn.$setValidity('duplicate', false);\r\n vm.editForm.fmi.$setValidity('duplicate', false);\r\n vm.editForm.source.$setValidity('duplicate', false);\r\n } else if (vm.editForm.$valid) {\r\n vm.processing = true;\r\n vm.saveFault().then(function () {\r\n vm.disableEditMode();\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","import _ from 'lodash';\r\nimport angular from 'angular';\r\n\r\nexport default function FaultsViewFaultsTabDirective() {\r\n return {\r\n template: require('./faults.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {},\r\n controller: FaultTableController,\r\n controllerAs: 'vm',\r\n bindToController: {\r\n faults: '=',\r\n editFault: '=?',\r\n copiedFault: '=?',\r\n },\r\n };\r\n\r\n function FaultTableController(gettextCatalog, $q, $timeout, $interval, $stateParams, faultsService) {\r\n\r\n 'ngInject';\r\n\r\n var vm = this;\r\n var configurationId;\r\n\r\n vm.newFault = 1;\r\n vm.duplicateFaultMsg = gettextCatalog.getString(\"Another fault already exists with the same spn, fmi, and source. These fields must be unique.\");\r\n vm.incompleteFaultMsg = gettextCatalog.getString(\"Please complete the fault or cancel it before trying to save the configuration.\");\r\n vm.noCompletedFaultsMsg = gettextCatalog.getString(\"You must have at least one fault saved before trying to create a configuration.\");\r\n vm.requiresFaultsFlag = false;\r\n vm.requiresFaultsMsg = gettextCatalog.getString(\"Unable to remove fault. You must have at least one fault.\");\r\n vm.pagination = {\r\n currentPage: 1,\r\n itemsPerPage: 15,\r\n maxSize: 1,\r\n startFrom: startFrom\r\n };\r\n vm.selectedFaultId = null;\r\n\r\n //Public Functions\r\n vm.setSelected = setSelected;\r\n vm.isEditMode = isEditMode;\r\n vm.changeEditFault = changeEditFault;\r\n vm.addFault = addFault;\r\n vm.deleteFault = deleteFault;\r\n vm.saveFault = saveFault;\r\n vm.disableEditMode = disableEditMode;\r\n vm.enableEditMode = enableEditMode;\r\n vm.isFaultInEditMode = isFaultInEditMode;\r\n vm.isDuplicate = isDuplicate;\r\n\r\n vm.init = function () {\r\n configurationId = $stateParams.configurationId;\r\n vm.isEditPage = $stateParams.isEditPage;\r\n $timeout(function () {\r\n if (!vm.isEditPage) {\r\n addFault();\r\n }\r\n });\r\n };\r\n vm.init();\r\n\r\n //Adds a new row to the faults table\r\n function addFault() {\r\n resetFaultValidation();\r\n var fault = {\r\n isNew: true,\r\n type: 'J1939',\r\n code: {\r\n spn: '',\r\n fmi: '',\r\n source: ''\r\n },\r\n priority: '',\r\n autoClear: '',\r\n notifyOnReturn: ''\r\n };\r\n vm.faults.unshift(fault);\r\n vm.enableEditMode(fault);\r\n if (vm.pagination.currentPage !== 1) {\r\n vm.pagination.currentPage = 1;\r\n }\r\n }\r\n\r\n function deleteFault(fault) {\r\n vm.faultsForm.$submitted = true;\r\n vm.errorText = null;\r\n if (vm.faults.length > 1 && configurationId && !fault.isNew) {\r\n var faultId = fault.id;\r\n faultsService.deleteFault(configurationId, faultId)\r\n .then(function (response) {\r\n if (!response) {\r\n return;\r\n }\r\n var faultIndex = vm.faults.indexOf(fault);\r\n vm.faults.splice(faultIndex, 1);\r\n vm.disableEditMode();\r\n })\r\n .catch(function () {\r\n vm.errorText = gettextCatalog.getString(\"An error occurred while retrieving configuration information.\");\r\n })\r\n .finally(function () {\r\n vm.loading = false;\r\n });\r\n } else if (vm.faults.length > 1) {\r\n var faultIndex = vm.faults.indexOf(fault);\r\n vm.faults.splice(faultIndex, 1);\r\n vm.disableEditMode();\r\n return true;\r\n } else {\r\n showRequiredFaultMsg();\r\n return false;\r\n }\r\n }\r\n\r\n function saveFault(newFault) {\r\n var deferred = $q.defer();\r\n vm.faultsForm.$submitted = true;\r\n resetFaultValidation();\r\n if (isDuplicate(newFault)) {\r\n deferred.reject();\r\n } else if (configurationId && newFault.id) {\r\n vm.updateError = null;\r\n return faultsService.updateFault(configurationId, newFault.id, newFault)\r\n .then(function () {\r\n deferred.resolve();\r\n })\r\n .catch(function () {\r\n vm.updateError = gettextCatalog.getString(\"Unable to update fault information.\");\r\n deferred.reject();\r\n });\r\n } else if (configurationId) {\r\n vm.postNewFaultError = null;\r\n if (newFault && newFault.isNew === true) {\r\n delete newFault['isNew'];\r\n }\r\n return faultsService.postFault(configurationId, newFault)\r\n .then(function (response) {\r\n if (!response) {\r\n return;\r\n } else {\r\n newFault['id'] = response.data.id;\r\n }\r\n })\r\n .catch(function () {\r\n vm.postNewFaultError = gettextCatalog.getString(\"Unable to save new fault to configuration.\");\r\n deferred.reject();\r\n });\r\n }\r\n //case where configuration doesnt yet exist so dont post to the server | create mode\r\n else {\r\n delete newFault['isNew'];\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n //Is anything being edited\r\n function isEditMode() {\r\n return vm.editFault !== null && vm.editFault !== undefined;\r\n }\r\n\r\n function isNotEditMode() {\r\n return !isEditMode();\r\n }\r\n\r\n function enableEditMode(fault) {\r\n resetFaultValidation();\r\n if (isNotEditMode()) {\r\n vm.editFault = fault;\r\n vm.copiedFault = { ...fault };\r\n }\r\n vm.faultsForm.$setValidity(\"edit\", false);\r\n vm.faultsForm.$$parentForm.$submitted = false;\r\n }\r\n\r\n function setSelected(selectedFaultId) {\r\n vm.selectedFaultId = selectedFaultId;\r\n }\r\n\r\n function disableEditMode() {\r\n vm.faultsForm.$setValidity(\"edit\", true);\r\n vm.editFault = null;\r\n }\r\n\r\n function isFaultInEditMode(fault) {\r\n return fault === vm.editFault;\r\n }\r\n\r\n function changeEditFault(fault) {\r\n vm.editFault = fault;\r\n }\r\n\r\n function resetFaultValidation() {\r\n vm.faultsForm.$submitted = false;\r\n }\r\n\r\n function showRequiredFaultMsg() {\r\n vm.requiresFaultsFlag = true;\r\n var intervalCanceller = $interval(function () {\r\n vm.requiresFaultsFlag = false;\r\n $interval.cancel(intervalCanceller);\r\n }, 3000);\r\n }\r\n\r\n function isDuplicate(faultToCheck) {\r\n var duplicate = false;\r\n _.forEach(vm.faults, function (fault) {\r\n if (faultToCheck !== fault &&\r\n fault.code.spn === faultToCheck.code.spn &&\r\n fault.code.fmi === faultToCheck.code.fmi &&\r\n fault.code.source === faultToCheck.code.source) {\r\n duplicate = true;\r\n }\r\n });\r\n return duplicate;\r\n }\r\n\r\n function startFrom() {\r\n return (vm.pagination.currentPage - 1) * vm.pagination.itemsPerPage;\r\n }\r\n }\r\n}","export default function FaultsViewRowDisplayDirective() {\r\n\r\n 'ngInject';\r\n\r\n return {\r\n template: require('./view.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {},\r\n controller: ViewFaultFormController,\r\n controllerAs: 'vm',\r\n bindToController: {\r\n fault: '=',\r\n isEditMode: '=',\r\n deleteFault: '&',\r\n enableEditMode: '&'\r\n }\r\n };\r\n\r\n function ViewFaultFormController() {\r\n var vm = this;\r\n }\r\n}","import Auth from '../../../../../auth'\r\n\r\nexport default function FaultsCreateDirective() {\r\n\treturn {\r\n\t\ttemplate: require('./create.html'),\r\n\t\ttransclude: true,\r\n\t\trestrict: 'E',\r\n\t\tscope: {},\r\n\t\tcontroller: CreateFaultConfigController,\r\n\t\tcontrollerAs: 'vm'\r\n\t};\r\n\r\n\tfunction CreateFaultConfigController(\r\n\t\t$scope,\r\n\t\t$timeout,\r\n\t\t$uibModal,\r\n\t\tgettextCatalog,\r\n\t\tfaultsService,\r\n\t\t$state\r\n\t) {\r\n\t\t'ngInject';\r\n\r\n\t\tvar vm = this;\r\n\r\n\t\tvm.faults = [];\r\n\t\tvm.name = '';\r\n\t\tvm.configurationId = {};\r\n\t\tvm.contactsList = [];\r\n\t\tvm.equipmentData = [];\r\n\t\tvm.param = {};\r\n\t\tvm.selectedEquipment = {};\r\n\t\tvm.errorFlag = false;\r\n\t\tvm.errorText = '';\r\n\r\n\t\tvm.numSelectedAssets = numSelectedAssets;\r\n\t\tvm.saveConfiguration = saveConfiguration;\r\n\t\tvm.selectAssetsButtonPressed = selectAssetsButtonPressed;\r\n\t\tinit();\r\n\r\n\t\tfunction init() {\r\n\t\t\t$timeout(function () {\r\n\t\t\t\tvm.createConfigurationForm.$setValidity(\r\n\t\t\t\t\t'assets',\r\n\t\t\t\t\tvm.equipmentData.length > 0\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t\t//the thing talks to multi-email directive\r\n\t\t\t$scope.$on('totalEmails', function (event, totalEmails) {\r\n\t\t\t\tvm.maxEmails = totalEmails.length;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//display the number of assets selected from the picker\r\n\t\tfunction numSelectedAssets() {\r\n\t\t\tif (!vm.param._selected || !vm.param) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\treturn Object.keys(vm.param._selected).length;\r\n\t\t}\r\n\r\n\t\t//Select Asset Modal\r\n\t\tfunction selectAssetsButtonPressed() {\r\n\t\t\tvar modalInstance = $uibModal.open({\r\n\t\t\t\tanimation: true,\r\n\t\t\t\ttemplate: require('../../../../../components/assetpicker/asset.multi.picker.html'),\r\n\t\t\t\tcontroller: 'AssetMultiPickerController',\r\n\t\t\t\tsize: 'lg',\r\n\t\t\t\tresolve: {\r\n\t\t\t\t\tsingleSelect: false,\r\n\t\t\t\t\trequiresSelection: true,\r\n\t\t\t\t\tmaxSelection: function () {\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t},\r\n\t\t\t\t\tselectedAssets: function () {\r\n\t\t\t\t\t\tvar selected = {};\r\n\r\n\t\t\t\t\t\tif (vm.equipmentData) {\r\n\t\t\t\t\t\t\tfor (var i = 0; i < vm.equipmentData.length; i++) {\r\n\t\t\t\t\t\t\t\tvar e = vm.equipmentData[i];\r\n\t\t\t\t\t\t\t\tselected[e.id] = e;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn selected;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tmodalInstance.result\r\n\t\t\t\t.then(function (selectedAssets) {\r\n\t\t\t\t\tvm.equipmentData = [];\r\n\t\t\t\t\tfor (var key in selectedAssets.result) {\r\n\t\t\t\t\t\tvm.equipmentData.push(selectedAssets.result[key]);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.finally(function () {\r\n\t\t\t\t\tvm.createConfigurationForm.$setValidity(\r\n\t\t\t\t\t\t'assets',\r\n\t\t\t\t\t\tvm.equipmentData.length > 0\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\t$scope.faultConfigurationExists = function () {\r\n\t\t\tvm.duplicateConfigName = false;\r\n\t\t\tfaultsService.getConfigByName(vm.name).then(function (response) {\r\n\t\t\t\tif (response.data.name === vm.name) {\r\n\t\t\t\t\tvm.duplicateConfigName = true;\r\n\t\t\t\t}\r\n\t\t\t}).catch(err => {\r\n\t\t\t\tif (404 != err.status)\r\n\t\t\t\t\tconsole.log(err)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//Validate the form on submission then run the API call\r\n\t\tfunction saveConfiguration() {\r\n\t\t\tif (vm.createConfigurationForm.$valid) {\r\n\t\t\t\t//Need to validate that all rows in the fault table are submitted and not in editmode\r\n\t\t\t\tvm.loading = true;\r\n\t\t\t\tvm.errorText = null;\r\n\t\t\t\tconst brand = Auth.getBrandClaim();\r\n\r\n\t\t\t\tfaultsService\r\n\t\t\t\t\t.createConfig(vm.name, vm.contactsList, vm.equipmentData, vm.faults, brand)\r\n\t\t\t\t\t.then(\r\n\t\t\t\t\t\tfunction (response) {\r\n\t\t\t\t\t\t\tvm.loading = false;\r\n\t\t\t\t\t\t\t$state.go('alerts.faults.edit', {\r\n\t\t\t\t\t\t\t\tconfigurationId: response.data.id\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tfunction (error) {\r\n\t\t\t\t\t\t\tvm.errorText = gettextCatalog.getString(\r\n\t\t\t\t\t\t\t\t'An error occurred while creating the Configuration'\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tvm.loading = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import angular from 'angular';\r\nimport Auth from '../../../../../../auth';\r\n\r\nexport default function FaultsViewEditDetailsDirective() {\r\n return {\r\n template: require('./details.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n scope: {},\r\n controller: EditFaultConfigController,\r\n controllerAs: 'vm',\r\n bindToController: {}\r\n };\r\n\r\n function EditFaultConfigController($scope, gettextCatalog, faultsService, $uibModal, $stateParams, $location) {\r\n\r\n 'ngInject';\r\n\r\n var vm = this;\r\n var configurationId = $stateParams.configurationId;\r\n\r\n vm.faults = [];\r\n vm.editFault = null;\r\n vm.copiedFault = null;\r\n vm.assets = [];\r\n vm.tabs = null;\r\n vm.loading = true;\r\n vm.isEditing = false;\r\n vm.editButtonClicked = null;\r\n vm.deleteButtonClicked = null;\r\n vm.configuration = {};\r\n vm.loading = true;\r\n vm.maxEmails = 10;\r\n vm.emailBackup = '';\r\n vm.nameBackup = '';\r\n vm.onLoadErrorFlag = false;\r\n vm.onLoadErrorText = '';\r\n\r\n //public methods\r\n vm.editButtonClicked = editButtonClicked;\r\n vm.deleteButtonClicked = deleteButtonClicked;\r\n vm.setTab = setTab;\r\n vm.isFormValid = isFormValid;\r\n\r\n function init() {\r\n if ($location.search().tab) {\r\n vm.tabs = $location.search().tab;\r\n } else {\r\n vm.tabs = 'faults';\r\n }\r\n getConfigurationById(configurationId).then(() => {\r\n //To let breadcrumbs directive know that the data for label has been loaded\r\n $scope.$emit('$viewContentLoaded');\r\n });\r\n //needed for the multi-email directivewhen tracking 'maxEmails\"\r\n $scope.$on('totalEmails', (event, totalEmails) => {\r\n vm.maxEmails = totalEmails.length;\r\n });\r\n }\r\n init();\r\n\r\n function getConfigurationById(configurationId) {\r\n vm.loading = true;\r\n vm.configErrorText = null;\r\n\r\n return faultsService\r\n .getConfigById(configurationId)\r\n .then((configuration) => {\r\n if (configuration) {\r\n vm.configuration = configuration;\r\n vm.assets = configuration.equipment;\r\n vm.faults = configuration.triggers;\r\n vm.loading = false;\r\n } else {\r\n vm.onLoadErrorFlag = true;\r\n vm.onLoadErrorText = gettextCatalog.getString('Unable to retrieve the configuration');\r\n vm.loading = false;\r\n }\r\n })\r\n .catch(() => {\r\n vm.configErrorText = gettextCatalog.getString('An error occurred while updating the configuration');\r\n })\r\n .finally(() => {\r\n vm.loading = false;\r\n vm.isEditing = false;\r\n });\r\n }\r\n\r\n function copyConfigData() {\r\n var contacts = [];\r\n for (var i = 0; i < vm.configuration.contacts.length; i++) {\r\n contacts.push({\r\n email: vm.configuration.contacts[i]\r\n });\r\n }\r\n vm.nameBackup = angular.copy(vm.configuration.name);\r\n vm.emailBackup = angular.copy(contacts);\r\n }\r\n\r\n //Switch to edit mode\r\n function editButtonClicked() {\r\n copyConfigData();\r\n vm.isEditing = !vm.isEditing;\r\n }\r\n\r\n function deleteButtonClicked() {\r\n $uibModal.open({\r\n animation: true,\r\n template: require('../../delete-modal/delete.html'),\r\n controller: 'FaultsViewDeleteController',\r\n controllerAs: 'vm',\r\n resolve: {\r\n configurationId: () => {\r\n return configurationId;\r\n },\r\n configurationName: () => {\r\n return vm.configuration.name;\r\n }\r\n },\r\n size: 'md'\r\n });\r\n }\r\n\r\n function isFormValid(editFaultConfigForm) {\r\n editFaultConfigForm.$setSubmitted();\r\n if (editFaultConfigForm.$invalid) {\r\n vm.loading = false;\r\n return;\r\n } else {\r\n submitEditFaultConfigForm();\r\n }\r\n }\r\n\r\n $scope.faultConfigurationExists = function () {\r\n vm.duplicateConfigName = false;\r\n faultsService.getConfigByName(vm.nameBackup).then(function (response) {\r\n if ((response.data.name === vm.nameBackup) && (response.data.id != configurationId)) {\r\n vm.duplicateConfigName = true;\r\n }\r\n }).catch(err => {\r\n if (404 != err.status)\r\n console.log(err)\r\n });\r\n }\r\n\r\n function submitEditFaultConfigForm() {\r\n vm.loading = true;\r\n vm.configErrorText = null;\r\n vm.isEditing = false;\r\n\r\n const brand = Auth.getBrandClaim();\r\n\r\n faultsService\r\n .updateFaultConfig($stateParams.configurationId, vm.nameBackup, vm.emailBackup, brand)\r\n .then((configuration) => {\r\n vm.configuration.name = configuration.name;\r\n vm.configuration.contacts = configuration.contacts;\r\n })\r\n .catch(() => {\r\n vm.configErrorText = gettextCatalog.getString('An error occurred while updating the configuration');\r\n })\r\n .finally(() => {\r\n vm.loading = false;\r\n vm.isEditing = false;\r\n });\r\n }\r\n\r\n function setTab(selectedTab) {\r\n vm.tabs = selectedTab;\r\n $location.search('tab', selectedTab);\r\n }\r\n }\r\n}","export default function GeozoneRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('alerts.geozone', {\r\n url: '/geozone',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'GeoZone®'}} {{'Configurations' | translate}}\"\r\n },\r\n redirectTo: 'alerts.geozone.list',\r\n helpModuleId: 'geozones',\r\n helpState: 'geozones.list',\r\n requiredFeatures: ['geozones']\r\n })\r\n .state('alerts.geozone.list', {\r\n url: '/',\r\n helpModuleId: 'geozones',\r\n helpState: 'geozones.list',\r\n template: require('./list/list.html'),\r\n controller: 'GeozonesListController',\r\n ncyBreadcrumb: {\r\n skip: true\r\n },\r\n requiredFeatures: ['geozones']\r\n })\r\n .state('alerts.geozone.details', {\r\n url: '/detail/:geozoneId',\r\n helpModuleId: 'geozones',\r\n helpState: 'geozones.details',\r\n template: require('./view/view.html'),\r\n controller: 'GeozonesViewTableController',\r\n ncyBreadcrumb: {\r\n label: '{{geozoneDetailsBreadcrumb}}'\r\n },\r\n requiredFeatures: ['geozones']\r\n })\r\n .state('alerts.geozone.create', {\r\n url: '/create',\r\n helpModuleId: 'geozones',\r\n helpState: 'geozones.create',\r\n template: require('./create/create.html'),\r\n controller: 'GeozonesCreateController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Create New' | translate}} {{'GeoZone®'}}\",\r\n parent: 'alerts'\r\n },\r\n requiredFeatures: ['geozones.manage']\r\n });\r\n}\r\n","import Auth from '../../../../../auth';\r\nimport multiPickerTemplate from '../../../../../components/assetpicker/asset.multi.picker.html';\r\n\r\nexport default function GeozonesCreateController(\r\n $window,\r\n $scope,\r\n $timeout,\r\n $uibModal,\r\n $state,\r\n equipmentGeozoneService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.numSelectedAsset = 0;\r\n $scope.selectedAsset = {};\r\n $scope.maxEmails = 10;\r\n $scope.errorOccured = false;\r\n $scope.existingGeozoneMsg = '';\r\n $scope.geozoneNameExists = false;\r\n $scope.geozoneRequired = false;\r\n $scope.sending = false;\r\n $scope.validNameCharacters = '[a-zA-Z0-9\\\\_\\\\-\\\\(\\\\) ]*';\r\n\r\n $scope.$on('totalEmails', function (event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n\r\n $scope.isFormValid = function (createGeoZoneForm) {\r\n createGeoZoneForm.$setSubmitted();\r\n $scope.geozoneRequired = $scope.geozone.geometry === '';\r\n\r\n if (createGeoZoneForm.$invalid) {\r\n $scope.loading = false;\r\n return;\r\n }\r\n $scope.submitGeozoneForm();\r\n };\r\n\r\n $scope.addAssetsButtonSelected = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: multiPickerTemplate,\r\n controller: 'AssetMultiPickerController',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: function () {\r\n return 0;\r\n },\r\n selectedAssets: function () {\r\n var selected = {};\r\n\r\n if ($scope.assets) {\r\n for (var i = 0; i < $scope.assets.length; i++) {\r\n var e = $scope.assets[i];\r\n selected[e.id] = e;\r\n }\r\n }\r\n return selected;\r\n },\r\n },\r\n size: 'lg',\r\n });\r\n modalInstance.result.then(\r\n function (selectedAssets) {\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n // Here you can take the control and call your own functions:\r\n event.preventDefault();\r\n });\r\n $scope.equipmentDict = selectedAssets.result;\r\n $scope.numSelectedAsset = Object.keys($scope.equipmentDict).length;\r\n for (var key in $scope.equipmentDict) {\r\n if ($scope.equipmentDict.hasOwnProperty(key)) {\r\n $scope.assets.push($scope.equipmentDict[key]);\r\n }\r\n }\r\n },\r\n function (error) {},\r\n );\r\n };\r\n\r\n $scope.assets = [];\r\n $scope.submitGeozoneForm = function () {\r\n $scope.errorOccured = false;\r\n $scope.geozoneRequired = false;\r\n if ($scope.tags.length > 0) {\r\n for (var i = 0; i < $scope.tags.length; i++) {\r\n $scope.geozone.tags.push($scope.tags[i].text.toLowerCase());\r\n }\r\n }\r\n // only post if form info is valid\r\n if ($scope.createGeoZoneForm.$valid == true) {\r\n if ($scope.geozone.alertRule.contacts.length <= $scope.maxEmails) {\r\n $scope.sending = true;\r\n equipmentGeozoneService.getGeozoneByName($scope.geozone.name).then(\r\n function (response) {\r\n $scope.sending = false;\r\n showGeoZoneNameError();\r\n },\r\n function (error) {\r\n if (error.status == 404) {\r\n saveNewGeozone();\r\n } else {\r\n $scope.sending = false;\r\n $scope.errorOccured = true;\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while creating the GeoZone',\r\n );\r\n if ((error.data || error.status) && !error.status == 404) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n }\r\n },\r\n );\r\n }\r\n }\r\n };\r\n\r\n function showGeoZoneNameError(response) {\r\n $scope.geozoneNameExists = true;\r\n $scope.existingGeozoneMsg = gettextCatalog.getString(\r\n \"The name '{{ gname}}' already exists. Please rename the GeoZone. \",\r\n {\r\n gname: $scope.geozone.name,\r\n },\r\n );\r\n }\r\n\r\n function saveNewGeozone() {\r\n $scope.geozoneNameExists = false;\r\n $scope.geozone.equipmentIds = Object.keys($scope.equipmentDict);\r\n equipmentGeozoneService.postNewEquipmentGeozone($scope.geozone).then(\r\n function (response) {\r\n $scope.sending = false;\r\n $timeout(function () {\r\n $state.go('alerts.geozone.details', {\r\n geozoneId: response.data.id,\r\n });\r\n }, 0);\r\n return;\r\n //return equipmentGeozoneService.addEquipmentInZone($scope.geozoneid, Object.keys($scope.equipmentDict));\r\n },\r\n function (error) {\r\n $scope.sending = false;\r\n $scope.errorOccured = true;\r\n var errorMsg = gettextCatalog.getString('An error occurred while creating the GeoZone');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorText = errorMsg;\r\n },\r\n );\r\n }\r\n\r\n var init = function () {\r\n //init the form\r\n $scope.tags = [];\r\n $scope.emails = null;\r\n //default geozone model\r\n $scope.geozone = {\r\n name: '',\r\n description: '',\r\n type: 'Exclusive', //default, no UI for this\r\n tags: [],\r\n attrs: {\r\n color: '#0c0', //default geozone color to green\r\n },\r\n geometry: '',\r\n alertRule: {\r\n contacts: [],\r\n priority: '',\r\n notifyOnActive: 'false', //default\r\n notifyOnReturn: 'false', //default\r\n autoclear: 'Immediately', //default, no UI for this\r\n brand: Auth.getBrandClaim(),\r\n },\r\n };\r\n $scope.geozone.alertRule.contacts = [];\r\n $scope.geozone.alertRule.notifyOnActive = false;\r\n $scope.geozone.alertRule.notifyOnReturn = false;\r\n $scope.geozoneRequired = false;\r\n };\r\n init();\r\n}\r\n","\r\nexport default function GeozoneDetailsEventController($scope, $stateParams, GeozoneService) {\r\n\r\n 'ngInject';\r\n \r\n var refresh = function () {\r\n GeozoneService.getGeozoneById($stateParams.geozoneId).then(function (response) {\r\n $scope.alertConfig = response.data.alertRule;\r\n $scope.loading = false;\r\n\r\n }, function () {\r\n\r\n });\r\n };\r\n\r\n refresh();\r\n}\r\n","import { _detect } from \"bowser\";\r\n\r\nexport default function GeozonesListController($scope, $filter, equipmentGeozoneService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n //Local Variables\r\n $scope.searchText = \"\";\r\n $scope.selectedRow = \"\";\r\n $scope.geozoneList = [];\r\n $scope.filteredGeozones = [];\r\n\r\n //Pagination\r\n $scope.currentPage = 1;\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 1;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n\r\n //Sort filteredAlertRules\r\n $scope.orderGeozones = function (predicate) {\r\n\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredGeozones = $filter('filter')($scope.geozoneList, $scope.searchText);\r\n };\r\n\r\n //Capture errors and display a message to the user below the form if errors exist\r\n $scope.errorFlag = false;\r\n $scope.errorText = \"\";\r\n $scope.loading = true;\r\n\r\n //reset flags after user selects a new row\r\n $scope.resetFlags = function () {\r\n $scope.errorFlag = false;\r\n $scope.errorText = \"\";\r\n };\r\n\r\n //Track the selected Group\r\n $scope.groupSelected = function (name) {\r\n $scope.selectedName = name;\r\n };\r\n\r\n //Tracks the selected row.\r\n $scope.setSelectedRow = function (name) {\r\n $scope.selectedRow = name;\r\n $scope.resetFlags();\r\n };\r\n\r\n //General Error Handler\r\n function handleError(error) {\r\n $scope.loading = false;\r\n\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving GeoZones\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n }\r\n\r\n $scope.loading = true;\r\n\r\n equipmentGeozoneService.getAllGeozones().then((response) => {\r\n $scope.geozoneList = [...response.data];\r\n\r\n $scope.loading = false;\r\n // Wrap this inside of the service call for getAllGeozones\r\n $scope.filteredGeozones = $scope.geozoneList.slice();\r\n $scope.loading = false;\r\n }, handleError);\r\n\r\n}","import _ from 'lodash';\r\n\r\nexport function GeozoneAssetDeleteModalController($scope, $uibModalInstance) {\r\n 'ngInject';\r\n\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.confirmed = false;\r\n $scope.ok = function() {\r\n $scope.confirmed = true;\r\n $uibModalInstance.close($scope.confirmed);\r\n };\r\n $scope.cancel = function() {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n}\r\n\r\nexport default function GeozonesViewTableAssetsModalController(\r\n $scope,\r\n $q,\r\n $filter,\r\n $uibModal,\r\n $stateParams,\r\n mapService,\r\n $state,\r\n equipmentGeozoneService,\r\n mobileService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.error = {};\r\n $scope.error.equipment = false;\r\n $scope.confirmed = false;\r\n $scope.assets = [];\r\n $scope.assetsByPage = [];\r\n $scope.filteredAssets = [];\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.loading = true;\r\n\r\n //Pagination\r\n $scope.current = {\r\n assetPage: 1,\r\n };\r\n $scope.itemsPerPage = 8;\r\n $scope.maxSize = 1;\r\n\r\n //displayUserRolesByPage() is used to set the legnth of paging needed for filteredUserRoles.\r\n $scope.displayAssetsByPage = function() {\r\n $scope.totalItems = $scope.filteredAssets.length;\r\n var begin = ($scope.current.assetPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.assetsByPage = $scope.filteredAssets.slice(begin, end);\r\n $scope.loading = false;\r\n };\r\n\r\n //Calls displayAssetsByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function() {\r\n $scope.displayAssetsByPage();\r\n };\r\n\r\n //applyFilter will search the assets[] for anything matching the search input.\r\n $scope.applyFilter = function() {\r\n $scope.filteredAssets = $filter('filter')($scope.assets, $scope.search.text);\r\n $scope.displayAssetsByPage();\r\n };\r\n\r\n //order() is used to sort the table based on it's column names, currently defaulted to the 'name' column.\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n $scope.order = function(predicate) {\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : true;\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.removeAssets = assetsToRemove => {\r\n const remove = equipmentGeozoneService.deleteEquipmentInZone(\r\n $stateParams.geozoneId,\r\n assetsToRemove,\r\n );\r\n\r\n return assetsToRemove && assetsToRemove.length > 0 ? remove : $q.resolve();\r\n };\r\n\r\n $scope.addAssets = assetsToAdd => {\r\n const add = equipmentGeozoneService.addEquipmentInZone($stateParams.geozoneId, assetsToAdd);\r\n\r\n return assetsToAdd && assetsToAdd.length > 0 ? add : $q.resolve();\r\n };\r\n\r\n $scope.isRemoveDisabled = function () { \r\n return $scope.assetsByPage.filter(function(asset){ return asset.isSelected;}).length == 0\r\n }\r\n\r\n $scope.RemoveEquipmentClicked = function() {\r\n if ($scope.assets) {\r\n $scope.deleteEquipmentList = [];\r\n for (var i = 0; i < $scope.assets.length; i++) {\r\n if ($scope.assets[i].isSelected === true) {\r\n $scope.deleteEquipmentList.push($scope.assets[i].id);\r\n }\r\n }\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.displayAssetsByPage();\r\n $scope.errorFlag = false;\r\n //if the to remove asset is the only one asset left, warn the user\r\n if (\r\n $scope.deleteEquipmentList.length > 0 &&\r\n $scope.deleteEquipmentList.length == $scope.assets.length &&\r\n !$scope.confirmed\r\n ) {\r\n $scope.error.equipment = true;\r\n $scope.error.Msg = gettextCatalog.getString(\r\n 'You must have at least one Asset per configuration.',\r\n );\r\n return;\r\n }\r\n\r\n updateEquipment([], $scope.deleteEquipmentList);\r\n }\r\n };\r\n\r\n var updateEquipment = function(added, removed) {\r\n $scope.errorFlag = false;\r\n $scope.loading = true;\r\n\r\n $scope\r\n .addAssets(added)\r\n .then(() => $scope.removeAssets(removed))\r\n .then(() => refresh())\r\n .catch(error => {\r\n var errorMsg = gettextCatalog.getString('An error occurred while updating GeoZone assets');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n })\r\n .finally(() => ($scope.loading = false));\r\n };\r\n\r\n $scope.AddAssetsClicked = function() {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../../../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: true,\r\n maxSelection: () => 0,\r\n selectedAssets: () => {\r\n return $scope.assets.reduce((acc, asset) => {\r\n acc[asset.id] = asset;\r\n return acc;\r\n }, {});\r\n },\r\n },\r\n size: 'lg',\r\n });\r\n modalInstance.result.then(\r\n function(selectedAssets) {\r\n $scope.$on('$locationChangeStart', function(event, next, current) {\r\n // Here you can take the control and call your own functions:\r\n event.preventDefault();\r\n });\r\n\r\n updateEquipment(selectedAssets.added, selectedAssets.removed);\r\n },\r\n function(error) {},\r\n );\r\n };\r\n\r\n $scope.assets = [];\r\n\r\n var refresh = function() {\r\n return equipmentGeozoneService.getEquipmentInZone($stateParams.geozoneId).then(\r\n function(response) {\r\n var result = response.data;\r\n $scope.assets = result;\r\n\r\n $scope.noData = $scope.assets.length === 0;\r\n\r\n $scope.filteredAssets = $scope.assets.slice();\r\n $scope.displayAssetsByPage();\r\n $scope.loading = false;\r\n },\r\n function(error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving GeoZone assets',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n },\r\n );\r\n };\r\n refresh();\r\n}\r\n","export default function GeozonesViewTableController(\r\n $scope,\r\n $stateParams,\r\n $uibModal,\r\n $state,\r\n equipmentGeozoneService,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.maxEmails = 10;\r\n $scope.geozoneDetailsBreadcrumb = '';\r\n $scope.existingGeozoneMsg = '';\r\n $scope.geozoneNameExists = false;\r\n $scope.validNameCharacters = '[a-zA-Z0-9\\\\_\\\\-\\\\(\\\\) ]*';\r\n\r\n $scope.$on('totalEmails', function (event, totalEmails) {\r\n $scope.maxEmails = totalEmails.length;\r\n });\r\n /**\r\n -- Edit/Cancel Button --\r\n */\r\n $scope.editButtonClicked = function (editing) {\r\n if (editing === true) {\r\n //Edit Button clicked, so store a copy of the data model\r\n $scope.backup = angular.copy($scope.geozone);\r\n $scope.editErrorFlag = false;\r\n $scope.editSuccessFlag = false;\r\n } else {\r\n //Cancelled, so copy data back\r\n $scope.geozone = $scope.backup;\r\n $scope.geozoneNameExists = false;\r\n }\r\n };\r\n\r\n /**\r\n -- Delete Button --\r\n */\r\n $scope.deleteButtonPressed = function () {\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('../delete-modal/delete.html'),\r\n controller: [\r\n '$scope',\r\n '$uibModalInstance',\r\n 'geozoneData',\r\n '$stateParams',\r\n 'equipmentGeozoneService',\r\n 'gettextCatalog',\r\n function (\r\n $scope,\r\n $uibModalInstance,\r\n geozoneData,\r\n $stateParams,\r\n equipmentGeozoneService,\r\n gettextCatalog,\r\n ) {\r\n $scope.geozone = geozoneData;\r\n\r\n $scope.ok = function () {\r\n $scope.deleting = true;\r\n equipmentGeozoneService.deleteEquipmentGeozone($stateParams.geozoneId).then(\r\n function (response) {\r\n $scope.deleting = false;\r\n $state.go('alerts.geozone.list');\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString(\r\n 'An error occurred while deleting the GeoZone',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.deleteErrorFlag = true;\r\n $scope.deleteErrorText = errorMsg;\r\n $scope.deleting = false;\r\n },\r\n );\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n });\r\n },\r\n ],\r\n resolve: {\r\n geozoneData: function () {\r\n return $scope.geozone;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n };\r\n\r\n $scope.isFormValid = function (geozoneDetailsForm) {\r\n $scope.geozoneDetailsForm.$setSubmitted();\r\n\r\n if (geozoneDetailsForm.$invalid || geozoneDetailsForm.$error.maxlength) {\r\n $scope.loading = false;\r\n\r\n return;\r\n }\r\n $scope.onGeozoneEdit('form');\r\n };\r\n\r\n /**\r\n -- Save Button --\r\n */\r\n $scope.onGeozoneEdit = function (source) {\r\n $scope.editErrorFlag = false;\r\n $scope.editSuccessFlag = false;\r\n equipmentGeozoneService.getGeozoneByName($scope.geozone.name).then(\r\n function (response) {\r\n $scope.sending = false;\r\n if (!$scope.backup) {\r\n $scope.backup = angular.copy($scope.geozone);\r\n }\r\n if ($scope.backup.name == response.data.name) {\r\n saveEditedGeozone(source);\r\n } else {\r\n showGeoZoneNameError();\r\n }\r\n },\r\n function (error) {\r\n //Expecting to see a 404(Not Found) here\r\n if (error.status == 404) {\r\n if (!$scope.backup) {\r\n $scope.backup = angular.copy($scope.geozone);\r\n }\r\n saveEditedGeozone(source);\r\n } else {\r\n var errorMsg = gettextCatalog.getString('An error occurred while editing the GeoZone');\r\n if ((error.data || error.status) && !response.status == 404) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.editErrorFlag = true;\r\n $scope.editErrorText = errorMsg;\r\n $scope.postingEdit = false;\r\n }\r\n },\r\n );\r\n };\r\n\r\n function showGeoZoneNameError() {\r\n $scope.geozoneNameExists = true;\r\n $scope.existingGeozoneMsg = gettextCatalog.getString(\r\n \"The name '{{ gname}}' already exists. Please rename the GeoZone. \",\r\n {\r\n gname: $scope.geozone.name,\r\n },\r\n );\r\n }\r\n\r\n function saveEditedGeozone(source) {\r\n $scope.geozoneNameExists = false;\r\n var toSubmit;\r\n if (source === 'map') {\r\n toSubmit = angular.copy($scope.backup);\r\n toSubmit.geometry = $scope.geozone.geometry;\r\n }\r\n if (source === 'form') {\r\n toSubmit = angular.copy($scope.geozone);\r\n toSubmit.geometry = $scope.backup.geometry;\r\n }\r\n var tags = toSubmit.tags;\r\n toSubmit.tags = [];\r\n for (var i = 0; i < tags.length; i++) {\r\n toSubmit.tags.push(tags[i].text);\r\n }\r\n if (toSubmit.alertRule.contacts.length <= $scope.maxEmails) {\r\n //A quick hack to make sure users can only input maximum 10 email addresses\r\n $scope.postingEdit = true;\r\n\r\n equipmentGeozoneService.putGeozoneById($stateParams.geozoneId, toSubmit).then(\r\n function (response) {\r\n if (source === 'map') {\r\n $scope.backup.geometry = $scope.geozone.geometry;\r\n }\r\n if (source === 'form') {\r\n $scope.isEditing = false;\r\n }\r\n $scope.editSuccessFlag = true;\r\n $scope.postingEdit = false;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while editing the GeoZone');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.editErrorFlag = true;\r\n $scope.editErrorText = errorMsg;\r\n $scope.postingEdit = false;\r\n },\r\n );\r\n }\r\n }\r\n\r\n var refresh = function () {\r\n $scope.loading = true;\r\n equipmentGeozoneService\r\n .getGeozoneById($stateParams.geozoneId)\r\n .then(\r\n function (response) {\r\n $scope.geozone = response.data;\r\n $scope.$emit('$viewContentLoaded'); //fix for breadcrumbs updating\r\n $scope.$broadcast('name-provided', {\r\n name: $scope.geozone.name ? $scope.geozone.name : null,\r\n });\r\n //set breadcrumb to the name of the geozone\r\n $scope.geozoneDetailsBreadcrumb = $scope.geozone.name;\r\n\r\n if ($scope.geozone.alertRule.contacts[0].email == '') {\r\n $scope.geozone.alertRule.contacts = [];\r\n }\r\n if ($scope.geozone.alertRule.priority) {\r\n $scope.geozone.alertRule.priority = $scope.geozone.alertRule.priority.toLowerCase();\r\n } else {\r\n $scope.geozone.alertRule.priority = '';\r\n }\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving the GeoZone');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + error.status.toString();\r\n } else {\r\n errorMsg += ': ' + error.status.toString();\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.onLoadErrorFlag = true;\r\n },\r\n )\r\n .finally(function (result) {\r\n $scope.loading = false;\r\n });\r\n };\r\n refresh();\r\n}\r\n","\r\nexport default function GeozoneDetailsLogController($scope, $filter, $stateParams, GeozoneService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.loading = true;\r\n $scope.geozoneName = \"\";\r\n\r\n $scope.$on(\"name-provided\", function (event, args) {\r\n if (!args.name) {\r\n $scope.geozoneName = $stateParams.geozoneId;\r\n } else {\r\n $scope.geozoneName = args.name;\r\n }\r\n\r\n });\r\n\r\n //Local Variables\r\n $scope.geozoneLogs = [];\r\n $scope.geozoneLogsByPage = [];\r\n $scope.filteredGeozoneLogs = [];\r\n\r\n\r\n //Pagination\r\n $scope.current = {\r\n geozoneLogPage: 1\r\n };\r\n $scope.itemsPerPage = 15;\r\n $scope.maxSize = 1;\r\n\r\n //Sorting\r\n $scope.predicate = 'timestamp';\r\n $scope.reverse = true;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredGeozoneLogs\r\n $scope.orderGeozoneLogs = function (predicate) {\r\n $scope.predicate = predicate;\r\n $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;\r\n\r\n angular.forEach($scope.filteredGeozoneLogs, function (entry) {\r\n entry[predicate] = entry[predicate];\r\n });\r\n $scope.filteredGeozoneLogs = orderBy($scope.filteredGeozoneLogs, predicate, $scope.reverse);\r\n $scope.displayGeozonesByPage();\r\n };\r\n\r\n //displayGeozonesByPage() is used to set the legnth of paging needed for filteredGeozoneLogs.\r\n $scope.displayGeozonesByPage = function () {\r\n $scope.totalItems = $scope.filteredGeozoneLogs.length;\r\n var begin = (($scope.current.geozoneLogPage - 1) * $scope.itemsPerPage);\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.geozoneLogsByPage = $scope.filteredGeozoneLogs.slice(begin, end);\r\n $scope.loading = false;\r\n };\r\n\r\n //Calls displayGeozonesByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function () {\r\n $scope.displayGeozonesByPage();\r\n };\r\n\r\n var refresh = function () {\r\n GeozoneService.log($stateParams.geozoneId).then(function (response) {\r\n $scope.geozoneLogs = response.data;\r\n $scope.filteredGeozoneLogs = $scope.geozoneLogs;\r\n $scope.orderGeozoneLogs('timestamp', false);\r\n $scope.displayGeozonesByPage();\r\n $scope.loading = false;\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving GeoZone log data\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n refresh();\r\n\r\n $scope.getCsvFileName = function () {\r\n\r\n var fileName = \"\";\r\n fileName += $scope.geozoneName + \"_Log_\" + new Date().toDateString();\r\n return fileName + \".csv\";\r\n };\r\n\r\n $scope.getCsvData = function () {\r\n\r\n var columnArray = []; //array of rows\r\n var headerArray = [];\r\n headerArray.push('Date/Time');\r\n headerArray.push('Asset');\r\n headerArray.push('Event');\r\n\r\n columnArray.push(headerArray);\r\n\r\n for (var i = 0; i < $scope.geozoneLogs.length; i++) {\r\n\r\n var rowArray = []; //represents list of values for one row\r\n rowArray.push($scope.geozoneLogs[i].timestamp);\r\n rowArray.push($scope.geozoneLogs[i].equipment.name);\r\n rowArray.push($scope.geozoneLogs[i].event);\r\n\r\n\r\n columnArray.push(rowArray);\r\n }\r\n\r\n return columnArray;\r\n };\r\n}\r\n","/* Config Imports */\r\nimport GeozoneRouteConfig from './geozones.route'; \r\n/* Controller Imports */ \r\nimport GeozonesCreateController from './create/create.controller'; \r\nimport GeozoneDetailsEventController from './geozone.details.event.controller'; /* Unclear controller/html purpose. */ \r\nimport GeozonesListController from './list/list.controller'; \r\nimport GeozonesViewDeleteController from './delete-modal/delete.controller'; \r\nimport GeozonesViewTableAssetsModalController, { GeozoneAssetDeleteModalController } from './view/assets/assets.controller'; \r\nimport GeozonesViewTableController from './view/view.controller'; \r\nimport GeozonesViewTableLogController from './view/logz/log.controller'; \r\n/* Directive Imports */ \r\nimport GeozonesViewTableMapDirective from './view/map/map.directive'; \r\n \r\nconst geozonesConfigModule = angular.module('app.configGeozones', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\"\r\n])\r\n/* Config */\r\n.config(GeozoneRouteConfig)\r\n/* Default Controllers */\r\n.controller('GeozonesCreateController', GeozonesCreateController)\r\n.controller('GeozoneDetailsEventController', GeozoneDetailsEventController)\r\n.controller('GeozonesListController', GeozonesListController)\r\n.controller('GeozonesViewDeleteController', GeozonesViewDeleteController)\r\n.controller('GeozonesViewTableController', GeozonesViewTableController)\r\n.controller('GeozonesViewTableAssetsModalController', GeozonesViewTableAssetsModalController)\r\n.controller('GeozonesViewTableLogController', GeozonesViewTableLogController)\r\n/* Named Controllers */\r\n.controller('geozoneAssetDeleteModalController', GeozoneAssetDeleteModalController)\r\n/* Directives */\r\n.directive('geozoneMap', GeozonesViewTableMapDirective);\r\n\r\nexport default geozonesConfigModule.name;","export default function GeozonesViewDeleteController() {\r\n\r\n 'ngInject';\r\n\r\n}","import { Observable, interval } from 'rxjs';\r\nimport { debounce, switchMap } from 'rxjs/operators';\r\nimport { fromPromise } from 'rxjs/internal-compatibility';\r\n\r\nexport default function GeozonesViewTableMapDirective() {\r\n function GeozoneMapController(\r\n $scope,\r\n mapService,\r\n equipmentRepository,\r\n $rootScope,\r\n gettextCatalog,\r\n ) {\r\n 'ngInject';\r\n\r\n const self = this;\r\n\r\n const defineMarkerFeature = function (feature, latlng) {\r\n const result = mapService.defineMarkerFeature(feature, latlng, $scope);\r\n\r\n return result;\r\n };\r\n\r\n const getPinsWithinBounds = () => {\r\n // Make an api call to the equipment api within the current bounds!\r\n const lastBounds = self.map.getBounds();\r\n const bounds = {\r\n nw: {\r\n lat: lastBounds._northEast.lat,\r\n lng: lastBounds._southWest.lng,\r\n },\r\n se: {\r\n lat: lastBounds._southWest.lat,\r\n lng: lastBounds._northEast.lng,\r\n },\r\n };\r\n\r\n return fromPromise(\r\n equipmentRepository.getEquipmentSearch('*', { limit: 2500 }, null, bounds),\r\n );\r\n };\r\n\r\n const showPinsWithinBounds = (response) => {\r\n // clear marker layer\r\n markersLayer.clearLayers();\r\n markersLayer.addLayer(\r\n L.geoJson(mapService.getEquipmentGeoJson(response.data.hits), {\r\n pointToLayer: defineMarkerFeature,\r\n }),\r\n );\r\n\r\n // zoom to the results of the search\r\n if (self.map !== undefined) {\r\n self.map.invalidateSize(true);\r\n }\r\n };\r\n\r\n let refreshPins = null;\r\n // Observable for refresh pin events, set a debounce timer to reduce number of calls to server\r\n new Observable((subscriber) => {\r\n refreshPins = () => subscriber.next();\r\n })\r\n .pipe(\r\n debounce(() => interval(500)),\r\n switchMap(getPinsWithinBounds),\r\n )\r\n .subscribe(showPinsWithinBounds);\r\n\r\n self.map = mapService.createMapDiv('geozones-map');\r\n // hold the features drawn on the map\r\n self.map.setView([40, -74.5], 3); // Zoom out of new york\r\n\r\n self.map.scrollWheelZoom.disable();\r\n\r\n var markersLayer = L.markerClusterGroup({\r\n maxClusterRadius: 60,\r\n iconCreateFunction: mapService.defineClusterIcon, // this is where the magic happens for graph icons.\r\n });\r\n\r\n self.map.addLayer(markersLayer);\r\n\r\n const overLays = mapService.getControlLayer();\r\n\r\n const assetTooltip = gettextCatalog.getString('Assets');\r\n overLays.addOverlay(markersLayer, assetTooltip);\r\n\r\n const featureGroup = L.featureGroup().addTo(self.map);\r\n\r\n self.map.on('moveend', function (e) {\r\n refreshPins();\r\n });\r\n // $('.leaflet-draw-toolbar leaflet-bar leaflet-draw-toolbar-top').remove('.leaflet-draw-draw-circlemarker');\r\n let options = {};\r\n let drawControl = {};\r\n\r\n if ($rootScope.currentUser.features) {\r\n for (let i = 0; i < $rootScope.currentUser.features.length; i++) {\r\n if ($rootScope.currentUser.features[i].path === 'geozones.manage') {\r\n // drawLocal's must be before L.control.draw or they won't work\r\n const shapeTools = {\r\n actions: {\r\n title: gettextCatalog.getString('Cancel drawing'),\r\n text: gettextCatalog.getString('Cancel'),\r\n },\r\n finish: {\r\n title: gettextCatalog.getString('Finish drawing'),\r\n text: gettextCatalog.getString('Finish'),\r\n },\r\n undo: {\r\n title: gettextCatalog.getString('Delete last point drawn'),\r\n text: gettextCatalog.getString('Delete last point'),\r\n },\r\n buttons: {\r\n polygon: gettextCatalog.getString('Draw a polygon'),\r\n rectangle: gettextCatalog.getString('Draw a rectangle'),\r\n },\r\n };\r\n L.drawLocal.draw.toolbar = shapeTools;\r\n\r\n const polygonHandles = {\r\n tooltip: {\r\n start: gettextCatalog.getString('Click to start drawing shape.'),\r\n cont: gettextCatalog.getString('Click to continue drawing shape.'),\r\n end: gettextCatalog.getString('Click first point to close this shape.'),\r\n },\r\n };\r\n L.drawLocal.draw.handlers.polygon = polygonHandles;\r\n const rectangleHandles = {\r\n tooltip: {\r\n start: gettextCatalog.getString('Click and drag to draw rectangle.'),\r\n },\r\n };\r\n L.drawLocal.draw.handlers.rectangle = rectangleHandles;\r\n\r\n const editTools = {\r\n actions: {\r\n save: {\r\n title: gettextCatalog.getString('Save changes.'),\r\n text: gettextCatalog.getString('Save'),\r\n },\r\n cancel: {\r\n title: gettextCatalog.getString('Cancel editing, discards all changes.'),\r\n text: gettextCatalog.getString('Cancel'),\r\n },\r\n },\r\n buttons: {\r\n edit: gettextCatalog.getString('Edit layers.'),\r\n editDisabled: gettextCatalog.getString('No layers to edit.'),\r\n remove: gettextCatalog.getString('Delete layers.'),\r\n removeDisabled: gettextCatalog.getString('No layers to delete.'),\r\n },\r\n };\r\n L.drawLocal.edit.toolbar = editTools;\r\n\r\n const editHandlers = {\r\n edit: {\r\n tooltip: {\r\n text: gettextCatalog.getString('Drag handles, or marker to edit feature.'),\r\n subtext: gettextCatalog.getString('Click cancel to undo changes.'),\r\n },\r\n },\r\n remove: {\r\n tooltip: {\r\n text: gettextCatalog.getString('Click on a feature to remove'),\r\n },\r\n },\r\n };\r\n L.drawLocal.edit.handlers = editHandlers;\r\n\r\n options = {\r\n edit: {\r\n featureGroup,\r\n edit: true,\r\n remove: false,\r\n },\r\n draw: {\r\n polygon: {\r\n allowIntersection: false,\r\n showArea: true,\r\n metric: false,\r\n drawError: {\r\n color: '#e1e100', // Color the shape will turn when intersects\r\n message: gettextCatalog.getString('Intersecting shapes not allowed!'), // Message that will show when intersect\r\n },\r\n shapeOptions: {\r\n color: '#1990bf',\r\n },\r\n icon: new L.DivIcon({\r\n iconSize: new L.Point(15, 15),\r\n className: 'leaflet-div-icon leaflet-editing-icon',\r\n }),\r\n },\r\n polyline: false,\r\n rectangle: {\r\n metric: false,\r\n shapeOptions: {\r\n color: '#1990bf',\r\n },\r\n icon: new L.DivIcon({\r\n iconSize: new L.Point(15, 15),\r\n className: 'leaflet-div-icon leaflet-editing-icon',\r\n }),\r\n },\r\n circle: false,\r\n marker: false,\r\n },\r\n };\r\n\r\n // Add controls for drawing polygons\r\n drawControl = new L.Control.Draw(options).addTo(self.map);\r\n\r\n L.Edit.PolyVerticesEdit = L.Edit.PolyVerticesEdit.extend({\r\n options: {\r\n icon: new L.DivIcon({\r\n iconSize: new L.Point(15, 15),\r\n className: 'leaflet-div-icon leaflet-editing-icon',\r\n }),\r\n },\r\n });\r\n\r\n break;\r\n }\r\n }\r\n } // if\r\n\r\n // show editing and created polygons\r\n self.map.on('draw:created', showPolygonArea);\r\n self.map.on('draw:edited', showPolygonAreaEdited);\r\n // listen to the draw deleted event\r\n self.map.on('draw:deleted', function (e) {\r\n $scope.geometry = '';\r\n });\r\n\r\n // drawing start/stop events\r\n self.map.on('draw:drawstart', drawingStarted);\r\n self.map.on('draw:drawstop', drawingStopped);\r\n\r\n /**\r\n \t -- Drawing Started --\r\n \t A map event that the user has started drawing on the map\r\n */\r\n function drawingStarted(e) {\r\n // drawing started, so disable panning and zooming\r\n // Otherwise, the map moves around while trying to draw\r\n self.map.touchZoom.disable();\r\n self.map.doubleClickZoom.disable();\r\n self.map.dragging.disable();\r\n }\r\n\r\n /**\r\n -- Drawing Started --\r\n A map event that the user has stopped drawing on the map\r\n */\r\n function drawingStopped(e) {\r\n // drawing stopped, so re-enable panning and zooming\r\n self.map.touchZoom.enable();\r\n self.map.doubleClickZoom.enable();\r\n self.map.dragging.enable();\r\n }\r\n\r\n function showPolygonAreaEdited(e) {\r\n // Call some binded function to let the parent controller known its been edited\r\n e.layers.eachLayer(function (layer) {\r\n if (layer == 'circle') {\r\n // must have been a circle\r\n\r\n showCircleArea({\r\n layer,\r\n });\r\n } else {\r\n showPolygonArea({\r\n layer,\r\n });\r\n }\r\n });\r\n }\r\n\r\n function showCircleArea(e) {\r\n // clear layer before adding a new one\r\n featureGroup.clearLayers();\r\n\r\n // add feature to the layer\r\n featureGroup.addLayer(e.layer);\r\n }\r\n\r\n // editing complete, so show polygon\r\n // in specified color\r\n function showPolygonArea(e) {\r\n if (e.layer == 'circle') {\r\n } else {\r\n // clear layer before adding a new one\r\n featureGroup.clearLayers();\r\n\r\n // add feature to the layer\r\n featureGroup.addLayer(e.layer);\r\n\r\n // store feature as geoJSON\r\n const feat = e.layer.toGeoJSON();\r\n\r\n // store WKT in data model\r\n const geometry = wellknown.stringify(feat);\r\n\r\n $scope.geometry = geometry;\r\n $scope.$apply();\r\n $scope.onEdit();\r\n }\r\n }\r\n\r\n $scope.$watch('geometry', function (newVal) {\r\n if ($scope.geometry) {\r\n updateGeozone();\r\n }\r\n });\r\n\r\n function updateGeozone() {\r\n featureGroup.clearLayers();\r\n const geoJsonGeometry = wellknown.parse($scope.geometry);\r\n\r\n if (geoJsonGeometry) {\r\n const latLngs = []; // L.latLng(lat, lng) objects\r\n\r\n angular.forEach(geoJsonGeometry.coordinates[0], function (val) {\r\n latLngs.push(L.latLng(val[1], val[0]));\r\n });\r\n\r\n const polygon = L.polygon(latLngs, {\r\n color: '#1990bf',\r\n });\r\n\r\n polygon.addTo(featureGroup);\r\n self.map.fitBounds(featureGroup.getBounds());\r\n }\r\n }\r\n\r\n refreshPins();\r\n\r\n $('.leaflet-draw-draw-circlemarker').remove();\r\n }\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n geometry: '=',\r\n onEdit: '&',\r\n },\r\n template: require('./map.html'),\r\n controller: GeozoneMapController,\r\n };\r\n}\r\n","/* Module Imports */\r\nimport alertsConfigModule from './alerts/alerts.module';\r\nimport faultsConfigModule from './faults/faults.module';\r\nimport geozonesConfigModule from './geozones/geozones.module';\r\n\r\n/* Specific Imports */\r\nimport ConfigurationFilterService from './filter.utility'; // ConfigurationUtilityService\r\n\r\nconst configurationsModule = angular.module('app.configurations', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\",\r\n alertsConfigModule,\r\n faultsConfigModule,\r\n geozonesConfigModule\r\n])\r\n.service(\"ConfigurationFilterService\", ConfigurationFilterService);\r\n\r\nexport default configurationsModule.name;","\r\nexport default function ConfigurationFilterService() {\r\n\r\n 'ngInject';\r\n\r\n var _invalidDataPointIds = ['gps'];\r\n\r\n return {\r\n\r\n /** \r\n * Filter datapoints that should not be displayed on the UI, based on the id.\r\n * @param {Array} visibleDataPoints Datapoints to filter\r\n * @param {Array} [invalidDataPointIds] Ids that should be filtered from the final list. If not provided, \r\n * a default list is used.\r\n */\r\n filterInvalidDatapoints: function (visibleDataPoints, invalidDataPointIds) {\r\n var invalidIds = invalidDataPointIds || _invalidDataPointIds;\r\n\r\n return _.filter(visibleDataPoints, function (dataPoint) {\r\n return _.indexOf(invalidIds, dataPoint.id) === -1;\r\n });\r\n }\r\n\r\n };\r\n}\r\n","import App from '../../../app'\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Alerts\";\r\n/**\r\n * @deprecated Use alerts-board component\r\n */\r\nexport default function DashboardMainPageController(\r\n $scope,\r\n $rootScope,\r\n AlertsService,\r\n $filter,\r\n EquipmentService,\r\n gettextCatalog,\r\n gettext,\r\n) {\r\n 'ngInject';\r\n\r\n $scope.alerts = [];\r\n $scope.alertsByPage = [];\r\n $scope.filteredAlerts = [];\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n var userEmail = '';\r\n $scope.currentUser = $rootScope.currentUser;\r\n var datapointDescriptors = $rootScope.datapointDescriptors;\r\n\r\n //variable use to refresh map\r\n $scope.alertGetCleared = false;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n var orderBy = $filter('orderBy');\r\n\r\n //Sort filteredAlerts\r\n $scope.orderAlerts = function (predicate, reverse) {\r\n $scope.predicate = predicate;\r\n $scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;\r\n\r\n angular.forEach($scope.filteredAlerts, function (alert) {\r\n alert[predicate] = alert[predicate];\r\n });\r\n $scope.filteredAlerts = orderBy($scope.filteredAlerts, predicate, $scope.reverse);\r\n $scope.displayAlertsByPage();\r\n };\r\n\r\n this.$onInit = () => {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n\r\n //Pagination\r\n $scope.maxSize = 1;\r\n $scope.current = {\r\n alertPage: 1,\r\n };\r\n $scope.itemsPerPage = 5;\r\n\r\n // to extract alert status to po file for translation\r\n gettext('Acknowledged');\r\n gettext('Cleared');\r\n gettext('Closed'); // used in equipment alert tab\r\n gettext('Active');\r\n\r\n //displayAlertsByPage() is used to set the legnth of paging needed for AlertsDashboard.\r\n $scope.displayAlertsByPage = function () {\r\n $scope.totalItems = $scope.filteredAlerts.length;\r\n var begin = ($scope.current.alertPage - 1) * $scope.itemsPerPage;\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.alertsByPage = $scope.filteredAlerts.slice(begin, end);\r\n };\r\n\r\n //Calls displayALertsByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function () {\r\n $scope.displayAlertsByPage();\r\n };\r\n\r\n //applyFilter searchs the alerts[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredAlerts = $filter('filter')($scope.alerts, $scope.search.text);\r\n $scope.displayAlertsByPage();\r\n };\r\n\r\n $scope.select = function (index) {\r\n $scope.index = index;\r\n };\r\n\r\n //CSV file\r\n $scope.getCsvFileName = function () {\r\n if (!$scope.alertsByPage) return '';\r\n\r\n var fileName = gettextCatalog.getString('data_export');\r\n var name = gettextCatalog.getString('Active_Alerts');\r\n fileName += '.' + name;\r\n return fileName + '.csv';\r\n };\r\n\r\n $scope.getCsvData = function () {\r\n var CsvData = [];\r\n\r\n var headers = {\r\n Priority: 'Priority',\r\n 'Time Active': 'Time Active',\r\n Asset: 'Asset',\r\n AlertName: 'AlertName',\r\n AlertEvent: 'AlertEvent',\r\n Status: 'Status',\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n for (var i = 0; i < $scope.alerts.length; i++) {\r\n var priority = $scope.alerts[i].priority;\r\n var activeTimeOfAlert = $filter('TableDateFilter')($scope.alerts[i].timestamp);\r\n var equipment = $scope.alerts[i].equipment.name;\r\n var alertName = $scope.alerts[i].name;\r\n var alertEvent = $scope.alerts[i].series.tags[0];\r\n var status = $scope.alerts[i].status;\r\n\r\n var csvObject = {\r\n Priority: priority,\r\n 'Time Active': activeTimeOfAlert,\r\n Asset: equipment,\r\n AlertName: alertName,\r\n AlertEvent: alertEvent,\r\n Status: status,\r\n };\r\n\r\n CsvData.push(csvObject);\r\n }\r\n return CsvData;\r\n };\r\n}\r\n","export default function DashboardNotesModalController($scope, $uibModalInstance, alert, alertsRepository, usersService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.alert = alert;\r\n $scope.editing = {};\r\n $scope.editNote = {};\r\n $scope.loading = true;\r\n $scope.creatingnote = false;\r\n $scope.postingChange = false;\r\n var userEmail = \"\";\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n $scope.close = function () {\r\n alert.noteCount = $scope.notes.length;\r\n $uibModalInstance.close(alert);\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n $scope.toggleEditing = function (note) {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.editNote.text = note.text;\r\n };\r\n\r\n $scope.cancelEdit = function (note) {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.editNote.text = \"\";\r\n };\r\n\r\n //C.R.U.D Methods for Notes\r\n $scope.getAlertNotes = function (alert) {\r\n $scope.loading = true;\r\n alertsRepository.getNotes(alert.instanceId)\r\n .then(function (response) {\r\n\r\n var data = response.data;\r\n for (var i = 0; i < data.length; i++) {\r\n var date = moment(data[i].updatedAt).fromNow();\r\n\r\n data[i].date = date;\r\n data[i]._editable = usersService.currentUser().id == data[i].noteUserId;\r\n }\r\n\r\n $scope.notes = data;\r\n\r\n $scope.loading = false;\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving alert notes\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n });\r\n }; //getAlertNotes\r\n\r\n $scope.getAlertNotes($scope.alert);\r\n\r\n $scope.createNewNote = function (noteText) {\r\n $scope.creatingnote = true;\r\n var note = {};\r\n\r\n userEmail = usersService.currentUser().email;\r\n\r\n note[\"instanceId\"] = alert.instanceId;\r\n note[\"text\"] = noteText;\r\n note[\"enteredBy\"] = userEmail;\r\n note[\"updatedBy\"] = userEmail;\r\n\r\n alertsRepository.createNote(note.instanceId, note).then(function () {\r\n $scope.getAlertNotes($scope.alert);\r\n $scope.creatingnote = false;\r\n $scope.newNote.text = \"\";\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while creating the note\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.creatingnote = false;\r\n });\r\n };\r\n\r\n $scope.updateNote = function (alertId, noteId, note) {\r\n if ($scope.editNote.text != \"\") {\r\n userEmail = usersService.currentUser().email;\r\n\r\n note.updatedBy = userEmail;\r\n note.text = $scope.editNote.text;\r\n $scope.postingChange = true;\r\n\r\n alertsRepository.updateNote(alertId, noteId, note)\r\n .then(function (response) {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.postingChange = false;\r\n\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while updating the note\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.postingChange = false;\r\n });\r\n } else {\r\n $scope.isInvalidData = true;\r\n }\r\n\r\n }; //update note\r\n\r\n $scope.deleteNote = function (alertId, noteId) {\r\n alertsRepository.deleteNote(alertId, noteId)\r\n .then(function (response) {\r\n $scope.getAlertNotes($scope.alert);\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while deleting the note\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n });\r\n };\r\n}","export default function AlertsTableController($uibModal, $filter) {\r\n 'ngInject';\r\n\r\n let vm = this;\r\n\r\n vm.orderAlertsCol = orderAlertsCol;\r\n vm.open = open;\r\n vm.pageChanged = pageChanged;\r\n vm.applyFilter = applyFilter;\r\n vm.calluUpdateAlert = calluUpdateAlert;\r\n\r\n vm.reverse = true;\r\n vm.filteredAlerts = [];\r\n vm.displayAssetLink = true;\r\n\r\n let orderBy = $filter('orderBy');\r\n\r\n //Pagination\r\n vm.maxSize = 1;\r\n vm.current = {\r\n alertPage: 1,\r\n };\r\n vm.itemsPerPage = 8;\r\n\r\n vm.$onInit = () => {\r\n if (window.location.href.includes('/assets/detail/')) {\r\n vm.displayAssetLink = false;\r\n }\r\n };\r\n\r\n vm.$onChanges = function (event) {\r\n if (event.alerts) {\r\n vm.alerts = event.alerts.currentValue;\r\n applyFilter();\r\n } else if (event.search) {\r\n if (event.search.text) {\r\n vm.search = event.search.currentValue;\r\n applyFilter();\r\n }\r\n } else if (event.loading) {\r\n vm.loading = event.loading.currentValue;\r\n }\r\n };\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n function calluUpdateAlert(state, singleAlert) {\r\n vm.updateAlert({\r\n state: state,\r\n singleAlert: singleAlert,\r\n });\r\n displayAlertsByPage();\r\n }\r\n\r\n //Calls displayALertsByPage(), everytime the the user changes the page.\r\n function pageChanged() {\r\n displayAlertsByPage();\r\n }\r\n\r\n //applyFilter searchs the alerts[] for anything matching the search input.\r\n function applyFilter() {\r\n if (vm.alerts !== undefined) {\r\n vm.filteredAlerts = $filter('filter')(vm.alerts, vm.search.text);\r\n vm.changeFirstLoad();\r\n orderAlertsCol(vm.predicate, true);\r\n }\r\n }\r\n\r\n function displayAlertsByPage() {\r\n vm.totalItems = vm.filteredAlerts.length;\r\n let begin = (vm.current.alertPage - 1) * vm.itemsPerPage;\r\n let end = begin + vm.itemsPerPage;\r\n vm.alertsByPage = vm.filteredAlerts.slice(begin, end);\r\n }\r\n\r\n //Sort alerts in the html by clicking the header, has to use scope reverse\r\n function orderAlertsCol(predicate, onLoad) {\r\n if (!onLoad) {\r\n vm.reverse = vm.predicate === predicate ? !vm.reverse : false;\r\n\r\n addToDataLayer({\r\n event: 'alertsSorting',\r\n data: {\r\n sortBy: predicate,\r\n order: vm.reverse ? 'desc' : 'asc',\r\n },\r\n });\r\n }\r\n\r\n vm.predicate = predicate;\r\n vm.updatePredicate({\r\n predicate: vm.predicate,\r\n });\r\n angular.forEach(vm.filteredAlerts, function (alert) {\r\n alert[predicate] = alert[predicate];\r\n });\r\n if (predicate === 'priority') {\r\n // priority should not sort alphabetically ( e.g.; High, Low, Medium), so use custom sort\r\n vm.filteredAlerts.sort(function (a, b) {\r\n if (!vm.reverse) {\r\n return priorityCustomOrder(a) > priorityCustomOrder(b) ? 1 : -1;\r\n } else {\r\n return priorityCustomOrder(b) > priorityCustomOrder(a) ? 1 : -1;\r\n }\r\n });\r\n } else {\r\n // sort alphabetically\r\n vm.filteredAlerts = orderBy(vm.filteredAlerts, predicate, vm.reverse);\r\n }\r\n\r\n displayAlertsByPage();\r\n }\r\n\r\n //open a modal\r\n function open(alert) {\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./notes-modal/note.html'),\r\n controller: 'DashboardNotesModalController',\r\n size: 'md',\r\n windowClass: 'tr-alerts-note-modal-dismiss',\r\n resolve: {\r\n alert: function () {\r\n return alert;\r\n }, //optional, to pass any items to modal\r\n },\r\n });\r\n\r\n vm.addAlertsInteraction(alert, 'notes');\r\n }\r\n\r\n function priorityCustomOrder(alert) {\r\n switch (alert.priority) {\r\n case 'Low':\r\n return 1;\r\n case 'Medium':\r\n return 2;\r\n case 'High':\r\n return 3;\r\n }\r\n return -1;\r\n }\r\n}\r\n","import AlertsTableController from './list.controller';\r\n\r\nconst DashboardAlertsListComponent = {\r\n template: require('./list.html'),\r\n bindings: {\r\n equipmentId: '<',\r\n predicate: '<',\r\n alerts: '<',\r\n search: '<',\r\n loading: '<',\r\n updateAlert: '&',\r\n updatePredicate: '&',\r\n changeFirstLoad: '&',\r\n addAlertsInteraction: '<',\r\n },\r\n controllerAs: 'vm',\r\n controller: AlertsTableController,\r\n};\r\n\r\nexport default DashboardAlertsListComponent;\r\n","export default function AlertDashboardChartController(\r\n $scope,\r\n AlertsService,\r\n gettextCatalog,\r\n usersService,\r\n) {\r\n 'ngInject';\r\n\r\n var drawDonutChart = function (numOne, numTwo, perc, color1, color2, percDivId, chartid) {\r\n if (numOne === 0 && numTwo === 0) {\r\n numTwo = 100;\r\n }\r\n\r\n var width = 100;\r\n var height = 100;\r\n var radius = 50;\r\n var donutWidth = 10;\r\n\r\n var svg = d3\r\n .select('#' + chartid)\r\n .append('svg')\r\n .attr('style', 'margin-left:auto; margin-right:auto; display:block;')\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n var g = svg.append('g').attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');\r\n\r\n var text = g\r\n .append('text')\r\n .attr('text-anchor', 'middle')\r\n .attr('style', 'font-size:2.0em;')\r\n .attr('dy', '0.5em');\r\n\r\n text.text('' + perc + '%');\r\n\r\n var arc = d3.svg\r\n .arc()\r\n .innerRadius(radius - donutWidth) // UPDATED\r\n .outerRadius(radius);\r\n\r\n var pie = d3.layout\r\n .pie()\r\n .value(function (d) {\r\n return d.count;\r\n })\r\n .sort(null);\r\n\r\n var dataset = [\r\n {\r\n product: 'High',\r\n count: numOne,\r\n color: color1,\r\n },\r\n {\r\n product: 'Not High',\r\n count: numTwo,\r\n empty: true,\r\n color: color2,\r\n },\r\n ];\r\n\r\n var slices = pie(dataset);\r\n\r\n var path = g\r\n .selectAll('path')\r\n .data(slices)\r\n .enter()\r\n .append('path')\r\n .attr('class', 'slice')\r\n .attr('d', arc)\r\n .attr('fill', function (d, i) {\r\n return d.data.color;\r\n });\r\n };\r\n\r\n //Low Priority Chart\r\n var drawLowPriorityChart = function () {\r\n var lowPriorityCount = $scope.lowPriorityNum;\r\n var others = $scope.highPriorityNum + $scope.mediumPriorityNum;\r\n var lowPrioritypercentage = $scope.lowPriorityPerc;\r\n\r\n drawDonutChart(\r\n lowPriorityCount,\r\n others,\r\n lowPrioritypercentage,\r\n '#1990BF',\r\n '#BDBDBD',\r\n '#cnt',\r\n 'donutChartLowPriority',\r\n );\r\n };\r\n\r\n var drawMediumPriorityChart = function () {\r\n var mediumPriorityCount = $scope.mediumPriorityNum;\r\n var others = $scope.lowPriorityNum + $scope.highPriorityNum;\r\n var mediumPrioritypercentage = $scope.mediumPriorityPerc;\r\n\r\n drawDonutChart(\r\n mediumPriorityCount,\r\n others,\r\n mediumPrioritypercentage,\r\n '#FFB74D',\r\n '#BDBDBD',\r\n '#cntMedium',\r\n 'donutChartMediumPriority',\r\n );\r\n };\r\n\r\n var drawHighPriorityChart = function () {\r\n var highPriorityCount = $scope.highPriorityNum;\r\n var others = $scope.lowPriorityNum + $scope.mediumPriorityNum;\r\n var highPrioritypercentage = $scope.highPriorityPerc;\r\n\r\n drawDonutChart(\r\n highPriorityCount,\r\n others,\r\n highPrioritypercentage,\r\n '#EF5350',\r\n '#BDBDBD',\r\n '#cntHigh',\r\n 'donutChartHighPriority',\r\n );\r\n };\r\n\r\n $scope.loadingChart = true;\r\n //ON INIT\r\n var refresh = function () {\r\n AlertsService.getAllAlerts().then(\r\n function (response) {\r\n let currentUser = usersService.currentUser();\r\n let visibleDatapoints = {};\r\n currentUser.visibleDatapoints.forEach((dp) => {\r\n visibleDatapoints[dp.id] = dp;\r\n });\r\n\r\n $scope.highPriorityNum = 0;\r\n $scope.mediumPriorityNum = 0;\r\n $scope.lowPriorityNum = 0;\r\n let total = 0;\r\n response.data.forEach((item) => {\r\n if (visibleDatapoints[item.series.tags[0]]) {\r\n if (item.priority.toLowerCase() === 'low') $scope.lowPriorityNum++;\r\n else if (item.priority.toLowerCase() === 'medium') $scope.mediumPriorityNum++;\r\n else if (item.priority.toLowerCase() === 'high') $scope.highPriorityNum++;\r\n total++;\r\n }\r\n });\r\n\r\n $scope.lowPriorityPerc = Math.round(($scope.lowPriorityNum / total) * 100);\r\n $scope.mediumPriorityPerc = Math.round(($scope.mediumPriorityNum / total) * 100);\r\n $scope.highPriorityPerc = Math.round(($scope.highPriorityNum / total) * 100);\r\n\r\n if (\r\n angular.element('#donutChartLowPriority').length &&\r\n angular.element('#donutChartMediumPriority').length &&\r\n angular.element('#donutChartHighPriority').length\r\n ) {\r\n drawLowPriorityChart();\r\n drawMediumPriorityChart();\r\n drawHighPriorityChart();\r\n }\r\n $scope.loadingChart = false;\r\n },\r\n function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while generating alert charts');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.loadingChart = false;\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n );\r\n };\r\n\r\n refresh();\r\n\r\n $scope.$watch('alertGetCleared', function (newValue, oldValue) {\r\n if (newValue != oldValue) {\r\n refresh();\r\n }\r\n });\r\n}\r\n","import AlertDashboardChartController from './chart.controller';\r\n\r\nconst DashboardChartComponent = {\r\n template: require('./chart.html'),\r\n restrict: 'E',\r\n controller: AlertDashboardChartController\r\n};\r\n\r\nexport default DashboardChartComponent;","export default function DashboardFiltersAndExportDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./header.html'),\r\n bindToController: {\r\n equipmentId: '<',\r\n refreshing: '<',\r\n onClearAlert: '&',\r\n },\r\n controllerAs: 'vm',\r\n controller: AlertsBoardController,\r\n };\r\n}\r\n\r\nfunction AlertsBoardController(\r\n AlertsService,\r\n usersService,\r\n gettextCatalog,\r\n gettext,\r\n EquipmentService,\r\n $filter,\r\n $state,\r\n) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n //Button arrays\r\n vm.priorityOptions = [\r\n {\r\n name: gettextCatalog.getString('All Priorities'),\r\n queryName: 'All Priorities',\r\n state: false,\r\n icon: '',\r\n },\r\n {\r\n name: gettextCatalog.getString('Low'),\r\n queryName: 'Low',\r\n state: false,\r\n icon: 'fa fa-exclamation-circle color-low-priority',\r\n },\r\n {\r\n name: gettextCatalog.getString('Medium'),\r\n queryName: 'Medium',\r\n state: false,\r\n icon: 'fa fa-exclamation-circle color-medium-priority',\r\n },\r\n {\r\n name: gettextCatalog.getString('High'),\r\n queryName: 'High',\r\n state: false,\r\n icon: 'fa fa-exclamation-circle color-high-priority',\r\n },\r\n ];\r\n vm.statusOptions = [\r\n {\r\n name: gettextCatalog.getString('All Statuses'),\r\n queryName: 'All Statuses',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Returned'),\r\n queryName: 'Returned',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Acknowledged'),\r\n queryName: 'Acknowledged',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Active'),\r\n queryName: 'Active',\r\n state: false,\r\n },\r\n ];\r\n vm.alertOptions = [\r\n {\r\n name: gettextCatalog.getString('All Types'),\r\n queryName: 'All Types',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Alerts'),\r\n queryName: 'Alerts',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Faults'),\r\n queryName: 'Faults',\r\n state: false,\r\n },\r\n {\r\n name: gettextCatalog.getString('Geozones'),\r\n queryName: 'Geozones',\r\n state: false,\r\n },\r\n ];\r\n vm.originalSearchText = '';\r\n\r\n //Public function declarations\r\n vm.setAlertsBtnGroup = setAlertsBtnGroup;\r\n vm.setPrioritiesBtnGroup = setPrioritiesBtnGroup;\r\n vm.setStatusBtnGroup = setStatusBtnGroup;\r\n vm.updateAlert = updateAlert;\r\n vm.getCsvFileName = getCsvFileName;\r\n vm.getCsvData = getCsvData;\r\n vm.changeFirstLoad = changeFirstLoad;\r\n vm.applyFilter = applyFilter;\r\n vm.updatePredicate = updatePredicate;\r\n\r\n //Public variables\r\n vm.search = {\r\n text: '',\r\n };\r\n vm.predicate = 'timestamp';\r\n vm.dataExist = false;\r\n vm.loading = false;\r\n\r\n //Private variables\r\n let alertFilter = 'any';\r\n let priorityFilter = 'any';\r\n let statusFilter = 'any';\r\n let orderBy = $filter('orderBy');\r\n let firstLoad = true;\r\n let currentUser = usersService.currentUser();\r\n\r\n vm.$onInit = () => {\r\n refresh();\r\n };\r\n vm.$onChanges = (changes) => {\r\n if (changes.refreshing.currentValue === true) {\r\n refresh();\r\n }\r\n };\r\n //Public functions\r\n function applyFilter() {\r\n vm.filteredAlerts = $filter('filter')(vm.alerts, vm.search.text);\r\n }\r\n\r\n vm.triggerAlertsKeywordFiltering = () => {\r\n if (vm.search.text !== '' && vm.originalSearchText !== vm.search.text) {\r\n addToDataLayer({\r\n event: 'alertsKeywordFiltering',\r\n data: {\r\n keyword: vm.search.text,\r\n total: vm.filteredAlerts.length,\r\n page: $state.current.name,\r\n },\r\n });\r\n }\r\n\r\n vm.originalSearchText = vm.search.text;\r\n };\r\n\r\n function changeFirstLoad() {\r\n firstLoad = false;\r\n }\r\n\r\n function setBtnGroup(option, optionsArray, optionsFilter) {\r\n const alertArray = [];\r\n const allAlertsBtn = optionsArray[0];\r\n if (option === allAlertsBtn.name) {\r\n optionsArray[0].state = !allAlertsBtn.state; // toggle all btn\r\n for (var alert in optionsArray) optionsArray[alert].state = allAlertsBtn.state; // toggle group\r\n } else {\r\n if (allAlertsBtn.state) optionsArray[0].state = false; // if non-all btn clicked all == false\r\n for (var alert in optionsArray) {\r\n if (optionsArray[alert].queryName === option)\r\n optionsArray[alert].state = !optionsArray[alert].state; // toggle clicked button\r\n if (optionsArray[alert].state === true) alertArray.push(optionsArray[alert].queryName); // build list of active btns\r\n }\r\n optionsArray[0].state =\r\n alertArray.length === optionsArray.length - 1 && !allAlertsBtn.state ? true : false;\r\n }\r\n\r\n return (optionsFilter = alertArray.length === 0 ? 'any' : alertArray.join(',').toLowerCase()); // passed to service\r\n }\r\n\r\n function setAlertsBtnGroup(option) {\r\n alertFilter = setBtnGroup(option, vm.alertOptions, alertFilter);\r\n\r\n refresh().then(() => {\r\n const options = vm.alertOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n addToDataLayer({\r\n event: 'alertsFiltering',\r\n data: {\r\n filterBy: 'type',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: vm.filteredAlerts.length,\r\n page: $state.current.name,\r\n },\r\n });\r\n });\r\n }\r\n\r\n function setPrioritiesBtnGroup(option) {\r\n priorityFilter = setBtnGroup(option, vm.priorityOptions, priorityFilter);\r\n\r\n refresh().then(() => {\r\n const options = vm.priorityOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n addToDataLayer({\r\n event: 'alertsFiltering',\r\n data: {\r\n filterBy: 'priority',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: vm.filteredAlerts.length,\r\n page: $state.current.name,\r\n },\r\n });\r\n });\r\n }\r\n\r\n function setStatusBtnGroup(option) {\r\n statusFilter = setBtnGroup(option, vm.statusOptions, statusFilter);\r\n\r\n refresh().then(() => {\r\n const options = vm.statusOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n addToDataLayer({\r\n event: 'alertsFiltering',\r\n data: {\r\n filterBy: 'status',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: vm.filteredAlerts.length,\r\n page: $state.current.name,\r\n },\r\n });\r\n });\r\n }\r\n\r\n function updateAlert(state, singleAlert) {\r\n let action = null;\r\n singleAlert.isDisabled = true;\r\n\r\n if (state === 'Acknowledge') {\r\n action = 'acknowledged';\r\n AlertsService.updateAlertAcknowledge(singleAlert.instanceId).then(\r\n function (response) {\r\n singleAlert.updatedBy = currentUser.email;\r\n singleAlert.status = 'Acknowledged';\r\n singleAlert.btnState = {\r\n value: 'Clear',\r\n des: gettextCatalog.getString('Clear'),\r\n };\r\n singleAlert.isDisabled = false;\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving data. ');\r\n singleAlert.isDisabled = false;\r\n vm.updateErrorFlag = true;\r\n vm.updateErrorText = errorMsg;\r\n },\r\n );\r\n } else if (state === 'Clear') {\r\n action = 'cleared';\r\n //Clear Alert\r\n AlertsService.updateAlertClear(singleAlert.instanceId).then(\r\n function (response) {\r\n singleAlert.updatedBy = currentUser.email;\r\n singleAlert.state = 'Closed';\r\n let elementPos = vm.alerts\r\n .map(function (x) {\r\n return x.instanceId;\r\n })\r\n .indexOf(singleAlert.instanceId);\r\n if (elementPos != -1) {\r\n vm.alerts.splice(elementPos, 1);\r\n applyFilter();\r\n }\r\n singleAlert.isDisabled = false;\r\n singleAlert.btnState.value === 'Cleared';\r\n vm.onClearAlert();\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving data. ');\r\n singleAlert.isDisabled = false;\r\n vm.updateErrorFlag = true;\r\n vm.updateErrorText = errorMsg;\r\n },\r\n );\r\n }\r\n\r\n if (action !== null) {\r\n vm.addAlertsInteraction(singleAlert, action);\r\n }\r\n }\r\n\r\n //CSV file\r\n function getCsvFileName() {\r\n let fileName = gettextCatalog.getString('data_export');\r\n let name = gettextCatalog.getString('Active_Alerts');\r\n let d = new Date();\r\n let date =\r\n d.getFullYear() +\r\n '_' +\r\n (d.getMonth() + 1) +\r\n '_' +\r\n d.getDate() +\r\n '_' +\r\n d.getHours() +\r\n '-' +\r\n d.getMinutes();\r\n fileName += '.' + name + date;\r\n return fileName + '.csv';\r\n }\r\n\r\n function getCsvData() {\r\n let CsvData = [];\r\n\r\n let headers = {\r\n Priority: gettextCatalog.getString('Priority'),\r\n Type: gettextCatalog.getString('Type'),\r\n Time_Active: gettextCatalog.getString('Time Active'),\r\n Asset: gettextCatalog.getString('Asset'),\r\n AlertName: gettextCatalog.getString('AlertName'),\r\n AlertEvent: gettextCatalog.getString('AlertEvent'),\r\n Description: gettextCatalog.getString('Description'),\r\n Status: gettextCatalog.getString('Status'),\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n for (let i = 0; i < vm.filteredAlerts.length; i++) {\r\n let priority = gettextCatalog.getString(vm.filteredAlerts[i].priority);\r\n let activeTimeOfAlert = $filter('TableDateFilter')(vm.filteredAlerts[i].timestamp);\r\n let equipment = vm.filteredAlerts[i].equipment.name;\r\n let alertName = vm.filteredAlerts[i].name;\r\n let alertEvent = gettextCatalog.getString(vm.filteredAlerts[i].series.title);\r\n let alertEventDescription = vm.filteredAlerts[i].series.faultDescription;\r\n let alertType = gettextCatalog.getString(vm.filteredAlerts[i].alertType);\r\n //var alertEvent = vm.filteredAlerts[i].series.tags[0];\r\n let status = gettextCatalog.getString(vm.filteredAlerts[i].status);\r\n\r\n let csvObject = {\r\n Priority: priority,\r\n type: alertType,\r\n Time_Active: activeTimeOfAlert,\r\n Asset: equipment,\r\n AlertName: alertName,\r\n AlertEvent: alertEvent,\r\n Description: alertEventDescription,\r\n Status: status,\r\n };\r\n\r\n CsvData.push(csvObject);\r\n }\r\n return CsvData;\r\n }\r\n\r\n function updatePredicate(predicate) {\r\n vm.predicate = predicate;\r\n }\r\n\r\n //Private functions\r\n\r\n //displayAlertsByPage() is used to set the legnth of paging needed for AlertsDashboard.\r\n function displayAlertsByPage() {\r\n vm.totalItems = vm.filteredAlerts.length;\r\n let begin = (vm.current.alertPage - 1) * vm.itemsPerPage;\r\n let end = begin + vm.itemsPerPage;\r\n vm.alertsByPage = vm.filteredAlerts.slice(begin, end);\r\n }\r\n\r\n function refresh() {\r\n vm.loading = true;\r\n\r\n if (vm.equipmentId) {\r\n if (vm.equipmentId.length === 0) {\r\n vm.equipmentId = null;\r\n }\r\n }\r\n\r\n return new Promise((res, rej) => {\r\n AlertsService.getAllAlerts(vm.equipmentId, priorityFilter, statusFilter).then(\r\n (response) => {\r\n vm.dataExist = response.data.length > 0 && response.data[0] !== null ? true : false;\r\n vm.alerts = [];\r\n\r\n let currentUser = usersService.currentUser();\r\n let visibleDatapoints = {};\r\n currentUser.visibleDatapoints.forEach((dp) => {\r\n visibleDatapoints[dp.id] = dp;\r\n });\r\n\r\n let priorityIcons = {\r\n low: vm.priorityOptions[1].icon,\r\n medium: vm.priorityOptions[2].icon,\r\n high: vm.priorityOptions[3].icon,\r\n };\r\n\r\n let filters = {};\r\n alertFilter.split(',').forEach((filter) => {\r\n filters[filter] = filter;\r\n });\r\n\r\n for (let i = 0; i <= response.data.length - 1; ++i) {\r\n let tag = response.data[i].series.tags[0];\r\n\r\n if (visibleDatapoints[tag]) {\r\n response.data[i].notes = [];\r\n let obj = response.data[i];\r\n obj.Icon = priorityIcons[obj.priority.toLowerCase()];\r\n obj.Index = i;\r\n obj.isDisabled = false;\r\n\r\n switch (tag) {\r\n case 'dtc':\r\n obj.alertType = gettext('Fault');\r\n obj.alertTypeTranslation = gettextCatalog.getString('Fault');\r\n break;\r\n case 'gps':\r\n obj.alertType = gettext('Geozone');\r\n obj.alertTypeTranslation = gettextCatalog.getString('Geozone');\r\n break;\r\n default:\r\n obj.alertType = gettext('Alert');\r\n obj.alertTypeTranslation = gettextCatalog.getString('Alert');\r\n break;\r\n }\r\n\r\n // Add translations so that filter works on different language\r\n obj.priorityTranslation = gettextCatalog.getString(obj.priority);\r\n obj.series.titleTranslation = gettextCatalog.getString(obj.series.title);\r\n obj.series.faultDescriptionTranslation = gettextCatalog.getString(\r\n obj.series.faultDescription,\r\n );\r\n obj.statusTranslation = gettextCatalog.getString(obj.status);\r\n\r\n // look for resource, if resource then btnState = Clear else btnState = Acknowledge\r\n if (response.data[i].status.toLowerCase() === 'acknowledged') {\r\n obj['btnState'] = {\r\n value: 'Clear',\r\n des: gettextCatalog.getString('Clear'),\r\n };\r\n } else {\r\n obj['btnState'] = {\r\n value: 'Acknowledge',\r\n des: gettextCatalog.getString('Acknowledge'),\r\n };\r\n }\r\n if (tag === 'dtc') {\r\n let dtcName = EquipmentService.getDtcFaultDescriptor(response.data[i].series);\r\n obj.series.title =\r\n EquipmentService.formatFaultCode(response.data[i].series) || obj.series.title;\r\n if (dtcName) {\r\n obj.series.faultDescription = dtcName.title;\r\n }\r\n }\r\n\r\n if (filters.any) {\r\n vm.alerts.push(obj);\r\n } else if (\r\n filters.alerts &&\r\n !response.data[i].series.tags[0].includes('dtc') &&\r\n response.data[i].series.tags[0] !== 'gps'\r\n ) {\r\n vm.alerts.push(obj);\r\n } else if (filters.faults && response.data[i].series.tags[0].includes('dtc')) {\r\n vm.alerts.push(obj);\r\n } else if (filters.geozones && response.data[i].series.tags[0] === 'gps') {\r\n vm.alerts.push(obj);\r\n }\r\n }\r\n }\r\n\r\n vm.filteredAlerts = vm.alerts.slice();\r\n\r\n if (vm.search.text !== '') {\r\n applyFilter();\r\n }\r\n\r\n vm.loading = false;\r\n\r\n res();\r\n },\r\n () => {\r\n vm.loading = false;\r\n vm.errorFlag = true;\r\n vm.errorText = gettextCatalog.getString('An error occurred while retrieving data. ');\r\n\r\n rej();\r\n },\r\n );\r\n });\r\n }\r\n\r\n gettext('Acknowledged');\r\n gettext('Cleared');\r\n gettext('Closed'); // used in equipment alert tab\r\n gettext('Active');\r\n\r\n // Add alerts table interactions to data layer\r\n vm.addAlertsInteraction = (alert, action) => {\r\n addToDataLayer({\r\n event: 'alertsInteraction',\r\n data: {\r\n action,\r\n type: alert.alertType,\r\n priority: alert.priority,\r\n },\r\n });\r\n };\r\n}\r\n","/* Controller Imports */\r\nimport DashboardMainPageController from \"./dashboard.controller\";\r\nimport DashboardNotesModalController from \"./table/list/notes-modal/note.controller\";\r\n/* Component Imports */\r\nimport DashboardAlertsListComponent from \"./table/list/list.component\";\r\nimport DashboardChartComponent from \"./chart/chart.component\";\r\n/* Directive Imports */\r\nimport DashboardFiltersAndExportDirective from \"./table/header-filters/header.component\";\r\n\r\nconst dashboardModule = angular\r\n .module(\"app.dashboard\", [\"ui.bootstrap\", \"ui.router\", \"gettext\"])\r\n /* Controllers */\r\n .controller(\"DashboardMainPageController\", DashboardMainPageController)\r\n .controller(\"DashboardNotesModalController\", DashboardNotesModalController)\r\n /* Components */\r\n .component(\"alertDashboardChart\", DashboardChartComponent)\r\n .component(\"alertsBoardTable\", DashboardAlertsListComponent)\r\n /* Directives */\r\n .directive(\"alertsBoard\", DashboardFiltersAndExportDirective);\r\n\r\nexport default dashboardModule.name;","import moment from 'moment';\r\nimport jstz from 'jstz';\r\nimport { MILLISECONDS_IN_A_DAY } from '../../../../utility/date.util.service';\r\n\r\nconst changeTimeZone = (date, timeZone) => {\r\n return moment\r\n .tz(\r\n {\r\n y: date.getFullYear(),\r\n M: date.getMonth(),\r\n d: date.getDate(),\r\n h: date.getHours(),\r\n m: date.getMinutes(),\r\n s: date.getSeconds(),\r\n ms: date.getMilliseconds(),\r\n },\r\n timeZone,\r\n )\r\n .toDate();\r\n};\r\n\r\nclass HistoricalAlertsListController {\r\n constructor(\r\n $ngRedux,\r\n $rootScope,\r\n alertsRepository,\r\n alertsFilter,\r\n $uibModal,\r\n $filter,\r\n gettextCatalog,\r\n EquipmentService,\r\n $state,\r\n ) {\r\n 'ngInject';\r\n\r\n this.store = $ngRedux;\r\n this.rootScope = $rootScope;\r\n this.alertsRepository = alertsRepository;\r\n this.alertsFilter = alertsFilter;\r\n this.uibModal = $uibModal;\r\n this.filter = $filter;\r\n this.gettextCatalog = gettextCatalog;\r\n this.equipmentService = EquipmentService;\r\n this.alertOptions = [];\r\n this.alertsPerPage = [];\r\n this.allAlerts = false;\r\n this.allStatus = false;\r\n this.assetPickerCount = 0;\r\n this.currentPage = 1;\r\n this.errorFlag = false;\r\n this.errorText = '';\r\n this.filteredalerts = [];\r\n this.focus = false;\r\n this.getAlertsFlag = false;\r\n this.invalidFlag = false;\r\n this.isSelected = {\r\n toDate: false,\r\n fromDate: false,\r\n };\r\n this.itemsPerPage = 11;\r\n this.loading = false;\r\n this.searchText = '';\r\n this.statusOptions = [];\r\n this.unfilteredalerts = [];\r\n\r\n // date picker\r\n this.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];\r\n this.currentFormat = this.formats[1];\r\n this.endDate = moment().toDate();\r\n this.endOpened = false;\r\n this.maxStartDate = this.endDate; // init value\r\n this.maxEndDate = moment().toDate();\r\n this.startDate = new Date(this.endDate);\r\n this.startDate.setDate(this.startDate.getDate() - 1);\r\n this.minEndDate = this.startDate; // init value\r\n this.minStartDate = 0; // fixed date\r\n this.startOpened = false;\r\n this.currentUser = $rootScope.currentUser;\r\n this.endDateFormat = '';\r\n this.orderBy = $filter('orderBy');\r\n this.searchBackupCopy = [];\r\n this.startDateFormat = '';\r\n this.selectedAssetsArr = [];\r\n this.sessionPriority = 'alertPriority';\r\n this.sessionStatus = 'alertStatus';\r\n this.sessionFaults = 'alertFault';\r\n this.state = $state;\r\n\r\n // Hide alert list when showing alert details\r\n const stateList = 'alerts.history';\r\n const stateDetails = 'alerts.history.details';\r\n this.showAlertList = $state.is(stateList);\r\n\r\n $rootScope.$on('$stateChangeStart', (_e, toState) => {\r\n if (toState.name === stateList) {\r\n this.showAlertList = true;\r\n }\r\n\r\n if (toState.name === stateDetails) {\r\n this.showAlertList = false;\r\n }\r\n });\r\n\r\n let { timezone } = this.currentUser.claims.data;\r\n\r\n if (!timezone) {\r\n timezone = jstz.determine().name();\r\n }\r\n this.timeZone = timezone;\r\n\r\n this.addToDataLayer = (data) => window.dataLayer.push(data);\r\n }\r\n\r\n $onInit() {\r\n this.setSelectableDateRange();\r\n this.setSessionVariables();\r\n this.setFilters();\r\n }\r\n\r\n startOnOpen() {\r\n this.isSelected.toDate = true;\r\n this.isSelected.fromDate = false;\r\n }\r\n\r\n endOnOpen() {\r\n this.isSelected.toDate = false;\r\n this.isSelected.fromDate = true;\r\n }\r\n\r\n setSelectableDateRange() {\r\n const today = moment().toDate();\r\n today.setTime(today.getTime() - MILLISECONDS_IN_A_DAY * 390);\r\n this.minStartDate = today;\r\n }\r\n\r\n setSessionVariables() {\r\n // button groups\r\n this.faultOptions = [\r\n {\r\n name: 'All Types',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionFaults) !== null &&\r\n sessionStorage.getItem(this.sessionFaults).includes('any')\r\n ),\r\n },\r\n {\r\n name: 'Alerts',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionFaults) !== null &&\r\n sessionStorage.getItem(this.sessionFaults).includes('alerts')\r\n ),\r\n },\r\n {\r\n name: 'Faults',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionFaults) !== null &&\r\n sessionStorage.getItem(this.sessionFaults).includes('faults')\r\n ),\r\n },\r\n {\r\n name: 'Geozones',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionFaults) !== null &&\r\n sessionStorage.getItem(this.sessionFaults).includes('acknowledged')\r\n ),\r\n },\r\n ];\r\n this.alertOptions = [\r\n {\r\n name: 'All Priorities',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionPriority) !== null &&\r\n sessionStorage.getItem(this.sessionPriority).includes('any')\r\n ),\r\n icon: '',\r\n },\r\n {\r\n name: 'Low',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionPriority) !== null &&\r\n sessionStorage.getItem(this.sessionPriority).includes('low')\r\n ),\r\n icon: 'fa fa-exclamation-circle color-low-priority',\r\n },\r\n {\r\n name: 'Medium',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionPriority) !== null &&\r\n sessionStorage.getItem(this.sessionPriority).includes('medium')\r\n ),\r\n icon: 'fa fa-exclamation-circle color-medium-priority',\r\n },\r\n {\r\n name: 'High',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionPriority) !== null &&\r\n sessionStorage.getItem(this.sessionPriority).includes('high')\r\n ),\r\n icon: 'fa fa-exclamation-circle color-high-priority',\r\n },\r\n ];\r\n this.statusOptions = [\r\n {\r\n name: 'All Statuses',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionStatus) !== null &&\r\n sessionStorage.getItem(this.sessionStatus).includes('any')\r\n ),\r\n },\r\n {\r\n name: 'Cleared',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionStatus) !== null &&\r\n sessionStorage.getItem(this.sessionStatus).includes('cleared')\r\n ),\r\n },\r\n {\r\n name: 'Returned',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionStatus) !== null &&\r\n sessionStorage.getItem(this.sessionStatus).includes('returned')\r\n ),\r\n },\r\n {\r\n name: 'Acknowledged',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionStatus) !== null &&\r\n sessionStorage.getItem(this.sessionStatus).includes('acknowledged')\r\n ),\r\n },\r\n {\r\n name: 'Active',\r\n state: !!(\r\n sessionStorage.getItem(this.sessionStatus) !== null &&\r\n sessionStorage.getItem(this.sessionStatus).includes('active')\r\n ),\r\n },\r\n ];\r\n this.setAlertsBtnGroup();\r\n this.setStatusBtnGroup();\r\n }\r\n\r\n setFilters() {\r\n this.statusFilter = 'any';\r\n this.alertFilter = 'any';\r\n this.faultFilter = 'any';\r\n }\r\n\r\n getStartDateErrorMessage() {\r\n if (\r\n this.filterAlertHistoryForm.StartDate.$error.required === true &&\r\n !this.filterAlertHistoryForm.StartDate.$pristine === true &&\r\n this.filterAlertHistoryForm.$submitted === true\r\n ) {\r\n return this.gettextCatalog.getString('Invalid or Empty from date: MM/DD/YY');\r\n }\r\n if (\r\n this.filterAlertHistoryForm.StartDate.$error.dateLowerThan === true &&\r\n this.isSelected.toDate === true\r\n ) {\r\n return this.gettextCatalog.getString('Start date exceeds end date');\r\n }\r\n if (\r\n this.filterAlertHistoryForm.StartDate.$error.dateRangeLowerThan === true &&\r\n this.isSelected.toDate === true\r\n ) {\r\n return this.gettextCatalog.getString('Date range exceeds 31 days');\r\n }\r\n }\r\n\r\n getEndDateErrorMessage() {\r\n if (\r\n this.filterAlertHistoryForm.EndDate.$error.required === true &&\r\n !this.filterAlertHistoryForm.EndDate.$pristine === true &&\r\n this.filterAlertHistoryForm.$submitted === true\r\n ) {\r\n this.returnthis.gettextCatalog.getString('Invalid or Empty to date: MM/DD/YY');\r\n } else if (\r\n this.filterAlertHistoryForm.EndDate.$error.dateGreaterThan === true &&\r\n this.isSelected.fromDate === true\r\n ) {\r\n return this.gettextCatalog.getString('End date is earlier than start date');\r\n } else if (\r\n this.filterAlertHistoryForm.EndDate.$error.dateRangeGreaterThan === true &&\r\n this.isSelected.fromDate === true\r\n ) {\r\n return this.gettextCatalog.getString('Date range exceeds 31 days');\r\n }\r\n }\r\n\r\n startDateChanged() {\r\n this.minEndDate = moment(this.startDate).toDate();\r\n const plusThirtyOneDays = moment(\r\n this.startDate.getTime() + 30 * MILLISECONDS_IN_A_DAY,\r\n ).toDate();\r\n this.maxEndDate = plusThirtyOneDays > moment().toDate() ? moment().toDate() : plusThirtyOneDays;\r\n this.endDate = this.maxEndDate;\r\n }\r\n\r\n endDateChanged() {\r\n this.maxStartDate = this.endDate;\r\n const maxStartTemp = moment().toDate();\r\n maxStartTemp.setTime(maxStartTemp.getTime() - MILLISECONDS_IN_A_DAY * 1);\r\n this.maxStartDate = maxStartTemp;\r\n }\r\n\r\n setFaultsBtnGroup(option) {\r\n const faultsArray = [];\r\n const allFitlerBtn = this.faultOptions[0];\r\n if (option === allFitlerBtn.name) {\r\n this.faultOptions[0].state = !allFitlerBtn.state; // toggle all btn\r\n for (const alert in this.faultOptions) this.faultOptions[alert].state = allFitlerBtn.state; // toggle group\r\n } else {\r\n for (const alert in this.faultOptions) {\r\n if (this.faultOptions[alert].name === option)\r\n this.faultOptions[alert].state = !this.faultOptions[alert].state; // toggle clicked button\r\n if (this.faultOptions[alert].state === true)\r\n faultsArray.push(this.faultOptions[alert].name); // build list of active btns\r\n }\r\n this.faultOptions[0].state = !!(\r\n faultsArray.length === this.faultOptions.length - 1 && !allFitlerBtn.state\r\n );\r\n }\r\n this.faultFilter = faultsArray.length === 0 ? 'any' : faultsArray.join(','); // passed to service\r\n this.filteredalerts = this.alertsFilter(\r\n this.searchBackupCopy,\r\n this.statusFilter,\r\n this.alertFilter,\r\n this.faultFilter,\r\n this.searchText,\r\n );\r\n sessionStorage.setItem(this.sessionPriority, this.faultFilter);\r\n this.pageChanged();\r\n\r\n if (option !== undefined) {\r\n const options = this.faultOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n this.addToDataLayer({\r\n event: 'historicalAlertsFiltering',\r\n data: {\r\n filterBy: 'type',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: this.filteredalerts.length,\r\n page: this.state.current.name,\r\n },\r\n });\r\n }\r\n }\r\n\r\n setAlertsBtnGroup(option) {\r\n if (this.invalidFlag) {\r\n this.searchBackupCopy = [];\r\n }\r\n const alertsArray = [];\r\n const allFitlerBtn = this.alertOptions[0];\r\n if (option === allFitlerBtn.name) {\r\n this.alertOptions[0].state = !allFitlerBtn.state; // toggle all btn\r\n for (const alert in this.alertOptions) this.alertOptions[alert].state = allFitlerBtn.state; // toggle group\r\n } else {\r\n for (const alert in this.alertOptions) {\r\n if (this.alertOptions[alert].name === option)\r\n this.alertOptions[alert].state = !this.alertOptions[alert].state; // toggle clicked button\r\n if (this.alertOptions[alert].state === true)\r\n alertsArray.push(this.alertOptions[alert].name); // build list of active btns\r\n }\r\n this.alertOptions[0].state = !!(\r\n alertsArray.length === this.alertOptions.length - 1 && !allFitlerBtn.state\r\n );\r\n }\r\n this.alertFilter = alertsArray.length === 0 ? 'any' : alertsArray.join(','); // passed to service\r\n this.filteredalerts = this.alertsFilter(\r\n this.searchBackupCopy,\r\n this.statusFilter,\r\n this.alertFilter,\r\n this.faultFilter,\r\n this.searchText,\r\n );\r\n sessionStorage.setItem(this.sessionPriority, this.alertFilter);\r\n this.pageChanged();\r\n\r\n if (option !== undefined) {\r\n const options = this.alertOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n this.addToDataLayer({\r\n event: 'historicalAlertsFiltering',\r\n data: {\r\n filterBy: 'priority',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: this.filteredalerts.length,\r\n page: this.state.current.name,\r\n },\r\n });\r\n }\r\n }\r\n\r\n setStatusBtnGroup(option) {\r\n if (this.invalidFlag) {\r\n this.searchBackupCopy = [];\r\n }\r\n let statusArray = [];\r\n const allStatusBtn = this.statusOptions[0];\r\n if (option === allStatusBtn.name) {\r\n this.statusOptions[0].state = !allStatusBtn.state; // toggle all btn\r\n for (const status in this.statusOptions)\r\n this.statusOptions[status].state = allStatusBtn.state; // toggle group\r\n } else {\r\n // toggle clicked button\r\n this.statusOptions.forEach((status) => {\r\n if (status.name === option) {\r\n status.state = !status.state;\r\n }\r\n });\r\n\r\n statusArray = this.statusOptions\r\n .filter((status) => status.state === true)\r\n .map((status) => status.name);\r\n\r\n this.statusOptions[0].state = !!(\r\n statusArray.length === this.statusOptions.length - 1 && !allStatusBtn.state\r\n );\r\n }\r\n this.statusFilter = statusArray.length === 0 ? 'any' : statusArray.join(','); // passed to service\r\n this.filteredalerts = this.alertsFilter(\r\n this.searchBackupCopy,\r\n this.statusFilter,\r\n this.alertFilter,\r\n this.faultFilter,\r\n this.searchText,\r\n );\r\n sessionStorage.setItem(this.sessionStatus, this.statusFilter);\r\n this.pageChanged();\r\n\r\n if (option !== undefined) {\r\n const options = this.statusOptions\r\n .filter((item) => item.state === true)\r\n .map((item) => item.name);\r\n\r\n this.addToDataLayer({\r\n event: 'historicalAlertsFiltering',\r\n data: {\r\n filterBy: 'status',\r\n clickedOption: option,\r\n options,\r\n selected: options.includes(option),\r\n total: this.filteredalerts.length,\r\n page: this.state.current.name,\r\n },\r\n });\r\n }\r\n }\r\n\r\n getAlerts(form) {\r\n this.filterAlertHistoryForm.$setSubmitted();\r\n this.filteredalerts = [];\r\n this.unfilteredalerts = [];\r\n this.getAlertsFlag = true;\r\n this.invalidFlag = false;\r\n this.focus = false;\r\n if (form.$invalid) {\r\n this.loading = false;\r\n this.invalidFlag = true;\r\n } else {\r\n this.refresh();\r\n }\r\n\r\n this.addToDataLayer({\r\n event: 'historicalAlertsSearching',\r\n data: {\r\n startDate: this.startDate,\r\n endDate: this.endDate,\r\n },\r\n });\r\n }\r\n\r\n assetPicker() {\r\n // this inside the function of then will not refrence the class\r\n const historicalClass = this;\r\n const modalInstance = this.uibModal.open({\r\n animation: true,\r\n template: require('../../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n windowClass: 'tr-asset-picker-modal-dismiss',\r\n resolve: {\r\n selectedAssets: () => {\r\n const selected = {};\r\n (historicalClass.selectedAssetsArr || []).forEach((e) => (selected[e.id] = e));\r\n return selected;\r\n },\r\n singleSelect: false,\r\n requiresSelection: false,\r\n maxSelection: () => 0,\r\n },\r\n });\r\n modalInstance.result.then((selectedAssets) => {\r\n historicalClass.selectedAssetsArr = [];\r\n for (const key in selectedAssets.result) {\r\n historicalClass.selectedAssetsArr.push(selectedAssets.result[key]);\r\n }\r\n historicalClass.assetPickerCount = historicalClass.selectedAssetsArr.length;\r\n });\r\n }\r\n\r\n dateFormat() {\r\n this.startDate.setHours(0, 0, 0, 0);\r\n this.startDateFormat = changeTimeZone(this.startDate, this.timeZone).toISOString();\r\n this.endDate.setHours(23, 59, 59, 999);\r\n this.endDateFormat = changeTimeZone(this.endDate, this.timeZone).toISOString();\r\n }\r\n\r\n orderAlertHistory(pred, onLoad = false) {\r\n const self = this;\r\n\r\n this.predicate = pred;\r\n this.reverse = this.predicate === pred ? !this.reverse : false;\r\n for (const alert of this.filteredalerts) {\r\n alert[pred] = alert[pred];\r\n }\r\n if (this.predicate === 'priority') {\r\n // priority should not sort alphabetically ( e.g.; High, Low, Medium), so use custom sort\r\n this.filteredalerts.sort(function (a, b) {\r\n if (!self.reverse) {\r\n return self.priorityCustomOrder(a) > self.priorityCustomOrder(b) ? 1 : -1;\r\n }\r\n return self.priorityCustomOrder(b) > self.priorityCustomOrder(a) ? 1 : -1;\r\n });\r\n } else {\r\n // sort alphabetically\r\n this.filteredalerts = this.orderBy(this.filteredalerts, this.predicate, this.reverse);\r\n }\r\n this.pageChanged();\r\n\r\n if (!onLoad) {\r\n this.addToDataLayer({\r\n event: 'historicalAlertsSorting',\r\n data: {\r\n sortBy: pred,\r\n order: this.reverse ? 'desc' : 'asc',\r\n },\r\n });\r\n }\r\n }\r\n\r\n priorityCustomOrder(alert) {\r\n switch (alert.priority) {\r\n case 'Low':\r\n return 1;\r\n case 'Medium':\r\n return 2;\r\n case 'High':\r\n return 3;\r\n }\r\n return -1;\r\n }\r\n\r\n getAlertIcon(priority) {\r\n switch (priority.toLowerCase()) {\r\n case 'low':\r\n return this.alertOptions[1].icon;\r\n case 'medium':\r\n return this.alertOptions[2].icon;\r\n case 'high':\r\n return this.alertOptions[3].icon;\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n getAlertType(tag) {\r\n switch (tag) {\r\n case 'dtc':\r\n return 'Fault';\r\n case 'gps':\r\n return 'Geozone';\r\n default:\r\n return 'Alert';\r\n }\r\n }\r\n\r\n // return only alerts with allowed datapoint\r\n // add data point descriptor for dtc\r\n diagnosticTroubleCode(responseData = []) {\r\n const visibleDatapoint = this.currentUser.visibleDatapoints.map((datapoint) => datapoint.id);\r\n return responseData.reduce((newArray, alertHistoryItem) => {\r\n if (visibleDatapoint.includes(alertHistoryItem.series.tags[0])) {\r\n if (alertHistoryItem.series.tags.includes('dtc')) {\r\n const dtcName = this.equipmentService.getDtcFaultDescriptor(alertHistoryItem.series);\r\n alertHistoryItem.series.title =\r\n this.equipmentService.formatFaultCode(alertHistoryItem.series) ||\r\n alertHistoryItem.series.title;\r\n if (dtcName) {\r\n alertHistoryItem.series.faultDescription = dtcName.title;\r\n }\r\n }\r\n newArray.push(alertHistoryItem);\r\n }\r\n return newArray;\r\n }, []);\r\n }\r\n\r\n refresh() {\r\n this.dateFormat();\r\n this.loading = true;\r\n this.filteredalerts = [];\r\n\r\n const searchAlertEquipment = {\r\n start: this.startDateFormat,\r\n end: this.endDateFormat,\r\n priority: 'any',\r\n status: 'any',\r\n equipment:\r\n this.selectedAssetsArr.length > 0\r\n ? this.selectedAssetsArr.map((element) => element.id)\r\n : [],\r\n };\r\n\r\n this.alertsRepository\r\n .getAllAlertHistory(searchAlertEquipment)\r\n .then(\r\n (response) => {\r\n this.filteredalerts = this.diagnosticTroubleCode(response.data);\r\n this.filteredalerts.forEach((alert) => {\r\n alert.alertType = this.getAlertType(alert.series.tags[0]);\r\n });\r\n this.searchBackupCopy = this.filteredalerts.slice();\r\n this.filteredalerts = this.alertsFilter(\r\n this.searchBackupCopy,\r\n this.statusFilter,\r\n this.alertFilter,\r\n this.faultFilter,\r\n this.searchText,\r\n );\r\n this.orderAlertHistory('timestamp', true);\r\n },\r\n () => {\r\n this.errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving data. ',\r\n );\r\n this.errorFlag = true;\r\n },\r\n )\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n pageChanged() {\r\n this.totalItems = this.filteredalerts.length;\r\n const begin = (this.currentPage - 1) * this.itemsPerPage;\r\n const end = begin + this.itemsPerPage;\r\n this.alertsPerPage = this.filteredalerts.slice(begin, end);\r\n }\r\n\r\n applyFilter() {\r\n if (this.invalidFlag) {\r\n this.searchBackupCopy = [];\r\n }\r\n\r\n this.filteredalerts = this.alertsFilter(\r\n this.searchBackupCopy,\r\n this.statusFilter,\r\n this.alertFilter,\r\n this.faultFilter,\r\n this.searchText,\r\n );\r\n this.pageChanged();\r\n }\r\n\r\n triggerHistoricalAlertsKeywordFiltering() {\r\n this.addToDataLayer({\r\n event: 'historicalAlertsKeywordFiltering',\r\n data: {\r\n keyword: this.searchText,\r\n total: this.filteredalerts.length,\r\n page: this.state.current.name,\r\n },\r\n });\r\n }\r\n\r\n setSelectedRow(alert) {\r\n this.selectedRow = alert.equipment.name;\r\n this.errorFlag = false;\r\n this.errorText = '';\r\n\r\n this.addHistoricalAlertsInteraction(alert, 'detail');\r\n }\r\n\r\n getCsvFileName() {\r\n let fileName = 'Historical_Alerts_';\r\n const d = moment().toDate();\r\n const date = `${d.getFullYear()}_${\r\n d.getMonth() + 1\r\n }_${d.getDate()}_${d.getHours()}-${d.getMinutes()}`;\r\n fileName += date;\r\n return `${fileName}.csv`;\r\n }\r\n\r\n getCsvData() {\r\n const CsvData = [];\r\n const headers = {\r\n Priority: this.gettextCatalog.getString('Priority'),\r\n Type: this.gettextCatalog.getString('Type'),\r\n Time_Active: this.gettextCatalog.getString('Time Active'),\r\n Asset: this.gettextCatalog.getString('Asset'),\r\n Name: this.gettextCatalog.getString('Name'),\r\n Event: this.gettextCatalog.getString('Event'),\r\n Description: this.gettextCatalog.getString('Description'),\r\n Status: this.gettextCatalog.getString('Status'),\r\n };\r\n CsvData.push(headers);\r\n for (let i = 0; i < this.filteredalerts.length; i++) {\r\n const priority = this.gettextCatalog.getString(this.filteredalerts[i].priority);\r\n const activeTimeOfAlert = this.filter('TableDateFilter')(this.filteredalerts[i].timestamp);\r\n const equipmentName = this.filteredalerts[i].equipment.name;\r\n const alertName = this.filteredalerts[i].name;\r\n const alertEvent = this.gettextCatalog.getString(this.filteredalerts[i].series.title);\r\n const alertEventDescription = this.filteredalerts[i].series.faultDescription;\r\n const status = this.gettextCatalog.getString(this.filteredalerts[i].status);\r\n const alertType = this.gettextCatalog.getString(this.filteredalerts[i].alertType);\r\n const csvObject = {\r\n Priority: priority,\r\n type: alertType,\r\n Time_Active: activeTimeOfAlert,\r\n Asset: equipmentName,\r\n Name: alertName,\r\n Event: alertEvent,\r\n Description: alertEventDescription,\r\n Status: status,\r\n };\r\n CsvData.push(csvObject);\r\n }\r\n return CsvData;\r\n }\r\n\r\n addHistoricalAlertsInteraction(alert, action) {\r\n this.addToDataLayer({\r\n event: 'historicalAlertsInteraction',\r\n data: {\r\n action,\r\n type: alert.alertType,\r\n priority: alert.priority,\r\n status: alert.status,\r\n },\r\n });\r\n }\r\n\r\n alertCsvDownloaded(alert) {\r\n this.addHistoricalAlertsInteraction(alert, 'insight');\r\n }\r\n} // controller function\r\n\r\nexport const HistoricalAlertsListComponent = {\r\n template: require('./list.html'),\r\n bindings: {},\r\n controller: HistoricalAlertsListController,\r\n controllerAs: 'vm',\r\n};\r\n","export default function HistoricalAlertsViewController($scope, $rootScope, alertsRepository, $stateParams, $uibModal, $q, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n //for update/delete note\r\n var userEmail = '';\r\n $scope.noteEditing = false;\r\n $scope.editing = {};\r\n $scope.save = {};\r\n $scope.editNote = {};\r\n\r\n $scope.toggleEditing = function (instance) {\r\n $scope.editErrorFlag = false;\r\n $scope.editing[instance.id] = !$scope.editing[instance.id];\r\n $scope.editNote[instance.id] = instance.text;\r\n $scope.noteEditing = !$scope.noteEditing;\r\n };\r\n\r\n //update note\r\n $scope.updateNote = function (alertId, noteId, instance) {\r\n $scope.editErrorFlag = false;\r\n if ($scope.editNote[instance.id] !== '') {\r\n $scope.save[instance.id] = !$scope.save[instance.id];\r\n instance.updatedBy = $rootScope.currentUser.email;\r\n instance.text = $scope.editNote[instance.id];\r\n var note = {\r\n id: instance.id,\r\n instanceId: instance.instanceId,\r\n text: instance.text\r\n };\r\n alertsRepository.updateNote(alertId, noteId, note)\r\n .then(function (response) {\r\n $scope.editing[instance.id] = !$scope.editing[instance.id];\r\n $scope.save[instance.id] = !$scope.save[instance.id];\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while updating the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.save[instance.id] = false;\r\n $scope.editErrorText = errorMsg;\r\n $scope.editErrorFlag = true;\r\n });\r\n }\r\n }; //update note\r\n\r\n //delete note\r\n $scope.deleteNote = function (instance) {\r\n $scope.editErrorFlag = false;\r\n var alertId = instance.instanceId;\r\n var noteId = instance.id;\r\n $scope.save[noteId] = !$scope.save[noteId];\r\n alertsRepository.deleteNote(alertId, noteId)\r\n .then(function (response) {\r\n var elementPos = $scope.instances.indexOf(instance);\r\n\r\n if (elementPos > 0) {\r\n $scope.instances.splice(elementPos, 1);\r\n }\r\n $scope.save[noteId] = !$scope.save[noteId];\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while deleting the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.save[noteId] = false;\r\n $scope.editErrorText = errorMsg;\r\n $scope.editErrorFlag = true;\r\n });\r\n }; //delete note\r\n\r\n //load page\r\n var refresh = function () {\r\n $scope.loading = true;\r\n\r\n function onError(error) {\r\n //error\r\n $scope.loading = false;\r\n var errorMsg = gettextCatalog.getString('An error occurred while retrieving alert information');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n return $q.reject();\r\n }\r\n\r\n alertsRepository.getAlert($stateParams.instanceId).then(function (response) {\r\n $scope.alert = response.data;\r\n $scope.equipment = $scope.alert.equipment;\r\n $scope.isVisible = false;\r\n if ($scope.alert.series && $scope.alert.series.tags && $scope.alert.series.tags.length > 0) {\r\n //Checking to see if the alert is visible to the current user by checking the series tag\r\n\r\n var currentUser = $rootScope.currentUser;\r\n for (var i = 0; i < currentUser.visibleDatapoints.length; i++) {\r\n var t = $scope.alert.series.tags[0];\r\n var u = currentUser.visibleDatapoints[i].id;\r\n if ($scope.alert.series.tags[0] === currentUser.visibleDatapoints[i].id) {\r\n $scope.isVisible = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.isVisible) {\r\n return alertsRepository.getAlertHistoryDetails($stateParams.instanceId).then(null, onError);\r\n }\r\n return null;\r\n }, onError).then(function (response) {\r\n $scope.instances = response.data;\r\n $scope.currentUserId = $rootScope.currentUser.id;\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n //open a modal fro new note\r\n $scope.open = function () {\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./new-notes/new-note.html'),\r\n controller: 'HistoricalAlertsViewNewNotesController',\r\n size: 'lg',\r\n backdrop: 'static',\r\n keyboard: false,\r\n resolve: {\r\n alert: function () {\r\n return $scope.alert;\r\n } //optional, to pass any items to modal\r\n }\r\n });\r\n\r\n function onError() {\r\n //error\r\n $scope.loading = false;\r\n $scope.error = gettextCatalog.getString('Note not added.');\r\n }\r\n\r\n modalInstance.result.then(function (val) {\r\n if (val) {\r\n val['timestamp'] = val.enteredAt;\r\n val['status'] = 'note';\r\n val['user'] = val.enteredBy;\r\n $scope.instances.push(val);\r\n }\r\n }, onError);\r\n };\r\n\r\n refresh();\r\n}","export default function HistoricalAlertsViewNewNotesController($scope, $rootScope, $uibModalInstance, alert, alertsRepository, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.alert = alert;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n\r\n //variable use to refresh the history detail page\r\n $scope.creatingnote = false;\r\n var userEmail = '';\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event, next, current) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n $scope.createNewNote = function (noteText) {\r\n $scope.creatingnote = true;\r\n $scope.errorFlag = false;\r\n var note = {};\r\n userEmail = $rootScope.currentUser.email;\r\n\r\n note['instanceId'] = alert.instanceId;\r\n note['text'] = noteText;\r\n note['enteredBy'] = userEmail;\r\n note['updatedBy'] = userEmail;\r\n\r\n alertsRepository.createNote(note.instanceId, note).then(function (response) {\r\n $scope.newNote.text = '';\r\n $uibModalInstance.close(response.data);\r\n }, handleError);\r\n\r\n };\r\n\r\n //general error handler.\r\n function handleError(response) {\r\n var errorMsg = gettextCatalog.getString('An error occurred while creating the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else {\r\n errorMsg += ': ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.creatingnote = false;\r\n }\r\n}","import angular from 'angular';\r\nimport {HistoricalAlertsListComponent} from './list/list.controller';\r\nimport HistoricalAlertsViewController from './view/view.controller';\r\nimport HistoricalAlertsViewNewNotesController from './view/new-notes/new-note.controller';\r\n\r\nconst historicalModule = angular\r\n .module('app.historical-alerts', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n .component('historicalAlertsList', HistoricalAlertsListComponent)\r\n /* Controllers */\r\n .controller('HistoricalAlertsViewController', HistoricalAlertsViewController)\r\n .controller('HistoricalAlertsViewNewNotesController', HistoricalAlertsViewNewNotesController);\r\n\r\nexport default historicalModule.name;\r\n","const AlertsMaintenanceHistoryComponent = {\r\n template: require(\"./alerts-maintenance-history.html\"),\r\n restrict: 'E',\r\n bindings: {},\r\n controllerAs: 'vm',\r\n controller: AlertsMaintenancePanelController\r\n};\r\n\r\nfunction AlertsMaintenancePanelController() {\r\n var vm = this;\r\n vm.chartData = [{\r\n \"key\": \"Alerts\",\r\n \"bar\": true,\r\n \"values\": [],\r\n \"color\": \"red\"\r\n }];\r\n\r\n vm.chartOptions = {\r\n chart: {\r\n type: 'historicalBarChart',\r\n height: 70,\r\n width: 200,\r\n margin: {\r\n top: 0,\r\n bottom: 17,\r\n left: 17,\r\n right: 17\r\n },\r\n clipEdge: true,\r\n x: function (d) {\r\n return d[0];\r\n },\r\n y: function (d) {\r\n return d[1];\r\n },\r\n valueFormat: function (d) {\r\n return moment(d).format('HH a');\r\n },\r\n xAxis: {\r\n showMaxMin: true,\r\n tickFormat: function (d) {\r\n return moment(d).format('HH a');\r\n }\r\n },\r\n yAxis: {\r\n axisLabel: 'Y Axis',\r\n axisLabelDistance: -10,\r\n\r\n tickFormat: function (d) {\r\n return d3.format(',.0f')(d);\r\n }\r\n },\r\n showControls: false,\r\n showLegend: false,\r\n stacked: true,\r\n showYAxis: false,\r\n showXAxis: true,\r\n duration: 1,\r\n color: function () {\r\n return 'rgba(255, 0, 0, 0.5)';\r\n }\r\n }\r\n };\r\n\r\n vm.$onInit = function () {\r\n for (var i = 10; i > 0; i--) {\r\n var maintenace = Math.random() < 0.1 ? 1 : 0;\r\n var alert = Math.random() < 0.25 ? 1 : 0;\r\n\r\n var date = moment().add(-i, 'hours');\r\n if (alert === 1) {\r\n var number = Math.round(Math.random() * 5) + 1;\r\n vm.chartData[0].values.push([date.toDate().getTime(), number]);\r\n } else {\r\n vm.chartData[0].values.push([date.toDate().getTime(), 0]);\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default AlertsMaintenanceHistoryComponent;","/* Config Imports */\r\nimport AlertsRouteConfig from './alerts.route'; \r\n/* Module Imports */\r\nimport configurationsModule from './configurations/configurations.module';\r\nimport dashboardModule from './dashboard/dashboard.module';\r\nimport historicalModule from './historical-alerts/historical-alerts.module';\r\n/* Component Imports */\r\nimport AlertsMaintenanceHistoryComponent from '../asset-dashboard/alerts-maintenance-history/alerts-maintenance-history.component';\r\n\r\nconst alertsModule = angular.module('app.alerts', [\r\n \"ui.bootstrap\",\r\n \"ui.router\",\r\n \"gettext\",\r\n configurationsModule,\r\n dashboardModule,\r\n historicalModule\r\n])\r\n/* Config */\r\n.config(AlertsRouteConfig)\r\n/* Components */\r\n.component('alertsMaintenanceHistory', AlertsMaintenanceHistoryComponent);\r\n\r\nexport default alertsModule.name;\r\n","import { every } from 'lodash-es';\r\n\r\nimport template from './attribute-filter.component.html';\r\n\r\nexport class AttributeFilterController {\r\n\tconstructor() {\r\n\t\tthis.displayValidationError = false;\r\n\t\tthis.helpContent = '';\r\n\t}\r\n\r\n\t$onInit() {\r\n\r\n\t\tthis.freeform = this.attr.freeform;\r\n\t\tthis.type = this.attr.TYPE;\r\n\t\tthis.range = this.attr.range;\r\n\r\n\t\tif (!this.attr.selectedValues || this.attr.selectedValues.length === 0) {\r\n\t\t\tconst { dataType } = this.attr.rawAttr;\r\n\t\t\tif (dataType === 'Date' || dataType === 'Datetime') {\r\n\t\t\t\tthis.attr.selectedValues = moment();\r\n\t\t\t} else {\r\n\t\t\t\tthis.attr.selectedValues = [''];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.editing = true;\r\n\t}\r\n\r\n\tsetInstructions(help) {\r\n\t\tthis.helpContent = { helpMe: help };\r\n\t}\r\n\r\n\tremoveValue(index) {\r\n\t\tif (index <= this.attr.selectedValues.length) {\r\n\t\t\tthis.attr.selectedValues.splice(index, 1);\r\n\t\t}\r\n\t}\r\n\r\n\tsave() {\r\n\t\tif (!this.attributeFilterForm.$valid) {\r\n\t\t\tthis.displayValidationError = true;\r\n\t\t\tthis.validateForm();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.addFilter({ attr: this.attr });\r\n\t\tif (this.parent && this.parent.closeModal) {\r\n\t\t\tthis.parent.closeModal();\r\n\t\t}\r\n\t}\r\n\r\n\tremove() {\r\n\t\tthis.removeFilter({ attr: this.attr });\r\n\t\tif (this.parent && this.parent.closeModal) {\r\n\t\t\tthis.parent.closeModal();\r\n\t\t}\r\n\t}\r\n\r\n\tvaluesValid() {\r\n\t\treturn every(this.attr.selectedValues, value => value && value.length > 0);\r\n\t}\r\n\r\n\taddValue() {\r\n\t\tthis.attr.selectedValues.unshift('');\r\n\t\tthis.getFormField(0, 'value').$touched = false;\r\n\t}\r\n\r\n\tentryInvalid(index) {\r\n\t\tconst form = this[`valueForm${index}`];\r\n\t\treturn !!form && form.value && form.value.$touched && Object.keys(form.value.$error).length > 0;\r\n\t}\r\n\r\n\tsupportsError(field) {\r\n\t\treturn !!field && !!field.$error;\r\n\t}\r\n\r\n\thasRequiredError($index, field = 'value') {\r\n\t\tconst formField = this.getFormField($index, field);\r\n\t\treturn this.supportsError(formField) && !!formField.$error.required;\r\n\t}\r\n\r\n\tgetErrorType($index) {\r\n\t\tif (this.hasRequiredError($index)) {\r\n\t\t\treturn 'required';\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tvalidateForm(form) {\r\n\t\tif (!form) {\r\n\t\t\tconst forms = [];\r\n\t\t\tconst rootForm = this.attributeFilterForm;\r\n\t\t\tObject.keys(rootForm).forEach(key => {\r\n\t\t\t\tconst formProp = rootForm[key];\r\n\t\t\t\tif (formProp && formProp.$$parentForm) {\r\n\t\t\t\t\tforms.push(formProp);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tforms.forEach(this.validateFields);\r\n\t\t} else {\r\n\t\t\tthis.validateFields(form);\r\n\t\t}\r\n\t}\r\n\r\n\tvalidateFields(form) {\r\n\t\tObject.keys(form).forEach(formKey => {\r\n\t\t\tconst valueForm = form[formKey];\r\n\t\t\tif (valueForm && valueForm.$$parentForm) {\r\n\t\t\t\tObject.keys(valueForm).forEach(valueFormKey => {\r\n\t\t\t\t\tconst field = valueForm[valueFormKey];\r\n\t\t\t\t\tif (!!field && field.$error && field.$setTouched && Object.keys(field.$error).length > 0) {\r\n\t\t\t\t\t\tfield.$setTouched();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport const attributeFilterComponent = {\r\n\ttemplate,\r\n\tcontroller: AttributeFilterController,\r\n\tcontrollerAs: 'vm',\r\n\trequire: {\r\n\t\tparent: '?^^modal'\r\n\t},\r\n\tbindings: {\r\n\t\tattr: '<',\r\n\t\taddFilter: '&',\r\n\t\teditFilter: '&',\r\n\t\tremoveFilter: '&'\r\n\t}\r\n};\r\n","import template from './freeform-filter.component.html';\r\nimport {AttributeFilterController} from '../attribute-filter.component';\r\nimport moment from 'moment';\r\n\r\nclass FreeformFilterController extends AttributeFilterController {\r\n constructor($filter) {\r\n 'ngInject';\r\n super();\r\n this.translateFilter = $filter('translate');\r\n this.showPresets = false;\r\n this.showDates = true;\r\n }\r\n\r\n $onInit() {\r\n this.setHelp();\r\n this.showTimes = this.attr.rawAttr.dataType === 'Datetime';\r\n\r\n const {range} = this.attr.rawAttr;\r\n this.min = range.min ? moment(range.min).toDate() : null;\r\n this.max = range.max ? moment(range.max).toDate() : null;\r\n }\r\n\r\n $postLink() {\r\n this.setDateSelections();\r\n }\r\n\r\n setHelp() {\r\n let instructions = '';\r\n switch (this.attr.rawAttr.dataType) {\r\n case 'Date':\r\n case 'Datetime':\r\n instructions = 'dateRange';\r\n break;\r\n case 'Integer':\r\n case 'Decimal':\r\n instructions = 'numericRange';\r\n break;\r\n case 'Text':\r\n instructions = 'list';\r\n break;\r\n default:\r\n instructions = 'unavailable';\r\n break;\r\n }\r\n this.getHelp({help: instructions});\r\n }\r\n\r\n toggleAnyValue() {\r\n this.attr.anyValue = !this.attr.anyValue;\r\n this.checkDateValidation();\r\n }\r\n\r\n addValue() {\r\n if (this.freeformFilterForm.$valid) {\r\n super.addValue();\r\n } else {\r\n super.validateForm(this.freeformFilterForm);\r\n }\r\n }\r\n\r\n isPlainText() {\r\n return !this.isNumeric() && !this.isDate() && !this.isDatetime();\r\n }\r\n\r\n isNumeric() {\r\n const {dataType} = this.attr.rawAttr;\r\n return dataType === 'Integer' || dataType === 'Decimal';\r\n }\r\n\r\n isDate() {\r\n const {dataType} = this.attr.rawAttr;\r\n return dataType === 'Date';\r\n }\r\n\r\n isDatetime() {\r\n const {dataType} = this.attr.rawAttr;\r\n return dataType === 'Datetime';\r\n }\r\n\r\n getPlaceholder() {\r\n if (this.isNumeric()) {\r\n return this.translateFilter('Enter a number');\r\n } else {\r\n return this.translateFilter('Enter a filter term');\r\n }\r\n }\r\n\r\n getForm($index) {\r\n return this[`valueForm${$index}`];\r\n }\r\n\r\n getFormField($index, field) {\r\n return this.getForm($index)[`${field}`];\r\n }\r\n\r\n getErrorType($index) {\r\n if (!this.isDate() && !this.isDatetime()) {\r\n const parentErrorType = super.getErrorType($index);\r\n if (parentErrorType != null) {\r\n return parentErrorType;\r\n } else if (this.hasInvalidPattern($index)) {\r\n return `${this.attr.rawAttr.dataType.toLowerCase()}-pattern`;\r\n }\r\n }\r\n }\r\n\r\n hasInvalidPattern($index, field = 'value') {\r\n const fieldRef = this.getFormField($index, field);\r\n return !!fieldRef && !!fieldRef.$error && !!fieldRef.$error.pattern;\r\n }\r\n\r\n setDateSelections() {\r\n if (this.attr.selectedRange) {\r\n this.startDate = this.attr.selectedRange.min ? this.attr.selectedRange.min : '';\r\n this.endDate = this.attr.selectedRange.max ? this.attr.selectedRange.max : '';\r\n }\r\n this.checkDateValidation();\r\n }\r\n\r\n updateStartDate(start) {\r\n if (start) {\r\n this.attr.selectedRange.min =\r\n this.attr.rawAttr.dataType !== 'Datetime'\r\n ? moment(start)\r\n .toISOString()\r\n .slice(0, 10)\r\n : moment(start).toISOString();\r\n } else {\r\n delete this.attr.selectedRange.min;\r\n }\r\n this.checkDateValidation();\r\n }\r\n\r\n updateEndDate(end) {\r\n if (end) {\r\n this.attr.selectedRange.max =\r\n this.attr.rawAttr.dataType !== 'Datetime'\r\n ? moment(end)\r\n .startOf('day')\r\n .toISOString()\r\n .slice(0, 10)\r\n : moment(end).toISOString();\r\n } else {\r\n delete this.attr.selectedRange.max;\r\n }\r\n this.checkDateValidation();\r\n }\r\n\r\n checkDateValidation() {\r\n if (this.dynamicDates) {\r\n !this.attr.anyValue\r\n ? this.dynamicDates.$setValidity('required', Object.keys(this.attr.selectedRange).length !== 0)\r\n : this.dynamicDates.$setValidity('required', true);\r\n }\r\n }\r\n}\r\n\r\nexport const freeformFilterComponent = {\r\n template,\r\n controller: FreeformFilterController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n attr: '<',\r\n getHelp: '&'\r\n }\r\n};\r\n","import template from './list-filter.component.html';\r\nimport { AttributeFilterController } from '../attribute-filter.component';\r\n\r\nclass ListFilterController extends AttributeFilterController {\r\n\tconstructor() {\r\n\t\t'ngInject';\r\n\t\tsuper();\r\n\t}\r\n\r\n\t$onInit() {\r\n\t\tthis.setHelp();\r\n\t}\r\n\r\n\tsetHelp() {\r\n\t\tthis.getHelp({ help: 'list' });\r\n\t}\r\n\r\n\ttoggleAnyValue() {\r\n\t\tthis.attr.anyValue = !this.attr.anyValue;\r\n\t}\r\n\r\n\taddValue() {\r\n\t\tif (this.listFilterForm.$valid) {\r\n\t\t\tsuper.addValue();\r\n\t\t} else {\r\n\t\t\tsuper.validateForm(this.listFilterForm);\r\n\t\t}\r\n\t}\r\n\r\n\tgetForm($index) {\r\n\t\treturn this[`valueForm${$index}`];\r\n\t}\r\n\r\n\tgetFormField($index, field) {\r\n\t\treturn this.getForm($index)[`${field}`];\r\n\t}\r\n\r\n\t// getErrorType($index) {\r\n\t// \treturn super.getErrorType($index);\r\n\t// }\r\n}\r\n\r\nexport const listFilterComponent = {\r\n\ttemplate,\r\n\tcontroller: ListFilterController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tattr: '<',\r\n\t\tgetHelp: '&'\r\n\t}\r\n};\r\n","import 'moment';\r\nimport template from './date-filter.component.html';\r\nimport { AttributeFilterController } from '../attribute-filter.component';\r\n\r\nclass DateFilterController extends AttributeFilterController {\r\n\tconstructor() {\r\n\t\t'ngInject';\r\n\t\tsuper();\r\n\r\n\t\tthis.showPresets = false;\r\n\t\tthis.showDates = true;\r\n\t}\r\n\r\n\t$onInit() {\r\n\t\tthis.showTimes = this.attr.rawAttr.dataType === 'Datetime';\r\n\t\tthis.attr.selectedRange ? this.setSelectedRange() : (this.start = this.end = null);\r\n\t\tthis.attr.rawAttr.range ? this.setRange() : (this.min = this.max = null);\r\n\t}\r\n\r\n\t$postLink() {\r\n\t\tthis.setHelp();\r\n\t}\r\n\r\n\tsetSelectedRange() {\r\n\t\tconst { selectedRange } = this.attr;\r\n\t\tthis.start = selectedRange.min ? moment(selectedRange.min).toDate() : null;\r\n\t\tthis.end = selectedRange.max ? moment(selectedRange.max).toDate() : null;\r\n\t}\r\n\r\n\tsetRange() {\r\n\t\tconst { range } = this.attr.rawAttr;\r\n\t\tthis.min = range.min ? moment(range.min).toDate() : null;\r\n\t\tthis.max = range.max ? moment(range.max).toDate() : null;\r\n\t}\r\n\r\n\tsetHelp() {\r\n\t\tthis.getHelp({ help: 'dateRange' });\r\n\t}\r\n\r\n\tupdateStartDate(start) {\r\n\t\tif (start) {\r\n\t\t\tthis.attr.selectedRange.min =\r\n\t\t\t\tthis.attr.rawAttr.dataType !== 'Datetime'\r\n\t\t\t\t\t? moment(start)\r\n\t\t\t\t\t\t\t.toISOString()\r\n\t\t\t\t\t\t\t.slice(0, 10)\r\n\t\t\t\t\t: moment(start).toISOString();\r\n\t\t} else {\r\n\t\t\tdelete this.attr.selectedRange.min;\r\n\t\t}\r\n\t\tthis.checkDateValidation();\r\n\t}\r\n\r\n\tupdateEndDate(end) {\r\n\t\tif (end) {\r\n\t\t\tthis.attr.selectedRange.max =\r\n\t\t\t\tthis.attr.rawAttr.dataType !== 'Datetime'\r\n\t\t\t\t\t? moment(end)\r\n\t\t\t\t\t\t\t.startOf('day')\r\n\t\t\t\t\t\t\t.toISOString()\r\n\t\t\t\t\t\t\t.slice(0, 10)\r\n\t\t\t\t\t: moment(end).toISOString();\r\n\t\t} else {\r\n\t\t\tdelete this.attr.selectedRange.max;\r\n\t\t}\r\n\t\tthis.checkDateValidation();\r\n\t}\r\n\r\n\tcheckDateValidation() {\r\n\t\tif (this.dateFilterForm) {\r\n\t\t\tthis.dateFilterForm.$setValidity('required', Object.keys(this.attr.selectedRange).length !== 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const dateFilterComponent = {\r\n\ttemplate,\r\n\tcontroller: DateFilterController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tattr: '<',\r\n\t\tgetHelp: '&'\r\n\t}\r\n};\r\n","import template from './range-filter.component.html';\r\n\r\nclass RangeFilterController {\r\n\tconstructor() {}\r\n\r\n\t$onInit() {\r\n\t\tthis.min = this.attr.range && this.attr.range.min ? this.attr.range.min : null;\r\n\r\n\t\tthis.max = this.attr.range && this.attr.range.max ? this.attr.range.max : null;\r\n\r\n\t\tif (this.attr.rawAttr.dataType === 'Integer') {\r\n\t\t\tthis.pattern = /\\d+/;\r\n\t\t\tthis.inputType = 'number';\r\n\t\t} else {\r\n\t\t\tthis.pattern = /.+/;\r\n\t\t\tthis.inputType = 'text';\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const rangeFilterComponent = {\r\n\ttemplate,\r\n\tcontroller: RangeFilterController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tattr: '<'\r\n\t}\r\n};\r\n","import template from './filter-input.template.html';\r\nimport DebouncedToggle from '../../../../components/debounced-toggle';\r\n\r\nclass FilterInputController extends DebouncedToggle {\r\n\tconstructor($timeout) {\r\n\t\t'ngInject';\r\n\r\n\t\tsuper($timeout);\r\n\r\n\t\tthis.toggle = false;\r\n\t}\r\n\r\n\t$onInit() {}\r\n\r\n\ttoggleDropdown() {\r\n\t\tthis.toggle = !this.toggle;\r\n\t}\r\n\r\n\toptionClicked(option) {\r\n\t\tthis.toggleDropdown();\r\n\t\tthis.update({ item: option });\r\n\t\tthis.searchTerm = undefined;\r\n\t}\r\n\r\n\tremoveOption(option) {\r\n\t\tthis.toggleDropdown();\r\n\t\tthis.remove({ item: option });\r\n\t\tthis.searchTerm = undefined;\r\n\t}\r\n\r\n\tpushAndSortBy(array, item) {\r\n\t\tarray.push(item);\r\n\t\treturn _.sortBy(array, 'label');\r\n\t}\r\n\r\n\tcloseDropdown() {\r\n\t\tthis._debounceToggle()\r\n\t\t\t.then(() => (this.toggle = false))\r\n\t\t\t.catch(this._ignore);\r\n\t}\r\n\r\n\tshouldShowBadge() {\r\n\t\treturn !this.toggle && this.selected && this.selected.length > 0;\r\n\t}\r\n\r\n\thasSingleValue(selectedOption) {\r\n\t\tconst { selectedValues } = selectedOption;\r\n\t\treturn !!selectedValues && selectedValues.length === 1;\r\n\t}\r\n\r\n\thasMultipleValues(selectedOption) {\r\n\t\tconst { selectedValues } = selectedOption;\r\n\t\treturn !!selectedValues && selectedValues.length > 1;\r\n\t}\r\n\r\n\tisAny(selectedOption) {\r\n\t\tconst { anyValue, selectedValues } = selectedOption;\r\n\t\treturn anyValue && (!selectedValues || selectedValues.length === 0);\r\n\t}\r\n\r\n\tisRange(selectedOption) {\r\n\t\tconst { selectedRange } = selectedOption;\r\n\t\treturn !!selectedRange && (selectedRange.min || selectedRange.max);\r\n\t}\r\n\r\n\tgetSelectedRangeType(selectedOption) {\r\n\t\tconst { selectedRange } = selectedOption;\r\n\t\tif (selectedRange.min && selectedRange.max) {\r\n\t\t\treturn 'min-max';\r\n\t\t} else if (selectedRange.min && !selectedRange.max) {\r\n\t\t\treturn 'min';\r\n\t\t} else {\r\n\t\t\treturn 'max';\r\n\t\t}\r\n\t}\r\n\r\n\trenderMinMax(selectedOption) {\r\n\t\tconst { selectedRange } = selectedOption;\r\n\t\tif (typeof selectedRange.min === 'string' || typeof selectedRange.max === 'string') {\r\n\t\t\tconst min = moment(selectedRange.min);\r\n\t\t\tconst max = moment(selectedRange.max);\r\n\t\t\treturn `${min.format('L')} - ${max.format('L')}`;\r\n\t\t}\r\n\t\treturn `${selectedRange.min} - ${selectedRange.max}`;\r\n\t}\r\n\r\n\trenderMin(selectedOption) {\r\n\t\tconst { selectedRange } = selectedOption;\r\n\t\tif (typeof selectedRange.min === 'string') {\r\n\t\t\tconst min = moment(selectedRange.min);\r\n\t\t\treturn `> ${min.format('L')}`;\r\n\t\t}\r\n\t\treturn `> ${selectedRange.min}`;\r\n\t}\r\n\r\n\trenderMax(selectedOption) {\r\n\t\tconst { selectedRange } = selectedOption;\r\n\t\tif (typeof selectedRange.max === 'string') {\r\n\t\t\tconst max = moment(selectedRange.max);\r\n\t\t\treturn `< ${max.format('L')}`;\r\n\t\t}\r\n\t\treturn `< ${selectedRange.max}`;\r\n\t}\r\n\r\n\tisSelected(option) {\r\n\t\treturn _.find(this.selected, 'key', option.key) != null;\r\n\t}\r\n}\r\n\r\nexport const FilterInputComponent = {\r\n\ttemplate,\r\n\tcontroller: FilterInputController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tlabel: '@',\r\n\t\toptions: '<',\r\n\t\tselected: '<',\r\n\t\tupdate: '&',\r\n\t\tremove: '&'\r\n\t}\r\n};\r\n","import moment from 'moment';\r\nimport template from './range-date.template.html';\r\n\r\nclass RangeDateController {\r\n constructor($rootScope, gettextCatalog, dateUtil, appSettings) {\r\n 'ngInject';\r\n this.dateUtil = dateUtil;\r\n this.$rootScope = $rootScope;\r\n this.appSettings = appSettings;\r\n\r\n this.timeRangePresets = [\r\n {\r\n value: 1,\r\n label: gettextCatalog.getString('24hrs'),\r\n tooltip: gettextCatalog.getString('Last 24 Hours')\r\n },\r\n {\r\n value: 7,\r\n label: gettextCatalog.getString('7d'),\r\n tooltip: gettextCatalog.getString('Last 7 Days')\r\n },\r\n {\r\n value: 30,\r\n label: gettextCatalog.getString('30d'),\r\n tooltip: gettextCatalog.getString('Last 30 Days')\r\n }\r\n ];\r\n\r\n this.datepickerFormat = 'M/d/yy';\r\n this.datepickerTimeFormat = 'M/d/yy h:mm a';\r\n this.startOpened = this.endOpened = false;\r\n this.invalidStartDate = this.invalidEndDate = false;\r\n this.locale = 'en';\r\n this.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];\r\n this.currentFormat = this.formats[1];\r\n this.timeSelected = false;\r\n }\r\n\r\n $onInit() {\r\n if (this.$rootScope.currentUser) {\r\n this.locale = this.$rootScope.currentUser.claims.data.language;\r\n }\r\n this.dateFormat = this.appSettings.GetDateFormat();\r\n this.setMinDate();\r\n this.setMaxDate();\r\n }\r\n\r\n setMinDate() {\r\n this.start = !this.startRang || this.startRang >= this.minDate ? this.minDate : this.startRange;\r\n }\r\n\r\n setMaxDate() {\r\n this.end = !this.endRange || this.endRange <= this.maxDate ? this.maxDate : this.endRange;\r\n }\r\n\r\n endChanged() {\r\n this.updateEndDate({\r\n endDate: this.endRange\r\n });\r\n }\r\n\r\n startChanged() {\r\n this.updateStartDate({\r\n startDate: this.startRange\r\n });\r\n }\r\n\r\n openStart() {\r\n this.startOpened = !this.startOpened;\r\n }\r\n\r\n openEnd() {\r\n this.endOpened = !this.endOpened;\r\n }\r\n\r\n showTime() {\r\n this.timeSelected = !this.timeSelected;\r\n }\r\n\r\n hasProperty() {\r\n return Object.keys(this.attr.selectedRange).length === 0;\r\n }\r\n //------------------------------------------------------------------------------------------------------------------------------------\r\n\r\n selectPreset(preset) {\r\n //update the start and end values\r\n $('#btn-1').blur();\r\n $('#btn-7').blur();\r\n $('#btn-30').blur();\r\n\r\n // Assigning the updated values\r\n this.startRange = moment()\r\n .subtract(preset.value, 'days')\r\n .startOf('minute')\r\n .toDate();\r\n this.endRange = moment()\r\n .startOf('minute')\r\n .toDate();\r\n this.maxDate = this.endRange();\r\n\r\n this.updateStartDate({\r\n startDate: this.startRange\r\n });\r\n this.updateEndDate({\r\n endDate: this.endRange\r\n });\r\n }\r\n\r\n // Boolean trigger to set 24h/7d/30d button to .active\r\n diffWithinParams(option) {\r\n if (moment(this.endRange, 'YYYY-MM-DD').isSame(this.maxDate, 'day')) {\r\n // Calculate the date from the option selected ( subtracting it from this.endRange)\r\n let dateFromOption = moment(this.endRange)\r\n .subtract(option.value, 'days')\r\n .toDate();\r\n // Returning is both the calulated date and startRange match up to the minute\r\n return moment(dateFromOption).isSame(this.startRange, 'minute');\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport const RangeDateComponent = {\r\n template,\r\n controller: RangeDateController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n attr: '<',\r\n disabled: '<',\r\n showPresets: '<',\r\n showDates: '<',\r\n showTimes: '<',\r\n initDate: '<',\r\n startRange: ' 0,\r\n selected: (assets.list || []).filter((a) => a.selected),\r\n };\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n }\r\n\r\n navigateToAsset(asset) {\r\n this.$state.go('equipment.detail', {\r\n equipmentId: asset.id,\r\n title: asset.name,\r\n });\r\n }\r\n\r\n toggleFilters() {\r\n this.showFilters = !this.showFilters;\r\n }\r\n\r\n hasMoreResults() {\r\n return this.currentPage < this.totalPages;\r\n }\r\n\r\n export() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportClicked,\r\n });\r\n this.searchExport();\r\n }\r\n transfer() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.transferClicked,\r\n });\r\n }\r\n\r\n update() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editClicked,\r\n });\r\n this.$state.go('equipment.edit');\r\n }\r\n}\r\n","import { noNulls, pluckValue } from '../filters.component';\r\n\r\nexport const FILTER_TYPES = {\r\n text: 'text',\r\n date: 'date',\r\n datetime: 'datetime',\r\n integer: 'integer',\r\n decimal: 'decimal',\r\n};\r\n\r\nconst validatorTypeMap = {\r\n Decimal: 'decimal',\r\n Integer: 'integer',\r\n Text: 'empty',\r\n};\r\n\r\nconst validatorMap = {\r\n decimal: /^-?(0|[1-9]\\d*)(\\.\\d+)?$/,\r\n integer: /^-?(0|[1-9]\\d*)$/,\r\n empty: /^\\S+\\s*\\S*$/,\r\n};\r\n\r\nconst getValidator = (dataType) => validatorMap[validatorTypeMap[dataType] || 'empty'];\r\n\r\n/* @abstract */\r\nexport class AttributeFilter {\r\n constructor(rawAttr) {\r\n const { id, key } = rawAttr;\r\n this.rawAttr = rawAttr;\r\n this.id = id;\r\n this.key = key;\r\n this.label = key;\r\n this.applied = false;\r\n this.anyValue = false;\r\n this.selectedValues = [];\r\n this.selectedRange = {};\r\n this.freeform = rawAttr.freeform;\r\n this.range = rawAttr.range;\r\n this.validator = getValidator(rawAttr.dataType);\r\n }\r\n}\r\n\r\nexport class FreeformAttributeFilter extends AttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.text;\r\n }\r\n}\r\n\r\nexport class DateAttributeFilter extends FreeformAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.date;\r\n }\r\n}\r\n\r\nexport class DatetimeAttributeFilter extends DateAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.datetime;\r\n }\r\n}\r\n\r\nexport class IntegerAttributeFilter extends FreeformAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.integer;\r\n }\r\n}\r\n\r\nexport class DecimalAttributeFilter extends IntegerAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.decimal;\r\n }\r\n}\r\n\r\nexport class ListAttributeFilter extends FreeformAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n\r\n this.validValues = this.values = rawAttr.values.filter(noNulls).map(pluckValue);\r\n this.selectedValues = [];\r\n }\r\n}\r\n\r\n/* @abstract */\r\nexport class RangeAttributeFilter extends FreeformAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.freeform = false;\r\n }\r\n}\r\n\r\nexport class DateRangeAttributeFilter extends RangeAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.date;\r\n }\r\n}\r\n\r\nexport class IntegerRangeAttributeFilter extends RangeAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.integer;\r\n }\r\n}\r\n\r\nexport class DecimalRangeAttributeFilter extends IntegerRangeAttributeFilter {\r\n constructor(rawAttr) {\r\n super(rawAttr);\r\n this.TYPE = FILTER_TYPES.decimal;\r\n }\r\n}\r\n\r\nexport const mapFilter = (item) => {\r\n const { dataType, freeform, values } = item;\r\n\r\n if (dataType === 'Date' || dataType === 'Datetime') {\r\n return freeform ? new DateAttributeFilter(item) : new DateRangeAttributeFilter(item);\r\n }\r\n\r\n if (dataType === 'Integer') {\r\n return freeform ? new IntegerAttributeFilter(item) : new IntegerRangeAttributeFilter(item);\r\n }\r\n\r\n if (dataType === 'Decimal') {\r\n return freeform ? new DecimalAttributeFilter(item) : new DecimalRangeAttributeFilter(item);\r\n }\r\n\r\n if (values && values.length > 0) {\r\n return new ListAttributeFilter(item);\r\n }\r\n\r\n return new FreeformAttributeFilter(item);\r\n};\r\n","import {sortBy, difference, uniq} from 'lodash-es';\r\nimport DebouncedToggle from '../../../components/debounced-toggle';\r\n\r\nimport * as SearchActions from '../../../state/search/search.action';\r\nimport template from './filters.component.html';\r\nimport {mapFilter} from './attribute-filter/attribute-filter.models';\r\n\r\nexport const noNulls = item => item != null && item !== '';\r\nexport const pluckValue = item => (item.value ? item.value : item);\r\nexport const isSelected = item => item._selected === true;\r\n\r\nconst adaptTagFilters = selectedFilters => {\r\n const filterObj = {};\r\n\r\n selectedFilters.forEach(item => {\r\n const rangeExists = !!item.selectedRange && (!!item.selectedRange.min || !!item.selectedRange.max);\r\n if (!rangeExists || item.anyValue) {\r\n const values = item.selectedValues || [];\r\n filterObj[item.key] = item.anyValue ? {any: true} : values.filter(noNulls).map(pluckValue);\r\n } else {\r\n filterObj[item.key] = adaptRange({max: item.selectedRange.max, min: item.selectedRange.min});\r\n }\r\n });\r\n\r\n return filterObj;\r\n};\r\n\r\nconst adaptRange = selectedRange => {\r\n const newRange = {};\r\n if (selectedRange) {\r\n if (selectedRange.min) {\r\n newRange.min = selectedRange.min;\r\n }\r\n\r\n if (selectedRange.max) {\r\n newRange.max = selectedRange.max;\r\n }\r\n }\r\n\r\n return newRange;\r\n};\r\n\r\nclass AssetFiltersController extends DebouncedToggle {\r\n constructor($ngRedux, $timeout) {\r\n 'ngInject';\r\n\r\n super($timeout);\r\n\r\n this.store = $ngRedux;\r\n\r\n this.communicatedLabel = 'Communicated';\r\n this.selectedAttr = null;\r\n this.selectedAttrFilters = this.selectedSecurityGroups = [];\r\n this.showModal = false;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n toggleModal() {\r\n this.showModal = !this.showModal;\r\n }\r\n\r\n mapStateToThis(state) {\r\n const currentState = state;\r\n const {tagFilters} = currentState.search;\r\n let {securityGroups, accounts, lastSeen, lastCommunicated} = currentState.search;\r\n\r\n securityGroups = securityGroups.map(g => ({\r\n ...g,\r\n label: g.name\r\n }));\r\n\r\n let selectedSecurityGroups = securityGroups.filter(isSelected);\r\n securityGroups = difference(securityGroups, selectedSecurityGroups);\r\n\r\n const selectedAccounts = accounts.filter(isSelected);\r\n const unSelectedAccounts = difference(accounts, selectedAccounts);\r\n\r\n const {items} = state.attributes;\r\n const allAttrFilters = items.map(mapFilter);\r\n\r\n let attrFilters = [];\r\n let selectedAttrFilters = [];\r\n\r\n Object.keys(tagFilters).forEach(key => {\r\n const filter = allAttrFilters.find(attrFilter => attrFilter.key.toLowerCase() === key.toLowerCase());\r\n if (filter) {\r\n const {any, min, max} = tagFilters[key];\r\n\r\n let selectedValues = [];\r\n if (!min && !max) {\r\n const filterValues = any ? [] : tagFilters[key];\r\n selectedValues = filterValues.filter(noNulls);\r\n }\r\n\r\n selectedAttrFilters.push({\r\n ...filter,\r\n _selected: true,\r\n anyValue: !!any,\r\n selectedRange: adaptRange({min, max}),\r\n selectedValues: [...selectedValues]\r\n });\r\n }\r\n });\r\n\r\n allAttrFilters.forEach(prop => {\r\n const filter = selectedAttrFilters.find(filterItem => filterItem.key === prop.key);\r\n if (!filter) {\r\n attrFilters.push({...prop, _selected: false});\r\n }\r\n });\r\n\r\n attrFilters = sortBy(attrFilters, 'label');\r\n selectedAttrFilters = sortBy(selectedAttrFilters, 'label');\r\n securityGroups = sortBy(securityGroups, 'label');\r\n selectedSecurityGroups = sortBy(selectedSecurityGroups, 'label');\r\n\r\n const [lastSeenFilter] = lastSeen || [];\r\n\r\n return {\r\n securityGroups,\r\n selectedSecurityGroups,\r\n attrFilters,\r\n selectedAttrFilters,\r\n accounts: unSelectedAccounts,\r\n selectedAccounts,\r\n lastSeenFilter,\r\n lastCommunicated\r\n };\r\n }\r\n\r\n updateSecurityGroupFacet(group) {\r\n if (!group._selected) {\r\n this.selectFacet(SearchActions.SECURITY_GROUPS_FACET_TYPE, group);\r\n } else {\r\n this.deselectFacet(SearchActions.SECURITY_GROUPS_FACET_TYPE, group);\r\n }\r\n }\r\n\r\n addAttrFilter(item) {\r\n this.selectedAttr = item;\r\n }\r\n\r\n applyAttrFilter(filter) {\r\n if (filter) {\r\n let existingFilters = [...this.selectedAttrFilters];\r\n let selectedFilter = existingFilters.find(existingFilter => existingFilter.id === filter.id);\r\n if (!selectedFilter) {\r\n selectedFilter = {...filter};\r\n existingFilters.push(selectedFilter);\r\n }\r\n\r\n if (!filter.anyValue) {\r\n selectedFilter.values = filter.values;\r\n selectedFilter.selectedValues = uniq(filter.selectedValues);\r\n selectedFilter.selectedRange = adaptRange(filter.selectedRange);\r\n }\r\n\r\n const adaptedFilters = existingFilters && existingFilters.length > 0 ? adaptTagFilters(existingFilters) : [];\r\n\r\n this.updateTagFilters(adaptedFilters, true);\r\n }\r\n }\r\n\r\n removeAttrFilter(attr) {\r\n const filtered = this.selectedAttrFilters.filter(item => {\r\n const keep = item.id !== attr.id;\r\n if (!keep) {\r\n item.applied = false;\r\n item._selected = false;\r\n }\r\n return keep;\r\n });\r\n\r\n const adaptedFilters = filtered && filtered.length > 0 ? adaptTagFilters(filtered) : [];\r\n\r\n this.updateTagFilters(adaptedFilters, true);\r\n }\r\n\r\n clearSelected() {\r\n this.closeModal();\r\n this.selectedAttr = null;\r\n\r\n // trim invalid inputs\r\n [this.selectedAttrFilters, this.attrFilters].forEach(filterGroup => {\r\n filterGroup.forEach(filter => {\r\n const currentSelectedValues = filter.selectedValues ? filter.selectedValues : [];\r\n if (currentSelectedValues.length > 0) {\r\n filter.selectedValues = currentSelectedValues.filter(noNulls);\r\n }\r\n });\r\n });\r\n }\r\n\r\n _preventBubbling($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n toggleAdvancedFilters($event) {\r\n this._preventBubbling($event);\r\n this._debounceToggle()\r\n .then(() => (this.showAdvancedFilters = !this.showAdvancedFilters))\r\n .catch(this._ignore);\r\n }\r\n\r\n hideAdvanced() {\r\n this._debounceToggle()\r\n .then(() => (this.showAdvancedFilters = false))\r\n .catch(this._ignore);\r\n }\r\n\r\n addAccount(account) {\r\n this.addAccount(account);\r\n }\r\n\r\n removeAccount(account) {\r\n this.removeAccount(account);\r\n }\r\n\r\n updateLastSeenOption(option) {\r\n this.updateLastSeen(option);\r\n }\r\n onSelectCommunicatedAt(option = {}) {\r\n this.exclusiveSelectFacet(SearchActions.COMMUNICATED_AT_FACET_TYPE, option);\r\n }\r\n onClearCommunicatedAt(option = {}) {\r\n this.exclusiveDeselectFacet(SearchActions.COMMUNICATED_AT_FACET_TYPE, option);\r\n }\r\n}\r\n\r\nexport const assetFiltersComponent = {\r\n template,\r\n controller: AssetFiltersController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n closeFilters: '&',\r\n closeModal: '&'\r\n }\r\n};\r\n","import { AttributeFilterController } from '../attribute-filter.component';\r\n\r\nimport template from './numeric-range-filter.component.html';\r\n\r\nclass NumericRangeController extends AttributeFilterController {\r\n\tconstructor($filter) {\r\n\t\t'ngInject';\r\n\t\tsuper();\r\n\r\n\t\tthis.translateFilter = $filter('translate');\r\n\t}\r\n\r\n\t$onInit() {\r\n\t\tthis.attr.selectedRange = this.attr.selectedRange || {};\r\n\t\tthis.setHelp();\r\n\t}\r\n\r\n\tsetHelp() {\r\n\t\tthis.getHelp({ help: 'numericRange' });\r\n\t}\r\n\r\n\tgetTranslation(text) {\r\n\t\treturn text.length > 0 ? this.translateFilter(text) : text;\r\n\t}\r\n\r\n\tgetRangeStartPlaceholder() {\r\n\t\tlet text = '';\r\n\t\tif (this.attr.range) {\r\n\t\t\tconst { min } = this.attr.range;\r\n\t\t\ttext = min ? `Enter a value of at least ${min}` : `Enter a number`;\r\n\t\t}\r\n\t\treturn this.getTranslation(text);\r\n\t}\r\n\r\n\tgetRangeEndPlaceholder() {\r\n\t\tlet text = '';\r\n\t\tif (this.attr.range) {\r\n\t\t\tconst { max } = this.attr.range;\r\n\t\t\ttext = max ? `Enter a value no greater than ${max}` : `Enter a number`;\r\n\t\t}\r\n\t\treturn this.getTranslation(text);\r\n\t}\r\n\r\n\ttoggleAnyValue() {\r\n\t\tthis.attr.anyValue = !this.attr.anyValue;\r\n\t}\r\n\r\n\tentryInvalid(field) {\r\n\t\treturn !!field && field.$touched && Object.keys(field.$error).length > 0;\r\n\t}\r\n\r\n\tgetErrorType(field) {\r\n\t\tif (this.hasRequiredError(field)) {\r\n\t\t\treturn 'required';\r\n\t\t} else if (this.hasInvalidMin(field)) {\r\n\t\t\treturn 'min';\r\n\t\t} else if (this.hasInvalidMax(field)) {\r\n\t\t\treturn 'max';\r\n\t\t} else if (this.hasInvalidPattern(field)) {\r\n\t\t\treturn `${this.attr.rawAttr.dataType.toLowerCase()}-pattern`;\r\n\t\t}\r\n\t}\r\n\r\n\thasRequiredError(field) {\r\n\t\treturn super.supportsError(field) && !!field.$error.required;\r\n\t}\r\n\r\n\thasInvalidMin(field) {\r\n\t\treturn super.supportsError(field) && !!field.$error.min;\r\n\t}\r\n\r\n\thasInvalidMax(field) {\r\n\t\treturn super.supportsError(field) && !!field.$error.max;\r\n\t}\r\n\r\n\thasInvalidPattern(field) {\r\n\t\treturn super.supportsError(field) && (!!field.$error.pattern || !!field.$error.number);\r\n\t}\r\n}\r\n\r\nexport const numericRangeFilterComponent = {\r\n\ttemplate,\r\n\tcontroller: NumericRangeController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tattr: '<',\r\n\t\tgetHelp: '&'\r\n\t}\r\n};\r\n","import template from './invalid-entry-messaging.component.html';\r\n\r\nclass InvalidEntryMessagingController {\r\n\tconstructor() {}\r\n\r\n\t$onInit() {\r\n\t\tif (!this.min) {\r\n\t\t\tthis.min = 0;\r\n\t\t}\r\n\r\n\t\tif (!this.max) {\r\n\t\t\tthis.max = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t$onDestroy() {}\r\n}\r\n\r\nexport const invalidEntryMessagingComponent = {\r\n\ttemplate,\r\n\tcontroller: InvalidEntryMessagingController,\r\n\tcontrollerAs: 'vm',\r\n\tbindings: {\r\n\t\tshow: '<',\r\n\t\terrorType: '<',\r\n\t\tmin: ' this.driver.reset())\r\n .catch(this._ignore);\r\n }\r\n\r\n _preventBubbling($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n highlightWildcard($event) {\r\n this._preventBubbling($event);\r\n\r\n this.driver.highlight({\r\n element: '.search-input-container .fa-info-circle',\r\n popover: {\r\n title: this.gettextCatalog.getString('Wildcard Search'),\r\n description: this.gettextCatalog.getString('Find out more about wildcard searches'),\r\n position: 'below'\r\n }\r\n });\r\n }\r\n\r\n highlightHistory($event) {\r\n this._preventBubbling($event);\r\n\r\n this.driver.highlight({\r\n element: '.asset-search-history a',\r\n popover: {\r\n title: this.gettextCatalog.getString('Search History'),\r\n description: this.gettextCatalog.getString('View your recent searches'),\r\n position: 'below',\r\n showButtons: false,\r\n closeBtnText: 'Close'\r\n }\r\n });\r\n }\r\n\r\n highlightFavourites($event) {\r\n this._preventBubbling($event);\r\n\r\n this.driver.highlight({\r\n element: '.asset-search-history a',\r\n popover: {\r\n title: this.gettextCatalog.getString('Favorites'),\r\n description: this.gettextCatalog.getString('Select, edit and save favorites'),\r\n position: 'below'\r\n }\r\n });\r\n }\r\n\r\n highlightAdvanced($event) {\r\n this._preventBubbling($event);\r\n\r\n this.driver.highlight({\r\n element: '.advanced-filters-toggle',\r\n popover: {\r\n title: this.gettextCatalog.getString('Advanced Filters'),\r\n description: this.gettextCatalog.getString('Apply advanced filters to the data selection'),\r\n position: 'left'\r\n }\r\n });\r\n }\r\n\r\n highlightColumnSelection($event) {\r\n this._preventBubbling($event);\r\n\r\n this.driver.highlight({\r\n element: '.table-column-spacer .btn',\r\n popover: {\r\n title: this.gettextCatalog.getString('Column Selection'),\r\n description: this.gettextCatalog.getString('Select what columns you want to see in the table'),\r\n position: 'left'\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template: require('./highlights.template.html'),\r\n controller: highlightsComponent,\r\n controllerAs: 'vm',\r\n bindings: {}\r\n};\r\n","import { clone } from '../../../utility/immutability.util.service';\r\nimport * as SearchActions from '../../../state/search/search.action';\r\n\r\nclass FilterOverviewComponent {\r\n constructor($state, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.$state = $state;\r\n this.store = $ngRedux;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { search } = state;\r\n const { query } = search;\r\n const appliedFilters = buildFilterReview(search);\r\n\r\n return {\r\n searchString: query,\r\n loading: search.inProgress,\r\n search: search,\r\n appliedFilters,\r\n showOverview:\r\n query.length > 0 || appliedFilters.filtersCount > 0 || Object.keys(appliedFilters.tags || {}).length > 0\r\n };\r\n }\r\n\r\n deselectAlert(value) {\r\n this.deselectFacet(SearchActions.ALERTS_FACET_TYPE, value);\r\n }\r\n\r\n deselectMaintenance(value) {\r\n this.deselectFacet(SearchActions.MAINTENANCE_STATUS_FACET_TYPE, value);\r\n }\r\n\r\n deselectLastCommunicated(value) {\r\n this.deselectFacet(SearchActions.COMMUNICATED_AT_FACET_TYPE, value);\r\n }\r\n\r\n deselectSecurityGroup(value) {\r\n this.deselectFacet(SearchActions.SECURITY_GROUPS_FACET_TYPE, value);\r\n }\r\n\r\n deselectAccount(account) {\r\n this.removeAccount(account);\r\n }\r\n\r\n deselectLastSeen() {\r\n this.updateLastSeen(null);\r\n }\r\n\r\n removeSearchTerm(value) {\r\n this.removeQuery(value);\r\n }\r\n\r\n removeTagFilter(key) {\r\n this.removeTAGFilter(key);\r\n }\r\n\r\n clearAll() {\r\n this.resetSearch();\r\n }\r\n\r\n isArray(value) {\r\n return Array.isArray(value);\r\n }\r\n\r\n toggleAccordion() {\r\n let panel = document.getElementById('panel');\r\n let button = document.getElementById('toggle-accordion');\r\n panel.classList.toggle('close');\r\n button.classList.toggle('toggle-hide');\r\n }\r\n}\r\n\r\nconst buildFilterReview = search => {\r\n const selectedAlerts = search.alerts.filter(alert => alert._selected);\r\n const selectedMaintenance = search.maintenance.filter(maintenance => maintenance._selected);\r\n const selectedLastCommunicated = search.lastCommunicated.filter(lastCommunicated => lastCommunicated._selected);\r\n const selectedSecurityGroups = search.securityGroups.filter(securityGroup => securityGroup._selected);\r\n const selectedAccounts = search.accounts.filter(accounts => accounts._selected);\r\n\r\n const filtersCount =\r\n selectedAlerts.length +\r\n selectedMaintenance.length +\r\n selectedLastCommunicated.length +\r\n selectedSecurityGroups.length +\r\n selectedAccounts.length +\r\n (search.lastSeen || []).length;\r\n //TODO: figure out how to parse tag filters\r\n return {\r\n alerts: selectedAlerts,\r\n maintenance: selectedMaintenance,\r\n lastCommunicated: selectedLastCommunicated,\r\n securityGroups: selectedSecurityGroups,\r\n tags: search.tagFilters,\r\n accounts: search.accounts.filter(acc => acc._selected),\r\n lastSeen: search.lastSeen,\r\n filtersCount\r\n };\r\n};\r\n\r\nexport default {\r\n template: require('./filter-overview.html'),\r\n controller: FilterOverviewComponent,\r\n controllerAs: 'vm',\r\n bindings: {}\r\n};\r\n","import angular from 'angular';\r\n\r\nimport { attributeFilterComponent } from './filters/attribute-filter/attribute-filter.component';\r\nimport { freeformFilterComponent } from './filters/attribute-filter/freeform-filter/freeform-filter.component';\r\nimport { listFilterComponent } from './filters/attribute-filter/list-filter/list-filter.component';\r\nimport { dateFilterComponent } from './filters/attribute-filter/date-filter/date-filter.component';\r\nimport { rangeFilterComponent } from './filters/attribute-filter/range-filter/range-filter.component';\r\nimport { FilterInputComponent } from './filters/filter-input/filter-input.component';\r\nimport { RangeDateComponent } from './filters/attribute-filter/range-date/range-date.component';\r\nimport { EquipmentListController } from './list.controller';\r\nimport { assetFiltersComponent } from './filters/filters.component';\r\nimport { numericRangeFilterComponent } from './filters/attribute-filter/numeric-range-filter/numeric-range-filter.component';\r\nimport { invalidEntryMessagingComponent } from './filters/attribute-filter/invalid-entry-messaging/invalid-entry-messaging.component';\r\nimport NoticeComponent from './notice/notice.component';\r\nimport highlightsComponent from './notice/highlights/highlights.component';\r\nimport FilterOverviewComponent from './filter-overview/filter-overview.component';\r\nconst equipmentListModule = angular.module('equipment.list', []);\r\n\r\nequipmentListModule\r\n .controller('EquipmentListController', EquipmentListController)\r\n\r\n .component('invalidEntry', invalidEntryMessagingComponent)\r\n .component('attributeFilter', attributeFilterComponent)\r\n .component('freeformFilter', freeformFilterComponent)\r\n .component('listFilter', listFilterComponent)\r\n .component('dateFilter', dateFilterComponent)\r\n .component('rangeFilter', rangeFilterComponent)\r\n .component('filterInput', FilterInputComponent)\r\n .component('rangeDate', RangeDateComponent)\r\n .component('assetSearchFilters', assetFiltersComponent)\r\n .component('numericRangeFilter', numericRangeFilterComponent)\r\n .component('notice', NoticeComponent)\r\n .component('highlights', highlightsComponent)\r\n .component('filterOverview', FilterOverviewComponent);\r\n\r\nexport default equipmentListModule.name;\r\n","import * as SearchActions from '../../state/search/search.action';\r\n\r\nexport class ESNController {\r\n constructor($state, $stateParams, $rootScope, EquipmentService, $ngRedux) {\r\n 'ngInject';\r\n this.$state = $state;\r\n this.$rootScope = $rootScope;\r\n this.store = $ngRedux;\r\n this.EquipmentService = EquipmentService;\r\n this.loading = true;\r\n this.items = [];\r\n this.serialNumber = ($stateParams.serialNumber || '').trim();\r\n }\r\n\r\n $onInit() {\r\n if (this.serialNumber) {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n let query = {};\r\n // glc is Genie\r\n if (this.$rootScope.currentUser.claims['tenant:brand'] === 'glc')\r\n query['machine Serial Number'] = this.serialNumber;\r\n else query['onei3:serial'] = this.serialNumber;\r\n\r\n this.EquipmentService.getEquipmentSearch(null, null, null, null, null, null, query)\r\n .then(({ data }) => {\r\n if (data.hits.length === 1) {\r\n const asset = data.hits[0];\r\n this.$state.transitionTo('equipment.detail', {\r\n equipmentId: asset.id,\r\n title: asset.name,\r\n });\r\n } else {\r\n this.items = data.hits;\r\n this.loading = false;\r\n }\r\n })\r\n .catch(() => {\r\n this.loading = false;\r\n });\r\n } else this.$state.transitionTo('equipment.list');\r\n }\r\n\r\n $onDestroy() {\r\n if (this.unsubscribe) this.unsubscribe();\r\n }\r\n\r\n mapStateToThis() {\r\n return {};\r\n }\r\n goToAsset(asset) {\r\n this.$state.transitionTo('equipment.detail', {\r\n equipmentId: asset.id,\r\n title: asset.name,\r\n });\r\n }\r\n goToAssets() {\r\n this.addQuery(this.serialNumber);\r\n this.$state.transitionTo('equipment.list');\r\n }\r\n}\r\n","import angular from 'angular';\r\n\r\nimport { ESNController } from './esn';\r\nconst ESNModule = angular.module('equipment.esn', []);\r\n\r\nESNModule.controller('ESNController', ESNController);\r\n\r\nexport default ESNModule.name;\r\n","import {gettext} from '../../../utility/gettext.util.service';\r\n\r\nexport const RunHourStatus = {\r\n UPDATING: 'updating',\r\n SUCCESS: 'success',\r\n ERROR: 'error',\r\n NOT_REPORTED: 'not_reported'\r\n};\r\n\r\nexport const StatusMessages = {\r\n UPDATING: gettext('Sending sync request.'),\r\n SUCCESS: gettext('Sync request sent successfully, updated run hours will be displayed once it is communicated.'),\r\n ERROR: gettext('An error occurred while trying to update the run hours.'),\r\n GET_RUNHOURS_ERROR: gettext('An error occurred while retrieving the run hours.'),\r\n NOT_REPORTED: gettext('Run hours has not been communicated yet.'),\r\n NOT_REPORTED_M5: gettext('Sync run hours will be available once it is communicated.'),\r\n NOT_REPORTED_Not_M5: gettext('The run hours will be set to the new value once it is communicated.')\r\n};\r\n","export default class {\r\n constructor($uibModalInstance, syncValue, datapointName) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.dtName = datapointName;\r\n this.syncValue = syncValue;\r\n }\r\n ok() {\r\n this.$uibModalInstance.close();\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}\r\n","import template from './sync-runhours.html';\r\nimport { RunHourStatus, StatusMessages } from './sync-runhours.model';\r\n\r\nimport modalTemplate from './confirm-modal/sync-confirm.modal.html';\r\nimport ModalController from './confirm-modal/sync-confirm.modal';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n deviceSetRunHours: 'deviceSetRunHours',\r\n};\r\n\r\nclass SyncRunHoursController {\r\n constructor(syncRunHoursService, $uibModal, gettextCatalog) {\r\n 'ngInject';\r\n\r\n this.syncRunHoursService = syncRunHoursService;\r\n this.$uibModal = $uibModal;\r\n this.setSyncStatus();\r\n this.messages = StatusMessages;\r\n this.gettextCatalog = gettextCatalog;\r\n }\r\n\r\n setSyncStatus(status = '', message = '', info = '', iclass = '') {\r\n if (status === RunHourStatus.NOT_REPORTED) {\r\n this.notcommStatus = {\r\n status,\r\n message,\r\n info,\r\n };\r\n } else {\r\n this.syncStatus = {\r\n status,\r\n message,\r\n info,\r\n iclass,\r\n };\r\n }\r\n }\r\n\r\n $onInit() {\r\n // get reported series if not provided\r\n if (!this.runhoursSeries) {\r\n this.getReportedRunHours();\r\n }\r\n }\r\n\r\n setRunHours(runhoursValue) {\r\n if (runhoursValue >= 0) {\r\n this.setSyncStatus(\r\n RunHourStatus.UPDATING,\r\n this.messages.UPDATING,\r\n '',\r\n 'fa fa-spinner fa-pulse',\r\n );\r\n\r\n dataLayer.push({\r\n event: gtmEvents.deviceSetRunHours,\r\n data: {\r\n installationId: this.installationId,\r\n datapointId: this.datapointId,\r\n },\r\n });\r\n\r\n this.syncRunHoursService\r\n .syncRunHours(this.installationId, this.datapointId, runhoursValue)\r\n .then(() => {\r\n this.setSyncStatus(RunHourStatus.SUCCESS, this.messages.SUCCESS);\r\n })\r\n .catch(() => {\r\n this.setSyncStatus(RunHourStatus.ERROR, this.messages.ERROR);\r\n });\r\n }\r\n }\r\n\r\n getReportedRunHours() {\r\n if (this.equipmentId) {\r\n this.loading = true;\r\n this.syncRunHoursService\r\n .getLastReportedRunHours(this.equipmentId, this.datapointId)\r\n .then((response) => {\r\n const [first] = response.data;\r\n this.runhoursSeries = first;\r\n if (!this.runhoursSeries || !this.runhoursSeries.last) {\r\n this.setSyncStatus(\r\n RunHourStatus.NOT_REPORTED,\r\n this.messages.NOT_REPORTED,\r\n this.messages.NOT_REPORTED_Not_M5,\r\n );\r\n }\r\n })\r\n .catch(() => this.setSyncStatus(RunHourStatus.ERROR, this.messages.GET_RUNHOURS_ERROR))\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n }\r\n\r\n //* ************************ modal *************************\r\n openConfirmationModal(syncValue) {\r\n if (syncValue >= 0) {\r\n this.$uibModal\r\n .open({\r\n animation: true,\r\n size: 'md',\r\n template: modalTemplate,\r\n controller: ModalController,\r\n controllerAs: 'modalVm',\r\n resolve: {\r\n syncValue: () => syncValue,\r\n datapointName: () =>\r\n this.runhoursSeries && this.runhoursSeries.title\r\n ? this.gettextCatalog.getString(this.runhoursSeries.title)\r\n : this.gettextCatalog.getString('Run Hours'),\r\n },\r\n })\r\n .result.then(() => {\r\n // do the sync\r\n this.setRunHours(syncValue);\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n}\r\n\r\nconst SyncRunHoursComponent = {\r\n template,\r\n controller: SyncRunHoursController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n next: '&',\r\n equipmentId: '<',\r\n installationId: '<',\r\n pageClass: '<',\r\n deviceModel: '<',\r\n datapointId: '<',\r\n runhoursSeries: '<',\r\n },\r\n};\r\n\r\nexport default SyncRunHoursComponent;\r\n","export default function DevicesRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('devices2', {\r\n url: '/devices',\r\n template: require('./devices.html'),\r\n ncyBreadcrumb: {\r\n label: \"{{'Devices' | translate}}\"\r\n },\r\n redirectTo: 'devices2.base',\r\n requiredFeatures: ['devices']\r\n })\r\n .state('devices2.base', {\r\n url: '',\r\n template: require('./list/list.html'),\r\n controller: 'DevicesListController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Devices' | translate}}\"\r\n },\r\n requiredFeatures: ['devices']\r\n })\r\n .state('devices2.serial', {\r\n url: '/serial/{serialId}',\r\n resolve: {\r\n serial: function ($stateParams, $state, InstallationsService) {\r\n 'ngInject';\r\n return InstallationsService.getInstallations(1, null, 0, $stateParams.serialId).then(result => {\r\n if (result.data.length > 0) {\r\n return $state.go('devices2.detail', { installationId: result.data[0].id });\r\n } else {\r\n return $state.go('devices2');\r\n }\r\n });\r\n }\r\n }\r\n })\r\n .state('devices2.detail', {\r\n url: '/{installationId}',\r\n template: require('./view/view.html'),\r\n controller: 'DevicesDetailController',\r\n ncyBreadcrumb: {\r\n label: '{{installation.device.serialNumber}}',\r\n parent: 'devices2.base'\r\n },\r\n requiredFeatures: ['devices']\r\n })\r\n\r\n .state('devices2.activations', {\r\n url: '/activation',\r\n template: '',\r\n controller: 'DevicesActivationsController',\r\n ncyBreadcrumb: {\r\n skip: true\r\n },\r\n requiredFeatures: ['devices.activate']\r\n })\r\n .state('devices2.activations.single', {\r\n url: '/single',\r\n helpState: 'devices2.activations',\r\n template: require('./activations/single/single.html'),\r\n controller: 'DevicesActivationsWizardController',\r\n ncyBreadcrumb: {\r\n label: \"{{'Single Activation' | translate}}\"\r\n },\r\n requiredFeatures: ['devices.activate.single']\r\n })\r\n .state('devices2.activations.bulk', {\r\n url: '/bulk',\r\n helpState: 'devices2.activations',\r\n templateUrl: 'pages/devices/activations/bulk/bulk.html',\r\n controller: 'DeviceActivationsBulkController',\r\n controllerAs: 'vm',\r\n ncyBreadcrumb: {\r\n label: \"{{'Bulk Activation' | translate}}\"\r\n },\r\n requiredFeatures: ['devices.activate.bulk']\r\n })\r\n .state('devices2.activations.custom', {\r\n url: '/bulk-activation',\r\n helpState: 'devices2.activations',\r\n templateUrl: 'pages/devices/activations/bulk-custom/bulk-custom.html',\r\n controller: 'DeviceActivationsBulkCustomController',\r\n controllerAs: 'vm',\r\n ncyBreadcrumb: {\r\n label: \"{{'Bulk Activation' | translate}}\"\r\n },\r\n requiredFeatures: ['devices.activate.custom']\r\n });\r\n}\r\n","const dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n bulkActivationCsvUploaded: 'bulkActivationCsvUploaded',\r\n};\r\n\r\nexport default function DeviceActivationsBulkController(\r\n $scope,\r\n $timeout,\r\n $q,\r\n $rootScope,\r\n installationsService,\r\n transfersService,\r\n packagesService,\r\n usersService,\r\n gettextCatalog,\r\n securityGroupsService,\r\n) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n\r\n vm.pendingRows = [];\r\n vm.showSubmitSpinner = false;\r\n vm.progress = 0;\r\n vm.packages = new Array();\r\n vm.canTransfer = false;\r\n vm.securityGroups = [];\r\n vm.selectedModules = []; // ceate an array to hold the modules selected in the dropdown list\r\n vm.selectedPackageModules = []; // container to hold the modules from the selected package in the dropdown\r\n vm.package = null;\r\n vm.isSecurityGroupOptional = false;\r\n\r\n let currentRow = null;\r\n let lastActivationId = null;\r\n const modules = new Array();\r\n\r\n vm.fileNameChanged = fileNameChanged;\r\n vm.preventFormSubmit = preventFormSubmit;\r\n vm.selectedItemChanged = selectedItemChanged;\r\n vm.changeSelectedPackage = changeSelectedPackage;\r\n vm.addModuleToPackages = addModuleToPackages;\r\n vm.removeModuleFromPackages = removeModuleFromPackages;\r\n vm.getSuccessfulRows = getSuccessfulRows;\r\n vm.getNumProcessedRows = getNumProcessedRows;\r\n vm.getNumRowsWithError = getNumRowsWithError;\r\n vm.getRowsWithError = getRowsWithError;\r\n\r\n init();\r\n\r\n function init() {\r\n packagesService\r\n .getAllPackages()\r\n .then(\r\n function (response) {\r\n for (let i = 0; i < response.data.length; i++) {\r\n const pkg = response.data[i];\r\n if (!pkg.inactive && pkg.tags) {\r\n if (pkg.isModule) {\r\n modules.push({\r\n name: pkg.name,\r\n id: pkg.id,\r\n });\r\n } else {\r\n vm.packages.push(pkg);\r\n }\r\n }\r\n }\r\n for (let j = 0; j < $rootScope.currentUser.features.length; j++) {\r\n if ($rootScope.currentUser.features[j].path === 'devices.transfer') {\r\n vm.canTransfer = true;\r\n return transfersService.getTransferKeys().then(null, function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving transfer keys',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n vm.transferErrorFlag = true;\r\n vm.transferErrorText = errorMsg;\r\n vm.loading = false;\r\n return $q.reject();\r\n });\r\n }\r\n }\r\n },\r\n function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'Error retrieving installation packages from the i3 API ',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ' + ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n vm.onLoadErrorFlag = true;\r\n vm.onLoadErrorText = errorMsg;\r\n vm.loading = false;\r\n return $q.reject();\r\n },\r\n )\r\n .then(function (response) {\r\n vm.transferKeys = !response ? [] : response.data.transferKeys || [];\r\n });\r\n getAllSecurityGroups();\r\n }\r\n\r\n function fileNameChanged(ele) {\r\n const { files } = ele;\r\n const l = files.length;\r\n const namesArr = [];\r\n if (files.length > 0) vm.csvFileError = false;\r\n for (let i = 0; i < l; i++) {\r\n namesArr.push(files[i].name);\r\n }\r\n }\r\n\r\n function preventFormSubmit(bulkActivateForm) {\r\n vm.bulkActivateForm.$setSubmitted();\r\n if (bulkActivateForm.$invalid) {\r\n vm.loading = false;\r\n vm.showSubmitSpinner = false;\r\n event.preventDefault();\r\n } else {\r\n vm.showSubmitSpinner = true;\r\n }\r\n }\r\n\r\n function getAllSecurityGroups() {\r\n if ($rootScope.currentUser.securityMode.toLowerCase() === 'open') {\r\n securityGroupsService.getAllSecurityGroups().then(\r\n (response) => {\r\n vm.securityGroups = response.data.data;\r\n vm.hasSecurityGroups = vm.securityGroups.length >= 1; // show dropdown\r\n vm.isSecurityGroupOptional = true;\r\n },\r\n () => {\r\n vm.onLoadErrorFlag = true;\r\n vm.onLoadErrorText = gettextCatalog.getString(\r\n 'Security group information could not be retrieved.',\r\n );\r\n },\r\n );\r\n } else {\r\n usersService.getUser($rootScope.currentUser.id).then(\r\n function (response) {\r\n vm.securityGroups = response.data.groups.data;\r\n vm.securityMode = response.data.securityMode;\r\n // security group option selector is hidden under the following circumstances, so the default and the only one security group has to be assigned to the selection model\r\n if (vm.securityGroups.length === 1 && vm.securityMode.toLowerCase() === 'discretionary')\r\n vm.securityGroup = vm.securityGroups[0];\r\n vm.hasSecurityGroups = vm.securityGroups.length >= 1; // show dropdown\r\n vm.isSecurityGroupOptional = false;\r\n },\r\n () => {\r\n vm.onLoadErrorFlag = true;\r\n vm.onLoadErrorText = gettextCatalog.getString(\r\n 'Security group information could not be retrieved.',\r\n );\r\n },\r\n );\r\n }\r\n }\r\n\r\n function changeSelectedPackage(selectedPackage) {\r\n vm.package = selectedPackage;\r\n vm.selectedItemChanged();\r\n }\r\n\r\n // selectedItemChanged() will traverse the modules[] and the packages.modules[], compare the modules list in\r\n // both result sets and determine wether or not the selectedPackage has compatible modules to display to the user.\r\n function selectedItemChanged() {\r\n vm.selectedPackageModules = [];\r\n vm.selectedModules = [];\r\n if (vm.package.modules.length >= 1) {\r\n modules.forEach((gm) => {\r\n vm.package.modules.forEach((pm) => {\r\n if (gm.id === pm) {\r\n vm.selectedPackageModules.push(gm);\r\n }\r\n });\r\n });\r\n }\r\n // set hide or show the modules dropdown\r\n if (vm.selectedPackageModules.length > 0) {\r\n vm.hasModulespkg = true;\r\n } else {\r\n // We need to remove the existing values from the model and selectedPackageModules when hasModules is false.\r\n vm.hasModulespkg = false;\r\n vm.selectedPackageModules = new Array();\r\n }\r\n }\r\n\r\n function addModuleToPackages(module) {\r\n vm.selectedModules.push(module);\r\n }\r\n\r\n function removeModuleFromPackages(module) {\r\n const idx = vm.selectedModules.indexOf(module);\r\n vm.selectedModules.splice(idx, 1);\r\n }\r\n\r\n $scope.$on('CsvFileUploaded', function (evt, args) {\r\n const { fatalError, rows } = args;\r\n vm.showSubmitSpinner = false;\r\n vm.inProgress = true;\r\n $scope.$digest();\r\n vm.currentStatus = gettextCatalog.getString('Processing...');\r\n\r\n if (fatalError) {\r\n vm.csvFileError = vm.currentStatus = fatalError;\r\n vm.inProgress = false;\r\n return;\r\n }\r\n if (rows.length === 0) {\r\n vm.csvFileError = vm.currentStatus = gettextCatalog.getString(\r\n 'Invalid CSV file. Please check and try again.',\r\n );\r\n vm.inProgress = false;\r\n return;\r\n }\r\n\r\n vm.showSummaryReport = true;\r\n vm.rows = rows;\r\n vm.pendingRows = []; // Add all of the rows in the csv that passed csv formatting validation without errors\r\n\r\n dataLayer.push({\r\n event: gtmEvents.bulkActivationCsvUploaded,\r\n data: {\r\n rows: rows.length,\r\n fatalError,\r\n },\r\n });\r\n\r\n for (let i = 0; i < vm.rows.length; i++) {\r\n const currentRow = vm.rows[i];\r\n if (!currentRow.Error) {\r\n currentRow._validFormat = true;\r\n vm.pendingRows.push(currentRow);\r\n } else {\r\n currentRow._processed = true;\r\n }\r\n }\r\n activateNextRow(); // Start activating the rows\r\n });\r\n\r\n function getSuccessfulRows() {\r\n if (!vm.rows) return [];\r\n let result = 0;\r\n for (let i = 0; i < vm.rows.length; i++) {\r\n if (vm.rows[i]._success) result++;\r\n }\r\n return result;\r\n }\r\n\r\n function getNumProcessedRows() {\r\n if (!vm.rows) return [];\r\n let result = 0;\r\n for (let i = 0; i < vm.rows.length; i++) {\r\n if (vm.rows[i]._processed) result++;\r\n }\r\n return result;\r\n }\r\n\r\n function getNumRowsWithError() {\r\n return vm.getRowsWithError().length;\r\n }\r\n\r\n function getRowsWithError() {\r\n const result = [];\r\n if (!vm.rows) return [];\r\n for (let i = 0; i < vm.rows.length; i++) {\r\n if (vm.rows[i].Error) result.push(vm.rows[i]);\r\n }\r\n return result;\r\n }\r\n\r\n function onActivateSuccess(response) {\r\n lastActivationId = response.data.href.match(/(\\d+)$/)[1]; // Set the id of the last activation so that we can rollback in case the installation fails\r\n if (vm.transferKey) {\r\n vm.currentStatus = gettextCatalog.getString(\r\n 'Transferring ownership of device {{deviceSerial}}',\r\n {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n },\r\n );\r\n const resources = [response.data.href];\r\n return transfersService.transferResources(vm.transferKey, resources);\r\n }\r\n vm.currentStatus = gettextCatalog.getString('Device {{deviceSerial}} activated with success', {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n });\r\n currentRow._success = true;\r\n $timeout(activateNextRow(), 100);\r\n }\r\n\r\n function onActivateFailed(error) {\r\n currentRow.Error = gettextCatalog.getString('Error activating device. HTTP {{error}}', {\r\n error: error.status,\r\n });\r\n vm.currentStatus = gettextCatalog.getString('Failure activating device {{deviceSerial}}', {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n });\r\n if (error.data) currentRow.Error += `: ${error.data.Message ? error.data.Message : error.data}`;\r\n $timeout(activateNextRow(), 250);\r\n }\r\n\r\n function onTransferSuccess(response) {\r\n if (!response) return;\r\n currentRow._success = true;\r\n vm.currentStatus = gettextCatalog.getString(\r\n 'Transferred device {{deviceSerial}} with success',\r\n {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n },\r\n );\r\n $timeout(activateNextRow(), 100);\r\n }\r\n\r\n function onTransferFailed() {\r\n if (!lastActivationId) return; // If there was no activation id, we should not have gotten to this point.\r\n installationsService\r\n .deleteInstallation(lastActivationId) // delete the installation if transfer fails (poor man's transaction)\r\n .then(\r\n function (response) {\r\n currentRow.Error = gettextCatalog.getString(\r\n 'Error transferring ownership. HTTP {{status}}',\r\n {\r\n status: response.status,\r\n },\r\n );\r\n vm.currentStatus = gettextCatalog.getString(\r\n 'Failure transferring device {{deviceSerial}}',\r\n {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n },\r\n );\r\n if (response.data)\r\n currentRow.Error += `: ${\r\n response.data.message ? response.data.message : response.data\r\n }`;\r\n\r\n $timeout(activateNextRow(), 250);\r\n },\r\n function (error) {\r\n currentRow.Error = gettextCatalog.getString(\r\n 'The device has been activated but the ownership could not be transferred. Please contact support. HTTP {{status}}',\r\n {\r\n status: error.status,\r\n },\r\n );\r\n vm.currentStatus = gettextCatalog.getString(\r\n 'Failure transferring device {{deviceSerial}}',\r\n {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n },\r\n );\r\n if (error.data)\r\n currentRow.Error += `: ${error.data.message ? error.data.message : error.data}`;\r\n\r\n $timeout(activateNextRow(), 250);\r\n },\r\n );\r\n }\r\n\r\n function activateNextRow() {\r\n vm.progress = (vm.getNumProcessedRows() * 100) / vm.rows.length;\r\n\r\n if (!vm.securityGroup && !vm.isSecurityGroupOptional) {\r\n vm.showSummaryReport = false;\r\n vm.inProgress = false;\r\n return;\r\n }\r\n\r\n const packagesIDs = new Array();\r\n packagesIDs.push({\r\n id: vm.package.id,\r\n });\r\n if (vm.selectedModules) {\r\n for (let i = 0; i !== vm.selectedModules.length; i++) {\r\n packagesIDs.push({\r\n id: vm.selectedModules[i].id,\r\n });\r\n }\r\n }\r\n\r\n if (vm.pendingRows.length === 0) {\r\n // If there are no rows left, then mark the process as finished...\r\n vm.inProgress = false; // finished\r\n const errorRows = vm.getRowsWithError();\r\n vm.currentStatus =\r\n errorRows.length > 0\r\n ? gettextCatalog.getString(\r\n 'The process completed with one or more failures. Review the details below and click on the button to download a report in CSV format.',\r\n )\r\n : gettextCatalog.getString('The process completed successfully.');\r\n return;\r\n }\r\n\r\n currentRow = vm.pendingRows[0];\r\n currentRow._processed = true;\r\n lastActivationId = null; // clear the last activation id\r\n vm.pendingRows.splice(0, 1); // Pop the last row from the pending rows\r\n vm.currentStatus = gettextCatalog.getString('Activating device {{deviceSerial}}', {\r\n deviceSerial: currentRow.DeviceSerialNumber,\r\n });\r\n\r\n // If there was a formatting error with the current row...do not activate, and show it in the error log NOTE: This shouldn't happen because we are filering out the rows with invalid csv foramtting from pending activations\r\n if (currentRow.Error) {\r\n $timeout(activateNextRow(), 250);\r\n } else {\r\n const sgResource = vm.securityGroup ? vm.securityGroup.href : '';\r\n const newInstallation = {\r\n device: {\r\n serialNumber: currentRow.DeviceSerialNumber,\r\n },\r\n equipment: {\r\n name: currentRow.DeviceSerialNumber,\r\n attrs: {\r\n make: currentRow.EquipmentMake,\r\n model: currentRow.EquipmentModel,\r\n 'model year': currentRow.EquipmentModelYear,\r\n vin: currentRow.EquipmentVin,\r\n },\r\n },\r\n packages: packagesIDs,\r\n };\r\n\r\n // Create an installation object with the current row.\r\n installationsService\r\n .createInstallation(newInstallation, sgResource)\r\n .then(onActivateSuccess, onActivateFailed) // On activation success, transfer if necessary...\r\n .then(onTransferSuccess, onTransferFailed); // On transfer failure...rollback the activation\r\n }\r\n }\r\n}\r\n","import moment from 'moment';\r\n\r\nexport default function DeviceActivationsBulkCustomController($rootScope, BulkActivationService) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n // Needs to be disabled if security mode is not open\r\n vm.enabled = $rootScope.currentUser.securityMode === 'Open';\r\n vm.uploadBulkActivation = uploadBulkActivation;\r\n resetState();\r\n\r\n function resetState() {\r\n vm.loading = false;\r\n vm.errorMsg = '';\r\n vm.activationJob = null;\r\n }\r\n\r\n function uploadBulkActivation() {\r\n if (vm.loading) return;\r\n resetState();\r\n const f = document.getElementById('CsvFile').files[0];\r\n\r\n vm.loading = true;\r\n\r\n BulkActivationService.bulkActivate(f)\r\n .then((response) => {\r\n vm.activationJob = response.data;\r\n })\r\n .catch((error) => {\r\n const { message } = error.data;\r\n vm.errorMsg = message || 'Something went wrong!';\r\n })\r\n .finally(() => {\r\n vm.loading = false;\r\n });\r\n }\r\n}\r\n","export default function DevicesActivationsSingleModalController($scope, $filter, $uibModalInstance, products, productService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n $scope.productDetails = false;\r\n $scope.search = {\r\n text: \"\"\r\n };\r\n $scope.product = {};\r\n $scope.productsByPage = [];\r\n $scope.filteredProducts = [];\r\n\r\n //Pagination\r\n $scope.current = {\r\n productPage: 1\r\n };\r\n $scope.itemsPerPage = 4;\r\n $scope.maxSize = 1;\r\n\r\n //displayUserRolesByPage() is used to set the legnth of paging needed for filteredUserRoles.\r\n $scope.displayProductsByPage = function () {\r\n $scope.totalItems = $scope.filteredProducts.length;\r\n var begin = (($scope.current.productPage - 1) * $scope.itemsPerPage);\r\n var end = begin + $scope.itemsPerPage;\r\n $scope.productsByPage = $scope.filteredProducts.slice(begin, end);\r\n $scope.loading = false;\r\n };\r\n\r\n //Calls displayUserRolesByPage(), everytime the the user changes the page.\r\n $scope.pageChanged = function () {\r\n $scope.displayProductsByPage();\r\n };\r\n\r\n //applyFilter searchs the roles[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredProducts = $filter('filter')($scope.products, $scope.search.text);\r\n $scope.displayProductsByPage();\r\n };\r\n\r\n $scope.selectedRow = undefined;\r\n $scope.setSelectedRow = function (id) {\r\n $scope.selectedRow = id;\r\n };\r\n\r\n $scope.predicate = 'name';\r\n $scope.reverse = true;\r\n $scope.order = function (predicate) {\r\n $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;\r\n $scope.predicate = predicate;\r\n };\r\n\r\n $scope.products = products;\r\n $scope.filteredProducts = $scope.products.slice();\r\n $scope.displayProductsByPage();\r\n $scope.selectedProducts = false;\r\n $scope.packageName = '';\r\n $scope.update = function (id) {\r\n productService.getProductById(id).then(function (response) {\r\n $scope.product = response.data;\r\n if ($scope.product) {\r\n $scope.productDetails = true;\r\n }\r\n }, function (error) {\r\n var errorMsg = gettextCatalog.getString(\"Error retrieving product alert rules from the ONEi3 API \");\r\n if (error.data)\r\n errorMsg += \": \" + (error.data.message ? error.data.message : error.data);\r\n });\r\n };\r\n\r\n $scope.ok = function () {\r\n $uibModalInstance.close($scope.product);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close('cancel');\r\n };\r\n\r\n}","import moment from 'moment';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n activationNoteCreated: 'activationNoteCreated',\r\n activationInstallationCreated: 'activationInstallationCreated',\r\n};\r\n\r\nexport default function DevicesActivationsWizardController(\r\n $scope,\r\n $rootScope,\r\n $state,\r\n $stateParams,\r\n $q,\r\n $timeout,\r\n $filter,\r\n $uibModal,\r\n installationsService,\r\n transfersService,\r\n productService,\r\n devicesService,\r\n mapService,\r\n packagesService,\r\n installationNoteService,\r\n securityGroupsService,\r\n equipmentRepository,\r\n gettextCatalog,\r\n syncRunHoursService,\r\n tagsService,\r\n appSettings,\r\n usersService,\r\n) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n let mapCreated = false;\r\n const myIcon = L.icon({\r\n iconUrl: '/Home/Content/svg/pin.png',\r\n iconSize: [20, 45],\r\n iconAnchor: [22, 94],\r\n });\r\n const changeset = {\r\n op: 'add',\r\n };\r\n\r\n let hardware = '';\r\n let canSyncRunHours = false;\r\n\r\n $scope.steps = [\r\n 'activate',\r\n 'communicate',\r\n 'connect',\r\n 'status',\r\n 'sync',\r\n 'location',\r\n 'confirm',\r\n 'data',\r\n 'notes',\r\n ];\r\n $scope.step = $scope.steps[0];\r\n $scope.product = {};\r\n $scope.model = {};\r\n $scope.equipment = {\r\n name: '',\r\n make: '',\r\n model: '',\r\n package: '',\r\n module: [],\r\n year: '',\r\n vin: '',\r\n transferKey: [],\r\n };\r\n $scope.security = {\r\n group: '',\r\n };\r\n $scope.availableSecurityGroups = [];\r\n $scope.error = null;\r\n $scope.products = [];\r\n $scope.installations = [];\r\n $scope.packages = [];\r\n $scope.modules = [];\r\n $scope.transferKeys = [];\r\n $scope.availableProducts = [];\r\n $scope.activationSuccessFlag = false;\r\n $scope.activationSuccessMsg = gettextCatalog.getString('This device was successfully activated.');\r\n $scope.transferSuccessFlag = false;\r\n $scope.transferSuccessMsg = gettextCatalog.getString(\r\n 'This device was successfully activated and transferred.',\r\n );\r\n $scope.showActivationForm = false;\r\n $scope.canTransfer = false;\r\n $scope.hasPkgModules = false;\r\n $scope.selectedModules = [];\r\n $scope.selectedPackageModules = [];\r\n $scope.templatesAvailable = true;\r\n $scope.lastCommunication = '';\r\n $scope.hasSecurityGroups = false;\r\n $scope.isSGOptional = false;\r\n $scope.reloadingLastComm = false;\r\n $scope.disable = {\r\n next: false,\r\n };\r\n $scope.checkBox = {\r\n isChecked: false,\r\n };\r\n $scope.isConnected = false;\r\n $scope.communicationActions = 'unconfirmed';\r\n $scope.showActivationMap = false;\r\n $scope.loadingLocation = false;\r\n $scope.gpsLocationModel = 0;\r\n $scope.gpsLocationAction = 'unconfirmed'; // default action\r\n $scope.runHours = null;\r\n $scope.runHoursModel = 0;\r\n $scope.runHoursAction = 'unconfirmed'; // default action\r\n $scope.refreshingSeriesData = false;\r\n $scope.noSeriesData = false;\r\n $scope.seriesDataMsg = gettextCatalog.getString('Asset Data currently unavailable');\r\n $scope.equipmentSeries = {\r\n isLoadingTableData: false,\r\n lastcomm: $scope.lastCommunication,\r\n tabularDatapoints: [],\r\n };\r\n $scope.wantedSeriesList = [\r\n 'Battery',\r\n 'Run Time',\r\n 'Engine Status',\r\n 'Oil Pressure',\r\n 'Engine Coolant Temperature',\r\n ];\r\n $scope.note = {\r\n text: '',\r\n };\r\n $scope.validatingSerialNumber = false;\r\n $scope.helpContent = {\r\n helpMe: 'singleActivation',\r\n };\r\n\r\n $scope.userSelectedTemplatePackage = false;\r\n\r\n /* for tags */\r\n $scope.tags = [];\r\n $scope.selectedTags = [];\r\n $scope.parsedTags = [];\r\n $scope.values = {};\r\n $scope.opened = {};\r\n $scope.datetimedate = {};\r\n $scope.datetimeBounds = {};\r\n $scope.minMaxRequired = {};\r\n $scope.showTag = {};\r\n $scope.focus = {};\r\n $scope.dateOptions = {\r\n 'year-format': \"'yy'\",\r\n 'starting-day': 1,\r\n };\r\n\r\n // init\r\n vm.$onInit = () => {\r\n vm.dateFormat = appSettings.GetDateFormat();\r\n vm.hasSyncFeature = usersService.hasRequiredFeatures(['assets.run_time_sync']);\r\n };\r\n\r\n const setTimeHMS = (targetDate, sourceDate) => {\r\n // Setting targetDate HMS from sourceDate\r\n targetDate.set({\r\n hours: sourceDate.getHours(),\r\n minutes: sourceDate.getMinutes(),\r\n seconds: sourceDate.getSeconds(),\r\n });\r\n };\r\n // Local Functions\r\n function getAllProducts() {\r\n productService\r\n .getAllProducts()\r\n .then(function (response) {\r\n $scope.products = response.data;\r\n if ($scope.products.length === 0) {\r\n $scope.templatesAvailable = false;\r\n }\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while retrieving template information.',\r\n );\r\n });\r\n }\r\n getAllProducts();\r\n\r\n function getAllSecurityGroups() {\r\n securityGroupsService\r\n .getAllSecurityGroups()\r\n .then(function (response) {\r\n const securityGroups = response.data.data;\r\n const user = $rootScope.currentUser;\r\n if (user.securityMode === 'Discretionary') {\r\n if (user.groups.data.length === 1) {\r\n // When the user's securityMode is set to discretionary and belongs to a single\r\n // security group, automatically assign the installation to that security group\r\n // and do not display the security group dropdown on the activation form\r\n $scope.security.group = user.groups.data[0];\r\n } else if (user.groups.data.length > 1) {\r\n for (let i = 0; i !== user.groups.data.length; ++i) {\r\n // When the user's securityMode is set to discretionary and belongs to multiple\r\n // security groups, populate the dropdown with a list of the available security\r\n // groups and show the dropdown on the activation form.\r\n $scope.availableSecurityGroups.push(user.groups.data[i]);\r\n $scope.hasSecurityGroups = true;\r\n }\r\n } else {\r\n // $scope.invalidSecuirtyGroupErrorFlag = true;\r\n }\r\n } else if (user.securityMode === 'Open') {\r\n if (securityGroups) {\r\n for (let i = 0; i !== securityGroups.length; ++i) {\r\n // When the user's securityMode is set to open populate the dropdown with a list\r\n // of the available security groups and show the dropdown on the activation form.\r\n $scope.availableSecurityGroups.push(securityGroups[i]);\r\n }\r\n $scope.hasSecurityGroups = true; // show dropdown\r\n $scope.isSGOptional = true; // sets security group to optional instead of required\r\n }\r\n }\r\n })\r\n .catch(function () {\r\n $scope.hasSecurityGroups = false;\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while retrieving security groups.',\r\n );\r\n });\r\n }\r\n getAllSecurityGroups();\r\n\r\n $scope.serialNumberChanged = (serialNum) => {\r\n if (!serialNum) {\r\n clearForm();\r\n }\r\n };\r\n\r\n function getTransferKeys() {\r\n transfersService\r\n .getTransferKeys()\r\n .then(function (response) {\r\n const { transferKeys } = response.data;\r\n $scope.transferKeys.push({\r\n account: gettextCatalog.getString('DO NOT TRANSFER'),\r\n id: null,\r\n });\r\n for (let i = 0; i < transferKeys.length; i++) {\r\n if (transferKeys[i].permissions.resources !== null) {\r\n if (transferKeys[i].permissions.resources.indexOf('installations') >= 0) {\r\n $scope.transferKeys.push({\r\n account: transferKeys[i].account,\r\n id: transferKeys[i].key,\r\n });\r\n }\r\n }\r\n }\r\n $scope.model.transferKey = $scope.transferKeys[0];\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while retrieving transfer keys.',\r\n );\r\n });\r\n }\r\n\r\n // The user must have the feature permission to transfer devices\r\n function canUserTransfer() {\r\n for (let i = 0; i < $rootScope.currentUser.features.length; i++) {\r\n if ($rootScope.currentUser.features[i].path.indexOf('devices.transfer') >= 0) {\r\n $scope.canTransfer = true;\r\n getTransferKeys();\r\n }\r\n }\r\n }\r\n canUserTransfer();\r\n\r\n function getTags() {\r\n equipmentRepository\r\n .getAllTags()\r\n .then(function (response) {\r\n $scope.tags = response.data.data;\r\n for (let i = 0; i < $scope.tags.length; i++) {\r\n if ($scope.tags[i].dataType === 'Datetime') {\r\n if ($scope.tags[i].range.min) {\r\n $scope.tags[i].range.min = moment($scope.tags[i].range.min).toDate();\r\n }\r\n if ($scope.tags[i].range.max) {\r\n $scope.tags[i].range.max = moment($scope.tags[i].range.max).toDate();\r\n }\r\n }\r\n if (\r\n $scope.tags[i].key.toLowerCase() === 'make' ||\r\n $scope.tags[i].key.toLowerCase() === 'model' ||\r\n $scope.tags[i].key.toLowerCase() === 'model year' ||\r\n $scope.tags[i].key.toLowerCase() === 'vin'\r\n ) {\r\n $scope.tags.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString('An error occurred while retrieving attributes.');\r\n });\r\n }\r\n getTags();\r\n\r\n function checkProductsForCompatibility() {\r\n $scope.availableProducts = [];\r\n $scope.isTemplateSelected = false;\r\n for (let i = 0; i !== $scope.packages.length; ++i) {\r\n for (let c = 0; c !== $scope.products.length; ++c) {\r\n if ($scope.packages[i].id === $scope.products[c].package.id) {\r\n $scope.availableProducts.push($scope.products[c]);\r\n }\r\n }\r\n }\r\n $scope.templatesAvailable = $scope.availableProducts.length > 0;\r\n }\r\n\r\n function packageAllowsRunHoursSync() {\r\n const packagesIds = $scope.installation.packages.map((pkg) => pkg.id);\r\n syncRunHoursService\r\n .getSyncRunHoursTag(packagesIds)\r\n .then((tag) => {\r\n canSyncRunHours = !!tag;\r\n $scope.installation.syncRunHoursTag = tag;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n function createMap() {\r\n if (mapCreated) return;\r\n mapCreated = true;\r\n vm.map = mapService.createMapDiv('map');\r\n\r\n // Set an initial default view of the map. If the device communicates this will be updated when we get to the GPS Location page.\r\n vm.map.setView([40, -74.5], 3);\r\n\r\n vm.map.scrollWheelZoom.disable();\r\n }\r\n createMap();\r\n\r\n // Step 9 - Installation Notes & Complte Activation Wizard\r\n function createNote() {\r\n dataLayer.push({\r\n event: gtmEvents.activationNoteCreated,\r\n data: {\r\n installationId: $scope.installationId,\r\n },\r\n });\r\n\r\n installationNoteService\r\n .createNote($scope.installationId, {\r\n text: $scope.note.text,\r\n })\r\n .then(function () {\r\n $scope.note.text = '';\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString('An error occurred while creating the note.');\r\n });\r\n }\r\n\r\n function logUserActions() {\r\n changeset.values = {\r\n connected: $scope.communicationActions,\r\n run_hours: $scope.runHoursAction,\r\n location: $scope.gpsLocationAction,\r\n };\r\n installationNoteService.patchInstallationAttrs($scope.installationId, changeset).then(\r\n function () {},\r\n function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while patching installation attributes.',\r\n );\r\n },\r\n );\r\n }\r\n\r\n function clearForm() {\r\n $scope.deviceSerialNumberError = '';\r\n $scope.model.deviceSerialNumber = null;\r\n $scope.model.equipmentName = null;\r\n $scope.model.equipmentMake = null;\r\n $scope.equipment.make = null;\r\n $scope.model.equipmentModel = null;\r\n $scope.equipment.model = null;\r\n $scope.equipment.package = [];\r\n $scope.equipment.module = [];\r\n $scope.model.transferKey = [];\r\n $scope.model.equipmentModelYear = null;\r\n $scope.model.equipmentVin = null;\r\n $scope.isTemplateSelected = false;\r\n $scope.packages.length = 0;\r\n $scope.activationForm.$setPristine();\r\n $scope.activationForm.$setUntouched();\r\n }\r\n\r\n // traverse through steps[] to change the view\r\n $scope.next = function () {\r\n switch ($scope.step) {\r\n case 'notes':\r\n $scope.step = $scope.steps[9];\r\n break;\r\n case 'data':\r\n $scope.step = $scope.steps[8];\r\n $scope.isSeriesData = true;\r\n break;\r\n case 'confirm':\r\n $scope.step = $scope.steps[7];\r\n break;\r\n case 'location':\r\n $scope.step = $scope.steps[6];\r\n $scope.showActivationMap = false;\r\n if (canSyncRunHours === false) $scope.next();\r\n $scope.getLastReportedRunHours();\r\n $scope.getDataPointValues();\r\n break;\r\n case 'sync':\r\n $scope.step = $scope.steps[5];\r\n $scope.showActivationMap = true;\r\n $scope.getInstallationLocation();\r\n break;\r\n case 'status':\r\n $scope.step = $scope.steps[4];\r\n if (!canSyncRunHours || !vm.hasSyncFeature) $scope.next();\r\n break;\r\n case 'connect':\r\n $scope.step = $scope.steps[3];\r\n packageAllowsRunHoursSync();\r\n break;\r\n case 'communicate':\r\n $scope.step = $scope.steps[2];\r\n $scope.activationSuccessFlag = false;\r\n $scope.getLastComm();\r\n break;\r\n case 'activate':\r\n $scope.step = $scope.steps[1];\r\n break;\r\n }\r\n };\r\n\r\n $scope.isFormValid = function () {\r\n $scope.activationForm.$setSubmitted();\r\n if ($scope.activateWithTemplate) {\r\n if (!$scope.product) return;\r\n } else if (!$scope.activationForm.package.$modelValue) {\r\n $scope.activationForm.package.$invalid = true;\r\n return;\r\n }\r\n\r\n if ($scope.activationForm.$invalid) {\r\n if (\r\n $scope.activationForm.package.$modelValue === undefined ||\r\n $scope.activationForm.package.$modelValue === null ||\r\n $scope.activationForm.package.$modelValue === ''\r\n ) {\r\n $scope.activationForm.package.$invalid = true;\r\n }\r\n } else {\r\n $scope.submitActivationForm();\r\n }\r\n };\r\n\r\n $scope.appendTag = function (tag) {\r\n $scope.selectedTags.push(tag);\r\n $scope.values[tag.id] = {\r\n tag: tag.id,\r\n };\r\n\r\n if (tag.dataType === 'Date' || tag.dataType === 'Datetime') {\r\n $scope.opened[tag.id] = false;\r\n\r\n if (tag.freeform) {\r\n $scope.values[tag.id].value = moment().toDate();\r\n\r\n if (tag.dataType === 'Datetime') {\r\n $scope.datetimedate[tag.id] = moment($scope.values[tag.id].value.toISOString()).toDate();\r\n\r\n $scope.datetimeBounds[tag.id] = {};\r\n }\r\n } else {\r\n if (tag.range.min) {\r\n $scope.values[tag.id].value = tag.range.min;\r\n\r\n if (tag.dataType === 'Datetime') {\r\n $scope.datetimedate[tag.id] = tag.range.min;\r\n $scope.values[tag.id].minValue = tag.range.min;\r\n\r\n $scope.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n if (tag.range.max) {\r\n $scope.values[tag.id].value = tag.range.max;\r\n\r\n if (tag.dataType === 'Datetime') {\r\n $scope.datetimedate[tag.id] = tag.range.max;\r\n $scope.values[tag.id].maxValue = tag.range.max;\r\n\r\n $scope.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n }\r\n }\r\n\r\n tag.selected = true;\r\n $scope.newTag = undefined;\r\n $scope.focus[tag.id] = true;\r\n };\r\n\r\n $scope.removeTag = function (index) {\r\n $scope.selectedTags[index].selected = false;\r\n delete $scope.values[$scope.selectedTags[index].id];\r\n delete $scope.focus[$scope.selectedTags[index].id];\r\n $scope.selectedTags.splice(index, 1);\r\n };\r\n\r\n $scope.filterSelected = function (tag) {\r\n if (tag.selected) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.roundInt = function (val) {\r\n return val ? Math.floor(val) : val;\r\n };\r\n\r\n $scope.open = function (index) {\r\n $scope.opened[index] = true;\r\n };\r\n\r\n $scope.datetimeValidCheck = function (id) {\r\n const checkValid = moment($scope.datetimedate[id]);\r\n\r\n if ($scope.values[id].value) {\r\n setTimeHMS(checkValid, $scope.values[id].value);\r\n }\r\n\r\n if (\r\n (!$scope.values[id].minValue || checkValid >= $scope.values[id].minValue) &&\r\n (!$scope.values[id].maxValue || checkValid <= $scope.values[id].maxValue)\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $scope.updateTimeBounds = function (id) {\r\n $scope.datetimeBounds[id].min = $scope.returnTimeBound('min', id);\r\n $scope.datetimeBounds[id].max = $scope.returnTimeBound('max', id);\r\n };\r\n\r\n $scope.returnTimeBound = function (key, id) {\r\n switch (key) {\r\n case 'max':\r\n if (!$scope.datetimedate[id] || !$scope.values[id].maxValue) {\r\n return undefined;\r\n }\r\n\r\n if ($scope.datetimedate[id].toDateString() === $scope.values[id].maxValue.toDateString()) {\r\n const checkMax = moment($scope.values[id].value);\r\n\r\n if ($scope.values[id].maxValue) {\r\n setTimeHMS(checkMax, $scope.values[id].maxValue);\r\n }\r\n\r\n return checkMax.toDate();\r\n }\r\n return undefined;\r\n\r\n case 'min':\r\n if (!$scope.datetimedate[id] || !$scope.values[id].minValue) {\r\n return undefined;\r\n }\r\n\r\n if ($scope.datetimedate[id].toDateString() === $scope.values[id].minValue.toDateString()) {\r\n const checkMin = moment($scope.values[id].value);\r\n\r\n if ($scope.values[id].minValue) {\r\n setTimeHMS(checkMin, $scope.values[id].minValue);\r\n }\r\n\r\n return checkMin.toDate();\r\n }\r\n return undefined;\r\n }\r\n };\r\n\r\n $scope.checkAllDatetimes = function () {\r\n for (let i = 0; i < $scope.selectedTags.length; i++) {\r\n if ($scope.selectedTags[i].dataType === 'Datetime' && !$scope.selectedTags[i].freeform) {\r\n if (!$scope.datetimeValidCheck($scope.selectedTags[i].id)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.generateTooltip = (tag) => tagsService.generateTooltip(tag, vm.dateFormat);\r\n\r\n $scope.keyPressHandler = function (e, serialNum) {\r\n if (e.keyCode === 13 && serialNum) {\r\n if (!e) e = window.event;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n $scope.checkInstallations(serialNum);\r\n }\r\n };\r\n\r\n $scope.checkInstallations = function (serialNum) {\r\n $scope.validatingSerialNumber = true;\r\n // check to see if the device has been activated\r\n installationsService\r\n .getInstallations(null, null, null, serialNum, null)\r\n .then(function (response) {\r\n const install = response.data;\r\n if (!!install && install.length > 0) {\r\n $scope.deviceSerialNumberError = gettextCatalog.getString(\r\n `Device ${serialNum} has already been activated.`,\r\n );\r\n $scope.validatingSerialNumber = false;\r\n $scope.showActivationForm = false;\r\n } else {\r\n $scope.deviceSerialNumberError = '';\r\n }\r\n return devicesService.getDevice(serialNum); // get the device model\r\n })\r\n .then(function (response) {\r\n const device = response.data;\r\n $scope.model.deviceSerialNumber = device.serialNumber;\r\n hardware = device.attrs.model;\r\n return packagesService.getAllPackages(); // get all packages\r\n })\r\n .then(function (response) {\r\n $scope.packages = [];\r\n $scope.modules = [];\r\n const { data = [] } = response;\r\n const compatiablePakg = data.filter(\r\n (pkg) => !pkg.inactive && pkg.hardware.includes(hardware),\r\n );\r\n compatiablePakg.forEach((pkg) => {\r\n pkg.isModule ? $scope.modules.push(pkg) : $scope.packages.push(pkg);\r\n });\r\n })\r\n .catch(function (error) {\r\n $scope.deviceSerialNumberError =\r\n error.status === 404\r\n ? gettextCatalog.getString(\r\n `Device ${serialNum} could not be found, Please enter a valid serial number`,\r\n )\r\n : gettextCatalog.getString('An error has occurred. Please contact your Administrator');\r\n $scope.validatingSerialNumber = false;\r\n $scope.showActivationForm = false;\r\n })\r\n .finally(function () {\r\n checkProductsForCompatibility();\r\n $scope.validatingSerialNumber = false;\r\n if ($scope.deviceSerialNumberError === '') {\r\n $scope.showActivationForm = true;\r\n }\r\n });\r\n };\r\n\r\n $scope.changeSelectedPackage = function (selectedPackage) {\r\n $scope.equipment.package = selectedPackage;\r\n $scope.userSelectedTemplatePackage = false;\r\n };\r\n\r\n $scope.addModuleToPackages = function (module) {\r\n $scope.selectedModules.push(module);\r\n };\r\n\r\n $scope.removeModuleFromPackages = function (module) {\r\n const idx = $scope.selectedModules.indexOf(module);\r\n $scope.selectedModules.splice(idx, 1);\r\n };\r\n\r\n // Submit the activation form if isValid\r\n $scope.submitActivationForm = function () {\r\n $scope.loading = true;\r\n let newInstallation = {};\r\n let sgResource = '';\r\n if ($scope.security.group) {\r\n sgResource = $scope.security.group.href;\r\n }\r\n\r\n const packagesIDs = [\r\n { id: $scope.equipment.package.id },\r\n ...$scope.selectedModules.map((item) => ({ id: item.id })),\r\n ];\r\n // newInstallation when no product\r\n newInstallation = {\r\n device: {\r\n serialNumber: $scope.model.deviceSerialNumber,\r\n },\r\n equipment: {\r\n name: $scope.model.equipmentName,\r\n attrs: {\r\n make: $scope.equipment.make,\r\n model: $scope.equipment.model,\r\n 'model year': $scope.model.equipmentModelYear,\r\n vin: $scope.model.equipmentVin,\r\n },\r\n },\r\n packages: packagesIDs,\r\n };\r\n\r\n $scope.submitTags = [];\r\n for (let i = 0; i < $scope.selectedTags.length; i++) {\r\n let tagVal;\r\n switch ($scope.selectedTags[i].dataType) {\r\n case 'Text':\r\n case 'Hyperlink':\r\n case 'Integer':\r\n case 'Decimal':\r\n tagVal = $scope.values[$scope.selectedTags[i].id].value;\r\n break;\r\n case 'Date':\r\n tagVal = $filter('date')($scope.values[$scope.selectedTags[i].id].value, 'yyyy-MM-dd');\r\n break;\r\n case 'Datetime':\r\n if (typeof $scope.values[$scope.selectedTags[i].id].value === 'string') {\r\n tagVal = $scope.values[$scope.selectedTags[i].id].value;\r\n } else {\r\n const dateTime = moment($scope.datetimedate[$scope.selectedTags[i].id].toISOString());\r\n\r\n if ($scope.values[$scope.selectedTags[i].id].value) {\r\n setTimeHMS(dateTime, $scope.values[$scope.selectedTags[i].id].value);\r\n }\r\n tagVal = dateTime.toDate();\r\n }\r\n break;\r\n }\r\n newInstallation.equipment.attrs[$scope.selectedTags[i].key] = tagVal;\r\n }\r\n\r\n let rollbackThisActivationIdInCaseOfFailure = '';\r\n\r\n const handleError = function (response) {\r\n if (!response) {\r\n return $q.reject();\r\n }\r\n if (rollbackThisActivationIdInCaseOfFailure) {\r\n installationsService.deleteInstallation(rollbackThisActivationIdInCaseOfFailure).then(\r\n function () {\r\n rollbackThisActivationIdInCaseOfFailure = '';\r\n $scope.error = gettextCatalog.getString(\r\n 'There was a problem transferring this device to the selected account. The installation was rolled back. Please report this issue to support.',\r\n );\r\n },\r\n function () {\r\n rollbackThisActivationIdInCaseOfFailure = '';\r\n $scope.error = gettextCatalog.getString(\r\n 'There was a problem transferring this device to the selected account and the installation could not be rolled back. Please report this issue to support.',\r\n );\r\n },\r\n );\r\n } else if (response.status === 409) {\r\n $scope.error = gettextCatalog.getString('Name already in use.');\r\n beginWatchNameInput();\r\n } else {\r\n $scope.error = gettextCatalog.getString('Failure activating this device.');\r\n }\r\n $scope.loading = false;\r\n return $q.reject();\r\n };\r\n\r\n let beginWatchNameInput = function () {\r\n document.getElementById('equipmentName').addEventListener('input', function () {\r\n $scope.error = null;\r\n });\r\n };\r\n\r\n const postProcessInstallation = function (response) {\r\n const newInstallationId = response.data.href.match(/(\\d+)$/)[1];\r\n if ($scope.model.transferKey && $scope.model.transferKey.id) {\r\n rollbackThisActivationIdInCaseOfFailure = newInstallationId;\r\n $scope.transferSuccessFlag = true;\r\n const resources = new Array();\r\n resources.push(response.data.href);\r\n return transfersService\r\n .transferResources($scope.model.transferKey.id, resources)\r\n .then(function () {\r\n $scope.transferSuccessFlag = false;\r\n $scope.loading = false;\r\n $scope.reset();\r\n })\r\n .then(clearForm);\r\n }\r\n rollbackThisActivationIdInCaseOfFailure = '';\r\n $scope.activationSuccessFlag = true;\r\n return installationsService.getInstallationById(newInstallationId).then(function (response) {\r\n $scope.$emit('installationCreated', {\r\n newInstallation: response.data,\r\n });\r\n $scope.installation = response.data;\r\n $scope.installationId = $scope.installation.id;\r\n $scope.deviceSerialNumber = $scope.installation.device.serialNumber;\r\n $scope.pkgId = $scope.installation.packages[0].id;\r\n $scope.equipId = $scope.installation.equipment.id;\r\n $scope.loading = false;\r\n\r\n $timeout(function () {\r\n $scope.activationSuccessFlag = false;\r\n $scope.next();\r\n }, 3000);\r\n });\r\n };\r\n\r\n dataLayer.push({\r\n event: gtmEvents.activationInstallationCreated,\r\n data: {\r\n newInstallation,\r\n },\r\n });\r\n\r\n installationsService\r\n .createInstallation(newInstallation, sgResource)\r\n .then(postProcessInstallation)\r\n .catch(handleError);\r\n }; // end submitActivationForm()\r\n\r\n $scope.showSelectProductsModal = function () {\r\n $scope.animationsEnabled = true;\r\n const modalInstance = $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('./templates-modal/templates.modal.html'),\r\n controller: 'DevicesActivationsSingleModalController',\r\n size: 'md',\r\n resolve: {\r\n products() {\r\n return $scope.availableProducts;\r\n },\r\n },\r\n });\r\n\r\n modalInstance.result.then(function (product) {\r\n if (product === 'cancel') {\r\n } else {\r\n $scope.isTemplateSelected = true;\r\n $scope.product = product;\r\n $scope.equipment.make = $scope.product.metadata.make;\r\n $scope.equipment.model = $scope.product.metadata.model;\r\n $scope.equipment.package = $scope.packages.find(\r\n (pkg) => pkg.id === $scope.product.package.id,\r\n );\r\n $scope.selectedPackage = $scope.equipment.package;\r\n $scope.selectedModules = $scope.product.modules || [];\r\n\r\n $scope.userSelectedTemplatePackage = true;\r\n }\r\n });\r\n };\r\n\r\n // Step 3 - Device Communication\r\n $scope.isDeviceConnected = function () {\r\n $scope.communicationActions = '';\r\n if ($scope.checkBox.isChecked === true) {\r\n $scope.disable.next = false;\r\n $scope.communicationActions = 'confirmed';\r\n }\r\n };\r\n\r\n $scope.getLastComm = function () {\r\n const serialNumber = $scope.deviceSerialNumber;\r\n devicesService\r\n .getDevice(serialNumber)\r\n .then(function (response) {\r\n const device = response.data;\r\n if (device.communicatedAt) {\r\n $scope.isConnected = true;\r\n $scope.loadingLastComm = false;\r\n $scope.reloadingLastComm = false;\r\n $scope.lastCommunication = device.communicatedAt;\r\n } else {\r\n $scope.loadingLastComm = false;\r\n $scope.reloadingLastComm = false;\r\n $scope.isConnected = false;\r\n $scope.lastCommunication = null;\r\n }\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while attempting to communicate with the device.',\r\n );\r\n $scope.loadingLastComm = false;\r\n $scope.reloadingLastComm = false;\r\n });\r\n };\r\n\r\n // Step 4 = Device Connection Status\r\n $scope.reloadLastComm = function () {\r\n $scope.reloadingLastComm = true;\r\n $scope.getLastComm();\r\n };\r\n\r\n // Step 6 - GPS Location\r\n $scope.getGPSAction = function (gpsLocationModel) {\r\n $scope.gpsLocationAction = {};\r\n if (gpsLocationModel === 1) {\r\n $scope.gpsLocationAction = 'none';\r\n }\r\n if (gpsLocationModel === 2) {\r\n $scope.gpsLocationAction = 'correct';\r\n }\r\n if (gpsLocationModel === 3) {\r\n $scope.gpsLocationAction = 'incorrect';\r\n }\r\n };\r\n\r\n // Grab the equipmentId from the installation\r\n $scope.getInstallationLocation = function () {\r\n equipmentRepository\r\n .getSingleEquipment($scope.equipId)\r\n .then(function (response) {\r\n const equipmentData = response.data.data;\r\n if (equipmentData.attributes.coords) {\r\n vm.map.setView(\r\n [equipmentData.attributes.coords[1], equipmentData.attributes.coords[0]],\r\n 19,\r\n );\r\n L.marker([equipmentData.attributes.coords[1], equipmentData.attributes.coords[0]], {\r\n icon: myIcon,\r\n }).addTo(vm.map);\r\n $scope.reloadingLocation = false;\r\n } else {\r\n $scope.reloadingLocation = false;\r\n }\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while retrieving the location of the device.',\r\n );\r\n $scope.reloadingLocation = false;\r\n });\r\n };\r\n\r\n $scope.reloadLocation = function () {\r\n $scope.reloadingLocation = true;\r\n $scope.getInstallationLocation();\r\n };\r\n\r\n $scope.getLastReportedRunHours = function () {\r\n equipmentRepository\r\n .getEquipment($scope.installation.equipment.id, null, ['series'], null)\r\n .then(function (response) {\r\n const equipResponse = response.data;\r\n for (let i = 0; i < equipResponse.included.length; i++) {\r\n if (equipResponse.included[i].attributes.dataId === 'run_time') {\r\n $scope.runHours = equipResponse.included[i].attributes.last.v;\r\n }\r\n }\r\n })\r\n .catch(function () {\r\n $scope.error = gettextCatalog.getString(\r\n 'An error occurred while trying to retrieve the last reported run hours.',\r\n );\r\n });\r\n };\r\n\r\n $scope.getRunHoursAction = function (runHoursModel) {\r\n $scope.runHoursAction = {};\r\n if (runHoursModel === 1) {\r\n $scope.runHoursAction = 'none';\r\n }\r\n if (runHoursModel === 2) {\r\n $scope.runHoursAction = 'correct';\r\n }\r\n if (runHoursModel === 3) {\r\n $scope.runHoursAction = 'incorrect';\r\n }\r\n };\r\n\r\n $scope.refreshDataPointValues = function () {\r\n $scope.refreshingSeriesData = true;\r\n $scope.getDataPointValues();\r\n };\r\n\r\n // Step 8 - Asset Data\r\n $scope.seriesDataFilter = function (item) {\r\n const filtered = false;\r\n if (item.tags != null && item.tags.length > 0) {\r\n for (let i = 0; i < item.tags.length; i++) {\r\n if (item.tags[i] === 'dtc') {\r\n return false;\r\n }\r\n }\r\n }\r\n if (item.last === null || item.last.v === null) {\r\n return false;\r\n }\r\n return !filtered;\r\n };\r\n\r\n $scope.getDataPointValues = function () {\r\n $scope.loadingSeries = true;\r\n $scope.seriesData = [];\r\n equipmentRepository\r\n .getEquipmentSeries($scope.equipId)\r\n .then(function (response) {\r\n if (!response) {\r\n $scope.noSeriesData = true;\r\n $scope.loadingSeries = false;\r\n $scope.refreshingSeriesData = false;\r\n $scope.equipmentSeries.lastcomm = gettextCatalog.getString('Not Available');\r\n $scope.equipmentSeries.isLoadingTableData = false;\r\n } else {\r\n // loop thru all series data\r\n for (let i = 0; i < response.data.length; i++) {\r\n // check for 'last' if it is missing skip it\r\n if (!response.data[i].last) {\r\n $scope.noSeriesData = true;\r\n continue; // skip rest of for loop.\r\n }\r\n // Clear all of the data points\r\n $scope.noSeriesData = false;\r\n for (let j = 0; j < $rootScope.currentUser.visibleDatapoints.length; j++) {\r\n if (response.data[i].tags[0] === $rootScope.currentUser.visibleDatapoints[j].id) {\r\n // Filter out DTC(Datapoint Faults)\r\n // They are always present, but should not be shown here. They should be part of alerts tab.\r\n if (response.data[i].tags.indexOf('dtc') > -1) {\r\n if (+response.data[i].last.v) {\r\n // convert to int with '+' and convert to boolean with a double '!'\r\n // $scope.alarmCount = ++$scope.alarmCount;\r\n }\r\n break; // skip rest of for loop.\r\n }\r\n // determine UOM\r\n let uom = '';\r\n uom = response.data[i].attrs.uom;\r\n if (!uom) {\r\n if (response.data[i].tags.indexOf('gps') > -1) uom = 'location';\r\n else if (response.data[i].tags.indexOf('state') > -1) uom = 'boolean';\r\n else if (response.data[i].tags.indexOf('speed') > -1) uom = 'km/h';\r\n }\r\n // determine filter to show nice values.\r\n if (response.data[i].tags.indexOf('numeric'))\r\n $filter('number')(response.data[i].last.v, 1);\r\n\r\n if ($scope.wantedSeriesList.indexOf(response.data[i].title) > -1) {\r\n // getting the wanted series datapoints\r\n $scope.equipmentSeries.tabularDatapoints.push(response.data[i]);\r\n }\r\n const datapoint = response.data[i];\r\n if (datapoint.tags) {\r\n const rootTag = datapoint.tags[0];\r\n if (rootTag === 'battery_potential') {\r\n datapoint.priority = 5;\r\n } else if (rootTag === 'run_time') {\r\n datapoint.priority = 10;\r\n $scope.runHours = datapoint.last.v; // holding run hours\r\n } else if (rootTag === 'fuel_level') {\r\n datapoint.priority = 8;\r\n } else if (rootTag === 'speed') {\r\n datapoint.priority = 4;\r\n } else {\r\n datapoint.priority = 0;\r\n }\r\n }\r\n $scope.seriesData.push(response.data[i]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n })\r\n .catch(function () {\r\n const errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving asset details',\r\n );\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.loadingSeries = false;\r\n return $q.reject();\r\n })\r\n .finally(function () {\r\n if ($scope.seriesData.length === 0) {\r\n $scope.noSeriesData = true;\r\n }\r\n $scope.loadingSeries = false;\r\n $scope.refreshingSeriesData = false;\r\n });\r\n };\r\n\r\n $scope.finish = function () {\r\n if ($scope.step === 'notes') {\r\n if ($scope.note.text !== '') {\r\n createNote();\r\n }\r\n logUserActions();\r\n }\r\n $state.go('devices2.detail', {\r\n installationId: $scope.installationId,\r\n });\r\n };\r\n\r\n $scope.reset = function () {\r\n logUserActions();\r\n if ($scope.step === 'notes') {\r\n if ($scope.note.text !== '') {\r\n createNote();\r\n }\r\n }\r\n $state.transitionTo($state.current, $stateParams, {\r\n reload: true,\r\n inherit: false,\r\n notify: true,\r\n });\r\n };\r\n}\r\n","export default function DevicesController($scope, $state, gettextCatalog) {\r\n\t'ngInject';\r\n\r\n\t$scope.title = gettextCatalog.getString('Devices');\r\n\t$scope.totalUsage = 1024;\r\n\r\n\t$scope.search = function() {\r\n\t\t$state.go('^.search', { query: $scope.searchText });\r\n\t};\r\n\r\n\t$scope.search = function() {\r\n\t\t$state.go('^.search', { query: $scope.searchText });\r\n\t};\r\n}\r\n","const dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n deviceDeleteInstallation: 'deviceDeleteInstallation',\r\n};\r\n\r\nconst DevicesDeactivateModalController = (\r\n $scope,\r\n $uibModalInstance,\r\n installation,\r\n $state,\r\n installationsService,\r\n gettextCatalog,\r\n devicesService,\r\n $uibModal,\r\n) => {\r\n 'ngInject';\r\n\r\n $scope.installation = installation;\r\n\r\n const handleError = (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while deactivating the device.');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += `. ${gettextCatalog.getString('Please try again later')}.`;\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.deleting = false;\r\n };\r\n\r\n $scope.ok = () => {\r\n $scope.errorFlag = false;\r\n\r\n devicesService\r\n .getDeviceModelBySerialNumber($scope.installation.device.serialNumber)\r\n .then((response) => {\r\n // if the device modem is CDMA then it is a verizon unit, verizon needs two modal popups\r\n if (response.data.modem === 'cdma') {\r\n $uibModalInstance.close();\r\n\r\n $uibModal.open({\r\n animation: true,\r\n template: require('./deactivate.modal.modal.html'),\r\n controller: 'DevicesDeactivateModalModalController',\r\n resolve: {\r\n installation: () => $scope.installation,\r\n },\r\n size: 'md',\r\n });\r\n } else {\r\n $scope.deleting = true;\r\n\r\n dataLayer.push({\r\n event: gtmEvents.deviceDeleteInstallation,\r\n data: {\r\n installation: $scope.installation.id,\r\n serialNumber: $scope.installation.device.serialNumber,\r\n },\r\n });\r\n\r\n installationsService.deleteInstallation($scope.installation.id).then(() => {\r\n $scope.$emit('deviceDeactivated');\r\n $uibModalInstance.close();\r\n $state.go('devices2.base');\r\n }, handleError);\r\n }\r\n }, handleError);\r\n };\r\n\r\n $scope.cancel = () => {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', () => {\r\n $scope.cancel();\r\n });\r\n};\r\n\r\nexport default DevicesDeactivateModalController;\r\n","const dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n deviceDeleteInstallation: 'deviceDeleteInstallation',\r\n};\r\n\r\nconst DevicesDeactivateModalModalController = (\r\n $scope,\r\n $uibModalInstance,\r\n installation,\r\n $state,\r\n installationsService,\r\n gettextCatalog,\r\n) => {\r\n 'ngInject';\r\n\r\n $scope.installation = installation;\r\n $scope.deleting = false;\r\n\r\n const handleError = (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while deactivating the device.');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += `. ${gettextCatalog.getString('Please try again later')}.`;\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.deleting = false;\r\n };\r\n\r\n $scope.ok = () => {\r\n $scope.deleting = true;\r\n\r\n dataLayer.push({\r\n event: gtmEvents.deviceDeleteInstallation,\r\n data: {\r\n equipment: $scope.installation.id,\r\n },\r\n });\r\n\r\n installationsService.deleteInstallation($scope.installation.id).then(() => {\r\n $scope.$emit('deviceDeactivated');\r\n $uibModalInstance.dismiss();\r\n $state.go('devices2.base');\r\n }, handleError);\r\n };\r\n\r\n $scope.cancel = () => {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n};\r\n\r\nexport default DevicesDeactivateModalModalController;\r\n","const DeviceDetailController = (\r\n $scope,\r\n $rootScope,\r\n $stateParams,\r\n $uibModal,\r\n installationsService,\r\n packagesService,\r\n equipmentRepository,\r\n TimezoneService,\r\n gettextCatalog,\r\n deviceDiagnosticService,\r\n) => {\r\n 'ngInject';\r\n\r\n $rootScope.selectedInstallationId = $stateParams.installationId;\r\n $scope.loading = true;\r\n $scope.editing = {};\r\n $scope.postingChange = false;\r\n $scope.selectedEquipment = {};\r\n $scope.userActions = '';\r\n $scope.moduleViewModel = '';\r\n $scope.hasPkgModules = false;\r\n $scope.canDeactivate = false;\r\n\r\n // private functions\r\n const getErrorMessage = (error = {}, defaultMsg = '') => {\r\n const {\r\n data: { message = '', Message = '' },\r\n status = '',\r\n statusText = '',\r\n } = error;\r\n return `${message || Message || defaultMsg} ${status}:${statusText} ${gettextCatalog.getString(\r\n '. Please try again later.',\r\n )} `;\r\n };\r\n\r\n const getDiagnosticSeries = (esn, assetId) => {\r\n $scope.gpsInfo = {};\r\n $scope.cellInfo = {};\r\n if (esn) {\r\n deviceDiagnosticService\r\n .getLastReportedCellSignalSeries(esn)\r\n .then((cellData) => {\r\n $scope.cellInfo = cellData;\r\n })\r\n .catch(() => {\r\n $scope.cellInfo = {\r\n status: 'Error',\r\n };\r\n });\r\n }\r\n if (assetId) {\r\n deviceDiagnosticService\r\n .getLastReportedGpsSeries(assetId)\r\n .then((gpsData) => {\r\n $scope.gpsInfo = gpsData;\r\n })\r\n .catch(() => {\r\n $scope.gpsInfo = {\r\n status: 'Error',\r\n };\r\n });\r\n }\r\n };\r\n\r\n $scope.deactivateButtonPressed = () =>\r\n $uibModal.open({\r\n animation: true,\r\n template: require('./deactivate-modal/deactivate.modal.html'),\r\n controller: 'DevicesDeactivateModalController',\r\n resolve: {\r\n installation: () => $scope.installation,\r\n },\r\n size: 'md',\r\n });\r\n\r\n // The user must have the feature permission to deactivate devices\r\n const canUserDeactivate = () =>\r\n !!$rootScope.currentUser.features.find((f) => f.path.indexOf('devices.deactivate') >= 0);\r\n\r\n $scope.canDeactivate = canUserDeactivate();\r\n\r\n // Local functions\r\n const refresh = () => {\r\n installationsService.getInstallationById($stateParams.installationId).then(\r\n (response) => {\r\n $scope.$emit('$viewContentLoaded');\r\n $scope.installation = response.data;\r\n\r\n const { equipment = {}, device = {} } = $scope.installation || {};\r\n getDiagnosticSeries(device.serialNumber, equipment.id);\r\n\r\n if ($scope.installation) {\r\n $scope.installation.basePkgs = [];\r\n $scope.installation.pkgModules = [];\r\n const pakageIds = ($scope.installation.packages || []).map((pkg) => pkg.id);\r\n if (pakageIds.length > 0) {\r\n packagesService.getPackageByIds(pakageIds).then(\r\n (packagesServiceResponse) => {\r\n const packages = packagesServiceResponse.data || [];\r\n\r\n $scope.installation.basePkgs = packages.filter((pkg) => !pkg.isModule);\r\n $scope.installation.pkgModules = packages.filter((pkg) => pkg.isModule);\r\n\r\n const m5device = ($scope.installation.device.attrs.model || '')\r\n .toLowerCase()\r\n .startsWith('m5s');\r\n\r\n const pkgWithSyncDatapoint = packages.find((pkg) => pkg.allowsRunHoursSync);\r\n if (pkgWithSyncDatapoint) {\r\n $scope.installation.syncRunHourAvaliable =\r\n pkgWithSyncDatapoint.allowsRunHoursSync && !m5device;\r\n $scope.installation.syncRunHoursDataPoint = pkgWithSyncDatapoint.runHoursSync;\r\n }\r\n\r\n $scope.loading = false;\r\n },\r\n (error) => {\r\n $scope.loading = false;\r\n const errorMsg = getErrorMessage(\r\n error,\r\n gettextCatalog.getString('An error occurred while retrieving device information'),\r\n );\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n );\r\n } else {\r\n $scope.loading = false;\r\n }\r\n\r\n return equipmentRepository.getAllTags().then(\r\n (packagesServiceResponseResponse) => {\r\n // could this be done in $rootScope (like datapoints)?\r\n $scope.tags = packagesServiceResponseResponse.data.data;\r\n $scope.parseTags();\r\n },\r\n (error) => {\r\n const errorMsg = getErrorMessage(\r\n error,\r\n gettextCatalog.getString(\r\n 'An error occurred while retrieving attribute information',\r\n ),\r\n );\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.assetLoading = false;\r\n },\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n (error) => {\r\n $scope.loading = false;\r\n const errorMsg = getErrorMessage(\r\n error,\r\n gettextCatalog.getString('An error occurred while retrieving device information'),\r\n );\r\n\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n },\r\n );\r\n };\r\n\r\n refresh(); // call when controller is initialized\r\n\r\n $scope.isBrowser = {\r\n IE10: false,\r\n IE9: false,\r\n EDGE: false,\r\n };\r\n $scope.showInstallationNotesModal = () => {\r\n $scope.animationsEnabled = true;\r\n // Adding a fix for EDGE 25.1 - autofocus miss places the cursor above the textarea when the modal loads\r\n // found a fix here http://stackoverflow.com/questions/25764824/strange-cursor-placement-in-modal-when-using-autofocus-in-internet-explorer\r\n // and here http://stackoverflow.com/questions/31757852/how-can-i-detect-internet-explorer-ie-and-microsoft-edge-using-javascript\r\n // Detect Microsoft Browser\r\n if (/MSIE 10/i.test(navigator.userAgent)) {\r\n // This is internet explorer 10\r\n $scope.isBrowser.IE10 = true;\r\n }\r\n if (/MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) {\r\n // This is internet explorer 9 or 11\r\n $scope.isBrowser.IE9 = true;\r\n }\r\n if (/Edge\\/\\d./i.test(navigator.userAgent)) {\r\n // This is Microsoft Edge\r\n $scope.isBrowser.EDGE = true;\r\n }\r\n\r\n const modalInstance =\r\n $scope.isBrowser.IE10 || $scope.isBrowser.IE9 || $scope.isBrowser.EDGE\r\n ? $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n windowClass: 'modal fade in',\r\n template: require('./install-notes-modal/notes.modal.html'),\r\n controller: 'InstallationNotesModalController',\r\n size: 'md',\r\n resolve: {\r\n // optional, to pass any items to modal\r\n installation: () => $scope.installation,\r\n note: () => $scope.note,\r\n },\r\n })\r\n : $uibModal.open({\r\n animation: $scope.animationsEnabled,\r\n template: require('./install-notes-modal/notes.modal.html'),\r\n controller: 'InstallationNotesModalController',\r\n size: 'md',\r\n resolve: {\r\n // optional, to pass any items to modal\r\n installation: () => $scope.installation,\r\n note: () => $scope.note,\r\n },\r\n });\r\n\r\n // \"Save As\" modal dialog result - called when user clicks save\r\n modalInstance.result.then(\r\n (note) => {\r\n $scope.note = note;\r\n },\r\n () => {},\r\n );\r\n }; // end showSelectProductsModal()\r\n\r\n $scope.parseTags = () => {\r\n $scope.parsedTags = [];\r\n $scope.parsedAttrs = {};\r\n\r\n for (const key in $scope.installation.equipment.attrs) {\r\n let found = false;\r\n for (let j = 0; j < $scope.tags.length; j++) {\r\n if (key.toLowerCase() === $scope.tags[j].key.toLowerCase()) {\r\n $scope.parsedTags.push({\r\n key: $scope.tags[j].key,\r\n value:\r\n $scope.tags[j].dataType === 'Datetime'\r\n ? TimezoneService.tagToUserTimezone($scope.installation.equipment.attrs[key])\r\n : $scope.installation.equipment.attrs[key],\r\n index: j,\r\n datatype: $scope.tags[j].datatype,\r\n id: $scope.tags[j].id,\r\n });\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n $scope.parsedAttrs[key] = $scope.installation.equipment.attrs[key];\r\n }\r\n }\r\n };\r\n};\r\n\r\nexport default DeviceDetailController;\r\n","import { fromPromise } from 'rxjs/internal-compatibility';\r\nimport App from '../../../app';\r\n\r\nconst dataLayer = window.dataLayer || [];\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Devices\";\r\n\r\nconst gtmEvents = {\r\n devicesListSearching: 'devicesListSearching',\r\n devicesListRefreshDevice: 'devicesListRefreshDevice',\r\n};\r\n\r\nconst DevicesListController = (\r\n $scope,\r\n $timeout,\r\n installationsService,\r\n devicesService,\r\n gettextCatalog,\r\n) => {\r\n 'ngInject';\r\n\r\n $scope.pageSize = 14;\r\n\r\n $scope.query = '';\r\n\r\n // Local Variables\r\n const pageLimit = 30;\r\n\r\n $scope.showSingleInstallPanel = false;\r\n $scope.showBulkInstallPanel = false;\r\n $scope.pagedInstallations = [];\r\n // represent currentPage index in pagedInstallations\r\n $scope.currentPage = 0;\r\n $scope.xMoreDataAvailable = false;\r\n $scope.canDelete = false;\r\n $scope.nextPageOffset = [];\r\n $scope.currentSearchTerm = '';\r\n $scope.transferKeys = [];\r\n $scope.unavailable = 'Unavailable';\r\n\r\n // to highlight rows when refreshing\r\n $scope.selectedRow = null;\r\n\r\n let nextPageSubscription = null;\r\n\r\n $scope.previousPage = () => {\r\n $scope.currentPage -= 1;\r\n $scope.pagedInstallations.pop();\r\n $scope.nextPageOffset.pop();\r\n\r\n // If next page is loading, cancel it\r\n if (nextPageSubscription !== null) {\r\n $scope.showInstallationsSpinner = false;\r\n nextPageSubscription.unsubscribe();\r\n nextPageSubscription = null;\r\n }\r\n };\r\n\r\n const onInit = () => {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n\r\n $scope.sortString = 'created:desc';\r\n\r\n const updateResults = (data, _status, headers) => {\r\n $scope.showInstallationsSpinner = false;\r\n $scope.pagedInstallations.push(data);\r\n $scope.currentPage = $scope.pagedInstallations.length - 1;\r\n\r\n $scope.xMoreDataAvailable = headers('x-more-data-available') === 'true';\r\n $scope.nextPageOffset.push(\r\n $scope.xMoreDataAvailable ? headers('link').match(/.*since\\=(\\d+).*/)[1] : '',\r\n );\r\n };\r\n\r\n const notRefreshingData = (data) =>\r\n [...data].map((d) => ({\r\n ...d,\r\n isRefreshing: false,\r\n selectedRow: -1,\r\n }));\r\n\r\n const errorOccured = gettextCatalog.getString(\r\n 'An error occurred while retrieving device information',\r\n );\r\n\r\n const formatErrorMessage = (error) =>\r\n error.data.message\r\n ? `${error.data.message} ${error.status} - ${error.statusText}`\r\n : `${errorOccured}: ${error.status} - ${error.statusText}`;\r\n\r\n const getErrorMessage = (error) =>\r\n error.data || error.status\r\n ? formatErrorMessage(error)\r\n : `${errorOccured}. ${gettextCatalog.getString('Please try again later')}.`;\r\n\r\n $scope.search = (query) => {\r\n $scope.errorFlag = false;\r\n $scope.nextPageOffset = [''];\r\n $scope.pagedInstallations = [];\r\n $scope.currentPage = 0;\r\n $scope.loading = true;\r\n\r\n // push the search event to the data layer.\r\n dataLayer.push({\r\n event: gtmEvents.devicesListSearching,\r\n data: {\r\n query,\r\n },\r\n });\r\n\r\n installationsService\r\n .getInstallations(\r\n pageLimit,\r\n $scope.sortString,\r\n $scope.nextPageOffset[$scope.nextPageOffset.length - 1],\r\n query,\r\n null,\r\n )\r\n .then(\r\n (response) => {\r\n $scope.loading = false;\r\n if (response.data) {\r\n updateResults(notRefreshingData(response.data), response.status, response.headers);\r\n }\r\n },\r\n (error) => {\r\n $scope.loading = false;\r\n $scope.errorFlag = true;\r\n $scope.errorText = getErrorMessage(error);\r\n },\r\n );\r\n };\r\n\r\n $scope.nextPage = () => {\r\n if (!$scope.xMoreDataAvailable) return;\r\n $scope.showInstallationsSpinner = true;\r\n $scope.errorFlag = false;\r\n nextPageSubscription = fromPromise(\r\n installationsService.getInstallations(\r\n pageLimit,\r\n $scope.sortString,\r\n $scope.nextPageOffset[$scope.nextPageOffset.length - 1],\r\n ),\r\n ).subscribe(\r\n (response) => updateResults(response.data, response.status, response.headers),\r\n (error) => {\r\n $scope.showInstallationsSpinner = false;\r\n $scope.errorFlag = true;\r\n $scope.errorText = getErrorMessage(error);\r\n },\r\n );\r\n };\r\n\r\n // function that sets the value of selectedRow to current index\r\n const setClickedRow = (installation) => {\r\n installation.selectedRow = installation.id;\r\n };\r\n\r\n $scope.refreshDevice = (serialNumber, installation) => {\r\n installation.isRefreshing = true;\r\n $scope.refreshErrorFlag = false;\r\n\r\n // push the refresh event to the data layer.\r\n dataLayer.push({\r\n event: gtmEvents.devicesListRefreshDevice,\r\n data: {\r\n serialNumber,\r\n installation,\r\n },\r\n });\r\n\r\n devicesService.getDevice(serialNumber).then(\r\n (response) => {\r\n const { data: device } = response;\r\n\r\n installation.isRefreshing = false;\r\n\r\n const { communicatedAt } = device;\r\n if (communicatedAt) {\r\n // highlight table row green\r\n // set install.device.communicatedAt to device.communicatedAt\r\n // should automagically changed button and status icon to green\r\n installation.device.communicatedAt = communicatedAt;\r\n }\r\n setClickedRow(installation);\r\n\r\n $timeout(() => {\r\n installation.selectedRow = -1;\r\n }, 3000);\r\n },\r\n (error) => {\r\n installation.isRefreshing = false;\r\n $scope.refreshErrorFlag = true;\r\n $scope.refreshErrorText = getErrorMessage(error);\r\n },\r\n );\r\n };\r\n\r\n // ON INIT\r\n $scope.search();\r\n\r\n onInit();\r\n};\r\n\r\nexport default DevicesListController;\r\n","const dataLayer = window.dataLayer || [];\r\n\r\nconst gtmEvents = {\r\n deviceUpdateNote: 'deviceUpdateNote',\r\n deviceCreateNote: 'deviceCreateNote',\r\n deviceDeleteNote: 'deviceDeleteNote',\r\n};\r\n\r\nconst InstallationNotesModalController = (\r\n $scope,\r\n $rootScope,\r\n $uibModalInstance,\r\n installation,\r\n installationNoteService,\r\n gettextCatalog,\r\n) => {\r\n 'ngInject';\r\n\r\n $scope.installation = installation;\r\n $scope.notes = [];\r\n $scope.editing = {};\r\n $scope.editNote = {};\r\n $scope.loading = true;\r\n $scope.creatingnote = false;\r\n $scope.postingChange = false;\r\n\r\n $scope.cancel = () => {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n\r\n $scope.$on('$locationChangeStart', (event, _next, _current) => {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n\r\n $scope.toggleEditing = (note) => {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.editNote.text = note.text;\r\n };\r\n\r\n $scope.cancelEdit = (note) => {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.editNote.text = null;\r\n };\r\n\r\n // C.R.U.D Methods for Notes\r\n $scope.getInstallationNotes = () => {\r\n const installationId = $scope.installation.id;\r\n\r\n $scope.loading = true;\r\n installationNoteService.getInstallationNote(installationId).then(\r\n (response) => {\r\n $scope.notes = response.data.data;\r\n $scope.loading = false;\r\n },\r\n (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while retrieving alert notes');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.onLoadErrorFlag = true;\r\n $scope.onLoadErrorText = errorMsg;\r\n $scope.loading = false;\r\n },\r\n );\r\n }; // getInstallationNotes\r\n\r\n $scope.getInstallationNotes($scope.installation);\r\n\r\n $scope.createNewNote = () => {\r\n $scope.creatingnote = true;\r\n const installationId = $scope.installation.id;\r\n const note = {};\r\n\r\n note.text = $scope.newNote.text;\r\n\r\n dataLayer.push({\r\n event: gtmEvents.deviceCreateNote,\r\n data: {\r\n installationId,\r\n },\r\n });\r\n\r\n installationNoteService.createNote(installationId, note).then(\r\n () => {\r\n $scope.getInstallationNotes(installationId);\r\n $scope.creatingnote = false;\r\n $scope.newNote.text = '';\r\n },\r\n (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while creating the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.creatingnote = false;\r\n },\r\n );\r\n };\r\n\r\n $scope.updateNote = (installationId, noteId, note) => {\r\n if ($scope.editNote.text !== '') {\r\n note.text = $scope.editNote.text;\r\n $scope.postingChange = true;\r\n\r\n dataLayer.push({\r\n event: gtmEvents.deviceUpdateNote,\r\n data: {\r\n installationId,\r\n noteId,\r\n },\r\n });\r\n\r\n installationNoteService.updateNote(installationId, noteId, note).then(\r\n () => {\r\n $scope.editing[note.id] = !$scope.editing[note.id];\r\n $scope.postingChange = false;\r\n },\r\n (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while updating the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.postingChange = false;\r\n },\r\n );\r\n } else {\r\n $scope.isInvalidData = true;\r\n }\r\n }; // update note\r\n\r\n $scope.deleteNote = (installationId, noteId) => {\r\n dataLayer.push({\r\n event: gtmEvents.deviceDeleteNote,\r\n data: {\r\n installationId,\r\n noteId,\r\n },\r\n });\r\n\r\n installationNoteService.deleteNote(installationId, noteId).then(\r\n () => {\r\n $scope.getInstallationNotes(installationId);\r\n },\r\n (error) => {\r\n let errorMsg = gettextCatalog.getString('An error occurred while deleting the note');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString('. Please try again later.');\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n },\r\n );\r\n };\r\n};\r\n\r\nexport default InstallationNotesModalController;\r\n","export default function TelematicsSerialNumberDirective($q, installationsService, packagesService, devicesService, gettextCatalog) {\r\n\r\n 'ngInject';\r\n\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, elm, attrs, ctrl) {\r\n\r\n //prevent enter from submitting the form\r\n elm.on(\"keydown\", function (ev) {\r\n if (ev.keyCode == 13) {\r\n\r\n if (!e) var e = window.event;\r\n\r\n e.cancelBubble = true;\r\n e.returnValue = false;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n ctrl.$commitViewValue();\r\n scope.$apply(ctrl.$setTouched);\r\n }\r\n });\r\n\r\n elm.on(\"change blur\", function (ev) {\r\n ctrl.$commitViewValue();\r\n scope.$apply(ctrl.$setTouched);\r\n\r\n });\r\n\r\n ctrl.$asyncValidators.telematicsserialnumber = function (modelValue /*, viewValue*/ ) {\r\n var deferred = $q.defer();\r\n var serialNumber = modelValue;\r\n\r\n scope.$emit(\"packagesRetrieving\");\r\n var deviceModel = {};\r\n var hardware = \"\";\r\n var packageList = [];\r\n var moduleList = [];\r\n scope.errorMsg = [];\r\n\r\n // 1. Check current installation status.\r\n function checkInstallations(serialNumber) {\r\n return installationsService\r\n .getInstallations(null, null, null, serialNumber)\r\n .then(function (installation) {\r\n if (!!installation.data && installation.data.length > 0) {\r\n scope.errorMsg = gettextCatalog.getString(\"Device \" + serialNumber + \" has already been activated.\");\r\n handleError();\r\n } else {\r\n getDevice(serialNumber);\r\n }\r\n }, function (error) {\r\n scope.errorMsg = gettextCatalog.getString(\"Could not verify the installation status for device \" + serialNumber);\r\n handleError();\r\n });\r\n }\r\n\r\n // 2. Get the device by serial number.\r\n function getDevice(serialNumber) {\r\n return devicesService.getDevice(serialNumber)\r\n .then(function (deviceResponse) {\r\n deviceModel = deviceResponse.data;\r\n if (deviceResponse.data) {\r\n deviceModel = deviceResponse.data;\r\n scope.$emit(\"deviceRetrieved\", {\r\n device: deviceModel\r\n });\r\n getDeviceModel(serialNumber);\r\n }\r\n return serialNumber;\r\n }, function (error) {\r\n scope.errorMsg = gettextCatalog.getString(\"Device \" + serialNumber + \" could not be found, Please enter a valid serial number\");\r\n handleError();\r\n });\r\n }\r\n\r\n // 3. Get Device Model\r\n function getDeviceModel(serialNumber) {\r\n return devicesService.getDeviceModelBySerialNumber(serialNumber).then(function (response) {\r\n hardware = response.data.name;\r\n getPackages();\r\n\r\n }, handleError);\r\n }\r\n\r\n\r\n // 3. Get the packages.\r\n function getPackages() {\r\n return packagesService\r\n .getAllPackages()\r\n .then(function (packageResponse) {\r\n packageList = [];\r\n moduleList = [];\r\n if (!!packageResponse && !!packageResponse.data) {\r\n for (var i = 0; i < packageResponse.data.length; i++) {\r\n var pkg = packageResponse.data[i];\r\n if (!pkg.inactive && pkg.hardware.indexOf(hardware) >= 0) {\r\n if (pkg.isModule) {\r\n moduleList.push(pkg);\r\n continue;\r\n }\r\n packageList.push(pkg);\r\n }\r\n }\r\n scope.$emit(\"packagesRetrieved\", {\r\n packages: packageList,\r\n modules: moduleList\r\n });\r\n }\r\n\r\n deferred.resolve();\r\n }, function (error) {\r\n scope.errorMsg = gettextCatalog.getString(\"Could not retrieve packages for device \" + serialNumber);\r\n handleError();\r\n });\r\n }\r\n\r\n // Handle any error.\r\n function handleError(error) {\r\n scope.$emit(\"errorsRetrieved\", {\r\n errorMessage: scope.errorMsg\r\n });\r\n }\r\n\r\n // Execute the process.\r\n checkInstallations(serialNumber);\r\n\r\n return deferred.promise;\r\n };\r\n }\r\n };\r\n}","export default function activationsService(activationsRepo) {\r\n\r\n 'ngInject';\r\n\r\n this.syncRunHours = function (installationId, runHours) {\r\n return activationsRepo.createSyncRequest(installationId, runHours)\r\n .then(response => ({\r\n value: parseFloat(response.data[0].value)\r\n }));\r\n };\r\n}","export default function activationsRepo($http, appSettings) {\r\n 'ngInject';\r\n\r\n const base = `${appSettings.InReachApiInstallationsEndpoint}`;\r\n\r\n this.createSyncRequest = function(installationId, runHours) {\r\n let req = {\r\n method: 'POST',\r\n url: `${base}/${installationId}/runhours`,\r\n data: JSON.stringify({\r\n value: runHours\r\n })\r\n };\r\n return $http(req);\r\n };\r\n}\r\n","export default function syncRunHoursService($http, appSettings, packagesService, EquipmentService) {\r\n 'ngInject';\r\n\r\n const syncRunHours = (installationId, datapointId, runHours) => {\r\n const url = `${appSettings.InReachApiInstallationsEndpoint}/${installationId}/runhours`;\r\n const syncBody = {baseTag: datapointId, value: runHours};\r\n return $http.post(url, syncBody);\r\n };\r\n\r\n const getSyncRunHoursTag = packageIds =>\r\n packagesService\r\n .getPackageByIds(packageIds)\r\n .then(response => {\r\n const pkgWithSyncDatapoint = response.data.find(pkg => pkg.allowsRunHoursSync);\r\n return pkgWithSyncDatapoint ? pkgWithSyncDatapoint.runHoursSync : null;\r\n })\r\n .catch(() => false);\r\n\r\n const getLastReportedRunHours = (equipmentId, tag) => {\r\n return EquipmentService.getEquipmentSeries(equipmentId, tag);\r\n };\r\n\r\n const service = {\r\n syncRunHours: syncRunHours,\r\n getSyncRunHoursTag: getSyncRunHoursTag,\r\n getLastReportedRunHours: getLastReportedRunHours\r\n };\r\n\r\n return service;\r\n}\r\n","import angular from 'angular';\r\n\r\n/* Component Imports */\r\nimport SyncRunHoursComponent from './sync-runhours-component/sync-runhours.component';\r\n/* Config Imports */\r\nimport DevicesRouteConfig from './devices.route';\r\n/* Controller Imports */\r\nimport DeviceActivationsBulkController from './activations/bulk/bulk.controller';\r\nimport DeviceActivationsBulkCustomController from './activations/bulk-custom/bulk-custom.controller';\r\nimport DevicesActivationsController from './activations/activations.controller';\r\nimport DevicesActivationsSingleModalController from './activations/single/templates-modal/templates.modal.controller';\r\nimport DevicesActivationsWizardController from './activations/single/single.controller';\r\nimport DevicesBaseController from './devices.base.controller';\r\nimport DevicesController from './devices.controller';\r\nimport DevicesDeactivateModalController from './view/deactivate-modal/deactivate.modal.controller';\r\nimport DevicesDeactivateModalModalController from './view/deactivate-modal/deactivate.modal.modal.controller';\r\nimport DeviceDetailController from './view/view.controller';\r\nimport DevicesListController from './list/list.controller';\r\nimport InstallationNotesModalController from './view/install-notes-modal/notes.modal.controller';\r\n/* Directive Imports */\r\nimport TelematicsSerialNumberDirective from './devices.directive';\r\n/* Service Imports */\r\nimport ActivationsService from './activations/activations.service';\r\nimport ActivationsRepo from './activations/activations.repo';\r\nimport SyncRunHoursService from './sync-runhours.service';\r\n\r\nconst devicesModule = angular\r\n .module('app.devices', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n /* Components */\r\n .component('syncRunHours', SyncRunHoursComponent)\r\n /* Config */\r\n .config(DevicesRouteConfig)\r\n /* Controllers */\r\n .controller('DeviceActivationsBulkController', DeviceActivationsBulkController)\r\n .controller('DeviceActivationsBulkCustomController', DeviceActivationsBulkCustomController)\r\n .controller('DevicesActivationsController', DevicesActivationsController)\r\n .controller('DevicesActivationsSingleModalController', DevicesActivationsSingleModalController)\r\n .controller('DevicesActivationsWizardController', DevicesActivationsWizardController)\r\n .controller('DevicesBaseController', DevicesBaseController)\r\n .controller('DevicesController', DevicesController)\r\n .controller('DevicesDeactivateModalController', DevicesDeactivateModalController)\r\n .controller('DevicesDeactivateModalModalController', DevicesDeactivateModalModalController)\r\n .controller('DevicesDetailController', DeviceDetailController)\r\n .controller('DevicesListController', DevicesListController)\r\n .controller('InstallationNotesModalController', InstallationNotesModalController)\r\n /* Directives */\r\n .directive('telematicsserialnumber', TelematicsSerialNumberDirective)\r\n /* Services */\r\n .service('activationsService', ActivationsService)\r\n .service('activationsRepo', ActivationsRepo)\r\n .service('syncRunHoursService', SyncRunHoursService);\r\n\r\nexport default devicesModule.name;\r\n","export default function DevicesActivationsController() {\r\n\r\n 'ngInject';\r\n\r\n}","export default function DevicesBaseController() {\r\n\r\n 'ngInject';\r\n\r\n}","export default function AlertsFilter($filter) {\r\n\t'ngInject';\r\n\r\n\treturn function(data, status, priority, faults, searchText) {\r\n\t\tvar temp = [];\r\n\r\n\t\tif (priority === 'any' && status === 'any' && faults === 'any') {\r\n\t\t\ttemp = data.slice();\r\n\t\t} else {\r\n\t\t\tfor (var i = 0; i < data.length; ++i) {\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('any')\r\n\t\t\t\t) {\r\n\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t}\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('any')\r\n\t\t\t\t) {\r\n\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t}\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('any')\r\n\t\t\t\t) {\r\n\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Alerts')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\t!data[i].series.tags[0].includes('dtc') &&\r\n\t\t\t\t\t\tdata[i].series.tags[0] !== 'gps'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Faults')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0].includes('dtc')) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Geozones')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0] === 'gps') {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Alerts')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\t!data[i].series.tags[0].includes('dtc') &&\r\n\t\t\t\t\t\tdata[i].series.tags[0] !== 'gps'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Faults')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0].includes('dtc')) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes('any') &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Geozones')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0] === 'gps') {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Alerts')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\t!data[i].series.tags[0].includes('dtc') &&\r\n\t\t\t\t\t\tdata[i].series.tags[0] !== 'gps'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Faults')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0].includes('dtc')) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes('any') &&\r\n\t\t\t\t\tfaults.includes('Geozones')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0] === 'gps') {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Alerts')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\t!data[i].series.tags[0].includes('dtc') &&\r\n\t\t\t\t\t\tdata[i].series.tags[0] !== 'gps'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Faults')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0].includes('dtc')) {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpriority.includes(data[i].priority) &&\r\n\t\t\t\t\tstatus.includes(data[i].status) &&\r\n\t\t\t\t\tfaults.includes('Geozones')\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (data[i].series.tags[0] === 'gps') {\r\n\t\t\t\t\t\ttemp.push(data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (searchText) {\r\n\t\t\ttemp = $filter('filter')(temp, searchText);\r\n\t\t}\r\n\r\n\t\treturn temp;\r\n\t};\r\n}\r\n","import Case from 'case';\r\n\r\nexport default function AttrsTranslateFilter(gettextCatalog, gettext) {\r\n 'ngInject';\r\n\r\n const conversionDict = {\r\n generator_model: gettext('Generator Model'),\r\n po: gettext('PO'),\r\n year: gettext('Year'),\r\n 'model year': gettext('Model Year'),\r\n vin: gettext('VIN'),\r\n make: gettext('Make'),\r\n model: gettext('Model'),\r\n 'onei3:serial': gettext('Onei3 Serial'),\r\n 'onei3:model': gettext('Onei3 Model'),\r\n };\r\n\r\n return function (input) {\r\n if (!input) return '';\r\n\r\n const conversion = conversionDict[input.toLowerCase()];\r\n if (!conversion) {\r\n return Case.title(input);\r\n }\r\n\r\n return gettextCatalog.getString(conversion);\r\n };\r\n}\r\n","export default function AttrsValueTranslateFilter(gettextCatalog, $filter) {\r\n 'ngInject';\r\n\r\n const isNumber = (n) => !isNaN(parseFloat(n)) && isFinite(n);\r\n\r\n const translateUOM = (uom, value) => {\r\n switch (uom) {\r\n case 'hour':\r\n return value !== 1 ? gettextCatalog.getString('hours') : gettextCatalog.getString('hour');\r\n case 'minute':\r\n return value !== 1\r\n ? gettextCatalog.getString('minutes')\r\n : gettextCatalog.getString('minute');\r\n case 'second':\r\n return value !== 1\r\n ? gettextCatalog.getString('seconds')\r\n : gettextCatalog.getString('second');\r\n case 'millisecond':\r\n return value !== 1\r\n ? gettextCatalog.getString('milliseconds')\r\n : gettextCatalog.getString('millisecond');\r\n default:\r\n return uom;\r\n }\r\n };\r\n\r\n const getDuration = (value, uom, includeMilliseconds) => {\r\n const { years, months, days, hours, minutes, seconds, milliseconds } = moment.duration(\r\n value,\r\n uom,\r\n )._data;\r\n let data = [];\r\n if (years) {\r\n data.push(\r\n `${years} ${\r\n years > 1 ? gettextCatalog.getString('years') : gettextCatalog.getString('year')\r\n }`,\r\n );\r\n }\r\n if (months) {\r\n data.push(\r\n `${months} ${\r\n months > 1 ? gettextCatalog.getString('months') : gettextCatalog.getString('month')\r\n }`,\r\n );\r\n }\r\n if (days) {\r\n data.push(\r\n `${days} ${days > 1 ? gettextCatalog.getString('days') : gettextCatalog.getString('day')}`,\r\n );\r\n }\r\n if (hours) {\r\n data.push(\r\n `${hours} ${\r\n hours > 1 ? gettextCatalog.getString('hours') : gettextCatalog.getString('hour')\r\n }`,\r\n );\r\n }\r\n if (minutes) {\r\n data.push(\r\n `${minutes} ${\r\n minutes > 1 ? gettextCatalog.getString('minutes') : gettextCatalog.getString('minute')\r\n }`,\r\n );\r\n }\r\n if (seconds) {\r\n data.push(\r\n `${seconds} ${\r\n seconds > 1 ? gettextCatalog.getString('seconds') : gettextCatalog.getString('second')\r\n }`,\r\n );\r\n }\r\n if (includeMilliseconds && milliseconds) {\r\n data.push(\r\n `${milliseconds} ${\r\n milliseconds > 1\r\n ? gettextCatalog.getString('milliseconds')\r\n : gettextCatalog.getString('millisecond')\r\n }`,\r\n );\r\n }\r\n return data.join(', ').replace(/,(?=[^,]*$)/, ` ${gettextCatalog.getString('and')}`) || '0';\r\n };\r\n\r\n const getDate = (value, uom) => {\r\n const date = new Date('2001-01-01T00:00:00.000Z');\r\n switch (uom) {\r\n case 'hour':\r\n date.setHours(date.getHours() + value);\r\n break;\r\n case 'minute':\r\n date.setMinutes(date.getMinutes() + value);\r\n break;\r\n case 'second':\r\n date.setSeconds(date.getSeconds() + value);\r\n break;\r\n case 'millisecond':\r\n date.setMilliseconds(date.getMilliseconds() + value);\r\n break;\r\n default:\r\n break;\r\n }\r\n return $filter('TableDateFilter')(date);\r\n };\r\n\r\n return function (value, input, hideUOM) {\r\n if (!input && !value) return '';\r\n\r\n if (!input) return value;\r\n\r\n let uom = null;\r\n let precision = isNumber(input.decimals) ? input.decimals : 2; //Default precision\r\n\r\n if (!input.attributes) {\r\n input = {\r\n attributes: input,\r\n };\r\n }\r\n\r\n // Check to see if we have an explicit UOM specified\r\n if (input.attributes.attrs) {\r\n if (\r\n input.attributes.dataId === 'batt_inst_date' ||\r\n input.attributes.dataId === 'date_ful_char'\r\n ) {\r\n value = getDate(value, input.attributes.attrs.uom);\r\n } else if (\r\n input.attributes.dataId === 'dur_last_char' ||\r\n input.attributes.dataId === 'time_sin_last_char'\r\n ) {\r\n value = getDuration(value, input.attributes.attrs.uom, false);\r\n } else if (input.attributes.attrs.uom) {\r\n uom = translateUOM(input.attributes.attrs.uom, value);\r\n }\r\n }\r\n\r\n if (input.attributes.tags) {\r\n const datapointDescriptor = input.attributes.descriptor;\r\n // Determine the value based on the presence of tags\r\n for (let i = 0; i < input.attributes.tags.length; i++) {\r\n let tag = input.attributes.tags[i];\r\n if (datapointDescriptor) {\r\n let useGenericDtc;\r\n // todo: need more investigation about this section (should be here)\r\n if (tag === 'dtc') {\r\n switch (input.attrs['type']) {\r\n case 'j1939': {\r\n const { source, type, spn, fmi } = input.attrs;\r\n const src = source ? `.source:${source}` : '';\r\n tag += `.type:${type}${src}.spn:${spn}.fmi:${fmi}`;\r\n break;\r\n }\r\n case 'fault': {\r\n tag += '.type:' + input.attrs['type'] + '.code' + input.attrs['code'];\r\n }\r\n }\r\n\r\n useGenericDtc = true;\r\n }\r\n\r\n if (\r\n datapointDescriptor &&\r\n tag === datapointDescriptor.key &&\r\n datapointDescriptor.values\r\n ) {\r\n const valueDescriptor =\r\n datapointDescriptor.values[value] || datapointDescriptor.values['default'];\r\n if (valueDescriptor) {\r\n return gettextCatalog.getString(valueDescriptor);\r\n }\r\n }\r\n\r\n if (useGenericDtc) {\r\n if ('dtc' === datapointDescriptor.key) {\r\n if (!datapointDescriptor.values[value]) {\r\n // if there's no descriptor for this value of the datapoint, output the default or raw value\r\n if (datapointDescriptor.values['default']) {\r\n return datapointDescriptor.values['default'];\r\n } else {\r\n return value;\r\n }\r\n }\r\n return datapointDescriptor.values[value];\r\n }\r\n }\r\n }\r\n if (tag === 'gps') {\r\n return value ? `${value[1]} , ${value[0]}` : gettextCatalog.getString('Not available');\r\n }\r\n }\r\n }\r\n\r\n // Round the result if its a number (precision may change dependent on tag)\r\n if (isNumber(value)) {\r\n value = Number.isInteger(Number(value)) ? value : value.toFixed(precision);\r\n }\r\n\r\n return uom && !hideUOM ? `${value} ${uom}` : value;\r\n };\r\n}\r\n","import moment from 'moment';\r\nimport jstz from 'jstz';\r\n\r\n// TableDate\r\nexport default function TableDateFilter($ngRedux, usersService) {\r\n 'ngInject';\r\n return function(input) {\r\n if (input == null) {\r\n return '';\r\n }\r\n let dateFormat = '';\r\n if ($ngRedux !== undefined) {\r\n const store = $ngRedux.getState();\r\n dateFormat = store.user.dateFormat;\r\n }\r\n let currentUser = usersService.currentUser();\r\n let timezone;\r\n if (currentUser) {\r\n let claimsData = currentUser.claims.data;\r\n timezone = claimsData.timezone;\r\n if (!timezone) {\r\n let zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n } else {\r\n let zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n let datetimeformat = `${dateFormat} h:mm:ss A`;\r\n\r\n let output = moment(input)\r\n .tz(timezone)\r\n .format(datetimeformat);\r\n return output;\r\n };\r\n}\r\n","import moment from 'moment';\r\n// Date Filter\r\nexport default function DateFilter($ngRedux, TimezoneService) {\r\n 'ngInject';\r\n //pass formatOnly as format to just format date with no conversion\r\n return function(input, formatOnly) {\r\n if (!input) return;\r\n let dateFormat = '';\r\n if ($ngRedux !== undefined) {\r\n const store = $ngRedux.getState();\r\n dateFormat = store.user.dateFormat;\r\n }\r\n\r\n if (formatOnly === 'format-only') {\r\n return moment(input).format(dateFormat);\r\n }\r\n return TimezoneService.convertToUserTimezone(input, dateFormat);\r\n };\r\n}\r\n","import {isObject} from 'lodash-es';\r\nimport moment from 'moment';\r\n\r\nexport default function FriendlyAttributesFilter(gettextCatalog, appSettings) {\r\n 'ngInject';\r\n\r\n const hasMin = val => val.hasOwnProperty('min');\r\n const hasMax = val => val.hasOwnProperty('max');\r\n const minStatment = min => `> ${min}`;\r\n const maxStatment = max => `< ${max}`;\r\n const minMaxStatment = (min, max) => `${min} - ${max}`;\r\n const getValue = val => {\r\n //handle when value is date or date time\r\n if (typeof val === 'string' && moment(val).isValid()) {\r\n const dateFormat = appSettings.GetDateFormat();\r\n const dateTimeFormat = `${dateFormat} hh:mm A`;\r\n const date = moment(val);\r\n if (val.indexOf('T') > -1 && val.endsWith('Z')) {\r\n return date.format(dateTimeFormat);\r\n }\r\n return date.format(dateFormat);\r\n }\r\n return val;\r\n };\r\n\r\n const buildRangeStatment = val => {\r\n let statment = '';\r\n if (hasMin(val) && hasMax(val)) {\r\n const min = getValue(val.min);\r\n const max = getValue(val.max);\r\n statment = minMaxStatment(min, max);\r\n } else if (hasMin(val) && !hasMax(val)) {\r\n const min = getValue(val.min);\r\n statment = minStatment(min);\r\n } else {\r\n const max = getValue(val.max);\r\n statment = maxStatment(max);\r\n }\r\n return statment;\r\n };\r\n\r\n return function(value) {\r\n if (isObject(value)) {\r\n //in case any value\r\n if (value.hasOwnProperty('any')) {\r\n return gettextCatalog.getString('any');\r\n }\r\n //in case MultipleValues\r\n if (Array.isArray(value)) {\r\n return value.map(val => (val.text ? val.text : val)).join(', ');\r\n }\r\n //in case range of values\r\n if (hasMin(value) || hasMax(value)) {\r\n return buildRangeStatment(value);\r\n }\r\n //if none of the above (string object ...)\r\n return value;\r\n } else {\r\n //none object value\r\n return value;\r\n }\r\n };\r\n}\r\n","import angular from 'angular';\r\nimport serviceModule from '../services/service.module';\r\n\r\nimport AlertsFilter from './alerts.filter';\r\nimport CapitalizeFilter from './attrs.capitalize.filter';\r\nimport AttrsTranslateFilter from './attrs.translate.filter';\r\nimport AttrsValueTranslateFilter from './attrs.translate.value.filter';\r\nimport TableDateFilter from './tableDate.filter';\r\nimport DateFilter from './date.filter';\r\nimport PropsFilter from './propsfilter.filter';\r\nimport SearchByNameFilter from './searchByName.filter';\r\nimport ReverseFilter from './reverse.filter';\r\nimport StartFromFilter from './startFrom.filter';\r\nimport CapitalizeFirstLetterFilter from './capitalizeFirstLetter.filter';\r\nimport twoDecimal from './twoDecimal.filter';\r\nimport toArray from './toArray.filter';\r\nimport FriendlyAttributesFilter from './attrs-friendly.filter';\r\nimport RemoveWhiteSpace from './removeWhiteSpace.filter';\r\n\r\nconst filterModule = angular.module('app.filters', ['gettext', serviceModule]);\r\n\r\nfilterModule\r\n .filter('alerts', AlertsFilter)\r\n .filter('capitalize', CapitalizeFilter)\r\n .filter('attrsTranslate', AttrsTranslateFilter)\r\n .filter('attrsValueTranslate', AttrsValueTranslateFilter)\r\n .filter('capitalizeFirstLetter', CapitalizeFirstLetterFilter)\r\n .filter('DateFilter', DateFilter)\r\n .filter('propsFilter', PropsFilter)\r\n .filter('reverse', ReverseFilter)\r\n .filter('searchByName', SearchByNameFilter)\r\n .filter('startFrom', StartFromFilter)\r\n .filter('TableDateFilter', TableDateFilter)\r\n .filter('twoDecimal', twoDecimal)\r\n .filter('toArray', toArray)\r\n .filter('toFriendlyAttr', FriendlyAttributesFilter)\r\n .filter('removeWhiteSpace', RemoveWhiteSpace);\r\n\r\nexport default filterModule.name;\r\n","export default function CapitalizeFilter() {\r\n\treturn function(input) {\r\n\t\tif (!input || typeof input !== 'string') {\r\n\t\t\treturn input;\r\n\t\t}\r\n\t\treturn input.substring(0, 1).toUpperCase() + input.substring(1);\r\n\t};\r\n}\r\n","// Capitalize First Letter Filter\r\nexport default function CapitalizeFirstLetterFilter(){\r\n\treturn function(input, all) {\r\n\t\treturn !!input\r\n\t\t ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase()\r\n\t\t : \"\";\r\n\t };\r\n}","// Props Filter\r\n\r\n//Default filter for products in single activation UI.\r\nexport default function PropsFilter() {\r\n return function(items, props) {\r\n let out = [];\r\n if (Array.isArray(items)) {\r\n items.forEach(function(item) {\r\n let itemMatches = false;\r\n \r\n let keys = Object.keys(props);\r\n for (let i = 0; i < keys.length; i++) {\r\n let prop = keys[i];\r\n let text = props[prop].toLowerCase();\r\n if (\r\n item[prop]\r\n .toString()\r\n .toLowerCase()\r\n .indexOf(text) !== -1\r\n ) {\r\n itemMatches = true;\r\n break;\r\n }\r\n }\r\n \r\n if (itemMatches) {\r\n out.push(item);\r\n }\r\n });\r\n } else {\r\n // Let the output be the input untouched\r\n out = items;\r\n }\r\n \r\n return out;\r\n };\r\n}","// ReverseFilter\r\nexport default function ReverseFilter() {\r\n\treturn function(items) {\r\n\t\tif (items) {\r\n\t\t return items.slice().reverse();\r\n\t\t}\r\n\t };\r\n}","// Search By Name Filter\r\n\r\nexport default function SearchByNameFilter() {\r\n\treturn function(products, query) {\r\n\t\tvar toReturn = [];\r\n \r\n\t\tfor (var i = 0; i < products.length; i++) {\r\n\t\t if (products[i].name.search(new RegExp(query, \"i\")) > -1) {\r\n\t\t\ttoReturn.push(products[i]);\r\n\t\t }\r\n\t\t}\r\n \r\n\t\treturn toReturn;\r\n\t };\r\n}","// StartFromFilter\r\nexport default function StartFromFilter() {\r\n\treturn function(input, start) {\r\n\t\tif (!input) {\r\n\t\t return null;\r\n\t\t}\r\n\t\tstart = +start; //parse to int\r\n \r\n\t\tif (!input.slice) return;\r\n \r\n\t\treturn input.slice(start);\r\n\t};\r\n}","// Two Decimals\r\n\r\nexport default function twoDecimal() {\r\n\treturn function (input) {\r\n\t\treturn input.toFixed(2);\r\n\t};\r\n}","export default function toArray() {\r\n\treturn function(obj) {\r\n\t\tif (!(obj instanceof Object)) return obj;\r\n\t\treturn _.map(obj, function(val, key) {\r\n\t\t\treturn Object.defineProperty(val, '$key', { __proto__: null, value: key });\r\n\t\t});\r\n\t};\r\n}\r\n","export default function RemoveWhiteSpace() {\r\n return function(value) {\r\n return !value ? '' : value.replace(/ /g, '');\r\n };\r\n}\r\n","import jstz from 'jstz';\r\nimport moment from 'moment';\r\n// Char Date\r\nexport function ChartDateFilter(appSettings, usersService) {\r\n 'ngInject';\r\n return function(input) {\r\n if (input === null) {\r\n return '';\r\n }\r\n let dateTimeFormat = appSettings.GetDateFormat();\r\n let currentUser = usersService.currentUser();\r\n let timezone;\r\n let zone;\r\n if (currentUser) {\r\n let claimsData = currentUser.claims.data;\r\n timezone = claimsData.timezone;\r\n if (!timezone) {\r\n zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n } else {\r\n zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n let output = moment(input)\r\n .tz(timezone)\r\n .format(dateTimeFormat);\r\n return output;\r\n };\r\n}\r\n\r\n// ChartLabel\r\nexport function ChartLabelFilter(appSettings, usersService) {\r\n 'ngInject';\r\n return function(input, interval) {\r\n if (input === null) {\r\n return '';\r\n }\r\n let dateFormat = appSettings.GetDateFormat();\r\n\r\n let currentUser = usersService.currentUser();\r\n let timezone;\r\n let zone;\r\n if (currentUser) {\r\n let claimsData = currentUser.claims.data;\r\n timezone = claimsData.timezone;\r\n if (!timezone) {\r\n zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n } else {\r\n zone = jstz.determine();\r\n timezone = zone.name();\r\n }\r\n if (interval !== '1day') {\r\n dateFormat = `${dateFormat} @ h:mm:ssA`;\r\n } else if (interval === '1hour') {\r\n dateFormat = `${dateFormat} @ hA`;\r\n }\r\n let output = moment(input)\r\n .tz(timezone)\r\n .format(dateFormat);\r\n return output;\r\n };\r\n}\r\n","// urlMarkDown\r\nexport function urlMarkDown(markdownService) {\r\n\t'ngInject';\r\n\r\n\treturn hyperlink => {\r\n\t\tconst url = markdownService.markdownToUrl(hyperlink);\r\n\t\treturn `${url.text}`;\r\n\t};\r\n}\r\n\r\n// urlTextMarkdown\r\nexport function urlTextMarkdown(markdownService) {\r\n\t'ngInject';\r\n\r\n\treturn hyperlink => {\r\n\t\tif (hyperlink) {\r\n\t\t\tconst url = markdownService.markdownToUrl(hyperlink);\r\n\t\t\treturn url.text;\r\n\t\t}\r\n\t\treturn;\r\n\t};\r\n}\r\n","import angular from 'angular';\r\n\r\nimport serviceModule from '../../services/service.module';\r\nimport apiModule from '../../api/api.module';\r\n\r\nimport { ChartDateFilter, ChartLabelFilter } from './chart.filter';\r\nimport GetIndexOfFilter from './getIndexOf.filter';\r\nimport LimitObjectFromToFilter from './limitObjectTo.filter';\r\nimport ObjectKeysLengthFilter from './objectKeysLength.filter';\r\nimport SearchFormatFilter from './attrs.searchformat.filter';\r\nimport { urlMarkDown, urlTextMarkdown } from './url.filter';\r\nimport WithOutNullFilter from './withoutNull.filter';\r\n\r\nconst equipmentFilterModule = angular.module('app.equipmentFilters', [serviceModule, apiModule]);\r\n\r\nequipmentFilterModule\r\n\t.filter('ChartDateFilter', ChartDateFilter)\r\n\t.filter('ChartLabelFilter', ChartLabelFilter)\r\n\t.filter('getIndexOf', GetIndexOfFilter)\r\n\t.filter('limitObjectFromTo', LimitObjectFromToFilter)\r\n\t.filter('objectKeysLength', ObjectKeysLengthFilter)\r\n\t.filter('searchFormat', SearchFormatFilter)\r\n\t.filter('withoutNull', WithOutNullFilter)\r\n\t.filter('urlMarkdown', urlMarkDown)\r\n\t.filter('urlTextMarkdown', urlTextMarkdown);\r\n\r\nexport default equipmentFilterModule.name;\r\n","// getIndexOf filter\r\nexport default function getIndexOfFilter() {\r\n\treturn function(\r\n\t\tpropertyName,\r\n\t\tnestedPropertyName,\r\n\t\tpropertyValue,\r\n\t\tcollection\r\n\t ) {\r\n\t\tif (!collection) return null;\r\n \r\n\t\tvar i = 0,\r\n\t\t len = collection.length;\r\n\t\tfor (; i < len; i++) {\r\n\t\t if (nestedPropertyName) {\r\n\t\t\tif (\r\n\t\t\t collection[i][propertyName][nestedPropertyName] === propertyValue\r\n\t\t\t) {\r\n\t\t\t return i;\r\n\t\t\t}\r\n\t\t } else {\r\n\t\t\tif (collection[i][propertyName] === propertyValue) {\r\n\t\t\t return i;\r\n\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\treturn null;\r\n\t };\r\n}","\r\nexport default function LimitObjectFromToFilter() {\r\n return function (obj, limitFrom, limitTo) {\r\n var newObj = {},\r\n i = 0;\r\n for (var p in obj) {\r\n if (i >= limitFrom) newObj[p] = obj[p];\r\n if (++i === limitTo) break;\r\n }\r\n return newObj;\r\n };\r\n}\r\n","\r\nexport default function ObjectKeysLengthFilter() {\r\n return function (items) {\r\n if (!items) return 0;\r\n return Object.keys(items).length;\r\n };\r\n}\r\n","\r\nexport default function SearchFormatFilter() {\r\n return function (input/*, scope*/) {\r\n input = input.replace(/[+-=&|> 1\r\n\t\t )\r\n\t\t\tfiltered.push(items[i]);\r\n\t\t}\r\n \r\n\t\treturn filtered;\r\n\t };\r\n}","export default function ErrorsRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('unauthorized', {\r\n url: '/unauthorized',\r\n template: require('./unauthorized/unauthorized.html'),\r\n data: {\r\n flex: true\r\n }\r\n })\r\n .state('error', {\r\n url: '/error',\r\n template: ''\r\n });\r\n}\r\n","import template from './error.html';\r\n\r\nclass ErrorController {\r\n constructor() {}\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: ErrorController,\r\n controllerAs: 'vm'\r\n};\r\n","import ErrorsRouteConfig from './errors.route';\r\nimport angular from 'angular';\r\n\r\nimport ErrorComponent from './general/error.component';\r\n\r\nconst ErrorsModule = angular\r\n .module('app.errors', ['ui.router', 'gettext'])\r\n .config(ErrorsRouteConfig)\r\n .component('error', ErrorComponent);\r\n\r\nexport default ErrorsModule.name;\r\n","class BrowserPolicyController {\r\n\tconstructor(browser, $window, $ngRedux, NotificationActions) {\r\n\t\t'ngInject';\r\n\r\n\t\tthis.$window = $window;\r\n\t\tthis.store = $ngRedux;\r\n\t\tthis.notificationActions = NotificationActions;\r\n\t\tthis.currentBrowser = browser;\r\n\t}\r\n\r\n\t$onInit() {\r\n\t\tconst actions = Object.assign({}, this.notificationActions);\r\n\t\tthis.unsubscribe = this.store.connect(this.mapStateToThis, actions)(this);\r\n\t}\r\n\r\n\r\n\t$onDestroy() {\r\n\t\tthis.unsubscribe();\r\n\t}\r\n\r\n\tmapStateToThis(state) {\r\n\t\tlet { visible } = state.notification;\r\n\t\treturn { visible };\r\n\t}\r\n\r\n\tdismiss() {\r\n\t\tthis.$window.history.back();\r\n\t}\r\n\r\n}\r\n\r\nexport default {\r\n\ttemplate: require('./browser-policy.template.html'),\r\n\tcontroller: BrowserPolicyController,\r\n\tbindings: {},\r\n\tcontrollerAs: 'vm'\r\n};\r\n","export default function BrowserPolicyRouteConfig($stateProvider, $urlRouterProvider, gettext) {\r\n\t'ngInject';\r\n\r\n\t$stateProvider.state('browser-policy', {\r\n\t\turl: '/browser-policy',\r\n\t\ttemplate: ''\r\n\t});\r\n}\r\n","import BrowserPolicyComponent from './browser-policy.component';\r\nimport BrowserPolicyRouteConfig from './browser-policy.route';\r\n\r\nconst browserPolicyModule = angular\r\n\t.module('app.browser-policy', ['ui.bootstrap', 'ui.router', 'gettext'])\r\n\t.component('browserPolicy', BrowserPolicyComponent)\r\n\t.config(BrowserPolicyRouteConfig);\r\n\r\nexport default browserPolicyModule.name;\r\n","const CommandComponent = {\r\n template: require('./commands.html'),\r\n restrict: 'E',\r\n bindings: {},\r\n controller: CommandController,\r\n controllerAs: 'vm'\r\n};\r\n\r\nfunction CommandController($stateParams, CommandHistoryService, CommandService, $q, $interval) {\r\n 'ngInject';\r\n\r\n var vm = this;\r\n var interval;\r\n const INTERVAL_TIME = 300000;\r\n\r\n vm.equipmentId = null;\r\n vm.updateHistory = updateHistory;\r\n vm.updatingHistory = false;\r\n vm.history = [];\r\n vm.historyStatus = {};\r\n vm.commandGroups = [];\r\n vm.commandAlertStatus = [];\r\n vm.commandList = [];\r\n vm.loading = false;\r\n\r\n vm.$onInit = init;\r\n\r\n function init() {\r\n vm.equipmentId = $stateParams.equipmentId;\r\n getEquipmentCommands(vm.equipmentId).then(function() {\r\n getHistory(vm.equipmentId, vm.commandList);\r\n });\r\n }\r\n\r\n vm.$onDestroy = function() {\r\n $interval.cancel(interval);\r\n };\r\n\r\n function updateHistory() {\r\n return getHistory(vm.equipmentId, vm.commandList);\r\n }\r\n\r\n function getHistory(equipmentId, commands) {\r\n vm.updatingHistory = true;\r\n return CommandHistoryService.getHistory(vm.equipmentId, commands).then(function(history) {\r\n vm.history = history;\r\n vm.updatingHistory = false;\r\n });\r\n }\r\n\r\n function getEquipmentCommands(equipmentId) {\r\n vm.loading = true;\r\n let promises = [CommandService.packageCommandsConfig(equipmentId), CommandService.getEquipmentSeries(equipmentId)];\r\n\r\n return $q\r\n .all(promises)\r\n .then(function([commandConfig, equipmentSeries]) {\r\n vm.commandGroups = commandConfig.commandGroups;\r\n vm.commandAlertStatus = CommandService.getHealthStatus(equipmentSeries, commandConfig.controlsStatus);\r\n vm.commandList = commandConfig.commands;\r\n setStatusUpdateInterval();\r\n })\r\n .finally(function() {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function updateEquipmentCommandAlertStatus(equipmentId) {\r\n CommandService.getEquipmentSeries(equipmentId).then(function(series) {\r\n vm.commandAlertStatus = CommandService.getHealthStatus(series);\r\n });\r\n }\r\n\r\n function setStatusUpdateInterval() {\r\n interval = $interval(function() {\r\n updateEquipmentCommandAlertStatus(vm.equipmentId);\r\n }, INTERVAL_TIME);\r\n }\r\n}\r\n\r\nexport default CommandComponent;\r\n","import { AlertOption, alertStatus } from './command.models';\r\nimport _ from 'lodash';\r\nimport moment from 'moment';\r\n\r\nexport default function CommandService(\r\n CommandsRepo,\r\n equipmentDetailsService,\r\n $filter,\r\n gettext,\r\n gettextCatalog,\r\n) {\r\n 'ngInject';\r\n\r\n const service = {\r\n packageCommandsConfig: packageCommandsConfig,\r\n getHealthStatus: getHealthStatus,\r\n healthStatusTypes: alertStatus,\r\n getEquipmentSeries: getEquipmentSeries,\r\n };\r\n\r\n function packageCommandsConfig(equipmentId) {\r\n return CommandsRepo.getCommandsForEquipment(equipmentId).then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n\r\n const translateText = (text, params = {}) => gettextCatalog.getString(text, params);\r\n\r\n const alertDefaultOptions = [\r\n {\r\n name: gettext('Communication'),\r\n class: 'fa-exchange',\r\n calcStatus: function (equipment) {\r\n const result = {};\r\n\r\n if (equipment.communicatedAt) {\r\n const range = moment.range(equipment.communicatedAt, moment().toDate());\r\n if (range.diff('hours', false) > 2) {\r\n result.status = alertStatus.error;\r\n result.text = gettext(\r\n 'No communication has been made with the equipment in the last 2 hours. The device last communicated on {{c_date}}.',\r\n );\r\n result.textParams = {\r\n c_date: $filter('TableDateFilter')(moment(equipment.communicatedAt)),\r\n };\r\n } else {\r\n result.status = alertStatus.good;\r\n result.text = gettext('The equipment last communicated {{minutes}} minutes ago.');\r\n result.textParams = { minutes: range.diff('minutes') };\r\n }\r\n } else {\r\n result.status = alertStatus.error;\r\n result.text = gettext(\r\n 'No communication has ever been made with the equipment {{text}}. Please ensure the installation process completed successfully.',\r\n );\r\n }\r\n\r\n return result;\r\n },\r\n },\r\n ];\r\n\r\n let statusAlertOptions = alertDefaultOptions;\r\n\r\n function getHealthStatus(equipmentSeries, apicontrolsStatus = null) {\r\n statusAlertOptions =\r\n apicontrolsStatus == null\r\n ? statusAlertOptions\r\n : alertDefaultOptions.concat(\r\n (apicontrolsStatus || []).map((controlstatus) => new AlertOption(controlstatus)),\r\n );\r\n\r\n let alerts = [];\r\n _.forEach(statusAlertOptions, function (alertOption) {\r\n const alert = {};\r\n const status = alertOption.calcStatus(equipmentSeries);\r\n\r\n alert.name = translateText(alertOption.name);\r\n alert.class = alertOption.class;\r\n alert.status = status.status;\r\n alert.text = translateText(status.text, status.textParams);\r\n alerts.push(alert);\r\n });\r\n return alerts;\r\n }\r\n\r\n function getEquipmentSeries(equipmentId) {\r\n return equipmentDetailsService.get(equipmentId, ['series']);\r\n }\r\n\r\n return service;\r\n}\r\n","import _ from 'lodash';\r\n\r\nconst ControlsComponent = {\r\n template: require('./controls.html'),\r\n restrict: 'E',\r\n bindings: {\r\n updateHistory: '&',\r\n commandGroups: '<',\r\n },\r\n controller: CommandControlsController,\r\n controllerAs: 'vm',\r\n};\r\n\r\nfunction CommandControlsController($stateParams, CommandsRepo) {\r\n 'ngInject';\r\n let equipmentId = null;\r\n const vm = this;\r\n\r\n vm.selectedCommandGroup = null;\r\n vm.popup = false;\r\n vm.confirmation = {};\r\n\r\n this.$onInit = () => {\r\n equipmentId = $stateParams.equipmentId;\r\n };\r\n\r\n this.$onChanges = () => {\r\n if (this.commandGroups && this.commandGroups.length) {\r\n this.selectCommandsGroup(\r\n [...this.commandGroups].sort((a, b) => a.ordinal - b.ordinal).find((comand) => true),\r\n );\r\n }\r\n };\r\n\r\n this.submitForm = (command, parameter) => {\r\n this.submitted = true;\r\n\r\n this.confirm(command, parameter.attrs.placeholder, parameter.value);\r\n };\r\n\r\n //public\r\n this.selectCommandsGroup = (group) => {\r\n this.selectedCommandGroup = group;\r\n this.popup = false;\r\n };\r\n\r\n const sendCommand = (command) => {\r\n let bodyParams = {};\r\n [...command.parameters].forEach((parameter) => {\r\n bodyParams[parameter.key] = `${parameter.value}`;\r\n });\r\n\r\n return executeCommand(command.name, bodyParams);\r\n };\r\n\r\n const executeCommand = (commandName, bodyParams) =>\r\n CommandsRepo.executeCommand(equipmentId, commandName, bodyParams).then(() => {\r\n vm.updateHistory();\r\n });\r\n\r\n this.confirm = (command, commandName, value = null) => {\r\n vm.confirmation = command\r\n ? {\r\n command: command,\r\n value: value,\r\n commandName: commandName || command.label,\r\n show: true,\r\n }\r\n : {};\r\n };\r\n\r\n this.ok = () => {\r\n this.confirmation = {\r\n ...this.confirmation,\r\n sending: true,\r\n };\r\n\r\n return sendCommand(vm.confirmation.command).then(this.cancel, () => {\r\n this.confirmation = {\r\n ...this.confirmation,\r\n sending: false,\r\n failed: true,\r\n };\r\n });\r\n };\r\n\r\n this.cancel = () => {\r\n this.submitted = false;\r\n this.confirmation = {};\r\n };\r\n}\r\n\r\nexport default ControlsComponent;\r\n","import moment from 'moment';\r\n\r\nconst CommandHistoryComponent = {\r\n template: require('./history.html'),\r\n restrict: 'E',\r\n bindings: {\r\n history: '<',\r\n updating: '<',\r\n loading: '<'\r\n },\r\n controller: CommandHistoryController,\r\n controllerAs: 'vm'\r\n};\r\n\r\nfunction CommandHistoryController ($interval, CommandHistoryService) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n let interval;\r\n\r\n vm.history = [];\r\n vm.progressPercent = '0%';\r\n vm.progressMessage = '';\r\n vm.messageFlage = false;\r\n vm.start = vm.end = moment().toDate();\r\n vm.classes = {\r\n pending: 'fa fa-spinner fa-pulse fa-md pending',\r\n completed: 'fa fa-check succeeded-icon fa-md success',\r\n aborted: 'fa fa-times failed-icon fa-md error',\r\n rejected: 'fa fa-times failed-icon fa-md error'\r\n };\r\n\r\n const updatePending = () => {\r\n if (!vm.updating && vm.history) {\r\n CommandHistoryService.updatePending(vm.history);\r\n }\r\n };\r\n \r\n vm.$onInit = () => {\r\n vm.status = CommandHistoryService.commandHistoryStatus;\r\n\r\n interval = $interval(() => {\r\n updatePending();\r\n }, 15000);\r\n };\r\n\r\n vm.$onDestroy = () => {\r\n $interval.cancel(interval);\r\n };\r\n}\r\n\r\nexport default CommandHistoryComponent;\r\n","import moment from 'moment';\r\nimport { gettext } from '../../../../../state/gettext-extract-util';\r\nconst historyStatus = {\r\n pending: 'pending', // initiated\r\n aborted: 'aborted', // not acknowledged\r\n completed: 'completed', // completed\r\n rejected: 'rejected', // not acknowledged\r\n acknowledged: 'acknowledged', // processing\r\n pendingAbort: 'pending abort', // not acknowledged\r\n};\r\n\r\nconst mapStatus = (status) => {\r\n switch (status) {\r\n case historyStatus.pending:\r\n return gettext('Initiated');\r\n case historyStatus.acknowledged:\r\n return gettext('Processing');\r\n case historyStatus.completed:\r\n return gettext('Completed');\r\n case historyStatus.pendingAbort:\r\n return gettext('Not Acknowledged');\r\n case historyStatus.aborted:\r\n return gettext('Not Acknowledged');\r\n case historyStatus.rejected:\r\n return gettext('Failed');\r\n default:\r\n return status;\r\n }\r\n};\r\n\r\nconst incompleteStatus = [\r\n historyStatus.pending,\r\n historyStatus.acknowledged,\r\n historyStatus.pendingAbort,\r\n];\r\n\r\nconst updateItem = (updatedItem, list) => {\r\n const toUpdateIndex = list.findIndex((listItem) => listItem.id === updatedItem.id);\r\n\r\n if (!isNaN(toUpdateIndex) && toUpdateIndex !== -1) {\r\n list[toUpdateIndex] = {\r\n ...list[toUpdateIndex],\r\n status: updatedItem.status,\r\n statusAt: updatedItem.statusAt,\r\n uiStatus: mapStatus(updatedItem.status),\r\n };\r\n }\r\n};\r\n\r\nconst setPendingEndTime = (history) => {\r\n if (incompleteStatus.includes(history.status)) {\r\n history.expectedEnd = moment(history.createdAt).add(3, 'm').toDate();\r\n }\r\n};\r\n\r\nconst setLabel = (history, commands = []) => {\r\n const command = commands.find((comm) => comm.name === history.name);\r\n\r\n if (command) {\r\n history.label = command.label;\r\n const translation = command.parameters.find((param) => param.key === 'translation');\r\n (command.parameters || [])\r\n .filter((param) => !param.readOnly)\r\n .map((p) => {\r\n history.label =\r\n history.parameters && history.parameters[p.key]\r\n ? `${history.label} : ${getvalueLabel(\r\n history.parameters[p.key],\r\n translation?.value,\r\n p.validValues,\r\n )}`\r\n : history.label;\r\n });\r\n } else {\r\n history.label = history.name;\r\n }\r\n};\r\n\r\nconst getvalueLabel = (value, translationValue, validValue = []) =>\r\n validValue.find((obj) => obj.value === value)?.label ||\r\n (translationValue\r\n ? parseFloat(value) / (parseInt(translationValue) === 0 ? 1 : parseInt(translationValue))\r\n : value);\r\n\r\nconst CommandHistoryService = (CommandsRepo, $q) => {\r\n 'ngInject';\r\n\r\n const getHistory = (equipmentId, commands) =>\r\n CommandsRepo.getEquipmentCommandHistory(equipmentId).then((response = {}) =>\r\n (response.data || []).map((history) => {\r\n setPendingEndTime(history);\r\n setLabel(history, commands);\r\n\r\n return {\r\n ...history,\r\n uiStatus: mapStatus(history.status),\r\n };\r\n }),\r\n );\r\n\r\n const updatePending = (historyList) => {\r\n const promiseList =\r\n historyList && historyList.length > 0\r\n ? historyList\r\n .filter((historyItem) => incompleteStatus.includes(historyItem.status))\r\n .map((pendingItem) => updatePendingItem(pendingItem, historyList))\r\n : [];\r\n\r\n return $q.all(promiseList).then(() => historyList);\r\n };\r\n\r\n const updatePendingItem = (item, historyList) =>\r\n CommandsRepo.getCommandHistoryItem(item.id).then((result) =>\r\n updateItem(result.data, historyList),\r\n );\r\n\r\n return {\r\n commandHistoryStatus: historyStatus,\r\n getHistory: getHistory,\r\n updatePending: updatePending,\r\n };\r\n};\r\n\r\nexport default CommandHistoryService;\r\n","const CommandStatusComponent = {\r\n\ttemplate: require('./status.html'),\r\n\trestrict: 'E',\r\n\tbindings: {\r\n\t\thealthStatus: '<'\r\n\t},\r\n\tcontroller: ['CommandService', CommandStatusController],\r\n\tcontrollerAs: 'vm'\r\n};\r\n\r\nfunction CommandStatusController(CommandService) {\r\n\tvar vm = this;\r\n\r\n\tvm.healthStatusTypes = {};\r\n\tvm.selectedState = null;\r\n\r\n\tvm.showState = showState;\r\n\r\n\tvm.$onInit = function() {\r\n\t\tvm.healthStatusTypes = CommandService.healthStatusTypes;\r\n\t\tshowFirstError(vm.healthStatus);\r\n\t};\r\n\r\n\tvm.$onChanges = function() {\r\n\t\tif (vm.healthStatus) {\r\n\t\t\tshowFirstError(vm.healthStatus);\r\n\t\t}\r\n\t};\r\n\r\n\tfunction showFirstError(alertStatuses) {\r\n\t\tvar firstError = _.chain(alertStatuses)\r\n\t\t\t.filter(function(health) {\r\n\t\t\t\treturn health.status === vm.healthStatusTypes.error;\r\n\t\t\t})\r\n\t\t\t.first()\r\n\t\t\t.value();\r\n\t\tif (firstError) {\r\n\t\t\tshowState(firstError.name);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction showState(selected) {\r\n\t\tvm.selectedState = vm.selectedState === selected ? null : selected;\r\n\t}\r\n}\r\n\r\nexport default CommandStatusComponent;\r\n","export default function CommandTextService(gettext) {\r\n 'ngInject';\r\n\r\n //for the purpose of extracting texts for translation\r\n //from template .json files in tugboat API c#\r\n this.statusText = {\r\n 'Battery Status': gettext('Battery Status'),\r\n 'Unable to retrieve battery level.': gettext('Unable to retrieve battery level.'),\r\n 'Battery level is good.': gettext('Battery level is good.'),\r\n 'Battery level is low.': gettext('Battery level is low.'),\r\n 'Auto Mode': gettext('Auto Mode'),\r\n 'Unable to retrieve Key Position. The equipment may not be turned on.': gettext(\r\n 'Unable to retrieve Key Position. The equipment may not be turned on.',\r\n ),\r\n 'The key is in auto start position.': gettext('The key is in auto start position.'),\r\n 'The key is not in auto start position. No commands can be sent to the device until it is in Auto Start mode.': gettext(\r\n 'The key is not in auto start position. No commands can be sent to the device until it is in Auto Start mode.',\r\n ),\r\n 'Modbus Status': gettext('Modbus Status'),\r\n 'Unable to retrieve Modbus status': gettext('Unable to retrieve Modbus status'),\r\n 'Modbus has been detected.': gettext('Modbus has been detected.'),\r\n 'Unable to detect Modbus. The equipment may needs to be turned on': gettext(\r\n 'Unable to detect Modbus. The equipment may needs to be turned on',\r\n ),\r\n };\r\n\r\n //commands text from template .json files in tugboat API c#\r\n // commandName : UIText\r\n this.commandControlsTemplateText = {\r\n 'Engine Start/Stop': gettext('Engine Start/Stop'),\r\n Start: gettext('Start'),\r\n Stop: gettext('Stop'),\r\n 'Start/Stop': gettext('Start/Stop'),\r\n 'AutoStart Enable': gettext('Autostart Enable'),\r\n 'Autostart Enable': gettext('Autostart Enable'),\r\n 'Throttle Control': gettext('Throttle Control'),\r\n 'Desired RPM': gettext('Desired RPM'),\r\n 'Target RPM': gettext('Target RPM'),\r\n };\r\n\r\n //command names map\r\n //from commands DB in iceberg\r\n this.commandNamesMap = {\r\n '14_pin_connector': gettext('14 Pin Connector'),\r\n '270_deg_camera': gettext('270 Deg Camera'),\r\n '2_piece_boom': gettext('2 Piece Boom'),\r\n 'Position 1': gettext('Position 1'),\r\n 'Position 2': gettext('Position 2'),\r\n 'Position 3': gettext('Position 3'),\r\n 'Position 4': gettext('Position 4'),\r\n 'Trime Engine Start': gettext('Trime Engine Start'),\r\n 'Trime Engine Stop': gettext('Trime Engine Stop'),\r\n 'Trime Fault Reset': gettext('Trime Fault Reset'),\r\n 'Trime GCB Off': gettext('Trime GCB Off'),\r\n 'Trime GCB On': gettext('Trime GCB On'),\r\n 'Trime GCB Toggle': gettext('Trime GCB Toggle'),\r\n 'Trime Horn Reset': gettext('Trime Horn Reset'),\r\n 'Trime MCB Off': gettext('Trime MCB Off'),\r\n 'Trime MCB On': gettext('Trime MCB On'),\r\n 'Trime MCB Toggle': gettext('Trime MCB Toggle'),\r\n active_power_control: gettext('Active Power Control'),\r\n alarms_drive: gettext('Alarms Drive'),\r\n alarms_lift: gettext('Alarms Lift'),\r\n auto_grease: gettext('Auto Grease'),\r\n auto_tank: gettext('Auto Tank'),\r\n aux2_aux4_independent: gettext('Aux2 Aux4 Independent'),\r\n aux_1: gettext('Aux 1'),\r\n aux_1_pressure_adjustment: gettext('Aux 1 Pressure Adjustment'),\r\n aux_2: gettext('Aux 2'),\r\n aux_2_pressure_adjustment: gettext('Aux 2 Pressure Adjustment'),\r\n aux_4: gettext('Aux 4'),\r\n back_alarm: gettext('Back Alarm'),\r\n communication_mode: gettext('Communication Mode'),\r\n cummins_3_3_engine_start: gettext('Engine Start'),\r\n cummins_3_3_engine_stop: gettext('Engine Stop'),\r\n drive_elev_fwd_max: gettext('Drive Elev Fwd Max'),\r\n drive_elev_rev_max: gettext('Drive Elev Rev Max'),\r\n drive_fwd_max: gettext('Drive Fwd Max'),\r\n drive_rev_max: gettext('Drive Rev Max'),\r\n enable_disable_engine: gettext('Enable Disable Engine'),\r\n end_periodic_write: gettext('End Periodic Write'),\r\n engine_auto_stop: gettext('Engine Auto Stop'),\r\n engine_control: gettext('Engine Control'),\r\n engine_control_c1: gettext('Engine Control C1'),\r\n engine_speed_limit: gettext('Engine Speed Limit'),\r\n foot_accelerator_pedal: gettext('Foot Accelerator Pedal'),\r\n high_flow: gettext('High Flow'),\r\n j1939_read: gettext('J1939 Read'),\r\n lift_height_max: gettext('Lift Height Max'),\r\n lift_up_max: gettext('Lift Up Max'),\r\n lockout: gettext('Lockout'),\r\n locnacelle_engine_start: gettext('Engine Start'),\r\n locnacelle_engine_stop: gettext('Engine Stop'),\r\n lofa_autostart_enable: gettext('Autostart Enable'),\r\n lofa_engine_start: gettext('Engine Start'),\r\n lofa_engine_stop: gettext('Engine Stop'),\r\n lofa_throttle_control: gettext('Throttle Control'),\r\n multifunction_grip: gettext('Multifunction Grip'),\r\n optional_function_1: gettext('Optional Function 1'),\r\n optional_function_2: gettext('Optional Function 2'),\r\n output_control: gettext('Output Control'),\r\n outrigger: gettext('Outrigger'),\r\n parking_brake: gettext('Parking Brake'),\r\n poll: gettext('Poll'),\r\n radio: gettext('Radio'),\r\n read_fuel_level: gettext('Read Fuel Level'),\r\n read_oil_pressure: gettext('Read Oil Pressure'),\r\n ride_control: gettext('Ride Control'),\r\n set_accumulator: gettext('Set Accumulator'),\r\n side_camera: gettext('Side Camera'),\r\n start_periodic_write: gettext('Start Periodic Write'),\r\n telemetry_control: gettext('Telemetry Control'),\r\n travel_alarm: gettext('Travel Alarm'),\r\n travel_speed_control: gettext('Travel Speed Control'),\r\n ultrasonic_sensors: gettext('Ultrasonic Sensors'),\r\n work_time: gettext('Work Time'),\r\n };\r\n\r\n //user input prompts\r\n //from commands DB in iceberg\r\n this.commandPrompts = {\r\n '14 Pin Connector': gettext('14 Pin Connector'),\r\n '2 Piece Boom': gettext('2 Piece Boom'),\r\n '270 Deg Camera': gettext('270 Deg Camera'),\r\n 'AUX 1': gettext('AUX 1'),\r\n 'AUX 2': gettext('AUX 2'),\r\n 'AUX 4': gettext('AUX 4'),\r\n 'Active Power Control': gettext('Active Power Control'),\r\n 'Auto Grease': gettext('Auto Grease'),\r\n 'Auto Tank': gettext('Auto Tank'),\r\n 'Aux 1 Pressure Adjustment': gettext('Aux 1 Pressure Adjustment'),\r\n 'Aux 2 Pressure Adjustment': gettext('Aux 2 Pressure Adjustment'),\r\n 'Aux2 Aux4 Independent': gettext('Aux2 Aux4 Independent'),\r\n 'Back Alarm': gettext('Back Alarm'),\r\n 'Change to': gettext('Change to'),\r\n 'Communication Mode': gettext('Communication Mode'),\r\n 'Desired override duration (seconds)': gettext('Desired override duration (seconds)'),\r\n 'Desired run speed (rpm)': gettext('Desired run speed (rpm)'),\r\n 'Drive speed adjustment in the elevated position (%)': gettext(\r\n 'Drive speed adjustment in the elevated position (%)',\r\n ),\r\n 'Engine Auto Stop': gettext('Engine Auto Stop'),\r\n 'Engine Speed Limit': gettext('Engine Speed Limit'),\r\n 'Foot Accelerator Pedal': gettext('Foot Accelerator Pedal'),\r\n 'Height adjustment (%)': gettext('Height adjustment (%)'),\r\n 'High Flow': gettext('High Flow'),\r\n 'Maximum speed of lift (%)': gettext('Maximum speed of lift (%)'),\r\n 'Multifunction Grip': gettext('Multifunction Grip'),\r\n 'Optional Function 1': gettext('Optional Function 1'),\r\n 'Optional Function 2': gettext('Optional Function 2'),\r\n 'Output Control': gettext('Output Control'),\r\n Outrigger: gettext('Outrigger'),\r\n 'Parking Brake': gettext('Parking Brake'),\r\n 'Position 1 Count': gettext('Position 1 Count'),\r\n 'Position 2 Count': gettext('Position 2 Count'),\r\n 'Position 3 Count': gettext('Position 3 Count'),\r\n 'Position 4 Count': gettext('Position 4 Count'),\r\n Radio: gettext('Radio'),\r\n 'Ride Control': gettext('Ride Control'),\r\n 'Side Camera': gettext('Side Camera'),\r\n 'Speed adjustment (%)': gettext('Speed adjustment (%)'),\r\n 'Telemetry Control': gettext('Telemetry Control'),\r\n 'Travel Alarm': gettext('Travel Alarm'),\r\n 'Travel Speed Control': gettext('Travel Speed Control'),\r\n };\r\n\r\n //commands parameters valid values\r\n //from the iceberg DB\r\n this.commandValidValues = {\r\n 'ALL ON': gettext('ALL ON'),\r\n 'Cancel Telemetry': gettext('Cancel Telemetry'),\r\n Disable: gettext('Disable'),\r\n 'Disable Lockout': gettext('Disable Lockout'),\r\n Enable: gettext('Enable'),\r\n 'Enable Lockout': gettext('Enable Lockout'),\r\n 'Engine Speed Low': gettext('Engine Speed Low'),\r\n 'Engine Speed Mid': gettext('Engine Speed Mid'),\r\n 'Engine Start Disable': gettext('Engine Start Disable'),\r\n Full: gettext('Full'),\r\n 'Limit Unlock': gettext('Limit Unlock'),\r\n 'Momentary On 10 seconds': gettext('Momentary On 10 seconds'),\r\n 'Momentary On 20 seconds': gettext('Momentary On 20 seconds'),\r\n 'Momentary On 30 seconds': gettext('Momentary On 30 seconds'),\r\n OFF: gettext('OFF'),\r\n ON: gettext('ON'),\r\n 'ON - Down Only': gettext('ON - Down Only'),\r\n 'ON - Forward Only': gettext('ON - Forward Only'),\r\n 'ON - Reverse Only': gettext('ON - Reverse Only'),\r\n 'ON - Up Only': gettext('ON - Up Only'),\r\n Off: gettext('Off'),\r\n On: gettext('On'),\r\n 'Output OFF': gettext('Output OFF'),\r\n 'Output ON': gettext('Output ON'),\r\n Restricted: gettext('Restricted'),\r\n 'Start Engine': gettext('Start Engine'),\r\n 'Stop Engine': gettext('Stop Engine'),\r\n 'Telemetry Start': gettext('Telemetry Start'),\r\n };\r\n\r\n //will contain any text that may need to be overridden in the UI\r\n this.commandsTextMap = {\r\n ...this.commandNamesMap,\r\n };\r\n}\r\n","export default function CommandTranslateFilter(gettextCatalog, CommandsTextService) {\r\n 'ngInject';\r\n\r\n const toFriendlyText = (text) =>\r\n (text || '')\r\n .split('_')\r\n .map(([first = '', ...rest] = '') => `${first.toUpperCase()}${(rest || []).join('')}`)\r\n .join(' ');\r\n\r\n return function (text) {\r\n if (!text) return '';\r\n\r\n //use command text map to override if exist or just try to make it readable\r\n text = CommandsTextService.commandsTextMap[text] || toFriendlyText(text);\r\n\r\n return gettextCatalog.getString(text);\r\n };\r\n}\r\n","import angular from 'angular';\r\n\r\nimport CommandComponent from './commands.component';\r\nimport CommandService from './commands.service';\r\nimport ControlsComponent from './controls/controls.component';\r\nimport CommandControlService from './controls/controls.service';\r\nimport CommandHistoryComponent from './history/history.component';\r\nimport CommandHistoryService from './history/history.service';\r\nimport CommandStatusComponent from './status/status.component';\r\nimport CommandStatusService from './status/status.service';\r\nimport CommandsTextService from './commands-text.service';\r\nimport CommandTranslateFilter from './command-translate.filter';\r\n\r\nconst assetDetailsDashboardModule = angular.module('asset-commands', []);\r\n\r\nassetDetailsDashboardModule\r\n .service('CommandStatusService', CommandStatusService)\r\n .service('CommandService', CommandService)\r\n .service('CommandHistoryService', CommandHistoryService)\r\n .service('CommandControlsService', CommandControlService)\r\n .service('CommandsTextService', CommandsTextService)\r\n .filter('commandTranslateFilter', CommandTranslateFilter)\r\n .component('commandComponent', CommandComponent)\r\n .component('commandControls', ControlsComponent)\r\n .component('commandHistory', CommandHistoryComponent)\r\n .component('commandStatus', CommandStatusComponent);\r\n\r\nexport default assetDetailsDashboardModule.name;\r\n","export default function StatusService() {\r\n 'ngInject';\r\n\r\n var service = {};\r\n\r\n\r\n return service;\r\n}","\r\nexport default function ControlService() {\r\n\r\n var service = {\r\n };\r\n\r\n\r\n return service;\r\n}\r\n","import Action from '../action';\r\n\r\nexport const REFRESH_ASSET_DASH_BOARD_DATA = '@asset-details/GET_ASSET_DASH_BOARD_DATA';\r\n\r\nexport const GET_ASSET_DATA = '@asset-details/GET_ASSET_DATA';\r\nexport const GET_ASSET_DATA_FAILED = '@asset-details/GET_ASSET_DATA_FAILED';\r\nexport const GET_ASSET_DATA_SUCCESS = '@asset-details/GET_ASSET_DATA_SUCCESS';\r\n\r\nexport const GET_SERIES_DATA = '@asset-details/GET_SERIES_DATA';\r\nexport const GET_SERIES_DATA_FAILED = '@asset-details/GET_SERIES_DATA_FAILED';\r\nexport const GET_SERIES_DATA_SUCCESS = '@asset-details/GET_SERIES_DATA_SUCCESS';\r\n\r\nexport const SELECT_SERIES = '@asset-details/SELECT_SERIES';\r\nexport const DESELECT_SERIES = '@asset-details/DESELECT_SERIES';\r\n\r\nexport const SET_DATE_RANGE = '@asset-details/SET_DATE_RANGE';\r\nexport const SET_DATE_RANGE_BY_OPTION = '@asset-details/SET_DATE_RANGE_BY_OPTION';\r\n\r\nexport const SET_ACTIVE_DATA_TAB = '@asset-details/SET_ACTIVE_DATA_TAB';\r\nexport const UPDATE_ASSET_LOCATION = '@asset-details/UPDATE_ASSET_LOCATION';\r\n\r\nexport const getAssetData = assetId => Action(GET_ASSET_DATA, assetId);\r\nexport const refreshAssetdashBoardData = assetId => Action(REFRESH_ASSET_DASH_BOARD_DATA, assetId);\r\nexport const getAssetDataSuccess = (data, user, included, moreData) =>\r\n Action(GET_ASSET_DATA_SUCCESS, {data, user, included, moreData});\r\nexport const getAssetDataFailed = error => Action(GET_ASSET_DATA_FAILED, error);\r\nexport const selectSeries = seriesId => Action(SELECT_SERIES, seriesId);\r\nexport const deselectSeries = seriesId => Action(DESELECT_SERIES, seriesId);\r\n\r\nexport const setDateRange = (start, end) => Action(SET_DATE_RANGE, [start, end]);\r\nexport const setDateRangeByOption = optionValue => Action(SET_DATE_RANGE_BY_OPTION, optionValue);\r\n\r\nexport const getSeriesData = updateDateRange => Action(GET_SERIES_DATA, {updateDateRange});\r\nexport const getSeriesDataSuccess = (seriesList, dataFor) => Action(GET_SERIES_DATA_SUCCESS, {seriesList, dataFor});\r\nexport const getSeriesDataFailed = error => Action(GET_SERIES_DATA_FAILED, error);\r\nexport const setActiveDataTab = (tabKey = 'chart') => Action(SET_ACTIVE_DATA_TAB, tabKey);\r\n\r\nexport const updateAssetLocation = lastgpsVal => Action(UPDATE_ASSET_LOCATION, lastgpsVal);\r\n","import * as AssetDetailsActions from '../../state/asset-details/asset-details.actions';\r\nimport template from './asset-details-dashboard.component.html';\r\n\r\n// Constants\r\nconst EVENT_TRACKING_NAME = 'assetDetailsDashboard';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n showDateClicked: 'showDateClicked',\r\n pollCommandClicked: 'pollCommandClicked',\r\n editClicked: 'editClicked',\r\n refreshClicked: 'refreshClicked',\r\n};\r\n\r\nexport class AssetDetailsDashboardController {\r\n constructor($scope, $stateParams, usersService, CommandsRepo, $ngRedux, $timeout) {\r\n 'ngInject';\r\n this.store = $ngRedux;\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.$stateParams = $stateParams;\r\n this.usersService = usersService;\r\n this.CommandsRepo = CommandsRepo;\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n\r\n this.showDate = false;\r\n this.timer = null;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, { ...AssetDetailsActions })(this);\r\n //fire the action to get data\r\n this.getAssetData(this.$stateParams.equipmentId);\r\n this.updateBreadcrumbBar(this.$stateParams.title);\r\n this.hasImageFeature = this.usersService.hasRequiredFeatures(['images']);\r\n this.hasConfigCommandFeature = this.usersService.hasRequiredFeatures(['commands.configure']);\r\n this.hasDevices = this.usersService.hasRequiredFeatures(['devices']);\r\n }\r\n\r\n mapStateToThis(state) {\r\n const {\r\n refreshing,\r\n loading,\r\n asset,\r\n dataDateRange,\r\n seriesDataStatus,\r\n selectedSeriesIds,\r\n activeDataTap,\r\n error,\r\n } = state.asset_details;\r\n const { series = [], name, seriesData = {} } = asset || {};\r\n if (name) {\r\n this.updateBreadcrumbBar(name);\r\n }\r\n const chosenRunHours = series.find((ser) => ser.chosenRunHours);\r\n const setRunhoursAvailable =\r\n chosenRunHours &&\r\n chosenRunHours.dataId === asset.syncRunHours &&\r\n asset.hasSetAccumulatorCommand &&\r\n this.hasConfigCommandFeature;\r\n return {\r\n assetState: state.asset_details,\r\n refreshing,\r\n loading,\r\n asset: { ...asset },\r\n runHours: chosenRunHours,\r\n dataDateRange,\r\n detailsLoading: loading || refreshing,\r\n seriesDataStatus,\r\n selectedSeriesIds,\r\n activeDataTap,\r\n seriesData,\r\n error,\r\n setRunhoursAvailable: setRunhoursAvailable,\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n }\r\n updateBreadcrumbBar(newName) {\r\n if (this.$scope.assetName !== newName) {\r\n this.$scope.assetName = newName;\r\n this.$scope.$emit('$viewContentLoaded'); //breadcrumb fix;\r\n }\r\n }\r\n toggleShowDate() {\r\n this.showDate = !this.showDate;\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.showDateClicked,\r\n });\r\n }\r\n\r\n sendPollCommand() {\r\n this.CommandsRepo.executeCommand(this.asset.id, 'poll');\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.pollCommandClicked,\r\n });\r\n }\r\n refreshData() {\r\n if (!this.refreshing) {\r\n this.refreshAssetdashBoardData(this.asset.id);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.refreshClicked,\r\n });\r\n }\r\n }\r\n\r\n editButtonClicked() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.editClicked,\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetDetailsDashboardController,\r\n controllerAs: 'vm',\r\n bindings: {},\r\n};\r\n","import moment from 'moment';\r\nimport { sortBy } from 'lodash-es';\r\nimport * as AssetDetailsActions from '../../../../state/asset-details/asset-details.actions';\r\n\r\nimport template from './asset-data.component.html';\r\nimport { isAccessDataPoint } from '../../../../functions/asset.functions';\r\n\r\nconst EVENT_TRACKING_NAME = 'AssetDetailData';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n exportCSVClicked: 'exportCSVClicked',\r\n toggleSerie: 'toggleSerie',\r\n updateRange: 'updateRange',\r\n selectedRangeOption: 'selectedRangeOption',\r\n};\r\n\r\nclass AssetDataController {\r\n constructor($stateParams, $filter, gettextCatalog, $ngRedux) {\r\n 'ngInject';\r\n\r\n this.$stateParams = $stateParams;\r\n this.$filter = $filter;\r\n this.gettextCatalog = gettextCatalog;\r\n this.store = $ngRedux;\r\n\r\n this.maxDate = moment().endOf('minute').toDate();\r\n this.minDate = null;\r\n\r\n //=====\r\n this.series = [];\r\n this.seriesData = {};\r\n this.visibleSeries = [];\r\n this.underShowMoreSeries = [];\r\n this.displaySeries = []; // holed series will be displayed\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(() => ({}), { ...AssetDetailsActions })(this);\r\n //get or refresh data => passing true to update date range\r\n this.getSeriesData(true);\r\n this.maxDate = moment().endOf('minute').toDate();\r\n this.minDate = moment().subtract(30, 'days').startOf('minute').toDate();\r\n }\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n $onChanges(changes) {\r\n const { asset, seriesData } = changes;\r\n if (asset && asset.currentValue) {\r\n const { series = [] } = asset.currentValue;\r\n // Filter access management from the series\r\n this.series = series.filter((serie) => !isAccessDataPoint(serie.dataId));\r\n\r\n this.visibleSeries = this.series.filter((series) => series.display);\r\n this.underShowMoreSeries = this.series.filter((series) => !series.display);\r\n this.displaySeries = this.getDisplayedSeries();\r\n }\r\n\r\n if (seriesData && seriesData.currentValue) {\r\n if (this.series.length) {\r\n [this.chartData, this.valuesData] = this.getChartAndValuesData(\r\n this.series,\r\n this.seriesData,\r\n );\r\n }\r\n }\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n }\r\n\r\n getChartAndValuesData(seriesList = [], seriesData = {}) {\r\n let chartData = [];\r\n let valuesData = [];\r\n Object.keys(seriesData).forEach((seriesId) => {\r\n const series = seriesList.find((ser) => ser.id === seriesId);\r\n if (series && this.isSeriesSelected(seriesId)) {\r\n const chartDataobject = {\r\n series: series,\r\n data: seriesData[seriesId].chartData || [],\r\n rollup: seriesData[seriesId].chartRollup,\r\n };\r\n const valuesDataobject = {\r\n series: series,\r\n data: seriesData[seriesId].valuesData || [],\r\n };\r\n chartData.push(chartDataobject);\r\n valuesData.push(valuesDataobject);\r\n }\r\n });\r\n chartData = sortBy(chartData, (seriesData) => seriesData.series.order);\r\n valuesData = sortBy(valuesData, (seriesData) => seriesData.series.order);\r\n return [chartData, valuesData];\r\n }\r\n\r\n showMoreButtonPressed() {\r\n this.showMoreSelected = !this.showMoreSelected;\r\n this.displaySeries = this.getDisplayedSeries();\r\n }\r\n\r\n getDisplayedSeries() {\r\n return this.showMoreSelected\r\n ? [...this.visibleSeries, ...this.underShowMoreSeries]\r\n : [...this.visibleSeries];\r\n }\r\n\r\n toggleSeries(seriesId) {\r\n const currentSeriesSelected = this.isSeriesSelected(seriesId);\r\n\r\n if (!currentSeriesSelected) {\r\n this.selectSeries(seriesId);\r\n } else {\r\n this.deselectSeries(seriesId);\r\n }\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.toggleSerie,\r\n isSelected: currentSeriesSelected,\r\n id: seriesId,\r\n });\r\n }\r\n\r\n switchToTab(tabKey) {\r\n this.setActiveDataTab(tabKey);\r\n }\r\n\r\n isSeriesSelected(id) {\r\n return (this.selectedSeriesIds || []).includes(id);\r\n }\r\n\r\n //=== date range\r\n updateStartDate(startDate) {\r\n //fire action to update the date range\r\n this.setDateRange(startDate, this.dateRange.end);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.updateRange,\r\n startDate: startDate,\r\n endDate: this.dateRange.end,\r\n });\r\n }\r\n\r\n updateEndDate(endDate) {\r\n //fire action to update the date range\r\n this.setDateRange(this.dateRange.start, endDate);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.updateRange,\r\n startDate: this.dateRange.start,\r\n endDate: endDate,\r\n });\r\n }\r\n\r\n updateSelectedDateRange(start, end) {\r\n this.setDateRange(start, end);\r\n }\r\n\r\n updateDateRangeOption(option) {\r\n //fire action to update the date range by selected option\r\n this.setDateRangeByOption(option);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.selectedRangeOption,\r\n optionSelected: option,\r\n });\r\n }\r\n\r\n //========== csv ==============\r\n getCsvData() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportCSVClicked,\r\n });\r\n const CsvData = [];\r\n\r\n const headers = {\r\n DataPoint: this.gettextCatalog.getString('Datapoint'),\r\n Value: this.gettextCatalog.getString('Value'),\r\n Units: this.gettextCatalog.getString('Unit'),\r\n LastCommunicated: this.gettextCatalog.getString('Last Communicated'),\r\n };\r\n\r\n CsvData.push(headers);\r\n\r\n this.series.forEach((series) => {\r\n const datapointname = this.gettextCatalog.getString(series.title);\r\n\r\n const lastValueObj = series.last;\r\n let value = lastValueObj\r\n ? this.$filter('attrsValueTranslate')(lastValueObj.v, series, true)\r\n : this.gettextCatalog.getString('No data available');\r\n\r\n const lastcommunicated =\r\n lastValueObj && lastValueObj.t\r\n ? this.$filter('TableDateFilter')(moment(lastValueObj.t))\r\n : this.gettextCatalog.getString('No data available');\r\n\r\n const unit = series.attrs.uom ? series.attrs.uom : '';\r\n\r\n const csvObject = {\r\n DataPoint: datapointname,\r\n Value: value,\r\n Unit: unit,\r\n LastCommunicated: lastcommunicated,\r\n };\r\n CsvData.push(csvObject);\r\n });\r\n return CsvData;\r\n }\r\n\r\n getCsvFileName() {\r\n return `asset-${this.asset.name}.csv`;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetDataController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'dataVm',\r\n bindings: {\r\n asset: '<',\r\n dateRange: '<',\r\n seriesDataStatus: '<',\r\n selectedSeriesIds: '<',\r\n activeTab: '<',\r\n seriesData: '<',\r\n },\r\n};\r\n","import moment from 'moment';\r\nimport angular from 'angular';\r\nimport template from './series-chart.component.html';\r\n\r\nclass ChartController {\r\n constructor(gettextCatalog, $filter, $q, $timeout) {\r\n 'ngInject';\r\n\r\n this.gettextCatalog = gettextCatalog;\r\n this.$filter = $filter;\r\n this.VALUE_DELIMETER = '#';\r\n this.CHART_DIV_ID = 'chart_div';\r\n this.colorArray = [\r\n '#67b7dc',\r\n '#fdd400',\r\n '#84b761',\r\n '#cc4748',\r\n '#cd82ad',\r\n '#2f4074',\r\n '#448e4d',\r\n '#b7b83f',\r\n '#b9783f',\r\n '#b93e3d',\r\n '#913167',\r\n '#666',\r\n '#777'\r\n ];\r\n this.descriptiveColorArray = ['#bbafff', '#ffea84', '#34495e'];\r\n this.aggregatedDataColorMap = {\r\n min: '#d35400',\r\n mean: '#f39c12',\r\n max: '#27ae60',\r\n delta: '#2c3e50'\r\n };\r\n this.BALLOON_COLOR = '#ffffff';\r\n this.requestedFunctions = ['mean', 'min', 'max', 'last', 'first', 'count', 'delta'];\r\n this.stockChart = null;\r\n this.chartDiv = null;\r\n this.balloonFunction = this.balloonFunction.bind(this);\r\n this.$q = $q;\r\n this.$timeout = $timeout;\r\n }\r\n\r\n $onInit() { }\r\n $onDestroy() {\r\n this.stockChart = null;\r\n this.updateChartDivHeight();\r\n }\r\n $onChanges(changes) {\r\n const { seriesData, startRange, endRange } = changes;\r\n if (\r\n seriesData &&\r\n Array.isArray(seriesData.currentValue) &&\r\n JSON.stringify(seriesData.currentValue) !== JSON.stringify(seriesData.previousValue)\r\n ) {\r\n if (seriesData.currentValue.length) {\r\n this.createOrUpdateChart();\r\n } else {\r\n this.stockChart = null;\r\n this.updateChartDivHeight();\r\n }\r\n }\r\n //in case the result (seriesData) will not change from previous we still need to update chart date\r\n if ((startRange && startRange.currentValue) || (endRange && endRange.currentValue)) {\r\n this.updateChartStartAndEndDate();\r\n }\r\n }\r\n getIntervalColor() {\r\n return '#7f8c8d';\r\n }\r\n getDescriptiveColor(valueIndex) {\r\n return this.descriptiveColorArray[Math.round(valueIndex) % this.descriptiveColorArray.length];\r\n }\r\n\r\n createOrUpdateChartAsync() {\r\n return this.$q((resolve, reject) => {\r\n try {\r\n //convert series t to user date object\r\n const data = this.seriesData.map(ser => {\r\n const modifiedData = (ser.data || []).map(record => ({ ...record, t: moment(record.t).toDate() }));\r\n return { ...ser, data: modifiedData };\r\n });\r\n let { dataset, panel } = this.createChartDataset(data);\r\n if (!this.stockChart) {\r\n this.stockChart = this.creatAmStockCharts(dataset, panel);\r\n if (this.chartDiv) {\r\n this.stockChart.write(this.CHART_DIV_ID);\r\n }\r\n this.stockChart.zoom(this.startRange, this.endRange);\r\n } else {\r\n this.stockChart.mainDataSet.dataProvider = dataset.dataProvider;\r\n this.stockChart.mainDataSet.fieldMappings = dataset.fieldMappings;\r\n this.stockChart.panels = panel;\r\n this.stockChart.zoom(this.startRange, this.endRange);\r\n\r\n this.stockChart.validateNow();\r\n this.stockChart.validateData();\r\n }\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n createOrUpdateChart() {\r\n this.error = false;\r\n this.chartUpdating = true;\r\n //using timeout to force ui update\r\n this.$timeout(\r\n () => {\r\n this.updateChartDivHeight(this.seriesData.length);\r\n this.createOrUpdateChartAsync()\r\n .then()\r\n .catch(e => {\r\n this.error = true;\r\n console.error(e);\r\n })\r\n .finally(() => {\r\n this.chartUpdating = false;\r\n });\r\n },\r\n 0,\r\n false\r\n );\r\n }\r\n updateChartStartAndEndDate() {\r\n try {\r\n if (this.stockChart) {\r\n this.chartZooming = true;\r\n this.stockChart.zoom(this.startRange, this.endRange);\r\n }\r\n } catch (e) {\r\n this.chartZooming = false;\r\n console.error(e);\r\n }\r\n }\r\n\r\n updateChartDivHeight(numberOfCharts = 1) {\r\n //empty parent div to display charts in sequence\r\n this.chartDiv = angular.element(`#${this.CHART_DIV_ID}`);\r\n this.chartDiv.empty();\r\n //calculate the height based on datapoint selection\r\n let height = 175 * numberOfCharts;\r\n height = height < 200 ? '200px' : `${height}px`;\r\n this.chartDiv.css('height', height);\r\n }\r\n\r\n creatAmStockCharts(stockChartDataset, stockPanel) {\r\n if (!stockChartDataset) return;\r\n\r\n //Don't need to render charts twice\r\n if (stockChart) return;\r\n AmCharts.baseHref = true;\r\n let stockParams = {};\r\n stockParams['fontFamily'] = 'Open Sans';\r\n\r\n const stockChart = new AmCharts.AmStockChart(stockParams);\r\n stockChart.path = 'https://cdn.amcharts.com/lib/3/';\r\n\r\n stockChart.type = 'stock';\r\n stockChart.theme = 'light';\r\n\r\n stockChart.dataSets = [stockChartDataset];\r\n stockChart.panels = stockPanel;\r\n\r\n //Chart Axis setting\r\n let categoryAxesSettings = new AmCharts.CategoryAxesSettings(); // x-axis\r\n categoryAxesSettings.minPeriod = 'fff';\r\n categoryAxesSettings.maxSeries = 0;\r\n\r\n stockChart.categoryAxesSettings = categoryAxesSettings;\r\n\r\n let valueAxesSettings = new AmCharts.ValueAxesSettings(); // y-axis\r\n valueAxesSettings.inside = false;\r\n stockChart.valueAxesSettings = valueAxesSettings;\r\n\r\n //scroll bar setting\r\n let chartScrollbarSettings = new AmCharts.ChartScrollbarSettings();\r\n chartScrollbarSettings.dragIcon = 'dragIconRectSmall';\r\n chartScrollbarSettings.dragIconHeight = 15;\r\n chartScrollbarSettings.dragIconWidth = 15;\r\n chartScrollbarSettings.color = '#000';\r\n chartScrollbarSettings.position = 'top';\r\n stockChart.chartScrollbarSettings = chartScrollbarSettings;\r\n\r\n //chart cursor setting\r\n let chartCursorSettings = new AmCharts.ChartCursorSettings();\r\n chartCursorSettings.cursorColor = '#1E90FF';\r\n chartCursorSettings.valueBalloonsEnabled = true;\r\n stockChart.chartCursorSettings = chartCursorSettings;\r\n\r\n //pannel setting for stock chart\r\n let panelsSettings = new AmCharts.PanelsSettings();\r\n panelsSettings.marginLeft = 80;\r\n panelsSettings.marginBottom = 10;\r\n panelsSettings.marginRight = 50;\r\n stockChart.panelsSettings = panelsSettings;\r\n\r\n //export button on the charts\r\n stockChart.export = {\r\n enabled: true,\r\n position: 'top-left',\r\n fileName: 'Asset-Detail-Charts',\r\n menu: [\r\n {\r\n class: 'export-main',\r\n menu: [\r\n {\r\n label: this.gettextCatalog.getString('Download'),\r\n menu: ['PNG', 'JPG', 'PDF', 'PRINT']\r\n },\r\n {\r\n label: this.gettextCatalog.getString('Annotate'),\r\n action: 'draw',\r\n menu: [\r\n {\r\n class: 'export-drawing',\r\n menu: ['PNG', 'JPG', 'PDF', 'PRINT', 'CANCEL']\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n stockChart.initHC = false;\r\n //handle zooming\r\n stockChart.addListener('zoomed', event => {\r\n //disable zoomed in case we are updating chart data or we trigger zoom to update the end or start date\r\n if (this.chartUpdating || this.chartZooming) {\r\n //we are here means zoom done\r\n this.chartZooming = false;\r\n return;\r\n }\r\n\r\n const eventStartDate = moment(event.startDate).startOf('minute');\r\n const eventEndDate = moment(event.endDate).startOf('minute');\r\n\r\n //find the diffrence between event zoomd dates and the binding dates\r\n const startDatesdiff = Math.abs(moment(this.startRange).diff(eventStartDate, 'minutes'));\r\n const endDatesdiff = Math.abs(moment(this.endRange).diff(eventEndDate, 'minutes'));\r\n\r\n //trigger update date range when the date slider moved more than 5 min form the binding dates.\r\n if (startDatesdiff > 5 || endDatesdiff > 5) {\r\n this.onDateRangeChange({\r\n start: eventStartDate,\r\n end: eventEndDate\r\n });\r\n }\r\n });\r\n\r\n return stockChart;\r\n }\r\n\r\n //Generate array of chart data to be uesd by amcharts\r\n getStockChartDataObject(timeSeriesData = []) {\r\n //Dictionary to hold all dapoint values\r\n let valuesDict = {};\r\n\r\n timeSeriesData.forEach(seriesData => {\r\n const datapointId = seriesData.series.dataId;\r\n const descriptor = seriesData.series.descriptor; //Get the datapoint descriptor for this datapointId\r\n const datapointDisplayItem = seriesData.series.displayItem;\r\n const { interval: dataInterval = null } = seriesData.rollup || {};\r\n\r\n let map = seriesData.data.map(e => {\r\n const result = {};\r\n\r\n let value = null;\r\n if (angular.isObject(e.v)) {\r\n if (e.v.mean) {\r\n value = descriptor ? Math.round(e.v.mean) : e.v.mean;\r\n }\r\n } else {\r\n value = e.v;\r\n }\r\n\r\n //result[datapointId] = descriptor ? 1 : value;\r\n if (descriptor) {\r\n if (angular.isObject(e.v)) {\r\n result[datapointId] = 1;\r\n } else {\r\n result[datapointId] = e.v;\r\n }\r\n } else {\r\n result[datapointId] = descriptor ? 1 : value;\r\n }\r\n result[datapointId + this.VALUE_DELIMETER + 'v'] = e.v;\r\n\r\n const chartGraphFunctionsLines = this.defineAggregatedChartGraphs(datapointDisplayItem, seriesData.rollup);\r\n\r\n chartGraphFunctionsLines.forEach(agggregateFunction => {\r\n result[datapointId + this.VALUE_DELIMETER + agggregateFunction] = e.v[agggregateFunction];\r\n result[datapointId + this.VALUE_DELIMETER + agggregateFunction + '_Color'] = this.aggregatedDataColorMap[\r\n agggregateFunction\r\n ];\r\n if (dataInterval === null) {\r\n if (descriptor) {\r\n result[datapointId + '_Color'] = this.getDescriptiveColor(value);\r\n } else {\r\n result[datapointId + '_Color'] = this.colorArray[0];\r\n }\r\n } else {\r\n let color = this.getIntervalColor();\r\n result[datapointId + '_Color'] = color;\r\n }\r\n });\r\n\r\n result['t'] = e.t;\r\n return result;\r\n });\r\n\r\n map = _.indexBy(map, 't');\r\n valuesDict = _.merge(map, valuesDict);\r\n });\r\n const finalResult = _.map(valuesDict, function (e) {\r\n e.date = e.t;\r\n return e;\r\n });\r\n //Always input the min and max date values into the chart so that the top date range for the scrollbar doesn't change\r\n let startDateChartItem = {\r\n date: moment()\r\n .subtract(30, 'days')\r\n .startOf('minute')\r\n .toDate()\r\n };\r\n let endDateChartItem = {\r\n date: moment()\r\n .endOf('minute')\r\n .toDate()\r\n }; //Current time at init\r\n\r\n finalResult.push(startDateChartItem);\r\n finalResult.push(endDateChartItem);\r\n\r\n const sortedFinalResult = this.sortData(finalResult);\r\n\r\n return sortedFinalResult;\r\n }\r\n\r\n //Sort object by Date\r\n sortData(arrayData) {\r\n let sortedArray = arrayData.sort(function (a, b) {\r\n if (a.date < b.date) {\r\n return -1;\r\n }\r\n if (a.date > b.date) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n return sortedArray;\r\n }\r\n\r\n capitalizeFirstletter(title) {\r\n const [first, ...rest] = title || '';\r\n return `${(first || '').toUpperCase()}${(rest || []).join('').toLowerCase()}`;\r\n }\r\n\r\n defineAggregatedChartGraphs(displayItem, seriesRollupObject) {\r\n const seriesAggregatedFunctions = seriesRollupObject ? seriesRollupObject.functions : [];\r\n //if no display item will display all returned functions\r\n //todo => find if we can display only mean instead of all when mean exist\r\n if (!displayItem) {\r\n return seriesAggregatedFunctions;\r\n }\r\n const displayAggergateFunction = displayItem.aggregates || [];\r\n //chart graphs any of returnd function that user selected in the datapoint display\r\n const aggergatedchartGraphFunctions = seriesAggregatedFunctions.filter(returnFunction =>\r\n displayAggergateFunction.includes(returnFunction)\r\n );\r\n //if chart graphs funstion still empty then will chart all return function.\r\n return aggergatedchartGraphFunctions.length ? aggergatedchartGraphFunctions : seriesAggregatedFunctions;\r\n }\r\n\r\n //guides function\r\n getSeriesDataGuide(seriesDataArray) {\r\n let guides = [];\r\n\r\n let lastRecordedValue = null;\r\n _.forEach(seriesDataArray, (e, index) => {\r\n let v = e.v;\r\n let lastKnownValue = null;\r\n if (angular.isObject(v)) {\r\n // used angular.isDefined(v.last) to test if defind instead (v.last) as when v.last equal 0 will return false\r\n if (angular.isDefined(v.last) && v.last !== null && v.last !== 'NaN') {\r\n lastKnownValue = {\r\n t: e.t,\r\n v: v.last\r\n };\r\n } else if (angular.isDefined(v.first) && v.first !== null && v.first !== 'NaN') {\r\n lastKnownValue = {\r\n t: e.t,\r\n v: v.first\r\n };\r\n }\r\n }\r\n\r\n if (lastKnownValue !== null) {\r\n //try adding a guide\r\n if (lastRecordedValue !== null) {\r\n guides.push({\r\n date: moment(lastRecordedValue.t).toDate(),\r\n toDate: moment(lastKnownValue.t).toDate(),\r\n fillColor: this.getDescriptiveColor(lastRecordedValue.v),\r\n fillAlpha: 1\r\n });\r\n }\r\n\r\n if (index === seriesDataArray.length - 1) {\r\n guides.push({\r\n date: moment(lastKnownValue.t).toDate(),\r\n toDate: moment(this.endRange).toDate(),\r\n fillColor: this.getDescriptiveColor(lastKnownValue.v),\r\n fillAlpha: 1\r\n });\r\n }\r\n\r\n lastRecordedValue = lastKnownValue;\r\n }\r\n });\r\n return guides;\r\n }\r\n\r\n //dont do any language translation logic on this method.\r\n //this method creates object we need for AmCharts javascript library\r\n //line chart data object as per AmStock chart\r\n createChartDataset(timeSeriseData = []) {\r\n let dataset = new AmCharts.DataSet();\r\n\r\n dataset['dataProvider'] = this.getStockChartDataObject(timeSeriseData); //array of object containing date and datapointvalues\r\n\r\n //calculate height\r\n let percentHeight = Math.round(100 / (timeSeriseData.length || 1));\r\n\r\n let fieldMappings = [];\r\n let panel = []; //Create the main panel\r\n\r\n timeSeriseData.forEach(seriesData => {\r\n const descriptor = seriesData.series.descriptor; //Get the datapoint descriptor for this datapointId\r\n const datapointDisplayItem = seriesData.series.displayItem;\r\n const { interval: dataInterval = null } = seriesData.rollup || {};\r\n let datapointId = seriesData.series.dataId;\r\n let title = this.getChartTitle(seriesData.series, dataInterval);\r\n\r\n //Panel for one datapoint\r\n let stockPanel = new AmCharts.StockPanel({\r\n fontFamily: 'Open Sans'\r\n });\r\n stockPanel.percentHeight = percentHeight;\r\n stockPanel.id = datapointId;\r\n stockPanel.title = title;\r\n\r\n let valueAxis = new AmCharts.ValueAxis({\r\n useGraphSettings: true,\r\n fontFamily: 'Open Sans'\r\n });\r\n //stockGraph.showBalloon = false;\r\n\r\n //some datapoints has descriptor but not values(numeric value) witch can be handeld in the else block\r\n //when value was empty the valueAxis.maximum set to 0 casing the chart not show data.\r\n if (descriptor && _.size(descriptor.values) > 0) {\r\n fieldMappings.push({\r\n fromField: datapointId,\r\n toField: datapointId\r\n });\r\n\r\n const stockGraph = new AmCharts.StockGraph({\r\n fontFamily: 'Open Sans'\r\n });\r\n stockGraph.valueField = datapointId;\r\n stockGraph.id = `${seriesData.series.id}`;\r\n\r\n stockGraph.balloonText = \"[[date]]
                [[\" + datapointId + ']]';\r\n stockGraph.balloonFunction = this.balloonFunction;\r\n stockGraph.balloonColor = this.BALLOON_COLOR;\r\n stockGraph.title = title;\r\n //We don't want datapoint descriptors to show up in the legend because its reduntant from graph title\r\n\r\n let legendData = [];\r\n if (_.size(descriptor.values) <= 6) {\r\n legendData = _.map(descriptor.values, (e, index) => {\r\n return {\r\n title: this.gettextCatalog.getString(e),\r\n color: this.getDescriptiveColor(index)\r\n };\r\n });\r\n }\r\n\r\n let legendOptions = {\r\n data: legendData,\r\n position: 'top',\r\n combineLegend: false,\r\n valueText: '[[]]',\r\n valueWidth: 15,\r\n title: title\r\n };\r\n\r\n stockPanel.addLegend(legendOptions);\r\n\r\n let color = datapointId + '_Color';\r\n stockGraph.fillColorsField = color;\r\n stockGraph.lineColorField = color;\r\n\r\n stockGraph.balloonText = \"[[date]]
                [[\" + datapointId + ']]';\r\n\r\n valueAxis.labelsEnabled = false;\r\n\r\n if (dataInterval === null) {\r\n if (datapointDisplayItem) {\r\n if (datapointDisplayItem.chartType === 'step') {\r\n stockGraph.type = 'step';\r\n stockGraph.lineThickness = 3;\r\n } else if (datapointDisplayItem.chartType === 'step_disconnected') {\r\n stockGraph.type = 'step';\r\n stockGraph.noStepRisers = true;\r\n stockGraph.lineThickness = 0;\r\n }\r\n }\r\n\r\n const numOfValues = _.size(descriptor.values);\r\n if (numOfValues > 0) {\r\n valueAxis.maximum = numOfValues;\r\n valueAxis.minimum = -1;\r\n }\r\n //stockGraph.noStepRisers = true;\r\n stockGraph.bullet = 'square';\r\n stockGraph.bulletSize = 4;\r\n stockGraph.bulletBorderAlpha = 0;\r\n } else {\r\n stockGraph.type = 'column';\r\n valueAxis.maximum = 1;\r\n valueAxis.minimum = 0;\r\n stockGraph.columnWidth = 0.2;\r\n stockGraph.fillAlphas = 1;\r\n }\r\n //Create the guides\r\n stockPanel.addStockGraph(stockGraph);\r\n stockPanel.guides = this.getSeriesDataGuide(seriesData.data);\r\n }\r\n //Datapoints with no descriptors\r\n else {\r\n stockPanel.stockLegend = {\r\n valueText: '',\r\n valueTextRegular: '[[]]',\r\n useMarkerColorForLabels: false,\r\n switchable: false\r\n };\r\n\r\n if (datapointDisplayItem) {\r\n if (angular.isDefined(datapointDisplayItem.rangeMin)) {\r\n valueAxis.minimum = datapointDisplayItem.rangeMin;\r\n }\r\n\r\n if (angular.isDefined(datapointDisplayItem.rangeMax)) {\r\n valueAxis.maximum = datapointDisplayItem.rangeMax;\r\n }\r\n }\r\n\r\n //For datapoints with only one graph\r\n if (dataInterval === null) {\r\n const stockGraph = new AmCharts.StockGraph({\r\n fontFamily: 'Open Sans'\r\n });\r\n stockGraph.valueField = datapointId;\r\n stockGraph.id = `${seriesData.series.id}`;\r\n\r\n stockGraph.balloonText = \"[[date]]
                [[\" + datapointId + ']]';\r\n stockGraph.balloonFunction = this.balloonFunction;\r\n stockGraph.title = this.gettextCatalog.getString('Raw');\r\n stockGraph.type = 'line';\r\n stockGraph.lineThickness = 2;\r\n stockGraph.bullet = 'round';\r\n stockGraph.bulletSize = 2;\r\n stockGraph.balloonColor = this.BALLOON_COLOR;\r\n stockGraph.color = '#000';\r\n stockPanel.addStockGraph(stockGraph);\r\n\r\n fieldMappings.push({\r\n fromField: datapointId,\r\n toField: datapointId\r\n });\r\n } else {\r\n const chartGraphFunctionsLines = this.defineAggregatedChartGraphs(datapointDisplayItem, seriesData.rollup);\r\n\r\n if (chartGraphFunctionsLines.length > 0) {\r\n //Create multiple graphs\r\n chartGraphFunctionsLines.forEach((dpdia, index) => {\r\n let dp = datapointId + this.VALUE_DELIMETER + dpdia;\r\n fieldMappings.push({\r\n fromField: dp,\r\n toField: dp\r\n });\r\n\r\n let graph = new AmCharts.StockGraph();\r\n graph.valueField = dp;\r\n graph.id = `${seriesData.series.id}${this.VALUE_DELIMETER}${dpdia}`;\r\n graph.useDataSetColors = false;\r\n graph.balloonText = \"[[date]]
                [[\" + dp + ']]';\r\n graph.balloonFunction = this.balloonFunction;\r\n\r\n //Only want ot show the baloon on one of the datapoints\r\n if (index !== 0) {\r\n graph.showBalloon = false;\r\n }\r\n\r\n graph.balloonFunction = this.balloonFunction;\r\n graph.balloonColor = this.BALLOON_COLOR;\r\n graph.title = this.gettextCatalog.getString(this.capitalizeFirstletter(dpdia));\r\n graph.color = '#ccc';\r\n graph.fillColorsField = '#ccc';\r\n graph.lineColorField = '#ccc';\r\n graph.type = 'line';\r\n graph.lineThickness = 2;\r\n graph.line;\r\n graph.bullet = 'round';\r\n graph.bulletSize = 2;\r\n stockPanel.addStockGraph(graph);\r\n });\r\n }\r\n }\r\n }\r\n\r\n stockPanel.addValueAxis(valueAxis);\r\n panel.push(stockPanel);\r\n });\r\n\r\n dataset['fieldMappings'] = fieldMappings;\r\n dataset['categoryField'] = 'date';\r\n\r\n return { dataset, panel };\r\n }\r\n\r\n //get title for datapoint\r\n getChartTitle(series, dataInterval) {\r\n const { descriptor = {} } = series;\r\n let chartTitle = descriptor.title || series.title;\r\n chartTitle = this.gettextCatalog.getString(chartTitle);\r\n\r\n let uom = null;\r\n\r\n if (series.attrs && series.attrs.uom) {\r\n uom = series.attrs.uom;\r\n }\r\n\r\n if (uom) {\r\n chartTitle += ' (' + this.gettextCatalog.getString(uom) + ')';\r\n }\r\n\r\n if (dataInterval === '1day') {\r\n chartTitle += ' - ' + this.gettextCatalog.getString('Daily Aggregate');\r\n } else if (dataInterval === '1hour') {\r\n chartTitle += ' - ' + this.gettextCatalog.getString('Hourly Aggregate');\r\n } else if (dataInterval === null) {\r\n //do nothing\r\n }\r\n return chartTitle;\r\n }\r\n\r\n getSeries(id) {\r\n const chartseriesData = (this.seriesData || []).find(serData => serData.series.id === id);\r\n return chartseriesData ? chartseriesData.series : {};\r\n }\r\n //for formating the balloon text label on charts\r\n balloonFunction(item, graph) {\r\n //get the datapoint id by parsing out the value field and the delimieter\r\n let datapointId = null;\r\n const [seriesId] = (graph.id || '').split(this.VALUE_DELIMETER);\r\n const series = this.getSeries(seriesId);\r\n if (graph.valueField) {\r\n if (graph.valueField.indexOf(this.VALUE_DELIMETER) >= 0) {\r\n datapointId = graph.valueField.split(this.VALUE_DELIMETER)[0];\r\n } else {\r\n datapointId = graph.valueField;\r\n }\r\n }\r\n\r\n let descriptor = series.descriptor; //getDescriptor(datapointId);\r\n let displayItem = series.displayItem; //getDatapointDisplayItem(datapointId);\r\n\r\n //Get the value for this datacontext\r\n let val = item.dataContext.dataContext[datapointId + this.VALUE_DELIMETER + 'v'];\r\n\r\n let innerHtml = '';\r\n\r\n const formatNumericValue = (val, datapointDisplayItem) => {\r\n if (angular.isNumber(val)) {\r\n let numDecimals = 2;\r\n\r\n if (datapointDisplayItem && datapointDisplayItem.decimals) {\r\n numDecimals = datapointDisplayItem.decimals || 2;\r\n }\r\n\r\n return this.$filter('number')(val, numDecimals);\r\n }\r\n return val;\r\n };\r\n\r\n const formatDescriptiveVal = (val, descriptor) => {\r\n if (!descriptor) {\r\n return val;\r\n }\r\n\r\n if (!descriptor.values) {\r\n return val;\r\n }\r\n if (!angular.isNumber(val)) {\r\n return val;\r\n }\r\n\r\n return descriptor.values[val] ? this.gettextCatalog.getString(descriptor.values[val]) : val;\r\n };\r\n\r\n if (angular.isObject(val)) {\r\n // use formatDescriptiveVal only if there is value discriptor values supplied\r\n if (!descriptor || _.size(descriptor.values) === 0) {\r\n //Must be a numeric?\r\n if ((val.mean && val.last !== 'NaN') || val.mean === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('Mean')}: ${formatNumericValue(\r\n val.mean,\r\n displayItem\r\n )}
                `;\r\n }\r\n\r\n if ((val.min && val.min !== 'NaN') || val.min === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('Min')}: ${formatNumericValue(\r\n val.min,\r\n displayItem\r\n )}
                `;\r\n }\r\n\r\n if ((val.max && val.max !== 'NaN') || val.max === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('Max')}: ${formatNumericValue(\r\n val.max,\r\n displayItem\r\n )}
                `;\r\n }\r\n } else {\r\n if (val.count) {\r\n if ((val.count && val.count !== 'NaN') || val.count === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('Count')}: ${val.count}
                `;\r\n }\r\n\r\n if ((val.first && val.first !== 'NaN') || val.first === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('First')}: ${formatDescriptiveVal(\r\n val.first,\r\n descriptor\r\n )}
                `;\r\n }\r\n\r\n if ((val.last && val.last !== 'NaN') || val.last === 0) {\r\n innerHtml += `${this.gettextCatalog.getString('Last')}: ${formatDescriptiveVal(\r\n val.last,\r\n descriptor\r\n )}
                `;\r\n }\r\n }\r\n }\r\n } else {\r\n //some numeric datapoint can have descriptor\r\n if (descriptor && _.size(descriptor.values) > 0) {\r\n innerHtml += '' + formatDescriptiveVal(val, descriptor) + '
                ';\r\n } else {\r\n innerHtml += '' + formatNumericValue(val, displayItem) + '
                ';\r\n }\r\n }\r\n\r\n //Add the date....\r\n let html = \"
                \" + innerHtml + '';\r\n //We don't want to show the time if its an average\r\n let formattedDate = this.$filter('ChartLabelFilter')(item.dataContext.date, this.selectedDataInterval);\r\n\r\n html = formattedDate + html;\r\n\r\n return html;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: ChartController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'chartVm',\r\n bindings: {\r\n seriesData: '<',\r\n loadingData: '<',\r\n startRange: '<',\r\n endRange: '<',\r\n minDate: '<',\r\n maxDate: '<',\r\n onDateRangeChange: '&'\r\n }\r\n};\r\n","import {debounce, get} from 'lodash';\r\nimport moment from 'moment';\r\nimport template from './series-table.component.html';\r\n\r\nconst EVENT_TRACKING_NAME = 'seriesTable';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n exportSelected: 'exportSelected',\r\n exportAll: 'exportAll',\r\n paginationChanged: 'paginationChanged',\r\n}\r\n\r\nclass AssetSeriesTableController {\r\n constructor(gettextCatalog, $filter, TimezoneService, equipmentRepository) {\r\n 'ngInject';\r\n\r\n this.gettextCatalog = gettextCatalog;\r\n this.$filter = $filter;\r\n this.TimezoneService = TimezoneService;\r\n this.equipmentRepository = equipmentRepository;\r\n //variables\r\n this.exportSelected = false;\r\n this.timeStampOrderBy = '-';\r\n //Pagination\r\n this.currentPage = 1;\r\n this.itemsPerPage = 15;\r\n this.maxSize = 1;\r\n }\r\n\r\n $onInit() {}\r\n $onDestroy() {}\r\n $onChanges(changes) {\r\n const {seriesData, assetSeries} = changes;\r\n // const r =(seriesData.currentValue.length || 0) !== (seriesData.previousValue.length || 0);\r\n if (seriesData && seriesData.currentValue) {\r\n this.selectedSeriesIds = this.getSeriesIdsForRetreivedData(seriesData.currentValue);\r\n this.timeValueDict = this.buildTimeValueDictionary(seriesData.currentValue);\r\n this.timeStamps = Object.keys(this.timeValueDict);\r\n }\r\n if (assetSeries && assetSeries.currentValue) {\r\n this.seriesDict = assetSeries.currentValue.reduce((seriesDict, series) => {\r\n seriesDict[series.id] = series;\r\n return seriesDict;\r\n }, {});\r\n }\r\n }\r\n getCsvFileName() {\r\n const time = moment().format('YY-MM-DDThh-mm-ss');\r\n return `data_export.${this.assetName || ''}${time}.csv`;\r\n }\r\n allCSVData() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportAll,\r\n assetName: this.assetName,\r\n });\r\n const allSeries = Object.keys(this.seriesDict);\r\n this.allDataExporting = true;\r\n return this.equipmentRepository\r\n .getEquipSeriesData(allSeries, [this.startRange, this.endRange])\r\n .then(\r\n response => {\r\n const timeseriesExportAllData = response.data || [];\r\n const seriesIds = this.getSeriesIdsForRetreivedData(timeseriesExportAllData);\r\n const timeValueDict = this.buildTimeValueDictionary(timeseriesExportAllData);\r\n this.error = false;\r\n return this.getCsvData(seriesIds, timeValueDict, this.seriesDict);\r\n },\r\n () => {\r\n this.error = true;\r\n }\r\n )\r\n .finally(() => {\r\n this.allDataExporting = false;\r\n });\r\n }\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data }\r\n })\r\n }\r\n\r\n paginationChanged() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.paginationChanged,\r\n currentPage: this.currentPage\r\n })\r\n }\r\n\r\n\r\n //A dictionary where the key is the timestamp of the aggregated values from all series data\r\n buildTimeValueDictionary(seriesData = []) {\r\n const valueDict = seriesData.reduce((timeValueMap, item) => {\r\n const {series, data = []} = item;\r\n data.forEach(record => {\r\n //Check to see if a dictionary value for this timestamp exists else make the value as object\r\n if (!timeValueMap[record.t]) {\r\n timeValueMap[record.t] = {};\r\n }\r\n timeValueMap[record.t][series.id] = record.v;\r\n });\r\n return timeValueMap;\r\n }, {});\r\n return valueDict;\r\n }\r\n\r\n getSeriesIdsForRetreivedData(seriesData = []) {\r\n return seriesData.map(item => item.series.id);\r\n }\r\n\r\n showExport() {\r\n this.exportSelected = !this.exportSelected;\r\n }\r\n\r\n exportSelectedCsv() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.exportSelected,\r\n assetName: this.assetName,\r\n });\r\n return this.getCsvData(this.selectedSeriesIds, this.timeValueDict, this.seriesDict);\r\n }\r\n\r\n //====csv========\r\n getCsvData(seriesIds, timeValueDict, seriesDict) {\r\n let columnArray = []; //array of rows\r\n this.exportSelected = false;\r\n\r\n //Get the column headers\r\n\r\n let headerArray = [];\r\n\r\n headerArray.push('Asset Name');\r\n\r\n headerArray.push('Attributes');\r\n\r\n headerArray.push('TIMESTAMP');\r\n\r\n const headerSet = this.setCsvHeaderSet(seriesIds);\r\n\r\n headerArray = this.setCsvHeaderArray(headerSet, headerArray, seriesDict);\r\n\r\n columnArray.push(headerArray);\r\n\r\n //push the attributes\r\n columnArray = this.setCsvAssetInfoArray(columnArray, this.assetAttrs, this.assetName);\r\n\r\n //need to keep track of where to put the timeseries data so everything lines up\r\n columnArray = this.setCsvTimeSeriesData(columnArray, headerSet, timeValueDict, seriesDict);\r\n\r\n return columnArray;\r\n }\r\n setCsvHeaderSet(seriesIds = []) {\r\n const headerSet = {};\r\n seriesIds.forEach(seriesId => {\r\n headerSet[seriesId] = seriesId;\r\n });\r\n\r\n return headerSet;\r\n }\r\n setCsvHeaderArray(headerSet, headerArray = [], seriesDict = {}) {\r\n for (let seriesId in headerSet) {\r\n //Get the series info\r\n const series = seriesDict[seriesId] || {};\r\n const {attrs = {}, title} = series;\r\n const uom = attrs.uom ? `(${this.gettextCatalog.getString(attrs.uom)})` : '';\r\n const seriesColTitle = `${this.gettextCatalog.getString(title)} ${uom}` || seriesId;\r\n\r\n headerArray.push(seriesColTitle);\r\n }\r\n\r\n return headerArray;\r\n }\r\n\r\n setCsvAssetInfoArray(columnArray = [], attrs = {}, assetName) {\r\n //attrs will be in the second col after the name\r\n const attrsRows = Object.keys(attrs).map(attrKey => `${attrKey} : ${attrs[attrKey]}`);\r\n const [fistAttr, ...rest] = attrsRows;\r\n\r\n columnArray.push([assetName, fistAttr]);\r\n rest.forEach(attr => {\r\n columnArray.push(['', attr]);\r\n });\r\n\r\n return columnArray;\r\n }\r\n /**\r\n * return ready csv array\r\n * @param {*} columnArray\r\n * @param {*} headerSet\r\n * @param {*} timeValueDict\r\n * @param {*} seriesDict\r\n */\r\n setCsvTimeSeriesData(columnArray, headerSet, timeValueDict, seriesDict) {\r\n let columnPushPosition = 1;\r\n let columnLength = columnArray.length; //need to get the length before we start pushing more\r\n\r\n let timestamps = Object.keys(timeValueDict); //get the timeStamps into an array so we can guarentee the sort order when iterating.\r\n\r\n const timeStampsReversed = timestamps.sort().reverse();\r\n\r\n timeStampsReversed.forEach(timestamp => {\r\n const rowArray = []; //so time series data does not go under Asset Name or Attributes.\r\n\r\n //push the timestamp\r\n rowArray.push(this.TimezoneService.tagToUserTimezone(timestamp));\r\n\r\n const dataDict = timeValueDict[timestamp];\r\n\r\n for (let seriesId in headerSet) {\r\n // get the current series to use it in the filter\r\n let series = seriesDict[seriesId];\r\n rowArray.push(this.$filter('attrsValueTranslate')(dataDict[seriesId], series, true));\r\n }\r\n if (columnPushPosition < columnLength) {\r\n columnArray[columnPushPosition].push([...rowArray]);\r\n columnPushPosition++;\r\n } else {\r\n columnArray.push(['', '', ...rowArray]);\r\n }\r\n });\r\n // columnArray = columnArray.forEach((row =>{\r\n // const[name,attr]=row;\r\n // row =\r\n // });\r\n return columnArray;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetSeriesTableController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'tableVm',\r\n bindings: {\r\n seriesData: '<',\r\n loadingData: '<',\r\n startRange: '<',\r\n endRange: '<',\r\n assetName: '<',\r\n assetAttrs: '<',\r\n assetSeries: '<'\r\n }\r\n};\r\n","import template from './asset-details.component.html';\r\nimport assetImageEditTemplate from './images/asset-image-edit.modal.html';\r\nimport assetImageUploadTemplate from './images/asset-image-upload.modal.html';\r\nimport assetImageViewTemplate from '../../../components/images-modal/equipment-images.modal.html';\r\nimport * as AssetDetailsActions from '../../../../state/asset-details/asset-details.actions';\r\n\r\n// Constants\r\nconst EVENT_TRACKING_NAME = 'assetDetailsDetails';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n addImage: 'addImage',\r\n uploadImage: 'uploadImage',\r\n deletedImage: 'deletedImage',\r\n cancelledModal: 'canceledModal',\r\n setDefaultImage: 'setDefaultImage',\r\n}\r\n\r\nclass AssetDetailsController {\r\n constructor($uibModal, usersService, $ngRedux, syncRunHoursService) {\r\n 'ngInject';\r\n this.store = $ngRedux;\r\n this.usersService = usersService;\r\n this.$uibModal = $uibModal;\r\n this.errorText = '';\r\n this.errorFlag = false;\r\n this.syncRunHoursService = syncRunHoursService;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(() => ({}), {...AssetDetailsActions})(this);\r\n }\r\n\r\n $onChanges(changes) {\r\n const {asset} = changes;\r\n const {attributes = [], images = [], users = [], profileImage} = asset.currentValue;\r\n this.attributes = attributes;\r\n this.images = images;\r\n this.users = users;\r\n this.profileImage = profileImage;\r\n this.showImageSection =\r\n this.usersService.hasRequiredFeatures(['images']) &&\r\n (this.usersService.hasRequiredFeatures(['assets.images']) || this.images.length > 0);\r\n this.runHoursSeries = this.asset.series.find(ser => ser.dataId === this.asset.syncRunHours);\r\n }\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n onDeleteImage(imageId) {\r\n //refresh asset images\r\n //todo refresh asset images only\r\n this.getAssetData(this.asset.id);\r\n\r\n this.addToDataLayer({\r\n event: EVENT_TRACKING_ACTIONS.deletedImage,\r\n assetId: this.asset.id,\r\n })\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data }\r\n });\r\n }\r\n //************************* MODALS FOR IMAGES *************************\r\n\r\n //************************* EDIT *************************\r\n editImageModal(image) {\r\n const classRef = this;\r\n this.errorText = '';\r\n this.errorFlag = false;\r\n this.$uibModal\r\n .open({\r\n animation: true,\r\n size: 'md',\r\n template: assetImageEditTemplate,\r\n controller: 'AssetImageEditController',\r\n resolve: {\r\n image: () => image\r\n }\r\n })\r\n .result.then(function(response) {\r\n //if object is returned need to update the image in asset to the new name + description\r\n\r\n if (!response) {\r\n return;\r\n } else {\r\n //todo refresh asset images only\r\n classRef.getAssetData(classRef.asset.id);\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n //************************* VIEW *************************\r\n openImageModal(pictureIndex) {\r\n const classRef = this;\r\n this.errorText = '';\r\n this.errorFlag = false;\r\n const currentProfilePictureId = this.profileImage && this.profileImage.id ? this.profileImage.id : 0;\r\n this.$uibModal\r\n .open({\r\n animation: true,\r\n size: 'lg',\r\n template: assetImageViewTemplate,\r\n controller: 'EquipmentImagesModalController',\r\n resolve: {\r\n items: () => this.images,\r\n index: pictureIndex,\r\n users: () => this.users,\r\n equipId: () => this.asset.id,\r\n profilePictureId: () => currentProfilePictureId,\r\n onDeleteImageCallback: () => this.onDeleteImage.bind(this)\r\n }\r\n })\r\n .result.then(function(defaultImageId) {\r\n if (defaultImageId && defaultImageId !== currentProfilePictureId) {\r\n //todo apdate profile img\r\n //todo refresh asset images only\r\n classRef.getAssetData(classRef.asset.id);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.setDefaultImage,\r\n });\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n //************************* UPLOAD *************************\r\n uploadImage() {\r\n const classRef = this;\r\n this.errorText = '';\r\n this.errorFlag = false;\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.addImage,\r\n assetId: this.asset.id,\r\n });\r\n\r\n this.$uibModal\r\n .open({\r\n animation: true,\r\n size: 'md',\r\n template: assetImageUploadTemplate,\r\n controller: 'AssetImageUploadController',\r\n resolve: {\r\n equipmentId: () => this.asset.id\r\n }\r\n })\r\n .result.then(function(response) {\r\n if (!response) {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.cancelledModal,\r\n assetId: this.asset.id,\r\n })\r\n return;\r\n }\r\n if (response.message) {\r\n classRef.errorText = response.message;\r\n classRef.errorFlag = true;\r\n } else if (response.data) {\r\n //todo refresh asset images only\r\n classRef.getAssetData(classRef.asset.id);\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.uploadImage,\r\n });\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetDetailsController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'detailVm',\r\n bindings: {\r\n asset: '<',\r\n loading: '<'\r\n }\r\n};\r\n","export default class LocationMapUtil {\r\n constructor(mapService, $filter, gettextCatalog) {\r\n this.$filter = $filter;\r\n this.gettextCatalog = gettextCatalog;\r\n this.mapService = mapService;\r\n this.lineColor = '#81ca80';\r\n }\r\n\r\n get pinLocationIcon() {\r\n return L.icon({\r\n iconUrl: '/Home/Content/svg/pin.png',\r\n iconSize: [20, 45],\r\n iconAnchor: [15, 35],\r\n clickable: true,\r\n });\r\n }\r\n\r\n /**\r\n * create the controle on topleft to drop a pin\r\n * @param {*} editableFeatureGroupLayers\r\n */\r\n createDrawPinControl(editableFeatureGroupLayers) {\r\n const options = {\r\n position: 'topleft',\r\n draw: {\r\n polyline: false,\r\n polygon: false,\r\n marker: {\r\n distance: 25,\r\n icon: this.pinLocationIcon,\r\n },\r\n rectangle: false,\r\n circle: false,\r\n circlemarker: false,\r\n },\r\n edit: {\r\n featureGroup: editableFeatureGroupLayers,\r\n edit: false,\r\n remove: false,\r\n },\r\n };\r\n\r\n //Add controls for drawing polygons\r\n let drawControl = new L.Control.Draw(options);\r\n L.drawLocal.draw.toolbar.buttons.marker = this.gettextCatalog.getString('Pin Asset Location');\r\n L.drawLocal.draw.handlers.marker.tooltip.start = this.gettextCatalog.getString(\r\n 'Click map to set the Asset location.',\r\n );\r\n return drawControl;\r\n }\r\n\r\n get pinnedMarkerIcon() {\r\n return L.divIcon({\r\n iconSize: [32, 32],\r\n iconAnchor: [16, 16],\r\n popupAnchor: [0, 0],\r\n className: 'last-location-pushpin asset-icon-yellow fa fa-map-marker text-center',\r\n html: '
                ',\r\n });\r\n }\r\n\r\n getBluetoothMarkerIcon(zoomLevel) {\r\n //48.3 =(175-30)/(19-16) => (max diameter - min diameter)/(maxzoom -minzoom)\r\n let diameter = (zoomLevel - 16) * 48.3 + 30;\r\n diameter = diameter < 30 ? 30 : Math.round(diameter);\r\n return L.divIcon({\r\n iconSize: [diameter, diameter],\r\n iconAnchor: [diameter / 2, diameter / 2],\r\n popupAnchor: [0, 0],\r\n className: 'blueTooth-pin-container',\r\n html: `
                \r\n
                `,\r\n });\r\n }\r\n\r\n /**\r\n * create markup for pinned location popup\r\n * @param {*} lat\r\n * @param {*} lng\r\n * @param {*} time\r\n */\r\n generatePinnedMarkerPopup(lat, lng, time, pinned) {\r\n return `
                \r\n
                \r\n  ${this.gettextCatalog.getString(\r\n 'Location',\r\n )}: \r\n ${this.$filter('limitTo')(lat, 8, 0)}, ${this.$filter('limitTo')(lng, 9, 0)}\r\n
                \r\n  ${this.gettextCatalog.getString(\r\n 'Date',\r\n )}: \r\n ${this.$filter('TableDateFilter')(time)}\r\n ${\r\n pinned\r\n ? `
                \r\n \r\n
                `\r\n : ''\r\n }\r\n
                `;\r\n }\r\n\r\n createPinnedMarker(location = {}, gpsStatus, zoomLevel, canUnpin) {\r\n const icon =\r\n gpsStatus === 'bluetooth-gps'\r\n ? this.getBluetoothMarkerIcon(zoomLevel)\r\n : this.pinnedMarkerIcon;\r\n const [lng, lat] = location.v || [];\r\n const marker = new L.Marker([lat, lng], {\r\n clickable: true,\r\n doubleClickZoom: false,\r\n zIndexOffset: 1000,\r\n icon,\r\n });\r\n\r\n const popupContent = this.generatePinnedMarkerPopup(\r\n lat,\r\n lng,\r\n location.t,\r\n canUnpin && gpsStatus === 'pinned-gps',\r\n );\r\n\r\n /* Adjust marker settings and add the pushpin to its container. */\r\n marker.bindPopup(popupContent, {\r\n closeButton: true,\r\n minWidth: 200,\r\n });\r\n\r\n return marker;\r\n }\r\n\r\n breadcrumbMarkerHtml(heading = 0, pointNumber) {\r\n return `
                \r\n
                \r\n ${pointNumber}\r\n
                `;\r\n }\r\n\r\n getBreadcrumbMarkerIcon(html) {\r\n return L.divIcon({\r\n iconSize: [32, 32],\r\n iconAnchor: [16, 16],\r\n popupAnchor: [0, 0],\r\n className: 'breadcrumb-pushpin-container',\r\n html: html,\r\n });\r\n }\r\n\r\n generatebreadcrumbMarkerPopup(lat, lng, time, attrs = {}) {\r\n const { heading, speed = null, speed_uom = '', distance = null } = attrs;\r\n\r\n const speedRow =\r\n speed != null\r\n ? `\r\n  ${this.gettextCatalog.getString(\r\n 'Speed',\r\n )}: \r\n \r\n ${this.$filter('number')(speed, 2)} ${speed_uom}`\r\n : '';\r\n\r\n const distanceRow =\r\n distance !== null\r\n ? ` \r\n  ${this.gettextCatalog.getString(\r\n 'Distance',\r\n )}: \r\n \r\n ${this.$filter('number')(distance, 2)}' ft`\r\n : '';\r\n\r\n return `
                \r\n
                \r\n \r\n  ${this.gettextCatalog.getString(\r\n 'Location',\r\n )}: \r\n \r\n ${this.$filter('limitTo')(lat, 8, 0)}, ${this.$filter('limitTo')(lng, 9, 0)}\r\n
                \r\n \r\n  ${this.gettextCatalog.getString(\r\n 'Date',\r\n )}: \r\n \r\n ${this.$filter('TableDateFilter')(time)}\r\n
                \r\n \r\n  ${this.gettextCatalog.getString(\r\n 'Heading',\r\n )}: \r\n \r\n ${Math.ceil(100 * heading) / 100}\r\n
                \r\n ${speedRow}\r\n
                \r\n ${distanceRow}\r\n
                \r\n `;\r\n }\r\n\r\n createBreadcrumbMarker(location = {}, index = 0) {\r\n const { heading = 0 } = location.attrs || {};\r\n const [lng, lat] = location.v || [];\r\n const html = this.breadcrumbMarkerHtml(heading, index + 1);\r\n\r\n const marker = new L.Marker([lat, lng], {\r\n title: index,\r\n clickable: true,\r\n doubleClickZoom: false,\r\n zIndexOffset: 1000 - index,\r\n icon: this.getBreadcrumbMarkerIcon(html),\r\n });\r\n return marker;\r\n }\r\n\r\n /**\r\n * draw line between markers\r\n * @param {*} locationsData gps series data history\r\n */\r\n createPolylinesLayer(locationsData = []) {\r\n const pointList = locationsData.map((gpsLocation) => {\r\n const [lng, lat] = gpsLocation.v || [];\r\n return new L.LatLng(lat, lng);\r\n });\r\n\r\n const polyline = new L.polyline(pointList, {\r\n color: this.lineColor,\r\n weight: 2,\r\n opacity: 0.75,\r\n smoothFactor: 1,\r\n });\r\n return polyline;\r\n }\r\n}\r\n","import moment from 'moment';\r\n\r\nexport default class LocationDataHelper {\r\n constructor() {}\r\n\r\n isSameSeries(one, two) {\r\n return one && one.last && one.last.t && two && two.last && two.last.t === one.last.t;\r\n }\r\n isAssetPinned(gpsSeriesAttrs = {}) {\r\n return !!gpsSeriesAttrs['onei3:disable_data'];\r\n }\r\n daysSinceCommunicated(date) {\r\n return moment().diff(moment(date), 'days', true);\r\n }\r\n isValidGpsSeries(gpsSeries = {}) {\r\n return gpsSeries.last && Array.isArray(gpsSeries.last.v);\r\n }\r\n getAssetGpsStatus(gpsSeries, isTseriesAsset) {\r\n const {last, attrs} = gpsSeries || {};\r\n\r\n if (!this.isValidGpsSeries(gpsSeries)) {\r\n return 'no-gps';\r\n }\r\n\r\n if (this.isAssetPinned(attrs)) {\r\n return 'pinned-gps';\r\n }\r\n\r\n if (isTseriesAsset) {\r\n return 'bluetooth-gps';\r\n }\r\n\r\n if (this.daysSinceCommunicated(last.t) > 30) {\r\n return 'no-gps-in-30d';\r\n }\r\n\r\n return 'gps-in-30d';\r\n }\r\n\r\n getGpsCoordinatesByPage(currentPage, pageSize, data = []) {\r\n const begin = (currentPage - 1) * pageSize;\r\n const end = begin + pageSize;\r\n return data.slice(begin, end);\r\n }\r\n}\r\n","import angular from 'angular';\r\nimport template from './asset-location.html';\r\nimport SetAssetLocationTemplate from './pin-location-modal/set-asset-location.modal.html';\r\nimport * as AssetDetailsActions from '../../../../state/asset-details/asset-details.actions';\r\n\r\nimport LocationMapUtil from './asset-location-map.util';\r\nimport Helper from './asset-location.helper';\r\n\r\nfunction AssetLocationController(\r\n $stateParams,\r\n $filter,\r\n $timeout,\r\n $uibModal,\r\n gettextCatalog,\r\n mapService,\r\n usersService,\r\n EquipmentService,\r\n timeSeriesAPI,\r\n moment,\r\n $ngRedux,\r\n) {\r\n 'ngInject';\r\n\r\n //= =========local variables ======\r\n\r\n const self = this;\r\n\r\n self.mapUtil = new LocationMapUtil(mapService, $filter, gettextCatalog);\r\n self.helper = new Helper();\r\n self.store = $ngRedux;\r\n self.EquipmentService = EquipmentService;\r\n self.timeSeriesAPI = timeSeriesAPI;\r\n self.$filter = $filter;\r\n self.$uibModal = $uibModal;\r\n self.$stateParams = $stateParams;\r\n self.$timeout = $timeout;\r\n\r\n self.gpsStatus = '';\r\n self.dataStatus = 'loading-gps';\r\n self.gpsCoordinates = [];\r\n self.lastGpsSeries = null;\r\n self.dates = {\r\n startDate: null,\r\n minStartDate: null,\r\n maxStartDate: null,\r\n endDate: null,\r\n minEndDate: null,\r\n maxEndDate: null,\r\n };\r\n self.dateOption = 1;\r\n self.paging = {\r\n current: 1,\r\n itemsPerPage: 8,\r\n };\r\n self.gpsCoordinatesPerPage = [];\r\n\r\n self.map = null;\r\n self.markersLayer = null;\r\n self.drawLayer = null;\r\n self.userCanSetLocation = false;\r\n\r\n //= =======================\r\n self.$onInit = () => {\r\n self.unsubscribe = self.store.connect(() => ({}), { ...AssetDetailsActions })(self);\r\n\r\n if (!self.locationSeries) {\r\n self.gpsStatus = 'no-gps';\r\n self.dataStatus = 'gps-loaded';\r\n } else {\r\n // this will fire get gps data after set the date range\r\n self.setDatesByOption(self.dateOption);\r\n }\r\n self.userCanSetLocation = usersService.hasRequiredFeatures(['assets.set_location']);\r\n self.createMap();\r\n self.init = true;\r\n };\r\n\r\n self.$onChanges = (changes) => {\r\n // re-act to refresh btn and ignore first time loading\r\n if (self.init) {\r\n const {\r\n refreshing: { currentValue: isRefreshing } = {},\r\n asset: {\r\n currentValue: { locationSeries: currentLocation },\r\n previousValue: { locationSeries: previousLocation },\r\n } = {},\r\n } = changes;\r\n\r\n if (isRefreshing && !currentLocation) {\r\n // Ensures the loading indicator shows when there is no location series so that it\r\n // wont show the map and then hide once it has received the location series data after it was pinned\r\n self.dataStatus = 'loading-gps';\r\n }\r\n\r\n if (\r\n isRefreshing ||\r\n (!!currentLocation && !previousLocation) ||\r\n (!!currentLocation && !!previousLocation && currentLocation.id !== previousLocation.id)\r\n ) {\r\n self.getAssetGpsData();\r\n }\r\n }\r\n };\r\n\r\n self.$onDestroy = () => {\r\n self.unsubscribe();\r\n };\r\n\r\n //= === date picker / options functionality ========\r\n self.startObserver = () => {\r\n self.dateOption = null;\r\n self.updateMinMaxDates();\r\n self.getAssetGpsData();\r\n };\r\n\r\n self.endObserver = () => {\r\n self.dateOption = null;\r\n self.updateMinMaxDates();\r\n self.getAssetGpsData();\r\n };\r\n\r\n self.updateMinMaxDates = () => {\r\n self.dates.minStartDate = moment().subtract(30, 'days').toDate();\r\n self.dates.maxStartDate = self.dates.endDate;\r\n self.dates.minEndDate = self.dates.startDate;\r\n self.dates.maxEndDate = moment().toDate();\r\n };\r\n\r\n self.setDatesByOption = (dateOption) => {\r\n self.dates.startDate = moment().subtract(dateOption, 'days').toDate();\r\n self.dates.endDate = moment().toDate();\r\n self.updateMinMaxDates();\r\n self.getAssetGpsData();\r\n };\r\n //= ==================================\r\n\r\n //= ============== Pagination =====\r\n self.loadPage = (pageNumber) => {\r\n self.gpsCoordinatesPerPage = self.helper.getGpsCoordinatesByPage(\r\n pageNumber,\r\n self.paging.itemsPerPage,\r\n self.gpsCoordinates,\r\n );\r\n };\r\n //= ==========================================\r\n\r\n // create the map to house the breadcrumbs\r\n self.createMap = () => {\r\n if (self.map) return;\r\n // Generate a new map\r\n self.map = mapService.createMapDiv('breadcrumbs-map');\r\n self.map.setView([40.737, -73.923], 3);\r\n // add Full screen map control\r\n L.control.fullscreen().addTo(self.map);\r\n\r\n // `fullscreenchange` Event that's fired when entering or exiting fullscreen.\r\n self.map.on('fullscreenchange', function () {\r\n if (!self.map.isFullscreen() && self.pinDropped) {\r\n self.map.fitBounds(self.markersLayer.getBounds());\r\n }\r\n });\r\n\r\n //\r\n self.map.on('zoomend', function () {\r\n const status = self.gpsStatus;\r\n if (status === 'bluetooth-gps') {\r\n self.updateMapLastLocationMarker(self.lastGpsSeries.last, status);\r\n }\r\n });\r\n\r\n // Add markers layer to the map\r\n self.markersLayer = L.geoJson();\r\n self.map.addLayer(self.markersLayer);\r\n\r\n if (self.userCanSetLocation) {\r\n // Initialize the FeatureGroup to store editable layers\r\n self.drawLayer = new L.FeatureGroup();\r\n self.drawLayer.addTo(self.map);\r\n const drawControl = self.mapUtil.createDrawPinControl(self.drawLayer);\r\n drawControl.addTo(self.map);\r\n\r\n self.addMapDrawPinEventHandlers();\r\n }\r\n\r\n angular\r\n .element(document.querySelector('#breadcrumbs-map'))\r\n .on('click', 'button.location-unpin', () => {\r\n self.unpinLocation();\r\n });\r\n };\r\n\r\n self.addMapDrawPinEventHandlers = () => {\r\n self.map.on('draw:canceled', function () {\r\n self.drawGpsMapMarkers();\r\n });\r\n\r\n // A map event that the user has started drawing on the map\r\n self.map.on('draw:drawstart', function () {\r\n // User is still in drawing mode\r\n self.pinDropped = false;\r\n // Clear layers from the map\r\n self.markersLayer.clearLayers();\r\n self.drawLayer.clearLayers();\r\n // drawing started, so disable panning and zooming\r\n // Otherwise, the map moves around while trying to draw\r\n self.map.touchZoom.disable();\r\n self.map.doubleClickZoom.disable();\r\n self.map.scrollWheelZoom.disable();\r\n self.map.dragging.disable();\r\n });\r\n\r\n // A map event that the user has stopped drawing on the map\r\n self.map.on('draw:drawstop', function (event) {\r\n // self.pinDropped is used to check whether the user clicked the cancel\r\n // label on the marker drawing tool.\r\n // If the user places the pin draw:created is called\r\n // If the user cancels drawing before dropping the pin then we\r\n // simply re-draw the pins\r\n const type = event.layerType;\r\n if (type === 'marker') {\r\n if (self.pinDropped === false) {\r\n self.drawGpsMapMarkers();\r\n }\r\n }\r\n // drawing stopped, so re-enable panning and zooming\r\n self.map.touchZoom.enable();\r\n self.map.doubleClickZoom.enable();\r\n self.map.scrollWheelZoom.enable();\r\n self.map.dragging.enable();\r\n // Bring back the markers if cancelled.\r\n self.map.addLayer(self.markersLayer);\r\n });\r\n\r\n // listening for drawing events\r\n self.map.on('draw:created', function (event) {\r\n // User has dropped the pin and stopped drawing\r\n self.pinDropped = true;\r\n if (event.layerType === 'marker') {\r\n // get dropped location\r\n const latlng = event.layer.getLatLng();\r\n self.openAssetLocationConfirmModal(latlng);\r\n self.drawLayer.clearLayers();\r\n }\r\n });\r\n };\r\n\r\n self.getAssetGpsData = () => {\r\n if (!self.locationSeries) return;\r\n const gpsSeriesId = self.locationSeries.id;\r\n // this ensure there is a start and end date when the user clears the date pickers\r\n if (!self.dates.startDate) {\r\n self.dates.startDate = new Date();\r\n self.dates.startDate.setDate(self.dates.startDate.getDate() - 30); // 30 days ago\r\n }\r\n if (!self.dates.endDate) self.dates.endDate = new Date(); // current date\r\n\r\n const { startDate } = self.dates;\r\n const { endDate } = self.dates;\r\n\r\n // Adjust the start and end times in all scenarios except for when the user selected 24hrs\r\n // so that all other scenarios will start at the time 0:00:00:00 and end at 23:59:59:999 instead of both using the time it was ran on the user computer\r\n // example if the user selects jan 1 2001 for start and end but they run the search at 11:30 it will get the whole day instead of only in the millisecond it was run at\r\n if (self.dateOption !== 1) {\r\n startDate.setHours(0, 0, 0, 0);\r\n endDate.setHours(23, 59, 59, 999);\r\n }\r\n self.getGpsSeriesData(gpsSeriesId, startDate, endDate);\r\n };\r\n\r\n //= =========== gps data / history functionality ========================\r\n self.getGpsSeriesData = (gpsSeriesId, startDate, endDate) => {\r\n self.dataStatus = 'loading-gps';\r\n self.EquipmentService.getEquipSeriesData(\r\n [gpsSeriesId],\r\n [moment(startDate.toISOString()).toDate(), moment(endDate.toISOString()).toDate()],\r\n )\r\n .then((response = {}) => {\r\n const [gpSeriesResult] = response.data || [];\r\n const { series, data } = gpSeriesResult || {};\r\n\r\n self.gpsStatus = self.helper.getAssetGpsStatus(\r\n series,\r\n self.asset.networkTechnology === 'bluetooth',\r\n );\r\n self.lastGpsSeries = series;\r\n // fire an action to update gps in asset info bar\r\n if (series && !self.helper.isSameSeries(series, self.locationSeries)) {\r\n self.updateAssetLocation(series.last);\r\n }\r\n self.gpsCoordinates = self.setupLocationHistory(data);\r\n self.paging.current = 1;\r\n self.loadPage(1);\r\n self.drawGpsMapMarkers();\r\n self.dataStatus = 'gps-loaded';\r\n })\r\n .catch((e) => {\r\n self.dataStatus = 'error-gps';\r\n handleError(e);\r\n throw e;\r\n });\r\n };\r\n\r\n self.drawGpsMapMarkers = () => {\r\n const status = self.gpsStatus;\r\n\r\n self.markersLayer.clearLayers();\r\n if (status !== 'no-gps') {\r\n if (status === 'gps-in-30d') {\r\n self.gpsCoordinates.length\r\n ? self.updateMapLocationHistoryMarkers(self.gpsCoordinates)\r\n : self.updateMapLastLocationMarker(self.lastGpsSeries.last);\r\n } else if (['pinned-gps', 'bluetooth-gps', 'no-gps-in-30d'].includes(status)) {\r\n self.updateMapLastLocationMarker(self.lastGpsSeries.last, status);\r\n }\r\n // fit markers to the map container on loading of self.markersLayer layer.\r\n self.map.fitBounds(self.markersLayer.getBounds());\r\n }\r\n };\r\n //= ===============================================\r\n\r\n self.openMarkerPopup = (selectedMarker) => {\r\n self.markersLayer.eachLayer(function (marker) {\r\n if (marker.options.title === selectedMarker.title) {\r\n marker.openPopup();\r\n }\r\n });\r\n };\r\n\r\n /// ====================== ++++++\r\n\r\n self.updateMapLastLocationMarker = (lastLocation, gpsStatus) => {\r\n self.markersLayer.clearLayers();\r\n /* Custom marker to display last known location. */\r\n const zoomLevel = self.map.getZoom();\r\n const marker = self.mapUtil.createPinnedMarker(\r\n lastLocation,\r\n gpsStatus,\r\n zoomLevel,\r\n self.userCanSetLocation,\r\n );\r\n marker.on('mouseover', function () {\r\n this.openPopup();\r\n });\r\n marker.addTo(self.markersLayer);\r\n\r\n /* Add self.markersLayer to the map and fit the zoom to the screen. */\r\n self.map.addLayer(self.markersLayer);\r\n };\r\n\r\n self.updateMapLocationHistoryMarkers = (locationHistory = []) => {\r\n self.markersLayer.clearLayers();\r\n locationHistory.forEach((location, index) => {\r\n // Implement a custom marker to show every point in the gpsCoordinates object\r\n const marker = self.mapUtil.createBreadcrumbMarker(location, index);\r\n\r\n // Create a popup that contains the data related to eack particular marker.\r\n const [lng, lat] = location.v || [];\r\n const popupContent = self.mapUtil.generatebreadcrumbMarkerPopup(\r\n lat,\r\n lng,\r\n location.t,\r\n location.attrs,\r\n );\r\n\r\n // Attach our popup to every marker that hits the map\r\n marker.bindPopup(popupContent, {\r\n closeButton: true,\r\n minWidth: 200,\r\n });\r\n // allow a popup to show on hover over marker\r\n marker.on('mouseover', function () {\r\n this.openPopup();\r\n });\r\n // Add markers to self.markersLayer layer\r\n marker.addTo(self.markersLayer);\r\n }); // end loop to populate map with custom markers\r\n\r\n // Create polyLines\r\n const polylines = self.mapUtil.createPolylinesLayer(locationHistory);\r\n // add polylines to the map\r\n polylines.addTo(self.markersLayer);\r\n };\r\n\r\n self.setupLocationHistory = (locationHistory = []) => {\r\n // sort with most recent\r\n // making sure to have attrs object with heading, speed, title\r\n const updatedLocation = locationHistory.reverse().map((location = {}, index) => {\r\n const { attrs = {} } = location;\r\n location.attrs = { ...attrs, heading: attrs.heading || 0, speed: attrs.speed || 0 };\r\n location.title = index;\r\n return location;\r\n });\r\n return updatedLocation;\r\n };\r\n\r\n //= ====== export csv data ===================== +++\r\n self.getCsvData = function () {\r\n const headers = {\r\n Timestamp: 'Timestamp',\r\n Latitude: 'Latitude',\r\n Longitude: 'Longitude',\r\n };\r\n\r\n const csvData = self.gpsCoordinates.map((coord) => {\r\n const timestamp = self.$filter('TableDateFilter')(coord.t);\r\n const [lng, lat] = coord.v || [];\r\n return {\r\n Timestamp: timestamp,\r\n Latitude: lat,\r\n Longitude: lng,\r\n };\r\n });\r\n\r\n return [headers, ...csvData];\r\n };\r\n\r\n self.getCsvFileName = function () {\r\n const date = moment().format('YY-MM-DDTHH:mm:ss');\r\n return `${self.asset.name}_LocationHistory_${date}.csv`;\r\n };\r\n //= ===================================\r\n\r\n function handleError(error = {}) {\r\n const { data = {}, status = '' } = error;\r\n const message = `${data.message} - ${status}`;\r\n const errorMsg = `${gettextCatalog.getString(\r\n 'An error occurred while retrieving location information',\r\n )} ${message} ${gettextCatalog.getString('. Please try again later.')}`;\r\n self.errorText = errorMsg;\r\n }\r\n\r\n //= ======== pinning functions============================\r\n self.setAssetLocation = ({ lat, lng }) => {\r\n self.dataStatus = 'loading-gps';\r\n const coordinates = {\r\n latitude: lat,\r\n longitude: lng,\r\n };\r\n\r\n self.timeSeriesAPI\r\n .setLocation(\r\n self.locationSeries?.id,\r\n self.gpsStatus === 'pinned-gps',\r\n coordinates,\r\n self.asset.id,\r\n )\r\n .then(() => {}, handleError)\r\n .finally(() => {\r\n if (!self.locationSeries) {\r\n self.refreshAssetdashBoardData(self.asset.id);\r\n } else {\r\n self.getAssetGpsData();\r\n }\r\n });\r\n };\r\n\r\n self.unpinLocation = () => {\r\n self.dataStatus = 'loading-gps';\r\n self.timeSeriesAPI\r\n .setLocation(self.locationSeries.id)\r\n .then(() => {}, handleError)\r\n .finally(() => {\r\n self.getAssetGpsData();\r\n });\r\n };\r\n\r\n // Create a modal - User must confirm they want to set the Asset location\r\n self.openAssetLocationConfirmModal = function (latLng) {\r\n const appendToElement = self.map.isFullscreen()\r\n ? angular.element('#breadcrumbs-map')\r\n : undefined;\r\n self.$uibModal\r\n .open({\r\n animation: true,\r\n bindToController: true,\r\n template: SetAssetLocationTemplate,\r\n controller: 'SetAssetLocationController',\r\n resolve: {\r\n isAssetLocationConfirmed: () => false,\r\n pinnedAssetEvent: () => latLng,\r\n pinnedAssetModel: () => {},\r\n },\r\n size: 'md',\r\n appendTo: appendToElement,\r\n })\r\n\r\n // modal dialog result - called when user clicks Confirm Button\r\n .result.then((pinnedAssetModel) => {\r\n if (pinnedAssetModel.isConfirmed === true) {\r\n self.setAssetLocation(latLng);\r\n } else {\r\n self.drawGpsMapMarkers();\r\n }\r\n })\r\n .catch(() => {\r\n self.drawGpsMapMarkers();\r\n });\r\n };\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetLocationController,\r\n controllerAs: 'lcVm',\r\n bindings: {\r\n locationSeries: '<',\r\n asset: '<',\r\n refreshing: '<',\r\n },\r\n};\r\n","import template from './asset-alerts.component.html';\r\nimport * as AssetDetailsActions from '../../../../state/asset-details/asset-details.actions';\r\nclass AssetAlertsController {\r\n constructor($ngRedux) {\r\n 'ngInject';\r\n this.store = $ngRedux;\r\n this.onClearingAlert = this.onClearingAlert.bind(this);\r\n }\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(() => ({}), {...AssetDetailsActions})(this);\r\n }\r\n $onChanges() {}\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n onClearingAlert() {\r\n this.getAssetData(this.asset.id);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetAlertsController,\r\n //not useing vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'alertVm',\r\n bindings: {\r\n loading: '<',\r\n refreshing: '<',\r\n asset: '<'\r\n }\r\n};\r\n","import template from './asset-maintenance.component.html';\r\nimport * as AssetDetailsActions from '../../../../state/asset-details/asset-details.actions';\r\n\r\nclass AssetMaintenanceController {\r\n constructor(MaintenanceService, $ngRedux, $stateParams, gettext) {\r\n 'ngInject';\r\n this.MaintenanceService = MaintenanceService;\r\n this.store = $ngRedux;\r\n this.$stateParams = $stateParams;\r\n this.gettext = gettext;\r\n\r\n this.activePlans = [];\r\n this.history = [];\r\n\r\n //paging\r\n this.itemsPerPage = 3;\r\n this.currentPage = {};\r\n this.currentPage.history = 1;\r\n this.currentPage.status = 1;\r\n this.maxSize = 1;\r\n }\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(() => ({}), {...AssetDetailsActions})(this);\r\n this.getMaintenanceHistory();\r\n }\r\n $onChanges(changes) {\r\n const {asset} = changes;\r\n const {maintenancePlans = []} = asset.currentValue;\r\n this.activePlans = maintenancePlans;\r\n }\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n completeMaintenancePlan(activePlane) {\r\n let equipmentData = {\r\n data: {\r\n id: this.asset.id,\r\n attributes: {name: this.asset.name}\r\n }\r\n };\r\n\r\n let planData = {\r\n id: activePlane.id,\r\n attributes: {name: activePlane.name}\r\n };\r\n this.MaintenanceService.showPopupForEquipmentPlan(equipmentData.data, planData)\r\n .result.then(() => {\r\n this.getAssetData(this.asset.id);\r\n })\r\n .catch(() => {});\r\n }\r\n getMaintenanceHistory() {\r\n this.loadingHistory = true;\r\n this.MaintenanceService.getHistory(null, [this.$stateParams.equipmentId])\r\n .then(\r\n response => {\r\n //show user text for the history instead of true/false\r\n const data = response.data || [];\r\n data.forEach(item => {\r\n item.completed = item.completed ? this.gettext('Completed') : this.gettext('Incomplete');\r\n });\r\n this.history = data;\r\n },\r\n () => {\r\n this.error = this.gettext('An error occurred while retrieving maintenance history for this asset.');\r\n }\r\n )\r\n .finally(() => {\r\n this.loadingHistory = false;\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetMaintenanceController,\r\n //not using vm , when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'maintnanceVm',\r\n bindings: {\r\n loading: '<',\r\n refreshing: '<',\r\n asset: '<'\r\n }\r\n};\r\n","import template from './device-diagnostics.component.html';\r\n\r\nconst EVENT_TRACKING_NAME = 'assetDetailDiagnostic';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n moreDeviceDetails: 'moreDeviceDetails',\r\n};\r\n\r\nclass AssetDeviceController {\r\n constructor(deviceDiagnosticService) {\r\n 'ngInject';\r\n this.deviceDiagnosticService = deviceDiagnosticService;\r\n this._cellSignal = undefined;\r\n }\r\n\r\n $onInit() {\r\n this.getCellSignalInfo();\r\n this.init = true;\r\n }\r\n\r\n $onChanges(changes) {\r\n const { refreshing } = changes;\r\n if (refreshing && refreshing.currentValue === true && this.init) {\r\n this.getCellSignalInfo();\r\n }\r\n }\r\n\r\n $onDestroy() {}\r\n\r\n getCellSignalInfo() {\r\n if (this.asset && this.asset.esn) {\r\n this.deviceDiagnosticService\r\n .getLastReportedCellSignalSeries(this.asset.esn)\r\n .then(data => {\r\n this._cellSignal = data;\r\n })\r\n .catch(() => {\r\n this._cellSignal = { status: this.deviceDiagnosticService.signalStatus.Error };\r\n });\r\n }\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n }\r\n\r\n clickedMoreDetailsBtn() {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.moreDeviceDetails,\r\n });\r\n }\r\n\r\n get packagesText() {\r\n const { packages = [] } = this.asset || {};\r\n const basePackages = packages.filter(p => !p.isModule);\r\n const modulePackages = packages.filter(p => p.isModule);\r\n //to make sure base package come first.\r\n return [...basePackages, ...modulePackages].map(p => p.name).join(', ');\r\n }\r\n\r\n get deviceAttrs() {\r\n const { device = {} } = this.asset || {};\r\n const { firmware_ver, config_ver } = device.attrs || {};\r\n return {\r\n firmwareVer: firmware_ver,\r\n configVer: config_ver,\r\n };\r\n }\r\n\r\n get gpsSignal() {\r\n const { locationSeries } = this.asset || {};\r\n return this.deviceDiagnosticService.getGpsStatusInfo(locationSeries);\r\n }\r\n\r\n\r\n get cellSignal() {\r\n return this._cellSignal;\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetDeviceController,\r\n //not using vm as when using ui-route it is conflicting with parent vm\r\n //https://github.com/johnpapa/angular-styleguide/issues/577#issue-115275989\r\n controllerAs: 'deviceVm',\r\n bindings: {\r\n refreshing: '<',\r\n asset: '<',\r\n },\r\n};\r\n","export default function EquipmentDetailImageEditModalController(\r\n $scope,\r\n $uibModalInstance,\r\n image,\r\n MediaService,\r\n gettextCatalog\r\n) {\r\n 'ngInject';\r\n\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.image = {};\r\n $scope.description = null;\r\n\r\n const onLoad = () => {\r\n $scope.image = image;\r\n\r\n $scope.description = image.description || '';\r\n };\r\n\r\n onLoad();\r\n\r\n $scope.save = function () {\r\n\r\n $scope.loading = true;\r\n $scope.errorFlag = false;\r\n\r\n $scope.image.attributes = {\r\n ...$scope.image.attributes,\r\n description: $scope.description,\r\n };\r\n\r\n MediaService.updateImage($scope.image)\r\n .then(function() {\r\n $scope.loading = false;\r\n $uibModalInstance.close($scope.image); //pass back image to update the included model\r\n })\r\n .catch(function(error) {\r\n let errorMsg = gettextCatalog.getString('An error occurred while editing the image. Please try again later.');\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg =\r\n gettextCatalog.getString('An error occurred while editing the image: ') +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close();\r\n };\r\n}\r\n","import Auth from '../../../../../auth';\r\n\r\nexport default function EquipmentDetailsImageUploadController(\r\n $scope,\r\n $uibModalInstance,\r\n fileUploaderService,\r\n equipmentId\r\n) {\r\n 'ngInject';\r\n\r\n $scope.isProfileImage = false;\r\n $scope.fileTypeValidation = true;\r\n $scope.errorFlagMaxImgs = false;\r\n $scope.errorFlagMaxImgSize = false;\r\n $scope.errorText = '';\r\n\r\n $scope.uploader = fileUploaderService;\r\n\r\n $scope.uploader.url = '/api/media/images';\r\n\r\n $scope.uploader.headers = {\r\n Authorization: Auth.getAuthorizationHeader()\r\n };\r\n\r\n $scope.uploader.removeAfterUpload = true;\r\n\r\n $scope.uploader.filters.push({\r\n name: 'fileTypeFilter',\r\n fn: function(item) {\r\n $scope.errorFlagMaxImgs = false;\r\n $scope.errorFlagMaxImgSize = false;\r\n\r\n if (/\\/(png|jpeg|jpg)$/.test(item.type)) {\r\n $scope.fileTypeValidation = true;\r\n return true;\r\n } else {\r\n $scope.fileTypeValidation = false;\r\n $scope.uploading = false;\r\n $scope.uploader.clearQueue();\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n $scope.uploader.onSuccessItem = function(data, response) {\r\n if ($scope.isProfileImage) {\r\n response.data.isNewProfilePicture = true;\r\n }\r\n\r\n $uibModalInstance.close(response);\r\n };\r\n\r\n $scope.uploader.onErrorItem = function(item, response) {\r\n //unfortunately there is no way to stop the error from getting thrown in the console with this library\r\n $scope.uploading = false;\r\n\r\n if (_.includes(response.message, 'Maximum number')) {\r\n $scope.errorFlagMaxImgs = true;\r\n } else {\r\n $scope.errorFlagMaxImgSize = true;\r\n }\r\n $scope.fileTypeValidation = true;\r\n };\r\n\r\n $scope.uploader.onBeforeUploadItem = function(item) {\r\n if (equipmentId) {\r\n item.formData.push({\r\n equipmentId: equipmentId\r\n });\r\n }\r\n\r\n if ($scope.description) {\r\n item.formData.push({\r\n description: $scope.description\r\n });\r\n }\r\n\r\n if ($scope.isProfileImage) {\r\n item.formData.push({\r\n isProfileImage: true\r\n });\r\n }\r\n };\r\n\r\n $scope.uploadImage = function() {\r\n $scope.uploading = true;\r\n $scope.uploader.uploadAll();\r\n };\r\n\r\n $scope.cancel = function() {\r\n $scope.uploader.clearQueue();\r\n $uibModalInstance.close();\r\n };\r\n}\r\n","export default function SetAssetLocationModalController(\r\n\t$scope,\r\n\t$uibModalInstance,\r\n\t$state,\r\n\tgettextCatalog,\r\n\tisAssetLocationConfirmed,\r\n\tpinnedAssetModel,\r\n\tpinnedAssetEvent\r\n) {\r\n 'ngInject';\r\n\r\n\t$scope.pinnedAssetEvent = pinnedAssetEvent;\r\n\t$scope.isAssetLocationConfirmed = isAssetLocationConfirmed;\r\n\r\n\t$scope.pinnedAssetModel = {\r\n\t\tevent: pinnedAssetEvent,\r\n\t\tisConfirmed: $scope.isAssetLocationConfirmed\r\n\t};\r\n\r\n\t$scope.ok = function() {\r\n\t\t$scope.pinnedAssetModel.isConfirmed = true;\r\n\t\t$uibModalInstance.close($scope.pinnedAssetModel);\r\n\t};\r\n\r\n\t$scope.cancel = function() {\r\n\t\t$scope.pinnedAssetModel.isConfirmed = false;\r\n\t\t$uibModalInstance.close($scope.pinnedAssetModel);\r\n\t};\r\n\r\n\t$scope.$on('$locationChangeStart', function(event) {\r\n\t\t$scope.cancel();\r\n\t\tevent.preventDefault();\r\n\t});\r\n}\r\n","import angular from 'angular';\r\n\r\nimport CommandModule from './tabs/commands/commands.module';\r\n\r\nimport AssetDetailsDashboardComponent, { AssetDetailsDashboardController } from './asset-details-dashboard.component';\r\nimport AssetDataComponent from './tabs/data/asset-data.component';\r\nimport SeriesDataChartComponent from './tabs/data/chart/series-chart.component';\r\nimport SeriesDataTableComponent from './tabs/data/series-table/series-table.component';\r\nimport AssetDetailsSectionComponent from './tabs/details/asset-details.component';\r\nimport AssetLocationComponent from './tabs/location/asset-location.component';\r\nimport AssetAlertsComponent from './tabs/alerts/asset-alerts.component';\r\nimport AssetMaintenanceComponent from './tabs/maintenance/asset-maintenance.component';\r\nimport AssetDeviceDiagnosticsComponent from './tabs/device-diagnostics/device-diagnostics.component';\r\nimport AssetImageEditModalController from './tabs/details/images/asset-image-edit.modal.controller';\r\nimport AssetImageUploadController from './tabs/details/images/asset-image-upload.modal.controller';\r\nimport SetAssetLocationController from './tabs/location/pin-location-modal/set-asset-location.modal.controller';\r\n\r\nconst assetDetailsDashboardModule = angular.module('asset.details.dashbord', ['ui.bootstrap', CommandModule]);\r\n\r\nassetDetailsDashboardModule\r\n .controller('AssetDetailsDashboardController', AssetDetailsDashboardController)\r\n .controller('AssetImageEditController', AssetImageEditModalController)\r\n .controller('AssetImageUploadController', AssetImageUploadController)\r\n .controller('SetAssetLocationController', SetAssetLocationController)\r\n .component('assetDetailsDashboard', AssetDetailsDashboardComponent)\r\n .component('assetDataOverview', AssetDataComponent)\r\n .component('seriesChart', SeriesDataChartComponent)\r\n .component('seriesTable', SeriesDataTableComponent)\r\n .component('assetDetailsSection', AssetDetailsSectionComponent)\r\n .component('assetLocation', AssetLocationComponent)\r\n .component('assetAlerts', AssetAlertsComponent)\r\n .component('assetMaintenance', AssetMaintenanceComponent)\r\n .component('assetDeviceDiagnostics', AssetDeviceDiagnosticsComponent);\r\n\r\nexport default assetDetailsDashboardModule.name;\r\n","export default function sitesRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('sites', {\r\n url: '/sites',\r\n template: ``,\r\n redirectTo: 'sites.list',\r\n ncyBreadcrumb: {\r\n label: \"{{'Sites' | translate}}\",\r\n },\r\n requiredFeatures: ['sites'],\r\n })\r\n .state('sites.list', {\r\n url: '',\r\n template: '',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n })\r\n .state('sites.view', {\r\n url: '/:id',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: '{{siteName}}',\r\n },\r\n });\r\n}\r\n","import template from './table.html';\r\n\r\nclass Table {\r\n constructor($sce, $timeout) {\r\n 'ngInject';\r\n this.$sce = $sce;\r\n this.$timeout = $timeout;\r\n this.previousCheckIndex = -1;\r\n }\r\n\r\n checkClicked(event, item, index) {\r\n event.stopPropagation();\r\n this.$timeout(() => {\r\n if (item && this.previousCheckIndex !== -1 && event.shiftKey && item.checked) {\r\n let after = this.previousCheckIndex < index ? this.previousCheckIndex : index;\r\n let before = this.previousCheckIndex < index ? index : this.previousCheckIndex;\r\n\r\n this.list.forEach((item, itemIndex) => {\r\n if (itemIndex > after && itemIndex < before) {\r\n item.checked = true;\r\n }\r\n });\r\n }\r\n\r\n this.onCheckChange(item, index);\r\n this.previousCheckIndex = item?.checked ? index : -1;\r\n });\r\n }\r\n\r\n itemClicked(event, item, index) {\r\n // Timeout is need to make sure that the item checked variable has the updated value before calling onItemClick\r\n this.$timeout(() => {\r\n if (this.onItemClick) this.onItemClick(event, item, index);\r\n }, 0);\r\n }\r\n\r\n isBoolean(value) {\r\n return typeof value === 'boolean';\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: Table,\r\n controllerAs: 'table',\r\n bindings: {\r\n list: '<',\r\n columns: '<',\r\n onItemClick: '<',\r\n onSortChange: '<',\r\n onCheckChange: '<',\r\n allChecked: '=',\r\n actionItems: '<',\r\n hasSelected: '<',\r\n searchString: '<',\r\n },\r\n};\r\n","const createCustomMarker = ({ OverlayView = google.maps.OverlayView, ...args }) => {\r\n class CustomMarker extends OverlayView {\r\n constructor() {\r\n super();\r\n this.latlng = args.latlng;\r\n this.html = args.html;\r\n this.map = args.map;\r\n this.infoPopup = args.infoPopup;\r\n this.info = args.info;\r\n this.setMap(args.map);\r\n this.div = null;\r\n }\r\n\r\n createDiv() {\r\n this.div = document.createElement('div');\r\n this.div.style.position = 'absolute';\r\n\r\n if (this.html) {\r\n this.div.innerHTML = this.html;\r\n }\r\n\r\n google.maps.event.addDomListener(this.div, 'click', (event) => {\r\n google.maps.event.trigger(this, 'click');\r\n });\r\n }\r\n\r\n appendDivToOverlay() {\r\n this.getPanes().overlayMouseTarget.appendChild(this.div);\r\n\r\n if (this.infoPopup && this.info) {\r\n google.maps.event.addDomListener(this.div, 'mouseover', () => {\r\n this.infoPopup.setContent(this.info);\r\n this.infoPopup.open(this.map, this);\r\n });\r\n }\r\n }\r\n\r\n positionDiv() {\r\n const point = this.getProjection().fromLatLngToDivPixel(this.latlng);\r\n if (point) {\r\n this.div.style.left = `${point.x - this.div.offsetWidth / 2}px`;\r\n this.div.style.top = `${point.y - this.div.offsetHeight / 2}px`;\r\n }\r\n }\r\n\r\n draw() {\r\n if (!this.div) {\r\n this.createDiv();\r\n this.appendDivToOverlay();\r\n }\r\n this.positionDiv();\r\n }\r\n\r\n remove() {\r\n if (this.div) {\r\n this.div.parentNode.removeChild(this.div);\r\n this.div = null;\r\n }\r\n }\r\n\r\n getPosition() {\r\n return this.latlng;\r\n }\r\n\r\n getDraggable() {\r\n return false;\r\n }\r\n }\r\n\r\n return new CustomMarker();\r\n};\r\n\r\nexport default createCustomMarker;\r\n","import { Loader } from '@googlemaps/js-api-loader';\r\nimport MarkerClusterer from '@googlemaps/markerclustererplus';\r\nimport createCustomMarker from './custom-marker';\r\nimport createClusterMarker from './cluster-marker';\r\nimport createAssetMarker from './asset-marker';\r\n\r\nconst GOOGLE_MAPS_API_KEY = 'AIzaSyA8Ihrp4YxglEPZclNTGDNf-9omGNwinC4';\r\nconst INIT_ZOOM_LEVEL = 2;\r\nconst CLUSTER_IMG_PATH = 'Content/google-maps/m';\r\nconst POLYGON_SETTINGS = {\r\n strokeColor: '#1990bf',\r\n fillColor: '#1990bf',\r\n fillOpacity: 0.35,\r\n};\r\nconst MAP_OPTIONS = {\r\n center: {\r\n lat: 0,\r\n lng: 0,\r\n },\r\n zoom: INIT_ZOOM_LEVEL,\r\n minZoom: 3,\r\n mapTypeId: 'roadmap',\r\n styles: [\r\n {\r\n featureType: 'all',\r\n elementType: 'geometry.fill',\r\n stylers: [\r\n {\r\n weight: '2.00',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'all',\r\n elementType: 'geometry.stroke',\r\n stylers: [\r\n {\r\n color: '#9c9c9c',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'all',\r\n elementType: 'labels.text',\r\n stylers: [\r\n {\r\n visibility: 'on',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'landscape',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n color: '#f2f2f2',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'landscape',\r\n elementType: 'geometry.fill',\r\n stylers: [\r\n {\r\n color: '#ffffff',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'landscape.man_made',\r\n elementType: 'geometry.fill',\r\n stylers: [\r\n {\r\n color: '#ffffff',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'poi',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n visibility: 'off',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n saturation: -100,\r\n },\r\n {\r\n lightness: 45,\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road',\r\n elementType: 'geometry.fill',\r\n stylers: [\r\n {\r\n color: '#eeeeee',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#7b7b7b',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road',\r\n elementType: 'labels.text.stroke',\r\n stylers: [\r\n {\r\n color: '#ffffff',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road.highway',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n visibility: 'simplified',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'road.arterial',\r\n elementType: 'labels.icon',\r\n stylers: [\r\n {\r\n visibility: 'off',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'transit',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n visibility: 'off',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'all',\r\n stylers: [\r\n {\r\n color: '#46bcec',\r\n },\r\n {\r\n visibility: 'on',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'geometry.fill',\r\n stylers: [\r\n {\r\n color: '#c8d7d4',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#070707',\r\n },\r\n ],\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'labels.text.stroke',\r\n stylers: [\r\n {\r\n color: '#ffffff',\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nclass GoogleMapsService {\r\n constructor() {\r\n this.loader = new Loader({\r\n apiKey: GOOGLE_MAPS_API_KEY,\r\n version: 'weekly',\r\n libraries: ['places', 'geometry', 'drawing'],\r\n });\r\n\r\n this.map = null;\r\n this.markers = [];\r\n this.drawingManager = null;\r\n this.polygons = [];\r\n this.markerOverlays = [];\r\n this.assetMap = null;\r\n //hold ref to its component\r\n this.vm = null;\r\n this.scriptLoaded = false;\r\n this.loadMapScript();\r\n }\r\n\r\n loadMapScript() {\r\n return new Promise((resolve, reject) => {\r\n if (this.scriptLoaded) {\r\n resolve();\r\n } else {\r\n this.loader\r\n .load()\r\n .then(() => {\r\n this.scriptLoaded = true;\r\n resolve();\r\n })\r\n .catch((e) => {\r\n reject(e);\r\n });\r\n }\r\n });\r\n }\r\n\r\n createMap(options = {}) {\r\n return new Promise((resolve, reject) => {\r\n this.loadMapScript()\r\n .then(() => {\r\n const { el } = options;\r\n\r\n if (el !== null) {\r\n const { popupEl, allowEditGeoZone, mapType } = options;\r\n const mapTypeId = mapType === 'satellite' ? 'satellite' : 'roadmap';\r\n const mapOptions = { ...MAP_OPTIONS, mapTypeId };\r\n this.map = new google.maps.Map(el, mapOptions);\r\n\r\n this.markerCluster = new MarkerClusterer(this.map, [], {\r\n imagePath: CLUSTER_IMG_PATH,\r\n clusterClass: 'site-marker-hidden',\r\n });\r\n\r\n this.markerCluster.addListener('clusteringend', (mc) => {\r\n this.renderMarkers(mc);\r\n });\r\n\r\n this.allowEditGeoZone = allowEditGeoZone || false;\r\n\r\n if (allowEditGeoZone) this.initDrawingManager();\r\n\r\n this.infoPopup = new google.maps.InfoWindow({\r\n content: popupEl || '',\r\n });\r\n\r\n google.maps.event.addListener(this.map, 'click', () => {\r\n this.infoPopup.close();\r\n });\r\n }\r\n\r\n resolve();\r\n })\r\n .catch((e) => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n initDrawingManager() {\r\n this.drawingManager = new google.maps.drawing.DrawingManager({\r\n drawingControlOptions: {\r\n position: google.maps.ControlPosition.TOP_CENTER,\r\n drawingModes: [\r\n google.maps.drawing.OverlayType.POLYGON,\r\n google.maps.drawing.OverlayType.RECTANGLE,\r\n ],\r\n },\r\n polygonOptions: {\r\n editable: true,\r\n ...POLYGON_SETTINGS,\r\n },\r\n rectangleOptions: {\r\n editable: true,\r\n ...POLYGON_SETTINGS,\r\n },\r\n });\r\n\r\n const handlePolygonComplete = (polygon) => {\r\n this.drawingManager.setDrawingMode(null);\r\n\r\n if (this.polygons.length > 0) {\r\n this.polygons.forEach((item) => {\r\n item.setMap(null);\r\n });\r\n\r\n this.polygons = [];\r\n }\r\n\r\n this.polygons.push(polygon);\r\n this.initPolygon(polygon);\r\n };\r\n\r\n const polygonComplete = (polygon) => {\r\n handlePolygonComplete(polygon);\r\n this.vm.showApplyChanges();\r\n };\r\n const rectangleComplete = (rectangle) => {\r\n //convert rectangle to polygon\r\n const ne = rectangle.getBounds().getNorthEast();\r\n const sw = rectangle.getBounds().getSouthWest();\r\n const points = [\r\n [sw.lng(), ne.lat()],\r\n [sw.lng(), sw.lat()],\r\n [ne.lng(), sw.lat()],\r\n [ne.lng(), ne.lat()],\r\n ];\r\n const polyPoints = (points || []).map(([lng, lat]) => new google.maps.LatLng(lat, lng));\r\n rectangle.setMap(null);\r\n const polygon = new google.maps.Polygon({\r\n path: polyPoints,\r\n ...POLYGON_SETTINGS,\r\n });\r\n\r\n polygon.setMap(this.map);\r\n polygonComplete(polygon);\r\n };\r\n\r\n //TODO move these events to the map component\r\n google.maps.event.addListener(this.drawingManager, 'polygoncomplete', polygonComplete);\r\n google.maps.event.addListener(this.drawingManager, 'rectanglecomplete', rectangleComplete);\r\n\r\n this.drawingManager.setMap(this.map);\r\n\r\n google.maps.event.addListener(this.map, 'click', () => {\r\n this.polygons.forEach((item) => {\r\n this.setPolygonEditable(item, false);\r\n });\r\n });\r\n }\r\n\r\n setPolygonsEditMode(mode = false) {\r\n this.polygons.forEach((item) => {\r\n this.setPolygonEditable(item, mode);\r\n });\r\n }\r\n\r\n setPolygonEditable(polygon, mode = false) {\r\n if (!polygon) return;\r\n const polygonUpdated = () => {\r\n this.vm.showApplyChanges();\r\n };\r\n\r\n const path = polygon.getPath();\r\n\r\n if (mode) {\r\n polygon.setEditable(true);\r\n google.maps.event.addListener(path, 'set_at', polygonUpdated);\r\n google.maps.event.addListener(path, 'insert_at', polygonUpdated);\r\n google.maps.event.addListener(path, 'remove_at', polygonUpdated);\r\n } else {\r\n polygon.setEditable(false);\r\n google.maps.event.clearListeners(path, 'set_at');\r\n google.maps.event.clearListeners(path, 'insert_at');\r\n google.maps.event.clearListeners(path, 'remove_at');\r\n }\r\n }\r\n\r\n initPolygon(polygon) {\r\n polygon.setEditable(false);\r\n google.maps.event.addListener(polygon, 'click', () => {\r\n this.setPolygonEditable(polygon, true);\r\n });\r\n }\r\n\r\n setMarkers(assets) {\r\n this.assetMap = new Map();\r\n this.clearMarkers();\r\n let bounds = new google.maps.LatLngBounds();\r\n\r\n if (!assets || assets.length === 0) {\r\n // fit the map to polygon\r\n if ((this.polyPoints || []).length) {\r\n this.polyPoints.forEach((pos) => {\r\n bounds.extend(pos);\r\n });\r\n this.map.fitBounds(bounds);\r\n }\r\n return;\r\n }\r\n\r\n const onSiteMarkersPosition = [];\r\n const offSiteMarkersPosition = [];\r\n\r\n assets.forEach((asset) => {\r\n if (asset.lat && asset.lng) {\r\n const marker = new google.maps.Marker({\r\n position: {\r\n lat: asset.lng,\r\n lng: asset.lat,\r\n },\r\n map: this.map,\r\n visible: false,\r\n });\r\n\r\n this.markers.push(marker);\r\n this.assetMap.set(marker, asset);\r\n\r\n if (asset.onSite) {\r\n onSiteMarkersPosition.push(marker.position);\r\n } else {\r\n offSiteMarkersPosition.push(marker.position);\r\n }\r\n }\r\n });\r\n\r\n this.markerCluster.addMarkers(this.markers);\r\n\r\n // fit the map to polygon bound or the assets\r\n const positions = onSiteMarkersPosition.length\r\n ? this.polyPoints && this.polyPoints.length\r\n ? this.polyPoints\r\n : onSiteMarkersPosition\r\n : offSiteMarkersPosition;\r\n\r\n positions.forEach((pos) => {\r\n bounds.extend(pos);\r\n });\r\n this.map.fitBounds(bounds);\r\n // this.map.setZoom(this.map.getZoom() + 1);\r\n }\r\n\r\n clearMarkers() {\r\n this.markers.forEach((marker) => {\r\n marker.setMap(null);\r\n });\r\n\r\n this.markers = [];\r\n\r\n if (this.markerCluster) {\r\n this.markerCluster.clearMarkers();\r\n (this.markerOverlays || []).forEach((item) => item.setMap(null));\r\n this.markerOverlays = [];\r\n }\r\n }\r\n\r\n /**\r\n * Since google maps only supports img marker, hide google maps markers and show\r\n * customized overlays as markers\r\n *\r\n * @param mc\r\n */\r\n renderMarkers(mc) {\r\n this.markerOverlays.forEach((item) => item.setMap(null));\r\n this.markerOverlays = [];\r\n\r\n mc.clusters_.forEach((cluster) => {\r\n if (cluster.markers_.length > 1) {\r\n const { data, info } = this.getClusterData(cluster.markers_);\r\n const marker = createCustomMarker({\r\n latlng: cluster.center_,\r\n map: this.map,\r\n html: createClusterMarker(data),\r\n infoPopup: this.infoPopup,\r\n info,\r\n });\r\n\r\n google.maps.event.addListener(marker, 'click', () => {\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n cluster.markers_.forEach((item) => {\r\n bounds.extend(item.position);\r\n });\r\n\r\n this.map.fitBounds(bounds);\r\n });\r\n\r\n this.markerOverlays.push(marker);\r\n } else {\r\n let marker = cluster.markers_[0];\r\n const asset = this.assetMap.get(marker);\r\n marker = createCustomMarker({\r\n latlng: marker.position,\r\n map: this.map,\r\n html: createAssetMarker(asset),\r\n infoPopup: this.infoPopup,\r\n info: `

                ${asset.name}

                `,\r\n });\r\n\r\n this.markerOverlays.push(marker);\r\n }\r\n });\r\n }\r\n\r\n setGeoZone(geometry) {\r\n if (geometry) {\r\n this.clearGeoZone();\r\n\r\n const [points] = (wellknown.parse(geometry) || {}).coordinates;\r\n this.polyPoints = (points || []).map(([lng, lat]) => new google.maps.LatLng(lat, lng));\r\n\r\n const polygon = new google.maps.Polygon({\r\n path: this.polyPoints,\r\n ...POLYGON_SETTINGS,\r\n });\r\n\r\n polygon.setMap(this.map);\r\n this.polygons.push(polygon);\r\n\r\n if (this.allowEditGeoZone) {\r\n this.initPolygon(polygon);\r\n }\r\n }\r\n }\r\n\r\n clearGeoZone() {\r\n if (this.polygons.length > 0) {\r\n this.polygons.forEach((item) => {\r\n item.setMap(null);\r\n });\r\n\r\n this.polygons = [];\r\n }\r\n }\r\n\r\n getClusterData(markers) {\r\n const assetsByType = {};\r\n const data = { data: null, info: '
                ' };\r\n\r\n markers.forEach((marker) => {\r\n const asset = this.assetMap.get(marker);\r\n\r\n if (asset) {\r\n let { assetType } = asset;\r\n assetType = assetType.toLowerCase();\r\n\r\n if (assetsByType[assetType]) assetsByType[assetType].push(asset);\r\n else assetsByType[assetType] = [asset];\r\n\r\n data.info += `

                ${asset.name}

                `;\r\n }\r\n });\r\n\r\n data.data = Object.keys(assetsByType).map((key) => ({ key, value: assetsByType[key].length }));\r\n data.info += '
                ';\r\n\r\n return data;\r\n }\r\n\r\n getPolygonGeometry() {\r\n /**\r\n * to match the current geozone in our system,\r\n * @param {*} points\r\n * @returns\r\n */\r\n const getPolygonString = (points = []) => {\r\n const GeoJSON = {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Polygon',\r\n coordinates: points,\r\n },\r\n };\r\n return wellknown.stringify(GeoJSON);\r\n };\r\n //so far will handle one polygon\r\n const [polygon] = this.polygons || [];\r\n const points = polygon\r\n ? polygon\r\n .getPaths()\r\n .getArray()\r\n .map((path) => path.getArray().map((p) => [p.lng(), p.lat()]))\r\n : undefined;\r\n return points ? getPolygonString(points) : undefined;\r\n }\r\n\r\n /**\r\n * test if lat lng inside google map polygon\r\n * @param {*} lat\r\n * @param {*} lng\r\n * @param {*} polygon\r\n * @returns\r\n */\r\n isPointInsideGaPolygon(lat, lng, polygon) {\r\n //if unknown position => it maybe onsite\r\n if (!lat || !lng) return true;\r\n if (!polygon) return true;\r\n const point = new google.maps.LatLng(lng, lat);\r\n\r\n return google.maps.geometry.poly.containsLocation(point, polygon);\r\n }\r\n\r\n /**\r\n * build google map polygon from geometry string\r\n * @param {*} geometry\r\n * @returns\r\n */\r\n getPolygon(geometry) {\r\n if (!geometry) return undefined;\r\n const [points] = (wellknown.parse(geometry) || {}).coordinates || [];\r\n if (!points || !points.length) return undefined;\r\n const polyPoints = (points || []).map(([lng, lat]) => new google.maps.LatLng(lat, lng));\r\n\r\n return new google.maps.Polygon({\r\n path: polyPoints,\r\n });\r\n }\r\n\r\n /**\r\n * set location search\r\n */\r\n setLocationSearch(searchInput) {\r\n const autocomplete = new google.maps.places.Autocomplete(searchInput);\r\n autocomplete.bindTo('bounds', this.map);\r\n autocomplete.setFields(['geometry']);\r\n const handleLocationSearch = (e) => {\r\n const place = autocomplete.getPlace();\r\n\r\n if (!place.geometry || !place.geometry.location) {\r\n return;\r\n }\r\n\r\n if (place.geometry.viewport) {\r\n this.map.fitBounds(place.geometry.viewport);\r\n } else {\r\n this.map.setCenter(place.geometry.location);\r\n this.map.setZoom(17);\r\n }\r\n };\r\n autocomplete.addListener('place_changed', handleLocationSearch);\r\n }\r\n}\r\n\r\nexport default new GoogleMapsService();\r\n","import d3 from 'd3';\r\n\r\n/**\r\n * Create cluster icon as a donut chart, ported from map page\r\n *\r\n * @param options\r\n * @returns {string}\r\n */\r\nfunction bakeThePie(options) {\r\n /* data and valueFunc are required */\r\n if (!options.data || !options.valueFunc) {\r\n return '';\r\n }\r\n\r\n options.strokeWidth = 1.5;\r\n\r\n const outerStrokeWidth = 2;\r\n\r\n const { data } = options;\r\n const { valueFunc } = options;\r\n const r = options.outerRadius ? options.outerRadius : 28; // Default outer radius = 28px\r\n const strokeWidth = options.strokeWidth ? options.strokeWidth : 1; // Default stroke is 1\r\n const pathClassFunc = options.pathClassFunc\r\n ? options.pathClassFunc\r\n : function () {\r\n return '';\r\n }; // Class for each path\r\n const pieClass = options.pieClass ? options.pieClass : 'marker-cluster-pie'; // Class for the whole pie\r\n const pieLabel = options.pieLabel ? options.pieLabel : d3.sum(data, valueFunc); // Label for the whole pie\r\n const pieLabelClass = options.pieLabelClass ? options.pieLabelClass : 'marker-cluster-pie-label'; // Class for the pie label\r\n const origo = r + strokeWidth + outerStrokeWidth; // Center coordinate\r\n const w = origo * 2; // width and height of the svg element\r\n const h = w;\r\n const donut = d3.layout.pie();\r\n const arc = d3.svg\r\n .arc()\r\n .innerRadius(r - 2)\r\n .outerRadius(r);\r\n\r\n // Create an svg element\r\n const svg = document.createElementNS('d3svg', 'svg');\r\n // Create the pie chart\r\n const vis = d3\r\n .select(svg)\r\n .data([data])\r\n .attr('class', pieClass)\r\n .attr('width', w)\r\n .attr('height', h);\r\n\r\n vis\r\n .append('circle')\r\n .attr('cx', origo)\r\n .attr('cy', origo)\r\n .attr('r', origo - 3)\r\n .attr('fill-opacity', '0.7')\r\n .attr('fill', '#000000');\r\n\r\n vis\r\n .append('circle')\r\n .attr('cx', origo)\r\n .attr('cy', origo)\r\n .attr('r', origo - 1)\r\n .attr('fill-opacity', '0.0')\r\n .attr('stroke', 'white')\r\n .attr('stroke-width', outerStrokeWidth);\r\n\r\n const arcs = vis\r\n .selectAll('g.arc')\r\n .data(donut.value(valueFunc))\r\n .enter()\r\n .append('svg:g')\r\n .attr('class', 'arc')\r\n .attr('transform', `translate(${origo},${origo})`);\r\n\r\n arcs\r\n .append('svg:path')\r\n .attr('class', pathClassFunc)\r\n .attr('stroke-width', strokeWidth + 1)\r\n .attr('d', arc)\r\n .append('svg:title');\r\n\r\n vis\r\n .append('text')\r\n .attr('x', origo)\r\n .attr('y', origo)\r\n .attr('class', pieLabelClass)\r\n .attr('text-anchor', 'middle')\r\n // .attr('dominant-baseline', 'central')\r\n // IE doesn't seem to support dominant-baseline, but setting dy to .3em does the trick\r\n .attr('dy', '.3em')\r\n .text(pieLabel);\r\n\r\n let html;\r\n\r\n // Return the svg-markup rather than the actual element\r\n if (typeof window.XMLSerializer !== 'undefined') {\r\n html = new window.XMLSerializer().serializeToString(svg);\r\n } else if (typeof svg.xml !== 'undefined') {\r\n html = svg.xml;\r\n } else {\r\n html = '';\r\n }\r\n\r\n return `
                ${html}
                `;\r\n}\r\n\r\nexport default function createClusterMarker(data) {\r\n const n = data.reduce((total, item) => total + item.value, 0);\r\n const rmax = 30; // Maximum radius for cluster pies\r\n const strokeWidth = 1; // Set clusterpie stroke width\r\n const r = rmax - 2 * strokeWidth - (n < 10 ? 12 : n < 100 ? 8 : n < 1000 ? 4 : 0); // Calculate clusterpie radius...\r\n\r\n return bakeThePie({\r\n data,\r\n valueFunc(d) {\r\n return d.value;\r\n },\r\n strokeWidth: 1,\r\n outerRadius: r,\r\n pieClass: 'cluster-pie',\r\n pieLabel: n,\r\n pieLabelClass: 'marker-cluster-pie-label',\r\n pathClassFunc(d) {\r\n return `category-${d.data.key}`;\r\n },\r\n });\r\n}\r\n","export default function createAssetMarker(asset) {\r\n const html = `\r\n
                \r\n \r\n
                \r\n `;\r\n return html;\r\n}\r\n","import template from './ga-map.component.html';\r\nimport googleMapsService from './google.maps.service';\r\n\r\nclass SiteMapController {\r\n constructor($element, $scope, $q, $timeout, $rootScope) {\r\n 'ngInject';\r\n\r\n this.$element = $element;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.changingGeoZone = false;\r\n this.$timeout = $timeout;\r\n this.userMapType = () => $rootScope.currentUser.claims?.data?.mapView;\r\n }\r\n\r\n $onInit() {\r\n this.$q\r\n .resolve(\r\n googleMapsService.createMap({\r\n el: this.$element.find('.map-container')[0],\r\n allowEditGeoZone: this.editable,\r\n mapType: this.userMapType(),\r\n }),\r\n )\r\n .then(() => {\r\n if (this.editable) {\r\n const toolbar = this.$element.find('.toolbar')[0];\r\n\r\n googleMapsService.map.controls[google.maps.ControlPosition.TOP_CENTER].push(toolbar);\r\n\r\n const editActions = this.$element.find('.ga-map-edit-actions')[0];\r\n googleMapsService.map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(editActions);\r\n }\r\n\r\n const markerDescriptors = this.$element.find('.marker-descriptors')[0];\r\n googleMapsService.map.controls[google.maps.ControlPosition.BOTTOM_CENTER].push(\r\n markerDescriptors,\r\n );\r\n\r\n if (this.searchable) {\r\n //search location\r\n const searchControl = this.$element.find('.map-location-search')[0];\r\n const searchInput = searchControl.children[0];\r\n\r\n googleMapsService.map.controls[google.maps.ControlPosition.RIGHT_TOP].push(searchControl);\r\n\r\n googleMapsService.setLocationSearch(searchInput);\r\n }\r\n\r\n if (Array.isArray(this.assets)) {\r\n googleMapsService.setMarkers(this.assets);\r\n }\r\n\r\n if (this.geometry) {\r\n googleMapsService.setGeoZone(this.geometry);\r\n }\r\n\r\n this.$scope.$watch('gaVm.assets', (assets) => {\r\n if (Array.isArray(assets)) {\r\n googleMapsService.setMarkers(assets);\r\n }\r\n });\r\n\r\n this.$scope.$watch('gaVm.geometry', (geometry) => {\r\n googleMapsService.setGeoZone(geometry);\r\n });\r\n });\r\n googleMapsService.vm = this;\r\n }\r\n\r\n clearGeoZone() {\r\n googleMapsService.clearGeoZone();\r\n this.showApplyChanges();\r\n }\r\n\r\n resetGeoZone() {\r\n googleMapsService.setGeoZone(this.geometry);\r\n this.changingGeoZone = false;\r\n }\r\n\r\n onDrawComplete(geometry) {\r\n if (this.onUpdateGeometry) {\r\n this.onUpdateGeometry({ geometry });\r\n }\r\n }\r\n\r\n editGeoZones() {\r\n googleMapsService.setPolygonsEditMode(true);\r\n }\r\n\r\n showApplyChanges() {\r\n if (this.newSite) {\r\n this.applyGeoZoneChanges();\r\n } else {\r\n this.$timeout(() => (this.changingGeoZone = true));\r\n }\r\n }\r\n\r\n applyGeoZoneChanges() {\r\n const geometry = googleMapsService.getPolygonGeometry();\r\n if (this.onUpdateGeometry) {\r\n this.onUpdateGeometry({ geometry });\r\n }\r\n this.changingGeoZone = false;\r\n googleMapsService.setPolygonsEditMode(false);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SiteMapController,\r\n controllerAs: 'gaVm',\r\n bindings: {\r\n assets: '<',\r\n geometry: '<',\r\n editable: '<',\r\n onUpdateGeometry: '&?',\r\n newSite: '<',\r\n searchable: '<',\r\n },\r\n};\r\n","import template from './chart.html';\r\n\r\n/**\r\n * data model that chart component will expect.\r\n */\r\nexport class dataModel {\r\n constructor(key, name, color, value) {\r\n this.key = key;\r\n this.name = name;\r\n this.color = color;\r\n this.value = value;\r\n }\r\n}\r\n\r\nclass ChartController {\r\n constructor($scope, $element, sitesService, $timeout) {\r\n 'ngInject';\r\n\r\n this.$element = $element;\r\n this.$timeout = $timeout;\r\n this.colors = ['#12981c', '#d2d2d2'];\r\n this.id = `chart${$scope.$id}`;\r\n this.chart = undefined;\r\n }\r\n\r\n $onInit() {\r\n this.root = this.$element[0];\r\n this.ChartDiv = this.root.children[0];\r\n this.CreateChart();\r\n }\r\n\r\n $onChanges() {\r\n if (this.chart) {\r\n this.chart.dataProvider = [...(this.data || [])];\r\n this.chart.validateData();\r\n this.chart.addListener('dataUpdated', () => {\r\n // Resize chart after updating data to prevent it from being cropped\r\n this.chart.invalidateSize();\r\n });\r\n }\r\n }\r\n\r\n CreateChart() {\r\n this.chart = new AmCharts.makeChart(this.ChartDiv, {\r\n type: 'pie',\r\n theme: 'light',\r\n autoResize: true,\r\n percentPrecision: 1,\r\n innerRadius: '65%',\r\n pullOutRadius: 0,\r\n outlineAlpha: 0,\r\n labelRadius: -25,\r\n startDuration: 0,\r\n labelText: '',\r\n color: '#333',\r\n dataProvider: [...(this.data || [])],\r\n valueField: 'value',\r\n titleField: 'name',\r\n colorField: 'color',\r\n balloonText: \"
                [[name]]
                [[value]] - [[percents]]%
                \",\r\n\r\n export: {\r\n enabled: false,\r\n },\r\n titles: [\r\n {\r\n text: this.title,\r\n size: 14,\r\n },\r\n ],\r\n });\r\n\r\n if (typeof this.onSliceClick === 'function') {\r\n this.chart.addListener('clickSlice', this.handelSliceClick.bind(this));\r\n }\r\n }\r\n\r\n handelSliceClick(e) {\r\n const { key } = e.dataItem.dataContext;\r\n this.onSliceClick({ key });\r\n }\r\n\r\n showPopup(item) {\r\n this.chart.rollOverSlice(item);\r\n }\r\n\r\n toggleSlice(item) {\r\n this.chart.clickSlice(item);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: ChartController,\r\n controllerAs: 'chart',\r\n bindings: {\r\n data: '<',\r\n title: '@',\r\n onSliceClick: '&?',\r\n },\r\n};\r\n","import template from './applied-filters-view.html';\r\n\r\nclass AppliedFiltersViewController {\r\n constructor() {\r\n 'ngInject';\r\n\r\n }\r\n\r\n $onInit() {\r\n }\r\n\r\n $onChanges() {\r\n }\r\n\r\n clickClear(filter) {\r\n filter.value = '';\r\n\r\n this.filterChanged();\r\n }\r\n\r\n clickClearAll() {\r\n this.filters.forEach((filter) => {\r\n filter.value = '';\r\n });\r\n\r\n this.filterChanged();\r\n }\r\n}\r\n\r\n/**\r\n * take filters : [{label, value, prop}]\r\n */\r\nexport default {\r\n template,\r\n controller: AppliedFiltersViewController,\r\n controllerAs: 'afVm',\r\n bindings: {\r\n filters: '<',\r\n filterChanged: '&',\r\n },\r\n};\r\n","import template from './search-input.html';\r\n\r\nclass SearchInputController {\r\n constructor($timeout) {\r\n 'ngInject';\r\n this.$timeout = $timeout;\r\n }\r\n\r\n triggered() {\r\n this.ngModel = (this.ngModel || '').trim();\r\n this.$timeout(this.onTrigger, 1);\r\n }\r\n\r\n changed() {\r\n this.ngModel = (this.ngModel || '').trimStart();\r\n this.$timeout(this.onChange, 1);\r\n }\r\n\r\n clearSearch() {\r\n this.ngModel = '';\r\n this.triggered();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SearchInputController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n onTrigger: '&',\r\n onChange: '&',\r\n placeHolder: '@',\r\n size: '@',\r\n ngModel: '=',\r\n },\r\n};\r\n","import template from './site-filters.component.html';\r\n\r\nclass SiteFiltersController {\r\n constructor() {\r\n 'ngInject';\r\n }\r\n\r\n clickClearFilters() {\r\n this.clearFilters();\r\n }\r\n\r\n clickCloseFilters() {\r\n this.closeFilters();\r\n }\r\n\r\n onFiltersChanged() {\r\n this.filterChanged();\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SiteFiltersController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n clearFilters: '&',\r\n filterChanged: '&',\r\n closeFilters: '&',\r\n filters: '=',\r\n },\r\n};\r\n","export class Column {\r\n constructor(args) {\r\n this.selectable = args.selectable || false;\r\n this.hidden = args.hidden || false;\r\n\r\n this.field = args.field;\r\n this._fields = args.field?.split('.');\r\n this.title = args.title;\r\n this.width = args.width || 'auto';\r\n this.align = args.align || 'left';\r\n this.boColor = args.boColor || '';\r\n this.render = args.render;\r\n this.ascending = args.ascending;\r\n this.sortable = args.sortable || args.sortKey || typeof args.sort === 'function' ? true : false;\r\n if (this.sortable) {\r\n this.sortKey = args.sortKey || args.field;\r\n\r\n if (typeof args.sort === 'function') {\r\n this.sort = args.sort.bind(this);\r\n } else {\r\n this.sort = (itemA, itemB) => {\r\n var valueA = this.getValue(itemA);\r\n var valueB = this.getValue(itemB);\r\n if (typeof valueA === 'string') valueA = valueA.toLowerCase();\r\n else if (typeof valueA === 'boolean') valueA = valueA ? 1 : 2;\r\n else if (valueA === undefined) valueA = '';\r\n\r\n if (typeof valueB === 'string') valueB = valueB.toLowerCase();\r\n else if (typeof valueB === 'boolean') valueB = valueB ? 1 : 2;\r\n else if (valueB === undefined) valueB = '';\r\n\r\n // if the values are the same sort by the name to make sure the order are consistent when users switched between different columns for sorting\r\n if (valueA === valueB && this.field !== 'name') {\r\n valueA = itemA.name;\r\n valueB = itemB.name;\r\n }\r\n\r\n if (this.ascending) return valueA < valueB ? -1 : 1;\r\n return valueA > valueB ? -1 : 1;\r\n };\r\n }\r\n }\r\n\r\n if (!args.field) console.error('Column: [field] is require!');\r\n if (!args.title) console.error('Column: [title] is require!');\r\n }\r\n\r\n getValue(item) {\r\n let value;\r\n if (this._fields.length === 1) value = item[this.field];\r\n else {\r\n value = item;\r\n for (var i = 0, n = this._fields.length; i < n; ++i) {\r\n var prop = this._fields[i];\r\n if (prop in value) {\r\n value = value[prop];\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n if (Array.isArray(value)) {\r\n if (value.length > 0) {\r\n if (typeof value[0] === 'string' || typeof value[0] === 'number') return value.join(', ');\r\n } else return '';\r\n }\r\n return value;\r\n }\r\n\r\n highlight(value, searchString) {\r\n if (typeof value !== 'string') value = value?.toString();\r\n if (!searchString || !value) return value;\r\n\r\n let rx = new RegExp(searchString, 'ig');\r\n let res = value.match(rx);\r\n\r\n if (res) return value.replace(rx, '$&');\r\n return value;\r\n }\r\n}\r\n","import template from './users-list-view.html';\r\nimport { Column } from '../table/model/table-column';\r\n\r\nclass UsersListViewController {\r\n constructor(gettext, $filter) {\r\n 'ngInject';\r\n this.$filter = $filter;\r\n\r\n this.columnsDef = [\r\n new Column({\r\n title: gettext('Name'),\r\n field: 'name',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: gettext('Email'),\r\n field: 'email',\r\n sortable: true,\r\n }),\r\n ];\r\n\r\n this.onSortChange = this.onSortChange.bind(this);\r\n\r\n this.currentPage = 1;\r\n this.itemsPerPage = 5;\r\n this.pagedList = [];\r\n\r\n this.setPage = (pageNum = null) => {\r\n if (pageNum !== null) this.currentPage = pageNum;\r\n\r\n const begin = (this.currentPage - 1) * this.itemsPerPage;\r\n const end = begin + this.itemsPerPage;\r\n this.pagedList = (this.filteredList || []).slice(begin, end);\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.itemsPerPage = this.itemsPerPage || 5;\r\n }\r\n\r\n $onChanges() {\r\n if (this.users) {\r\n this.search();\r\n }\r\n }\r\n\r\n onSortChange(column) {\r\n if (typeof column.ascending !== 'boolean') {\r\n this.columnsDef.forEach((col) => {\r\n if (col.field !== column.field && typeof col.ascending === 'boolean')\r\n col.ascending = undefined;\r\n });\r\n }\r\n\r\n column.ascending = !column.ascending;\r\n\r\n this.sortList(column);\r\n this.setPage();\r\n }\r\n\r\n sortList(column) {\r\n if (typeof column === 'undefined') {\r\n column = this.columnsDef.find((column) => typeof column.ascending === 'boolean');\r\n }\r\n\r\n this.filteredList = this.filteredList.sort(column.sort);\r\n }\r\n\r\n search() {\r\n this.filteredList = this.$filter('filter')(this.users || [], this.query);\r\n this.setPage(1);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: UsersListViewController,\r\n controllerAs: 'uVm',\r\n bindings: {\r\n users: '<',\r\n // searchString: '<',\r\n itemsPerPage: '<',\r\n onManageClicked: '&?',\r\n },\r\n};\r\n","import template from './sites-main.html';\r\nimport App from '../../app';\r\n\r\nconst AMPLITUDE_EVENT_NAME = \"Pageview: Sites\";\r\nclass SiteMaineController {\r\n constructor() {}\r\n\r\n $onInit() {\r\n App.amplitude.track(AMPLITUDE_EVENT_NAME);\r\n }\r\n}\r\nexport default {\r\n template,\r\n controller: SiteMaineController,\r\n controllerAs: 'vm',\r\n};\r\n","import template from './sites-list.html';\r\n\r\nimport { Column } from '../common/table/model/table-column';\r\n\r\nclass SiteListController {\r\n constructor($state, sitesService, $filter, usersService, gettext) {\r\n 'ngInject';\r\n\r\n this.sitesService = sitesService;\r\n this.$state = $state;\r\n this.$filter = $filter;\r\n this.usersService = usersService;\r\n this.gettext = gettext;\r\n\r\n this.defineTableProp();\r\n this.sites = [];\r\n this.filteredSites = [];\r\n this.loading = false;\r\n\r\n // functions binding to this class\r\n this.goToView = this.goToView.bind(this);\r\n this.onSortChange = this.onSortChange.bind(this);\r\n }\r\n\r\n $onInit() {\r\n this.hasFullControl = this.usersService.hasRequiredFeatures(['sites.manage.create']);\r\n this.getSites();\r\n }\r\n\r\n getSites() {\r\n this.loading = true;\r\n this.error = false;\r\n this.sitesService\r\n .getSites()\r\n .then((sites) => {\r\n if (sites && sites.length === 1 && !this.hasFullControl) {\r\n const [s] = sites;\r\n this.goToView(null, s, null);\r\n }\r\n this.sites = sites;\r\n this.search();\r\n })\r\n .catch(() => {\r\n this.error = true;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n defineTableProp() {\r\n this.columns = [\r\n new Column({\r\n title: this.gettext('Name'),\r\n field: 'name',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Creation Date'),\r\n field: 'creationDate',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Address'),\r\n field: 'address',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Description'),\r\n field: 'description',\r\n sortable: true,\r\n }),\r\n ];\r\n }\r\n\r\n goToView(event, item, index) {\r\n if (item) {\r\n this.$state.go('sites.view', { id: item.id });\r\n }\r\n }\r\n\r\n openManageView(id) {\r\n this.manageView = {\r\n show: true,\r\n };\r\n }\r\n\r\n closeManageView() {\r\n this.manageView = undefined;\r\n this.getSites();\r\n }\r\n\r\n onSortChange(column) {\r\n if (typeof column.ascending !== 'boolean') {\r\n this.columns.forEach((col) => {\r\n if (col.field !== column.field && typeof col.ascending === 'boolean')\r\n col.ascending = undefined;\r\n });\r\n }\r\n\r\n column.ascending = !column.ascending;\r\n\r\n this.sortList(column);\r\n }\r\n\r\n sortList(column) {\r\n if (typeof column === 'undefined') {\r\n column = this.columns.find((column) => typeof column.ascending === 'boolean');\r\n }\r\n\r\n this.filteredSites = this.filteredSites.sort(column.sort);\r\n }\r\n\r\n search() {\r\n if (this.query !== '') {\r\n this.filteredSites = this.$filter('filter')(this.sites, this.query);\r\n } else {\r\n this.filteredSites = this.sites;\r\n }\r\n }\r\n}\r\nexport default {\r\n template,\r\n controller: SiteListController,\r\n controllerAs: 'vm',\r\n};\r\n","import { Column } from '../common/table/model/table-column';\r\nimport { gettext } from '../../../utility/gettext.util.service';\r\n\r\nconst commonColumnDef = [\r\n new Column({\r\n title: gettext('Name'),\r\n field: 'name',\r\n sortable: true,\r\n ascending: true,\r\n }),\r\n new Column({\r\n title: gettext('Make-Model'),\r\n field: 'makeModel',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: gettext('Asset Type'),\r\n field: 'assetType',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: gettext('Cat-Class'),\r\n field: 'catClass',\r\n sortable: true,\r\n }),\r\n];\r\n\r\nconst lastSeen = new Column({\r\n title: gettext('Last Seen'),\r\n field: 'lastSeenAgo',\r\n width: '200px',\r\n sortable: true,\r\n sort(itemA, itemB) {\r\n const valA = new Date(itemA.coordsAt || 0);\r\n const valB = new Date(itemB.coordsAt || 0);\r\n\r\n if (this.ascending) return valA > valB ? -1 : 1;\r\n return valA > valB ? 1 : -1;\r\n },\r\n});\r\n\r\nconst onSite = new Column({\r\n title: gettext('On Site Status'),\r\n field: 'onSiteStatus',\r\n sortable: true,\r\n render: (item) => {\r\n return `\r\n \r\n \r\n ${item.onSiteStatus}\r\n `;\r\n },\r\n});\r\n\r\nconst ccLikeQtyOnSiteUsagePercent = new Column({\r\n title: gettext('Like qty usage %'),\r\n field: 'ccLikeQtyOnSiteUsagePercent',\r\n sortable: true,\r\n});\r\n\r\nconst ccLikeQtyOnSite = new Column({\r\n title: gettext('Like qty onsite'),\r\n field: 'ccLikeQtyOnSite',\r\n sortable: true,\r\n});\r\n\r\nconst lastUsed = new Column({\r\n title: gettext('Last Used'),\r\n field: 'lastUsedAtAgo',\r\n width: '200px',\r\n sortable: true,\r\n sort(itemA, itemB) {\r\n const valA = new Date(itemA.usedAt || 0);\r\n const valB = new Date(itemB.usedAt || 0);\r\n\r\n if (this.ascending) return valA > valB ? -1 : 1;\r\n return valA > valB ? 1 : -1;\r\n },\r\n});\r\n\r\nconst overviewView = {\r\n name: 'overview',\r\n label: gettext('Overview'),\r\n filters: ['seenIn', 'usedIn'],\r\n};\r\n\r\nexport const inventoryListView = {\r\n name: 'inventory',\r\n label: gettext('Total Inventory'),\r\n columnsDef: [\r\n ...commonColumnDef,\r\n ccLikeQtyOnSite,\r\n ccLikeQtyOnSiteUsagePercent,\r\n lastSeen,\r\n onSite,\r\n lastUsed,\r\n ],\r\n filters: ['name', 'make', 'model', 'cat', 'class', 'assetType', 'onSite', 'seenIn', 'usedIn'],\r\n};\r\n\r\nexport const onSiteAttentionListView = {\r\n name: 'onsite',\r\n label: gettext('On Site Attention'),\r\n columnsDef: [...commonColumnDef, lastSeen, onSite],\r\n filters: ['name', 'make', 'model', 'cat', 'class', 'assetType', 'seenIn'],\r\n excludeChart: 'usage',\r\n preDefineFilter: {\r\n match(asset) {\r\n const { onSite, seenIn } = asset || {};\r\n const actuallyOnsite = onSite && seenIn === 'seenIn3d';\r\n\r\n return !actuallyOnsite;\r\n },\r\n },\r\n};\r\n\r\nexport const usageListView = {\r\n name: 'usage',\r\n label: gettext('Usage'),\r\n columnsDef: [...commonColumnDef, ccLikeQtyOnSite, ccLikeQtyOnSiteUsagePercent, lastUsed],\r\n filters: ['name', 'make', 'model', 'cat', 'class', 'assetType', 'usedIn'],\r\n excludeChart: 'onsite',\r\n preDefineFilter: {\r\n match(asset) {\r\n const { onSite, lastReportedUsageIn3d, usedIn } = asset || {};\r\n const actuallyLowUsage = onSite && lastReportedUsageIn3d && usedIn !== 'usedIn3d';\r\n\r\n return actuallyLowUsage;\r\n },\r\n },\r\n};\r\n\r\nexport default {\r\n overview: overviewView,\r\n inventory: inventoryListView,\r\n onsite: onSiteAttentionListView,\r\n usage: usageListView,\r\n};\r\n","import template from './site-view.html';\r\nimport ListViews from '../models/views.models';\r\n\r\nclass SiteViewController {\r\n constructor($state, sitesService, filtersService, $scope, $stateParams, $location) {\r\n 'ngInject';\r\n\r\n this.sitesService = sitesService;\r\n this.filtersService = filtersService;\r\n this.$state = $state;\r\n this.$scope = $scope;\r\n this.$stateParams = $stateParams;\r\n this.$location = $location;\r\n\r\n this.seenIn = this.sitesService.seenIn;\r\n this.usedIn = this.sitesService.usedIn;\r\n\r\n this.loading = false;\r\n this.assets = [];\r\n this.viewName = '';\r\n this.views = ListViews;\r\n\r\n this.query = '';\r\n this.filters = [];\r\n this.getFilterByName = null;\r\n this.ViewPreDefineFilter = undefined;\r\n this.onItemClick = this.onItemClick.bind(this);\r\n }\r\n\r\n $onInit() {\r\n this.getSiteView();\r\n this.connection = this.sitesService.registerView(this);\r\n this.setView(this.$location.search().v);\r\n }\r\n\r\n $onDestroy() {\r\n this.sitesService.unRegisterView(this.connection);\r\n }\r\n\r\n setView(viewName) {\r\n viewName = viewName in ListViews ? viewName : 'overview';\r\n if (this.viewName === viewName) return;\r\n\r\n this.viewName = viewName;\r\n const view = ListViews[this.viewName] || {};\r\n this.columnsDef = (view.columnsDef || []).map((col) => {\r\n if (col.field === 'name') {\r\n col.ascending = true;\r\n } else {\r\n col.ascending = undefined;\r\n }\r\n return col;\r\n });\r\n this.hideOnSiteChart = view.excludeChart === 'onsite';\r\n this.hideUsageChart = view.excludeChart === 'usage';\r\n this.$location.search({ v: this.viewName });\r\n this.getFiltersByKeys(view.filters);\r\n this.ViewPreDefineFilter = view.preDefineFilter;\r\n this.sitesService.updateViews();\r\n }\r\n\r\n updateBindings() {\r\n this.total = this.sitesService.totalInventory;\r\n this.onSitePercent = this.sitesService.onSitePercent;\r\n this.usedInPercent = this.sitesService.usedInPercent;\r\n this.filtersView = this.getAppliedFiltersView();\r\n this.usageStatus = this.sitesService.usageStatus;\r\n const usageDataLoaded = this.sitesService.usageStatus === 'loaded';\r\n const siteDataLoaded = this.sitesService.siteStatus === 'loaded';\r\n this.sitesService\r\n .getAssetsByFilter(this.query, this.filters, this.ViewPreDefineFilter)\r\n .then((assets) => {\r\n this.assets = assets;\r\n if (siteDataLoaded) {\r\n this.loading = false;\r\n }\r\n if (this.assets) {\r\n this.sitesService.getLastSeenChartData(this.assets).then((data) => {\r\n this.lastSeenChartData = data;\r\n });\r\n if (usageDataLoaded)\r\n this.sitesService.getUsageChartData(this.assets).then((data) => {\r\n this.usageChartData = data;\r\n });\r\n }\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n this.error = true;\r\n this.loading = false;\r\n });\r\n }\r\n\r\n getSiteView() {\r\n this.loading = true;\r\n this.sitesService\r\n .getSite(this.$stateParams.id)\r\n .then((s) => {\r\n this.site = s || {};\r\n this.getAssets(s.assets);\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n this.error = true;\r\n this.loading = false;\r\n })\r\n .finally(() => {\r\n this.updateBreadcrumb();\r\n });\r\n }\r\n\r\n updateBreadcrumb() {\r\n this.$scope.siteName = (this.site || {}).name || '';\r\n this.$scope.$emit('$viewContentLoaded');\r\n }\r\n\r\n getAssets(assetIds) {\r\n this.sitesService\r\n .getSiteAssetsByIds(assetIds)\r\n .then(() => {})\r\n .catch((e) => {\r\n this.loading = false;\r\n this.error = true;\r\n console.log(e);\r\n });\r\n }\r\n\r\n onSliceClick(key, prop) {\r\n // set the filter or clear it if its been set before\r\n const filter = this.getFilterByName(prop);\r\n\r\n if (filter) {\r\n if (filter.value !== key) {\r\n filter.value = key;\r\n } else {\r\n filter.value = '';\r\n }\r\n\r\n this.updateBindings();\r\n }\r\n }\r\n\r\n getAppliedFiltersView() {\r\n return this.filters.filter((filter) => {\r\n return !!(filter.value || '');\r\n });\r\n }\r\n\r\n onFiltersChanged() {\r\n this.sitesService.updateViews();\r\n }\r\n\r\n getFiltersByKeys(filtersKeys = []) {\r\n [this.filters, this.getFilterByName] = this.filtersService.getDefaultFilters(filtersKeys);\r\n }\r\n\r\n clearFilters() {\r\n this.filters.forEach((filter) => {\r\n filter.value = '';\r\n });\r\n\r\n this.onFiltersChanged();\r\n }\r\n\r\n toggleFilters() {\r\n this.showFilters = !this.showFilters;\r\n }\r\n\r\n hideFilters() {\r\n this.showFilters = false;\r\n }\r\n\r\n get filtersCount() {\r\n return this.filters.filter((item) => !!(item.value || '')).length;\r\n }\r\n\r\n getCsvData() {\r\n return this.sitesService.getCsvData(this.assets, this.columnsDef);\r\n }\r\n\r\n getCsvFileName() {\r\n return `${this.viewName}-${moment().format('YYYY-MM-DD:hh-mm-ss')}.csv`;\r\n }\r\n\r\n closeManageSite() {\r\n this.manage = false;\r\n this.getSiteView();\r\n }\r\n\r\n onItemClick(event, item, index) {\r\n if (item && item.name) {\r\n const filter = this.getFilterByName('name');\r\n if (filter) {\r\n filter.value = item.name;\r\n this.updateBindings();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SiteViewController,\r\n controllerAs: 'siteVm',\r\n bindings: {},\r\n};\r\n","import template from './asset-list-view.html';\r\nimport { cloneDeep } from 'lodash-es';\r\n\r\nclass AssetListViewController {\r\n constructor($timeout) {\r\n 'ngInject';\r\n\r\n this.onSortChange = this.onSortChange.bind(this);\r\n this.currentPage = 1;\r\n this.pagedAssets = [];\r\n this.$timeout = $timeout;\r\n\r\n this.setPage = (pageNum = null) => {\r\n if (pageNum !== null) this.currentPage = pageNum;\r\n\r\n const begin = (this.currentPage - 1) * this.itemsPerPage;\r\n const end = begin + this.itemsPerPage;\r\n this.pagedAssets = this.assets.slice(begin, end);\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.itemsPerPage = this.itemsPerPage || 15;\r\n }\r\n\r\n $onChanges(changes) {\r\n const { assets } = changes;\r\n\r\n if (assets) {\r\n //needed the deep clone for the ng repeat in the table to redraw if the changes only in the inner object.\r\n this.assets = cloneDeep(assets.currentValue || []);\r\n this.setPage(1);\r\n }\r\n }\r\n\r\n onSortChange(column) {\r\n this.sortCol = column;\r\n if (typeof column.ascending !== 'boolean') {\r\n this.columnsDef.forEach((col) => {\r\n if (col.field !== column.field && typeof col.ascending === 'boolean')\r\n col.ascending = undefined;\r\n });\r\n }\r\n\r\n column.ascending = !column.ascending;\r\n\r\n this.sortList(column);\r\n this.setPage();\r\n }\r\n\r\n sortList(column) {\r\n if (typeof column === 'undefined') {\r\n column = this.columnsDef.find((column) => typeof column.ascending === 'boolean');\r\n }\r\n\r\n this.assets = this.assets.sort(column.sort);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AssetListViewController,\r\n controllerAs: 'alVm',\r\n bindings: {\r\n assets: '<',\r\n columnsDef: '<',\r\n searchString: '<',\r\n itemsPerPage: '<',\r\n onItemClick:'<',\r\n },\r\n};\r\n","import template from './site-manage-view.html';\r\nimport { Column } from '../common/table/model/table-column';\r\n\r\nclass SiteManageViewController {\r\n constructor(sitesService, $state, $timeout, $filter, usersService, gettext) {\r\n 'ngInject';\r\n\r\n this.sitesService = sitesService;\r\n this.$state = $state;\r\n this.$timeout = $timeout;\r\n this.$filter = $filter;\r\n this.usersService = usersService;\r\n this.gettext = gettext;\r\n\r\n this.assetCols = [\r\n new Column({\r\n title: this.gettext('Name'),\r\n field: 'name',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Make-Model'),\r\n field: 'makeModel',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Asset Type'),\r\n field: 'assetType',\r\n sortable: true,\r\n }),\r\n new Column({\r\n title: this.gettext('Cat-Class'),\r\n field: 'catClass',\r\n sortable: true,\r\n }),\r\n ];\r\n this.query = '';\r\n this.assetsPerPage = 7;\r\n this.assets = [];\r\n this.filteredAssets = [];\r\n this.addedAssets = [];\r\n this.removedAssets = [];\r\n this.updateAssetsStatus = '';\r\n }\r\n\r\n $onInit() {\r\n this.hasFullControl = this.usersService.hasRequiredFeatures(['sites.manage.create']);\r\n this.getSite();\r\n }\r\n\r\n $onDestroy() {}\r\n\r\n getSite() {\r\n if (!this.siteId) {\r\n this.updateProperties();\r\n this.editMode = this.newSite = true;\r\n } else {\r\n this.editMode = this.newSite = false;\r\n this.loading = true;\r\n this.sitesService\r\n .getSite(this.siteId)\r\n .then((s) => {\r\n this.site = s;\r\n this.updateProperties(s);\r\n this.sitesService\r\n .getSiteAssetsByIds(s.assets)\r\n .then((assets) => {\r\n this.setAssets(assets);\r\n })\r\n .finally((_) => {\r\n this.loading = false;\r\n });\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n });\r\n }\r\n }\r\n\r\n setAssets(assets) {\r\n this.assets = assets;\r\n this.handleQueryChange();\r\n }\r\n\r\n updateProperties(site = {}) {\r\n const { name, description, address, assets, users, geoZone } = site;\r\n this.meta = {\r\n name,\r\n description,\r\n address,\r\n };\r\n this.users = users || [];\r\n this.geoZone = geoZone;\r\n }\r\n\r\n createSite() {\r\n if (this.meta.name) {\r\n this.status = 'creating';\r\n this.error = '';\r\n const site = {\r\n ...this.meta,\r\n geoZone: this.geoZone,\r\n };\r\n\r\n const assetIds = this.assets.map((item) => item.id);\r\n\r\n this.sitesService\r\n .createSite(site, assetIds, this.users)\r\n .then((s) => {\r\n this.site = s;\r\n this.siteId = this.site.id;\r\n this.$state.go('sites.view', { id: this.site.id });\r\n })\r\n .catch((error) => {\r\n const { status } = error || {};\r\n if (status === 409) {\r\n this.error = this.gettext('Site name already in use');\r\n } else {\r\n this.error = this.gettext('Error creating the site');\r\n }\r\n })\r\n .finally((_) => {\r\n this.status = '';\r\n });\r\n }\r\n }\r\n\r\n openAssetSelector() {\r\n this.sitesService.openAssetSelector(this.assets).then((res) => {\r\n this.addedAssets = res.added;\r\n this.removedAssets = res.removed;\r\n\r\n if (this.addedAssets.length > 0 || this.removedAssets.length > 0) {\r\n let promise;\r\n\r\n this.updateAssetsStatus = 'updating';\r\n\r\n if (this.siteId) {\r\n promise = this.sitesService\r\n .updateSiteAssets(this.siteId, this.addedAssets, this.removedAssets)\r\n .then(() => this.sitesService.getSite(this.siteId))\r\n .then((s) => {\r\n this.site = s;\r\n this.updateProperties(s);\r\n return this.sitesService.getSiteAssetsByIds(s.assets);\r\n });\r\n } else {\r\n const assetIds = Object.keys(res.result);\r\n\r\n promise = this.sitesService.getSiteAssetsByIds(assetIds);\r\n }\r\n\r\n promise\r\n .then((assets) => {\r\n this.setAssets(assets);\r\n })\r\n .catch(() => {\r\n this.updateAssetsStatus = 'error';\r\n })\r\n .finally(() => {\r\n this.updateAssetsStatus = '';\r\n });\r\n }\r\n });\r\n }\r\n\r\n onGeoZoneChanged(geometry) {\r\n this.geoZone = geometry;\r\n if (!this.newSite) {\r\n this.updateSite('geoZone');\r\n }\r\n }\r\n\r\n updateSite(key) {\r\n const updated =\r\n key === 'meta' ? this.meta : this.hasFullControl ? { geoZone: this.geoZone } : {};\r\n this.status = `updating-${key}`;\r\n const site = {\r\n ...this.site,\r\n ...updated,\r\n };\r\n this.sitesService\r\n .updateSite(site)\r\n .then((s) => {\r\n this.siteId = this.site.id;\r\n this.getSite();\r\n this.status = '';\r\n })\r\n .catch((error) => {\r\n this.status = 'update-error';\r\n const { status } = error || {};\r\n if (status === 409) {\r\n this.update_error = this.gettext('Site name already in use');\r\n } else {\r\n this.update_error = this.gettext('Error updating the site');\r\n }\r\n });\r\n }\r\n\r\n deleteSite() {\r\n this.sitesService\r\n .deleteSite(this.site)\r\n .then(() => {\r\n this.onClose();\r\n this.$state.go('sites.list');\r\n })\r\n .catch((_) => {});\r\n }\r\n\r\n openUsersSelector() {\r\n this.sitesService\r\n .openUsersSelector(this.users, this.users)\r\n .then(({ added, removed, finalUsers }) => {\r\n if (this.newSite) {\r\n this.users = finalUsers;\r\n } else if (added.length || removed.length) {\r\n this.updateUsersStatus = 'updating-users';\r\n this.sitesService\r\n .updateSiteUsers(this.site.id, added, removed)\r\n .then(() => {\r\n this.getSite();\r\n })\r\n .catch(() => {\r\n this.updateUsersStatus = 'updating-users-error';\r\n })\r\n .finally((_) => {\r\n this.updateUsersStatus = '';\r\n });\r\n }\r\n })\r\n .catch((_) => {});\r\n }\r\n\r\n handleQueryChange() {\r\n this.filteredAssets = this.$filter('filter')(this.assets, this.query);\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: SiteManageViewController,\r\n controllerAs: 'siteMVm',\r\n bindings: {\r\n siteId: '<',\r\n onClose: '&',\r\n },\r\n};\r\n","import { lowerCaseKeysObject } from '../../../utility/object.util.service';\r\n\r\nexport const ASSET_TYPE_VALUES = {\r\n tool: 'Tool',\r\n accessory: 'Accessory',\r\n material: 'Material',\r\n storage: 'Storage',\r\n attachment: 'Attachment',\r\n equipment: 'Equipment',\r\n gateway: 'Gateway',\r\n};\r\n\r\nconst getTypeValue = (val) => {\r\n val = (val || '').toLowerCase();\r\n return ASSET_TYPE_VALUES[val] || ASSET_TYPE_VALUES.equipment;\r\n};\r\n\r\nexport class Asset {\r\n constructor(asset) {\r\n asset = asset || {};\r\n Object.keys(asset).forEach((k) => {\r\n this[k] = asset[k];\r\n });\r\n\r\n const attrs = lowerCaseKeysObject(asset.attrs);\r\n\r\n this.id = asset.id;\r\n this.name = asset.name;\r\n this.make = attrs['make'];\r\n this.model = attrs['model'];\r\n this.year = attrs['model year'];\r\n this.cat = attrs['category'] || '';\r\n this.class = attrs['class'] || '';\r\n if (this.cat || this.class) {\r\n this.catClass = this.cat ? `${this.cat} - ${this.class}` : `${this.class}`;\r\n }\r\n if (this.make || this.model) {\r\n this.makeModel = this.model ? `${this.make} - ${this.model}` : `${this.make}`;\r\n }\r\n this.assetType = getTypeValue(attrs['onei3:asset.type']);\r\n const [lat, lng] = asset.coords || [];\r\n this.lat = lat;\r\n this.lng = lng;\r\n this.coordsAt = asset.coordsAt;\r\n this.onSite = true;\r\n this.ccLikeQtyOnSite = undefined;\r\n this.ccLikeQtyOnSiteUsagePercent = undefined;\r\n this.onSiteStatus = undefined;\r\n this.seenIn = undefined;\r\n this.usedIn = undefined;\r\n this.usedAt = undefined;\r\n }\r\n get lastSeenAgo() {\r\n return this.coordsAt ? moment(this.coordsAt).fromNow() : '';\r\n }\r\n get lastSeenInDays() {\r\n return this.coordsAt ? moment().diff(moment(this.coordsAt), 'days', true) : undefined;\r\n }\r\n get lastUsedAtAgo() {\r\n return this.usedAt ? moment(this.usedAt).fromNow() : '';\r\n }\r\n}\r\n","export default class UsageService {\r\n constructor($q) {\r\n this.$q = $q;\r\n //The list below are the names of data points in priority order\r\n this.Usage_DataPointS = [\r\n 'operating_hours',\r\n 'unit_hour_meter',\r\n 'engine_hour_meter',\r\n 'run_time',\r\n 'utilization_time',\r\n 'mach_hours'\r\n ];\r\n }\r\n\r\n getUsageSeriesForAssets(series = [], assetIds = []) {\r\n return this.$q((resolve) => {\r\n const assetsUsageSeries = {};\r\n series.forEach((ser) => {\r\n //first tag is data point id\r\n [ser.dataPointId] = ser.tags || [];\r\n\r\n //check if onei3:dp_std=operating_hours been set on the series\r\n const { equipment, ['onei3:dp_std']: usageSeries } = ser.attrs || {};\r\n\r\n const usedAt = ser.last?.changedAt || ser.last?.t;\r\n if (usedAt) {\r\n ser.usedAt = usedAt;\r\n ser.usedAtInDays = this.getDaysNumberFromToday(usedAt);\r\n ser.lastReportedInDays =\r\n ser.last?.t && ser.last?.t !== usedAt\r\n ? this.getDaysNumberFromToday(ser.last?.t)\r\n : ser.usedAtInDays;\r\n }\r\n\r\n if (usageSeries == 'operating_hours') {\r\n //add or override asset series\r\n assetsUsageSeries[equipment] = ser;\r\n return;\r\n }\r\n\r\n // if no operating_hours attrs check if the series one of the predefined one\r\n if (ser.dataPointId && this.Usage_DataPointS.includes(ser.dataPointId)) {\r\n if (equipment in assetsUsageSeries) {\r\n // override the series if the new one has higher priority by being top in the list\r\n if (\r\n this.Usage_DataPointS.indexOf(assetsUsageSeries.dataPointId) <\r\n this.Usage_DataPointS.indexOf(ser.dataPointId)\r\n )\r\n assetsUsageSeries[equipment] = ser;\r\n } else {\r\n assetsUsageSeries[equipment] = ser;\r\n }\r\n }\r\n });\r\n\r\n const assetHasUsageDataPoints = Object.keys(assetsUsageSeries);\r\n const seriesIds = assetHasUsageDataPoints.map((k) => assetsUsageSeries[k].id);\r\n //find if there are assets we requested usage but they have not reported any yet, then set it as undefined.\r\n const assetsWithNoUsageDataPoints = assetIds.filter(\r\n (a) => !assetHasUsageDataPoints.includes(a),\r\n );\r\n assetsWithNoUsageDataPoints.forEach((a) => {\r\n assetsUsageSeries[a] = undefined;\r\n });\r\n\r\n resolve({ assetsUsageSeries, seriesIds });\r\n });\r\n }\r\n\r\n getDaysNumberFromToday(date) {\r\n const num = moment().diff(moment(date), 'days', true);\r\n return Math.round(num * 100) / 100;\r\n }\r\n\r\n aggregateDataPerPeriod(seriesData = []) {\r\n return this.$q((resolve) => {\r\n const assetsUsage = {};\r\n seriesData.forEach((serObj) => {\r\n const { series = {}, data = [] } = serObj;\r\n const { equipment } = series.attrs || {};\r\n const lastUsage = series.last?.v;\r\n const lastUsageAt = series.last?.changedAt || series.last?.t;\r\n if (!equipment) return;\r\n assetsUsage[equipment] = { ...serObj, lastUsage, lastUsageAt };\r\n const usagePeriod = {\r\n today: 0,\r\n yesterday: 0,\r\n '7d': 0,\r\n '14d': 0,\r\n '28d': 0,\r\n };\r\n //TODO calculate usage per day form the result (next last -prev last)\r\n assetsUsage[equipment].usage = usagePeriod;\r\n });\r\n\r\n resolve(assetsUsage);\r\n });\r\n }\r\n}\r\n","import confirmTemplate from './confirm-modal.html';\r\n\r\nexport class ConfirmModal {\r\n constructor($uibModalInstance, title, messages, confirmLabel, confirmClass, onConfirm) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.title = title;\r\n this.messages = messages;\r\n this.confirmLabel = confirmLabel;\r\n this.confirmClass = confirmClass;\r\n this.onConfirm = onConfirm;\r\n this.message = '';\r\n this.processing = false;\r\n }\r\n cancelClicked() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n\r\n confirmClicked() {\r\n this.processing = true;\r\n this.onConfirm((progressMessage) => {\r\n this.message = progressMessage;\r\n })\r\n .then(() => {\r\n this.processing = false;\r\n this.$uibModalInstance.close();\r\n })\r\n .catch((message) => {\r\n this.processing = false;\r\n this.message = message;\r\n });\r\n }\r\n}\r\n\r\nexport function Confirm({ $uibModal, title, messages, confirmLabel, confirmClass, onConfirm }) {\r\n return $uibModal.open({\r\n animation: true,\r\n size: 'sm',\r\n backdrop: 'static',\r\n keyboard: false,\r\n template: confirmTemplate,\r\n controller: ConfirmModal,\r\n controllerAs: 'modalVM',\r\n resolve: {\r\n title: () => title,\r\n messages: () => messages,\r\n confirmLabel: () => confirmLabel,\r\n confirmClass: () => confirmClass || '',\r\n onConfirm: () => onConfirm,\r\n },\r\n }).result;\r\n}\r\n\r\nexport function ConfirmDelete({ $uibModal, title, messages, onConfirm }) {\r\n return Confirm({\r\n $uibModal,\r\n title,\r\n messages,\r\n confirmLabel: 'Delete',\r\n confirmClass: 'btn-danger',\r\n onConfirm,\r\n });\r\n}\r\n","import moment from 'moment';\r\nimport { Asset } from '../models/site-models';\r\nimport wellknown from '../../../../lib/wellknown';\r\nimport UsageService from './usage.service';\r\nimport { dataModel } from '../common/chart/chart.component';\r\nimport { ConfirmDelete } from '../../../components/confirm-modal/confirm-modal';\r\nimport googleMapsService from '../common/map/google.maps.service';\r\n\r\nconst Constant = {\r\n featureKey: 'onei3:feature',\r\n featureValue: 'site',\r\n geoZoneKey: 'onei3:geozone',\r\n};\r\n\r\nexport default class SiteService {\r\n constructor(\r\n securityGroupsService,\r\n EquipmentService,\r\n timeSeriesAPI,\r\n $q,\r\n $ngRedux,\r\n $filter,\r\n $uibModal,\r\n gettext,\r\n $timeout,\r\n gettextCatalog,\r\n ) {\r\n 'ngInject';\r\n this.securityGroupsService = securityGroupsService;\r\n this.EquipmentService = EquipmentService;\r\n this.timeSeriesAPI = timeSeriesAPI;\r\n this.polygon = undefined;\r\n this.usageService = new UsageService($q);\r\n this.reduxStore = $ngRedux;\r\n this.$q = $q;\r\n this.$filter = $filter;\r\n this.views = [];\r\n this.$uibModal = $uibModal;\r\n this.gettext = gettext;\r\n this.$timeout = $timeout;\r\n this.gettextCatalog = gettextCatalog;\r\n\r\n this.seenIn = {\r\n seenIn3d: {\r\n key: 'seenIn3d',\r\n desc: this.gettext('Seen In 3 Days'),\r\n color: '#00aef4',\r\n },\r\n seenIn7d: {\r\n key: 'seenIn7d',\r\n desc: this.gettext('Seen In 7 Days'),\r\n color: '#41c8ff',\r\n },\r\n seenIn14d: {\r\n key: 'seenIn14d',\r\n desc: this.gettext('Seen In 14 Days'),\r\n color: '#8edeff',\r\n },\r\n\r\n notSeenIn14d: {\r\n key: 'notSeenIn14d',\r\n desc: this.gettext('Seen In 14+ Days'),\r\n color: '#dfe7eb',\r\n },\r\n offSite: {\r\n key: 'offSite',\r\n desc: this.gettext('Off Site'),\r\n color: '#ff6c3e',\r\n },\r\n };\r\n\r\n this.usedIn = {\r\n usedIn3d: {\r\n key: 'usedIn3d',\r\n desc: this.gettext('Used In 3 Days'),\r\n color: '#77c176',\r\n },\r\n notUsedIn3d: {\r\n key: 'notUsedIn3d',\r\n desc: this.gettext('Not Used In 3+ Days'),\r\n color: '#f8be1c',\r\n },\r\n notUsedIn7d: {\r\n key: 'notUsedIn7d',\r\n desc: this.gettext('Not Used In 7+ Days'),\r\n color: '#ff9800',\r\n },\r\n notUsedIn14d: {\r\n key: 'notUsedIn14d',\r\n desc: this.gettext('Not Used In 14+ Days'),\r\n color: '#ff6c3e',\r\n },\r\n };\r\n\r\n this.onSiteStatusMap = {\r\n onSite: this.gettext('On Site'),\r\n LikelyOnSite: this.gettext('Likely On Site'),\r\n offSite: this.gettext('Off Site'),\r\n };\r\n\r\n //data\r\n this.assetsIndexer = undefined;\r\n this.site = undefined;\r\n this.onSitePercent = undefined;\r\n this.totalInventory = undefined;\r\n this.usageStatus = undefined;\r\n this.usedInPercent = undefined;\r\n }\r\n\r\n get assets() {\r\n return Object.values(this.assetsIndexer || {});\r\n }\r\n\r\n registerView(view) {\r\n view.index = this.views.length;\r\n this.views.push(view);\r\n return view;\r\n }\r\n\r\n unRegisterView(view) {\r\n this.views = this.views.filter((v) => view.index !== view.index);\r\n }\r\n\r\n updateViews() {\r\n this.$timeout((_) => {\r\n this.views.forEach((v) => {\r\n if (v.updateBindings) {\r\n v.updateBindings();\r\n }\r\n });\r\n });\r\n }\r\n\r\n getSites() {\r\n const siteAttr = { 'onei3:feature': 'site' };\r\n return this.securityGroupsService.getSecurityGroupsByAttrs(siteAttr).then(({ data }) => {\r\n const d = data.map((s) => ({\r\n ...s,\r\n geoZone: s.attrs['onei3:geozone'] || '',\r\n description: s.attrs['description'] || '',\r\n address: s.attrs['address'] || '',\r\n creationDate: s.createdAt ? this.$filter('TableDateFilter')(s.createdAt) : '',\r\n }));\r\n return d;\r\n });\r\n }\r\n\r\n getSite(id) {\r\n this.siteStatus = 'loading';\r\n if (this.site && this.site.id !== id) {\r\n this.clearData();\r\n }\r\n return this.securityGroupsService.getSingleGroup(id).then(({ data }) => {\r\n this.site = {\r\n ...data,\r\n geoZone: data.attrs['onei3:geozone'] || '',\r\n description: data.attrs['description'] || '',\r\n address: data.attrs['address'] || '',\r\n assets: data.resources.filter((r) => r.type === 'equipment').map((r) => r.id),\r\n };\r\n\r\n return this.site;\r\n });\r\n }\r\n\r\n /**\r\n * this method calls elastic search for assets, but due to delay in indexing the new added assets\r\n * we switch to use call be ids instead.\r\n * @param {*} id\r\n * @returns\r\n */\r\n getSiteAssetsBySiteId(id) {\r\n const f = {\r\n attrs: [],\r\n tags: [{ value: `onei3:security:group:${id}`, group: 'security groups' }],\r\n queries: ['*'],\r\n limit: 2500,\r\n since: 0,\r\n sort: ['name.raw:asc'],\r\n };\r\n\r\n return this.EquipmentService.getEquipmentBySearchFilter(f).then(({ data }) => {\r\n this.assetsIndexer = (data.hits || []).reduce((acc, a) => {\r\n const asset = new Asset(a);\r\n\r\n if (this.site) {\r\n asset.onSite = this.isPointInsideGaPolygon(asset.lat, asset.lng, this.site.geoZone);\r\n }\r\n\r\n asset.seenIn = this.getSeenInKey(asset.lastSeenInDays);\r\n const { status, color } = this.getOnsiteStatus(asset.seenIn, asset.onSite);\r\n asset.onSiteStatus = status || '';\r\n asset.onSiteStatusColor = color || '';\r\n acc[asset.id] = asset;\r\n return acc;\r\n }, {});\r\n\r\n //calculate total matrix\r\n this.totalInventory = Object.keys(this.assetsIndexer).length;\r\n this.onSitePercent = this.getOnsitePercent(Object.values(this.assetsIndexer));\r\n this.usageStatus = 'loading';\r\n this.siteStatus = 'loaded';\r\n\r\n //update the ui\r\n this.updateViews();\r\n\r\n //get asset usage data\r\n this.getAssetUsageSeriesData(Object.keys(this.assetsIndexer));\r\n\r\n return {\r\n ...data,\r\n hits: Object.values(this.assetsIndexer),\r\n };\r\n });\r\n }\r\n\r\n getSiteAssetsByIds(assetIds) {\r\n const filter = {\r\n criteria: {\r\n ids: assetIds,\r\n },\r\n };\r\n return this.EquipmentService.postEquipmentListByIds(filter).then(({ data = [] }) => {\r\n const polygon = this.site ? googleMapsService.getPolygon(this.site.geoZone) : '';\r\n this.assetsIndexer = (data || []).reduce((acc, a) => {\r\n const asset = new Asset(a);\r\n\r\n if (this.site) {\r\n asset.onSite = googleMapsService.isPointInsideGaPolygon(asset.lat, asset.lng, polygon);\r\n }\r\n\r\n asset.seenIn = this.getSeenInKey(asset.lastSeenInDays);\r\n const { status, color } = this.getOnsiteStatus(asset.seenIn, asset.onSite);\r\n asset.onSiteStatus = status || '';\r\n asset.onSiteStatusColor = color || '';\r\n acc[asset.id] = asset;\r\n return acc;\r\n }, {});\r\n\r\n //calculate total matrix\r\n this.totalInventory = this.assets.length;\r\n this.onSitePercent = this.getOnsitePercent(this.assets);\r\n this.usageStatus = 'loading';\r\n this.siteStatus = 'loaded';\r\n\r\n //update the ui\r\n this.updateViews();\r\n\r\n //get asset usage data\r\n this.getAssetUsageSeriesData(Object.keys(this.assetsIndexer));\r\n return this.assets;\r\n });\r\n }\r\n\r\n /**\r\n * calculation using leaflet\r\n * @param {*} lat\r\n * @param {*} lng\r\n * @param {*} geometry\r\n * @returns\r\n */\r\n isPointInsidePolygon(lat, lng, geometry) {\r\n if (!lat || !lng) return true;\r\n const [points] = (wellknown.parse(geometry) || {}).coordinates;\r\n if (!points || !points.length) return true;\r\n const polyPoints = (points || []).map(([lat, lng]) => L.latLng(lat, lng));\r\n\r\n const x = lat;\r\n const y = lng;\r\n\r\n let inside = false;\r\n for (let i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {\r\n const xi = polyPoints[i].lat,\r\n yi = polyPoints[i].lng;\r\n const xj = polyPoints[j].lat,\r\n yj = polyPoints[j].lng;\r\n\r\n const intersect = yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\r\n if (intersect) inside = !inside;\r\n }\r\n\r\n return inside;\r\n }\r\n\r\n getAssetUsageSeriesData(assetIds = []) {\r\n this.assetSeries = undefined;\r\n return this.timeSeriesAPI.getAssetSeries(assetIds).then((series) => {\r\n return this.usageService\r\n .getUsageSeriesForAssets(series, assetIds)\r\n .then(({ assetsUsageSeries, seriesIds }) => {\r\n // No need for this at this time, so far will not doing aggregation by day usage.\r\n // this.getAssetSeriesData(seriesIds);\r\n this.assetSeries = assetsUsageSeries;\r\n //update assetsIndexer usage data\r\n Object.keys(this.assetsIndexer).forEach((assetId) => {\r\n const usage = assetsUsageSeries[assetId];\r\n this.assetsIndexer[assetId].usage = usage;\r\n this.assetsIndexer[assetId].usedAtInDays = usage?.usedAtInDays;\r\n this.assetsIndexer[assetId].lastReportedUsageIn3d =\r\n (usage?.lastReportedInDays || Number.MAX_VALUE) < 3.5;\r\n const usageInDays = usage ? usage.usedAtInDays : Number.MAX_VALUE;\r\n this.assetsIndexer[assetId].usedIn = this.getUsedInInKey(usageInDays);\r\n this.assetsIndexer[assetId].usedAt = usage?.usedAt;\r\n });\r\n this.usedInPercent = this.getUsedInPercent(this.assets);\r\n this.usageStatus = 'loaded';\r\n this.updateViews();\r\n\r\n this.updateAssetsWithLikeQtyData()\r\n .then((_) => {\r\n this.updateViews();\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n });\r\n\r\n return this.assetSeries;\r\n });\r\n });\r\n }\r\n\r\n getAssetSeriesData(seriesIds = {}) {\r\n //start from the beginning of next day in order to include aggregated current day in the result\r\n const end = moment().startOf('day').add(1, 'day').toDate();\r\n\r\n // in order to keep the range relevant to 1 day aggregation: by using end date to construct of\r\n //and subtract by hour instead of day to keep the utc date range hour matching\r\n const start = moment(end)\r\n .subtract(28 * 24, 'hours')\r\n .toDate();\r\n\r\n console.log(moment(start).format());\r\n console.log(moment(end).format());\r\n\r\n const dateRange = `${start.toISOString()}/${end.toISOString()}`;\r\n this.timeSeriesAPI\r\n .getSeriesData(dateRange, seriesIds, ['delta', 'first', 'last', 'count'], '1day')\r\n .then((data) => {\r\n return this.usageService.aggregateDataPerPeriod(data).then((d) => console.log(d));\r\n });\r\n }\r\n\r\n getLastSeenChartData(assets = []) {\r\n return this.$q((resolve) => {\r\n const assetIds = (assets || []).map((s) => s.id);\r\n if (!this.assets) resolve(undefined);\r\n const seenIn3d = [];\r\n const seenIn7d = [];\r\n const seenIn14d = [];\r\n const notSeenIn14d = [];\r\n const offSite = [];\r\n assetIds.forEach((assetId) => {\r\n const asset = this.assetsIndexer[assetId];\r\n if (asset.onSite) {\r\n switch (asset.seenIn) {\r\n case this.seenIn.seenIn3d.key:\r\n seenIn3d.push(asset.id);\r\n break;\r\n case this.seenIn.seenIn7d.key:\r\n seenIn7d.push(asset.id);\r\n break;\r\n case this.seenIn.seenIn14d.key:\r\n seenIn14d.push(asset.id);\r\n break;\r\n default:\r\n notSeenIn14d.push(asset.id);\r\n break;\r\n }\r\n } else {\r\n offSite.push(asset.id);\r\n }\r\n });\r\n this.lastSeenChartData = [\r\n new dataModel(\r\n this.seenIn.seenIn3d.key,\r\n this.seenIn.seenIn3d.desc,\r\n this.seenIn.seenIn3d.color,\r\n seenIn3d.length,\r\n ),\r\n new dataModel(\r\n this.seenIn.seenIn7d.key,\r\n this.seenIn.seenIn7d.desc,\r\n this.seenIn.seenIn7d.color,\r\n seenIn7d.length,\r\n ),\r\n new dataModel(\r\n this.seenIn.seenIn14d.key,\r\n this.seenIn.seenIn14d.desc,\r\n this.seenIn.seenIn14d.color,\r\n seenIn14d.length,\r\n ),\r\n new dataModel(\r\n this.seenIn.notSeenIn14d.key,\r\n this.seenIn.notSeenIn14d.desc,\r\n this.seenIn.notSeenIn14d.color,\r\n notSeenIn14d.length,\r\n ),\r\n new dataModel(\r\n this.seenIn.offSite.key,\r\n this.seenIn.offSite.desc,\r\n this.seenIn.offSite.color,\r\n offSite.length,\r\n ),\r\n ];\r\n\r\n resolve(this.lastSeenChartData.filter((i) => i.value));\r\n });\r\n }\r\n\r\n getUsageChartData(assets) {\r\n const assetIds = (assets || []).map((s) => s.id);\r\n\r\n return this.$q((resolve) => {\r\n if (!assetIds.length) resolve(undefined);\r\n const usedIn3d = [];\r\n const notUsedIn3d = [];\r\n const notUsedIn7d = [];\r\n const notUsedIn14d = [];\r\n assetIds.forEach((assetId) => {\r\n const asset = this.assetsIndexer[assetId];\r\n switch (asset.usedIn) {\r\n case this.usedIn.usedIn3d.key:\r\n usedIn3d.push(assetId);\r\n break;\r\n case this.usedIn.notUsedIn3d.key:\r\n notUsedIn3d.push(assetId);\r\n break;\r\n case this.usedIn.notUsedIn7d.key:\r\n notUsedIn7d.push(assetId);\r\n break;\r\n default:\r\n notUsedIn14d.push(assetId);\r\n break;\r\n }\r\n });\r\n this.usageChartData = [\r\n new dataModel(\r\n this.usedIn.usedIn3d.key,\r\n this.usedIn.usedIn3d.desc,\r\n this.usedIn.usedIn3d.color,\r\n usedIn3d.length,\r\n ),\r\n new dataModel(\r\n this.usedIn.notUsedIn3d.key,\r\n this.usedIn.notUsedIn3d.desc,\r\n this.usedIn.notUsedIn3d.color,\r\n notUsedIn3d.length,\r\n ),\r\n new dataModel(\r\n this.usedIn.notUsedIn7d.key,\r\n this.usedIn.notUsedIn7d.desc,\r\n this.usedIn.notUsedIn7d.color,\r\n notUsedIn7d.length,\r\n ),\r\n new dataModel(\r\n this.usedIn.notUsedIn14d.key,\r\n this.usedIn.notUsedIn14d.desc,\r\n this.usedIn.notUsedIn14d.color,\r\n notUsedIn14d.length,\r\n ),\r\n ];\r\n resolve(this.usageChartData.filter((i) => i.value));\r\n });\r\n }\r\n\r\n clearData() {\r\n this.assetSeries = undefined;\r\n this.assetsIndexer = {};\r\n this.onSitePercent = undefined;\r\n this.totalInventory = undefined;\r\n this.usageStatus = undefined;\r\n this.usedInPercent = undefined;\r\n this.updateViews();\r\n }\r\n\r\n getAssetsByFilter(query, filters, preDefinedFilter) {\r\n return this.$q((resolve) => {\r\n let assets = Object.values(this.assetsIndexer || {});\r\n if (preDefinedFilter && preDefinedFilter.match) {\r\n assets = assets.filter((a) => preDefinedFilter.match(a));\r\n }\r\n resolve(this.filterAssets(assets, query, filters));\r\n });\r\n }\r\n\r\n getOnsitePercent(assets = []) {\r\n const onSiteTotal = assets.filter((a) => a.onSite).length;\r\n return assets.length ? ((onSiteTotal * 100) / assets.length).toPrecision(3) : 0;\r\n }\r\n\r\n getSeenInKey(seenInDays) {\r\n //last seen col in the ui use moment().fromNow(); witch round up the date like ( 3.5 will be 4 days ago ), so to keep the data consistent we will use .5 as the limit\r\n switch (true) {\r\n case seenInDays < 3.5:\r\n return this.seenIn.seenIn3d.key;\r\n case seenInDays < 7.5:\r\n return this.seenIn.seenIn7d.key;\r\n case seenInDays < 14.5:\r\n return this.seenIn.seenIn14d.key;\r\n default:\r\n return this.seenIn.notSeenIn14d.key;\r\n }\r\n }\r\n\r\n getUsedInInKey(usageInDays) {\r\n //last used col in the ui use moment().fromNow(); witch round up the date like ( 3.5 will say 4 days ago), so to keep the data consistent we will use .5 as the limit\r\n switch (true) {\r\n case usageInDays < 3.5:\r\n return this.usedIn.usedIn3d.key;\r\n case usageInDays < 7.5:\r\n return this.usedIn.notUsedIn3d.key;\r\n case usageInDays < 14.5:\r\n return this.usedIn.notUsedIn7d.key;\r\n default:\r\n return this.usedIn.notUsedIn14d.key;\r\n }\r\n }\r\n\r\n filterAssets(assets, query, filters) {\r\n let assetsRet = assets;\r\n\r\n if (query) {\r\n assetsRet = this.$filter('filter')(assetsRet, (query || '').trim());\r\n }\r\n\r\n return assetsRet.filter((asset) => {\r\n return filters.every((filter) => filter.match(asset));\r\n });\r\n }\r\n\r\n getCsvData(assets, columnsDef = []) {\r\n return this.$q((resolve, reject) => {\r\n if (!columnsDef.length) reject('missing columns definition');\r\n\r\n const headers = columnsDef.reduce((csvHeader, col) => {\r\n csvHeader[col.field] = col.title;\r\n return csvHeader;\r\n }, {});\r\n\r\n const headersKeyArray = Object.keys(headers || {});\r\n\r\n const data = assets.map((asset) => {\r\n const csvRowData = headersKeyArray.reduce((row, field) => {\r\n //this ok as long we have asset as flat object\r\n // else we need to get the value using lodash get or the column getvalue()\r\n row[field] = asset[field];\r\n return row;\r\n }, {});\r\n return csvRowData;\r\n });\r\n\r\n resolve([headers, ...data]);\r\n });\r\n }\r\n\r\n getUsedInPercent(assets = []) {\r\n const usedInTotal = assets.filter((a) => a.usedIn === this.usedIn.usedIn3d.key && a.onSite)\r\n .length;\r\n return assets.length ? ((usedInTotal * 100) / assets.length).toPrecision(3) : 0;\r\n }\r\n\r\n updateAssetsWithLikeQtyData() {\r\n return this.$q((resolve) => {\r\n const assetWithQty = this.calculateLikeQtyOnsite(this.assets);\r\n Object.keys(assetWithQty).forEach((assetId) => {\r\n const { qty, qtyPercent } = assetWithQty[assetId];\r\n this.assetsIndexer[assetId].ccLikeQtyOnSite = qty;\r\n this.assetsIndexer[assetId].ccLikeQtyOnSiteUsagePercent = qtyPercent;\r\n });\r\n resolve(this.assetsIndexer);\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} assets\r\n * @returns object {assetId : {qty,qtyPercent}}\r\n */\r\n calculateLikeQtyOnsite(assets = []) {\r\n //to group assets that onsite by catClass\r\n const catClassOnsite = {};\r\n //to group assets that onsite and used in 7 days by catClass\r\n const catClassOnsiteUsedIn7days = {};\r\n assets.forEach((asset) => {\r\n if (asset.onSite) {\r\n const catClass = asset.catClass;\r\n if (catClass) {\r\n catClassOnsite[catClass] = [asset.id, ...(catClassOnsite[catClass] || [])];\r\n\r\n if (asset.usedIn === this.usedIn.usedIn3d.key) {\r\n catClassOnsiteUsedIn7days[catClass] = [\r\n asset.id,\r\n ...(catClassOnsiteUsedIn7days[catClass] || []),\r\n ];\r\n }\r\n }\r\n }\r\n });\r\n\r\n const assetsWithLikeQtyData = Object.keys(catClassOnsite).reduce(\r\n (assetsWithLikeQty, catClass) => {\r\n //as long as there is catClass then there should be at least one asset\r\n const assetsOnSitQty = catClassOnsite[catClass];\r\n const assetsOnSitQtyUsed = catClassOnsiteUsedIn7days[catClass] || [];\r\n const usedQtyPercent = (\r\n (assetsOnSitQtyUsed.length * 100) /\r\n assetsOnSitQty.length\r\n ).toPrecision(3);\r\n\r\n assetsOnSitQty.forEach((assetId) => {\r\n assetsWithLikeQty[assetId] = {\r\n qty: assetsOnSitQty.length,\r\n qtyPercent: usedQtyPercent,\r\n };\r\n });\r\n\r\n return assetsWithLikeQty;\r\n },\r\n {},\r\n );\r\n\r\n return assetsWithLikeQtyData;\r\n }\r\n\r\n getOnsiteStatus(seenIn, onsite) {\r\n if (!seenIn) return {};\r\n if (!onsite) return { status: this.onSiteStatusMap.offSite, color: this.seenIn.offSite.color };\r\n if (seenIn === this.seenIn.seenIn3d.key)\r\n return { status: this.onSiteStatusMap.onSite, color: this.seenIn.seenIn3d.color };\r\n return { status: this.onSiteStatusMap.LikelyOnSite, color: this.seenIn[seenIn].color };\r\n }\r\n\r\n createSite(site, assetsIds, users) {\r\n const { name, description, address, assets, geoZone } = site || {};\r\n const attrF = { [Constant.featureKey]: Constant.featureValue };\r\n const attrG = geoZone ? { [Constant.geoZoneKey]: geoZone } : {};\r\n const newSec = {\r\n name,\r\n attrs: {\r\n ...attrF,\r\n ...attrG,\r\n description,\r\n address,\r\n },\r\n };\r\n const prefix = this.securityGroupsService.getResourceUrl();\r\n const assetsResources = (assetsIds || []).map((id) => ({\r\n op: 'add',\r\n value: {\r\n resource: `${prefix}${id}`,\r\n },\r\n }));\r\n\r\n const userPrefix = this.securityGroupsService.getUserUrl();\r\n const usersResources = (users || []).map((user) => ({\r\n op: 'add',\r\n value: {\r\n user: `${userPrefix}${user.id}`,\r\n },\r\n }));\r\n\r\n return this.createNewSec(newSec).then((sec) => {\r\n return this.$q((resolve) => {\r\n //update assets / users\r\n this.securityGroupsService\r\n .patchResources(sec.id, [...assetsResources, ...usersResources])\r\n .finally(() => {\r\n resolve(sec);\r\n });\r\n });\r\n });\r\n }\r\n\r\n updateSiteAssets(securityGroupId, addedAssets = [], removedAssets = []) {\r\n const assetsResources = [];\r\n const prefix = this.securityGroupsService.getResourceUrl();\r\n\r\n addedAssets.forEach((id) => {\r\n assetsResources.push({\r\n op: 'add',\r\n value: {\r\n resource: `${prefix}${id}`,\r\n },\r\n });\r\n });\r\n\r\n removedAssets.forEach((id) => {\r\n assetsResources.push({\r\n op: 'remove',\r\n value: {\r\n resource: `${prefix}${id}`,\r\n },\r\n });\r\n });\r\n\r\n return this.securityGroupsService.patchResources(securityGroupId, assetsResources);\r\n }\r\n\r\n createNewSec(sec) {\r\n return this.securityGroupsService.postNewGroup(sec).then((res) => res.data);\r\n }\r\n\r\n openAssetSelector(selected = []) {\r\n return this.$q((resolve) => {\r\n this.$uibModal\r\n .open({\r\n animation: true,\r\n template: require('../../../components/assetpicker/asset.multi.picker.html'),\r\n controller: 'AssetMultiPickerController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: false,\r\n requiresSelection: false,\r\n maxSelection: () => 0,\r\n selectedAssets: () =>\r\n selected.reduce((idsIndex, asset) => {\r\n idsIndex[asset?.id] = asset || {};\r\n return idsIndex;\r\n }, {}),\r\n },\r\n })\r\n .result.then((res) => {\r\n resolve(res);\r\n })\r\n .catch(() => {\r\n resolve(selected);\r\n });\r\n });\r\n }\r\n\r\n updateSite(site) {\r\n const { id, name, attrs, description, address, geoZone } = site || {};\r\n const attrG = { [Constant.geoZoneKey]: geoZone };\r\n const sec = {\r\n name,\r\n attrs: {\r\n ...attrs,\r\n ...attrG,\r\n description,\r\n address,\r\n },\r\n };\r\n return this.securityGroupsService.putGroupUpdate(id, sec);\r\n }\r\n\r\n deleteSite(site) {\r\n const onConfirm = () => this.securityGroupsService.deleteGroup(site.id);\r\n const title = this.gettextCatalog.getString('Delete Site');\r\n const msg = this.gettextCatalog.getString('Are you sure you want to delete \"{{name}}\"?', {\r\n name: site.name,\r\n });\r\n const messages = [msg];\r\n return ConfirmDelete({ $uibModal: this.$uibModal, title, messages, onConfirm });\r\n }\r\n\r\n openUsersSelector(selected = [], appliedUsers = []) {\r\n return this.$uibModal\r\n .open({\r\n animation: true,\r\n template: require('../../../pages/admin/security-groups/view/users/users-modal/users.modal.html'),\r\n controller: 'SecurityGroupViewUserSelectionModalController',\r\n size: 'lg',\r\n resolve: {\r\n singleSelect: false,\r\n selectedUsers: () =>\r\n selected.reduce((idsIndex, user) => {\r\n idsIndex[user?.id] = user || {};\r\n return idsIndex;\r\n }, {}),\r\n },\r\n })\r\n .result.then((res) => {\r\n const finalSelection = Object.keys(res || {});\r\n const alreadyAdded = (appliedUsers || []).map((u) => u.id);\r\n const added = finalSelection.filter((uid) => !alreadyAdded.includes(uid));\r\n const removed = alreadyAdded.filter((uid) => !finalSelection.includes(uid));\r\n const finalUsers = Object.values(res || {});\r\n return {\r\n added,\r\n removed,\r\n finalUsers,\r\n };\r\n });\r\n }\r\n\r\n updateSiteUsers(siteId, addedIds = [], removedIds = []) {\r\n const prefix = this.securityGroupsService.getUserUrl();\r\n\r\n const addedUsersResources = (addedIds || []).map((id) => ({\r\n op: 'add',\r\n value: {\r\n user: `${prefix}${id}`,\r\n },\r\n }));\r\n const removedUsersResources = (removedIds || []).map((id) => ({\r\n op: 'remove',\r\n value: {\r\n user: `${prefix}${id}`,\r\n },\r\n }));\r\n\r\n const usersResources = [...addedUsersResources, ...removedUsersResources];\r\n\r\n return this.securityGroupsService.patchResources(siteId, usersResources);\r\n }\r\n\r\n updateSiteAssets(siteId, addedIds = [], removedIds = []) {\r\n const prefix = this.securityGroupsService.getResourceUrl();\r\n\r\n const addedAssetsResources = (addedIds || []).map((id) => ({\r\n op: 'add',\r\n value: {\r\n resource: `${prefix}${id}`,\r\n },\r\n }));\r\n const removedAssetsResources = (removedIds || []).map((id) => ({\r\n op: 'remove',\r\n value: {\r\n resource: `${prefix}${id}`,\r\n },\r\n }));\r\n\r\n const resources = [...addedAssetsResources, ...removedAssetsResources];\r\n\r\n return this.securityGroupsService.patchResources(siteId, resources);\r\n }\r\n}\r\n","export default class FiltersService {\r\n constructor(gettext, gettextCatalog) {\r\n 'ngInject';\r\n\r\n this.filtersConfig = {\r\n name: {\r\n label: gettext('Name'),\r\n value: '',\r\n type: 'text',\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.name || '';\r\n\r\n return val.toLowerCase().includes(this.value.toLowerCase());\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n make: {\r\n label: gettext('Make'),\r\n value: '',\r\n type: 'text',\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.make || '';\r\n\r\n return val.toLowerCase().includes(this.value.toLowerCase());\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n model: {\r\n label: gettext('Model'),\r\n value: '',\r\n type: 'text',\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.model || '';\r\n\r\n return val.toLowerCase().includes(this.value.toLowerCase());\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n cat: {\r\n label: gettext('Cat'),\r\n value: '',\r\n type: 'text',\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.cat || '';\r\n\r\n return val.toLowerCase().includes(this.value.toLowerCase());\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n class: {\r\n label: gettext('Class'),\r\n value: '',\r\n type: 'text',\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.class || '';\r\n\r\n return val.toLowerCase().includes(this.value.toLowerCase());\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n seenIn: {\r\n label: gettext('Seen In'),\r\n value: '',\r\n type: 'select',\r\n options: [\r\n {\r\n key: 'seenIn3d',\r\n desc: gettext('Seen In 3 Days'),\r\n },\r\n {\r\n key: 'seenIn7d',\r\n desc: gettext('Seen In 7 Days'),\r\n },\r\n {\r\n key: 'seenIn14d',\r\n desc: gettext('Seen In 14 Days'),\r\n },\r\n {\r\n key: 'notSeenIn14d',\r\n desc: gettext('Seen In 14+ Days'),\r\n },\r\n {\r\n key: 'offSite',\r\n desc: gettext('Off Site'),\r\n },\r\n ],\r\n match(asset) {\r\n if (!this.value) return true;\r\n if (this.value === 'offSite') {\r\n return !asset.onSite;\r\n }\r\n return asset.onSite && asset.seenIn === this.value;\r\n },\r\n getDescription() {\r\n if (this.value) {\r\n return gettextCatalog.getString(\r\n this.options.find((option) => option.key === this.value).desc,\r\n );\r\n }\r\n\r\n return '';\r\n },\r\n },\r\n usedIn: {\r\n label: gettext('Used In'),\r\n value: '',\r\n type: 'select',\r\n options: [\r\n {\r\n key: 'usedIn3d',\r\n desc: gettext('Used In 3 Days'),\r\n },\r\n {\r\n key: 'notUsedIn3d',\r\n desc: gettext('Not Used In 3+ Days'),\r\n },\r\n {\r\n key: 'notUsedIn7d',\r\n desc: gettext('Not Used In 7+ Days'),\r\n },\r\n {\r\n key: 'notUsedIn14d',\r\n desc: gettext('Not Used In 14+ Days'),\r\n },\r\n ],\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.usedIn || '';\r\n\r\n return val === this.value;\r\n },\r\n getDescription() {\r\n if (this.value) {\r\n return gettextCatalog.getString(\r\n this.options.find((option) => option.key === this.value).desc,\r\n );\r\n }\r\n\r\n return '';\r\n },\r\n },\r\n assetType: {\r\n label: gettext('Asset Type'),\r\n value: '',\r\n type: 'select',\r\n options: [\r\n {\r\n key: 'Tool',\r\n desc: gettext('Tool'),\r\n },\r\n {\r\n key: 'Accessory',\r\n desc: gettext('Accessory'),\r\n },\r\n {\r\n key: 'Material',\r\n desc: gettext('Material'),\r\n },\r\n {\r\n key: 'Storage',\r\n desc: gettext('Storage'),\r\n },\r\n {\r\n key: 'Equipment',\r\n desc: gettext('Equipment'),\r\n },\r\n {\r\n key: 'gateway',\r\n desc: gettext('Gateway'),\r\n },\r\n ],\r\n match(asset) {\r\n if (!this.value) return true;\r\n\r\n const val = asset.assetType || '';\r\n\r\n return val.toLowerCase() === this.value.toLowerCase();\r\n },\r\n getDescription() {\r\n return `${gettextCatalog.getString(this.label)}: ${this.value}`;\r\n },\r\n },\r\n onSite: {\r\n label: gettext('On Site'),\r\n value: '',\r\n type: 'select',\r\n options: [\r\n {\r\n key: 'onsite',\r\n desc: gettext('On Site'),\r\n },\r\n {\r\n key: 'offsite',\r\n desc: gettext('Off Site'),\r\n },\r\n ],\r\n match(asset) {\r\n if (this.value) {\r\n const val = asset.onSite || false;\r\n return this.value === 'onsite' ? val : !val;\r\n }\r\n return true;\r\n },\r\n getDescription() {\r\n if (this.value !== '') {\r\n return gettextCatalog.getString(\r\n this.options.find((option) => option.key === this.value).desc,\r\n );\r\n }\r\n\r\n return '';\r\n },\r\n },\r\n };\r\n }\r\n\r\n getDefaultFilters(filterNames = []) {\r\n const filterIndex = filterNames.reduce((obj, cur, index) => {\r\n obj[cur] = index;\r\n return obj;\r\n }, {});\r\n\r\n const filters = filterNames.map((filterName) => ({ ...this.filtersConfig[filterName] }));\r\n\r\n const getFilterByName = (filterName) => filters[filterIndex[filterName]];\r\n\r\n return [filters, getFilterByName];\r\n }\r\n}\r\n","import angular from 'angular';\r\n\r\n/* Configuration Imports */\r\nimport SiteRouteConfig from './sites.route';\r\n\r\n//-- common components\r\nimport tableComponent from './common/table/table';\r\nimport mapComponent from './common/map/ga-map.component';\r\nimport ChartComponent from './common/chart/chart.component';\r\nimport appliedFiltersViewComponent from './common/applied-filters-view/applied-filters-view.component';\r\nimport SearchInputComponent from './common/search-input/search-input.component';\r\nimport SiteFiltersComponent from './common/site-filters/site-filters.component';\r\nimport UsersListView from './common/users-list-view/users-list-view.component';\r\n\r\n/* Component Imports */\r\nimport sitesMainComponent from './sites-main.component';\r\nimport sitesListComponent from './sites-list/sites-list.component';\r\nimport siteViewComponent from './site-view/site-view.component';\r\nimport assetListViewComponent from './asset-list-view/asset-list-view.component';\r\nimport siteManageViewComponent from './site-manage-view/site-manage-view.component';\r\n\r\n//--- services\r\nimport SiteService from './services/sites.service';\r\nimport FiltersService from './services/filters.service';\r\n\r\n/* Module Imports */\r\nimport apiModule from '../../api/api.module';\r\nimport componentModules from '../../components/components.module';\r\n\r\nconst siteModule = angular.module('app.sites', [\r\n //INTERNAL\r\n apiModule,\r\n componentModules,\r\n //THIRD PARTY\r\n 'ui.bootstrap',\r\n 'ui.router',\r\n 'gettext',\r\n]);\r\n\r\nsiteModule\r\n /* Configurations */\r\n .config(SiteRouteConfig)\r\n\r\n /* Services */\r\n .service('sitesService', SiteService)\r\n .service('filtersService', FiltersService)\r\n\r\n /* common */\r\n .component('zcTable', tableComponent)\r\n .component('siteMap', mapComponent)\r\n .component('zChart', ChartComponent)\r\n .component('appliedFiltersView', appliedFiltersViewComponent)\r\n .component('searchInput', SearchInputComponent)\r\n .component('siteFilters', SiteFiltersComponent)\r\n .component('usersListView', UsersListView)\r\n\r\n /* components */\r\n .component('sitesMain', sitesMainComponent)\r\n .component('sitesList', sitesListComponent)\r\n .component('siteView', siteViewComponent)\r\n .component('assetListView', assetListViewComponent)\r\n .component('siteManageView', siteManageViewComponent);\r\n\r\nexport default siteModule.name;\r\n","export default class EquipmentUpdateModal {\r\n constructor($uibModalInstance, asset) {\r\n 'ngInject';\r\n this.$uibModalInstance = $uibModalInstance;\r\n this.asset = asset;\r\n }\r\n ok() {\r\n this.$uibModalInstance.close();\r\n }\r\n cancel() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n}\r\n","import modelTemplate from '../modal/equipment-update.modal.html';\r\nimport modalController from '../modal/equipment-update.modal';\r\nlet sum = 0;\r\nexport default class EquipmentUpdateService {\r\n constructor($uibModal, EquipmentService, $ngRedux, $q, $interval) {\r\n 'ngInject';\r\n this.$uibModal = $uibModal;\r\n this.EquipmentService = EquipmentService;\r\n this.$ngRedux = $ngRedux;\r\n this.$q = $q;\r\n this.$interval = $interval;\r\n }\r\n\r\n openEditModal(asset) {\r\n return this.$uibModal.open({\r\n animation: true,\r\n size: 'lg',\r\n backdrop: 'static',\r\n keyboard: false,\r\n template: modelTemplate,\r\n controller: modalController,\r\n controllerAs: 'modalVm',\r\n resolve: {\r\n asset: () => asset,\r\n },\r\n }).result;\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} changeSet [] of {op ,id,values}\r\n */\r\n updateAssetsAttrs(changeSet) {\r\n return this.EquipmentService.batchPatchAttrs(changeSet);\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} assets\r\n * @returns assets with attrs as {[normalizeKey]:{...,originalVal,value}}\r\n */\r\n getEditAssetsAttrsModel(assets = []) {\r\n return assets.map((a) => {\r\n const normalizedAttrsObject = Object.keys(a.attrs || {}).reduce(\r\n (acc, attrKey) => ({\r\n ...acc,\r\n [attrKey.toLowerCase()]: {\r\n key: attrKey,\r\n normalizeKey: attrKey.toLowerCase(),\r\n value: a.attrs[attrKey],\r\n originalVal: a.attrs[attrKey],\r\n },\r\n }),\r\n {},\r\n );\r\n return {\r\n ...a,\r\n originalAttrs: JSON.stringify(normalizedAttrsObject),\r\n attrs: normalizedAttrsObject,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * filter and index attrs by lowercase key\r\n * @param {*} storeData\r\n * @returns { allAttr, attrsWithoutReadonly, keyedAttrs }\r\n */\r\n indexAttributes(storeData) {\r\n const { secured, items } = storeData || {};\r\n const readonlyList = (secured || {}).readonly || [];\r\n\r\n const mappedData = items.reduce(\r\n (acc, item) => {\r\n let { allAttr = [], attrsWithoutReadonly = [], keyedAttrs = {} } = acc || {};\r\n\r\n const normalizeKey = item.key.toLowerCase();\r\n const readonly = readonlyList.includes(normalizeKey);\r\n\r\n const attr = { ...item, normalizeKey, readonly };\r\n\r\n allAttr = [...allAttr, attr];\r\n if (!readonly) {\r\n attrsWithoutReadonly = [...attrsWithoutReadonly, attr];\r\n }\r\n\r\n keyedAttrs = { ...keyedAttrs, [normalizeKey]: attr };\r\n\r\n return { allAttr, attrsWithoutReadonly, keyedAttrs, readonlyList };\r\n },\r\n\r\n {},\r\n );\r\n\r\n return mappedData;\r\n }\r\n\r\n /**\r\n *\r\n * @returns attributes from redux store\r\n */\r\n getAttributesFromStore() {\r\n return this.$q((resolve, reject) => {\r\n let count = 0;\r\n\r\n let loader = this.$interval(() => {\r\n const state = this.$ngRedux.getState();\r\n const { attributes } = state;\r\n let { secured = {}, isSecuredLoaded, items, loading, error } = attributes;\r\n\r\n if (!loading && isSecuredLoaded) {\r\n this.$interval.cancel(loader);\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve({ secured, items });\r\n }\r\n }\r\n\r\n ++count;\r\n //time out if call take too long, total wait so far 4min\r\n if (count * 50 > 240000) {\r\n this.$interval.cancel(loader);\r\n reject('Timed out: could not read store data');\r\n }\r\n }, 50);\r\n });\r\n }\r\n\r\n getAttributes() {\r\n return this.getAttributesFromStore().then((result) => {\r\n return this.indexAttributes(result);\r\n });\r\n }\r\n}\r\n","export default class KeyboardKeysService {\r\n constructor($document, $timeout) {\r\n 'ngInject';\r\n this.default = $document;\r\n this.$timeout = $timeout;\r\n }\r\n\r\n /**\r\n * set keyup and keydown on an element, default will be document\r\n * @param {*}onCtrlS : ctrl+S callback\r\n * @param onCtrlZ : ctrl+V callback\r\n */\r\n set({ elem = null, onCtrlS, onCtrlZ }) {\r\n this.element = elem || this.default;\r\n this.onCtrlS = onCtrlS;\r\n this.onCtrlZ = onCtrlZ;\r\n this.element.bind('keydown', this.onKeyDown.bind(this));\r\n }\r\n\r\n /**\r\n * clear the events\r\n */\r\n unSet() {\r\n this.onCtrlS = undefined;\r\n this.onCtrlZ = undefined;\r\n this.element.unbind('keydown');\r\n this.element = undefined;\r\n }\r\n\r\n onKeyDown(event) {\r\n if (this.onCtrlS) {\r\n const { key = '', keyCode } = event;\r\n const is_SKey = key.toLowerCase() === 's' || keyCode === 83;\r\n const is_ZKey = key.toLowerCase() === 'z' || keyCode === 90;\r\n\r\n if (event.ctrlKey) {\r\n if (is_SKey) {\r\n event.preventDefault();\r\n this.onCtrlS();\r\n } else if (is_ZKey) {\r\n event.preventDefault();\r\n this.$timeout(() => this.onCtrlZ());\r\n }\r\n }\r\n if (is_SKey && this.ctrlDown) {\r\n event.preventDefault();\r\n this.onCtrlS();\r\n }\r\n }\r\n }\r\n}\r\n","import { cloneDeep } from 'lodash-es';\r\nimport moment from 'moment';\r\n\r\nimport * as SearchActions from '../../../../state/search/search.action';\r\n\r\nimport template from './s-equipment-update.html';\r\n\r\nclass EquipmentUpdateController {\r\n constructor(\r\n $ngRedux,\r\n $scope,\r\n $state,\r\n $filter,\r\n $stateParams,\r\n $timeout,\r\n EquipmentService,\r\n gettextCatalog,\r\n tagsService,\r\n ) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.$filter = $filter;\r\n this.$stateParams = $stateParams;\r\n this.timeout = $timeout;\r\n this.EquipmentService = EquipmentService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.store = $ngRedux;\r\n this.tagsService = tagsService;\r\n\r\n this.tags = [];\r\n this.isLoading = true;\r\n this.selectedTags = [];\r\n this.parsedAttrs = {};\r\n this.parsedTags = [];\r\n this.values = {};\r\n this.focus = {};\r\n this.opened = {};\r\n this.datetimedate = {};\r\n this.datetimeBounds = {};\r\n this.protectedAttrs = {};\r\n\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n this.initDataNeeded = true;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n this.refreshEdit();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { attributes } = state;\r\n\r\n const { secured = {}, isSecuredLoaded, items } = attributes;\r\n // when secured.readonly loaded after init\r\n // call refreshEdit() for one time only\r\n if (isSecuredLoaded && this.initDataNeeded) {\r\n this.refreshEdit();\r\n }\r\n\r\n return {\r\n // secured.readonly: been normalized to lowercase keys\r\n readonlyAttributes: secured.readonly,\r\n readonlyAttributesLoaded: isSecuredLoaded,\r\n tags: items,\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n refreshEdit() {\r\n this.isLoading = true;\r\n\r\n // if readonlyAttributesLoaded has not loaded will return now, another call will trigger by mapStateToThis\r\n if (!this.readonlyAttributesLoaded) return;\r\n\r\n this.initDataNeeded = false;\r\n this.assetName = this.asset.name;\r\n\r\n if (this.asset.attrs) {\r\n this.parseTags();\r\n }\r\n\r\n this.availableTags = cloneDeep(this.tags);\r\n this.selectedTags = [];\r\n this.values = {};\r\n\r\n for (let i = 0; i < this.parsedTags.length; i++) {\r\n const parsedTag = this.parsedTags[i];\r\n const parsedTagIndex = parsedTag.index;\r\n const parsedTagValue = parsedTag.value;\r\n const parsedTagId = parsedTag.id;\r\n const availableTag = this.availableTags[parsedTagIndex];\r\n // appandtag set this.values.\r\n this.appendTag(availableTag, false);\r\n\r\n const parsedTagValueRecord = this.values[parsedTagId];\r\n const { dataType } = availableTag;\r\n\r\n switch (dataType) {\r\n case 'Integer': {\r\n parsedTagValueRecord.value = parseInt(parsedTagValue);\r\n break;\r\n }\r\n\r\n case 'Decimal': {\r\n parsedTagValueRecord.value = parseFloat(parsedTagValue);\r\n break;\r\n }\r\n\r\n case 'Text': {\r\n parsedTagValueRecord.value = parsedTagValue;\r\n break;\r\n }\r\n\r\n case 'Date': {\r\n parsedTagValueRecord.value = moment(parsedTagValue).toDate();\r\n break;\r\n }\r\n\r\n case 'Datetime': {\r\n const parsedDate = moment(parsedTagValue).toDate();\r\n parsedTagValueRecord.value = parsedDate;\r\n this.datetimedate[parsedTagId] = parsedDate;\r\n break;\r\n }\r\n\r\n default:\r\n parsedTagValueRecord.value = parsedTag.value;\r\n }\r\n // re assign handled record.\r\n this.values[parsedTagId] = parsedTagValueRecord;\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n parseTags() {\r\n this.parsedTags = [];\r\n this.parsedAttrs = {};\r\n for (const key in this.asset.attrs) {\r\n const normalizedKey = key != null ? key.toLowerCase() : '';\r\n const attrValue = this.asset.attrs[key] || null;\r\n if (this.readonlyAttributes.indexOf(normalizedKey) !== -1) {\r\n // readonly attributes are hidden completely from this UI\r\n this.protectedAttrs[key] = this.asset.attrs[key];\r\n continue;\r\n } else if (key.startsWith('onei3:')) {\r\n this.protectedAttrs[key] = this.asset.attrs[key];\r\n continue;\r\n } else if (attrValue === null) continue;\r\n\r\n let found = false;\r\n for (let j = 0; j < this.tags.length; j++) {\r\n const tag = this.tags[j];\r\n if (normalizedKey === tag.key.toLowerCase()) {\r\n this.parsedTags.push({\r\n key: tag.key,\r\n value:\r\n tag.dataType === 'Datetime' ? moment(this.asset.attrs[key]) : this.asset.attrs[key],\r\n index: j,\r\n dataType: tag.dataType,\r\n id: tag.id,\r\n });\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n this.parsedAttrs[key] = this.asset.attrs[key];\r\n }\r\n }\r\n }\r\n\r\n appendTag(tag, isNew) {\r\n this.selectedTags.push(tag);\r\n this.values[tag.id] = {\r\n tag: tag.id,\r\n };\r\n if (tag.dataType === 'Date' || tag.dataType === 'Datetime') {\r\n this.opened[tag.id] = false;\r\n if (tag.freeform) {\r\n this.values[tag.id].value = moment().toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment().toDate();\r\n this.datetimedate[tag.id] = moment(this.values[tag.id].value).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n } else {\r\n if (tag.range.min) {\r\n this.values[tag.id].value = moment(tag.range.min).toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment(tag.range.min).toDate();\r\n this.datetimedate[tag.id] = moment(tag.range.min).toDate();\r\n this.values[tag.id].minValue = moment(tag.range.min).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n if (tag.range.max) {\r\n this.values[tag.id].value = moment(tag.range.max).toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment(tag.range.max).toDate();\r\n this.datetimedate[tag.id] = moment(tag.range.max).toDate();\r\n this.values[tag.id].maxValue = moment(tag.range.max).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n }\r\n }\r\n tag.selected = true;\r\n this.newTag = undefined;\r\n this.focus[tag.id] = isNew;\r\n }\r\n\r\n removeTag(index) {\r\n const tag = this.selectedTags[index];\r\n tag.selected = false;\r\n if (this.asset.attrs[tag.key]) {\r\n delete this.asset.attrs[tag.key];\r\n }\r\n delete this.values[tag.id];\r\n delete this.focus[tag.id];\r\n this.selectedTags.splice(index, 1);\r\n }\r\n\r\n removeAttr(key) {\r\n delete this.parsedAttrs[key];\r\n }\r\n\r\n filterSelected(tag) {\r\n return !tag.selected;\r\n }\r\n\r\n roundInt(val) {\r\n return val ? Math.floor(val) : val;\r\n }\r\n\r\n open(index) {\r\n this.opened[index] = true;\r\n }\r\n\r\n getDateTime(date, time) {\r\n const temp = moment(date.getTime()).toDate();\r\n if (time) {\r\n temp.setHours(time.getHours());\r\n temp.setMinutes(time.getMinutes());\r\n temp.setSeconds(time.getSeconds());\r\n }\r\n\r\n temp.setMilliseconds(0);\r\n return temp;\r\n }\r\n\r\n datetimeValidCheck(id) {\r\n const valueRecord = this.values[id];\r\n const { value } = valueRecord;\r\n const temp = this.getDateTime(this.datetimedate[id], value);\r\n\r\n if (\r\n (!valueRecord.minValue || temp >= valueRecord.minValue) &&\r\n (!valueRecord.maxValue || temp <= valueRecord.maxValue)\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n updateTimeBounds(id) {\r\n this.datetimeBounds[id].min = this.returnTimeBound('min', id);\r\n this.datetimeBounds[id].max = this.returnTimeBound('max', id);\r\n }\r\n\r\n returnTimeBound(key, id) {\r\n const valueRecord = this.values[id];\r\n switch (key) {\r\n case 'max':\r\n if (!this.datetimedate[id] || !valueRecord.maxValue) {\r\n return undefined;\r\n }\r\n if (this.datetimedate[id].toDateString() === valueRecord.maxValue.toDateString()) {\r\n const tempMax = this.getDateTime(valueRecord.value, valueRecord.maxValue);\r\n return tempMax;\r\n }\r\n return undefined;\r\n\r\n case 'min':\r\n if (!this.datetimedate[id] || !valueRecord.minValue) {\r\n return undefined;\r\n }\r\n if (this.datetimedate[id].toDateString() === valueRecord.minValue.toDateString()) {\r\n const tempMin = this.getDateTime(valueRecord.value, valueRecord.minValue);\r\n return tempMin;\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n checkAllDatetimes() {\r\n for (let i = 0; i < this.selectedTags.length; i++) {\r\n const selectedTag = this.selectedTags[i];\r\n if (selectedTag.dataType === 'Datetime' && !selectedTag.freeform) {\r\n if (!this.datetimeValidCheck(selectedTag.id)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n generateTooltip(tag) {\r\n return this.tagsService.generateTooltip(tag);\r\n }\r\n\r\n cancelClicked() {\r\n this.addToDataLayer([\r\n 'singleAssetUpdateCancelClicked',\r\n { id: this.asset.id, name: this.asset.name },\r\n ]);\r\n if (this.onCancel) {\r\n this.onCancel();\r\n }\r\n }\r\n\r\n saveClicked() {\r\n this.detailForm.$submitted = true;\r\n if (this.sending || this.detailForm.$invalid || !this.checkAllDatetimes()) {\r\n return;\r\n }\r\n\r\n this.addToDataLayer([\r\n 'singleAssetUpdateSaveClicked',\r\n { id: this.asset.id, name: this.asset.name },\r\n ]);\r\n\r\n this.sending = true;\r\n this.errorFlag = false;\r\n this.submitTags = [];\r\n this.equipToSubmit = cloneDeep(this.asset);\r\n this.equipToSubmit.attrs = {};\r\n this.equipToSubmit.name = this.assetName;\r\n for (const key in this.parsedAttrs) {\r\n this.equipToSubmit.attrs[key] = this.parsedAttrs[key];\r\n }\r\n for (const k in this.protectedAttrs) {\r\n this.equipToSubmit.attrs[k] = this.protectedAttrs[k];\r\n }\r\n for (let i = 0; i < this.selectedTags.length; i++) {\r\n const selectedTag = this.selectedTags[i];\r\n const valueRecord = this.values[selectedTag.id];\r\n const tVal = valueRecord.value || null;\r\n if (tVal === null) continue;\r\n const toAdd = {\r\n key: selectedTag.key,\r\n };\r\n switch (selectedTag.dataType) {\r\n case 'Text':\r\n case 'Hyperlink':\r\n case 'Integer':\r\n case 'Decimal':\r\n toAdd.v = valueRecord.value;\r\n break;\r\n case 'Date':\r\n toAdd.v = this.$filter('date')(valueRecord.value, 'yyyy-MM-dd');\r\n break;\r\n case 'Datetime':\r\n if (typeof valueRecord.value === 'string') {\r\n toAdd.v = valueRecord.value;\r\n } else {\r\n let temp = this.getDateTime(this.datetimedate[selectedTag.id], valueRecord.value);\r\n toAdd.v = temp;\r\n }\r\n break;\r\n }\r\n this.equipToSubmit.attrs[toAdd.key] = toAdd.v;\r\n }\r\n this.EquipmentService.putEquipment(this.equipToSubmit).then(\r\n (response) => {\r\n this.asset = response.data;\r\n this.isEditing = false;\r\n this.sending = false;\r\n this.refreshDetails();\r\n if (this.onUpdated) {\r\n this.onUpdated();\r\n }\r\n },\r\n (error) => {\r\n let errorMsg = this.gettextCatalog.getString('An error occurred while updating the asset');\r\n this.errorFlag = true;\r\n this.errorText = errorMsg;\r\n this.sending = false;\r\n },\r\n );\r\n }\r\n\r\n refreshDetails() {\r\n this.refresh();\r\n }\r\n\r\n addToDataLayer(gtmData) {\r\n const [event, data] = gtmData || [];\r\n window.dataLayer.push({\r\n event,\r\n data,\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: EquipmentUpdateController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n asset: '<',\r\n onCancel: '&',\r\n onUpdated: '&',\r\n },\r\n};\r\n","import * as SearchActions from '../../../../state/search/search.action';\r\n\r\nimport template from './b-equipment-update.html';\r\n\r\nclass BulkEquipmentUpdateController {\r\n constructor(\r\n $ngRedux,\r\n $timeout,\r\n EquipmentService,\r\n gettextCatalog,\r\n equipmentUpdateService,\r\n keyboardKeysService,\r\n ) {\r\n 'ngInject';\r\n\r\n this.EquipmentService = EquipmentService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.store = $ngRedux;\r\n this.equipmentUpdateService = equipmentUpdateService;\r\n this.$timeout = $timeout;\r\n this.keyboardKeysService = keyboardKeysService;\r\n\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n\r\n this.selectedCols = {\r\n make: {},\r\n model: {},\r\n };\r\n this.changesState = {};\r\n this.lastChanges = [];\r\n }\r\n\r\n $onInit() {\r\n this.getAttributes();\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n this.keyboardKeysService.set({\r\n onCtrlS: this.update.bind(this),\r\n onCtrlZ: this.undoLastChange.bind(this),\r\n });\r\n }\r\n\r\n getAttributes() {\r\n this.loading = true;\r\n this.equipmentUpdateService\r\n .getAttributes()\r\n .then(({ allAttrs, attrsWithoutReadonly, keyedAttrs }) => {\r\n const dataTypes = ['text', 'integer', 'decimal', 'hyperlink'];\r\n this.attributesList = attrsWithoutReadonly.filter((a) =>\r\n dataTypes.includes(a.dataType.toLowerCase()),\r\n );\r\n this.attributesMap = keyedAttrs;\r\n })\r\n .catch((error) => {})\r\n .finally((_) => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n mapStateToThis(state) {\r\n const { assets } = state;\r\n const { list = [] } = assets;\r\n const selectedAsset = list.filter((asset) => asset.selected);\r\n\r\n return {\r\n assets: this.equipmentUpdateService.getEditAssetsAttrsModel(selectedAsset),\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n this.keyboardKeysService.unSet();\r\n }\r\n\r\n refreshDetails() {\r\n this.refresh();\r\n }\r\n\r\n ///////////\r\n applyNewValue(key, value) {\r\n if (!key) return;\r\n if (value === undefined || value === '' || value === null) return;\r\n const normalizeKey = key.toLowerCase();\r\n this.assets.forEach((asset) => {\r\n asset.attrs[normalizeKey] = { ...asset.attrs[normalizeKey], key, value };\r\n });\r\n this.addLastChange(key, '0000');\r\n this.addToDataLayer(['bulkAssetsUpdate-applyToAll', { key, value }]);\r\n }\r\n\r\n update() {\r\n if (this.sending || this.tableErrors > 0) return;\r\n const changeSet = [];\r\n this.assets.forEach((asset) => {\r\n if (JSON.stringify(asset.attrs) !== asset.originalAttrs) {\r\n const change = {\r\n id: asset.id,\r\n op: 'overwrite',\r\n values: Object.values(asset.attrs).reduce((acc, a) => {\r\n if (a.value !== '' || a.value !== undefined || a.value !== null) {\r\n acc[a.key] = a.value;\r\n }\r\n return acc;\r\n }, {}),\r\n };\r\n changeSet.push(change);\r\n }\r\n });\r\n if (changeSet.length) {\r\n this.addToDataLayer(['bulkAssetsUpdate-save', { total: changeSet.length }]);\r\n this.sending = true;\r\n this.equipmentUpdateService\r\n .updateAssetsAttrs(changeSet)\r\n .then((_) => {\r\n this.refresh();\r\n this.changesState = {};\r\n this.lastChanges = [];\r\n this.showSuccess = true;\r\n this.timeMessage();\r\n })\r\n .catch((er) => {\r\n this.showError = true;\r\n this.timeMessage();\r\n })\r\n .finally((_) => {\r\n this.sending = false;\r\n });\r\n }\r\n }\r\n\r\n addLastChange(key, assetId) {\r\n const changeKey = `${assetId}&&${key.toLowerCase()}`;\r\n const [last] = this.lastChanges || [];\r\n if (last !== changeKey) this.lastChanges.unshift(changeKey);\r\n }\r\n\r\n undoLastChange() {\r\n const lastChange = this.lastChanges.shift();\r\n if (lastChange) {\r\n const [id, key] = lastChange.split('&&');\r\n this.assets.forEach((a) => {\r\n if (a.id === id || id === '0000') {\r\n if (key in a.attrs) a.attrs[key].value = a.attrs[key].originalVal;\r\n }\r\n });\r\n\r\n this.addToDataLayer(['bulkAssetUpdate-undo', { key, id: assetId }]);\r\n }\r\n }\r\n\r\n updateAttr(key, value, invalid, asset) {\r\n const normalizeKey = key.toLowerCase();\r\n const changeKey = `${asset.id}&&${normalizeKey}`;\r\n this.changesState[changeKey] = { invalid, value: value };\r\n\r\n if (invalid) {\r\n return;\r\n }\r\n\r\n if (value === '' || value === undefined || value === null) {\r\n delete asset.attrs[normalizeKey].value;\r\n } else {\r\n asset.attrs[normalizeKey] = { ...(asset.attrs[normalizeKey] || {}), key, value };\r\n }\r\n\r\n this.addLastChange(normalizeKey, asset.id);\r\n }\r\n\r\n onColDeselected(key) {\r\n this.addToDataLayer(['bulkAssetUpdateAttrDeselected', { key }]);\r\n // remove from change state\r\n if (this.changesState) {\r\n const keyToRemove = Object.keys(this.changesState).filter((k) =>\r\n k.endsWith(`&&${key.toLowerCase()}`),\r\n );\r\n keyToRemove.forEach((k) => {\r\n delete this.changesState[k];\r\n });\r\n }\r\n }\r\n\r\n get tableErrors() {\r\n return Object.values(this.changesState || {}).filter((e) => e.invalid).length;\r\n }\r\n\r\n timeMessage() {\r\n this.$timeout(() => {\r\n this.showSuccess = this.showError = false;\r\n }, 4000);\r\n }\r\n\r\n removeFromAll(key) {\r\n let change = false;\r\n this.assets.forEach((a) => {\r\n if (key in a.attrs) {\r\n delete a.attrs[key].value;\r\n change = true;\r\n }\r\n });\r\n\r\n if (change) this.addLastChange(key, '0000');\r\n }\r\n\r\n addToDataLayer(gtmData) {\r\n const [event, data] = gtmData || [];\r\n window.dataLayer.push({\r\n event,\r\n data,\r\n });\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: BulkEquipmentUpdateController,\r\n controllerAs: 'bvm',\r\n bindings: {},\r\n};\r\n","import template from './columns-toggle.html';\r\n\r\nclass ColumnsToggleController {\r\n constructor() {\r\n 'ngInject';\r\n }\r\n\r\n $onInit() {}\r\n resetSearch() {\r\n this.searchTerm = '';\r\n }\r\n\r\n toggleItemSelection(item) {\r\n const key = item?.key?.toLowerCase();\r\n if (key in this.selected) {\r\n delete this.selected[key];\r\n if (this.onDeselect) this.onDeselect({ key: key });\r\n } else {\r\n this.selected[key] = item;\r\n if (this.onSelect) this.onSelect({ key: key });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * items : items map {normalize key : {key,.....}]\r\n * selected :object map { key :item }\r\n */\r\nexport default {\r\n template,\r\n controller: ColumnsToggleController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n items: '<',\r\n selected: '<',\r\n onSelect: '&',\r\n onDeselect: '&',\r\n },\r\n};\r\n","import template from './attr-edit.html';\r\n\r\nconst ToNumber = (val) => {\r\n const fVal = parseFloat(val);\r\n return isNaN(fVal) ? undefined : fVal;\r\n};\r\nclass AttrEditController {\r\n constructor(tagsService) {\r\n 'ngInject';\r\n\r\n this.placeHolder = '';\r\n this.emptyValue = { value: '' };\r\n this.tagsService = tagsService;\r\n }\r\n\r\n $onInit() {}\r\n\r\n handleOnSubmit(value, invalid) {\r\n if (this.onSubmit) this.onSubmit({ key: this.attr.key, value, invalid });\r\n }\r\n\r\n handleOnChange(value, invalid) {\r\n if (this.onChange) this.onChange({ key: this.attr.key, value, invalid });\r\n if (this.elmType === 'select' && this.onSubmit)\r\n this.onSubmit({ key: this.attr.key, value, invalid });\r\n }\r\n\r\n $onChanges(changes) {\r\n if (!this.attr) return;\r\n const inputTypeMap = { text: 'text', integer: 'number', decimal: 'number', hyperlink: 'url' };\r\n const { dataType, freeform, key, range, values } = this.attr;\r\n const { min = undefined, max = undefined } = range || {};\r\n const type = dataType?.toLowerCase() || 'text';\r\n\r\n this.inputType = inputTypeMap[type] || 'text';\r\n this.inputMin = undefined;\r\n this.inputMax = undefined;\r\n this.help = this.tagsService.getAttrShortHelpText(this.attr);\r\n const options = (values || [])\r\n .map((v) => ({ normalizeV: v.value?.toLowerCase(), value: v.value }))\r\n .sort();\r\n\r\n this.options = [this.emptyValue, ...options];\r\n if (this.inputType === 'number') {\r\n this.inputMin = ToNumber(min);\r\n this.inputMax = ToNumber(max);\r\n }\r\n this.attrValue = this.inputType === 'number' ? ToNumber(this.attrValue) : this.attrValue;\r\n\r\n this.elmType = 'input';\r\n switch (type) {\r\n case 'text':\r\n case 'hyperlink':\r\n this.elmType = freeform ? 'input' : 'select';\r\n this.selectModel = { normalizeV: this.attrValue?.toLowerCase(), value: this.attrValue };\r\n break;\r\n case 'integer':\r\n this.inputPattern = '^[+-]?[0-9]+$';\r\n break;\r\n case 'decimal':\r\n this.inputPattern = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)$/;\r\n break;\r\n default:\r\n this.elmType = 'input';\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n template,\r\n controller: AttrEditController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n attr: '<',\r\n attrValue: '<',\r\n onChange: '&?',\r\n onSubmit: '&?',\r\n },\r\n};\r\n","import angular from 'angular';\r\n\r\nimport EquipmentUpdateService from './services/equipment-update.service';\r\nimport KeyboardKeysService from './services/keyboard-keys.service';\r\nimport SEquipmentUpdateComponent from './components/single-equipment-update/s-equipment-update.component';\r\nimport bEquipmentUpdateComponent from './components/bulk-equipment-update/b-equipment-update.component';\r\n\r\nimport columnsToggleComponent from './common/columns-toggle/columns-toggle.component';\r\nimport attrEditComponent from './common/attr-edit/attr-edit.component';\r\nimport ctrlSDirective from './common/ctrl-s.directive';\r\nimport numberModelDirective from './common/attr-edit/number-model.directive';\r\n\r\nconst EquipmentUpdateModule = angular.module('equipment.update', []);\r\n\r\nEquipmentUpdateModule.service('equipmentUpdateService', EquipmentUpdateService)\r\n .service('keyboardKeysService', KeyboardKeysService)\r\n .directive('onCtrlS', ctrlSDirective)\r\n .directive('numberModel', numberModelDirective)\r\n .component('sEquipmentUpdate', SEquipmentUpdateComponent)\r\n .component('bEquipmentUpdate', bEquipmentUpdateComponent)\r\n .component('columnsToggle', columnsToggleComponent)\r\n .component('attrEdit', attrEditComponent);\r\n\r\nexport default EquipmentUpdateModule.name;\r\n","export default () => {\r\n 'ngInject';\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n onCtrlS: '&',\r\n },\r\n link: (scope, element) => {\r\n element.bind('keydown', function (event) {\r\n if (event.keyCode === 83 && event.ctrlKey) {\r\n event.preventDefault();\r\n scope.onCtrlS();\r\n }\r\n });\r\n },\r\n };\r\n};\r\n","export default () => {\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, elem, attrs, ngModel) {\r\n if (attrs.type === 'number') {\r\n ngModel.$parsers.push((val) => `${val}`);\r\n ngModel.$formatters.push((value) => parseFloat(value));\r\n }\r\n },\r\n };\r\n};\r\n","export default function conversionService(usersService) {\r\n 'ngInject';\r\n return {\r\n mathUnitDictionary: {\r\n c: 'degC',\r\n f: 'degF'\r\n },\r\n displayUnitDictionaty: {\r\n degc: \"°C\",\r\n degf: \"°F\",\r\n \"mi/h\": \"mph\"\r\n },\r\n getDictionary: function () {\r\n if (usersService.currentUser().unitOfMeasure === \"standard\") {\r\n return ConversionUtility.CONVERSIONTABLE_METRIC_TO_STANDARD;\r\n } else {\r\n return ConversionUtility.CONVERSIONTABLE_STANDARD_TO_METRIC;\r\n }\r\n },\r\n //purpose: label the unit of measure (uom) in the column header\r\n //precondition: uom or undefined\r\n //post condition: uom or undefined or converted uom\r\n convertReportHeader: function (uom) {\r\n return ConversionUtility.convertReportHeader(uom, this.getDictionary());\r\n },\r\n //precondition: each value and the uom for the value\r\n //post condition: converted value based on the dictionary loaded per the user preference\r\n convertValue: function (value, uom) {\r\n return ConversionUtility.convertValue(value, uom, this.getDictionary());\r\n },\r\n //sets the user preference; affects which dictionary to load\r\n setPreference: function (preference) {\r\n if (preference === 'nopreference') return;\r\n usersService.currentUser().unitOfMeasure = preference;\r\n },\r\n\r\n //uom: unit of measure (m,cm,mm, etc.)\r\n //type: length, volume, area, etc.\r\n getValue: function (value, uom, type) {\r\n var returnModel = {\r\n value: value,\r\n uom: uom\r\n };\r\n var dictionary = this.getDictionary();\r\n if (dictionary && value) {\r\n value = \"\" + value;\r\n //determine operation\r\n if (usersService.currentUser().unitOfMeasure === \"standard\" || usersService.currentUser().unitOfMeasure === \"metric\") {\r\n //do we know the current unit of measure?\r\n if (uom) {\r\n //yes...convert\r\n //Clean value incase of commas.\r\n var cleanValue = value.replace(/[,]/g, \"\");\r\n //if value contains a invalid character and it does not get converted, the application will crash because it may attempt to round a number with a comma\r\n returnModel.value = cleanValue;\r\n //Clean the unit of measure so math.js can understand.\r\n var cleanUom = uom.replace(/[°]/g, \"\");\r\n cleanUom = this.mathUnitDictionary[cleanUom.toLowerCase()] || uom;\r\n //create math unit.\r\n var initialUnit = 0.00;\r\n //Find the type to convert to.\r\n var convertTo = dictionary[cleanUom.toLowerCase()];\r\n //Make surte it is initialized. \r\n if (initialUnit && convertTo) {\r\n var displayUom = this.displayUnitDictionaty[convertTo.toLowerCase()];\r\n returnModel.value = initialUnit.toNumber(convertTo);\r\n returnModel.uom = displayUom || convertTo;\r\n return returnModel;\r\n } else {\r\n return returnModel;\r\n }\r\n } else {\r\n //No...do we know the type?\r\n if (type) {\r\n //Yes... make best guess\r\n return returnModel;\r\n } else {\r\n //No... return value;\r\n return returnModel;\r\n }\r\n }\r\n } else {\r\n //if unknown... return input value;\r\n return returnModel;\r\n }\r\n } else {\r\n //if dictionay or value is null\r\n return returnModel;\r\n }\r\n },\r\n //array varrient of getValue... will take in an array and return an array. Use this when rendering graphs.\r\n //uomValues: values array with unit of measure (m,cm,mm, etc.) ex. [{value:12.34, uom:km/h}, {value:56.78, uom:km/h}]\r\n //type: length, volume, area, etc.\r\n getValues: function (uomValues, type) {\r\n var returnModel = [];\r\n //[{\r\n // value: null,\r\n // uom: null\r\n //}];\r\n if (uomValues.length > 0) {\r\n return uomValues;\r\n }\r\n\r\n for (var i = 0; i != uomValues.length; ++i) {\r\n returnModel.push(this.getValue(uomValues[i].value, uomValues[i].uom, null));\r\n }\r\n return returnModel;\r\n }\r\n };\r\n}","export default function UtilitySevice() {\r\n\tthis.isValidDate = function(dateStr) {\r\n\t\tif (dateStr === undefined) return false;\r\n\t\tvar dateTime = Date.parse(dateStr);\r\n\r\n\t\tif (isNaN(dateTime)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\r\n\tthis.getDateDifference = function(fromDate, toDate) {\r\n\t\treturn Date.parse(toDate) - Date.parse(fromDate);\r\n\t};\r\n\r\n\tthis.isValidDateRange = function(fromDate, toDate) {\r\n\t\tif (fromDate === '' || toDate === '') return true;\r\n\t\tif (this.isValidDate(fromDate) === false) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (this.isValidDate(toDate) === true) {\r\n\t\t\tvar days = this.getDateDifference(fromDate, toDate);\r\n\t\t\tif (days < 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\r\n\tthis.isValidMinDateRange = function(fromDate, toDate) {\r\n\t\tvar from = new Date(fromDate);\r\n\t\tvar to = new Date(toDate);\r\n\t\tfrom.setHours(0);\r\n\t\tfrom.setMinutes(0);\r\n\t\tto.setHours(0);\r\n\t\tto.setMinutes(0);\r\n\t\tvar timeDiff = Math.abs(from.getTime() - to.getTime());\r\n\t\tvar dayDiff = Math.ceil(timeDiff / (1000 * 3600 * 24));\r\n\t\tif (dayDiff >= 32) return false;\r\n\t\treturn true;\r\n\t};\r\n}\r\n","import App from './app';\r\n\r\nexport default function authService($q) {\r\n 'ngInject';\r\n var isRefreshingToken = false;\r\n return {\r\n requestRefreshToken: function () {\r\n //Return a promise cuz promises are awesome\r\n var def = $q.defer();\r\n\r\n //Perform a synchronous request ajax call to get the new acccess token!\r\n $.ajax({\r\n type: 'POST',\r\n url: '/home/RefreshToken/',\r\n data: App.getRefreshToken(),\r\n async: false,\r\n success: function (response) {\r\n isRefreshingToken = false;\r\n //Swap out the tokens\r\n App.setToken(response['accessToken']);\r\n App.setRefreshToken(response['refreshToken']);\r\n // console.log(\"Swapped out refresh tokens\");\r\n return def.resolve(response);\r\n },\r\n error: function (response) {\r\n isRefreshingToken = false;\r\n return def.reject(response);\r\n },\r\n dataType: 'json'\r\n });\r\n return def.promise;\r\n }\r\n };\r\n}","import Auth from './auth';\r\n\r\nexport default function AuthInterceptor(\r\n $q,\r\n $window,\r\n $injector,\r\n $timeout\r\n) {\r\n 'ngInject';\r\n\r\n let goToLoginPage = function () {\r\n $window.location.href = '/home/';\r\n };\r\n\r\n return {\r\n request: function (config) {\r\n config.headers = config.headers || {};\r\n const configPromise = $q.defer();\r\n if (config.url.indexOf(\"amazonaws.com\") == -1) {\r\n config.headers.Authorization = Auth.getAuthorizationHeader();\r\n }\r\n configPromise.resolve(config);\r\n return configPromise.promise;\r\n },\r\n requestError: function (rejection) {\r\n console.log('Got request error:' + rejection); // eslint-disable-line\r\n return $q.reject(rejection);\r\n },\r\n responseError: function (response) {\r\n //If we are being throttled retry the request after a timeout and return in a promise\r\n if (response.status === 429) {\r\n let def = $q.defer();\r\n $timeout(function () {\r\n let $http = $injector.get('$http');\r\n return $http(response.config).then(\r\n function (response) {\r\n return def.resolve(response);\r\n },\r\n function (response) {\r\n return def.reject(response);\r\n }\r\n );\r\n }, 3000);\r\n\r\n return def.promise;\r\n } else if (response.status === 401) {\r\n goToLoginPage();\r\n }\r\n return $q.reject(response);\r\n }\r\n };\r\n}","import moment from 'moment';\r\nimport jstz from 'jstz';\r\n// service to convert the input date to date in another time zone\r\nexport default function TimezoneService(usersService, appSettings) {\r\n 'ngInject';\r\n\r\n const getUserDateFormat = () => appSettings.GetDateFormat();\r\n this.getUserTimezoneOffset = function(date) {\r\n let usertimezone;\r\n try {\r\n usertimezone = usersService.currentUser().claims.data.timezone;\r\n } catch (ex) {\r\n //do nothing\r\n }\r\n if (usertimezone) {\r\n return moment(date.toISOString())\r\n .tz(usertimezone)\r\n .utcOffset();\r\n } else {\r\n let zone = jstz.determine();\r\n return moment(date.toISOString())\r\n .tz(zone.name())\r\n .utcOffset();\r\n }\r\n };\r\n\r\n this.convertToSameTimeInUserTimeZone = function(date) {\r\n return moment(date.getTime() + date.getTimezoneOffset() * 60000 + this.getUserTimezoneOffset(date) * 60000);\r\n };\r\n\r\n this.convertToUserTimezone = function(date, dateformat) {\r\n let returnValue;\r\n let usertimezone;\r\n if (!date) {\r\n return '';\r\n }\r\n\r\n if (!dateformat) {\r\n dateformat = `${getUserDateFormat()} hh:mm A z`;\r\n }\r\n\r\n try {\r\n usertimezone = usersService.currentUser().claims.data.timezone;\r\n } catch (ex) {\r\n //do nothing\r\n }\r\n if (usertimezone) {\r\n returnValue = moment(date)\r\n .tz(usertimezone)\r\n .format(dateformat);\r\n } else {\r\n let zone = jstz.determine();\r\n returnValue = moment(date)\r\n .tz(zone.name())\r\n .format(dateformat);\r\n }\r\n\r\n return returnValue ? returnValue : '';\r\n };\r\n\r\n this.tagToUserTimezone = function(date) {\r\n let returnValue;\r\n let dateformat = 'MM/DD/YYYY hh:mm:ss A z';\r\n let usertimezone;\r\n if (!date) {\r\n return '';\r\n }\r\n try {\r\n usertimezone = usersService.currentUser().claims.data.timezone;\r\n } catch (ex) {\r\n //do nothing\r\n }\r\n if (usertimezone) {\r\n returnValue = moment(date)\r\n .tz(usertimezone)\r\n .format(dateformat);\r\n } else {\r\n let zone = jstz.determine();\r\n returnValue = moment(date)\r\n .tz(zone.name())\r\n .format(dateformat);\r\n }\r\n return returnValue ? returnValue : '';\r\n };\r\n}\r\n","import moment from 'moment';\r\nimport template from './date-range.html';\r\n\r\nexport default function DateRangeDirective() {\r\n return {\r\n restrict: 'E',\r\n template,\r\n scope: {},\r\n controllerAs: 'vm',\r\n bindToController: {\r\n startRange: '<',\r\n endRange: '<',\r\n minDate: '<',\r\n maxDate: '<',\r\n dateOption: '<',\r\n updateStartDate: '&',\r\n updateEndDate: '&',\r\n onUpdateOption: '&'\r\n },\r\n controller: DateRangeController\r\n };\r\n}\r\n\r\nexport function DateRangeController($scope, gettextCatalog, dateUtil) {\r\n 'ngInject';\r\n // Private Variables\r\n\r\n let vm = this;\r\n vm.timeSelected = false;\r\n\r\n //Time range presets for radio button\r\n this.timeRangePresets = [\r\n {\r\n value: 1,\r\n label: gettextCatalog.getString('24hrs'),\r\n tooltip: gettextCatalog.getString('Last 24 Hours')\r\n },\r\n {\r\n value: 7,\r\n label: gettextCatalog.getString('7d'),\r\n tooltip: gettextCatalog.getString('Last 7 Days')\r\n },\r\n {\r\n value: 30,\r\n label: gettextCatalog.getString('30d'),\r\n tooltip: gettextCatalog.getString('Last 30 Days')\r\n }\r\n ];\r\n\r\n vm.showTime = showTime;\r\n vm.openStart = openStart;\r\n vm.openEnd = openEnd;\r\n vm.selectPreset = selectPreset;\r\n vm.endTimeChanged = endTimeChanged;\r\n vm.startTimeChanged = startTimeChanged;\r\n\r\n //Time range picker variables\r\n vm.startOpened = false;\r\n vm.endOpened = false;\r\n vm.invalidStartDate = false;\r\n vm.invalidEndDate = false;\r\n vm.locale = 'en';\r\n\r\n //----------------------------------------------------------------------------------------------------\r\n\r\n // init\r\n vm.$onInit = init;\r\n\r\n function init() {\r\n if ($scope.$root.currentUser) {\r\n vm.locale = $scope.$root.currentUser.claims.data.language;\r\n }\r\n refresh();\r\n }\r\n //----------------------------------------------------------------------------------------------------\r\n\r\n // Public Functions\r\n function endTimeChanged() {\r\n // Checking if the endRange is a valid date\r\n if (vm.endRange) {\r\n // Checking if the user has selected the same day\r\n checkIfSameTime();\r\n vm.updateEndDate({\r\n endDate: vm.endRange\r\n });\r\n }\r\n }\r\n\r\n function startTimeChanged() {\r\n // Checking if the startRange is a valid date\r\n if (vm.startRange) {\r\n // Also checking if the user has selected the same time\r\n checkIfSameTime();\r\n vm.updateStartDate({\r\n startDate: vm.startRange\r\n });\r\n }\r\n }\r\n // Check if startRange and endRange are equal\r\n function checkIfSameTime() {\r\n if (moment(vm.endRange).isSame(vm.startRange, 'minute')) {\r\n // If they are equal, assign the startTime to begining of the day.\r\n // And endRange to this moment\r\n vm.startRange = moment()\r\n .startOf('day')\r\n .toDate();\r\n vm.endRange = moment()\r\n .startOf('minute')\r\n .toDate();\r\n }\r\n }\r\n function openStart() {\r\n vm.startOpened = !vm.startOpened;\r\n }\r\n\r\n function openEnd() {\r\n vm.endOpened = !vm.endOpened;\r\n }\r\n\r\n function showTime() {\r\n vm.timeSelected = !vm.timeSelected;\r\n }\r\n //------------------------------------------------------------------------------------------------------------------------------------\r\n\r\n function selectPreset(preset) {\r\n $('#btn-1').blur();\r\n $('#btn-7').blur();\r\n $('#btn-30').blur();\r\n\r\n vm.onUpdateOption({option: preset.value});\r\n }\r\n\r\n function refresh() {\r\n if (vm.startRange && vm.endRange) {\r\n vm.maxStartDate = vm.endRange;\r\n vm.minEndDate = vm.startRange;\r\n vm.maxEndDate = moment()\r\n .endOf('minute')\r\n .toDate();\r\n }\r\n }\r\n}\r\n","import template from './equipment-details.component.html';\r\n\r\nclass EquipmentDetailsController {\r\n constructor() {\r\n 'ngInject';\r\n }\r\n}\r\n\r\nexport const EquipmentDetailsComponent = {\r\n template,\r\n bindings: {\r\n equipmentData: '<'\r\n },\r\n controller: EquipmentDetailsController,\r\n controllerAs: 'vm'\r\n};\r\n","const LAST_SEEN_KEY = 'lastSeen';\r\nexport default function EquipmentFacetFiltersDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-facet-filters.html'),\r\n scope: {\r\n queryString: '=',\r\n facets: '=',\r\n tags: '=?',\r\n tagFilters: '=',\r\n showMobile: '=?',\r\n onChange: '&',\r\n onLoaded: '&',\r\n onApplyClicked: '&',\r\n onClearClicked: '&',\r\n openclose: '&',\r\n filterCount: '=?',\r\n },\r\n controllerAs: 'vm',\r\n transclude: true,\r\n controller: EquipmentFacetFiltersController,\r\n };\r\n\r\n function EquipmentFacetFiltersController(\r\n $filter,\r\n $rootScope,\r\n $scope,\r\n $timeout,\r\n $uibModal,\r\n equipmentRepository,\r\n TimezoneService,\r\n gettextCatalog,\r\n $ngRedux,\r\n $state,\r\n ) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n vm.store = $ngRedux;\r\n\r\n vm.closeFilters = closeFilters;\r\n vm.filterModels = newfilterModels();\r\n vm.onUpdateCommunicatedAt = onUpdateCommunicatedAt;\r\n vm.OnUpdateLastSeenFilter = OnUpdateLastSeenFilter;\r\n\r\n // private variable\r\n const reservedKeys = {\r\n lastCommKey: 'lastCommunicated',\r\n lastSeenKey: 'lastSeen',\r\n attrValueList: 'attrValueList',\r\n filtersCollection: 'filtersCollection',\r\n };\r\n\r\n const updateFilterCount = () => {\r\n const { alerts, maintenance, securityGroups, lastCommunicated, lastSeen } = vm.filterModels;\r\n const values = $scope.values;\r\n\r\n $scope.filterCount =\r\n alerts?.length +\r\n maintenance?.length +\r\n securityGroups?.length +\r\n lastCommunicated?.length +\r\n lastSeen?.length +\r\n Object.keys(values || {}).length;\r\n };\r\n\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n $scope.selectedTags = [];\r\n $scope.parsedTags = [];\r\n $scope.values = {};\r\n $scope.any = {};\r\n $scope.opened = {};\r\n $scope.focus = {};\r\n $scope.datetimedate = {};\r\n $scope.datetimeBounds = {};\r\n $scope.minMaxRequired = {};\r\n $scope.showTag = {};\r\n\r\n if (!$scope.tagFilters) {\r\n $scope.tagFilters = {};\r\n }\r\n\r\n $scope.search = {};\r\n $scope.style = {};\r\n\r\n $scope.dateOptions = {\r\n 'year-format': \"'yy'\",\r\n 'starting-day': 1,\r\n };\r\n\r\n // connect to store\r\n vm.$onInit = () => {\r\n vm.unsubscribe = vm.store.connect(vm.mapStateToThis, {})(vm);\r\n $scope.init();\r\n };\r\n vm.mapStateToThis = (state) => {\r\n const {\r\n user: { dateFormat = 'yyyy/MM/dd' },\r\n } = state;\r\n $scope.format = dateFormat.toLowerCase().replace(/m/g, 'M');\r\n $scope.dateTimeformat = `${$scope.format} h:mm:ss a`;\r\n return {\r\n format: dateFormat.toLowerCase().replace(/m/g, 'M'),\r\n };\r\n };\r\n vm.$onDestroy = () => {\r\n vm.unsubscribe();\r\n };\r\n // private function\r\n function newfilterModels() {\r\n const model = {\r\n alerts: [],\r\n securityGroups: [],\r\n maintenance: [],\r\n lastCommunicated: [],\r\n lastSeen: [],\r\n };\r\n return model;\r\n }\r\n\r\n function triggerSearch() {\r\n // updating toFilter in order to fire the watch\r\n $scope.toFilter = { ...($scope.toFilter || {}), facets: $scope.facets };\r\n\r\n updateFilterCount();\r\n }\r\n\r\n function onUpdateCommunicatedAt(option = null) {\r\n // If option is null, clear all selection\r\n $scope.facets.lastCommunicated.forEach((item) => {\r\n item._selected = option ? item.id === option.id : false;\r\n });\r\n\r\n vm.filterModels.lastCommunicated = option ? [option] : [];\r\n triggerSearch();\r\n }\r\n\r\n function OnUpdateLastSeenFilter(option) {\r\n // set _selected for filters summary and filters counts\r\n const lastSeenfilter = option ? [{ ...option, _selected: true }] : [];\r\n $scope.facets.lastSeen = lastSeenfilter;\r\n vm.filterModels.lastSeen = lastSeenfilter;\r\n\r\n triggerSearch();\r\n }\r\n\r\n function closeFilters() {\r\n $scope.openclose();\r\n }\r\n\r\n // check to see if facets array is all selected\r\n $scope.allSelected = function (facets) {\r\n for (const key in facets) {\r\n if (!facets[key]._selected) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.toggleFacets = function (facets) {\r\n const facetValue = !$scope.allSelected(facets);\r\n\r\n for (const key in facets) {\r\n facets[key]._selected = facetValue;\r\n }\r\n };\r\n\r\n $scope.$watch('tagFilters', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n refreshTagModels();\r\n }\r\n });\r\n\r\n $scope.$watch('facets', function (newVal, oldVal, updatedScope) {\r\n refreshFilterModels();\r\n });\r\n // Refresh the tag filters based on current facets\r\n function refreshFilterModels() {\r\n vm.filterModels = newfilterModels();\r\n for (const key in $scope.facets) {\r\n // Check to see if there is a matching facet key in the returned facets\r\n for (let i = 0; i < $scope.facets[key].length; i++) {\r\n const facet = $scope.facets[key][i];\r\n\r\n if (facet._selected) {\r\n vm.filterModels[key].push($scope.facets[key][i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function refreshTagModels() {\r\n if (!$scope.tags) return;\r\n\r\n // Clear existing variables\r\n for (var i = 0; i < $scope.selectedTags.length; i++) {\r\n $scope.selectedTags[i].selected = false;\r\n }\r\n $scope.selectedTags = [];\r\n $scope.values = {};\r\n $scope.focus = {};\r\n $scope.any = {};\r\n $scope.showTag = [];\r\n\r\n for (var i = 0; i < $scope.tags.length; i++) {\r\n const { key } = $scope.tags[i];\r\n\r\n const selectedTag = $scope.tagFilters[$scope.tags[i].key];\r\n\r\n if (selectedTag !== undefined) {\r\n $scope.appendTag($scope.tags[i], false);\r\n\r\n if (selectedTag.hasOwnProperty('any')) {\r\n $scope.any[$scope.tags[i].id] = true;\r\n continue;\r\n }\r\n switch ($scope.tags[i].dataType) {\r\n case 'Text':\r\n $scope.values[$scope.tags[i].id] = {\r\n tag: $scope.tags[i].id,\r\n value: selectedTag,\r\n };\r\n break;\r\n case 'Integer':\r\n $scope.values[$scope.tags[i].id] = {\r\n tag: $scope.tags[i].id,\r\n value: selectedTag,\r\n };\r\n break;\r\n case 'Decimal':\r\n $scope.values[$scope.tags[i].id] = {\r\n tag: $scope.tags[i].id,\r\n value: selectedTag,\r\n };\r\n break;\r\n case 'Date':\r\n $scope.values[$scope.tags[i].id].tag = $scope.tags[i].id;\r\n if (selectedTag.min) {\r\n $scope.values[$scope.tags[i].id].value.min = new Date(\r\n new Date(selectedTag.min).getTime() +\r\n new Date(selectedTag.min).getTimezoneOffset() * 60000,\r\n );\r\n $scope.minMaxRequired[$scope.tags[i].id].min = true;\r\n }\r\n if (selectedTag.max) {\r\n $scope.values[$scope.tags[i].id].value.max = new Date(\r\n new Date(selectedTag.max).getTime() +\r\n new Date(selectedTag.max).getTimezoneOffset() * 60000,\r\n );\r\n $scope.minMaxRequired[$scope.tags[i].id].max = true;\r\n }\r\n break;\r\n case 'Datetime':\r\n $scope.values[$scope.tags[i].id].tag = $scope.tags[i].id;\r\n if (selectedTag.min) {\r\n const tempMin = selectedTag.min.replace(/\\\\/g, '').toUpperCase();\r\n $scope.values[$scope.tags[i].id].value.min = new Date(\r\n new Date(tempMin).getTime() +\r\n new Date(tempMin).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tempMin)) * 60000,\r\n );\r\n $scope.datetimedate[$scope.tags[i].id].min =\r\n $scope.values[$scope.tags[i].id].value.min;\r\n $scope.minMaxRequired[$scope.tags[i].id].min = true;\r\n }\r\n if (selectedTag.max) {\r\n const tempMax = selectedTag.max.replace(/\\\\/g, '').toUpperCase();\r\n $scope.values[$scope.tags[i].id].value.max = new Date(\r\n new Date(tempMax).getTime() +\r\n new Date(tempMax).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tempMax)) * 60000,\r\n );\r\n $scope.datetimedate[$scope.tags[i].id].max =\r\n $scope.values[$scope.tags[i].id].value.max;\r\n $scope.minMaxRequired[$scope.tags[i].id].max = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n $scope.toFilter = {\r\n facets: $scope.facets,\r\n tags: $scope.tagFilters,\r\n };\r\n }\r\n\r\n $scope.init = function () {\r\n $scope.loading = true;\r\n $scope.error = null;\r\n\r\n // If the facets is not\r\n\r\n equipmentRepository\r\n .getEquipmentFacets()\r\n .then(\r\n function (facets) {\r\n // Make sure that you use the existing facets\r\n const tempFacets = facets;\r\n\r\n if ($scope.facets) {\r\n for (const key in $scope.facets) {\r\n // Check to see if there is a matching facet key in the returned facets\r\n if (tempFacets[key]) {\r\n for (let i = 0; i < $scope.facets[key].length; i++) {\r\n const facet = $scope.facets[key][i];\r\n\r\n for (let j = 0; j < tempFacets[key].length; j++) {\r\n const tempFacet = tempFacets[key][j];\r\n\r\n if (tempFacet.tag === facet.tag) {\r\n tempFacet._selected = facet._selected;\r\n vm.filterModels[key].push(tempFacet);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Update with filters passed by parent\r\n }\r\n\r\n $scope.facets = tempFacets;\r\n $scope.facets._updatedBy = $scope.$id;\r\n\r\n return equipmentRepository.getAllTags();\r\n },\r\n function (response) {\r\n $scope.error = gettextCatalog.getString('Failed to load filters');\r\n },\r\n )\r\n .then(\r\n function (response) {\r\n if (!response) return null;\r\n\r\n $scope.tags = [];\r\n const {\r\n data: { data: allTags = [] },\r\n } = response;\r\n\r\n if (allTags) {\r\n allTags.forEach((tag) => {\r\n if (tag.dataType === 'Datetime') {\r\n if (tag.range.min) {\r\n tag.range.min = TimezoneService.tagToUserTimezone(tag.range.min);\r\n }\r\n if (tag.range.max) {\r\n tag.range.max = TimezoneService.tagToUserTimezone(tag.range.max);\r\n }\r\n }\r\n\r\n if (tag.dataType !== 'Hyperlink') {\r\n $scope.tags.push(tag);\r\n }\r\n });\r\n // This is needed for asset type filtering.\r\n if (Object.keys($scope.tagFilters).length) {\r\n refreshTagModels();\r\n $scope.updateTags();\r\n }\r\n }\r\n },\r\n function (error) {\r\n $scope.error = gettextCatalog.getString('Failed to load filters');\r\n },\r\n )\r\n .finally(function () {\r\n $scope.loading = false;\r\n // Callback to let parent know we are done loading\r\n\r\n if ($scope.onLoaded) {\r\n $scope.onLoaded();\r\n }\r\n });\r\n };\r\n\r\n $scope.selectFacet = function (facet) {\r\n facet._selected = true;\r\n };\r\n\r\n $scope.deselectFacet = function (facet) {\r\n facet._selected = false;\r\n };\r\n\r\n $scope.appendTag = function (tag, focus) {\r\n $scope.selectedTags.push(tag);\r\n $scope.values[tag.id] = {\r\n tag: tag.id,\r\n value: {},\r\n };\r\n $scope.showTag[tag.id] = true;\r\n if (tag.dataType === 'Date' || tag.dataType === 'Datetime') {\r\n $scope.minMaxRequired[tag.id] = {\r\n min: false,\r\n max: false,\r\n };\r\n } else {\r\n $scope.values[tag.id].value = '';\r\n }\r\n if (tag.dataType === 'Date' || tag.dataType === 'Datetime') {\r\n $scope.opened[tag.id] = {\r\n min: false,\r\n max: false,\r\n };\r\n $scope.datetimedate[tag.id] = {};\r\n if (tag.freeform) {\r\n $scope.values[tag.id].value.min = new Date();\r\n $scope.values[tag.id].value.max = new Date();\r\n if (tag.dataType === 'Datetime') {\r\n $scope.values[tag.id].value.min = new Date(\r\n new Date().getTime() +\r\n new Date().getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date()) * 60000,\r\n );\r\n $scope.values[tag.id].value.max = new Date(\r\n new Date().getTime() +\r\n new Date().getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date()) * 60000,\r\n );\r\n $scope.datetimedate[tag.id].min = new Date(\r\n new Date($scope.values[tag.id].value.min).getTime() +\r\n new Date($scope.values[tag.id].value.min).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date($scope.values[tag.id].value.min)) *\r\n 60000,\r\n );\r\n $scope.datetimedate[tag.id].max = new Date(\r\n new Date($scope.values[tag.id].value.max).getTime() +\r\n new Date($scope.values[tag.id].value.max).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date($scope.values[tag.id].value.max)) *\r\n 60000,\r\n );\r\n }\r\n } else {\r\n if (tag.range.min) {\r\n $scope.values[tag.id].value.min = new Date(\r\n new Date(tag.range.min).getTime() +\r\n new Date(tag.range.min).getTimezoneOffset() * 60000,\r\n );\r\n if (tag.dataType === 'Datetime') {\r\n $scope.values[tag.id].value.min = new Date(\r\n new Date(tag.range.min).getTime() +\r\n new Date(tag.range.min).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.min)) * 60000,\r\n );\r\n $scope.datetimedate[tag.id].min = new Date(\r\n new Date(tag.range.min).getTime() +\r\n new Date(tag.range.min).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.min)) * 60000,\r\n );\r\n $scope.values[tag.id].minValue = new Date(\r\n new Date(tag.range.min).getTime() +\r\n new Date(tag.range.min).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.min)) * 60000,\r\n );\r\n }\r\n }\r\n if (tag.range.max) {\r\n $scope.values[tag.id].value.max = new Date(\r\n new Date(tag.range.max).getTime() +\r\n new Date(tag.range.max).getTimezoneOffset() * 60000,\r\n );\r\n\r\n if (tag.dataType === 'Datetime') {\r\n $scope.values[tag.id].value.max = new Date(\r\n new Date(tag.range.max).getTime() +\r\n new Date(tag.range.max).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.max)) * 60000,\r\n );\r\n $scope.datetimedate[tag.id].max = new Date(\r\n new Date(tag.range.max).getTime() +\r\n new Date(tag.range.max).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.max)) * 60000,\r\n );\r\n $scope.values[tag.id].maxValue = new Date(\r\n new Date(tag.range.max).getTime() +\r\n new Date(tag.range.max).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tag.range.max)) * 60000,\r\n );\r\n }\r\n }\r\n $scope.datetimeBounds[tag.id] = {\r\n maxStart: $scope.returnTimeBound('maxStart', tag.id),\r\n minStart: $scope.returnTimeBound('minStart', tag.id),\r\n maxEnd: $scope.returnTimeBound('maxEnd', tag.id),\r\n minEnd: $scope.returnTimeBound('minEnd', tag.id),\r\n };\r\n }\r\n }\r\n tag.selected = true;\r\n $scope.newTag = {};\r\n if (focus) {\r\n $scope.focus[tag.id] = true;\r\n $scope.style[tag.id] = {};\r\n $scope.showTag[tag.id] = true;\r\n } else {\r\n $scope.focus[tag.id] = false;\r\n $scope.style[tag.id] = {\r\n cursor: 'pointer',\r\n };\r\n $scope.showTag[tag.id] = false;\r\n }\r\n };\r\n\r\n $scope.removeTag = function (index) {\r\n $scope.selectedTags[index].selected = false;\r\n delete $scope.values[$scope.selectedTags[index].id];\r\n delete $scope.any[$scope.selectedTags[index].id];\r\n delete $scope.focus[$scope.selectedTags[index].id];\r\n delete $scope.style[$scope.selectedTags[index].id];\r\n delete $scope.showTag[$scope.selectedTags[index].id];\r\n $scope.selectedTags.splice(index, 1);\r\n\r\n $timeout(function () {\r\n $scope.applyTags();\r\n }, 1);\r\n };\r\n\r\n $scope.blurOnSelect = function (selectedItem) {\r\n $timeout(function () {\r\n $(':focus').blur();\r\n }, 1);\r\n };\r\n\r\n $scope.toggle = function (index) {\r\n $scope.showTag[index] = !$scope.showTag[index];\r\n if ($scope.showTag[index]) {\r\n $scope.style[index] = {};\r\n } else {\r\n $scope.style[index] = {\r\n cursor: 'pointer',\r\n };\r\n }\r\n };\r\n\r\n $scope.show = function (index) {\r\n $scope.showTag[index] = true;\r\n $scope.style[index] = {};\r\n $scope.focus[index] = true;\r\n };\r\n\r\n $scope.hide = function (index, e) {\r\n if (e) {\r\n const { target } = e;\r\n $timeout(function () {\r\n target.blur();\r\n }, 1);\r\n }\r\n $scope.showTag[index] = false;\r\n $scope.style[index] = {\r\n cursor: 'pointer',\r\n };\r\n $scope.focus[index] = false;\r\n };\r\n\r\n $scope.showIfHidden = function (index) {\r\n event.stopPropagation();\r\n if (!$scope.showTag[index]) {\r\n $scope.show(index);\r\n }\r\n };\r\n\r\n $scope.filterSelected = function (tag) {\r\n if (tag.selected) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.roundInt = function (val) {\r\n return val ? Math.floor(val) : val;\r\n };\r\n\r\n $scope.open = function (index, val) {\r\n if (val === 'min') {\r\n $scope.opened[index].min = true;\r\n } else if (val === 'max') {\r\n $scope.opened[index].max = true;\r\n }\r\n };\r\n\r\n $scope.datetimeValidCheck = function (id, val) {\r\n let temp;\r\n if (val === 'min') {\r\n if (!$scope.minMaxRequired[id].min) {\r\n return true;\r\n }\r\n temp = new Date($scope.datetimedate[id].min.getTime());\r\n if ($scope.values[id].value.min) {\r\n temp.setHours($scope.values[id].value.min.getHours());\r\n temp.setMinutes($scope.values[id].value.min.getMinutes());\r\n temp.setSeconds($scope.values[id].value.min.getSeconds());\r\n }\r\n } else if (val === 'max') {\r\n if (!$scope.minMaxRequired[id].max) {\r\n return true;\r\n }\r\n temp = new Date($scope.datetimedate[id].max.getTime());\r\n if ($scope.values[id].value.max) {\r\n temp.setHours($scope.values[id].value.max.getHours());\r\n temp.setMinutes($scope.values[id].value.max.getMinutes());\r\n temp.setSeconds($scope.values[id].value.max.getSeconds());\r\n }\r\n }\r\n\r\n if (\r\n (!$scope.values[id].minValue || temp >= $scope.values[id].minValue) &&\r\n (!$scope.values[id].maxValue || temp <= $scope.values[id].maxValue)\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $scope.rangeValid = function (id) {\r\n if (\r\n $scope.minMaxRequired[id].min &&\r\n $scope.minMaxRequired[id].max &&\r\n $scope.values[id].value.min > $scope.values[id].value.max\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.rangeDefined = function (id) {\r\n if (!$scope.minMaxRequired[id].min && !$scope.minMaxRequired[id].max && !$scope.any[id]) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.datetimeRangeValid = function (id) {\r\n if (\r\n $scope.minMaxRequired[id].min &&\r\n $scope.minMaxRequired[id].max &&\r\n $scope.datetimedate[id].min &&\r\n $scope.datetimedate[id].max\r\n ) {\r\n const tempMin = new Date($scope.datetimedate[id].min.getTime());\r\n if ($scope.values[id].value.min) {\r\n tempMin.setHours($scope.values[id].value.min.getHours());\r\n tempMin.setMinutes($scope.values[id].value.min.getMinutes());\r\n tempMin.setSeconds($scope.values[id].value.min.getSeconds());\r\n }\r\n const tempMax = new Date($scope.datetimedate[id].max.getTime());\r\n if ($scope.values[id].value.max) {\r\n tempMax.setHours($scope.values[id].value.max.getHours());\r\n tempMax.setMinutes($scope.values[id].value.max.getMinutes());\r\n tempMax.setSeconds($scope.values[id].value.max.getSeconds());\r\n }\r\n return tempMin <= tempMax;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.updateTimeBounds = function (key, id) {\r\n switch (key) {\r\n case 'start':\r\n $scope.datetimeBounds[id].minStart = $scope.returnTimeBound('minStart', id);\r\n $scope.datetimeBounds[id].maxStart = $scope.returnTimeBound('maxStart', id);\r\n break;\r\n case 'end':\r\n $scope.datetimeBounds[id].minEnd = $scope.returnTimeBound('minEnd', id);\r\n $scope.datetimeBounds[id].maxEnd = $scope.returnTimeBound('maxEnd', id);\r\n break;\r\n }\r\n };\r\n\r\n $scope.returnTimeBound = function (key, id) {\r\n switch (key) {\r\n case 'maxStart':\r\n if (!$scope.datetimedate[id].min || !$scope.values[id].maxValue) {\r\n return undefined;\r\n }\r\n if (\r\n $scope.datetimedate[id].min.toDateString() === $scope.values[id].maxValue.toDateString()\r\n ) {\r\n var tempMax = new Date($scope.values[id].value.min.getTime());\r\n if ($scope.values[id].value.min) {\r\n tempMax.setHours($scope.values[id].maxValue.getHours());\r\n tempMax.setMinutes($scope.values[id].maxValue.getMinutes());\r\n tempMax.setSeconds($scope.values[id].maxValue.getSeconds());\r\n }\r\n return tempMax;\r\n }\r\n return undefined;\r\n\r\n break;\r\n case 'minStart':\r\n if (!$scope.datetimedate[id].min || !$scope.values[id].minValue) {\r\n return undefined;\r\n }\r\n if (\r\n $scope.datetimedate[id].min.toDateString() === $scope.values[id].minValue.toDateString()\r\n ) {\r\n var tempMin = new Date($scope.values[id].value.min.getTime());\r\n if ($scope.values[id].value.min) {\r\n tempMin.setHours($scope.values[id].minValue.getHours());\r\n tempMin.setMinutes($scope.values[id].minValue.getMinutes());\r\n tempMin.setSeconds($scope.values[id].minValue.getSeconds());\r\n }\r\n return tempMin;\r\n }\r\n return undefined;\r\n\r\n break;\r\n case 'minEnd':\r\n if (!$scope.datetimedate[id].max || !$scope.values[id].minValue) {\r\n return undefined;\r\n }\r\n if (\r\n $scope.datetimedate[id].max.toDateString() === $scope.values[id].minValue.toDateString()\r\n ) {\r\n var tempMin = new Date($scope.values[id].value.max.getTime());\r\n if ($scope.values[id].value.max) {\r\n tempMin.setHours($scope.values[id].minValue.getHours());\r\n tempMin.setMinutes($scope.values[id].minValue.getMinutes());\r\n tempMin.setSeconds($scope.values[id].minValue.getSeconds());\r\n }\r\n return tempMin;\r\n }\r\n return undefined;\r\n\r\n break;\r\n case 'maxEnd':\r\n if (!$scope.datetimedate[id].max || !$scope.values[id].maxValue) {\r\n return undefined;\r\n }\r\n if (\r\n $scope.datetimedate[id].max.toDateString() === $scope.values[id].maxValue.toDateString()\r\n ) {\r\n var tempMax = new Date($scope.values[id].value.max.getTime());\r\n if ($scope.values[id].value.max) {\r\n tempMax.setHours($scope.values[id].maxValue.getHours());\r\n tempMax.setMinutes($scope.values[id].maxValue.getMinutes());\r\n tempMax.setSeconds($scope.values[id].maxValue.getSeconds());\r\n }\r\n return tempMax;\r\n }\r\n return undefined;\r\n\r\n break;\r\n }\r\n };\r\n\r\n $scope.generateTooltip = function (tag) {\r\n let tip = '';\r\n switch (tag.dataType) {\r\n case 'Integer':\r\n tip = gettextCatalog.getString('Enter an integer ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n break;\r\n case 'Decimal':\r\n tip = gettextCatalog.getString('Enter a number ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n break;\r\n case 'Date':\r\n tip = gettextCatalog.getString('Select a date ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('({{min}} or later)', {\r\n min: $filter('date')(tag.range.min, $scope.format),\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: $filter('date')(tag.range.min, $scope.format),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: $filter('date')(tag.range.max, $scope.format),\r\n });\r\n } else {\r\n tip += $filter('date')(tag.range.max, $scope.format);\r\n }\r\n }\r\n return tip;\r\n break;\r\n case 'Datetime':\r\n tip = gettextCatalog.getString('Select a date and time ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += gettextCatalog.getString('({{min}} or later)', {\r\n min: $filter('date')(tag.range.min, $scope.dateTimeformat),\r\n });\r\n } else {\r\n tip += gettextCatalog.getString('from {{min}} to ', {\r\n min: $filter('date')(tag.range.min, $scope.dateTimeformat),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: $filter('date')(tag.range.max, $scope.dateTimeformat),\r\n });\r\n } else {\r\n tip += $filter('date')(tag.range.max, $scope.dateTimeformat);\r\n }\r\n }\r\n return tip;\r\n break;\r\n }\r\n };\r\n\r\n $scope.displayValue = function (tag) {\r\n if ($scope.any[tag.id]) {\r\n return '(any)';\r\n }\r\n\r\n switch (tag.dataType) {\r\n case 'Text':\r\n if (!$scope.values[tag.id].value || $scope.values[tag.id].value.length === 0) {\r\n return '';\r\n }\r\n var val = $scope.values[tag.id].value[0];\r\n var output = val !== null && typeof val === 'object' ? val.text : val;\r\n for (var i = 1; i < $scope.values[tag.id].value.length; i++) {\r\n val = $scope.values[tag.id].value[i];\r\n val = val !== null && typeof val === 'object' ? val.text : val;\r\n output += ` ${gettextCatalog.getString('OR')} ${val}`;\r\n }\r\n return output;\r\n\r\n break;\r\n case 'Integer':\r\n if (!$scope.values[tag.id].value || $scope.values[tag.id].value.length === 0) {\r\n return '';\r\n }\r\n var output = $scope.values[tag.id].value[0].text;\r\n for (var i = 1; i < $scope.values[tag.id].value.length; i++) {\r\n output += ` ${gettextCatalog.getString('OR')} ${\r\n $scope.values[tag.id].value[i].text\r\n }`;\r\n }\r\n return output;\r\n\r\n break;\r\n case 'Decimal':\r\n if (!$scope.values[tag.id].value || $scope.values[tag.id].value.length === 0) {\r\n return '';\r\n }\r\n var output = $scope.values[tag.id].value[0].text;\r\n for (var i = 1; i < $scope.values[tag.id].value.length; i++) {\r\n output += ` ${gettextCatalog.getString('OR')} ${\r\n $scope.values[tag.id].value[i].text\r\n }`;\r\n }\r\n return output;\r\n break;\r\n case 'Date':\r\n var text = '';\r\n if ($scope.values[tag.id].value.min && $scope.minMaxRequired[tag.id].min) {\r\n if (!($scope.values[tag.id].value.max && $scope.minMaxRequired[tag.id].max)) {\r\n text += gettextCatalog.getString('{{min}} or later', {\r\n min: $filter('date')($scope.values[tag.id].value.min, $scope.format),\r\n });\r\n return text;\r\n }\r\n text += gettextCatalog.getString('From {{min}} to ', {\r\n min: $filter('date')($scope.values[tag.id].value.min, $scope.format),\r\n });\r\n }\r\n if ($scope.values[tag.id].value.max && $scope.minMaxRequired[tag.id].max) {\r\n if (!($scope.values[tag.id].value.min && $scope.minMaxRequired[tag.id].min)) {\r\n text += gettextCatalog.getString('{{max}} or earlier', {\r\n max: $filter('date')($scope.values[tag.id].value.max, $scope.format),\r\n });\r\n } else {\r\n text += $filter('date')($scope.values[tag.id].value.max, $scope.format);\r\n }\r\n return text;\r\n }\r\n return '';\r\n break;\r\n case 'Datetime':\r\n var text = '';\r\n if (\r\n $scope.values[tag.id].value.min &&\r\n $scope.datetimedate[tag.id].min &&\r\n $scope.minMaxRequired[tag.id].min\r\n ) {\r\n var temp = new Date($scope.datetimedate[tag.id].min.getTime());\r\n temp.setHours($scope.values[tag.id].value.min.getHours());\r\n temp.setMinutes($scope.values[tag.id].value.min.getMinutes());\r\n temp.setSeconds($scope.values[tag.id].value.min.getSeconds());\r\n if (\r\n !(\r\n $scope.values[tag.id].value.max &&\r\n $scope.datetimedate[tag.id].max &&\r\n $scope.minMaxRequired[tag.id].max\r\n )\r\n ) {\r\n text += gettextCatalog.getString('{{min}} or later', {\r\n min: $filter('date')(temp, $scope.dateTimeformat),\r\n });\r\n return text;\r\n }\r\n text += gettextCatalog.getString('From {{min}} to ', {\r\n min: $filter('date')(temp, $scope.dateTimeformat),\r\n });\r\n }\r\n if ($scope.values[tag.id].value.max && $scope.minMaxRequired[tag.id].max) {\r\n var temp = new Date($scope.datetimedate[tag.id].max.getTime());\r\n temp.setHours($scope.values[tag.id].value.max.getHours());\r\n temp.setMinutes($scope.values[tag.id].value.max.getMinutes());\r\n temp.setSeconds($scope.values[tag.id].value.max.getSeconds());\r\n if (!($scope.values[tag.id].value.min && $scope.minMaxRequired[tag.id].min)) {\r\n text += gettextCatalog.getString('{{max}} or earlier', {\r\n max: $filter('date')(temp, $scope.dateTimeformat),\r\n });\r\n } else {\r\n text += $filter('date')(temp, $scope.dateTimeformat);\r\n }\r\n return text;\r\n }\r\n return '';\r\n break;\r\n }\r\n };\r\n\r\n $scope.$watch(\r\n 'toFilter',\r\n function (newValue, oldValue) {\r\n if (newValue != oldValue) {\r\n $rootScope.$broadcast('map-filter-update');\r\n $scope.showMobile = false;\r\n $scope.onChange();\r\n for (const key in $scope.focus) {\r\n $scope.focus[key] = false;\r\n }\r\n\r\n if (newValue !== undefined) {\r\n const eventData = {};\r\n let arr;\r\n\r\n if (newValue.facets !== undefined) {\r\n if (newValue.facets.alerts !== undefined) {\r\n arr = newValue.facets.alerts\r\n .filter((item) => item._selected === true)\r\n .map((item) => item.name);\r\n\r\n if (arr.length > 0) eventData.alertPriority = arr;\r\n }\r\n\r\n if (newValue.facets.maintenance !== undefined) {\r\n arr = newValue.facets.maintenance\r\n .filter((item) => item._selected === true)\r\n .map((item) => item.name);\r\n\r\n if (arr.length > 0) eventData.maintenance = arr;\r\n }\r\n\r\n if (newValue.facets.securityGroups !== undefined) {\r\n arr = newValue.facets.securityGroups\r\n .filter((item) => item._selected === true)\r\n .map((item) => item.name);\r\n\r\n if (arr.length > 0) eventData.securityGroups = arr;\r\n }\r\n\r\n if (newValue.facets.lastCommunicated !== undefined) {\r\n arr = newValue.facets.lastCommunicated\r\n .filter((item) => item._selected === true)\r\n .map((item) => item.id);\r\n\r\n if (arr.length > 0) eventData.lastCommunicated = arr;\r\n }\r\n\r\n if (newValue.facets.lastSeen !== undefined) {\r\n arr = newValue.facets.lastSeen\r\n .filter((item) => item._selected === true)\r\n .map((item) => ({ id: item.id, range: item.range }));\r\n\r\n if (arr.length > 0) eventData.lastSeen = arr;\r\n }\r\n }\r\n\r\n if (newValue.tags !== undefined && Object.keys(newValue.tags).length > 0) {\r\n eventData.tags = newValue.tags;\r\n }\r\n\r\n eventData.page = $state.current.name;\r\n\r\n addToDataLayer({\r\n event: 'assetsFacetFiltering',\r\n data: eventData,\r\n });\r\n }\r\n }\r\n },\r\n true,\r\n );\r\n\r\n $scope.isNotSelected = function (item) {\r\n return !item._selected;\r\n };\r\n\r\n $scope.tagsValid = function () {\r\n for (let i = 0; i < $scope.selectedTags.length; i++) {\r\n if (Array.isArray($scope.values[$scope.selectedTags[i].id].value)) {\r\n if (\r\n $scope.values[$scope.selectedTags[i].id].value.length == 0 &&\r\n !$scope.any[$scope.selectedTags[i].id]\r\n ) {\r\n return false;\r\n }\r\n }\r\n switch ($scope.selectedTags[i].dataType) {\r\n case 'Text':\r\n if (\r\n (!$scope.values[$scope.selectedTags[i].id].value ||\r\n $scope.values[$scope.selectedTags[i].id].value === '') &&\r\n !$scope.any[$scope.selectedTags[i].id]\r\n ) {\r\n return false;\r\n }\r\n break;\r\n case 'Integer':\r\n if (\r\n (!$scope.values[$scope.selectedTags[i].id].value ||\r\n $scope.values[$scope.selectedTags[i].id].value === '') &&\r\n !$scope.any[$scope.selectedTags[i].id]\r\n ) {\r\n return false;\r\n }\r\n break;\r\n case 'Decimal':\r\n if (\r\n (!$scope.values[$scope.selectedTags[i].id].value ||\r\n $scope.values[$scope.selectedTags[i].id].value === '') &&\r\n !$scope.any[$scope.selectedTags[i].id]\r\n ) {\r\n return false;\r\n }\r\n break;\r\n case 'Date':\r\n if (\r\n !$scope.rangeValid($scope.selectedTags[i].id) ||\r\n !$scope.rangeDefined($scope.selectedTags[i].id)\r\n ) {\r\n return false;\r\n }\r\n break;\r\n case 'Datetime':\r\n if (\r\n !$scope.datetimeRangeValid($scope.selectedTags[i].id) ||\r\n !$scope.rangeDefined($scope.selectedTags[i].id)\r\n ) {\r\n return false;\r\n }\r\n break;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.validInteger = function (input, tag) {\r\n if (isNaN(input.text)) {\r\n return false;\r\n }\r\n\r\n const num = parseInt(input.text, 10);\r\n tag.value = num;\r\n\r\n if (!$scope.tagFilters[tag.key] || $scope.tagFilters[tag.key].length == 0) {\r\n $scope.tagFilters[tag.key] = [];\r\n }\r\n\r\n $scope.tagFilters[tag.key].push(tag.value);\r\n if (num !== parseFloat(input.text)) {\r\n return false;\r\n }\r\n\r\n if (tag.range.min) {\r\n if (num < tag.range.min) {\r\n return false;\r\n }\r\n }\r\n\r\n if (tag.range.max) {\r\n if (num > tag.range.max) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.validDecimal = function (input, tag) {\r\n if (isNaN(input.text)) {\r\n return false;\r\n }\r\n const num = parseFloat(input.text);\r\n tag.value = num;\r\n if (!$scope.tagFilters[tag.key] || $scope.tagFilters[tag.key].length == 0) {\r\n $scope.tagFilters[tag.key] = [];\r\n }\r\n $scope.tagFilters[tag.key].push(tag.value);\r\n if (tag.range.min) {\r\n if (num < tag.range.min) {\r\n return false;\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (num > tag.range.max) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.updateTags = function () {\r\n $scope.tagFilters = {};\r\n // $scope.tagFilters._updatedBy = $scope.$id;\r\n for (let i = 0; i < $scope.selectedTags.length; i++) {\r\n if ($scope.any[$scope.selectedTags[i].id]) {\r\n $scope.tagFilters[$scope.selectedTags[i].key] = {\r\n any: true,\r\n };\r\n continue;\r\n }\r\n if (\r\n $scope.selectedTags[i].dataType === 'Integer' ||\r\n $scope.selectedTags[i].dataType === 'Decimal'\r\n ) {\r\n $scope.tagFilters[$scope.selectedTags[i].key] = [];\r\n for (let j = 0; j < $scope.values[$scope.selectedTags[i].id].value.length; j++) {\r\n $scope.tagFilters[$scope.selectedTags[i].key].push(\r\n $scope.values[$scope.selectedTags[i].id].value[j].text,\r\n );\r\n }\r\n continue;\r\n }\r\n $scope.tagFilters[$scope.selectedTags[i].key] = angular.copy(\r\n $scope.values[$scope.selectedTags[i].id].value,\r\n );\r\n if (\r\n $scope.values[$scope.selectedTags[i].id].value.hasOwnProperty('min') &&\r\n !$scope.minMaxRequired[$scope.selectedTags[i].id].min\r\n ) {\r\n delete $scope.tagFilters[$scope.selectedTags[i].key].min;\r\n }\r\n if (\r\n $scope.tagFilters[$scope.selectedTags[i].key].hasOwnProperty('min') &&\r\n $scope.selectedTags[i].dataType === 'Date'\r\n ) {\r\n $scope.tagFilters[$scope.selectedTags[i].key].min = $filter('date')(\r\n $scope.tagFilters[$scope.selectedTags[i].key].min,\r\n 'yyyy-MM-dd',\r\n );\r\n }\r\n if (\r\n $scope.tagFilters[$scope.selectedTags[i].key].hasOwnProperty('min') &&\r\n $scope.selectedTags[i].dataType === 'Datetime'\r\n ) {\r\n var temp = new Date($scope.datetimedate[$scope.selectedTags[i].id].min.getTime());\r\n var tagDate = new Date($scope.tagFilters[$scope.selectedTags[i].key].min);\r\n temp.setHours(tagDate.getHours());\r\n temp.setMinutes(tagDate.getMinutes());\r\n temp.setSeconds(tagDate.getSeconds());\r\n temp = new Date(\r\n new Date(temp).getTime() -\r\n new Date(temp).getTimezoneOffset() * 60000 -\r\n TimezoneService.getUserTimezoneOffset(new Date(temp)) * 60000,\r\n );\r\n $scope.tagFilters[$scope.selectedTags[i].key].min = $filter('searchFormat')(\r\n temp.toISOString(),\r\n );\r\n }\r\n if (\r\n $scope.values[$scope.selectedTags[i].id].value.hasOwnProperty('max') &&\r\n !$scope.minMaxRequired[$scope.selectedTags[i].id].max\r\n ) {\r\n delete $scope.tagFilters[$scope.selectedTags[i].key].max;\r\n }\r\n if (\r\n $scope.tagFilters[$scope.selectedTags[i].key].hasOwnProperty('max') &&\r\n $scope.selectedTags[i].dataType === 'Date'\r\n ) {\r\n $scope.tagFilters[$scope.selectedTags[i].key].max = $filter('date')(\r\n $scope.tagFilters[$scope.selectedTags[i].key].max,\r\n 'yyyy-MM-dd',\r\n );\r\n }\r\n if (\r\n $scope.tagFilters[$scope.selectedTags[i].key].hasOwnProperty('max') &&\r\n $scope.selectedTags[i].dataType === 'Datetime'\r\n ) {\r\n var temp = new Date($scope.datetimedate[$scope.selectedTags[i].id].max.getTime());\r\n var tagDate = new Date($scope.tagFilters[$scope.selectedTags[i].key].max);\r\n temp.setHours(tagDate.getHours());\r\n temp.setMinutes(tagDate.getMinutes());\r\n temp.setSeconds(tagDate.getSeconds());\r\n temp = new Date(\r\n new Date(temp).getTime() -\r\n new Date(temp).getTimezoneOffset() * 60000 -\r\n TimezoneService.getUserTimezoneOffset(new Date(temp)) * 60000,\r\n );\r\n $scope.tagFilters[$scope.selectedTags[i].key].max = $filter('searchFormat')(\r\n temp.toISOString(),\r\n );\r\n }\r\n }\r\n\r\n $scope.toFilter = {\r\n facets: $scope.facets,\r\n tags: $scope.tagFilters,\r\n };\r\n };\r\n\r\n /**\r\n * this function will get called every time we click on any spot in the filter\r\n * as will as been used to trigger the search after any update to facet or tags by updating\r\n * $scope.toFilter then toFilter watcher will fire the event to do the search.\r\n * - there is no button to apply an attribute, therefore we check the changes when clicking outside the attr or by press enter.\r\n * - make the global applyTags event go through only when there are tags(attrs) changes.\r\n */\r\n $scope.applyTags = function (globalEventTag) {\r\n $scope.search.form.$setSubmitted();\r\n\r\n const hasTagsSelected = ($scope.selectedTags || []).length > 0;\r\n const anyTagsApplied = Object.keys($scope.tagFilters || {}).length > 0;\r\n const is_globel_with_no_tagsFiters_changes =\r\n globalEventTag === 'global' && !hasTagsSelected && !anyTagsApplied;\r\n\r\n if (\r\n $scope.search.form.$invalid ||\r\n !$scope.tagsValid() ||\r\n is_globel_with_no_tagsFiters_changes\r\n ) {\r\n return;\r\n }\r\n\r\n updateFilterCount();\r\n $scope.updateTags();\r\n };\r\n\r\n $scope.clearFilters = function () {\r\n for (let i = 0; i < $scope.selectedTags.length; i++) {\r\n $scope.selectedTags[i].selected = false;\r\n }\r\n\r\n $scope.selectedTags = [];\r\n for (const key in $scope.facets) {\r\n if (key === LAST_SEEN_KEY) {\r\n $scope.facets[key] = [];\r\n }\r\n for (let j = 0; j < $scope.facets[key].length; j++) {\r\n $scope.facets[key][j]._selected = false;\r\n }\r\n }\r\n $scope.queryString = '';\r\n $scope.values = {};\r\n $scope.focus = {};\r\n $scope.any = {};\r\n vm.filterModels = newfilterModels();\r\n $scope.applyTags();\r\n };\r\n\r\n // Load Saved Filters\r\n $scope.loadSavedFilters = function () {\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n bindToController: true,\r\n template: require('../savedfilters/saved-filters-modal.html'),\r\n controller: 'SavedFiltersModalController',\r\n resolve: {},\r\n size: 'md',\r\n windowClass: 'tr-saved-filters-modal-dismiss',\r\n });\r\n\r\n // modal dialog result\r\n modalInstance.result.then(\r\n function (selectedFilters) {\r\n // $scope.clearFilters();\r\n const selectedFilterModels = {};\r\n selectedFilterModels.alerts = selectedFilters.alertStates;\r\n selectedFilterModels.maintenance = selectedFilters.maintenanceStates;\r\n selectedFilterModels.securityGroups = selectedFilters.securityGroupIds;\r\n selectedFilterModels.attrValueList = selectedFilters.attrValueList;\r\n selectedFilterModels.filtersCollection = selectedFilters.filtersCollection; // ['lastCommunicated'];\r\n $scope.selectedTagFilters = selectedFilters.attrValueList;\r\n\r\n vm.filterModels = newfilterModels();\r\n\r\n Object.keys(selectedFilterModels).forEach((key) => {\r\n // Check to see if there is a matching facet key in the returned facets\r\n if (\r\n $scope.facets[key] &&\r\n key !== reservedKeys.attrValueList &&\r\n key !== reservedKeys.filtersCollection\r\n ) {\r\n for (let i = 0; i < selectedFilterModels[key].length; i++) {\r\n const facet = selectedFilterModels[key][i];\r\n for (let j = 0; j < $scope.facets[key].length; j++) {\r\n const tempFacet = $scope.facets[key][j];\r\n if (tempFacet.tag === facet) {\r\n tempFacet._selected = true;\r\n vm.filterModels[key].push(tempFacet);\r\n break;\r\n } // end if\r\n } // end inner most for\r\n } // end inner for\r\n\r\n for (let i = 0; i < $scope.facets[key].length; i++) {\r\n if (vm.filterModels[key].indexOf($scope.facets[key][i]) < 0) {\r\n $scope.facets[key][i]._selected = false;\r\n }\r\n }\r\n } // end if\r\n });\r\n\r\n // Update with filters passed by parent\r\n updateTagsForFilter(selectedFilterModels); // AttrsValueList\r\n // update with filterscollection\r\n updateFilterCollection(selectedFilterModels);\r\n\r\n $scope.queryString = selectedFilters.queryString;\r\n $scope.facets._updatedBy = $scope.$id;\r\n\r\n updateFilterCount();\r\n },\r\n function (error) {},\r\n ); // end modalInstance result\r\n }; // end loadSavedFilters()\r\n\r\n function updateTagsForFilter(selectedFilterModels) {\r\n $scope.selectedTagFilters = selectedFilterModels.attrValueList;\r\n if ($scope.selectedTagFilters.length == 0) return;\r\n if (!$scope.tags) return;\r\n // Clear existing variables\r\n $scope.values = {};\r\n $scope.focus = {};\r\n $scope.any = {};\r\n $scope.showTag = [];\r\n $scope.selectedTags = [];\r\n // $scope.minMaxRequired = {};\r\n for (const key in $scope.selectedTagFilters) {\r\n var selectedTagFilter = $scope.selectedTagFilters[key];\r\n for (let i = 0; i < $scope.tags.length; i++) {\r\n var tag = $scope.tags[i];\r\n if (key === tag.id) {\r\n tag.selected = true;\r\n $scope.selectedTags.push(tag);\r\n $scope.values[tag.id] = {\r\n tag: tag.id,\r\n value: (function () {\r\n const values = selectedTagFilter;\r\n if (tag.dataType === 'Datetime') {\r\n if (values.min) {\r\n const tempMin = values.min;\r\n values.min = new Date(\r\n new Date(tempMin).getTime() +\r\n new Date(tempMin).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tempMin)) * 60000,\r\n );\r\n }\r\n if (values.max) {\r\n const tempMax = values.max;\r\n values.max = new Date(\r\n new Date(tempMax).getTime() +\r\n new Date(tempMax).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(tempMax)) * 60000,\r\n );\r\n }\r\n }\r\n return values;\r\n })(),\r\n };\r\n\r\n $scope.any[tag.id] = $scope.values[tag.id].value.any;\r\n if (Array.isArray($scope.values[tag.id].value)) {\r\n for (let m = 0; m < $scope.values[tag.id].value.length; m++) {\r\n const val = $scope.values[tag.id].value[m];\r\n if (tag.dataType === 'Text') {\r\n $scope.values[tag.id].value[m] = val;\r\n $scope.values[tag.id].value[m] = val;\r\n } else {\r\n $scope.values[tag.id].value[m] = {};\r\n $scope.values[tag.id].value[m].text = val;\r\n }\r\n }\r\n }\r\n $scope.minMaxRequired[tag.id] = {};\r\n $scope.datetimedate[tag.id] = {};\r\n $scope.minMaxRequired[tag.id].min = $scope.values[tag.id].value.min;\r\n $scope.minMaxRequired[tag.id].max = $scope.values[tag.id].value.max;\r\n $scope.datetimedate[tag.id].min = new Date($scope.values[tag.id].value.min);\r\n $scope.datetimedate[tag.id].max = new Date($scope.values[tag.id].value.max);\r\n break;\r\n } // end if\r\n } // end inner for\r\n } // end outer for\r\n $scope.updateTags();\r\n } // end updateTagsForFilter\r\n\r\n // Create Saved Filter\r\n $scope.saveFiltersAs = function () {\r\n vm.filterModels.queryString = $scope.queryString;\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n bindToController: true,\r\n template: require('../savedfilters/save-filters-modal.html'),\r\n controller: 'SaveFiltersModalController',\r\n controllerAs: 'vm',\r\n resolve: {\r\n filterModels() {\r\n return vm.filterModels;\r\n },\r\n selectedTags() {\r\n return $scope.selectedTags;\r\n },\r\n tagFilters() {\r\n return $scope.tagFilters;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n\r\n // modal dialog result\r\n modalInstance.result.then(\r\n function (savedFilters) {\r\n $scope.savedFilters = savedFilters;\r\n },\r\n function () {},\r\n );\r\n }; // end saveFiltersAs()\r\n\r\n function updateFilterCollection(selectedFilterModels) {\r\n const { filtersCollection } = selectedFilterModels;\r\n const { lastCommKey, lastSeenKey } = reservedKeys;\r\n\r\n if ($scope.facets[lastCommKey]) {\r\n $scope.facets[lastCommKey].forEach((facet) => {\r\n if (filtersCollection[lastCommKey] && filtersCollection[lastCommKey].id === facet.id) {\r\n vm.filterModels[lastCommKey][0] = filtersCollection[lastCommKey];\r\n facet._selected = true;\r\n } else {\r\n facet._selected = false;\r\n }\r\n });\r\n }\r\n\r\n if (filtersCollection[lastSeenKey]) {\r\n const lastSeenFilter = [filtersCollection[lastSeenKey]];\r\n\r\n $scope.facets.lastSeen = lastSeenFilter;\r\n vm.filterModels.lastSeen = lastSeenFilter;\r\n }\r\n }\r\n }\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport default function EquipmentFiltersSummaryDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-filters-summary.html'),\r\n scope: {\r\n facets: '=',\r\n tags: '=',\r\n tagFilters: '='\r\n },\r\n controller: EquipmentFiltersSummaryController\r\n };\r\n\r\n function EquipmentFiltersSummaryController($scope, $filter, gettextCatalog, TimezoneService) {\r\n 'ngInject';\r\n $scope.numFilters = $scope.filters;\r\n\r\n $scope.deselectFacets = function(facets, key) {\r\n if (key === 'lastSeen') {\r\n $scope.facets.lastSeen = [];\r\n }\r\n _.forEach(facets, function(e) {\r\n e._selected = false;\r\n });\r\n\r\n $scope.facets = angular.copy($scope.facets);\r\n $scope.facets._updatedBy = $scope.$id;\r\n\r\n $scope.$emit('map-filter-update');\r\n };\r\n\r\n $scope.deselectTags = function(tagFilters) {\r\n $scope.tagFilters = {};\r\n };\r\n\r\n $scope.selectedTagFilters = function() {\r\n _.forEach($scope.tagFilters, function(e) {\r\n if (!e) return false;\r\n return e._selected;\r\n });\r\n };\r\n\r\n $scope.tagsLength = function() {\r\n if (!$scope.tagFilters) return 0;\r\n\r\n return Object.keys($scope.tagFilters).length;\r\n };\r\n\r\n $scope.selectedFacets = function(facet) {\r\n return _.filter(facet, function(e) {\r\n if (!e) return false;\r\n return e._selected;\r\n });\r\n };\r\n\r\n $scope.attrOutput = function(value, key) {\r\n if (typeof value !== 'object') {\r\n return value;\r\n } else {\r\n if (value.hasOwnProperty('any')) {\r\n return gettextCatalog.getString('(any)');\r\n }\r\n var output = '';\r\n if (!$scope.tags) {\r\n return value;\r\n }\r\n let tag;\r\n for (var i = 0; i < $scope.tags.length; i++) {\r\n if ($scope.tags[i].key === key) {\r\n tag = $scope.tags[i];\r\n break;\r\n }\r\n }\r\n if (!tag) {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n let val = value[0];\r\n var output = null !== val && typeof val === 'object' ? val.text : val;\r\n for (var i = 1; i < value.length; i++) {\r\n val = value[i];\r\n val = null !== val && typeof val === 'object' ? val.text : val;\r\n output += ' ' + gettextCatalog.getString('OR') + ' ' + val;\r\n }\r\n return output;\r\n }\r\n switch (tag.dataType) {\r\n case 'Date':\r\n if (value.hasOwnProperty('min')) {\r\n if (!value.hasOwnProperty('max')) {\r\n output += gettextCatalog.getString('({{min}} or later)', {\r\n min: $filter('date')(value.min, 'MMMM d, y')\r\n });\r\n } else {\r\n output += gettextCatalog.getString('from {{min}} to ', {\r\n min: $filter('date')(value.min, 'MMMM d, y')\r\n });\r\n }\r\n }\r\n if (value.hasOwnProperty('max')) {\r\n if (!value.hasOwnProperty('min')) {\r\n output += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: $filter('date')(value.max, 'MMMM d, y')\r\n });\r\n } else {\r\n output += $filter('date')(value.max, 'MMMM d, y');\r\n }\r\n }\r\n return output;\r\n break;\r\n case 'Datetime':\r\n if (value.hasOwnProperty('min')) {\r\n let min = angular.copy(value.min);\r\n min = min.replace(/\\\\/g, '').toUpperCase();\r\n min = new Date(\r\n new Date(min).getTime() +\r\n new Date(min).getTimezoneOffset() * 60000 +\r\n TimezoneService.getUserTimezoneOffset(new Date(min)) * 60000\r\n );\r\n if (!value.hasOwnProperty('max')) {\r\n output += gettextCatalog.getString('({{min}} or later)', {\r\n min: $filter('date')(min, 'MMMM d, y h:mm:ss a')\r\n });\r\n } else {\r\n output += gettextCatalog.getString('from {{min}} to ', {\r\n min: $filter('date')(min, 'MMMM d, y h:mm:ss a')\r\n });\r\n }\r\n }\r\n if (value.hasOwnProperty('max')) {\r\n let max = angular.copy(value.max);\r\n max = max.replace(/\\\\/g, '').toUpperCase();\r\n max = new Date(\r\n new Date(max).getTime() -\r\n new Date(max).getTimezoneOffset() * 60000 -\r\n TimezoneService.getUserTimezoneOffset(new Date(max)) * 60000\r\n );\r\n if (!value.hasOwnProperty('min')) {\r\n output += gettextCatalog.getString('({{max}} or earlier)', {\r\n max: $filter('date')(max, 'MMMM d, y h:mm:ss a')\r\n });\r\n } else {\r\n output += $filter('date')(max, 'MMMM d, y h:mm:ss a');\r\n }\r\n }\r\n return output;\r\n break;\r\n default:\r\n return value;\r\n break;\r\n }\r\n }\r\n };\r\n\r\n function updateSummary() {\r\n $scope.bubbles = [];\r\n\r\n _.forEach($scope.facets, function(val, key) {\r\n _.forEach(val, function(item, index) {\r\n if (item._selected && item.name) {\r\n $scope.bubbles.push({\r\n label: key,\r\n value: item.name //todo translate\r\n });\r\n }\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","\r\nexport default function EquipmentImagesDeleteModalController($scope, $uibModalInstance) {\r\n 'ngInject';\r\n\r\n $scope.ok = function () {\r\n $uibModalInstance.close('ok');\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close('cancel');\r\n };\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport default function EquipmentImagesModalController(\r\n $scope,\r\n $rootScope,\r\n $uibModalInstance,\r\n items,\r\n index,\r\n users,\r\n $timeout,\r\n equipId,\r\n MediaService,\r\n EquipmentService,\r\n profilePictureId,\r\n onDeleteImageCallback,\r\n $uibModal,\r\n gettextCatalog,\r\n $filter,\r\n photoSwipeService\r\n) {\r\n 'ngInject';\r\n\r\n $scope.isLoading = true;\r\n $scope.images = [];\r\n $scope.gallery = {};\r\n $scope.profilePictureId = profilePictureId;\r\n $scope.isProfileImage = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n\r\n $scope.onLoad = function() {\r\n //build object the photoswipe requires\r\n _.forEach(items, function(e) {\r\n //if object has attributes as an innr object , we need for fold it in the parent object\r\n const {attributes, ...rest} = e;\r\n e = {...rest, ...attributes};\r\n let image = {};\r\n image.src = e.href;\r\n image.w = 0;\r\n image.h = 0;\r\n image.id = e.id;\r\n image.title = '';\r\n image.initialPosition = {\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n if (e.description) {\r\n image.title += '
                ' + e.description;\r\n }\r\n\r\n if (e.createdAt) {\r\n image.title +=\r\n '
                ' +\r\n gettextCatalog.getString('Created At: {{date}}', {\r\n date: $filter('TableDateFilter')(e.createdAt)\r\n });\r\n }\r\n\r\n if (e.updatedAt) {\r\n image.title +=\r\n '
                ' +\r\n gettextCatalog.getString('Updated At: {{date}}', {\r\n date: $filter('TableDateFilter')(e.updatedAt)\r\n });\r\n }\r\n\r\n $scope.images.push(image);\r\n });\r\n\r\n let pswpElement = document.querySelectorAll('.pswp')[0];\r\n\r\n $scope.gallery = photoSwipeService.init(pswpElement, $scope.images, index);\r\n\r\n $scope.gallery.listen('gettingData', function(i, item) {\r\n if (item) {\r\n if (item.w < 1 || item.h < 1) {\r\n let img = new Image();\r\n img.onload = function() {\r\n item.w = this.width;\r\n item.h = this.height;\r\n $scope.gallery.updateSize(true);\r\n };\r\n\r\n img.src = item.src;\r\n img.id = item.id;\r\n }\r\n }\r\n });\r\n\r\n $scope.gallery.listen('afterChange', function() {\r\n $scope.errorFlag = false;\r\n checkProfileImage();\r\n });\r\n\r\n $scope.gallery.init();\r\n\r\n $scope.isLoading = false;\r\n };\r\n\r\n $timeout(function() {\r\n $scope.onLoad();\r\n }, 1000);\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close($scope.profilePictureId);\r\n };\r\n\r\n $scope.deleteImage = function() {\r\n $scope.errorFlag = false;\r\n\r\n let currIndex = $scope.gallery.getCurrentIndex();\r\n\r\n let imageId = $scope.images[currIndex].id;\r\n\r\n $uibModal\r\n .open({\r\n animation: true,\r\n template: require('./equipment-images-delete.modal.html'),\r\n controller: 'EquipmentImagesDeleteModalController',\r\n size: 'md'\r\n })\r\n .result.then(function(response) {\r\n if (response === 'cancel') {\r\n return;\r\n } else if (response === 'ok') {\r\n MediaService.deleteImage(imageId)\r\n .then(function() {\r\n onDeleteImageCallback(imageId, currIndex);\r\n\r\n //if profilepicture of asset remove from UI\r\n if (profilePictureId === imageId) {\r\n $rootScope.$broadcast('equipmentProfileImage', null);\r\n }\r\n\r\n //need in order to update the slide location after deleting\r\n $scope.gallery.goTo(0);\r\n\r\n items.splice(currIndex, 1); //keep track of whats delete to pass back to details page\r\n\r\n //if the user has deleted all images close the view modal\r\n if (items.length === 0) {\r\n $uibModalInstance.close();\r\n } else {\r\n $scope.images.splice(currIndex, 1);\r\n\r\n $timeout(function() {\r\n $scope.gallery.invalidateCurrItems();\r\n $scope.gallery.updateSize(true);\r\n }, 1);\r\n }\r\n })\r\n .catch(function(error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while deleting the image. Please try again later.'\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg =\r\n gettextCatalog.getString('An error occurred while deleting the image: ') +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n });\r\n }\r\n });\r\n };\r\n\r\n function getUsername(imageObj) {\r\n let username = '';\r\n if (imageObj.updatedBy) {\r\n username = _.find(users, function(e) {\r\n return e.id === imageObj.updatedBy.data.id;\r\n });\r\n }\r\n\r\n if (username) {\r\n return username.username;\r\n } else {\r\n return username;\r\n }\r\n }\r\n\r\n function checkProfileImage() {\r\n let currIndex = $scope.gallery.getCurrentIndex();\r\n\r\n if ($scope.images[currIndex].id === $scope.profilePictureId) {\r\n $scope.isProfileImage = false;\r\n } else $scope.isProfileImage = true;\r\n\r\n $timeout(function() {\r\n $scope.$apply();\r\n }, 1);\r\n }\r\n\r\n $scope.setAsDefault = function() {\r\n $scope.isLoading = true;\r\n $scope.errorFlag = false;\r\n let imageObj = items[$scope.gallery.getCurrentIndex()];\r\n\r\n EquipmentService.patchEquipmentProfileImage(equipId, imageObj)\r\n .then(function() {\r\n $scope.isLoading = false;\r\n\r\n profilePictureId = imageObj.id;\r\n $scope.profilePictureId = imageObj.id;\r\n\r\n checkProfileImage();\r\n\r\n $rootScope.$broadcast('equipmentProfileImage', imageObj);\r\n })\r\n .catch(function(error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while setting the default image. Please try again later.'\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg =\r\n gettextCatalog.getString('An error occurred while setting the default image: ') +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorText = errorMsg;\r\n $scope.errorFlag = true;\r\n $scope.isLoading = false;\r\n });\r\n };\r\n}\r\n","export default function PollButtonDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-polling.html'),\r\n scope: {},\r\n bindToController: {},\r\n controllerAs: \"vm\",\r\n controller: PollController\r\n };\r\n\r\n function PollController(usersService, EquipmentService, $stateParams, CommandsRepo) {\r\n 'ngInject';\r\n var vm = this;\r\n\r\n // Public Variables\r\n vm.canPoll = false;\r\n vm.pollEquipmentData = pollEquipmentData;\r\n vm.buttonTitle = \"Send Poll command to get recent data\";\r\n\r\n // Init\r\n init();\r\n\r\n function init() {\r\n checkCanPoll();\r\n }\r\n\r\n // Public Functions\r\n function pollEquipmentData() {\r\n CommandsRepo.executeCommand($stateParams.equipmentId, \"poll\");\r\n }\r\n\r\n // Private Functions\r\n function checkCanPoll() {\r\n vm.canPoll = false;\r\n EquipmentService\r\n .getEquipment($stateParams.equipmentId, null, [\"deviceCommands\"])\r\n .then(function (response) {\r\n\r\n // Check for commands first\r\n if (!response.data.data.relationships.deviceCommands) {\r\n return;\r\n }\r\n\r\n // Check requirements.\r\n if (!usersService.hasRequiredFeatures(['commands.query']) || !_.find(response.data.data.relationships.deviceCommands.data, {\r\n id: \"poll\"\r\n })) {\r\n return;\r\n }\r\n vm.canPoll = true;\r\n })\r\n .catch(function () {\r\n vm.canPoll = false;\r\n });\r\n }\r\n }\r\n}","export default function EquipmentFiltersDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-filters.component.html'),\r\n scope: {\r\n filters: '=',\r\n assetPicker: '='\r\n },\r\n controller: EquipmentFiltersController\r\n };\r\n\r\n function EquipmentFiltersController($rootScope, $scope, securityGroupsService, gettext) {\r\n 'ngInject';\r\n let currentUser = $rootScope.currentUser;\r\n $scope.securityGroups = [];\r\n $scope.showGroups = false;\r\n\r\n function getSecurityGroups() {\r\n if (currentUser.account.securityMode === 'Open') {\r\n $scope.securityGroups = [];\r\n return;\r\n }\r\n if (currentUser.securityMode !== 'Open') {\r\n $scope.securityGroups = currentUser.groups.data;\r\n if ($scope.securityGroups.length > 1) {\r\n $scope.showGroups = true;\r\n }\r\n } else {\r\n securityGroupsService.getAllSecurityGroups().then(\r\n function(response) {\r\n $scope.securityGroups = response.data.data;\r\n if ($scope.securityGroups.length > 0) {\r\n $scope.showGroups = true;\r\n }\r\n },\r\n function(error) {\r\n $scope.securityGroups = [];\r\n }\r\n );\r\n }\r\n }\r\n\r\n getSecurityGroups();\r\n\r\n $scope.maintenanceOptions = [];\r\n $scope.maintenanceOptions.push({\r\n name: gettext('Due'),\r\n id: 'due',\r\n icon: 'fa fa-wrench color-high-priority'\r\n });\r\n\r\n $scope.maintenanceOptions.push({\r\n name: gettext('Upcoming'),\r\n id: 'upcoming',\r\n icon: 'fa fa-wrench color-low-priority'\r\n });\r\n\r\n $scope.alertPriorities = [];\r\n $scope.alertPriorities.push({\r\n name: gettext('Low'),\r\n id: 'low',\r\n icon: 'fa fa-exclamation-circle'\r\n });\r\n\r\n $scope.alertPriorities.push({\r\n name: gettext('Medium'),\r\n id: 'medium',\r\n icon: 'fa fa-exclamation-circle color-medium-priority'\r\n });\r\n\r\n $scope.alertPriorities.push({\r\n name: gettext('High'),\r\n id: 'high',\r\n icon: 'fa fa-exclamation-circle color-high-priority'\r\n });\r\n\r\n // scope function to clear filters\r\n $scope.clearFilters = function() {\r\n if ($scope.filters) {\r\n $scope.filters.maintenance = {};\r\n $scope.filters.priorities = {};\r\n if ($scope.filters.securityGroups) {\r\n $scope.filters.securityGroups = {};\r\n }\r\n }\r\n };\r\n\r\n // retrun true if filter set up show / hide filters\r\n $scope.showclearFilters = function() {\r\n if ($scope.filters) {\r\n if ($scope.filters.maintenance && $scope.filters.maintenance.length > 0) return true;\r\n if ($scope.filters.priorities && $scope.filters.priorities.length > 0) return true;\r\n if ($scope.filters.securityGroups && $scope.filters.securityGroups.length > 0) return true;\r\n }\r\n return false;\r\n };\r\n }\r\n}\r\n","export default function EquipmentFullFiltersDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./equipment-full-filters.component.html'),\r\n scope: {\r\n filters: '='\r\n },\r\n controller: EquipmentFullFiltersController\r\n };\r\n\r\n\r\n function EquipmentFullFiltersController($rootScope, $scope, securityGroupsService) {\r\n 'ngInject';\r\n $scope.applyFilter = {};\r\n $scope.applyFilter.priorities = [];\r\n $scope.applyFilter.maintenance = [];\r\n $scope.applyFilter.securityGroups = [];\r\n $scope.securityGroups = [];\r\n $scope.priorities = {};\r\n $scope.maintenance = {};\r\n $scope.showGroups = false;\r\n var currentUser = $rootScope.currentUser;\r\n\r\n function getSecurityGroups() {\r\n if (currentUser.account.securityMode === 'Open') {\r\n $scope.securityGroups = [];\r\n return;\r\n }\r\n if (currentUser.securityMode !== 'Open') {\r\n $scope.securityGroups = currentUser.groups.data;\r\n if ($scope.securityGroups.length > 1) {\r\n $scope.showGroups = true;\r\n }\r\n } else {\r\n securityGroupsService.getAllSecurityGroups().then(function (response) {\r\n $scope.securityGroups = response.data.data;\r\n if ($scope.securityGroups.length > 0) {\r\n $scope.showGroups = true;\r\n }\r\n }, function (error) {\r\n $scope.securityGroups = [];\r\n });\r\n }\r\n }\r\n\r\n getSecurityGroups();\r\n\r\n $scope.applyButtonPressed = function () {\r\n\r\n $scope.applyFilter = {};\r\n $scope.applyFilter.priorities = [];\r\n $scope.applyFilter.maintenance = [];\r\n $scope.applyFilter.securityGroups = [];\r\n\r\n for (var i = 0; i < $scope.securityGroups.length; i++) {\r\n if ($scope.securityGroups[i]._selected) {\r\n $scope.applyFilter.securityGroups.push($scope.securityGroups[i].id);\r\n }\r\n }\r\n\r\n if ($scope.priorities.low) {\r\n $scope.applyFilter.priorities.push(\"low\");\r\n }\r\n\r\n if ($scope.priorities.medium) {\r\n $scope.applyFilter.priorities.push(\"medium\");\r\n }\r\n\r\n if ($scope.priorities.high) {\r\n $scope.applyFilter.priorities.push(\"high\");\r\n }\r\n\r\n if ($scope.maintenance.overdue) {\r\n $scope.applyFilter.maintenance.push(\"due\");\r\n }\r\n\r\n if ($scope.maintenance.upcoming) {\r\n $scope.applyFilter.maintenance.push(\"upcoming\");\r\n }\r\n\r\n $scope.filters = $scope.applyFilter;\r\n\r\n };\r\n\r\n $scope.clearButtonPressed = function () {\r\n for (var i = 0; i < $scope.securityGroups.length; i++) {\r\n $scope.securityGroups[i]._selected = false;\r\n }\r\n\r\n $scope.priorities.low = false;\r\n $scope.priorities.medium = false;\r\n $scope.priorities.high = false;\r\n $scope.maintenance.overdue = false;\r\n $scope.maintenance.upcoming = false;\r\n };\r\n }\r\n}","import fileDownload from 'js-file-download';\r\nimport moment from 'moment';\r\n\r\nclass FaultCsvController {\r\n constructor(EquipmentService, usersService) {\r\n 'ngInject';\r\n this.equipmentService = EquipmentService;\r\n this.usersService = usersService;\r\n }\r\n\r\n getSeriesData(seconds = 60) {\r\n const timeRange = this.getTimeRange(seconds);\r\n this.equipmentService.getTimeseriesCsvData(this.id, timeRange).then((response) => {\r\n fileDownload(response.data, `${this.id}_TimeSlice.csv`);\r\n });\r\n\r\n this.csvDownloaded({ alert: this.alert });\r\n }\r\n\r\n getTimeRange(seconds) {\r\n const startRange = moment(this.timestamp).subtract(seconds, 'seconds').toISOString();\r\n const endRange = moment(this.timestamp).add(seconds, 'seconds').toISOString();\r\n return startRange + '/' + endRange;\r\n }\r\n}\r\n\r\nexport const FaultCsvComponent = {\r\n template: require('./fault-csv.template.html'),\r\n controller: FaultCsvController,\r\n controllerAs: 'vm',\r\n bindings: {\r\n id: '<',\r\n timestamp: '<',\r\n csvDownloaded: '&',\r\n alert: '<',\r\n },\r\n};\r\n","export default function EquipmentController(\r\n\t$scope,\r\n\t$window,\r\n\t$rootScope,\r\n\t$state,\r\n\t$stateParams,\r\n\t$location,\r\n\t$filter,\r\n\tequipmentRepository,\r\n\tmobileService\r\n) {\r\n 'ngInject';\r\n\r\n\t//Timer Settings\r\n\t$scope.timerColour = '#3A6180';\r\n\t$scope.timerBgColour = '#DDDDDD';\r\n\t$scope.totalTime = 60; //in seconds\r\n\t$scope.timeElapsed = 0; //in milliseconds\r\n\t$scope.progress = 0.0;\r\n\t$scope.lastUpdated = new Date();\r\n\t$scope.timerPause = false;\r\n\t// holed the last equipments search (url has search param) on the map\r\n\t$scope.previousSearchURL = null;\r\n\t$scope.equipments = [];\r\n\t$scope.filters = {};\r\n\r\n\t$scope.state = $state;\r\n\r\n\t$scope.currentBounds = null; //THe last bounds of the equipment application so that the map can reset back to these bounds on going back from equipment detail\r\n\r\n\t$scope.isAssetSearchVisible = function() {\r\n\t\treturn $state.current.name === 'equipment.map' || !mobileService.isMobile();\r\n\t};\r\n\r\n\t// in case user refresh the browser the equipments object will destroy\r\n\t//so will use this method to get the equipment again based on search param in the sessionStorage\r\n\t$scope.getLostEquipmentBySearchParam = function() {\r\n\t\tvar searchParam = $scope.parseurl($window.sessionStorage.getItem('mapLastSearchURL'));\r\n\t\tif (searchParam) {\r\n\t\t\tif (searchParam.nlat && searchParam.slat && searchParam.nlng && searchParam.slng) {\r\n\t\t\t\tif (searchParam.search) {\r\n\t\t\t\t\tequipmentRepository\r\n\t\t\t\t\t\t.getEquipmentSearch(searchParam.search + '*' /*just append this so that it will search on partial words*/, {\r\n\t\t\t\t\t\t\tsince: 0,\r\n\t\t\t\t\t\t\tlimit: 100\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.then(\r\n\t\t\t\t\t\t\tfunction(response) {\r\n\t\t\t\t\t\t\t\t$scope.equipments = $filter('withoutNull')(response.data.hits);\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tfunction(reason) {\r\n\t\t\t\t\t\t\t\tconsole.log('Failed to get equipment from i3: ' + reason.status);\r\n\r\n\t\t\t\t\t\t\t\t///toastr.error('Failed to get equipment from i3: ' + reason.status);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar nw = {\r\n\t\t\t\t\t\tlat: searchParam.nlat,\r\n\t\t\t\t\t\tlng: searchParam.slng\r\n\t\t\t\t\t};\r\n\t\t\t\t\tvar se = {\r\n\t\t\t\t\t\tlat: searchParam.slat,\r\n\t\t\t\t\t\tlng: searchParam.nlng\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// we may need to pass q as search fillter\r\n\t\t\t\t\tequipmentRepository.getEquipmentWithinBounds(nw, se).then(\r\n\t\t\t\t\t\tfunction(response) {\r\n\t\t\t\t\t\t\t$scope.equipments = $filter('withoutNull')(response.data);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tfunction(reason) {\r\n\t\t\t\t\t\t\tconsole.error('Failed to get equipment from i3: ' + reason.status);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}; //end getLostEquipmentBySearchParam\r\n\r\n\t//take url as string then parse it to get map search param as a json object\r\n\t$scope.parseurl = function(url) {\r\n\t\tif (url) {\r\n\t\t\tvar index = url.indexOf('?');\r\n\t\t\tvar pairs = url.slice(index + 1).split('&');\r\n\t\t\tvar result = {};\r\n\t\t\tpairs.forEach(function(pair) {\r\n\t\t\t\tpair = pair.split('=');\r\n\t\t\t\tresult[pair[0]] = pair[1];\r\n\t\t\t});\r\n\t\t\treturn JSON.parse(JSON.stringify(result));\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\r\n\t//Timer functions\r\n\t$scope.evalFunc = function() {\r\n\t\treturn $scope.progress;\r\n\t}; //used to evaluate progress\r\n\r\n\t$scope.forceMapRefresh = function() {\r\n\t\t$rootScope.$broadcast('forceMapRefresh');\r\n\t};\r\n}\r\n","import { cloneDeep } from 'lodash-es';\r\nimport moment from 'moment';\r\n\r\nimport * as SearchActions from '../state/search/search.action';\r\n\r\nimport template from './equipment.detail.edit.controller.html';\r\n\r\n// Constants\r\nconst EVENT_TRACKING_NAME = 'assetEdit';\r\nconst EVENT_TRACKING_ACTIONS = {\r\n addAttribute: 'addAttribute',\r\n removeAttribute: 'removeAttribute',\r\n cancelClicked: 'cancelClicked',\r\n saveClicked: 'saveClicked',\r\n};\r\n\r\nclass EquipmentDetailEditController {\r\n constructor(\r\n $ngRedux,\r\n $scope,\r\n $state,\r\n $filter,\r\n $stateParams,\r\n $timeout,\r\n EquipmentService,\r\n gettextCatalog,\r\n ) {\r\n 'ngInject';\r\n\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.$filter = $filter;\r\n this.$stateParams = $stateParams;\r\n this.timeout = $timeout;\r\n this.EquipmentService = EquipmentService;\r\n this.gettextCatalog = gettextCatalog;\r\n this.store = $ngRedux;\r\n\r\n this.tags = [];\r\n this.isLoading = true;\r\n this.selectedTags = [];\r\n this.parsedAttrs = {};\r\n this.parsedTags = [];\r\n this.values = {};\r\n this.focus = {};\r\n this.opened = {};\r\n this.datetimedate = {};\r\n this.datetimeBounds = {};\r\n this.protectedAttrs = {};\r\n this.format = 'yyyy/MM/dd';\r\n this.dateFormatMoment = 'YYYY/MM/DD';\r\n\r\n this.mapStateToThis = this.mapStateToThis.bind(this);\r\n this.initDataNeeded = true;\r\n }\r\n\r\n $onInit() {\r\n this.unsubscribe = this.store.connect(this.mapStateToThis, SearchActions)(this);\r\n this.refreshEdit();\r\n }\r\n\r\n mapStateToThis(state) {\r\n const {\r\n user: { dateFormat = 'yyyy/MM/dd' },\r\n attributes,\r\n } = state;\r\n\r\n const { secured = {}, isSecuredLoaded } = attributes;\r\n // when secured.readonly loaded after init\r\n // call refreshEdit() for one time only\r\n if (isSecuredLoaded && this.initDataNeeded) {\r\n this.refreshEdit();\r\n }\r\n\r\n return {\r\n format: dateFormat.toLowerCase().replace(/m/g, 'M'),\r\n dateFormatMoment: dateFormat,\r\n dateTimeformat: `${dateFormat} h:mm:ss a`,\r\n readonlyAttributes: secured.readonly, // normalized to lowercase keys\r\n readonlyAttributesLoaded: isSecuredLoaded,\r\n };\r\n }\r\n\r\n $onDestroy() {\r\n this.unsubscribe();\r\n }\r\n\r\n addToDataLayer(data) {\r\n window.dataLayer.push({\r\n event: EVENT_TRACKING_NAME,\r\n data: { ...data },\r\n });\r\n }\r\n\r\n refreshEdit() {\r\n this.isLoading = true;\r\n\r\n // if readonlyAttributesLoaded has not loaded will return now, another call will trigger by mapStateToThis\r\n if (!this.readonlyAttributesLoaded) return;\r\n\r\n this.initDataNeeded = false;\r\n this.EquipmentService.getEquipment(this.$stateParams.equipmentId)\r\n .then(\r\n (response) => {\r\n // Qucik fix...\r\n this.equipmentData = response.data.data.attributes;\r\n this.equipmentData.id = response.data.data.id;\r\n this.equipmentData.data = {};\r\n this.equipmentData.data.attributes = {\r\n name: this.equipmentData.name,\r\n };\r\n this.$scope.$emit('$viewContentLoaded'); // breadcrumb fix;\r\n return this.EquipmentService.getAllTags().then(null, (error) => {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving attribute information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.onLoadErrorFlag = true;\r\n this.onLoadErrorText = errorMsg;\r\n this.isLoading = false;\r\n });\r\n },\r\n function (error) {\r\n let errorMsg = this.gettextCatalog.getString(\r\n 'An error occurred while retrieving asset information',\r\n );\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.onLoadErrorFlag = true;\r\n this.onLoadErrorText = errorMsg;\r\n this.isLoading = false;\r\n },\r\n )\r\n .then((response) => {\r\n this.tags = response.data.data;\r\n for (let i = 0; i < this.tags.length; i++) {\r\n if (this.tags[i].dataType === 'Datetime') {\r\n if (this.tags[i].range.min) {\r\n this.tags[i].range.min = moment(this.tags[i].range.min);\r\n }\r\n if (this.tags[i].range.max) {\r\n this.tags[i].range.max = moment(this.tags[i].range.max);\r\n }\r\n }\r\n }\r\n\r\n if (this.equipmentData) {\r\n this.parseTags();\r\n }\r\n\r\n this.availableTags = cloneDeep(this.tags);\r\n this.selectedTags = [];\r\n this.values = {};\r\n\r\n for (let i = 0; i < this.parsedTags.length; i++) {\r\n const parsedTag = this.parsedTags[i];\r\n const parsedTagIndex = parsedTag.index;\r\n const parsedTagValue = parsedTag.value;\r\n const parsedTagId = parsedTag.id;\r\n const availableTag = this.availableTags[parsedTagIndex];\r\n // appandtag set this.values.\r\n this.appendTag(availableTag, false);\r\n\r\n const parsedTagValueRecord = this.values[parsedTagId];\r\n const { dataType } = availableTag;\r\n\r\n switch (dataType) {\r\n case 'Integer': {\r\n parsedTagValueRecord.value = parseInt(parsedTagValue);\r\n break;\r\n }\r\n\r\n case 'Decimal': {\r\n parsedTagValueRecord.value = parseFloat(parsedTagValue);\r\n break;\r\n }\r\n\r\n case 'Text': {\r\n parsedTagValueRecord.value = parsedTagValue;\r\n break;\r\n }\r\n\r\n case 'Date': {\r\n parsedTagValueRecord.value = moment(parsedTagValue).toDate();\r\n break;\r\n }\r\n\r\n case 'Datetime': {\r\n const parsedDate = moment(parsedTagValue).toDate();\r\n parsedTagValueRecord.value = parsedDate;\r\n this.datetimedate[parsedTagId] = parsedDate;\r\n break;\r\n }\r\n\r\n default:\r\n parsedTagValueRecord.value = parsedTag.value;\r\n }\r\n // re assign handled record.\r\n this.values[parsedTagId] = parsedTagValueRecord;\r\n }\r\n\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n toTitleCase(input) {\r\n input = input || '';\r\n return input.replace(/\\w\\S*/g, function (txt) {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n }\r\n\r\n parseTags() {\r\n this.parsedTags = [];\r\n this.parsedAttrs = {};\r\n for (const key in this.equipmentData.attrs) {\r\n const normalizedKey = key != null ? key.toLowerCase() : '';\r\n if (this.readonlyAttributes.indexOf(normalizedKey) !== -1) {\r\n // readonly attributes are hidden completely from this UI\r\n this.protectedAttrs[key] = this.equipmentData.attrs[key];\r\n continue;\r\n } else if (key.startsWith('onei3:')) {\r\n this.protectedAttrs[key] = this.equipmentData.attrs[key];\r\n continue;\r\n }\r\n\r\n let found = false;\r\n for (let j = 0; j < this.tags.length; j++) {\r\n const tag = this.tags[j];\r\n if (normalizedKey === tag.key.toLowerCase()) {\r\n this.parsedTags.push({\r\n key: tag.key,\r\n value:\r\n tag.dataType === 'Datetime'\r\n ? moment(this.equipmentData.attrs[key])\r\n : this.equipmentData.attrs[key],\r\n index: j,\r\n dataType: tag.dataType,\r\n id: tag.id,\r\n });\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n this.parsedAttrs[key] = this.equipmentData.attrs[key];\r\n }\r\n }\r\n }\r\n\r\n appendTag(tag, isNew) {\r\n this.selectedTags.push(tag);\r\n this.values[tag.id] = {\r\n tag: tag.id,\r\n };\r\n if (tag.dataType === 'Date' || tag.dataType === 'Datetime') {\r\n this.opened[tag.id] = false;\r\n if (tag.freeform) {\r\n this.values[tag.id].value = moment().toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment().toDate();\r\n this.datetimedate[tag.id] = moment(this.values[tag.id].value).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n } else {\r\n if (tag.range.min) {\r\n this.values[tag.id].value = moment(tag.range.min).toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment(tag.range.min).toDate();\r\n this.datetimedate[tag.id] = moment(tag.range.min).toDate();\r\n this.values[tag.id].minValue = moment(tag.range.min).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n if (tag.range.max) {\r\n this.values[tag.id].value = moment(tag.range.max).toDate();\r\n if (tag.dataType === 'Datetime') {\r\n this.values[tag.id].value = moment(tag.range.max).toDate();\r\n this.datetimedate[tag.id] = moment(tag.range.max).toDate();\r\n this.values[tag.id].maxValue = moment(tag.range.max).toDate();\r\n this.datetimeBounds[tag.id] = {};\r\n }\r\n }\r\n }\r\n }\r\n tag.selected = true;\r\n this.newTag = undefined;\r\n this.focus[tag.id] = isNew;\r\n\r\n // Prevent from triggering at the start of the container.\r\n if (!this.isLoading) {\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.addAttribute,\r\n });\r\n }\r\n }\r\n\r\n removeTag(index) {\r\n const tag = this.selectedTags[index];\r\n tag.selected = false;\r\n if (this.equipmentData.attrs[tag.key]) {\r\n delete this.equipmentData.attrs[tag.key];\r\n }\r\n delete this.values[tag.id];\r\n delete this.focus[tag.id];\r\n this.selectedTags.splice(index, 1);\r\n }\r\n\r\n removeAttr(key) {\r\n delete this.parsedAttrs[key];\r\n // GTM-UPDATE -> GTM-UPDATED\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.removeAttribute,\r\n });\r\n }\r\n\r\n filterSelected(tag) {\r\n return !tag.selected;\r\n }\r\n\r\n roundInt(val) {\r\n return val ? Math.floor(val) : val;\r\n }\r\n\r\n open(index) {\r\n this.opened[index] = true;\r\n }\r\n\r\n datetimeValidCheck(id) {\r\n const valueRecord = this.values[id];\r\n const { value } = valueRecord;\r\n const temp = moment(this.datetimedate[id].getTime()).toDate();\r\n if (value) {\r\n temp.setHours(value.getHours());\r\n temp.setMinutes(value.getMinutes());\r\n temp.setSeconds(value.getSeconds());\r\n }\r\n if (\r\n (!valueRecord.minValue || temp >= valueRecord.minValue) &&\r\n (!valueRecord.maxValue || temp <= valueRecord.maxValue)\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n updateTimeBounds(id) {\r\n this.datetimeBounds[id].min = this.returnTimeBound('min', id);\r\n this.datetimeBounds[id].max = this.returnTimeBound('max', id);\r\n }\r\n\r\n returnTimeBound(key, id) {\r\n const valueRecord = this.values[id];\r\n switch (key) {\r\n case 'max':\r\n if (!this.datetimedate[id] || !valueRecord.maxValue) {\r\n return undefined;\r\n }\r\n if (this.datetimedate[id].toDateString() === valueRecord.maxValue.toDateString()) {\r\n const tempMax = moment(valueRecord.value.getTime()).toDate();\r\n if (valueRecord.maxValue) {\r\n tempMax.setHours(valueRecord.maxValue.getHours());\r\n tempMax.setMinutes(valueRecord.maxValue.getMinutes());\r\n tempMax.setSeconds(valueRecord.maxValue.getSeconds());\r\n }\r\n return tempMax;\r\n }\r\n return undefined;\r\n\r\n case 'min':\r\n if (!this.datetimedate[id] || !valueRecord.minValue) {\r\n return undefined;\r\n }\r\n if (this.datetimedate[id].toDateString() === valueRecord.minValue.toDateString()) {\r\n const tempMin = moment(valueRecord.value.getTime()).toDate();\r\n if (valueRecord.minValue) {\r\n tempMin.setHours(valueRecord.minValue.getHours());\r\n tempMin.setMinutes(valueRecord.minValue.getMinutes());\r\n tempMin.setSeconds(valueRecord.minValue.getSeconds());\r\n }\r\n return tempMin;\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n checkAllDatetimes() {\r\n for (let i = 0; i < this.selectedTags.length; i++) {\r\n const selectedTag = this.selectedTags[i];\r\n if (selectedTag.dataType === 'Datetime' && !selectedTag.freeform) {\r\n if (!this.datetimeValidCheck(selectedTag.id)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n generateTooltip(tag) {\r\n let tip = '';\r\n switch (tag.dataType) {\r\n case 'Integer':\r\n tip = this.gettextCatalog.getString('Enter an integer ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += this.gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += this.gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += this.gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n case 'Decimal':\r\n tip = this.gettextCatalog.getString('Enter a number ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += this.gettextCatalog.getString('(minimum {{min}})', {\r\n min: tag.range.min,\r\n });\r\n } else {\r\n tip += this.gettextCatalog.getString('from {{min}} to ', {\r\n min: tag.range.min,\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += this.gettextCatalog.getString('(maximum {{max}})', {\r\n max: tag.range.max,\r\n });\r\n } else {\r\n tip += tag.range.max;\r\n }\r\n }\r\n return tip;\r\n case 'Date':\r\n tip = this.gettextCatalog.getString('Select a date ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += this.gettextCatalog.getString('({{min}} or later)', {\r\n min: moment(tag.range.min).format(this.dateFormatMoment),\r\n });\r\n } else {\r\n tip += this.gettextCatalog.getString('from {{min}} to ', {\r\n min: moment(tag.range.min).format(this.dateFormatMoment),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += this.gettextCatalog.getString('({{max}} or earlier)', {\r\n max: moment(tag.range.max).format(this.dateFormatMoment),\r\n });\r\n } else {\r\n tip += moment(tag.range.max).format(this.dateFormatMoment);\r\n }\r\n }\r\n return tip;\r\n case 'Datetime':\r\n tip = this.gettextCatalog.getString('Select a date and time ');\r\n if (tag.range.min) {\r\n if (!tag.range.max) {\r\n tip += this.gettextCatalog.getString('({{min}} or later)', {\r\n min: moment(tag.range.min).format(this.dateTimeformat),\r\n });\r\n } else {\r\n tip += this.gettextCatalog.getString('from {{min}} to ', {\r\n min: moment(tag.range.min).format(this.dateTimeformat),\r\n });\r\n }\r\n }\r\n if (tag.range.max) {\r\n if (!tag.range.min) {\r\n tip += this.gettextCatalog.getString('({{max}} or earlier)', {\r\n max: moment(tag.range.max).format(this.dateTimeformat),\r\n });\r\n } else {\r\n tip += moment(tag.range.max).format(this.dateTimeformat);\r\n }\r\n }\r\n return tip;\r\n }\r\n }\r\n\r\n cancelClicked() {\r\n const equipmentID = this.equipmentData.id;\r\n if (equipmentID) {\r\n this.$state.go('equipment.detail', {\r\n equipmentId: equipmentID,\r\n });\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.cancelClicked,\r\n });\r\n }\r\n }\r\n\r\n saveClicked() {\r\n if (this.sending || this.detailForm.$invalid || !this.checkAllDatetimes()) {\r\n return;\r\n }\r\n\r\n this.sending = true;\r\n this.errorFlag = false;\r\n this.submitTags = [];\r\n this.equipToSubmit = cloneDeep(this.equipmentData);\r\n this.equipToSubmit.attrs = {};\r\n for (const key in this.parsedAttrs) {\r\n this.equipToSubmit.attrs[key] = this.parsedAttrs[key];\r\n }\r\n for (const k in this.protectedAttrs) {\r\n this.equipToSubmit.attrs[k] = this.protectedAttrs[k];\r\n }\r\n for (let i = 0; i < this.selectedTags.length; i++) {\r\n const selectedTag = this.selectedTags[i];\r\n const valueRecord = this.values[selectedTag.id];\r\n const toAdd = {\r\n key: selectedTag.key,\r\n };\r\n switch (selectedTag.dataType) {\r\n case 'Text':\r\n case 'Hyperlink':\r\n case 'Integer':\r\n case 'Decimal':\r\n toAdd.v = valueRecord.value;\r\n break;\r\n case 'Date':\r\n toAdd.v = this.$filter('date')(valueRecord.value, 'yyyy-MM-dd');\r\n break;\r\n case 'Datetime':\r\n if (typeof valueRecord.value === 'string') {\r\n toAdd.v = valueRecord.value;\r\n } else {\r\n let temp = moment(this.datetimedate[selectedTag.id].getTime()).toDate();\r\n if (valueRecord.value) {\r\n temp.setHours(valueRecord.value.getHours());\r\n temp.setMinutes(valueRecord.value.getMinutes());\r\n temp.setSeconds(valueRecord.value.getSeconds());\r\n }\r\n temp = moment(temp).toDate();\r\n temp.setMilliseconds(0);\r\n toAdd.v = temp;\r\n }\r\n break;\r\n }\r\n this.equipToSubmit.attrs[toAdd.key] = toAdd.v;\r\n }\r\n this.EquipmentService.putEquipment(this.equipToSubmit).then(\r\n (response) => {\r\n this.selectedTags = [];\r\n this.equipmentData = response.data;\r\n this.parseTags();\r\n this.isEditing = false;\r\n this.sending = false;\r\n this.$state.go('equipment.detail', {\r\n equipmentId: this.equipmentData.id,\r\n });\r\n },\r\n (error) => {\r\n let errorMsg = this.gettextCatalog.getString('An error occurred while updating the asset');\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n } else {\r\n errorMsg += this.gettextCatalog.getString('. Please try again later.');\r\n }\r\n this.errorFlag = true;\r\n this.errorText = errorMsg;\r\n this.sending = false;\r\n },\r\n );\r\n\r\n this.addToDataLayer({\r\n action: EVENT_TRACKING_ACTIONS.saveClicked,\r\n });\r\n }\r\n\r\n refreshDetails() {\r\n this.timeout(() => {\r\n this.refresh();\r\n }, 300);\r\n }\r\n}\r\n\r\nexport const EquipmentDetailEditComponent = {\r\n template,\r\n controller: EquipmentDetailEditController,\r\n controllerAs: 'vm',\r\n bindings: {},\r\n};\r\n","export default function EquipmentRouteConfig($stateProvider, gettext) {\r\n 'ngInject';\r\n\r\n $stateProvider\r\n .state('equipment', {\r\n url: '/assets',\r\n helpModuleId: 'assets',\r\n helpState: 'assets',\r\n template: require('./equipment.main.html'),\r\n controller: 'EquipmentController',\r\n redirectTo: 'equipment.list',\r\n ncyBreadcrumb: {\r\n label: \"{{'Asset' | translate}}\",\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.list', {\r\n url: '/?q=&filters&tags&maintenance&alerts&securityGroups&{page:int}&{limit:int}',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.list',\r\n template: require('./list/list.html'),\r\n controller: 'EquipmentListController as vm',\r\n reloadOnSearch: false,\r\n ncyBreadcrumb: {\r\n label: \"{{'Assets' | translate}}\",\r\n },\r\n requiredFeatures: ['assets'],\r\n data: {\r\n flex: true,\r\n },\r\n })\r\n .state('equipment.edit', {\r\n url: '/edit',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.list',\r\n template: '',\r\n ncyBreadcrumb: {\r\n label: \"{{'Edit' | translate}}\",\r\n parent: 'equipment.list',\r\n },\r\n requiredFeatures: ['assets', 'assets.edit.bulk', 'assets.update-trial'],\r\n data: {\r\n flex: true,\r\n breadcrumb: true,\r\n },\r\n })\r\n .state('equipment.esn', {\r\n url: '/esn/:serialNumber',\r\n template: require('./esn/esn.html'),\r\n controller: 'ESNController',\r\n controllerAs: 'vm',\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail', {\r\n url: '/detail/:equipmentId',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n template: require('./asset-details-dashboard/asset-details-dashboard.component.html'),\r\n controller: 'AssetDetailsDashboardController',\r\n controllerAs: 'vm',\r\n redirectTo: 'equipment.detail.overview',\r\n params: {\r\n title: null,\r\n },\r\n data: {\r\n flex: true,\r\n breadcrumb: true,\r\n },\r\n ncyBreadcrumb: {\r\n parent: 'equipment.list',\r\n label: '{{assetName || vm.equipmentData.name}}',\r\n // here twice because of scope issues, details isn't a component and edit is\r\n // ToDo: remove first variable when details is changed to a component\r\n },\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail-edit', {\r\n url: '/detail/:equipmentId/edit',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n template: '',\r\n ncyBreadcrumb: {\r\n parent: 'equipment.detail',\r\n label: \"{{'Edit' | translate}}\",\r\n },\r\n params: {\r\n title: null,\r\n },\r\n data: {\r\n flex: true,\r\n breadcrumb: true,\r\n },\r\n requiredFeatures: ['assets', 'assets.edit'],\r\n })\r\n .state('equipment.detail.overview', {\r\n url: '/overview',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n template:\r\n '',\r\n data: {\r\n dateRange: {\r\n start: null,\r\n end: null,\r\n },\r\n asset: {\r\n id: null,\r\n displayCharts: [],\r\n },\r\n },\r\n ncyBreadcrumb: {\r\n parent: 'equipment.detail',\r\n skip: true,\r\n },\r\n reloadOnSearch: false,\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail.details', {\r\n url: '/details',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n template:\r\n '',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail.location', {\r\n url: '/location',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n template:\r\n '',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail.alerts', {\r\n template:\r\n '',\r\n helpModuleId: 'assets',\r\n helpState: 'assets.detail',\r\n url: '/alerts',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets'],\r\n })\r\n .state('equipment.detail.devicecommands', {\r\n url: '/devicecommands',\r\n template: '',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['commands'],\r\n })\r\n .state('equipment.detail.maintenance', {\r\n template:\r\n '',\r\n url: '/maintenance',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets', 'maintenance'],\r\n })\r\n .state('equipment.detail.deviceDiagnostics', {\r\n template:\r\n '',\r\n url: '/deviceDiagnostics',\r\n ncyBreadcrumb: {\r\n skip: true,\r\n },\r\n requiredFeatures: ['assets.diagnostics'],\r\n });\r\n}\r\n","export default function EquipmentSearchFactory(equipmentRepository, $q) {\r\n 'ngInject';\r\n //Creates an instance of the factory\r\n var self = {};\r\n self.limit = 15;\r\n self.searchString = \"\";\r\n self.data = {};\r\n\r\n\r\n self.refreshFilterCount = function () {\r\n if (self.data && self.data.tagFilters) {\r\n self.filterCount = Object.keys(self.data.tagFilters).length;\r\n }\r\n\r\n if (self.data && self.data.facets) {\r\n\r\n for (var key in self.data.facets) {\r\n for (var i = 0; i < self.data.facets[key].length; i++) {\r\n if (self.data.facets[key][i]._selected) {\r\n self.filterCount++;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n self.getCurrentPage = function () {\r\n return self.page;\r\n };\r\n\r\n self.clearSearch = function () {\r\n self.isFiltered = false;\r\n self.filters = {};\r\n self.searchString = \"\";\r\n self.queryString = \"\";\r\n };\r\n\r\n self.setResponseData = function (responseData) {\r\n self.responseData = responseData;\r\n };\r\n\r\n self.getQueryString = function () {\r\n\r\n var result = '*';\r\n\r\n if (self.searchString && self.searchString.length > 0) {\r\n result = self.searchString;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n self.calculatePages = function () {\r\n self.pages = [];\r\n\r\n self.numPages = Math.ceil(self.responseData.data.total / self.limit);\r\n\r\n //if the number of assets is lower then the limit, must be on the first page.\r\n if (self.responseData.data.cursor < self.limit) {\r\n self.page = 1;\r\n }\r\n //always return a page higher if not equally divisible\r\n else {\r\n self.page = Math.ceil(self.responseData.data.cursor / self.limit);\r\n }\r\n var concurrentPages = 1;\r\n\r\n var cursor = self.page - Math.ceil(concurrentPages / 2);\r\n var addedPages = 0;\r\n\r\n if (cursor < 0) {\r\n cursor = 0;\r\n }\r\n\r\n self.showingLastPage = false;\r\n self.showingFirstPage = false;\r\n\r\n while (self.pages.length < concurrentPages) {\r\n if (cursor < self.numPages) {\r\n self.pages.push(cursor + 1);\r\n cursor++;\r\n\r\n if (cursor == 1) {\r\n self.showingFirstPage = true;\r\n }\r\n\r\n if (cursor == self.numPages) {\r\n self.showingLastPage = true;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n };\r\n\r\n self.selectPage = function (page) {\r\n self.selectedPage = page;\r\n };\r\n\r\n self.sinceForPage = function (page, limit) {\r\n return (page - 1) * limit;\r\n };\r\n\r\n self.getSearchOptions = function () {\r\n var options = {};\r\n options.limit = self.limit || 500;\r\n if (self.selectedPage) {\r\n options.since = self.sinceForPage(self.selectedPage, self.limit);\r\n }\r\n\r\n return options;\r\n };\r\n\r\n self.getStateParams = function () {\r\n var stateParams = {};\r\n\r\n var params_tags = [];\r\n stateParams[\"page\"] = self.selectedPage;\r\n stateParams[\"limit\"] = self.limit;\r\n stateParams[\"q\"] = self.searchString;\r\n\r\n if (self.tagFilters) {\r\n\r\n for (var i = 0; i < self.tagFilters.length; i++) {\r\n params_tags.push(self.tagFilters[i].id);\r\n }\r\n\r\n stateParams[\"tags\"] = params_tags;\r\n }\r\n\r\n if (self.data.facets) {\r\n var facets = [];\r\n\r\n for (var key in self.data.facets) {\r\n var result = [];\r\n var prefix = \"onei3:\";\r\n for (var i = 0; i < self.data.facets[key].length; i++) {\r\n if (self.data.facets[key][i]._selected) {\r\n var tag = self.data.facets[key][i].tag;\r\n var storedTag = tag.slice(prefix.length);\r\n result.push(storedTag);\r\n }\r\n\r\n }\r\n stateParams[key] = result;\r\n }\r\n }\r\n\r\n if (self.data.tagFilters) {\r\n\r\n stateParams[\"tags\"] = JSON.stringify(self.data.tagFilters);\r\n }\r\n return stateParams;\r\n\r\n };\r\n\r\n self.onFacetsChange = function () {\r\n\r\n self.refreshSearch();\r\n };\r\n\r\n self.refreshSearch = function () {\r\n self.selectPage(1);\r\n self.refreshFilterCount();\r\n self.search();\r\n };\r\n\r\n self.search = function () {\r\n\r\n var def = $q.defer();\r\n\r\n self.loading = true;\r\n equipmentRepository.getEquipmentSearch(self.getQueryString(), self.getSearchOptions(), self.filters, null, null, self.data.facets, self.data.tagFilters)\r\n .then(function (response, status, headers) {\r\n self.ready = true;\r\n\r\n self.setResponseData(response);\r\n self.loading = false;\r\n self.calculatePages();\r\n\r\n if (self.isDirty)\r\n self.search();\r\n\r\n def.resolve(response);\r\n }, function (response) {\r\n self.isSearchLoading = false;\r\n self.isMoreLoading = false;\r\n var errorMsg = gettextCatalog.getString(\"An error occurred while retrieving asset information\");\r\n if (error.data || error.status) {\r\n if (error.data.message) {\r\n errorMsg = error.data.message + \" \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n } else {\r\n errorMsg += \": \" + (error.status.toString() + \" - \" + error.statusText.toString());\r\n }\r\n } else {\r\n errorMsg += gettextCatalog.getString(\". Please try again later.\");\r\n }\r\n self.errorFlag = true;\r\n self.errorText = errorMsg;\r\n\r\n def.reject(response);\r\n }).finally(function () {\r\n\r\n self.loading = false;\r\n\r\n self.loading = false;\r\n\r\n });\r\n\r\n return def.promise;\r\n };\r\n\r\n\r\n self.loadStateParams = function ($stateParams) {\r\n\r\n if ($stateParams.page) {\r\n self.selectedPage = $stateParams.page;\r\n }\r\n\r\n self.searchString = $stateParams.q;\r\n\r\n var facetsToLoad = [{\r\n name: \"maintenance\",\r\n prefix: \"onei3:maintenance:\"\r\n },\r\n {\r\n name: \"securityGroups\",\r\n prefix: \"onei3:security:group\"\r\n },\r\n {\r\n name: \"alerts\",\r\n prefix: \"onei3:alert:\"\r\n }\r\n ];\r\n\r\n for (var k = 0; k < facetsToLoad.length; k++) {\r\n\r\n var key = facetsToLoad[k].name;\r\n\r\n var result = [];\r\n var prefix = facetsToLoad[k].prefix;\r\n if ($stateParams[key]) {\r\n\r\n var stateParams = [];\r\n\r\n if (Object.prototype.toString.call($stateParams[key]) !== '[object Array]') {\r\n\r\n stateParams.push($stateParams[key]);\r\n } else {\r\n stateParams = $stateParams[key];\r\n }\r\n\r\n if (!self.data.facets) {\r\n self.data.facets = {};\r\n }\r\n\r\n //Look through all of the state params for this key... and append it ot the thingies\r\n for (var i = 0; i < stateParams.length; i++) {\r\n\r\n var stateParam = stateParams[i];\r\n\r\n if (!self.data.facets[key]) {\r\n self.data.facets[key] = [];\r\n }\r\n\r\n self.data.facets[key].push({\r\n tag: \"onei3:\" + stateParams[i],\r\n _selected: true\r\n });\r\n }\r\n }\r\n }\r\n\r\n if ($stateParams) {\r\n if ($stateParams[\"tags\"]) {\r\n self.data.tagFilters = JSON.parse($stateParams[\"tags\"]);\r\n }\r\n }\r\n\r\n self.refreshFilterCount();\r\n };\r\n\r\n return self;\r\n}","export default function SaveFiltersConfirmModalController(\r\n\t$scope,\r\n\t$rootScope,\r\n\t$uibModalInstance,\r\n\tsavedFilter,\r\n\tgettextCatalog,\r\n\tsavedFilterService\r\n) {\r\n\t'ngInject';\r\n\r\n\t$scope.updating = false;\r\n\t$scope.errorFlag = false;\r\n\t$scope.errorText = '';\r\n\t$scope.savedFiltersModels = {};\r\n\r\n\t$scope.updateExistingFilter = function() {\r\n\t\t$scope.updating = true;\r\n\t\tsavedFilterService\r\n\t\t\t.patchSavedFilter(savedFilter.id, savedFilter)\r\n\t\t\t.then(function() {\r\n\t\t\t\treturn savedFilterService.getAllSavedFilters($rootScope.currentUser.id);\r\n\t\t\t})\r\n\t\t\t.then(function(response) {\r\n\t\t\t\tif (!response) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$scope.savedFiltersModels = response.data.reverse();\r\n\t\t\t\t$scope.confirm();\r\n\t\t\t})\r\n\t\t\t.catch(function(error) {\r\n\t\t\t\tvar errorMsg = gettextCatalog.getString(\r\n\t\t\t\t\t'An error occurred while retrieving Saved Filter information. Please try again later.'\r\n\t\t\t\t);\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tif (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n\t\t\t\t\t\terrorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n\t\t\t\t\t} else if (!!error.status && !!error.statusText) {\r\n\t\t\t\t\t\terrorMsg =\r\n\t\t\t\t\t\t\tgettextCatalog.getString('An error occurred while retrieving Saved Filter information:') +\r\n\t\t\t\t\t\t\t(error.status.toString() + ' - ' + error.statusText.toString());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$scope.errorFlag = true;\r\n\t\t\t\t$scope.errorText = errorMsg;\r\n\t\t\t})\r\n\t\t\t.finally(function() {\r\n\t\t\t\t$scope.updating = false;\r\n\t\t\t});\r\n\t};\r\n\r\n\t$scope.confirm = function() {\r\n\t\t$uibModalInstance.close($scope.savedFiltersModels);\r\n\t};\r\n\r\n\t$scope.cancel = function() {\r\n\t\t$uibModalInstance.dismiss('cancel');\r\n\t};\r\n\r\n\t$scope.$on('$locationChangeStart', function(event) {\r\n\t\tevent.preventDefault();\r\n\t});\r\n}\r\n","export default function SaveFiltersModalController(\r\n $scope,\r\n usersService,\r\n $timeout,\r\n $filter,\r\n $uibModal,\r\n $uibModalInstance,\r\n $state,\r\n gettextCatalog,\r\n filterModels,\r\n selectedTags,\r\n tagFilters,\r\n savedFilterService,\r\n) {\r\n 'ngInject';\r\n\r\n const vm = this;\r\n\r\n // private variable\r\n const savedFiltersKeys = {\r\n lastCommKey: 'lastCommunicated',\r\n lastSeenKey: 'lastSeen',\r\n };\r\n\r\n const userId = usersService.currentUser().id;\r\n\r\n // Build payload for adding/updating filter\r\n const buildPayload = (savedFilter = null) => {\r\n // Reset the savedFilters model before creating\r\n if (savedFilter === null) {\r\n vm.savedFilters = newSavedFilter();\r\n // Build savedFilters Model\r\n vm.savedFilters.name = $scope.filters.name;\r\n vm.savedFilters.description = $scope.filters.description;\r\n vm.savedFilters.userId = userId; // userId is coming from userService.currentUser.id\r\n } else {\r\n vm.savedFilters = {\r\n id: savedFilter.id,\r\n securityGroupIds: [],\r\n alertStates: [],\r\n maintenanceStates: [],\r\n attrValueList: {},\r\n filtersCollection: {},\r\n queryString: '',\r\n };\r\n }\r\n\r\n vm.savedFilters.queryString = filterModels.queryString;\r\n\r\n if (filterModels.securityGroups && filterModels.securityGroups.length > 0) {\r\n _.forEach(filterModels.securityGroups, function (fs) {\r\n vm.savedFilters.securityGroupIds.push(fs.tag);\r\n });\r\n }\r\n if (filterModels.alerts && filterModels.alerts.length > 0) {\r\n _.forEach(filterModels.alerts, function (fa) {\r\n vm.savedFilters.alertStates.push(fa.tag);\r\n });\r\n }\r\n if (filterModels.maintenance && filterModels.maintenance.length > 0) {\r\n _.forEach(filterModels.maintenance, function (fm) {\r\n vm.savedFilters.maintenanceStates.push(fm.tag);\r\n });\r\n }\r\n\r\n if (filterModels.lastCommunicated && filterModels.lastCommunicated.length > 0) {\r\n vm.savedFilters.filtersCollection[savedFiltersKeys.lastCommKey] =\r\n filterModels.lastCommunicated[0];\r\n }\r\n\r\n if (filterModels.lastSeen && filterModels.lastSeen.length > 0) {\r\n vm.savedFilters.filtersCollection[savedFiltersKeys.lastSeenKey] = filterModels.lastSeen[0];\r\n }\r\n\r\n if (selectedTags && selectedTags.length > 0) {\r\n for (var i = 0; i < selectedTags.length; i++) {\r\n _.forEach($scope.tagFilters, function (tf) {\r\n if (tf[selectedTags[i].key]) {\r\n const Values = angular.copy(tf[selectedTags[i].key]);\r\n if (selectedTags[i].dataType === 'Datetime') {\r\n if (Values.min) {\r\n const tempMin = Values.min.replace(/\\\\/g, '').toUpperCase();\r\n Values.min = new Date(tempMin);\r\n }\r\n if (Values.max) {\r\n const tempMax = Values.max.replace(/\\\\/g, '').toUpperCase();\r\n Values.max = new Date(tempMax);\r\n }\r\n }\r\n vm.savedFilters.attrValueList[selectedTags[i].id] = Values;\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.savedFiltersModels = []; // full list of saved search filters\r\n $scope.savedFiltersModelByPage = [];\r\n $scope.selectedSavedFilterId = '';\r\n $scope.filteredSavedFilters = [];\r\n $scope.selectedFilters = {};\r\n $scope.search = {\r\n text: '',\r\n };\r\n $scope.isPaging = false;\r\n $scope.loading = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.tagFilters = [];\r\n $scope.tagFilters.push(tagFilters);\r\n $scope.filters = {\r\n name: '',\r\n description: '',\r\n };\r\n\r\n vm.savedFilters = newSavedFilter();\r\n\r\n // Pagination\r\n $scope.current = {\r\n savedFiltersPage: 1,\r\n };\r\n $scope.itemsPerPage = 3;\r\n $scope.maxSize = 1;\r\n\r\n $scope.showPaging = function () {\r\n $scope.isPaging = true;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n $scope.hidePaging = function () {\r\n $scope.isPaging = false;\r\n $scope.errorFlag = false;\r\n };\r\n\r\n // Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n // Sort filteredSavedFilters\r\n $scope.orderBy = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n };\r\n\r\n // savedFilters per page\r\n $scope.displaySavedFiltersByPage = function () {\r\n $scope.totalItems = $scope.filteredSavedFilters.length;\r\n const begin = ($scope.current.savedFiltersPage - 1) * $scope.itemsPerPage;\r\n const end = begin + $scope.itemsPerPage;\r\n $scope.savedFiltersModelByPage = $scope.filteredSavedFilters.slice(begin, end);\r\n };\r\n\r\n // applyFilter searchs on savedFiltersModels[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredSavedFilters = $filter('filter')($scope.savedFiltersModels, $scope.search.text);\r\n $scope.displaySavedFiltersByPage();\r\n };\r\n\r\n // on selected page changed\r\n $scope.pageChanged = function () {\r\n $scope.displaySavedFiltersByPage();\r\n };\r\n\r\n // called after change happend to savedFiltersModels to update the table\r\n $scope.updateFiltersList = function () {\r\n $scope.filteredSavedFilters = $scope.savedFiltersModels.slice();\r\n $scope.displaySavedFiltersByPage();\r\n };\r\n // clear the conflict message when user changes the name field\r\n $scope.$watch('savedFiltersName', function (newVal, oldVal) {\r\n // compare\r\n if (newVal !== oldVal) {\r\n $scope.errorFlag = false;\r\n }\r\n });\r\n\r\n // watch search then apply it\r\n $scope.$watch('search.text', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.applyFilter();\r\n }\r\n });\r\n\r\n // watch savedFiltersModels then create model with remove flags\r\n $scope.$watch('savedFiltersModels', function () {\r\n $scope.updateFiltersList();\r\n });\r\n\r\n // saved filter model\r\n function newSavedFilter() {\r\n const model = {\r\n name: '',\r\n description: '',\r\n userId: '',\r\n securityGroupIds: [],\r\n alertStates: [],\r\n maintenanceStates: [],\r\n attrValueList: {},\r\n filtersCollection: {},\r\n queryString: '',\r\n };\r\n return model;\r\n }\r\n\r\n // Saved Search Filters\r\n $scope.getSavedFilters = function () {\r\n $scope.loading = true;\r\n savedFilterService\r\n .getAllSavedFilters(userId)\r\n .then(function (response) {\r\n $scope.savedFiltersModels = response.data.reverse();\r\n $scope.loading = false;\r\n })\r\n .catch(function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving Saved Filter information. Please try again later.',\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg = `${gettextCatalog.getString(\r\n 'An error occurred while retrieving Saved Filter information: ',\r\n )}${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }; // getSavedFilters\r\n\r\n $scope.getSavedFilters();\r\n\r\n // Validate the form on submission then run the API call\r\n $scope.isFormValid = function (saveFiltersForm) {\r\n saveFiltersForm.$setSubmitted();\r\n if (saveFiltersForm.$invalid) {\r\n $scope.loading = false;\r\n } else {\r\n $scope.save();\r\n }\r\n };\r\n\r\n $scope.createSavedFilter = function () {\r\n buildPayload();\r\n\r\n $scope.submitSavedFilters();\r\n };\r\n\r\n $scope.patchSavedFilters = function (savedFilter) {\r\n buildPayload(savedFilter);\r\n\r\n $scope.saveAsExistingFilter(vm.savedFilters);\r\n };\r\n\r\n function NameExists() {\r\n return (\r\n $scope.savedFiltersModels.filter((filter) => filter.name === $scope.filters.name).length !== 0\r\n );\r\n }\r\n\r\n $scope.submitSavedFilters = function () {\r\n const nameExistError = gettextCatalog.getString(\r\n 'The name already exists. Please rename the Saved Filter.',\r\n );\r\n\r\n if (NameExists()) {\r\n $scope.errorFlag = true;\r\n $scope.errorText = nameExistError;\r\n return;\r\n }\r\n\r\n $scope.loading = true;\r\n $scope.error = null;\r\n const savedFilter = vm.savedFilters;\r\n if (savedFilter) {\r\n savedFilterService\r\n .postSaveFilter(savedFilter)\r\n .then(function () {\r\n return $timeout(function () {\r\n $scope.close();\r\n }, 3000);\r\n })\r\n .catch(function (error) {\r\n if (error.status === 409) {\r\n $scope.errorFlag = true;\r\n $scope.errorText = nameExistError;\r\n } else {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while saving Saved Filter information. Please try again later.',\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg = `${\r\n error.data.message\r\n } ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg = `${gettextCatalog.getString(\r\n 'An error occurred while saving Saved Filter information: ',\r\n )}${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n }\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }\r\n };\r\n\r\n $scope.saveAsExistingFilter = function (savedFilter) {\r\n if (savedFilter) {\r\n // $scope.savedFiltersModels = [];\r\n const modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./save-filters-confirm-modal.html'),\r\n controller: 'SaveFiltersConfirmModalController',\r\n resolve: {\r\n savedFilter() {\r\n return savedFilter;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n\r\n // modal dialog result\r\n modalInstance.result.then(\r\n function (savedFiltersModels) {\r\n $scope.savedFiltersModels = savedFiltersModels;\r\n },\r\n function () {},\r\n );\r\n } else {\r\n $uibModalInstance.dismiss();\r\n }\r\n };\r\n\r\n $scope.save = function () {\r\n $scope.createSavedFilter();\r\n };\r\n\r\n $scope.close = function () {\r\n $uibModalInstance.close(vm.savedFilters);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event) {\r\n $scope.cancel();\r\n event.preventDefault();\r\n });\r\n}\r\n","export default function SavedFiltersDeleteModalController(\r\n\t$scope,\r\n\t$rootScope,\r\n\t$uibModalInstance,\r\n\tgettextCatalog,\r\n\tsavedFilterId,\r\n\tsavedFilterService\r\n) {\r\n 'ngInject';\r\n\r\n\t$scope.savedFilterId = savedFilterId;\r\n\tvar userId = $rootScope.currentUser.id;\r\n\r\n\t$scope.loading = false; //change back to true when we have service working\r\n\t$scope.errorFlag = false;\r\n\t$scope.errorText = '';\r\n\t$scope.deleting = false;\r\n\r\n\t$scope.deleteFilter = function() {\r\n\t\t$scope.deleting = true;\r\n\t\tsavedFilterService\r\n\t\t\t.deleteSavedFilter($scope.savedFilterId)\r\n\t\t\t.then(function() {\r\n\t\t\t\t$scope.deleting = false;\r\n\t\t\t\treturn savedFilterService.getAllSavedFilters(userId);\r\n\t\t\t})\r\n\t\t\t.then(function(response) {\r\n\t\t\t\t$scope.loading = true;\r\n\r\n\t\t\t\tif (!response) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$scope.savedFiltersModels = response.data.reverse();\r\n\t\t\t\t$scope.deleting = false;\r\n\t\t\t\t$scope.finish();\r\n\t\t\t})\r\n\t\t\t.catch(function(error) {\r\n\t\t\t\tvar errorMsg = gettextCatalog.getString(\r\n\t\t\t\t\t'An error occurred while retrieving Saved Filter information. Please try again later.'\r\n\t\t\t\t);\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tif (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n\t\t\t\t\t\terrorMsg = error.data.message + ' ' + (error.status.toString() + ' - ' + error.statusText.toString());\r\n\t\t\t\t\t} else if (!!error.status && !!error.statusText) {\r\n\t\t\t\t\t\terrorMsg =\r\n\t\t\t\t\t\t\tgettextCatalog.getString('An error occurred while retrieving Saved Filter information: ') +\r\n\t\t\t\t\t\t\t(error.status.toString() + ' - ' + error.statusText.toString());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$scope.errorFlag = true;\r\n\t\t\t\t$scope.errorText = errorMsg;\r\n\t\t\t\t$scope.deleting = false;\r\n\t\t\t});\r\n\t};\r\n\r\n\t$scope.finish = function() {\r\n\t\t$uibModalInstance.close($scope.savedFiltersModels);\r\n\t};\r\n\r\n\t$scope.cancel = function() {\r\n\t\t$uibModalInstance.dismiss('cancel');\r\n\t};\r\n\r\n\t$scope.$on('$locationChangeStart', function(event) {\r\n\t\tevent.preventDefault();\r\n\t});\r\n}\r\n","export default function SavedFiltersModalController(\r\n $scope,\r\n $rootScope,\r\n $filter,\r\n $uibModal,\r\n $uibModalInstance,\r\n $state,\r\n gettextCatalog,\r\n savedFilterService,\r\n) {\r\n 'ngInject';\r\n\r\n const userId = $rootScope.currentUser.id;\r\n const addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\n $scope.savedFiltersModels = []; //full list of saved search filters\r\n $scope.savedFiltersModelByPage = [];\r\n $scope.filteredSavedFilters = [];\r\n $scope.selectedFilters = {};\r\n $scope.searchString = '';\r\n $scope.editing = {};\r\n $scope.editSavedFilter = {};\r\n $scope.postingChange = false;\r\n $scope.conflictErrorFlag = false;\r\n $scope.errorFlag = false;\r\n $scope.errorText = '';\r\n $scope.loading = true;\r\n $scope.disabled = {\r\n edit: false,\r\n };\r\n $scope.isInvalidData = false;\r\n\r\n //Pagination\r\n $scope.current = {\r\n savedFiltersPage: 1,\r\n };\r\n $scope.itemsPerPage = 3;\r\n $scope.maxSize = 1;\r\n\r\n //Sorting\r\n $scope.predicate = 'name';\r\n $scope.reverse = false;\r\n\r\n let orderBy = $filter('orderBy');\r\n\r\n //Editing\r\n $scope.toggleEditing = function (savedFilter) {\r\n $scope.editing[savedFilter.id] = !$scope.editing[savedFilter.id];\r\n $scope.editSavedFilter.name = savedFilter.name;\r\n $scope.editSavedFilter.description = savedFilter.description;\r\n $scope.disabled.edit = true;\r\n };\r\n\r\n $scope.cancelEdit = function (savedFilter) {\r\n $scope.editing[savedFilter.id] = !$scope.editing[savedFilter.id];\r\n $scope.editSavedFilter.name = '';\r\n $scope.editSavedFilter.description = '';\r\n $scope.disabled.edit = false;\r\n };\r\n\r\n //Sort filteredSavedFilters\r\n $scope.orderSavedFilter = function (predicate) {\r\n if (predicate === $scope.predicate) {\r\n $scope.reverse = !$scope.reverse;\r\n } else {\r\n $scope.reverse = false;\r\n }\r\n $scope.predicate = predicate;\r\n\r\n angular.forEach($scope.savedFiltersModels, function (savedFilterModel) {\r\n savedFilterModel[predicate] = savedFilterModel[predicate];\r\n });\r\n\r\n $scope.savedFiltersModels = orderBy($scope.savedFiltersModels, predicate, $scope.reverse);\r\n $scope.applyFilter();\r\n };\r\n\r\n // savedFilters per page\r\n $scope.displaySavedFiltersByPage = function () {\r\n $scope.totalItems = $scope.filteredSavedFilters.length;\r\n let begin = ($scope.current.savedFiltersPage - 1) * $scope.itemsPerPage;\r\n let end = begin + $scope.itemsPerPage;\r\n $scope.savedFiltersModelByPage = $scope.filteredSavedFilters.slice(begin, end);\r\n };\r\n\r\n let filterDebouncer = null;\r\n\r\n //applyFilter searchs on savedFiltersModels[] for anything matching the search input.\r\n $scope.applyFilter = function () {\r\n $scope.filteredSavedFilters = $filter('filter')($scope.savedFiltersModels, $scope.searchString);\r\n $scope.displaySavedFiltersByPage();\r\n\r\n if (filterDebouncer !== null) clearTimeout(filterDebouncer);\r\n\r\n filterDebouncer = setTimeout(() => {\r\n addToDataLayer({\r\n event: 'savedFiltersSearching',\r\n data: {\r\n keyword: $scope.searchString,\r\n },\r\n });\r\n }, 500);\r\n };\r\n\r\n //on selected page changed\r\n $scope.pageChanged = function () {\r\n $scope.displaySavedFiltersByPage();\r\n };\r\n\r\n // called after change happend to savedFiltersModels to update the table\r\n $scope.updateFiltersList = function () {\r\n $scope.filteredSavedFilters = $scope.savedFiltersModels.slice();\r\n $scope.displaySavedFiltersByPage();\r\n };\r\n\r\n // watch seach then apply it\r\n $scope.$watch('searchString', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.applyFilter();\r\n }\r\n });\r\n\r\n // watch savedFiltersModels then create model with remove flags\r\n $scope.$watch('savedFiltersModels', function () {\r\n $scope.updateFiltersList();\r\n });\r\n\r\n //clear the conflict message when user changes the name field\r\n $scope.$watch('editSavedFilter.name', function (newVal, oldVal) {\r\n //compare\r\n if (newVal !== oldVal) {\r\n $scope.conflictErrorFlag = false;\r\n }\r\n });\r\n\r\n //Validate the form on submission then run the API call\r\n $scope.isFormValid = function (editSavedFilterForm, savedFilter) {\r\n editSavedFilterForm.$setSubmitted();\r\n if (editSavedFilterForm.$invalid) {\r\n //$scope.loading = false;\r\n return;\r\n } else {\r\n $scope.updateFilter(savedFilter);\r\n }\r\n };\r\n\r\n //Saved Search Filters\r\n $scope.getSavedFilters = function () {\r\n $scope.loading = true;\r\n savedFilterService\r\n .getAllSavedFilters(userId)\r\n .then(function (response) {\r\n $scope.savedFiltersModels = response.data.reverse();\r\n $scope.loading = false;\r\n })\r\n .catch(function (error) {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while retrieving Saved Filter information. Please try again later.',\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg =\r\n gettextCatalog.getString(\r\n 'An error occurred while retrieving Saved Filter information: ',\r\n ) +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n })\r\n .finally(function () {\r\n $scope.loading = false;\r\n });\r\n }; //getSavedFilters\r\n\r\n $scope.getSavedFilters();\r\n\r\n $scope.updateFilter = function (savedFilter) {\r\n if ($scope.editSavedFilter.name !== '') {\r\n savedFilter.description = $scope.editSavedFilter.description;\r\n savedFilter.name = $scope.editSavedFilter.name;\r\n $scope.postingChange = true;\r\n\r\n savedFilterService\r\n .updateSavedFilter(savedFilter.id, savedFilter)\r\n .then(function () {\r\n $scope.editing[savedFilter.id] = !$scope.editing[savedFilter.id];\r\n $scope.postingChange = false;\r\n $scope.disabledOnEdit = false;\r\n $scope.disabled.edit = false;\r\n })\r\n .catch(function (error) {\r\n if (error.status === 409) {\r\n $scope.conflictErrorFlag = true;\r\n $scope.postingChange = false;\r\n } else {\r\n let errorMsg = gettextCatalog.getString(\r\n 'An error occurred while updating Saved Filter information. Please try again later.',\r\n );\r\n if (error) {\r\n if (!!error.data && !!error.data.message && !!error.status && !!error.statusText) {\r\n errorMsg =\r\n error.data.message +\r\n ' ' +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n } else if (!!error.status && !!error.statusText) {\r\n errorMsg =\r\n gettextCatalog.getString(\r\n 'An error occurred while updating Saved Filter information: ',\r\n ) +\r\n (error.status.toString() + ' - ' + error.statusText.toString());\r\n }\r\n }\r\n $scope.errorFlag = true;\r\n $scope.errorText = errorMsg;\r\n $scope.disabledOnEdit = false;\r\n $scope.disabled.edit = false;\r\n }\r\n })\r\n .finally(function () {\r\n $scope.postingChange = false;\r\n });\r\n } else {\r\n $scope.isInvalidData = true;\r\n }\r\n }; //end updateSavedFilter\r\n\r\n $scope.deleteBtnClicked = function (savedFilterId) {\r\n if (savedFilterId) {\r\n //$scope.savedFiltersModels = [];\r\n let modalInstance = $uibModal.open({\r\n animation: true,\r\n template: require('./saved-filters-delete-modal.html'),\r\n controller: 'SavedFiltersDeleteModalController',\r\n resolve: {\r\n savedFilterId: function () {\r\n return savedFilterId;\r\n },\r\n },\r\n size: 'md',\r\n });\r\n\r\n //modal dialog result\r\n modalInstance.result.then(\r\n function (savedFiltersModels) {\r\n $scope.savedFiltersModels = savedFiltersModels;\r\n },\r\n function () {},\r\n );\r\n } else {\r\n $uibModalInstance.dismiss();\r\n }\r\n };\r\n\r\n $scope.update = function (savedFilter) {\r\n $scope.selectedFilters = savedFilter;\r\n $scope.ok();\r\n };\r\n\r\n $scope.ok = function () {\r\n $uibModalInstance.close($scope.selectedFilters);\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n $scope.$on('$locationChangeStart', function (event) {\r\n event.preventDefault();\r\n });\r\n}\r\n","export default function SecurityGroupsFilterDirective() {\r\n return {\r\n restrict: 'E',\r\n template: require('./security-groups-filter.component.html'),\r\n scope: {\r\n filters: '='\r\n },\r\n controller: SecurityGroupsFilterController\r\n };\r\n\r\n\r\n function SecurityGroupsFilterController(\r\n $rootScope, $scope, securityGroupsService) {\r\n 'ngInject';\r\n var currentUser = $rootScope.currentUser;\r\n $scope.securityGroups = [];\r\n $scope.showGroups = false;\r\n\r\n function getSecurityGroups() {\r\n if (currentUser.account.securityMode === 'Open') {\r\n $scope.securityGroups = [];\r\n return;\r\n }\r\n if (currentUser.securityMode !== 'Open') {\r\n $scope.securityGroups = currentUser.groups.data;\r\n if ($scope.securityGroups.length > 1) {\r\n $scope.showGroups = true;\r\n }\r\n } else {\r\n securityGroupsService.getAllSecurityGroups().then(function (response) {\r\n $scope.securityGroups = response.data.data;\r\n if ($scope.securityGroups.length > 0) {\r\n $scope.showGroups = true;\r\n }\r\n }, function (error) {\r\n $scope.securityGroups = [];\r\n });\r\n }\r\n\r\n }\r\n\r\n getSecurityGroups();\r\n }\r\n}","import _ from 'lodash';\r\n\r\nexport default function EquipmentDetailsService($rootScope, equipmentRepository) {\r\n 'ngInject';\r\n\r\n let service = {\r\n get: get,\r\n getDetails: getDetails,\r\n deleteImage: deleteImage,\r\n getSeriesEntities: getSeriesEntities,\r\n filterIncludedType: filterIncludedType\r\n };\r\n\r\n function get(equipmentId, includeList, uom) {\r\n return equipmentRepository.getEquipment(equipmentId, null, includeList, uom).then(function(response) {\r\n return parse(response.data);\r\n });\r\n }\r\n\r\n function parse(equipmentDetails) {\r\n let model = {};\r\n\r\n try {\r\n let included = equipmentDetails.included;\r\n\r\n // we should only be using onei3 properties going forward\r\n model.onei3 = {};\r\n\r\n model.attributes = equipmentDetails.data.attributes;\r\n model.communicatedAt = model.attributes.communicatedAt;\r\n model.createdAt = model.attributes.createdAt;\r\n model.coordsAt = model.attributes.coordsAt;\r\n model.coords = model.attributes.coords;\r\n model.networkTechnology = model.attributes.networkTechnology;\r\n model.details = getDetails(equipmentDetails);\r\n model.device = findIncludedType('device', included);\r\n model.faults = getFaultData(included);\r\n model.id = equipmentDetails.data.id;\r\n model.included = included;\r\n model.images = filterIncludedType('image', included);\r\n model.installation = findIncludedType('installation', included);\r\n model.make = model.attributes.attrs.make;\r\n model.maintenancePlans = filterIncludedType('maintenancePlan', included);\r\n model.model = model.attributes.attrs.model;\r\n model.name = model.attributes.name;\r\n model.profileImage = getProfileImg(included, equipmentDetails.data.relationships);\r\n model.relationships = equipmentDetails.data.relationships;\r\n //getting series this way is deprecated\r\n model.series = getSeriesEntities(equipmentDetails);\r\n model.onei3.series = getOnei3Series(model.series);\r\n model.users = filterIncludedType('user', included);\r\n model.year = model.attributes.attrs.year;\r\n\r\n model.alerts = getAlerts(included);\r\n setFaultsDtcDescription(model.faults);\r\n } catch (err) {\r\n throw err;\r\n }\r\n\r\n return model;\r\n }\r\n\r\n function getOnei3Series(equipmentSeries) {\r\n let onei3Series = {};\r\n _.forEach(equipmentSeries, function(series) {\r\n onei3Series[series.attributes.dataId] = _.clone(series.attributes);\r\n onei3Series[series.attributes.dataId].id = series.id;\r\n onei3Series[series.attributes.dataId].meta = series.meta;\r\n onei3Series[series.attributes.dataId].display = series.display;\r\n });\r\n return onei3Series;\r\n }\r\n\r\n function setFaultsDtcDescription(faults) {\r\n faults.forEach(fault => {\r\n if (fault.attributes) {\r\n fault.dtcFaultDescriptor = equipmentRepository.getDtcFaultDescriptor(fault.attributes);\r\n fault.attributes.title = equipmentRepository.formatFaultCode(fault.attributes) || fault.attributes.title;\r\n }\r\n });\r\n }\r\n\r\n function deleteImage(imageId, imageIndex, equipmentDetail) {\r\n this.included = _.filter(this.included, function(e) {\r\n return e.id != imageId;\r\n });\r\n }\r\n\r\n function findIncludedType(type, included) {\r\n return !included || included.length === 0\r\n ? null\r\n : _.find(included, function(e) {\r\n return e.type === type;\r\n });\r\n }\r\n\r\n function filterIncludedType(type, included) {\r\n return !included\r\n ? []\r\n : _.filter(included, function(e) {\r\n return e.type === type;\r\n });\r\n }\r\n\r\n function getFaultData(included) {\r\n return _.filter(included, function(e) {\r\n return e.type === 'fault' && e.attributes && e.attributes.last && e.attributes.last.v == 1;\r\n });\r\n }\r\n\r\n function getAlerts(included) {\r\n let allAlerts = filterIncludedType('alertOccurence', included);\r\n let visibleAlerts = removeInvisibleAlerts(allAlerts, $rootScope.currentUser.visibleDatapoints);\r\n setAlertDtcDescriptor(visibleAlerts);\r\n return visibleAlerts;\r\n }\r\n\r\n function removeInvisibleAlerts(alerts, visibleDatapoints) {\r\n let visibleAlerts = [];\r\n\r\n _.forEach(alerts, function(alert, key) {\r\n let isVisible = isVisibleDatapoint(alert, visibleDatapoints);\r\n if (isVisible) {\r\n visibleAlerts.push(alert);\r\n }\r\n });\r\n\r\n return visibleAlerts;\r\n }\r\n\r\n function setAlertDtcDescriptor(alerts) {\r\n _.forEach(alerts, function(alert, key) {\r\n if (alert.attributes && alert.attributes.series.tags[0] === 'dtc') {\r\n const dtcName = equipmentRepository.getDtcFaultDescriptor(alert.attributes.series);\r\n alert.attributes.series.title =\r\n equipmentRepository.formatFaultCode(alert.attributes.series) || alert.attributes.series.title;\r\n if (dtcName) {\r\n alert.attributes.series.faultDescription = dtcName.title;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function isVisibleDatapoint(alert, visibleDatapoints) {\r\n let datapoint = _.find(visibleDatapoints, function(datapoint) {\r\n return datapoint.id == alert.attributes.series.tags[0];\r\n });\r\n return datapoint ? true : false;\r\n }\r\n\r\n function getProfileImg(included, relationships) {\r\n if (relationships && relationships.profileImage) {\r\n return _.find(included, function(e) {\r\n return e.id === relationships.profileImage.data.id;\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n function getSeriesEntities(equipmentDetails) {\r\n //Only get the visible series entities based on the associated datapoint display\r\n let visibleSeriesForUser = [];\r\n\r\n let equipmentSeries = filterIncludedType('series', equipmentDetails.included);\r\n\r\n if (equipmentSeries && equipmentSeries.length > 0) {\r\n let displayItems = null;\r\n\r\n if (\r\n equipmentDetails.data &&\r\n equipmentDetails.data.relationships &&\r\n equipmentDetails.data.relationships.datapointDisplay &&\r\n equipmentDetails.data.relationships.datapointDisplay.data &&\r\n equipmentDetails.data.relationships.datapointDisplay.data.attributes &&\r\n equipmentDetails.data.relationships.datapointDisplay.data.attributes.displayItems\r\n ) {\r\n displayItems = equipmentDetails.data.relationships.datapointDisplay.data.attributes.displayItems;\r\n }\r\n\r\n //filter out gps\r\n equipmentSeries = _.filter(equipmentSeries, function(e) {\r\n if (e.attributes.tags) {\r\n if (e.attributes.tags[0] === 'gps') {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n if (displayItems === null) {\r\n return [];\r\n } else {\r\n _.forEach(equipmentSeries, function(series) {\r\n let matchingDisplayItem = _.find(displayItems, function(displayItem) {\r\n return displayItem.dataId === series.attributes.dataId;\r\n });\r\n\r\n if (series.attributes.descriptor && series.attributes.descriptor.title) {\r\n series.attributes.title = series.attributes.descriptor.title;\r\n }\r\n if (matchingDisplayItem) {\r\n series.display = matchingDisplayItem.visible;\r\n series.order = matchingDisplayItem.ordinal;\r\n series.keyMetric = matchingDisplayItem.keyMetric;\r\n series.decimals = matchingDisplayItem.decimals;\r\n visibleSeriesForUser.push(series);\r\n } else {\r\n series.display = false;\r\n series.order = 999;\r\n series.keyMetric = false;\r\n visibleSeriesForUser.push(series);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return _.sortBy(visibleSeriesForUser, function(series) {\r\n return series.order;\r\n });\r\n }\r\n\r\n function getDetails(equipment) {\r\n let attrTable = createAttributeTable(equipment);\r\n return createDetailsList(equipment.data.attributes.attrs, attrTable);\r\n }\r\n\r\n function createDetailsList(equipmentAttributes, attrTable) {\r\n let details = [];\r\n for (let key in equipmentAttributes) {\r\n if (equipmentAttributes.hasOwnProperty(key) && key.indexOf('onei3:') === -1) {\r\n let value = equipmentAttributes[key];\r\n let detail = {\r\n key: key,\r\n value: value,\r\n dataType: null\r\n };\r\n if (attrTable[key.toLowerCase()]) {\r\n detail.dataType = attrTable[key.toLowerCase()].attributes.dataType;\r\n }\r\n details.push(detail);\r\n }\r\n }\r\n\r\n return details;\r\n }\r\n\r\n function createAttributeTable(equipmentData) {\r\n let attributes = filterIncludedType('attribute', equipmentData.included);\r\n let keyed = _.indexBy(attributes, function(o) {\r\n return o.attributes.key.toLowerCase();\r\n });\r\n return keyed;\r\n }\r\n\r\n return service;\r\n}\r\n","export default function ToggleHelpNavDirective() {\r\n return {\r\n template: require('./toggle-nav.directive.html'),\r\n transclude: true,\r\n restrict: 'E',\r\n controller: ['$scope', 'helpItemsService', function ($scope, helpItemsService) {\r\n $scope.class = function () {\r\n return helpItemsService.isShowingHelpSideNav() ? \"is-active\" : \"\";\r\n };\r\n\r\n $scope.click = function () {\r\n helpItemsService.toggleHelpSideNav();\r\n };\r\n }]\r\n };\r\n}","import * as UserActions from '../state/user/user.actions';\r\nimport { removeLoadingScreenAfterDelay } from '../functions/app.functions';\r\nimport { userIsGroupAdmin } from '../functions/user.functions';\r\nimport App from '../app';\r\n\r\nexport default function AppController(\r\n initialData,\r\n $scope,\r\n $rootScope,\r\n usersService,\r\n $state,\r\n navService,\r\n $window,\r\n $location,\r\n appNotificationsService,\r\n $uibModal,\r\n languagesService, // /* :O THREE MANY INJEX */\r\n $ngRedux,\r\n) {\r\n 'ngInject';\r\n let vm = this;\r\n $scope.show = {};\r\n $scope.show.singleSignOnFlag = true;\r\n\r\n vm.$onInit = () => {\r\n vm.unsubscribe = $ngRedux.connect(vm.mapStateToThis, UserActions)(vm);\r\n\r\n removeLoadingScreenAfterDelay();\r\n\r\n // GTM TESTING\\\r\n // ----- FIGURE OUT IF .master IS POPULATED AT THIS POINT OR IF THIS WILL ALWAYS DEFAULT TO USE ACCOUNT.NAME\r\n // const master = $rootScope.currentUser.master || $rootScope.currentUser.account.name;\r\n const master = $rootScope.currentUser.master;\r\n\r\n window.dataLayer = window.dataLayer || [];\r\n\r\n // Identifying user information on amplitude\r\n try {\r\n const { id: userId, account: {\r\n name : accountName,\r\n id: accountId\r\n } } = $rootScope.currentUser;\r\n\r\n const identifyEvent = new App.amplitude.Identify();\r\n identifyEvent.setOnce('Customer Id', accountId);\r\n identifyEvent.setOnce('Account Name', accountName);\r\n\r\n App.amplitude.setUserId(userId)\r\n App.amplitude.identify(identifyEvent);\r\n }\r\n catch (e) {\r\n console.log(e);\r\n }\r\n\r\n window.dataLayer.push({\r\n userId: $rootScope.currentUser.id,\r\n account: $rootScope.currentUser.account.name,\r\n accountId: $rootScope.currentUser.account.id.toString(),\r\n org: master,\r\n });\r\n };\r\n\r\n vm.$onDestroy = () => {\r\n vm.unsubscribe();\r\n };\r\n\r\n vm.mapStateToThis = (state) => {\r\n const { user } = state;\r\n const { app } = state;\r\n $rootScope.datapointDescriptors = user.datapointDescriptors;\r\n let descriptorsByKey = {};\r\n user.datapointDescriptors?.forEach((desc) => {\r\n if (desc.key) {\r\n let key = desc.key.split('.').sort().join('.');\r\n descriptorsByKey[key] = desc;\r\n }\r\n });\r\n $rootScope.datapointDescriptorsByKey = descriptorsByKey;\r\n\r\n $scope.accountId = user.account.id;\r\n $scope.brandLogo = app.logoUrl;\r\n $scope.mobileUrl = app.cornerIcon;\r\n\r\n\r\n\r\n return {};\r\n };\r\n\r\n $rootScope.$on('$stateChangeStart', (event, toState) => {\r\n if (!toState.requiredDatapoints || !$rootScope.currentUser) {\r\n return;\r\n }\r\n\r\n let mapRequired = false;\r\n\r\n for (let i = 0; i < toState.requiredDatapoints.length; i++) {\r\n if (toState.requiredDatapoints[i] === 'gps') {\r\n mapRequired = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!mapRequired) {\r\n return; // no need to redirect\r\n }\r\n\r\n //perform redirect if user is unauthorized to see map\r\n\r\n let mapAccessible = false;\r\n for (let j = 0; j < $rootScope.currentUser.visibleDatapoints.length; j++) {\r\n if ($rootScope.currentUser.visibleDatapoints[j].id === 'gps') {\r\n mapAccessible = true;\r\n }\r\n }\r\n\r\n if (!mapAccessible) {\r\n event.preventDefault(); // stop current execution\r\n $state.go('equipment'); // go to asset list\r\n }\r\n });\r\n\r\n //track views of individual site pages via Google Analytics\r\n $rootScope.$on('$stateChangeSuccess', () => {\r\n // GTM TESTING\r\n window.dataLayer.push({\r\n event: 'ngRouteChange',\r\n attributes: {\r\n route: $location.path(),\r\n },\r\n });\r\n });\r\n\r\n // Determine appropriate navigation items.\r\n let calculateNavItems = () => {\r\n $rootScope.navItems = [];\r\n\r\n let modules = navService.getModules();\r\n\r\n for (let key in modules) {\r\n let module = modules[key];\r\n\r\n if (module.hide) {\r\n continue;\r\n }\r\n\r\n //filter out invalid items\r\n module.items = (module.items || []).filter((item) => navService.isValidState(item.sref));\r\n\r\n //add the module if root state is valid or one of it's sub item valid\r\n if (navService.isValidState(module.sref) || module.items.length > 0) {\r\n $rootScope.navItems.push(module);\r\n }\r\n }\r\n\r\n $rootScope.navItems.sort((a, b) => {\r\n return b.priority - a.priority;\r\n });\r\n };\r\n\r\n $rootScope.currentUser = usersService.currentUser();\r\n\r\n try {\r\n let lng = $rootScope.currentUser.claims.data.language;\r\n\r\n //temporary , in case the user has set his language (english, french) befor changing to en, fr..\r\n if (lng === 'english' || lng === 'french') {\r\n lng = 'en';\r\n $rootScope.currentUser.claims.data.language = 'en'; // for help section\r\n }\r\n // set the app language\r\n languagesService.setCurrentLanguage(lng);\r\n } catch (ex) {\r\n languagesService.setCurrentLanguage();\r\n }\r\n\r\n if (!$rootScope.currentUser.changeEmail) {\r\n $scope.show.singleSignOnFlag = false;\r\n }\r\n\r\n calculateNavItems();\r\n //Set the modules on the page to be used everywhere!\r\n $rootScope.isShowingSideNav = () => {\r\n return navService.isShowingSideNav();\r\n };\r\n\r\n $scope.openNotificationModal = (_activeNotification) => {\r\n let modalInstance = $uibModal.open({\r\n template: require('../pages/app-notifications/app.notifications.modal.html'),\r\n controller: 'AppNotificationsController',\r\n resolve: {\r\n notification: () => {\r\n return _activeNotification;\r\n },\r\n },\r\n backdrop: 'static',\r\n keyboard: false,\r\n size: 'lg',\r\n });\r\n\r\n modalInstance.result.then((updatedAccepted) => {\r\n // post Active Notifications to acknowldege\r\n appNotificationsService.acknowledgeNotications(updatedAccepted).then(null, (error) => {\r\n let errorMsg = 'An error occurred while acknowledge app notifications';\r\n\r\n if (error.data || error.status) {\r\n if (error.data) {\r\n errorMsg = `${error.data} ${error.status.toString()} - ${error.statusText.toString()}`;\r\n } else {\r\n errorMsg += `: ${error.status.toString()} - ${error.statusText.toString()}`;\r\n }\r\n }\r\n\r\n return errorMsg;\r\n });\r\n });\r\n }; // end openNotificationModal\r\n\r\n if (initialData.activeNotifications && initialData.activeNotifications.length > 0) {\r\n $scope.openNotificationModal(initialData.activeNotifications);\r\n }\r\n\r\n //for redirecting to specific section on the help page\r\n $scope.goHelp = () => {\r\n //help variables for page selection\r\n let helpPage = '';\r\n let helpItem = '';\r\n\r\n //current state and parent state variable\r\n let currentState = $state.current.name;\r\n currentState = currentState.replace(/[0-9]/gi, '');\r\n\r\n let helpModuleId = $state.current.helpModuleId;\r\n let helpState = $state.current.helpState;\r\n\r\n //set the help variables for page section\r\n if (currentState === 'help') {\r\n //if help button is clicked from same page\r\n currentState = $location.path();\r\n let page = currentState.split('/');\r\n helpPage = page[2] || null;\r\n helpItem = page[3] || null;\r\n } // help clicked from other page on website\r\n else {\r\n let page = currentState.split('.');\r\n helpPage = page[0];\r\n\r\n currentState = currentState.replace(/[-.]/gi, '');\r\n helpItem = currentState;\r\n if (helpState) {\r\n // if parent state available\r\n //remove integer and . from patent state to create id of the div\r\n helpState = helpState.replace(/[-.0-9]/gi, '');\r\n helpItem = helpState;\r\n }\r\n\r\n if (helpModuleId) {\r\n helpPage = helpModuleId;\r\n }\r\n }\r\n\r\n //convert to lowercase\r\n if (helpItem) helpItem = helpItem.toLowerCase();\r\n if (helpPage) helpPage = helpPage.toLowerCase();\r\n\r\n $state.go('help', {\r\n helpPage: helpPage,\r\n helpItem: helpItem,\r\n });\r\n };\r\n}\r\n","export function removeLoadingScreen() {\r\n const initialLoader = document.getElementById('initial-loading');\r\n\r\n if (!initialLoader) {\r\n console.warn(\"Loader not found, exiting...\")\r\n return;\r\n }\r\n\r\n initialLoader.classList.toggle('fadeOut');\r\n\r\n if (!('remove' in Element.prototype)) {\r\n initialLoader.parentNode.removeChild(initialLoader);\r\n } else {\r\n initialLoader.remove();\r\n }\r\n}\r\n\r\n// Why 600ms? Nobody knows, but things bork without this delay.\r\nexport function removeLoadingScreenAfterDelay(delay = 600) {\r\n setTimeout(() => {\r\n removeLoadingScreen()\r\n }, delay);\r\n}","export default function IndexRouteConfig($stateProvider) {\r\n 'ngInject';\r\n\r\n $stateProvider.state('index', {\r\n url: '/index',\r\n template: '

                ',\r\n requiredDatapoints: ['gps'],\r\n requiredFeatures: ['map'],\r\n controller: function ($state, $location) {\r\n 'ngInject';\r\n\r\n const path = $location.path();\r\n if (path && !path.toLowerCase().endsWith('index')) {\r\n $state.go(path);\r\n }\r\n\r\n $state.go('map');\r\n }\r\n });\r\n}","import AppSettings from './app.settings';\r\nexport default function AppSettingsService($ngRedux) {\r\n 'ngInject';\r\n const getDateFormat = () => {\r\n if ($ngRedux) {\r\n const {\r\n user: {dateFormat = 'YYYY/MM/DD'}\r\n } = $ngRedux.getState();\r\n return dateFormat;\r\n }\r\n return 'YYYY/MM/DD';\r\n };\r\n\r\n return {\r\n ...AppSettings,\r\n InReachApiEndpoint: '/',\r\n InReachApiTransfersEndpoint: '/transfers',\r\n InReachApiTimeSeriesEndpoint: '/series',\r\n InReachApiCSVExportEndpoint: '/export',\r\n InReachApiSavedFilterEndpoint: '/savedfilter',\r\n InReachApiSearchFavouritesEndpoint: '/search/favourites',\r\n InReachMediaEndpoint: '/media',\r\n InReachApiSchedulerEndpoint: '/scheduler',\r\n InReachApiReportEndpoint: '/reports',\r\n InReachApiGeozonesEndpoint: '/geozones',\r\n InReachApiProductsEndpoint: '/products',\r\n InReachApiPackagesEndpoint: '/packages',\r\n InReachApiInstallationsEndpoint: '/installations',\r\n InReachApiEquipmentEndpoint: '/equipment',\r\n InReachApiAlertsEndpoint: '/alerts',\r\n InReachApiBulkActivation: '/bulkactivation',\r\n GetDateFormat: getDateFormat\r\n };\r\n}\r\n","import angular from 'angular';\r\nimport * as bowser from 'bowser';\r\n\r\nimport 'angular-gettext';\r\nimport 'angular-ui-router';\r\nimport 'angular-ui-bootstrap';\r\nimport 'ng-tags-input';\r\nimport 'angular-toastr/dist/angular-toastr.min';\r\nimport 'angular-jwt';\r\nimport 'angularjs-dropdown-multiselect';\r\nimport 'ng-csv';\r\nimport 'angular-breadcrumb';\r\nimport 'angular-bootstrap-colorpicker';\r\nimport 'angular-local-storage';\r\nimport '@lordfriend/nya-bootstrap-select';\r\nimport 'angular-vs-repeat';\r\nimport 'angular-ladda';\r\nimport 'angular-drag-and-drop-lists';\r\nimport 'angular-moment';\r\nimport 'angular-file-upload';\r\nimport 'angular-xeditable';\r\nimport 'angular-jquery-timepicker';\r\nimport 'angular-scroll';\r\nimport 'ui-select';\r\n\r\nimport App from './app';\r\nimport Auth from './auth';\r\nimport AppSettings from './app.settings';\r\n\r\nimport appConfigModule from './config.module';\r\nimport apiModule from './api/api.module';\r\nimport assetDashboardModule from './pages/asset-dashboard/asset-dashboard.module';\r\nimport navModule from './pages/global-layouts/navigation/nav.module';\r\nimport componentsModule from './components/components.module';\r\nimport directivesModule from './directives/directives.module';\r\nimport maintenanceModule from './pages/maintenance/maintenance.module';\r\nimport accessManagementModule from './pages/access-management/access-management.module';\r\nimport appNotificationModule from './pages/app-notifications/app.notifications.module';\r\nimport helpModule from './pages/help/help.module';\r\nimport mapModule from './pages/map/map-module';\r\nimport profileModule from './pages/user-profile/profile.module';\r\nimport reportsModule from './pages/reports/reports.module';\r\nimport tSeriesModule from './pages/t-series/t-series.module';\r\nimport utilModule from './utility/util.module';\r\nimport adminModule from './pages/admin/admin.module';\r\nimport alertsModule from './pages/alerts/alerts.module';\r\nimport serviceModule from './services/service.module';\r\nimport equipmentListModule from './equipment/list/equipment.list.module';\r\nimport equipmentESNModule from './equipment/esn/equipment.esn.module';\r\nimport devicesModule from './pages/devices/devices.module';\r\nimport filterModule from './filters/filter.module';\r\nimport equipmentFilterModule from './equipment/filters/equipment.filters.module';\r\nimport ErrorsModule from './pages/errors/errors.module';\r\nimport browserPolicyModule from './pages/browser-policy/browser-policy.module';\r\nimport assetDetailsDashboardModule from './equipment/asset-details-dashboard/asset-details-dashboard.module';\r\nimport SitesModules from './pages/Sites/sites.module';\r\nimport equipmentUpdateModule from './equipment/equipment-update/equipment-update.module';\r\n\r\nimport EquipmentSearchService from './equipment/services/equipment-search.service';\r\nimport conversionService from './app.conversion.service';\r\nimport UtilitySevice from './app.utility.service';\r\nimport authService from './auth.service';\r\nimport AuthInterceptor from './auth.interceptor';\r\nimport TimezoneService from './timezone.service';\r\n\r\nimport DateRangeDirective, {\r\n DateRangeController,\r\n} from './equipment/components/date-range/date-range.component';\r\nimport { EquipmentDetailsComponent } from './equipment/components/equipment-details/equipment-details.component';\r\nimport EquipmentFacetFiltersDirective from './equipment/components/equipment-facet-filters.component';\r\nimport EquipmentFiltersSummaryDirective from './equipment/components/equipment-filters-summary.component';\r\nimport EquipmentImagesDeleteModalController from './equipment/components/images-modal/equipment-images-delete.modal.controller';\r\nimport EquipmentImagesModalController from './equipment/components/images-modal/equipment-images.modal.controller';\r\nimport PollButtonDirective from './equipment/components/polling/equipment-polling-component';\r\nimport EquipmentFiltersDirective from './equipment/equipment-filters.component';\r\nimport EquipmentFullFiltersDirective from './equipment/equipment-full-filters.component';\r\nimport { FaultCsvComponent } from './pages/alerts/fault-csv/fault-csv.component';\r\nimport EquipmentController from './equipment/equipment.controller';\r\nimport { EquipmentDetailEditComponent } from './equipment/equipment.detail.edit.controller';\r\nimport EquipmentRouteConfig from './equipment/equipment.route';\r\nimport EquipmentSearchFactory from './equipment/equipment.search.factory';\r\nimport SaveFiltersConfirmModalController from './equipment/savedfilters/save-filters-confirm-modal.controller';\r\nimport SaveFiltersModalController from './equipment/savedfilters/save-filters-modal.controller';\r\nimport SavedFiltersDeleteModalController from './equipment/savedfilters/saved-filters-delete-modal.controller';\r\nimport SavedFiltersModalController from './equipment/savedfilters/saved-filters-modal.controller';\r\nimport SecurityGroupsFilterDirective from './equipment/security-groups-filter.component';\r\nimport EquipmentDetailsService from './equipment/services/equipment-details.service';\r\nimport ToggleHelpNavDirective from './pages/help/toggle-nav.directive';\r\nimport AppController from './main/app.controller';\r\nimport IndexRouteConfig from './main/index.route';\r\nimport AppSettingsService from './app.settings.service';\r\n\r\nconst appModule = angular.module('app', [\r\n appConfigModule,\r\n componentsModule,\r\n navModule,\r\n profileModule,\r\n maintenanceModule,\r\n accessManagementModule,\r\n mapModule,\r\n reportsModule,\r\n tSeriesModule,\r\n utilModule,\r\n apiModule,\r\n adminModule,\r\n alertsModule,\r\n appNotificationModule,\r\n serviceModule,\r\n filterModule,\r\n helpModule,\r\n equipmentListModule,\r\n equipmentESNModule,\r\n filterModule,\r\n equipmentFilterModule,\r\n directivesModule,\r\n devicesModule,\r\n assetDashboardModule,\r\n profileModule,\r\n ErrorsModule,\r\n browserPolicyModule,\r\n assetDetailsDashboardModule,\r\n SitesModules,\r\n equipmentUpdateModule,\r\n 'ngResource',\r\n 'ngSanitize',\r\n 'ui.router',\r\n 'ui.bootstrap',\r\n 'ui.select',\r\n 'ngTagsInput',\r\n 'ngAnimate',\r\n 'toastr',\r\n 'ngCookies',\r\n 'angular-jwt',\r\n 'appSettingsModule',\r\n 'angularjs-dropdown-multiselect',\r\n 'ngCsv',\r\n 'duScroll',\r\n 'ncy-angular-breadcrumb',\r\n 'colorpicker.module',\r\n 'LocalStorageModule',\r\n 'nya.bootstrap.select',\r\n 'vs-repeat',\r\n 'angular-ladda',\r\n 'gettext',\r\n 'dndLists',\r\n 'angularMoment',\r\n 'angularFileUpload',\r\n 'xeditable',\r\n 'angularjs-gauge',\r\n 'nvd3',\r\n]);\r\n\r\nclass AngularAppModule {\r\n init() {\r\n appModule\r\n /**\r\n * Default query string for the asset multi picker.\r\n * The query string is passed as a resolve into the AssetMultiPicker from some modules. For other modules, there should be a default or the angular injection error occurs\r\n */\r\n .constant('prefilter', {\r\n queries: [],\r\n })\r\n .constant('pickerSettings', {})\r\n .constant('browser', {\r\n supported:\r\n !(bowser.msie && bowser.version <= 11) && !(bowser.msedge && bowser.version < 16),\r\n name: bowser.name,\r\n version: bowser.version,\r\n osname: bowser.osname,\r\n osversion: bowser.osversion,\r\n })\r\n // Config\r\n .config([\r\n '$compileProvider',\r\n ($compileProvider) => {\r\n // production performance tweaks\r\n $compileProvider.debugInfoEnabled(false);\r\n $compileProvider.commentDirectivesEnabled(false);\r\n $compileProvider.cssClassDirectivesEnabled(false);\r\n },\r\n ])\r\n .config([\r\n '$qProvider',\r\n function ($qProvider) {\r\n const env_allowsErrorConsoleLog = [\r\n AppSettings.environments.local,\r\n AppSettings.environments.staging,\r\n ];\r\n if (!env_allowsErrorConsoleLog.includes(AppSettings.environment)) {\r\n $qProvider.errorOnUnhandledRejections(false);\r\n }\r\n },\r\n ])\r\n .config([\r\n '$httpProvider',\r\n function InterceptorConfig($httpProvider) {\r\n //disable IE ajax request caching\r\n /* $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n // extra\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n */\r\n\r\n $httpProvider.defaults.headers.common = {\r\n 'Cache-Control': 'no-cache',\r\n Pragma: 'no-cache',\r\n };\r\n\r\n // This is hack for angular not knowing how to use the browsers url for the base path\r\n $httpProvider.interceptors.push(($q) => {\r\n 'ngInject';\r\n\r\n return {\r\n request: (config) => {\r\n if (config.url.charAt(0) === '/') {\r\n config.url = `//${Auth.getUrl().host}/api${config.url}`;\r\n }\r\n\r\n return config;\r\n },\r\n };\r\n });\r\n\r\n $httpProvider.interceptors.push('authInterceptor');\r\n $httpProvider.defaults.headers['delete'] = {\r\n 'content-type': 'application/json',\r\n };\r\n },\r\n ])\r\n .config(EquipmentRouteConfig)\r\n .config([\r\n '$stateProvider',\r\n function ($stateProvider) {\r\n $stateProvider.state('logoff', {\r\n url: '/logoff',\r\n template: '

                ',\r\n controller: function () {\r\n Auth.signUserOut();\r\n },\r\n });\r\n },\r\n ])\r\n .config(['$stateProvider', '$urlRouterProvider', IndexRouteConfig])\r\n .config(function ($breadcrumbProvider) {\r\n $breadcrumbProvider.setOptions({\r\n templateUrl: 'components/breadcrumbs/breadcrumbs.template.html',\r\n });\r\n })\r\n .controller('EquipmentImagesDeleteModalController', EquipmentImagesDeleteModalController)\r\n .controller('EquipmentImagesModalController', EquipmentImagesModalController)\r\n .controller('EquipmentController', EquipmentController)\r\n .controller('SaveFiltersConfirmModalController', SaveFiltersConfirmModalController)\r\n .controller('SaveFiltersModalController', SaveFiltersModalController)\r\n .controller('SavedFiltersDeleteModalController', SavedFiltersDeleteModalController)\r\n .controller('SavedFiltersModalController', SavedFiltersModalController)\r\n .controller('AppController', AppController)\r\n .controller('DateRangeController', DateRangeController)\r\n\r\n // Web-configured services\r\n .service('initialData', () => {\r\n let state = App.store.getState();\r\n return {\r\n currentUser: state.user,\r\n datapointDescriptors: state.user.datapointDescriptors,\r\n activeNotifications: state.user.activeNotifications,\r\n };\r\n })\r\n .service('appSettings', AppSettingsService)\r\n // Factories and services\r\n .service('equipmentSearchService', EquipmentSearchService)\r\n .service('conversionService', conversionService)\r\n .service('utilitySevice', UtilitySevice)\r\n .service('authService', authService)\r\n .factory('authInterceptor', AuthInterceptor)\r\n .service('TimezoneService', TimezoneService)\r\n .factory('equipmentSearchFactory', EquipmentSearchFactory)\r\n .service('equipmentDetailsService', EquipmentDetailsService)\r\n\r\n // Directives\r\n /**\r\n * the HTML5 autofocus property can be finicky when it comes to dynamically loaded\r\n * templates and such with AngularJS. Use this simple directive to\r\n * tame this beast once and for all.\r\n *\r\n * Usage:\r\n * \r\n *\r\n * License: MIT\r\n */\r\n .directive('dateRange', [DateRangeDirective])\r\n .directive('equipmentFacetFilters', [EquipmentFacetFiltersDirective])\r\n .directive('equipmentFiltersSummary', [EquipmentFiltersSummaryDirective])\r\n\r\n .directive('pollButton', [PollButtonDirective])\r\n .directive('equipmentFilters', [EquipmentFiltersDirective])\r\n .directive('equipmentFullFilters', [EquipmentFullFiltersDirective])\r\n .directive('securityGroupsFilter', [SecurityGroupsFilterDirective])\r\n /**\r\n * Directive for the hamburger to toggle the side nav\r\n */\r\n .directive('toggleHelpNav', [ToggleHelpNavDirective])\r\n\r\n // Components\r\n .component('faultCsv', FaultCsvComponent)\r\n .component('equipmentDetailEdit', EquipmentDetailEditComponent)\r\n .component('equipmentDetails', EquipmentDetailsComponent);\r\n\r\n return this;\r\n }\r\n\r\n bootstrap() {\r\n angular.element(() => {\r\n angular.bootstrap(document, ['app']);\r\n });\r\n }\r\n}\r\n\r\nexport default new AngularAppModule();\r\n","import { Subscriber } from 'rxjs';\r\nimport App from '../app';\r\n\r\nexport default class HttpSubscriber extends Subscriber {\r\n constructor(observer, requestConfiguration) {\r\n super(observer);\r\n\r\n this.store = App.getStore();\r\n\r\n this.requestId = Math.random() + '-xhr-abort-id';\r\n this.aborted = false;\r\n\r\n App.axios({...requestConfiguration, ...{requestId: this.requestId}})\r\n .then(response => {\r\n observer.next(response.data);\r\n observer.complete();\r\n })\r\n .catch((request) => {\r\n if (request.response) {\r\n return observer.error(request.response);\r\n }\r\n return observer.error(request.message);\r\n });\r\n }\r\n\r\n unsubscribe() {\r\n super.unsubscribe();\r\n\r\n if (this.aborted === false) {\r\n App.axios.cancel(this.requestId);\r\n this.aborted = true;\r\n }\r\n }\r\n}\r\n","import HttpSubscriber from './subscriber';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport default class Http {\r\n constructor(requestOptions) {\r\n this.setOptions(requestOptions);\r\n }\r\n\r\n setOptions(requestOptions) {\r\n this.requestOptions = requestOptions;\r\n }\r\n\r\n static get(url, options = {}) {\r\n return Http.raw({...options, ...{ method: 'GET', url }});\r\n }\r\n\r\n static post(url, data = {}, options = {}) {\r\n return Http.raw({...options, ...{ method: 'POST', url, data }});\r\n }\r\n\r\n static put(url, data = {}, options = {}) {\r\n return Http.raw({...options, ...{ method: 'PUT', url, data }});\r\n }\r\n\r\n static patch(url, data = {}, options = {}) {\r\n return Http.raw({...options, ...{ method: 'PATCH', url, data }});\r\n }\r\n\r\n static delete(url, options = {}) {\r\n return Http.raw({...options, ...{ method: 'DELETE', url }});\r\n }\r\n\r\n static raw(options, observable = null) {\r\n return new Http(options).observe(observable);\r\n }\r\n\r\n observe(observable = null) {\r\n if (!observable) {\r\n return new Observable(observer => new HttpSubscriber(observer, this.requestOptions));\r\n }\r\n\r\n return observable.susbcribe(observer => new HttpSubscriber(observer, this.requestOptions));\r\n }\r\n}","import { catchError, mergeMap, concatMap, map, finalize } from 'rxjs/operators';\r\nimport { ofType } from 'redux-observable';\r\nimport { forkJoin, throwError, of } from 'rxjs';\r\nimport AppSettings from '../../app.settings';\r\nimport AngularAppModule from '../../app.module';\r\nimport Http from '../../http/http';\r\nimport Store from '../../state/store';\r\nimport * as UserActions from '../user/user.actions';\r\nimport * as AppActions from './app.actions';\r\nimport errorTemplate from '../../pages/errors/general/error.html';\r\n\r\nconst isStorageValid = current => {\r\n const safeParse = value => {\r\n try {\r\n return JSON.parse(value || '{}');\r\n } catch (e) {\r\n return {};\r\n }\r\n };\r\n const storage = safeParse(sessionStorage.getItem('onei3-state'));\r\n const { user = {} } = storage;\r\n const { account = {} } = user;\r\n return current.id === user.id && current.account.id === account.id;\r\n};\r\n\r\nexport const initializeApp = action$ => {\r\n const sources = [\r\n Http.get('/api/users/me').pipe(catchError(error => throwError(UserActions.requestUserFailed(error)))),\r\n Http.get('/api/datapoints/descriptors').pipe(\r\n catchError(error => throwError(UserActions.requestDatapointsDescriptorsFail(error)))\r\n )\r\n ];\r\n\r\n // This requires concatMap to work. concatMap will preserve the order of the array above ^^^\r\n return action$.pipe(\r\n ofType(AppActions.APP_INITIALIZE),\r\n concatMap(() => forkJoin(sources)),\r\n concatMap(([userData, initialDescriptors]) => {\r\n if (!userData || (userData.features || []).length === 0) {\r\n return throwError('User has no features');\r\n }\r\n if (isStorageValid(userData)) {\r\n Store.loadFromStorage();\r\n }\r\n\r\n return of(\r\n UserActions.requestUserSuccess(userData),\r\n UserActions.requestDatapointsDescriptorsSuccess(initialDescriptors),\r\n AppActions.initialized()\r\n );\r\n }),\r\n catchError(error => {\r\n //type will define what error page to display\r\n const type = error === 'User has no features' ? '?type=no_features' : '';\r\n return of(AppActions.logAppError('APP_INITIALIZE', JSON.stringify(error), '/home', `/home/error${type}`));\r\n })\r\n );\r\n};\r\n\r\nexport const AfterAppInitialized = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AppActions.APP_INITIALIZED),\r\n mergeMap(() => {\r\n AngularAppModule.bootstrap();\r\n return of(AppActions.appAnalyticsSet(), AppActions.startAngularBootstrap());\r\n })\r\n );\r\n\r\nexport const logAppErrorsThenRedirect = action$ =>\r\n action$.pipe(\r\n ofType(AppActions.LOG_ERROR),\r\n concatMap(action =>\r\n Http.post('/api/errorlog', {\r\n cause: action.payload.cause,\r\n message: action.payload.message,\r\n type: 'error',\r\n url: action.payload.url,\r\n stackTrace: action.payload.stackTrace\r\n }).pipe(\r\n map(() => AppActions.logAppErrorSuccess()),\r\n catchError(() => of(AppActions.logAppErrorfailed())),\r\n finalize(() => {\r\n AngularAppModule.removeLoadingScreen();\r\n document.body.insertAdjacentHTML('beforeend', errorTemplate);\r\n })\r\n )\r\n )\r\n );\r\n","import Action from '../action';\r\n\r\nexport const APP_INITIALIZED = '@app/INITIALIZED';\r\nexport const APP_INITIALIZE = '@app/INITIALIZE';\r\nexport const LOG_ERROR = '@app/LOG_APP_ERROR';\r\nexport const LOG_ERROR_FAILED = '@app/LOG_ERROR_FAILED';\r\nexport const LOG_ERROR_SUCCESS = '@app/LOG_ERROR_SUCCESS';\r\nexport const APP_LOCALIZED = '@app/LOCALIZED';\r\nexport const APP_GOOGLEANATYTICS_SET = '@app/GOOGLEANATYTICS_SET';\r\nexport const ANGULAR_BOOTSTRAPPING_STARTED = '@app/ANGULAR_BOOTSTRAPPING_STARTED';\r\nexport const SET_APP_BRANDING = '@app/SET_APP_BRANDING';\r\nexport const REDIRECT_USER = '@app/REDIRECT_USER';\r\n\r\nexport const initialized = () => Action(APP_INITIALIZED);\r\nexport const localized = () => Action(APP_LOCALIZED);\r\nexport const initialize = () => Action(APP_INITIALIZE);\r\nexport const startAngularBootstrap = () => Action(ANGULAR_BOOTSTRAPPING_STARTED);\r\nexport const appAnalyticsSet = () => Action(APP_GOOGLEANATYTICS_SET);\r\nexport const redirectUser = state => Action(REDIRECT_USER, {state});\r\nexport const logAppError = (cause, message, url, redirectUrl, stackTrace = []) =>\r\n Action(LOG_ERROR, {message, cause, url, stackTrace, redirectUrl}, true);\r\nexport const logAppErrorSuccess = () => Action(LOG_ERROR_SUCCESS);\r\nexport const logAppErrorfailed = () => Action(LOG_ERROR_FAILED);\r\nexport const appBranding = (logoUrl, cornerIcon) => Action(SET_APP_BRANDING, {logoUrl, cornerIcon});\r\n","import Action from '../action';\r\nimport App from '../../app';\r\nimport AppSettings from '../../app.settings';\r\n\r\nexport const REQUEST_TABLEAU_REPORTS = '@reports/REQUEST_TABLEAU_REPORTS';\r\nexport const REQUEST_TABLEAU_REPORTS_SUCCESS = `${REQUEST_TABLEAU_REPORTS}_SUCCESS`;\r\nexport const REQUEST_TABLEAU_REPORTS_FAILED = `${REQUEST_TABLEAU_REPORTS}_FAILED`;\r\n\r\nexport const CREATE_TABLEAU_USER = '@reports/CREATE_TABLEAU_USER';\r\nexport const CREATE_TABLEAU_USER_SUCCESS = `${CREATE_TABLEAU_USER}_SUCCESS`;\r\nexport const CREATE_TABLEAU_USER_FAILED = `${CREATE_TABLEAU_USER}_FAILED`;\r\n\r\nexport const REQUEST_TRUSTED_TICKET = '@reports/REQUEST_TRUSTED_TICKET';\r\nexport const REQUEST_TRUSTED_TICKET_SUCCESS = `${REQUEST_TRUSTED_TICKET}_SUCCESS`;\r\nexport const REQUEST_TRUSTED_TICKET_FAILED = `${REQUEST_TRUSTED_TICKET}_FAILED`;\r\nexport const CONSUME_TRUSTED_TICKET = '@reports/CONSUME_TRUSTED_TICKET';\r\n\r\nexport const receiveTableauReports = reportsList => Action(REQUEST_TABLEAU_REPORTS_SUCCESS, {reportsList});\r\nexport const requestTableauReportsFailed = error => Action(REQUEST_TABLEAU_REPORTS_FAILED, error, true);\r\n\r\nexport const requestTrustedTicket = username => Action(REQUEST_TRUSTED_TICKET, {username});\r\nexport const requestTrustedTicketSuccess = ticket => Action(REQUEST_TRUSTED_TICKET_SUCCESS, ticket);\r\nexport const requestTrustedTicketFailed = error => Action(REQUEST_TRUSTED_TICKET_FAILED, error, true);\r\n\r\nexport const createTableauUser = (username, email, context) => Action(CREATE_TABLEAU_USER, {username, email, context});\r\nexport const createTableauUserSuccess = username => Action(CREATE_TABLEAU_USER_SUCCESS, {username});\r\nexport const createTableauUserFailed = error => Action(CREATE_TABLEAU_USER_FAILED, error, true);\r\n\r\nexport const getTrustedTicket = username => {\r\n return dispatch => {\r\n\r\n const axios = App.getAxios();\r\n\r\n dispatch(requestTrustedTicket(username));\r\n\r\n return axios.get(`/ticket/${username}`, {baseURL: AppSettings.BaseTableauProxyUrl })\r\n .then(response => response.data)\r\n .then(data => dispatch(requestTrustedTicketSuccess(data)))\r\n .catch(err => dispatch(requestTrustedTicketFailed(err)));\r\n };\r\n};","import {of} from 'rxjs';\r\nimport {map, catchError, switchMap} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\nimport Auth from '../../auth';\r\n\r\nimport * as ReportsActions from './reports.actions';\r\n\r\nexport const requestTableauReports = action$ =>\r\n action$.pipe(\r\n ofType(ReportsActions.CREATE_TABLEAU_USER_SUCCESS),\r\n switchMap(({payload}) =>\r\n Http.get(`/workbooks/${payload.username}`, {\r\n baseURL: AppSettings.BaseTableauProxyUrl\r\n }).pipe(\r\n map(data => ReportsActions.receiveTableauReports(data)),\r\n catchError(error => of(ReportsActions.requestTableauReportsFailed(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const createTableauUser = action$ =>\r\n action$.pipe(\r\n ofType(ReportsActions.CREATE_TABLEAU_USER),\r\n switchMap(({payload}) =>\r\n Http.post(\r\n '/users',\r\n {username: payload.username, email: payload.email, securityContext: payload.context},\r\n {\r\n baseURL: AppSettings.BaseTableauProxyUrl\r\n }\r\n ).pipe(\r\n map(data => ReportsActions.createTableauUserSuccess(payload.username)),\r\n catchError(error => {\r\n if (error.status && error.status === 409) {\r\n return of(ReportsActions.createTableauUserSuccess(payload.username));\r\n }\r\n\r\n return of(ReportsActions.createTableauUserFailed(error));\r\n })\r\n )\r\n )\r\n );\r\n","import {of} from 'rxjs';\r\nimport {map, concatMap, flatMap, catchError} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\nimport * as AccountsActions from './accounts.actions';\r\n\r\nexport const CreateSubAccount = action$ =>\r\n action$.pipe(\r\n ofType(AccountsActions.CREATE_SUBACCOUNT),\r\n concatMap(action =>\r\n Http.post(`${AppSettings.IcebergApiUserInfoEndpoint}/accounts`, {\r\n name: action.payload.name,\r\n accessMode: 'discretionary'\r\n }).pipe(\r\n flatMap(data => {\r\n const id = data.href.split('/').pop();\r\n return of(AccountsActions.getAccount(id), AccountsActions.createSubAccountSuccess(data));\r\n }),\r\n catchError(error => of(AccountsActions.createSubAccountFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const UpdateSubAccount = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AccountsActions.UPDATE_SUBACCOUNT),\r\n concatMap(action =>\r\n Http.put(`${AppSettings.IcebergApiUserInfoEndpoint}/accounts/${action.payload.id}`, action.payload).pipe(\r\n flatMap(data =>\r\n of(\r\n AccountsActions.updateSubAccountSuccess(data),\r\n AccountsActions.getAccount(state$.value.accounts.viewing_account.id)\r\n )\r\n ),\r\n catchError(error => of(AccountsActions.updateSubAccountFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const GetAccount = action$ =>\r\n action$.pipe(\r\n ofType(AccountsActions.GET_ACCOUNT),\r\n concatMap(action =>\r\n Http.get(`${AppSettings.IcebergApiUserInfoEndpoint}/accounts/${action.payload.id}`).pipe(\r\n map(data => AccountsActions.getAccountSuccess(data)),\r\n catchError(error => of(AccountsActions.getAccountFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const UpdateInheritedRoles = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AccountsActions.UPDATE_INHERITED_ROLES),\r\n concatMap(action =>\r\n Http.put(`${AppSettings.IcebergApiUserInfoEndpoint}/accounts/${action.payload.account.id}`, {\r\n ...action.payload.account,\r\n inheritedRoles: action.payload.roles\r\n }).pipe(\r\n flatMap(data =>\r\n of(\r\n AccountsActions.updateInheritedRolesSuccess(data),\r\n AccountsActions.getAccount(state$.value.accounts.viewing_account.id)\r\n )\r\n ),\r\n catchError(error => of(AccountsActions.updateInheritedRolesFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const GetAccountRoles = action$ =>\r\n action$.pipe(\r\n ofType(AccountsActions.GET_ROLES),\r\n concatMap(() =>\r\n Http.get(`${AppSettings.BaseTugApiUrl}/roles`).pipe(\r\n map(data => AccountsActions.getAccountRolesSuccess(data)),\r\n catchError(error => of(AccountsActions.getAccountRolesFail(error)))\r\n )\r\n )\r\n );\r\n","import { of } from 'rxjs';\r\nimport { map, switchMap, catchError, mergeMap, exhaustMap } from 'rxjs/operators';\r\nimport { ofType } from 'redux-observable';\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\n\r\nimport * as UserActions from './user.actions';\r\nimport * as AppActions from '../app/app.actions';\r\nimport * as AccountsActions from '../accounts/accounts.actions';\r\nimport * as AttributeActions from '../attributes/attributes.action';\r\nimport * as SecurityGroupActions from '../security/security.action';\r\nimport * as TransferActions from '../transfer/transfer.actions';\r\nimport * as FavouriteActions from '../favourite/favourite.action';\r\n\r\nconst addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\nconst getRequiredActions = (permissions = []) => {\r\n const requiredActions = [\r\n AttributeActions.fetch(),\r\n SecurityGroupActions.fetch(),\r\n FavouriteActions.favouriteFetch(),\r\n ];\r\n\r\n if (permissions.includes('admin.roles')) {\r\n requiredActions.push(AccountsActions.getAccountRoles());\r\n }\r\n\r\n if (permissions.includes('devices.transfer')) {\r\n requiredActions.push(TransferActions.getTransferKeys());\r\n }\r\n\r\n return requiredActions;\r\n};\r\n\r\nexport const RequestUser = (action$) =>\r\n action$.pipe(\r\n ofType(UserActions.REQUEST_USER),\r\n switchMap(() =>\r\n Http.get('/api/users/me').pipe(\r\n map((data) => of(UserActions.requestUserSuccess(data))),\r\n catchError((error) => of(UserActions.requestUserFailed(error))),\r\n ),\r\n ),\r\n );\r\n\r\nexport const AfterRequestUserSuccess = (action$, state$) =>\r\n action$.pipe(\r\n ofType(UserActions.REQUEST_USER_SUCCESS),\r\n mergeMap(() => {\r\n const { user } = state$.value;\r\n\r\n // build action array that should run after getting user info and may required permission\r\n const requiredActions = getRequiredActions(user.permissions);\r\n\r\n const {\r\n claims: {\r\n data: { landingPage },\r\n },\r\n } = user;\r\n const page = AppSettings.LandingPages.find((page) => page.id === landingPage);\r\n\r\n if (page) {\r\n requiredActions.push(AppActions.redirectUser(page.state));\r\n }\r\n\r\n return of(...requiredActions, AppActions.localized());\r\n }),\r\n );\r\n\r\n/**\r\n * get all accounts that user can switch between\r\n * @param {*} action$\r\n */\r\nexport const RequestUserAccounts = (action$, state$) =>\r\n action$.pipe(\r\n ofType(\r\n UserActions.REQUEST_USER_SUCCESS,\r\n AccountsActions.CREATE_SUBACCOUNT_SUCCESS,\r\n AccountsActions.UPDATE_SUBACCOUNT_SUCCESS,\r\n ),\r\n switchMap(() =>\r\n Http.get(`${AppSettings.IcebergApiUserInfoEndpoint}/accounts/user`).pipe(\r\n map((data) => {\r\n const isAccessible = (account = {}) =>\r\n account.effectiveAccessMode && account.effectiveAccessMode !== 'unknown';\r\n // set property master name on every child\r\n const accounts = data.map((masterAcc) => ({\r\n ...masterAcc,\r\n accessible: isAccessible(masterAcc),\r\n accounts: (masterAcc.accounts || []).map((linkedAcc) => ({\r\n ...linkedAcc,\r\n accessible: isAccessible(linkedAcc),\r\n master: masterAcc.name,\r\n })),\r\n }));\r\n const flattenAccounts = accounts.concat(\r\n ...accounts.map((a) => {\r\n return a.accounts || [];\r\n }),\r\n );\r\n const currentUser = state$.value.user;\r\n const currentAccount = flattenAccounts.find((acc) => acc.id === currentUser.account.id);\r\n const memberShips = flattenAccounts.filter((acc) => isAccessible(acc));\r\n\r\n // create lookup table for current account and it's subaccounts\r\n const accountNameLookup = (currentAccount.accounts || []).reduce((acc, account) => {\r\n acc[account.id] = account.name;\r\n return acc;\r\n }, {});\r\n accountNameLookup[currentAccount.id] = currentAccount.name;\r\n\r\n if (currentAccount.attrs) {\r\n const {\r\n 'genie:providerId': genieProviderId,\r\n 'genie:parentId': genieParentId,\r\n } = currentAccount.attrs;\r\n\r\n if (genieProviderId || genieParentId) {\r\n addToDataLayer({\r\n event: 'accountInfo',\r\n data: { genieParentId, genieProviderId },\r\n });\r\n }\r\n }\r\n\r\n return UserActions.requestUserAccountsSuccess({\r\n accounts,\r\n currentAccount,\r\n memberShips,\r\n accountNameLookup,\r\n });\r\n }),\r\n catchError((error) => of(UserActions.requestUserAccountsFail(error))),\r\n ),\r\n ),\r\n );\r\n\r\nexport const RetrieveDataPointsDescriptors = (action$) =>\r\n action$.pipe(\r\n ofType(UserActions.REQUEST_DATAPOINTS_DESCRIPTORS),\r\n exhaustMap(() =>\r\n Http.get('/api/datapoints/descriptors').pipe(\r\n map((data) => UserActions.requestDatapointsDescriptorsSuccess(data)),\r\n catchError((error) => of(UserActions.requestDatapointsDescriptorsFail(error))),\r\n ),\r\n ),\r\n );\r\n","import {map} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport {FETCH_ATTRIBUTES_SUCCESS} from '../attributes/attributes.action';\r\nimport {SECURITY_GROUPS_RETRIEVED} from '../security/security.action';\r\nimport * as TableColumns from './table-columns.action';\r\nimport * as UserActions from '../user/user.actions';\r\n\r\nexport const mapToSetAttributes = action$ =>\r\n action$.pipe(ofType(FETCH_ATTRIBUTES_SUCCESS), map(action => TableColumns.setAttributes(action.payload)));\r\n\r\nexport const mapToSetSecurityGroups = action$ =>\r\n action$.pipe(ofType(SECURITY_GROUPS_RETRIEVED), map(action => TableColumns.setSecurityGroups(action.payload)));\r\n\r\nexport const mapToSetSetColumnVisibility = (action$, store$) =>\r\n action$.pipe(ofType(UserActions.REQUEST_USER_SUCCESS), map(() => TableColumns.setColumnVisiblity(store$.value.user)));\r\n","import {map} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport {SEARCH_SUCCESS} from '../search/search.action';\r\nimport * as FavouritesActions from '../favourite/favourite.action';\r\n\r\nimport * as HistoryActions from './history.action';\r\n\r\n//maps\r\nexport const mapSearchToAddHistoryActions = action$ =>\r\n action$.pipe(ofType(SEARCH_SUCCESS), map(action => HistoryActions.historyAdded(action.payload.query)));\r\n\r\n//to sync the history with favourite\r\nexport const mapToUpdateHistoryActions = (action$, state$) =>\r\n action$.pipe(\r\n ofType(\r\n HistoryActions.HISTORY_ADDED,\r\n FavouritesActions.FAVOURITE_ADD_SUCCESS,\r\n FavouritesActions.FAVOURITE_UPDATE_SUCCESS,\r\n FavouritesActions.FAVOURITE_REMOVE_SUCCESS,\r\n FavouritesActions.FAVOURITE_RESTORE_SUCCESS\r\n ),\r\n map(() => HistoryActions.historyUpdated(state$.value.favourites.list))\r\n );\r\n","// @ts-check\r\nimport {of} from 'rxjs';\r\nimport {map, switchMap, catchError} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport fileDownload from 'js-file-download';\r\n\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\n\r\nimport EquipmentSearchService from '../../equipment/services/equipment-search.service';\r\n\r\nimport {HISTORY_SELECTED} from '../history/history.action';\r\nimport {FAVOURITE_SELECTED} from '../favourite/favourite.action';\r\nimport {COLUMN_VISIBLE_TOGGLED} from '../table-columns/table-columns.action';\r\n\r\nimport * as Search from './search.action';\r\n\r\nimport {adaptFacets} from './search.state';\r\n\r\nimport {LOAD as REDUX_STORAGE_LOAD} from 'redux-storage';\r\n\r\nexport const mapToSearchRequested = action$ => {\r\n const actionTypes = [HISTORY_SELECTED, FAVOURITE_SELECTED];\r\n\r\n return action$.pipe(\r\n ofType(...actionTypes),\r\n map(action => Search.initiated(action.payload.search))\r\n );\r\n};\r\n\r\nexport const mapToUpdatePrerequisitesTOMakeNewSearch = (action$, store$) => {\r\n const actionTypes = [\r\n Search.QUERY_ADDED,\r\n Search.QUERY_REMOVED,\r\n Search.FACET_SELECTED,\r\n Search.FACET_DESELECTED,\r\n Search.TAG_FILTERS_UPDATED,\r\n Search.TAG_FILTER_ADDED,\r\n Search.TAG_FILTER_REMOVED,\r\n Search.FACET_DESELECTED_EXCLUSIVE,\r\n Search.FACET_SELECTED_EXCLUSIVE,\r\n Search.SEARCH_INITIATED,\r\n Search.ACCOUNT_ADDED,\r\n Search.ACCOUNT_REMOVED,\r\n Search.SEARCH_RESET,\r\n Search.SORT_UPDATED,\r\n Search.LAST_SEEN_UPDATED\r\n ];\r\n\r\n return action$.pipe(\r\n ofType(...actionTypes),\r\n map(() => {\r\n const {assets} = store$.value;\r\n const limit = assets.pageSize;\r\n const since = 0;\r\n return Search.updatePrerequisites({\r\n limit: limit,\r\n since: since,\r\n newSearch: true,\r\n resetSelectedAssets: true\r\n });\r\n })\r\n );\r\n};\r\n\r\nexport const mapToUpdatePrerequisitesToRefreshSearch = (action$, store$) => {\r\n const actionTypes = [COLUMN_VISIBLE_TOGGLED, Search.SEARCH_REFRESH, REDUX_STORAGE_LOAD];\r\n\r\n return action$.pipe(\r\n ofType(...actionTypes),\r\n map(() => {\r\n const {assets} = store$.value;\r\n const limit = assets.currentPage * assets.pageSize;\r\n const since = 0;\r\n return Search.updatePrerequisites({\r\n limit: limit,\r\n since: since\r\n });\r\n })\r\n );\r\n};\r\n\r\nexport const mapToSearchUpdated = action$ =>\r\n action$.pipe(\r\n ofType(Search.UPDATE_SEARCH_PREREQUISITES),\r\n map(() => Search.updated())\r\n );\r\n\r\nexport const mapToSearchBegin = action$ =>\r\n action$.pipe(\r\n ofType(Search.SEARCH_UPDATED),\r\n map(() => Search.requested())\r\n );\r\n\r\nconst buildFetchAssetsObject = store => {\r\n const {search} = store;\r\n const {sort, query, tagFilters, accounts, since, limit} = search;\r\n const options = {limit, since};\r\n const sortStringArray = [`${sort.name}:${sort.direction}`];\r\n const facets = adaptFacets(search);\r\n const accountsArray = accounts.filter(acc => acc._selected).map(acc => acc.id);\r\n let finalQuery = query || [];\r\n finalQuery = Array.isArray(query) ? query : [query];\r\n\r\n const assetQuery = EquipmentSearchService().buildAPIEquipmentFilterObject(\r\n finalQuery,\r\n options,\r\n null, // TODO: define default or determine if this is required\r\n null, // TODO: define default or determine if this is required\r\n facets,\r\n tagFilters,\r\n null, // TODO: define default or determine if this is required\r\n null, // TODO: define default or determine if this is required\r\n sortStringArray,\r\n accountsArray\r\n );\r\n\r\n return {\r\n columns: store.tableColumns.selected,\r\n filter: assetQuery\r\n };\r\n};\r\n\r\nexport const searchBegin = (action$, store$) =>\r\n action$.pipe(\r\n ofType(Search.SEARCH_REQUESTED),\r\n switchMap(() =>\r\n Http.post(`${AppSettings.BaseTugApiUrl}/assets`, buildFetchAssetsObject(store$.value)).pipe(\r\n map(data =>\r\n Search.searchSuccess({\r\n query: store$.value.search,\r\n data: data\r\n })\r\n ),\r\n catchError(error =>\r\n of(Search.searchFailure((error || {}).message || 'Whoops! Something went wrong. Please try again.'))\r\n )\r\n )\r\n )\r\n );\r\n\r\nexport const exportSearch = (action$, store$) =>\r\n action$.pipe(\r\n ofType(Search.SEARCH_EXPORT),\r\n switchMap(() =>\r\n Http.post(`${AppSettings.BaseTugApiUrl}/assets/export`, buildFetchAssetsObject(store$.value)).pipe(\r\n map(response => {\r\n fileDownload(response, 'search_export.csv');\r\n return Search.searchExportSuccess();\r\n }),\r\n catchError(() => of(Search.searchExportFailure()))\r\n )\r\n )\r\n );\r\n","import {of} from 'rxjs';\r\nimport {switchMap, catchError, map} from 'rxjs/operators';\r\n\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\n\r\nimport * as SecurityGroups from './security.action';\r\n\r\nconst extract = response => response.data;\r\n\r\nexport const fetch = action$ =>\r\n action$.pipe(\r\n ofType(SecurityGroups.SECURITY_GROUPS_RETRIEVAL_INITIATED),\r\n switchMap(() =>\r\n Http.get(`${AppSettings.IcebergApiUserInfoEndpoint}/groups`).pipe(\r\n map(data => SecurityGroups.fetchSuccess(extract(data))),\r\n catchError(error => of(SecurityGroups.fetchFailure(error)))\r\n )\r\n )\r\n );\r\n","import {of} from 'rxjs';\r\nimport {map, switchMap, catchError} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport Http from '../../http/http';\r\n\r\nimport * as SearchActions from '../search/search.action';\r\nimport * as FavouriteActions from './favourite.action';\r\nconst FAV_URL = '/api/search/favourites';\r\n\r\nexport const fetch = action$ => {\r\n return action$.pipe(\r\n ofType(FavouriteActions.FAVOURITES_FETCH_INITIATED),\r\n switchMap(() =>\r\n Http.get(FAV_URL).pipe(\r\n map(response => FavouriteActions.favouriteFetchSuccess(response)),\r\n catchError(error => of(FavouriteActions.favouriteFetchFailed(error)))\r\n )\r\n )\r\n );\r\n};\r\n\r\nexport const audit = action$ =>\r\n action$.pipe(\r\n ofType(SearchActions.SEARCH_SUCCESS),\r\n map(({payload}) => FavouriteActions.audit(payload.query))\r\n );\r\n\r\nexport const save = action$ =>\r\n action$.pipe(\r\n ofType(FavouriteActions.FAVOURITE_ADDED),\r\n switchMap(({payload}) =>\r\n Http.post(FAV_URL, {name: payload.name, search: payload.search}).pipe(\r\n map(response => FavouriteActions.favouriteAddSuccess(response)),\r\n catchError(error => of(FavouriteActions.favouriteAddFailed(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const update = action$ =>\r\n action$.pipe(\r\n ofType(FavouriteActions.FAVOURITE_UPDATED),\r\n switchMap(({payload}) =>\r\n Http.put(`${FAV_URL}/${payload.id}`, payload).pipe(\r\n map(response => FavouriteActions.favouriteUpdateSuccess(response)),\r\n catchError(error => of(FavouriteActions.favouriteUpdateFailed(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const remove = action$ =>\r\n action$.pipe(\r\n ofType(FavouriteActions.FAVOURITE_REMOVED),\r\n switchMap(({payload}) =>\r\n Http.delete(`${FAV_URL}/${payload.id}`).pipe(\r\n map(response => FavouriteActions.favouriteRemoveSuccess(response)),\r\n catchError(error => of(FavouriteActions.favouriteRemoveFailed(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const restore = action$ =>\r\n action$.pipe(\r\n ofType(FavouriteActions.FAVOURITE_RESTORE),\r\n switchMap(({payload}) =>\r\n Http.patch(FAV_URL, [{name: 'restore', id: payload}]).pipe(\r\n map(response => FavouriteActions.favouriteRestoreSuccess(response)),\r\n catchError(error => of(FavouriteActions.favouriteRestoreFailed(error)))\r\n )\r\n )\r\n );\r\n","import {map} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport * as SearchActions from '../search/search.action';\r\nimport * as AssetActions from './assets.action';\r\n\r\n// update since/limit and kick the search\r\nexport const mapToSearchPrerequisitesToGetMore = (action$, store$) =>\r\n action$.pipe(\r\n ofType(AssetActions.PAGE_SELECTED, AssetActions.PAGESIZE_UPDATED),\r\n map(() => {\r\n const {assets} = store$.value;\r\n const limit = assets.pageSize;\r\n const since = (assets.currentPage - 1) * assets.pageSize;\r\n return SearchActions.updatePrerequisites({\r\n limit: limit,\r\n since: since\r\n });\r\n })\r\n );\r\n","import {of, forkJoin} from 'rxjs';\r\nimport {concatMap, catchError} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\n\r\nimport * as Attributes from './attributes.action';\r\nimport {ASSET_TYPE_ATTRIBUTE} from '../../api/assetTypeAttribute';\r\n\r\nconst extract = response => response.data;\r\n\r\nconst attrSources = [\r\n Http.get(AppSettings.IcebergApiAttributesEndpoint + '/attrs').pipe(\r\n catchError(error => of(Attributes.fetchFailure(error)))\r\n ),\r\n Http.get(`${AppSettings.BaseTugApiUrl}/config/attribute/security`).pipe(\r\n catchError(error => of(Attributes.fetchSecurityFailure(error)))\r\n )\r\n];\r\n\r\nfunction titleCase(str) {\r\n if (!str) return '';\r\n\r\n return str\r\n .toLowerCase()\r\n .split(' ')\r\n .map(word => word.replace(word[0], word[0].toUpperCase()))\r\n .join(' ');\r\n}\r\n\r\nconst toFullAttribute = readonlyAttr => ({\r\n key: titleCase(readonlyAttr),\r\n dataType: 'Text',\r\n freeform: true,\r\n id: readonlyAttr.toUpperCase(), // downstream components access this directly, breaks ngRepeat if not unique\r\n range: {} // downstream components access this directly :(\r\n});\r\n\r\nexport const fetch = action$ =>\r\n action$.pipe(\r\n ofType(Attributes.FETCH_ATTRIBUTES_BEGIN, Attributes.ATTRIBUTE_CREATED, Attributes.ATTRIBUTE_REMOVED),\r\n concatMap(() => forkJoin(attrSources)), // any of the above will kick off re-retrieve of attrs and attr security\r\n concatMap(([attributeResponse, attributeSecurity]) => {\r\n let attributes = extract(attributeResponse);\r\n\r\n // Yank out readonly attributes\r\n const readonly = Object.keys(attributeSecurity)\r\n .filter(key => attributeSecurity.hasOwnProperty(key))\r\n .filter(key => Array.isArray(attributeSecurity[key]) && attributeSecurity[key].indexOf('readonly') !== -1)\r\n .map(key => key.toLowerCase());\r\n\r\n const attrSecurityRules = {\r\n readonly\r\n };\r\n\r\n const readonlyAsAttrs = readonly.map(toFullAttribute);\r\n // Put readonly attributes into collection if they are not already present in existing attribute definitions\r\n attributes = attributes.concat(readonlyAsAttrs.filter(item => attributes.indexOf(item) === -1));\r\n\r\n // Add asset type attribute\r\n //attributes = attributes.concat(ASSET_TYPE_ATTRIBUTE);\r\n\r\n return of(Attributes.fetchSuccess(attributes), Attributes.fetchSecuritySuccess(attrSecurityRules));\r\n })\r\n );\r\n","import * as TransferActions from './transfer.actions';\r\n\r\nexport const INITIAL_STATE = {\r\n transferkeys: [],\r\n transferAssets: [],\r\n transferStatus: undefined\r\n};\r\n\r\nexport const TRANSFER_STATE_NAME = 'transfer';\r\n\r\nexport const TransferStatusEnum = Object.freeze({\r\n TRANSFERRING: 'transferring',\r\n SUCCESS: 'success',\r\n FAILED: 'failed',\r\n PART_FAILED: 'part_failed'\r\n});\r\n\r\nclass AssetTransfer {\r\n constructor(asset = {}) {\r\n this.id = asset.id;\r\n this.name = asset.name || asset.id;\r\n this.installationId = '';\r\n this.status = TransferStatusEnum.TRANSFERRING;\r\n this.message = '';\r\n }\r\n\r\n updateFromInstallations(Installations = []) {\r\n const installation = Installations.find(install => install.equipment.id === this.id);\r\n if (installation) {\r\n this.installationId = installation.id;\r\n } else {\r\n this.installationId = '';\r\n this.updateStatus('failed', 'Unable to get asset installation');\r\n }\r\n }\r\n\r\n updateStatus(status, message) {\r\n this.status = status;\r\n this.message = message;\r\n }\r\n}\r\n\r\nconst getTransferringStatus = (transferAssetsList = []) => {\r\n let transferStatus = undefined;\r\n if (transferAssetsList.length > 0) {\r\n //note every will return true on empty array\r\n if (transferAssetsList.filter(asset => asset.status === TransferStatusEnum.TRANSFERRING).length > 0) {\r\n transferStatus = TransferStatusEnum.TRANSFERRING;\r\n } else if (transferAssetsList.every(asset => asset.status === TransferStatusEnum.SUCCESS)) {\r\n transferStatus = TransferStatusEnum.SUCCESS;\r\n } else if (transferAssetsList.every(asset => asset.status === TransferStatusEnum.FAILED)) {\r\n transferStatus = TransferStatusEnum.FAILED;\r\n } else {\r\n transferStatus = TransferStatusEnum.PART_FAILED;\r\n }\r\n }\r\n\r\n return transferStatus;\r\n};\r\n\r\nexport default (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case TransferActions.TRANSFER_ASSETS: {\r\n const newtransferAssets = state.transferAssets.map(asset => {\r\n asset.updateFromInstallations(payload.installations);\r\n return asset;\r\n });\r\n return {\r\n ...state,\r\n transferAssets: newtransferAssets,\r\n transferStatus: getTransferringStatus(newtransferAssets)\r\n };\r\n }\r\n case TransferActions.INITIATE_ASSET_TRANSFER: {\r\n const newtransferAssets = payload.assets.map(asset => new AssetTransfer(asset));\r\n return {\r\n ...state,\r\n transferAssets: newtransferAssets,\r\n transferStatus: getTransferringStatus(newtransferAssets)\r\n };\r\n }\r\n case TransferActions.INITIATE_ASSET_TRANSFER_FAIL: {\r\n const error = 'Failed to get installation';\r\n const newtransferAssets = state.transferAssets.map(asset => {\r\n asset.updateStatus(TransferStatusEnum.FAILED, error);\r\n return asset;\r\n });\r\n return {\r\n ...state,\r\n transferAssets: newtransferAssets,\r\n transferStatus: getTransferringStatus(newtransferAssets)\r\n };\r\n }\r\n case TransferActions.TRANSFER_ASSET_SUCCESS: {\r\n const newtransferAssets = state.transferAssets.map(transfer => {\r\n if (payload && transfer.installationId === payload) {\r\n transfer.updateStatus(TransferStatusEnum.SUCCESS, 'Transfer completed successfully');\r\n }\r\n return transfer;\r\n });\r\n return {\r\n ...state,\r\n transferAssets: newtransferAssets,\r\n transferStatus: getTransferringStatus(newtransferAssets)\r\n };\r\n }\r\n case TransferActions.TRANSFER_ASSET_FAIL: {\r\n let errorMessage = 'Transferring Assets failed.';\r\n let {data} = payload.error;\r\n if (data && data.Message) {\r\n errorMessage = data.Message;\r\n }\r\n const newtransferAssets = state.transferAssets.map(transfer => {\r\n if (payload.installationId && transfer.installationId === payload.installationId) {\r\n transfer.updateStatus(TransferStatusEnum.FAILED, errorMessage);\r\n }\r\n return transfer;\r\n });\r\n\r\n return {\r\n ...state,\r\n transferAssets: newtransferAssets,\r\n transferStatus: getTransferringStatus(newtransferAssets)\r\n };\r\n }\r\n case TransferActions.RESET_TRANSFERS: {\r\n const notTransferring = state.transferStatus !== TransferStatusEnum.TRANSFERRING;\r\n return {\r\n ...state,\r\n transferAssets: notTransferring ? [] : state.transferAssets,\r\n transferStatus: notTransferring ? undefined : state.transferStatus\r\n };\r\n }\r\n case TransferActions.GET_TRANSFERKEYS_SUCCESS: {\r\n const {transferKeys = []} = payload;\r\n return {\r\n ...state,\r\n transferkeys: transferKeys.filter(\r\n key => key.permissions && key.permissions.resources && key.permissions.resources.includes('installations')\r\n )\r\n };\r\n }\r\n case TransferActions.GET_TRANSFERKEYS_FAIL: {\r\n return {\r\n ...state,\r\n transfer_error: payload\r\n };\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {of, empty} from 'rxjs';\r\nimport {map, concatMap, exhaustMap, catchError, delay, filter} from 'rxjs/operators';\r\nimport {ofType} from 'redux-observable';\r\n\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\nimport * as TransferActions from './transfer.actions';\r\nimport * as AssetActions from '../assets/assets.action';\r\nimport * as SearchActions from '../search/search.action';\r\nimport {TransferStatusEnum} from './transfer.reducer';\r\n\r\nexport const GetAccountTransferKeys = action$ =>\r\n action$.pipe(\r\n ofType(TransferActions.GET_TRANSFERKEYS),\r\n concatMap(() =>\r\n Http.get(`${AppSettings.IcebergApiTransfersEndpoint}/keys`).pipe(\r\n map(data => TransferActions.getTransferKeysSuccess(data)),\r\n catchError(error => of(TransferActions.getTransferKeysFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const InitiateAssetTransfer = action$ =>\r\n action$.pipe(\r\n ofType(TransferActions.INITIATE_ASSET_TRANSFER),\r\n concatMap(action =>\r\n Http.post(`${AppSettings.IcebergApiInstallationsEndpoint}/installations/_filter`, {\r\n criteria: {\r\n equipmentIds: action.payload.assets.map(asset => asset.id)\r\n }\r\n }).pipe(\r\n map(response => TransferActions.transferAssets(action.payload.key, response)),\r\n catchError(error => of(TransferActions.initiateAssetTransferFail(error)))\r\n )\r\n )\r\n );\r\n\r\nexport const TransferAssets = action$ =>\r\n action$.pipe(\r\n ofType(TransferActions.TRANSFER_ASSETS),\r\n exhaustMap(action => {\r\n const transferResource = action.payload.installations.map(install => ({\r\n key: action.payload.key,\r\n href: install.href,\r\n id: install.id\r\n }));\r\n return of(...transferResource).pipe(\r\n delay(250),\r\n concatMap(installation =>\r\n Http.post(`${AppSettings.IcebergApiTransfersEndpoint}/transfers`, {\r\n key: {key: action.payload.key},\r\n resource: {href: installation.href}\r\n }).pipe(\r\n map(() => TransferActions.transferAssetSuccess(installation.id)),\r\n catchError(error => of(TransferActions.transferAssetFail(installation.id, error)))\r\n )\r\n )\r\n );\r\n })\r\n );\r\n\r\n//after all transfers done => update deselect transferd assets the refresh the data\r\nexport const AfterTransferAssets = (action$, store$) =>\r\n action$.pipe(\r\n ofType(TransferActions.TRANSFER_ASSET_FAIL, TransferActions.TRANSFER_ASSET_SUCCESS),\r\n filter(() => store$.value.transfer.transferStatus !== TransferStatusEnum.TRANSFERRING),\r\n concatMap(() => {\r\n const {assets, transfer} = store$.value;\r\n const {selections = []} = assets;\r\n const {transferAssets = []} = transfer;\r\n\r\n const successTransferAssetsIds = transferAssets\r\n .filter(transfer => transfer.status === TransferStatusEnum.SUCCESS)\r\n .map(transfer => transfer.id);\r\n\r\n // remove transferrd assets from the selections\r\n const newSelections = selections.filter(asset => !successTransferAssetsIds.includes(asset.id));\r\n return successTransferAssetsIds.length > 0\r\n ? of(AssetActions.select(newSelections), SearchActions.refresh())\r\n : empty();\r\n })\r\n );\r\n","import {gettext} from './../gettext-extract-util';\r\n\r\nexport const ASSET_DETAILS_STATE_NAME = 'asset_details';\r\n\r\nclass Status {\r\n constructor(key, description, cssClass) {\r\n this.key = key;\r\n this.description = description;\r\n this.cssClass = cssClass;\r\n }\r\n}\r\nconst keyStatusMap = {\r\n no_alerts: new Status('no-alerts', '', 'no-alerts'),\r\n high: new Status('high', gettext('High'), 'high-alert'),\r\n medium: new Status('medium', gettext('Medium'), 'medium-alert'),\r\n low: new Status('low', gettext('Low'), 'low-alert'),\r\n due: new Status('due', gettext('Due'), 'high-alert'),\r\n upcoming: new Status('upcoming', gettext('Upcoming'), 'low-alert'),\r\n no_maintenance: new Status('no_maintenance', gettext('No Maintenance'), 'no-alerts'),\r\n loading: new Status('loading', gettext('loading...'), 'fa-spin')\r\n};\r\nexport class StatusSummary {\r\n constructor(total, statusKey) {\r\n this.total = total;\r\n this.setStatus(statusKey);\r\n }\r\n\r\n setStatus(statusKey) {\r\n const {description, cssClass} = keyStatusMap[statusKey] || {};\r\n this.cssClass = cssClass;\r\n this.key = statusKey;\r\n this.label = description;\r\n }\r\n}\r\n\r\nexport class AssetModel {\r\n constructor() {\r\n this.id = null;\r\n this.name = '';\r\n this.make = '';\r\n this.model = '';\r\n this.year = '';\r\n this.esn = '';\r\n this.profileImage = null;\r\n this.communicatedAt = null;\r\n this.createdAt = null;\r\n this.attrs = {};\r\n\r\n this.canPollData = false;\r\n this.showLocation = false;\r\n this.coords = [];\r\n this.device = {};\r\n this.faults = [];\r\n this.images = [];\r\n this.installation = {};\r\n this.maintenancePlans = [];\r\n this.series = [];\r\n this.defaultChartedseriesIds = [];\r\n // object will contain selected series with their data\r\n this.seriesData = {};\r\n this.locationSeries = null;\r\n // this.onei3.series = {};\r\n this.users = [];\r\n this.alerts = [];\r\n this.attributes = [];\r\n this.datapointDisplay = {};\r\n this.deviceCommands = null;\r\n this.alertStatus = new StatusSummary(undefined, 'loading');\r\n this.maintenanceStatus = new StatusSummary(undefined, 'loading');\r\n this.attributes = [];\r\n this.syncRunHours = null;\r\n this.hasCommandsToDisplay = false;\r\n this.hasSetAccumulatorCommand = false;\r\n //do need this\r\n //this.relationships = {};\r\n }\r\n}\r\n\r\nexport class DateRange {\r\n constructor(startDate, endDate, option) {\r\n this.option = option;\r\n this.start = startDate;\r\n this.end = endDate;\r\n }\r\n}\r\n\r\nexport class AssetDetailsState {\r\n constructor() {\r\n this.refreshing = false;\r\n this.selectedSeriesIds = [];\r\n this.loading = false;\r\n this.error = '';\r\n this.asset = new AssetModel();\r\n this.dataDateRange = undefined;\r\n this.seriesDataStatus = {chartLoading: false, valuesLoading: false};\r\n this.activeDataTap = 'chart';\r\n }\r\n}\r\n\r\nexport const INITIAL_STATE = new AssetDetailsState();\r\n\r\n//array of paths to keys need to be saved\r\nexport const AssetDetailWhiteListKeys = [];\r\n","import { sortBy, get } from 'lodash-es';\r\nimport moment from 'moment';\r\nimport { AssetModel, StatusSummary, DateRange } from './asset-details.state';\r\nimport * as EquipmentServiceUtil from '../../api/equipment.service.util';\r\nimport { lowerCaseKeysObject } from '../../utility/object.util.service';\r\n\r\n//The list below are the names of datapoints in priority order\r\nconst RUN_HOURS_DATAPOINTS = [\r\n 'unit_hour_meter',\r\n 'engine_hour_meter',\r\n 'eng_hrs_1',\r\n 'eng_hrs_2',\r\n 'ignition_run_hours',\r\n 'run_hour',\r\n 'run_time',\r\n 'mach_hours',\r\n];\r\nconst OPERATIONAL_HOURS = 'operating_hours';\r\nconst GPS_DATA_POINT = 'gps';\r\nconst FAULT_DATA_POINT = 'dtc';\r\nconst EXCLUDED_COMMANDS = ['communication_mode', 'set_accumulator'];\r\n\r\n//function to build url for getting asset\r\nexport const BuildUri = (endpoint = '', equipmentId, includes = []) => {\r\n const includesUri = includes.map((include) => `include=${include}`).join('&');\r\n return `${endpoint}/${equipmentId}?${includesUri}`;\r\n};\r\n\r\n/**\r\n * Helper class to help make the transtion between api model and asset state model\r\n */\r\n\r\nexport class AssetModelHelper {\r\n static updateFromJsonApi(assetModel = {}, apiModel = {}, user = {}, includedTypes = []) {\r\n const { included = [], data = {} } = apiModel;\r\n const { id, attributes = {}, relationships = {} } = data;\r\n const { attrs = {}, communicatedAt, coords = [], createdAt, name } = attributes;\r\n const { datapointDisplay = {}, deviceCommands = {}, profileImage = {} } = relationships;\r\n\r\n const { datapointDescriptors, visibleDatapoints = [], permissions } = user;\r\n const userVisibleDatapointIds = visibleDatapoints.map((datapoint) => datapoint.id);\r\n\r\n const asset = assetModel.id === id ? { ...assetModel } : new AssetModel();\r\n asset.id = id;\r\n asset.name = name;\r\n asset.createdAt = createdAt;\r\n asset.showLocation = userVisibleDatapointIds.includes(GPS_DATA_POINT);\r\n asset.coords = asset.showLocation ? coords : null;\r\n asset.communicatedAt = communicatedAt;\r\n\r\n const normalizedAttrs = lowerCaseKeysObject(attrs);\r\n asset.make = normalizedAttrs.make;\r\n asset.model = normalizedAttrs.model;\r\n asset.year = normalizedAttrs['model year'];\r\n asset.esn = normalizedAttrs['onei3:serial'];\r\n\r\n asset.datapointDisplay = datapointDisplay;\r\n asset.attrs = attrs;\r\n asset.networkTechnology = attributes.networkTechnology;\r\n\r\n const flattenIncluded = this.flattenIncludedObjects(included);\r\n if (includedTypes.includes('images')) {\r\n asset.images = this.getIncludedType('image', flattenIncluded);\r\n const { data: imageData = {} } = profileImage;\r\n asset.profileImage = this.getProfileImg(asset.images, imageData.id);\r\n }\r\n [asset.installation] = this.getIncludedType('installation', flattenIncluded);\r\n [asset.device] = this.getIncludedType('device', flattenIncluded);\r\n\r\n const [includedPackages] = this.getIncludedType('package', flattenIncluded);\r\n const { packages = [] } = includedPackages || {};\r\n asset.packages = packages;\r\n asset.syncRunHours = this.getSyncRunHours(packages);\r\n\r\n if (includedTypes.includes('maintenancePlans')) {\r\n const allMaintenancePlans = this.getIncludedType('maintenancePlan', flattenIncluded);\r\n const { maintenanceStatus, maintenancePlans } = this.getMaintenance(allMaintenancePlans);\r\n asset.maintenancePlans = maintenancePlans;\r\n asset.maintenanceStatus = maintenanceStatus;\r\n }\r\n if (includedTypes.includes('users')) {\r\n asset.users = this.getIncludedType('user', flattenIncluded);\r\n }\r\n if (includedTypes.includes('deviceCommands')) {\r\n asset.deviceCommands = deviceCommands.data || [];\r\n asset.canPollData = this.isPollCommandAvailable(asset.deviceCommands, permissions);\r\n asset.hasSetAccumulatorCommand = !!asset.deviceCommands.find(\r\n (deviceCommand) => deviceCommand.id === 'set_accumulator',\r\n );\r\n\r\n //show command tab for command type control or configure with some excptions\r\n asset.hasCommandsToDisplay =\r\n asset.deviceCommands.filter(\r\n (command) =>\r\n (command.commandType === 'control' || command.commandType === 'configure') &&\r\n !EXCLUDED_COMMANDS.includes(command.id),\r\n ).length > 0;\r\n }\r\n if (includedTypes.includes('series')) {\r\n const includedSeries = this.getIncludedType('series', flattenIncluded);\r\n const orderedSeriesList = this.applyDataPointDisplay(includedSeries, datapointDisplay);\r\n const { series, gpsSeries } = this.filterSeries(orderedSeriesList);\r\n asset.series = series;\r\n asset.locationSeries = gpsSeries;\r\n asset.defaultChartedseriesIds = series\r\n .filter((ser) => ser.keyMetric && ser.communicatedIn_30d)\r\n .map((s) => s.id);\r\n }\r\n if (includedTypes.includes('faults')) {\r\n const faultSeries = this.getIncludedType('fault', flattenIncluded);\r\n asset.faults = this.getActivFaultsAndApplyDecsriptors(faultSeries, datapointDescriptors);\r\n }\r\n if (includedTypes.includes('alerts')) {\r\n const includedAlerts = this.getIncludedType('alertOccurence', flattenIncluded);\r\n const { validAlerts = [], alertsStatus } = this.validateAlertsAndApplyDescriptor(\r\n includedAlerts,\r\n userVisibleDatapointIds,\r\n datapointDescriptors,\r\n );\r\n asset.alerts = validAlerts;\r\n asset.alertStatus = alertsStatus;\r\n }\r\n if (includedTypes.includes('attributes')) {\r\n const includedAttributes = this.getIncludedType('attribute', flattenIncluded);\r\n asset.attributes = this.buildAttrsAsAttributesObject(attrs, includedAttributes);\r\n }\r\n\r\n return asset;\r\n }\r\n\r\n /**\r\n * flatten nested attributes object in included\r\n * @param {*} includedList\r\n */\r\n static flattenIncludedObjects(includedList = []) {\r\n return includedList.map((included) => {\r\n const { attributes, ...rest } = included;\r\n return { ...rest, ...attributes };\r\n });\r\n }\r\n static getIncludedType(includedType, includedList = []) {\r\n return includedList.filter((included) => included.type === includedType);\r\n }\r\n static getProfileImg(images = [], profileImageId) {\r\n return images.find((e) => e.id === profileImageId);\r\n }\r\n static isPollCommandAvailable(deviceCommands = [], userPermissions = []) {\r\n return (\r\n !!deviceCommands.find((deviceCommand) => deviceCommand.id === 'poll') &&\r\n userPermissions.includes('commands.query')\r\n );\r\n }\r\n\r\n /**\r\n * return an object for fault series, gps data point,and other series\r\n * find run hours series and tag it with chosenRunHours\r\n * @param {*} seriesList\r\n */\r\n static filterSeries(seriesList = []) {\r\n const foundRunHoursDataPoints = {};\r\n const seriesWithoutGps = [];\r\n const faultSeries = [];\r\n let gpsSeries = null;\r\n let operatingHours = null;\r\n\r\n seriesList.forEach((series) => {\r\n const { dataId, descriptor = {}, attrs = {}, last = null } = series;\r\n //override series title with descriptor one\r\n if (descriptor.title) {\r\n series.title = descriptor.title;\r\n }\r\n if (last) {\r\n //set flag on the series indecate that series has recent data(within 30 day)\r\n series.communicatedIn_30d = DateRangeHelper.isDateWithinThirtyDayfromToday(last.t);\r\n }\r\n\r\n //if series has attr(onei3:dp_std=operating_hours) then it will be the chosen run hours\r\n if (attrs && attrs['onei3:dp_std'] === OPERATIONAL_HOURS) {\r\n operatingHours = series;\r\n }\r\n const indexOfRunHours = RUN_HOURS_DATAPOINTS.indexOf(dataId);\r\n if (indexOfRunHours !== -1) {\r\n foundRunHoursDataPoints[indexOfRunHours] = series;\r\n }\r\n if (dataId === GPS_DATA_POINT) {\r\n gpsSeries = { ...series };\r\n } else if (dataId === FAULT_DATA_POINT) {\r\n faultSeries.push(series);\r\n } else {\r\n seriesWithoutGps.push(series);\r\n }\r\n });\r\n\r\n //if we did not find operatingHours by attr, try to find it by the predefind list\r\n if (operatingHours === null) {\r\n //get lowest index as it has high priorty based on the RUN_HOURS_DATAPOINTS list above\r\n const [lowestIndex = -1] = Object.keys(foundRunHoursDataPoints).sort();\r\n operatingHours = lowestIndex > -1 ? foundRunHoursDataPoints[lowestIndex] : null;\r\n }\r\n //tag chosenOperatingHours seriers with chosenRunHours prop\r\n if (operatingHours) {\r\n const runhourindex = seriesWithoutGps.findIndex((series) => series.id === operatingHours.id);\r\n if (runhourindex !== -1) {\r\n seriesWithoutGps[runhourindex].chosenRunHours = true;\r\n }\r\n }\r\n\r\n return { series: seriesWithoutGps, gpsSeries: gpsSeries, faultSeries: faultSeries };\r\n }\r\n static applyDataPointDisplay(seriesList = [], datapointDisplay = {}) {\r\n const displayItems = get(datapointDisplay, 'data.attributes.displayItems', []);\r\n if (displayItems.length > 0) {\r\n seriesList.forEach((series) => {\r\n const matchingDisplayItem = displayItems.find((item) => item.dataId === series.dataId);\r\n if (matchingDisplayItem) {\r\n series.display = matchingDisplayItem.visible;\r\n series.order = matchingDisplayItem.ordinal;\r\n series.keyMetric = matchingDisplayItem.keyMetric;\r\n series.decimals = matchingDisplayItem.decimals;\r\n series.displayItem = matchingDisplayItem;\r\n } else {\r\n series.display = true;\r\n series.order = 999;\r\n series.keyMetric = false;\r\n series.decimals = 2;\r\n }\r\n });\r\n }\r\n //order the array by order\r\n const orderedseriesList = sortBy(seriesList, (series) => series.order);\r\n\r\n return orderedseriesList;\r\n }\r\n\r\n /**\r\n * create fault code then override the fault seriers title\r\n * @param {*} faultSeries dtc seriers\r\n * @param {*} descriptors\r\n */\r\n static setFaultDtcDescription(faultSeries, descriptors) {\r\n if (faultSeries) {\r\n faultSeries.dtcFaultDescriptor = EquipmentServiceUtil.findFaultDtcDescriptor(\r\n faultSeries,\r\n descriptors,\r\n );\r\n faultSeries.title = EquipmentServiceUtil.formatFaultCode(faultSeries) || faultSeries.title;\r\n }\r\n return faultSeries;\r\n }\r\n\r\n /**\r\n * filter the list based on user visible data points and create fault code for dtc ones\r\n * @param {*} alertsList\r\n * @param {*} userVisibleDatapoint\r\n * @param {*} descriptors\r\n */\r\n static validateAlertsAndApplyDescriptor(\r\n alertsList = [],\r\n userVisibleDatapointIds = [],\r\n descriptors,\r\n ) {\r\n const activeHighAlerts = [];\r\n const activeMeduimAlerts = [];\r\n const activeLowAlerts = [];\r\n const validAlerts = [];\r\n alertsList.forEach((alert) => {\r\n const { series = {}, priority = '', state = '' } = alert;\r\n const alertPriority = priority.toLowerCase();\r\n const alertState = state.toLowerCase();\r\n //assuming the datapoint id is first element in tags array\r\n const [datapintId] = series.tags;\r\n if (userVisibleDatapointIds.includes(datapintId)) {\r\n //set code format and descriptor for fault alerts\r\n if (datapintId === FAULT_DATA_POINT) {\r\n alert.series = this.setFaultDtcDescription(series, descriptors);\r\n if (alert.series.dtcFaultDescriptor && alert.series.dtcFaultDescriptor.title) {\r\n alert.series.faultDescription = alert.series.dtcFaultDescriptor.title;\r\n }\r\n }\r\n validAlerts.push(alert);\r\n //to calculate the overall status on active alert only not returned\r\n if (alertState === 'active') {\r\n //filter alerts based on priority\r\n if (alertPriority === 'high') {\r\n activeHighAlerts.push(alert);\r\n } else if (alertPriority === 'medium') {\r\n activeMeduimAlerts.push(alert);\r\n } else {\r\n activeLowAlerts.push(alert);\r\n }\r\n }\r\n }\r\n });\r\n const activeAlerts = [...activeHighAlerts, ...activeMeduimAlerts, ...activeLowAlerts];\r\n\r\n //status is the heighest alert Priority found\r\n let alertsStatus = new StatusSummary(activeAlerts.length);\r\n if (activeHighAlerts.length > 0) {\r\n alertsStatus.setStatus('high');\r\n } else if (activeMeduimAlerts.length > 0) {\r\n alertsStatus.setStatus('medium');\r\n } else if (activeLowAlerts.length > 0) {\r\n alertsStatus.setStatus('low');\r\n }\r\n\r\n return { validAlerts, alertsStatus };\r\n }\r\n\r\n /**\r\n * retrun active fauts (value =1) then format fault code and get fault description\r\n * @param {*} faultsSeriesList\r\n * @param {*} descriptors\r\n */\r\n static getActivFaultsAndApplyDecsriptors(faultsSeriesList = [], descriptors) {\r\n return faultsSeriesList\r\n .filter(({ last }) => last && last.v)\r\n .map((fault) => this.setFaultDtcDescription(fault, descriptors));\r\n }\r\n\r\n static getMaintenance(maintenancePlans = []) {\r\n const dueMaintenance = [];\r\n const comingMaintenance = [];\r\n maintenancePlans.forEach((item) => {\r\n const { meta, ...rest } = item;\r\n item = { ...rest, ...meta };\r\n const statusCode = get(item, 'status.code', '').toLowerCase();\r\n if (statusCode === 'due') {\r\n dueMaintenance.push(item);\r\n } else if (statusCode === 'upcoming') {\r\n comingMaintenance.push(item);\r\n }\r\n });\r\n\r\n const activeMaitenance = [...dueMaintenance, ...comingMaintenance];\r\n\r\n const maintenanceStatus = new StatusSummary(activeMaitenance.length, 'no_maintenance');\r\n if (dueMaintenance.length > 0) {\r\n maintenanceStatus.setStatus('due');\r\n } else if (comingMaintenance.length > 0) {\r\n maintenanceStatus.setStatus('upcoming');\r\n }\r\n return { maintenanceStatus, maintenancePlans: activeMaitenance };\r\n }\r\n\r\n static buildAttrsAsAttributesObject(assetAttrs = {}, attributes = []) {\r\n let indexedAttributes = attributes.reduce((indexed, attribute) => {\r\n const key = attribute.key.toLowerCase();\r\n indexed[key] = attribute;\r\n return indexed;\r\n }, {});\r\n\r\n const assetAttributes = Object.keys(assetAttrs)\r\n .filter((key) => key && key.indexOf('onei3:') === -1)\r\n .map((attrKey) => ({\r\n key: attrKey,\r\n value: assetAttrs[attrKey],\r\n dataType: indexedAttributes[attrKey.toLowerCase()]\r\n ? indexedAttributes[attrKey.toLowerCase()].dataType\r\n : null,\r\n }));\r\n\r\n return assetAttributes;\r\n }\r\n\r\n static validateAssetDataIntegrity(returndSeries = [], assetSeries = []) {\r\n const isAssetDataUptodate = returndSeries\r\n .map((item) => item.series)\r\n .every((series) => {\r\n const seriesInAssetObject = assetSeries.find((s) => s.id === series.id) || {};\r\n if (series.last || seriesInAssetObject.last) {\r\n return series.last.t === seriesInAssetObject.last.t;\r\n }\r\n return true;\r\n });\r\n return isAssetDataUptodate;\r\n }\r\n\r\n /**\r\n * return data point id that allow sync run hours\r\n */\r\n static getSyncRunHours(packages = [], device = {}) {\r\n // const m5device = (device.attrs.model || '').toLowerCase().startsWith('m5s');\r\n const pkgWithSyncDatapoint = packages.find((pkg) => pkg.allowsRunHoursSync);\r\n if (pkgWithSyncDatapoint) {\r\n return pkgWithSyncDatapoint.runHoursSync;\r\n }\r\n return null;\r\n }\r\n\r\n static addOrUpdateSeriesData(source, series, data = [], datafor, rollup) {\r\n const dataOjectForcurrentSeries = source[series.id] ? source[series.id] : {};\r\n switch (datafor) {\r\n case 'chart': {\r\n dataOjectForcurrentSeries.series = series;\r\n dataOjectForcurrentSeries.chartRollup = rollup;\r\n dataOjectForcurrentSeries.chartData = [...data];\r\n break;\r\n }\r\n case 'values': {\r\n dataOjectForcurrentSeries.series = series;\r\n dataOjectForcurrentSeries.valuesData = [...data];\r\n break;\r\n }\r\n default: {\r\n dataOjectForcurrentSeries.series = series;\r\n dataOjectForcurrentSeries.valuesData = [...data];\r\n dataOjectForcurrentSeries.chartData = [...data];\r\n dataOjectForcurrentSeries.chartRollup = rollup;\r\n }\r\n }\r\n source[series.id] = dataOjectForcurrentSeries;\r\n return source;\r\n }\r\n}\r\n\r\n//date rage helper\r\nexport class DateRangeHelper {\r\n static validOptions() {\r\n return [1, 7, 30];\r\n }\r\n\r\n static setByOption(opt) {\r\n const option = this.validOptions().includes(opt) ? opt : 1;\r\n //capture the current moment so we calculate start and end from the same date\r\n const now = moment();\r\n const start = moment(now).subtract(opt, 'days').startOf('minute').toDate();\r\n const end = moment(now).endOf('minute').toDate();\r\n\r\n return new DateRange(start, end, option);\r\n }\r\n\r\n static setByRange(start, end) {\r\n const endDate = moment(end).endOf('minute');\r\n //if end date less than one minute from now, than range maybe will match one of the options\r\n const endDateMinFromNow = moment().diff(endDate, 'minutes', true);\r\n const startDate = moment(start).startOf('minute');\r\n const rangDiffIndays = endDate.diff(startDate, 'days', true);\r\n const isRangeMatchOption =\r\n this.validOptions().includes(rangDiffIndays) && endDateMinFromNow < 1;\r\n const option = isRangeMatchOption ? rangDiffIndays : undefined;\r\n return new DateRange(startDate.toDate(), endDate.toDate(), option);\r\n }\r\n\r\n static getRangeAggregationInterval(start, end) {\r\n //find date rang diff in days\r\n //between 2 and 8 day will need aggregation by 1 hour\r\n //more than 8 days need aggregation by 1 day\r\n //less than 2 day no aggregation requird(raw data)\r\n const diffInDays = moment(end).diff(moment(start), 'days', true);\r\n if (diffInDays > 2 && diffInDays < 8) {\r\n return '1hour';\r\n }\r\n if (diffInDays >= 8) {\r\n return '1day';\r\n }\r\n return null;\r\n }\r\n\r\n static isDateWithinThirtyDayfromToday(date) {\r\n const diffFromToday = moment().diff(moment(date), 'days', true);\r\n return diffFromToday <= 30;\r\n }\r\n}\r\n","import { of, empty, from } from 'rxjs';\r\nimport { map, concatMap, catchError, switchMap, filter, delay } from 'rxjs/operators';\r\nimport { ofType } from 'redux-observable';\r\nimport moment from 'moment';\r\n\r\nimport Http from '../../http/http';\r\nimport AppSettings from '../../app.settings';\r\nimport * as AssetDetailsActions from './asset-details.actions';\r\nimport { BuildUri, AssetModelHelper, DateRangeHelper } from './asset-details.util';\r\nimport { get } from 'lodash-es';\r\n\r\nconst taskes = [\r\n {\r\n index: 1,\r\n list: [\r\n 'series',\r\n 'faults',\r\n 'attributes',\r\n 'alerts',\r\n 'maintenancePlans',\r\n 'images',\r\n 'users',\r\n 'deviceCommands',\r\n ],\r\n },\r\n];\r\n\r\nexport const getAssetData = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AssetDetailsActions.GET_ASSET_DATA),\r\n switchMap((action) => {\r\n const equipmentId = action.payload;\r\n const user = state$.value.user;\r\n return of(...taskes).pipe(\r\n concatMap((includeTask) => {\r\n const thereIsMoreTask = includeTask.index !== taskes.length;\r\n return Http.get(\r\n BuildUri(`${AppSettings.BaseTugApiUrl}/equipment`, equipmentId, includeTask.list),\r\n ).pipe(\r\n map((data) =>\r\n AssetDetailsActions.getAssetDataSuccess(\r\n data,\r\n user,\r\n includeTask.list,\r\n thereIsMoreTask,\r\n ),\r\n ),\r\n catchError((error) => of(AssetDetailsActions.getAssetDataFailed(error))),\r\n );\r\n }),\r\n catchError((error) => {\r\n console.error(error);\r\n return empty();\r\n }),\r\n );\r\n }),\r\n );\r\nexport const mapToGetSeriesData = (action$) =>\r\n action$.pipe(\r\n ofType(\r\n AssetDetailsActions.SELECT_SERIES,\r\n AssetDetailsActions.SET_DATE_RANGE,\r\n AssetDetailsActions.SET_DATE_RANGE_BY_OPTION,\r\n ),\r\n map(() => AssetDetailsActions.getSeriesData()),\r\n );\r\n\r\nconst seriesDataRequest = (SeriesIds, range, uom, interval, functions) => {\r\n return {\r\n ids: SeriesIds,\r\n uom: uom,\r\n interval: interval,\r\n functions: functions,\r\n range: range,\r\n };\r\n};\r\n\r\nconst getSeriesDataRequestTasks = (state) => {\r\n const { selectedSeriesIds = [], dataDateRange, activeDataTap } = state.asset_details;\r\n const uom = get(state.user, 'claims.data.unitOfMeasure');\r\n const { start, end } = dataDateRange;\r\n const interval = DateRangeHelper.getRangeAggregationInterval(start, end);\r\n const range = `${moment(start).toISOString()}/${moment(end).toISOString()}`;\r\n //when there is interval we need two set of data (raw for value, aggregated for chart)\r\n if (interval) {\r\n const chartTask = {\r\n DataFor: 'chart',\r\n request: seriesDataRequest(selectedSeriesIds, range, uom, interval, [\r\n 'mean',\r\n 'min',\r\n 'max',\r\n 'last',\r\n 'first',\r\n 'count',\r\n 'delta',\r\n ]),\r\n };\r\n const valuesTask = {\r\n DataFor: 'values',\r\n request: seriesDataRequest(selectedSeriesIds, range, uom, null, null),\r\n };\r\n // to call data for active tab first\r\n return activeDataTap === 'chart' ? [chartTask, valuesTask] : [valuesTask, chartTask];\r\n }\r\n //if no interval\r\n const rawdataTask = {\r\n DataFor: 'all',\r\n request: seriesDataRequest(selectedSeriesIds, range, uom, null, null),\r\n };\r\n return [rawdataTask];\r\n};\r\nexport const getSeriesData = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AssetDetailsActions.GET_SERIES_DATA),\r\n filter(() => {\r\n const { selectedSeriesIds = [] } = state$.value.asset_details;\r\n return selectedSeriesIds.length > 0;\r\n }),\r\n switchMap(() => {\r\n const dataTasks = getSeriesDataRequestTasks(state$.value);\r\n return of(...dataTasks).pipe(\r\n concatMap((dataTask) =>\r\n Http.post(`${AppSettings.BaseTugApiUrl}/series/data`, dataTask.request).pipe(\r\n map((data) => AssetDetailsActions.getSeriesDataSuccess(data, dataTask.DataFor)),\r\n catchError((error) => of(AssetDetailsActions.getSeriesDataFailed(error))),\r\n ),\r\n ),\r\n );\r\n }),\r\n );\r\n\r\nexport const ckeckAssetDataIntegrity = (action$, state$) =>\r\n action$.pipe(\r\n ofType(AssetDetailsActions.GET_SERIES_DATA_SUCCESS),\r\n concatMap((action) => {\r\n const { asset = {} } = state$.value.asset_details;\r\n const assetStillGood = AssetModelHelper.validateAssetDataIntegrity(\r\n action.payload.seriesList,\r\n asset.series,\r\n );\r\n return assetStillGood ? empty() : of(AssetDetailsActions.getAssetData(asset.id));\r\n }),\r\n catchError((error) => {\r\n console.error(error);\r\n return empty();\r\n }),\r\n );\r\n\r\n/**\r\n * fire action to get the asset then wait for 500ms befor fire action get series Data\r\n * @param {*} action$\r\n */\r\nexport const refreshAssetDashBoardData = (action$) =>\r\n action$.pipe(\r\n ofType(AssetDetailsActions.REFRESH_ASSET_DASH_BOARD_DATA),\r\n switchMap((action) => {\r\n return from([\r\n of(AssetDetailsActions.getAssetData(action.payload)),\r\n of(AssetDetailsActions.getSeriesData()).pipe(delay(500)),\r\n ]).pipe(concatMap((observableAction) => observableAction));\r\n }),\r\n );\r\n","import * as AccountsActions from './accounts.actions';\r\nimport {REQUEST_USER_ACCOUNTS_SUCCESS} from '../user/user.actions';\r\n\r\nexport const INITIAL_STATE = {\r\n account_roles: [],\r\n subaccounts: [],\r\n viewing_account: null,\r\n loading_account: null,\r\n loading_account_error: null,\r\n updating_subaccount: false,\r\n updating_subaccount_error: false,\r\n creating_subaccount: false,\r\n create_sub_account_error: null\r\n};\r\n\r\nexport const ACCOUNTS_STATE_NAME = 'accounts';\r\n\r\nexport default (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case AccountsActions.GET_ACCOUNT:\r\n return {...state, loading_account: payload.id, loading_account_error: false};\r\n case AccountsActions.GET_ACCOUNT_SUCCESS:\r\n return {\r\n ...state,\r\n viewing_account: payload,\r\n loading_account: null,\r\n loading_account_error: null\r\n };\r\n case AccountsActions.GET_ACCOUNT_FAIL:\r\n return {\r\n ...state,\r\n loading_account: null,\r\n loading_account_error: payload,\r\n viewing_account: null\r\n };\r\n case REQUEST_USER_ACCOUNTS_SUCCESS: {\r\n return {...state, subaccounts: [...payload.currentAccount.accounts]};\r\n }\r\n case AccountsActions.UPDATE_SUBACCOUNT:\r\n case AccountsActions.UPDATE_INHERITED_ROLES:\r\n return {\r\n ...state,\r\n updating_subaccount: true,\r\n updating_subaccount_error: null\r\n };\r\n case AccountsActions.UPDATE_SUBACCOUNT_SUCCESS: {\r\n let subaccounts = [...state.subaccounts].map(account => {\r\n if (account.id === payload.id) {\r\n account = payload;\r\n }\r\n\r\n return account;\r\n });\r\n return {\r\n ...state,\r\n subaccounts: [...subaccounts]\r\n };\r\n }\r\n case AccountsActions.UPDATE_INHERITED_ROLES_SUCCESS:\r\n return {\r\n ...state,\r\n updating_subaccount: false,\r\n updating_subaccount_error: null\r\n };\r\n case AccountsActions.CREATE_SUBACCOUNT:\r\n return {\r\n ...state,\r\n creating_subaccount: true,\r\n create_subaccount_error: null\r\n };\r\n case AccountsActions.CREATE_SUBACCOUNT_SUCCESS:\r\n return {\r\n ...state,\r\n subaccounts: [...state.subaccounts, payload],\r\n creating_subaccount: false,\r\n create_subaccount_error: null\r\n };\r\n case AccountsActions.CREATE_SUBACCOUNT_FAIL: {\r\n let errorMessage = 'Something went wrong creating a subaccount';\r\n\r\n if (payload.data && payload.data.message) {\r\n errorMessage = payload.data.message;\r\n }\r\n\r\n if (payload.status === 403) {\r\n errorMessage = 'You do not have sufficient privileges to create sub accounts';\r\n }\r\n\r\n return {\r\n ...state,\r\n creating_subaccount: false,\r\n create_subaccount_error: errorMessage\r\n };\r\n }\r\n case AccountsActions.GET_ROLES_SUCCESS:\r\n return {\r\n ...state,\r\n account_roles: payload.filter(role => role.id !== '-1').sort((a, b) => a.name - b.name)\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as AppActions from './app.actions';\r\n\r\nexport const APP_STATE_NAME = 'app';\r\n\r\nconst INITIAL_STATE = {\r\n initialized: false,\r\n logoUrl: '',\r\n cornerIcon: ''\r\n};\r\n\r\nexport default (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case AppActions.APP_INITIALIZED:\r\n return {...state, initialized: true};\r\n case AppActions.SET_APP_BRANDING:\r\n return {...state, logoUrl: payload.logoUrl, cornerIcon: payload.cornerIcon};\r\n case AppActions.REDIRECT_USER:\r\n return {...state, redirectToState: payload.state};\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as AssetDetailsActions from './asset-details.actions';\r\nimport {INITIAL_STATE, AssetDetailsState} from './asset-details.state';\r\nimport {AssetModelHelper, DateRangeHelper} from './asset-details.util';\r\n\r\nexport default (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case AssetDetailsActions.GET_ASSET_DATA: {\r\n const {asset = {}} = state;\r\n const refreshDataNeeded = payload === asset.id;\r\n const newState = refreshDataNeeded ? {...state} : new AssetDetailsState();\r\n return {\r\n ...newState,\r\n loading: !refreshDataNeeded,\r\n refreshing: refreshDataNeeded,\r\n error: undefined\r\n };\r\n }\r\n case AssetDetailsActions.GET_ASSET_DATA_SUCCESS: {\r\n const {selectedSeriesIds = []} = state;\r\n const asset = AssetModelHelper.updateFromJsonApi(state.asset, payload.data, payload.user, payload.included);\r\n const selected = selectedSeriesIds.length > 0 ? [...selectedSeriesIds] : asset.defaultChartedseriesIds;\r\n return {\r\n ...state,\r\n loading: false,\r\n refreshing: payload.moreData,\r\n asset: asset,\r\n selectedSeriesIds: selected\r\n };\r\n }\r\n case AssetDetailsActions.GET_ASSET_DATA_FAILED: {\r\n return {\r\n ...state,\r\n loading: false,\r\n refreshing: false,\r\n error: 'Error while getting asset data. Please try again.'\r\n };\r\n }\r\n case AssetDetailsActions.SELECT_SERIES: {\r\n const {selectedSeriesIds = []} = state;\r\n return {\r\n ...state,\r\n selectedSeriesIds: selectedSeriesIds.includes(payload) ? selectedSeriesIds : [...selectedSeriesIds, payload]\r\n };\r\n }\r\n case AssetDetailsActions.DESELECT_SERIES: {\r\n const {selectedSeriesIds = [], asset = {}} = state;\r\n const {seriesData = {}} = asset;\r\n const {[payload]: omint, ...rest} = seriesData;\r\n const remaindSelected = selectedSeriesIds.filter(selectedId => selectedId !== payload);\r\n return {\r\n ...state,\r\n selectedSeriesIds: remaindSelected,\r\n asset: {...state.asset, seriesData: {...rest}}\r\n };\r\n }\r\n case AssetDetailsActions.SET_DATE_RANGE: {\r\n const [start, end] = payload;\r\n return {\r\n ...state,\r\n dataDateRange: DateRangeHelper.setByRange(start, end)\r\n };\r\n }\r\n\r\n case AssetDetailsActions.SET_DATE_RANGE_BY_OPTION: {\r\n return {\r\n ...state,\r\n dataDateRange: DateRangeHelper.setByOption(payload)\r\n };\r\n }\r\n case AssetDetailsActions.GET_SERIES_DATA: {\r\n const {selectedSeriesIds = [], dataDateRange = {}} = state;\r\n const {option = 1} = dataDateRange;\r\n //set loading to true if we have selected series.\r\n return {\r\n ...state,\r\n seriesDataStatus: {\r\n chartLoading: selectedSeriesIds.length > 0,\r\n valuesLoading: selectedSeriesIds.length > 0,\r\n error: undefined\r\n },\r\n dataDateRange: payload.updateDateRange ? DateRangeHelper.setByOption(option) : {...state.dataDateRange}\r\n };\r\n }\r\n case AssetDetailsActions.GET_SERIES_DATA_SUCCESS: {\r\n const {seriesData = {}} = state.asset;\r\n let currentSeriesData = {...seriesData};\r\n payload.seriesList.forEach(item => {\r\n const {data = [], series, rollup} = item;\r\n currentSeriesData = AssetModelHelper.addOrUpdateSeriesData(\r\n currentSeriesData,\r\n series,\r\n data,\r\n payload.dataFor,\r\n rollup\r\n );\r\n });\r\n const {seriesDataStatus = {}} = state;\r\n switch (payload.dataFor) {\r\n case 'chart': {\r\n seriesDataStatus.chartLoading = false;\r\n break;\r\n }\r\n case 'values': {\r\n seriesDataStatus.valuesLoading = false;\r\n break;\r\n }\r\n default: {\r\n seriesDataStatus.chartLoading = false;\r\n seriesDataStatus.valuesLoading = false;\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n asset: {...state.asset, seriesData: currentSeriesData},\r\n seriesDataStatus: {...seriesDataStatus}\r\n };\r\n }\r\n case AssetDetailsActions.GET_SERIES_DATA_FAILED: {\r\n return {\r\n ...state,\r\n seriesDataStatus: {\r\n chartLoading: false,\r\n valuesLoading: false,\r\n error: 'Error loading timeseries data for this asset.'\r\n }\r\n };\r\n }\r\n case AssetDetailsActions.SET_ACTIVE_DATA_TAB: {\r\n return {\r\n ...state,\r\n activeDataTap: payload\r\n };\r\n }\r\n //action to update gps data on client side to make sure user will see same data between asset info and location tab info\r\n //until we update location tab to work of redux\r\n case AssetDetailsActions.UPDATE_ASSET_LOCATION: {\r\n const gpsSeries = state.asset.locationSeries || {};\r\n if (payload && gpsSeries.last && payload.t !== gpsSeries.last.t) {\r\n gpsSeries.last = payload;\r\n }\r\n return {\r\n ...state,\r\n asset: {...state.asset, locationSeries: gpsSeries}\r\n };\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as ReportActions from './reports.actions';\r\n\r\nexport const REPORTS_STATE_NAME = 'reports';\r\n\r\nconst INITIAL_STATE = {\r\n tableauReportList: [],\r\n errorMessage: null,\r\n createUserError: null,\r\n requestingTrustedTicket: false,\r\n trustedTicketError: null,\r\n trustedTicket: null\r\n};\r\n\r\nexport default (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case ReportActions.CONSUME_TRUSTED_TICKET:\r\n return {...state, trustedTicket: null};\r\n case ReportActions.REQUEST_TRUSTED_TICKET:\r\n return {...state, trustedTicket: null, requestingTrustedTicket: true, trustedTicketError: null};\r\n case ReportActions.REQUEST_TRUSTED_TICKET_SUCCESS:\r\n return {...state, trustedTicket: payload.ticket, requestingTrustedTicket: false, trustedTicketError: null};\r\n case ReportActions.REQUEST_TRUSTED_TICKET_FAILED:\r\n return {...state, trustedTicket: payload.ticket, requestingTrustedTicket: false, trustedTicketError: payload.error};\r\n case ReportActions.REQUEST_TABLEAU_REPORTS_SUCCESS:\r\n return {...state, tableauReportList: payload.reportsList, errorMessage: null};\r\n case ReportActions.REQUEST_TABLEAU_REPORTS_FAILED:\r\n return {...state, errorMessage: payload.error};\r\n case ReportActions.CREATE_TABLEAU_USER_FAILED:\r\n return {...state, createUserError: payload.error};\r\n default:\r\n return state;\r\n }\r\n};\r\n","export const ROOT_ASSETS_STATE = 'assets';\r\n\r\nexport const INITIAL_STATE = {\r\n list: [],\r\n message: '',\r\n viewedAssetId: '',\r\n currentPage: 1,\r\n totalPages: 1,\r\n totalCount: 0,\r\n pageSize: 50,\r\n selections: [],\r\n /* prettier-ignore */\r\n pageSizes: [\r\n\t\t{ label: '50', value: 50 },\r\n\t\t{ label: '100', value: 100 },\r\n\t\t{ label: '150', value: 150 }\r\n\t]\r\n};\r\n\r\n//array of paths to keys need to be saved\r\nexport const AssetsWhiteListKeys = [\r\n [ROOT_ASSETS_STATE, 'currentPage'],\r\n [ROOT_ASSETS_STATE, 'pageSize'],\r\n [ROOT_ASSETS_STATE, 'selections'],\r\n [ROOT_ASSETS_STATE, 'viewedAssetId']\r\n];\r\n","import hash from 'object-hash';\r\nimport { find, sortBy, keys, includes } from 'lodash-es';\r\nimport { SECURITY_GROUPS_RETRIEVED } from '../security/security.action';\r\nimport { REQUEST_USER_ACCOUNTS_SUCCESS } from '../user/user.actions';\r\n\r\nimport { getLastSeenOptionByMinMax } from '../../components/last-seen-filter/last-seen-filter.models';\r\n\r\n//--------------\r\n// Constants\r\n//--------------\r\nimport {\r\n SEARCH_UPDATED,\r\n SEARCH_BEGIN,\r\n SEARCH_SUCCESS,\r\n SEARCH_FAILURE,\r\n SEARCH_INITIATED,\r\n FACET_SELECTED,\r\n FACET_SELECTED_EXCLUSIVE,\r\n FACET_DESELECTED,\r\n FACET_DESELECTED_EXCLUSIVE,\r\n SET_SELECTED_FACETS,\r\n SET_SELECTED_TAG_FILTERS,\r\n TAG_FILTERS_UPDATED,\r\n TAG_FILTER_ADDED,\r\n TAG_FILTER_REMOVED,\r\n QUERY_ADDED,\r\n QUERY_REMOVED,\r\n SORT_UPDATED,\r\n ALERTS_FACET_TYPE,\r\n SECURITY_GROUPS_FACET_TYPE,\r\n MAINTENANCE_STATUS_FACET_TYPE,\r\n COMMUNICATED_AT_FACET_TYPE,\r\n SEARCH_REQUESTED,\r\n SEARCH_RESET,\r\n SEARCH_EXPORT,\r\n SEARCH_EXPORT_SUCCESS,\r\n SEARCH_EXPORT_FAILURE,\r\n ACCOUNT_ADDED,\r\n ACCOUNT_REMOVED,\r\n UPDATE_SEARCH_PREREQUISITES,\r\n LAST_SEEN_UPDATED,\r\n} from './search.action';\r\n\r\nimport { INITIAL_STATE } from './search.state';\r\n\r\nconst tags = {\r\n [ALERTS_FACET_TYPE]: (priority) => `onei3:alert:${priority}`,\r\n [SECURITY_GROUPS_FACET_TYPE]: (group) => `onei3:security:group:${group}`,\r\n [MAINTENANCE_STATUS_FACET_TYPE]: (plan) => `onei3:maintenance:${plan}`,\r\n};\r\n\r\nconst setSelected = (item, selectedItems) => {\r\n if (selectedItems) {\r\n selectedItems.forEach((selectedItem) => {\r\n item._selected = selectedItem.id === item.id;\r\n });\r\n }\r\n};\r\n\r\nconst applySelected = (item, selectedItems = [], facetType) => {\r\n //override Selected\r\n item._selected = !!selectedItems.find((selected) => selected.id === item.id);\r\n //set the tag for alerts,maintenances,sec\r\n if (item._selected && facetType !== COMMUNICATED_AT_FACET_TYPE) {\r\n item.tag = tags[facetType](item.id);\r\n }\r\n return item;\r\n};\r\n\r\nconst applySavedLastSeen = (saved) => {\r\n if (saved) {\r\n const lastSeen = getLastSeenOptionByMinMax(saved.min, saved.max);\r\n return lastSeen ? { ...lastSeen, _selected: true } : null;\r\n }\r\n};\r\n\r\nexport const SearchReducer = (state = INITIAL_STATE, { type, payload }) => {\r\n switch (type) {\r\n case SEARCH_UPDATED:\r\n return {\r\n ...state,\r\n hash: createSearchHash(state),\r\n };\r\n\r\n case SORT_UPDATED: {\r\n const direction =\r\n state.sort.name === payload && state.sort.direction === 'asc' ? 'desc' : 'asc';\r\n return {\r\n ...state,\r\n sort: {\r\n name: payload,\r\n direction,\r\n },\r\n };\r\n }\r\n case QUERY_ADDED: {\r\n if (!payload || includes(state.query, payload)) {\r\n return state;\r\n }\r\n\r\n const newQuery = [...state.query, payload];\r\n return {\r\n ...state,\r\n query: newQuery,\r\n };\r\n }\r\n\r\n case QUERY_REMOVED: {\r\n const query = [...state.query];\r\n return {\r\n ...state,\r\n query: query.filter((item) => item !== payload),\r\n };\r\n }\r\n\r\n case SEARCH_UPDATED: // eslint-disable-line no-duplicate-case\r\n case SEARCH_BEGIN:\r\n case SEARCH_REQUESTED:\r\n return {\r\n ...state,\r\n inProgress: true,\r\n };\r\n\r\n case SEARCH_INITIATED:\r\n return {\r\n ...state,\r\n inProgress: true,\r\n query: payload.query,\r\n securityGroups: state.securityGroups.map((item) =>\r\n applySelected(item, payload.securityGroups, SECURITY_GROUPS_FACET_TYPE),\r\n ),\r\n alerts: state.alerts.map((item) => applySelected(item, payload.alerts, ALERTS_FACET_TYPE)),\r\n maintenance: state.maintenance.map((item) =>\r\n applySelected(item, payload.maintenance, MAINTENANCE_STATUS_FACET_TYPE),\r\n ),\r\n lastCommunicated: state.lastCommunicated.map((item) =>\r\n applySelected(item, payload.lastCommunicated, COMMUNICATED_AT_FACET_TYPE),\r\n ),\r\n tagFilters: payload.tagFilters || {},\r\n accounts: state.accounts.map((item) => ({\r\n ...item,\r\n _selected: !!(payload.accounts || []).find(\r\n (selected) => '' + selected.id === '' + item.id,\r\n ),\r\n })),\r\n lastSeen: (payload.lastSeen || []).map((ls) => applySavedLastSeen(ls)),\r\n };\r\n\r\n case SEARCH_SUCCESS:\r\n return {\r\n ...state,\r\n inProgress: false,\r\n initial: false,\r\n cursor: payload.cursor,\r\n error: '',\r\n };\r\n\r\n case SEARCH_FAILURE:\r\n return {\r\n ...state,\r\n inProgress: false,\r\n error: payload,\r\n };\r\n\r\n case SEARCH_EXPORT:\r\n return {\r\n ...state,\r\n exportInProgress: true,\r\n };\r\n\r\n case SEARCH_EXPORT_SUCCESS:\r\n case SEARCH_EXPORT_FAILURE:\r\n return {\r\n ...state,\r\n exportInProgress: false,\r\n };\r\n\r\n case FACET_DESELECTED:\r\n case FACET_DESELECTED_EXCLUSIVE:\r\n case FACET_SELECTED:\r\n case FACET_SELECTED_EXCLUSIVE:\r\n return reduceFacets(state, type, payload);\r\n\r\n case SET_SELECTED_FACETS: {\r\n const { alerts, maintenance, lastCommunicated, securityGroups } = state;\r\n\r\n alerts.forEach((item) => setSelected(item, payload.alerts));\r\n maintenance.forEach((item) => setSelected(item, payload.maintenance));\r\n lastCommunicated.forEach((item) => setSelected(item, payload.lastCommunicated));\r\n securityGroups.forEach((item) => setSelected(item, payload.securityGroups));\r\n\r\n return {\r\n ...state,\r\n alerts,\r\n maintenance,\r\n lastCommunicated,\r\n securityGroups,\r\n };\r\n }\r\n\r\n case SET_SELECTED_TAG_FILTERS: {\r\n const tagFilters = payload;\r\n\r\n return {\r\n ...state,\r\n tagFilters,\r\n };\r\n }\r\n\r\n case TAG_FILTERS_UPDATED:\r\n return {\r\n ...state,\r\n tagFilters: payload,\r\n };\r\n\r\n case TAG_FILTER_ADDED: {\r\n const tagFilters = { ...state.tagFilters };\r\n tagFilters[payload.key] = payload.value;\r\n return {\r\n ...state,\r\n tagFilters: tagFilters,\r\n };\r\n }\r\n\r\n case TAG_FILTER_REMOVED: {\r\n const key = payload.key ? payload.key : payload;\r\n let { [key]: omit, ...rest } = state.tagFilters; // eslint-disable-line no-unused-vars\r\n return {\r\n ...state,\r\n tagFilters: rest,\r\n };\r\n }\r\n\r\n case SECURITY_GROUPS_RETRIEVED:\r\n return updateSecurityGroups(state, payload);\r\n\r\n case SEARCH_RESET: {\r\n const newState = { ...state };\r\n newState.query = [];\r\n newState.tagFilters = {};\r\n newState.lastCommunicated = newState.lastCommunicated.map((value) => clearSelected(value));\r\n newState.maintenance = newState.maintenance.map((value) => clearSelected(value));\r\n newState.alerts = newState.alerts.map((value) => clearSelected(value));\r\n newState.securityGroups = newState.securityGroups.map((value) => clearSelected(value));\r\n newState.accounts = newState.accounts.map((value) => clearSelected(value));\r\n newState.lastSeen = [];\r\n return newState;\r\n }\r\n\r\n case REQUEST_USER_ACCOUNTS_SUCCESS: {\r\n const { currentAccount } = payload;\r\n const { accounts } = state;\r\n const selectedAccounts = (accounts || []).filter((acc) => acc.selected).map((acc) => acc.id);\r\n //add label prop that required for filter input to work,\r\n //override master to get clear result when filtering the list\r\n //sync with selected\r\n let userAccounts = [currentAccount, ...(currentAccount.accounts || [])].map((account) => ({\r\n id: account.id,\r\n name: account.name,\r\n label: account.name,\r\n _selected: selectedAccounts.includes(account.id),\r\n }));\r\n return { ...state, accounts: sortBy(userAccounts, 'label') };\r\n }\r\n\r\n case ACCOUNT_ADDED: {\r\n return {\r\n ...state,\r\n accounts: state.accounts.map((acc) => {\r\n if (acc.id === payload.id) {\r\n acc._selected = true;\r\n }\r\n return acc;\r\n }),\r\n };\r\n }\r\n\r\n case ACCOUNT_REMOVED: {\r\n return {\r\n ...state,\r\n accounts: state.accounts.map((acc) => {\r\n if (acc.id === payload.id) {\r\n acc._selected = false;\r\n }\r\n return acc;\r\n }),\r\n };\r\n }\r\n\r\n case UPDATE_SEARCH_PREREQUISITES: {\r\n return {\r\n ...state,\r\n since: payload.since,\r\n limit: payload.limit,\r\n };\r\n }\r\n\r\n case LAST_SEEN_UPDATED: {\r\n return {\r\n ...state,\r\n lastSeen: payload ? [{ ...payload, _selected: true }] : [],\r\n };\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst clearSelected = (value) => {\r\n value._selected = false;\r\n return value;\r\n};\r\n\r\nconst reduceFacets = (state, type, payload) => {\r\n const newState = { ...state, cursor: 0 };\r\n switch (type) {\r\n case FACET_SELECTED: {\r\n const { value, facetType } = payload;\r\n const { id } = value;\r\n\r\n newState[facetType].forEach((facet) => {\r\n if (facet.id === id) {\r\n facet._selected = true;\r\n\r\n if (facetType !== COMMUNICATED_AT_FACET_TYPE) {\r\n facet.tag = tags[facetType](id);\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n\r\n case FACET_SELECTED_EXCLUSIVE: {\r\n const { value, facetType } = payload;\r\n const { id } = value;\r\n\r\n newState[facetType].forEach((facet) => {\r\n facet._selected = facet.id === id;\r\n if (facet._selected) {\r\n if (![COMMUNICATED_AT_FACET_TYPE].includes(facetType)) {\r\n facet.tag = tags[facetType](id);\r\n }\r\n }\r\n });\r\n\r\n break;\r\n }\r\n\r\n case FACET_DESELECTED: {\r\n const { value, facetType } = payload;\r\n const { id } = value;\r\n\r\n newState[facetType].forEach((facet) => {\r\n if (facet.id === id) {\r\n facet._selected = false;\r\n }\r\n });\r\n break;\r\n }\r\n\r\n case FACET_DESELECTED_EXCLUSIVE: {\r\n const { facetType } = payload;\r\n newState[facetType].forEach((facet) => {\r\n facet._selected = false;\r\n });\r\n break;\r\n }\r\n\r\n default:\r\n return { ...newState };\r\n }\r\n return newState;\r\n};\r\n\r\nconst updateSecurityGroups = (state, payload) => {\r\n const { securityGroups } = state;\r\n\r\n //re-populate security groups from the payload with respect to user selection\r\n const updatedSecurityGroups = payload.map((item) => {\r\n const existingItem = find(securityGroups, (group) => group.id === item.id);\r\n if (!existingItem) return { ...item, _selected: false };\r\n\r\n return {\r\n ...existingItem,\r\n ...item,\r\n _selected: existingItem._selected,\r\n };\r\n });\r\n\r\n return {\r\n ...state,\r\n securityGroups: updatedSecurityGroups,\r\n };\r\n};\r\n\r\nconst getSelectedIds = (collection = []) => {\r\n return collection.filter((item) => item._selected).map((selected) => ({ id: selected.id }));\r\n};\r\n\r\nconst hashCollection = (collection = []) => {\r\n const selected = getSelectedIds(collection);\r\n return selected.length > 0 ? hash(JSON.stringify(sortBy(selected, ['id']))) : '';\r\n};\r\n\r\nconst hashRange = (range) => {\r\n //make suse to hash only property with value and order(min,max)\r\n let { min, max } = range || {};\r\n min = min || undefined;\r\n max = max || undefined;\r\n return max || min ? hash(JSON.stringify({ min, max })) : '';\r\n};\r\n\r\nexport const createSearchHash = (search) => {\r\n const {\r\n query,\r\n alerts,\r\n maintenance,\r\n lastCommunicated,\r\n securityGroups,\r\n tagFilters,\r\n accounts,\r\n lastSeen,\r\n } = search;\r\n\r\n let searchHash = '';\r\n //build query hash\r\n searchHash = (query || []).length > 0 ? hash(JSON.stringify(sortBy(query))) : '';\r\n //build alerts selected hash\r\n searchHash += hashCollection(alerts);\r\n //build maintenance selected hash\r\n searchHash += hashCollection(maintenance);\r\n //build lastCommunicated selected hash\r\n searchHash += hashCollection(lastCommunicated);\r\n //build securityGroups selected hash\r\n searchHash += hashCollection(securityGroups);\r\n //build tagFilters hash\r\n searchHash += keys(tagFilters).length > 0 ? hash(JSON.stringify(tagFilters)) : '';\r\n //build accounts selected hash\r\n searchHash += hashCollection(accounts);\r\n //hash last seen range\r\n const [lastSeenFilter] = lastSeen || [];\r\n searchHash += lastSeenFilter ? hashRange(lastSeenFilter.range) : '';\r\n\r\n return hash(searchHash);\r\n};\r\n","export const ROOT_ATTRIBUTES_STATE = 'attributes';\r\n\r\nexport const INITIAL_STATE = {\r\n items: [],\r\n loading: false,\r\n isSecuredLoaded: false,\r\n secured: {},\r\n error: null\r\n};\r\n","import { gettext } from './../gettext-extract-util';\r\n\r\nexport const ROOT_TABLE_COLUMNS_STATE = 'tableColumns';\r\n\r\nexport const INITIAL_STATE = {\r\n columns: {\r\n security_groups: {\r\n key: 'security:group:',\r\n label: gettext('Security Groups'),\r\n visible: true,\r\n orderable: false,\r\n type: 'list',\r\n options: [],\r\n parent: 'properties',\r\n },\r\n account: {\r\n key: 'accountId',\r\n label: gettext('Account'),\r\n visible: true,\r\n parent: 'account',\r\n orderable: false,\r\n type: 'text',\r\n },\r\n transferrable: {\r\n key: 'transferrable',\r\n label: gettext('Transferrable'),\r\n visible: true,\r\n parent: 'transferrable',\r\n type: 'boolean',\r\n },\r\n last_communicated: {\r\n key: 'communicatedAt',\r\n label: gettext('Last Communicated'),\r\n visible: true,\r\n orderable: true,\r\n sort_key: 'communicatedAt',\r\n type: 'timeago',\r\n },\r\n activated_date: {\r\n key: 'createdAt',\r\n label: gettext('Activated Date'),\r\n visible: true,\r\n orderable: true,\r\n sort_key: 'createdAt',\r\n type: 'date',\r\n },\r\n last_seen: {\r\n key: 'coordsAt',\r\n label: gettext('Last Seen'),\r\n visible: true,\r\n orderable: true,\r\n sort_key: 'coordsAt',\r\n type: 'timeago',\r\n },\r\n bluetooth: {\r\n key: 'networkTechnology',\r\n label: gettext('Bluetooth'),\r\n visible: true,\r\n parent: 'bluetooth',\r\n type: 'bluetooth',\r\n },\r\n device_id: {\r\n key: 'onei3:serial',\r\n label: gettext('Device Serial Number'),\r\n visible: true,\r\n orderable: true,\r\n sort_key: 'attrs.onei3:serial.keyword',\r\n type: 'text',\r\n parent: 'attrs',\r\n url_prefix: 'devices/serial/',\r\n },\r\n shared_to: {\r\n key: 'share:to:',\r\n label: 'Shared To',\r\n visible: true,\r\n orderable: false,\r\n parent: 'properties',\r\n type: 'list',\r\n group: 'sharedTo',\r\n },\r\n shared_from: {\r\n key: 'share:from:',\r\n label: 'Shared From',\r\n visible: true,\r\n orderable: false,\r\n parent: 'properties',\r\n type: 'text',\r\n group: 'sharedFrom',\r\n },\r\n attributes: {\r\n key: 'attributes',\r\n label: gettext('Attributes'),\r\n visible: true,\r\n orderable: false,\r\n children: {},\r\n },\r\n },\r\n selected: [\r\n {\r\n key: 'name',\r\n label: gettext('Name'),\r\n orderable: true,\r\n sort_key: 'name.raw',\r\n type: 'text',\r\n },\r\n {\r\n key: 'make',\r\n label: gettext('Make'),\r\n orderable: true,\r\n sort_key: 'attrs.make.keyword',\r\n type: 'text',\r\n parent: 'attrs',\r\n group: 'attributes',\r\n },\r\n {\r\n key: 'model',\r\n label: gettext('Model'),\r\n orderable: true,\r\n sort_key: 'attrs.model.keyword',\r\n type: 'text',\r\n parent: 'attrs',\r\n group: 'attributes',\r\n },\r\n {\r\n key: 'communicatedAt',\r\n label: gettext('Last Communicated'),\r\n orderable: true,\r\n sort_key: 'communicatedAt',\r\n type: 'timeago',\r\n },\r\n ],\r\n columns_order: ['name', 'transferrable', 'make', 'model', 'accountId'],\r\n};\r\n\r\n//array of paths to keys need to be saved\r\nexport const TableColumnsWhiteListKeys = [[ROOT_TABLE_COLUMNS_STATE, 'selected']];\r\n","import update from 'immutability-helper';\r\nimport { sortBy } from 'lodash-es';\r\nimport {\r\n COLUMN_VISIBLE_TOGGLED,\r\n COLUMN_ATTRIBUTES_SET,\r\n COLUMN_SECURITY_GROUPS_SET,\r\n SET_COLUMN_VISIBILTY,\r\n} from './table-columns.action';\r\n\r\nimport { INITIAL_STATE } from './table-columns.state';\r\n\r\nexport function createChildren(parentKey, orderKey, children) {\r\n const newChildren = {};\r\n\r\n children.forEach((child) => {\r\n newChildren[child.key] = {\r\n key: child.key.toLowerCase(),\r\n label: child.key,\r\n orderable: false,\r\n type: child.dataType.toLowerCase(),\r\n group: 'attribute',\r\n parent: 'attrs',\r\n };\r\n\r\n // sorted col based on IPORT-4953 uesed common attrs\r\n // ('machine serial number', 'telematics serial number', 'year') are Genie common attrs\r\n const sortAttrsList = [\r\n 'make',\r\n 'model',\r\n 'model year',\r\n 'vin',\r\n 'equipment number',\r\n 'machine serial number',\r\n 'telematics serial number',\r\n 'year',\r\n ];\r\n\r\n //our elasticSearch will only sort correctly on like text type attrs at the moment.\r\n //we can use child.dataType && child.dataType.toLowerCase() === 'text' when search api fixed for elastic un-mapped fields\r\n if (sortAttrsList.includes(child.key.toLowerCase())) {\r\n newChildren[child.key].orderable = true;\r\n newChildren[child.key].sort_key = `attrs.${child.key.toLowerCase()}.keyword`;\r\n }\r\n });\r\n\r\n const sortedObject = Object.keys(newChildren)\r\n .sort((a, b) => a.localeCompare(b))\r\n .reduce((acc, k) => ({ ...acc, [k]: newChildren[k] }), {});\r\n\r\n return sortedObject;\r\n}\r\n\r\nexport function visible(permissions, value) {\r\n return permissions.includes(value);\r\n}\r\n\r\nexport const TableColumnsReducer = (state = INITIAL_STATE, { type, payload }) => {\r\n switch (type) {\r\n case SET_COLUMN_VISIBILTY: {\r\n return update(state, {\r\n columns: {\r\n security_groups: {\r\n visible: { $set: visible(payload.permissions, 'admin.securitygroups') },\r\n },\r\n transferrable: {\r\n visible: { $set: visible(payload.permissions, 'devices.transfer') },\r\n },\r\n account: {\r\n visible: { $set: visible(payload.permissions, 'admin.subaccounts') },\r\n },\r\n device_id: {\r\n visible: { $set: visible(payload.permissions, 'devices') },\r\n },\r\n },\r\n });\r\n }\r\n case COLUMN_SECURITY_GROUPS_SET: {\r\n return update(state, {\r\n columns: {\r\n security_groups: {\r\n options: { $set: payload },\r\n },\r\n },\r\n });\r\n }\r\n case COLUMN_ATTRIBUTES_SET: {\r\n const attrChildren = createChildren('attributes', 'attrs.', payload);\r\n return update(state, {\r\n columns: {\r\n attributes: {\r\n children: { $set: attrChildren },\r\n },\r\n },\r\n });\r\n }\r\n case COLUMN_VISIBLE_TOGGLED: {\r\n const selected = _.find(\r\n state.selected,\r\n (columnSelected) => columnSelected.key === payload.key,\r\n );\r\n\r\n if (selected) {\r\n return update(state, {\r\n selected: {\r\n $apply: (selected) => selected.filter((col) => col.key !== payload.key),\r\n },\r\n });\r\n } else {\r\n const { selected, columns_order } = state;\r\n //if col not order just used big number for sorting\r\n let orderdArray = [...selected, payload].map((col) => ({\r\n ...col,\r\n order: columns_order.indexOf(col.key) !== -1 ? columns_order.indexOf(col.key) : 999,\r\n }));\r\n\r\n return {\r\n ...state,\r\n selected: sortBy(orderdArray, 'order'),\r\n };\r\n }\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","export const ROOT_SECURITY_STATE = 'security';\r\n\r\nexport const INITIAL_STATE = {\r\n groups: [],\r\n retrieveInProgress: false,\r\n error: undefined\r\n};\r\n","export const ROOT_FAVOURITES_STATE = 'favourites';\r\n\r\nexport const INITIAL_STATE = {\r\n list: [],\r\n removedList: [],\r\n error: undefined\r\n};\r\n","export const ROOT_HISTORY_STATE = 'history';\r\n\r\nexport const INITIAL_STATE = {\r\n list: []\r\n};\r\n\r\n//array of paths to keys need to be saved\r\nexport const HistoryWhiteListKeys = [[ROOT_HISTORY_STATE]];\r\n","import moment from 'moment';\r\nimport {find} from 'lodash-es';\r\n\r\nimport {HISTORY_ADDED, HISTORY_UPDATED} from './history.action';\r\n\r\nimport {INITIAL_STATE} from './history.state';\r\n\r\nexport const HistoryReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case HISTORY_ADDED: {\r\n return {...state, list: addOrUpdateHistory(state, payload)};\r\n }\r\n\r\n case HISTORY_UPDATED: {\r\n const history = [...state.list];\r\n const newList = history.map(history => syncWithFavourites(history, payload));\r\n return {...state, list: newList};\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst syncWithFavourites = (history, favourites) => {\r\n const match = find(favourites, fav => fav.search.hash === history.search.hash);\r\n\r\n if (match) {\r\n return {...history, name: match.name, isFavourite: true};\r\n }\r\n\r\n return {...history, name: (history.search.query || []).join(','), isFavourite: false};\r\n};\r\n\r\nconst addOrUpdateHistory = (state, payload) => {\r\n let history = state.list || [];\r\n const search = {...payload};\r\n\r\n const itemIndex = history.findIndex(element => element.search.hash === search.hash);\r\n\r\n if (itemIndex !== -1) {\r\n // current search was already in the history, update the timestamp\r\n history[itemIndex].search.searchTime = moment().utc();\r\n } else {\r\n // no item matching the current search was found\r\n const newHistory = new History(search);\r\n history.push(newHistory);\r\n }\r\n\r\n return [...history];\r\n};\r\n\r\nexport class History {\r\n constructor(search = {}) {\r\n this.name = (search.query || []).join(',');\r\n this.isFavourite = false;\r\n this.search = {};\r\n this.search.query = [...search.query];\r\n this.search.alerts = this.getSelected(search.alerts);\r\n this.search.maintenance = this.getSelected(search.maintenance);\r\n this.search.lastCommunicated = this.getSelected(search.lastCommunicated);\r\n this.search.securityGroups = this.getSelected(search.securityGroups);\r\n this.search.tagFilters = search.tagFilters || {};\r\n this.search.searchTime = moment().utc();\r\n this.search.hash = search.hash;\r\n this.search.accounts = this.getSelected(search.accounts);\r\n //make last seen collection of object {min,max}\r\n this.search.lastSeen = (search.lastSeen || []).map(ls => {\r\n let {min, max} = ls.range || {};\r\n //to create the object by the one has value only will cast empty, null, to undefined\r\n min = min || undefined;\r\n max = max || undefined;\r\n return {min, max};\r\n });\r\n }\r\n\r\n getSelected(collection = []) {\r\n return collection\r\n .filter(item => item._selected)\r\n .map(selected => {\r\n return {id: selected.id};\r\n });\r\n }\r\n}\r\n","export const ROOT_CURRENT_USER_STATE = 'user';\r\n\r\nexport const DEFAULT_DATE_FORMAT = 'YYYY/MM/DD';\r\n\r\nexport const INITIAL_STATE = {\r\n error: undefined,\r\n activeNotifications: [],\r\n accountsError: undefined,\r\n switchableAccounts: [],\r\n datapointDescriptors: [],\r\n dateFormat: DEFAULT_DATE_FORMAT\r\n};\r\n\r\nexport const CurrentUserWhiteListKeys = [[ROOT_CURRENT_USER_STATE, 'id'], [ROOT_CURRENT_USER_STATE, 'account', 'id']];\r\n","export const ROOT_NOTIFICATION_STATE = 'notification';\r\n\r\nexport const INITIAL_STATE = {\r\n visible: true\r\n};\r\n","import {combineReducers} from 'redux';\r\nimport {combineEpics} from 'redux-observable';\r\nimport {catchError} from 'rxjs/operators';\r\n\r\nimport * as AppEpics from './app/app.epics';\r\nimport * as ReportEpics from './reports/reports.epics';\r\nimport * as AccountsEpics from './accounts/accounts.epics';\r\nimport * as UserEpics from './user/user.epics';\r\nimport * as TableColumnsEpics from './table-columns/table-columns.epic';\r\nimport * as HistoryEpics from './history/history.epic';\r\nimport * as SearchEpics from './search/search.epic';\r\nimport * as SecurityEpics from './security/security.epic';\r\nimport * as FavouriteEpics from './favourite/favourite.epic';\r\nimport * as AssetsEpics from './assets/assets.epic';\r\nimport * as AttributesEpics from './attributes/attributes.epic';\r\nimport * as TransferEpics from './transfer/transfer.epics';\r\nimport * as AssetDetailsEpics from './asset-details/asset-details.epics';\r\n\r\nimport AccountsReducer, {ACCOUNTS_STATE_NAME} from './accounts/accounts.reducer';\r\nimport AppReducer, {APP_STATE_NAME} from './app/app.reducer';\r\nimport TransferReducer, {TRANSFER_STATE_NAME} from './transfer/transfer.reducer';\r\nimport AssetDetailsReducer from './asset-details/asset-details.reducer';\r\nimport ReportsReducer, {REPORTS_STATE_NAME} from './reports/reports.reducer';\r\n\r\nimport {AssetsReducer} from './assets/assets.reducer';\r\nimport {SearchReducer} from './search/search.reducer';\r\nimport {AttributeReducer} from './attributes/attributes.reducer';\r\nimport {TableColumnsReducer} from './table-columns/table-columns.reducer';\r\nimport {SecurityGroupsReducer} from './security/security.reducer';\r\nimport {FavouriteReducer} from './favourite/favourite.reducer';\r\nimport {HistoryReducer} from './history/history.reducer';\r\nimport {CurrentUserReducer} from './user/user.reducer';\r\nimport {NotificationReducer} from './notification/notification.reducer';\r\n\r\n//state roots\r\nimport {ROOT_ASSETS_STATE} from './assets/assets.state';\r\nimport {ROOT_SEARCH_STATE} from './search/search.state';\r\nimport {ROOT_ATTRIBUTES_STATE} from './attributes/attributes.state';\r\nimport {ROOT_TABLE_COLUMNS_STATE} from './table-columns/table-columns.state';\r\nimport {ROOT_SECURITY_STATE} from './security/security.state';\r\nimport {ROOT_FAVOURITES_STATE} from './favourite/favourite.state';\r\nimport {ROOT_HISTORY_STATE} from './history/history.state';\r\nimport {ROOT_CURRENT_USER_STATE} from './user/user.state';\r\nimport {ROOT_NOTIFICATION_STATE} from './notification/notification.state';\r\nimport {ASSET_DETAILS_STATE_NAME} from './asset-details/asset-details.state';\r\n\r\nconst ReducersMap = {};\r\nReducersMap[APP_STATE_NAME] = AppReducer;\r\nReducersMap[REPORTS_STATE_NAME] = ReportsReducer;\r\nReducersMap[ACCOUNTS_STATE_NAME] = AccountsReducer;\r\nReducersMap[ROOT_ASSETS_STATE] = AssetsReducer;\r\nReducersMap[ROOT_SEARCH_STATE] = SearchReducer;\r\nReducersMap[ROOT_ATTRIBUTES_STATE] = AttributeReducer;\r\nReducersMap[ROOT_TABLE_COLUMNS_STATE] = TableColumnsReducer;\r\nReducersMap[ROOT_SECURITY_STATE] = SecurityGroupsReducer;\r\nReducersMap[ROOT_FAVOURITES_STATE] = FavouriteReducer;\r\nReducersMap[ROOT_HISTORY_STATE] = HistoryReducer;\r\nReducersMap[ROOT_CURRENT_USER_STATE] = CurrentUserReducer;\r\nReducersMap[ROOT_NOTIFICATION_STATE] = NotificationReducer;\r\nReducersMap[TRANSFER_STATE_NAME] = TransferReducer;\r\nReducersMap[ASSET_DETAILS_STATE_NAME] = AssetDetailsReducer;\r\n\r\nconst allEpics = [\r\n AppEpics,\r\n ReportEpics,\r\n AccountsEpics,\r\n AssetsEpics,\r\n AttributesEpics,\r\n FavouriteEpics,\r\n HistoryEpics,\r\n SearchEpics,\r\n SecurityEpics,\r\n TableColumnsEpics,\r\n UserEpics,\r\n TransferEpics,\r\n AssetDetailsEpics\r\n].reduce((accumulator, epics) => {\r\n return [...accumulator, ...Object.values(epics)];\r\n}, []);\r\n\r\nexport const RootReducer = combineReducers(ReducersMap);\r\n\r\n/**\r\n * https://github.com/redux-observable/redux-observable/issues/94#issuecomment-255936172\r\n * using function composition\r\n * any erroe was not handle in the epic and reach the pipe will caus the epic to be terminated,\r\n * so we warping every epic with catch and restart it\r\n * */\r\nconst combineEpicsAndCatchErrors = (...epics) => {\r\n return (action$, state$) => {\r\n epics = epics.map(epic => (action$, state$) =>\r\n epic(action$, state$).pipe(\r\n catchError((e, source) => {\r\n // rethrow error so it shows up in the console\r\n setTimeout(() => {\r\n throw e;\r\n }, 0);\r\n // source is the chain above the catch, so this \"retries\"\r\n return source;\r\n })\r\n )\r\n );\r\n return combineEpics(...epics)(action$, state$);\r\n };\r\n};\r\n\r\nexport const RootEpic = combineEpicsAndCatchErrors(...allEpics);\r\n","import {\r\n PAGESIZE_UPDATED,\r\n PAGE_SELECTED,\r\n ASSETS_FAILED_TO_POPULATE,\r\n ASSETS_SELECTED,\r\n ASSET_VIEWED\r\n} from './assets.action';\r\n\r\nimport * as SearchActions from '../search/search.action';\r\nimport {INITIAL_STATE} from './assets.state';\r\n\r\nexport const AssetsReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case PAGESIZE_UPDATED:\r\n return {\r\n ...state,\r\n pageSize: payload,\r\n totalPages: Math.ceil(state.totalCount / payload)\r\n };\r\n\r\n case PAGE_SELECTED:\r\n return {\r\n ...state,\r\n currentPage: payload\r\n };\r\n\r\n case SearchActions.SEARCH_SUCCESS: {\r\n const syncListWithSelection = (list = [], selections = []) => {\r\n const selectedIds = selections.map(asset => asset.id);\r\n return list.map(asset => ({...asset, selected: selectedIds.includes(asset.id)}));\r\n };\r\n const getselections = (list = []) => {\r\n return list.filter(asset => asset.selected);\r\n };\r\n //if search result from 0 will override the list and re-apply the old selected\r\n // otherwise user gettinmg more result => will add to the list (user scrolling or calling another page)\r\n const addToList = payload.query.since > 0;\r\n const list = addToList\r\n ? [...state.list, ...payload.data.hits]\r\n : syncListWithSelection([...payload.data.hits], state.selections);\r\n //then update the selection to remove any invalid selection that not in the list(will remove it if we need to keep selection for different search)\r\n const selections = getselections(list);\r\n return {\r\n ...state,\r\n totalCount: payload.data.total,\r\n list: list,\r\n totalPages: Math.ceil(payload.data.total / state.pageSize),\r\n selections: selections\r\n };\r\n }\r\n\r\n case SearchActions.UPDATE_SEARCH_PREREQUISITES:\r\n return {\r\n ...state,\r\n currentPage: payload.newSearch ? 1 : state.currentPage,\r\n list: payload.newSearch ? [] : state.list,\r\n selections: payload.resetSelectedAssets ? [] : state.selections\r\n };\r\n\r\n case ASSETS_FAILED_TO_POPULATE:\r\n return {\r\n ...state,\r\n list: [],\r\n message: payload || ''\r\n };\r\n\r\n case ASSETS_SELECTED:\r\n return {\r\n ...state,\r\n selections: payload\r\n };\r\n\r\n case ASSET_VIEWED:\r\n return {\r\n ...state,\r\n viewedAssetId: payload.id\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n FETCH_ATTRIBUTES_BEGIN,\r\n FETCH_ATTRIBUTES_SUCCESS,\r\n FETCH_ATTRIBUTES_FAILURE,\r\n FETCH_ATTRIBUTE_SECURITY,\r\n FETCH_ATTRIBUTE_SECURITY_SUCCESS,\r\n FETCH_ATTRIBUTE_SECURITY_FAILURE,\r\n ATTRIBUTE_CREATED\r\n} from './attributes.action';\r\n\r\nimport {INITIAL_STATE} from './attributes.state';\r\n\r\nexport const AttributeReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case FETCH_ATTRIBUTES_BEGIN:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: null\r\n };\r\n\r\n case FETCH_ATTRIBUTES_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n items: payload\r\n };\r\n\r\n case FETCH_ATTRIBUTES_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: payload\r\n };\r\n\r\n case ATTRIBUTE_CREATED:\r\n return {\r\n ...state,\r\n items: []\r\n };\r\n\r\n case FETCH_ATTRIBUTE_SECURITY:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: null\r\n };\r\n\r\n case FETCH_ATTRIBUTE_SECURITY_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n isSecuredLoaded: true,\r\n secured: payload\r\n };\r\n\r\n case FETCH_ATTRIBUTE_SECURITY_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: payload\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n SECURITY_GROUPS_RETRIEVAL_INITIATED,\r\n SECURITY_GROUPS_RETRIEVED,\r\n SECURITY_GROUPS_RETRIEVAL_FAILED\r\n} from './security.action';\r\n\r\nimport {INITIAL_STATE} from './security.state';\r\n\r\nexport const SecurityGroupsReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case SECURITY_GROUPS_RETRIEVAL_INITIATED:\r\n return Object.assign({}, state, {\r\n retrieveInProgress: true\r\n });\r\n\r\n case SECURITY_GROUPS_RETRIEVED:\r\n return Object.assign({}, state, {\r\n groups: payload,\r\n retrieveInProgress: false\r\n });\r\n\r\n case SECURITY_GROUPS_RETRIEVAL_FAILED:\r\n return Object.assign({}, state, {\r\n retrieveInProgress: false,\r\n error: payload\r\n });\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import moment from 'moment';\r\nimport update from 'immutability-helper';\r\n\r\nimport * as FavouriteActions from './favourite.action';\r\n\r\nimport {INITIAL_STATE} from './favourite.state';\r\n\r\nexport const FavouriteReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case FavouriteActions.FAVOURITES_FETCH_SUCCESS: {\r\n return {\r\n ...state,\r\n list: payload\r\n ? payload.map(item => {\r\n const {search} = item;\r\n search.searchTime = null;\r\n return item;\r\n })\r\n : []\r\n };\r\n }\r\n\r\n case FavouriteActions.FAVOURITE_AUDIT: {\r\n const updated = {...state};\r\n return update(updated, {\r\n list: {\r\n $apply: favourites =>\r\n favourites.map(fav => {\r\n fav.search.searchTime = fav.search.hash === payload.hash ? moment().utc() : fav.search.searchTime;\r\n return fav;\r\n })\r\n }\r\n });\r\n }\r\n case FavouriteActions.FAVOURITE_ADD_SUCCESS: {\r\n const updated = {...state};\r\n payload.search.searchTime = moment().utc();\r\n return update(updated, {list: {$push: [payload]}});\r\n }\r\n\r\n case FavouriteActions.FAVOURITE_UPDATE_SUCCESS: {\r\n const toUpdate = {...state};\r\n const {updated} = payload;\r\n return update(toUpdate, {\r\n list: {\r\n $apply: current => {\r\n return current.map(item => {\r\n if (item.id === updated.id) {\r\n item = {...item, ...updated};\r\n }\r\n\r\n return item;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n case FavouriteActions.FAVOURITE_REMOVE_SUCCESS: {\r\n const favourite = state.list.find(fav => fav.id === payload.id);\r\n if (!favourite) {\r\n return state;\r\n }\r\n\r\n return update(\r\n {...state},\r\n {\r\n list: {\r\n $apply: favourites => favourites.filter(f => f.id !== payload.id)\r\n },\r\n removedList: {$push: [favourite]}\r\n }\r\n );\r\n }\r\n\r\n case FavouriteActions.FAVOURITE_RESTORE_SUCCESS: {\r\n let updated = {...state};\r\n\r\n payload.restoredFavourites.forEach(restored => {\r\n restored.search.searchTime = null;\r\n updated = update(updated, {\r\n list: {$push: [restored]},\r\n removedList: {\r\n $apply: removedFavourites => removedFavourites.filter(fav => restored.id !== fav.id)\r\n }\r\n });\r\n });\r\n\r\n return updated;\r\n }\r\n\r\n case FavouriteActions.FAVOURITES_FETCH_FAILED:\r\n case FavouriteActions.FAVOURITE_ADD_FAILED:\r\n case FavouriteActions.FAVOURITE_UPDATE_FAILED:\r\n case FavouriteActions.FAVOURITE_REMOVE_FAILED:\r\n case FavouriteActions.FAVOURITE_RESTORE_FAILED:\r\n return {\r\n ...state,\r\n error: payload\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as UserActions from './user.actions';\r\nimport moment from 'moment';\r\n\r\nimport {INITIAL_STATE, DEFAULT_DATE_FORMAT} from './user.state';\r\n\r\nexport const CurrentUserReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case UserActions.REQUEST_USER_SUCCESS: {\r\n //hack to fix show images for now , as images is an account feature that does not have premmision\r\n //so we well give for every one as the code worked before\r\n //this line should be removed when we respect account feature that does not need user permission\r\n payload.features.push({\r\n path: 'images'\r\n });\r\n\r\n payload.permissions = payload.features.map(u => u.path);\r\n\r\n // add moment localization\r\n const {\r\n claims: {\r\n data: {timezone: userTimezone, language: userLanguage}\r\n }\r\n } = payload;\r\n\r\n if (userTimezone) {\r\n moment.tz.setDefault(userTimezone);\r\n }\r\n\r\n if (userLanguage) {\r\n moment.tz.setDefault(userLanguage);\r\n }\r\n\r\n moment.locale(payload.claims.data.language);\r\n\r\n // Get locale data\r\n const localeData = moment.localeData();\r\n const localDateFormat = localeData.longDateFormat('L');\r\n let {dateFormat = localDateFormat || DEFAULT_DATE_FORMAT} = payload.claims.data;\r\n\r\n // don't clobber any existing claims\r\n payload.claims = {...payload.claims, ...state.claims};\r\n\r\n return {\r\n ...state,\r\n ...payload,\r\n dateFormat: dateFormat\r\n };\r\n }\r\n case UserActions.REQUEST_CLAIMS_SUCCESS: {\r\n //if user did not set his dateformat keep using state one\r\n let {dateFormat = state.dateFormat} = payload.data;\r\n return {\r\n ...state,\r\n claims: {\r\n ...state.claims,\r\n data: {...payload.data}\r\n },\r\n dateFormat: dateFormat\r\n };\r\n }\r\n case UserActions.RECEIVE_USER_CLAIMS:\r\n return {\r\n ...state,\r\n claims: {\r\n ...state.claims,\r\n ...payload\r\n }\r\n };\r\n case UserActions.REQUEST_USER_FAIL:\r\n return {\r\n ...state,\r\n error: payload\r\n };\r\n case UserActions.REQUEST_USER_ACCOUNTS_SUCCESS: {\r\n const {accounts, currentAccount, memberShips, accountNameLookup} = payload;\r\n\r\n return {\r\n ...state,\r\n switchableAccounts: accounts,\r\n memberShipCount: memberShips.length,\r\n currentAccount: currentAccount,\r\n accountNameLookup: accountNameLookup\r\n };\r\n }\r\n case UserActions.REQUEST_USER_ACCOUNTS_FAIL:\r\n return {\r\n ...state,\r\n accountsError: payload\r\n };\r\n case UserActions.REQUEST_DATAPOINTS_DESCRIPTORS_SUCCESS:\r\n return {\r\n ...state,\r\n datapointDescriptors: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {NOTIFICATION_CHECK_SUPPORT, NOTIFICATION_DISMISS_TYPE} from './notification.action';\r\n\r\nimport {INITIAL_STATE} from './notification.state';\r\n\r\nexport const NotificationReducer = (state = INITIAL_STATE, {type, payload}) => {\r\n switch (type) {\r\n case NOTIFICATION_CHECK_SUPPORT:\r\n return {\r\n ...state,\r\n visible: payload\r\n };\r\n case NOTIFICATION_DISMISS_TYPE:\r\n return {\r\n ...state,\r\n visible: false\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { HISTORY_SELECTED } from './history.action';\r\n\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\nexport const HistoryAnalytics = {\r\n [HISTORY_SELECTED]: action => addToDataLayer({\r\n event: 'historyUpdated',\r\n data: action.payload.name || 'unknown'\r\n })\r\n};\r\n","import {\r\n FAVOURITE_ADDED,\r\n FAVOURITE_REMOVED,\r\n FAVOURITE_REMOVE_SUCCESS,\r\n FAVOURITE_SELECTED,\r\n FAVOURITE_OLD_SELECTED,\r\n FAVOURITE_ADD_SUCCESS,\r\n FAVOURITE_UPDATE_SUCCESS,\r\n FAVOURITES_FETCH_FAILED,\r\n FAVOURITE_ADD_FAILED,\r\n FAVOURITE_REMOVE_FAILED,\r\n FAVOURITE_UPDATE_FAILED\r\n} from './favourite.action';\r\n\r\n// GTM-UPDATE\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\n\r\nconst favouriteClicked = () => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-clicked'\r\n});\r\n\r\nconst favouriteAdded = () => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-added'\r\n});\r\n\r\nconst favouriteRemoved = () => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-removed'\r\n});\r\n\r\n// const favouriteRemovedSuccess = () => ({\r\n// hitType: 'event',\r\n// eventCategory: 'asset-search',\r\n// eventAction: 'favourite-removed-success'\r\n// });\r\n\r\nconst favouriteOldSelected = () => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'old-favourite-clicked'\r\n});\r\n\r\nconst favouriteSavedSuccess = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-saved-success',\r\n eventLabel: JSON.stringify(action.payload)\r\n});\r\n\r\n// const favouriteUpdatedSuccess = action => ({\r\n// hitType: 'event',\r\n// eventCategory: 'asset-search',\r\n// eventAction: 'favourite-updated-success',\r\n// eventLabel: JSON.stringify(action.payload)\r\n// });\r\n\r\nconst favouriteSavedFailed = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-saved-failed',\r\n eventLabel: JSON.stringify(action.payload)\r\n});\r\n\r\nconst favouriteUpdatedFailed = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-updated-failed',\r\n eventLabel: JSON.stringify(action.payload)\r\n});\r\n\r\nconst favouriteRemovedFailed = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'favourite-removed-failed',\r\n eventLabel: JSON.stringify(action.payload)\r\n});\r\n\r\n// const favouritefetchFailed = action => ({\r\n// hitType: 'event',\r\n// eventCategory: 'asset-search',\r\n// eventAction: 'favourite-fetch-failed',\r\n// eventLabel: JSON.stringify(action.payload)\r\n// });\r\n\r\nexport const FavouriteAnalytics = {\r\n [FAVOURITE_SELECTED]: favouriteClicked,\r\n [FAVOURITE_REMOVED]: favouriteRemoved,\r\n [FAVOURITE_ADDED]: favouriteAdded,\r\n [FAVOURITE_OLD_SELECTED]: favouriteOldSelected,\r\n [FAVOURITE_ADD_SUCCESS]: favouriteSavedSuccess,\r\n // [FAVOURITE_UPDATE_SUCCESS]: favouriteUpdatedSuccess,\r\n [FAVOURITE_UPDATE_SUCCESS]: action => addToDataLayer({\r\n event: 'favoriteUpdated',\r\n data: action.payload\r\n }),\r\n // [FAVOURITE_REMOVE_SUCCESS]: favouriteRemovedSuccess,\r\n [FAVOURITE_REMOVE_SUCCESS]: action => addToDataLayer({\r\n event: 'favoriteRemoved',\r\n data: action.payload\r\n }),\r\n [FAVOURITE_ADD_FAILED]: favouriteSavedFailed,\r\n [FAVOURITE_UPDATE_FAILED]: favouriteUpdatedFailed,\r\n [FAVOURITE_REMOVE_FAILED]: favouriteRemovedFailed,\r\n // [FAVOURITES_FETCH_FAILED]: favouritefetchFailed,\r\n\r\n [FAVOURITES_FETCH_FAILED]: action => addToDataLayer({\r\n event: 'failure',\r\n data: action.payload\r\n })\r\n};\r\n","import {\r\n SORT_UPDATED,\r\n QUERY_ADDED,\r\n QUERY_REMOVED,\r\n SEARCH_SUCCESS,\r\n FACET_SELECTED,\r\n FACET_SELECTED_EXCLUSIVE,\r\n FACET_DESELECTED,\r\n FACET_DESELECTED_EXCLUSIVE,\r\n SEARCH_RESET,\r\n TAG_FILTER_ADDED,\r\n TAG_FILTER_REMOVED,\r\n TAG_FILTERS_UPDATED,\r\n SEARCH_FAILURE,\r\n} from './search.action';\r\n\r\nimport { adaptFacets } from './search.state';\r\n\r\n// GTM-UPDATE -> GTM UPDATED\r\nconst addToDataLayer = (data) => window.dataLayer.push(data);\r\n\r\nconst queryAdded = (action) => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'query-Added',\r\n eventLabel: action.payload,\r\n});\r\n\r\nconst queryRemoved = (action) => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'query-Removed',\r\n eventLabel: action.payload,\r\n});\r\n\r\nconst searchSuccess = (action, prevState) => {\r\n const query = prevState.search.query;\r\n const sort = prevState.search.sort[0];\r\n const facets = [];\r\n let hasFiltered = false;\r\n Object.keys(adaptFacets(prevState.search)).forEach((key) =>\r\n prevState.search[key].forEach((facet) => {\r\n if (facet._selected) {\r\n facets.push({ type: key, value: facet.id });\r\n hasFiltered = true;\r\n }\r\n }),\r\n );\r\n\r\n if (!hasFiltered) {\r\n if (\r\n query.length > 1 ||\r\n (query.length === 1 && query !== '*') ||\r\n (!Array.isArray(prevState.search.tagFilters) &&\r\n Object.keys(prevState.search.tagFilters).length > 0)\r\n ) {\r\n hasFiltered = true;\r\n } else {\r\n prevState.search.accounts.forEach((account) => {\r\n if (account._selected) hasFiltered = true;\r\n });\r\n }\r\n }\r\n\r\n const data = {\r\n sort: prevState.search.sort,\r\n facets,\r\n };\r\n\r\n if (hasFiltered) data.totalAssetsFiltered = action.payload.data.total;\r\n else data.totalAssets = action.payload.data.total;\r\n addToDataLayer({\r\n event: 'assetSearchSucceeded',\r\n data: data,\r\n });\r\n\r\n return {\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'search',\r\n eventLabel: JSON.stringify({\r\n query: query,\r\n sort: sort,\r\n facets: facets,\r\n }),\r\n eventValue: action.payload.data.total,\r\n };\r\n};\r\n\r\nexport const SearchAnalytics = {\r\n [QUERY_ADDED]: queryAdded,\r\n\r\n [QUERY_REMOVED]: queryRemoved,\r\n\r\n [SEARCH_SUCCESS]: searchSuccess,\r\n\r\n [SORT_UPDATED]: (action, prevState) =>\r\n addToDataLayer({\r\n event: 'sortUpdated',\r\n data: {\r\n type: action.payload,\r\n direction: prevState.search.sort.direction,\r\n },\r\n }),\r\n\r\n [FACET_SELECTED]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsFiltered',\r\n data: {\r\n type: action.payload.facetType,\r\n value: action.payload.value.id,\r\n },\r\n }),\r\n\r\n [FACET_SELECTED_EXCLUSIVE]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsFilteredExclusive',\r\n data: {\r\n type: action.payload.facetType,\r\n value: action.payload.value.id,\r\n },\r\n }),\r\n\r\n [FACET_DESELECTED]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsFilterRemoved',\r\n data: {\r\n type: action.payload.facetType,\r\n value: action.payload.value.id,\r\n },\r\n }),\r\n\r\n [FACET_DESELECTED_EXCLUSIVE]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsFilteredExclusiveRemoved',\r\n data: {\r\n type: action.payload.facetType,\r\n value: action.payload.value.id,\r\n },\r\n }),\r\n\r\n [SEARCH_RESET]: () =>\r\n addToDataLayer({\r\n event: 'searchCleared',\r\n }),\r\n\r\n [TAG_FILTER_ADDED]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsTagFilterAdded',\r\n data: JSON.stringify(action.payload),\r\n }),\r\n\r\n [TAG_FILTER_REMOVED]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsTagFilterRemoved',\r\n data: action.payload,\r\n }),\r\n\r\n [TAG_FILTERS_UPDATED]: (action) =>\r\n addToDataLayer({\r\n event: 'assetsTagFiltersUpdated',\r\n data: action,\r\n }),\r\n\r\n [SEARCH_FAILURE]: (action) =>\r\n addToDataLayer({\r\n event: 'searchFailed',\r\n data: action.payload,\r\n }),\r\n};\r\n","import {\r\n PAGESIZE_UPDATED,\r\n PAGE_SELECTED,\r\n ASSETS_FAILED_TO_POPULATE,\r\n ASSETS_SELECTED,\r\n ASSET_VIEWED\r\n} from './assets.action';\r\n\r\n// GTM-UPDATE\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\n\r\nconst assetViewed = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'asset-Viewed',\r\n eventLabel: action.payload.id\r\n});\r\n\r\n// const assetsPageSelected = action => ({\r\n// hitType: 'event',\r\n// eventCategory: 'asset-search',\r\n// eventAction: 'asset-page-selected',\r\n// eventLabel: action.payload\r\n// });\r\n\r\nconst assetsPageSizeUpdated = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'assets-page-size-updated',\r\n eventLabel: action.payload\r\n});\r\n\r\nconst assetsFailedToPopulate = action => ({\r\n hitType: 'event',\r\n eventCategory: 'asset-search',\r\n eventAction: 'assets-failed-to-populate',\r\n eventLabel: action.payload\r\n});\r\n\r\n// const assetsSelected = () => ({\r\n// hitType: 'event',\r\n// eventCategory: 'asset-search',\r\n// eventAction: 'assets-selected'\r\n// });\r\n\r\nexport const AssetsAnalytics = {\r\n [PAGESIZE_UPDATED]: assetsPageSizeUpdated,\r\n [ASSET_VIEWED]: assetViewed,\r\n // [PAGE_SELECTED]: assetsPageSelected,\r\n [PAGE_SELECTED]: action => addToDataLayer({\r\n event: 'assetsPaging',\r\n data: action.payload\r\n }),\r\n [ASSETS_FAILED_TO_POPULATE]: assetsFailedToPopulate,\r\n // [ASSETS_SELECTED]: assetsSelected,\r\n [ASSETS_SELECTED]: action => addToDataLayer({\r\n event: 'assetsSelected',\r\n data: action.payload.map((selected) => { return { name: selected.name, id: selected.id } })\r\n }),\r\n};\r\n","import { COLUMN_VISIBLE_TOGGLED } from './table-columns.action';\r\n\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\nexport const TableColmunsAnalytics = {\r\n [COLUMN_VISIBLE_TOGGLED]: action => addToDataLayer({\r\n event: 'columnVisibilityToggled',\r\n column: action.payload.label\r\n })\r\n};\r\n","import { FETCH_ATTRIBUTES_FAILURE } from './attributes.action';\r\n\r\n// GTM-UPDATE\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\nexport const AttributesAnalytics = {\r\n\t// [FETCH_ATTRIBUTES_FAILURE]: attributesFetchFailed,\r\n\t[FETCH_ATTRIBUTES_FAILURE]: action => addToDataLayer({\r\n\t\tevent: 'failure',\r\n\t\tdata: action.payload\r\n\t})\r\n};\r\n","import { SECURITY_GROUPS_RETRIEVAL_FAILED } from './security.action';\r\n\r\nconst addToDataLayer = data => window.dataLayer.push(data);\r\n\r\nexport const securityGroupsAnalytics = {\r\n [SECURITY_GROUPS_RETRIEVAL_FAILED]: action => addToDataLayer({\r\n event: 'failure',\r\n data: JSON.stringify(action.payload)\r\n })\r\n};\r\n","import { SearchWhiteListKeys, SearchBlackListKeys } from './search/search.state';\r\nimport { AssetsWhiteListKeys } from './assets/assets.state';\r\nimport { TableColumnsWhiteListKeys } from './table-columns/table-columns.state';\r\nimport { HistoryWhiteListKeys } from './history/history.state';\r\nimport { CurrentUserWhiteListKeys } from './user/user.state';\r\n\r\n//list of the keys that will be saved\r\nexport const CombinedWhiteListKeys = [\r\n ...SearchWhiteListKeys,\r\n ...AssetsWhiteListKeys,\r\n ...TableColumnsWhiteListKeys,\r\n ...HistoryWhiteListKeys,\r\n ...CurrentUserWhiteListKeys\r\n];\r\n\r\n//list of the keys that will be excluded from the saved\r\nexport const CombinedBlackListKeys = [...SearchBlackListKeys];\r\n","import { createStore, applyMiddleware, compose } from 'redux';\r\nimport { createMiddleware as createAnalyticsMiddleware } from 'redux-beacon';\r\nimport { createEpicMiddleware } from 'redux-observable';\r\nimport thunk from 'redux-thunk';\r\nimport * as storage from 'redux-storage';\r\nimport createEngine from 'redux-storage-engine-sessionstorage';\r\nimport debounce from 'redux-storage-decorator-debounce';\r\nimport filter from 'redux-storage-decorator-filter';\r\nimport { RootReducer, RootEpic } from './root.reducer';\r\nimport { createCatchMiddleware } from './create-catch.middleware';\r\n\r\n//Analytics Imports\r\nimport { GoogleAnalytics } from 'redux-beacon/targets/google-analytics';\r\nimport { analyticsLogger } from 'redux-beacon/extensions/logger';\r\nimport { HistoryAnalytics } from './history/history.analytics';\r\nimport { FavouriteAnalytics } from './favourite/favourite.analytics';\r\nimport { SearchAnalytics } from './search/search.analytics';\r\nimport { AssetsAnalytics } from './assets/assets.analytics';\r\nimport { TableColmunsAnalytics } from './table-columns/table-colmuns.analytics';\r\nimport { AttributesAnalytics } from './attributes/attributes.analytics';\r\nimport { securityGroupsAnalytics } from './security/security.analytics';\r\nimport { CombinedBlackListKeys, CombinedWhiteListKeys } from './state.saved.keys';\r\n\r\nexport const StorageEngine = debounce(\r\n filter(createEngine('onei3-state'), CombinedWhiteListKeys, CombinedBlackListKeys),\r\n 1500\r\n);\r\nconst errorHandler = (error, state, action, dispatch) => {\r\n console.error(error);\r\n //todo log error to Api\r\n};\r\nclass Store {\r\n constructor() {\r\n this.store = null;\r\n }\r\n\r\n create() {\r\n const analyticsMiddleware = createAnalyticsMiddleware(\r\n {\r\n ...HistoryAnalytics,\r\n ...FavouriteAnalytics,\r\n ...SearchAnalytics,\r\n ...AssetsAnalytics,\r\n ...TableColmunsAnalytics,\r\n ...AttributesAnalytics,\r\n ...securityGroupsAnalytics\r\n },\r\n events => {\r\n // console.log(' These are the events you seek David: ', events);\r\n // GoogleAnalytics(events);\r\n },\r\n { analyticsLogger }\r\n );\r\n\r\n const storageMiddleware = storage.createMiddleware(StorageEngine);\r\n const epicMiddleware = createEpicMiddleware();\r\n //midleware to catch reduce error so wont reach epics then terminate them\r\n const catchMiddleware = createCatchMiddleware(errorHandler);\r\n\r\n let middleware =\r\n process.env.NODE_ENV === 'testing'\r\n ? [thunk, catchMiddleware, epicMiddleware, storageMiddleware]\r\n : [thunk, catchMiddleware, epicMiddleware, analyticsMiddleware, storageMiddleware];\r\n\r\n let composeEnhancers = compose;\r\n\r\n if (process.env.NODE_ENV === 'local' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) {\r\n composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;\r\n }\r\n\r\n // Merge our application reducers with the required storage-sync reducer\r\n const finalRootReducer = storage.reducer(RootReducer);\r\n\r\n this.store = createStore(finalRootReducer, composeEnhancers(applyMiddleware(...middleware)));\r\n\r\n epicMiddleware.run(RootEpic);\r\n\r\n return this.store;\r\n }\r\n\r\n loadFromStorage() {\r\n const storageLoader = storage.createLoader(StorageEngine);\r\n //load saved state/store from the storage\r\n storageLoader(this.store);\r\n }\r\n}\r\n\r\nexport default new Store();\r\n","/**\r\n * https://github.com/redux-observable/redux-observable/issues/94#issuecomment-283228607\r\n * https://github.com/PlatziDev/redux-catch\r\n */\r\n\r\nexport function createCatchMiddleware(errorHandler) {\r\n return function(store) {\r\n return function(next) {\r\n return function(action) {\r\n try {\r\n return next(action);\r\n } catch (err) {\r\n errorHandler(err, store.getState, action, store.dispatch);\r\n return err;\r\n }\r\n };\r\n };\r\n };\r\n}\r\n","import Store from './state/store';\r\nimport axios from 'axios';\r\nimport axiosCancel from 'axios-cancel';\r\nimport Auth from './auth';\r\nimport AngularAppModule from './app.module';\r\nimport * as ReportActions from './state/reports/reports.actions';\r\nimport * as FavouriteActions from './state/favourite/favourite.action';\r\nimport * as AppActions from './state/app/app.actions';\r\nimport * as UserActions from './state/user/user.actions';\r\nimport cssVars from 'css-vars-ponyfill';\r\nimport AppSettings from './app.settings';\r\nimport * as amplitude from '@amplitude/analytics-browser';\r\n\r\nif (process.env.NODE_ENV === 'testing') {\r\n Auth.setUser({\r\n token_type: 'Bearer',\r\n access_token: 'faketoken'\r\n });\r\n}\r\n\r\nclass App {\r\n constructor() {\r\n this.initialized = false;\r\n\r\n this.axios = axios.create();\r\n axiosCancel(this.axios);\r\n\r\n this.store = Store.create();\r\n this.amplitude = amplitude;\r\n\r\n // ponyfill settings\r\n cssVars({\r\n // Connect MutationObserver for css link update\r\n watch: true\r\n });\r\n }\r\n\r\n checkLocalStorageHack() {\r\n return localStorage.getItem('portal-bypass');\r\n }\r\n\r\n async init() {\r\n if (this.initialized) {\r\n return;\r\n }\r\n\r\n try {\r\n await Auth.init();\r\n\r\n if (process.env.NODE_ENV !== 'testing') {\r\n let userLoggedIn = await Auth.userIsLoggedIn();\r\n\r\n if (!userLoggedIn) {\r\n Auth.startAuthentication();\r\n return;\r\n }\r\n }\r\n } catch (err) {\r\n console.log('Access token already exists or initialization has failed.'); // eslint-disable-line no-console\r\n }\r\n\r\n const claims = Auth.getClaims();\r\n\r\n if (claims) {\r\n this.store.dispatch(UserActions.receiveUserClaims(claims));\r\n const brand = claims['tenant:brand'];\r\n this.loadBranding(brand);\r\n }\r\n\r\n this.configureAxios();\r\n\r\n this.store.dispatch(AppActions.initialize());\r\n\r\n this.configureAmplitude();\r\n\r\n AngularAppModule.init();\r\n\r\n this.initialized = true;\r\n }\r\n\r\n getStore() {\r\n return this.store;\r\n }\r\n\r\n configureAxios() {\r\n this.axios.defaults.headers.common['Content-Type'] = 'application/json';\r\n\r\n this.axios.interceptors.request.use(\r\n config => {\r\n config.headers.Authorization = Auth.getAuthorizationHeader();\r\n return config;\r\n },\r\n err => Promise.reject(err)\r\n );\r\n }\r\n\r\n configureAmplitude() {\r\n amplitude.init(AppSettings.AmplitudeAPIKEY, {\r\n defaultTracking: true\r\n });\r\n }\r\n\r\n redirectToLogin() {\r\n window.location.href = '/home';\r\n }\r\n\r\n getAxios() {\r\n return this.axios;\r\n }\r\n\r\n loadBranding(brand = 'onei3') {\r\n //add brand css link to the DOM file\r\n const head = document.head;\r\n //Favicon cache busting\r\n const randomVersion = Math.floor(Math.random() * Math.floor(10000)) + 1;\r\n // Fav icon\r\n const favicon = document.createElement('link');\r\n favicon.rel = 'icon';\r\n favicon.href = `${\r\n AppSettings.BrandingImageUrl\r\n }/c_scale,q_auto:best,w_32,c_fill${brand === 'onei3' ? ',b_rgb:003366' : ''}/v1/b/${brand}/mobile.png?v=${randomVersion}`;\r\n head.appendChild(favicon);\r\n\r\n // Add brand colouration\r\n const brandCSSLink = document.createElement('link');\r\n brandCSSLink.type = 'text/css';\r\n brandCSSLink.rel = 'stylesheet';\r\n brandCSSLink.href = `${AppSettings.BrandingFileUrl}/v1/b/${brand}/brand.css`;\r\n head.appendChild(brandCSSLink);\r\n\r\n // Add any special css that the protal needs for the brand\r\n const webPortalCSSLink = document.createElement('link');\r\n webPortalCSSLink.type = 'text/css';\r\n webPortalCSSLink.rel = 'stylesheet';\r\n webPortalCSSLink.href = `${AppSettings.BrandingFileUrl}/v1/b/${brand}/webportal.css`;\r\n head.appendChild(webPortalCSSLink);\r\n\r\n //set branding for mobile logo\r\n for (const size of AppSettings.MobileIconSizes) {\r\n const mobileLink = document.createElement('link');\r\n mobileLink.size = `${size}x${size}`;\r\n mobileLink.rel = 'apple-touch-icon';\r\n // We shoudl update this to use branding colour to update mobile icon transparencies if they exist\r\n const url = `${\r\n AppSettings.BrandingImageUrl\r\n }/c_scale,q_auto:best,w_${size},c_fill,b_rgb:003366/v1/b/${brand}/mobile.png`;\r\n mobileLink.href = url;\r\n head.appendChild(mobileLink);\r\n }\r\n\r\n //Set brand logo\r\n const brandLogoUrl = `${AppSettings.BrandingImageUrl}/v1/b/${brand}/logo.png`;\r\n\r\n //load brand logo to init loading\r\n const initialLoadingImg = document.getElementById('initial-loading-logo');\r\n initialLoadingImg.src = brandLogoUrl;\r\n\r\n //Set onei3 corner icon\r\n var onei3CornerIcon = `${AppSettings.BrandingImageUrl}/c_scale,q_auto:best,w_144/v1/b/onei3/mobile.png`;\r\n if (brand !== 'onei3') {\r\n onei3CornerIcon = `${AppSettings.BrandingImageUrl}/c_scale,q_auto:best,w_144/v1/b/onei3/mobile-white.png`;\r\n }\r\n\r\n this.store.dispatch(AppActions.appBranding(brandLogoUrl, onei3CornerIcon));\r\n }\r\n}\r\n\r\nexport default new App();\r\n","/**\r\n * This file is the webpack bundler entry point.\r\n *\r\n * All scripts required by our application are pulled in\r\n * as dependencies where they are used.\r\n */\r\nimport '@babel/polyfill';\r\nimport App from './app';\r\n\r\nif (App.checkLocalStorageHack()) {\r\n document.body.innerHTML = '';\r\n\r\n let error = document.createElement('div');\r\n error.innerHTML = '

                Session Expired. Please contact your system administrator.

                If the problem persists, please contact telematics@ur.com

                ';\r\n \r\n document.body.appendChild(error);\r\n} else {\r\n (async () => await App.init())();\r\n}\r\n","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Notifications

                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                {{note.title}}
                \\r\\n
                {{note.createDate | TableDateFilter}}
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                {{note.descriptionText}}
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                  \\r\\n\\r\\n
                1. \\r\\n\\r\\n \\r\\n {{ option.name }}\\r\\n \\r\\n \\r\\n
                2. \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Delete Saved Filter

                \\r\\n
                \\r\\n
                \\r\\n

                CAUTION : All filters associated with this Saved Filter will be removed immediately.

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n Deleting Saved Filter, Please wait.\\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Save As Existing Filter

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n

                CAUTION : When overwriting a Saved Filter it is important to understand that all filters previously associated with this Saved Filter will become unrecoverable.

                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n Overwriting Saved Filter, Please wait.\\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n\\r\\n There was an error finding the ESN that was provided.\\r\\n Confirm the ESN is correct or contact your administrator.\\r\\n\\r\\n 1\\\">Multiple Assets were found matching the provided ESN.\\r\\n
                1\\\" class=\\\"asset_items\\\">\\r\\n
                \\r\\n {{item.name}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n Displaying {{assetsnum}} / {{ totalnum }} Assets\\r\\n - {{selectedNum}} selected\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n Loading more data...\\r\\n
                \\r\\n\\r\\n
                \\r\\n Scroll down for more assets.\\r\\n
                \\r\\n\\r\\n
                \\r\\n No results left.\\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \";","module.exports = \"
                \";","module.exports = \"
                \\r\\n \\r\\n
                \";","module.exports = \"\\r\\n\\r\\n
                \\r\\n
                \\r\\n Alert State\\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n Maintenance Status\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Security Groups\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                  \\r\\n
                1. \\r\\n \\r\\n {{ option.name }}\\r\\n \\r\\n \\r\\n
                2. \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                  \\r\\n
                1. \\r\\n \\r\\n {{ option.name }}\\r\\n \\r\\n \\r\\n
                2. \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                  \\r\\n\\r\\n
                1. \\r\\n\\r\\n \\r\\n {{ option.name }}\\r\\n \\r\\n \\r\\n
                2. \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Are you sure you want to delete this image?

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n\\r\\n 0\\\" \\r\\n class=\\\"btn btn-default map-filter-summary\\\" style=\\\"margin-right:4px; cursor:default;\\\" >\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Alert Priority:\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n :\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n {{item.name}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n 1\\\">\\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Maintenance Status:\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n :\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n {{item.name}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n 1\\\">\\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Security Group:\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n {{item.name}}\\r\\n \\r\\n \\r\\n \\r\\n 1\\\">\\r\\n {{selectedFacets(facet).length}}\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{selectedFacets(facet)[0].group| translate}}:\\r\\n {{selectedFacets(facet)[0].label |translate}}\\r\\n \\r\\n \\r\\n \\r\\n 0\\\">\\r\\n Last Seen:\\r\\n {{facet[0].label | translate}}\\r\\n \\r\\n {{min}}-{{max}} Days\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n {{$first ? '' : ','}}\\r\\n \\r\\n {{key}}\\r\\n \\r\\n \\r\\n \\r\\n = 2\\\" >\\r\\n \\r\\n Attributes\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n {{tagsLength()}}\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Save Filters

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                Please enter a name and a brief description to describe the filters you are saving.

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Name is required\\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Saving Filters, Please wait.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n Name\\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{savedFilter.name}}\\r\\n
                \\r\\n

                {{savedFilter.description}}

                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n 0 && savedFiltersModels.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in saved filters for '{{text}}'.\\r\\n \\r\\n \\r\\n No saved filters found.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                  = 1 && isPaging\\\"\\r\\n total-items=\\\"totalItems\\\"\\r\\n ng-model=\\\"current.savedFiltersPage\\\"\\r\\n boundary-link-numbers=\\\"true\\\"\\r\\n max-size=\\\"maxSize\\\" class=\\\"pagination-sm pull-left\\\"\\r\\n items-per-page=\\\"itemsPerPage\\\"\\r\\n previous-text=\\\"<\\\"\\r\\n next-text=\\\">\\\"\\r\\n ng-change=\\\"pageChanged()\\\">\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                My Filters

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n Name\\r\\n \\r\\n
                \\r\\n
                \\r\\n {{savedFilter.name}}\\r\\n
                \\r\\n

                {{savedFilter.description}}

                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Name is required\\r\\n \\r\\n Name can not be more than 100 characters\\r\\n \\r\\n \\r\\n Name already exists, please rename the saved filter.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n 0 && savedFiltersModels.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in saved filters for '{{text}}'.\\r\\n \\r\\n \\r\\n No saved filters found.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                  = 1\\\" total-items=\\\"totalItems\\\" ng-model=\\\"current.savedFiltersPage\\\" ng-disabled=\\\"disabled.edit\\\" boundary-link-numbers=\\\"true\\\" max-size=\\\"maxSize\\\" class=\\\"pagination-sm pull-left tr-saved-filters-pagination\\\" items-per-page=\\\"itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"pageChanged()\\\">
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n {{error}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                Alert Priority
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n {{$item.name | translate}}\\r\\n \\r\\n \\r\\n \\r\\n {{facet.name | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                Maintenance
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n {{$item.name | translate}}\\r\\n \\r\\n \\r\\n {{facet.name | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                Security Groups
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n {{$item.name}}\\r\\n \\r\\n \\r\\n {{facet.name}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                Last Communicated
                \\r\\n \\r\\n
                \\r\\n
                Last Seen
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                {{tag.key}}\\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n (any)\\r\\n Please enter a value.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n Please enter a value.\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n Please enter a value.\\r\\n
                \\r\\n \\r\\n (any)\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n Please enter a value.\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n Please enter a value.\\r\\n \\r\\n \\r\\n (any)\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n\\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n\\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n\\r\\n \\r\\n \\r\\n (any)\\r\\n Invalid\\r\\n range.\\r\\n Select\\r\\n range boundaries.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n
                \\r\\n\\r\\n Invalid value.\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n
                \\r\\n\\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n
                \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n

                \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n Invalid value.\\r\\n \\r\\n \\r\\n (any)\\r\\n Invalid range.\\r\\n Select range boundaries.\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                0 && (tags | filter:filterSelected).length > 0\\\" style=\\\"margin-bottom:10px;\\\">\\r\\n
                Add Attribute Filter:
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n {{name}} Issue:\\r\\n {{healthStatus.name}}:\\r\\n \\r\\n {{healthStatus.text}}\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n There are no historic commands for this asset. A command will be added to history once its been issued.\\r\\n
                \\r\\n\\r\\n
                0 && !vm.updating\\\">\\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n Command\\r\\n User\\r\\n Status\\r\\n
                \\r\\n
                \\r\\n Date\\r\\n Started\\r\\n Completed\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n {{command.label | commandTranslateFilter}}\\r\\n \\r\\n {{command.user ? command.user.name : \\\"\\\"}}\\r\\n {{command.uiStatus | translate | capitalize}}\\r\\n
                \\r\\n
                \\r\\n {{command.createdAt | DateFilter}}\\r\\n {{command.createdAt | date: 'h:mm a'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{command.statusAt | date: 'h:mm a'}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n There are no historic commands for this asset. A command will be added to history once its been\\r\\n issued.\\r\\n
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n

                There are no commands available for this equipment

                \\r\\n
                \\r\\n
                0\\\">\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                0\\\" ng-repeat=\\\"parameter in command.parameters | orderBy: 'ordinal' | filter: {readOnly:false}\\\">\\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n {{group.label | commandTranslateFilter}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                You are about to
                \\r\\n

                \\r\\n Send {{name}} command\\r\\n Set {{name}} to {{val}}\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Failed to send the command. Please try again\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Browser Policy

                \\r\\n
                \\r\\n

                In order to ensure security and to provide the best possible experience we only support the latest\\r\\n browsers.\\r\\n

                \\r\\n

                \\r\\n Click here to\\r\\n view if yours is up to date.\\r\\n

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Browser Options

                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Access Denied\\r\\n

                \\r\\n
                \\r\\n

                You do not have the correct permissions to view this page. Check with your systems administrator in order to gain access.

                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                \\r\\n Deactivate Device\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n Are you sure you want to deactivate this device?\\r\\n

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n

                When deactivating a device it is important to understand that all Asset data associated with the device will become unrecoverable. All visibility of the device will be removed immediately.

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n

                CAUTION : This CDMA device can NOT be reactivated once deleted.\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n Deactivating device, Please wait.\\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n CAUTION! This CDMA device can NOT be reactivated once deleted.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n Deactivating device, Please wait.\\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Select Template

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                Template Name
                \\r\\n \\r\\n
                \\r\\n {{ product.name }}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                = 1\\\">\\r\\n
                  \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                Template Details
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{product.name}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{product.metadata.make}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{product.metadata.model}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{product.package.name}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n {{module.name}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Welcome to the Telematics Activation Process. This process will\\r\\n capture the telematics device and the asset it is being attached to, verifying\\r\\n the device is communicating and providing a location, and capturing any user\\r\\n notes during the installation. To begin, enter your telematics serial number\\r\\n below.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                Asset Information

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n Telematics Serial Number is required\\r\\n \\r\\n \\r\\n {{deviceSerialNumberError}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Name is required\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Package is required\\r\\n \\r\\n
                \\r\\n\\r\\n
                0\\\">\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Make is required\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Model is required\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Model Year is required\\r\\n \\r\\n \\r\\n Year can only contain numbers from 0-9.\\r\\n \\r\\n \\r\\n Year must be at least 2 characters long.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n VIN / MFG Serial Number is required\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n Security Group is required.\\r\\n \\r\\n
                \\r\\n
                0\\\"\\r\\n requires-features=\\\"['devices.transfer']\\\">\\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n Please enter a value.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n
                \\r\\n \\r\\n Please enter a value.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n All fields with * are required\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n Validating Serial Number, Please wait.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Activating device, Please wait.\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{ transferSuccessMsg }}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{ activationSuccessMsg }}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Verify Asset Communication?

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n Processing Installation, Please wait.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Connect Device

                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Device Communication Status

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n

                \\r\\n The device has successfully communicated.\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n

                \\r\\n \\r\\n The device did not successfully communicate.\\r\\n Please ensure the device is connected, and the asset is in an area\\r\\n that will provide a clear cellular and satellite signal.\\r\\n \\r\\n

                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n Attempting to communicate, Please wait.\\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                GPS Location

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Confirm Run Hours

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Last Reported Data

                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n {{datapoint.title}}\\r\\n \\r\\n {{datapoint.last.v | attrsValueTranslate:datapoint}}\\r\\n
                \\r\\n
                {{datapoint.last.t | TableDateFilter}}
                \\r\\n
                \\r\\n No Data Available\\r\\n No Data\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{seriesDataMsg}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n

                Installation Notes

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{ error }}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n Device Details\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n Telematics Serial Number\\r\\n \\r\\n {{installation.device.serialNumber}}\\r\\n
                \\r\\n Device Model\\r\\n \\r\\n {{installation.device.attrs.model}}\\r\\n
                \\r\\n Device Firmware Version\\r\\n \\r\\n {{installation.device.attrs.firmware_ver || ('Unavailable' | translate)}}\\r\\n
                \\r\\n Device Configuration Version\\r\\n \\r\\n {{installation.device.attrs.config_ver || ('Unavailable' | translate)}}\\r\\n
                \\r\\n Packages\\r\\n \\r\\n
                \\r\\n {{p.name}}\\r\\n
                \\r\\n
                \\r\\n \\r\\n Modules\\r\\n \\r\\n \\r\\n
                \\r\\n {{m.name}}\\r\\n
                \\r\\n
                \\r\\n Cellular Signal Quality\\r\\n \\r\\n {{cellInfo.status | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n Location Signal Quality\\r\\n \\r\\n {{gpsInfo.status | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n Activation Date\\r\\n \\r\\n {{ installation.createdAt | TableDateFilter }}\\r\\n
                \\r\\n Last Communication\\r\\n \\r\\n \\r\\n {{(installation.device.communicatedAt | TableDateFilter)}}\\r\\n \\r\\n \\r\\n Unavailable\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n Asset Details\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n \\r\\n View Details\\r\\n \\r\\n
                \\r\\n Name\\r\\n \\r\\n
                \\r\\n {{installation.equipment.name}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n {{key | attrsTranslate | uppercase }}\\r\\n \\r\\n {{key | attrsTranslate}}\\r\\n \\r\\n
                \\r\\n {{value}}\\r\\n
                \\r\\n\\r\\n \\r\\n\\r\\n
                \\r\\n {{tag.key | attrsTranslate}}\\r\\n \\r\\n
                \\r\\n {{tag.value}}\\r\\n
                \\r\\n
                \\r\\n {{tag.value|date:'MMMM d, y h:mm:ss a'}}\\r\\n
                \\r\\n
                \\r\\n {{tag.value | date:'longDate'}}\\r\\n
                \\r\\n
                \\r\\n {{tag.value}}\\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Sync Run Hours\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n Installation Details\\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
                \\r\\n Installation Actions\\r\\n\\r\\n \\r\\n
                \\r\\n {{key | attrsTranslate | capitalize}}: {{value | capitalize}} \\r\\n
                \\r\\n
                \\r\\n Installation Notes\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{onLoadErrorText}}\\r\\n
                \\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n {{refreshErrorText}}\\r\\n
                \\r\\n
                \\r\\n 0 && !loading\\\">\\r\\n No devices found for serial number '{{ text }}'.\\r\\n \\r\\n \\r\\n {{errorText}}\\r\\n \\r\\n No devices found.\\r\\n \\r\\n
                \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                Status\\r\\n Serial #\\r\\n DeviceAssetLast Comm.
                \\r\\n {{installation.refresh}}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n {{ installation.device.serialNumber }}\\r\\n \\r\\n {{ installation.device.attrs[\\\"model\\\"] }}\\r\\n \\r\\n {{installation.equipment.name}}\\r\\n \\r\\n\\r\\n
                \\r\\n {{ unavailable | translate }}\\r\\n
                \\r\\n
                \\r\\n {{ installation.device.communicatedAt | TableDateFilter }}\\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\";","module.exports = \"\\r\\n\\r\\n\\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n \\r\\n \\r\\n Clear All\\r\\n \\r\\n
                \\r\\n
                0\\\" ng-repeat=\\\"search in vm.searchString\\\">\\r\\n
                \\r\\n {{search}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n Alert: {{filter.label |translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n Maintenance: {{filter.label | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n {{filter.group | translate }}: {{filter.label | translate}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n Last Seen:\\r\\n {{filter.label | translate}}\\r\\n \\r\\n {{min}}-{{max}} Days\\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n Security Group: {{filter.name}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                0\\\" class=\\\"pill-wrapper\\\">\\r\\n
                \\r\\n
                \\r\\n \\r\\n Account: {{filter.name}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n {{key}}:\\r\\n {{value | toFriendlyAttr}}\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n\";","module.exports = \"
                \\r\\n
                \\r\\n

                *

                \\r\\n Wildcard searches\\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n

                \\r\\n Search history\\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n

                \\r\\n Saved favorites\\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n

                \\r\\n Advanced filters\\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n

                \\r\\n Columns selection\\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n Whoops!\\r\\n

                \\r\\n
                \\r\\n
                No Results found for this search.
                \\r\\n
                Try adjusting your filters.
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                Explore the new features:

                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n

                \\r\\n \\r\\n Moved to ADMIN\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n Administrative functionality for assets has moved to the\\r\\n ADMIN\\r\\n section.\\r\\n
                \\r\\n
                \\r\\n The Template, Attribute and Sharing pages can be reached from the left hand navigation of the\\r\\n ADMIN\\r\\n page.\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n \\r\\n
                \";","module.exports = \"
                \\r\\n
                \\r\\n \\r\\n

                Add Note

                \\r\\n
                \\r\\n\\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n {{errorText}}\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \";","module.exports = \"
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n

                \\r\\n {{vm.getStartDateErrorMessage()}}\\r\\n

                \\r\\n
                \\r\\n
                to
                \\r\\n\\r\\n
                \\r\\n \\r\\n

                \\r\\n {{vm.getEndDateErrorMessage()}}\\r\\n

                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n

                0\\\" class=\\\"asset-count\\\" translate translate-n=\\\"equipmentData.length\\\"\\r\\n translate-plural=\\\"{{$count}} assets selected.\\\">{{$count}} asset selected.

                \\r\\n
                \\r\\n\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                \\r\\n \\r\\n
                \\r\\n
                \\r\\n\\r\\n
                \\r\\n
                \\r\\n {{vm.errorText}}\\r\\n 0 && !vm.errorFlag\\\">\\r\\n No results found in historical alerts for '{{text}}'.\\r\\n \\r\\n 0 && !vm.searchText.length > 0 && !vm.errorFlag && vm.getAlertsFlag\\\">\\r\\n\\r\\n \\r\\n No alerts found based on your search criteria. Try expanding the date range, checking the name of the alert\\r\\n configuration\\r\\n or asset you are searching for, or change the priority filters below.\\r\\n \\r\\n \\r\\n
                \\r\\n
                \\r\\n \\r\\n
                \\r\\n\\r\\n
                0 && !vm.loading\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                \\r\\n Priority\\r\\n \\r\\n \\r\\n Type\\r\\n \\r\\n Time Active\\r\\n \\r\\n \\r\\n Asset\\r\\n \\r\\n Name\\r\\n \\r\\n Event\\r\\n \\r\\n Description\\r\\n \\r\\n Status\\r\\n \\r\\n \\r\\n CSV\\r\\n
                \\r\\n  {{alert.priority | translate}}\\r\\n \\r\\n {{alert.alertType | translate}}\\r\\n {{ alert.timestamp |\\r\\n TableDateFilter }}{{alert.equipment.name}}{{alert.name}}{{alert.series.title | translate}}{{alert.series.faultDescription}}{{alert.status |translate}}\\r\\n \\r\\n
                \\r\\n
                \\r\\n
                \\r\\n \\r\\n\\r\\n
                \\r\\n
                \\r\\n
                \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n
                  \\r\\n\\r\\n
                  \";","module.exports = \"\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n {{vm.updateErrorText|translate}}\\r\\n
                  \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n
                  \\r\\n {{vm.errorText}}\\r\\n 0 && vm.alerts.length > 0\\\">\\r\\n No results found in alerts for '{{text}}'.\\r\\n \\r\\n \\r\\n No information found for alerts.\\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \";","module.exports = \"
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n Low Priority\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  Low Priority
                  \\r\\n

                  \\r\\n \\r\\n {{lowPriorityNum}}\\r\\n \\r\\n

                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n Medium Priority\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  Medium Priority
                  \\r\\n

                  \\r\\n \\r\\n {{mediumPriorityNum}}\\r\\n \\r\\n\\r\\n

                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n High Priority\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  High Priority
                  \\r\\n

                  \\r\\n \\r\\n {{highPriorityNum}}\\r\\n \\r\\n\\r\\n

                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n {{onLoadErrorText}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\";","module.exports = \"
                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                  \\r\\n Priority\\r\\n \\r\\n \\r\\n Type\\r\\n \\r\\n Time Active\\r\\n \\r\\n \\r\\n Asset\\r\\n \\r\\n Name\\r\\n \\r\\n Event\\r\\n \\r\\n Description\\r\\n \\r\\n Status\\r\\n \\r\\n \\r\\n Notes\\r\\n \\r\\n CSV Export\\r\\n
                  \\r\\n \\r\\n  {{alert.priority | translate}}\\r\\n \\r\\n {{alert.alertType | translate}}\\r\\n {{ alert.timestamp | TableDateFilter }}\\r\\n {{alert.equipment.name}}\\r\\n {{alert.name}}{{alert.series.title | translate}}{{alert.series.faultDescription | translate}}{{alert.status | translate}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Cleared\\r\\n \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                    = 1\\\" total-items=\\\"vm.totalItems\\\" ng-model=\\\"vm.current.alertPage\\\" boundary-link-numbers=\\\"true\\\"\\r\\n max-size=\\\"vm.maxSize\\\" class=\\\"pagination-sm tr-alerts-pagination\\\" items-per-page=\\\"vm.itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"vm.pageChanged()\\\">
                  \\r\\n \\r\\n
                  \\r\\n
                  \";","module.exports = \"\\r\\n
                  \\r\\n
                  \\r\\n \";","module.exports = \"
                  \\r\\n
                  \\r\\n \\r\\n

                  Warning

                  \\r\\n
                  \\r\\n
                  \\r\\n

                  Are you sure you want to delete {{name}}?

                  \\r\\n
                  \\r\\n {{deleteErrorText}}\\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \";","module.exports = \"
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n GeoZone name is required\\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n \\r\\n Name contains invalid special characters. Please only use the following special characters: \\r\\n - _ ( )\\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n Must select at least one asset\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n {{$count}} asset selected.\\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n \\r\\n
                  \\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n Please draw a GeoZone\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n\\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n maxEmails\\\" translate translate-params-emailsnum=\\\"maxEmails\\\">Only {{emailsnum}} email addresses allowed\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n {{errorText}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n {{existingGeozoneMsg}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \";","module.exports = \"
                  \\r\\n
                  \\r\\n {{onLoadErrorText}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n

                  \\r\\n {{geozone.name}}\\r\\n

                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n GeoZone name is required\\r\\n \\r\\n GeoZone name can not be more than 75 characters\\r\\n \\r\\n \\r\\n Name contains invalid special characters. Please only use the following special characters: \\r\\n - _ ( )\\r\\n \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n {{ geozone.createdAt | TableDateFilter }}\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n {{geozone.description}}\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n\\r\\n
                  \\r\\n {{tag.text}}\\r\\n
                  \\r\\n \\r\\n None\\r\\n \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n \\r\\n
                  \\r\\n\\r\\n\\r\\n
                  \\r\\n \\r\\n\\r\\n
                  \\r\\n {{email.email}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                  \\r\\n maxEmails\\\" translate\\r\\n translate-params-emailsnum=\\\"maxEmails\\\">Only {{emailsnum}} email addresses allowed\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n GeoZone edited successfully.\\r\\n {{editErrorText}}\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n {{existingGeozoneMsg}}\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n Please draw a GeoZone\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n

                  Assets

                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n \\r\\n \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n {{errorText}}\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n\\r\\n 0 && !noData\\\">\\r\\n No results found in GeoZone Assets for '{{text}}'.\\r\\n \\r\\n \\r\\n No assets configured to this geozone.\\r\\n \\r\\n\\r\\n\\r\\n
                  \\r\\n
                  \\r\\n\\r\\n
                  = 1\\\">\\r\\n\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                  \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                  \\r\\n {{asset.name}}\\r\\n \\r\\n {{asset.attrs.make}}\\r\\n \\r\\n {{asset.attrs.model}}\\r\\n
                  No assets configured.
                  \\r\\n
                  \\r\\n {{error.Msg}}\\r\\n
                  \\r\\n
                  \\r\\n
                  = 1\\\">\\r\\n\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n {{onLoadErrorText}}\\r\\n
                  \\r\\n
                  \\r\\n \\r\\n\\r\\n
                  \\r\\n\\r\\n
                  \\r\\n
                  \\r\\n
                  \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n\\r\\n \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n\\r\\n\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n Log (\\r\\n GeoZone logs are stored for seven days.)\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n \\r\\n
                    \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                    \\r\\n Triggered At\\r\\n \\r\\n \\r\\n Asset\\r\\n \\r\\n \\r\\n Event\\r\\n \\r\\n
                    \\r\\n {{entry.timestamp | TableDateFilter}}\\r\\n \\r\\n \\r\\n {{entry.equipment.name}}\\r\\n \\r\\n \\r\\n {{entry.event | capitalize:true}}\\r\\n
                    \\r\\n \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n \\r\\n No logs found.\\r\\n \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n {{onLoadErrorText}}\\r\\n
                    \\r\\n
                    \\r\\n\\r\\n \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                      = 1\\\" total-items=\\\"totalItems\\\" ng-model=\\\"current.geozoneLogPage\\\"\\r\\n boundary-link-numbers=\\\"true\\\" max-size=\\\"maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"itemsPerPage\\\"\\r\\n previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"pageChanged()\\\">
                    \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \";","module.exports = \"
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n \\r\\n \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                    \\r\\n Name\\r\\n \\r\\n \\r\\n Description\\r\\n \\r\\n \\r\\n Tags\\r\\n
                    \\r\\n {{geozone.name}}\\r\\n \\r\\n {{geozone.description}}\\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    {{tag}}
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n 0 && geozoneList.length > 0\\\"> No results found in GeoZones for '{{ text }}'.\\r\\n Could not find a GeoZone.\\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n
                    \\r\\n\\r\\n
                    \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n\\r\\n
                      \\r\\n\\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n {{onLoadErrorText}}\\r\\n
                      \\r\\n\\r\\n\\r\\n\\r\\n\";","module.exports = \"
                      \\r\\n
                      \\r\\n
                      \\r\\n SPN:\\r\\n {{vm.fault.code.spn}}\\r\\n
                      \\r\\n
                      \\r\\n FMI:\\r\\n {{vm.fault.code.fmi}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n Source:\\r\\n {{vm.fault.code.source}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n Priority:\\r\\n {{vm.fault.priority.label}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n Auto Clear:\\r\\n {{vm.fault.autoClear.label}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n Notify On Return:\\r\\n {{vm.fault.notifyOnReturn.label}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \";","module.exports = \"
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n {{ vm.duplicateFaultMsg }}\\r\\n 1\\\">{{vm.incompleteFaultMsg}}\\r\\n {{vm.noCompletedFaultsMsg}}\\r\\n {{vm.requiresFaultsMsg}}\\r\\n {{vm.updateError}}\\r\\n {{vm.postNewFaultError}}\\r\\n 0 && filteredFaults.length == 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in Configuration Faults for '{{ vm.searchText }}'.\\r\\n \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n SPN\\r\\n
                      \\r\\n
                      \\r\\n FMI\\r\\n
                      \\r\\n
                      \\r\\n Source\\r\\n
                      \\r\\n
                      \\r\\n Priority\\r\\n
                      \\r\\n
                      \\r\\n Auto Clear\\r\\n
                      \\r\\n
                      \\r\\n Notify on Return\\r\\n
                      \\r\\n
                      \\r\\n  \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      = 1\\\">\\r\\n
                      \\r\\n
                      \\r\\n
                        15\\\" total-items=\\\"vm.faults.length\\\" ng-model=\\\"vm.pagination.currentPage\\\" max-size=\\\"vm.pagination.maxSize\\\"\\r\\n class=\\\"pagination-sm\\\" items-per-page=\\\"vm.pagination.itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\">\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \";","module.exports = \"\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n Please enter a number between 0 - 524287\\r\\n Numbers Only\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n Please enter a number between 0 - 31\\r\\n Numbers Only\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n Please enter a number between 0 - 255\\r\\n Numbers Only\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Required\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \";","module.exports = \"
                      \\r\\n
                      \\r\\n \\r\\n

                      Warning

                      \\r\\n
                      \\r\\n
                      \\r\\n

                      Are you sure you want to delete {{vm.configurationName}}?

                      \\r\\n
                      \\r\\n {{vm.errorText}}\\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \";","module.exports = \"
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n

                      \\r\\n {{vm.configuration.name}}\\r\\n

                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      0\\\">\\r\\n \\r\\n \\r\\n {{contact}}\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n Name is required\\r\\n \\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n \\r\\n Name already used. Please enter a different name.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n vm.maxEmails\\\" translate\\r\\n translate-params-maxEmails=\\\"vm.maxEmails\\\">Only {{vm.maxEmails}} email addresses allowed\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n {{vm.configErrorText}}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n {{vm.onLoadErrorText}}\\r\\n
                      \\r\\n\";","module.exports = \"
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n 0 && vm.equipments.length > 0 && !vm.errorFlag\\\" reason=\\\"'M'\\\">\\r\\n No results found in Configuration Assets for '{{ vm.searchText }}'.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n No assets currently associated with this configuration.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n {{vm.removeLastAssetMsg}}\\r\\n {{vm.errorText}}\\r\\n \\r\\n Assets updated successfully.\\r\\n \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n {{ equipment.name }}\\r\\n \\r\\n {{ equipment.attrs.make }}\\r\\n
                      \\r\\n
                      \\r\\n {{ equipment.attrs.model }}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      = 1\\\">\\r\\n
                        = 15\\\" total-items=\\\"filteredEquipment.length\\\" ng-model=\\\"vm.pagination.currentPage\\\" max-size=\\\"vm.pagination.maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"vm.pagination.itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\">
                      \\r\\n
                      \\r\\n
                      = 1\\\">\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n {{vm.onLoadErrorText}}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n\";","module.exports = \"
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n Name\\r\\n \\r\\n \\r\\n Assets\\r\\n \\r\\n \\r\\n Faults\\r\\n \\r\\n
                      \\r\\n {{configuration.name}}\\r\\n \\r\\n {{configuration.equipment.summary.count}}\\r\\n \\r\\n {{configuration.triggers.summary.count}}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n 0 && vm.configurations.length > 0\\\"> \\r\\n No results found in existing configuration for '{{vm.searchText}}'. \\r\\n \\r\\n No existing configurations found\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                        15\\\" \\r\\n total-items=\\\"vm.filteredConfigurations.length\\\" \\r\\n ng-model=\\\"vm.pagination.currentPage\\\" \\r\\n boundary-link-numbers=\\\"true\\\" \\r\\n max-size=\\\"vm.pagination.maxSize\\\" \\r\\n class=\\\"pagination-sm\\\" \\r\\n items-per-page=\\\"vm.pagination.itemsPerPage\\\" \\r\\n previous-text=\\\"<\\\" next-text=\\\">\\\">\\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n\\r\\n
                      \\r\\n {{vm.onLoadErrorText}}\\r\\n
                      \\r\\n\";","module.exports = \"
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n Name is required\\r\\n \\r\\n \\r\\n Name already used. Please enter a different name.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n vm.maxEmails\\\" translate\\r\\n translate-params-emax=\\\"vm.maxEmails\\\">Only {{emax}} email addresses allowed \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n Must select at least one asset\\r\\n \\r\\n
                      \\r\\n \\r\\n {{$count}} asset selected.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n All fields with * are required\\r\\n
                      \\r\\n
                      \\r\\n {{vm.errorText}}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\";","module.exports = \"
                      \\r\\n
                      \\r\\n \\r\\n

                      Warning

                      \\r\\n
                      \\r\\n
                      \\r\\n

                      Are you sure you want to delete {{name}}?

                      \\r\\n
                      \\r\\n {{errorText}}\\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \";","module.exports = \"
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n

                      \\r\\n Note: \\r\\n To produce the desired alert and notification output, please ensure that the (Delay time)\\r\\n interval chosen below is aligned with the telematics device communication behaviour for your selected assets.\\r\\n

                      \\r\\n

                      \\r\\n Please see \\r\\n ONE i3® Help \\r\\n for more details.\\r\\n

                      \\r\\n
                      \\r\\n \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n Please enter a name.\\r\\n \\r\\n \\r\\n Name already used. Please enter a different name.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n maxEmails\\\">\\r\\n Only {{maxEmails}} email addresses allowed.\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n \\r\\n {{$count}} asset selected.\\r\\n \\r\\n
                      \\r\\n \\r\\n Please select at least one asset.\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n \\r\\n Data Point\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Condition\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Delay\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Priority\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Auto Clear\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Notify on Return\\r\\n \\r\\n \\r\\n \\r\\n  \\r\\n
                      \\r\\n \\r\\n \\r\\n {{ t.datapoint.description | translate }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ t.condition.relationalOperator.description }}\\r\\n \\r\\n \\r\\n \\r\\n {{ t.condition.thresholdValue }}\\r\\n \\r\\n km/h\\r\\n \\r\\n \\r\\n {{ t.condition.thresholdValue }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ t.condition.duration }}\\r\\n \\r\\n \\r\\n \\r\\n {{ t.condition.unitOfTime.label }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ t.priority.label }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ t.autoClear.label }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ t.notifyOnReturn.label }}\\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n {{\\r\\n noTriggersSavedMsg }}\\r\\n {{ duplicateConditionText }}\\r\\n {{ incompleteTriggerMsg }}\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n {{errorText}}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n
                      \";","module.exports = \"
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n 0 && filteredTriggerList.length == 0\\\"\\r\\n reason=\\\"'M'\\\">\\r\\n No results found in Configuration Triggers for '{{\\r\\n searchText }}'.\\r\\n \\r\\n \\r\\n No triggers currently associated with this configuration.\\r\\n \\r\\n
                      \\r\\n {{errorText}}\\r\\n {{deleteTriggerText}}\\r\\n
                      \\r\\n
                      \\r\\n {{\\r\\n duplicateConditionText }}\\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n Data Point\\r\\n \\r\\n \\r\\n Condition\\r\\n \\r\\n Priority\\r\\n \\r\\n \\r\\n Auto Clear\\r\\n \\r\\n Notify on Return\\r\\n \\r\\n  \\r\\n
                      \\r\\n \\r\\n \\r\\n {{ (t.dataPoint.description | translate) || ('Not Set'|translate)}}\\r\\n \\r\\n \\r\\n {{ t.dataPoint.description | translate }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ (indexedRelationalSymbolsOptions[t.condition.relationalOperator].description | translate) || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n {{ t.condition.thresholdValue || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n {{ (t.valuesDescriptors[t.condition.thresholdValue]|translate) || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n km/h\\r\\n \\r\\n for\\r\\n \\r\\n \\r\\n {{ t.condition.duration || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n {{ (indexedUnitOfTimeOptions[t.condition.unitOfTime].label |translate) || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ (indexedPriorityOptions[t.priority].label |translate) || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ (indexedClearOptions[t.autoClear].label |translate) || ('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ (indexedNotifyOnReturnOptions[t.notifyOnReturn].label |translate) ||('Not Set'|translate) }}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n
                      \\r\\n\\r\\n\\r\\n\\r\\n
                      \\r\\n
                      \\r\\n
                      = 1\\\">\\r\\n
                        \\r\\n
                        \\r\\n
                        = 1\\\">\\r\\n \\r\\n
                        \\r\\n
                        \\r\\n
                        \";","module.exports = \"
                        \\r\\n
                        \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                        \\r\\n \\r\\n \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n\\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n 0 && equipments.length > 0 && !errorFlag\\\" reason=\\\"'M'\\\">\\r\\n No results found in Configuration Assets for '{{ searchText }}'.\\r\\n \\r\\n
                        \\r\\n
                        \\r\\n \\r\\n No assets currently associated with this configuration.\\r\\n \\r\\n
                        \\r\\n
                        \\r\\n {{removeLastAssetMsg}}\\r\\n {{errorText}}\\r\\n \\r\\n Assets updated successfully.\\r\\n \\r\\n
                        \\r\\n
                        \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                        \\r\\n\\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                        \\r\\n \\r\\n \\r\\n {{ equipment.name }}\\r\\n \\r\\n {{ equipment.attrs.make }}\\r\\n
                        \\r\\n
                        \\r\\n {{ equipment.attrs.model }}\\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n
                        \\r\\n\\r\\n
                        \\r\\n
                        \\r\\n {{onLoadErrorText}}\\r\\n
                        \\r\\n
                        \\r\\n\\r\\n\\r\\n
                        \\r\\n
                        \\r\\n
                        = 1\\\">\\r\\n
                          \\r\\n
                          \\r\\n
                          = 1\\\">\\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \";","module.exports = \"
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n

                          \\r\\n {{configuration.name}}\\r\\n\\r\\n

                          \\r\\n
                            \\r\\n
                          • {{config.name}}
                          • \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n \\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          0\\\">\\r\\n \\r\\n \\r\\n {{contact.email}}\\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n \\r\\n
                          \\r\\n \\r\\n \\r\\n Name is required\\r\\n \\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n \\r\\n Name already used. Please enter a different name.\\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n \\r\\n
                          \\r\\n \\r\\n
                          \\r\\n \\r\\n
                          \\r\\n maxEmails\\\" translate>Only {{maxEmails}} email\\r\\n addresses allowed\\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n\\r\\n \\r\\n\\r\\n
                          \\r\\n \\r\\n
                          \\r\\n\\r\\n
                          \\r\\n
                          \\r\\n {{configErrorText}}\\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n\\r\\n
                          \\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n {{onLoadErrorText}}\\r\\n
                          \\r\\n\";","module.exports = \"
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n \\r\\n \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                          \\r\\n Name\\r\\n \\r\\n \\r\\n Assets\\r\\n \\r\\n \\r\\n Triggers\\r\\n \\r\\n
                          \\r\\n {{configuration.name}}\\r\\n \\r\\n {{configuration.equipment.summary.count}}\\r\\n \\r\\n {{configuration.triggers.summary.count}}\\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n 0 && configurations.length > 0\\\"> No results found in existing configuration for '{{ searchText }}'. \\r\\n No existing configurations found\\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                          \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n {{onLoadErrorText}}\\r\\n
                            \\r\\n\";","module.exports = \"
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n

                            {{alert.name}}

                            \\r\\n Time Active :\\r\\n {{alert.timestamp | TableDateFilter}}\\r\\n
                            \\r\\n
                            \\r\\n Asset Detail\\r\\n
                            \\r\\n Asset : {{equipment.name}}\\r\\n
                            \\r\\n Make: {{equipment.attrs.make }}\\r\\n
                            \\r\\n Model: {{equipment.attrs.model }}
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n {{editErrorText}}\\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                            \\r\\n Event Time\\r\\n \\r\\n User\\r\\n \\r\\n Event\\r\\n \\r\\n Contact\\r\\n \\r\\n Detail\\r\\n
                            \\r\\n {{ alert.timestamp | TableDateFilter }}\\r\\n {{ instance.timestamp | TableDateFilter }}\\r\\n \\r\\n \\r\\n {{instance.user}}\\r\\n \\r\\n -\\r\\n {{instance.status}}\\r\\n

                            {{contact.email}}

                            \\r\\n\\r\\n -\\r\\n
                            \\r\\n \\r\\n

                            {{instance.text}}

                            \\r\\n \\r\\n
                            \\r\\n -\\r\\n
                            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n Alert instance cannot be accessed.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
                            \\r\\n
                            \\r\\n {{onLoadErrorText}}\\r\\n
                            \\r\\n
                            \";","module.exports = \"
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n\";","module.exports = \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
                            \";","module.exports = \"
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n \\r\\n Account is required\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n {{vm.errorText}}\\r\\n \\r\\n Assets shared successfully.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n 0 && vm.equipments.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in Assets matching '{{searchString}}'.\\r\\n \\r\\n \\r\\n Select asset(s) to share.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                            \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                            \\r\\n {{ equipment.name }}\\r\\n \\r\\n {{ equipment.attrs.make }}\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n {{ equipment.attrs.model }}\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            0\\\">\\r\\n
                              \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \";","module.exports = \"
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            -1\\\">\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n {{vm.errorText}}\\r\\n \\r\\n Assets revoked successfully.\\r\\n \\r\\n \\r\\n You must have at least one asset selected.\\r\\n \\r\\n
                            \\r\\n
                            0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                            \\r\\n Name\\r\\n \\r\\n Make\\r\\n \\r\\n Model\\r\\n
                            \\r\\n \\r\\n {{equip.name}}{{equip.attrs.make}}{{equip.attrs.model}}
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n No Assets found.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n 0 && vm.sharedAssets.length == 0\\\">\\r\\n No results found in Assets matching '{{search}}'\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n No accounts to share to.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                              0\\\" total-items=\\\"vm.sharedAssets.length\\\" ng-model=\\\"vm.currentPage.responseData\\\"\\r\\n boundary-link-numbers=\\\"true\\\" max-size=\\\"vm.maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"vm.itemsPerPage\\\"\\r\\n previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"vm.pageChanged()\\\">\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n
                            \";","module.exports = \"
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Template name is required\\r\\n A template with this name already exists, please select unique name. Clicking Create with existing template name will create a duplicate entry.\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Make is required\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Model is required\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n \\r\\n Package is required\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n Create\\r\\n \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n {{packageErrorText}}\\r\\n {{errorText}}\\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n {{onLoadErrorText}}\\r\\n
                            \\r\\n\";","module.exports = \"
                            \\r\\n\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n

                            \\r\\n {{product.name}}\\r\\n

                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Template name is required\\r\\n A template with this name already exists, please select unique name. Clicking Save with existing template name will update to have duplicate entries.\\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n Make: {{product.metadata.make}}\\r\\n
                            \\r\\n\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Make is required\\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n Model: {{product.metadata.model}}\\r\\n
                            \\r\\n\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n Model is required\\r\\n
                            \\r\\n
                            \\r\\n\\r\\n
                            \\r\\n Package: {{product.package.name}}\\r\\n
                            \\r\\n\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n \\r\\n Package is required\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n Modules:\\r\\n
                            \\r\\n {{mod.name}}\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n Save\\r\\n
                            \\r\\n \\r\\n
                            \\r\\n {{packageErrorText}}\\r\\n {{errorText}}\\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n {{onLoadErrorText}}\\r\\n
                            \\r\\n\\r\\n\\r\\n\";","module.exports = \"
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
                            \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                            \\r\\n {{product.name}}\\r\\n \\r\\n {{product.metadata.make}}\\r\\n \\r\\n {{product.metadata.model}}\\r\\n
                            \\r\\n
                            \\r\\n 0 && allProducts.length > 0\\\">\\r\\n No results were found for '{{text}}'.\\r\\n \\r\\n \\r\\n No templates found.\\r\\n \\r\\n
                            \\r\\n
                            \\r\\n
                            \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n\\r\\n
                              \\r\\n {{onLoadErrorText}}\\r\\n
                              \";","module.exports = \"
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n {{successText}}\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n \\r\\n \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n

                              \\r\\n {{invite.email}}\\r\\n

                              \\r\\n
                              \\r\\n Sent By: \\r\\n
                              \\r\\n {{invite.sent.by}}\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n Sent At: {{invite.sent.at | TableDateFilter}}\\r\\n
                              \\r\\n
                              \\r\\n Status: {{invite.status | capitalize | translate}}\\r\\n
                              \\r\\n
                              \\r\\n Accepted At: {{invite.accepted.at | TableDateFilter}}\\r\\n
                              \\r\\n
                              \\r\\n Revoked By:\\r\\n
                              \\r\\n {{invite.revoked.by}}\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n Revoked At:: {{invite.revoked.at | TableDateFilter}}\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n \\r\\n \\r\\n
                              \\r\\n
                              \\r\\n
                                \\r\\n
                              • \\r\\n {{role.name}}\\r\\n \\r\\n (No name)\\r\\n \\r\\n ,\\r\\n Description: {{description}}\\r\\n \\r\\n \\r\\n
                              • \\r\\n
                              \\r\\n\\r\\n
                              \\r\\n No roles assigned.\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n\\r\\n \\r\\n
                              \\r\\n
                              \\r\\n\\r\\n
                                \\r\\n
                              • \\r\\n {{group.name}}\\r\\n
                              • \\r\\n
                              \\r\\n\\r\\n
                              \\r\\n No groups assigned.\\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n \\r\\n \\r\\n
                              \\r\\n
                              \\r\\n
                              \\r\\n
                              0) && (inviteuserForm.$dirty || inviteuserForm.$submitted)}\\\">\\r\\n \\r\\n\\r\\n
                              \\r\\n 0) && (inviteuserForm.$dirty || inviteuserForm.$submitted)\\\" translate>At least one role is required.\\r\\n
                              \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                              \\r\\n
                              \\r\\n 0 && editRoles.length > 0\\\">\\r\\n No results found in roles for '{{search.query.role}}'.\\r\\n \\r\\n \\r\\n No roles found.\\r\\n \\r\\n
                              \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                              \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n
                              \\r\\n \\r\\n \\r\\n {{role.name}}\\r\\n \\r\\n (No name)\\r\\n , Description: {{roleDescription}}\\r\\n \\r\\n
                              \\r\\n
                              = 1\\\">\\r\\n
                                \\r\\n
                                \\r\\n
                                \\r\\n
                                \\r\\n\\r\\n
                                \\r\\n \\r\\n\\r\\n
                                \\r\\n At least one group is required.\\r\\n
                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                \\r\\n
                                \\r\\n 0 && editGroups.length > 0\\\">\\r\\n No results found in groups for '{{search.query.group}}'.\\r\\n \\r\\n \\r\\n No groups found.\\r\\n \\r\\n
                                \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n
                                \\r\\n \\r\\n \\r\\n {{group.name}}\\r\\n
                                \\r\\n
                                = 1\\\">\\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n\\r\\n
                                  \\r\\n
                                  \\r\\n * = required field\\r\\n
                                  \\r\\n
                                  \\r\\n\\r\\n
                                  \\r\\n
                                  \\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n {{errorText}}\\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                  \\r\\n
                                  \\r\\n \\r\\n
                                  \\r\\n\";","module.exports = \"
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n \\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n
                                  \\r\\n {{errorText}}\\r\\n \\r\\n Users updated successfully.\\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n 0 && group.users.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in Security Group Users for '{{ searchText }}'.\\r\\n \\r\\n \\r\\n No users currently associated with this security group.\\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                  \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Email\\r\\n \\r\\n
                                  \\r\\n \\r\\n \\r\\n {{ user.name }}\\r\\n \\r\\n {{ user.email }}\\r\\n
                                  \\r\\n \\r\\n
                                  \\r\\n
                                  \\r\\n \\r\\n
                                  \\r\\n\\r\\n\\r\\n
                                  \\r\\n
                                  \\r\\n
                                  = 1\\\">\\r\\n
                                    \\r\\n
                                    \\r\\n
                                    = 1\\\">\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n\";","module.exports = \"
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n Security group name already exists\\r\\n Security group name is required\\r\\n \\r\\n Security Group Name can not be more than 75 characters\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n \\r\\n \\r\\n
                                    \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n \\r\\n\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n\\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n \\r\\n \\r\\n
                                    \\r\\n \\r\\n
                                    \\r\\n {{errorText}}\\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n\\r\\n
                                    \\r\\n\";","module.exports = \"
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n \\r\\n \\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n 0 && equipments.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found in Security Group Assets for '{{ searchText }}'.\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n {{errorText}}\\r\\n \\r\\n Assets updated successfully.\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n 0 && equipments.length > 0 && !errorFlag\\\" reason=\\\"'M'\\\">\\r\\n No results found in Security Group Assets for '{{ searchText }}'.\\r\\n \\r\\n \\r\\n No assets currently associated with this security group.\\r\\n \\r\\n
                                    \\r\\n
                                    \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                    \\r\\n\\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n
                                    \\r\\n \\r\\n \\r\\n {{ equipment.name }}\\r\\n \\r\\n {{ equipment.attrs.make }}\\r\\n
                                    \\r\\n
                                    \\r\\n {{ equipment.attrs.model }}\\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n\\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n
                                    \\r\\n {{onLoadErrorText}}\\r\\n
                                    \\r\\n
                                    \\r\\n\\r\\n\\r\\n
                                    \\r\\n
                                    \\r\\n
                                    = 1\\\">\\r\\n
                                      \\r\\n
                                      \\r\\n
                                      = 1\\\">\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \";","module.exports = \"
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n

                                      \\r\\n {{update.Name}}\\r\\n

                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n \\r\\n Cannot use existing group name.\\r\\n Security group name is required\\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n Description: {{update.Desc}}\\r\\n \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n \\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n Tags:\\r\\n
                                      \\r\\n {{tag.text}}\\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n \\r\\n\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n {{errorText}}\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n {{onLoadErrorText}}\\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n\\r\\n\";","module.exports = \"
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n\\r\\n \\r\\n \\r\\n
                                      \\r\\n 0 && securityGroups.length > 0\\\">\\r\\n No results found in security groups for '{{ searchText }}'.\\r\\n \\r\\n \\r\\n No security groups found.\\r\\n \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n\\r\\n
                                      \\r\\n \\r\\n Group creation successful.\\r\\n \\r\\n \\r\\n Group deletion successful.\\r\\n \\r\\n \\r\\n Successfully removed from group.\\r\\n \\r\\n\\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                      \\r\\n Name\\r\\n \\r\\n \\r\\n Description\\r\\n \\r\\n \\r\\n Tags\\r\\n \\r\\n
                                      \\r\\n {{ sg.name }}\\r\\n \\r\\n {{ sg.attrs.description }}\\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      {{tag}}
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n\\r\\n
                                      \\r\\n
                                      \\r\\n
                                      \\r\\n \\r\\n
                                      \\r\\n
                                      = 1\\\">\\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n {{onLoadErrorText}}\\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n\";","module.exports = \"
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n \\r\\n Role name already exists\\r\\n Role name is required\\r\\n \\r\\n Role name cannot be more than 75 characters\\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n Restricted:\\r\\n Users assigned this role can only see assets that are in their assigned security group(s).\\r\\n \\r\\n
                                        \\r\\n \\r\\n Unrestricted:\\r\\n Users assigned this role can view all assets irrespective of any security group(s) they are assigned to.\\r\\n \\r\\n
                                        \\r\\n\\r\\n
                                        \\r\\n \\r\\n \\r\\n Warning:\\r\\n Setting asset visibility to Unrestricted for this role will allow users assigned to this this role to see all assets;\\r\\n their security groups assignments (if any) will be ignored.\\r\\n \\r\\n \\r\\n \\r\\n Note: Setting Asset Visibility to Restricted on this role will inhibit users visible\\r\\n assets until the user is placed into to a security group.\\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n \\r\\n \\r\\n Description cannot be more than 500 characters\\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n Set the permissions and policies for users assigned to this role, allowing them to view pages and perform actions in ONE i3\\r\\n
                                        \\r\\n\\r\\n
                                        \\r\\n \\r\\n

                                        \\r\\n Users with this role permission will be granted all permissions listed below within ONE i3.\\r\\n

                                        \\r\\n
                                        \\r\\n\\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n

                                        {{permission.description | translate}}

                                        \\r\\n\\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n\\r\\n
                                        \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n Set the visibility of data points for users assigned to this role in ONE i3\\r\\n
                                        \\r\\n
                                        \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n 0 && datapoints.length > 0\\\">\\r\\n No results found in data points for '{{text}}'.\\r\\n \\r\\n \\r\\n No data points found.\\r\\n \\r\\n
                                        \\r\\n
                                        \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                        \\r\\n \\r\\n \\r\\n Data Point\\r\\n \\r\\n
                                        \\r\\n \\r\\n \\r\\n {{datapoint.description}}\\r\\n
                                        \\r\\n
                                        \\r\\n\\r\\n
                                        \\r\\n
                                        \\r\\n
                                        \\r\\n
                                        = 1\\\">\\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n
                                          \\r\\n \\r\\n
                                          \\r\\n \\r\\n Role edit successful.\\r\\n \\r\\n {{errorText}}\\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n {{onLoadErrorText}}\\r\\n
                                          \\r\\n
                                          \\r\\n\";","module.exports = \"\\r\\n\";","module.exports = \"\\r\\n
                                            \\r\\n
                                          • \\r\\n {{datapoint.description}}\\r\\n
                                          • \\r\\n
                                          \";","module.exports = \"\";","module.exports = \"
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n\\r\\n \\r\\n \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n \\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          \\r\\n

                                          {{roleData.name}}

                                          \\r\\n
                                          \\r\\n
                                          \\r\\n {{roleData.description}}\\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          Asset Visibility
                                          \\r\\n
                                          \\r\\n

                                          \\r\\n Restricted -\\r\\n Users assigned this role can only see assets based on the security group(s) they're assigned to.\\r\\n

                                          \\r\\n\\r\\n

                                          \\r\\n Unrestricted - \\r\\n Users assigned this role can see all assets; their security groups (if any) are ignored.\\r\\n

                                          \\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          Permissions
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n {{f.name | translate}}\\r\\n \\r\\n
                                          \\r\\n {{f.description | translate}}\\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n No permissions assigned to this role.\\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          Users assigned to this role
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n {{errorText}}\\r\\n
                                          \\r\\n
                                          \\r\\n 0 && roleUsers.length > 0\\\" reason=\\\"'M'\\\">\\r\\n No results found match: '{{ searchString }}'.\\r\\n \\r\\n \\r\\n No users currently associated with this role.\\r\\n \\r\\n
                                          \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                          \\r\\n Name\\r\\n \\r\\n \\r\\n Email\\r\\n \\r\\n
                                          \\r\\n \\r\\n \\r\\n {{ user.name }}\\r\\n \\r\\n {{ user.email }}\\r\\n
                                          \\r\\n
                                          \\r\\n
                                          \\r\\n \\r\\n
                                          \\r\\n\\r\\n
                                          \\r\\n
                                          \\r\\n
                                          = 1\\\">\\r\\n
                                            \\r\\n
                                            \\r\\n
                                            \\r\\n \\r\\n
                                            \\r\\n
                                            \\r\\n
                                            \\r\\n
                                            \\r\\n\\r\\n\\r\\n
                                            \\r\\n
                                            Visible Data Points
                                            \\r\\n\\r\\n
                                            \\r\\n
                                            \\r\\n \\r\\n
                                            \\r\\n\\r\\n
                                            \\r\\n 0 && datapointList.length > 0\\\">\\r\\n No results found in data points for '{{searchQuery}}'.\\r\\n \\r\\n \\r\\n No data points found.\\r\\n \\r\\n
                                            \\r\\n
                                            \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                            \\r\\n Data Point\\r\\n \\r\\n
                                            \\r\\n {{datapoint.description}}\\r\\n
                                            \\r\\n
                                            \\r\\n\\r\\n
                                            \\r\\n\\r\\n
                                            \\r\\n
                                            \\r\\n
                                            = 1 && !loading\\\">\\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n {{onLoadErrorText}}\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n\";","module.exports = \"
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n \\r\\n \\r\\n Role name already exists\\r\\n \\r\\n \\r\\n Role name is required\\r\\n \\r\\n \\r\\n Role name cannot be more than 75 characters\\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n Restricted: Users assigned this role can only see assets that are in their assigned security group(s).\\r\\n \\r\\n
                                              \\r\\n \\r\\n Unrestricted: Users assigned this role can view all assets irrespective of any security group(s) they are assigned to.\\r\\n \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n \\r\\n Warning: Setting asset visibility to Unrestricted\\r\\n for this role\\r\\n will allow users assigned to this this role to see all assets; their security\\r\\n group assignments (if any) will be ignored.\\r\\n \\r\\n \\r\\n \\r\\n Note: Setting Asset Visiblity to Restricted on this role will inhibit users' visible\\r\\n assets until\\r\\n the user is placed into to a security group.\\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n \\r\\n Description cannot be more than 500 characters\\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n Set the permissions and policies for users assigned to this role, allowing them to view pages and perform actions in ONE i3\\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n

                                              Users with this role permission will be granted all permissions listed below within ONE i3.

                                              \\r\\n\\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n

                                              {{permission.description | translate}}

                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n 0 && datapoints.length > 0\\\">\\r\\n No results found in data points for '{{text}}'.\\r\\n \\r\\n \\r\\n No data points found.\\r\\n \\r\\n
                                              \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                              \\r\\n \\r\\n\\r\\n \\r\\n Data Point\\r\\n \\r\\n
                                              \\r\\n \\r\\n \\r\\n {{datapoint.description}}\\r\\n
                                              \\r\\n
                                              = 1 && !loading\\\">\\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              = 1 && !loading\\\">\\r\\n
                                                \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n \\r\\n \\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n {{onLoadErrorText}}\\r\\n
                                              \\r\\n
                                              \\r\\n\";","module.exports = \"
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n \\r\\n Role created successfully.\\r\\n \\r\\n \\r\\n Role deleted successfully.\\r\\n \\r\\n \\r\\n \\r\\n
                                              \\r\\n 0 && roles.length > 0\\\">\\r\\n No results found in roles for '{{ searchText }}'.\\r\\n \\r\\n \\r\\n No roles found.\\r\\n \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n\\r\\n
                                              \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
                                              \\r\\n Role Name\\r\\n \\r\\n Asset Visibility\\r\\n Description\\r\\n \\r\\n \\r\\n\\r\\n
                                              \\r\\n {{ role.name }}\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n Restricted\\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n Unrestricted\\r\\n
                                              \\r\\n
                                              \\r\\n {{ role.description }}\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              \\r\\n
                                              = 1\\\">\\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n \\r\\n\\r\\n
                                                \\r\\n\\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n {{onLoadErrorText}}\\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n\";","module.exports = \"
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n \\r\\n
                                                \\r\\n \\r\\n Email is required\\r\\n \\r\\n Not a valid email! \\r\\n \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                0) && (inviteuserForm.$submitted)}\\\">\\r\\n \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                \\r\\n 0) && (inviteuserForm.$submitted)\\\" translate>At least one role is required.\\r\\n
                                                \\r\\n 0 && roles.length > 0\\\">\\r\\n No results found in roles for '{{ text }}'.\\r\\n \\r\\n \\r\\n No Roles found.\\r\\n \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n\\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n
                                                \\r\\n \\r\\n \\r\\n {{role.name}}\\r\\n \\r\\n (No name)\\r\\n , Description: {{desc}}\\r\\n \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                \\r\\n
                                                = 1\\\">\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n At least one role is required.\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n 0 && groups.length > 0\\\">\\r\\n No results found in Security Groups for '{{ searchtxt }}'.\\r\\n \\r\\n \\r\\n No Security Groups found.\\r\\n \\r\\n
                                                  \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n Name\\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n {{group.name}}\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                    = 1\\\"\\r\\n ng-model=\\\"current.groups.page\\\"\\r\\n boundary-link-numbers=\\\"true\\\"\\r\\n max-size=\\\"maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"groupPageChanged()\\\">
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n {{successText}}\\r\\n {{errorText}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n\";","module.exports = \"
                                                  \\r\\n
                                                  \\r\\n\\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n First Name can not be more than 35 characters\\r\\n \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n Last Name can not be more than 35 characters\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n \\r\\n\\r\\n
                                                  0) && (editUserForm.$dirty || editUserForm.$submitted)}\\\"\\r\\n requires-features=\\\"['admin.roles.users']\\\">\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n 0) && (editUserForm.$dirty || editUserForm.$submitted)\\\"\\r\\n translate>At least one role is required.\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n Roles\\r\\n
                                                  \\r\\n \\r\\n \\r\\n {{role.name}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  0) && (editUserForm.$dirty || editUserForm.$submitted)}\\\"\\r\\n requires-features=\\\"['admin.securitygroups.manage']\\\">\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n 0) && (editUserForm.$dirty || editUserForm.$submitted)\\\"\\r\\n translate>At least one group is required.\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n Groups\\r\\n
                                                  \\r\\n \\r\\n \\r\\n {{group.name}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n\\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n {{errorText}}\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n\";","module.exports = \"
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n {{errorText}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n 0 \\\">{{user.claims.data.prefix}}.\\r\\n {{ (user.claims.data.firstName || user.claims.data.lastName) ? (user.claims.data.firstName + \\\" \\\" + user.claims.data.lastName) : user.name}}\\r\\n \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n Email:\\r\\n
                                                  \\r\\n {{user.email}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n\\r\\n Phone Number:\\r\\n \\r\\n {{user.claims.data.phoneNumber}}\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n Unit of Measure: \\r\\n {{toTitleCase(user.claims.data.unitOfMeasure)}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n Timezone:\\r\\n {{user.claims.data.timezone}}\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                    \\r\\n
                                                  • \\r\\n {{role.name}}\\r\\n
                                                  • \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n No roles assigned.\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                    \\r\\n
                                                  • \\r\\n {{group.name}}\\r\\n
                                                  • \\r\\n
                                                  \\r\\n
                                                  \\r\\n No groups assigned.\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                  \\r\\n\\r\\n\\r\\n\\r\\n\";","module.exports = \"
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n 0 && userData.length > 0\\\">\\r\\n No results found in users for '{{ searchText }}'.\\r\\n \\r\\n \\r\\n No users found.\\r\\n \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n\\r\\n\\r\\n
                                                  \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n Name\\r\\n \\r\\n \\r\\n User Email\\r\\n \\r\\n \\r\\n User Roles\\r\\n \\r\\n
                                                  \\r\\n {{user.name || unavailable }}\\r\\n \\r\\n {{user.email || unavailable }}\\r\\n \\r\\n
                                                  {{role.name}}
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                    = 1 && !loading\\\" total-items=\\\"filteredUserData.length\\\" items-per-page=\\\"itemsPerPage\\\"\\r\\n ng-model=\\\"currentPage\\\" max-size=\\\"maxSize\\\" class=\\\"pagination-sm\\\" ng-change=\\\"pageChanged()\\\" boundary-link-numbers=\\\"true\\\"\\r\\n previous-text=\\\"<\\\" first-text=\\\"First\\\" next-text=\\\">\\\" last-text=\\\"Last\\\">
                                                  \\r\\n\\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                  \\r\\n\";","module.exports = \"\\r\\n\\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n Asset datapoint configuration is configured per account. You can select one package and any number of\\r\\n module combinations.\\r\\n Assets in this account with the matching package / module combination will have the configured\\r\\n datapoint\\r\\n display.\\r\\n \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n \\r\\n {{vm.modulesTable[$item.id].attributes.name}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Configured\\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\\r\\n
                                                  0 && vm.data.selectedPackage != null\\\">\\r\\n
                                                  \\r\\n Datapoint Configuration\\r\\n
                                                  \\r\\n\\r\\n
                                                  0\\\">\\r\\n\\r\\n
                                                    \\r\\n
                                                  • \\r\\n\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n {{vm.datapointsTitleMap[item.id]}}\\r\\n
                                                    \\r\\n {{item.id}}\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n
                                                    \\r\\n\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n
                                                    \\r\\n\\r\\n\\r\\n
                                                    \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                  • \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \";","module.exports = \"\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n
                                                  \\r\\n
                                                  \";","module.exports = \"\\r\\n\\r\\n
                                                  \\r\\n \\r\\n Invalid date.\\r\\n Enter a date.\\r\\n
                                                  \\r\\n Enter a time value.\\r\\n
                                                  \\r\\n
                                                  \";","module.exports = \"
                                                  \\r\\n
                                                  \\r\\n
                                                  {{title}}
                                                  \\r\\n \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n\";","module.exports = \"
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n \\r\\n Invalid Text.\\r\\n At least one value is required.\\r\\n 0\\\" style=\\\"display: block;\\\">{{vm.rowErrorCount()}} value(s) are invalid.\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n Invalid Url\\r\\n
                                                  \\r\\n
                                                  \\r\\n
                                                  \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                  NameUrlSortRemove
                                                  \\r\\n \\r\\n
                                                  \\r\\n Invalid Text\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n
                                                  \\r\\n Invalid Url\\r\\n
                                                  \\r\\n
                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                  \\r\\n
                                                  = 1\\\">\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \";","module.exports = \"\\r\\n
                                                    \\r\\n \\r\\n \\r\\n \\r\\n Enter a value.\\r\\n \\r\\n Invalid value.\\r\\n
                                                    \\r\\n
                                                    \";","module.exports = \"
                                                    \\r\\n \\r\\n
                                                    \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                    \\r\\n\\r\\n
                                                    \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                    \\r\\n\\r\\n
                                                    \\r\\n
                                                    \\r\\n Invalid range.\\r\\n Select a minimum and/or maximum value.\\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \";","module.exports = \"
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n
                                                    \\r\\n \\r\\n \\r\\n
                                                    \\r\\n Empty values can not be added.\\r\\n At least one value is required.\\r\\n 0\\\" class=\\\"text-danger\\\" style=\\\"display: block;\\\">{{vm.rowErrorCount()}} value(s) are invalid.\\r\\n Value already exists. You can not have multiple entries of the same value.\\r\\n \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                    \\r\\n Name\\r\\n Sort\\r\\n Remove\\r\\n
                                                    \\r\\n \\r\\n \\r\\n \\r\\n Invalid value.\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                    \\r\\n\\r\\n
                                                    = 1\\\">\\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \";","module.exports = \"
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n \\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      \\r\\n \\r\\n Attribute created successfully.\\r\\n \\r\\n \\r\\n Attribute deleted successfully.\\r\\n \\r\\n \\r\\n \\r\\n
                                                      \\r\\n 0 && vm.tags.length > 0\\\">\\r\\n No results found in attributes for '{{ vm.searchText }}'.\\r\\n \\r\\n \\r\\n No attributes found.\\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n = 1\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                      \\r\\n Name\\r\\n \\r\\n \\r\\n Data Type\\r\\n \\r\\n \\r\\n Values\\r\\n
                                                      \\r\\n {{ tag.key }}\\r\\n \\r\\n {{tag.dataType|translate}}\\r\\n Date & Time\\r\\n \\r\\n
                                                      \\r\\n \\r\\n Minimum \\r\\n {{tag.range.min}}\\r\\n {{tag.range.min | DateFilter}}\\r\\n {{tag.range.min | TableDateFilter}}\\r\\n \\r\\n , \\r\\n \\r\\n Maximum\\r\\n {{tag.range.max}}\\r\\n {{tag.range.max | DateFilter}}\\r\\n {{tag.range.max | TableDateFilter}}\\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n {{value.value}}\\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n 5\\\">...\\r\\n Freeform\\r\\n
                                                      \\r\\n
                                                      \\r\\n\\r\\n
                                                      \\r\\n \\r\\n
                                                      \\r\\n
                                                      \\r\\n
                                                      = 1 && !vm.loading\\\">\\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n\\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n {{vm.onLoadErrorText}}\\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n\";","module.exports = \"\\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n

                                                        Warning

                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n

                                                        Are you sure you want to delete {{pname}}?

                                                        \\r\\n
                                                        \\r\\n {{errorText}}\\r\\n
                                                        \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \";","module.exports = \"
                                                        \\r\\n
                                                        \\r\\n \\r\\n

                                                        Warning

                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n

                                                        Are you sure you want to remove {{name}}? Removing them will mean they no longer have access to this ONE i3 account.

                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \";","module.exports = \"
                                                        \\r\\n
                                                        \\r\\n \\r\\n

                                                        Warning

                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n

                                                        Are you sure you want to revoke {{text}}'s invitation?

                                                        \\r\\n

                                                        The link in the verification email sent to this user will no longer be valid.

                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n {{errorText}}\\r\\n
                                                        \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n\";","module.exports = \"
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n \\r\\n \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n\\r\\n
                                                        \\r\\n
                                                        \\r\\n 0 && vm.invites.length > 0\\\">\\r\\n No results found in invites for '{{ vm.searchString }}'.\\r\\n \\r\\n \\r\\n No invites found.\\r\\n \\r\\n
                                                        \\r\\n
                                                        0\\\">\\r\\n
                                                        \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                                                        \\r\\n Email\\r\\n \\r\\n \\r\\n Sent At\\r\\n \\r\\n \\r\\n Status\\r\\n \\r\\n
                                                        {{invite.email}}\\r\\n {{invite.sent.at | TableDateFilter}}\\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n {{invite.status | capitalize | translate}}\\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        \\r\\n
                                                        = 1\\\">\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n {{vm.onLoadErrorText}}\\r\\n
                                                          \\r\\n
                                                          \\r\\n\";","module.exports = \"
                                                          \\r\\n
                                                          \\r\\n \\r\\n

                                                          Warning

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Are you sure you want to delete {{text}}?

                                                          \\r\\n
                                                          \\r\\n {{errorText}}\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n\";","module.exports = \"
                                                          \\r\\n
                                                          \\r\\n \\r\\n

                                                          Warning

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Are you sure you want to delete {{roleName}}?

                                                          \\r\\n
                                                          \\r\\n\\r\\n {{errorText}}\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \";","module.exports = \"
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Tags Communicated

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Inventory - Top 5 Models

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Utilization - Top 5 Assets

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          Latest Activity

                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \";","module.exports = \"
                                                          0 || validationSummary.inactive > 0\\\">
                                                          \\r\\n\\r\\n{{errortext}}\\r\\nVerfication reported today.\\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n\\r\\n\";","module.exports = \"
                                                          0 && !errorFlag\\\">
                                                          \\r\\n\\r\\n{{errorText}}\\r\\nNo Utilization reported today.\\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\";","module.exports = \"
                                                          0 && !errorFlag\\\">
                                                          \\r\\n\\r\\n{{errorText}}\\r\\n{{inventoryMessage}}\\r\\n\\r\\n
                                                          0 && !errorFlag\\\">\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n\";","module.exports = \"
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          Tag #{{ evtvalue }}
                                                          \\r\\n
                                                          {{ evt.timestamp | amCalendar }}
                                                          \\r\\n \\r\\n
                                                          Activated
                                                          \\r\\n
                                                          {{ evt.equipment.meta.make }} {{ evt.equipment.meta.model }}
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          Tag #{{ evtvalue }}
                                                          \\r\\n
                                                          {{ evt.timestamp | amCalendar }}
                                                          \\r\\n \\r\\n
                                                          Deactivated
                                                          \\r\\n
                                                          {{ evt.equipment.meta.make }} {{ evt.equipment.meta.model }}
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          {{ evt.timestamp | amCalendar }}
                                                          \\r\\n \\r\\n
                                                          Reported Location
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n
                                                          {{ evt.timestamp | amCalendar }}
                                                          \\r\\n \\r\\n
                                                          Reported Utilization
                                                          \\r\\n
                                                          Lifetime: {{ lifetime }}
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \";","module.exports = \"
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n\\r\\n
                                                          0\\\">\\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          maxEmails) && submitted}\\\">\\r\\n \\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n Please notify recipient\\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n maxEmails \\\" translate translate-params-emailsnum=\\\"maxEmails\\\">Only\\r\\n {{emailsnum}} email address(es) allowed \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n \\r\\n Your data export request has been submitted. The link will be active for 7 days. \\r\\n \\r\\n Your request could not be processed.\\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n Important note:\\r\\n This page generates a CSV file containing raw asset data values. You will receive an email with\\r\\n a hyperlink to the CSV file.\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \";","module.exports = \"
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          \\r\\n {{schedule.jobName}}\\r\\n

                                                          \\r\\n
                                                          \\r\\n {{schedule.reportName | translate}}\\r\\n
                                                          \\r\\n

                                                          \\r\\n {{report.description | translate}}\\r\\n

                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n \\r\\n Daily\\r\\n \\r\\n \\r\\n Weekly\\r\\n \\r\\n \\r\\n Monthly\\r\\n \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n {{schedule | printScheduleDateRange}}\\r\\n
                                                          \\r\\n\\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n\\r\\n
                                                          \\r\\n {{email}}\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n \\r\\n\\r\\n
                                                          0\\\">\\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                          \\r\\n\\r\\n\\r\\n\\r\\n\";","module.exports = \"\\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n

                                                          {{errorText}}

                                                          \\r\\n

                                                          0 && !errorFlag\\\" translate translate-params-text=\\\"search.text\\\">No results found in Existing Schedules for '{{ text }}'.

                                                          \\r\\n

                                                          0) && !errorFlag\\\" translate>No scheduled reports found.

                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                          \\r\\n Name\\r\\n \\r\\n \\r\\n Report\\r\\n \\r\\n \\r\\n Frequency\\r\\n \\r\\n \\r\\n Next Run\\r\\n \\r\\n \\r\\n Status\\r\\n \\r\\n \\r\\n Delivery To\\r\\n
                                                          \\r\\n {{schedule.jobName}}\\r\\n \\r\\n {{schedule.attrs.type | translate}}\\r\\n \\r\\n \\r\\n Daily\\r\\n \\r\\n \\r\\n Weekly\\r\\n \\r\\n \\r\\n Monthly\\r\\n \\r\\n \\r\\n {{schedule.status.nextRun | TableDateFilter}}\\r\\n \\r\\n \\r\\n {{schedule.status.lastRun.end | TableDateFilter}}\\r\\n {{schedule.status.lastRun?schedule.status.lastRun.success?('(Success)'|translate):('(Fail)'|translate):''}} \\r\\n \\r\\n \\r\\n
                                                          \\r\\n {{email}}\\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n
                                                          \\r\\n\\r\\n
                                                          \\r\\n
                                                          \\r\\n \\r\\n
                                                          \\r\\n
                                                          = 1\\\">\\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n \\r\\n\\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n\\r\\n\\r\\n
                                                            \\r\\n
                                                            \\r\\n\\r\\n\\r\\n\";","module.exports = \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
                                                            \\r\\n
                                                            \";","module.exports = \"
                                                            \\r\\n
                                                            \\r\\n \\r\\n

                                                            {{modalTitle || ('Select Data Points'|translate)}}

                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n\\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n 0 && datapoints.length > 0\\\">\\r\\n No results found in data points for '{{searchQuery}}'.\\r\\n \\r\\n \\r\\n No data points found.\\r\\n \\r\\n
                                                            \\r\\n\\r\\n = 1 && success\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                            \\r\\n \\r\\n \\r\\n \\r\\n Data Point\\r\\n \\r\\n
                                                            \\r\\n \\r\\n \\r\\n {{datapoint.description}}\\r\\n
                                                            \\r\\n \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            0\\\" class=\\\"col-md-12\\\">\\r\\n
                                                            \\r\\n {{infoMessage}}\\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                            \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n
                                                              \\r\\n \\r\\n\\r\\n
                                                              \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n
                                                              \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n
                                                              \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                              \\r\\n Data Point\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
                                                              \\r\\n {{_selectedDatapoints[datapoint].description | translate}}\\r\\n \\r\\n \\r\\n
                                                              \\r\\n No data points Selected\\r\\n
                                                              \\r\\n
                                                              \\r\\n
                                                              \\r\\n
                                                              \\r\\n\\r\\n
                                                              \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n\";","module.exports = \"\\r\\n
                                                                maxEmails) && submitted}\\\">\\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n Please notify recipient(s)\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n maxEmails \\\" translate translate-params-emailsnum=\\\"maxEmails\\\">Only\\r\\n {{emailsnum}} email addresses allowed \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n Please specify start\\r\\n date\\r\\n
                                                                \\r\\n
                                                                \\r\\n Please select the future date\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n\\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n A valid delivery time is required\\r\\n \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n

                                                                To complete your email verification, please Enter your password :

                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                {{status}}
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n

                                                                By agreeing to receive email notifications, you will receive emails to the email address associated with your ONE i3 Account ({{email}}). Emails will include notification of system upgrades or maintenance for ONE i3.

                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n {{errorText}}\\r\\n Email subscription updated successfully.\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n Invalid Email\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n {{vm.emailErrorText}}\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n Your password must be at least 6 characters long and contain at least 2 of the following:\\r\\n
                                                                  \\r\\n
                                                                • lowercase letters
                                                                • \\r\\n
                                                                • UPPERCASE letters
                                                                • \\r\\n
                                                                • numbers
                                                                • \\r\\n
                                                                • \\r\\n symbols like \\r\\n ( !@#$%^&*()_-+= )\\r\\n
                                                                • \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n Current password required\\r\\n {{vm.passwordErrorText}}\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n Invalid password\\r\\n New password required\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n Confirm password required\\r\\n Passwords do not match\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n Password updated successfully.\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n {{vm.personalErrorText}}\\r\\n \\r\\n Profile updated successfully.\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n

                                                                \\r\\n {{vm.user.name}}\\r\\n

                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n Last Login: {{vm.lastLoginAt}}\\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n Last Password Update: {{vm.updatedAt}}\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"\\r\\n\\r\\n\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n\";","module.exports = \"
                                                                \\r\\n

                                                                Confirmation

                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n

                                                                {{vm.item.email}}

                                                                \\r\\n

                                                                \\r\\n Please note that this operation will log you off from the system.\\r\\n

                                                                \\r\\n

                                                                \\r\\n A verification email will be sent shortly to your new address containing a link that will confirm your identity and\\r\\n allow you to login again.\\r\\n

                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n

                                                                \\r\\n \\r\\n {{vm.popupEquipmentData.name}}\\r\\n \\r\\n \\r\\n {{vm.popupEquipmentData.name}}\\r\\n \\r\\n

                                                                \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n {{vm.popupEquipmentData.make}} {{ vm.popupEquipmentData.model}} {{ vm.popupEquipmentData.year}}\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n Last Communication\\r\\n :\\r\\n \\r\\n \\r\\n {{ vm.popupEquipmentData.communicatedAt | TableDateFilter }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Unavailable\\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Network: Bluetooth\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n \\r\\n \\r\\n N/A\\r\\n \\r\\n \\r\\n N/A\\r\\n \\r\\n \\r\\n {{series.attributes.last.v | attrsValueTranslate:series}}\\r\\n \\r\\n \\r\\n\\r\\n
                                                                {{series.attributes.title | translate}}
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n \\r\\n\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n No filters applied.\\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \";","module.exports = \"
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n {{errorText}}\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n No results found.\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n {{$count}} result found.\\r\\n No results found.\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \";","module.exports = $;","module.exports = \"\\r\\n
                                                                \\\">\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                <%= (equipment.name || \\\"N/A\\\") %>
                                                                \\r\\n
                                                                <%= makeModelDetails %>
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n <% if (equipment.properties.indexOf('alert:low')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n <% if (equipment.properties.indexOf('alert:medium')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n <% if (equipment.properties.indexOf('alert:high')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n <% if (equipment.properties.indexOf('maintenance:upcoming')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n <% if (equipment.properties.indexOf('maintenance:due')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n <% if (equipment.properties.indexOf('sharestatus:inbound')!=-1) { %>\\r\\n \\r\\n \\r\\n <% } %>\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\";","module.exports = \"\\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n\";","module.exports = \"
                                                                \\r\\n
                                                                \\r\\n
                                                                  \\r\\n
                                                                • \\r\\n
                                                                  \\r\\n \\r\\n
                                                                    \\r\\n
                                                                  • \\r\\n {{item.name | translate}}\\r\\n
                                                                  • \\r\\n
                                                                  \\r\\n
                                                                • \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n

                                                                \\r\\n {{module.name | translate}}\\r\\n

                                                                \\r\\n

                                                                \\r\\n {{module.description | translate }}\\r\\n

                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n

                                                                \\r\\n {{item.name | translate}}\\r\\n

                                                                \\r\\n

                                                                \\r\\n\\r\\n

                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \";","module.exports = \"\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n Plan name is required\\r\\n \\r\\n \\r\\n Plan name already in use\\r\\n \\r\\n \\r\\n \\r\\n Name can not be more than 75 characters\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n Plan description is required\\r\\n \\r\\n Description can not be more than 125 characters\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n Must select at least\\r\\n one asset\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n {{$count}} asset selected\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n maxEmails\\\" translate>Only {{maxEmails}} email addresses\\r\\n allowed\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n Meter Based\\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n Value\\r\\n must be greater than zero\\r\\n Value is required\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n Value\\r\\n must not be negative.\\r\\n \\r\\n Invalid value.\\r\\n \\r\\n Value must not be greater than due.\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n Calendar Based\\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n Value must be greater than zero\\r\\n Value is required\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n Value must not be negative.\\r\\n \\r\\n Invalid value.\\r\\n \\r\\n Value must not be greater than due.\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n Please\\r\\n select at least one schedule rule\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n Document Links\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
                                                                \\r\\n \\r\\n Example: http(s)://test.com or http://(your url)\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n\\r\\n \\r\\n
                                                                \\r\\n\\r\\n
                                                                = 1\\\">\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n Name\\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n {{doc.name}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                \\r\\n

                                                                \\r\\n {{doc.description}}\\r\\n

                                                                \\r\\n

                                                                \\r\\n \\r\\n {{doc.href}}\\r\\n \\r\\n

                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n \\r\\n
                                                                \\r\\n Example: http(s)://test.com or\\r\\n http://(your url)\\r\\n
                                                                \\r\\n\\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n No assets found for this plan.\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{errorText}}\\r\\n
                                                                  \\r\\n
                                                                  0 && searchText.length > 0\\\" style=\\\"padding: 0px 15px\\\">\\r\\n No results found matching: '{{text}}'. \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n Make\\r\\n \\r\\n \\r\\n Model\\r\\n \\r\\n \\r\\n Status\\r\\n \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n {{asset.name}}\\r\\n \\r\\n {{asset.attrs.make}}\\r\\n \\r\\n {{asset.attrs.model}}\\r\\n \\r\\n {{asset.status.description | translate}}\\r\\n
                                                                  \\r\\n \\r\\n

                                                                  \\r\\n {{error.Msg}}\\r\\n

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                    0\\\" total-items=\\\"filteredAssets.length\\\" ng-model=\\\"currentPage\\\" boundary-link-numbers=\\\"true\\\" max-size=\\\"maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\">
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n\";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n

                                                                  Adding a new task

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n Title is required\\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n Body is required\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n

                                                                  Editing task

                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n Title is required\\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n \\r\\n \\r\\n Body is required\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n No tasks found for this plan.\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{errorText}}\\r\\n
                                                                  \\r\\n
                                                                  0 && searchText.length >0\\\">\\r\\n No results found matching: '{{text}}'.\\r\\n
                                                                  \\r\\n \\r\\n \\r\\n 0\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n Title\\r\\n \\r\\n \\r\\n Body\\r\\n \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n {{task.title}}\\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                    0\\\" total-items=\\\"filteredTasks.length\\\" ng-model=\\\"currentPage\\\" boundary-link-numbers=\\\"true\\\"\\r\\n max-size=\\\"maxSize\\\" class=\\\"pagination-sm\\\" items-per-page=\\\"itemsPerPage\\\" previous-text=\\\"<\\\" next-text=\\\">\\\" ng-change=\\\"paginationChanged()\\\">
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n\";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n Meter Based\\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n Calendar Based\\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n

                                                                  Editing Plan

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n Selected: {{ selected.item }}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n

                                                                  Delete Maintenance Plan

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n

                                                                  Are you sure you want to delete {{name}}?

                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"\\r\\n\";","module.exports = \"\\r\\n\\r\\n\";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n

                                                                  \\r\\n Please note it can take up to 30 minutes for any changes to take effect\\r\\n

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n

                                                                  \\r\\n {{maintenancePlanData.name}}\\r\\n

                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n Created: {{maintenancePlanData.createdAt | TableDateFilter}}\\r\\n
                                                                  \\r\\n\\r\\n \\r\\n Description: {{maintenancePlanData.description}}\\r\\n \\r\\n\\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n Tags:\\r\\n \\r\\n {{tag}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n Notify:\\r\\n \\r\\n {{email.email}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n  \\r\\n
                                                                  Schedule
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n\\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n {{errorText}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  = 1 && !isEditing\\\">\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  Document Links
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                    \\r\\n\\r\\n
                                                                  • \\r\\n\\r\\n
                                                                    \\r\\n {{doc.name}}\\r\\n
                                                                    \\r\\n\\r\\n

                                                                    \\r\\n {{doc.description}}\\r\\n
                                                                    \\r\\n

                                                                    \\r\\n

                                                                    \\r\\n \\r\\n {{doc.href}}\\r\\n \\r\\n
                                                                    \\r\\n

                                                                    \\r\\n
                                                                  • \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n\\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{onLoadErrorText}}\\r\\n
                                                                  \\r\\n
                                                                  \";","module.exports = \"
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{csvErrorText}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                  \\r\\n 0 && maintenancePlans.length > 0\\\">No results found for '{{text}}'.\\r\\n There are no existing plans at this time.\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                  \\r\\n \\r\\n Name\\r\\n \\r\\n \\r\\n \\r\\n Description\\r\\n \\r\\n \\r\\n Tags\\r\\n \\r\\n Frequency\\r\\n \\r\\n Schedule Type\\r\\n
                                                                  \\r\\n {{maintenancePlan.name}}\\r\\n \\r\\n {{maintenancePlan.description}}\\r\\n \\r\\n
                                                                  \\r\\n {{tag}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n {{maintenancePlan.frequency}}\\r\\n \\r\\n {{maintenancePlan.schedule_type}}\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n\\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n
                                                                  \\r\\n\\r\\n
                                                                    \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n\\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n {{onLoadErrorText}}\\r\\n
                                                                    \\r\\n\\r\\n\";","module.exports = \"
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    Upcoming
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    Upcoming Assets
                                                                    \\r\\n {{aggregateData.upcomingEquipmentCount}}\\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n

                                                                    \\r\\n 0\\\" translate>Top Upcoming Plans\\r\\n No Upcoming Plans\\r\\n

                                                                    \\r\\n
                                                                      0\\\">\\r\\n
                                                                    • \\r\\n
                                                                      \\r\\n {{assetStatus.name}}\\r\\n - {{assetStatus.numOfAssets}}\\r\\n Assets\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n No data available\\r\\n
                                                                      \\r\\n
                                                                    • \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n
                                                                    Due
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    Assets Due
                                                                    \\r\\n
                                                                    {{aggregateData.dueEquipmentCount}}
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    0\\\">\\r\\n

                                                                    Top Due Plans

                                                                    \\r\\n
                                                                      \\r\\n
                                                                    • \\r\\n
                                                                      \\r\\n {{assetStatus.name}}\\r\\n - {{assetStatus.numOfAssets}} \\r\\n Assets\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{assetStatus.name}}\\r\\n - {{assetStatus.numOfAssets}} \\r\\n Assets\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n No data available\\r\\n
                                                                      \\r\\n
                                                                    • \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n {{chartErrorText}}\\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n\\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n {{statusErrorText}}\\r\\n 0 && statusData.length > 0 && !statusErrorFlag\\\">\\r\\n No results found for '{{text}}'.\\r\\n \\r\\n \\r\\n There are no assets requiring maintenance at this time.\\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n
                                                                    \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                    \\r\\n Status\\r\\n \\r\\n \\r\\n Asset\\r\\n \\r\\n \\r\\n Plan\\r\\n \\r\\n \\r\\n Last Serviced\\r\\n \\r\\n \\r\\n Next Service\\r\\n \\r\\n \\r\\n\\r\\n
                                                                    \\r\\n \\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n is\\r\\n {{statusEntry.status.description | translate}}\\r\\n \\r\\n
                                                                    \\r\\n {{statusEntry.lastService.date | TableDateFilter}}\\r\\n \\r\\n or {{hour}} runhours\\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n {{statusEntry.nextService.date | TableDateFilter }}\\r\\n \\r\\n or {{hour}} runhours\\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n \\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.lastService.date | TableDateFilter }}\\r\\n \\r\\n at {{hour}} run hours\\r\\n \\r\\n \\r\\n {{statusEntry.nextService.date | TableDateFilter }}\\r\\n \\r\\n or {{hour}} run hours\\r\\n \\r\\n \\r\\n \\r\\n {{hour}} run hours\\r\\n \\r\\n \\r\\n \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                    \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{assetData.name}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{record.workOrder}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{record.completedBy}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{record.reading.date | TableDateFilter}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{record.reading.odometer}} \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{record.reading.runHour}} \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n {{task.title}}\\r\\n

                                                                      \\r\\n

                                                                      \\r\\n

                                                                      \\r\\n

                                                                      \\r\\n \\r\\n {{val}}\\r\\n
                                                                      \\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n \";","module.exports = \"
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n 0 && statusData.length > 0\\\">\\r\\n No results found for '{{text}}'.\\r\\n \\r\\n \\r\\n There is no maintenance history at this time.\\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n Asset\\r\\n \\r\\n \\r\\n Plan\\r\\n \\r\\n \\r\\n Status\\r\\n \\r\\n \\r\\n Completed At\\r\\n \\r\\n \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Asset :\\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n
                                                                      \\r\\n Plan\\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n is\\r\\n {{statusEntry.completed}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.equipment.name}}\\r\\n \\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.plan.name}}\\r\\n \\r\\n \\r\\n {{statusEntry.completed}}\\r\\n \\r\\n {{statusEntry.completedAt | date:'MM/dd/yyyy H:mm:ssa' : 'UTC'}}\\r\\n \\r\\n \\r\\n View Details\\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                        \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{onLoadErrorText}}\\r\\n
                                                                      \\r\\n\\r\\n\\r\\n\";","module.exports = \"\\r\\n\\r\\n
                                                                      \\r\\n\\r\\n\";","module.exports = \"\";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n

                                                                      \\r\\n Using an older browser? For the best experience\\r\\n check out our browser\\r\\n support policy or\\r\\n upgrade to one of\\r\\n the latest browsers.\\r\\n

                                                                      \\r\\n
                                                                      \\r\\n \\r\\n Okay\\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n \\r\\n {{ commaDelimitedSelected() }}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                        \\r\\n
                                                                      • \\r\\n
                                                                      • \\r\\n \\r\\n
                                                                      • \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n\";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n All fields with * are required\\r\\n \\r\\n
                                                                      \";","module.exports = \"{{vm.text}}\";","module.exports = \"\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\";","module.exports = \"\\r\\n \";","module.exports = \"
                                                                      \\r\\n
                                                                      0\\\" class=\\\"lower-threshold\\\" ng-style=\\\"{width: vm.lowerThresholdPercentage}\\\">
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\";","module.exports = \"\\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \";","module.exports = \"\\r\\n\";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n {{ vm.selectedItem[vm.displayAttr] }}\\r\\n {{ 'Select Package...' | translate }}\\r\\n \\r\\n \\r\\n \\r\\n
                                                                        \\r\\n
                                                                      • \\r\\n \\r\\n
                                                                      • \\r\\n
                                                                      • \\r\\n \\r\\n
                                                                      • \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n 0\\\" class=\\\"badge\\\">{{filterCount}}\\r\\n \\r\\n
                                                                      \\r\\n\\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{vm.message}}\\r\\n {{vm.percent}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n\";","module.exports = \"\\r\\n\";","module.exports = \"{{'Log Out' | translate}}\";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      0\\\">\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{query}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{filter.title | translate}}:\\r\\n {{filter.value | translate}}\\r\\n {{filter.value }}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{key}}:\\r\\n {{value | toFriendlyAttr}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Last Seen:\\r\\n {{vm.filters.LastSeenFilter.label | translate}}\\r\\n \\r\\n {{min}}-{{max}} Days\\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n\";","module.exports = \"\";","module.exports = \"
                                                                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \";","module.exports = \"\";","module.exports = \"\\r\\n\";","module.exports = \"\";","module.exports = \"\";","module.exports = \"\\r\\n\";","module.exports = \"\";","module.exports = \"\";","module.exports = \"\";","module.exports = \"\\r\\n\";","module.exports = \"\";","module.exports = \"
                                                                      \\r\\n \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \";","module.exports = \"\\r\\n
                                                                      \\r\\n\\r\\n \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      1\\\">\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n
                                                                      {{vm.userAccount.name}}
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n {{ account.name }}\\r\\n \\r\\n \\r\\n \\r\\n
                                                                      {{sub.name}}
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"\\r\\n\\r\\n\";","module.exports = \"
                                                                        \\r\\n
                                                                      • \\r\\n {{ser.title}}\\r\\n
                                                                        \\r\\n {{ser.value | number: 2}}\\r\\n {{ser.uom}}\\r\\n
                                                                        \\r\\n \\r\\n
                                                                      • \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
                                                                      \\r\\n {{element.title}}\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n

                                                                      {{element.title}}

                                                                      \\r\\n

                                                                      \\r\\n {{element.value | number: 0}}\\r\\n

                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \";","module.exports = \"
                                                                      0\\\">\\r\\n

                                                                      Alarms

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      {{alarm.title}}
                                                                      \\r\\n
                                                                      {{alarm.value}}
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n

                                                                      Status{{vm.status}}

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      {{status.title}}
                                                                      \\r\\n
                                                                      {{status.value}}
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n {{vm.name}}\\r\\n \\r\\n {{vm.value}}{{vm.uom}}\\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n {{vm.max}}\\r\\n {{vm.min}}\\r\\n
                                                                      \\r\\n \\r\\n {{vm.name}}\\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n {{vm.value}}{{vm.uom}}\\r\\n N/A\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n {{vm.min}}\\r\\n {{vm.max}}\\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"\\r\\n\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n {{vm.model.title}}\\r\\n

                                                                      \\r\\n
                                                                      \\r\\n Last Communicated\\r\\n {{vm.timeAgo(vm.model.communicatedAt)}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Make\\r\\n {{vm.model.make}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Model\\r\\n {{vm.model.model}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Description\\r\\n {{vm.model.description}}\\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n Run Hours\\r\\n {{vm.model.runHours.last.v | number: 1}} hrs\\r\\n N/A\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n

                                                                      It looks like you are using an old browser...

                                                                      \\r\\n

                                                                      In order to ensure security and to provide the best possible experience we only support the latest\\r\\n browsers\\r\\n for this feature.\\r\\n

                                                                      \\r\\n

                                                                      \\r\\n To upgrade you can click\\r\\n here.\\r\\n

                                                                      \\r\\n

                                                                      or

                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n \\r\\n Uh Oh! Something went wrong...\\r\\n

                                                                      \\r\\n

                                                                      Something unexpected happened when attempting to access the asset.

                                                                      \\r\\n

                                                                      \\r\\n Please try again shortly. If the problem persists please contact\\r\\n telematics@ur.com.\\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      \\r\\n \\r\\n Item Not Found\\r\\n

                                                                      \\r\\n

                                                                      We have been unable to locate the asset you are looking for.

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n

                                                                      Alerts

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n You have no active alerts\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n {{series.gauge.name}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\";","module.exports = \"
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n

                                                                      \\r\\n Performing {{plan.attributes.name}}\\r\\n on {{equipmentData.attributes.name}}\\r\\n

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      =1\\\">\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      Document Links
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n

                                                                      Work Order # is required.

                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n

                                                                      Odometer\\r\\n value is required.

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n

                                                                      Run Hours\\r\\n input is required.

                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n

                                                                      \\r\\n {{task.title}}\\r\\n

                                                                      \\r\\n

                                                                      \\r\\n

                                                                      \\r\\n\\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n All fields with * are required\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\\r\\n
                                                                      \\r\\n \\r\\n \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \\r\\n
                                                                      \";","module.exports = \"
                                                                      \\r\\n\\r\\n

                                                                      {{params.title}}

                                                                      \\r\\n \\r\\n
                                                                      \\r\\n {{params.description}}\\r\\n
                                                                      \\r\\n
                                                                      \\r\\n\";"],"sourceRoot":""}