{"version":3,"file":"assets/chunk.a217a1be8d0ff8ecb429.js","mappings":"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","sources":["./video/advanced-video-search/template.hbs","./components/video/appearance-search/results-grid/index.hbs","./components/video/appearance-search/results-grid/index.ts","./video/appearance-search-results/template.hbs","../../../../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/roundToNearestMinutes/index.js","./components/activity/heat-map/heat-map-selectors/index.hbs","./components/activity/heat-map/heat-map-selectors/index.ts","./components/activity/heat-map/heat-map-images/index.hbs","./components/activity/heat-map/heat-map-images/index.ts","./components/activity/heat-map/time-lapse/index.hbs","./components/activity/heat-map/time-lapse/index.ts","./video/business-activity-analytics/heat-mapping/template.hbs","./video/business-activity-analytics/index/template.hbs","./video/business-activity-analytics/rule-group-list/template.hbs","./video/business-activity-analytics/rule-group/template.hbs","./video/business-activity-analytics/rule-list/template.hbs","./video/business-activity-analytics/rule/template.hbs","./video/business-activity-analytics/template.hbs","./video/camera-groups/edit/template.hbs","./video/camera-groups/template.hbs","./video/cameras/camera/analytics/template.hbs","./video/cameras/camera/calibrate/capture/template.hbs","./video/cameras/camera/calibrate/edit/template.hbs","./components/video/calibration/analytics-svg/index.hbs","./components/video/calibration/analytics-svg/index.js","./video/cameras/camera/calibrate/index/template.hbs","./video/cameras/camera/calibrate/review/template.hbs","./video/cameras/camera/index/template.hbs","./video/cameras/camera/post-install/chime-select/template.hbs","./video/cameras/camera/post-install/power-check/template.hbs","./video/cameras/camera/post-install/qualitative-power-check/template.hbs","./video/cameras/camera/post-install/wedge-select/template.hbs","./video/cameras/camera/template.hbs","./video/cameras/index/template.hbs","./video/cameras/template.hbs","./video/classifier-visualization/template.hbs","./video/clip-feedback/template.hbs","./video/clips-usage-report/template.hbs","./video/clips/index/template.hbs","./video/clips/template.hbs","./video/drone-install/template.hbs","./components/video/settings/familiar-targets/feedback-card/index.hbs","./components/video/settings/familiar-targets/feedback-card/index.ts","./video/familiar-subject-clip-feedback/template.hbs","./video/gallery/index/template.hbs","./video/gallery/template.hbs","./video/install-overview/index/template.hbs","./video/install-overview/install/template.hbs","./video/install-overview/replace/template.hbs","./video/install-overview/template.hbs","./video/intercom-contact/edit/template.hbs","./video/intercom-contact/enrollment/edit/template.hbs","./video/intercom-contact/enrollment/index/template.hbs","./video/intercom-contact/enrollment/notifications/template.hbs","./video/intercom-contact/enrollment/template.hbs","./video/intercom-contact/index/template.hbs","./video/intercom-contact/notifications/template.hbs","./video/intercom-contact/template.hbs","./video/international-tests/template.hbs","./video/live-view/template.hbs","./video/onboard/template.hbs","./video/onvif-install/credentials/template.hbs","./video/onvif-install/index/template.hbs","./video/onvif-install/naming/edit/template.hbs","./video/onvif-install/naming/index/template.hbs","./video/onvif-install/template.hbs","./video/onvif-install/terms-of-service/template.hbs","src/helpers/cancel-all.ts","./video/rules/analytics/draw/index/template.hbs","./video/rules/analytics/draw/template.hbs","./components/ui/collapsible-section/index.hbs","./components/ui/collapsible-section/index.ts","./video/rules/analytics/draw/v2/template.hbs","./video/rules/analytics/select/template.hbs","./video/rules/analytics/settings/template.hbs","./video/rules/analytics/template.hbs","./components/video/clips/storage/percent-item/index.hbs","./components/video/clips/storage/percent-item/index.ts","./components/video/rules/cloud-storage-info/index.hbs","./components/video/rules/cloud-storage-info/index.js","./components/video/rules/ai-deterrence-usage-info/index.hbs","./components/video/rules/ai-deterrence-usage-info/index.ts","./components/video/rules/local-storage-info/index.hbs","./components/video/rules/local-storage-info/index.ts","./components/video/rules/clip-limit-suggestion/index.hbs","./components/video/rules/clip-limit-suggestion/index.ts","./components/action-sheets/video/edit-alert-format/index.hbs","./components/action-sheets/video/edit-alert-format/index.ts","./video/rules/index/template.hbs","./video/schedules/index/template.hbs","./components/video/settings/playback-features/advanced-options-input/index.hbs","./components/video/settings/playback-features/advanced-options-input/index.js","./video/schedules/onboard/edit/template.hbs","./video/schedules/svr/edit/template.hbs","./helpers/subtract.ts","./video/schedules/svr/select/template.hbs","./video/settings-overview/template.hbs","./components/video/settings/advanced-setup-page/index.hbs","./components/video/settings/advanced-setup-page/index.ts","./video/settings/advanced-setup/template.hbs","./video/settings/battery-motion-sensitivity-settings/template.hbs","./video/settings/battery-status/template.hbs","./video/settings/camera/alerts/template.hbs","./video/settings/camera/audio/template.hbs","./video/settings/camera/device-status/template.hbs","./video/settings/camera/general/firmware/template.hbs","./components/action-sheets/video/led-color-picker/index.hbs","./components/action-sheets/video/led-color-picker/index.ts","./video/settings/camera/general/index/template.hbs","./video/settings/camera/general/template.hbs","./components/video/settings/image-multi-select/index.hbs","./components/video/settings/image-multi-select/index.ts","./components/video/settings/signal-strength-info-item/index.hbs","./components/video/settings/signal-strength-info-item/index.ts","./video/settings/camera/index/template.hbs","./video/settings/camera/lights-overview/template.hbs","./video/settings/camera/network-info/index/template.hbs","./video/settings/camera/template.hbs","./video/settings/camera/video-config/clip-length/template.hbs","./video/settings/camera/video-config/clip-quality/template.hbs","./video/settings/camera/video-config/digital-fov/template.hbs","./components/ui/slider-with-labels/index.hbs","./components/ui/slider-with-labels/index.ts","./video/settings/camera/video-config/image-settings/template.hbs","./video/settings/camera/video-config/index/template.hbs","./video/settings/camera/video-config/privacy-zones/template.hbs","./video/settings/camera/video-config/sd-card-info/template.hbs","./video/settings/camera/video-config/template.hbs","./video/settings/camera/video-config/third-party-stream/edit/template.hbs","./video/settings/camera/video-config/third-party-stream/index/template.hbs","./video/settings/camera/video-config/third-party-stream/template.hbs","./video/settings/camera/video-config/varifocal-fov/template.hbs","./video/settings/digital-fov/template.hbs","./video/settings/enrollment-terms/template.hbs","./video/settings/familiar-subject/faces/camera-access/template.hbs","./video/settings/familiar-subject/faces/feature-management/template.hbs","./video/settings/familiar-subject/faces/incorrect-photos/template.hbs","./components/video/settings/familiar-targets/face-entry/index.hbs","./components/video/settings/familiar-targets/face-entry/index.ts","./video/settings/familiar-subject/faces/index/template.hbs","./video/settings/familiar-subject/faces/recent-images/template.hbs","./video/settings/familiar-subject/index/template.hbs","./video/settings/familiar-subject/review/edit/template.hbs","./video/settings/familiar-subject/review/index/template.hbs","./video/settings/familiar-subject/review/notifications/template.hbs","./components/video/settings/familiar-targets/photo-card/index.hbs","./components/video/settings/familiar-targets/photo-card/index.ts","./components/video/settings/familiar-targets/photo-card/photo-review-card/index.hbs","./components/video/settings/familiar-targets/photo-card/photo-review-card/index.ts","./video/settings/familiar-subject/review/photos/template.hbs","./video/settings/familiar-subject/review/template.hbs","./video/settings/familiar-subject/template.hbs","./video/settings/familiar-subject/vehicles/camera-access/template.hbs","./video/settings/familiar-subject/vehicles/faq/template.hbs","./video/settings/familiar-subject/vehicles/feature-management/template.hbs","./video/settings/familiar-subject/vehicles/incorrect-photos/template.hbs","./components/video/settings/familiar-targets/cluster-selection/index.hbs","./components/video/settings/familiar-targets/cluster-selection/index.ts","./components/video/settings/familiar-targets/vehicle-entry/index.hbs","./components/video/settings/familiar-targets/vehicle-entry/index.ts","./video/settings/familiar-subject/vehicles/index/template.hbs","./video/settings/familiar-subject/vehicles/recent-images/template.hbs","./video/settings/intercom/add-directory/template.hbs","./video/settings/intercom/associated-device-select/template.hbs","./video/settings/intercom/connect-unit-to-system/template.hbs","./video/settings/intercom/create-directory/template.hbs","./video/settings/intercom/customize-directory/template.hbs","./video/settings/intercom/edit-directory/template.hbs","./video/settings/intercom/name-directory-list/template.hbs","./video/settings/intercom/qr-code/template.hbs","./video/settings/intercom/set-concierge/template.hbs","./video/settings/intercom/setup/template.hbs","./video/settings/intercom/video-device-select/template.hbs","./video/settings/light-triggers/template.hbs","./video/settings/lights/template.hbs","./video/settings/motion-configuration/template.hbs","./video/settings/motion-detection-test/template.hbs","./components/video/settings/lightguard/motion-detection-zone-selections/index.hbs","./components/video/settings/lightguard/motion-detection-zone-selections/index.ts","./video/settings/motion-detection/template.hbs","./video/settings/privacy-zones/template.hbs","./video/settings/sd-card-management/template.hbs","./video/settings/signal-strength-info/template.hbs","./video/settings/stream-video-panel-v2/template.hbs","./components/ui/enable-disable-all/index.hbs","./components/ui/enable-disable-all/index.ts","./video/settings/stream-video-panel/template.hbs","./components/video/settings/stream/setting-label/index.hbs","./components/video/settings/stream/setting-label/index.ts","./video/settings/stream/index/template.hbs","./video/settings/varifocal-fov/template.hbs","./components/wifi/wireless-signal-strength/index.hbs","./components/wifi/wireless-signal-strength/index.ts","./video/settings/video-device-signal-strength/template.hbs","./video/svr-timeline/template.hbs","./video/thumbnail-search/template.hbs","./video/youtube-player/template.hbs","./activity/event-history/controller.ts","./activity/event-history/route.ts","./assets/_route_/video.add-device-redirect.js","./components/action-sheets/video/familiar-target-incorrect-move/index.hbs","./components/action-sheets/video/familiar-target-incorrect-move/index.ts","./components/action-sheets/video/familiar-target-view-photo/index.hbs","./components/action-sheets/video/familiar-target-view-photo/index.ts","./components/automation/at-home-exceptions/index.hbs","./components/automation/at-home-exceptions/index.js","./components/component-helpers.js","./components/ui/async-with-pulsating-loading-text/index.hbs","./components/ui/async-with-pulsating-loading-text/index.ts","./components/ui/fade-out-text/index.hbs","./components/ui/fade-out-text/index.ts","./components/ui/ticked-slider-with-descriptions/index.hbs","./components/ui/ticked-slider-with-descriptions/index.ts","./components/video/advanced-analytics/business-activity-analytics-rules-wrapper/index.hbs","./components/video/advanced-analytics/business-activity-analytics-rules-wrapper/index.ts","./components/video/advanced-analytics/edit-rule-ui/base-edit-business-activity-analytics-rule-ui/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-ui/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-include-historical-data/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-include-historical-data/index.ts","./components/video/advanced-analytics/edit-rule-ui/edit-people-counting-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-people-counting-ui/index.js","./components/video/advanced-analytics/sensor-header/index.hbs","./components/video/advanced-analytics/sensor-header/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-rule/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-rule/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-thresholds-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-thresholds-ui/index.js","./components/video/analytics-light-rule/index.hbs","./components/video/analytics-light-rule/index.ts","./components/video/calibration/edit-snapshot/index.hbs","./components/video/calibration/edit-snapshot/index.js","./components/video/hd-state-image/index.hbs","./components/video/hd-state-image/index.ts","./components/video/intercom/contact/edit-contact-name/index.hbs","./components/video/intercom/contact/edit-contact-name/index.ts","./components/video/perimeter-guard-rule/index.hbs","./components/video/perimeter-guard-rule/index.ts","./components/video/rules/classification-filter-selection/subject-filter/index.hbs","./components/video/rules/classification-filter-selection/subject-filter/index.ts","./components/video/rules/classification-filter-selection/classification-filter/index.hbs","./components/video/rules/classification-filter-selection/classification-filter/index.ts","./components/video/rules/classification-filter-selection/index.hbs","./components/video/rules/classification-filter-selection/index.ts","./components/video/rules/classification-selection-proxy/index.hbs","./components/video/rules/classification-selection-proxy/index.ts","./components/video/rules/exit-delay/index.hbs","./components/video/rules/exit-delay/index.ts","./components/video/rules/property-status-exceptions/index.hbs","./components/video/rules/property-status-exceptions/index.ts","./components/modals/video/analytics-best-practices/index.hbs","./components/modals/video/analytics-best-practices/index.ts","./components/video/rules/select-camera-rule/index.hbs","./components/video/rules/select-camera-rule/index.js","./components/video/settings/camera-analytics/index.hbs","./components/video/settings/camera-analytics/index.ts","./components/video/settings/device-image-container/index.hbs","./components/video/settings/device-image-container/index.ts","./components/video/settings/device-status-info-item/index.hbs","./components/video/settings/device-status-info-item/index.ts","./components/video/settings/familiar-targets/camera-access/index.hbs","./components/video/settings/familiar-targets/camera-access/index.ts","./components/video/settings/familiar-targets/expand-photo-button/index.hbs","./components/video/settings/familiar-targets/expand-photo-button/index.ts","./components/video/settings/familiar-targets/faq-terms/index.hbs","./components/video/settings/familiar-targets/faq-terms/index.ts","./components/video/settings/familiar-targets/feature-management/index.hbs","./components/video/settings/familiar-targets/feature-management/index.ts","./components/video/settings/familiar-targets/incorrect-photos/index.hbs","./components/video/settings/familiar-targets/incorrect-photos/index.ts","./components/video/settings/familiar-targets/navigation-button-list/index.hbs","./components/video/settings/familiar-targets/navigation-button-list/index.ts","./components/video/settings/familiar-targets/photo-card/photo-card-action-buttons/index.hbs","./components/video/settings/familiar-targets/photo-card/photo-card-action-buttons/index.ts","./components/video/settings/familiar-targets/photo-grid/index.hbs","./components/video/settings/familiar-targets/photo-grid/index.ts","./components/video/settings/familiar-targets/recent-photos/index.hbs","./components/video/settings/familiar-targets/recent-photos/index.ts","./components/video/settings/familiar-targets/subject-image/index.hbs","./components/video/settings/familiar-targets/subject-image/index.ts","./components/video/settings/familiar-targets/subject-selection-carousel/selection-icon/index.hbs","./components/video/settings/familiar-targets/subject-selection-carousel/selection-icon/index.ts","./components/video/settings/familiar-targets/subject-selection-carousel/async-selection/index.hbs","./components/video/settings/familiar-targets/subject-selection-carousel/async-selection/index.ts","./components/video/settings/familiar-targets/subject-selection-carousel/index.hbs","./components/video/settings/familiar-targets/subject-selection-carousel/index.ts","./components/video/settings/intercom/recipients-searchbar/index.hbs","./components/video/settings/intercom/recipients-searchbar/index.ts","./components/video/settings/lightguard/light-activation-card/index.hbs","./components/video/settings/lightguard/light-activation-card/index.ts","./components/video/settings/lightguard/light-trigger-item/index.hbs","./components/video/settings/lightguard/light-trigger-item/index.ts","./components/video/settings/lightguard/light-triggers-group/index.hbs","./components/video/settings/lightguard/light-triggers-group/index.ts","./components/video/settings/playback-features/recording-quality-input/index.hbs","./components/video/settings/playback-features/recording-quality-input/index.ts","./components/ui/slider-with-server-request/index.hbs","./components/ui/slider-with-server-request/index.ts","./components/video/settings/varifocal-input-settings/index.hbs","./components/video/settings/varifocal-input-settings/index.ts","./components/video/settings/video-device-and-settings-selector/index.hbs","./components/video/settings/video-device-and-settings-selector/index.js","./components/video/settings/video-settings-container/index.hbs","./components/video/settings/video-settings-container/index.ts","./components/video/utils/onvif-snapshot-utils.ts","./components/video/video-player/overlay/fov-overlay/index.hbs","./components/video/video-player/overlay/fov-overlay/index.ts","./components/video/video-player/fov-player/index.hbs","./components/video/video-player/fov-player/index.js","./helpers/add.ts","./video/add-device-redirect/route.ts","./video/advanced-video-search/controller.js","./video/advanced-video-search/route.js","./video/appearance-search-results/controller.ts","./video/appearance-search-results/route.ts","./video/business-activity-analytics/heat-mapping/controller.ts","./video/business-activity-analytics/heat-mapping/route.ts","./video/business-activity-analytics/index/controller.js","./video/business-activity-analytics/index/route.js","./video/business-activity-analytics/reports/route.ts","./video/business-activity-analytics/rule-group-list/route.js","./components/video/advanced-analytics/edit-rule-ui/edit-rule-group-selection/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-rule-group-selection/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-group-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-group-ui/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-people-counting-group-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-people-counting-group-ui/index.js","./video/business-activity-analytics/rule-group/controller.js","./video/business-activity-analytics/rule-group/route.js","./video/business-activity-analytics/rule-list/controller.js","./video/business-activity-analytics/rule-list/route.js","./components/video/advanced-analytics/edit-rule-ui/edit-crowd-gathering-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-crowd-gathering-ui/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-heat-map-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-heat-map-ui/index.js","./components/video/advanced-analytics/edit-rule-ui/edit-queue-monitoring-ui/index.hbs","./components/video/advanced-analytics/edit-rule-ui/edit-queue-monitoring-ui/index.js","./video/business-activity-analytics/rule/controller.js","./video/business-activity-analytics/rule/route.js","./video/camera-groups/controller.ts","./video/camera-groups/edit/route.ts","./video/camera-groups/route.ts","./video/cameras/camera/analytics/controller.ts","./video/cameras/camera/analytics/route.ts","./video/cameras/camera/calibrate/capture/controller.ts","./video/cameras/camera/calibrate/capture/route.ts","./video/cameras/camera/calibrate/edit/controller.ts","./video/cameras/camera/calibrate/edit/route.ts","./video/cameras/camera/calibrate/index/controller.ts","./video/cameras/camera/calibrate/index/route.ts","./video/cameras/camera/calibrate/review/controller.ts","./video/cameras/camera/calibrate/review/route.ts","./video/cameras/camera/calibrate/route.ts","./video/cameras/camera/controller.ts","./video/cameras/camera/index/controller.ts","./video/cameras/camera/index/route.ts","./video/cameras/camera/post-install/chime-select/controller.ts","./video/cameras/camera/post-install/chime-select/route.ts","./video/cameras/camera/post-install/power-check/controller.ts","./video/cameras/camera/post-install/power-check/route.ts","./video/cameras/camera/post-install/qualitative-power-check/controller.ts","./video/cameras/camera/post-install/qualitative-power-check/route.ts","./video/cameras/camera/post-install/wedge-select/controller.ts","./video/cameras/camera/post-install/wedge-select/route.ts","./video/cameras/camera/route.ts","./video/cameras/index/controller.ts","./video/cameras/index/route.ts","./video/cameras/route.ts","./video/classifier-visualization/controller.js","./video/classifier-visualization/route.js","./video/clip-feedback/controller.js","./video/clip-feedback/route.js","./components/modals/video/clip-usage-category-details/index.hbs","./components/modals/video/clip-usage-category-details/index.ts","./components/video/clips-usage-report/report-toolbar/index.hbs","./components/video/clips-usage-report/report-toolbar/index.ts","./video/clips-usage-report/controller.ts","../../../../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/isWithinInterval/index.js","./video/clips-usage-report/route.ts","./video/clips/controller.ts","./video/clips/index/controller.ts","./video/clips/index/route.ts","./video/clips/route.ts","./video/drone-install/controller.ts","./video/drone-install/route.ts","./video/familiar-subject-clip-feedback/controller.ts","./video/familiar-subject-clip-feedback/route.ts","./video/gallery/controller.ts","./video/gallery/index/controller.ts","./video/gallery/index/route.ts","./video/gallery/route.ts","./video/install-overview/index/route.ts","./video/install-overview/install/controller.ts","./video/install-overview/install/route.ts","./video/install-overview/replace/controller.ts","./video/install-overview/replace/route.ts","./video/install-overview/route.ts","./video/intercom-contact/edit/controller.ts","./video/intercom-contact/edit/route.ts","./video/intercom-contact/enrollment/edit/controller.ts","./video/intercom-contact/enrollment/edit/route.ts","./video/intercom-contact/enrollment/index/controller.ts","./video/intercom-contact/enrollment/notifications/controller.ts","./video/intercom-contact/enrollment/notifications/route.ts","./video/intercom-contact/enrollment/route.ts","./video/intercom-contact/index/controller.ts","./video/intercom-contact/notifications/controller.ts","./video/intercom-contact/notifications/route.ts","./video/intercom-contact/route.ts","./video/international-tests/controller.js","./video/international-tests/route.js","./video/live-view/controller.ts","./video/live-view/route.ts","./video/onvif-install/credentials/controller.ts","./video/onvif-install/credentials/route.ts","./video/onvif-install/index/controller.ts","./video/onvif-install/index/route.ts","./video/onvif-install/naming/controller.ts","./video/onvif-install/naming/edit/controller.ts","./video/onvif-install/naming/edit/route.ts","./video/onvif-install/naming/index/controller.ts","./video/onvif-install/naming/index/route.ts","./video/onvif-install/naming/route.ts","./video/onvif-install/route.ts","./video/onvif-install/terms-of-service/controller.ts","./video/onvif-install/terms-of-service/route.ts","./video/rules/analytics/draw/index/controller.ts","./video/rules/analytics/draw/index/route.ts","./video/rules/analytics/draw/v2/controller.ts","./video/rules/analytics/draw/v2/route.ts","./video/rules/analytics/index/route.js","./video/rules/analytics/route.ts","./video/rules/analytics/select/controller.js","./video/rules/analytics/select/route.js","./video/rules/analytics/settings/controller.ts","./video/rules/analytics/settings/route.ts","./components/automation/filter-bar-radio/index.hbs","./components/automation/filter-bar-radio/index.ts","./video/rules/index/controller.js","./video/rules/index/route.js","./video/schedules/index/controller.js","./video/schedules/index/route.js","./video/schedules/onboard/edit/controller.ts","./video/schedules/onboard/edit/route.ts","./video/schedules/svr/edit/controller.ts","./video/schedules/svr/edit/route.ts","./components/modals/video/svr-disconnected/index.hbs","./components/modals/video/svr-disconnected/index.ts","./video/schedules/svr/select/controller.js","./video/schedules/svr/select/route.js","./video/settings-overview/controller.ts","./video/settings-overview/route.ts","./video/settings/advanced-setup/controller.ts","./video/settings/advanced-setup/route.ts","./video/settings/battery-motion-sensitivity-settings/route.ts","./video/settings/battery-status/route.ts","./video/settings/camera/alerts/controller.ts","./video/settings/camera/alerts/route.ts","./video/settings/camera/audio/controller.ts","./video/settings/camera/audio/route.ts","./video/settings/camera/device-status/controller.ts","./video/settings/camera/device-status/route.ts","./video/settings/camera/general/firmware/controller.ts","./video/settings/camera/general/firmware/route.ts","./video/settings/camera/general/index/controller.ts","./video/settings/camera/general/index/route.ts","./video/settings/camera/general/route.ts","./video/settings/camera/index/controller.ts","./video/settings/camera/index/route.ts","./video/settings/camera/lights-overview/controller.ts","./video/settings/camera/lights-overview/route.ts","./video/settings/camera/network-info/index/controller.ts","./video/settings/camera/network-info/index/route.ts","./video/settings/camera/network-info/route.ts","./video/settings/camera/route.ts","./video/settings/camera/video-config/clip-length/controller.ts","./video/settings/camera/video-config/clip-length/route.ts","./video/settings/camera/video-config/clip-quality/controller.ts","./video/settings/camera/video-config/clip-quality/route.ts","./video/settings/camera/video-config/digital-fov/controller.ts","./video/settings/camera/video-config/digital-fov/route.ts","./video/settings/camera/video-config/image-settings/controller.ts","./video/settings/camera/video-config/image-settings/route.ts","./components/modals/video/clip-donation-legal-agreement/index.hbs","./components/modals/video/clip-donation-legal-agreement/index.ts","./video/settings/camera/video-config/index/controller.ts","./video/settings/camera/video-config/index/route.ts","./video/settings/camera/video-config/privacy-zones/controller.ts","./video/settings/camera/video-config/privacy-zones/route.ts","./video/settings/camera/video-config/route.ts","./video/settings/camera/video-config/sd-card-info/controller.ts","./video/settings/camera/video-config/sd-card-info/route.ts","./video/settings/camera/video-config/third-party-stream/edit/controller.ts","./video/settings/camera/video-config/third-party-stream/edit/route.ts","./video/settings/camera/video-config/third-party-stream/index/controller.ts","./video/settings/camera/video-config/third-party-stream/index/route.ts","./video/settings/camera/video-config/third-party-stream/route.ts","./video/settings/camera/video-config/varifocal-fov/controller.ts","./video/settings/camera/video-config/varifocal-fov/route.ts","./video/settings/digital-fov/controller.ts","./video/settings/digital-fov/route.ts","./video/settings/enrollment-terms/controller.ts","./video/settings/enrollment-terms/route.ts","./video/settings/familiar-subject/faces/camera-access/route.ts","./video/settings/familiar-subject/faces/feature-management/controller.ts","./video/settings/familiar-subject/faces/feature-management/route.ts","./video/settings/familiar-subject/faces/incorrect-photos/route.ts","./video/settings/familiar-subject/faces/index/controller.ts","./video/settings/familiar-subject/faces/index/route.ts","./video/settings/familiar-subject/faces/recent-images/route.ts","./video/settings/familiar-subject/index/route.ts","./video/settings/familiar-subject/review/edit/controller.ts","./video/settings/familiar-subject/review/edit/route.ts","./video/settings/familiar-subject/review/index/controller.ts","./video/settings/familiar-subject/review/index/route.ts","./video/settings/familiar-subject/review/notifications/controller.ts","./video/settings/familiar-subject/review/notifications/route.ts","./video/settings/familiar-subject/review/photos/controller.ts","./video/settings/familiar-subject/review/photos/route.ts","./video/settings/familiar-subject/review/route.ts","./video/settings/familiar-subject/route.ts","./video/settings/familiar-subject/vehicles/camera-access/route.ts","./video/settings/familiar-subject/vehicles/faq/controller.ts","./video/settings/familiar-subject/vehicles/faq/route.ts","./video/settings/familiar-subject/vehicles/feature-management/controller.ts","./video/settings/familiar-subject/vehicles/feature-management/route.ts","./video/settings/familiar-subject/vehicles/incorrect-photos/route.ts","./video/settings/familiar-subject/vehicles/index/controller.ts","./video/settings/familiar-subject/vehicles/index/route.ts","./video/settings/familiar-subject/vehicles/recent-images/route.ts","./video/settings/intercom/add-directory/controller.ts","./video/settings/intercom/add-directory/route.ts","./video/settings/intercom/associated-device-select/controller.ts","./video/settings/intercom/associated-device-select/route.ts","./video/settings/intercom/connect-unit-to-system/controller.ts","./video/settings/intercom/connect-unit-to-system/route.ts","./video/settings/intercom/create-directory/controller.ts","./video/settings/intercom/create-directory/route.ts","./video/settings/intercom/customize-directory/controller.ts","./video/settings/intercom/customize-directory/route.ts","./video/settings/intercom/edit-directory/controller.ts","./video/settings/intercom/edit-directory/route.ts","./video/settings/intercom/name-directory-list/controller.ts","./video/settings/intercom/name-directory-list/route.ts","./video/settings/intercom/qr-code/controller.ts","./video/settings/intercom/qr-code/route.ts","./video/settings/intercom/set-concierge/controller.ts","./video/settings/intercom/set-concierge/route.ts","./video/settings/intercom/setup/controller.ts","./video/settings/intercom/setup/route.ts","./video/settings/intercom/video-device-select/controller.ts","./video/settings/intercom/video-device-select/route.ts","./video/settings/light-triggers/controller.ts","./video/settings/light-triggers/route.ts","./components/modals/video/light-setting-tooltip/index.hbs","./components/modals/video/light-setting-tooltip/index.ts","./video/settings/lights/controller.ts","./video/settings/lights/route.ts","./video/settings/motion-configuration/route.ts","./video/settings/motion-detection-test/route.ts","./video/settings/motion-detection/controller.ts","./video/settings/motion-detection/route.ts","./video/settings/privacy-zones/controller.ts","./video/settings/privacy-zones/route.ts","./video/settings/sd-card-management/controller.ts","./video/settings/sd-card-management/route.ts","./video/settings/signal-strength-info/controller.ts","./video/settings/signal-strength-info/route.ts","./video/settings/stream-video-panel-v2/controller.ts","./video/settings/stream-video-panel-v2/route.ts","./video/settings/stream-video-panel/controller.ts","./video/settings/stream-video-panel/route.ts","./video/settings/stream/index/controller.ts","./video/settings/stream/index/route.ts","./video/settings/stream/route.ts","./video/settings/varifocal-fov/controller.ts","./video/settings/varifocal-fov/route.ts","./video/settings/video-device-signal-strength/controller.ts","./video/settings/video-device-signal-strength/route.ts","./video/youtube-player/route.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n \\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/advanced-video-search/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#each this.searchResultsDisplay as |searchResult|}}\\n \\n
\\n \\n
\\n {{searchResult.cameraName}}\\n {{searchResult.dateTime}}\\n
\\n \\n \\n
\\n
\\n {{/each}}\\n\",{ moduleName: \"customer-site/components/video/appearance-search/results-grid/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type { AppearanceSearchResult } from 'customer-site/video/appearance-search-results/controller';\nimport './_style.scss';\n\ninterface ResultsGridSignature {\n Args: {\n playClip: (resultId: string) => void;\n useSmallTileMode: boolean;\n searchResults: AppearanceSearchResult[];\n };\n}\n\ntype SearchResultDisplay = {\n id: string;\n cameraName: string;\n imageUrl: string;\n dateTime: string;\n};\n\n/**\n * @classdesc\n * The result grid for the appearance search results page\n */\n@intlPath({ path: 'video/appearance-search/results-grid' })\nexport default class ResultsGrid extends Component {\n @service declare intl: ServiceRegistry['adc-intl'];\n\n /**\n * Which tile's hover is currently visible (if any)\n */\n @tracked visibleHoverTileId: string | null = null;\n\n /**\n * Information for displaying the search results\n */\n @computed('args.searchResults', 'intl.locale')\n get searchResultsDisplay(): SearchResultDisplay[] {\n return this.args.searchResults.map((result) => ({\n id: result.id,\n cameraName: result.cameraName,\n imageUrl: result.imageUrl,\n dateTime: this.intl.formatDateTz(result.dateTime, {\n month: 'numeric',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric'\n })\n }));\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AppearanceSearch::ResultsGrid': typeof ResultsGrid;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:toolbar>\\n \\n \\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n {{!-- @glint-expect-error SvrPlaybackFeatures needs to be converted to glimmer VID-81226 --}}\\n \\n
\\n
\\n \\n \\n
\\n \\n
\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/appearance-search-results/template.hbs\" })","import toDate from \"../toDate/index.js\";\nimport { getRoundingMethod } from \"../_lib/roundingMethods/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name roundToNearestMinutes\n * @category Minute Helpers\n * @summary Rounds the given date to the nearest minute\n *\n * @description\n * Rounds the given date to the nearest minute (or number of minutes).\n * Rounds up when the given date is exactly between the nearest round minutes.\n *\n * @param {Date|Number} date - the date to round\n * @param {Object} [options] - an object with options.\n * @param {Number} [options.nearestTo=1] - nearest number of minutes to round to. E.g. `15` to round to quarter hours.\n * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`)\n * @returns {Date} the new date rounded to the closest minute\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.nearestTo` must be between 1 and 30\n *\n * @example\n * // Round 10 July 2014 12:12:34 to nearest minute:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34))\n * //=> Thu Jul 10 2014 12:13:00\n *\n * @example\n * // Round 10 July 2014 12:07:30 to nearest quarter hour:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34), { nearestTo: 15 })\n * // rounds up because given date is exactly between 12:00:00 and 12:15:00\n * //=> Thu Jul 10 2014 12:15:00\n */\n\nexport default function roundToNearestMinutes(dirtyDate, options) {\n var _options$nearestTo;\n\n if (arguments.length < 1) {\n throw new TypeError('1 argument required, but only none provided present');\n }\n\n var nearestTo = toInteger((_options$nearestTo = options === null || options === void 0 ? void 0 : options.nearestTo) !== null && _options$nearestTo !== void 0 ? _options$nearestTo : 1);\n\n if (nearestTo < 1 || nearestTo > 30) {\n throw new RangeError('`options.nearestTo` must be between 1 and 30');\n }\n\n var date = toDate(dirtyDate);\n var seconds = date.getSeconds(); // relevant if nearestTo is 1, which is the default case\n\n var minutes = date.getMinutes() + seconds / 60;\n var roundingMethod = getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod);\n var roundedMinutes = roundingMethod(minutes / nearestTo) * nearestTo;\n var remainderMinutes = minutes % nearestTo;\n var addedMinutes = Math.round(remainderMinutes / nearestTo) * nearestTo;\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), roundedMinutes + addedMinutes);\n}","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n\\n {{#if this.ruleHasMinDuration}}\\n \\n \\n

{{tc this \\'dateTimeRestriction\\'}}

\\n
\\n \\n {{else}}\\n

{{tc this \\'recentRule\\'}}

\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/activity/heat-map/heat-map-selectors/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { isBetween } from '@adc/ember-utils/utils/math';\nimport { computed, action } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { timeout, task } from 'ember-concurrency';\nimport { DateFilter, DateRangeFilter } from 'customer-site/classes/helpers/filters/filters';\nimport { Heatmap } from 'customer-site/enums/OvlRuleType';\nimport { MIN_GROUP_BY } from 'customer-site/video/business-activity-analytics/heat-mapping/controller';\nimport { intlPath } from '@adc/i18n/path';\nimport { VALUE_CHANGE_ACTION } from '@adc/ui-components/components/common/base-input';\nimport { default as DropdownSelectItem, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\nimport {\n roundToNearestMinutes,\n min,\n max,\n subDays,\n subMinutes,\n addHours,\n addMinutes,\n differenceInHours,\n differenceInMilliseconds\n} from 'date-fns';\nimport { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';\n\nimport type {\n HeatMapEditValues,\n IHeatMapEditValues\n} from 'customer-site/video/business-activity-analytics/heat-mapping/helper-objects/heat-maps';\nimport './_style.scss';\nimport type AdcAjaxService from '@adc/ajax/services/adc-ajax';\nimport type EnvSettingsService from '@adc/app-infrastructure/services/env-settings';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ContextManager from 'customer-site/services/context-manager';\n\n/**\n * Creates a dropdown item for the camera selector. Disabled based on current rule types.\n */\nasync function createCameraDropdownItem(camera: OvReadyCamera): Promise {\n return DropdownSelectItem.create({\n name: camera.description,\n value: camera.id,\n state: UNSELECTED,\n disabled: !(await camera.ovRules).any((rule) => rule.ruleType === Heatmap)\n });\n}\n\n/**\n * Constants used to limit the date-time selection.\n *\n * MAX_DAY_RANGE -> max number of days between the start and end dates.\n * MIN_TIME_RANGE_HOURS -> minimum time between the start and end dates.\n */\nexport const MAX_DAY_RANGE = 8,\n MIN_TIME_RANGE_HOURS = 1;\n\ninterface HeatMapSelectorsSignature {\n Element: HTMLDivElement;\n Args: {\n cameras: OvReadyCamera[];\n editValues: HeatMapEditValues;\n updateHasMinDuration: (hasMinDuration: boolean, shouldLoadHeatMaps?: boolean) => void;\n [VALUE_CHANGE_ACTION]: (editValues: IHeatMapEditValues) => void;\n };\n}\n\n/**\n * @classdesc\n *\n * Handles the camera and date time selection for heat maps.\n * Also handles min/maxValues for comparisons w/o a unified min/max.\n */\n@intlPath({ path: 'activity/heat-map/heat-map-selectors' })\nexport default class HeatMapSelectors extends Component {\n @service declare ajax: AdcAjaxService;\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare envSettings: EnvSettingsService;\n\n constructor(owner: unknown, args: HeatMapSelectorsSignature['Args']) {\n super(owner, args);\n this.getCurrentMaxTime.perform();\n }\n\n willDestroy(): void {\n super.willDestroy();\n this.getCurrentMaxTime.cancelAll();\n }\n\n /**\n * The max date that can be selected in the date-time range picker.\n * This will be limited to the current time rounded to the nearest MIN_GROUP_BY value.\n */\n @tracked\n declare maxDate: Date;\n\n /**\n * Maps the available camera models to the dropdown select.\n */\n @computed('args.cameras.[]')\n get cameraDropdownItems(): Promise {\n return Promise.all((this.args.cameras || []).map((camera) => createCameraDropdownItem(camera)));\n }\n\n /**\n * Gets the currently selected camera.\n */\n @computed('args.{editValues.cameraId,cameras}')\n get selectedCamera(): OvReadyCamera | undefined {\n return this.args.cameras?.findBy('id', this.args.editValues.cameraId);\n }\n\n /**\n * Gets the heat map rule from the currently selected camera.\n * We only expect there to be one heat map rule on any given camera.\n */\n @computed('selectedCamera.ovRules')\n get selectedHeatMapRule(): OvRule | undefined {\n return this.selectedCamera?.ovRules.findBy('ruleType', Heatmap);\n }\n\n /**\n * The minimum date that can be requested for the heat map which will be either the rule start date\n * rounded up to the nearest MIN_GROUP_BY or ALLOWED_DAYS_BACK in the past from the current date.\n */\n @computed('intl.timeZone', 'selectedHeatMapRule')\n get minDate(): Date {\n const { selectedHeatMapRule } = this;\n if (selectedHeatMapRule) {\n const minDateUtc = zonedTimeToUtc(selectedHeatMapRule.heatMapMinDateUnit, this.intl.timeZone ?? '');\n return roundToNearestMinutes(addMinutes(minDateUtc, MIN_GROUP_BY / 2), { nearestTo: MIN_GROUP_BY });\n }\n\n return new Date(0);\n }\n\n /**\n * The date range filter that holds all inputs for the date range selectors.\n */\n @computed('args.editValues.{endDate,startDate}', 'maxDate', 'minDate', 'setDates')\n get dateRangeFilter(): DateRangeFilter {\n const { intl } = this,\n { timeZone = '' } = intl,\n { editValues } = this.args,\n { startDate, endDate } = editValues;\n\n return new DateRangeFilter(\n intl.t('generic.date'),\n 'dateRange',\n new DateFilter(intl.t('generic.startDate'), 'startDate', timeZone, {\n value: startDate,\n defaultValue: startDate,\n minimumDate: this.minDate\n }),\n new DateFilter(intl.t('generic.endDate'), 'endDate', timeZone, {\n value: endDate,\n defaultValue: endDate,\n maximumDate: this.maxDate\n }),\n {\n apply: this.setDates,\n validationFn: (startDate: Date, endDate: Date) =>\n isBetween(differenceInHours(endDate, startDate), MIN_TIME_RANGE_HOURS, MAX_DAY_RANGE * 24)\n }\n );\n }\n\n /**\n * Calculates whether the currently selected heat map rule has existed for at least the MIN_TIME_RANGE_HOURS to\n * request a heat map. If it has not then we hide the date-time picker and show some text explaining that the rule\n * needs to gather more data before it can be queried.\n * Sets the value on the edit values to determine whether or not the 'Go' button is disabled.\n */\n @computed('selectedHeatMapRule', 'minDate', 'maxDate')\n get ruleHasMinDuration(): boolean {\n return this.selectedHeatMapRule ? differenceInHours(this.maxDate, this.minDate) > MIN_TIME_RANGE_HOURS : false;\n }\n\n /**\n * Updates the max date to the current time rounded to the nearest multiple of MIN_GROUP_BY.\n */\n getCurrentMaxTime = task(async () => {\n // Need to wait until the next the multiple of MIN_GROUP_BY to update the maxDate the first time.\n const currentDate = new Date();\n this.maxDate = roundToNearestMinutes(subMinutes(currentDate, MIN_GROUP_BY / 2), { nearestTo: MIN_GROUP_BY });\n if (!this.envSettings.isTestEnvironment()) {\n const nextUpdateTime = roundToNearestMinutes(addMinutes(currentDate, MIN_GROUP_BY / 2), {\n nearestTo: MIN_GROUP_BY\n });\n await timeout(differenceInMilliseconds(nextUpdateTime, currentDate));\n\n // Update the maxDate every increment of MIN_GROUP_BY.\n for (;;) {\n this.maxDate = roundToNearestMinutes(new Date(), { nearestTo: MIN_GROUP_BY });\n this.args.updateHasMinDuration(this.ruleHasMinDuration);\n await timeout(MIN_GROUP_BY * 60 * 1000);\n }\n }\n });\n\n /**\n * Handles initial date range corrections for passed in start/endDates.\n * Defaults to 9am - 5pm of the previous day if the rule has existed long enough,\n * otherwise use the full time the rule has existed\n */\n @action\n checkDates(): void {\n const { editValues } = this.args,\n { timeZone = '' } = this.intl,\n heatMapMinDateUnit = this.selectedHeatMapRule?.heatMapMinDateUnit ?? new Date(0),\n heatMapMinDateUtc = heatMapMinDateUnit ? zonedTimeToUtc(heatMapMinDateUnit, timeZone) : heatMapMinDateUnit;\n\n if (editValues.startDate < heatMapMinDateUtc) {\n // Get default start date and see if we want to use it.\n const zonedNow = utcToZonedTime(Date.now(), timeZone),\n zonedYesterday = subDays(zonedNow, 1);\n zonedYesterday.setHours(9, 0, 0, 0);\n const defaultStartUtc = zonedTimeToUtc(zonedYesterday, timeZone),\n useDefaultDates = heatMapMinDateUnit < zonedYesterday;\n this.setDates({\n startDate: useDefaultDates ? defaultStartUtc : heatMapMinDateUtc,\n endDate: useDefaultDates ? addHours(defaultStartUtc, 8) : new Date()\n });\n return;\n }\n\n this.setDates(editValues);\n }\n\n /**\n * Sets the start/endDates for editing.\n * Rounds the dates to the nearest MIN_GROUP_BY value and ensures they are at least 1 hour apart.\n * Passes up true to indicate a value changed.\n */\n @action\n setDates(dates: { startDate: Date; endDate: Date }): void {\n let { startDate, endDate } = dates;\n startDate = max([this.minDate, roundToNearestMinutes(startDate, { nearestTo: MIN_GROUP_BY })]);\n endDate = min([this.maxDate, roundToNearestMinutes(endDate, { nearestTo: MIN_GROUP_BY })]);\n this.args[VALUE_CHANGE_ACTION]({ startDate, endDate });\n }\n\n /**\n * Sets the camera id and passes up true to indicate a value changed.\n */\n @action\n setCameraId(cameraId: string): void {\n this.args[VALUE_CHANGE_ACTION]({ cameraId });\n const { ruleHasMinDuration } = this;\n this.args.updateHasMinDuration(ruleHasMinDuration);\n if (ruleHasMinDuration) {\n this.checkDates();\n }\n }\n\n /**\n * Schedules an update of hasMinDuration after render (done this way to avoid rendering issues).\n */\n @action\n initHasMinDuration(): void {\n // Do not copy this deprecated usage. If you see this, please fix.\n // eslint-disable-next-line ember/no-runloop\n scheduleOnce('afterRender', this, this.args.updateHasMinDuration, this.ruleHasMinDuration, true);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Activity::HeatMap::HeatMapSelectors': typeof HeatMapSelectors;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{#each @heatMaps.ruleSnapshotList as |ruleSnapshot index|}}\\n \\n {{/each}}\\n {{#each @heatMaps.heatMapList as |heatMapImage index|}}\\n \\n {{/each}}\\n
\\n
\\n \\n

{{safe-html this.snapshotLabel}}

\\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/activity/heat-map/heat-map-images/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed, action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoBusinessActivityAnalyticsRuleList } from 'customer-site/enums/CustomerPageUrl';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type {\n HeatMapListItem,\n HeatMaps,\n RuleSnapshotListItem\n} from 'customer-site/video/business-activity-analytics/heat-mapping/helper-objects/heat-maps';\n\ninterface HeatMapImagesSignature {\n Element: HTMLDivElement;\n Args: {\n cameraId: string;\n heatMapIndex: number;\n imageClass: string;\n heatMaps: HeatMaps;\n imageRendered: (index: number, isRuleSnapshot: boolean, failedToLoad: boolean) => void;\n };\n}\n\n/**\n * @classDesc\n * Gets the translations to be used for the heat map labels.\n */\n@intlPath({ path: 'activity/heat-map/heat-map-images' })\nexport default class HeatMapImages extends Component {\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n\n /**\n * Creates the snapshot label.\n */\n @computed('args.heatMaps.{cameraName,ruleName}')\n get snapshotLabel(): string {\n const { cameraName, ruleName } = this.args.heatMaps;\n return this.intl.tc(this, 'snapshotLabel', {\n cameraName,\n ruleName\n });\n }\n\n /**\n * The index of the rule snapshot that corresponds to the current heat map.\n */\n @computed('currentHeatMap.ruleSnapshotIndex')\n get ruleSnapshotIndex(): number {\n const { currentHeatMap } = this;\n return currentHeatMap ? currentHeatMap.ruleSnapshotIndex : 0;\n }\n\n /**\n * The current heat map that is being displayed.\n */\n @computed('args.{heatMapIndex,heatMaps.heatMapList.[]}')\n get currentHeatMap(): HeatMapListItem {\n const { heatMapIndex, heatMaps } = this.args;\n return heatMaps.heatMapList[heatMapIndex];\n }\n\n /**\n * The current rule snapshot that is being displayed.\n */\n @computed('ruleSnapshotIndex', 'args.heatMaps.ruleSnapshotList.[]')\n get currentRuleSnapshot(): RuleSnapshotListItem {\n return this.args.heatMaps.ruleSnapshotList[this.ruleSnapshotIndex];\n }\n\n /**\n * The error text to display for the current heat map and rule snpashot.\n */\n @computed('currentHeatMap.failedToLoad', 'currentRuleSnapshot.failedToLoad')\n get errorText(): string {\n const { currentHeatMap, currentRuleSnapshot, intl } = this;\n return currentRuleSnapshot.failedToLoad && !currentHeatMap?.failedToLoad\n ? intl.tc(this, 'imageFailedToLoad')\n : intl.tc(this, 'heatMapFailedToLoad');\n }\n\n /**\n * Transitions the user to the BAA rule setup page with the currently selected camera selected.\n */\n @action\n transitionToRuleSetup(): void {\n const { cameraId } = this.args;\n this.navigation.transitionToRouteId(EmberVideoBusinessActivityAnalyticsRuleList, { queryParams: { cameraId } });\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Activity::HeatMap::HeatMapImages': typeof HeatMapImages;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{#if (and (not this.isComparison) @heatMaps)}}\\n \\n {{else if (and this.isComparison @comparisonHeatMaps)}}\\n \\n \\n {{/if}}\\n
\\n\\n {{#if this.isTimeLapse}}\\n
\\n \\n
\\n \\n
\\n \\n
\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/activity/heat-map/time-lapse/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { computed, action, setProperties } from '@ember/object';\nimport { alias, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { timeout, task } from 'ember-concurrency';\nimport { intlPath } from '@adc/i18n/path';\nimport { default as DropdownSelectItem, SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type HeatMapMetric from 'customer-site/models/activity/heat-map-metric';\nimport type {\n HeatMaps,\n ComparisonHeatMaps,\n HeatMapListItem,\n RuleSnapshotListItem\n} from 'customer-site/video/business-activity-analytics/heat-mapping/helper-objects/heat-maps';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type AjaxService from 'customer-site/services/ajax';\n\nconst SPEED_OPTIONS = [0.5, 1, 2, 4, 8];\n\ninterface TimeLapseArgs {\n heatMapMetrics: HeatMapMetric;\n heatMaps: HeatMaps;\n comparisonHeatMaps: ComparisonHeatMaps;\n setSpeedTick: (index: number) => void;\n}\n\n/**\n * @classdesc\n *\n * Holds all the logic for playing and displaying the heat map time lapse.\n */\n@intlPath({ path: 'activity/heat-map/time-lapse' })\nexport default class TimeLapse extends Component {\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationService;\n @service declare ajax: AjaxService;\n\n /** @override */\n willDestroy(): void {\n super.willDestroy();\n this.rollTimeLapseTask.cancelAll();\n }\n\n /**\n * The current value of the time lapse slider.\n */\n @tracked sliderValue = 0;\n\n /**\n * Index of the currently displayed heat map in the time lapse.\n */\n @tracked heatMapIndex = 0;\n\n /**\n * The current tick value of the playback speed slider.\n */\n @reads('args.heatMapMetrics.playbackSpeedTick')\n declare playbackSpeedTick: number;\n\n /**\n * Whether or not the heat map is a time lapse or single image.\n */\n @reads('args.heatMapMetrics.isTimeLapse')\n declare isTimeLapse: boolean;\n\n /**\n * Whether or not the page is comparing two heat maps.\n */\n @reads('args.heatMapMetrics.isComparison')\n declare isComparison: boolean;\n\n // #region First Heat Maps\n\n /**\n * The list of heat maps being used for the single heat maps\n * or the first of the comparisons.\n */\n @computed('args.{heatMaps.heatMapList,comparisonHeatMaps.firstHeatMaps.heatMapList}', 'isComparison')\n get firstHeatMapList(): HeatMapListItem[] {\n const { isComparison, args } = this;\n return isComparison ? args.comparisonHeatMaps.firstHeatMaps.heatMapList : args.heatMaps.heatMapList;\n }\n\n /**\n * The list of rule snapshots being used for the single heat maps\n * or the first of the comparisons.\n */\n @computed('args.{heatMaps.ruleSnapshotList,comparisonHeatMaps.firstHeatMaps.ruleSnapshotList}', 'isComparison')\n get firstRuleSnapshotList(): RuleSnapshotListItem[] {\n const { isComparison, args } = this;\n return isComparison ? args.comparisonHeatMaps.firstHeatMaps.ruleSnapshotList : args.heatMaps.ruleSnapshotList;\n }\n\n /**\n * The current heat map for the single heat maps or the first of the comparison.\n */\n @computed('heatMapIndex', 'firstHeatMapList.[]')\n get firstHeatMap(): HeatMapListItem {\n return this.firstHeatMapList[this.heatMapIndex];\n }\n\n /**\n * The current rule snapshot for the single heat maps or the first of the comparison.\n */\n @computed('firstHeatMap.ruleSnapshotIndex', 'firstRuleSnapshotList.[]')\n get firstRuleSnapshot(): RuleSnapshotListItem {\n return this.firstRuleSnapshotList[this.firstHeatMap.ruleSnapshotIndex];\n }\n\n /**\n * Whether or not the first heat map and its rule snapshot has rendered yet.\n */\n @computed('firstHeatMap.hasRendered', 'firstRuleSnapshot.hasRendered')\n get firstHeatMapRendered(): boolean {\n const { firstHeatMap } = this;\n return !firstHeatMap || (firstHeatMap.hasRendered && this.firstRuleSnapshot.hasRendered);\n }\n\n // #endregion\n\n // #region Second Heat Maps\n\n /**\n * The heat maps for the second comparison.\n */\n @alias('args.comparisonHeatMaps.secondHeatMaps.heatMapList')\n declare secondHeatMapList: HeatMapListItem[];\n\n /**\n * The rule snapshots for the second comparison.\n */\n @alias('args.comparisonHeatMaps.secondHeatMaps.ruleSnapshotList')\n declare secondRuleSnapshotList: RuleSnapshotListItem[];\n\n /**\n * The current heat map for the second comparison.\n */\n @computed('heatMapIndex', 'secondHeatMapList.[]')\n get secondHeatMap(): HeatMapListItem | undefined {\n return this.secondHeatMapList ? this.secondHeatMapList[this.heatMapIndex] : undefined;\n }\n\n /**\n * The current rule snapshot for the second comparison.\n */\n @computed('secondHeatMap.ruleSnapshotIndex', 'secondRuleSnapshotList.[]')\n get secondRuleSnapshot(): RuleSnapshotListItem | undefined {\n return this.secondHeatMap ? this.secondRuleSnapshotList[this.secondHeatMap.ruleSnapshotIndex] : undefined;\n }\n\n /**\n * Whether or not the second heat map and rule snapshot have rendered.\n */\n @computed('secondHeatMap.hasRendered', 'secondRuleSnapshot.hasRendered')\n get secondHeatMapRendered(): boolean {\n const { secondHeatMap, secondRuleSnapshot } = this;\n return !secondHeatMap || !secondRuleSnapshot || (secondHeatMap.hasRendered && secondRuleSnapshot.hasRendered);\n }\n\n // #endregion\n\n /**\n * The length of the longest heat map collection that we retrieved.\n */\n @computed('firstHeatMapList.length', 'secondHeatMapList.length', 'isComparison')\n get maxHeatMapListLength(): number {\n const { firstHeatMapList, secondHeatMapList } = this;\n return this.isComparison && secondHeatMapList.length > firstHeatMapList.length\n ? secondHeatMapList.length\n : firstHeatMapList.length;\n }\n\n /**\n * Creates the list of speeds that users can choose from.\n */\n @computed('playbackSpeedTick')\n get speedDropdownItems(): DropdownSelectItem[] {\n return SPEED_OPTIONS.map((num, idx) =>\n DropdownSelectItem.create({\n name: `${num}x`,\n value: String(idx),\n state: idx === this.playbackSpeedTick ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * The frame rate of the time lapse in milliseconds.\n */\n @computed('playbackSpeedTick')\n get scrollInterval(): number {\n return 2000 / SPEED_OPTIONS[this.playbackSpeedTick];\n }\n\n /**\n * Calculates the number of times the slider thumb will move between each heat map image.\n */\n @computed('scrollInterval')\n get ticksPerScroll(): number {\n return this.scrollInterval / 100;\n }\n\n /**\n * Computes the max slider value.\n * Handles the computation that can't be done in the template.\n */\n @computed('maxHeatMapListLength', 'ticksPerScroll')\n get maxSliderValue(): number {\n return this.maxHeatMapListLength * this.ticksPerScroll - 1;\n }\n\n /**\n * Computes the class for the current image.\n * Determines the speed of the animation based on the current scrollInterval of the time lapse.\n */\n @computed('scrollInterval')\n get imageClass(): string {\n const { scrollInterval } = this,\n css = ['fade-in'];\n if (scrollInterval < 750) {\n css.push(scrollInterval < 450 ? 'fast' : 'medium');\n }\n\n return css.join(' ');\n }\n\n /**\n * Whether or not the current heat map(s) is rendered.\n */\n @computed('isComparison', 'firstHeatMapRendered', 'secondHeatMapRendered')\n get isCurrentHeatMapRendered(): boolean {\n return this.firstHeatMapRendered && (this.isComparison ? this.secondHeatMapRendered : true);\n }\n\n /**\n * Button inputs for either a play or pause button.\n */\n @computed('rollTimeLapseTask.isRunning', 'isCurrentHeatMapRendered', 'pauseTimeLapse', 'playTimeLapse')\n get playPauseButtonInputs(): { text: string; icon: string; disabled: boolean; action: VoidFunction } {\n const { intl } = this;\n if (this.rollTimeLapseTask.isRunning) {\n return {\n text: intl.t('generic.video.pause'),\n icon: 'video-pause',\n disabled: false,\n action: this.pauseTimeLapse\n };\n }\n\n return {\n text: intl.t('generic.video.play'),\n icon: 'play',\n disabled: !this.isCurrentHeatMapRendered,\n action: this.playTimeLapse\n };\n }\n\n /**\n * Flips through the time lapse images while it is not paused.\n */\n rollTimeLapseTask = task({ restartable: true }, async () => {\n for (;;) {\n await timeout(this.scrollInterval / this.ticksPerScroll);\n this.updateSliderValue((this.sliderValue + 1) % (this.maxSliderValue + 1));\n }\n });\n\n /**\n * Plays the time lapse.\n */\n @action\n playTimeLapse(): void {\n this.rollTimeLapseTask.perform();\n }\n\n /**\n * Pauses the time lapse.\n */\n @action\n pauseTimeLapse(): void {\n this.rollTimeLapseTask.cancelAll();\n }\n\n /**\n * Updates the speed and resets the slider to the beginning.\n */\n @action\n updateSpeed(index: number): void {\n this.updateSliderValue(0);\n this.args.setSpeedTick(index);\n }\n\n /**\n * Updates the slider value and the index of the currently selected heat map.\n */\n @action\n updateSliderValue(sliderValue: number): void {\n this.sliderValue = sliderValue;\n const offset = sliderValue % this.ticksPerScroll,\n newIndex = (offset === 0 ? sliderValue : sliderValue - offset) / this.ticksPerScroll;\n\n if (newIndex !== this.heatMapIndex) {\n this.heatMapIndex = newIndex;\n if (!this.isCurrentHeatMapRendered) {\n this.pauseTimeLapse();\n }\n }\n }\n\n /**\n * Updates the heatMaps once the image has loaded or failed and plays the timelapse if\n * it was paused while loading.\n */\n @action\n imageRendered(isFirst: boolean, index: number, isRuleSnapshot: boolean, failedToLoad: boolean): void {\n const heatMapList = isFirst ? this.firstHeatMapList : this.secondHeatMapList,\n { heatMapIndex } = this;\n if (isRuleSnapshot) {\n const ruleSnapshotList = isFirst ? this.firstRuleSnapshotList : this.secondRuleSnapshotList;\n setProperties(ruleSnapshotList[index], {\n hasRendered: true,\n failedToLoad\n });\n } else {\n setProperties(heatMapList[index], {\n hasRendered: true,\n failedToLoad\n });\n }\n\n // We only want to play the time lapse if we are currently paused in timelapse mode with multiple images.\n // And if we just rendered either the current rule or heat map and both are now rendered.\n const canPlay = this.isTimeLapse && this.maxHeatMapListLength > 1 && !this.rollTimeLapseTask.isRunning,\n currentHeatMapOrRuleRendered =\n (isRuleSnapshot && index === heatMapList[heatMapIndex].ruleSnapshotIndex) || index === heatMapIndex,\n isWaiting = currentHeatMapOrRuleRendered && this.isCurrentHeatMapRendered;\n if (canPlay && isWaiting) {\n this.playTimeLapse();\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Activity::HeatMap::TimeLapse': typeof TimeLapse;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{#if this.hasHeatMapRule}}\\n
\\n \\n\\n {{#if (and this.canShowHeatMaps (not this.heatMapMetrics.isTimeLapse))}}\\n \\n {{/if}}\\n
\\n
\\n
\\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n {{/if}}\\n \\n \\n \\n\\n \\n {{#if this.hasHeatMapRule}}\\n

{{tc this \\'heatMap\\'}}

\\n
\\n \\n {{#if this.isComparison}}\\n \\n {{/if}}\\n
\\n\\n
\\n \\n
\\n\\n {{#if this.canShowHeatMaps}}\\n {{#if this.areHeatMapsLoaded}}\\n \\n {{else}}\\n \\n {{/if}}\\n {{/if}}\\n {{else}}\\n

{{tc this \\'supportsHeatMaps\\'}}

\\n \\n {{/if}}\\n
\\n \\n \\n
\",{ moduleName: \"customer-site/video/business-activity-analytics/heat-mapping/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n\\n
\\n \\n
\\n
\\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/business-activity-analytics/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\\n \\n\\n \\n\\n \\n \\n\\n \\n\\n \\n\\n \\n\\n \\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/business-activity-analytics/rule-group-list/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n {{#if this.editUiComponentPath}}\\n \\n {{else}}\\n \\n \\n \\n {{/if}}\\n\\n \\n\\n \\n\\n \\n\\n\",{ moduleName: \"customer-site/video/business-activity-analytics/rule-group/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n\\n \\n\\n \\n\\n \\n \\n\\n \\n\\n \\n\\n \\n\\n \\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/business-activity-analytics/rule-list/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n {{#if this.editUiComponentPath}}\\n \\n {{else}}\\n \\n \\n \\n {{/if}}\\n\\n \\n\\n \\n\\n \\n\",{ moduleName: \"customer-site/video/business-activity-analytics/rule/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/business-activity-analytics/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- @glint-expect-error model type does not match, please fix this. --}}\\n\",{ moduleName: \"customer-site/video/camera-groups/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if this.isManageRoute}}\\n \\n{{/if}}\\n\\n{{outlet}}\",{ moduleName: \"customer-site/video/camera-groups/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n\\n
\\n \\n
\\n
\\n\\n \\n\\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/analytics/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n

\\n {{tc this \\'takePhoto\\'}}\\n {{t \\'generic.xOfY\\' x=this.clipIndexDisplay y=@model.snapshotsRequired}}\\n

\\n\\n
\\n
\\n {{!-- @glint-expect-error snapshot is async, please fix this. --}}\\n {{#if camera.snapshot.url}}\\n {{#if this.firstImageIsLoading}}\\n \\n {{/if}}\\n \\n {{else}}\\n
\\n {{#if (await this.showStreamFailureMessage)}}\\n \\n

\\n {{!-- @glint-expect-error snapshot is async, please fix this. --}}\\n {{camera.snapshot.error}}\\n

\\n \\n \\n {{t \\'generic.retry\\'}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n {{/if}}\\n
\\n\\n \\n\\n

{{tc this \\'instructions\\'}}

\\n
\\n\\n \\n
\\n\\n \\n
\\n\\n
\\n\",{ moduleName: \"customer-site/video/cameras/camera/calibrate/capture/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\\n {{!-- @glint-expect-error Please convert to PageView. --}}\\n \\n \\n\\n \\n

\\n {{tc this \\'confirmPhoto\\'}}\\n {{t \\'generic.xOfY\\' x=this.clipIndexDisplay y=@model.snapshotsRequired}}\\n

\\n\\n
\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n\\n \\n
\\n\\n
\\n {{#if (await this.isSnapshotInvalid)}}\\n

\\n \\n {{await this.snapshotInvalidText}}\\n

\\n {{else if (await this.multipleObjectsFound)}}\\n
\\n \\n {{tc this \\'multipleObjectsTitle\\'}}\\n
\\n

{{tc this \\'multipleObjectsSubtitle\\'}}

\\n\\n \\n {{else}}\\n

\\n {{#if (await this.isFeedbackRequired)}}\\n {{tc this \\'fixPhotoInstructions\\'}}\\n {{else}}\\n {{tc this \\'instructions\\'}}\\n {{/if}}\\n

\\n {{/if}}\\n\\n {{#if (await this.readyToSubmit)}}\\n

\\n {{tc this \\'submitInstructions\\'}}\\n

\\n {{/if}}\\n
\\n
\\n\\n \\n
\\n\\n \\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/calibrate/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!--\\n NOTE: if you see this and think to add SVGs directly to your code, DO NOT!\\n This is a temporary change for VID-30027 before we can diagnose a deeper Resources repo server issue.\\n--}}\\n\\n{{#if @isClose}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n{{else if @isFar}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n{{else}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n {{! template-lint-disable no-bare-strings }}\\n TAKE PHOTO\\n \\n \\n \\n \\n \\n \\n \\n \\n{{/if}}\\n\",{ moduleName: \"customer-site/components/video/calibration/analytics-svg/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/no-classic-components\nimport Component from '@ember/component';\n\n/**\n * @classdesc\n *\n * A component to display SVGs used in analytics calibration.\n * NOTE: this is a temporary, hacky fix for VID-30027, and should not be done normally.\n * This should ideally be reverted once we can determine why our virtual image server has issues\n * serving these SVGs.\n *\n * @class components.video.calibration.AnalyticsSvg\n * @extends Ember.Component\n *\n * @param {boolean} isClose Are we using the close SVG?\n * @param {boolean} isFar Are we using the far SVG?\n */\nexport default class AnalyticsSvg extends Component {\n tagName = '';\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n

\\n {{this.stateTitle}}\\n

\\n\\n

{{safe-html this.stateMessage}}

\\n\\n {{#if this.isSuccessful}}\\n
\\n

{{tc this \\'helpTitle\\'}}

\\n

\\n {{tc this \\'helpMessage\\'}}\\n \\n

\\n
\\n {{/if}}\\n\\n {{#if (eq this.stateGroup \\\"begin\\\")}}\\n

{{t \\'generic.recommendations\\'}}

\\n\\n
\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n

{{safe-html (tc this \\'closeRecommendation\\')}}

\\n
\\n\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n

{{safe-html (tc this \\'farRecommendation\\')}}

\\n
\\n\\n {{#unless this.isMobile}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n

{{safe-html (tc this (if this.external \\'mobileTechRecommendation\\' \\'mobileAppRecommendation\\'))}}

\\n
\\n
\\n {{#if this.external}}\\n {{t \\'generic.equipment\\'}}\\n \\n {{tc this \\'selectCamera\\'}}\\n \\n {{tc this \\'configureDevices\\'}}\\n \\n {{tc this \\'calibrateDevices\\'}}\\n {{else}}\\n \\n {{t \\'generic.video.video\\'}}\\n \\n \\n {{t \\'generic.settings\\'}}\\n \\n {{tc this \\'calibrateCameras\\'}}\\n {{/if}}\\n
\\n
\\n
\\n {{/unless}}\\n
\\n {{/if}}\\n\\n \\n
\\n\\n \\n\\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/calibrate/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n
\\n \\n {{tc this \\'title\\'}}\\n
\\n\\n

{{tc this \\'message\\'}}

\\n\\n
\\n {{#each (await this.snapshots) as |snapshot idx|}}\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n {{!-- @glint-expect-error No reason to use button async if we don\\'t use button action, please fix this. --}}\\n \\n \\n {{/each}}\\n
\\n\\n \\n
\\n\\n \\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/calibrate/review/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{!-- @glint-expect-error Please convert to PageView. --}}\\n \\n {{container.loading}}\\n\\n \\n
\\n
\\n
{{t \\'generic.video.model\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.deviceModel}}
\\n\\n
{{t \\'generic.video.mac\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.macAddress}}
\\n\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if camera.firmwareVersion}}\\n
{{t \\'generic.video.firmwareVersion\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.firmwareVersion}}
\\n {{/if}}\\n\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if camera.publicIp}}\\n
{{t \\'generic.video.privateIPAddress\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.privateIp}}
\\n\\n
{{t \\'generic.video.publicIPAddress\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.publicIp}}
\\n\\n
{{t \\'generic.video.port\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.port}}
\\n\\n
{{t \\'generic.video.httpsPort\\'}}:
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n
{{camera.httpsPort}}
\\n {{/if}}\\n
\\n\\n
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{camera.deviceModel}}\\n\\n
\\n {{#each (await this.buttons) as |button|}}\\n \\n {{/each}}\\n
\\n
\\n\\n
\\n
\\n\\n {{container.error}}\\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n\\n \\n\\n \\n

{{tc this \\'title\\'}}

\\n\\n \\n\\n\\n \\n\\n \\n\\n
\\n\\n \\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/post-install/chime-select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n

{{tc this \\'title\\'}}

\\n\\n

{{tc this \\'description\\'}}

\\n\\n {{#if this.powerCheckResult}}\\n
\\n \\n

{{this.powerCheckResult.description}}

\\n \\n
\\n {{else}}\\n \\n {{/if}}\\n\\n \\n
\\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/post-install/power-check/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n
\\n
\\n

{{tc this \\'title\\'}}

\\n {{tc this \\'description\\'}}\\n
\\n
\\n
\\n

{{await this.powerCheckResult}}

\\n {{await this.powerCheckResultText}}\\n\\n {{#if (await this.displayTelusLink)}}\\n \\n {{/if}}\\n\\n \\n
\\n
\\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/post-install/qualitative-power-check/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n

{{this.pageTitle}}

\\n\\n

{{this.pageDescription}}

\\n\\n \\n\\n {{!-- @glint-expect-error camera is async, please fix this. --}}\\n {{#if this.model.camera.supportsWedgeGIF}}\\n \\\"{{tc\\n {{/if}}\\n\\n\\n \\n\\n \\n\\n
\\n\\n \\n
\\n
\",{ moduleName: \"customer-site/video/cameras/camera/post-install/wedge-select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.contextManager.isAdcInternalDevDealer}}\\n

\\n {{!-- @glint-expect-error camera is async, please fix this. --}}\\n {{this.model.camera.description}}\\n

\\n {{/if}}\\n\\n {{outlet}}\\n
\",{ moduleName: \"customer-site/video/cameras/camera/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n\\n \\n \\n\\n \\n {{#each this.camerasAndSvrs as |device|}}\\n
\\n
\\n {{tc\\n
\\n
\\n
\\n
\\n

{{device.description}}

\\n

{{device.deviceModel}}

\\n
\\n \\n \\n
\\n
\\n {{#if device.supportsLiveView}}\\n \\n
\\n \\n {{/if}}\\n
\\n
\\n
\\n {{/each}}\\n\\n
\\n \\n

{{tc this \\'addDevice\\'}}

\\n
\\n
\\n\\n \\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/cameras/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/cameras/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! template-lint-disable no-bare-strings }}\\n{{! NOTE: we\\'re using RAW strings here because this page is internal. Customers won\\'t be seeing it. }}\\n\\n\\n \\n

Select a Saved Clip ID

\\n

Saved clips will only display if they have an ovready channel id.

\\n

Number of clips: {{this.clipList.length}} (maximum of {{this.maximumNumClips}})

\\n
\\n \\n
\\n\\n

Update Saved Clips List:

\\n
\\n
\\n Maximum number of clips to retrieve:
\\n (Defaults to 10 if no number is entered)
\\n \\n
\\n
\\n

Select events between:

\\n \\n
\\n
Update
\\n {{#if this.updateListStatus}}\\n

{{this.updateListStatus.text}}

\\n {{/if}}\\n
\\n\\n
\\n {{#if this.errorMessage}}\\n
\\n

The following error has occurred on this page:

\\n

{{this.errorMessage}}

\\n
\\n {{/if}}\\n\\n {{#if this.clipId}}\\n

Selected Clip ID: {{this.clipId}}

\\n {{#if this.firstAnalyticsDetails.ovreadyEventId}}\\n
    \\n
  • OVReady Event-Timestamp: {{this.firstAnalyticsDetails.timestampUnitTime}}
  • \\n
  • Creation Timestamp: {{this.firstAnalyticsDetails.creationTimestampUnitTime}}
  • \\n
  • Device ID: {{this.firstAnalyticsDetails.deviceId}}
  • \\n
  • \\n Package Version During Event:\\n {{coalesce this.firstAnalyticsDetails.moduleVersion \\\"Unknown - event recorded before module package history began.\\\"}}\\n
  • \\n
  • Machine Copied To: {{this.firstAnalyticsDetails.machineCopiedTo}}
  • \\n
  • File Name: {{this.firstAnalyticsDetails.fileName}}
  • \\n
  • IOU Threshold: {{this.firstAnalyticsDetails.iouThreshold}}
  • \\n
\\n {{#if this.firstAnalyticsDetails.hasEdgeClassification}}\\n

Edge Classification:

\\n
    \\n
  • Classification: {{this.firstAnalyticsDetails.edgeClassification}}
  • \\n
  • Confidence: {{this.firstAnalyticsDetails.edgeClassificationConfidence}}
  • \\n
\\n {{/if}}\\n

Dynamic Parameters:

\\n
    \\n
  • Dynamic Configuration Active: {{this.firstAnalyticsDetails.usedDynamicConfig}}
  • \\n {{#if this.firstAnalyticsDetails.usedDynamicConfig}}\\n
  • Dynamic Configuration Level: {{this.firstAnalyticsDetails.dynamicConfigLevel}}
  • \\n {{/if}}\\n
\\n\\n

View Video Event Clip

\\n
\\n
Toggle Clip Video
\\n {{~#if this.viewVideo}}\\n
Toggle Clip Maximum Size
\\n {{/if}}\\n
\\n {{~#if this.viewVideo}}\\n \\n {{/if~}}\\n
\\n
\\n {{#if this.clipId}}\\n
Download Clip Zip
\\n {{/if}}\\n {{#if this.downloadStatus}}\\n

{{this.downloadStatus.text}}

\\n {{/if}}\\n
\\n
\\n\\n

View Target Slices

\\n

Background Key

\\n
\\n {{#each this.backgroundKeys as |key|}}\\n
\\n

{{key.name}}:

\\n
\\n
\\n {{/each}}\\n
\\n

Drawing Key

\\n
\\n {{#each this.drawingKeys as |key|}}\\n
\\n

{{key.name}}:

\\n
\\n
\\n {{/each}}\\n
\\n {{#each this.analyticsDetails.slices as |slice|}}\\n
\\n

Slice {{slice.sliceRowId}}:

\\n
    \\n
  • Rule Name: {{slice.ruleName}}
  • \\n
  • Rule Type: {{slice.ruleType}}
  • \\n
  • OVReady Event ID: {{slice.ovreadyEventId}}
  • \\n
  • OVReady Event-Timestamp: {{slice.timestampUnitTime}}
  • \\n
  • OVReady Rule ID: {{coalesce slice.ovreadyRuleId 0}}
  • \\n
  • Offset Timestamp: {{slice.timestampMinusOffsetUnitTime}}
  • \\n
  • Time Offset: {{coalesce slice.timeOffset 0}}
  • \\n
  • Ffmpeg Offset TimeSpan: {{slice.ffmpegOffsetTimeSpan}}
  • \\n
  • Motion Offset: {{slice.motionOffset}}
  • \\n
  • Max Motion Ratio: {{slice.maxMotionRatio}}
  • \\n
  • Max Moving Distance: {{slice.maxMovingDistance}}
  • \\n
  • Target Total Score: {{slice.targetTotalScore}}
  • \\n
  • Target Age: {{slice.targetAge}}
  • \\n
  • Sent To Classifier: {{slice.sentToClassifier}}
  • \\n
  • Is Thumbnail Slice: {{slice.isThumbnailSlice}}
  • \\n
\\n
\\n
\\n
\\n

OVReady Classification Target:

\\n
    \\n
  • Bounds X: {{slice.boundsXCamera}}
  • \\n
  • Bounds Y: {{slice.boundsYCamera}}
  • \\n
  • Bounds Width: {{slice.boundsWidthCamera}}
  • \\n
  • Bounds Height: {{slice.boundsHeightCamera}}
  • \\n
  • Classification: {{slice.cameraClassification}}
  • \\n
\\n
\\n
\\n
\\n {{#each slice.cloudTargets as |cloudTarget|}}\\n
\\n

Cloud Classification Target:

\\n
    \\n
  • Bounds X: {{cloudTarget.boundsXCloud}}
  • \\n
  • Bounds Y: {{cloudTarget.boundsYCloud}}
  • \\n
  • Bounds Width: {{cloudTarget.boundsWidthCloud}}
  • \\n
  • Bounds Height: {{cloudTarget.boundsHeightCloud}}
  • \\n
  • Classification: {{cloudTarget.cloudClassification}}
  • \\n
  • Classification Confidence: {{cloudTarget.classificationConfidence}}
  • \\n
  • Is Target of Interest: {{if cloudTarget.isTargetOfInterest \\\"Yes\\\" \\\"No\\\"}}
  • \\n
  • Does Classification Match: {{if cloudTarget.doesClassifMatch \\\"Yes\\\" \\\"No\\\"}}
  • \\n
  • Does Overlap AOI/TW: {{if cloudTarget.doesOverlapAoiTw \\\"Yes\\\" \\\"No\\\"}}
  • \\n
  • Does Match OvReady Bounding Box: {{if cloudTarget.doesMatchOvrBbox \\\"Yes\\\" \\\"No\\\"}}
  • \\n
  • IOU Score: {{cloudTarget.iouScore}}
  • \\n
\\n {{#if cloudTarget.originalAccClassification}}\\n
\\n

ClearSight

\\n \\n
\\n
    \\n
  • Original ACC Classification: {{cloudTarget.originalAccClassification}}
  • \\n {{#if cloudTarget.avvConfidencePercentage}}\\n
  • AlarmVideoVerifier Confidence: {{cloudTarget.avvConfidencePercentage}}%
  • \\n {{/if}}\\n
\\n {{/if}}\\n
\\n {{/each}}\\n
\\n
\\n {{#if slice.thumbnailUrl}}\\n {{t\\n {{/if}}\\n
\\n {{/each}}\\n\\n {{#if this.snapshotAnalyticsDetails}}\\n
\\n

Event Snapshots:

\\n
\\n {{#each this.snapshotAnalyticsDetails as |slice|}}\\n {{t\\n {{/each}}\\n
\\n
\\n {{/if}}\\n\\n {{#if this.canDonateClips}}\\n
\\n

{{tc this \\'clipDonationSectionHeader\\'}}

\\n

{{tc this \\'donationDescription\\'}}

\\n\\n
\\n \\n \\n
\\n \\n

{{tc this \\'donationTerms\\' link=this.urlForDonationTerms htmlSafe=true}}

\\n
\\n \\n
\\n
\\n {{/if}}\\n {{else}}\\n

{{this.updateAnalyticsDetailsStatus}}

\\n {{/if}}\\n {{else}}\\n

Information will show here after selecting a clip.

\\n {{/if}}\\n
\\n
\\n
\",{ moduleName: \"customer-site/video/classifier-visualization/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n
\\n
\\n
\\n {{#if this.isReprompt}}\\n

{{tc this \\\"repromptHeader\\\"}}

\\n {{else}}\\n

{{tc this \\\"promptHeader\\\"}}

\\n {{/if}}\\n
\\n
\\n\\n
\\n {{tc\\n
\\n

{{tc this \\\"promptBody\\\"}}

\\n
\\n

{{tc this \\\"buttonListMain\\\"}}

\\n
\\n \\n
\\n
\\n\\n

{{tc this \\\"legalAgreementHeader\\\"}}

\\n
\\n {{safe-html data.clipDonationAgreement.legalAgreement}}\\n
\\n\\n \\n\\n {{#if this.showCalibrationSnapshotDonationSetting}}\\n \\n\\n \\n {{/if}}\\n\\n
\\n \\n
\\n
\\n
\\n\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/clip-feedback/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n\\n \\n \\n \\n \\n\\n \\n {{#if this.statsForSelectedReport}}\\n \\n\\n {{#if this.isCategoryDetailsVisible}}\\n \\n {{/if}}\\n\\n
\\n

{{this.chartDescription}}

\\n

{{tc this \\'observableTrends\\'}}

\\n
    \\n {{#each this.chartSummaryTexts as |summaryText|}}\\n
  • {{summaryText}}
  • \\n {{/each}}\\n
\\n
\\n\\n {{else}}\\n \\n {{/if}}\\n
\\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/clips-usage-report/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- @glint-nocheck\\n Please convert this to PageView\\n model.cameras doesn\\'t seem to exist.\\n--}}\\n\\n \\n\\n \\n\\n \\n \\n \\n\\n \\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/clips/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/clips/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n {{#if (eq this.screen this.screenEnum.NoDevices)}}\\n
\\n

{{tc this \\'noDevice\\'}}

\\n

{{tc this \\'pleaseMakeSureHive\\'}}

\\n \\n
\\n {{else if (eq this.screen this.screenEnum.UnableToLink)}}\\n
\\n

{{tc this \\'linkUnsuccessful\\'}}

\\n

{{tc this \\'sorryLinkingWasNot\\'}}

\\n \\n
\\n {{else if (eq this.screen this.screenEnum.Loading)}}\\n
\\n \\n

{{tc this \\'loadingPleaseWait\\'}}

\\n
\\n {{else if (eq this.screen this.screenEnum.Discovery)}}\\n
\\n {{#if this.readyToLinkHives.length}}\\n
\\n

{{tc this \\'dronesReadyLink\\'}}

\\n\\n {{#each this.readyToLinkHives as |hive|}}\\n
\\n \\n
\\n {{hive.displayDescription}}\\n {{hive.primaryMac}}\\n
\\n \\n \\n
\\n {{/each}}\\n
\\n {{/if}}\\n\\n {{#if this.hivesWithoutPermissions.length}}\\n
\\n

{{tc this \\'dronesUnavailableToLink\\'}}

\\n

{{tc this \\'devicesMustHaveAdmin\\'}}

\\n\\n {{#each this.hivesWithoutPermissions as |hive|}}\\n
\\n \\n
\\n {{hive.displayDescription}}\\n {{hive.primaryMac}}\\n
\\n
\\n {{/each}}\\n
\\n {{/if}}\\n\\n {{#if this.notInstalledHivesWithPermissions.length}}\\n
\\n

{{tc this \\'dronesAssociatedNotInstalled\\'}}

\\n

{{tc this \\'devicesMustBeInstalled\\'}}

\\n\\n {{#each this.notInstalledHivesWithPermissions as |hive|}}\\n
\\n \\n
\\n {{hive.displayDescription}}\\n {{hive.primaryMac}}\\n
\\n
\\n {{/each}}\\n
\\n {{/if}}\\n\\n {{#if this.alreadyInstalledHives.length}}\\n
\\n

{{tc this \\'alreadyInstalled\\'}}

\\n\\n {{#each this.alreadyInstalledHives as |hive|}}\\n
\\n \\n\\n
\\n {{hive.displayDescription}}\\n {{hive.primaryMac}}\\n
\\n
\\n {{/each}}\\n
\\n {{/if}}\\n\\n \\n
\\n {{else}}\\n
\\n

{{tc this \\'congratulations\\'}}

\\n\\n {{tc\\n {{tc\\n\\n

{{tc this \\'droneReadyToGo\\'}}

\\n
\\n

{{tc this \\'moreDevicesToAdd\\'}}

\\n\\n \\n
\\n {{/if}}\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/drone-install/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n
\\n {{#if (this.eventHasFamiliarTarget @currentEvent)}}\\n {{!-- @glint-expect-error familiarTarget is async, please use await and get to access description. --}}\\n {{tc this \\'isThis\\' vehicleName=@currentEvent.familiarTarget.description}}\\n {{else}}\\n {{tc this (if this.isFamiliarVehicleEnrollment \\'vehicle.incorrectHeader\\' \\'face.incorrectHeader\\')}}\\n {{/if}}\\n
\\n
\\n \\n \\n \\n
\\n {{!-- We should disable these buttons instead of removing them in VID-79138 --}}\\n {{#if @model.enrollment.isEditableByCurrentUser}}\\n
\\n \\n \\n \\n
\\n {{/if}}\\n
\\n
\\n\\n\\n\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/feedback-card/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport './_style.scss';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, get } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport {\n type PhotoCardActionButton,\n fnCreateActionButton\n} from 'customer-site/components/video/settings/familiar-targets/photo-card/photo-card-action-buttons/index';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport {\n ActionSheetTypes,\n getCorrectButtonIcon,\n getIncorrectButtonIcon,\n getReviewButtonResource,\n MaxDescriptionTextLength,\n hasTarget,\n createCluster,\n navigateToNotificationsPageForNewVehicle\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { FamiliarSubjectClipFeedbackRouteModel } from 'customer-site/video/familiar-subject-clip-feedback/route';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type FamiliarTargetFeedbackEvent from 'customer-site/models/video/familiar-targets/familiar-target-feedback-event';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface FeedbackCardSignature {\n Args: {\n reviewCompleted(): void;\n /** The familiar Subject Clip Feedback Route Model */\n model: FamiliarSubjectClipFeedbackRouteModel;\n currentEvent: FamiliarTargetFeedbackEvent;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for displaying the familiar vehicle feedback cards\n */\n@intlPath({ path: 'video/settings/familiar-targets/feedback-card' })\nexport default class FeedbackCard extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n\n /**\n * The cluster to hide, when viewing the incorrect/move actionsheet/modal\n */\n @tracked clusterToHideInIncorrectMoveModal?: FamiliarTargetEnrollmentCluster;\n\n /**\n * The action sheet that is currently open. (ActionSheetTypes.none if none are open)\n */\n @tracked actionSheetTypeOpen = ActionSheetTypes.none;\n\n /**\n * If the large photo action sheet is currently open\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.photo)\n declare photoActionSheetIsOpen: boolean;\n\n /**\n * If the action sheet for moving/deleting/marking-incorrect an enrollment image is open\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.incorrectMove)\n declare incorrectMoveActionSheetIsOpen: boolean;\n\n /**\n * Is this enrollment a familiar vehicle enrollment?\n */\n @equal('args.model.enrollment.familiarObjectType', Vehicle)\n declare isFamiliarVehicleEnrollment: boolean;\n\n /**\n * Opens the action sheet for viewing the large photo\n */\n @action openPhotoActionSheet(): void {\n this.actionSheetTypeOpen = ActionSheetTypes.photo;\n }\n\n /**\n * Closes the action sheet\n */\n @action closeActionSheet(): void {\n this.actionSheetTypeOpen = ActionSheetTypes.none;\n }\n\n /**\n * Tracked promise of the review button action for the async loader\n */\n @tracked declare reviewPromise: Promise;\n\n /**\n * Is the user currently selecting a target from the action sheet?\n */\n @tracked isSelectingTarget = false;\n\n /**\n * Has the feedback event been reviewed?\n */\n @tracked hasBeenReviewed = false;\n\n /**\n * Does the event have a linked familiar target?\n */\n @action\n eventHasFamiliarTarget(currentEvent: FamiliarTargetFeedbackEvent): boolean {\n return hasTarget(currentEvent);\n }\n\n /**\n * Does the current feedback event have a Familiar Target classification\n */\n get hasTarget(): boolean {\n const feedbackEvent = this.args.currentEvent;\n return hasTarget(feedbackEvent);\n }\n\n /**\n * Create a feedback event record and post it to the API for processing\n *\n * @returns if the feedback event saved successfully\n */\n async saveFeedbackWithTransition(\n feedbackEvent: FamiliarTargetFeedbackEvent,\n familiarTarget: FamiliarTargetEnrollmentCluster | undefined,\n isCorrect: boolean,\n isNewVehicle: boolean\n ): Promise {\n const { intl, navigation, notificationManager } = this;\n\n feedbackEvent.isCorrect = isCorrect;\n feedbackEvent.set('familiarTarget', familiarTarget);\n\n try {\n await feedbackEvent.save();\n\n if (isNewVehicle) {\n // need to retrieve the target from the feedback event to get its ID (to navigate to it)\n const savedTarget = await feedbackEvent.familiarTarget;\n await this.args.model.enrollment.reload();\n feedbackEvent.hasBeenReviewed = false;\n navigateToNotificationsPageForNewVehicle(savedTarget, navigation);\n return true;\n }\n\n feedbackEvent.hasBeenReviewed = true;\n const resourceKeyPrefix = this.isFamiliarVehicleEnrollment ? 'vehicle' : 'face';\n notificationManager.addSuccess(intl.tc(this, `${resourceKeyPrefix}.successMessage`));\n this.args.reviewCompleted();\n feedbackEvent.unloadRecord();\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Alt text for the feedback image. Text is dependent on if the video event has a familiar target in it\n */\n feedbackPhotoAltText(event: FamiliarTargetFeedbackEvent): Promise {\n return (async () =>\n this.eventHasFamiliarTarget(event)\n ? this.intl.tc(this, 'classifiedFeedbackImageAltText', {\n vehicleName: get(await this.args.currentEvent.familiarTarget, 'description')\n })\n : this.isFamiliarVehicleEnrollment\n ? this.intl.tc(this, 'vehicle.unclassifiedFeedbackImageAltText')\n : this.intl.tc(this, 'face.unclassifiedFeedbackImageAltText'))();\n }\n\n /**\n * Process the feedback review. If the event has a linked enrollment image, complete the review as if it was a normal\n * photo in the vehicle's photo list. If the image is not an enrollment image, post a feedback item request so one can be created\n * and and reviewed for to the vehicle's model appropriately\n *\n * @param targetEvent\n * @param isCorrect Is the image correctly of the target in question\n * @returns\n */\n @action async processReview(feedbackEvent: FamiliarTargetFeedbackEvent, isCorrect: boolean): Promise {\n const familiarTarget = await feedbackEvent.familiarTarget;\n\n const didSucceed = await this.saveFeedbackWithTransition(feedbackEvent, familiarTarget, isCorrect, false);\n if (!didSucceed) {\n return false;\n }\n\n this.closeActionSheet();\n return true;\n }\n\n /**\n * Opens the action sheet for marking an image as incorrect or moving/deleting it\n */\n @action async openTargetSelectionModal(): Promise {\n // setting this value only when opening it since we don't want it to be reactive. (Otherwise VID-64483 can happen)\n this.clusterToHideInIncorrectMoveModal = await this.args.currentEvent.familiarTarget;\n this.actionSheetTypeOpen = ActionSheetTypes.incorrectMove;\n }\n\n /**\n * Set the currently running promise for the AsyncLoader on the template to wait for\n *\n * @param promise\n * @returns\n */\n setPromiseForAsyncLoader(promise: Promise): Promise {\n this.reviewPromise = promise;\n return this.reviewPromise;\n }\n\n /**\n * Buttons to display under familiar target event photos to review or move the photo\n */\n @action\n feedbackButtons(event: FamiliarTargetFeedbackEvent): PhotoCardActionButton[] {\n const { intl } = this,\n feedbackEvent = this.args.currentEvent;\n\n if (!hasTarget(event)) {\n return [\n fnCreateActionButton(intl.t('generic.yes'), getCorrectButtonIcon(), 'correct', () =>\n this.openTargetSelectionModal()\n ),\n fnCreateActionButton(intl.t('generic.no'), getIncorrectButtonIcon(), 'incorrect', () => {\n // this is a no-op as there is no processing to do. Just navigate away\n const resourceKeyPrefix = this.isFamiliarVehicleEnrollment ? 'vehicle' : 'face';\n this.notificationManager.addSuccess(intl.tc(this, `${resourceKeyPrefix}.successMessage`));\n feedbackEvent.hasBeenReviewed = true;\n this.args.reviewCompleted();\n })\n ];\n }\n\n return [\n fnCreateActionButton(getReviewButtonResource(intl, 'correct'), getCorrectButtonIcon(), 'correct', () =>\n this.setPromiseForAsyncLoader(this.processReview(feedbackEvent, true))\n ),\n fnCreateActionButton(\n getReviewButtonResource(intl, 'incorrect'),\n getIncorrectButtonIcon(),\n 'incorrect',\n () => this.openTargetSelectionModal()\n )\n ];\n }\n\n /**\n * Create a rename dialog modal to prompt for the name of the new target\n */\n @action promptForName(feedbackEvent: FamiliarTargetFeedbackEvent): void {\n const { intl, modals } = this,\n title =\n feedbackEvent.familiarObjectType == Vehicle\n ? intl.t('generic.video.settings.familiar-subject.nameVehicle')\n : intl.t('generic.video.settings.familiar-subject.nameFace');\n\n modals.showRenameModal({\n title,\n rename: (name: string) => {\n this.actionSheetTypeOpen = ActionSheetTypes.none;\n this.createNewTarget(name, feedbackEvent);\n return true;\n },\n maxLength: MaxDescriptionTextLength,\n output: {\n value: '',\n error: undefined\n }\n });\n }\n\n /**\n * Create a new familiar target from the feedback event\n *\n * @param description\n * @param feedbackEvent\n * @returns\n */\n @action createNewTarget(description: string, feedbackEvent: FamiliarTargetFeedbackEvent): boolean {\n const { store } = this,\n newTarget = createCluster(store, description, feedbackEvent.familiarObjectType);\n\n this.setPromiseForAsyncLoader(this.saveFeedbackWithTransition(feedbackEvent, newTarget, true, true));\n return true;\n }\n\n /**\n * Move an image to the familiar target provided to this function as an input. Used by the target selection\n * action sheet\n *\n * @param target\n */\n @action async moveImageToSelectedTarget(target: FamiliarTargetEnrollmentCluster | undefined): Promise {\n const feedbackEvent = this.args.currentEvent as FamiliarTargetFeedbackEvent;\n await this.saveFeedbackWithTransition(feedbackEvent, target, true, false);\n this.closeActionSheet();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::FeedbackCard': typeof FeedbackCard;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default as |data|>\\n {{#if data}}\\n {{#each data.feedbackEvents as |currentEvent|}}\\n {{#unless currentEvent.hasBeenReviewed}}\\n \\n {{/unless}}\\n {{/each}}\\n {{/if}}\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/familiar-subject-clip-feedback/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck:\\n Please convert this to PageView.\\n model.cameras doesn\\'t seem to exist.\\n}}\\n\\n \\n\\n \\n\\n \\n \\n \\n\\n \\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/gallery/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/gallery/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default>\\n \\n

{{tc this \\'selectInstallPathDescription\\'}}

\\n
    \\n
  • \\n

    {{tc this \\'selectInstallPathDescriptionBullet1\\'}}

    \\n
  • \\n
  • \\n

    {{tc this \\'selectInstallPathDescriptionBullet2\\'}}

    \\n
  • \\n
\\n
\\n \\n \\n
\\n
\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n
\",{ moduleName: \"customer-site/video/install-overview/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:default>\\n \\n
\\n \\n
\\n
\\n

{{tc this \\'installDoorbellCameraTitle\\'}}

\\n

{{tc this \\'installDoorbellCameraDescription\\'}}

\\n
\\n
\\n

{{t \\'generic.video.installOverview.walkthroughTitle\\'}}

\\n

{{tc this \\'walkthroughStep1\\'}}

\\n

{{tc this \\'walkthroughStep2\\'}}

\\n

{{tc this \\'walkthroughStep3\\'}}

\\n

{{tc this \\'walkthroughStep4\\'}}

\\n
\\n
\\n \\n \\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/install-overview/install/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:default>\\n \\n
\\n \\n
\\n
\\n

{{tc this \\'replaceDoorbellCameraTitle\\'}}

\\n

{{tc this \\'replaceDoorbellCameraDescription\\'}}

\\n
\\n
\\n

{{t \\'generic.video.installOverview.walkthroughTitle\\'}}

\\n

{{tc this \\'walkthroughStep1\\'}}

\\n

{{tc this \\'walkthroughStep2\\'}}

\\n

{{tc this \\'walkthroughStep3\\'}}

\\n

{{tc this \\'walkthroughStep4\\'}}

\\n

{{tc this \\'walkthroughStep5\\'}}

\\n
\\n
\\n \\n \\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/install-overview/replace/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/install-overview/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |data|>\\n {{!-- Verify the contact is loaded before rendering the edit fields. --}}\\n {{#if data}}\\n \\n {{/if}}\\n \\n\",{ moduleName: \"customer-site/video/intercom-contact/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n
\\n

{{tc this \\'enterInformation\\'}}

\\n

{{tc this \\'enterInformationDesc\\'}}

\\n \\n
\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/intercom-contact/enrollment/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n
\\n
\\n
\\n \\n
\\n

{{tc this \\'intercomProfile\\'}}

\\n

{{this.communityName}}

\\n
\\n

{{tc this \\'intercomPrompt\\'}}

\\n\\n
\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/intercom-contact/enrollment/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n
\\n

{{t \\'generic.notifications\\'}}

\\n

{{tc this \\'notificationsDescription1\\'}}

\\n

{{tc this \\'notificationsDescription2\\'}}

\\n

{{tc this \\'notificationsDescription1\\'}}

\\n
\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/intercom-contact/enrollment/notifications/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/intercom-contact/enrollment/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default as |data|>\\n \\n
\\n

{{this.initials}}

\\n
\\n

{{data.firstName}} {{data.lastName}}

\\n \\n
\\n\\n \\n

{{t \\'generic.settings\\'}}

\\n \\n <:content>\\n
\\n \\n

{{t \\'generic.notifications\\'}}

\\n
\\n \\n \\n
\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/intercom-contact/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer pvc|>\\n \\n\\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n
\\n \\n
\\n

{{tc this \\'intercomCall\\'}}

\\n

{{tc this \\'intercomCallDescription\\'}}

\\n
\\n
\\n \\n
\\n
\\n
\\n \\n

{{t \\'generic.notifications\\'}}

\\n
\\n\\n

{{t \\'generic.timeFrame\\'}}

\\n {{!-- @glint-expect-error Please convert this component to TS --}}\\n \\n\\n
\\n

{{t \\'generic.recipients\\'}}

\\n \\n {{#if (and contact.isSelected (eq contact.contact.addressType this.panelContactType)) }}\\n \\n {{/if}}\\n \\n
\\n
\\n\\n {{#if this.hasReachedRecipientQuota}}\\n \\n

{{tc this \\\"intercomRuleMaxRecipientsReached\\\"}}

\\n \\n {{/if}}\\n \\n
\\n {{#unless this.isCurrentDeviceAdded}}\\n \\n \\n {{/unless}}\\n
\\n\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/intercom-contact/notifications/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/intercom-contact/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{!-- Toolbar options and additional buttons go here. --}}\\n \\n\\n \\n \\n \\n \\n\\n {{#each this.model.cameras as |camera|}}\\n

{{t \\'generic.camera\\'}} {{t \\'generic.video.mac\\'}}: {{camera.macAddress}}

\\n \\n\\n
\\n {{#if camera.runTests}}\\n \\n\\n
\\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n {{#each this.tests as |test|}}\\n \\n \\n \\n \\n \\n \\n \\n {{/each}}\\n \\n
{{tc this \\'test\\'}} {{tc this \\'testDescription\\'}} {{tc this \\'failReason\\'}} {{tc this \\'status\\'}} {{tc this \\'timeToCompleteTest\\'}}
{{test.name}}{{test.desc}}{{test.failReason}}{{test.status}}{{test.timeToCompleteTest}}
\\n\\n {{/if}}\\n\\n\\n {{/each}}\\n \\n\\n \\n

{{t \\'generic.noResults\\'}}

\\n
\\n
\\n
\\n\",{ moduleName: \"customer-site/video/international-tests/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- @glint-expect-error Please convert this component to TS. --}}\\n\",{ moduleName: \"customer-site/video/live-view/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- @glint-expect-error Please convert this component to TS. --}}\\n\",{ moduleName: \"customer-site/video/onboard/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- TODO(VID-45181): match mockups for failed installs --}}\\n\\n\\n \\n \\n {{!-- @glint-expect-error Please change this to `this.attemptDefaultUnlocks.perform`. --}}\\n
\\n {{#if this.attemptDefaultUnlocks.isRunning}}\\n \\n {{else}}\\n
\\n

{{t \\'generic.additionalInformation\\'}}

\\n {{#if this.usingIndividualInstallation}}\\n {{!-- @glint-expect-error The add template helper types don\\'t appear correct. Please fix them, or change this to use the math template helper. --}}\\n {{safe-html (tc this \\'lockedCameraIndex\\' cameraIndex=(add this.cameraIndex 1) cameraCount=this.numberOfResultsToIndividuallyUnlock)}}\\n {{/if}}\\n\\n

\\n {{#if this.showResetMessage}}\\n {{tc this \\'requiresResetDescription\\' numCams=this.numberOfResultsToIndividuallyUnlock}}\\n {{else}}\\n {{tc this \\'description\\' numCams=this.numberOfResultsToIndividuallyUnlock}}\\n {{/if}}\\n

\\n\\n
\\n
\\n \\n {{!-- TODO(VID-45181): this is cleared out between individual installs but not the password. Confirm correct behavior and fix user/password inputs --}}\\n \\n \\n \\n\\n {{#if this.showResetMessage}}\\n \\n {{t \\'generic.video.camerasHaveBeenReset\\' numCams=this.numberOfCamsUnlockingNow}}\\n \\n {{/if}}\\n
\\n
\\n\\n {{#if this.currentResult}}\\n
\\n
\\n

{{t \\'generic.video.cameraInformation\\'}}

\\n \\n

{{tc this \\'manufacturerCommaModel\\' manufacturer=this.currentResult.manufacturer model=this.currentResult.model}}

\\n \\n

{{this.currentResult.macAddress}}

\\n\\n {{#if this.currentResult.poePort}}\\n \\n

{{t \\'generic.video.formattedCsvrAndPortNumber\\' csvrName=this.currentResult.svr.description portNumber=this.currentResult.poePort}}

\\n {{else}}\\n \\n

{{this.currentResult.svr.description}}

\\n {{/if}}\\n\\n \\n

{{this.currentResult.ipAddress}}

\\n
\\n
\\n {{/if}}\\n\\n {{#unless this.showResetMessage}}\\n {{!-- We set the cancel button visibility to true for mobile, so we can override the Android toolbar exit button. This does not actually show a cancel button on mobile. --}}\\n \\n {{/unless}}\\n\\n
\\n
\\n {{tc this \\'notSureAboutCameraCredentials\\'}}\\n \\n {{t \\'generic.skipForNow\\'}}\\n \\n
\\n {{tc this \\'skipInformation\\'}}\\n
\\n
\\n {{/if}}\\n
\\n
\\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/credentials/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n

{{tc this \\'searchingCompatibleDevices\\'}}

\\n
\\n \\n
\\n\\n \\n {{#if this.showDiscoveryWarningAsPage}}\\n

{{tc this \\'noDevicesFound\\'}}

\\n

{{tc this \\'noCamerasFound\\'}}

\\n
\\n \\n
\\n {{else if this.showMaxLimitPage}}\\n

{{t \\\"video.onvif-install.cannotDiscoverDevices\\\"}}

\\n

{{t \\'video.onvif-install.cannotDiscoverDevicesErrorMsg\\'}}

\\n
\\n \\n
\\n {{else}}\\n

{{t \\'generic.selectCamera\\'}}

\\n {{#if this.userCannotInstallAllDiscoveredCameras}}\\n
\\n

{{tc this \\'servicePackageAvailability\\' count=this.numAdditionalCamsSupportedMinusSelected}}

\\n \\n
\\n {{!-- @glint-expect-error The add template helper types don\\'t appear correct. Please fix them, or change this to use the math template helper. --}}\\n {{tc this \\'camerasUsed\\' used=(add this.currentCameraCount this.selectedCount) max=this.maxCameraCount}}\\n \\n {{t \\'generic.upgrade\\'}}\\n \\n
\\n
\\n {{/if}}\\n\\n {{#each this.svrsDisplayObject as |svrDisplayObject|}}\\n
\\n

{{svrDisplayObject.headerDeviceName}}{{svrDisplayObject.headerChannelsLeft}}

\\n {{!-- The entire checkboxItemsDisplay will rerender when a checkbox is selected. We need to use key=\\\"onvifCameraDiscoveryResult\\\" to prevent the checkboxes from rerendering. --}}\\n {{#each svrDisplayObject.checkboxItemsDisplay key=\\'onvifCameraDiscoveryResult\\' as |checkboxItem index|}}\\n
\\n \\n {{checkboxItem.onvifCameraDiscoveryResult.name}}\\n \\n {{checkboxItem.secondLineDisplay}}\\n \\n \\n
\\n
\\n {{/each}}\\n
\\n {{/each}}\\n\\n \\n {{/if}}\\n\\n
\\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n

{{t \\'generic.nameDevice\\'}}

\\n\\n

{{tc this (if this.isTouchDevice \\'cameraInstalledGiveNameMobile\\' \\'cameraInstalledGiveNameWeb\\')}}

\\n\\n
\\n
\\n
\\n \\n\\n \\n
\\n\\n
\\n
\\n {{t \\'generic.preview\\'}}\\n {{!-- @glint-expect-error The add template helper types don\\'t appear correct. Please fix them, or change this to use the math template helper. --}}\\n {{safe-html (t \\'generic.video.cameraIndexOfCamerasCount\\' cameraIndex=(add @model.index 1) cameraCount=this.numberOfInstalls)}}\\n
\\n\\n
\\n \\n
\\n \\n {{#if snapshotData.blobUrl}}\\n \\n {{!-- if snapshotData is undefined it means we\\'re still waiting for requests to finish --}}\\n {{else if snapshotData}}\\n \\n {{snapshotData.errorMessage}}\\n {{/if}}\\n \\n
\\n \\n
\\n
\\n\\n {{#if this.onvifCameraDiscoveryResult}}\\n
\\n \\n

{{t \\'video.onvif-install.credentials.manufacturerCommaModel\\' manufacturer=this.onvifCameraDiscoveryResult.manufacturer model=this.onvifCameraDiscoveryResult.model}}

\\n\\n \\n

{{this.camera.macAddress}}

\\n\\n {{#if this.onvifCameraDiscoveryResult.poePort}}\\n \\n

{{t \\'generic.video.formattedCsvrAndPortNumber\\' csvrName=this.onvifCameraDiscoveryResult.svr.description portNumber=this.onvifCameraDiscoveryResult.poePort}}

\\n {{else}}\\n \\n

{{this.onvifCameraDiscoveryResult.svr.description}}

\\n {{/if}}\\n\\n \\n

{{this.onvifCameraDiscoveryResult.ipAddress}}

\\n
\\n {{/if}}\\n\\n
\\n {{#if this.deleteCamera.isRunning}}\\n \\n {{else}}\\n \\n {{t \\'generic.video.deleteCamera\\'}}\\n \\n {{/if}}\\n
\\n
\\n
\\n\\n \\n
\\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/naming/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n

{{t \\'generic.nameDevice\\'}}

\\n\\n

{{tc this (if this.isTouchDevice \\'nameCameraMobile\\' \\'nameCameraWeb\\') numberOfInstalls=this.numberOfInstalls}}

\\n\\n
\\n {{#each this.discoveredCameras as |cameraItem cameraIndex|}}\\n
\\n
\\n \\n {{#if snapshotData.blobUrl}}\\n {{t\\n {{!-- if snapshotData is undefined it means we\\'re still waiting for requests to finish --}}\\n {{else if snapshotData}}\\n \\n {{/if}}\\n \\n
\\n\\n \\n \\n\\n \\n
\\n
\\n {{/each}}\\n \\n\\n \\n
\\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/naming/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{outlet}}\\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n {{#if this.hasAcceptedAgreement}}\\n

{{t \\'generic.supportedFeatures\\'}}

\\n\\n

{{tc this \\'installationFeaturesDescription\\'}}

\\n\\n
\\n
    \\n
  • \\n

    {{t \\'generic.video.cameraToRecorderEncryption\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.video.recorderToCloudEncryption\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.video.liveStreaming\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.video.recordedPlayback\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.video.audioRecording\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.clips\\'}}

    \\n \\n
  • \\n
  • \\n

    {{t \\'generic.video.firmwareUpgrades\\'}}

    \\n \\n
  • \\n
\\n
\\n\\n \\n\\n
\\n \\n
\\n\\n {{else}}\\n

{{t \\'generic.thirdPartyCameraTermsOfUse\\'}}

\\n\\n

{{tc this \\'agreement\\'}}

\\n\\n \\n\\n
\\n \\n\\n \\n
\\n {{/if}}\\n
\\n
\\n
\\n\",{ moduleName: \"customer-site/video/onvif-install/terms-of-service/template.hbs\" })","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { taskHelperClosure } from '../-private/helpers';\nimport type { Task } from '../index';\n\nconst CANCEL_REASON = \"the 'cancel-all' template helper was invoked\";\n\ntype CancelAllParams = [task: Task];\n\nexport function cancelHelper(args: CancelAllParams) {\n let cancelable = args[0];\n if (!cancelable || typeof cancelable.cancelAll !== 'function') {\n assert(\n `The first argument passed to the \\`cancel-all\\` helper should be a Task or TaskGroup (without quotes); you passed ${cancelable}`,\n false,\n );\n }\n\n return taskHelperClosure('cancel-all', 'cancelAll', [\n cancelable,\n { reason: CANCEL_REASON },\n ]);\n}\n\nexport default helper(cancelHelper);\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck: Please convert this to PageView and fix the many, many type inconsistencies. }}\\n\\n \\n \\n\\n \\n
\\n
\\n {{#if this.cannotEditRuleMessage}}\\n
\\n

{{this.cannotEditRuleMessage}}

\\n
\\n {{/if}}\\n\\n
\\n

\\n {{t \\'video.rules.analytics.draw.recordingRuleType\\' type=(t this.ruleTypeResource)}}\\n

\\n\\n
\\n {{#if this.canViewLockToggle}}\\n
\\n \\n
\\n {{/if}}\\n
\\n
\\n\\n {{#unless @model.rule.isNew}}\\n
\\n \\n\\n {{#if @model.videoUsage.isOverUploadQuota}}\\n \\n \\n \\n {{/if}}\\n
\\n {{/unless}}\\n\\n {{#unless this.isThirdPartyCamera}}\\n \\n\\n
\\n {{#if this.doesRuleTypeAllowAOI}}\\n {{this.groundZoneText}}\\n {{else}}\\n {{t \\'video.rules.analytics.draw.descriptionTripwire\\'}}\\n {{/if}}\\n
\\n {{/unless}}\\n\\n
\\n
\\n {{t \\'video.rules.analytics.draw.ruleName\\'}}\\n \\n
\\n
\\n
\\n\\n {{#if this.isThirdPartyCamera}}\\n
\\n \\n

{{if this.cameraLinkUrl (t \\'video.rules.analytics.draw.cameraLinkDescription\\') (t \\'generic.video.cameraLinkResponseFailed\\')}}

\\n {{#if this.cameraLinkUrl}}\\n
\\n \\n
\\n {{/if}}\\n
\\n
\\n\\n \\n\\n
\\n \\n\\n
\\n {{t \\'video.rules.analytics.draw.descriptionThirdPartyAnalytics\\'}}\\n
\\n\\n
\\n {{t \\'video.rules.analytics.draw.selectAnalyticsTrigger\\'}}\\n
\\n\\n
\\n \\n
\\n
\\n {{else}}\\n
\\n \\n
\\n {{/if}}\\n\\n
\\n {{#if this.displaySensitivitySlider}}\\n \\n \\n {{/if}}\\n
\\n\\n
\\n \\n\\n
\\n
\\n
\\n
\\n {{t \\'generic.action\\'}}\\n
\\n\\n
\\n \\n

{{t \\'video.rules.analytics.draw.recordClip\\'}}

\\n {{#if this.isThirdPartyCamera}}\\n \\n {{/if}}\\n
\\n
\\n\\n
\\n
\\n
\\n {{t \\'video.rules.analytics.draw.minimumDelay\\'}}\\n
\\n\\n \\n \\n \\n
\\n\\n \\n
\\n
\\n\\n
\\n \\n\\n {{#if this.showActiveWarning}}\\n
\\n {{t \\'video.rules.analytics.draw.timesActiveWarning\\'}}\\n
\\n {{/if}}\\n
\\n\\n {{#if this.hasPresenceState}}\\n \\n {{else if (await this.showExceptions)}}\\n \\n {{/if}}\\n\\n
\\n\\n
\\n
\\n
\\n {{#if this.supportsAdditionalRuleFeatures}}\\n \\n {{/if}}\\n
\\n
\\n
\\n \\n {{#unless this.isThirdPartyCamera}}\\n

{{this.notificationsFilterText}}

\\n {{/unless}}\\n {{#if this.displaySavedClipNotificationFilterTypes}}\\n
\\n \\n
\\n {{else if this.displayDoorbellNotificationFilters}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{#if this.notificationGroups}}\\n {{#each this.notificationGroups as |group|}}\\n \\n {{#if contact.isSelected}}\\n {{!-- All read-only preview types are text only SMS notifications. --}}\\n {{#if contact.isReadOnlyPreviewType}}\\n

\\n {{t \\'video.rules.analytics.draw.textPreview\\'}}\\n

\\n {{else}}\\n {{#if (eq group.type this.monitoringStationContactType)}}\\n {{#if this.canViewDialerDelayDropdown}}\\n \\n

\\n {{t \\'video.rules.analytics.draw.dialerDelayDescription\\'}}\\n

\\n {{/if}}\\n {{#if this.canViewNoonlightVerifyDropdown}}\\n \\n

\\n {{t \\'video.rules.analytics.draw.noonlightVerifyDescription\\'}}\\n

\\n {{/if}}\\n {{else}}\\n \\n
\\n {{contact.description}}\\n
\\n {{/if}}\\n {{/if}}\\n {{/if}}\\n \\n {{#if (and (eq group.type this.mobileContactType) this.shouldDisplayMobileWarningMessage)}}\\n \\n

\\n {{this.mobileWarningMessageText}}\\n {{#if (and (not this.shouldDisplayMobileTextOnlyWarning) this.disableMMSVideoNotifications)}}\\n {{t \\'video.rules.analytics.draw.disableMMSWarning\\'}}\\n {{/if}}\\n {{#if this.hasKnowledgeBasePermissions}}\\n {{t \\'generic.learnMore\\'}}\\n {{/if}}\\n

\\n
\\n {{/if}}\\n {{#if (and (eq group.type this.monitoringStationContactType) this.shouldDisplayDisabledWarningSoundMessage)}}\\n \\n {{/if}}\\n {{/each}}\\n {{else if this.noPermissionsForContacts}}\\n {{t \\'video.rules.analytics.draw.noPermissionsForContacts\\'}}\\n {{else}}\\n
\\n
\\n
\\n {{/if}}\\n {{#if this.canSendPanelNotification}}\\n
\\n

{{t \\'video.rules.analytics.draw.panelTitle\\'}}

\\n
\\n \\n
\\n
\\n {{#if this.hasPanelNotification}}\\n \\n
\\n {{this.getRecipientDescriptionForPanelNotification}}\\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n
\\n
\\n\\n {{#if this.canViewAnalyticsLightRuleSetup}}\\n \\n {{/if}}\\n\\n {{#if this.displayTouchlessRingRuleSection}}\\n
\\n
\\n

{{t (concat \\'video.rules.analytics.draw.\\' (if @model.rule.isActive \\'touchlessDoorbellEnable\\' \\'touchlessDoorbellEnableParentDisabled\\'))}}

\\n \\n \\n
\\n\\n {{#if this.areTouchlessRingRuleOptionsVisible}}\\n
\\n

{{t \\'video.rules.analytics.draw.touchlessDoorbellDesc\\'}}

\\n
\\n \\n
\\n
\\n {{/if}}\\n
\\n {{/if}}\\n\\n
\\n \\n
\\n
\\n
\\n\\n \\n \\n\",{ moduleName: \"customer-site/video/rules/analytics/draw/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/rules/analytics/draw/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n
\\n
{{@mainText}}
\\n
{{@subText}}
\\n
\\n {{#unless @hideToggle}}\\n \\n {{/unless}}\\n
\\n {{#if @sectionExpanded}}\\n
\\n {{yield}}\\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/ui/collapsible-section/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface UiCollapsibleSectionSignature {\n Args: {\n icon: string;\n mainText: string;\n subText: string;\n disabled?: boolean;\n sectionExpanded: boolean;\n onToggleChanged: VoidFunction;\n hideToggle?: boolean;\n id?: string;\n };\n Blocks: {\n default: [];\n };\n}\n\nconst UiCollapsibleSection = templateOnlyComponent();\nexport default UiCollapsibleSection;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::CollapsibleSection': typeof UiCollapsibleSection;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck: Please convert this to PageView and fix the many, many type inconsistencies. }}\\n\\n \\n \\n \\n
\\n {{t \\'video.rules.analytics.draw.ruleName\\'}}\\n \\n
\\n
\\n \\n \\n\\n \\n \\n \\n
\\n
\\n {{#if this.cannotEditRuleMessage}}\\n
\\n

{{this.cannotEditRuleMessage}}

\\n
\\n {{/if}}\\n
\\n {{#if this.isThirdPartyCamera}}\\n
\\n \\n

{{if this.cameraLinkUrl (t \\'video.rules.analytics.draw.cameraLinkDescription\\') (t \\'generic.video.cameraLinkResponseFailed\\')}}

\\n {{#if this.cameraLinkUrl}}\\n
\\n \\n
\\n {{/if}}\\n
\\n
\\n {{else}}\\n
\\n {{t \\'video.rules.analytics.draw.cameraMotionSetting\\'}}\\n
\\n {{/if}}\\n {{#if this.canViewLockToggle}}\\n
\\n
\\n \\n
\\n
\\n {{/if}}\\n {{#unless this.isThirdPartyCamera}}\\n
\\n {{t \\'video.rules.analytics.draw.motionSettingsDescription\\'}}\\n
\\n
\\n {{t \\'video.rules.analytics.draw.motionArea\\'}}\\n
\\n {{/unless}}\\n {{#unless @model.rule.isNew}}\\n
\\n \\n {{#if @model.videoUsage.isOverUploadQuota}}\\n \\n \\n \\n {{/if}}\\n
\\n {{/unless}}\\n
\\n
\\n\\n
\\n {{#if this.isThirdPartyCamera}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n {{#if this.displaySensitivitySlider}}\\n \\n \\n {{/if}}\\n\\n
\\n {{#if @model.rule.camera.supportsStories}}\\n
\\n
\\n {{t \\'video.rules.analytics.draw.detectionType\\'}}\\n \\n
\\n {{#if this.isThirdPartyCamera}}\\n
\\n \\n
\\n {{else}}\\n \\n {{#if this.showPackageAlertsDisabledWarning}}\\n \\n {{/if}}\\n {{/if}}\\n
\\n {{/if}}\\n
\\n
\\n
\\n {{t \\'automation.rules.index.timeframe\\'}}\\n \\n
\\n \\n {{#if this.showActiveWarning}}\\n
\\n {{if this.isThirdPartyCamera (t \\'video.rules.analytics.draw.timesActiveWarningThirdParty\\') (t \\'video.rules.analytics.draw.timesActiveWarning\\')}}\\n
\\n {{/if}}\\n {{#if (or this.hasPresenceState (await this.showExceptions))}}\\n
\\n \\n {{#if this.showExceptionSettings}}\\n {{#if this.hasPresenceState}}\\n \\n {{else}}\\n \\n {{/if}}\\n {{/if}}\\n
\\n {{/if}}\\n
\\n
\\n
\\n\\n \\n
\\n
\\n {{t \\'video.rules.analytics.draw.minimumDelay\\'}}\\n \\n
\\n \\n
\\n \\n\\n {{#if this.supportsAdditionalRuleFeatures}}\\n
\\n \\n \\n \\n
\\n {{/if}}\\n\\n {{#if this.canViewAnalyticsLightRuleSetup}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n {{#unless this.isThirdPartyCamera}}\\n
\\n {{t \\'video.rules.analytics.draw.detectionType\\'}}\\n \\n
\\n {{#if this.displaySavedClipNotificationFilterTypes}}\\n \\n <:content as |item|>\\n {{#if (or (await this.shouldDisplayFamiliarFaceFeatures) (await this.shouldDisplayFamiliarVehicleFeatures))}}\\n \\n {{#if (and (await item.props.hasEnableFeatureButton) (not hasUserEnabledFeature))}}\\n \\n {{/if}}\\n \\n {{#if (and (await item.props.hasNotificationFilterDropdown) (await item.props.enableFeatureButtonProps.hasUserEnabledFeature))}}\\n \\n {{#if dropdownItems.length}}\\n \\n {{/if}}\\n \\n {{/if}}\\n {{/if}}\\n \\n \\n {{#if this.showPackageAlertsDisabledWarning}}\\n \\n {{/if}}\\n {{else if this.displayDoorbellNotificationFilters}}\\n
\\n \\n
\\n {{/if}}\\n {{/unless}}\\n
\\n {{#if this.notificationGroups}}\\n
\\n {{t \\'@adc/login-setup-engine.arming-reminder.recipientsListLabel\\'}}\\n
\\n {{#each this.notificationGroups as |group|}}\\n \\n {{#if contact.isSelected}}\\n {{!-- All read-only preview types are text only SMS notifications. --}}\\n {{#if contact.isReadOnlyPreviewType}}\\n

\\n {{t \\'video.rules.analytics.draw.textPreview\\'}}\\n

\\n {{else}}\\n {{#if (eq group.type this.monitoringStationContactType)}}\\n {{#if this.canViewDialerDelayDropdown}}\\n \\n

\\n {{t \\'video.rules.analytics.draw.dialerDelayDescription\\'}}\\n

\\n {{/if}}\\n {{#if this.canViewNoonlightVerifyDropdown}}\\n \\n

\\n {{t \\'video.rules.analytics.draw.noonlightVerifyDescription\\'}}\\n

\\n {{/if}}\\n {{else}}\\n \\n {{/if}}\\n {{/if}}\\n {{/if}}\\n \\n {{#if (and (eq group.type this.mobileContactType) this.shouldDisplayMobileWarningMessage)}}\\n \\n

\\n {{this.mobileWarningMessageText}}\\n {{#if (and (not this.shouldDisplayMobileTextOnlyWarning) this.disableMMSVideoNotifications)}}\\n {{t \\'video.rules.analytics.draw.disableMMSWarning\\'}}\\n {{/if}}\\n {{#if this.hasKnowledgeBasePermissions}}\\n {{t \\'generic.learnMore\\'}}\\n {{/if}}\\n

\\n
\\n {{/if}}\\n {{#if (and (eq group.type this.monitoringStationContactType) this.shouldDisplayDisabledWarningSoundMessage)}}\\n \\n {{/if}}\\n {{/each}}\\n {{else if this.noPermissionsForContacts}}\\n {{t \\'video.rules.analytics.draw.noPermissionsForContacts\\'}}\\n {{else}}\\n
\\n
\\n
\\n {{/if}}\\n {{#if this.canSendPanelNotification}}\\n
\\n

{{t \\'video.rules.analytics.draw.panelTitle\\'}}

\\n
\\n \\n
\\n
\\n {{#if this.hasPanelNotification}}\\n \\n
\\n {{this.getRecipientDescriptionForPanelNotification}}\\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n
\\n \\n
\\n {{#if this.displayTouchlessRingRuleSection}}\\n \\n {{#if this.areTouchlessRingRuleOptionsVisible}}\\n
\\n
\\n \\n
\\n
\\n {{/if}}\\n \\n\\n {{/if}}\\n
\\n
\\n \\n \\n\\n \\n \\n \\n
\\n
\\n
\\n {{#unless @model.rule.isNew}}\\n
\\n \\n
\\n {{/unless}}\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n \\n \\n\",{ moduleName: \"customer-site/video/rules/analytics/draw/v2/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n\\n
\\n \\n
\\n
\\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/video/rules/analytics/select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n\\n
\\n \\n
\\n
\\n\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/rules/analytics/settings/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{outlet}}\\n
\\n\\n\",{ moduleName: \"customer-site/video/rules/analytics/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @icon}}\\n \\n\\n {{/if}}\\n\\n
\\n
\\n {{t \\'generic.valuePercent\\' value=@usagePercent}}\\n \\n
\\n
{{@details}}
\\n
\\n
\",{ moduleName: \"customer-site/components/video/clips/storage/percent-item/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface VideoClipsStoragePercentItemSignature {\n Element: HTMLDivElement;\n Args: {\n icon?: string;\n health: string;\n usagePercent: number;\n tooltipTitle: string;\n details: string;\n };\n}\n\nconst VideoClipsStoragePercentItem = templateOnlyComponent();\nexport default VideoClipsStoragePercentItem;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::PercentItem': typeof VideoClipsStoragePercentItem;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n

{{tc this \\'cloudStorage\\'}}

\\n {{#if this.canViewClipUsageReports}}\\n \\n {{/if}}\\n
\\n
\\n
\\n \\n\\n {{#if (or (media \\'isMobile\\') (media \\'tabletPortrait\\'))}}\\n \\n {{/if}}\\n
\\n\\n \\n \\n \\n \\n {{#if @videoUsage.projectedOverQuota}}\\n \\n {{/if}}\\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/rules/cloud-storage-info/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { EmberVideoClipsUsageReport } from '../../../../enums/CustomerPageUrl';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * A visual representation of the user's video cloud storage information.\n */\n@intlPath({ path: 'video/rules/cloud-storage-info' })\nexport default class VideoRulesCloudStorageInfoComponent extends Component {\n @service contextManager;\n\n /**\n * Whether the user has the automatic re-enabling of recording rules after quota reset feature.\n *\n * @type {boolean}\n */\n @tracked canEnableRecordingRulesAfterQuotaReset =\n this.contextManager.identityModel.canEnableRecordingRulesAfterQuotaReset;\n\n /**\n * Whether the user has permission to view the clip usage reports.\n *\n * @type {boolean}\n */\n @reads('contextManager.identityModel.canViewClipUsageReports')\n canViewClipUsageReports;\n\n /**\n * Whether this component is in a collapsed state or expanded state (only will collapsed on small screens).\n *\n * @type {boolean}\n */\n @tracked collapsedOnMobile = true;\n\n /**\n * Switches the chevron (either showing more or less cloud storage information while on mobile).\n */\n @action\n toggleChevron() {\n this.collapsedOnMobile = !this.collapsedOnMobile;\n }\n\n /**\n * Navigates to the usage report page.\n *\n */\n @action navigateToUsageReportPage() {\n const { contextManager } = this;\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberVideoClipsUsageReport);\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n

{{tc this \\'monthlyAiDeterrenceEventQuota\\'}}

\\n
\\n
\\n
\\n
\\n

{{tc this \\'monthlyAiDeterrenceEventsMax\\' numEvents=this.eventsThisMonth maxEvents=this.maxEventQuota htmlSafe=true}}

\\n {{#if this.shouldDisplayTooltip}}\\n \\n {{/if}}\\n
\\n

{{tc this \\'monthlyAiDeterrenceEventsUsed\\'}}

\\n
\\n {{#if this.displayWarning}}\\n \\n {{else}}\\n
\\n

{{tc this \\'projectedMonthlyUsage\\' projectedMonthlyEvents=this.projectedMonthlyEvents }}

\\n
\\n {{/if}}\\n
\\n
\",{ moduleName: \"customer-site/components/video/rules/ai-deterrence-usage-info/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type AiDeterrenceUsageModel from 'customer-site/models/video/ai-deterrence-usage';\nimport './_style.scss';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface AiDeterrenceUsageArgs {\n aiDeterrenceUsage: AiDeterrenceUsageModel;\n}\n\n/**\n * @classdesc\n * A visual representation of the user's video cloud storage information.\n */\n@intlPath({ path: 'video/rules/ai-deterrence-usage-info' })\nexport default class AiDeterrenceUsageInfoComponent extends Component {\n @service declare contextManager: ContextManager;\n\n /**\n * The max number of AID events a customer can use\n */\n @alias('args.aiDeterrenceUsage.maxEventQuota')\n declare maxEventQuota: number;\n\n /**\n * Current number of AID events a customer has used in the month\n */\n @alias('args.aiDeterrenceUsage.eventsThisMonth')\n declare eventsThisMonth: number;\n\n /**\n * The number of AID events a customer can use in a month.\n * This can be different from the Max Event Quota\n */\n @alias('args.aiDeterrenceUsage.currentEventQuota')\n declare currentEventQuota: number;\n\n /**\n * The number of AID events a customer is projected to use in the month\n */\n @alias('args.aiDeterrenceUsage.projectedMonthlyEvents')\n declare projectedMonthlyEvents: number;\n\n /**\n * Determines whether or not the AID usage warning should be displayed\n */\n @computed('maxEventQuota', 'eventsThisMonth')\n get displayWarning(): boolean {\n return this.eventsThisMonth >= this.maxEventQuota;\n }\n\n /**\n * Determines whether or not the AID tooltip describing the 15 free events should be displayed\n */\n @computed('currentEventQuota', 'maxEventQuota')\n get shouldDisplayTooltip(): boolean {\n return this.maxEventQuota < this.currentEventQuota;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::AiDeterrenceUsageInfo': typeof AiDeterrenceUsageInfoComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n
{{tc this \\'noSvrsInstalled\\'}}
\\n
\\n
{{t \\'generic.video.svrPlural\\'}}
\\n
{{tc this \\'oldestVideoRecording\\'}}
\\n
{{tc this \\'projectedNumDays\\'}}
\\n
{{tc this \\'hardDriveUsage\\'}}
\\n
\\n {{#each (await this.svrUsageData) as |svr|}}\\n
\\n
\\n \\n
\\n
{{svr.description}}
\\n
{{t \\'generic.video.svrSingular\\'}}
\\n
\\n
\\n
\\n \\n
\\n
{{t \\'generic.loadingEllipsis\\'}}
\\n
{{t \\'generic.unknown\\'}}
\\n
{{svr.oldestRecordingDate}}
\\n
{{tc this \\'oldestVideoRecording\\'}}
\\n
\\n
\\n
\\n \\n
\\n
{{t \\'generic.loadingEllipsis\\'}}
\\n
{{t \\'generic.unknown\\'}}
\\n
{{tc this \\'pleaseWait48Hours\\'}}
\\n
{{svr.daysOfRecordingString}}
\\n
{{tc this \\'projectedNumDays\\'}}
\\n
\\n
\\n
\\n
\\n
{{t \\'generic.loadingEllipsis\\'}}
\\n
{{t \\'generic.unknown\\'}}
\\n
\\n \\n
{{svr.usageStatsString}}
\\n
\\n
{{tc this \\'hardDriveUsage\\'}}
\\n
\\n
\\n
\\n {{/each}}\\n
\\n
\",{ moduleName: \"customer-site/components/video/rules/local-storage-info/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { getObjProperties } from '@adc/ember-utils/utils/ember-helpers';\nimport { computed, get } from '@ember/object';\nimport { mapBy } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type SvrUsageInfo from 'customer-site/models/video/svr-usage-info';\n\ninterface LocalStorageInfoSignature {\n Element: HTMLDivElement;\n Args: {\n svrs: Svr[];\n };\n}\n\ninterface SvrUsageData {\n description: string;\n loadingStatusCss: string;\n storageUsed: string;\n storageAvailable: string | number;\n oldestRecordingDate?: string;\n daysOfRecordingString?: string;\n oldestRecordingCss?: string;\n storageUsedPercent?: string;\n usageStatsTooltipText?: string;\n usageStatsString?: string;\n daysOfRecordingCss?: string;\n usageStatsCss?: string;\n}\n\n/**\n * A visual representation of the user's local/svr storage information.\n *\n * @param {Array} svrs\n */\n@intlPath({ path: 'video/rules/local-storage-info' })\nexport default class LocalStorageInfo extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * The class name binding for css to handle multiple svrs/individual svrs/no svrs.\n */\n @computed('args.svrs.[]')\n get svrCountCss(): string {\n switch (this.args.svrs.length) {\n case 0:\n return 'no-svr';\n case 1:\n return 'one-svr';\n default:\n return 'multi-svr';\n }\n }\n\n /**\n * The svr model object mapped by svr usage.\n */\n @mapBy('args.svrs', 'svrUsageInfo')\n declare svrUsageObjects: SvrUsageInfo[];\n\n /**\n * Computes to an object of svr usage information.\n */\n @computed('args.svrs', 'svrUsageObjects')\n get svrUsageData(): Promise {\n return (async () => {\n const { svrs } = this.args;\n\n // Even though we don't need to use this variable, we need to get it to ensure that it gets computed.\n this.svrUsageObjects;\n\n const svrData = await Promise.all(\n svrs.map(async (svr) => {\n const usageInfo = await svr.svrUsageInfo;\n\n // Even though get() is not TS-friendly, we are keeping it since usageInfo is a proxy (until we figure out how to transform proxies over to TS).\n if (!usageInfo || get(usageInfo, 'isLoading')) {\n return {\n description: svr.description,\n loadingStatusCss: 'is-loading',\n // Have to pass back storage used/available values otherwise the tooltip will crash.\n storageUsed: '0',\n storageAvailable: '0'\n };\n }\n\n // getObjProperties() causes TS error, but is okay here for now.\n const [storageAvailable, oldestRecordingDate, projectedDaysRecording, wait48HoursForProjection] =\n getObjProperties(\n usageInfo,\n 'storageAvailable',\n 'oldestRecordingDate',\n 'projectedDaysRecording',\n 'wait48HoursForProjection'\n ),\n storageUsed = get(usageInfo, 'storageUsed').toFixed(1),\n storageUsedPercent = ((Number(storageUsed) * 100) / (storageAvailable as number)).toFixed(1),\n oldestRecordingCss = oldestRecordingDate ? '' : 'no-data unknown',\n usageStatsCss = storageAvailable ? '' : 'no-data unknown',\n usageStatsString = this.intl.tc(this, 'usageStatsString', {\n storageUsed,\n storageUsedPercent,\n storageAvailable\n }),\n // If storage percentage is showing 99% it is most likely full due to the device temporarily deleting files to make space.\n storageIsFull = Number(storageUsedPercent) >= 99;\n\n let daysOfRecordingString, daysOfRecordingCss;\n\n if (projectedDaysRecording !== -1) {\n daysOfRecordingString = this.intl.tc(this, 'daysString', { numDays: projectedDaysRecording });\n daysOfRecordingCss = '';\n\n if (!storageIsFull) {\n daysOfRecordingString += ` (${this.intl.t('generic.video.projection')})`;\n }\n } else {\n daysOfRecordingCss = wait48HoursForProjection ? 'no-data wait-48-hrs' : 'no-data unknown';\n }\n\n return {\n description: svr.description,\n storageAvailable,\n storageUsed,\n oldestRecordingDate,\n daysOfRecordingString,\n storageUsedPercent,\n usageStatsString,\n loadingStatusCss: 'loaded',\n daysOfRecordingCss,\n usageStatsCss,\n usageStatsTooltipText: storageIsFull\n ? this.intl.tc(this, 'hdUsageFullTooltip')\n : this.intl.tc(this, 'hdUsageTooltip', { storageAvailable, storageUsed }),\n oldestRecordingCss\n } as SvrUsageData;\n })\n );\n\n return svrData;\n })();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::LocalStorageInfo': typeof LocalStorageInfo;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n
\\n \\n
{{tc this \\'clipLimitTitle\\'}}
\\n \\n
\\n
\\n
\\n {{tc this \\'clipLimitDescription\\'}}\\n
\\n
\\n {{tc this \\'clipLimitRulesTitle\\'}}\\n
\\n\\n
\\n {{#each @topRuleUsages as |ruleUsage|}}\\n \\n {{/each}}\\n
\\n
\\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/rules/clip-limit-suggestion/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { editItem } from 'customer-site/utils/video/rules-edit-transition';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type RuleUsage from 'customer-site/models/video/rule-usage';\nimport './_style.scss';\nimport type CookieManager from '@adc/app-infrastructure/services/cookie-manager';\nimport type BaseAutomationItem from 'customer-site/models/automation/base-automation-item';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\n\ninterface ClipLimitSuggestionSignature {\n Args: {\n topRuleUsages: RuleUsage[];\n isClipLimitSuggestionCollapsed: boolean;\n setClipLimitSuggestionCollapsed: (dismissed: boolean) => void;\n };\n}\n\n@intlPath({ path: 'video/rules/clip-limit-suggestion' })\nexport default class ClipLimitSuggestion extends Component {\n @service declare contextManager: ContextManager;\n @service declare cookieManager: CookieManager;\n @service declare navigation: NavigationService;\n\n @tracked isCollapsed = false;\n\n constructor(owner: unknown, args: ClipLimitSuggestionSignature['Args']) {\n super(owner, args);\n this.isCollapsed = this.args.isClipLimitSuggestionCollapsed;\n }\n\n /**\n * Redirects to the edit page for the specified automation item.\n */\n @action editItem(rule: OvRule, items: BaseAutomationItem[]): void {\n const item = items.find((item) => item.get('id') == rule.get('id'));\n\n if (!item) {\n return;\n }\n\n editItem(item, this.contextManager, this.navigation);\n }\n\n /**\n * Toggles the collapse/expand state of the clip limit suggestion card.\n */\n @action toggleCollapseState(): void {\n this.isCollapsed = !this.isCollapsed;\n this.args.setClipLimitSuggestionCollapsed(this.isCollapsed);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ClipLimitSuggestion': typeof ClipLimitSuggestion;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{#if this.showRetryMessage}}\\n

{{tc this \\'retryMessage\\'}}

\\n {{/if}}\\n\\n {{#each this.contacts as |contact|}}\\n
\\n
\\n {{#if contact.icon}}\\n \\n {{/if}}\\n {{contact.address}}\\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n {{/each}}\\n\\n
\\n \\n \\n
\\n\\n\",{ moduleName: \"customer-site/components/action-sheets/video/edit-alert-format/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { computed, action, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { isEmpty } from '@ember/utils';\nimport {\n TextOnlyNoVideo,\n iPhone_default,\n Mac_email_default,\n Windows_email_default,\n Blackberry,\n Android,\n PhoneAttTmobileBlackberry,\n OtherPhoneVerizonSprint,\n AttIPhone\n} from 'customer-site/enums/VideoClipFormat';\nimport { intlPath } from '@adc/i18n/path';\nimport ContactTypeEnum from '@adc/login-setup-addon/enums/ContactType';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type { AsyncBelongsTo } from '@ember-data/model';\nimport type ContactAddress from 'customer-site/models/users/contact-address';\nimport type VideoAlertFormat from 'customer-site/models/video/alert-format';\nimport type AlertFormat from 'customer-site/models/video/alert-format';\n\ninterface ActionSheetsVideoEditAlertFormatArgs {\n contacts?: ContactAddress[];\n formats: VideoAlertFormat[];\n close: VoidFunction;\n isActive: boolean;\n}\n\ntype FormatInfo = {\n name: string;\n value: number;\n};\n\ntype ContactInfo = {\n id: string;\n icon?: string;\n address: string;\n videoFormat: number;\n options: FormatInfo[];\n};\n\n@intlPath({ path: 'action-sheets/video/edit-alert-format' })\nexport default class ActionSheetsVideoEditAlertFormat extends Component {\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n\n /**\n * The currently selected video formats.\n */\n changes: Record = {};\n\n /**\n * The contacts to edit.\n */\n @computed('args.{contacts,formats}')\n get contacts(): ContactInfo[] {\n // Get possible format options.\n const formats: FormatInfo[] = this.args.formats.map(({ description, id }) => ({\n name: description,\n value: parseInt(id, 10)\n })),\n // Create a map of the supported options per contact type (specific to just this dialog), sorted by name.\n optionsMap: Record = [\n [\n ContactTypeEnum.Email,\n [\n Windows_email_default,\n Mac_email_default,\n iPhone_default,\n Android,\n Blackberry,\n AttIPhone,\n TextOnlyNoVideo\n ]\n ],\n [\n ContactTypeEnum.Mobile,\n [\n iPhone_default,\n Android,\n PhoneAttTmobileBlackberry,\n OtherPhoneVerizonSprint,\n AttIPhone,\n TextOnlyNoVideo\n ]\n ]\n ].reduce(\n (options, [addressType, formatTypes]: [number, number[]]) => ({\n ...options,\n [addressType]: formats.filter(({ value }) => formatTypes.includes(value)).sortBy('text')\n }),\n {}\n );\n\n return (this.args.contacts ?? []).map((contact) => {\n const videoFormat = parseInt(contact.belongsTo('videoFormat').id(), 10),\n options = optionsMap[contact.addressType],\n selected = formats.findBy('value', videoFormat);\n\n // Is the currently selected format NOT present in the options (set by advanced editor)?\n if (selected && !options.includes(selected)) {\n // Add it just for this contact.\n options.push(selected);\n }\n\n return {\n id: contact.id,\n icon: contact.icon,\n address: contact.address,\n videoFormat,\n options\n };\n });\n }\n\n /**\n * Indicates the retry message should be shown.\n */\n @tracked showRetryMessage = false;\n\n /**\n * Updates the format for the contact with the passed ID.\n */\n @action changeFormat(contactId: string, videoFormat: number): void {\n // Cache change and update contact.\n this.changes[contactId] = videoFormat;\n\n const contact = this.contacts.findBy('id', contactId);\n if (contact) {\n set(contact, 'videoFormat', videoFormat);\n }\n }\n\n /**\n * Saves the current changes (if there are any).\n */\n @action saveChanges(): Promise {\n const { changes, args } = this,\n { formats } = args;\n\n // Are there no changes?\n if (isEmpty(changes)) {\n // Return resolved changes.\n return Promise.resolve();\n }\n\n // Find changes and save them.\n const keys = Object.keys(changes),\n result = Promise.all(\n (args.contacts ?? [])\n .filter((contactAddress) => {\n const { id } = contactAddress;\n\n // Did this contact change?\n if (keys.includes(id)) {\n const fmt = formats.findBy('id', changes[id].toString());\n if (fmt) {\n // Update video format and return true to include in output.\n set(contactAddress, 'videoFormat', fmt as unknown as AsyncBelongsTo);\n }\n return true;\n }\n\n // Did not change, so skip it.\n return false;\n })\n .invoke('save')\n );\n\n // Add handler to clear changes on success.\n result.then(() => (this.changes = {}));\n\n // Return promise so button animates.\n return result;\n }\n\n /**\n * Sends a test clip using the current video format.\n */\n @action async sendTestClip(contactId: string): Promise {\n // Clear retry message.\n this.showRetryMessage = false;\n\n try {\n await (this.args.contacts ?? []).findBy('id', contactId)?.sendTestClip(this.changes[contactId]);\n\n const { intl } = this,\n testMessage = intl.tc(this, 'testMessage');\n this.modals.showConfirmationDialog(\n '',\n htmlSafe(testMessage),\n {\n text: intl.tc(this, 'testYes'),\n action: () => {\n this.saveChanges();\n this.modals.closeModal();\n }\n },\n {\n text: intl.tc(this, 'testNo')\n }\n );\n } catch (ex) {\n this.showRetryMessage = true;\n return Promise.reject();\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'ActionSheets::Video::EditAlertFormat': typeof ActionSheetsVideoEditAlertFormat;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n <:header>\\n {{#if this.resolvedModel}}\\n
\\n {{#if this.showCloudStorageInfo}}\\n {{! Passing in as a yield so that it is between the toolbar and the rule list }}\\n \\n\\n {{#if this.shouldShowAiDeterrenceInfoCard}}\\n \\n {{/if}}\\n {{/if}}\\n
\\n\\n {{#if this.showLocalStorageInfo}}\\n

{{tc this \\'storageSpace\\'}}

\\n\\n \\n {{/if}}\\n {{#if this.showClipLimitCard}}\\n \\n {{#if data}}\\n \\n {{/if}}\\n \\n {{/if}}\\n

{{this.ruleTypeTextHeader}}

\\n {{/if}}\\n\\n \\n\\n <:route-view as |view|>\\n {{#if (and this.videoFormats this.isCloudRecordingsFilterSelected)}}\\n

{{tc this \\'videoAlertFormat\\'}}

\\n\\n
\\n \\n \\n {{#each formats as |format|}}\\n
\\n
\\n
{{format.name}}
\\n
    \\n {{#each format.addresses as |item|}}\\n
  • \\n \\n {{item.address}}\\n
  • \\n {{/each}}\\n
\\n
    \\n {{#each format.addresses as |item|}}\\n
  • {{item.description}}
  • \\n {{/each}}\\n
\\n
\\n
\\n \\n
\\n
\\n {{/each}}\\n
\\n\\n \\n\\n \\n
\\n
\\n {{/if}}\\n \\n \\n\\n
\\n\\n\",{ moduleName: \"customer-site/video/rules/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\",{ moduleName: \"customer-site/video/schedules/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @controlAutomatedRecovery}}\\n
\\n
\\n
\\n \\n
\\n \\n
\\n
\\n \\n
\\n
\\n {{/if}}\\n {{#if @controlRetentionTime}}\\n
\\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n
\\n \\n
\\n
\\n {{/if}}\\n {{#if @controlBitrate}}\\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n {{#if (and @hasInternalBetaAccess @controlSmartRateControl)}}\\n
\\n
\\n \\n
\\n \\n
\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/playback-features/advanced-options-input/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { UnlimitedRetentionDropdownValue } from 'customer-site/video/schedules/onboard/edit/controller';\nimport { intlPath } from '@adc/i18n/path';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport './_style.scss';\n\nconst VALUE_CHANGE_ACTION = 'value-change';\n\n// Enums for the list of possible sections for advanced options.\nconst automatedRecoverySection = 0,\n retentionSection = 1,\n smartRateControlSection = 2,\n maxBitrateSection = 3;\n\n/**\n * @classdesc\n * Component for displaying and modifying advanced options for rules.\n */\n@intlPath({ path: 'video/settings/playback-features/advanced-options-input' })\nexport default class AdvancedOptionsInput extends Component {\n @service modals;\n @service intl;\n\n /** @override */\n constructor(...args) {\n super(...args);\n\n // This will update the retention period in the case the customer is moved to a dealer with a\n // max retention period lower than the customer had previously set\n\n const action = this.args[VALUE_CHANGE_ACTION];\n action &&\n action(\n this.args.selectedAutomatedRecovery,\n this.args.selectedRetentionTime,\n this.args.selectedSmartRateControl,\n this.args.currentMaxBitrate\n );\n\n this.automatedRecoverySection = automatedRecoverySection;\n this.retentionSection = retentionSection;\n this.smartRateControlSection = smartRateControlSection;\n this.maxBitrateSection = maxBitrateSection;\n }\n\n // region Automated Recovery.\n\n /**\n * The toggle state of the automated recovery toggle.\n *\n * @type {boolean}\n */\n @tracked selectedAutomatedRecovery = false;\n\n // endregion\n\n // region Retention.\n\n /**\n * The selected value in the dropdown list.\n * Note: This value always represents the dropdown's currently selected value,\n * the default selection is unlimited days. This value should never be null\n *\n * @type {string}\n */\n @computed('args.{selectedRetentionTime,videoRetentionDays}')\n get retentionDropdownValue() {\n return this.args.selectedRetentionTime\n ? this.args.selectedRetentionTime.toString()\n : this.args.videoRetentionDays[0].toString();\n }\n\n /**\n * An array of dropdown select items to display in the dropdown list.\n *\n * @type {Array}\n */\n @computed('intl', 'args.{videoRetentionDays,hasMaxLimit}')\n get retentionDropdownItems() {\n return this.args.videoRetentionDays.map((time) => {\n const fnGetItem = (value, name) => DropdownSelectItem.create({ value, name });\n if (time == UnlimitedRetentionDropdownValue) {\n return fnGetItem(time, this.intl.t('generic.unlimited'));\n }\n\n return fnGetItem(time, this.intl.t('generic.days', { num: time }));\n });\n }\n\n // endregion\n\n // region Bitrate.\n\n /**\n * The toggle state of the smart rate control toggle\n *\n * @type {boolean}\n */\n @tracked selectedSmartRateControl = false;\n\n // endregion\n\n /**\n * Fired when a setting is toggled on or off.\n *\n * @param {number} section The section for which the dropdown was changed.\n * @param {Event} event Event that is passed from SimpleBinary input when toggled\n */\n @action\n onSettingToggled(section, event) {\n const {\n target: { checked: on }\n } = event;\n const action = this.args[VALUE_CHANGE_ACTION];\n let selectedAutomatedRecovery = this.args.selectedAutomatedRecovery;\n let selectedRetentionTime = this.args.selectedRetentionTime;\n let selectedSmartRateControl = this.args.selectedSmartRateControl;\n\n if (section === automatedRecoverySection) {\n selectedAutomatedRecovery = on;\n }\n\n if (section === smartRateControlSection) {\n selectedSmartRateControl = on;\n }\n\n action &&\n action(\n selectedAutomatedRecovery,\n selectedRetentionTime,\n selectedSmartRateControl,\n this.args.currentMaxBitrate\n );\n }\n\n /**\n * Fired when the selected dropdown item changes.\n *\n * @param {number} section The section for which the dropdown was changed.\n * @param {string} value The selected value of the dropdown.\n */\n @action\n onDropdownChanged(section, value) {\n const action = this.args[VALUE_CHANGE_ACTION];\n let selectedRetentionTime = this.args.selectedRetentionTime;\n let currentMaxBitrate = this.args.currentMaxBitrate;\n\n // If the unlimited option selected then the selected retention time will be set to nul\n if (section === retentionSection) {\n selectedRetentionTime = Number(value) == UnlimitedRetentionDropdownValue ? null : Number(value);\n }\n\n if (section === maxBitrateSection) {\n currentMaxBitrate = Number(value);\n }\n\n action &&\n action(\n this.args.selectedAutomatedRecovery,\n selectedRetentionTime,\n this.args.selectedSmartRateControl,\n currentMaxBitrate\n );\n }\n\n /**\n * Fired when the svg-info icon is clicked on.\n *\n * @param {number} section The section where the icon was clicked.\n */\n @action\n showMoreInfoModal(section) {\n const [title, info] = {\n [automatedRecoverySection]: [\n 'automatedRecovery.automatedRecoveryTitleText',\n 'automatedRecovery.automatedRecoveryHelpText'\n ],\n [retentionSection]: ['retention.settingRetentionTime', 'retention.retentionTimeHelpText'],\n [smartRateControlSection]: [\n 'smartRateControl.smartRateControlTitleText',\n 'smartRateControl.smartRateControlHelpText'\n ],\n [maxBitrateSection]: ['bitrate.maxBitrateTitleText', 'bitrate.maxBitrateHelpText']\n }[section] ?? ['', ''];\n\n if (title && info) {\n this.modals.showInfoModal({\n title: this.intl.tc(this, title),\n info: htmlSafe(`

${this.intl.tc(this, info)}

`),\n css: 'more-info'\n });\n }\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-expect-error: controlSmartRateControl doesn\\'t appear to exist on the context, please fix this. }}\\n
\\n\\n \\n \\n\\n \\n {{#let this.schedule as |currentSchedule|}}\\n \\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n
\\n {{#if (or @model.isNew currentSchedule)}}\\n {{#if this.existingSchedulesText}}\\n
\\n \\n\\n \\n \\n \\n
\\n {{/if}}\\n\\n \\n \\n \\n {{/if}}\\n\\n {{#if (and @model.isNew currentSchedule)}}\\n
\\n {{! @glint-expect-error: Please fix the exists template helper types. }}\\n {{#if (exists this.sdCardStatus)}}\\n {{! @glint-expect-error: sdCardStatus.icon can be undefined, please fix this. }}\\n \\n {{concat this.sdCardStatus.text \\' \\' (tc this \\'clickHereToRefresh\\')}}\\n {{else}}\\n \\n

{{tc this \\'checkingSdCard\\'}}

\\n {{/if}}\\n
\\n {{/if}}\\n\\n {{#if currentSchedule}}\\n \\n \\n \\n\\n {{#if this.displayAudioSetting}}\\n \\n
\\n \\n
\\n \\n
\\n
\\n\\n \\n\\n {{#if this.showAudioDisabledWarning}}\\n \\n {{#if (and this.isMobileApp (not this.mobileAppSupportsRedirectingToVsrAudioPage))}}\\n

\\n {{tc this \\'audioDisabledWarningWithoutMobileAccess\\'}}\\n

\\n {{else}}\\n {{!-- template-lint-disable no-invalid-interactive --}}\\n

\\n {{tc this \\'audioDisabledWarning\\' htmlSafe=true}}\\n

\\n {{/if}}\\n \\n {{/if}}\\n
\\n {{/if}}\\n\\n \\n {{! @glint-expect-error: Please convert this component to TS. }}\\n \\n \\n\\n
\\n {{t \\'generic.advancedOptions\\'}}\\n \\n
\\n\\n {{#if this.showAdvancedOptions}}\\n \\n {{! @glint-expect-error: Please convert this component to TS. }}\\n \\n \\n {{/if}}\\n {{/if}}\\n {{!-- Advanced options for limiting the number of recorded days. --}}\\n\\n
\\n {{#if this.showSvrRecordingAlert}}\\n
\\n \\n

{{tc this \\'disabledSVRSettingsMsg\\' htmlSafe=true}}

\\n
\\n {{/if}}\\n\\n \\n
\\n\\n {{/let}}\\n
\\n\\n \\n
\",{ moduleName: \"customer-site/video/schedules/onboard/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data}}\\n \\n {{/if}}\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/schedules/svr/edit/template.hbs\" })","import { helper } from '@ember/component/helper';\n\nexport interface SubtractSignature {\n Args: {\n Positional: number[];\n };\n Return: number;\n}\n\nexport function subtract(numbers: SubtractSignature['Args']['Positional']): SubtractSignature['Return'] {\n return numbers.reduce((a, b) => Number(a) - Number(b));\n}\n\nexport default helper(subtract);\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n subtract: typeof subtract;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n \\n \\n

{{tc this \\'svrSelect\\'}}

\\n {{#each data.svrDevices as |svr|}}\\n {{#if svr.hasDdnsed}}\\n \\n {{else}}\\n \\n {{/if}}\\n {{/each}}\\n
\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/schedules/svr/select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n {{#if this.shouldDisplaySettingsPagesLinksCard}}\\n \\n {{#if this.shouldDisplayRecordingRulesLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.shouldDisplayStreamVideoToPanelLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.shouldDisplayCameraGroupsLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.shouldDisplayIntercomLink}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n \\n
\\n
{{t \\'generic.video.videoDevices\\'}}
\\n \\n
\\n \\n
\\n {{#if (eq resolvedAllVideoDevices.length 0)}}\\n {{t \\'generic.video.noCameras\\'}}\\n {{else}}\\n {{#each resolvedAllVideoDevices as |videoDevice|}}\\n
\\n \\n <:content>\\n
\\n \\n {{videoDevice.description}}\\n
\\n \\n \\n
\\n {{/each}}\\n {{/if}}\\n
\\n \\n
\\n \\n
\\n \\n\",{ moduleName: \"customer-site/video/settings-overview/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{#if this.isCameraLinkSectionVisible}}\\n \\n \\n {{/if}}\\n\\n

\\n {{tc this \\'cameraCredentialsDescription\\'}}\\n

\\n\\n
\\n \\n
\\n \\n
\\n \\n
\\n \\n
\\n
\\n\\n\\n{{#if this.canEditSomeDeviceCapability}}\\n \\n {{#if this.canUserEditHasMicrophoneSettings}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.canUserEditHasSpeakerSetting}}\\n
\\n \\n
\\n {{/if}}\\n {{#if @camera.has3PCPTZSupport}}\\n
\\n \\n
\\n
\\n \\n
\\n {{/if}}\\n {{#if @canToggleDewarping}}\\n
\\n \\n
\\n {{/if}}\\n
\\n \\n
\\n
\\n\\n \\n \\n \\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/advanced-setup-page/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { task } from 'ember-concurrency';\nimport { InsufficientPermission, ResponseFailed } from 'customer-site/enums/OnvifSettingError';\nimport { intlPath } from '@adc/i18n/path';\nimport DataUsageModeEnum from '@adc/video-player/enums/DataUsageModeEnum';\n\nimport './_style.scss';\nimport type { NativeButtonType } from '@adc/ui-components/components/button/native';\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type CameraLinkInfo from 'customer-site/models/video/camera-link-info';\nimport type CameraPassword from 'customer-site/models/video/camera-password';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type AdvancedSetupController from 'customer-site/video/settings/advanced-setup/controller';\nimport type { TaskInstance } from 'ember-concurrency';\n\n/**\n * Default password for when the camera's password is unknown.\n */\nconst DefaultPassword = '••••••••' as const;\n\ninterface AdvancedSetupPageArgs {\n canToggleDewarping: VideoSettingsPermission['canToggleDewarping'];\n camera: Camera;\n cameraLinkError: CameraLinkInfo['cameraLinkError'];\n cameraLinkUrl: CameraLinkInfo['cameraLinkUrl'];\n disposeNativeButtons?: (buttons: string[]) => void;\n hasAudioAddOnAndAcceptedAgreement: VideoSettingsPermission['hasAudioAddOnAndAcceptedAgreement'];\n hasThirdPartyCameraTwoWayAudio: VideoSettingsPermission['hasThirdPartyCameraTwoWayAudio'];\n passwordError: CameraPassword['error'];\n passwordValue: CameraPassword['value'];\n supportsCameraLink: CameraLinkInfo['supportsCameraLink'];\n updateNativeToolbarButtons?: (buttons: NativeButtonType[]) => void;\n updateOrRollbackModels: AdvancedSetupController['updateOrRollbackModels'];\n}\n\n/**\n * The Advanced Setup Settings page.\n */\n@intlPath({ path: 'video/settings/advanced-setup-page' })\nexport default class AdvancedSetupPage extends Component {\n //#region Services\n @service declare store: ServiceRegistry['store'];\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare notificationManager: ServiceRegistry['notification-manager'];\n //#endregion Services\n\n //#region Properties\n\n /**\n * Returns the password\n */\n get password(): string {\n return this.args.passwordValue || DefaultPassword;\n }\n\n /**\n * Is the Camera Link section visible?\n */\n get isCameraLinkSectionVisible(): boolean {\n const { supportsCameraLink, cameraLinkError } = this.args;\n return supportsCameraLink && cameraLinkError !== InsufficientPermission;\n }\n\n /**\n * Is the microphone toggle visible?\n */\n get canUserEditHasMicrophoneSettings(): boolean {\n return this.args.hasAudioAddOnAndAcceptedAgreement;\n }\n\n /**\n * Is the speaker toggle visible?\n */\n get canUserEditHasSpeakerSetting(): boolean {\n return (\n this.args.hasAudioAddOnAndAcceptedAgreement &&\n this.args.hasThirdPartyCameraTwoWayAudio &&\n this.args.camera.svrSupportsTwoWayAudioTalkdown\n );\n }\n\n /**\n * Does the user have some device capability that they can edit?\n */\n get canEditSomeDeviceCapability(): boolean {\n return (\n this.args.canToggleDewarping || this.canUserEditHasMicrophoneSettings || this.canUserEditHasSpeakerSetting\n );\n }\n\n //#endregion Properties\n\n //#region Actions\n\n /**\n * If the user does not have permission to view it, add a toast error message.\n */\n @action\n warnUser(): void {\n if (this.args.passwordError === InsufficientPermission) {\n this.notificationManager.addError(this.intl.tc(this, 'cannotViewPassword'));\n }\n }\n\n /**\n * Notifies the user if the camera link error was a failure.\n */\n @action\n warnForFailedCameraLinkResponse(): void {\n if (this.args.cameraLinkError === ResponseFailed) {\n this.notificationManager.addError(this.intl.t('generic.video.cameraLinkResponseFailed'));\n }\n }\n\n /**\n * Saves the device capabilities if updated.\n */\n @action\n saveDeviceCapabilities(camera: Camera): void | TaskInstance {\n // Return if nothing has been updated.\n if (!camera.hasDirtyAttributes) {\n // This return isn't PromiseLike, so it's able to avoid the 's async interaction.\n return;\n }\n\n return this.handleSavingDeviceCapabilities.perform(camera);\n }\n\n /**\n * Links the user to the camera's internal web page if it is allowed.\n */\n @action\n clickCameraInternalPage(): void {\n if (this.args.camera.dataUsageMode == DataUsageModeEnum.CriticalDataMode) {\n this.notificationManager.addError(this.intl.t('generic.video.errorConnectDataLimited'));\n } else {\n window.open(this.args.cameraLinkUrl, '_blank');\n }\n }\n\n //#endregion Actions\n\n //#region Tasks\n\n /**\n * (A drop task that) handles saving the device capability settings.\n */\n handleSavingDeviceCapabilities = task({ drop: true }, async (camera: Camera): Promise => {\n // No need to wrap with try-catch, since we were just throwing in the catch block.\n await this.args.updateOrRollbackModels(camera);\n });\n\n //#endregion Tasks\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::AdvancedSetupPage': typeof AdvancedSetupPage;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n \\n \\n\\n <:no-results as |PageViewNoResults|>\\n \\n \\n\\n <:error as |PageViewError|>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/advanced-setup/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/battery-motion-sensitivity-settings/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/battery-status/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n \\n
\\n {{tc this \\'settingDescription\\'}}\\n
\\n\\n {{#if this.supportsLight}}\\n
\\n \\n
\\n {{tc this \\'lightAlertSectionDescription\\'}}\\n
\\n
\\n
\\n
{{t \\\"generic.brightness\\\"}}
\\n
\\n \\n \\n \\n
\\n
\\n
\\n {{t \\'generic.video.settings.perimeter-guard-rule.lightOptions\\'}}\\n \\n
\\n {{/if}}\\n\\n
\\n \\n
\\n {{tc this \\'audioAlertSectionDescription\\'}}\\n
\\n
\\n
\\n
{{t \\'generic.video.volume\\'}}
\\n
\\n \\n \\n \\n
\\n
\\n {{#if this.shouldShowAudioDropdown}}\\n
\\n {{t \\'generic.video.settings.perimeter-guard-rule.sound\\'}}\\n \\n
\\n {{/if}}\\n \\n \\n \\n \\n\\n \\n
\\n \\n

{{tc this \\'disabledAudioSettingsDescription\\'}}

\\n
\\n
\\n \\n
\\n \\n
\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/alerts/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n {{#if this.shouldDisplayCameraAudioCard}}\\n \\n
\\n {{#if this.shouldDisplayMicrophoneSpeakerFeature}}\\n
\\n \\n
{{this.microphoneSpeakerDescription}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayAudioRecordingToggle}}\\n
\\n \\n
{{tc this \\'audioRecordingDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayCallVolumeFeature}}\\n
\\n
{{tc this \\'callVolumeTitle\\'}}
\\n
{{tc this \\'callVolumeDescription\\'}}
\\n
\\n \\n \\n \\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayNoiseFilteringToggle}}\\n
\\n \\n
{{tc this \\'noiseFilterDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayMicrophoneGainFeature}}\\n
\\n
{{tc this \\'microphoneGainTitle\\'}}
\\n
{{tc this \\'microphoneGainDescription\\'}}
\\n \\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayIndoorChimeCard}}\\n \\n
\\n {{#if this.shouldDisplayIndoorChimeToggleFeature}}\\n
\\n \\n
{{tc this \\'indoorChimeDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayIndoorChimeTypeFeature}}\\n
\\n
{{tc this \\'chimeTypeTitle\\'}}
\\n \\n
{{tc this \\'chimeTypeDescription\\'}}
\\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayOutdoorToneCard}}\\n \\n
\\n {{#if this.shouldDisplayOutdoorToneToggleFeature}}\\n
\\n \\n
{{tc this \\'outdoorToneDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayOutdoorToneVolume}}\\n
\\n
{{tc this \\'outdoorToneVolumeTitle\\'}}
\\n
{{tc this \\'outdoorToneVolumeDescription\\'}}
\\n \\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySmartChimeSettingsLink}}\\n \\n
\\n \\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySaveButton}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/audio/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n <:value>\\n \\n \\n \\n \\n \\n \\n

{{tc this \\'actionSheetDescription1\\'}}

\\n

{{tc this \\'actionSheetDescription2\\'}}

\\n
\\n {{#if this.shouldDisplayKnowledgeBaseLink}}\\n \\n {{/if}}\\n \\n
\\n \\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n \\n\\n \\n\",{ moduleName: \"customer-site/video/settings/camera/device-status/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data}}\\n \\n
\\n \\n
{{tc this \\'firmwareDescription\\'}}
\\n
\\n
\\n \\n
\\n \\n
\\n
\\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/general/firmware/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/action-sheets/video/led-color-picker/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, set } from '@ember/object';\nimport { next } from '@ember/runloop';\nimport { isEmpty } from '@ember/utils';\nimport { hslToHex, hexToHSL } from '@adc/ui-components/utils/color-pickers/color';\n\nimport type { Color, Hue, Lightness, Saturation } from '@adc/ui-components/utils/color-pickers/color';\nimport './_style.scss';\nimport type { ActionSheetSignature } from '@adc/ui-components/components/action-sheet';\nimport type { AnalogousPickerSignature } from '@adc/ui-components/components/color-pickers/analogous-picker';\n\ntype ActionSheetArgs = ActionSheetSignature['Args'];\ntype AnalogousPickerArgs = AnalogousPickerSignature['Args'];\n\ninterface ActionSheetsVideoLedColorPickerArgs\n extends Pick,\n Pick {\n hue?: Hue;\n saturation?: Saturation;\n lightness?: Lightness;\n baseHue?: Hue;\n previousColorHex: string;\n onClose: () => void;\n onSaveColor: (color: string) => void;\n}\n\n/**\n * Validates that the base hue value is within range of the currently selected hue, and updates if it isn't.\n */\nfunction validateBaseHue(this: ActionSheetsVideoLedColorPicker, hue: Hue): void {\n // Hue range constants\n const HUE_RANGE = 60,\n MIN_HUE_LOWER_BOUND = 0,\n MAX_HUE_UPPER_BOUND = 360;\n\n let { baseHue } = this.args;\n if (baseHue && !isEmpty(baseHue)) {\n let minHue = hue - HUE_RANGE,\n maxHue = hue + HUE_RANGE,\n isOutOfRange;\n\n minHue = minHue < MIN_HUE_LOWER_BOUND ? MAX_HUE_UPPER_BOUND + minHue : minHue;\n maxHue = maxHue > MAX_HUE_UPPER_BOUND ? MAX_HUE_UPPER_BOUND - maxHue : maxHue;\n\n if (minHue < maxHue) {\n isOutOfRange = baseHue <= minHue || baseHue >= maxHue;\n } else {\n isOutOfRange = baseHue <= minHue && baseHue > maxHue;\n }\n\n if (isOutOfRange) {\n baseHue = hue;\n }\n } else {\n baseHue = hue;\n }\n\n // Do not copy this deprecated usage. If you see this, please convert to ember-lifeline runTask.\n // eslint-disable-next-line ember/no-runloop\n next(this, () => set(this, 'baseHue', baseHue));\n}\n\nexport default class ActionSheetsVideoLedColorPicker extends Component {\n // region Passed properties\n /**\n * The current hue (for RGB light format).\n */\n get hue(): Hue {\n return this.args.hue ?? 0;\n }\n\n /**\n * The current saturation (for RGB light format).\n */\n get saturation(): Saturation {\n return this.args.saturation ?? 0;\n }\n\n /**\n * The current lightness (for RGB light format).\n */\n get lightness(): Lightness {\n return this.args.lightness ?? 50;\n }\n // endregion\n\n /**\n * The hue this range of colors will be based on.\n */\n @tracked selectedHue: Hue | undefined;\n get baseHue(): Hue | undefined {\n return this.selectedHue ?? this.args.baseHue;\n }\n set baseHue(newHue: Hue | undefined) {\n this.selectedHue = newHue;\n }\n\n /**\n * Validates the base hue property.\n */\n @action validateBaseHue(): void {\n validateBaseHue.call(this, this.hue);\n }\n\n /**\n * Changes the selected HSL color.\n */\n @action changeHSLColor(hslColor: Color): void {\n const { baseHue, ...cleanHslColor } = hslColor;\n // Did base hue change?\n if (!isEmpty(baseHue)) {\n set(this, 'baseHue', baseHue);\n }\n\n this.args.onSaveColor(hslToHex(cleanHslColor));\n }\n\n /**\n * Reset the color picker to the previously selected color when the user cancels or close the modal. THen close the modal.\n */\n @action closeColorPicker(): void {\n // Reset to selected color to the previous selected color hex\n if (!isEmpty(this.args.previousColorHex)) {\n this.changeHSLColor(hexToHSL(this.args.previousColorHex));\n this.validateBaseHue();\n }\n this.args.onClose();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'ActionSheets::Video::LedColorPicker': typeof ActionSheetsVideoLedColorPicker;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n
\\n \\n {{#if this.shouldDisplayFirmwareVersionRow}}\\n \\n {{/if}}\\n
\\n
\\n {{! @glint-expect-error: videoSettingsPermission is typed as a string, please fix this. }}\\n {{#if (and this.svrStorageInformationItems this.videoSettingsPermission.hasVideoSettingsUpgrades)}}\\n \\n
\\n {{! @glint-expect-error: The svrStorageInformationItems property can be undefined, please fix this. }}\\n \\n
\\n \\n {{/if}}\\n\\n {{#if this.shouldDisplayPanelNotificationToggleFeature}}\\n \\n {{#if this.isMotionNotificationsEnabled}}\\n
\\n \\n
{{tc this \\'panelMotionNotificationDescription\\'}}
\\n
\\n {{/if}}\\n
\\n \\n
{{tc this \\'panelButtonPressNotificationDescription\\'}}
\\n
\\n
\\n {{/if}}\\n\\n {{#if this.shouldDisplaySmartChimeNotificationFeature}}\\n \\n
\\n
\\n {{tc this \\'smartChimeNotification\\'}}\\n \\n
\\n
{{tc this \\'smartChimeNotificationDescription\\'}}
\\n
\\n
\\n {{/if}}\\n\\n {{#if this.shouldDisplayLedLightFeature}}\\n \\n {{#if this.canTurnOnOffLedLight}}\\n
\\n
\\n {{t \\'generic.video.statusLed\\'}}\\n \\n
\\n
{{tc this \\'ledLightSettingDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.canChangeLedBrightness}}\\n
\\n {{t \\'generic.video.ledBrightness\\'}}\\n
\\n \\n \\n \\n
\\n
\\n {{/if}}\\n {{#if this.canChangeLedColor}}\\n
\\n
\\n {{tc this \\'doorbellLedColor\\'}}\\n \\n
\\n
{{tc this \\'doorbellLedColorDescription\\'}}
\\n
\\n {{/if}}\\n
\\n {{/if}}\\n\\n {{#if this.shouldDisplayWedgeFeature}}\\n \\n
\\n
\\n {{this.wedgeText.title}}\\n \\n
\\n
{{this.wedgeText.description}}
\\n
\\n
\\n {{/if}}\\n\\n {{#if this.shouldDisplaySaveButton}}\\n \\n \\n \\n {{/if}}\\n\\n \\n
\\n\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/general/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/settings/camera/general/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.showTabs}}\\n
\\n {{#each this.tabs as |tab|}}\\n \\n {{/each}}\\n
\\n {{/if}}\\n\\n
\\n {{#each this.displayImages as |image index|}}\\n \\n {{/each}}\\n
\\n\\n \\n
\",{ moduleName: \"customer-site/components/video/settings/image-multi-select/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nimport './_style.scss';\n\nexport type ImageDataRecord = Record;\n\nexport interface ImageMultiSelectSignature {\n Args: {\n /** The maximum number of images to be displayed. If null, there is no limit for how many images can be displayed. */\n maxImages?: number;\n /** Key should be the name of the tab denoting this \"Batch\" of images (i.e. \"Day\" or \"Night\").\n Value should be a list of objects containing image URLs and their alts to display when the corresponding tab is selected. */\n imageData: ImageDataRecord;\n /** Show the tab header when there is only one tab. If there is more than 1 key in ImageData, then tabs will always be shown. Defaults to false if null. */\n showSingleTab?: boolean;\n /** Takes in the tracked selectedImage property and performs the passed-in action using that image URL. */\n saveAction: (selectedImage: number) => void;\n /** Performs a passed in cancel action if necessary (i.e. close a modal or Action Sheet). If null, cancel button will not appear. */\n cancelAction?: () => void;\n };\n}\n\nexport default class ImageMultiSelect extends Component {\n /**\n * The currently selected tab, corresponding to a key in imageData.\n */\n @tracked selectedTab = Object.keys(this.args.imageData)[0];\n\n /**\n * The currently selected image. If null, no image is selected.\n */\n @tracked selectedImage: number | null = null;\n\n /**\n * Returns a the list of tabs based on the keys in imageData.\n */\n get tabs(): string[] {\n return Object.keys(this.args.imageData);\n }\n\n /**\n * Returns true if there is more than 1 tab OR if there is only 1 tab and showSingleTab is true.\n */\n get showTabs(): boolean {\n return this.tabs.length > 1 || !!this.args.showSingleTab;\n }\n\n /**\n * Returns a list of images to be displayed on the selected tab.\n */\n get displayImages(): { url: string; alt: string }[] {\n const images = this.args.imageData[this.selectedTab];\n const maxImages = this.args.maxImages ?? images.length;\n return images.slice(0, maxImages);\n }\n\n /**\n * Sets selectedImage to a given image.\n * @param index The index of the image to be selected for the current key in imageData.\n */\n @action\n selectImage(index: number): void {\n this.selectedImage = this.selectedImage === index ? null : index;\n }\n\n /**\n * Executes saveAction when the save button is clicked.\n */\n @action\n saveSelection(): void {\n if (this.args.saveAction && this.selectedImage != null) {\n this.args.saveAction(this.selectedImage);\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::ImageMultiSelect': typeof ImageMultiSelect;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if @isLoading}}\\n \\n{{else}}\\n \\n
\\n {{#if this.isUsingEthernetConnection}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n

{{this.signalStrengthString}}

\\n

{{this.signalStrengthItemSubtext}}

\\n
\\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/signal-strength-info-item/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { service } from '@ember/service';\nimport ConnectionStatus from 'customer-site/enums/ConnectionStatus';\nimport { Unknown } from 'customer-site/enums/SignalStrength';\nimport { convertDateToString } from 'customer-site/utils/datetime';\nimport { getWifiSignalStrengthString } from 'customer-site/utils/device-wifi';\n\nimport type { SignalStrength } from 'customer-site/enums/SignalStrength';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type SignalStrengthInfo from 'customer-site/models/video/signal-strength-info';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface SignalStrengthInfoItemSignature {\n Args: {\n signalStrengthInfoModel?: SignalStrengthInfo;\n handleEthernetConnection: (isUsingEthernet: boolean) => void;\n isLoading: boolean;\n };\n}\n\n/**\n * Component for displaying the signal strength information.\n */\nexport default class SignalStrengthInfoItem extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n /**\n * If the device is currently using ethernet connection\n */\n @equal('args.signalStrengthInfoModel.connectionType', ConnectionStatus.Remembered)\n declare isUsingEthernetConnection: boolean;\n\n /**\n * Returns the signal strength enum.\n */\n get signalStrengthEnum(): SignalStrength {\n if (!this.args.signalStrengthInfoModel) {\n return Unknown;\n }\n return this.args.signalStrengthInfoModel.signalStrengthEnum;\n }\n\n /**\n * Returns the subtext for the signal strength item. Either Unknown, Request Failed, or the last updated date.\n */\n get signalStrengthItemSubtext(): string {\n const { intl, args, isUsingEthernetConnection } = this,\n { signalStrengthInfoModel } = args,\n { lastUpdatedDate } = signalStrengthInfoModel || {};\n\n if (!signalStrengthInfoModel) {\n return intl.t('generic.unknown');\n }\n\n if (isUsingEthernetConnection) {\n return intl.t('generic.wifi.wifiInfoNotAvailable');\n }\n\n return signalStrengthInfoModel.signalStrengthEnum === Unknown || !lastUpdatedDate\n ? intl.t('generic.requestFailedPleaseTryAgain')\n : convertDateToString(intl, lastUpdatedDate, true);\n }\n\n /**\n * Returns the signal strength string.\n */\n get signalStrengthString(): string {\n const { intl, args } = this,\n { signalStrengthInfoModel } = args;\n\n if (!signalStrengthInfoModel) {\n return intl.t('generic.unknown');\n }\n\n if (this.isUsingEthernetConnection) {\n return intl.t('generic.wifi.ethernet');\n }\n\n return getWifiSignalStrengthString(\n signalStrengthInfoModel.signalStrengthEnum,\n signalStrengthInfoModel.normalizedSignalStrength,\n intl\n );\n }\n\n /**\n * Handles the ethernet connection case by updating the connection type.\n */\n @action\n handleEthernetConnectionChange(): void {\n if (this.isUsingEthernetConnection) {\n this.args.handleEthernetConnection(this.isUsingEthernetConnection);\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::SignalStrengthInfoItem': typeof SignalStrengthInfoItem;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n \\n \\n \\n {{#if imgData.isReferenceSnapshot}}\\n {{coalesce\\n {{else}}\\n \\n {{/if}}\\n {{#if this.hasFovHealthChecks}}\\n \\n {{/if}}\\n {{#if this.shouldDisplayUpdateReferenceSnapshot}}\\n \\n

\\n {{(tc this \\\"chooseFovPhotoDescription\\\")}}\\n

\\n \\n \\n {{/if}}\\n
\\n
\\n
{{coalesce device.description \\'\\'}}
\\n {{#if device.canChangeCameraName}}\\n \\n {{/if}}\\n
\\n
\\n

{{tc this \\'modelWithModelName\\' modelName=device.deviceModel}}

\\n

{{tc this \\'macWithMacAddress\\' macAddress=device.macAddress}}

\\n
\\n
\\n
\\n \\n \\n \\n <:content>\\n \\n \\n \\n \\n {{#if (await this.shouldDisplaySignalStrengthInfoCard)}}\\n \\n \\n <:content>\\n \\n \\n \\n \\n {{/if}}\\n \\n \\n {{#each (await this.navigationItems) as |item|}}\\n \\n {{/each}}\\n \\n {{#if (await this.shouldDisplayAutomationNavigation)}}\\n \\n {{#each (await this.automationNavigationItems) as |item|}}\\n \\n {{/each}}\\n \\n {{/if}}\\n {{#if (await this.deviceManagementNavigationItems)}}\\n \\n {{#each (await this.deviceManagementNavigationItems) as |item|}}\\n \\n {{/each}}\\n \\n {{/if}}\\n {{#if (await this.connectedDevicesNavigationItems)}}\\n \\n {{#each (await this.connectedDevicesNavigationItems) as |item|}}\\n \\n {{/each}}\\n \\n {{/if}}\\n \\n \\n \\n \\n \\n \\n \\n <:default>\\n {{#each (await this.deletionMessages) as |message|}}\\n

{{message}}

\\n {{/each}}\\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n\",{ moduleName: \"customer-site/video/settings/camera/lights-overview/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data}}\\n {{#if this.shouldShowCurrentNetworkCard}}\\n \\n {{! @glint-expect-error: networkInfoDetails can be undefined, please fix this. }}\\n \\n \\n <:value>\\n
\\n {{#if item.props.isEncrypted}}\\n \\n {{/if}}\\n \\n \\n
\\n \\n
\\n
\\n
\\n {{/if}}\\n {{#if this.shouldShowChangeNetworkButton}}\\n \\n \\n \\n {{/if}}\\n \\n {{#if this.isLoadingSignalStrengthInfo}}\\n \\n {{else}}\\n \\n {{/if}}\\n \\n {{#if\\n (and\\n this.shouldDisplayAdvancedNetworkSetupLink\\n this.videoSettingsPermission.hasVideoSettingsUpgrades\\n )\\n }}\\n \\n \\n \\n {{/if}}\\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/network-info/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/settings/camera/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n {{#if this.shouldDisplayClipLengthCard}}\\n \\n {{#if this.shouldDisplayAlarmClipsDurationDropdown}}\\n
\\n {{tc this \\'alarmClipLengthTitle\\'}}\\n {{#if this.shouldDisplayAlarmClipsDurationWarningMessage}}\\n
{{await this.alarmClipsDurationWarningMessage}}
\\n {{/if}}\\n \\n
{{tc this \\'alarmClipLengthDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayCameraTriggeredClipsSetting}}\\n
\\n {{tc this \\'cameraTriggeredClipLengthTitle\\'}}\\n {{#if this.shouldDisplayCameraTriggeredClipsDropdown}}\\n \\n {{else}}\\n
\\n
{{this.selectedCameraTriggeredClipsDurationText}}
\\n
\\n {{/if}}\\n
{{tc this (if this.savedVideoSetting.useFixedClipDurationLayout \\'fixedCameraTriggeredClipLengthDescription\\' \\'cameraTriggeredClipLengthDescription\\')}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayEventTriggeredClipsSetting}}\\n
\\n {{tc this \\'eventTriggeredClipLengthTitle\\'}}\\n
\\n
{{this.eventTriggeredClipLengthText}}
\\n
\\n
{{this.eventTriggeredClipLengthDescription}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayPreTriggerRecordingSetting}}\\n
\\n {{#if this.savedVideoSetting.useFixedClipDurationLayout}}\\n {{tc this \\'fixedPreTriggerTitle\\'}}\\n
\\n {{#each this.getPreTriggerDurations as |item|}}\\n
{{item}}
\\n {{/each}}\\n
\\n {{else}}\\n \\n {{/if}}\\n
{{tc this (if this.savedVideoSetting.useFixedClipDurationLayout \\'fixedPreTriggerRecordingDescription\\' \\'preTriggerRecordingDescription\\')}}
\\n
\\n {{/if}}\\n
\\n {{/if}}\\n\\n {{#if this.shouldDisplaySaveButton}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/clip-length/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n {{#if this.shouldDisplayClipQualityCard}}\\n \\n
\\n {{tc this \\'clipQualityTitle\\'}}\\n
{{tc this \\'clipQualityDescription\\'}}
\\n \\n
\\n {{item.label}}\\n {{!-- @glint-expect-error content can be undefined, please fix this. --}}\\n

{{item.props.content}}

\\n
\\n \\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayClipFrameRateCard}}\\n \\n
\\n {{t \\'generic.video.frameRate\\'}}\\n {{#if this.shouldDisplayClipFrameRateDropdown}}\\n \\n {{else}}\\n \\n {{/if}}\\n
{{tc this \\'frameRateDescription\\'}}
\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySaveButton}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/clip-quality/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default as |data|>\\n {{#if data}}\\n {{! iOS doens\\'t support webRTC yet so we use snapshots for mobile/mobiletech }}\\n {{#if this.shouldUseSnapshots}}\\n
\\n {{#if this.firstSnapshotImageLoading}}\\n \\n {{/if}}\\n \\n
\\n {{else}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n {{/if}}\\n \\n

{{tc this \\'fovInstructions\\'}}

\\n
\\n \\n {{!-- @glint-expect-error icon can be undefined, please fix this. --}}\\n \\n

{{fovOption.label}}

\\n \\n
\\n
\\n\\n {{#if (await this.hasOvRules)}}\\n \\n \\n \\n {{/if}}\\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n <:no-results as |PageViewNoResults|>\\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/digital-fov/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{@title}}\\n {{#if @description}}\\n {{@description}}\\n {{/if}}\\n
\\n

{{@leftLabel}}

\\n

{{@rightLabel}}

\\n
\\n \\n
\",{ moduleName: \"customer-site/components/ui/slider-with-labels/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { SliderAdcSignature } from '@adc/ui-components/components/slider-adc';\n\ntype SliderAdcArgs = SliderAdcSignature['Args'];\n\nexport interface UiSliderWithLabelsSignature {\n Args: Pick & {\n title: string;\n description?: string;\n leftLabel: string;\n rightLabel: string;\n disableSlider?: SliderAdcArgs['disabled'];\n };\n}\n\nconst UiSliderWithLabels = templateOnlyComponent();\nexport default UiSliderWithLabels;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::SliderWithLabels': typeof UiSliderWithLabels;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data}}\\n
\\n \\n
\\n {{#if this.shouldDisplayImageOrientationCard}}\\n \\n {{#if this.imageSetting.canFlipImage}}\\n
\\n \\n {{tc this \\'imageOrientationDescription\\'}}\\n
\\n {{/if}}\\n {{#if this.imageSetting.canSetWebOsd}}\\n
\\n \\n {{tc this \\'onscreenDisplayDescription\\'}}\\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayAdvancedImageSettingsCard}}\\n \\n {{#if this.infraredSetting.canControlInfraredLeds}}\\n
\\n \\n {{tc this \\'infraredLedDescription\\'}}\\n
\\n {{/if}}\\n {{#if this.infraredSetting.canControlNightVision}}\\n
\\n \\n {{tc this \\'nightVisionDescription\\'}}\\n
\\n {{/if}}\\n {{#if this.infraredSetting.canControlInfraredSensitivity}}\\n
\\n {{tc this \\'nightVisionSensitivity\\'}}\\n \\n {{tc this \\'nightVisionSensitivityDescription\\'}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayHdrToggle}}\\n
\\n \\n {{tc this \\'highDynamicRangeDescription\\'}}\\n
\\n {{/if}}\\n {{#if this.imageSetting.canSetMaxExposure}}\\n
\\n {{tc this \\'maxExposure\\'}}\\n \\n {{tc this \\'maxExposureDescription\\' htmlSafe=true}}\\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldShowImageQualityCard}}\\n \\n {{#if this.imageSetting.canSetBrightness}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.imageSetting.canSetContrast}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.imageSetting.canSetSharpness}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.imageSetting.canSetSaturation}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayUpdateSettingsButtons}}\\n {{#if this.isMobileApp}}\\n
\\n \\n
\\n {{/if}}\\n \\n \\n \\n {{/if}}\\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/image-settings/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n {{#if this.videoConfig.shouldDisplayBatteryLevel}}\\n \\n
\\n \\n {{t \\'generic.batteryPercentage\\'}}\\n \\n \\n <:content>\\n
\\n

{{this.lastBatteryStateUpdateDateLocal}}

\\n
\\n\\n {{#if this.shouldDisplayBatteryIconAndLink}}\\n \\n {{/if}}\\n

{{t \\'generic.valuePercent\\' value=this.videoConfig.batteryLevel}}

\\n \\n \\n \\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayCalibrateCameraAndSdCardInfoCard}}\\n \\n {{#if this.videoConfig.shouldDisplayCalibrateCameraLink}}\\n
\\n \\n <:content>\\n
\\n
{{tc this \\'calibrateVideoDeviceTitle\\'}}
\\n
\\n\\n {{#if (await this.wasCalibrationSuccessful)}}\\n \\n {{else}}\\n \\n {{/if}}\\n\\n \\n \\n
\\n {{/if}}\\n {{#if this.videoConfig.shouldDisplaySdCardInfoLink}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayLiveVideoCard}}\\n \\n {{#if this.webOptionsItems.length}}\\n
\\n \\n {{!-- @glint-expect-error The isResolutionNotSupported property doesn\\'t seem to exist, please fix this. --}}\\n {{if this.isResolutionNotSupported (tc this \\'liveVideoQuality\\') (tc this \\'liveVideoResolution\\')}}\\n \\n {{#if this.liveVideoConfig.shouldDisplayWebOptionsDisabledMessage}}\\n
{{tc this \\'disabledWebOptionsDueToClipsMessage\\'}}
\\n {{/if}}\\n \\n
\\n {{item.label}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.mobileOptionsItems.length}}\\n
\\n {{tc this \\'liveVideoResolutionMobile\\'}}\\n \\n
\\n {{item.label}}\\n {{!-- @glint-expect-error There is no content property, please fix this. --}}\\n

{{item.props.content}}

\\n
\\n \\n
\\n {{/if}}\\n {{#if this.videoConfig.shouldDisplayImageSettingsLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.videoConfig.shouldDisplayThirdPartyStreamLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if (and this.videoConfig.shouldDisplayFovLink this.hasVideoSettingsUpgradesPermissions)}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.videoConfig.shouldDisplayPrivacyZonesLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.videoConfig.shouldDisplayMotionConfigurationLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.shouldDisplayFamiliarSubjectLink}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayDoorbellVideoQualityOptions}}\\n \\n
\\n {{tc this \\'videoResolutionAndQualityTitle\\'}}\\n \\n
\\n {{item.label}}\\n {{!-- @glint-expect-error I think this type needs to be fix in the button list component. --}}\\n

{{item.props.content}}

\\n
\\n \\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySkybellMotionSettingsCard}}\\n \\n {{#if this.shouldDisplayMotionDetectionOptions}}\\n
\\n
\\n {{tc this \\'motionDetectionTitle\\'}}\\n \\n
\\n
{{tc this \\'motionDetectionDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayMotionThresholdSlider}}\\n
\\n
{{tc this \\'motionThresholdTitle\\'}}
\\n
{{tc this \\'motionThresholdDescription\\'}}
\\n
\\n

{{this.motionThresholdTickText.minText}}

\\n

{{this.motionThresholdTickText.maxText}}

\\n
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayClipSettingsCard}}\\n \\n
\\n {{#if this.shouldDisplayClipResolutionDropdown}}\\n
\\n
{{tc this \\'clipResolutionTitle\\'}}
\\n {{#if this.savedVideoSetting.shouldDisplayDisabledClipResolutionMessage}}\\n
{{tc this \\'disabledClipSettingsMessage\\'}}
\\n {{else}}\\n \\n
{{tc this \\'clipResolutionDescription\\'}}
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayClipQualitySettingsLink}}\\n
\\n \\n
\\n {{/if}}\\n {{#if this.shouldDisplayClipLengthSettingsLink}}\\n
\\n \\n
\\n {{/if}}\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySavedClipsCard}}\\n \\n {{#if this.shouldDisplayKeepClipsForFeature}}\\n
\\n {{tc this \\'keepClipsFor\\'}}\\n \\n
{{tc this \\'keepClipsForDescription\\'}}
\\n
{{tc this \\'keepClipsForDescription2\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayDonateClips}}\\n
\\n \\n\\n
{{tc this \\'donateVideoClipsDescription\\'}}
\\n\\n {{#if this.isDonateClipsEnabled}}\\n
\\n
{{tc this \\'donateVideoClipComments\\'}}
\\n
\\n \\n\\n \\n\\n\\n \\n\\n
\\n \\n
\\n \\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayDonateImages}}\\n
\\n \\n
{{tc this \\'donateImagesDescription\\'}}
\\n\\n {{tc this \\'calibrationImageInfo\\'}}\\n \\n {{tc\\n {{tc this \\'calibrationImageDescription\\'}}\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if (and this.pirVideoConfig this.shouldDisplayPirSettingsCard)}}\\n \\n {{#if this.shouldDisplayMotionLedToggle}}\\n
\\n \\n
{{tc this \\'motionLedDescription\\'}}
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayPirMotionSensitivitySlider}}\\n
\\n
{{tc this \\'pirMotionSensitivityTitle\\'}}
\\n
{{tc this \\'pirMotionSensitivityDescription\\'}}
\\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n {{#if this.shouldDisplayLiveVideoConnectionFeature}}\\n \\n
\\n
\\n \\n
{{tc this \\'liveVideoConnectionDescription\\'}}
\\n
\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplayDirectStreamingToggle}}\\n \\n
\\n
\\n \\n
{{tc this \\'directStreamingDescription\\'}}
\\n
\\n
\\n
\\n {{/if}}\\n {{#if this.shouldDisplaySaveButton}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n
\\n\",{ moduleName: \"customer-site/video/settings/camera/video-config/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n
\\n {{#unless this.canEditPrivacyZones}}\\n
\\n

{{tc this \\'cannotEditPrivacyZones\\'}}

\\n
\\n {{/unless}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n
{{this.privacyZoneCoordinates}}
\\n {{#if (is-mobile-app)}}\\n
\\n \\n
\\n {{/if}}\\n \\n \\n \\n \\n
\\n {{#if (media \\'isMobile\\')}}\\n
\\n \\n
\\n {{/if}}\\n \\n {{tc this \\'privacyZonesDescription\\'}}\\n \\n \\n
\\n \\n \\n
\\n

{{tc this \\'privacyZoneInfo.title\\'}}

\\n {{tc this \\'privacyZoneInfo.usagesTitle\\'}}\\n
    \\n
  • {{tc this \\'privacyZoneInfo.usagesTip1\\'}}
  • \\n
  • {{tc this \\'privacyZoneInfo.usagesTip2\\'}}
  • \\n
  • {{tc this \\'privacyZoneInfo.usagesTip3\\'}}
  • \\n
  • {{t \\'components.video.rules.draw-window.groundZoneInfo.examples\\'}}
  • \\n
  • {{tc this \\'privacyZoneInfo.usagesExample1\\'}}
  • \\n
  • {{tc this \\'privacyZoneInfo.usagesExample2\\'}}
  • \\n
  • {{tc this \\'privacyZoneInfo.usagesExample3\\'}}
  • \\n
\\n {{tc this \\'privacyZoneInfo.bestPracticesTitle\\'}}\\n
    \\n
  1. {{tc this \\'privacyZoneInfo.bestPracticesTip1\\'}}
  2. \\n
  3. {{tc this \\'privacyZoneInfo.bestPracticesTip2\\'}}
  4. \\n
  5. {{tc this \\'privacyZoneInfo.bestPracticesTip3\\'}}
  6. \\n
  7. {{tc this \\'privacyZoneInfo.bestPracticesTip4\\'}}
  8. \\n
  9. {{tc this \\'privacyZoneInfo.bestPracticesTip5\\'}}
  10. \\n
  11. {{tc this \\'privacyZoneInfo.bestPracticesTip6\\'}}
  12. \\n
  13. {{tc this \\'privacyZoneInfo.bestPracticesTip7\\'}}
  14. \\n
  15. {{tc this \\'privacyZoneInfo.bestPracticesTip8\\'}}
  16. \\n
\\n
\\n \\n
\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/privacy-zones/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default as |data|>\\n {{#if data}}\\n \\n \\n <:value>\\n
\\n {{#if this.isRefreshing}}\\n \\n {{else}}\\n

{{this.lastUpdatedDateString}}

\\n {{/if}}\\n
\\n \\n \\n
\\n \\n \\n \\n {{!-- @glint-expect-error There is no description block on this component, please fix this. --}}\\n <:description>\\n {{usageItem.description}}\\n \\n <:value>\\n {{#if usageItem.props.loading}}\\n \\n {{else}}\\n

{{usageItem.value}}

\\n {{/if}}\\n \\n
\\n
\\n
\\n \\n \\n \\n {{!-- @glint-expect-error There is no description block on this component, please fix this. --}}\\n <:description>\\n {{statusItem.description}}\\n \\n <:value>\\n
\\n

{{statusItem.value}}

\\n
\\n \\n
\\n
\\n
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n {{#if (media \\'isMobile\\')}}\\n
\\n \\n {{this.sdCardName}}\\n

{{this.storageCapacityString}}

\\n
\\n {{/if}}\\n \\n {{tc this \\'reformatCardActionSheetDescription\\'}}\\n \\n \\n \\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n\",{ moduleName: \"customer-site/video/settings/camera/video-config/sd-card-info/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/settings/camera/video-config/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default as |data|>\\n \\n
\\n
\\n

{{this.editPageStreamSettingsDisplayProps.name}}

\\n
\\n {{#if this.editPageStreamSettingsDisplayProps.resolutionOptions}}\\n
\\n {{t \\'generic.video.resolution\\'}}\\n \\n
\\n {{/if}}\\n {{#if this.editPageStreamSettingsDisplayProps.frameRateOptions}}\\n
\\n {{t \\'generic.video.framesPerSecond\\'}}\\n \\n
\\n {{/if}}\\n {{#if this.editPageStreamSettingsDisplayProps.gopLengthOptions}}\\n
\\n {{t \\'generic.video.gopLength\\'}}\\n \\n
\\n {{/if}}\\n {{#if this.editPageStreamSettingsDisplayProps.bitRateOptions}}\\n
\\n {{t \\'generic.video.maximumBitrate\\'}}\\n \\n
\\n {{/if}}\\n
\\n
\\n \\n \\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/third-party-stream/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default>\\n {{#if this.failedToRetrieveSettings}}\\n {{tc this \\'settingsCouldNotBeRetrieved\\'}}\\n {{else}}\\n \\n
\\n \\n
\\n
\\n {{#each this.streamSettingDisplayProps as |settingsProps index|}}\\n {{!-- Grab the OnvifCameraStream props in the corresponding index --}}\\n {{#let (get this.onvifCameraStreamDisplayProps index) as |streamProps|}}\\n \\n
\\n

{{settingsProps.name}}

\\n

{{settingsProps.description}}

\\n {{#if this.isStreamMappingVisible}}\\n {{tc this \\'cameraStream\\'}}\\n \\n {{/if}}\\n
\\n {{#if (or streamProps.shouldDisplayStreamSettingsSection settingsProps.shouldDisplayStreamSettingsSection)}}\\n
\\n
\\n

{{tc this \\'streamSettings\\'}}

\\n {{#if this.isStreamMappingEnabled}}\\n \\n {{/if}}\\n
\\n {{#if this.isStreamMappingEnabled}}\\n {{#if streamProps.resolutionOptions}}\\n
\\n {{t \\'generic.video.resolution\\'}}\\n \\n
\\n {{/if}}\\n {{#if streamProps.frameRateOptions}}\\n
\\n {{t \\'generic.video.framesPerSecond\\'}}\\n \\n
\\n {{/if}}\\n {{#if streamProps.gopLengthOptions}}\\n
\\n {{t \\'generic.video.gopLength\\'}}\\n \\n
\\n {{/if}}\\n {{#if streamProps.bitRateOptions}}\\n
\\n {{t \\'generic.video.maximumBitrate\\'}}\\n \\n
\\n {{/if}}\\n {{else}}\\n {{#if settingsProps.resolutionOptions}}\\n
\\n {{t \\'generic.video.resolution\\'}}\\n \\n
\\n {{/if}}\\n {{#if settingsProps.frameRateOptions}}\\n
\\n {{t \\'generic.video.framesPerSecond\\'}}\\n \\n
\\n {{/if}}\\n {{#if settingsProps.gopLengthOptions}}\\n
\\n {{t \\'generic.video.gopLength\\'}}\\n \\n
\\n {{/if}}\\n {{#if settingsProps.bitRateOptions}}\\n
\\n {{t \\'generic.video.maximumBitrate\\'}}\\n \\n
\\n {{/if}}\\n {{/if}}\\n
\\n {{/if}}\\n
\\n {{/let}}\\n {{/each}}\\n {{/if}}\\n {{#unless this.isStreamMappingEnabled}}\\n \\n \\n \\n {{/unless}}\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/third-party-stream/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/settings/camera/video-config/third-party-stream/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default as |data|>\\n
\\n {{! iOS doesn\\'t support webRTC yet so we use snapshots for mobile/mobiletech }}\\n {{#if this.shouldUseSnapshots}}\\n
\\n \\n {{#if this.isSavingOrLoadingCamera}}\\n
\\n \\n \\n
\\n {{/if}}\\n
\\n {{else}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n {{/if}}\\n
\\n
\\n \\n {{#if this.ovReadyCamera}}\\n \\n \\n \\n {{/if}}\\n
\\n \\n <:error as |PageViewError|>\\n \\n \\n <:no-results as |PageViewNoResults|>\\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/camera/video-config/varifocal-fov/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n \\n\\n \\n \\n\\n \\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n\\n
\\n

{{tc this \\'fovInstructions\\'}}

\\n
\\n\\n
\\n \\n \\n
\\n

{{fovOption.label}}

\\n
\\n \\n
\\n\\n
\\n \\n
\\n\\n
\\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/digital-fov/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:default>\\n \\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/enrollment-terms/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/faces/camera-access/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/faces/feature-management/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n {{#if @model.enrollment}}\\n \\n {{/if}}\\n \\n <:error as |PageViewError|>\\n \\n \\n \\n\\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/faces/incorrect-photos/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n

{{t \\'generic.video.settings.familiar-subject.faces\\'}}

\\n \\n
\\n

{{this.subHeaderText}}

\\n\\n {{#if @faces.length}}\\n
\\n {{#each @faces as |face|}}\\n \\n
\\n {{#if face.isPending}}\\n \\n {{else}}\\n \\n {{/if}}\\n \\n
\\n \\n {{/each}}\\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/face-entry/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { MaxAllowedFaces } from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type ContextManager from 'customer-site/services/context-manager';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AsyncHasMany } from '@ember-data/model';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type NavigationService from 'customer-site/services/navigation';\n\ninterface FaceEntryArgs {\n faces: AsyncHasMany | undefined;\n}\n\n/**\n * @classdesc\n * A component for showing face information and links to add a new face, for the entry page of familiar face\n */\n@intlPath({ path: 'video/settings/familiar-targets/face-entry' })\nexport default class FaceEntry extends Component {\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare intl: ADCIntlService;\n\n /**\n * Subheader text\n */\n @computed('args.faces')\n get subHeaderText(): string {\n const { faces } = this.args;\n\n if (!faces?.length) {\n return this.intl.tc(this, 'noFacesText');\n }\n\n if (faces.length >= MaxAllowedFaces) {\n return this.intl.t('generic.video.settings.familiar-subject.atFaceLimitText');\n }\n\n return this.intl.tc(this, 'someFacesText');\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::FaceEntry': typeof FaceEntry;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n \\n \\n \\n\\n {{#if (or this.settingsButtons.length this.helpButtons.length)}}\\n \\n {{#if this.settingsButtons.length}}\\n

{{t \\'generic.settings\\'}}

\\n \\n {{/if}}\\n\\n {{#if this.helpButtons.length}}\\n

{{t \\'generic.help\\'}}

\\n \\n {{/if}}\\n
\\n {{/if}}\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/faces/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n \\n \\n <:error as |PageViewError|>\\n \\n \\n \\n\\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/faces/recent-images/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n {{#if data.videoSettingsPermission.hasFamiliarFaceAndVehicleAccess}}\\n \\n \\n \\n \\n {{/if}}\\n {{#if data.videoSettingsPermission.hasOnlyFamiliarFaceAccess}}\\n \\n \\n \\n {{/if}}\\n {{#if data.videoSettingsPermission.hasOnlyFamiliarVehicleAccess}}\\n \\n \\n \\n {{/if}}\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n
\\n
\\n
\\n

{{tc this \\'editProfile\\'}}

\\n
\\n
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if (await cluster.isPending)}}\\n \\n {{else}}\\n
\\n \\n
\\n {{/if}}\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if cluster.reviewedImages.length}}\\n \\n {{/if}}\\n
\\n
\\n
\\n

{{this.subjectName}}

\\n\\n \\n
\\n
\\n \\n
\\n
\\n \\n
    \\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#each cluster.reviewedImages as |photo index|}}\\n
  • \\n
    \\n \\n
    \\n
  • \\n {{/each}}\\n
\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/review/edit/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if (await cluster.isPending)}}\\n \\n {{/if}}\\n
\\n \\n {{#unless (is-mobile-app)}}\\n
\\n \\n
\\n {{/unless}}\\n
\\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n {{#if (await cluster.isPending)}}\\n \\n {{else}}\\n \\n {{!-- @glint-expect-error Please convert to PageView for type safety. --}}\\n

{{await cluster.description}}

\\n {{/if}}\\n
\\n {{#if (is-mobile-app)}}\\n \\n {{/if}}\\n
\\n \\n {{#each this.primaryButtons as |button|}}\\n \\n <:content>\\n
\\n
\\n {{button.mainText}}\\n
\\n \\n {{button.subTitle}}\\n \\n
\\n {{#if button.infoIcon}}\\n \\n {{else}}\\n

{{button.infoText}}

\\n {{/if}}\\n \\n \\n {{/each}}\\n
\\n {{!-- @glint-expect-error enrollment is async, please fix this. --}}\\n \\n \\n \\n
\\n\\n
\\n \\n \\n \\n

{{this.photoPromptMessage}}

\\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/review/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n
\\n
\\n

{{tc this \\'receiveNotifications\\' vehicleName=this.clusterDescription}}

\\n
  • {{tc this \\'moreInfoOnNo\\' vehicleName=this.clusterDescription}}
\\n
\\n {{!-- empty div when not onboarding so that notifications-updates div is right aligned --}}\\n
\\n {{#if this.onboarding}}\\n \\n {{/if}}\\n
\\n
\\n

{{tc this \\'moreInfoOnNo\\' vehicleName=this.clusterDescription}}

\\n \\n \\n
\\n
\\n
\\n

{{this.individualNotificationsText}}

\\n
\\n
\\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/review/notifications/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n
\\n \\n
\\n \\n
\\n {{#if (has-block)}}\\n
\\n {{yield}}\\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/photo-card/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\n\nexport interface PhotoCardComponentSignature {\n Element: HTMLDivElement;\n Args: {\n altText: string;\n image: FamiliarTargetEnrollmentImage;\n isEditableByCurrentUser: boolean;\n onClickImage?: () => void;\n };\n Blocks: {\n default: [];\n };\n}\n\n/**\n * @classdesc\n *\n * Component that displays a Familiar Target Enrollment Image with options, and any additional actions if a block is provided\n */\n@intlPath({ path: 'video/settings/familiar-targets/photo-card' })\nexport default class PhotoCard extends Component {\n /**\n * Is the enrollment image a familiar face image type?\n */\n get isFamiliarFace(): boolean {\n return this.args.image.familiarObjectType === Face;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::PhotoCard': typeof PhotoCard;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/photo-card/photo-review-card/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n type PhotoCardActionButton,\n fnCreateActionButton\n} from 'customer-site/components/video/settings/familiar-targets/photo-card/photo-card-action-buttons/index';\nimport {\n getCorrectButtonIcon,\n getIncorrectButtonIcon,\n getReviewButtonResource\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { PhotoCardComponentSignature } from 'customer-site/components/video/settings/familiar-targets/photo-card/index';\nimport type NavigationService from 'customer-site/services/navigation';\n\ninterface PhotoReviewCardSignature {\n Element: PhotoCardComponentSignature['Element'];\n Args: Pick & {\n isEditableByCurrentUser: boolean;\n isReviewedImage: boolean;\n showMoveDeleteOptions?: () => void;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for a photo card that is interfaced with to review familiar target images\n */\n@intlPath({ path: 'video/settings/familiar-targets/photo-card/photo-review-card' })\nexport default class PhotoReviewCard extends Component {\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n\n /**\n * Is the image selected as correct?\n */\n @computed('args.image.{requiresReview,isConfirmedForCluster}')\n get isSelectedAndCorrect(): boolean {\n const { image } = this.args;\n\n return !image.requiresReview && image.isConfirmedForCluster;\n }\n\n /**\n * Is the image selected as incorrect?\n */\n @computed('args.image.{requiresReview,isConfirmedForCluster}')\n get isSelectedAndIncorrect(): boolean {\n const { image } = this.args;\n\n return !image.requiresReview && !image.isConfirmedForCluster;\n }\n\n /**\n * The action buttons to display under the photo card\n */\n @computed('args', 'isSelectedAndCorrect', 'isSelectedAndIncorrect')\n get buttons(): PhotoCardActionButton[] {\n const { intl, isSelectedAndCorrect, isSelectedAndIncorrect } = this,\n { image, isEditableByCurrentUser, showMoveDeleteOptions, isReviewedImage } = this.args,\n correctButtonClass = `correct ${isSelectedAndCorrect ? 'selected' : ''}`,\n incorrectButtonClass = `incorrect ${isSelectedAndIncorrect ? 'selected' : ''}`;\n\n if (isReviewedImage) {\n return [\n fnCreateActionButton(intl.t('generic.more'), 'more-h', '', () => {\n showMoveDeleteOptions && showMoveDeleteOptions();\n })\n ];\n }\n\n return [\n fnCreateActionButton(\n getReviewButtonResource(intl, 'correct'),\n getCorrectButtonIcon(isSelectedAndCorrect),\n correctButtonClass,\n () => {\n if (isSelectedAndCorrect) {\n image.unsetReview();\n } else {\n if (isEditableByCurrentUser) image.setReview(true);\n }\n }\n ),\n fnCreateActionButton(\n getReviewButtonResource(intl, 'incorrect'),\n getIncorrectButtonIcon(isSelectedAndIncorrect),\n incorrectButtonClass,\n () => {\n if (isSelectedAndIncorrect) {\n image.unsetReview();\n } else {\n showMoveDeleteOptions && showMoveDeleteOptions();\n }\n }\n )\n ];\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::PhotoCard::PhotoReviewCard': typeof PhotoReviewCard;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n
\\n {{#if this.cluster}}\\n \\n {{#if this.cluster.hasPhotosToReview}}\\n \\n
\\n

{{tc this \\'reviewNumImages\\' name=(await this.cluster.description) count=(await this.cluster.numNewImages)}}

\\n \\n
\\n
\\n

{{this.reviewInstructionsText}}

\\n
\\n {{#let this.cluster.newImages as |images|}}\\n {{#each images as |image|}}\\n \\n {{/each}}\\n {{/let}}\\n
\\n
\\n \\n
\\n
\\n
\\n {{/if}}\\n {{#if this.cluster.hasReviewedPhotos}}\\n \\n
\\n

{{tc this \\'reviewedPhotos\\'}}

\\n \\n
\\n
\\n
\\n {{#let this.cluster.reviewedImages as |images|}}\\n {{#each images as |image|}}\\n \\n {{/each}}\\n {{/let}}\\n
\\n
\\n
\\n {{/if}}\\n
\\n {{/if}}\\n\\n
\\n \\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/review/photos/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{outlet}}\",{ moduleName: \"customer-site/video/settings/familiar-subject/review/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{outlet}}\\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n <:default as |PageViewContainer api|>\\n \\n <:default as |cameraProperties|>\\n \\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/camera-access/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/faq/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n\\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/feature-management/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n \\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/incorrect-photos/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n <:content>\\n {{#if @cluster.isPending}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n
\\n

{{@cluster.description}}

\\n {{#if (and (not @hideSubtitle) @cluster.hasPhotosToReview)}}\\n

{{tc this \\'numImagesToReview\\' count=(await @cluster.numNewImages)}}

\\n {{/if}}\\n
\\n
\\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/cluster-selection/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsReview } from 'customer-site/enums/CustomerPageUrl';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type NavigationService from 'customer-site/services/navigation';\n\ntype onSelectFn = (cluster: FamiliarTargetEnrollmentCluster) => void;\n\ninterface ClusterSelectionSignature {\n Element: HTMLDivElement;\n Args: {\n compactDesign: boolean;\n hideSubtitle?: boolean;\n cluster: FamiliarTargetEnrollmentCluster;\n onSelect?: onSelectFn;\n };\n}\n\n/**\n * @classdesc\n *\n * Represents an item displaying some info about a familiar object enrollment cluster\n */\n@intlPath({ path: 'video/settings/familiar-targets/cluster-selection' })\nexport default class ClusterSelection extends Component {\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n\n /**\n * Navigate to the given familiar target cluster review page. If the review has already been started route to the\n * target review index. If not, route to the \"new images\" page.\n *\n * @param cluster\n */\n @action transitionToReview(cluster: FamiliarTargetEnrollmentCluster): void {\n // Navigate to the given familiar target cluster review page. If the review has already been started route to the target review index. If not, route to the photos page.\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReview, undefined, undefined, cluster.id);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::ClusterSelection': typeof ClusterSelection;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n

{{t \\'generic.video.settings.familiar-subject.vehicles\\'}}

\\n \\n
\\n

{{this.subHeaderText}}

\\n\\n {{#if @vehicles.length}}\\n
\\n {{#each @vehicles as |vehicle|}}\\n \\n {{/each}}\\n
\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/vehicle-entry/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentRecentImages } from 'customer-site/enums/CustomerPageUrl';\nimport { MaxAllowedVehicles } from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type ContextManager from 'customer-site/services/context-manager';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AsyncHasMany } from '@ember-data/model';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type NavigationService from 'customer-site/services/navigation';\n\ninterface VehicleEntryArgs {\n vehicles: AsyncHasMany | undefined;\n}\n\n/**\n * @classdesc\n *\n * A component for showing vehicle information and links to add a new vehicle, for the entry page of familiar vehicle\n */\n@intlPath({ path: 'video/settings/familiar-targets/vehicle-entry' })\nexport default class VehicleEntry extends Component {\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare intl: ADCIntlService;\n\n /**\n * Subheader text\n */\n @computed('args.vehicles')\n get subHeaderText() {\n const { vehicles } = this.args;\n\n if (!vehicles?.length) {\n return this.intl.tc(this, 'noVehiclesText');\n }\n\n if (vehicles.length >= MaxAllowedVehicles) {\n return this.intl.t('generic.video.settings.familiar-subject.atVehicleLimitText');\n }\n\n return this.intl.tc(this, 'someVehiclesText');\n }\n\n /**\n * Navigates to the recent images page\n */\n @action goToRecentImagesPage() {\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollmentRecentImages);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::VehicleEntry': typeof VehicleEntry;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default>\\n \\n \\n \\n\\n {{#if (or this.settingsButtons.length this.helpButtons.length)}}\\n \\n {{#if this.settingsButtons.length}}\\n

{{t \\'generic.settings\\'}}

\\n \\n {{/if}}\\n\\n {{#if this.helpButtons.length}}\\n

{{t \\'generic.help\\'}}

\\n \\n {{/if}}\\n
\\n {{/if}}\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n \\n \\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/familiar-subject/vehicles/recent-images/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\" \\n <:default as |PageViewContainer|>\\n \\n <:default>\\n

{{tc this \\'addDirectory\\'}}

\\n

{{tc this \\'description\\'}}

\\n\\n \\n <:content as |item|>\\n {{#if (eq item.label (tc this \\'existingDirectory\\'))}}\\n

{{tc this \\'selectDirectory\\'}}

\\n \\n {{/if}}\\n \\n \\n \\n
\\n\\n \\n <:default>\\n
\\n \\n \\n
\\n \\n
\\n \\n
\\n\",{ moduleName: \"customer-site/video/settings/intercom/add-directory/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n

{{tc this \\'selectAssociatedDevices\\'}}

\\n

{{tc this \\'description\\'}}

\\n \\n
\\n\\n \\n
\\n \\n \\n
\\n
\\n\\n\",{ moduleName: \"customer-site/video/settings/intercom/associated-device-select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n \\n
\\n
{{tc this \\'title\\'}}
\\n

{{tc this \\'description\\'}}

\\n
\\n\\n {{#if (eq this.intercomApartments.length 0) }}\\n
\\n

{{tc this \\'noAddressBook\\'}}

\\n
\\n {{else}}\\n
\\n \\n
\\n\\n
\\n
\\n

{{tc this \\'addressBook\\'}}

\\n
\\n
\\n

{{tc this \\'systems\\'}}

\\n
\\n
\\n {{#each this.filteredIntercomApartments as |apartment|}}\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n {{/each}}\\n {{/if}}\\n
\\n\\n \\n
\\n \\n {{#if (eq this.intercomApartments.length 0) }}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n\",{ moduleName: \"customer-site/video/settings/intercom/connect-unit-to-system/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n

{{tc this \\'title\\'}}

\\n

{{tc this \\'description\\'}}

\\n

{{tc this \\'nameDirectory\\'}}

\\n \\n\\n
\\n\\n

{{tc this \\'addCallRecipients\\'}}

\\n \\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n \\n \\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n\\n\\n\\n\",{ moduleName: \"customer-site/video/settings/intercom/create-directory/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n
\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n
\\n

{{tc this \\'pageTitle\\'}}

\\n

{{tc this \\'iconUploadDescription\\'}}

\\n
\\n\\n
\\n

{{tc this \\'uploadLogo\\'}}

\\n \\n
\\n\\n
\\n

{{tc this \\'addHeader\\'}}

\\n

{{tc this \\'addHeaderExample\\'}}

\\n \\n
\\n\\n
\\n

{{tc this \\'addHelperText\\'}}

\\n

{{tc this \\'addHelperTextExample\\'}}

\\n \\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n \\n\\n \\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n
\\n \\n\\n\\n\",{ moduleName: \"customer-site/video/settings/intercom/customize-directory/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n

{{tc this \\'title\\'}}

\\n

{{tc this \\'description\\'}}

\\n

{{tc this \\'nameDirectory\\'}}

\\n \\n\\n
\\n\\n

{{tc this \\'addCallRecipients\\'}}

\\n \\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n \\n \\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n\\n\\n\\n\",{ moduleName: \"customer-site/video/settings/intercom/edit-directory/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n \\n
\\n
{{tc this \\'title\\'}}
\\n

{{tc this \\'description\\'}}

\\n
\\n\\n \\n
\\n\\n \\n
\\n \\n \\n
\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n\",{ moduleName: \"customer-site/video/settings/intercom/name-directory-list/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n

{{tc this \\'qrCodeTitle\\'}}

\\n

{{tc this \\'qrCodeBody\\'}}

\\n

{{tc this \\'preview\\'}}

\\n
\\n \\n
\\n \\n
\\n\\n \\n <:default>\\n
\\n \\n \\n
\\n \\n
\\n \\n\",{ moduleName: \"customer-site/video/settings/intercom/qr-code/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n \\n
\\n
{{tc this \\'title\\'}}
\\n

{{tc this \\'description\\'}}

\\n
\\n\\n
\\n \\n
\\n\\n \\n <:label as |item|>\\n

{{item.label}}

\\n \\n <:content as |item|>\\n

{{item.props.loginName}}

\\n \\n \\n
\\n\\n \\n
\\n \\n \\n
\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n\",{ moduleName: \"customer-site/video/settings/intercom/set-concierge/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n
\\n {{#if this.directoryData}}\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n
\\n

{{tc this \\'intercoms\\'}}

\\n \\n \\n
\\n\\n {{#each this.directoryData as |item|}}\\n
\\n {{item.camera.deviceModel}}\\n
    \\n

    {{item.camera.description}}

    \\n
  • \\n \\n

    {{tc this \\'intercomAssociatedDeviceCount\\' count=item.camera.intercomAssociatedDeviceIds.length}}

    \\n
  • \\n {{#if item.directoryList.directoryListName}}\\n
  • \\n \\n

    {{item.directoryList.directoryListName}}

    \\n
  • \\n {{/if}}\\n
\\n\\n
\\n {{#unless item.directory.isActive}}\\n \\n {{/unless}}\\n
\\n\\n {{#unless item.camera.isIntercomDevice}}\\n \\n \\n \\n {{/unless}}\\n
\\n {{/each}}\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n
\\n
\\n

{{tc this \\'directoryLists\\'}}

\\n \\n \\n
\\n

{{tc this \\'directoryListExplanation\\'}}

\\n {{#each this.directoryLists as |item|}}\\n
\\n
    \\n

    {{item.directoryList.directoryListName}}

    \\n {{#if item.directoryNames}}\\n
  • \\n \\n

    {{item.directoryNames}}

    \\n
  • \\n {{/if}}\\n
\\n {{#if item.needsSetup}}\\n
\\n \\n
\\n {{else}}\\n \\n \\n \\n {{/if}}\\n
\\n {{/each}}\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n {{else}}\\n \\n <:default>\\n
\\n {{t\\n

{{tc this \\'title\\'}}

\\n

{{tc this \\'subtitle\\'}}

\\n
\\n \\n
\\n\\n \\n <:default>\\n
\\n \\n
\\n \\n
\\n {{/if}}\\n
\\n \\n\",{ moduleName: \"customer-site/video/settings/intercom/setup/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\" \\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |videoDevices|>\\n

{{tc this \\'selectVideoDevice\\'}}

\\n

{{tc this \\'description\\'}}

\\n
\\n {{#each videoDevices as |videoDevice|}}\\n \\n {{tc\\n

{{videoDevice.camera.description}}

\\n
\\n {{/each}}\\n
\\n \\n\\n <:error as |PageViewError|>\\n \\n \\n
\\n\\n \\n <:default>\\n
\\n \\n \\n
\\n \\n
\\n \\n\\n \\n
\\n\",{ moduleName: \"customer-site/video/settings/intercom/video-device-select/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\",{ moduleName: \"customer-site/video/settings/light-triggers/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{!-- @glint-expect-error Type for icon does not match, please fix this. --}}\\n \\n
\\n {{this.brightnessDescriptionText}}\\n
\\n
\\n
\\n {{tc this \\\"cameraLightBrightness\\\"}}\\n
\\n
\\n \\n \\n \\n
\\n
\\n {{#if this.supportsFloodlight}}\\n
\\n
\\n {{tc this \\\"colorNightVision\\\"}}\\n \\n
\\n
\\n {{tc this \\\"colorNightVisionDescription\\\"}}\\n
\\n
\\n {{/if}}\\n
\\n \\n
\\n {{tc this \\\"durationDescription\\\"}}\\n
\\n
\\n
\\n {{t \\\"generic.duration\\\"}}\\n \\n
\\n
\\n
\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/lights/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if this.isVSR}}\\n \\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default as |data|>\\n
\\n
\\n

{{tc this \\'motionConfigurationDescription\\'}}

\\n
\\n\\n {{#unless this.canEditMotionConfiguration}}\\n \\n

{{tc this \\'cannotEditMotionConfiguration\\'}}

\\n
\\n {{/unless}}\\n\\n {{!-- Player + Zones --}}\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n\\n {{!-- Mode Motion Detection Selection --}}\\n {{#if data.camera.svrSupportsDeepMotionDetection}}\\n \\n

{{tc this \\'mode\\'}}

\\n {{!-- Local Display Disabled warning if DMD is used--}}\\n {{#if (and this.hasLocalDisplayEnabledOnSVR this.deepMotionDetectionSelected)}}\\n
\\n

{{tc this \\'localDisplayInfo\\' svrName=this.connectedSVRName}}

\\n
\\n {{/if}}\\n\\n \\n
{{item.label}}
\\n
\\n {{!-- @glint-expect-error I think this type needs to be fixed in the button list yield. --}}\\n {{item.props.descText}}\\n
\\n \\n
\\n\\n {{!-- Sensitivity Slider --}}\\n {{#if this.deepMotionDetectionSelected}}\\n \\n
\\n

{{tc this \\'motionSensitivity\\'}}

\\n \\n
\\n

{{tc this \\'motionSensitivityDescription\\'}}

\\n \\n
\\n {{/if}}\\n {{/if}}\\n\\n\\n {{!-- Warning when detection mode selection is disabled because of maxDMDSchedules reached --}}\\n {{#if this.hasMaxDMDSchedulesOnSVR}}\\n
\\n \\n

{{tc this \\'maxDMDSchedulesOnSVR\\'}}

\\n

{{tc this \\'maxDMDSchedulesOnSVRDescription\\'}}

\\n
\\n
\\n {{/if}}\\n\\n {{!-- Action Buttons --}}\\n \\n \\n \\n
\\n \\n <:error as |PageViewError|>\\n \\n \\n
\\n \\n
\\n{{else}}\\n \\n\\n
\\n

{{tc this \\'motionConfiguration\\'}}

\\n

{{tc this \\'motionConfigurationDescription\\'}}

\\n
\\n\\n {{#unless this.canEditMotionConfiguration}}\\n \\n

{{tc this \\'cannotEditMotionConfiguration\\'}}

\\n
\\n {{/unless}}\\n\\n {{!-- Player + Zones --}}\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n\\n {{!-- Mode Motion Detection Selection --}}\\n {{#if data.camera.svrSupportsDeepMotionDetection}}\\n
\\n

{{tc this \\'mode\\'}}

\\n {{!-- Local Display Disabled warning if DMD is used--}}\\n {{#if (and this.hasLocalDisplayEnabledOnSVR this.deepMotionDetectionSelected)}}\\n
\\n

{{tc this \\'localDisplayInfo\\' svrName=this.connectedSVRName}}

\\n
\\n {{/if}}\\n\\n \\n
{{item.label}}
\\n
\\n {{!-- @glint-expect-error I think this type has to be fixed in the button list yield. --}}\\n {{item.props.descText}}\\n
\\n \\n
\\n {{!-- Sensitivity Slider --}}\\n {{#if this.deepMotionDetectionSelected}}\\n
\\n
\\n

{{tc this \\'motionSensitivity\\'}}

\\n \\n
\\n

{{tc this \\'motionSensitivityDescription\\'}}

\\n \\n
\\n {{/if}}\\n {{/if}}\\n\\n\\n {{!-- Warning when detection mode selection is disabled because of maxDMDSchedules reached --}}\\n {{#if this.hasMaxDMDSchedulesOnSVR}}\\n
\\n \\n

{{tc this \\'maxDMDSchedulesOnSVR\\'}}

\\n

{{tc this \\'maxDMDSchedulesOnSVRDescription\\'}}

\\n
\\n
\\n {{/if}}\\n\\n {{!-- Action Buttons | Cancel working, Save not --}}\\n \\n\\n \\n{{/if}}\",{ moduleName: \"customer-site/video/settings/motion-configuration/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/motion-detection-test/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- template-lint-disable link-href-attributes no-invalid-interactive --}}\\n\\n \\n \\n \\n \\n \\n {{#if @isLeftZoneSelected}}\\n \\n {{/if}}\\n \\n \\n \\n \\n \\n \\n {{#if @isCenterZoneSelected}}\\n \\n {{/if}}\\n \\n \\n \\n {{#if @isRightZoneSelected}}\\n \\n {{/if}}\\n \\n\",{ moduleName: \"customer-site/components/video/settings/lightguard/motion-detection-zone-selections/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\ninterface VideoSettingsMotionDetectionZoneSelectionsSignature {\n Args: {\n onWedgeClicked: VoidFunction;\n isLeftZoneSelected?: boolean;\n isCenterZoneSelected?: boolean;\n isRightZoneSelected?: boolean;\n };\n}\n\nconst VideoSettingsMotionDetectionZoneSelections =\n templateOnlyComponent();\nexport default VideoSettingsMotionDetectionZoneSelections;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Lightguard::MotionDetectionZoneSelections': typeof VideoSettingsMotionDetectionZoneSelections;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n
\\n
\\n \\n {{t \\\"generic.video.floodlight\\\"}}\\n \\n \\n
\\n \\n {{tc this \\\"floodlightDescription\\\"}}\\n \\n
\\n
\\n
\\n \\n {{tc this \\\"movementTime\\\"}}\\n \\n \\n
\\n \\n {{tc this \\\"movementDescription\\\"}}\\n \\n
\\n
\\n
\\n \\n {{tc this \\\"ambientLight\\\"}}\\n \\n \\n
\\n \\n {{tc this \\\"ambientLightDescription\\\"}}\\n \\n
\\n
\\n
\\n \\n {{t \\\"generic.zone\\\"}}\\n \\n
\\n \\n {{tc this \\\"zoneDescription\\\"}}\\n \\n
\\n \\n \\n
\\n
\\n
\\n
\\n \\n {{t \\\"generic.video.sensitivity\\\"}}\\n \\n
\\n \\n
\\n {{t \\\"generic.low\\\"}}\\n {{t \\\"generic.high\\\"}}\\n
\\n
\\n
\\n \\n \\n \\n\",{ moduleName: \"customer-site/video/settings/motion-detection/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n \\n\\n \\n \\n \\n \\n\\n \\n
\\n {{#unless this.canEditPrivacyZones}}\\n
\\n

{{tc this \\'cannotEditPrivacyZones\\'}}

\\n
\\n {{/unless}}\\n\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n
{{this.privacyZoneCoordinates}}
\\n
\\n \\n
\\n
\\n
\\n\\n \\n\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/privacy-zones/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n \\n\\n \\n\\n
\\n {{#if this.showReformatOption}}\\n {{tc this \\'sdCardReformatting\\'}}\\n {{else}}\\n {{tc this \\'sdCardInformation\\'}}\\n\\n {{#if this.isRefreshing}}\\n \\n {{else}}\\n \\n {{/if}}\\n\\n

{{this.lastUpdatedDate}}

\\n\\n {{/if}}\\n
\\n\\n \\n \\n \\n \\n\\n \\n {{#if this.showReformatOption}}\\n
\\n \\n

{{tc this \\'reformatDescription\\'}}

\\n
\\n
\\n \\n {{#unless this.hideBackButton}}\\n \\n {{/unless}}\\n
\\n {{else}}\\n
\\n
\\n \\n
\\n
\\n {{#each this.statusPropertiesAndValues as |statusPropertyAndValue|}}\\n {{#if statusPropertyAndValue.visible}}\\n
\\n \\n

{{statusPropertyAndValue.value}}

\\n
\\n {{/if}}\\n {{/each}}\\n
\\n
\\n\\n
\\n
\\n \\n
\\n
\\n

{{this.recordingQualityString}}

\\n
\\n {{#each this.recordingQualityPropertiesAndValues as |recordingQualityPropertyAndValue|}}\\n
\\n \\n

{{recordingQualityPropertyAndValue.value}}

\\n
\\n {{/each}}\\n
\\n
\\n
\\n\\n {{#each this.propertiesAndValues as |propertyAndValue|}}\\n
\\n \\n

\\n {{#if propertyAndValue.loading}}\\n \\n {{else}}\\n {{propertyAndValue.value}}\\n {{/if}}\\n

\\n
\\n {{/each}}\\n\\n
\\n \\n \\n
\\n\\n
\\n \\n \\n
\\n {{/if}}\\n\\n
\\n\\n \\n\\n \\n\\n \\n\\n \\n
\\n\",{ moduleName: \"customer-site/video/settings/sd-card-management/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n
\\n \\n
\\n
\\n\\n \\n \\n {{#if this.isUsingEthernetConnection}}\\n
\\n \\n

\\n {{tc this \\'deviceUsingEthernet\\'}}\\n

\\n

{{tc this \\'wirelessNotSetUp\\'}}

\\n
\\n {{else}}\\n
\\n \\n

\\n {{this.signalStrengthQualityString}}\\n

\\n
\\n
\\n {{#if this.isRefreshing}}\\n

{{t \\'generic.updating\\'}}

\\n {{else}}\\n {{#if signalStrengthInfoModel.normalizedSignalStrength}}\\n

{{this.lastUpdatedDateTimestamp}}

\\n {{else}}\\n

{{tc this \\'requestFailed\\'}}

\\n {{/if}}\\n {{/if}}\\n
\\n \\n {{/if}}\\n
\\n
\\n\\n \\n \\n \\n \\n <:value>\\n
\\n

{{historyItem.value}}

\\n
\\n {{!-- @glint-expect-error singleStrengthEnum can be undefined, please fix this. --}}\\n \\n \\n
\\n
\\n
\\n \\n\\n\",{ moduleName: \"customer-site/video/settings/signal-strength-info/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n \\n\\n \\n \\n
\\n {{tc this \\'description\\'}}\\n
\\n
\\n \\n
\\n
\\n {{tc this \\'selectCameras\\'}}\\n \\n
\\n {{#if this.isLoadingPanelCameras}}\\n \\n {{else}}\\n {{#each this.panelCameras as |camera|}}\\n
\\n \\n
\\n {{camera.description}}\\n {{camera.deviceModel}}\\n {{t \\'generic.video.mac\\'}}: {{camera.macAddress}}\\n {{camera.publicIp}}\\n
\\n \\n
\\n {{/each}}\\n {{/if}}\\n
\\n
\\n\\n \\n \\n \\n\\n \\n
\\n \\n
\\n
\\n

{{tc this \\'outstandingAgreementWarningPart1\\'}}

\\n

{{tc this \\'outstandingAgreementWarningPart2\\'}}

\\n
\\n \\n
\\n\\n \\n\\n \\n \\n
\\n\",{ moduleName: \"customer-site/video/settings/stream-video-panel-v2/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n
\\n\\n\",{ moduleName: \"customer-site/components/ui/enable-disable-all/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface UiEnableDisableAllSignature {\n Element: HTMLDivElement;\n Args: {\n enableAction: (evt: Event) => void;\n disableAction: (evt: Event) => void;\n disabled?: boolean;\n };\n}\n\nconst UiEnableDisableAll = templateOnlyComponent();\nexport default UiEnableDisableAll;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::EnableDisableAll': typeof UiEnableDisableAll;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default as |PageViewContainer api|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n\\n <:default>\\n {{#unless this.isEnableStreamingAllowed}}\\n \\n {{/unless}}\\n\\n \\n {{tc this \\'description\\'}}\\n \\n\\n \\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n \\n\\n <:no-results as |PageViewNoResults|>\\n \\n \\n\\n <:error as |PageViewError|>\\n \\n \\n \\n \\n\\n\",{ moduleName: \"customer-site/video/settings/stream-video-panel/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{@label}}\\n {{#if @action}}\\n {{#if this.actionIsRunning}}\\n \\n {{else}}\\n \\n {{/if}}\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/stream/setting-label/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { task } from 'ember-concurrency';\n\nimport type { TaskInstance } from 'ember-concurrency';\n\ninterface SettingLabelSignature {\n Element: HTMLDivElement;\n Args: {\n label: string;\n action?: () => TaskInstance;\n };\n}\n\n/**\n * @classdesc\n * A label and sometimes a button for the stream settings page.\n */\nexport default class Label extends Component {\n /**\n * Runs the label's action\n */\n runAction = task({ drop: true }, async () => {\n await this.args.action?.();\n });\n\n /**\n * If our component is running the label's action.\n */\n get actionIsRunning(): boolean {\n return this.runAction.isRunning;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Stream::SettingLabel': typeof Label;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n
\\n

{{tc this \\'streamSettings\\'}}

\\n\\n
\\n \\n
\\n
\\n\\n {{#if this.failedToRetrieveSettings}}\\n {{tc this \\'settingsCouldNotBeRetrieved\\'}}\\n {{else}}\\n
\\n
\\n {{#each this.headerRows as |headerRow index|}}\\n \\n {{/each}}\\n
\\n\\n {{#each this.streamSettingDisplayProps as |settingsProps index|}}\\n {{!-- Grab the OnvifCameraStream props in the corresponding index --}}\\n {{#let (get this.onvifCameraStreamDisplayProps index) as |streamProps|}}\\n
\\n
\\n {{settingsProps.name}}\\n \\n
\\n
{{settingsProps.description}}
\\n {{#if this.isStreamMappingVisible}}\\n
\\n \\n {{!-- TODO: Also if I can drop @value, then can possibly merge if isMapping and else DropdownSelects and do @value-change as (if this.isMapping (noop) (fn mut stuff)) --}}\\n \\n
\\n {{/if}}\\n\\n {{!-- TODO: refactor to reduce duplicated dropdowns --}}\\n {{!-- https://bitbucket.corp.adcinternal.com/projects/FALCOR/repos/adc-web-frontend/pull-requests/72/overview?commentId=1237554 --}}\\n {{#if this.isMapping}}\\n {{#if streamProps.resolutionOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{else}}\\n {{#if settingsProps.resolutionOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{/if}}\\n\\n {{#if this.isMapping}}\\n {{#if streamProps.frameRateOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{else}}\\n {{#if settingsProps.frameRateOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{/if}}\\n\\n {{#if this.isMapping}}\\n {{#if streamProps.gopLengthOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{else}}\\n {{#if settingsProps.gopLengthOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{/if}}\\n\\n {{#if this.isMapping}}\\n {{#if streamProps.bitRateOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{else}}\\n {{#if settingsProps.bitRateOptions}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{/if}}\\n
\\n {{/let}}\\n {{/each}}\\n
\\n {{/if}}\\n
\\n\\n \\n\",{ moduleName: \"customer-site/video/settings/stream/index/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n \\n\\n \\n\\n \\n\\n \\n {{! iOS doesn\\'t support webRTC yet so we use snapshots for mobile/mobiletech }}\\n {{#if this.shouldUseSnapshots}}\\n
\\n \\n {{#if this.isSavingOrLoadingCamera}}\\n
\\n \\n \\n
\\n {{/if}}\\n
\\n {{else}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n {{/if}}\\n
\\n \\n
\\n \\n
\\n
\\n
\\n\\n \\n\\n \\n\\n \\n
\",{ moduleName: \"customer-site/video/settings/varifocal-fov/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n

{{@signalStrengthInfo.signalStrengthLabel}}

\\n

{{@signalStrengthInfo.signalStrengthNote}}

\\n
\\n\",{ moduleName: \"customer-site/components/wifi/wireless-signal-strength/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type AccessPointPanelSignalStrength from 'customer-site/models/settings/access-point-wifi/access-point-panel-signal-strength';\n\nexport interface WirelessSignalStrengthSignature {\n Args: {\n signalStrengthInfo: AccessPointPanelSignalStrength;\n };\n}\n\nconst WirelessSignalStrength = templateOnlyComponent();\nexport default WirelessSignalStrength;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Wifi::WirelessSignalStrength': typeof WirelessSignalStrength;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n
\\n \\n

{{t \\'generic.wifi.signalStrength\\'}}

\\n

{{this.signalStrengthDirections}}

\\n\\n {{#if this.signalStrengthLoaded}}\\n
\\n \\n
\\n\\n
\\n \\n
\\n {{else}}\\n
\\n {{!-- @glint-expect-error This is a route, it doesn\\'t have arguments. Please fix this. --}}\\n \\n
\\n

{{tc this \\'checkingSignalStrength\\'}}

\\n {{/if}}\\n\\n {{#if (is-mobile-app)}}\\n \\n {{/if}}\\n
\\n\\n \\n\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/video/settings/video-device-signal-strength/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!-- @glint-expect-error Component name is wrong (no dash) AND component doesn\\'t have any arguments defined. Please fix this. --}}\\n\",{ moduleName: \"customer-site/video/svr-timeline/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\",{ moduleName: \"customer-site/video/thumbnail-search/template.hbs\" })","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! This is an internal-only testing page, so we are disabling some template-lint rules. }}\\n{{! template-lint-disable no-bare-strings }}\\n\\n <:default as |PageViewContainer|>\\n \\n <:default>\\n \\n \\n \\n \\n\",{ moduleName: \"customer-site/video/youtube-player/template.hbs\" })","import { computed } from '@ember/object';\nimport FilterResultsController from '../../classes/activity/event-history/filter-results-controller';\n\nimport type { CategoryFilter } from 'customer-site/models/activity/quick-filter';\n\n/**\n * @classdesc\n * Activity center controller.\n */\nexport default class ActivityController extends FilterResultsController {\n // region QueryParameters\n\n /** @override */\n @computed()\n get defaultFilterValues(): FilterResultsController['defaultFilterValues'] & {\n showOtherClips: boolean;\n categories: CategoryFilter[];\n globalDeviceIds: string[];\n } {\n return {\n ...super.defaultFilterValues,\n showOtherClips: false,\n categories: [],\n globalDeviceIds: []\n };\n }\n\n showOtherClips = this.defaultFilterValues.showOtherClips;\n\n /**\n * The filter categories with applied filters.\n */\n categories = this.defaultFilterValues.categories;\n\n /**\n * The device IDs to search for.\n */\n globalDeviceIds = this.defaultFilterValues.globalDeviceIds;\n\n // endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'activity/event-history': ActivityController;\n }\n}\n","import { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\nimport FilterResultsRoute, {\n filterResultsRouteQueryParams\n} from '../../classes/activity/event-history/filter-results-route';\nimport { EmberEventHistory } from '../../enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * Activity center route.\n */\nexport default class ActivityRoute extends FilterResultsRoute {\n routeId = EmberEventHistory;\n\n queryParams = {\n ...filterResultsRouteQueryParams,\n showOtherClips: getQueryParam('boolean'),\n categories: getQueryParam('array'),\n globalDeviceIds: getQueryParam('array')\n };\n}\n","\nimport { importSync as i } from '@embroider/macros';\nlet d = window.define;\nd(\"customer-site/video/add-device-redirect/route\", function(){ return i(\"customer-site/video/add-device-redirect/route.ts\");});\nd(\"customer-site/video/advanced-video-search/template\", function(){ return i(\"customer-site/video/advanced-video-search/template.hbs\");});\nd(\"customer-site/video/advanced-video-search/controller\", function(){ return i(\"customer-site/video/advanced-video-search/controller.js\");});\nd(\"customer-site/video/advanced-video-search/route\", function(){ return i(\"customer-site/video/advanced-video-search/route.js\");});\nd(\"customer-site/video/appearance-search-results/template\", function(){ return i(\"customer-site/video/appearance-search-results/template.hbs\");});\nd(\"customer-site/video/appearance-search-results/controller\", function(){ return i(\"customer-site/video/appearance-search-results/controller.ts\");});\nd(\"customer-site/video/appearance-search-results/route\", function(){ return i(\"customer-site/video/appearance-search-results/route.ts\");});\nd(\"customer-site/video/business-activity-analytics/template\", function(){ return i(\"customer-site/video/business-activity-analytics/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/heat-mapping/template\", function(){ return i(\"customer-site/video/business-activity-analytics/heat-mapping/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/heat-mapping/controller\", function(){ return i(\"customer-site/video/business-activity-analytics/heat-mapping/controller.ts\");});\nd(\"customer-site/video/business-activity-analytics/heat-mapping/route\", function(){ return i(\"customer-site/video/business-activity-analytics/heat-mapping/route.ts\");});\nd(\"customer-site/video/business-activity-analytics/index/template\", function(){ return i(\"customer-site/video/business-activity-analytics/index/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/index/controller\", function(){ return i(\"customer-site/video/business-activity-analytics/index/controller.js\");});\nd(\"customer-site/video/business-activity-analytics/index/route\", function(){ return i(\"customer-site/video/business-activity-analytics/index/route.js\");});\nd(\"customer-site/video/business-activity-analytics/reports/route\", function(){ return i(\"customer-site/video/business-activity-analytics/reports/route.ts\");});\nd(\"customer-site/video/business-activity-analytics/rule-group-list/template\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-group-list/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/rule-group-list/route\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-group-list/route.js\");});\nd(\"customer-site/video/business-activity-analytics/rule-group/template\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-group/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/rule-group/controller\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-group/controller.js\");});\nd(\"customer-site/video/business-activity-analytics/rule-group/route\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-group/route.js\");});\nd(\"customer-site/video/business-activity-analytics/rule-list/template\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-list/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/rule-list/controller\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-list/controller.js\");});\nd(\"customer-site/video/business-activity-analytics/rule-list/route\", function(){ return i(\"customer-site/video/business-activity-analytics/rule-list/route.js\");});\nd(\"customer-site/video/business-activity-analytics/rule/template\", function(){ return i(\"customer-site/video/business-activity-analytics/rule/template.hbs\");});\nd(\"customer-site/video/business-activity-analytics/rule/controller\", function(){ return i(\"customer-site/video/business-activity-analytics/rule/controller.js\");});\nd(\"customer-site/video/business-activity-analytics/rule/route\", function(){ return i(\"customer-site/video/business-activity-analytics/rule/route.js\");});\nd(\"customer-site/video/camera-groups/template\", function(){ return i(\"customer-site/video/camera-groups/template.hbs\");});\nd(\"customer-site/video/camera-groups/controller\", function(){ return i(\"customer-site/video/camera-groups/controller.ts\");});\nd(\"customer-site/video/camera-groups/route\", function(){ return i(\"customer-site/video/camera-groups/route.ts\");});\nd(\"customer-site/video/camera-groups/edit/template\", function(){ return i(\"customer-site/video/camera-groups/edit/template.hbs\");});\nd(\"customer-site/video/camera-groups/edit/route\", function(){ return i(\"customer-site/video/camera-groups/edit/route.ts\");});\nd(\"customer-site/video/cameras/template\", function(){ return i(\"customer-site/video/cameras/template.hbs\");});\nd(\"customer-site/video/cameras/route\", function(){ return i(\"customer-site/video/cameras/route.ts\");});\nd(\"customer-site/video/cameras/camera/template\", function(){ return i(\"customer-site/video/cameras/camera/template.hbs\");});\nd(\"customer-site/video/cameras/camera/controller\", function(){ return i(\"customer-site/video/cameras/camera/controller.ts\");});\nd(\"customer-site/video/cameras/camera/route\", function(){ return i(\"customer-site/video/cameras/camera/route.ts\");});\nd(\"customer-site/video/cameras/camera/analytics/template\", function(){ return i(\"customer-site/video/cameras/camera/analytics/template.hbs\");});\nd(\"customer-site/video/cameras/camera/analytics/controller\", function(){ return i(\"customer-site/video/cameras/camera/analytics/controller.ts\");});\nd(\"customer-site/video/cameras/camera/analytics/route\", function(){ return i(\"customer-site/video/cameras/camera/analytics/route.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/route\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/route.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/capture/template\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/capture/template.hbs\");});\nd(\"customer-site/video/cameras/camera/calibrate/capture/controller\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/capture/controller.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/capture/route\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/capture/route.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/edit/template\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/edit/template.hbs\");});\nd(\"customer-site/video/cameras/camera/calibrate/edit/controller\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/edit/controller.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/edit/route\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/edit/route.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/index/template\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/index/template.hbs\");});\nd(\"customer-site/video/cameras/camera/calibrate/index/controller\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/index/controller.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/index/route\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/index/route.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/review/template\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/review/template.hbs\");});\nd(\"customer-site/video/cameras/camera/calibrate/review/controller\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/review/controller.ts\");});\nd(\"customer-site/video/cameras/camera/calibrate/review/route\", function(){ return i(\"customer-site/video/cameras/camera/calibrate/review/route.ts\");});\nd(\"customer-site/video/cameras/camera/index/template\", function(){ return i(\"customer-site/video/cameras/camera/index/template.hbs\");});\nd(\"customer-site/video/cameras/camera/index/controller\", function(){ return i(\"customer-site/video/cameras/camera/index/controller.ts\");});\nd(\"customer-site/video/cameras/camera/index/route\", function(){ return i(\"customer-site/video/cameras/camera/index/route.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/chime-select/template\", function(){ return i(\"customer-site/video/cameras/camera/post-install/chime-select/template.hbs\");});\nd(\"customer-site/video/cameras/camera/post-install/chime-select/controller\", function(){ return i(\"customer-site/video/cameras/camera/post-install/chime-select/controller.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/chime-select/route\", function(){ return i(\"customer-site/video/cameras/camera/post-install/chime-select/route.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/power-check/template\", function(){ return i(\"customer-site/video/cameras/camera/post-install/power-check/template.hbs\");});\nd(\"customer-site/video/cameras/camera/post-install/power-check/controller\", function(){ return i(\"customer-site/video/cameras/camera/post-install/power-check/controller.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/power-check/route\", function(){ return i(\"customer-site/video/cameras/camera/post-install/power-check/route.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/template\", function(){ return i(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/template.hbs\");});\nd(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/controller\", function(){ return i(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/controller.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/route\", function(){ return i(\"customer-site/video/cameras/camera/post-install/qualitative-power-check/route.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/wedge-select/template\", function(){ return i(\"customer-site/video/cameras/camera/post-install/wedge-select/template.hbs\");});\nd(\"customer-site/video/cameras/camera/post-install/wedge-select/controller\", function(){ return i(\"customer-site/video/cameras/camera/post-install/wedge-select/controller.ts\");});\nd(\"customer-site/video/cameras/camera/post-install/wedge-select/route\", function(){ return i(\"customer-site/video/cameras/camera/post-install/wedge-select/route.ts\");});\nd(\"customer-site/video/cameras/index/template\", function(){ return i(\"customer-site/video/cameras/index/template.hbs\");});\nd(\"customer-site/video/cameras/index/controller\", function(){ return i(\"customer-site/video/cameras/index/controller.ts\");});\nd(\"customer-site/video/cameras/index/route\", function(){ return i(\"customer-site/video/cameras/index/route.ts\");});\nd(\"customer-site/video/classifier-visualization/template\", function(){ return i(\"customer-site/video/classifier-visualization/template.hbs\");});\nd(\"customer-site/video/classifier-visualization/controller\", function(){ return i(\"customer-site/video/classifier-visualization/controller.js\");});\nd(\"customer-site/video/classifier-visualization/route\", function(){ return i(\"customer-site/video/classifier-visualization/route.js\");});\nd(\"customer-site/video/clip-feedback/template\", function(){ return i(\"customer-site/video/clip-feedback/template.hbs\");});\nd(\"customer-site/video/clip-feedback/controller\", function(){ return i(\"customer-site/video/clip-feedback/controller.js\");});\nd(\"customer-site/video/clip-feedback/route\", function(){ return i(\"customer-site/video/clip-feedback/route.js\");});\nd(\"customer-site/video/clips-usage-report/template\", function(){ return i(\"customer-site/video/clips-usage-report/template.hbs\");});\nd(\"customer-site/video/clips-usage-report/controller\", function(){ return i(\"customer-site/video/clips-usage-report/controller.ts\");});\nd(\"customer-site/video/clips-usage-report/route\", function(){ return i(\"customer-site/video/clips-usage-report/route.ts\");});\nd(\"customer-site/video/clips/template\", function(){ return i(\"customer-site/video/clips/template.hbs\");});\nd(\"customer-site/video/clips/controller\", function(){ return i(\"customer-site/video/clips/controller.ts\");});\nd(\"customer-site/video/clips/route\", function(){ return i(\"customer-site/video/clips/route.ts\");});\nd(\"customer-site/video/clips/index/template\", function(){ return i(\"customer-site/video/clips/index/template.hbs\");});\nd(\"customer-site/video/clips/index/controller\", function(){ return i(\"customer-site/video/clips/index/controller.ts\");});\nd(\"customer-site/video/clips/index/route\", function(){ return i(\"customer-site/video/clips/index/route.ts\");});\nd(\"customer-site/video/drone-install/template\", function(){ return i(\"customer-site/video/drone-install/template.hbs\");});\nd(\"customer-site/video/drone-install/controller\", function(){ return i(\"customer-site/video/drone-install/controller.ts\");});\nd(\"customer-site/video/drone-install/route\", function(){ return i(\"customer-site/video/drone-install/route.ts\");});\nd(\"customer-site/video/familiar-subject-clip-feedback/template\", function(){ return i(\"customer-site/video/familiar-subject-clip-feedback/template.hbs\");});\nd(\"customer-site/video/familiar-subject-clip-feedback/controller\", function(){ return i(\"customer-site/video/familiar-subject-clip-feedback/controller.ts\");});\nd(\"customer-site/video/familiar-subject-clip-feedback/route\", function(){ return i(\"customer-site/video/familiar-subject-clip-feedback/route.ts\");});\nd(\"customer-site/video/gallery/template\", function(){ return i(\"customer-site/video/gallery/template.hbs\");});\nd(\"customer-site/video/gallery/controller\", function(){ return i(\"customer-site/video/gallery/controller.ts\");});\nd(\"customer-site/video/gallery/route\", function(){ return i(\"customer-site/video/gallery/route.ts\");});\nd(\"customer-site/video/gallery/index/template\", function(){ return i(\"customer-site/video/gallery/index/template.hbs\");});\nd(\"customer-site/video/gallery/index/controller\", function(){ return i(\"customer-site/video/gallery/index/controller.ts\");});\nd(\"customer-site/video/gallery/index/route\", function(){ return i(\"customer-site/video/gallery/index/route.ts\");});\nd(\"customer-site/video/install-overview/template\", function(){ return i(\"customer-site/video/install-overview/template.hbs\");});\nd(\"customer-site/video/install-overview/route\", function(){ return i(\"customer-site/video/install-overview/route.ts\");});\nd(\"customer-site/video/install-overview/index/template\", function(){ return i(\"customer-site/video/install-overview/index/template.hbs\");});\nd(\"customer-site/video/install-overview/index/route\", function(){ return i(\"customer-site/video/install-overview/index/route.ts\");});\nd(\"customer-site/video/install-overview/install/template\", function(){ return i(\"customer-site/video/install-overview/install/template.hbs\");});\nd(\"customer-site/video/install-overview/install/controller\", function(){ return i(\"customer-site/video/install-overview/install/controller.ts\");});\nd(\"customer-site/video/install-overview/install/route\", function(){ return i(\"customer-site/video/install-overview/install/route.ts\");});\nd(\"customer-site/video/install-overview/replace/template\", function(){ return i(\"customer-site/video/install-overview/replace/template.hbs\");});\nd(\"customer-site/video/install-overview/replace/controller\", function(){ return i(\"customer-site/video/install-overview/replace/controller.ts\");});\nd(\"customer-site/video/install-overview/replace/route\", function(){ return i(\"customer-site/video/install-overview/replace/route.ts\");});\nd(\"customer-site/video/intercom-contact/template\", function(){ return i(\"customer-site/video/intercom-contact/template.hbs\");});\nd(\"customer-site/video/intercom-contact/route\", function(){ return i(\"customer-site/video/intercom-contact/route.ts\");});\nd(\"customer-site/video/intercom-contact/edit/template\", function(){ return i(\"customer-site/video/intercom-contact/edit/template.hbs\");});\nd(\"customer-site/video/intercom-contact/edit/controller\", function(){ return i(\"customer-site/video/intercom-contact/edit/controller.ts\");});\nd(\"customer-site/video/intercom-contact/edit/route\", function(){ return i(\"customer-site/video/intercom-contact/edit/route.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/template\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/template.hbs\");});\nd(\"customer-site/video/intercom-contact/enrollment/route\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/route.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/edit/template\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/edit/template.hbs\");});\nd(\"customer-site/video/intercom-contact/enrollment/edit/controller\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/edit/controller.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/edit/route\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/edit/route.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/index/template\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/index/template.hbs\");});\nd(\"customer-site/video/intercom-contact/enrollment/index/controller\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/index/controller.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/notifications/template\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/notifications/template.hbs\");});\nd(\"customer-site/video/intercom-contact/enrollment/notifications/controller\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/notifications/controller.ts\");});\nd(\"customer-site/video/intercom-contact/enrollment/notifications/route\", function(){ return i(\"customer-site/video/intercom-contact/enrollment/notifications/route.ts\");});\nd(\"customer-site/video/intercom-contact/index/template\", function(){ return i(\"customer-site/video/intercom-contact/index/template.hbs\");});\nd(\"customer-site/video/intercom-contact/index/controller\", function(){ return i(\"customer-site/video/intercom-contact/index/controller.ts\");});\nd(\"customer-site/video/intercom-contact/notifications/template\", function(){ return i(\"customer-site/video/intercom-contact/notifications/template.hbs\");});\nd(\"customer-site/video/intercom-contact/notifications/controller\", function(){ return i(\"customer-site/video/intercom-contact/notifications/controller.ts\");});\nd(\"customer-site/video/intercom-contact/notifications/route\", function(){ return i(\"customer-site/video/intercom-contact/notifications/route.ts\");});\nd(\"customer-site/video/international-tests/template\", function(){ return i(\"customer-site/video/international-tests/template.hbs\");});\nd(\"customer-site/video/international-tests/controller\", function(){ return i(\"customer-site/video/international-tests/controller.js\");});\nd(\"customer-site/video/international-tests/route\", function(){ return i(\"customer-site/video/international-tests/route.js\");});\nd(\"customer-site/video/live-view/template\", function(){ return i(\"customer-site/video/live-view/template.hbs\");});\nd(\"customer-site/video/live-view/controller\", function(){ return i(\"customer-site/video/live-view/controller.ts\");});\nd(\"customer-site/video/live-view/route\", function(){ return i(\"customer-site/video/live-view/route.ts\");});\nd(\"customer-site/video/onboard/template\", function(){ return i(\"customer-site/video/onboard/template.hbs\");});\nd(\"customer-site/video/onboard/controller\", function(){ return i(\"customer-site/video/onboard/controller.ts\");});\nd(\"customer-site/video/onboard/route\", function(){ return i(\"customer-site/video/onboard/route.ts\");});\nd(\"customer-site/video/onvif-install/template\", function(){ return i(\"customer-site/video/onvif-install/template.hbs\");});\nd(\"customer-site/video/onvif-install/route\", function(){ return i(\"customer-site/video/onvif-install/route.ts\");});\nd(\"customer-site/video/onvif-install/credentials/template\", function(){ return i(\"customer-site/video/onvif-install/credentials/template.hbs\");});\nd(\"customer-site/video/onvif-install/credentials/controller\", function(){ return i(\"customer-site/video/onvif-install/credentials/controller.ts\");});\nd(\"customer-site/video/onvif-install/credentials/route\", function(){ return i(\"customer-site/video/onvif-install/credentials/route.ts\");});\nd(\"customer-site/video/onvif-install/index/template\", function(){ return i(\"customer-site/video/onvif-install/index/template.hbs\");});\nd(\"customer-site/video/onvif-install/index/controller\", function(){ return i(\"customer-site/video/onvif-install/index/controller.ts\");});\nd(\"customer-site/video/onvif-install/index/route\", function(){ return i(\"customer-site/video/onvif-install/index/route.ts\");});\nd(\"customer-site/video/onvif-install/naming/controller\", function(){ return i(\"customer-site/video/onvif-install/naming/controller.ts\");});\nd(\"customer-site/video/onvif-install/naming/route\", function(){ return i(\"customer-site/video/onvif-install/naming/route.ts\");});\nd(\"customer-site/video/onvif-install/naming/edit/template\", function(){ return i(\"customer-site/video/onvif-install/naming/edit/template.hbs\");});\nd(\"customer-site/video/onvif-install/naming/edit/controller\", function(){ return i(\"customer-site/video/onvif-install/naming/edit/controller.ts\");});\nd(\"customer-site/video/onvif-install/naming/edit/route\", function(){ return i(\"customer-site/video/onvif-install/naming/edit/route.ts\");});\nd(\"customer-site/video/onvif-install/naming/index/template\", function(){ return i(\"customer-site/video/onvif-install/naming/index/template.hbs\");});\nd(\"customer-site/video/onvif-install/naming/index/controller\", function(){ return i(\"customer-site/video/onvif-install/naming/index/controller.ts\");});\nd(\"customer-site/video/onvif-install/naming/index/route\", function(){ return i(\"customer-site/video/onvif-install/naming/index/route.ts\");});\nd(\"customer-site/video/onvif-install/terms-of-service/template\", function(){ return i(\"customer-site/video/onvif-install/terms-of-service/template.hbs\");});\nd(\"customer-site/video/onvif-install/terms-of-service/controller\", function(){ return i(\"customer-site/video/onvif-install/terms-of-service/controller.ts\");});\nd(\"customer-site/video/onvif-install/terms-of-service/route\", function(){ return i(\"customer-site/video/onvif-install/terms-of-service/route.ts\");});\nd(\"customer-site/video/rules/analytics/template\", function(){ return i(\"customer-site/video/rules/analytics/template.hbs\");});\nd(\"customer-site/video/rules/analytics/route\", function(){ return i(\"customer-site/video/rules/analytics/route.ts\");});\nd(\"customer-site/video/rules/analytics/draw/template\", function(){ return i(\"customer-site/video/rules/analytics/draw/template.hbs\");});\nd(\"customer-site/video/rules/analytics/draw/index/template\", function(){ return i(\"customer-site/video/rules/analytics/draw/index/template.hbs\");});\nd(\"customer-site/video/rules/analytics/draw/index/controller\", function(){ return i(\"customer-site/video/rules/analytics/draw/index/controller.ts\");});\nd(\"customer-site/video/rules/analytics/draw/index/route\", function(){ return i(\"customer-site/video/rules/analytics/draw/index/route.ts\");});\nd(\"customer-site/video/rules/analytics/draw/v2/template\", function(){ return i(\"customer-site/video/rules/analytics/draw/v2/template.hbs\");});\nd(\"customer-site/video/rules/analytics/draw/v2/controller\", function(){ return i(\"customer-site/video/rules/analytics/draw/v2/controller.ts\");});\nd(\"customer-site/video/rules/analytics/draw/v2/route\", function(){ return i(\"customer-site/video/rules/analytics/draw/v2/route.ts\");});\nd(\"customer-site/video/rules/analytics/index/route\", function(){ return i(\"customer-site/video/rules/analytics/index/route.js\");});\nd(\"customer-site/video/rules/analytics/select/template\", function(){ return i(\"customer-site/video/rules/analytics/select/template.hbs\");});\nd(\"customer-site/video/rules/analytics/select/controller\", function(){ return i(\"customer-site/video/rules/analytics/select/controller.js\");});\nd(\"customer-site/video/rules/analytics/select/route\", function(){ return i(\"customer-site/video/rules/analytics/select/route.js\");});\nd(\"customer-site/video/rules/analytics/settings/template\", function(){ return i(\"customer-site/video/rules/analytics/settings/template.hbs\");});\nd(\"customer-site/video/rules/analytics/settings/controller\", function(){ return i(\"customer-site/video/rules/analytics/settings/controller.ts\");});\nd(\"customer-site/video/rules/analytics/settings/route\", function(){ return i(\"customer-site/video/rules/analytics/settings/route.ts\");});\nd(\"customer-site/video/rules/index/template\", function(){ return i(\"customer-site/video/rules/index/template.hbs\");});\nd(\"customer-site/video/rules/index/controller\", function(){ return i(\"customer-site/video/rules/index/controller.js\");});\nd(\"customer-site/video/rules/index/route\", function(){ return i(\"customer-site/video/rules/index/route.js\");});\nd(\"customer-site/video/schedules/index/template\", function(){ return i(\"customer-site/video/schedules/index/template.hbs\");});\nd(\"customer-site/video/schedules/index/controller\", function(){ return i(\"customer-site/video/schedules/index/controller.js\");});\nd(\"customer-site/video/schedules/index/route\", function(){ return i(\"customer-site/video/schedules/index/route.js\");});\nd(\"customer-site/video/schedules/onboard/edit/template\", function(){ return i(\"customer-site/video/schedules/onboard/edit/template.hbs\");});\nd(\"customer-site/video/schedules/onboard/edit/controller\", function(){ return i(\"customer-site/video/schedules/onboard/edit/controller.ts\");});\nd(\"customer-site/video/schedules/onboard/edit/route\", function(){ return i(\"customer-site/video/schedules/onboard/edit/route.ts\");});\nd(\"customer-site/video/schedules/svr/edit/template\", function(){ return i(\"customer-site/video/schedules/svr/edit/template.hbs\");});\nd(\"customer-site/video/schedules/svr/edit/controller\", function(){ return i(\"customer-site/video/schedules/svr/edit/controller.ts\");});\nd(\"customer-site/video/schedules/svr/edit/route\", function(){ return i(\"customer-site/video/schedules/svr/edit/route.ts\");});\nd(\"customer-site/video/schedules/svr/select/template\", function(){ return i(\"customer-site/video/schedules/svr/select/template.hbs\");});\nd(\"customer-site/video/schedules/svr/select/controller\", function(){ return i(\"customer-site/video/schedules/svr/select/controller.js\");});\nd(\"customer-site/video/schedules/svr/select/route\", function(){ return i(\"customer-site/video/schedules/svr/select/route.js\");});\nd(\"customer-site/video/settings-overview/template\", function(){ return i(\"customer-site/video/settings-overview/template.hbs\");});\nd(\"customer-site/video/settings-overview/controller\", function(){ return i(\"customer-site/video/settings-overview/controller.ts\");});\nd(\"customer-site/video/settings-overview/route\", function(){ return i(\"customer-site/video/settings-overview/route.ts\");});\nd(\"customer-site/video/settings/advanced-setup/template\", function(){ return i(\"customer-site/video/settings/advanced-setup/template.hbs\");});\nd(\"customer-site/video/settings/advanced-setup/controller\", function(){ return i(\"customer-site/video/settings/advanced-setup/controller.ts\");});\nd(\"customer-site/video/settings/advanced-setup/route\", function(){ return i(\"customer-site/video/settings/advanced-setup/route.ts\");});\nd(\"customer-site/video/settings/battery-motion-sensitivity-settings/template\", function(){ return i(\"customer-site/video/settings/battery-motion-sensitivity-settings/template.hbs\");});\nd(\"customer-site/video/settings/battery-motion-sensitivity-settings/route\", function(){ return i(\"customer-site/video/settings/battery-motion-sensitivity-settings/route.ts\");});\nd(\"customer-site/video/settings/battery-status/template\", function(){ return i(\"customer-site/video/settings/battery-status/template.hbs\");});\nd(\"customer-site/video/settings/battery-status/route\", function(){ return i(\"customer-site/video/settings/battery-status/route.ts\");});\nd(\"customer-site/video/settings/camera/template\", function(){ return i(\"customer-site/video/settings/camera/template.hbs\");});\nd(\"customer-site/video/settings/camera/route\", function(){ return i(\"customer-site/video/settings/camera/route.ts\");});\nd(\"customer-site/video/settings/camera/alerts/template\", function(){ return i(\"customer-site/video/settings/camera/alerts/template.hbs\");});\nd(\"customer-site/video/settings/camera/alerts/controller\", function(){ return i(\"customer-site/video/settings/camera/alerts/controller.ts\");});\nd(\"customer-site/video/settings/camera/alerts/route\", function(){ return i(\"customer-site/video/settings/camera/alerts/route.ts\");});\nd(\"customer-site/video/settings/camera/audio/template\", function(){ return i(\"customer-site/video/settings/camera/audio/template.hbs\");});\nd(\"customer-site/video/settings/camera/audio/controller\", function(){ return i(\"customer-site/video/settings/camera/audio/controller.ts\");});\nd(\"customer-site/video/settings/camera/audio/route\", function(){ return i(\"customer-site/video/settings/camera/audio/route.ts\");});\nd(\"customer-site/video/settings/camera/device-status/template\", function(){ return i(\"customer-site/video/settings/camera/device-status/template.hbs\");});\nd(\"customer-site/video/settings/camera/device-status/controller\", function(){ return i(\"customer-site/video/settings/camera/device-status/controller.ts\");});\nd(\"customer-site/video/settings/camera/device-status/route\", function(){ return i(\"customer-site/video/settings/camera/device-status/route.ts\");});\nd(\"customer-site/video/settings/camera/general/template\", function(){ return i(\"customer-site/video/settings/camera/general/template.hbs\");});\nd(\"customer-site/video/settings/camera/general/route\", function(){ return i(\"customer-site/video/settings/camera/general/route.ts\");});\nd(\"customer-site/video/settings/camera/general/firmware/template\", function(){ return i(\"customer-site/video/settings/camera/general/firmware/template.hbs\");});\nd(\"customer-site/video/settings/camera/general/firmware/controller\", function(){ return i(\"customer-site/video/settings/camera/general/firmware/controller.ts\");});\nd(\"customer-site/video/settings/camera/general/firmware/route\", function(){ return i(\"customer-site/video/settings/camera/general/firmware/route.ts\");});\nd(\"customer-site/video/settings/camera/general/index/template\", function(){ return i(\"customer-site/video/settings/camera/general/index/template.hbs\");});\nd(\"customer-site/video/settings/camera/general/index/controller\", function(){ return i(\"customer-site/video/settings/camera/general/index/controller.ts\");});\nd(\"customer-site/video/settings/camera/general/index/route\", function(){ return i(\"customer-site/video/settings/camera/general/index/route.ts\");});\nd(\"customer-site/video/settings/camera/index/template\", function(){ return i(\"customer-site/video/settings/camera/index/template.hbs\");});\nd(\"customer-site/video/settings/camera/index/controller\", function(){ return i(\"customer-site/video/settings/camera/index/controller.ts\");});\nd(\"customer-site/video/settings/camera/index/route\", function(){ return i(\"customer-site/video/settings/camera/index/route.ts\");});\nd(\"customer-site/video/settings/camera/lights-overview/template\", function(){ return i(\"customer-site/video/settings/camera/lights-overview/template.hbs\");});\nd(\"customer-site/video/settings/camera/lights-overview/controller\", function(){ return i(\"customer-site/video/settings/camera/lights-overview/controller.ts\");});\nd(\"customer-site/video/settings/camera/lights-overview/route\", function(){ return i(\"customer-site/video/settings/camera/lights-overview/route.ts\");});\nd(\"customer-site/video/settings/camera/network-info/route\", function(){ return i(\"customer-site/video/settings/camera/network-info/route.ts\");});\nd(\"customer-site/video/settings/camera/network-info/index/template\", function(){ return i(\"customer-site/video/settings/camera/network-info/index/template.hbs\");});\nd(\"customer-site/video/settings/camera/network-info/index/controller\", function(){ return i(\"customer-site/video/settings/camera/network-info/index/controller.ts\");});\nd(\"customer-site/video/settings/camera/network-info/index/route\", function(){ return i(\"customer-site/video/settings/camera/network-info/index/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/clip-length/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-length/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/clip-length/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-length/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/clip-length/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-length/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/clip-quality/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-quality/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/clip-quality/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-quality/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/clip-quality/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/clip-quality/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/digital-fov/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/digital-fov/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/digital-fov/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/digital-fov/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/digital-fov/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/digital-fov/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/image-settings/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/image-settings/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/image-settings/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/image-settings/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/image-settings/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/image-settings/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/index/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/index/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/index/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/index/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/index/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/index/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/privacy-zones/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/privacy-zones/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/privacy-zones/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/privacy-zones/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/privacy-zones/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/privacy-zones/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/sd-card-info/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/sd-card-info/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/sd-card-info/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/sd-card-info/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/sd-card-info/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/sd-card-info/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/edit/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/index/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/index/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/index/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/index/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/third-party-stream/index/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/third-party-stream/index/route.ts\");});\nd(\"customer-site/video/settings/camera/video-config/varifocal-fov/template\", function(){ return i(\"customer-site/video/settings/camera/video-config/varifocal-fov/template.hbs\");});\nd(\"customer-site/video/settings/camera/video-config/varifocal-fov/controller\", function(){ return i(\"customer-site/video/settings/camera/video-config/varifocal-fov/controller.ts\");});\nd(\"customer-site/video/settings/camera/video-config/varifocal-fov/route\", function(){ return i(\"customer-site/video/settings/camera/video-config/varifocal-fov/route.ts\");});\nd(\"customer-site/video/settings/digital-fov/template\", function(){ return i(\"customer-site/video/settings/digital-fov/template.hbs\");});\nd(\"customer-site/video/settings/digital-fov/controller\", function(){ return i(\"customer-site/video/settings/digital-fov/controller.ts\");});\nd(\"customer-site/video/settings/digital-fov/route\", function(){ return i(\"customer-site/video/settings/digital-fov/route.ts\");});\nd(\"customer-site/video/settings/enrollment-terms/template\", function(){ return i(\"customer-site/video/settings/enrollment-terms/template.hbs\");});\nd(\"customer-site/video/settings/enrollment-terms/controller\", function(){ return i(\"customer-site/video/settings/enrollment-terms/controller.ts\");});\nd(\"customer-site/video/settings/enrollment-terms/route\", function(){ return i(\"customer-site/video/settings/enrollment-terms/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/camera-access/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/camera-access/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/faces/camera-access/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/camera-access/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/feature-management/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/feature-management/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/faces/feature-management/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/feature-management/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/feature-management/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/feature-management/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/incorrect-photos/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/incorrect-photos/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/faces/incorrect-photos/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/incorrect-photos/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/index/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/index/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/faces/index/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/index/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/index/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/index/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/faces/recent-images/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/recent-images/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/faces/recent-images/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/faces/recent-images/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/index/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/index/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/index/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/index/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/review/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/edit/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/edit/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/review/edit/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/edit/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/edit/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/edit/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/index/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/index/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/review/index/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/index/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/index/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/index/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/notifications/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/notifications/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/review/notifications/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/notifications/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/notifications/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/notifications/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/photos/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/photos/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/review/photos/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/photos/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/review/photos/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/review/photos/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/camera-access/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/camera-access/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/camera-access/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/camera-access/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/faq/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/faq/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/faq/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/faq/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/faq/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/faq/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/feature-management/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/incorrect-photos/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/incorrect-photos/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/incorrect-photos/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/incorrect-photos/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/index/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/index/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/index/controller\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/index/controller.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/index/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/index/route.ts\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/recent-images/template\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/recent-images/template.hbs\");});\nd(\"customer-site/video/settings/familiar-subject/vehicles/recent-images/route\", function(){ return i(\"customer-site/video/settings/familiar-subject/vehicles/recent-images/route.ts\");});\nd(\"customer-site/video/settings/intercom/add-directory/template\", function(){ return i(\"customer-site/video/settings/intercom/add-directory/template.hbs\");});\nd(\"customer-site/video/settings/intercom/add-directory/controller\", function(){ return i(\"customer-site/video/settings/intercom/add-directory/controller.ts\");});\nd(\"customer-site/video/settings/intercom/add-directory/route\", function(){ return i(\"customer-site/video/settings/intercom/add-directory/route.ts\");});\nd(\"customer-site/video/settings/intercom/associated-device-select/template\", function(){ return i(\"customer-site/video/settings/intercom/associated-device-select/template.hbs\");});\nd(\"customer-site/video/settings/intercom/associated-device-select/controller\", function(){ return i(\"customer-site/video/settings/intercom/associated-device-select/controller.ts\");});\nd(\"customer-site/video/settings/intercom/associated-device-select/route\", function(){ return i(\"customer-site/video/settings/intercom/associated-device-select/route.ts\");});\nd(\"customer-site/video/settings/intercom/connect-unit-to-system/template\", function(){ return i(\"customer-site/video/settings/intercom/connect-unit-to-system/template.hbs\");});\nd(\"customer-site/video/settings/intercom/connect-unit-to-system/controller\", function(){ return i(\"customer-site/video/settings/intercom/connect-unit-to-system/controller.ts\");});\nd(\"customer-site/video/settings/intercom/connect-unit-to-system/route\", function(){ return i(\"customer-site/video/settings/intercom/connect-unit-to-system/route.ts\");});\nd(\"customer-site/video/settings/intercom/create-directory/template\", function(){ return i(\"customer-site/video/settings/intercom/create-directory/template.hbs\");});\nd(\"customer-site/video/settings/intercom/create-directory/controller\", function(){ return i(\"customer-site/video/settings/intercom/create-directory/controller.ts\");});\nd(\"customer-site/video/settings/intercom/create-directory/route\", function(){ return i(\"customer-site/video/settings/intercom/create-directory/route.ts\");});\nd(\"customer-site/video/settings/intercom/customize-directory/template\", function(){ return i(\"customer-site/video/settings/intercom/customize-directory/template.hbs\");});\nd(\"customer-site/video/settings/intercom/customize-directory/controller\", function(){ return i(\"customer-site/video/settings/intercom/customize-directory/controller.ts\");});\nd(\"customer-site/video/settings/intercom/customize-directory/route\", function(){ return i(\"customer-site/video/settings/intercom/customize-directory/route.ts\");});\nd(\"customer-site/video/settings/intercom/edit-directory/template\", function(){ return i(\"customer-site/video/settings/intercom/edit-directory/template.hbs\");});\nd(\"customer-site/video/settings/intercom/edit-directory/controller\", function(){ return i(\"customer-site/video/settings/intercom/edit-directory/controller.ts\");});\nd(\"customer-site/video/settings/intercom/edit-directory/route\", function(){ return i(\"customer-site/video/settings/intercom/edit-directory/route.ts\");});\nd(\"customer-site/video/settings/intercom/name-directory-list/template\", function(){ return i(\"customer-site/video/settings/intercom/name-directory-list/template.hbs\");});\nd(\"customer-site/video/settings/intercom/name-directory-list/controller\", function(){ return i(\"customer-site/video/settings/intercom/name-directory-list/controller.ts\");});\nd(\"customer-site/video/settings/intercom/name-directory-list/route\", function(){ return i(\"customer-site/video/settings/intercom/name-directory-list/route.ts\");});\nd(\"customer-site/video/settings/intercom/qr-code/template\", function(){ return i(\"customer-site/video/settings/intercom/qr-code/template.hbs\");});\nd(\"customer-site/video/settings/intercom/qr-code/controller\", function(){ return i(\"customer-site/video/settings/intercom/qr-code/controller.ts\");});\nd(\"customer-site/video/settings/intercom/qr-code/route\", function(){ return i(\"customer-site/video/settings/intercom/qr-code/route.ts\");});\nd(\"customer-site/video/settings/intercom/set-concierge/template\", function(){ return i(\"customer-site/video/settings/intercom/set-concierge/template.hbs\");});\nd(\"customer-site/video/settings/intercom/set-concierge/controller\", function(){ return i(\"customer-site/video/settings/intercom/set-concierge/controller.ts\");});\nd(\"customer-site/video/settings/intercom/set-concierge/route\", function(){ return i(\"customer-site/video/settings/intercom/set-concierge/route.ts\");});\nd(\"customer-site/video/settings/intercom/setup/template\", function(){ return i(\"customer-site/video/settings/intercom/setup/template.hbs\");});\nd(\"customer-site/video/settings/intercom/setup/controller\", function(){ return i(\"customer-site/video/settings/intercom/setup/controller.ts\");});\nd(\"customer-site/video/settings/intercom/setup/route\", function(){ return i(\"customer-site/video/settings/intercom/setup/route.ts\");});\nd(\"customer-site/video/settings/intercom/video-device-select/template\", function(){ return i(\"customer-site/video/settings/intercom/video-device-select/template.hbs\");});\nd(\"customer-site/video/settings/intercom/video-device-select/controller\", function(){ return i(\"customer-site/video/settings/intercom/video-device-select/controller.ts\");});\nd(\"customer-site/video/settings/intercom/video-device-select/route\", function(){ return i(\"customer-site/video/settings/intercom/video-device-select/route.ts\");});\nd(\"customer-site/video/settings/light-triggers/template\", function(){ return i(\"customer-site/video/settings/light-triggers/template.hbs\");});\nd(\"customer-site/video/settings/light-triggers/controller\", function(){ return i(\"customer-site/video/settings/light-triggers/controller.ts\");});\nd(\"customer-site/video/settings/light-triggers/route\", function(){ return i(\"customer-site/video/settings/light-triggers/route.ts\");});\nd(\"customer-site/video/settings/lights/template\", function(){ return i(\"customer-site/video/settings/lights/template.hbs\");});\nd(\"customer-site/video/settings/lights/controller\", function(){ return i(\"customer-site/video/settings/lights/controller.ts\");});\nd(\"customer-site/video/settings/lights/route\", function(){ return i(\"customer-site/video/settings/lights/route.ts\");});\nd(\"customer-site/video/settings/motion-configuration/template\", function(){ return i(\"customer-site/video/settings/motion-configuration/template.hbs\");});\nd(\"customer-site/video/settings/motion-configuration/controller\", function(){ return i(\"customer-site/video/settings/motion-configuration/controller.ts\");});\nd(\"customer-site/video/settings/motion-configuration/route\", function(){ return i(\"customer-site/video/settings/motion-configuration/route.ts\");});\nd(\"customer-site/video/settings/motion-detection-test/template\", function(){ return i(\"customer-site/video/settings/motion-detection-test/template.hbs\");});\nd(\"customer-site/video/settings/motion-detection-test/route\", function(){ return i(\"customer-site/video/settings/motion-detection-test/route.ts\");});\nd(\"customer-site/video/settings/motion-detection/template\", function(){ return i(\"customer-site/video/settings/motion-detection/template.hbs\");});\nd(\"customer-site/video/settings/motion-detection/controller\", function(){ return i(\"customer-site/video/settings/motion-detection/controller.ts\");});\nd(\"customer-site/video/settings/motion-detection/route\", function(){ return i(\"customer-site/video/settings/motion-detection/route.ts\");});\nd(\"customer-site/video/settings/privacy-zones/template\", function(){ return i(\"customer-site/video/settings/privacy-zones/template.hbs\");});\nd(\"customer-site/video/settings/privacy-zones/controller\", function(){ return i(\"customer-site/video/settings/privacy-zones/controller.ts\");});\nd(\"customer-site/video/settings/privacy-zones/route\", function(){ return i(\"customer-site/video/settings/privacy-zones/route.ts\");});\nd(\"customer-site/video/settings/sd-card-management/template\", function(){ return i(\"customer-site/video/settings/sd-card-management/template.hbs\");});\nd(\"customer-site/video/settings/sd-card-management/controller\", function(){ return i(\"customer-site/video/settings/sd-card-management/controller.ts\");});\nd(\"customer-site/video/settings/sd-card-management/route\", function(){ return i(\"customer-site/video/settings/sd-card-management/route.ts\");});\nd(\"customer-site/video/settings/signal-strength-info/template\", function(){ return i(\"customer-site/video/settings/signal-strength-info/template.hbs\");});\nd(\"customer-site/video/settings/signal-strength-info/controller\", function(){ return i(\"customer-site/video/settings/signal-strength-info/controller.ts\");});\nd(\"customer-site/video/settings/signal-strength-info/route\", function(){ return i(\"customer-site/video/settings/signal-strength-info/route.ts\");});\nd(\"customer-site/video/settings/stream-video-panel-v2/template\", function(){ return i(\"customer-site/video/settings/stream-video-panel-v2/template.hbs\");});\nd(\"customer-site/video/settings/stream-video-panel-v2/controller\", function(){ return i(\"customer-site/video/settings/stream-video-panel-v2/controller.ts\");});\nd(\"customer-site/video/settings/stream-video-panel-v2/route\", function(){ return i(\"customer-site/video/settings/stream-video-panel-v2/route.ts\");});\nd(\"customer-site/video/settings/stream-video-panel/template\", function(){ return i(\"customer-site/video/settings/stream-video-panel/template.hbs\");});\nd(\"customer-site/video/settings/stream-video-panel/controller\", function(){ return i(\"customer-site/video/settings/stream-video-panel/controller.ts\");});\nd(\"customer-site/video/settings/stream-video-panel/route\", function(){ return i(\"customer-site/video/settings/stream-video-panel/route.ts\");});\nd(\"customer-site/video/settings/stream/route\", function(){ return i(\"customer-site/video/settings/stream/route.ts\");});\nd(\"customer-site/video/settings/stream/index/template\", function(){ return i(\"customer-site/video/settings/stream/index/template.hbs\");});\nd(\"customer-site/video/settings/stream/index/controller\", function(){ return i(\"customer-site/video/settings/stream/index/controller.ts\");});\nd(\"customer-site/video/settings/stream/index/route\", function(){ return i(\"customer-site/video/settings/stream/index/route.ts\");});\nd(\"customer-site/video/settings/varifocal-fov/template\", function(){ return i(\"customer-site/video/settings/varifocal-fov/template.hbs\");});\nd(\"customer-site/video/settings/varifocal-fov/controller\", function(){ return i(\"customer-site/video/settings/varifocal-fov/controller.ts\");});\nd(\"customer-site/video/settings/varifocal-fov/route\", function(){ return i(\"customer-site/video/settings/varifocal-fov/route.ts\");});\nd(\"customer-site/video/settings/video-device-signal-strength/template\", function(){ return i(\"customer-site/video/settings/video-device-signal-strength/template.hbs\");});\nd(\"customer-site/video/settings/video-device-signal-strength/controller\", function(){ return i(\"customer-site/video/settings/video-device-signal-strength/controller.ts\");});\nd(\"customer-site/video/settings/video-device-signal-strength/route\", function(){ return i(\"customer-site/video/settings/video-device-signal-strength/route.ts\");});\nd(\"customer-site/video/svr-timeline/template\", function(){ return i(\"customer-site/video/svr-timeline/template.hbs\");});\nd(\"customer-site/video/svr-timeline/controller\", function(){ return i(\"customer-site/video/svr-timeline/controller.ts\");});\nd(\"customer-site/video/svr-timeline/route\", function(){ return i(\"customer-site/video/svr-timeline/route.ts\");});\nd(\"customer-site/video/thumbnail-search/template\", function(){ return i(\"customer-site/video/thumbnail-search/template.hbs\");});\nd(\"customer-site/video/thumbnail-search/controller\", function(){ return i(\"customer-site/video/thumbnail-search/controller.ts\");});\nd(\"customer-site/video/thumbnail-search/route\", function(){ return i(\"customer-site/video/thumbnail-search/route.ts\");});\nd(\"customer-site/video/youtube-player/template\", function(){ return i(\"customer-site/video/youtube-player/template.hbs\");});\nd(\"customer-site/video/youtube-player/route\", function(){ return i(\"customer-site/video/youtube-player/route.ts\");});\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{tc this \\'doYouWantToAddThis\\'}}\\n
\\n \\n
\\n
\\n {{#if @markAsIncorrect}}\\n
\\n \\n {{/if}}\\n {{#if @deletePhoto}}\\n
\\n \\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/action-sheets/video/familiar-target-incorrect-move/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport './_style.scss';\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\n\ninterface FamiliarTargetIncorrectMoveActionSheetSignature {\n Args: {\n isActive: boolean;\n closeActionSheet: () => void;\n cluster?: FamiliarTargetEnrollmentCluster;\n clusterToHide: FamiliarTargetEnrollmentCluster;\n deletePhoto: () => void;\n enrollment: FamiliarTargetEnrollment;\n moveImagesToSubject: (subject: FamiliarTargetEnrollmentCluster) => Promise;\n nameAndCreateSubject: () => void;\n photo?: FamiliarTargetEnrollmentImage;\n isImageReviewed?: boolean;\n markAsIncorrect?: VoidFunction;\n };\n}\n\n/**\n * An action sheet for moving a photo, marking it as incorrect, or deleting it\n */\n@intlPath({ path: 'action-sheets/video/familiar-target-incorrect-move' })\nexport default class FamiliarTargetIncorrectMoveActionSheet extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Change what text is displayed based on what familiar object type is there\n */\n get unfamiliarLabel(): Promise {\n return (async () => {\n const enrollment = await this.args.enrollment;\n\n return enrollment.familiarObjectType === Face\n ? this.intl.tc(this, 'unfamiliarFace')\n : this.intl.tc(this, 'unfamiliarVehicle');\n })();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'ActionSheets::Video::FamiliarTargetIncorrectMove': typeof FamiliarTargetIncorrectMoveActionSheet;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{this.actionSheetPhotoDateString}}\\n \\n\",{ moduleName: \"customer-site/components/action-sheets/video/familiar-target-view-photo/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { getActionSheetPhotoDateString } from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\n\nexport type fnTargetSelected = (target?: FamiliarTargetEnrollmentCluster) => Promise;\n\ninterface FamiliarTargetViewPhotoSignature {\n Args: {\n isActive: boolean;\n cameraDescription: string;\n photoDate: Date;\n photoDescription: string;\n closeActionSheet: () => void;\n photoAltText: string;\n photoUrl: string;\n enrollment: FamiliarTargetEnrollment;\n isFeedbackCard: boolean;\n };\n}\n\n/**\n * Action sheet for viewing an enrollment photo and its details\n */\n@intlPath({ path: 'action-sheets.video.familiar-target-view-photo' })\nexport default class FamiliarTargetViewPhoto extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * The text string which indicates when an action sheet photo was taken\n */\n @computed('args.photoDate')\n get actionSheetPhotoDateString(): ReturnType {\n return getActionSheetPhotoDateString(this.intl, this.args.photoDate);\n }\n\n /**\n * The label for the camera that took the image\n */\n @computed('args.cameraDescription')\n get cameraTitle(): Promise {\n return (async () => {\n const name = await this.args.cameraDescription;\n return name ? this.intl.tc(this, 'fromCamera', { name }) : this.intl.tc(this, 'fromDeletedCamera');\n })();\n }\n\n /**\n * The CSS class for the image container\n */\n get shouldDisplayEntireImage(): boolean {\n return this.args.enrollment.familiarObjectType === Face && !this.args.isFeedbackCard;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'ActionSheets::Video::FamiliarTargetViewPhoto': typeof FamiliarTargetViewPhoto;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#unless @useStoriesUI}}\\n
{{t \\'components.automation.at-home-exceptions.title\\'}}
\\n{{/unless}}\\n\\n{{#if @showPanelExceptions}}\\n
\\n {{t \\'generic.devices.partitions\\'}}\\n
\\n \\n \\n {{t \\'video.rules.analytics.draw.selectingAllExceptionsWarning\\'}}\\n \\n{{/if}}\\n\\n{{#if @showExitDelay}}\\n \\n{{else if (and @canUseExitDelay @rule.exceptions.length)}}\\n \\n{{/if}}\\n\\n{{#if this.showGeoExceptions}}\\n
\\n {{t \\'components.automation.at-home-exceptions.geoFence\\'}}\\n
\\n \\n
\\n

{{t \\'components.automation.at-home-exceptions.geoDirections\\'}}

\\n \\n
\\n{{/if}}\\n\\n{{#if @showExceptionsChangedWarning}}\\n

{{t \\'components.automation.at-home-exceptions.exceptionsChangedWarning\\'}}

\\n{{/if}}\\n\",{ moduleName: \"customer-site/components/automation/at-home-exceptions/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { getObjProperties } from '@adc/ember-utils/utils/ember-helpers';\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/no-classic-components\nimport Component from '@ember/component';\nimport { action, computed, set, setProperties } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport CheckboxTreeItem, { UNSELECTED, SELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport { Disarmed, ArmedStay, GeoFence, ArmedAway } from '../../../enums/RecordingException';\nimport { initializeState } from '../../component-helpers';\n\nimport './_style.scss';\n\n/**\n * Notifies consumers that the exception state has changed.\n *\n * @param {Object} overrides Exception values to override.\n *\n * @private\n * @instance\n * @memberof components.automation.AtHomeExceptions\n */\nfunction sendAction(overrides) {\n // Get current exception values.\n const exceptionValues = this.exceptionValues;\n\n // Update arming states and devices.\n setProperties(exceptionValues, overrides);\n\n // Use closure action.\n this.atHomeExceptionsChanged(exceptionValues);\n}\n\n/**\n * Exception items to display in a checkbox tree.\n *\n * @function\n * @returns {Array}\n */\nfunction getExceptionsToDisplay(\n disabled,\n devices,\n exceptionStates,\n geoDevices,\n partitions,\n showGeoExceptions,\n showPanelExceptions\n) {\n const items = [],\n fnCreateItem = (name, value, icon, disabled, isSelected = false, subitems = undefined) =>\n CheckboxTreeItem.create({\n name,\n value: String(value),\n icon,\n disabled: disabled || icon === this.disabledPanelException,\n state: isSelected ? SELECTED : UNSELECTED,\n subitems\n });\n\n // Should we show panel exceptions?\n if (showPanelExceptions) {\n // Add \"ArmedStay\" and \"ArmedAway\" checkboxes to tree only if one of the partitions on the system isn't armed only.\n const panelExceptionArmingItems = [['panelDisarmed', Disarmed, 'system-disarmed-hd']];\n if (partitions && !partitions.every((partition) => partition.isArmedOnly())) {\n panelExceptionArmingItems.push(['panelArmedStay', ArmedStay, 'system-armed-stay-hd']);\n if (this.canUseAwayException) {\n panelExceptionArmingItems.push(['panelArmedAway', ArmedAway, 'system-armed-away-hd']);\n }\n }\n\n // Add panel exception items.\n panelExceptionArmingItems.forEach(([key, state, icon]) =>\n items.push(\n fnCreateItem(\n this.intl.t(`components.automation.at-home-exceptions.${key}`),\n state,\n icon,\n disabled,\n exceptionStates.includes(state)\n )\n )\n );\n }\n\n // Should we show geo based exceptions?\n if (showGeoExceptions) {\n // Add one item for geo-fence with sub-items for each device.\n items.push(\n fnCreateItem(\n this.intl.t('components.automation.at-home-exceptions.geoDevices'),\n GeoFence,\n 'feature-geo-services',\n disabled,\n exceptionStates.includes(GeoFence),\n geoDevices.map((item) => {\n return fnCreateItem(\n item.name,\n item.id,\n item.isCurrentDevice ? 'this-device-mobile' : 'mobile',\n disabled,\n devices.includes(item.id)\n );\n })\n )\n );\n }\n\n return items;\n}\n\n/**\n * @classdesc\n * A component for showing at home exceptions for automation and video rules.\n *\n * @class AtHomeExceptions\n * @extends Ember.Component\n * @memberof components.automation\n */\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/require-tagless-components, ember/no-classic-classes\nconst AtHomeExceptions = Component.extend(\n /** @lends components.automation.AtHomeExceptions# */ {\n intl: service(),\n store: service(),\n identityManager: service(),\n\n classNames: ['at-home-exceptions'],\n\n /** @override */\n init() {\n this._super(...arguments);\n\n // Initialize non-scalar instance values.\n initializeState(this, {\n exceptionValues: {\n exceptionStates: [],\n devices: [],\n fenceId: undefined\n }\n });\n },\n\n /**\n * Closure action called when exception status changes.\n */\n atHomeExceptionsChanged() {},\n\n /**\n * Whether all the exception elements should be disabled.\n *\n * @type {boolean}\n */\n disabled: false,\n\n /**\n * The current exception values.\n *\n * @type {AtHomeExceptionsType}\n */\n exceptionValues: undefined,\n\n /**\n * Whether to show the panel based exceptions.\n *\n * @type {boolean}\n */\n showPanelExceptions: false,\n\n /**\n * The collection of geo devices to use for geolocation fences.\n *\n * @type {Array}\n */\n geoDevices: null,\n\n /**\n * The collection of geolocation fences.\n *\n * @type {Array}\n */\n geoFences: null,\n\n /**\n * The collection of partitions\n *\n * @type {Array e !== GeoFence),\n availablePanelExceptions = [Disarmed, ArmedStay, ArmedAway],\n exceptionToIcon = new Map([\n [0, 'none'],\n [Disarmed, 'system-disarmed-hd'],\n [ArmedStay, 'system-armed-stay-hd'],\n [ArmedAway, 'system-armed-away-hd']\n ]),\n disabledException =\n selectedPanelExceptions.length === maxPanelExceptions\n ? availablePanelExceptions.filter((e) => !selectedPanelExceptions.includes(e))[0]\n : 0;\n return exceptionToIcon.get(disabledException);\n }),\n\n /**\n * The panel exception items to display in the checkbox tree.\n *\n * @function\n * @returns {Array}\n */\n panelExceptionItems: computed(\n 'disabled',\n 'exceptionValues.{devices,exceptionStates}',\n 'geoDevices',\n 'partitions',\n 'showPanelExceptions',\n function () {\n const showGeoExceptions = false;\n return getExceptionsToDisplay.call(\n this,\n this.disabled,\n this.exceptionValues.devices,\n this.exceptionValues.exceptionStates,\n this.geoDevices,\n this.partitions,\n showGeoExceptions,\n this.showPanelExceptions\n );\n }\n ),\n\n /**\n * The geo exception items to display in the checkbox tree.\n *\n * @function\n * @returns {Array}\n */\n geoExceptionItems: computed(\n 'disabled',\n 'exceptionValues.{devices,exceptionStates}',\n 'geoDevices',\n 'partitions',\n 'showGeoExceptions',\n function () {\n const showPanelExceptions = false;\n return getExceptionsToDisplay.call(\n this,\n this.disabled,\n this.exceptionValues.devices,\n this.exceptionValues.exceptionStates,\n this.geoDevices,\n this.partitions,\n this.showGeoExceptions,\n showPanelExceptions\n );\n }\n ),\n\n /**\n * Items representing all the geolocation fences within the current system.\n *\n * @function\n * @returns {Array}\n */\n geoFenceItems: computed('exceptionValues', 'geoFences', function () {\n const [geoFences, exceptionValues] = getObjProperties(this, 'geoFences', 'exceptionValues');\n let fenceId = exceptionValues.fenceId;\n\n // Are there fences but no selected existing fence ID?\n const geoFenceIds = geoFences.map((f) => f.id);\n if (geoFences.length && (!fenceId || !geoFenceIds.includes(fenceId))) {\n // Select first geo-fence.\n fenceId = set(exceptionValues, 'fenceId', geoFences.get('firstObject.id'));\n }\n\n return geoFences.map((fence) => {\n const id = fence.get('id');\n\n return DropdownSelectItem.create({\n name: fence.name,\n value: id,\n state: id === fenceId ? SELECTED : UNSELECTED\n });\n });\n }),\n\n /**\n * Updates the exception properties on the rule.\n *\n * @function\n * @param {Array} exceptions The current combined exception settings from the checkbox trees.\n */\n exceptionsChanged: action(function (exceptions) {\n const fnFilterExceptions = (items, fn = (value) => value) =>\n items.filter((item) => item.state !== UNSELECTED).map((item) => fn(item.value));\n\n sendAction.call(this, {\n exceptionStates: fnFilterExceptions(exceptions, Number),\n devices: fnFilterExceptions(\n (exceptions.find((item) => item.value === GeoFence.toString()) || {}).subitems || []\n )\n });\n }),\n\n /**\n * Called when the panel exceptions selection changes.\n *\n * @function\n * @param {Array} exceptions The current panel exception settings from the checkbox tree.\n */\n panelExceptionsChanged: action(async function (exceptions) {\n this.exceptionsChanged.call(this, exceptions.concat(this.geoExceptionItems));\n const delayResult = await this.store.findRecord(\n 'video/permissions/ov-rule-permission',\n this.identityManager.getSelectedSystemId()\n );\n if (delayResult) {\n this.rule.exitDelay = delayResult.videoRuleExitDelayDefault;\n }\n }),\n\n /**\n * Called when the geo-fence exceptions selection changes.\n *\n * @function\n * @param {Array} exceptions The current geo exception settings from the checkbox tree.\n */\n geoExceptionsChanged: action(function (exceptions) {\n this.exceptionsChanged.call(this, exceptions.concat(this.panelExceptionItems));\n }),\n\n /**\n * Called when the selected geolocation fence changes.\n *\n * @param {String} fenceId The ID of the newly selected geolocation fence.\n */\n fenceChanged: action(function (fenceId) {\n sendAction.call(this, { fenceId });\n })\n }\n);\n\nexport default AtHomeExceptions;\n\n/**\n * The data passed in/out of the {@link components.automation.AtHomeExceptions}\n *\n * @typedef {{\n * exceptionStates: Array,\n * devices: Array,\n * fenceId: String\n * }} AtHomeExceptionsType\n *\n * @property {Array} exceptionStates The selected exceptions (none or many of Disarmed, ArmedStay, GeoFence).\n * @property {Array} devices The IDs of the selected geo devices.\n * @property {String} fenceId The ID of the selected fence, or undefined if no fence selected.\n *\n * @memberof components.automation.AtHomeExceptions\n * @private\n */\n","import { setProperties, get } from '@ember/object';\n\n/**\n * Utility module for component helpers.\n * @module components.Helpers\n */\n\n/**\n *

This helper assists developers in initializing component state.

\n *\n *

Non-scalar properties initialized during constructor creation are always static in JS, meaning they will be shared by all instances of the class. For controllers and routes we can initialize those non-scalar properties in the \"init\" method, but for components these values may be passed through the template, which means that we should only initialize the property value if it's currently set to undefined.

\n *\n * @example\n * init() {\n * this._super(...arguments);\n *\n * // Initialize non-scalar instance values.\n * initializeState(this, {\n * exceptionValues: {\n * exceptionStates: [ ],\n * devices: [ ],\n * fenceId: undefined\n * }\n * });\n * },\n *\n * @param {Ember.Component} component The component whose state is to be initialized.\n * @param {Object} properties The properties to initialize.\n *\n * @static\n */\nexport function initializeState(component, properties) {\n setProperties(\n component,\n Object.keys(properties).reduce(\n (props, key) => ({\n ...props,\n [key]: get(component, key) ?? properties[key]\n }),\n {}\n )\n );\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n

\\n {{@header}}\\n

\\n

{{@loadingText}}

\\n
\",{ moduleName: \"customer-site/components/ui/async-with-pulsating-loading-text/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface AsyncWithPulsatingLoadingTextSignature {\n Element: HTMLDivElement;\n Args: {\n header: string;\n loadingText: string;\n };\n}\n\nconst AsyncWithPulsatingLoadingText = templateOnlyComponent();\nexport default AsyncWithPulsatingLoadingText;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::AsyncWithPulsatingLoadingText': typeof AsyncWithPulsatingLoadingText;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
{{@text}}
\\n {{#if this.useFadeOutEffect}}\\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/ui/fade-out-text/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { htmlSafe } from '@ember/template';\n\nimport './_style.scss';\n\ninterface FadeOutTextSignature {\n Element: HTMLDivElement;\n Args: {\n text: string;\n maxWidth: number;\n };\n}\n\n/**\n * @classdesc\n *\n * A method which displays text and a fading out effect at the end of the text, if the text goes longer than maxWidth\n * NOTE: This is meant for usage on top of a WHITE background. If you need support for a different color background, this component\n * will need to be modified to support it.\n */\nexport default class FadeOutText extends Component {\n /**\n * Max width styling for the text\n */\n @computed('pages', 'pageIndex')\n get textStyle() {\n const { args } = this;\n\n return htmlSafe(`max-width:${args.maxWidth}px`);\n }\n\n /**\n * If we should use the fade out effect. The fade out effect isn't needed if the content width doesnt reach the maxWidth defined\n */\n @tracked useFadeOutEffect = true;\n\n /**\n * On resize, checks if fade out is needed (if the content width is equal to the maxWidth)\n */\n @action checkIfFadeOutNeeded(el: HTMLElement) {\n this.useFadeOutEffect = el.clientWidth >= this.args.maxWidth;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::FadeOutText': typeof FadeOutText;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n
\\n

{{coalesce @minTickText \\'\\'}}

\\n

\\n {{#if (and @showMaxSvgSymbol @maxSvgSymbol)}}\\n \\n {{/if}}\\n {{coalesce @maxTickText \\'\\'}}\\n

\\n
\\n
\\n

{{coalesce @minTickDescription \\'\\'}}

\\n

{{coalesce @maxTickDescription \\'\\'}}

\\n
\\n
\\n\",{ moduleName: \"customer-site/components/ui/ticked-slider-with-descriptions/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { TickedSliderSignature } from '@adc/ui-components/components/ticked-slider';\n\nexport interface TickedSliderWithDescriptionsSignature {\n Element: HTMLDivElement;\n Args: Pick & {\n minTickText?: string;\n showMaxSvgSymbol?: boolean;\n maxSvgSymbol?: string;\n maxTickText?: string;\n minTickDescription?: string;\n maxTickDescription?: string;\n };\n}\n\nconst TickedSliderWithDescriptions = templateOnlyComponent();\nexport default TickedSliderWithDescriptions;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::TickedSliderWithDescriptions': typeof TickedSliderWithDescriptions;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{@titleText}}

\\n
\\n\\n
\\n {{#if @descriptionText}}\\n

{{@descriptionText}}

\\n {{/if}}\\n\\n {{yield}}\\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/business-activity-analytics-rules-wrapper/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface VideoBusinessActivityAnalyticsRulesWrapperSignature {\n Args: {\n titleText: string;\n descriptionText?: string;\n };\n Blocks: {\n default: [];\n };\n}\n\nconst VideoBusinessActivityAnalyticsRulesWrapper =\n templateOnlyComponent();\nexport default VideoBusinessActivityAnalyticsRulesWrapper;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AdvancedAnalytics::BusinessActivityAnalyticsRulesWrapper': typeof VideoBusinessActivityAnalyticsRulesWrapper;\n }\n}\n","import Component from '@glimmer/component';\nimport { logMissingAbstractMember } from '@adc/ember-utils/utils/debug';\nimport { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport { CustomShape } from 'customer-site/enums/DrawShape';\nimport { createDictionaryOfDrawingsFromRule } from 'customer-site/utils/video/rule';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n *\n * Base component for rendering the UI to edit a business activity analytics rule.\n *\n * @abstract\n * @class components.video.advanced-analytics.EditRuleUi.BaseEditBusinessActivityAnalyticsRuleUi\n * @extends Ember.Component\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\nexport default class BaseEditBusinessActivityAnalyticsRuleUi extends Component {\n @service intl;\n\n // region Abstract properties\n\n /**\n * The dash-case name of this rule type.\n *\n * @abstract\n * @type {String}\n */\n @computed()\n get ruleType() {\n logMissingAbstractMember(this, 'ruleType');\n return undefined;\n }\n\n /**\n * The relative path for this rule type to get translation resources.\n *\n * @returns {string}\n */\n @computed()\n get resourcePath() {\n logMissingAbstractMember(this, 'resourcePath');\n return undefined;\n }\n\n // endregion\n\n // region Virtual properties\n\n /**\n * The path to the translation resource for the title text for the page.\n *\n * @type {string}\n */\n titleTextPath = 'components.video.advanced-analytics.edit-rule-ui.edit-rule.titleText';\n\n /**\n * The shape we're drawing in the draw window.\n *\n * @type {number}\n */\n shapeOfDrawing = CustomShape;\n\n // endregion\n\n // region Computed properties\n\n /**\n * The text to display at the top of the page.\n *\n * @type {string}\n */\n @computed('ruleType', 'titleTextPath')\n get setupText() {\n const ruleType = this.intl.t(`video.business-activity-analytics.rule-list.${camelize(this.ruleType)}`);\n return this.intl.t(this.titleTextPath, { ruleType });\n }\n\n /**\n * The description of the rule type.\n *\n * @type {string}\n */\n @computed('ruleType')\n get descriptionText() {\n return this.intl.t(\n `components.video.advanced-analytics.device-rule-slots.helper-objects.${camelize(\n this.ruleType\n )}DescriptionNew`\n );\n }\n\n /**\n * The drawing associated with the business analytics rule indexed at 0 within a dictionary.\n *\n * @type {{0: Drawing}}\n */\n @computed('args.rule')\n get dictionaryWithRuleDrawing() {\n return createDictionaryOfDrawingsFromRule(this.args.rule);\n }\n\n /**\n * Alias to the drawing within the dictionary.\n *\n * @type {Drawing}\n */\n @alias('dictionaryWithRuleDrawing.0')\n drawing;\n\n /**\n * List of translated strings representing error messages about missing criteria, if any are missing.\n *\n * @returns {Array|undefined}\n */\n @computed()\n get missingCriteria() {\n return undefined;\n }\n\n /**\n * The primary text to show above the threshold selection section, if applicable.\n *\n * @returns {string}\n */\n @computed('resourcePath')\n get thresholdPrompt() {\n return this.intl.t(`${this.resourcePath}.thresholdPrompt`);\n }\n\n /**\n * The secondary text to show above the threshold selection section, if applicable.\n *\n * @returns {string}\n */\n @computed('resourcePath')\n get thresholdSubPrompt() {\n return this.intl.t(`${this.resourcePath}.thresholdSubPrompt`);\n }\n\n // endregion\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { Line } from 'customer-site/enums/DrawShape';\nimport BaseEditBusinessActivityAnalyticsRuleUi from '../base-edit-business-activity-analytics-rule-ui/index';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit a business occupancy rule.\n *\n * @class components.video.advanced-analytics.EditRuleUi.EditBusinessOccupancyUi\n * @extends components.video.advanced-analytics.EditRuleUi.BaseEditBusinessActivityAnalyticsRuleUi\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\nexport default class EditBusinessOccupancyUi extends BaseEditBusinessActivityAnalyticsRuleUi {\n @service intl;\n\n /** @override */\n @computed()\n get ruleType() {\n return 'occupancy-and-people-counting';\n }\n\n /** @override */\n @computed()\n get resourcePath() {\n return 'components.video.advanced-analytics.edit-rule-ui.edit-business-occupancy-ui';\n }\n\n /** @override */\n shapeOfDrawing = Line;\n\n /**\n * List of options to include in the dropdown for maximum capacity (1-100).\n *\n * @returns {Array<{name: string, value: number}>}\n */\n @computed()\n get maxCapacityOptions() {\n return [...Array(100).keys()].map((zeroVal) => {\n const value = zeroVal + 1;\n return {\n name: this.intl.t('generic.people', { count: value }),\n value\n };\n });\n }\n\n /** @override */\n @computed('args.rule.maximumOccupancies', 'resourcePath')\n get missingCriteria() {\n const { maximumOccupancies } = this.args.rule;\n\n return maximumOccupancies?.length ? undefined : [this.intl.t(`${this.resourcePath}.missingMaximumCapacity`)];\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#unless @rule.creatingNew}}\\n
\\n

{{tc this \\'includeHistoricalData\\'}}

\\n

{{tc this \\'historicalDataDescription\\'}}

\\n \\n
\\n{{/unless}}\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-include-historical-data/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\n\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\n\ninterface EditIncludeHistoricalDataArgs {\n rule: OvRule;\n}\n\n/**\n * User input on whether to include data from previous rule versions in reports.\n */\n@intlPath({ path: 'video/advanced-analytics/edit-rule-ui/edit-include-historical-data' })\nexport default class EditIncludeHistoricalData extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Items used to select whether we want to include historical data.\n */\n @computed('args.rule.shouldUpdateScheduleId')\n get items(): BinaryListItem[] {\n const { includeMetricsFromOldVersions } = this.args.rule;\n return [\n new BinaryListItem({ state: includeMetricsFromOldVersions, label: this.intl.t('generic.yes') }),\n new BinaryListItem({ state: !includeMetricsFromOldVersions, label: this.intl.t('generic.no') })\n ];\n }\n\n /**\n * Updates the ov-rule with the user's selection.\n */\n @action\n updateHistoricalDataSelection(items: BinaryListItem[]): void {\n this.args.rule.includeMetricsFromOldVersions = !!items[0]?.state;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AdvancedAnalytics::EditRuleUi::EditIncludeHistoricalData': typeof EditIncludeHistoricalData;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-people-counting-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { Line } from 'customer-site/enums/DrawShape';\nimport BaseEditBusinessActivityAnalyticsRuleUi from '../base-edit-business-activity-analytics-rule-ui/index';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit a people counting rule.\n *\n * @class components.video.advanced-analytics.EditRuleUi.EditPeopleCountingUi\n * @extends components.video.advanced-analytics.EditRuleUi.BaseEditBusinessActivityAnalyticsRuleUi\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\nexport default class EditPeopleCountingUi extends BaseEditBusinessActivityAnalyticsRuleUi {\n /** @override */\n @computed()\n get ruleType() {\n return 'people-counting';\n }\n\n /** @override */\n shapeOfDrawing = Line;\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{@setupText}}

\\n\\n \\n \\n \\n\\n

{{@descriptionText}}

\\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/sensor-header/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * The header info for an advanced analytics sensor.\n */\n@intlPath({ path: 'video/advanced-analytics/sensor-header' })\nexport default class SensorHeader extends Component {}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n\\n{{yield}}\\n\\n\\n
\\n \\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-rule/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { RSVPReject } from '@adc/ember-utils/utils/rsvp';\nimport { getOwner } from '@ember/application';\nimport { set } from '@ember/object';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\n\n/**\n * @classdesc\n *\n * Component for the edit advanced analytics rule pages.\n */\nexport default class EditRule extends Component {\n @service contextManager;\n @service intl;\n @service notificationManager;\n @service router;\n\n // region Aliases\n\n /**\n * Alias to the rule passed into the component.\n *\n * @type {models.video.OvRule}\n */\n @alias('args.rule')\n rule;\n\n /**\n * Alias to the dictionary of drawings passed into the component.\n *\n * @type {Drawing}\n */\n @alias('args.drawing')\n drawing;\n\n /**\n * Alias to the list of missing criteria, if provided.\n *\n * @type {Array|undefined}\n */\n @alias('args.missingCriteria')\n missingCriteria;\n\n // endregion\n\n // region Computed Properties.\n\n /**\n * Whether or not the save button should be disabled.\n *\n * @type {boolean}\n */\n @computed('args.isRuleGroup', 'drawing.drawingCompleted', 'rule.{name,rules.[]}')\n get disableSave() {\n const { name, rules } = this.rule;\n\n // We always check for a name.\n if (!name) {\n return true;\n }\n\n return this.args.isRuleGroup ? isEmpty(rules) : !this.drawing || !this.drawing.drawingCompleted;\n }\n\n /**\n * Gets the id of the camera that this rule exists on.\n * Note that we can't necessarily use this.rule.camera.id,\n * because the rule might not have been saved yet so the reverse relationship won't exist on the camera.\n * Also, this saves us the effort of loading the whole camera model, which can be expensive.\n *\n * @returns {string}\n */\n @computed('rule.id')\n get cameraId() {\n return this.rule.id.split('_')[0];\n }\n\n // endregion.\n\n // region Actions.\n\n /**\n * Updates the name of the rule.\n *\n * @function\n * @param name\n */\n @action\n updateName(name) {\n set(this, 'rule.name', name);\n }\n\n /**\n * Saves the changes and returns to the previous page.\n *\n * @function\n */\n @action\n async save() {\n const { missingCriteria, rule, drawing } = this;\n\n // If the user has not filled out all requirements, display a message for each and fail out.\n if (missingCriteria) {\n missingCriteria.forEach((message) => this.notificationManager.addError(message));\n return RSVPReject();\n }\n\n if (this.drawing) {\n const { points, direction, duration } = drawing;\n\n rule.setProperties({\n points,\n direction,\n duration\n });\n }\n\n return rule\n .save()\n .then(() => {\n this.notificationManager.addSuccess(this.intl.t('generic.savedSuccessfully'));\n this.contextManager.transitionToPreviousRoute();\n })\n .catch(() => {\n this.notificationManager.addError(this.intl.t('generic.errorSaving'));\n });\n }\n\n /**\n * Cancels the edit.\n *\n * @function\n */\n @action\n cancel() {\n const { creatingNew } = this.rule;\n\n // If we're creating a new rule, then reset to the defaults.\n if (creatingNew) {\n // If the model is marked as new, then rollbackAttributes marks it as destroyed.\n // Instead, reload the page to get a new record.\n if (this.rule.isNew) {\n const router = this.router;\n getOwner(this).lookup(`route:${router.currentRouteName}`).refresh();\n } else {\n // Reset the changes.\n this.rule.rollbackAttributes();\n }\n } else {\n // If we aren't creating a new rule, then transition back to the previous page.\n this.contextManager.transitionToPreviousRoute();\n }\n }\n\n // endregion\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @thresholdPrompt}}\\n
\\n

{{@thresholdPrompt}}

\\n
\\n
\\n

{{@thresholdSubPrompt}}

\\n
\\n {{/if}}\\n\\n
\\n {{#each this.dropdownInfos as |dropdownInfo idx|}}\\n
\\n
\\n {{#if dropdownInfo.thresholdTypeText}}\\n \\n {{/if}}\\n \\n
\\n \\n
\\n {{/each}}\\n
\\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-thresholds-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed, set, action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport DropdownSelectItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport './_style.scss';\n\n/**\n * Turns the array of saved values into an array of objects and sorts them.\n *\n * @param {Array} savedValues\n * @returns {Array<{ index: number, value: number }>}\n */\nfunction CreateObjectsAndSort(savedValues) {\n return savedValues\n .map((value, index) => ({ value, index }))\n .sort((a, b) => {\n if (a.value === 0 && b.value === 0) {\n // Both are undefined, let them stay in their natural order.\n return 0;\n } else if (a.value === 0) {\n // a is undefined but b is defined; sort b before a.\n return 1;\n } else if (b.value === 0) {\n // b is undefined but a is defined; sort a before b.\n return -1;\n }\n\n // Both are defined, let them stay in their natural order.\n return 0;\n });\n}\n\n/**\n * @classdesc\n *\n * Base component for rendering the UI to edit a business activity analytics rule.\n *\n * @abstract\n * @class components.video.advanced-analytics.EditRuleUi.BaseEditBusinessActivityAnalyticsRuleUi\n * @extends Ember.Component\n *\n * @param {Array<{name: string, value: number}>} selectOptions The list of selectable options for each of the dropdowns.\n * @param {Array} savedValues The list of selected values on the model.\n * @param {function(Array):void} updateValues The function to call when updating the selected values.\n * @param {string} [thresholdPrompt] The (optional) text to display at the top of the list of thresholds.\n * @param {string} [thresholdSubPrompt] The (optional) text to display below the prompt.\n * @param {string} [thresholdTypeText] The (optional) text to display over the threshold title.\n */\nexport default class EditThresholdsUi extends Component {\n @service intl;\n\n // region Component state\n\n /**\n * A (sorted) mapping from dropdown index to selected value.\n *\n * @type {Array<{ index: number, value: number }>}\n */\n selectedValues = CreateObjectsAndSort(this.args.savedValues);\n\n // endregion\n\n // region Computed properties\n\n /**\n * The list of objects representing dropdowns and their titles.\n *\n * @type {Array<{ title: string, thresholdTypeText: string, dropdowns: Array}>}\n */\n @computed('args.{selectOptions,thresholdTypeText}', 'selectedValues.@each.value')\n get dropdownInfos() {\n const { selectOptions, thresholdTypeText } = this.args;\n\n return this.selectedValues.map((selectedThreshold, idx) => {\n // Get the title of this threshold selection and the selected value.\n // Note that the selected value will be whatever was passed, or the default value for the first threshold if no value was passed.\n const title = this.intl.t(\n 'components.video.advanced-analytics.edit-rule-ui.edit-thresholds-ui.thresholdNum',\n { number: idx + 1 }\n ),\n selectedThresholdValue = selectedThreshold.value;\n\n // Look for all the selected values at other thresholds (excluding empty thresholds).\n const otherThresholds = this.selectedValues\n .mapBy('value')\n .filter((val) => val && val !== selectedThresholdValue);\n\n // We want to include the option at this threshold, but not the ones at the other thresholds.\n const validThresholds = selectOptions.filter(({ value }) => !otherThresholds.includes(value));\n\n // For all optional dropdowns, we provide a re-selectable '-' option as the default at the top of the list.\n if (idx !== 0) {\n validThresholds.unshift({ name: '-', value: 0 });\n }\n\n const dropdowns = validThresholds.map(({ name, value }) =>\n DropdownSelectItem.create({\n name,\n value,\n state: value === selectedThresholdValue ? SELECTED : UNSELECTED\n })\n );\n\n return { title, thresholdTypeText, dropdowns };\n });\n }\n\n // endregion\n\n // region Actions\n\n /**\n * Updates the values on the model based on the currently selected values of the dropdowns.\n *\n * @param newValue\n * @param idx\n */\n @action\n dropdownSelectionChanged(idx, newValue) {\n set(this.selectedValues[idx], 'value', parseInt(newValue));\n\n // Update the saved values to an index-sorted array.\n this.args.updateValues(\n // Return the values to their original order before passing them back.\n this.selectedValues.sortBy('index').mapBy('value')\n );\n }\n\n // endregion\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @useStoriesUI}}\\n
\\n
\\n
\\n {{tc this \\'selectLights\\'}}\\n
\\n \\n
\\n
\\n
\\n {{t \\'generic.duration\\'}}\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n {{t \\'video.rules.analytics.draw.detectionType\\'}}\\n \\n
\\n {{#if @isThirdPartyAnalyticsRule}}\\n
\\n \\n
\\n {{else}}\\n \\n {{/if}}\\n
\\n
\\n
\\n {{t \\'automation.rules.index.timeframe\\'}}\\n \\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n
\\n {{else}}\\n \\n
\\n
\\n

{{tc this \\'turnOnLightsHeader\\'}}

\\n \\n
\\n \\n
\\n

{{this.lightRuleFilterTypeText}}

\\n {{#if this.displayLightRuleFilterTypes}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/analytics-light-rule/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action, computed, get, set, setProperties } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport CheckboxTreeItem, { UNSELECTED, SELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport { PersonDetection } from '../../../enums/OvlRuleType';\nimport { Vehicle } from '../../../enums/SavedClipFilterOption';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { CheckboxTreeSignature } from '@adc/ui-components/components/checkbox-tree';\nimport type { ClassificationFilter } from 'customer-site/classes/video/rules/classification-filter';\nimport type { ClassificationSelectionProxySignature } from 'customer-site/components/video/rules/classification-selection-proxy';\nimport type Light from 'customer-site/models/devices/light';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ContextManager from '../../../services/context-manager';\n\ninterface AnalyticsLightRuleSignature {\n Element: HTMLDivElement;\n Args: {\n rule: OvRule;\n disabled: boolean;\n scheduleIsCompact: boolean;\n lightRuleFilters: ClassificationSelectionProxySignature['Args']['subjectFilters'];\n lights: Array<{ light: Light; isSelected: boolean }>;\n isThirdPartyAnalyticsRule: boolean;\n useStoriesUI?: boolean;\n canModifyRuleUiElements?: boolean;\n checkboxItems: CheckboxTreeSignature['Args']['items'];\n onCheckboxItemsChanged: CheckboxTreeSignature['Args']['items-changed'];\n };\n}\n\n/**\n * @classdesc\n * Component for adding light rules to the analytics ember rule page.\n */\n@intlPath({ path: 'video/analytics-light-rule' })\nexport default class AnalyticsLightRule extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n /**\n * Selection of durations for light on.\n */\n get lightDurations(): DropdownSelectItem[] {\n // Light durations (in seconds) representing: -1 (indefinite), 15 seconds, 30 seconds, 1 minute, 2 minutes, 3 minutes,\n // 4 minutes, 5 minutes, 10 minutes, 20 minutes, 1 hour, 2 hours, 3 hours, 5 hours, 8 hours, 12 hours, 24 hours\n const durations = [\n -1, 15, 30, 60, 120, 180, 240, 300, 600, 1200, 3600, 7200, 10800, 18000, 28800, 43200, 86400\n ];\n\n return durations.map((value) => {\n // Based on number of seconds, produce a different text.\n let name;\n\n if (value === -1) {\n name = this.intl.tc(this, 'indefinitely');\n } else if (value < 60) {\n name = this.intl.t('generic.seconds', { num: value });\n } else if (value < 3600) {\n name = this.intl.t('generic.minutes', { num: value / 60 });\n } else {\n name = this.intl.t('generic.hours', { num: value / 3600 });\n }\n\n return DropdownSelectItem.create({\n value: value.toString(),\n name\n });\n });\n }\n\n /**\n * Amount of time the light will remain on after analytics triggers the light.\n */\n @alias('args.rule.lightTimeOnLengthInSeconds')\n declare lightTimeOnLengthInSeconds: number;\n\n /**\n * The day bits determining which days this light schedule is run.\n * Default value is set to be every day.\n */\n @alias('args.rule.lightDayBits')\n declare lightDayBits: number;\n\n /**\n * The local time that this rule's light schedule starts, in minutes.\n * Default value is set to be the start of the day, as if always running.\n */\n @alias('args.rule.lightRuleStartTime')\n declare lightRuleStartTime: number;\n\n /**\n * The local time that this rule's light schedule ends, in minutes.\n * If greater than 1440, this schedules goes into the next day.\n * Default value is set to be the end of the day, as if always running.\n */\n @alias('args.rule.lightRuleStopTime')\n declare lightRuleStopTime: number;\n\n /**\n * Light schedule comes on after sunset.\n */\n @alias('args.rule.scheduleIsDark')\n declare scheduleIsDark: boolean;\n\n /**\n * The lights currently on this rule.\n */\n @alias('args.rule.lightsSelected')\n declare lightsSelected: Light;\n\n /**\n * Exception items to display in checkbox tree.\n */\n @computed('args.{lights,lightsSelected,disabled}')\n get lightCheckBoxItems(): Array {\n const { disabled, lights } = this.args;\n return lights.map(({ light, isSelected }) =>\n CheckboxTreeItem.create({\n name: light.description,\n item: light,\n disabled,\n state: isSelected ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * If the camera supports more than 1 light rule filter type, show the filter type check boxes.\n * If not, then don't show it since we just assume it will use that 1 type by default.\n */\n @computed('args.{rule.camera.supportedLightRuleFilterTypes,isThirdPartyAnalyticsRule}')\n get displayLightRuleFilterTypes(): boolean {\n if (this.args.isThirdPartyAnalyticsRule) {\n return false;\n }\n\n return (get(this.args.rule.camera, 'supportedLightRuleFilterTypes') as number[])?.length > 1;\n }\n\n /**\n * Based on the rule type we are creating, we want to display different text to match that.\n * For now, only person detection rule types uses different text.\n */\n @computed('args.rule.ruleType')\n get lightRuleFilterTypeText(): string {\n return this.intl.tc(\n this,\n `lightRuleTriggerHeader${this.args.rule.ruleType === PersonDetection ? 'PersonDetection' : ''}`\n );\n }\n\n /**\n * Store the currently selected light duration in the dirty instance.\n *\n * @param {number} timeOn\n */\n @action onLightTimeOnChange(timeOn: number): void {\n set(this.args.rule, 'lightTimeOnLengthInSeconds', timeOn);\n }\n\n /**\n * Called when the exception selection changes.\n */\n @action lightsChanged(zWaveLights: Array): void {\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error This code should be replaced with: `this.args.rule.lightsSelected.setObjects(zWaveLights.rejectBy('state', 0).mapBy('item'));`.\n set(this.args.rule, 'lightsSelected', zWaveLights.rejectBy('state', 0).mapBy('item'));\n }\n\n /**\n * Fired when the schedule changes.\n */\n @action lightScheduleChanged(timeValuesAsInts: { dayBits: number; beginTime: number; endTime: number }): void {\n const lightDayBits = timeValuesAsInts.dayBits,\n lightRuleStartTime = timeValuesAsInts.beginTime,\n lightRuleStopTime = timeValuesAsInts.endTime;\n\n setProperties(this.args.rule, { lightDayBits, lightRuleStartTime, lightRuleStopTime });\n }\n\n /**\n * Update the rule's light rule filters if the user changed them.\n */\n @action lightRuleFiltersChanged(lightRuleFilters: ClassificationFilter[]) {\n const selectedFilters = lightRuleFilters.filterBy('state');\n set(this.args.rule, 'lightRuleFilters', [...new Set([...selectedFilters.flatMap((f) => f.filters)])]);\n set(\n this.args.rule,\n 'vehicleLightRuleFilters',\n selectedFilters.find((filter) => filter.value === Vehicle)?.subjectIds ?? []\n );\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AnalyticsLightRule': typeof AnalyticsLightRule;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{this.altText}}\\n \\n {{yield}}\\n
\",{ moduleName: \"customer-site/components/video/calibration/edit-snapshot/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { constrainRange } from '@adc/ember-utils/utils/math';\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/no-classic-components\nimport Component from '@ember/component';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { guidFor } from '@ember/object/internals';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { isEmpty } from '@ember/utils';\nimport { arePointsClose } from '../../../../utils/analytics-shape-validation';\nimport { clearShape, drawShape, drawImage, drawSideHandles, getMouseCoordinate } from '../../../../utils/canvas';\nimport { DISTINCT_COLORS } from '../../../../utils/colors';\nimport { findMidPoint, isPointInShape } from '../../../../utils/math-methods';\n\nimport './_style.scss';\n\nconst HANDLE_RADIUS = 7,\n CANVAS = 'canvasEl';\n\n/**\n * Changes the bounding box dimensions based on mouse movement.\n *\n * @param {{maxValue: number, inverseValue: number, box: models.video.calibration.BoundingBox, side: String, dimension: String, getMousePosition: function(Event):number}} details Static details about the drag operation.\n * @param {Event} e The mouse move event.\n *\n * @private\n * @static\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction dragHandle(details, e) {\n // Prevent element scroll on touches.\n e.preventDefault();\n\n const { maxValue, inverseValue, box, side, dimension } = details,\n value = details.getMousePosition(e),\n valuePercentage = value / maxValue,\n updateProps = {\n [side]: inverseValue / maxValue,\n [dimension]: valuePercentage - box.get(side)\n };\n\n // Has the movement passed beyond the point where the box will invert.\n if (value < inverseValue) {\n updateProps[side] = valuePercentage;\n updateProps[dimension] = (inverseValue - value) / maxValue;\n }\n\n // Update bounding box dimensions.\n box.setProperties(updateProps);\n}\n\n/**\n * Validate side for the image/canvas.\n *\n * @param side Height or width.\n * @return {boolean}\n *\n * @public\n * @static\n * @memberof components.video.calibration.EditSnapshot\n */\nexport function validateSide(side) {\n return !Number.isNaN(side) && side > 0;\n}\n\n/**\n * Validate height and width for the image/canvas.\n *\n * @param height\n * @param width\n * @return {boolean}\n *\n * @private\n * @static\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction isValidHeightAndWidth(height, width) {\n return validateSide(height) && validateSide(width);\n}\n\n/**\n * Draws the checkbox image used for selected bounding boxes.\n *\n * @param {number} x The x position to put the checkbox image\n * @param {number} y The y position to put the checkbox image\n * @param {string} color The fillstyle to use for the checkbox image\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction drawCheckboxImage(x, y, color) {\n const canvas = this.get(CANVAS),\n drawingContext = canvas.getContext('2d'),\n checkSvg = this.contextManager.getStaticResourcePath('images/generic/icn-check.svg');\n\n drawingContext.beginPath();\n drawingContext.arc(x, y, 10, 0, Math.PI * 2);\n drawingContext.lineWidth = 0;\n drawingContext.fillStyle = color;\n drawingContext.fill();\n\n // Subtracting 6 from x and y since the image is 12x12 and we want it to be centered around the top right point.\n drawImage(drawingContext, x - 6, y - 6, checkSvg);\n}\n\n/**\n * Sets the new dimensions to size the canvas and snapshot with.\n *\n * @param newHeight new height to size the canvas and snapshot with\n * @param newWidth new width to size the canvas and snapshot with\n * @return {boolean}\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction updateStoredComponentHeightAndWidth(newHeight, newWidth) {\n // Validate the height and width.\n if (!isValidHeightAndWidth(newHeight, newWidth)) {\n return false;\n }\n\n // Store the actual height/width.\n this.setProperties({\n componentWidth: newWidth,\n componentHeight: newHeight\n });\n\n return true;\n}\n\n/**\n * Calculates the height and width to size the image/canvas and then set those dimensions.\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction calculateNewHeightAndWidth() {\n const image = this.componentElement.querySelector('.snapshot-image');\n\n // If the image element exists\n if (image && image.naturalWidth !== 0) {\n // Get the heights and widths.\n const { naturalHeight, naturalWidth } = image,\n parentElementWidth = this.componentElement.parentElement.offsetWidth;\n\n if (parentElementWidth > naturalWidth) {\n updateStoredComponentHeightAndWidth.call(this, naturalHeight, naturalWidth);\n } else {\n const newHeight = naturalHeight * (parentElementWidth / naturalWidth);\n\n updateStoredComponentHeightAndWidth.call(this, newHeight, parentElementWidth);\n }\n }\n}\n\n/**\n * Draws a bounding box. Uses different styles depending on if it is a selected bounding box or not.\n *\n * @param {models.video.calibration.BoundingBox} boundingBox the bounding box object to draw\n * @param {boolean} withHandles If this box should be drawn with resize handles on it\n * @param {boolean} withCheckbox If this box should be drawn with a checkbox on it\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction drawBox(boundingBox, withHandles, withCheckbox) {\n const canvas = this.get(CANVAS),\n drawingContext = canvas.getContext('2d'),\n strokeStyle = `rgb(${boundingBox.color})`,\n fillStyle = boundingBox.isSelected ? `rgba(${boundingBox.color}, 0.2)` : 'transparent';\n\n // Draw box.\n drawShape(drawingContext, boundingBox, true, {\n lineWidth: 3,\n fillStyle,\n strokeStyle\n });\n\n if (withHandles) {\n // Add side handles.\n drawSideHandles(drawingContext, boundingBox, HANDLE_RADIUS, {\n lineWidth: 1,\n fillStyle: `rgba(${boundingBox.color}, 0.5)`,\n strokeStyle\n });\n }\n\n if (withCheckbox) {\n drawCheckboxImage.call(this, boundingBox[1].x, boundingBox[1].y, `rgb(${boundingBox.color})`);\n }\n}\n\n/**\n * The event for resizing a bounding box based on mouse dragging movement.\n *\n * @param {{ side: number }} target The bounding box resize handle object.\n * @returns {Promise.}\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nasync function boundingBoxResizeEvent(target) {\n const snapshot = await this.snapshot,\n boxes = await snapshot.get('boundingBoxes'),\n boxSelection = this.selectedBoxIndex || 0,\n box = boxes.objectAt(boxSelection),\n canvas = this.get(CANVAS),\n rect = canvas.getBoundingClientRect(),\n { height, width } = canvas,\n { side } = target,\n isVertical = (side + 1) % 2 === 0,\n maxValue = isVertical ? height : width;\n\n return {\n maxValue,\n inverseValue: [\n (box.left + box.width) * width,\n (box.top + box.height) * height,\n box.left * width,\n box.top * height\n ][side],\n box,\n side: isVertical ? 'top' : 'left',\n dimension: isVertical ? 'height' : 'width',\n getMousePosition: (e) => {\n const { clientX, clientY } = getMouseEvent.call(this, e);\n return constrainRange(isVertical ? clientY - rect.top : clientX - rect.left, 0, maxValue);\n }\n };\n}\n\n/**\n * Returns the object which has the x and y positioning of the touch/click event.\n *\n * @param {mouseEvent} e\n * @returns {Object}\n *\n * @private\n * @instance\n * @memberof components.video.calibration.EditSnapshot\n */\nfunction getMouseEvent(e) {\n const { touches } = e,\n // The null check for touches is necessary for Chrome DevTools' Device Mode where usingTouchDevice is true, but touches is null.\n isTouch = this.usingTouchDevice && touches;\n return isTouch ? touches[0] : e;\n}\n\n/**\n * @classdesc\n * A component for displaying/editing {@link models.video.calibration.BoundingBox} values on the provided {@link models.video.calibration.Snapshot}.\n */\nexport default class EditSnapshot extends Component {\n @service contextManager;\n @service dom;\n\n tagName = '';\n\n // region Passed Properties\n\n /**\n * The snapshot to edit/display.\n *\n * @type {models.video.calibration.Snapshot}\n */\n snapshot = null;\n\n /**\n * Indicates the bounding boxes should be editable.\n *\n * @type {boolean}\n */\n isEditable = false;\n\n /**\n * Indicates if the snapshot image has loaded.\n *\n * @type {boolean}\n */\n isImageLoaded = false;\n\n /**\n * Optional alternate text for the snapshot image.\n *\n * @type {String}\n */\n altText = '';\n\n /**\n * The index of the selected bounding box (for when there are multiple ones available).\n *\n * @type {number|null}\n */\n selectedBoxIndex = null;\n\n /**\n * If we are using a touch device\n *\n * @returns {bool}\n */\n @alias('contextManager.isTouchDevice')\n usingTouchDevice;\n\n // endregion\n\n // region Computed Properties\n\n /**\n * The image source for the captured calibration snapshot.\n *\n * @function\n * @returns {String}\n */\n @computed('snapshot.imageUrl')\n get imageSource() {\n const snapshot = this.snapshot;\n return snapshot?.imageUrl ?? '';\n }\n\n /**\n * Indicates if the resize handle should be visible (on the one box if there is one, or on the selected one if there are multiple).\n *\n * @function\n * @returns {boolean}\n */\n @computed('isEditable', 'boundingBoxPoints')\n get showHandles() {\n return this.isEditable && (this.boundingBoxPoints || []).length >= 1;\n }\n\n /**\n * Generates the collection of bounding box points.\n */\n @computed('snapshot.boundingBoxes.@each.{height,width,top,left,isSelected}', 'componentHeight', 'componentWidth')\n get boundingBoxPoints() {\n // Do we NOT have a snapshot yet?\n const snapshot = this.snapshot;\n\n if (!snapshot) {\n // Nothing to do (yet).\n return null;\n }\n\n const boxes = snapshot.boundingBoxes,\n { componentHeight, componentWidth } = this;\n\n let boxPoints = [];\n\n boxes.forEach((box, index) => {\n const { left, top, width, height } = box,\n right = left + width,\n bottom = top + height;\n\n boxPoints[index] = [\n [left, top],\n [right, top],\n [right, bottom],\n [left, bottom]\n ].map(([x, y]) => ({\n x: x * componentWidth,\n y: y * componentHeight\n }));\n\n boxPoints[index].isSelected = box.isSelected;\n boxPoints[index].color = DISTINCT_COLORS[index];\n });\n\n return boxPoints;\n }\n\n /**\n * Returns the css style string for setting the dimensions.\n */\n @computed('componentHeight', 'componentWidth')\n get snapshotStyle() {\n return htmlSafe(`height:${this.componentHeight}px;width:${this.componentWidth}px;`);\n }\n\n /**\n * Returns the component dom element.\n */\n get componentElement() {\n return document.querySelector(`#${guidFor(this)}`);\n }\n\n // endregion\n\n // region Component Life Cycle\n\n constructor(...args) {\n super(...args);\n\n // On resize, re-render the height/width.\n this.dom.addListener(this, window, 'resize', () => calculateNewHeightAndWidth.call(this));\n }\n\n willDestroy() {\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n this.set(CANVAS, null);\n super.willDestroy();\n }\n\n // endregion\n\n // region actions\n\n /**\n * Called when component is inserted.\n */\n @action onInsertElement() {\n // Cache canvas element.\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n const canvas = this.set(CANVAS, this.componentElement.querySelector('canvas'));\n\n let evtStart = 'mousedown',\n evtMove = 'mousemove',\n evtEnd = 'mouseup';\n\n if (this.usingTouchDevice) {\n evtStart = 'touchstart';\n evtMove = 'touchmove';\n evtEnd = 'touchend';\n }\n\n // Attach canvas element listener to begin handle drag.\n this.dom.addListener(\n this,\n canvas,\n evtStart,\n async (e) => {\n // Is this NOT a touch event AND is the mouse button NOT the left button?\n if (!this.usingTouchDevice && e.which !== 1) {\n // Nothing to do.\n return;\n }\n\n // Are handles NOT visible?\n if (!this.showHandles) {\n // Nothing to do.\n return;\n }\n\n // Prevent the default action.\n e.preventDefault();\n\n // Get points for first box (there can only be one if showHandles is true).\n const boxSelection = this.selectedBoxIndex || 0,\n boundedBoxPoints = this.boundingBoxPoints.objectAt(boxSelection),\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n canvas = this.get(CANVAS),\n [x, y] = getMouseCoordinate(canvas, getMouseEvent.call(this, e)),\n { body } = window.document;\n\n // Get collection of handles and try to find one near the point on the canvas.\n const handles = boundedBoxPoints.map((point, side) => ({\n ...findMidPoint(boundedBoxPoints[side - 1] || boundedBoxPoints.slice(-1).pop(), point),\n side\n })),\n target = handles.find((h) => arePointsClose({ x, y }, h, HANDLE_RADIUS * 2));\n\n // If the event was near a resize handle.\n if (target) {\n // Adds an event to resize the bounding box on mouse movement.\n const mouseEvent = await boundingBoxResizeEvent.call(this, target),\n listenerId = this.dom.addListener(\n this,\n body,\n evtMove,\n dragHandle.bind(this, mouseEvent),\n false,\n false,\n false\n );\n\n // Remove drag handle listener when touch/mouse event ends.\n this.dom.addListener(this, body, evtEnd, () => this.dom.removeListener(this, listenerId));\n } else {\n // Check if the event was near another box.\n this.boundingBoxPoints.forEach((box, index) => {\n if (isPointInShape.call(this, box, x, y)) {\n this.selectedBoxIndex = index;\n\n // Use closure action\n this.boxClicked && this.boxClicked(index);\n }\n });\n }\n },\n false,\n false,\n false\n );\n }\n\n /**\n * Recalculates canvas dimensions and sets isImageLoaded to true.\n */\n @action setImageLoaded() {\n calculateNewHeightAndWidth.call(this);\n\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n this.set('isImageLoaded', true);\n }\n\n /**\n * Draws the bounding boxes using the component canvas element.\n */\n @action drawBoundingBoxes() {\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n const canvas = this.get(CANVAS),\n drawingContext = canvas.getContext('2d'),\n showHandles = this.showHandles,\n boxes = this.boundingBoxPoints;\n\n // Clear canvas.\n clearShape(canvas, drawingContext);\n\n // Are there no boxes?\n if (isEmpty(boxes)) {\n // Nothing to do.\n return;\n }\n\n const isMoreThanOneBox = boxes.length > 1;\n\n // Iterate bounding boxes.\n boxes.forEach((boxPoints, index) => {\n if (boxPoints.isSelected) {\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n this.set('selectedBoxIndex', index);\n } else {\n // If there are multiple boxes, handles won't be shown on any boxes except the selected one.\n drawBox.call(this, boxPoints, showHandles && !isMoreThanOneBox, false);\n }\n });\n\n if (this.selectedBoxIndex !== null) {\n // Draw the selected box after the unselected boxes so that it appears above the others (if they overlap).\n drawBox.call(this, boxes[this.selectedBoxIndex], showHandles, true);\n }\n }\n\n // endregion\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{yield}}\\n\\n\",{ moduleName: \"customer-site/components/video/hd-state-image/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { StateImageSignature } from 'customer-site/components/ui/images/state-image/index';\n\ninterface VideoHdStateImageSignature {\n Element: StateImageSignature['Element'];\n Args: Pick;\n Blocks: {\n default: [];\n };\n}\n\nconst VideoHdStateImage = templateOnlyComponent();\nexport default VideoHdStateImage;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::HdStateImage': typeof VideoHdStateImage;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n

{{t \\'generic.firstName\\'}}

\\n \\n
\\n
\\n

{{t \\'generic.lastName\\'}}

\\n \\n
\\n

{{t \\'generic.or\\'}}

\\n
\\n

{{tc this \\'companyName\\'}}

\\n \\n
\\n
\\n

{{tc this \\'unit\\'}}

\\n

{{@unitName}}

\\n
\\n
\",{ moduleName: \"customer-site/components/video/intercom/contact/edit-contact-name/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { isBlank } from '@ember/utils';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\ninterface VideoIntercomContactEditContactNameSignature {\n Args: {\n firstName?: string;\n lastName?: string;\n unitName?: string;\n companyName?: string;\n };\n}\n\n/**\n * @classdesc\n * Component that displays the text inputs to edit an intercom contact's display name.\n */\n@intlPath({ path: 'video/intercom/contact/edit-contact-name' })\nexport default class VideoIntercomContactEditContactName extends Component {\n /**\n * Are all editable fields blank?\n */\n @computed('args.{companyName,firstName,lastName}')\n get allBlank(): boolean {\n return isBlank(this.args.firstName) && isBlank(this.args.lastName) && isBlank(this.args.companyName);\n }\n\n /**\n * Should we disable adding a company name?\n *\n * @returns - Whether a name field is filled out, but is not the company name.\n */\n @computed('allBlank', 'args.companyName')\n get disableCompanyName(): boolean {\n return !this.allBlank && isBlank(this.args.companyName);\n }\n\n /**\n * Should we disable adding first and last name?\n *\n * @returns - Whether a field is filled out, but is not the first or name.\n */\n @computed('allBlank', 'args.{firstName,lastName}')\n get disableFirstLastName(): boolean {\n return !this.allBlank && isBlank(this.args.firstName) && isBlank(this.args.lastName);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Intercom::Contact::EditContactName': typeof VideoIntercomContactEditContactName;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#unless @useStoriesUI}}\\n
\\n

{{tc this (if this.canPlaySound \\'perimeterGuardHeader\\' \\'perimeterGuardHeaderNoAudio\\')}}

\\n

{{tc this (if this.canPlaySound (if this.hasRedBlueLedPatternBehavior \\'perimeterGuardSubHeaderRedBlue\\' \\'perimeterGuardSubHeader\\') \\'perimeterGuardSubHeaderNoAudio\\')}}

\\n
\\n {{/unless}}\\n {{#if this.displayAIPerimeterGuardPrompt}}\\n
\\n
\\n
\\n
\\n

{{tc this \\'aiDeterrenceAlert\\'}}

\\n \\n \\n {{tc this \\'aiDeterrenceAwarenessMessage\\' htmlSafe=true}}\\n {{#if this.canViewKnowledgeBaseLinks}}\\n {{tc this \\'learnMore\\'}}\\n {{/if}}\\n \\n
\\n

{{tc this \\'aiPerimeterGuardWithVideo\\'}}

\\n
\\n {{#if this.showAiDeterrenceToggle}}\\n
\\n \\n
\\n {{/if}}\\n
\\n {{#if this.isAiDeterrenceQuotaMetOrExceeded}}\\n \\n

{{tc this \\'aiDeterrenceAlert\\'}}

\\n

{{tc this \\'aiDeterrenceAlertMessage\\'}}

\\n
\\n {{/if}}\\n {{#if this.shouldShowAIDDetails}}\\n {{#unless @useStoriesUI}}\\n
\\n
\\n

{{tc this \\'aiDeterrenceMessageVolume\\'}}

\\n
\\n
\\n {{/unless}}\\n
\\n
\\n {{#if @useStoriesUI}}\\n

{{tc this \\'messageVolume\\'}}

\\n {{/if}}\\n
\\n \\n
\\n \\n \\n \\n
\\n
\\n
\\n
\\n {{#if this.isAiDeterrenceBoostedSliderEnabled}}\\n \\n

{{tc this \\'audioBoostAlert\\'}}

\\n

{{tc this \\'audioBoostAlertMessage\\'}}

\\n
\\n {{/if}}\\n
\\n
\\n {{#if this.canAccessAiDeterrenceResponseConfiguration}}\\n
\\n
\\n
\\n
\\n
{{tc this (if @useStoriesUI \\'responseType\\' \\'aiDeterrenceMessageType\\')}}
\\n \\n

{{ this.getPreviewString }}

\\n {{#if this.canAccessAiDeterrenceRandomizedMessages}}\\n
\\n \\n

{{tc this \\'aiDeterrenceMessageRandomization\\'}}

\\n \\n \\n
\\n {{/if}}\\n
\\n
\\n {{#if this.aiDeterrenceMessageSubTypeOptionsEnabled}}\\n
\\n
\\n
{{tc this \\'aiDeterrenceMessageSubType\\'}}
\\n \\n
\\n
\\n {{/if}}\\n
\\n
\\n
{{tc this (if @useStoriesUI \\'voice\\' \\'aiDeterrenceVoiceType\\')}}
\\n \\n
\\n
\\n
\\n
\\n
\\n \\n
\\n {{/if}}\\n {{#if this.canAccessAiDeterrenceLanguageConfiguration}}\\n
\\n
{{tc this \\'aiDeterrenceLanguageHeader\\'}}
\\n \\n
\\n {{/if}}\\n {{#if this.canAccessAiDeterrenceFreeTextEntry}}\\n
\\n
\\n
\\n
{{tc this \\'message\\'}}
\\n
\\n

{{tc this \\'aiDeterrenceFreeTextEntryExplanation\\'}}

\\n
\\n \\n
\\n

{{tc this \\'aiDeterrenceFreeTextEntryGuidelines\\'}}

\\n
\\n
\\n
\\n
\\n
\\n
{{tc this (if @useStoriesUI \\'voice\\' \\'aiDeterrenceVoiceType\\')}}
\\n \\n
\\n
\\n
\\n {{/if}}\\n {{/if}}\\n
\\n {{/if}}\\n\\n {{#if this.displayCameraFirmwareUpgradeAlert}}\\n \\n

{{tc this \\'aiDeterrenceAlert\\'}}

\\n

{{tc this \\'aiDeterrenceUpgradeFirmwareMessage\\'}}

\\n
\\n {{/if}}\\n\\n
\\n
\\n {{#if this.supportsFloodlight}}\\n
\\n
\\n
\\n

{{tc this \\'cameraLightAlert\\'}}

\\n
\\n \\n
\\n
\\n
{{t \\'generic.video.settings.perimeter-guard-rule.lightOptions\\'}}
\\n \\n
{{tc this \\'timeDuration\\'}}
\\n \\n
{{t \\'generic.brightness\\'}}
\\n
\\n \\n \\n \\n
\\n
\\n
\\n {{else}}\\n
\\n
\\n {{#if @useStoriesUI}}\\n
\\n

{{tc this \\'cameraLightAlert\\'}}

\\n

{{tc this \\'perimeterGuardLightSubHeader\\'}}

\\n
\\n {{else}}\\n
\\n

{{tc this \\'cameraStatusLed\\'}}

\\n

{{tc this (if this.hasRedBlueLedPatternBehavior \\'perimeterGuardLedSubHeaderRedBlue\\' \\'perimeterGuardLedSubHeader\\')}}

\\n
\\n {{/if}}\\n {{#if this.supportsSpotlight}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\\n
\\n
{{tc this \\\"lightDuration\\\"}}
\\n \\n {{#if this.supportsSpotlight}}\\n
{{tc this \\\"spotlightPattern\\\"}}
\\n \\n {{/if}}\\n
\\n
\\n {{/if}}\\n {{#if this.supportsPerimeterGuardAudioPlayback}}\\n
\\n
\\n
\\n

{{tc this \\'cameraAudioAlert\\'}}

\\n

{{tc this \\'perimeterGuardAudioSubHeader\\'}}

\\n
\\n \\n
\\n {{#if this.cameraSoundOptions.length}}\\n
\\n
{{tc this \\'audioSound\\'}}
\\n \\n {{#if this.supportsPerimeterGuardAudioDuration}}\\n
{{tc this \\'audioDuration\\'}}
\\n \\n {{/if}}\\n {{#if this.supportsVolumeAdjustment}}\\n
{{t \\'generic.video.volumeValue\\' value=this.sirenSoundVolume}}
\\n
\\n \\n \\n \\n
\\n {{/if}}\\n
\\n {{/if}}\\n
\\n {{/if}}\\n
\\n
\\n\\n
\\n
\\n
\\n

{{tc this \\'minimumDelayBetweenAlerts\\'}}

\\n
\\n \\n
\\n
\\n\\n {{#if this.supportsPerimeterGuardSubSchedule}}\\n
\\n
\\n {{!-- @glint-expect-error Please convert this to TS. --}}\\n \\n
\\n
\\n {{/if}}\\n\\n {{#if this.supportsFloodlight}}\\n
\\n \\n
\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/video/perimeter-guard-rule/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed, get, set, setProperties, getProperties } from '@ember/object';\nimport { alias, and, not, or, equal, gt, reads } from '@ember/object/computed';\nimport { next } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { isEmpty } from '@ember/utils';\nimport AIDeterrenceLanguageType from 'customer-site/enums/AIDeterrenceLanguageType';\nimport AIDeterrenceMessageType from 'customer-site/enums/AIDeterrenceMessageType';\nimport AIDeterrenceVoiceType from 'customer-site/enums/AIDeterrenceVoiceType';\nimport { NoAIPerimeterGuard, TextToSpeechWithImage } from 'customer-site/enums/AIPerimeterGuardType';\nimport { None, SingleSiren2 } from 'customer-site/enums/PerimeterGuardAudioOption';\nimport { EVERY_DAY_BITS } from 'customer-site/utils/datetime';\nimport { getDeviceId } from 'customer-site/utils/device';\nimport { lightAlertDropdownItems } from 'customer-site/utils/video/settings/light-alert-options';\nimport { perimeterGuardAudioDropdownItems } from 'customer-site/utils/video/settings/perimeter-guard-audio-options';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { intlPath } from '@adc/i18n/path';\nimport DropdownSelectItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type { SafeString } from '@ember/template/-private/handlebars';\nimport './_style.scss';\nimport type BaseAjaxService from '@adc/ajax/services/adc-ajax';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type { ISelectItem } from '@adc/ui-components/utils/select-item';\nimport type { LightAlertOption } from 'customer-site/enums/LightAlertOption';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\ntype timeValuesAsInts = { dayBits: number; beginTime: number; endTime: number };\n\nexport const MinSirenVolume = 0,\n MaxUnboostedVolume = 10,\n MaxDeterrenceVolume = 12,\n MaxSirenVolume = 100,\n MinSirenBrightness = 0,\n MaxSirenBrightness = 100;\n\n// Future TODO - Can these come from the backend?\nconst CameraLightDurationValues = [3, 5, 10, 30],\n DefaultCameraLightDurationValue = 10,\n AudioDurationValues = [3, 30],\n DefaultAudioDuration = 3;\n\nconst AIDeterrenceMessageTypeValues = [\n AIDeterrenceMessageType.CommercialPropertyClosed,\n AIDeterrenceMessageType.Deterrence,\n AIDeterrenceMessageType.LeaveAMessage,\n AIDeterrenceMessageType.NotAcceptingVisitors,\n AIDeterrenceMessageType.ProfessionallyMonitored,\n AIDeterrenceMessageType.Trespassing\n];\n\nconst AIDeterrenceLanguageTypeValues = [\n AIDeterrenceLanguageType.English_US_Azure,\n AIDeterrenceLanguageType.French_Canada_Azure,\n AIDeterrenceLanguageType.Spanish_Mexico_Azure\n];\n\nexport interface PerimeterGuardRuleSignature {\n Element: HTMLDivElement;\n Args: {\n isMobileBrowserSize: boolean;\n canEditRule: boolean;\n possibleMinimumDelayDropdownItems: DropdownSelectItem[];\n perimeterGuardDayBoundsBits: number;\n rule: OvRule;\n scheduleIsCustom: boolean;\n setPerimeterGuardSubScheduleIsCustom: (isCustom: boolean) => void;\n canModifyRuleUiElements: boolean;\n hasAiDeterrenceFeatureToggle: boolean;\n hasAiDeterrenceServicePlan: boolean;\n cameraViewDescriptor: string;\n availableLightAlertOptions: LightAlertOption[];\n hasTwoWayAudioAddOnAndAcceptedAudioAgreement: boolean;\n canAccessAiDeterrenceResponseConfiguration: boolean;\n useStoriesUI: boolean;\n canAccessAiDeterrenceRandomizedMessages: boolean;\n canAccessAiDeterrenceLanguageConfiguration: boolean;\n canAccessAiDeterrenceFreeTextEntry: boolean;\n };\n}\n\n/**\n * Get the context resource key for the given audio option\n * @param audioOption the enum value of the audio option\n * @returns the resource key\n */\nfunction getResourceKeyForAiDeterrenceMessageTypePreview(aiDeterrenceMessageTypeOption: number): string {\n const key =\n {\n [AIDeterrenceMessageType.Deterrence]: 'deterrenceType',\n [AIDeterrenceMessageType.DeterrenceWithSceneDescription]: 'deterrenceType',\n [AIDeterrenceMessageType.ProfessionallyMonitored]: 'professionallyMonitoredType',\n [AIDeterrenceMessageType.Trespassing]: 'trespassingType',\n [AIDeterrenceMessageType.NotAcceptingVisitors]: 'notAcceptingVisitorsType',\n [AIDeterrenceMessageType.CommercialPropertyClosed]: 'commercialPropertyClosedType',\n [AIDeterrenceMessageType.CommercialPropertyClosedLight]: 'commercialPropertyClosedType',\n [AIDeterrenceMessageType.LeaveAMessage]: 'leaveAMessageType'\n }[aiDeterrenceMessageTypeOption] ?? 'deterrenceType';\n\n return `aiDeterrenceMessageTypePreview.${key}`;\n}\n\n/**\n * Get the context resource key for the given audio option\n * @param audioOption the enum value of the audio option\n * @returns the resource key\n */\nfunction getResourceKeyForAiDeterrenceMessageTypeOption(aiDeterrenceMessageTypeOption: number): string {\n const key =\n {\n [AIDeterrenceMessageType.Deterrence]: 'deterrenceType',\n [AIDeterrenceMessageType.DeterrenceWithSceneDescription]: 'deterrenceType',\n [AIDeterrenceMessageType.ProfessionallyMonitored]: 'professionallyMonitoredType',\n [AIDeterrenceMessageType.Trespassing]: 'trespassingType',\n [AIDeterrenceMessageType.NotAcceptingVisitors]: 'notAcceptingVisitorsType',\n [AIDeterrenceMessageType.CommercialPropertyClosed]: 'commercialPropertyClosedType',\n [AIDeterrenceMessageType.CommercialPropertyClosedLight]: 'commercialPropertyClosedType',\n [AIDeterrenceMessageType.LeaveAMessage]: 'leaveAMessageType'\n }[aiDeterrenceMessageTypeOption] ?? 'deterrenceType';\n\n return `aiDeterrenceMessageTypeOption.${key}`;\n}\n\n/**\n * Get the context resource key for the given audio option\n * @param aiDeterrenceMessageSubTypeOption the enum value of the audio option\n * @returns the resource key\n */\nfunction getResourceKeyForAiDeterrenceMessageSubTypeOption(aiDeterrenceMessageSubTypeOption: number): string {\n const key =\n {\n [AIDeterrenceMessageType.Deterrence]: 'deterrenceTypeWithoutScene',\n [AIDeterrenceMessageType.DeterrenceWithSceneDescription]: 'deterrenceTypeWithScene',\n [AIDeterrenceMessageType.CommercialPropertyClosed]: 'commercialPropertyClosedTypeNormal',\n [AIDeterrenceMessageType.CommercialPropertyClosedLight]: 'commercialPropertyClosedTypeLight'\n }[aiDeterrenceMessageSubTypeOption] ?? 'deterrenceTypeWithoutScene';\n\n return `aiDeterrenceMessageSubTypeOption.${key}`;\n}\n\n/**\n * Get the context resource key for the given audio option\n * @param audioOption the enum value of the audio option\n * @returns the resource key\n */\nfunction getResourceKeyForAiDeterrenceVoiceTypeOption(aiDeterrenceVoiceTypeOption: number): string {\n const key =\n {\n [AIDeterrenceVoiceType.AdamNormal]: 'adamNormal',\n [AIDeterrenceVoiceType.JohnAngry]: 'johnAngry',\n [AIDeterrenceVoiceType.KarenCheerful]: 'karenCheerful',\n [AIDeterrenceVoiceType.KarenFriendly]: 'karenFriendly',\n [AIDeterrenceVoiceType.KarenNormal]: 'karenNormal',\n [AIDeterrenceVoiceType.KarenUnfriendly]: 'karenUnfriendly',\n [AIDeterrenceVoiceType.MaryNormal]: 'maryNormal',\n [AIDeterrenceVoiceType.MaryUnfriendly]: 'maryUnfriendly',\n [AIDeterrenceVoiceType.SteveAngry]: 'steveAngry',\n [AIDeterrenceVoiceType.SteveNeutral]: 'steveNeutral',\n [AIDeterrenceVoiceType.SteveNormal]: 'steveNormal',\n [AIDeterrenceVoiceType.SteveUnfriendly]: 'steveUnfriendly',\n [AIDeterrenceVoiceType.TomAngry]: 'tomAngry',\n [AIDeterrenceVoiceType.TomNormal]: 'tomNormal'\n }[aiDeterrenceVoiceTypeOption] ?? 'adamNormal';\n\n return `aiDeterrenceVoiceTypeOption.${key}`;\n}\n\n/**\n * Get the context resource key for the given audio option\n * @param audioOption the enum value of the audio option\n * @returns the resource key\n */\nfunction getResourceKeyForAiDeterrenceLanguageTypePreview(aiDeterrenceLanguageTypeOption: number): string {\n const key =\n {\n [AIDeterrenceLanguageType.English_US_Azure]: 'englishUSAzureType',\n [AIDeterrenceLanguageType.French_Canada_Azure]: 'frenchCanadaAzureType',\n [AIDeterrenceLanguageType.Spanish_Mexico_Azure]: 'spanishMexicoAzureType'\n }[aiDeterrenceLanguageTypeOption] ?? 'englishUSAzureType';\n\n return `aiDeterrenceLanguageTypePreview.${key}`;\n}\n\n/**\n * Component for configuring Perimeter Guard triggers for a Video Analytics rule\n *\n * Future TODO - look into getting the audio option names from the backend\n */\n@intlPath({ path: 'video/perimeter-guard-rule' })\nexport default class PerimeterGuardRule extends Component {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare ajax: BaseAjaxService;\n\n /**\n * The minimum volume for a siren rule.\n * @readonly\n */\n perimeterGuardConfigMinVolume = MinSirenVolume;\n\n /**\n * The maximum volume for a siren rule.\n * @readonly\n */\n perimeterGuardConfigMaxVolume = MaxSirenVolume;\n\n /**\n * The maximum volume for AI Deterrence\n * @readonly\n */\n aiDeterrenceMaxVolume = MaxDeterrenceVolume;\n\n /**\n * The minimum brightness for a siren rule.\n * @readonly\n */\n perimeterGuardConfigMinBrightness = MinSirenBrightness;\n\n /**\n * The minimum brightness for a siren rule.\n * @readonly\n */\n perimeterGuardConfigMaxBrightness = MaxSirenBrightness;\n\n /**\n * Does this camera support subschedules for Perimeter Guard?\n */\n @reads('args.rule.camera.supportsPerimeterGuardSubSchedule')\n declare supportsPerimeterGuardSubSchedule: boolean;\n\n /**\n * Does the camera support sound/audio for Perimeter Guard?\n */\n @reads('args.rule.camera.supportsPerimeterGuardAudioPlayback')\n declare supportsPerimeterGuardAudioPlayback: boolean;\n\n /**\n * Does this camera support camera sound duration for Perimeter Guard?\n */\n @reads('args.rule.camera.supportsPerimeterGuardAudioDuration')\n declare supportsPerimeterGuardAudioDuration: boolean;\n\n /**\n * Can this camera play sound/audio for Perimeter Guard?\n */\n @reads('args.rule.camera.canPlaySound')\n declare canPlaySound: boolean;\n\n /**\n * Does the camera use a built in buzzer to play its sound?\n */\n @not('args.rule.camera.supportsBuzzer')\n declare supportsVolumeAdjustment: boolean;\n\n /**\n * Does the camera support floodlight?\n */\n @reads('args.rule.camera.supportsFloodlight')\n declare supportsFloodlight: boolean;\n\n /**\n * Does the camera support spotlight?\n */\n @reads('args.rule.camera.supportsSpotlight')\n declare supportsSpotlight: boolean;\n\n /**\n * What cameras on this account have AI Deterrence enabled?\n */\n @reads('args.camerasWithAiDeterrence')\n declare camerasWithAiDeterrence: number[];\n\n /**\n * Does this camera already have AI Deterrence enabled?\n */\n @computed('camerasWithAiDeterrence', 'deviceId')\n get doesDeviceHaveAiDeterrenceEnabled(): boolean {\n return this.camerasWithAiDeterrence.includes(this.deviceId);\n }\n\n /**\n * Is the AI Deterrence slider boosted and enabled?\n */\n @computed('isAIPerimeterGuardWithVideoEnabled', 'isVolumeBoosted')\n get isAiDeterrenceBoostedSliderEnabled(): boolean {\n return this.isVolumeBoosted && this.isAIPerimeterGuardWithVideoEnabled;\n }\n\n /**\n * How many cameras on this account can have AI Deterrence enabled?\n */\n @reads('args.aiDeterrenceMaxCameraQuota')\n declare aiDeterrenceMaxCameraQuota: number;\n\n /**\n * What is this camera's device id?\n */\n @computed('args.rule.camera.id')\n get deviceId(): number {\n return Number(getDeviceId(this.args.rule.belongsTo('camera').id()));\n }\n\n /**\n * Light brightness percentange.\n */\n @alias('args.rule.perimeterGuardConfig.floodlightBrightness')\n declare sirenLightBrightness: number;\n\n /**\n * The volume percentage of the siren sound for this rule.\n */\n @alias('args.rule.perimeterGuardConfig.audioDuration')\n declare audioDuration: number;\n\n /**\n * AI Deterrence Message type.\n */\n @alias('args.rule.perimeterGuardConfig.aiDeterrenceMessageType')\n declare aiDeterrenceMessageType: number;\n\n /**\n * AI Deterrence Message subtype.\n */\n @alias('args.rule.perimeterGuardConfig.aiDeterrenceMessageSubType')\n declare aiDeterrenceMessageSubType: number;\n\n /**\n * AI Deterrence Voice Type.\n */\n @alias('args.rule.perimeterGuardConfig.aiDeterrenceVoiceType')\n declare aiDeterrenceVoiceType: number;\n\n /**\n * What language should be used for AI Deterrence?\n */\n @alias('args.rule.perimeterGuardConfig.languageType')\n declare aiDeterrenceLanguageType: number;\n\n @computed('isAIPerimeterGuardWithVideoEnabled', 'isAiDeterrenceQuotaMetOrExceeded')\n get showAiDeterrenceToggle(): boolean {\n return this.isAIPerimeterGuardWithVideoEnabled || !this.isAiDeterrenceQuotaMetOrExceeded;\n }\n\n /**\n * Is the AI Deterrence Awareness bubble open?\n */\n @tracked aiDeterrenceAwarenessPopoverOpen = false;\n\n /**\n * Voice options will change depending on the AI Deterrence message type.\n */\n get aiDeterrenceVoiceOptions(): Map {\n const availableVoiceTypesMap = new Map();\n const SteveAngry = AIDeterrenceVoiceType.SteveAngry;\n const SteveNormal = AIDeterrenceVoiceType.SteveNormal;\n const SteveNeutral = AIDeterrenceVoiceType.SteveNeutral;\n const SteveUnfriendly = AIDeterrenceVoiceType.SteveUnfriendly;\n const JohnAngry = AIDeterrenceVoiceType.JohnAngry;\n const TomAngry = AIDeterrenceVoiceType.TomAngry;\n const TomNormal = AIDeterrenceVoiceType.TomNormal;\n const MaryNormal = AIDeterrenceVoiceType.MaryNormal;\n const MaryUnfriendly = AIDeterrenceVoiceType.MaryUnfriendly;\n const KarenCheerful = AIDeterrenceVoiceType.KarenCheerful;\n const KarenFriendly = AIDeterrenceVoiceType.KarenFriendly;\n const KarenNormal = AIDeterrenceVoiceType.KarenNormal;\n const KarenUnfriendly = AIDeterrenceVoiceType.KarenUnfriendly;\n const AdamNormal = AIDeterrenceVoiceType.AdamNormal;\n\n availableVoiceTypesMap.set(AIDeterrenceMessageType.Deterrence, [JohnAngry, SteveAngry, TomAngry]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.DeterrenceWithSceneDescription, [\n JohnAngry,\n SteveAngry,\n TomAngry\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.Trespassing, [\n JohnAngry,\n KarenUnfriendly,\n MaryUnfriendly,\n SteveAngry,\n SteveNeutral,\n SteveUnfriendly,\n TomNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.CommercialPropertyClosed, [\n KarenUnfriendly,\n MaryUnfriendly,\n SteveNeutral,\n SteveUnfriendly,\n TomNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.ProfessionallyMonitored, [\n KarenUnfriendly,\n MaryUnfriendly,\n SteveNeutral,\n SteveUnfriendly,\n TomNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.NotAcceptingVisitors, [\n AdamNormal,\n KarenCheerful,\n KarenNormal,\n SteveNormal,\n SteveUnfriendly,\n TomNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.LeaveAMessage, [\n AdamNormal,\n KarenCheerful,\n KarenNormal,\n SteveNormal,\n TomNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.ExpectingDelivery, [\n AdamNormal,\n KarenFriendly,\n MaryNormal,\n SteveNormal\n ]);\n availableVoiceTypesMap.set(AIDeterrenceMessageType.CommercialPropertyClosedLight, [\n KarenCheerful,\n KarenNormal,\n KarenUnfriendly,\n SteveNormal,\n TomNormal\n ]);\n\n return availableVoiceTypesMap;\n }\n\n /**\n * Maps the AI Deterrence Message Type to its possible Sub Types.\n */\n get aiDeterrenceMessageSubTypeOptions(): Map {\n const availableMessageSubTypeMap = new Map();\n availableMessageSubTypeMap.set(AIDeterrenceMessageType.Deterrence, [\n AIDeterrenceMessageType.Deterrence,\n AIDeterrenceMessageType.DeterrenceWithSceneDescription\n ]);\n availableMessageSubTypeMap.set(AIDeterrenceMessageType.CommercialPropertyClosed, [\n AIDeterrenceMessageType.CommercialPropertyClosed,\n AIDeterrenceMessageType.CommercialPropertyClosedLight\n ]);\n return availableMessageSubTypeMap;\n }\n\n @computed(\n 'aiDeterrenceMaxCameraQuota',\n 'camerasWithAiDeterrence.length',\n 'hasAiDeterrenceServicePlan',\n 'doesDeviceHaveAiDeterrenceEnabled',\n 'numberOfCamerasWithAiDeterrence'\n )\n get isAiDeterrenceQuotaMetOrExceeded(): boolean {\n if (this.hasAiDeterrenceServicePlan) {\n if (this.doesDeviceHaveAiDeterrenceEnabled) {\n return this.numberOfCamerasWithAiDeterrence > this.aiDeterrenceMaxCameraQuota;\n }\n return this.numberOfCamerasWithAiDeterrence >= this.aiDeterrenceMaxCameraQuota;\n }\n return false;\n }\n\n @computed('camerasWithAiDeterrence')\n get numberOfCamerasWithAiDeterrence(): number {\n const uniqueDevices = [...new Set(this.camerasWithAiDeterrence)];\n return uniqueDevices.length;\n }\n\n /**\n * Does this rule have siren sounds enabled?\n */\n @alias('args.rule.perimeterGuardConfig.audioEnabled')\n declare sirenAudioEnabled: boolean;\n\n /**\n * Does this rule have siren leds enabled?\n */\n @alias('args.rule.perimeterGuardConfig.ledEnabled')\n declare sirenLedEnabled: boolean;\n\n /**\n * Does this rule have siren lights enabled?\n */\n @alias('args.rule.perimeterGuardConfig.lightEnabled')\n declare sirenLightEnabled: boolean;\n\n /**\n * Does this rule's camera support AI Deterrence?\n */\n @reads('args.rule.camera.supportsAIDeterrence')\n declare supportsAIDeterrence: boolean;\n\n /**\n * Should the AI Deterrence be toggled on?\n */\n @computed(\n 'isAIPerimeterGuardWithVideoEnabled',\n 'sirenAudioEnabled',\n 'sirenLedEnabled',\n 'sirenLightEnabled',\n 'supportsFloodlight'\n )\n get shouldAIDeterrenceBeToggledOn(): boolean {\n if (this.supportsFloodlight) {\n return this.isAIPerimeterGuardWithVideoEnabled && (this.sirenAudioEnabled || this.sirenLightEnabled);\n }\n\n return this.isAIPerimeterGuardWithVideoEnabled && (this.sirenAudioEnabled || this.sirenLedEnabled);\n }\n\n /**\n * Should the AI Deterrence options be shown?\n * For the Draw V2 page, they are collapsed if the toggle is off.\n */\n @computed('args.useStoriesUI', 'shouldAIDeterrenceBeToggledOn')\n get shouldShowAIDDetails(): boolean {\n return !this.args.useStoriesUI || this.shouldAIDeterrenceBeToggledOn;\n }\n\n /**\n * This is a short string that previews what the selected AI Deterrence response mode will look like.\n */\n @computed('aiDeterrenceMessageType')\n get getPreviewString(): string {\n const quote = this.intl.tc(this, getResourceKeyForAiDeterrenceMessageTypePreview(this.aiDeterrenceMessageType));\n return this.intl.t('generic.quotedText', { quote });\n }\n\n /**\n * The volume percentage of the siren sound for this rule.\n */\n @alias('args.rule.perimeterGuardConfig.audioVolume')\n declare sirenSoundVolume: number;\n\n /**\n * The volume percentage of the siren sound for this rule.\n */\n @alias('args.rule.perimeterGuardConfig.aiDeterrenceMessageVolume')\n declare aiDeterrenceMessageVolume: number;\n\n /**\n * Should we boost the AI Deterrence sound?\n */\n @alias('args.rule.perimeterGuardConfig.shouldBoostVolumeGain')\n declare shouldBoostVolumeGain: boolean;\n\n /**\n * Does this camera flash red/blue when its Perimeter Guard LED pattern is triggered?\n */\n @reads('args.rule.camera.hasRedBlueLedPatternBehavior')\n declare hasRedBlueLedPatternBehavior: boolean;\n\n /**\n * List of supported audio option for a given camera\n */\n @reads('args.rule.camera.supportedPerimeterGuardAudioOptions')\n declare supportedPerimeterGuardAudioOptions: number[];\n\n /**\n * Whether or not the camera supports Upstream Audio\n */\n @reads('args.rule.camera.hasUpstreamAudioUrl')\n declare hasUpstreamAudioUrl: boolean;\n\n /**\n * Selection of minimum delays between siren rule activations.\n */\n @reads('args.possibleMinimumDelayDropdownItems')\n declare perimeterGuardConfigMinimumDelays: DropdownSelectItem[];\n\n /**\n * Can this customer use AI Perimeter Guard with image processing?\n */\n @reads('args.hasAiDeterrenceFeatureToggle')\n declare hasAiDeterrenceFeatureToggle: boolean;\n\n /**\n * Can this customer access the AI Deterrence Configuration?\n */\n @reads('args.canAccessAiDeterrenceResponseConfiguration')\n declare canAccessAiDeterrenceResponseConfiguration: boolean;\n\n /**\n * Can the user access the randomized messages checkbox during AI Deterrence rule creation?\n */\n @reads('args.canAccessAiDeterrenceRandomizedMessages')\n declare canAccessAiDeterrenceRandomizedMessages: boolean;\n\n /**\n * Can the user access the language settings dropdown during AI Deterrence rule creation?\n */\n @reads('args.canAccessAiDeterrenceLanguageConfiguration')\n declare canAccessAiDeterrenceLanguageConfiguration: boolean;\n\n /**\n * Can the user access the AI Deterrence Free-Text UI section during rule creation?\n */\n @reads('args.canAccessAiDeterrenceFreeTextEntry')\n declare canAccessAiDeterrenceFreeTextEntry: boolean;\n\n /**\n * Does this customer have the AIDeterrenceServicePackage permission?\n */\n @reads('args.hasAiDeterrenceServicePlan')\n declare hasAiDeterrenceServicePlan: boolean;\n\n /**\n * Does this customer have the two-way audio add on (Audio for non-doorbell cameras)\n * and did they accept either the V1 or V2 audio agreement?\n */\n @reads('args.hasTwoWayAudioAddOnAndAcceptedAudioAgreement')\n declare hasTwoWayAudioAddOnAndAcceptedAudioAgreement: boolean;\n\n /**\n * A description of what the camera is seeing.\n */\n @reads('args.cameraViewDescriptor')\n declare cameraViewDescriptor: string;\n\n /**\n * Track if Perimeter Guard rule is enabled.\n */\n @or('args.rule.perimeterGuardConfig.{ledEnabled,audioEnabled,lightEnabled}')\n declare perimeterGuardEnabled: boolean;\n\n /**\n * Can the camera set audio options for Perimeter Guard\n */\n @and('canPlaySound', 'args.canEditRule')\n declare canEditPerimeterGuardSound: boolean;\n\n /**\n * Should the camera floodlight brightness slider be enabled?\n */\n @and('args.rule.perimeterGuardConfig.lightEnabled', 'args.canEditRule')\n declare enableCameraFloodlightBrightnessSlider: boolean;\n\n /**\n * Should the camera floodlight option dropdown be enabled?\n */\n @and('args.rule.perimeterGuardConfig.lightEnabled', 'args.canModifyRuleUiElements')\n declare enableCameraLightAlertOptionsDropdown: boolean;\n\n /**\n * Should the camera sound dropdown be enabled?\n */\n @and(\n 'args.rule.perimeterGuardConfig.audioEnabled',\n 'cameraSoundOptions.length',\n 'canPlaySound',\n 'args.canModifyRuleUiElements'\n )\n declare enableCameraSoundDropdown: boolean;\n\n @and(\n 'supportsPerimeterGuardAudioDuration',\n 'args.rule.perimeterGuardConfig.audioEnabled',\n 'cameraSoundOptions.length',\n 'canPlaySound',\n 'args.canModifyRuleUiElements'\n )\n declare enableAudioSoundDurationDropDown: boolean;\n\n /**\n * Should the camera sound volume slider be enabled?\n */\n @and('args.rule.perimeterGuardConfig.audioEnabled', 'cameraSoundOptions.length', 'canEditPerimeterGuardSound')\n declare enableCameraSoundVolumeSlider: boolean;\n\n /**\n * Is AI Perimeter Guard with Image Processing enabled?\n */\n @equal('args.rule.perimeterGuardConfig.aIPerimeterGuardType', TextToSpeechWithImage)\n declare isAIPerimeterGuardWithVideoEnabled: boolean;\n\n /**\n * The Perimeter Guard type, either none, Perimeter Guard with Image, or Perimeter Guard without image\n */\n @alias('args.rule.perimeterGuardConfig.aIPerimeterGuardType')\n declare aiPerimeterGuardType: number;\n\n /**\n * Is the slider at a boosted level\n */\n @gt('aiDeterrenceMessageVolume', MaxUnboostedVolume)\n declare isVolumeBoosted: boolean;\n\n /**\n * Is AI Deterrence randomization enabled?\n */\n @alias('args.rule.perimeterGuardConfig.enableRandomization')\n declare enableRandomization: boolean;\n\n /**\n * The user input for AI Deterrence Free-Text.\n */\n @alias('args.rule.perimeterGuardConfig.aiDeterrenceFreeText')\n declare aiDeterrenceFreeText: string;\n\n /**\n * Should the camera LED duration dropdown be enabled?\n */\n get enableCameraLedDurationDropdown(): boolean {\n const { args, cameraLightDurations, sirenLedEnabled, sirenLightEnabled } = this,\n { canModifyRuleUiElements } = args;\n\n return (sirenLedEnabled || sirenLightEnabled) && !!cameraLightDurations.length && canModifyRuleUiElements;\n }\n\n /**\n * Selection of camera status light durations (in seconds).\n */\n get cameraLightDurations(): DropdownSelectItem[] {\n return CameraLightDurationValues.map((value) =>\n DropdownSelectItem.create({\n value: String(value),\n name: this.intl.t('generic.seconds', { num: value }),\n state: value === DefaultCameraLightDurationValue ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * Selection of AI Deterrence Message types.\n */\n get aiDeterrenceMessageTypeOptions(): ISelectItem[] {\n return AIDeterrenceMessageTypeValues.map((value) => ({\n value: value,\n name: this.intl.tc(this, getResourceKeyForAiDeterrenceMessageTypeOption(value)),\n state: value === this.aiDeterrenceMessageType\n })).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Dropdown selection of AI Deterrence Voice types.\n */\n get aiDeterrenceMessageSubTypeDropdownOptions(): ISelectItem[] {\n const aiDeterrenceMessageSubTypeOptions = this.aiDeterrenceMessageSubTypeOptions.get(\n Number(this.aiDeterrenceMessageType)\n ) || [AIDeterrenceMessageType.None];\n\n return aiDeterrenceMessageSubTypeOptions\n .map((value) => ({\n value,\n name: this.intl.tc(this, getResourceKeyForAiDeterrenceMessageSubTypeOption(value)),\n state: value === (this.aiDeterrenceMessageSubType ?? aiDeterrenceMessageSubTypeOptions[0])\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Dropdown selection of AI Deterrence language options.\n */\n get aiDeterrenceLanguageTypeDropdownOptions(): DropdownSelectItem[] {\n return AIDeterrenceLanguageTypeValues.map((value) =>\n DropdownSelectItem.create({\n value: String(value),\n name: this.intl.tc(this, getResourceKeyForAiDeterrenceLanguageTypePreview(value)),\n state: value === this.aiDeterrenceLanguageType ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * Dropdown selection of AI Deterrence Voice types.\n */\n @computed(\n 'aiDeterrenceMessageType',\n 'aiDeterrenceVoiceOptions',\n 'aiDeterrenceVoiceType',\n 'aiDeterrenceMessageSubType'\n )\n get aiDeterrenceVoiceTypeDropdownOptions(): ISelectItem[] {\n const messageType =\n this.aiDeterrenceMessageSubType == AIDeterrenceMessageType.None\n ? this.aiDeterrenceMessageType\n : this.aiDeterrenceMessageSubType;\n const aiDeterrenceVoiceOptions = this.aiDeterrenceVoiceOptions.get(Number(messageType)) || [\n AIDeterrenceVoiceType.SteveAngry,\n AIDeterrenceVoiceType.JohnAngry,\n AIDeterrenceVoiceType.TomAngry\n ];\n return aiDeterrenceVoiceOptions\n .map((value) => ({\n value,\n name: this.intl.tc(this, getResourceKeyForAiDeterrenceVoiceTypeOption(value)),\n state: value === (this.aiDeterrenceVoiceType ?? aiDeterrenceVoiceOptions[0])\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Dropdown selection of AI Deterrence Free-Text Voice types.\n */\n @computed('aiDeterrenceVoiceType')\n get aiDeterrenceFreeTextVoiceTypeDropdownOptions(): DropdownSelectItem[] {\n const voiceOptions = [\n AIDeterrenceVoiceType.SteveNormal,\n AIDeterrenceVoiceType.SteveAngry,\n AIDeterrenceVoiceType.TomNormal,\n AIDeterrenceVoiceType.MaryNormal,\n AIDeterrenceVoiceType.KarenCheerful,\n AIDeterrenceVoiceType.KarenUnfriendly\n ];\n return voiceOptions.map((value) =>\n DropdownSelectItem.create({\n value: String(value),\n name: this.intl.tc(this, getResourceKeyForAiDeterrenceVoiceTypeOption(value)),\n state: value === (this.aiDeterrenceVoiceType ?? voiceOptions[0]) ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * Selection of camera floodlight options.\n */\n get cameraLightAlertOptions(): DropdownSelectItem[] {\n return lightAlertDropdownItems(this.intl, this.args.availableLightAlertOptions);\n }\n\n /**\n * Selection of camera siren/audio sound options.\n */\n @computed(\n 'supportsAdditionalRuleFeatures',\n 'supportsPerimeterGuardAudioPlayback',\n 'supportedPerimeterGuardAudioOptions.[]',\n 'supportsMultipleSirenOptions'\n )\n get cameraSoundOptions(): DropdownSelectItem[] {\n if (!this.supportsPerimeterGuardAudioPlayback) {\n return [];\n }\n\n const { supportedPerimeterGuardAudioOptions } = this;\n if (isEmpty(supportedPerimeterGuardAudioOptions)) {\n return [];\n }\n\n return perimeterGuardAudioDropdownItems(this.intl, supportedPerimeterGuardAudioOptions);\n }\n\n /**\n * Selection of camera audio durations (in seconds).\n */\n @computed('supportsPerimeterGuardAudioPlayback')\n get audioDurationsOptions(): DropdownSelectItem[] {\n return AudioDurationValues.map((value) =>\n DropdownSelectItem.create({\n value: String(value),\n name: this.intl.t('generic.seconds', { num: value }),\n state: value === DefaultAudioDuration ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * Does the camera support multiple siren audio options.\n */\n @computed('supportedPerimeterGuardAudioOptions.[]')\n get supportsMultipleSirenOptions(): boolean {\n return this.supportedPerimeterGuardAudioOptions.includes(SingleSiren2);\n }\n\n /**\n * Track if minimum delay between Perimeter Guard activations drop down and Perimeter Guard sub-schedule picker should be disabled or not.\n */\n @computed('args.canModifyRuleUiElements', 'perimeterGuardEnabled', 'perimeterGuardConfigMinimumDelays.length')\n get perimeterGuardCustomizationComponentsDisabled(): boolean {\n return (\n !this.perimeterGuardEnabled ||\n this.perimeterGuardConfigMinimumDelays.length <= 0 ||\n !this.args.canModifyRuleUiElements\n );\n }\n\n /**\n * Whether or not we should enable the AI Deterrence Volume Slider\n */\n @computed('isAIPerimeterGuardWithVideoEnabled', 'perimeterGuardEnabled')\n get enableDeterrenceVolumeSlider(): boolean {\n return this.perimeterGuardEnabled && this.isAIPerimeterGuardWithVideoEnabled;\n }\n\n /**\n * The sub type dropdown should only be enabled if the main message type supports it.\n */\n get aiDeterrenceMessageSubTypeOptionsEnabled(): boolean {\n return this.aiDeterrenceMessageSubTypeOptions.has(Number(this.aiDeterrenceMessageType));\n }\n\n /**\n * Should the perimeter guard configuration test be enabled?\n */\n @computed('args.canEditRule', 'perimeterGuardEnabled', 'perimeterGuardConfigMinimumDelays.length')\n get perimeterGuardConfigurationTestDisabled(): boolean {\n return (\n !this.perimeterGuardEnabled || this.perimeterGuardConfigMinimumDelays.length <= 0 || !this.args.canEditRule\n );\n }\n\n /**\n * The instructional text to display on the Perimeter Guard audio warning dialog\n */\n @computed('contextManager.identityModel.hasAccessToAudioForNonDoorbellCameras')\n get perimeterGuardAudioWarningText(): string | SafeString {\n const { contextManager, intl } = this;\n\n return contextManager.identityModel.hasAccessToAudioForNonDoorbellCameras\n ? intl.tc(this, 'perimeterGuardAudioDisabledWarning')\n : htmlSafe(intl.tc(this, 'perimeterGuardServicePlanWarning'));\n }\n\n /**\n * The start time bound in minutes for the perimeter guard schedule.\n */\n @computed('args.{rule.startTime,scheduleIsCustom}')\n get perimeterGuardBeginTimeBound(): number | undefined {\n return this.args.scheduleIsCustom ? get(this.args.rule, 'startTime') : undefined;\n }\n\n /**\n * The start time bound in minutes for the perimeter guard schedule.\n */\n @computed('args.{rule.endTime,scheduleIsCustom}')\n get perimeterGuardEndTimeBound(): number | undefined {\n return this.args.scheduleIsCustom ? get(this.args.rule, 'endTime') : undefined;\n }\n\n /**\n * The out of bounds day bits for the perimeter guard schedule.\n */\n @computed('args.{rule.dayBits,scheduleIsCustom}')\n get perimeterGuardDayBoundsBits(): number | undefined {\n return this.args.scheduleIsCustom ? ~get(this.args.rule, 'dayBits') & EVERY_DAY_BITS : undefined;\n }\n\n /**\n * Determine whether or not to display the AI Perimeter Guard prompt\n */\n get displayAIPerimeterGuardPrompt(): boolean {\n return (\n (this.hasAiDeterrenceFeatureToggle || (this.hasAiDeterrenceServicePlan && this.supportsAIDeterrence)) &&\n this.supportsPerimeterGuardAudioPlayback &&\n this.hasTwoWayAudioAddOnAndAcceptedAudioAgreement &&\n this.hasUpstreamAudioUrl\n );\n }\n\n get displayCameraFirmwareUpgradeAlert(): boolean {\n return (\n !this.hasAiDeterrenceFeatureToggle &&\n this.hasAiDeterrenceServicePlan &&\n !this.supportsAIDeterrence &&\n this.supportsPerimeterGuardAudioPlayback &&\n this.hasTwoWayAudioAddOnAndAcceptedAudioAgreement &&\n this.hasUpstreamAudioUrl\n );\n }\n\n /**\n * Is the customer able to view Alarm.com Knowledge Base links?\n * (Alarm.com KB links as opposed to proprietary links)\n */\n get canViewKnowledgeBaseLinks(): boolean {\n const { identityManager } = this;\n return identityManager.canViewKnowledgeBase && !identityManager.isCpiDealer;\n }\n\n /**\n * Show a confirmation dialog modal to explain why the Perimeter Guard audio toggle cannot be activated\n * with instructions on how to resolve the issue\n */\n @action async showAudioFeaturesWarning(): Promise {\n const { perimeterGuardAudioWarningText } = this;\n\n this.modals.showConfirmationDialog(\n this.intl.tc(this, 'perimeterGuard'),\n perimeterGuardAudioWarningText,\n {\n text: this.intl.t('generic.ok')\n },\n null, // Do not show a \"cancel\" button\n 'audio-warning-modal'\n );\n }\n\n /**\n * Show a confirmation dialog modal to explain why the Perimeter Guard audio duration cannot be longer than\n * the light duration\n */\n @action showAudioDurationWarning(): void {\n this.modals.showConfirmationDialog(\n '',\n this.intl.tc(this, 'audioDurationError'),\n {\n text: this.intl.t('generic.ok')\n },\n null, // Do not show a \"cancel\" button\n 'audio-warning-modal'\n );\n }\n\n /**\n * This will redirect the user to the Knowledge Base link and section for AI Deterrence Best Practices\n */\n @action redirectToLearnMore(): void {\n window.open(\n 'https://answers.alarm.com/Customer/Website_and_App/Video/Video_Settings/AI_Deterrence_(AID)_Autonomous_Audio_Response_Service#AID_best_practices',\n '_blank'\n );\n }\n\n /**\n * Fires when AI Deterrence is toggled off when both perimeter guard audio and led are disabled.\n */\n @action showAIDeterrenceFeatureWarning(): void {\n this.modals.showConfirmationDialog(\n this.intl.tc(this, 'turnOffAIDeterrenceAlert'),\n this.intl.tc(this, 'aiDeterrenceWarning'),\n {\n text: this.intl.t('generic.ok'),\n action: async () => {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n set(perimeterGuardConfig, 'aIPerimeterGuardType', NoAIPerimeterGuard);\n }\n },\n null,\n 'ai-perimeter-guard-warning-modal'\n );\n }\n\n /**\n * Fires when we want audio toggled on/off for Perimeter Guard.\n */\n @action async onCameraSoundToggleChange(toggleEvent: Event & { target: HTMLInputElement }): Promise {\n const isEnabled = toggleEvent.target.checked,\n perimeterGuardConfig = await this.args.rule.perimeterGuardConfig,\n audioOpt = perimeterGuardConfig.audioOption;\n\n perimeterGuardConfig.audioEnabled = isEnabled;\n\n if (!this.canPlaySound) {\n this.showAudioFeaturesWarning();\n // The SimpleBinary needs an extra tick to get its internal state in order, so we need to wait until the next cycle before toggling the property.\n const fn = (): boolean => (perimeterGuardConfig.audioEnabled = false);\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n next(fn);\n return;\n }\n\n // Ensure audioOption is not None or null/undefined if sound is enabled but dropdown not yet touched.\n if (\n isEnabled &&\n (audioOpt === None || !audioOpt) &&\n this.supportedPerimeterGuardAudioOptions &&\n this.supportedPerimeterGuardAudioOptions.length\n ) {\n perimeterGuardConfig.audioOption = this.supportedPerimeterGuardAudioOptions[0];\n }\n\n if (this.isAIPerimeterGuardWithVideoEnabled && !this.sirenAudioEnabled && !this.sirenLedEnabled) {\n perimeterGuardConfig.shouldBoostVolumeGain = false;\n this.showAIDeterrenceFeatureWarning();\n }\n }\n\n /**\n * Fires when we want led toggled on/off for Perimeter Guard.\n * @param toggleEvent\n */\n @action async onCameraLedToggleChange(toggleEvent: Event & { target: HTMLInputElement }): Promise {\n const isEnabled = toggleEvent.target.checked,\n perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n\n perimeterGuardConfig.ledEnabled = isEnabled;\n if (this.isAIPerimeterGuardWithVideoEnabled && !this.sirenAudioEnabled && !this.sirenLedEnabled) {\n perimeterGuardConfig.shouldBoostVolumeGain = false;\n this.showAIDeterrenceFeatureWarning();\n }\n }\n\n /**\n * Fires when we toggle the Perimeter Guard with image processing checkbox.\n * Toggles perimeter guard audio and led options on if both were off on AID toggle.\n * @param toggleEvent State of the checkbox\n */\n @action async onToggleAIPerimeterGuardWithImage(toggleEvent: Event & { target: HTMLInputElement }): Promise {\n const isEnabled = toggleEvent.target.checked,\n allDisabled = !this.sirenLightEnabled && !this.sirenAudioEnabled && !this.sirenLedEnabled,\n perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n\n perimeterGuardConfig.aIPerimeterGuardType = isEnabled ? TextToSpeechWithImage : NoAIPerimeterGuard;\n\n if (isEnabled) {\n perimeterGuardConfig.aiDeterrenceMessageVolume = this.aiDeterrenceMaxVolume;\n }\n\n if (allDisabled) {\n perimeterGuardConfig.audioEnabled = true;\n if (this.supportsSpotlight) {\n perimeterGuardConfig.ledEnabled = true;\n perimeterGuardConfig.lightEnabled = true;\n } else if (this.supportsFloodlight) {\n perimeterGuardConfig.lightEnabled = true;\n } else {\n perimeterGuardConfig.ledEnabled = true;\n }\n }\n }\n\n /**\n * Fires when we change the LED duration for Perimeter Guard.\n */\n @action async onCameraLightDurationChange(newDurationSeconds: string): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig,\n newDuration = Number(newDurationSeconds);\n\n // LED duration cannot be shorter than the audio duration\n if (newDuration < perimeterGuardConfig.audioDuration) {\n perimeterGuardConfig.audioDuration = AudioDurationValues[0];\n }\n\n perimeterGuardConfig.ledDurationSeconds = newDuration;\n }\n\n /**\n * Fires when we change the AI Deterrence Language Type dropdown value.\n */\n @action async onChangeAiDeterrenceLanguageType(newAiDeterrenceLanguageType: string): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n perimeterGuardConfig.languageType = parseInt(newAiDeterrenceLanguageType) as AIDeterrenceLanguageType;\n }\n\n /**\n * Fires when we change the AI Deterrence Message Type dropdown value.\n */\n @action async onChangeAiDeterrenceMessageType(newAiDeterrenceMessageType: AIDeterrenceMessageType): Promise {\n const aiDeterrenceVoiceOptions = this.aiDeterrenceVoiceOptions.get(Number(newAiDeterrenceMessageType)) || [\n AIDeterrenceVoiceType.SteveAngry,\n AIDeterrenceVoiceType.JohnAngry,\n AIDeterrenceVoiceType.TomAngry\n ],\n aiDeterrenceMessageSubTypeOptions = this.aiDeterrenceMessageSubTypeOptions.get(\n Number(newAiDeterrenceMessageType)\n ) || [AIDeterrenceMessageType.None],\n perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n\n if (!aiDeterrenceVoiceOptions.includes(this.aiDeterrenceVoiceType)) {\n perimeterGuardConfig.aiDeterrenceVoiceType = aiDeterrenceVoiceOptions[0];\n }\n\n if (!aiDeterrenceMessageSubTypeOptions.includes(this.aiDeterrenceMessageSubType)) {\n perimeterGuardConfig.aiDeterrenceMessageSubType = aiDeterrenceMessageSubTypeOptions[0];\n }\n\n perimeterGuardConfig.aiDeterrenceMessageType = newAiDeterrenceMessageType;\n }\n\n /**\n * Fires when we change the AI Deterrence Message Sub Type dropdown value.\n */\n @action async onChangeAiDeterrenceMessageSubType(\n newAiDeterrenceMessageSubType: AIDeterrenceMessageType\n ): Promise {\n const aiDeterrenceVoiceOptions = this.aiDeterrenceVoiceOptions.get(Number(newAiDeterrenceMessageSubType)) || [\n AIDeterrenceVoiceType.SteveAngry,\n AIDeterrenceVoiceType.JohnAngry,\n AIDeterrenceVoiceType.TomAngry\n ],\n perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n\n if (!aiDeterrenceVoiceOptions.includes(this.aiDeterrenceVoiceType)) {\n perimeterGuardConfig.aiDeterrenceVoiceType = aiDeterrenceVoiceOptions[0];\n }\n\n perimeterGuardConfig.aiDeterrenceMessageSubType = newAiDeterrenceMessageSubType;\n }\n\n /**\n * Fires when we change the AI Deterrence Language Type dropdown value.\n */\n @action async onChangeAiDeterrenceVoiceType(newAiDeterrenceVoiceType: string): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n perimeterGuardConfig.aiDeterrenceVoiceType = parseInt(newAiDeterrenceVoiceType) as AIDeterrenceVoiceType;\n }\n\n /**\n * Fires when we change the audio sound for Perimeter Guard.\n */\n @action async onCameraSoundChange(newAudioOption: number): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n perimeterGuardConfig.audioOption = newAudioOption;\n }\n\n /**\n * Fires when we change the audio duration for Perimeter Guard.\n */\n @action async onCameraAudioDurationChange(newDurationSeconds: string): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig,\n newDuration = parseInt(newDurationSeconds);\n\n // LED duration cannot be shorter than the audio duration\n if (Number(perimeterGuardConfig.ledDurationSeconds) < newDuration) {\n perimeterGuardConfig.audioDuration = AudioDurationValues[0];\n this.showAudioDurationWarning();\n return;\n }\n\n perimeterGuardConfig.audioDuration = newDuration;\n }\n\n /**\n * Fires when minimum delay for Perimeter Guard changes.\n */\n @action async onPerimeterGuardConfigMinimumDelayChange(newMinimumDelaySeconds: number): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n perimeterGuardConfig.minimumDelaySeconds = newMinimumDelaySeconds;\n }\n\n /**\n * Fired when the perimeter guard sub-schedule changes.\n */\n @action async onPerimeterGuardSubScheduleChanged(\n { dayBits, beginTime: startTime, endTime }: timeValuesAsInts,\n _afterSunset: boolean,\n _oldDayTimes: timeValuesAsInts,\n displayCustomSchedule: boolean\n ): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n setProperties(perimeterGuardConfig, { dayBits, startTime, endTime });\n\n if (displayCustomSchedule != null) {\n this.args.setPerimeterGuardSubScheduleIsCustom(displayCustomSchedule);\n }\n }\n\n /**\n * Action for updating the led pattern options according to the selected floodlight option.\n */\n @action async updateLightAlertOption(option: string): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n perimeterGuardConfig.lightAlertOption = parseInt(option) as LightAlertOption;\n }\n\n /**\n * Action to toggle the light guard section available on light cameras.\n */\n @action async toggleLightguard(): Promise {\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig,\n lightEnabled = perimeterGuardConfig.lightEnabled;\n\n perimeterGuardConfig.lightEnabled = !lightEnabled;\n if (this.isAIPerimeterGuardWithVideoEnabled && !this.sirenAudioEnabled && !this.sirenLightEnabled) {\n perimeterGuardConfig.shouldBoostVolumeGain = false;\n this.showAIDeterrenceFeatureWarning();\n }\n }\n\n /**\n * Action for performing a device reaction for testing the rule configuration.\n */\n @action async testPerimeterGuard(): Promise {\n const { rule } = this.args,\n [camera, perimeterGuardConfig] = await Promise.all([rule.camera, rule.perimeterGuardConfig]),\n perimeterGuardConfigJson = getProperties(\n perimeterGuardConfig,\n 'lightEnabled',\n 'lightAlertOption',\n 'aIPerimeterGuardType',\n 'cameraViewDescriptor',\n 'floodlightBrightness',\n 'audioDuration',\n 'audioEnabled',\n 'audioOption',\n 'audioVolume',\n 'ledEnabled',\n 'ledDurationSeconds',\n 'ledRed',\n 'ledGreen',\n 'ledBlue',\n 'ledBrightness',\n 'ledPulseMilliseconds',\n 'minimumDelaySeconds',\n 'dayBits',\n 'startTime',\n 'endTime'\n );\n\n return this.ajax.apiRequest(\n `video/perimeterGuardConfigs/${camera.id}/testSettings`,\n undefined,\n perimeterGuardConfigJson,\n POST\n );\n }\n\n /**\n * Action for performing a device reaction for testing the rule configuration.\n */\n @action async testAIDeterrence(): Promise {\n const { rule } = this.args,\n [camera, perimeterGuardConfig] = await Promise.all([rule.camera, rule.perimeterGuardConfig]),\n perimeterGuardConfigJson = getProperties(\n perimeterGuardConfig,\n 'aiDeterrenceMessageType',\n 'aiDeterrenceVoiceType',\n 'aiDeterrenceMessageSubType',\n 'aiDeterrenceMessageVolume'\n );\n\n return this.ajax.apiRequest(\n `video/aiDeterrenceTestSettings/${camera.id}`,\n undefined,\n perimeterGuardConfigJson,\n POST\n );\n }\n\n /**\n * Enable/Disable randomization for AI Deterrence.\n */\n @action async updateRandomizationState(evt: Event & { target: HTMLInputElement }): Promise {\n const { target } = evt;\n const perimeterGuardConfig = await this.args.rule.perimeterGuardConfig;\n set(perimeterGuardConfig, 'enableRandomization', !!target.checked);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::PerimeterGuardRule': typeof PerimeterGuardRule;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
    \\n {{#each @subjectFilters as |filter|}}\\n
  • \\n \\n
  • \\n {{/each}}\\n
\",{ moduleName: \"customer-site/components/video/rules/classification-filter-selection/subject-filter/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\n\nimport './_style.scss';\nimport type { ValueFilter } from 'customer-site/classes/video/rules/classification-filter';\n\ninterface SubjectFilterSignature {\n Element: HTMLUListElement;\n Args: {\n subjectFilters: ValueFilter[];\n onFilterChange: (filterItems: ValueFilter[]) => void;\n };\n}\n\nexport default class SelectionSubjectFilter extends Component {\n /**\n * Apply the value from a toggle event and fire the onFilterChange closure\n * @param filter the filter that was changed\n * @param evt toggle event\n */\n @action onFilterToggle(filter: ValueFilter, evt: Event & { target: HTMLInputElement }): void {\n filter.isSelected = evt.target.checked;\n filter.onItemChange(this.args.subjectFilters);\n this.args.onFilterChange(this.args.subjectFilters);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ClassificationFilterSelection::SubjectFilter': typeof SelectionSubjectFilter;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{!-- @glint-expect-error filter.icon could be undefined, please fix this. --}}\\n \\n \\n {{@filter.label}}\\n {{#if @filter.tooltip}}\\n \\n {{/if}}\\n \\n \\n \\n
\\n {{#if this.canShowSubItems}}\\n
\\n {{#unless this.areSubjectFiltersShown}}\\n {{this.subItemsSelectedText}}\\n {{/unless}}\\n \\n {{t (if this.areSubjectFiltersShown \\'generic.showLess\\' \\'generic.showMore\\')}}\\n \\n
\\n {{#if this.areSubjectFiltersShown}}\\n \\n {{/if}}\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/rules/classification-filter-selection/classification-filter/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { and } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { Vehicle } from '../../../../../enums/SavedClipFilterOption';\n\nimport type {\n ClassificationFilter,\n CompositeFilter,\n ValueFilter\n} from 'customer-site/classes/video/rules/classification-filter';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\n\nexport interface ClassificationFilterSignature {\n Args: {\n filter: CompositeFilter;\n onFilterChange: (filter: ClassificationFilter) => void;\n };\n}\n\n@intlPath({ path: 'video/rules/classification-filter-selection/classification-filter' })\nexport default class ClassificationFilterComponent extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Does this filter have subitems that can be shown because it is selected?\n */\n @and('args.filter.subItems', 'args.filter.state')\n declare canShowSubItems: boolean;\n\n /**\n * Is the section that displays the Familiar Subject filters shown?\n */\n @tracked areSubjectFiltersShown = (this.args.filter as CompositeFilter).subItems && this.args.filter.state;\n\n /**\n * How many of the filter subItems are selected\n */\n @computed('args.filter.subItems.@each.isSelected')\n get subItemsSelectedText(): string {\n const { subItems } = this.args.filter;\n\n const allVehiclesItem = subItems.find((item) => item.value === Vehicle);\n\n // If the \"All Vehicles\" item is selected, the text says \"All Items Selected\" instead of the number\n if (allVehiclesItem?.isSelected) {\n return this.intl.t('generic.allItemsSelected');\n }\n\n const amountSelected = subItems.filter((item) => item.isSelected).length;\n return this.intl.t('generic.itemsSelected', { count: amountSelected });\n }\n\n /**\n * Update the classification filter with the updated value when changed and calls the filter change\n * closure function to update the rule's notification filters\n *\n * @param filter\n * @param evt\n */\n @action onFilterChange(filter: ClassificationFilter, evt: Event & { target: HTMLInputElement }) {\n filter.setIsSelected(evt.target.checked);\n this.args.onFilterChange(filter);\n }\n\n /**\n * Function to call when the familiar subject filters for a classification filter is toggled\n * Applies the updated subject filters to the classification filter and calls the filter change\n * closure function to update the rule's notification filters\n *\n * @param filter\n * @param subjectFilters\n */\n @action onSubjectSelectionChange(filter: CompositeFilter, subjectFilters: ValueFilter[]) {\n filter.subItems = subjectFilters;\n this.args.onFilterChange(filter);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ClassificationFilterSelection::ClassificationFilter': typeof ClassificationFilterComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#each @subjectFilters as |filter|}}\\n \\n {{/each}}\\n
\",{ moduleName: \"customer-site/components/video/rules/classification-filter-selection/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { ClassificationFilterSignature } from 'customer-site/components/video/rules/classification-filter-selection/classification-filter/index';\n\ntype ClassificationFilterArgs = ClassificationFilterSignature['Args'];\n\nexport interface VideoRulesClassificationFilterSelectionSignature {\n Element: HTMLDivElement;\n Args: {\n subjectFilters: ClassificationFilterArgs['filter'][];\n onFilterChange: (filters: ClassificationFilterArgs['filter'][]) => void;\n };\n}\n\nconst VideoRulesClassificationFilterSelection =\n templateOnlyComponent();\nexport default VideoRulesClassificationFilterSelection;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ClassificationFilterSelection': typeof VideoRulesClassificationFilterSelection;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if (await this.showClassificationFiltersAsDropdownSelection)}}\\n \\n {{else}}\\n
\\n \\n {{!-- @glint-expect-error: button.icon could be undefined, please fix this. --}}\\n \\n

{{button.label}}

\\n \\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/rules/classification-selection-proxy/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { CompositeFilter, ValueFilter } from 'customer-site/classes/video/rules/classification-filter';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\n\nimport type Store from '@ember-data/store';\nimport type { ClassificationFilter, Filter } from 'customer-site/classes/video/rules/classification-filter';\nimport './_style.scss';\nimport type { VideoRulesClassificationFilterSelectionSignature } from 'customer-site/components/video/rules/classification-filter-selection/index';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ntype Props = {\n id: Filter['value'];\n subjectId: Filter['subjectId'];\n subitems?: BinaryListItem[];\n};\n\n/**\n * Convert a ClassificationFilter and all of its sub-items to a BinaryListItem\n *\n * @returns\n */\nexport function toBinaryListItem({\n icon,\n state,\n label,\n value,\n disabled,\n subjectId,\n subItems\n}: Filter): BinaryListItem {\n return new BinaryListItem({\n icon,\n label,\n state,\n disabled,\n props: {\n id: value,\n subjectId: subjectId,\n subitems: subItems ? subItems.map((si: Filter) => toBinaryListItem(si)) : undefined\n }\n });\n}\n\n/**\n * Convert a BinaryListItem and all of its sub-items to a ClassificationFilter\n *\n * @returns\n */\nexport function toClassificationItem({ icon, state, label, props }: BinaryListItem): ClassificationFilter {\n const subItems = props.subitems ?? [];\n if (subItems.length > 0) {\n return new CompositeFilter({\n icon,\n label: String(label),\n isSelected: state === true,\n value: props?.id as number,\n subItems: subItems.map((i) => toClassificationItem(i) as ValueFilter)\n });\n }\n\n return new ValueFilter({\n icon,\n isSelected: state === true,\n label: String(label),\n value: props?.id as number,\n subjectId: props?.subjectId as string | undefined\n });\n}\n\nexport interface ClassificationSelectionProxySignature {\n Args: {\n subjectFilters: VideoRulesClassificationFilterSelectionSignature['Args']['subjectFilters'];\n onFilterChange: (filterItems: ClassificationFilter[]) => void;\n disabled?: boolean;\n };\n}\n\n/**\n * @classdesc\n * Proxy component that will conditionally render a selection component based on the identity's familiar object enrollment permissions.\n */\nexport default class ClassificationSelectionProxy extends Component {\n @service declare contextManager: ContextManager;\n @service declare store: Store;\n\n /**\n * Should the updated classification filter UX be shown?\n */\n @computed()\n get showClassificationFiltersAsDropdownSelection() {\n return (async () => {\n const enrollments = await this.store.findAll('video/familiar-targets/familiar-target-enrollment'),\n vehicleEnrollment = enrollments.findBy('familiarObjectType', Vehicle),\n clusters = vehicleEnrollment?.get('clusters');\n\n return !!clusters?.length;\n })();\n }\n\n /**\n * The list ClassificationFilter items transformed into BinaryListItems\n */\n @computed('args.subjectFilters')\n get filtersAsListItems(): ReturnType[] {\n const { subjectFilters } = this.args;\n return subjectFilters.map((f: Filter) => toBinaryListItem(f));\n }\n\n /**\n * Transform the BinaryListItems back to ClassificationFilters when the selection is changed\n * so the parent can interpret them correctly\n *\n * @param listItems\n */\n @action onFiltersChanged(listItems: BinaryListItem[]) {\n // convert the items back to ClassificationFilters\n this.args.onFilterChange(listItems.map((i) => toClassificationItem(i)));\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ClassificationSelectionProxy': typeof ClassificationSelectionProxy;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{tc this \\'videoRuleExitDelay\\'}}\\n \\n
\\n \\n
\",{ moduleName: \"customer-site/components/video/rules/exit-delay/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\nexport interface ExitDelayArgs {\n disabled: boolean;\n rule: OvRule;\n}\n\n@intlPath({ path: 'video/rules/exit-delay' })\nexport default class ExitDelay extends Component {\n @service declare intl: ADCIntlService;\n @service declare store: Store;\n @service declare identityManager: IdentityManager;\n\n constructor(owner: ExitDelay, args: ExitDelayArgs) {\n super(owner, args);\n this.loadDefaultExitDelay();\n }\n\n /**\n * Display 0 - 10 minute dropdown options.\n */\n get exitDelayOptions(): DropdownSelectItem[] {\n const exitDelayItems = [\n DropdownSelectItem.create({\n name: this.intl.t('generic.none'),\n value: '0'\n })\n ];\n\n for (let i = 1; i <= 10; i++) {\n exitDelayItems.push(\n DropdownSelectItem.create({\n name: this.intl.t('generic.minutes', { num: i }),\n value: String(i)\n })\n );\n }\n\n exitDelayItems.push(\n DropdownSelectItem.create({\n name: this.intl.t('generic.minutes', { num: 15 }),\n value: String(15)\n })\n );\n exitDelayItems.push(\n DropdownSelectItem.create({\n name: this.intl.t('generic.minutes', { num: 30 }),\n value: String(30)\n })\n );\n\n return exitDelayItems;\n }\n\n /**\n * Store the currently selected exit delay in the dirty rule instance.\n */\n @action exitDelayChanged(exitDelay: string): void {\n this.args.rule.exitDelay = parseInt(exitDelay);\n }\n\n /**\n * Grabs the default video exit delay value set by the dealer parameter\n */\n async loadDefaultExitDelay() {\n if (this.args.rule.isNew) {\n const delayResult = await this.store.findRecord(\n 'video/permissions/ov-rule-permission',\n this.identityManager.getSelectedSystemId()\n );\n if (delayResult) {\n this.args.rule.exitDelay = delayResult.videoRuleExitDelayDefault;\n }\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::ExitDelay': typeof ExitDelay;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#unless @useStoriesUI}}\\n
\\n {{t \\'components.automation.at-home-exceptions.title\\'}}\\n
\\n {{/unless}}\\n
\\n {{t \\'enterprise.locations.propertyStatus\\'}}\\n \\n
\\n \\n \\n {{t \\'video.rules.analytics.draw.selectingAllExceptionsWarning\\'}}\\n \\n {{#if @showExitDelay}}\\n \\n {{else if (and @canUseExitDelay @rule.exceptions.length)}}\\n \\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/rules/property-status-exceptions/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport PresenceStateExplainerModal from 'customer-site/components/modals/automation/presence-state/presence-state-explainer/index';\nimport { PresenceStateAway, PresenceStateHome, PresenceStateSleep } from 'customer-site/enums/RecordingException';\nimport { intlPath } from '@adc/i18n/path';\nimport CheckboxTreeItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type Store from '@ember-data/store';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\nexport interface PropertyStatusExceptionsArgs {\n canModifyRuleUiElements: boolean;\n canUseAwayException: boolean;\n canUseExitDelay: boolean;\n disabled: boolean;\n rule: OvRule;\n showExitDelay: boolean;\n useStoriesUI: boolean;\n}\n\n@intlPath({ path: 'video/rules/property-status-exceptions' })\nexport default class PropertyStatusExceptions extends Component {\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare modals: ModalService;\n @service declare store: Store;\n\n /**\n * Whether or not to show the popup explaining why an exception was disabled.\n */\n @tracked\n showDisabledPopup = false;\n\n /**\n * The Property Status exception options to display for the rule.\n */\n @computed('args.{disabled,rule.exceptions,canUseAwayException}', 'disabledException')\n get propertyStatusExceptionItems(): CheckboxTreeItem[] {\n const { args, disabledException } = this,\n { disabled, rule, canUseAwayException } = args,\n { exceptions } = rule,\n items = [\n CheckboxTreeItem.create({\n name: this.intl.t('home.thermostats.home'),\n value: PresenceStateHome.toString(),\n icon: 'mode-home',\n state: exceptions.includes(PresenceStateHome) ? SELECTED : UNSELECTED,\n disabled: disabled || disabledException === 'mode-home'\n }),\n CheckboxTreeItem.create({\n name: this.intl.t('home.thermostats.sleep'),\n value: PresenceStateSleep.toString(),\n icon: 'mode-sleep',\n state: exceptions.includes(PresenceStateSleep) ? SELECTED : UNSELECTED,\n disabled: disabled || disabledException === 'mode-sleep'\n })\n ];\n if (canUseAwayException) {\n items.push(\n CheckboxTreeItem.create({\n name: this.intl.t('generic.away'),\n value: PresenceStateAway.toString(),\n icon: 'mode-away',\n state: exceptions.includes(PresenceStateAway) ? SELECTED : UNSELECTED,\n disabled: disabled || disabledException === 'mode-away'\n })\n );\n }\n return items;\n }\n\n /**\n * If two exceptions are selected, returns the icon for third exception.\n */\n @computed('args.{rule.exceptions,canUseAwayException}')\n get disabledException(): string {\n if (!this.args.canUseAwayException) {\n return 'none';\n }\n\n const maxExceptions = 2,\n selectedExceptions = this.args.rule.exceptions,\n availableExceptions = [PresenceStateHome, PresenceStateSleep, PresenceStateAway],\n exceptionToIcon = new Map([\n [0, 'none'],\n [PresenceStateHome, 'mode-home'],\n [PresenceStateSleep, 'mode-sleep'],\n [PresenceStateAway, 'mode-away']\n ]),\n disabledException =\n selectedExceptions.length === maxExceptions\n ? availableExceptions.filter((e) => !selectedExceptions.includes(e))[0]\n : 0;\n return exceptionToIcon.get(disabledException) as string;\n }\n\n /**\n * Display the same modal from the Property Status Settings page with a link to that page.\n */\n @action openModal(): void {\n const { contextManager, identityManager, intl } = this,\n image = identityManager.isDarkModeEnabled\n ? '/images/presence-state/info-image-dark.png'\n : '/images/presence-state/info-image.png';\n this.modals.showModal(PresenceStateExplainerModal, {\n titleText: intl.t('enterprise.locations.propertyStatus'),\n bodyMainText: intl.tc(this, 'overview'),\n bodySubText: intl.tc(this, 'statusChanges'),\n closeButtonText: intl.t('generic.cancel'),\n imagePath: contextManager.getStaticResourcePath(image),\n showCloseButton: true,\n leavePageWarning: intl.tc(this, 'goToSettingsPage')\n });\n }\n\n /**\n * Called when the user changes the exceptions.\n */\n @action async propertyStatusExceptionsChanged(exceptions: CheckboxTreeItem[]): Promise {\n const selectedExceptions = exceptions\n .filter((item) => item.state == SELECTED)\n .map((item) => parseInt(item.value));\n this.args.rule.exceptions = selectedExceptions;\n const delayResult = await this.store.findRecord(\n 'video/permissions/ov-rule-permission',\n this.identityManager.getSelectedSystemId()\n );\n if (delayResult) {\n this.args.rule.exitDelay = delayResult.videoRuleExitDelayDefault;\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Rules::PropertyStatusExceptions': typeof PropertyStatusExceptions;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n
\\n

{{tc this \\'description\\'}}

\\n
\\n
\\n {{#each (array\\n (hash type=\\'groundZone\\' src=\\'ground-zone-fox\\')\\n (hash type=\\'tripwire\\' src=\\'driveway\\')\\n ) as |info|}}\\n
\\n
\\n
{{t (concat \\'generic.video.\\' info.type)}}
\\n \\n
\\n {{tc this (concat info.type \\'Description\\')}}\\n

\\n {{t \\'generic.example\\'}}\\n
\\n {{tc this (concat info.type \\'Example\\')}}\\n

\\n
\\n {{/each}}\\n
\\n
\\n\\n\",{ moduleName: \"customer-site/components/modals/video/analytics-best-practices/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * This is a modal for displaying information about Video Analytics Detection options\n */\n@intlPath({ path: 'modals/video/analytics-best-practices' })\nexport default class AnalyticsBestPracticesModal extends Component {}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Modals::Video::AnalyticsBestPractices': typeof AnalyticsBestPracticesModal;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{tc this \\'createRule\\'}}

\\n\\n

{{this.headerText}}

\\n\\n

{{tc this \\'selectCamera\\'}}

\\n\\n
\\n {{#each this.cameraThumbnails as |thumbnail|}}\\n
\\n {{#if thumbnail.isSelected}}\\n \\n {{/if}}\\n\\n \\n \\n\\n {{#if (and thumbnail.toastMessage)}}\\n

{{thumbnail.toastMessage}}

\\n {{/if}}\\n \\n\\n
\\n {{else}}\\n
\\n
\\n \\n
\\n
\\n {{/each}}\\n
\\n\\n {{#if this.displayRuleTypeOptions}}\\n

\\n {{tc this \\'selectType\\'}}\\n \\n {{tc this \\'bestPracticesLink\\'}}\\n \\n

\\n\\n
\\n {{#each this.ruleTypeOptions as |ruleTypeOption|}}\\n \\n {{#if ruleTypeOption.isSelected}}\\n \\n {{/if}}\\n
\\n {{tc\\n
\\n
\\n
\\n
{{t (concat \\'generic.video.\\' ruleTypeOption.ruleType)}}
\\n {{#if ruleTypeOption.isRecommended}}\\n {{t \\'generic.recommended\\'}}\\n {{/if}}\\n
\\n

{{tc this ruleTypeOption.description}}

\\n
\\n
\\n {{/each}}\\n
\\n {{/if}}\\n\",{ moduleName: \"customer-site/components/video/rules/select-camera-rule/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { tracked } from '@glimmer/tracking';\nimport { getObjProperties } from '@adc/ember-utils/utils/ember-helpers';\nimport { isDestroyed } from '@adc/ember-utils/utils/ember-helpers';\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/no-classic-components\nimport Component from '@ember/component';\nimport EmberObject, { action, computed, get, getProperties, set } from '@ember/object';\nimport { alias, equal, gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { isPresent, isEmpty } from '@ember/utils';\nimport AnalyticsBestPractices from 'customer-site/components/modals/video/analytics-best-practices/index';\nimport { AnalyticsRulesTypeNotSureHelperViewed } from 'customer-site/enums/TrackedEvent';\nimport { logEventIfHasNoOvRules } from 'customer-site/utils/video/rules-stats';\nimport { navigateToCalibrationPageFlow } from 'customer-site/video/cameras/camera/controller';\nimport { intlPath } from '@adc/i18n/path';\nimport { EmberOvReadyRuleDraw, EmberVideoRules } from '../../../../enums/CustomerPageUrl';\nimport { GroundZone } from '../../../../enums/OvlRuleType';\n\nimport './_style.scss';\n\nconst DESKTOP_THUMBNAIL_DIV_WIDTH_PIXELS = 384,\n THUMBNAIL_ASPECT_RATIO = 9 / 16;\n\n/**\n * @classdesc\n * Helper for displaying camera thumbnails.\n *\n * @class components.video.rules.SelectCameraRule.ThumbnailHelper\n * @extends Ember.Object\n */\nclass ThumbnailHelper extends EmberObject {\n /**\n * The `intl` service.\n *\n * @type {Ember.Service}\n */\n intl;\n\n /**\n * The camera.\n *\n * @type {models.video.BaseAnalyticsCamera}\n */\n camera;\n\n /**\n * Indicates this thumbnail is selected.\n *\n * @type {boolean}\n */\n isSelected = false;\n\n /**\n * Whether or not this component is being used in a business activity analytics context.\n * We have slightly different behaviors for BAA pages, so we need to track this.\n *\n * @type {boolean}\n */\n isBusinessActivityAnalytics = false;\n\n /**\n * The camera description.\n *\n * @type {string}\n */\n @alias('camera.description')\n description;\n\n /**\n * The error to display if the snapshot fails.\n *\n * @type {string}\n */\n @alias('camera.snapshot.error')\n error;\n\n /**\n * The URL to hit to display the camera snapshot thumbnail.\n *\n * @type {string}\n */\n @alias('camera.snapshot.url')\n imageSource;\n\n /**\n * Determines whether or not to enable the showEntireImage field of the StateImage component\n *\n * @type {boolean}\n */\n @alias('camera.shouldUseEntireImageForSnapshot')\n useEntireImage;\n\n /**\n * A camera specific state based toast message.\n *\n * @type {String}\n */\n @computed(\n 'intl',\n 'camera.{failedToCommunicateWithOvProxy,hasMaxRules,isCalibrationRequired,maxNumberOfOvRules,inCriticalDataMode}',\n 'isBusinessActivityAnalytics'\n )\n get toastMessage() {\n const {\n failedToCommunicateWithOvProxy,\n hasMaxRules,\n isCalibrationRequired,\n maxNumberOfOvRules,\n inCriticalDataMode\n } = this.camera;\n\n let maxRulesText = maxNumberOfOvRules === 1 ? 'maximumNumberOfRulesOnlyOne' : 'maximumNumberOfRules';\n\n if (this.isBusinessActivityAnalytics) {\n maxRulesText = 'maximumNumberOfRulesBAA';\n }\n\n const [key] = [\n // Give a toast if the camera needs to be calibrated and is in critical data mode.\n [isCalibrationRequired && inCriticalDataMode, 'calibrationRequiredNoLink'],\n\n // Give a toast if the camera needs to be calibrated.\n [isCalibrationRequired && !inCriticalDataMode, 'calibrationRequired'],\n\n // Give a toast if there are max rules on a camera.\n [hasMaxRules, maxRulesText],\n\n // Give a toast if the camera can't communicate with it's OV proxy.\n [failedToCommunicateWithOvProxy, 'failedToCommunicateWithOvProxy']\n ]\n .map(([flag, key]) => (flag ? key : undefined))\n .compact();\n\n return key ? this.intl.t(`components.video.rules.select-camera-rule.${key}`) : '';\n }\n}\n\n/**\n * Will select the target thumbnail and update the component from passing in a camera.\n *\n * @param {Object} thumbnailToSelect\n * @param {Array} thumbnails\n * @param {Object} camera\n *\n */\nasync function selectThumbnail(thumbnailToSelect, thumbnails, camera) {\n // De-select each thumbnail.\n thumbnails.setEach('isSelected', false);\n\n // Only select the thumbnail if the camera is prepped correctly.\n if (camera.cannotSetupRule(this.isBusinessActivityAnalytics)) {\n return;\n }\n\n // Then select the target thumbnail.\n set(thumbnailToSelect, 'isSelected', true);\n\n // Update component with selected thumbnail's associated camera.\n if (!isDestroyed(this.rule.camera)) {\n set(this, 'rule.camera', camera);\n\n const { canPlaySound, supportedPerimeterGuardAudioOptions, supportsLurkerDetection } = camera,\n perimeterGuardConfig = await this.rule.perimeterGuardConfig;\n\n if (\n perimeterGuardConfig &&\n canPlaySound &&\n supportedPerimeterGuardAudioOptions &&\n supportedPerimeterGuardAudioOptions.length &&\n supportsLurkerDetection\n ) {\n set(this, 'rule.perimeterGuardConfig.audioOption', supportedPerimeterGuardAudioOptions[0]);\n }\n }\n}\n\n/**\n * Will select a thumbnail from passing in a thumbnail object and the array of thumbnails.\n *\n * @param {Object} thumbnailToSelect\n * @param {Array} thumbnails\n *\n */\nfunction getCameraForSelectThumbnail(thumbnailToSelect, thumbnails) {\n const camera = get(thumbnailToSelect, 'camera');\n\n this.analyticsFirmwareManager.launchOvFirmwareUpgradeModalIfNecessary(\n camera,\n () => {\n // Update thumbnail we want to select.\n set(thumbnailToSelect, 'camera', camera);\n\n // Attempt to select thumbnail.\n return selectThumbnail.call(this, thumbnailToSelect, thumbnails, camera);\n },\n undefined,\n async () => {\n // Preselect camera if isn't an OV ready camera or the OV package is already installed.\n await selectThumbnail.call(this, thumbnailToSelect, thumbnails, camera);\n }\n );\n}\n\n/**\n * Will select a thumbnail from passing in a deviceId and the array of thumbnails.\n *\n * @param {String} deviceId\n * @param {Array} thumbnails\n */\nfunction selectThumbnailByDeviceId(deviceId, thumbnails) {\n // If there are no thumbnails, then there is nothing to select.\n if (!isPresent(thumbnails)) {\n return;\n }\n\n // Get the thumbnail with the given device ID.\n const thumbnail = thumbnails.findBy('camera.id', deviceId);\n\n // If no matching thumbnail is found.\n if (!thumbnail) {\n // Then notify the customer.\n this.notificationManager.addError(\n this.intl.tc(this, 'deviceNotFound', {\n deviceId\n })\n );\n return;\n }\n\n // Mark matching thumbnail as selected.\n getCameraForSelectThumbnail.call(this, thumbnail, thumbnails);\n}\n\n/**\n * Will select a rule type from passing in a type and array of types.\n *\n * @param {String} ruleType\n * @param {Array} ruleTypeOptions\n */\nfunction selectTypeCard(ruleType, ruleTypeOptions) {\n if (ruleType < 0 || !ruleTypeOptions) {\n return;\n }\n\n // Keep track if we found a rule type match.\n let foundMatch = false;\n\n // For each given rule type option.\n ruleTypeOptions.forEach((ruleTypeOption) => {\n // Check if the the rule's type matches selected rule type.\n const isMatch = ruleTypeOption.value === ruleType;\n\n // Update selection status of rule type object.\n set(ruleTypeOption, 'isSelected', isMatch);\n\n // Keep track of which rule type is selected and we've matched or not.\n if (!foundMatch && isMatch) {\n // If rule type has been changed, clear rule points.\n if (ruleType != this.rule.ruleType && this.rule.hasDirtyAttributes) {\n this.set('rule.points', []);\n }\n\n // Update component if a rule type was matched.\n set(this, 'rule.ruleType', ruleTypeOption.value);\n foundMatch = true;\n }\n });\n}\n\n/**\n * Will de-select all the rule types after a camera is selected.\n *\n * @param {Array} ruleTypeOptions\n */\nfunction deSelectAllRuleTypeCards(ruleTypeOptions) {\n // Need to check to avoid an error during this use case:\n // Select camera without OV => Install OV => Install completes => Rule type options render\n if (!ruleTypeOptions) {\n return;\n }\n\n ruleTypeOptions.forEach((ruleTypeOption) => {\n set(ruleTypeOption, 'isSelected', false);\n });\n}\n\n/**\n * Validates rule type.\n *\n * @param ruleType\n * @return {boolean}\n */\nfunction isValidRuleType(ruleType) {\n return !isEmpty(ruleType) && ruleType !== -1;\n}\n\n/**\n * Generate URL for the given rule type's GIF.\n *\n * @param ruleType\n * @return {string}\n */\nexport function createGifUrl(ruleType) {\n const { contextManager, gifResourcePath } = this,\n baseUrl = contextManager.getStaticResourcePath(gifResourcePath);\n\n return `${baseUrl}${ruleType}.gif`;\n}\n\n/**\n * Sets the thumbnailHeightStyle property based on the width of the thumbnail element and the 16:9 aspect ratio.\n *\n * @returns {Promise}\n */\nfunction setThumbnailHeight() {\n // Defaults the thumbnail height to be calculated based on the desktop height.\n let thumbnailHeight = DESKTOP_THUMBNAIL_DIV_WIDTH_PIXELS * THUMBNAIL_ASPECT_RATIO;\n\n // Get the width of the thumbnail element and calculate the height based on that.\n const thumbnailElement = document.querySelector('.thumbnail');\n if (thumbnailElement) {\n thumbnailHeight = thumbnailElement.clientWidth * THUMBNAIL_ASPECT_RATIO;\n }\n\n set(this, 'thumbnailHeightStyle', htmlSafe(`height: ${thumbnailHeight}px`));\n}\n\n/**\n * pre-selecting a camera if we have a deviceId or the user only has one camera.\n * For the one camera case: it will only be pre-selected if it has an analytics package installed and rule space available.\n */\nfunction preselectCamera() {\n const [deviceId, thumbnails] = getObjProperties(this, 'rule.camera.id', 'cameraThumbnails');\n\n // Confirm we do have thumbnails (and therefore cameras).\n if (!thumbnails) {\n return;\n }\n\n const numberOfCamerasWithMaxRules = thumbnails.filterBy('camera.hasMaxRules').length;\n\n if (deviceId) {\n // Preselect the camera thumbnail if we have a given camera id.\n selectThumbnailByDeviceId.call(this, deviceId, thumbnails);\n } else if (this.shouldPreSelectSingleCamera) {\n // Grab the only camera.\n const { id } = thumbnails[0].camera;\n selectThumbnailByDeviceId.call(this, id, thumbnails);\n }\n\n // Tell user to select a camera/type only if they have at least one camera without the maximum number of rules.\n set(this, 'allCamerasHaveMaxRules', thumbnails.length === numberOfCamerasWithMaxRules);\n}\n\n/**\n * If camera has the maximum number of analytics rules, redirect to the video schedules page.\n * If camera has a max of 1 OV rule, redirect to the edit rule page.\n * If camera has baa and is on desktop, don't redirect.\n *\n * @param {boolean} allowBaaToSelectCamera\n * @param {BaseAnalyticsCamera} camera\n */\nexport async function selectCameraAtMaxRules(allowBaaToSelectCamera, camera) {\n if (camera.hasMaxRules && !allowBaaToSelectCamera) {\n if (camera.maxNumberOfOvRules === 1) {\n const rules = await camera.ovRules;\n this.navigation.transitionToRouteId(EmberOvReadyRuleDraw, undefined, undefined, rules.firstObject.id);\n return;\n }\n\n this.navigation.transitionToRouteId(EmberVideoRules);\n return;\n }\n}\n\n/**\n * @classdesc\n * Select a camera and rule type.\n * We may want to consider abstracting this such that you pass in a list of cameras and a list of rules.\n */\n@intlPath({ path: 'video.rules.select-camera-rule' })\n// Do not copy this deprecated usage. If you see this, please fix it\n// eslint-disable-next-line ember/require-tagless-components\nexport default class SelectCameraRule extends Component {\n @service('video.analytics-firmware-manager') analyticsFirmwareManager;\n @service contextManager;\n @service navigation;\n @service notificationManager;\n @service intl;\n @service dom;\n @service media;\n @service modals;\n @service store;\n @service stats;\n\n /**\n * Optional parameter for whether or not error text should be centered.\n *\n * @type {boolean}\n */\n isErrorTextCentered = true;\n\n /**\n * The 'newCamera' query param gets passed from the post install flow.\n *\n * @type {string | undefined}\n */\n newCamera;\n\n /**\n * All current rule types to display on the rules page.\n * Must be an array of pairs. First item is resource path string and second item is the enum itself.\n *\n * @param {Array>}\n */\n @tracked ruleTypes = [];\n\n /**\n * Static resource path for rule type's GIFs.\n * @note This would be the part of the url after 'Resources/Protected/CustomerLibraryFiles/'.\n *\n * @param {String}\n */\n @tracked gifResourcePath = '';\n\n /**\n * Whether or not this component is being used in a business activity analytics context.\n * We have slightly different behaviors for BAA pages, so we need to track this.\n *\n * @type {boolean}\n */\n @tracked isBusinessActivityAnalytics = false;\n\n /**\n * Returns if account only has one camera\n *\n * @function\n * @returns {boolean}\n */\n @equal('cameras.length', 1)\n onlyHasOneCamera;\n\n /**\n * Checks if the length of ruleTypeOptions to decide if we want to display the options or not.\n * If there is only 1 supported rule, there is no point showing the options to the user.\n * For more than 1, we need to let them select the rule they want.\n */\n @gt('ruleTypeOptions.length', 1)\n displayRuleTypeOptions;\n\n /**\n * Creates a list of objects which contain a video device model with a respective flag which indicates if the camera is selected or not.\n *\n * @function\n * @returns {Array}\n */\n @computed('cameras.[]', 'isBusinessActivityAnalytics')\n get cameraThumbnails() {\n const { intl, cameras = [], isBusinessActivityAnalytics } = this;\n return cameras.map((camera) => ThumbnailHelper.create({ intl, camera, isBusinessActivityAnalytics }));\n }\n\n /**\n * Returns if we should preselect the only camera\n *\n * @function\n * @returns {boolean}\n */\n @computed('onlyHasOneCamera', 'cameraThumbnails')\n get shouldPreSelectSingleCamera() {\n if (!this.onlyHasOneCamera) {\n return false;\n }\n\n const { camera } = this.cameraThumbnails[0],\n { hasMaxRules, hasOvReadyPackageInstalled } = camera;\n\n // If this camera can have more rules installed and is ov ready, then preselect the camera.\n return !hasMaxRules && hasOvReadyPackageInstalled;\n }\n\n /**\n * Determines the message to be displayed in the header based on how many cameras are available to add rules\n *\n * @function\n * @returns {string}\n */\n @computed('shouldPreSelectSingleCamera')\n get selectCameraTypeMessage() {\n const message = this.shouldPreSelectSingleCamera ? 'selectTypeMessage' : 'selectCameraAndTypeMessage';\n return this.intl.tc(this, message);\n }\n\n /**\n * The text to display at the top of the page.\n *\n * @function\n * @returns {string}\n */\n @computed('cameraThumbnails', 'allCamerasHaveMaxRules', 'selectCameraTypeMessage', 'isBusinessActivityAnalytics')\n get headerText() {\n const { intl, cameraThumbnails, isBusinessActivityAnalytics, allCamerasHaveMaxRules, selectCameraTypeMessage } =\n this;\n\n // If the thumbnails haven't loaded yet, show a loading message.\n if (isEmpty(cameraThumbnails)) {\n return intl.tc(this, isBusinessActivityAnalytics ? 'loadingBaaCameras' : 'loadingCameras');\n }\n\n // For the Business Activity Analytics page, we show a slightly different display message.\n const camerasCountTranslationKey = isBusinessActivityAnalytics ? 'currentBaaCameras' : 'currentCameras',\n headerText = intl.tc(this, camerasCountTranslationKey, { camerasCount: cameraThumbnails.length });\n\n // On non-baa, we also show show a rule camera type message.\n if (!isBusinessActivityAnalytics && !allCamerasHaveMaxRules) {\n return headerText.concat(' ', selectCameraTypeMessage);\n }\n\n return headerText;\n }\n\n /**\n * Creates an array of objects that store all values necessary to display a rule type card.\n *
    \n *
  • Type: such as 'tripwire'
  • \n *
  • Description: such as 'tripwireDescription', used for localization
  • \n *
  • GifUrl: used to display an animation explaining the rule. Note: gif file name must be the same as the value used in ruleTypes.
  • \n *
\n *\n * @function\n * @returns {Array<{type: String, description: String, gifUrl: String, isSelected: boolean}>}\n */\n @computed(\n 'gifResourcePath',\n 'rule.camera.{isGroundZoneRecommended,supportedRuleTypes.[]}',\n 'rule.ruleType',\n 'ruleTypes.[]'\n )\n get ruleTypeOptions() {\n const { rule } = this;\n\n if (!rule) {\n return undefined;\n }\n\n const { camera, ruleType: selectedRuleType } = getProperties(rule, 'camera', 'ruleType'),\n { isGroundZoneRecommended, supportedRuleTypes } = getProperties(\n camera ?? {},\n 'isGroundZoneRecommended',\n 'supportedRuleTypes'\n );\n\n if (!supportedRuleTypes) {\n return undefined;\n }\n\n const ruleTypeOptionsArray = this.ruleTypes\n .filter((ovRule) => {\n return supportedRuleTypes.includes(ovRule[1]);\n })\n .map(([ruleType, value]) => {\n return {\n ruleType,\n description: `${ruleType}Description`,\n gifUrl: createGifUrl.call(this, ruleType),\n isSelected: value === selectedRuleType,\n isRecommended: value === GroundZone && isGroundZoneRecommended,\n value\n };\n });\n\n // If this camera only supports 1 rule type option, auto-select it.\n if (ruleTypeOptionsArray && ruleTypeOptionsArray.length === 1) {\n const ruleType = ruleTypeOptionsArray[0].value;\n if (isValidRuleType.call(this, ruleType)) {\n selectTypeCard.call(this, ruleType, ruleTypeOptionsArray);\n }\n }\n\n return ruleTypeOptionsArray;\n }\n\n /**\n * Preselect camera and rule type.\n *\n * @override\n */\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-hooks\n init() {\n super.init(...arguments);\n\n // Get selection info from the rule model.\n const [cameraId, thumbnails, ruleType, ruleTypeOptions] = getObjProperties(\n this,\n 'rule.camera.id',\n 'cameraThumbnails',\n 'rule.ruleType',\n 'ruleTypeOptions'\n );\n\n // Preselects the camera if we already have one.\n if (cameraId) {\n selectThumbnailByDeviceId.call(this, cameraId, thumbnails);\n }\n\n // Preselects the rule type if we already have one.\n if (isValidRuleType.call(this, ruleType)) {\n selectTypeCard.call(this, ruleType, ruleTypeOptions);\n }\n\n // Add a listener for resizing the thumbnail on window resize (for mobile/tablet view on desktop).\n this.dom.addListener(this, window, 'resize', setThumbnailHeight.bind(this));\n\n // If there's one camera, preselect it\n preselectCamera.call(this);\n }\n\n /**\n * Resize thumbnail size after inserting elements.\n */\n @action\n setInitialThumbnailHeight() {\n // Adjust initial thumbnail height to that of the actual device screen size as opposed to the presets (for mobile/tablet).\n setThumbnailHeight.call(this);\n }\n\n /**\n * Highlights the camera the user clicked.\n *\n * @param {Object} thumbnail\n */\n @action\n async selectCamera(thumbnail) {\n const { contextManager, newCamera } = this,\n { camera } = thumbnail,\n queryParams = {};\n\n if (camera.inCriticalDataMode) {\n return;\n }\n\n // If camera requires calibration, then redirect to the calibration set up route.\n if (camera.isCalibrationRequired) {\n // If the device is a new camera, then pass the new camera query param to the calibration page.\n // Which will allow it to redirect back to this page.\n if (newCamera) {\n queryParams.newCamera = newCamera;\n }\n\n navigateToCalibrationPageFlow(camera, contextManager, queryParams);\n return;\n }\n\n // We allow selecting BAA cameras that have already reached the max rule count on desktop-sized devices.\n const allowBaaToSelectCamera = this.isBusinessActivityAnalytics && !this.media.isMobile;\n\n // If at max rules, transition to the correct page.\n await selectCameraAtMaxRules.call(this, allowBaaToSelectCamera, camera);\n\n // If the camera failed to communicate with OV proxy, then reload the specific camera so we get fresh set of data.\n if (camera.failedToCommunicateWithOvProxy) {\n camera.reload();\n return;\n }\n\n // Else wise highlight the selected camera thumbnail.\n getCameraForSelectThumbnail.call(this, thumbnail, this.cameraThumbnails);\n\n // De-select all rule types because it is not guaranteed two cameras share the same ones\n deSelectAllRuleTypeCards.call(this, this.ruleTypeOptions);\n\n // If an action to sync query params was passed in, then run it.\n this.syncQueryParams?.();\n }\n\n /**\n * Highlights the rule type the user clicked.\n */\n @action\n selectType(ruleType) {\n selectTypeCard.call(this, ruleType, this.ruleTypeOptions);\n\n // If an action to sync query params was passed in, then run it.\n this.syncQueryParams?.();\n }\n\n /**\n * Fired when the best practices link is clicked.\n */\n @action\n showAnalyticsBestPracticesModal() {\n const { store, stats, modals } = this;\n logEventIfHasNoOvRules(store, stats, AnalyticsRulesTypeNotSureHelperViewed);\n modals.showModal(AnalyticsBestPractices);\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{tc this \\'header\\'}}

\\n\\n

{{tc this (if this.hasExistingRules \\'instructionForCameraWithRules\\' \\'instructionForCameraWithNoRules\\')}}

\\n\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n {{#each this.circles as |circle|}}\\n {{#if circle.isVisible}}\\n
\\n {{circle.altText}}/\\n
\\n \\n
\\n
\\n {{/if}}\\n {{/each}}\\n
\\n
\\n\\n
\\n {{#if @ovReadyCamera.canChangeScenery}}\\n
\\n \\n\\n \\n
\\n {{/if}}\\n\\n {{#if @ovReadyCamera.supportsDynamicMinObjectSize}}\\n
\\n
\\n

{{tc this \\'minimumObjectDetectionSize\\'}}

\\n \\n
\\n\\n {{! This will be the reverse of the actual values the cameras support. This is so that it\\'s more intuitive for the user to understand what the slider is doing.}}\\n \\n\\n
\\n {{tc this \\'detectionSensitivityDescription\\'}}\\n
\\n
\\n {{/if}}\\n
\\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/camera-analytics/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { computed, action } from '@ember/object';\nimport { and, gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { dasherize } from '@ember/string';\nimport { htmlSafe } from '@ember/template';\nimport { intlPath } from '@adc/i18n/path';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { SafeString } from 'handlebars';\n\n// region Constants\n/**\n * The aspect ratio (width divided by height) of the video stream image.\n * (This page assumes a 16/9 video aspect ratio. Should revisit this to have it support other aspect ratios in the future)\n */\nconst STREAM_ASPECT_RATIO = 16 / 9;\n\n/**\n * Possible maximum slider values for the minimum object detection slider.\n * This specific value will depend on the package installed and is stored in the OvReadyCamera model.\n */\nconst OLD_MAX_SLIDER_VALUE = 7;\n\n/**\n * Suggested slider value.\n */\nconst SUGGESTED_SLIDER_VALUE = 4;\n\nenum CircleSize {\n VerySmall,\n Suggested,\n Medium,\n Large,\n VeryLarge\n}\n\n// endregion\n\n// region interfaces\n/**\n * Arguments for the CameraAnalytics component\n */\ninterface CameraAnalyticsSignature {\n Args: {\n ovReadyCamera: OvReadyCamera;\n };\n}\n\n/**\n * Represents the display settings for the sizing circles.\n */\ninterface CircleVisibilities {\n displayVeryLargeCircle: boolean;\n displayLargeCircle: boolean;\n displayMediumCircle: boolean;\n displaySuggestedCircle: boolean;\n displayVerySmallCircle: boolean;\n}\n\n/**\n * Configuration for a sizing circle displayed on the camera preview.\n */\ninterface SizeCircleDisplay {\n isVisible: boolean;\n divClass: string;\n text: string;\n altText: string;\n}\n\n// endregion\n\n// region Private Functions\n\n/**\n * Update slider properties to re-render the value and slider percentage.\n */\nfunction updateSlider(\n this: CameraAnalytics,\n isSavingOrLoadingCamera: boolean,\n currentSliderValue: number,\n maxSliderValue: number\n): void {\n this.isSavingOrLoadingCamera = isSavingOrLoadingCamera;\n this.currentSliderValue = currentSliderValue;\n this.maxSliderValue = maxSliderValue;\n this.defaultSliderPosition = reverseSliderValue(SUGGESTED_SLIDER_VALUE, maxSliderValue);\n}\n\n/**\n * Sets the size of the preview/circles div based on the size of its container div.\n */\nfunction setPreviewAndCirclesSizing(this: CameraAnalytics): void {\n const mainDiv = document.getElementsByClassName('thumbnail-with-circle-visuals')[0];\n\n if (!mainDiv) {\n return;\n }\n\n const previewAndCirclesWidth = mainDiv.clientWidth,\n previewAndCirclesHeight = previewAndCirclesWidth / STREAM_ASPECT_RATIO;\n\n this.previewAndCirclesSizeStyle = htmlSafe(\n `width:${previewAndCirclesWidth}px;height:${previewAndCirclesHeight}px;`\n );\n this.previewAndCirclesSizeHeight = htmlSafe(`height:${previewAndCirclesHeight}px;`);\n}\n\n/**\n * Should we display the given circle based on given info?\n *\n * @param circleSize Size of circle to validate. Required parameter.\n * @param currentSliderValue Current value of slider (during slide or after slide is completed). Require for some circle sizes.\n */\nfunction shouldDisplayCircle(this: CameraAnalytics, circleSize: CircleSize, currentSliderValue = 0): boolean {\n // If user has opted out of viewing the circles, then don't display any circle at all.\n if (!this.areCirclesVisible) {\n return false;\n }\n\n // Very small and suggested are based on current slider value. Always display very large.\n switch (circleSize) {\n case CircleSize.VerySmall:\n return currentSliderValue === this.maxSliderValue;\n case CircleSize.Suggested:\n return currentSliderValue >= this.defaultSliderPosition;\n case CircleSize.Medium:\n case CircleSize.Large: {\n // If it's a medium or large circle size, then display based on current slider value and max slider value.\n // This should cause medium to go to 5 or 7 and large to go to 6 or 9 based on what the current max value is.\n const size = circleSize === CircleSize.Large ? 0.85 : 0.65,\n cap = Math.round(this.maxSliderValue * size);\n\n // Reverse the value back to normal when doing the comparison.\n return currentSliderValue >= reverseSliderValue(cap, this.maxSliderValue);\n }\n case CircleSize.VeryLarge:\n return true;\n default:\n console.warn(`Cannot display circle type of: ${circleSize}`);\n return false;\n }\n}\n\n/**\n * Update the visibilities of all size circles depending on changed properties.\n */\nfunction updateCircleVisibilities(this: CameraAnalytics, currentSliderValue: number): CircleVisibilities {\n return {\n displayVeryLargeCircle: shouldDisplayCircle.call(this, CircleSize.VeryLarge),\n displayLargeCircle: shouldDisplayCircle.call(this, CircleSize.Large, currentSliderValue),\n displayMediumCircle: shouldDisplayCircle.call(this, CircleSize.Medium, currentSliderValue),\n displaySuggestedCircle: shouldDisplayCircle.call(this, CircleSize.Suggested, currentSliderValue),\n displayVerySmallCircle: shouldDisplayCircle.call(this, CircleSize.VerySmall, currentSliderValue)\n };\n}\n\n/**\n * Reverse the slider's value by taking difference of max value and current value.\n *\n * @note This can be used to transform to and from the slider value since it's logically the same.\n * @note We reverse the values of the slider so that it transitions from only Very Large circle to all circles. This is more intuitive for the user.\n */\nfunction reverseSliderValue(currentValue: number, maxValue: number): number {\n return maxValue - currentValue;\n}\n\n/**\n * Update the slider constraints and value from the component's OvReadyCamera\n */\nfunction updateSliderFromCamera(this: CameraAnalytics) {\n const { minimumObjectDetectionSize, minimumObjectSizeSliderMaxValue } = this.args.ovReadyCamera;\n updateSlider.call(\n this,\n false,\n reverseSliderValue(minimumObjectDetectionSize, minimumObjectSizeSliderMaxValue),\n minimumObjectSizeSliderMaxValue\n );\n}\n\n// endregion\n\nconst defaultSliderPosition = reverseSliderValue(SUGGESTED_SLIDER_VALUE, OLD_MAX_SLIDER_VALUE);\n\n/**\n * @classdesc\n *\n * Component that contains all OV analytic camera settings.\n */\n@intlPath({ path: 'video/settings/camera-analytics' })\nexport default class CameraAnalytics extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n /**\n * Is camera being saved or loaded?\n */\n @tracked isSavingOrLoadingCamera = true;\n\n /**\n * Value for the default slider position.\n */\n @tracked defaultSliderPosition = defaultSliderPosition;\n\n /**\n * The current value for the minimum object detection size slider.\n */\n @tracked currentSliderValue = defaultSliderPosition;\n\n /**\n * What is the maximum value of this slider? This value depends on the OvReady package installed.\n */\n @tracked maxSliderValue = OLD_MAX_SLIDER_VALUE;\n\n /**\n * Does the user want to view circles on top of the thumbnail?\n * The user can toggle this by clicking the eye icon next to the minimum object detection size slider.\n */\n @tracked circleVisibilitySelected = true;\n\n /**\n * Indicates the image clip image has loaded.\n */\n @tracked imageLoaded = false;\n\n /**\n * CSS style string for device preview and detection size circles.\n */\n @tracked declare previewAndCirclesSizeStyle: SafeString;\n\n /**\n * Style string for preview and circles area.\n */\n @tracked declare previewAndCirclesSizeHeight: SafeString;\n\n /**\n * Tracks the visibility of the object detection circles of various sizes.\n */\n @tracked circleVisibilities = updateCircleVisibilities.call(this, defaultSliderPosition);\n\n /**\n * Can the user actually view circles on top of the thumbnail?\n * We check that the user wants to view them and that the thumbnail has been successfully loaded.\n */\n @and('circleVisibilitySelected', 'imageLoaded', 'args.ovReadyCamera.supportsDynamicMinObjectSize')\n declare areCirclesVisible: boolean;\n\n /**\n * Properties for each circle used to add them to the template.\n */\n @computed('circleVisibilities')\n get circles(): SizeCircleDisplay[] {\n const { intl, circleVisibilities } = this,\n fnGetSize = (isVisible: boolean, type: string, text = intl.tc(this, type)): SizeCircleDisplay => ({\n isVisible,\n divClass: dasherize(`${type}Circle`),\n text,\n altText: intl.tc(this, `${type}AltText`)\n });\n\n return [\n fnGetSize(circleVisibilities.displayVeryLargeCircle, 'veryLarge'),\n fnGetSize(circleVisibilities.displayLargeCircle, 'large'),\n fnGetSize(circleVisibilities.displayMediumCircle, 'medium'),\n fnGetSize(circleVisibilities.displaySuggestedCircle, 'suggested', intl.t('generic.suggested')),\n fnGetSize(circleVisibilities.displayVerySmallCircle, 'verySmall')\n ];\n }\n\n /**\n * Returns properties for button list options.\n */\n @computed('args.ovReadyCamera.isIndoorScene')\n get options(): BinaryListItem[] {\n return ['indoor', 'outdoor'].map(\n (key, idx) =>\n new BinaryListItem({\n label: this.intl.tc(this, key),\n // We must do an equal check to true/false since isIndoor is a nullable boolean.\n state: this.args.ovReadyCamera.isIndoorScene === !idx,\n props: {\n id: idx + 1\n }\n })\n );\n }\n\n /**\n * Does this camera have any OV rules that are already saved to the system?\n */\n @gt('args.ovReadyCamera.numberOfSavedRules', 0)\n declare hasExistingRules: boolean;\n\n /**\n * Set the styling strings for the preview and circle areas.\n */\n @action setPreviewAndCircleSizing(): void {\n setPreviewAndCirclesSizing.call(this);\n }\n\n /**\n * Update slider once the camera is loaded.\n */\n @action onCameraChange(): void {\n updateSliderFromCamera.call(this);\n }\n\n /**\n * Update the circle visibilities based on the current slider value\n */\n @action setCircleVisibilities(): void {\n this.circleVisibilities = updateCircleVisibilities.call(this, this.currentSliderValue);\n }\n\n /**\n * Sets local flag to keep track of user's option between indoor and outdoor scene.\n */\n @action selectOption(options: BinaryListItem[]): void {\n // The first value should be indoors.\n const newIsIndoor = options[0].state as boolean,\n { ovReadyCamera } = this.args,\n oldIsIndoorScene = ovReadyCamera.isIndoorScene;\n // Check there is an actual change made to the camera.\n if (oldIsIndoorScene !== newIsIndoor) {\n // Update the flag in the camera.\n ovReadyCamera.set('isIndoorScene', newIsIndoor);\n }\n }\n\n /**\n * Action for toggling the visibility of the size-comparison circles on the thumbnail.\n *\n * @param circleVisibilitySelected\n */\n @action toggleVisibility(circleVisibilitySelected: boolean): void {\n this.circleVisibilitySelected = circleVisibilitySelected;\n }\n\n /**\n * Update help text as slide occurs, but only save to camera once the sliding is done.\n *\n * @param {number} newSize What's the new size value the user just slided to. This will be reverse of what actually goes in the camera.\n * @param {boolean} isFromSlider Is the new value from the slider?\n * @param {boolean} isMouseUp Has the mouse up event occurred as if the user is satisfied with their slide selection?\n */\n @action updateSlider(newSize: number, isFromSlider: boolean, isMouseUp: boolean): void {\n // If the slider is sliding, then update the circles.\n if (isFromSlider) {\n this.circleVisibilities = updateCircleVisibilities.call(this, newSize);\n }\n\n // If the mouse isn't done sliding from the slider, then don't update the camera yet.\n if (!isFromSlider || !isMouseUp) {\n return;\n }\n\n const { minimumObjectSizeSliderMaxValue } = this.args.ovReadyCamera;\n\n updateSlider.call(this, false, newSize, minimumObjectSizeSliderMaxValue);\n\n // We want to store the normal value of the slider's reversed value.\n this.args.ovReadyCamera.set(\n 'minimumObjectDetectionSize',\n reverseSliderValue(newSize, minimumObjectSizeSliderMaxValue)\n );\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::CameraAnalytics': typeof CameraAnalytics;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.didDeviceImageFailToLoad}}\\n \\n {{else}}\\n \\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/settings/device-image-container/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\ninterface DeviceImageContainerSignature {\n Element: HTMLDivElement;\n Args: {\n deviceImagePath: string;\n description: string;\n };\n}\n@intlPath({ path: 'video/settings/device-image-container' })\nexport default class DeviceImageContainer extends Component {\n /**\n * Did the device image fail to load? If so, display a video camera svg.\n */\n @tracked didDeviceImageFailToLoad = false;\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::DeviceImageContainer': typeof DeviceImageContainer;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if @isLoading}}\\n \\n{{else}}\\n
\\n \\n

{{this.deviceStatusItem.status}}

\\n

{{this.deviceStatusItemSubtext}}

\\n
\\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/device-status-info-item/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport DeviceConnectionStatusEnum from 'customer-site/enums/DeviceConnectionStatusEnum';\nimport { convertDateToString } from 'customer-site/utils/datetime';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type DeviceStatusInfo from 'customer-site/models/video/settings/device-status-info';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface DeviceStatusInfoItemSignature {\n Args: {\n deviceStatusInfoModel?: DeviceStatusInfo;\n isLoading: boolean;\n };\n}\n\n/**\n * Custom model type for the device status information item.\n * @param icon - The icon to display.\n * @param iconCss - The CSS class to apply to the icon.\n * @param iconTitle - The title of the icon.\n * @param status - The status of the device, Connected, Disconnected, or Unknown.\n */\ntype DeviceStatusItem = {\n icon: string;\n iconCss: string;\n status: string;\n};\n\n/**\n * Component for displaying the device status information.\n */\nexport default class DeviceStatusInfoItem extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n /**\n * The subtext for the device status item. Either Unknown, Request Failed, or the last updated date.\n */\n get deviceStatusItemSubtext(): string {\n const { intl, args } = this,\n { deviceStatusInfoModel } = args,\n { lastUpdatedDate, connectionStatus } = deviceStatusInfoModel || {};\n\n if (!deviceStatusInfoModel || !lastUpdatedDate) {\n return intl.t('generic.unknown');\n }\n\n return connectionStatus === DeviceConnectionStatusEnum.Unknown\n ? intl.t('generic.requestFailedPleaseTryAgain')\n : convertDateToString(intl, lastUpdatedDate, true);\n }\n\n /**\n * Get the device status item.\n */\n get deviceStatusItem(): DeviceStatusItem {\n const { intl, args } = this,\n { deviceStatusInfoModel } = args;\n const item: DeviceStatusItem = {\n icon: 'issue',\n iconCss: 'unknown',\n status: intl.t('generic.devices.deviceStatus')\n };\n\n if (!deviceStatusInfoModel) {\n return item;\n }\n const { connectionStatus } = deviceStatusInfoModel,\n iconInfo = this.getDeviceStatusIconInfo(connectionStatus);\n\n return {\n icon: iconInfo.icon,\n iconCss: iconInfo.iconType,\n status: intl.t(iconInfo.statusString)\n };\n }\n\n /**\n * Get the icon info for the device status.\n */\n private getDeviceStatusIconInfo(connectionStatus: DeviceConnectionStatusEnum): {\n icon: string;\n iconType: string;\n statusString: string;\n } {\n switch (connectionStatus) {\n case DeviceConnectionStatusEnum.Connected:\n return { icon: 'circle-check', iconType: 'connected', statusString: 'generic.online' };\n case DeviceConnectionStatusEnum.Disconnected:\n return { icon: 'circle-close-o', iconType: 'disconnected', statusString: 'generic.offline' };\n default:\n return { icon: 'issue', iconType: 'unknown', statusString: 'generic.unknown' };\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::DeviceStatusInfoItem': typeof DeviceStatusInfoItem;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{this.cameraAccessInstruction}}

\\n
\\n

{{t \\'generic.devices.cameras\\'}}

\\n
\\n {{#each @cameraProperties as |properties|}}\\n \\n {{/each}}\\n
\\n
\\n \\n
\\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/camera-access/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberVideoFamiliarFaces,\n EmberVideoFamiliarVehicles,\n VideoCameraSettingsOverview\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle, Face } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type { NativeButton } from '@adc/app-infrastructure/services/native-bridge';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type FamiliarSubjectCameraContext from 'customer-site/models/video/familiar-targets/familiar-subject-camera-context';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { FamiliarSubjectCameraAccessRouteModel } from 'customer-site/video/settings/familiar-subject/camera-access-base-route';\n\ntype NativeButtonType = Omit & {\n componentId: string;\n type: NativeButton['type'] | '';\n};\ninterface CameraAccessSignature {\n Args: {\n /** The familiar Subject Camera Access Route Model */\n model: FamiliarSubjectCameraAccessRouteModel;\n cameraProperties: FamiliarSubjectCameraContext[];\n disposeNativeButtons: () => void;\n updateNativeToolbarButtons: (buttons: NativeButtonType[]) => void;\n };\n}\n\n/**\n * Save only the FamiliarSubjectCameraContext models from the given list that have dirty attributes\n * @param cameraProperties\n */\nfunction savePropertiesWithChanges(\n cameraProperties: FamiliarSubjectCameraContext[]\n): Promise {\n return Promise.all(cameraProperties.filterBy('hasDirtyAttributes').invoke('save'));\n}\n\n/**\n * Component for displaying which cameras have access to familiar subject features\n */\n@intlPath({ path: 'video/settings/familiar-targets/camera-access' })\nexport default class CameraAccess extends Component {\n @service declare intl: ADCIntlService;\n @service declare modals: ModalsService;\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n\n /**\n * Is the enrollment type familiar face?\n */\n get isFamiliarFace(): boolean {\n return this.args.model.subjectEnrollment?.familiarObjectType === Face;\n }\n\n /**\n * Get the camera access instructions based on the familiar object type\n */\n get cameraAccessInstruction(): string {\n return this.isFamiliarFace\n ? this.intl.tc(this, 'cameraAccessInstructionForFamiliarFace')\n : this.intl.tc(this, 'cameraAccessInstruction');\n }\n\n /**\n * Attempt to save the Familiar Subject opt-in status for any of the updated cameras\n */\n @action async saveCameras(): Promise {\n const { contextManager, intl, modals, notificationManager } = this,\n cameraProperties = (this.args.model as FamiliarSubjectCameraAccessRouteModel).cameraProperties;\n\n // If no cameras are opted in, show an info modal and return\n if (this.isFamiliarFace) {\n if (!cameraProperties.some((cameraProp) => cameraProp.isFaceOptedIn)) {\n modals.showInfoModal({\n css: 'camera-selection-modal',\n title: intl.tc(this, 'cameraSelectionModalTitle'),\n info: intl.tc(this, 'cameraSelectionModalInfo')\n });\n return false;\n }\n } else {\n // If no cameras are opted in, show an info modal and return\n if (!cameraProperties.some((cameraProp) => cameraProp.isVehicleOptedIn)) {\n modals.showInfoModal({\n css: 'camera-selection-modal',\n title: intl.tc(this, 'cameraSelectionModalTitle'),\n info: intl.tc(this, 'cameraSelectionModalInfo')\n });\n return false;\n }\n }\n\n try {\n await savePropertiesWithChanges(cameraProperties);\n notificationManager.addSuccess(intl.tc(this, 'cameraSelectionSuccessMessage'));\n\n contextManager.clearVisitedRoutesStack();\n const routeEnum =\n this.args.model.subjectEnrollment?.familiarObjectType === Vehicle\n ? EmberVideoFamiliarVehicles\n : EmberVideoFamiliarFaces;\n this.navigation.transitionToRouteId(routeEnum);\n\n if (!contextManager.isMobileApp) {\n // Adding VideoMainSettings to the stack so the back button leads to this one\n // Mobile will redirect to MobileVideoSettings\n contextManager.addRouteToVisitedRoutesStack(VideoCameraSettingsOverview);\n }\n } catch (ex) {\n return false;\n }\n\n return true;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::CameraAccess': typeof CameraAccess;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/expand-photo-button/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface ExpandPhotoButtonSignature {\n Args: {\n buttonAction: () => void;\n };\n}\n\nconst ExpandPhotoButton = templateOnlyComponent();\nexport default ExpandPhotoButton;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::ExpandPhotoButton': typeof ExpandPhotoButton;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.isFamiliarVehicle}}\\n
\\n

{{tc this \\'familiarVehicleHeader\\'}}

\\n
\\n \\n

{{tc this \\'familiarVehicleExplanations.explanationMain\\'}}

\\n
    \\n
  • {{tc this \\'familiarVehicleExplanations.notifications\\'}}
  • \\n
  • {{tc this \\'familiarVehicleExplanations.savedClips\\'}}
  • \\n
\\n

{{tc this \\'performance.header\\'}}

\\n
    \\n
  • {{tc this \\'performance.distance\\'}}
  • \\n
  • {{tc this \\'performance.numberOfVehicles\\'}}
  • \\n
\\n

{{tc this \\'setupInstruction.header\\'}}

\\n
    \\n
  1. {{tc this \\'setupInstruction.cameras\\'}}
  2. \\n
  3. {{tc this \\'setupInstruction.clips\\'}}
  4. \\n
  5. {{tc this \\'setupInstruction.recognize\\'}}
  6. \\n
  7. {{tc this \\'setupInstruction.name\\'}}
  8. \\n
\\n

{{tc this \\'managingVehicles.header\\'}}

\\n
    \\n
  1. {{tc this \\'managingVehicles.quality\\'}}
  2. \\n
  3. {{tc this \\'managingVehicles.timeOfDay\\'}}
  4. \\n
  5. {{tc this \\'managingVehicles.feedback\\'}}
  6. \\n
  7. {{tc this \\'managingVehicles.review\\'}}
  8. \\n
\\n

{{tc this \\'limitations.header\\'}}

\\n
    \\n
  1. {{tc this \\'limitations.obstruction\\'}}
  2. \\n
  3. {{tc this \\'limitations.modelColor\\'}}
  4. \\n
  5. {{tc this \\'limitations.lighting\\'}}
  6. \\n
  7. {{tc this \\'limitations.analytics\\'}}
  8. \\n
  9. {{tc this \\'limitations.distance\\'}}
  10. \\n
  11. {{tc this \\'limitations.thumbnails\\'}}
  12. \\n
\\n

{{tc this \\'familiarVehicleLegal.header\\'}}

\\n

{{tc this \\'familiarVehicleLegal.info\\'}}

\\n {{#if @shouldShowLegal}}\\n

{{tc this \\'familiarVehicleLegal.acknowledgement\\'}}

\\n {{/if}}\\n {{else}}\\n \\n {{!-- template-lint-disable no-bare-strings --}}\\n

Familiar Face

\\n
\\n {{!-- template-lint-disable no-bare-strings --}}\\n

Familiar Faces will allow you to enroll familiar persons and receive notifications when they are at your doorbell. Press enable below to activate the feature on your account.

\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/faq-terms/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\nexport interface FAQTermsSignature {\n Args: {\n familiarObjectType: number;\n shouldShowLegal?: boolean;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for displaying frequently asked questions and legal terms for the Familiar Vehicle feature\n */\n@intlPath({ path: 'video/settings/familiar-targets/faq-terms' })\nexport default class FaqTerms extends Component {\n /**\n * Does the current feedback event have a Familiar Target classification\n */\n get isFamiliarVehicle(): boolean {\n const currentObjectType = this.args.familiarObjectType;\n return currentObjectType === Vehicle;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::FaqTerms': typeof FaqTerms;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n\\n \\n\\n \\n
\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/feature-management/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberHome } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type { ActionButtonsSignature } from '@adc/ui-components/components/action-buttons';\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\n\n/**\n * Delete the Familiar Target Enrollment and transition out of the familiar-subject flow\n */\nasync function deleteEnrollment(this: FeatureManagement, enrollment: FamiliarTargetEnrollment): Promise {\n const { contextManager, intl, navigation } = this;\n\n try {\n await enrollment.destroyRecord();\n\n // Unload the opt-in status for all of the cameras so the user will need to re-select if they re-enroll before refreshing\n this.store.unloadAll('video/familiar-targets/familiar-subject-camera-context');\n } catch (error) {\n return;\n }\n\n this.notificationManager.addSuccess(\n this.isVehicleEnrollment ? intl.tc(this, 'turnOffSuccessMessage') : intl.tc(this, 'face.turnOffSuccessMessage')\n );\n\n if (contextManager.isMobileApp) {\n contextManager.transitionBackToMobileApp();\n } else {\n // Clear the call stack so going \"back\" does not navigate back to a familiar-subject page\n contextManager.clearVisitedRoutesStack();\n navigation.transitionToRouteId(EmberHome);\n }\n}\n\n// The signature of the Feature Management component\nexport interface FeatureManagementSignature {\n Args: Pick & {\n enrollment: FamiliarTargetEnrollment;\n isEditDisabled: boolean;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for managing the familiar subject feature\n */\n@intlPath({ path: 'video/settings/familiar-targets/feature-management' })\nexport default class FeatureManagement extends Component {\n @service declare contextManager: ServiceRegistry['context-manager'];\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare navigation: ServiceRegistry['navigation'];\n @service declare notificationManager: ServiceRegistry['notification-manager'];\n @service declare modals: ServiceRegistry['modals'];\n @service declare store: ServiceRegistry['store'];\n\n /**\n * Is this enrollment a vehicle enrollment?\n */\n get isVehicleEnrollment(): boolean {\n return this.args.enrollment.familiarObjectType === Vehicle;\n }\n\n /**\n * Save any changes to enable or disable the enrollment.\n */\n @action async saveSelection(): Promise {\n const { contextManager, intl } = this,\n { enrollment } = this.args;\n\n // Don't do anything if the selection hasn't been changed\n if (!enrollment.hasDirtyAttributes) {\n this.contextManager.transitionToPreviousRoute();\n return true;\n }\n\n try {\n await enrollment.save();\n\n this.notificationManager.addSuccess(intl.t('generic.savedSuccessfully'));\n contextManager.transitionToPreviousRoute();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Show a confirmation modal warning that their familiar vehicle data will be deleted and that the action is permanent.\n */\n @action\n deleteEnrollment(): void {\n const { intl } = this;\n\n this.modals.showConfirmationDialog(\n intl.tc(this, 'turnOff'),\n this.isVehicleEnrollment\n ? intl.tc(this, 'turnOffConfirmDialogBody')\n : intl.tc(this, 'face.turnOffConfirmDialogBody'),\n {\n text: intl.tc(this, 'turnOffConfirmDialogButton'),\n action: () => deleteEnrollment.call(this, this.args.enrollment),\n css: 'btn-color-danger'\n },\n {\n text: intl.t('generic.cancel')\n },\n 'delete-enrollment-dialog'\n );\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::FeatureManagement': typeof FeatureManagement;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if @enrollment.incorrectImages.length}}\\n
\\n

{{tc this (concat this.resourcePrefix \\'incorrectPhotoInfo\\')}}

\\n

{{tc this (concat this.resourcePrefix \\'incorrectPhotoInfo2\\')}}

\\n
\\n \\n{{else}}\\n
\\n

{{tc this \\'noIncorrectPhotoHeader\\'}}

\\n

{{tc this (concat this.resourcePrefix \\'noIncorrectPhotoInfo\\')}}

\\n
\\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/incorrect-photos/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { FamiliarSubjectIncorrectPhotosRouteModel } from 'customer-site/video/settings/familiar-subject/incorrect-photos-base-route';\nimport './_style.scss';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\n\ninterface IncorrectPhotosComponentSignature {\n Args: {\n enrollment: FamiliarTargetEnrollment;\n model: FamiliarSubjectIncorrectPhotosRouteModel;\n };\n}\n\n/**\n * Component for classifying incorrect photos\n */\n@intlPath({ path: 'video/settings/familiar-targets/incorrect-photos' })\nexport default class IncorrectPhotos extends Component {\n /**\n * The prefix for the resource depending on the enrollment type\n */\n get resourcePrefix(): string {\n return this.args.enrollment.familiarObjectType === Vehicle ? 'vehicle.' : 'face.';\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::IncorrectPhotos': typeof IncorrectPhotos;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#each @buttons as |button|}}\\n \\n {{/each}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/navigation-button-list/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface NavigationButtonContent {\n mainText: string;\n infoText: string;\n routeId: number;\n queryParams?: Record;\n}\n\n/**\n * Create the content for a navigation button\n */\nexport function createNavButton(\n mainText: string,\n infoText: string,\n routeId: number,\n { shouldHide = false, queryParams = {} } = {}\n): NavigationButtonContent | undefined {\n return !shouldHide\n ? {\n mainText,\n infoText,\n routeId,\n queryParams\n }\n : undefined;\n}\n\ninterface NavigationButtonListArgs {\n buttons: (NavigationButtonContent | undefined)[];\n}\n\n/**\n * @classdesc\n *\n * Represents a list of navigation buttons for Familiar Subjects\n */\nexport default class NavigationButtonList extends Component {\n @service declare navigation: NavigationService;\n\n /**\n * Transition to the specified route ID\n */\n @action\n transitionToRouteId(routeId: number, queryParams: Record): void {\n this.navigation.transitionToRouteId(routeId, queryParams ? { queryParams } : undefined);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::NavigationButtonList': typeof NavigationButtonList;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#each @buttons as |button|}}\\n \\n {{/each}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/photo-card/photo-card-action-buttons/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\ninterface PhotoCardActionButtonsSignature {\n Args: {\n buttons: PhotoCardActionButton[];\n };\n}\n\nexport interface PhotoCardActionButton {\n text: string;\n icon: string;\n style: string;\n onClick: VoidFunction;\n}\n\nexport function fnCreateActionButton(\n text: string,\n icon: string,\n style: string,\n onClick: VoidFunction\n): PhotoCardActionButton {\n return {\n text,\n icon,\n style,\n onClick\n };\n}\n\nconst PhotoCardActionButtons = templateOnlyComponent();\nexport default PhotoCardActionButtons;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::PhotoCard::PhotoCardActionButtons': typeof PhotoCardActionButtons;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{#each @photos as |photo index|}}\\n
\\n
\\n \\n \\n \\n
\\n \\n
\\n {{/each}}\\n
\\n
\\n\\n\\n
\\n
\\n \\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n
\\n\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/photo-grid/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport './_style.scss';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { filterBy, gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport {\n getActionSheetPhotoDateString,\n nameAndCreateSubject,\n moveImagesToSubject,\n attemptCreateAndMove\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { showDeleteImagesModal } from 'customer-site/utils/video/settings/familiar-subject';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { SafeString } from 'handlebars';\nimport './_style.scss';\nimport type DomService from '@adc/ember-utils/services/dom';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type ArrayProxy from '@ember/array/proxy';\nimport type RouterService from '@ember/routing/router-service';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\n\nconst StateSelected = true,\n StateMixed = 'mixed',\n StateUnselected = false;\n\nconst FloatingSubjectSelectionHeaderHeight = 42;\n\ntype SelectionState = typeof StateSelected | typeof StateMixed | typeof StateUnselected;\n\nexport interface PhotoGridAction {\n icon: string;\n text: string;\n onClick: (images: FamiliarTargetEnrollmentImage[]) => void;\n}\n\ninterface PhotoGridComponentSignature {\n Args: {\n enrollment: FamiliarTargetEnrollment;\n photos: ArrayProxy;\n photoAltText: string;\n };\n}\n\n/**\n * A grid of selectable familiar target enrollment photos and a row of actions that can be taken for the selected photo\n */\n@intlPath({ path: 'video/settings/familiar-targets/photo-grid' })\nexport default class PhotoGridComponent extends Component {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare modals: ModalsService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n @service declare store: Store;\n @service declare dom: DomService;\n\n /**\n * The height of the subject selection carousel\n * Setting this to a large number by default because (in floatingSubjectSelectionStyle) that makes it animate from below the viewport)\n */\n @tracked subjectSelectionBodyHeight = 300;\n\n /**\n * The photo currently open in the action sheet menu (if any)\n */\n @tracked declare actionSheetPhoto?: FamiliarTargetEnrollmentImage;\n\n /**\n * The number of photos that are currently selected\n */\n @computed('selectedPhotos.length')\n get selectedPhotosCount(): number {\n return this.selectedPhotos?.length ?? 0;\n }\n\n /**\n * The photos currently selected by the user\n */\n @filterBy('args.photos', 'isConfirmedForCluster')\n declare selectedPhotos: FamiliarTargetEnrollmentImage[];\n\n /**\n * If we should show the floating subject selection bar\n */\n @gt('selectedPhotosCount', 0)\n declare showFloatingSubjectSelection: boolean;\n\n /**\n * The CSS class for the image container\n */\n @computed('args.enrollment.familiarObjectType')\n get isFamiliarFace(): boolean {\n return this.args.enrollment.familiarObjectType === Face;\n }\n\n /**\n * The state of the bulk-actions binary control. If all items are selected, the box will be Selected (Check).\n * If some items are selected, the state will be Mixed (dashed line). If no items are selected the state will be\n * unchecked\n */\n @computed('args.photos.@each.isConfirmedForCluster', 'selectedPhotosCount')\n get bulkActionsState(): SelectionState {\n const { args, selectedPhotosCount } = this,\n { photos } = args;\n\n if (selectedPhotosCount === photos.length) {\n return StateSelected;\n }\n\n return selectedPhotosCount > 0 ? StateMixed : StateUnselected;\n }\n\n /**\n * The subheader for the action sheet (if open) displaying similar to \"Photo taken on 07/27/23 at 6:01 AM\"\n */\n @computed('actionSheetPhoto.createdUtc')\n get actionSheetPhotoDateString(): string | SafeString {\n return getActionSheetPhotoDateString(this.intl, this.actionSheetPhoto?.createdUtc);\n }\n\n /**\n * The style for the floating subject selection bar, for sticking it to the bottom of the page and animate opening and closing\n */\n @computed('subjectSelectionBodyHeight', 'showFloatingSubjectSelection')\n get floatingSubjectSelectionStyle(): SafeString {\n const { showFloatingSubjectSelection } = this;\n\n const floatingSubjectSelectionHeight = this.showFloatingSubjectSelection\n ? this.subjectSelectionBodyHeight + FloatingSubjectSelectionHeaderHeight\n : FloatingSubjectSelectionHeaderHeight;\n\n if (showFloatingSubjectSelection) {\n return htmlSafe(`max-height: ${floatingSubjectSelectionHeight}px`);\n }\n\n return htmlSafe('');\n }\n\n /**\n * The text for the floating subject selection checkbox\n */\n @computed('selectedPhotosCount')\n get floatingSubjectSelectionCheckboxText(): string {\n const { intl, selectedPhotosCount } = this;\n\n return selectedPhotosCount > 0\n ? intl.tc(this, 'numSelected', { num: selectedPhotosCount })\n : intl.t('generic.selectAll');\n }\n\n /**\n * Update the tracked height of the subject selection carousel\n */\n @action updateSubjectSelectionBodyHeight(el: HTMLElement) {\n this.subjectSelectionBodyHeight = el.offsetHeight;\n }\n\n /**\n * Handle the bulk actions selector control being toggled by setting the selection value on\n * all images on the page\n *\n * @param event\n */\n @action bulkSelectionChanged(event: Event & { target: HTMLInputElement }) {\n this.args.photos.forEach((img) => (img.isConfirmedForCluster = event.target.checked));\n }\n\n /**\n * Handle an action button selection by passing in a list of images into the onAction callback\n *\n * @param onAction\n */\n @action handleActionButtonClick(onAction: (images: FamiliarTargetEnrollmentImage[]) => void) {\n onAction(this.selectedPhotos);\n }\n\n /**\n * Opens the action sheet options with the selected photo\n */\n @action openPhotoActionSheet(photo: FamiliarTargetEnrollmentImage, e: PointerEvent) {\n // need to stop propagation so that the checkbox doesn't select also\n e.stopPropagation();\n this.actionSheetPhoto = photo;\n }\n\n /**\n * Move the provided images to the desired familiar subjects\n */\n @action async moveImagesToSubject(subject: FamiliarTargetEnrollmentCluster): Promise {\n await moveImagesToSubject(this.selectedPhotos, this.navigation, this.notificationManager, this.intl, subject);\n }\n\n /**\n * Prompt for a name and create a new familiar subject with that name as the description, with the images provided\n *\n * @param images\n */\n @action nameAndCreateSubject() {\n nameAndCreateSubject(\n this.args.enrollment,\n this.selectedPhotos,\n this.store,\n this.navigation,\n this.notificationManager,\n this.intl,\n this.modals\n );\n }\n\n /**\n * Deletes the selected photos and then closes the floating subject selection.\n */\n @action deleteAndCloseFloatingSubjectSelection() {\n this.deleteImages(this.selectedPhotos);\n }\n\n /**\n * Attempts to create a new cluster for the user and adds selected images to it\n * @returns new Familiar Target Enrollment Cluster | undefined\n */\n async attemptCreateAndMove(\n name: string,\n enrollment: FamiliarTargetEnrollment,\n images: FamiliarTargetEnrollmentImage[],\n store: Store\n ): Promise {\n return attemptCreateAndMove(name, enrollment, images, store);\n }\n\n /**\n * Opens a modal for deleting one or many images from the photo grid\n *\n * @param images list of images to delete\n */\n deleteImages(images: FamiliarTargetEnrollmentImage[]) {\n showDeleteImagesModal(\n images,\n this.args.enrollment,\n this.modals,\n this.intl,\n this.notificationManager,\n this.navigation\n );\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::PhotoGrid': typeof PhotoGridComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if this.shouldDisplayAtLimitInlineAlert}}\\n \\n{{/if}}\\n{{#if @model.recentImages.length}}\\n
\\n

{{tc this \\'selectPhotos\\'}}

\\n
\\n \\n

{{this.recentPhotosProperties.recentPhotosHeader}}

\\n
\\n
\\n \\n

{{this.recentPhotosProperties.recentPhotosSubheader}}

\\n
\\n
\\n {{#if @enrollment}}\\n \\n {{/if}}\\n{{else}}\\n

{{this.recentPhotosProperties.noPhotosHeaderText}}

\\n
\\n {{#if @model.shouldDisplayWaitText}}\\n \\n

{{this.recentPhotosProperties.noPhotosWaitInstruction}}

\\n {{/if}}\\n \\n

{{this.recentPhotosProperties.noPhotosInstruction}}

\\n
\\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/recent-photos/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { service } from '@ember/service';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { FamiliarSubjectRecentPhotosRouteModel } from 'customer-site/video/settings/familiar-subject/recent-images-base-route';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\n\ninterface RecentPhotosSignature {\n Args: {\n enrollment?: FamiliarTargetEnrollment;\n model?: FamiliarSubjectRecentPhotosRouteModel;\n };\n}\n\n/**\n * The text properties for the recent photos component, with text for the inline alert, icon, instructions, etc.\n */\ninterface RecentPhotosProperties {\n atLimitInlineAlertText: string; // The at limit text to display\n noPhotosIcon: string; // The icon to display when there are no photos.\n noPhotosHeaderText: string; // The header text to display when there are no photos.\n noPhotosInstruction: string; // The no photos instruction to display when there are no photos.\n noPhotosWaitInstruction: string; // The no photos wait instruction to display when there are no photos.\n photoAltText: string; // The alt text for the photo.\n recentPhotosHeader: string; // The header text to display when there are photos.\n recentPhotosSubheader: string;\n}\n\n/**\n * Component for displaying the device status information.\n */\n@intlPath({ path: 'video/settings/familiar-targets/recent-photos' })\nexport default class RecentPhotos extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Is the current enrolment type for familiar face?\n */\n @cached\n get isFamiliarFaceEnrollment(): boolean {\n return this.args.enrollment?.familiarObjectType === Face;\n }\n\n /**\n * Should the at limit inline alert be displayed?\n */\n get shouldDisplayAtLimitInlineAlert(): boolean {\n const { args } = this,\n { enrollment } = args;\n\n if (!enrollment) {\n return false;\n }\n\n return enrollment.isMaxFamiliarSubjectReached;\n }\n\n /**\n * Get the text properties for the recent photos component.\n */\n @cached\n get recentPhotosProperties(): RecentPhotosProperties {\n const { isFamiliarFaceEnrollment, intl } = this,\n genericResourcePath = 'generic.video.settings.familiar-subject',\n resourcePrefix = isFamiliarFaceEnrollment ? 'face' : 'vehicle';\n\n return {\n atLimitInlineAlertText: isFamiliarFaceEnrollment\n ? intl.t(`${genericResourcePath}.atFaceLimitText`)\n : intl.t(`${genericResourcePath}.atVehicleLimitText`),\n noPhotosIcon: isFamiliarFaceEnrollment ? 'facial-recognition' : 'va-vehicle',\n noPhotosHeaderText: intl.tc(this, `${resourcePrefix}.noPhotos`),\n noPhotosInstruction: intl.tc(this, `${resourcePrefix}.noPhotosInstruction`),\n noPhotosWaitInstruction: intl.tc(this, `${resourcePrefix}.initialEnableText`),\n photoAltText: intl.tc(this, `${resourcePrefix}.recentPhotosAlt`),\n recentPhotosHeader: intl.tc(this, `${resourcePrefix}.recentPhotosHeader`),\n recentPhotosSubheader: intl.tc(this, `${resourcePrefix}.recentPhotosSubheader`)\n };\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::RecentPhotos': typeof RecentPhotos;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{yield}}\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/subject-image/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\ninterface SubjectImageSignature {\n Element: HTMLDivElement;\n Args: {\n imageSource: string | Promise;\n altText: string;\n errorText?: string;\n showEntireImage?: boolean;\n };\n Blocks: {\n default: [];\n };\n}\n\n/**\n * @classdesc\n *\n * Component containing common styling and error handling behavior for\n * familiar subject images\n */\n@intlPath({ path: 'video/settings/familiar-targets/subject-image' })\nexport default class SubjectImage extends Component {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n\n /**\n * The error message to display if the image fails to load.\n */\n @computed('args.errorText', 'defaultErrorText')\n get errorText(): string {\n return this.args.errorText ?? this.defaultErrorText;\n }\n\n /**\n * The default error text to show if the image fails to load\n */\n get defaultErrorText(): string {\n const textKey = this.identityManager.isLoginAsLoginRep ? 'noPermissionToViewImage' : 'imageFailedToLoad';\n return this.intl.tc(this, textKey);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::SubjectImage': typeof SubjectImage;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/subject-selection-carousel/selection-icon/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\ninterface VideoSubjectSelectionCarouselSelectionIconSignature {\n Args: {\n icon: string;\n };\n}\n\nconst VideoSubjectSelectionCarouselSelectionIcon =\n templateOnlyComponent();\nexport default VideoSubjectSelectionCarouselSelectionIcon;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::SubjectSelectionCarousel::SelectionIcon': typeof VideoSubjectSelectionCarouselSelectionIcon;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{#if this.isPending}}\\n \\n {{else}}\\n \\n {{~yield~}}\\n \\n {{/if}}\\n\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/subject-selection-carousel/async-selection/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { equal } from '@ember/object/computed';\nimport { task } from 'ember-concurrency';\n\nimport './_style.scss';\nimport type { ButtonSimpleSignature } from '@adc/ui-components/components/button/simple';\n\ninterface AsyncSelectionSignature {\n Element: ButtonSimpleSignature['Element'];\n Args: {\n buttonAction: (e?: MouseEvent) => Promise | void;\n contentClass: string;\n };\n Blocks: {\n default: [];\n };\n}\n\nenum AsyncSelectionState {\n Idle,\n Pending\n}\n\n/**\n * @classdesc\n *\n * Custom asynchronous button element for displaying a spinner when a Familiar Subject\n * selection is selected. Similar to Button::Async without the unneeded behavior and\n * styling\n */\nexport default class AsyncSelection extends Component {\n /**\n * The current async state of the button\n */\n @tracked asyncState = AsyncSelectionState.Idle;\n\n /**\n * Is the async action currently in progress\n */\n @equal('asyncState', AsyncSelectionState.Pending)\n declare isPending: boolean;\n\n /**\n * Run the button action handler. If the action is async, wait for\n * it to complete and dismiss the async state\n */\n executeButtonAction = task({ drop: true }, async (e: MouseEvent) => {\n const { buttonAction } = this.args;\n\n if (!buttonAction) {\n return;\n }\n\n const result = buttonAction(e);\n\n if (result && typeof result.then === 'function') {\n this.asyncState = AsyncSelectionState.Pending;\n await result;\n this.asyncState = AsyncSelectionState.Idle;\n }\n });\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::SubjectSelectionCarousel::AsyncSelection': typeof AsyncSelection;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @canCreateNewSubject}}\\n \\n \\n {{this.optionLabel}}\\n \\n {{/if}}\\n {{#each @subjects as |subject|}}\\n {{#unless (eq @subjectIdToHide subject.id)}}\\n \\n {{#if subject.isPending}}\\n \\n {{else}}\\n \\n {{/if}}\\n \\n\\n \\n {{/unless}}\\n {{/each}}\\n
\",{ moduleName: \"customer-site/components/video/settings/familiar-targets/subject-selection-carousel/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { FamiliarSubjectObjectType } from 'customer-site/enums/FamiliarObjectType';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\n\ntype SubjectSelectFunction = (subject: FamiliarTargetEnrollmentCluster) => Promise;\n\ninterface SubjectSelectionCarouselSignature {\n Element: HTMLDivElement;\n Args: {\n subjects: FamiliarTargetEnrollmentCluster[];\n canCreateNewSubject: boolean;\n selectSubject: SubjectSelectFunction;\n createSubject: VoidFunction;\n selectionDisabled: boolean;\n // if passed in, don't show the subject matching this id\n subjectIdToHide?: string;\n familiarObjectType: FamiliarSubjectObjectType;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for displaying a list of familiar subjects for selection that scrolls horizontally when docked\n */\n@intlPath({ path: 'video/settings/familiar-targets/subject-selection-carousel' })\nexport default class SubjectSelectionCarousel extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Get the familiar object option label\n */\n get optionLabel(): string {\n switch (this.args.familiarObjectType) {\n case Face:\n return this.intl.tc(this, 'newFace');\n default:\n return this.intl.tc(this, 'newVehicle');\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::FamiliarTargets::SubjectSelectionCarousel': typeof SubjectSelectionCarousel;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n {{#if this.selectAllCheckboxes}}\\n {{ t \\\"generic.selectAll\\\"}}\\n {{else}}\\n {{ t \\\"generic.unselectAll\\\"}}\\n {{/if}}\\n \\n \\n
\\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/intercom/recipients-searchbar/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action, set } from '@ember/object';\nimport { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\n\nimport type CheckboxTreeItem from '@adc/ui-components/utils/checkbox-tree-item';\nimport './_style.scss';\n\ninterface RecipientsSearchbarArgs {\n intercomLogins: CheckboxTreeItem[];\n checkboxContainerClass?: string;\n}\n\nexport default class RecipientsSearchbar extends Component {\n @tracked searchValue: string = '';\n @tracked selectAllCheckboxes: boolean = false;\n\n constructor(owner: unknown, args: RecipientsSearchbarArgs) {\n super(owner, args);\n this.selectAllCheckboxes = this.noCheckboxSelected(this.args.intercomLogins);\n }\n\n get filteredIntercomLogins() {\n if (this.searchValue) {\n return this.args.intercomLogins.filter((intercomLogin) => {\n return (\n intercomLogin.name.toLowerCase().includes(this.searchValue.toLowerCase()) ||\n intercomLogin.secondaryDescription.toLowerCase().includes(this.searchValue.toLowerCase())\n );\n });\n }\n return this.args.intercomLogins;\n }\n\n @action\n updateIntercomLogins(intercomLogins: CheckboxTreeItem[]) {\n this.selectAllCheckboxes = this.noCheckboxSelected(intercomLogins);\n }\n\n @action\n toggleAllCheckboxes() {\n this.args.intercomLogins.forEach((intercomLogin) => {\n set(intercomLogin, 'state', this.selectAllCheckboxes ? SELECTED : UNSELECTED);\n });\n this.selectAllCheckboxes = !this.selectAllCheckboxes;\n }\n\n private noCheckboxSelected(intercomLogins: CheckboxTreeItem[]) {\n if (intercomLogins.some((intercomLogin) => intercomLogin.state === SELECTED)) {\n return false;\n }\n return true;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Intercom::RecipientsSearchbar': typeof RecipientsSearchbar;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n {{tc this \\\"lightActivationDescription\\\"}}\\n
\\n
\\n
\\n {{t \\\"generic.video.floodlight\\\"}}\\n
\\n \\n
\\n {{#if @cameraLightSetting.supportsManualAlarmLightControl}}\\n
\\n
\\n {{t \\\"generic.video.warningLight\\\"}}\\n
\\n \\n
\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/settings/lightguard/light-activation-card/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { equal, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { On } from 'customer-site/enums/LightStatus';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type AjaxService from '@adc/ajax/services/adc-ajax';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\nimport type Camera from 'customer-site/models/video/devices/camera';\n\ninterface VideoSettingsLightguardLightActivationCardArgs {\n cameraLightSetting?: CameraLightSetting;\n camera?: Camera;\n}\n\n@intlPath({ path: 'video/settings/lightguard/light-activation-card' })\nexport default class VideoSettingsLightguardLightActivationCard extends Component {\n @service declare ajax: AjaxService;\n\n // Is the camera light on?\n @equal('args.camera.cameraLight.state', On)\n declare isLightOn: boolean;\n\n // Is the alarm light on (if supported)?\n @reads('args.cameraLightSetting.isManualAlarmLightEnabled')\n declare isAlarmLightOn: boolean;\n\n // The icon string to use for the light button.\n get lightButtonIcon(): string {\n return this.isLightOn ? 'light-on' : 'light-off';\n }\n\n // The icon string to use for the alarm light button.\n get alarmLightButtonIcon(): string {\n return this.isAlarmLightOn ? 'siren-on' : 'siren-off';\n }\n\n // Action to toggle the camera light.\n @action\n async toggleLight(): Promise {\n const { camera } = this.args;\n await this.ajax.apiRequest(`devices/cameraLights/${camera!.id}/toggleLight`, undefined, null, POST);\n }\n\n // Action to toggle the alarm light.\n @action\n async toggleAlarmLight(): Promise {\n const { camera, cameraLightSetting } = this.args;\n await this.ajax.apiRequest(`video/devices/cameras/${camera!.id}/toggleAlarmLeds`, undefined, null, POST);\n await cameraLightSetting!.reload();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Lightguard::LightActivationCard': typeof VideoSettingsLightguardLightActivationCard;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:content>\\n
\\n
\\n {{@title}}\\n
\\n {{#if @description}}\\n
\\n {{@description}}\\n
\\n {{/if}}\\n\\n \\n \\n {{statusText}}\\n \\n
\\n
\\n \\n\\n\",{ moduleName: \"customer-site/components/video/settings/lightguard/light-trigger-item/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type ContextManager from 'customer-site/services/context-manager';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { DrillThroughItemSignature } from '@adc/ui-components/components/drill-through-item';\n\nexport enum LightTriggerStatusEnum {\n Inactive,\n Paused,\n Active\n}\n\ninterface VideoSettingsLightTriggerItemSignature {\n Element: DrillThroughItemSignature['Element'];\n Args: Pick & {\n status: Promise;\n pausedUntilDateTimeUtc: Promise;\n title: string;\n description?: string;\n };\n}\n\n@intlPath({ path: 'video/settings/lightguard/light-trigger-item' })\nexport default class VideoSettingsLightTriggerItem extends Component {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n\n /**\n * Return a boolean promise representing if status is active.\n */\n get isActive(): Promise {\n return (async () => (await this.args.status) === LightTriggerStatusEnum.Active)();\n }\n\n /**\n * Return a boolean promise representing if status is paused.\n */\n get isPaused(): Promise {\n return (async () => (await this.args.status) === LightTriggerStatusEnum.Paused)();\n }\n\n /**\n * Return a boolean promise representing if status is inactive.\n */\n get isInactive(): Promise {\n return (async () => (await this.args.status) === LightTriggerStatusEnum.Inactive)();\n }\n\n /**\n * Returns a string promise for the trigger status text.\n */\n @computed('args.status')\n get triggerStatusText(): Promise {\n return (async () => {\n const { intl, args } = this,\n { status } = args;\n\n const resolvedStatus = await status;\n switch (resolvedStatus) {\n case LightTriggerStatusEnum.Active:\n return intl.tc(this, 'activeTrigger');\n case LightTriggerStatusEnum.Paused: {\n const { args, contextManager } = this,\n { identityModel, showPreferredTimezone } = contextManager,\n { preferredTimezone } = identityModel,\n pausedUntilDateTimeUtc = await args.pausedUntilDateTimeUtc;\n\n const timestamp =\n pausedUntilDateTimeUtc &&\n intl.formatDateTz(pausedUntilDateTimeUtc, {\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZone: showPreferredTimezone ? preferredTimezone : intl.timeZone\n });\n\n return intl.tc(this, 'pausedUntil', { timestamp });\n }\n case LightTriggerStatusEnum.Inactive:\n return intl.tc(this, 'inactiveTrigger');\n }\n\n return '';\n })();\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Lightguard::LightTriggerItem': typeof VideoSettingsLightTriggerItem;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n {{tc this \\\"triggersDescription\\\"}}\\n
\\n {{#if this.showVideoAnalyticsTrigger}}\\n \\n {{/if}}\\n \\n \\n \\n
\\n\",{ moduleName: \"customer-site/components/video/settings/lightguard/light-triggers-group/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed, action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { LightTriggerStatusEnum } from 'customer-site/components/video/settings/lightguard/light-trigger-item/index';\nimport {\n EmberVideoRules,\n EmberVideoLightGuardMotionDetectionSettings,\n EmberLightsSchedules,\n EmberLightsRules\n} from 'customer-site/enums/CustomerPageUrl';\nimport { intlPath } from '@adc/i18n/path';\nimport differenceInMinutes from 'date-fns/differenceInMinutes';\n\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport './_style.scss';\nimport type Rule from 'customer-site/models/automation/rules/rule';\nimport type Schedule from 'customer-site/models/automation/schedules/schedule';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\nimport type CameraPirSetting from 'customer-site/models/video/camera-pir-setting';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type NavigationService from 'customer-site/services/navigation';\n\ntype LightEnabledRuleStatus = {\n status: LightTriggerStatusEnum;\n pausedUntilDateTimeUtc: Date | null;\n};\n\ntype RuleDetail = {\n id: string;\n isLightEnabled: boolean;\n status: number;\n pausedUntilDateTimeUtc: Date;\n};\n\ninterface VideoSettingsLightTriggersGroupArgs {\n rules?: Rule[] | Awaited>;\n schedules?: Awaited>;\n ovRules?: Awaited> | [];\n cameraLightSetting?: CameraLightSetting;\n cameraPirSetting?: Awaited>;\n cameraId?: string;\n canViewVideoAnalytics?: boolean;\n}\n\n/**\n * Sort an array of RuleDetails by the pausedUntilDateTimeUtc property from earliest to latest.\n */\nfunction sortRuleDetailsByDate(ruleDetails: RuleDetail[]): RuleDetail[] {\n return ruleDetails.sort((a, b) => {\n const { pausedUntilDateTimeUtc: pausedUntilA } = a,\n { pausedUntilDateTimeUtc: pausedUntilB } = b;\n\n if (!pausedUntilA) {\n if (!pausedUntilB) {\n return 0;\n }\n return 1;\n }\n\n return differenceInMinutes(pausedUntilA, pausedUntilB);\n });\n}\n\n/**\n * Returns the light trigger status (whether it could trigger a light or not) for the given\n * list of automation items.\n */\nfunction automationItemStatus(items: Schedule[] | Rule[]): LightTriggerStatusEnum {\n const pausedItems = items.filterBy('isPaused');\n return pausedItems.length < items.length ? LightTriggerStatusEnum.Active : LightTriggerStatusEnum.Inactive;\n}\n\n@intlPath({ path: 'video/settings/lightguard/light-triggers-group' })\nexport default class VideoSettingsLightTriggersGroup extends Component {\n @service declare navigation: NavigationService;\n @service declare identityManager: IdentityManager;\n\n /**\n * Alias for ovrules argument.\n */\n @reads('args.ovRules')\n declare ovRules: OvRule[];\n\n /**\n * Alias for camera settings argument.\n */\n @reads('args.cameraLightSetting')\n declare cameraLightSetting: CameraLightSetting;\n\n /**\n * Alias for camera settings argument.\n */\n @reads('args.cameraPirSetting')\n declare cameraPirSetting: CameraPirSetting;\n\n /**\n * Alias for schedules argument.\n */\n @reads('args.schedules')\n declare schedules: Schedule[];\n\n /**\n * Alias for rules argument.\n */\n @reads('args.rules')\n declare rules: Rule[];\n\n /**\n * Alias for camera id argument.\n */\n @reads('args.cameraId')\n declare cameraId: string;\n\n /**\n * Should the video analytics trigger be shown\n */\n @computed('args.canViewVideoAnalytics', 'identityManager.{canManageVideoAnalytics,isLoginAsLoginRep}')\n get showVideoAnalyticsTrigger(): boolean {\n const { identityManager } = this;\n\n return (\n identityManager.canManageVideoAnalytics ||\n (identityManager.isLoginAsLoginRep && this.args.canViewVideoAnalytics) ||\n false\n );\n }\n\n /**\n * Returns the details of the rule selected for determining the light trigger status.\n */\n @computed('ovRules')\n get lightEnabledRuleStatus(): Promise {\n return (async () => {\n const { cameraId, ovRules } = this;\n\n // Wait for nested models to resolve and get the necessary properties.\n const resolvedRuleDetails: RuleDetail[] = await Promise.all(\n ovRules.map(async (ovRule: OvRule) => {\n const perimeterGuardConfig = await ovRule.perimeterGuardConfig,\n ruleItem = await ovRule.ruleItem,\n camera = await ovRule.camera;\n\n const isLightEnabled = perimeterGuardConfig && perimeterGuardConfig.lightEnabled;\n\n return {\n id: camera.id,\n isLightEnabled,\n status: ovRule.isActive ? LightTriggerStatusEnum.Active : LightTriggerStatusEnum.Paused,\n pausedUntilDateTimeUtc: ruleItem.pausedUntilDateTimeUtc\n };\n })\n );\n\n let status = LightTriggerStatusEnum.Inactive;\n let pausedUntilDateTimeUtc = null;\n\n const lightEnabledRuleDetailsOnCamera = resolvedRuleDetails.filter(\n ({ isLightEnabled, id }) => isLightEnabled && id === cameraId\n );\n const isAnyLightEnabledRulesActive = lightEnabledRuleDetailsOnCamera.some(\n ({ status }) => status === LightTriggerStatusEnum.Active\n );\n\n if (isAnyLightEnabledRulesActive) {\n status = LightTriggerStatusEnum.Active;\n\n return {\n status,\n pausedUntilDateTimeUtc: null\n };\n }\n\n const pausedLightEnabledRuleDetails = lightEnabledRuleDetailsOnCamera.filter(\n ({ status }) => status === LightTriggerStatusEnum.Paused\n );\n\n if (pausedLightEnabledRuleDetails.length) {\n pausedUntilDateTimeUtc = sortRuleDetailsByDate(pausedLightEnabledRuleDetails)[0].pausedUntilDateTimeUtc;\n\n if (pausedUntilDateTimeUtc) {\n status = LightTriggerStatusEnum.Paused;\n }\n }\n\n return {\n status,\n pausedUntilDateTimeUtc\n };\n })();\n }\n\n /**\n * Returns the light triggers status for analytics rules.\n */\n @computed('lightEnabledRuleStatus')\n get lightAnalyticsRuleStatus(): Promise {\n return (async () => {\n const resolvedLightEnabledRule = await this.lightEnabledRuleStatus;\n return resolvedLightEnabledRule.status;\n })();\n }\n\n /**\n * Returns the paused until date for the selected analytics rule.\n */\n @computed('lightEnabledRuleStatus')\n get pausedUntilDateTimeUtc(): Promise {\n return (async () => {\n const { lightEnabledRuleStatus } = this,\n resolvedLightEnabledRule = await lightEnabledRuleStatus,\n { pausedUntilDateTimeUtc } = resolvedLightEnabledRule;\n return pausedUntilDateTimeUtc;\n })();\n }\n\n /**\n * Returns the light triggers status for the motion detection settings.\n */\n @computed('cameraPirSetting')\n get motionSettingStatus(): LightTriggerStatusEnum {\n const { cameraPirSetting } = this,\n { Active, Inactive } = LightTriggerStatusEnum;\n\n return cameraPirSetting.pirMotionEnabled ? Active : Inactive;\n }\n\n /**\n * Returns the light triggers status for the light automation schedules.\n */\n @computed('schedules')\n get lightScheduleStatus(): LightTriggerStatusEnum {\n const status = automationItemStatus(this.schedules);\n return status;\n }\n\n /**\n * Returns the light triggers status for the light rule builder automation rules.\n */\n @computed('rules')\n get lightRuleStatus(): LightTriggerStatusEnum {\n const status = automationItemStatus(this.rules);\n return status;\n }\n\n /**\n * Action for when the analytics drill through item is clicked.\n */\n @action\n onAnalyticsClicked(): void {\n const { cameraId } = this;\n this.navigation.transitionToRouteId(EmberVideoRules, {\n queryParams: {\n globalDeviceId: cameraId\n }\n });\n }\n\n /**\n * Action for when the motion detection drill through item is clicked.\n */\n @action\n onMotionDetectionClicked(): void {\n this.navigation.transitionToRouteId(\n EmberVideoLightGuardMotionDetectionSettings,\n undefined,\n undefined,\n this.cameraId,\n {\n queryParams: { isVSR: true }\n }\n );\n }\n\n /**\n * An action to transition to the lights automation schedules page.\n */\n @action\n onScheduleClicked(): void {\n this.navigation.transitionToRouteId(EmberLightsSchedules);\n }\n\n /**\n * An action to transition to the lights automation rule builder rules page.\n */\n @action\n onAutomationClicked(): void {\n this.navigation.transitionToRouteId(EmberLightsRules);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::Lightguard::LightTriggersGroup': typeof VideoSettingsLightTriggersGroup;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{!-- @glint-expect-error Glint indicates we should be passing minValue, but I don\\'t think that\\'s true. --}}\\n \\n
\\n

{{tc this \\'frameRate\\' numFramesPerSecond=this.currentFrameRate}}

\\n

{{tc this \\'resolution\\' width=this.currentResolutionWidth height=this.currentResolutionHeight}}

\\n
\\n
\\n {{#if this.warningMessage}}\\n
\\n \\n

{{this.warningMessage}}

\\n
\\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/playback-features/recording-quality-input/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed, action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { Low, Medium, High, Higher, FourMP, FourMPHigherFrameRate } from 'customer-site/enums/SdRecordingQuality';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\n\nexport interface RecordingQualityInputSignature {\n Args: {\n forcedRecordingQuality?: number;\n recordingQuality?: number;\n recordingQualityToStreamMapping: QualityStreamMap;\n valueChange: (quality: number) => void;\n supportsDynamicStreamMapping: boolean;\n };\n}\n\nexport interface StreamInfo {\n BitrateCap: number;\n FrameRate: number;\n ImageQuality: number;\n RateControlMode: number;\n ResolutionEnum: number;\n Resolution: Resolution;\n BitrateOptionsProperties: MaximumBitrateOptionsProperties;\n}\n\ninterface QualityStreamMap {\n [key: number]: StreamInfo;\n}\n\ninterface RecordingQualityInfo {\n resolution: Resolution;\n frameRate: number;\n}\n\ninterface MaximumBitrateOptionsProperties {\n DefaultBitrate: number;\n BitrateOptions: number[];\n}\n\ninterface Resolution {\n Width: number;\n Height: number;\n}\n\nexport const qualityKeyMapping: Map = new Map([\n [Low, 'generic.low'],\n [Medium, 'generic.medium'],\n [High, 'generic.high'],\n [Higher, 'generic.high'],\n [FourMP, 'generic.max'],\n [FourMPHigherFrameRate, 'generic.max']\n]);\n\n/**\n * Get the appropriate resource text for the recording quality.\n *\n * @param { number } quality SdRecordingQuality enum\n */\nfunction qualityToTextResourceMapping(quality: number): string | undefined {\n const qualityKey = qualityKeyMapping.get(quality);\n if (!qualityKey) {\n console.error('recording quality not recognized.');\n }\n\n return qualityKeyMapping.get(quality);\n}\n\n/**\n * @classdesc\n *\n * Component for modifying recording quality for rules.\n *\n * @param { number | null } forcedRecordingQuality The recording quality that is forced on this schedule due to a higher-priority stream, or null if there is no existing schedule that uses the same stream ID for this type of schedule.\n * @param { number | null } recordingQuality The recording quality currently set for the schedule.\n * @param {Array<{string}, Array<{string}, {number}>>} recordingQualityToStreamMapping The dictionary that maps the recording quality to its stream parameters (including resolution and frame rate).\n * @param {function(number):void} valueChange action to perform on resolution value change.\n * @param { boolean } supportsDynamicStreamMapping Does the camera we are creating this schedule for support dynamic stream mapping.\n */\n@intlPath({ path: 'video/settings/playback-features/recording-quality-input' })\nexport default class RecordingQualityInput extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * Gets the correct text resource for the lowest recording quality supported by the camera.\n *\n * @type {string | undefined}\n */\n @computed('args.recordingQualityToStreamMapping.[]')\n get minRecordingQualityText(): string | undefined {\n return qualityToTextResourceMapping(\n Math.min(...Object.keys(this.args.recordingQualityToStreamMapping).map(Number))\n );\n }\n\n /**\n * Gets the correct text resource for the maximum recording quality supported by the camera.\n *\n * @type {string | undefined}\n */\n @computed('args.{recordingQualityToStreamMapping,recordingQualityToStreamMapping.[]}')\n get maxRecordingQualityText(): string | undefined {\n return qualityToTextResourceMapping(\n Math.max(...Object.keys(this.args.recordingQualityToStreamMapping).map(Number))\n );\n }\n\n /**\n * Does this camera allows the Max quality to be set? This will determine whether we show a warning icon.\n */\n @computed('args.{recordingQualityToStreamMapping,recordingQualityToStreamMapping.[]}')\n get allowsMaxQuality(): boolean {\n return (\n Object.keys(this.args.recordingQualityToStreamMapping).map(Number).includes(Higher) ||\n Object.keys(this.args.recordingQualityToStreamMapping).map(Number).includes(FourMP) ||\n Object.keys(this.args.recordingQualityToStreamMapping).map(Number).includes(FourMPHigherFrameRate)\n );\n }\n\n /**\n * The maxValue used for the ticked-slider in the template.\n * This value is 0-indexed, which is why it is subtracted by 1.\n */\n @computed('args.{recordingQualityToStreamMapping,recordingQualityToStreamMapping.[]}')\n get maxValueForSlider(): number {\n return Object.keys(this.args.recordingQualityToStreamMapping).length - 1;\n }\n\n /**\n * A dictionary that contains information about the current recording quality to display.\n */\n @computed('args.{recordingQuality,recordingQualityToStreamMapping}')\n get currentQualityInfo(): RecordingQualityInfo | null {\n const { recordingQuality, recordingQualityToStreamMapping } = this.args;\n\n if (recordingQuality == null) {\n return null;\n }\n\n return {\n resolution: recordingQualityToStreamMapping[recordingQuality].Resolution,\n frameRate: recordingQualityToStreamMapping[recordingQuality].FrameRate\n };\n }\n\n /**\n * The current frame rate.\n */\n @reads('currentQualityInfo.frameRate')\n declare currentFrameRate: number;\n\n /**\n * The current Width.\n */\n @reads('currentQualityInfo.resolution.Width')\n declare currentResolutionWidth: number;\n\n /**\n * The current Height.\n */\n @reads('currentQualityInfo.resolution.Height')\n declare currentResolutionHeight: number;\n\n /**\n * Is the recording quality at the max value?\n */\n @computed('args.recordingQuality')\n get maxRecordingQuality(): boolean {\n return (\n this.args.recordingQuality == Higher ||\n this.args.recordingQuality == FourMP ||\n this.args.recordingQuality == FourMPHigherFrameRate\n );\n }\n\n /**\n * The warning message to display under the recording quality slider.\n * If there is no warning message, this value is null.\n */\n @computed('args.{forcedRecordingQuality,supportsDynamicStreamMapping}', 'maxRecordingQuality')\n get warningMessage(): string | null {\n const { intl, maxRecordingQuality } = this,\n { forcedRecordingQuality, supportsDynamicStreamMapping } = this.args;\n\n if (supportsDynamicStreamMapping || (!maxRecordingQuality && forcedRecordingQuality == null)) {\n return null;\n }\n\n return intl.tc(this, 'maxWarning');\n }\n\n /**\n * Gets the slider value from the recording quality enum.\n */\n @computed('args.{recordingQuality,recordingQualityToStreamMapping}')\n get sliderValue(): number | undefined {\n const { recordingQuality, recordingQualityToStreamMapping } = this.args;\n if (recordingQuality === undefined || !recordingQualityToStreamMapping) {\n return undefined;\n }\n\n return Object.keys(recordingQualityToStreamMapping).indexOf(recordingQuality.toString());\n }\n\n /**\n * Fired when the recording quality slider is moved.\n *\n * @param {number} quality The new recording quality.\n */\n @action\n onSliderMoved(quality: number): void {\n const { valueChange } = this.args;\n valueChange && valueChange(quality);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::PlaybackFeatures::RecordingQualityInput': typeof RecordingQualityInput;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{@fieldHeader}}

\\n {{#if @description}}\\n

\\n {{@description}}\\n

\\n {{/if}}\\n \\n
\\n
\\n {{#unless @shouldHideSliderNumericalValues}}\\n {{@minValue}}\\n {{/unless}}\\n {{@minDescription}}\\n
\\n
\\n {{#unless @shouldHideSliderNumericalValues}}\\n {{@maxValue}}\\n {{/unless}}\\n {{@maxDescription}}\\n
\\n
\\n
\",{ moduleName: \"customer-site/components/ui/slider-with-server-request/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { debounce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { SliderAdcSignature } from '@adc/ui-components/components/slider-adc';\n\ntype SliderAdcArgs = SliderAdcSignature['Args'];\n\n/**\n * @classdesc\n * Component for displaying Field of View / Focus options.\n */\n\ninterface SliderWithServerRequestSignature {\n Element: HTMLDivElement;\n Args: Pick & {\n fieldHeader?: string;\n minDescription: string;\n maxDescription: string;\n sliderValue: number;\n sliderValueChanged(newValue: number): Promise;\n description?: string;\n disableSlider?: boolean;\n shouldHideSliderNumericalValues?: boolean;\n };\n}\n\nconst SLIDER_DEBOUNCE_MILLISECONDS = 100;\n\n@intlPath({ path: 'video/settings/varifocal-fov-input' })\nexport default class SliderWithServerRequest extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * The current slider value saved and displayed on the ticked slider component.\n */\n // Do not copy this deprecated usage. If you see this, please fix it.\n // eslint-disable-next-line ember/no-tracked-properties-from-args\n @tracked sliderValue: number = this.args.sliderValue;\n\n /**\n * Cache the last slider value seen so that we can always revert if debounced server request fails.\n */\n // Do not copy this deprecated usage. If you see this, please fix it.\n // eslint-disable-next-line ember/no-tracked-properties-from-args\n @tracked lastSliderValue: number = this.args.sliderValue;\n\n get disableSlider(): boolean {\n return this.args.disableSlider ?? false;\n }\n\n /**\n * Update the slider value. Revert if the ajax handler in caller component fails though.\n */\n private sliderValueChange(): void {\n this.args.sliderValueChanged(this.sliderValue).then((success: boolean) => {\n // Check if parent action succeeded or not. If not, then restore the last saved slider value we cached.\n if (!success) {\n this.sliderValue = this.lastSliderValue;\n }\n this.lastSliderValue = this.sliderValue;\n });\n }\n\n /**\n * Updates the varifocal fov value on the slider\n *\n * @param {number} newValue the new slider value\n * @param {boolean} _isFromSlider Is the new value from the slider?\n * @param {boolean} isMouseUp Has the mouse up event occurred as if the user is satisfied with their slide selection?\n */\n @action\n onSliderChange(newValue: number, _isFromSlider: boolean, isMouseUp: boolean): void {\n // Mouse up will call parent function to save the new varifocal fov value in the DB and update the liveview player accordingly.\n this.sliderValue = newValue;\n if (isMouseUp) {\n // Do not copy this deprecated usage. If you see this, please convert to ember-lifeline debounceTask.\n // eslint-disable-next-line ember/no-runloop\n debounce(this, this.sliderValueChange, SLIDER_DEBOUNCE_MILLISECONDS);\n }\n }\n\n /**\n * Update the slider value on component update, triggered from parent.\n */\n @action updateSliderValue(_: HTMLDivElement, [newValue]: [number]): void {\n Object.assign(this, { sliderValue: newValue, lastSliderValue: newValue });\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Ui::SliderWithServerRequest': typeof SliderWithServerRequest;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{#if @isVSR}}\\n
\\n \\n {{tc this \\'fovSliderDescription\\'}}\\n \\n \\n \\n {{tc this \\'focusSliderDescription\\'}}\\n \\n
\\n \\n
\\n
\\n {{#if this.supportsVarifocalLensReset}}\\n \\n {{tc this \\'resetCameraLensDescription\\'}}\\n
\\n \\n
\\n
\\n {{/if}}\\n
\\n{{else}}\\n
\\n
\\n \\n\\n {{!-- @glint-expect-error isOpen doesn\\'t appear to exist, please fix this or delete. --}}\\n
\\n

{{t \\'generic.advancedOptions\\'}}

\\n \\n
\\n\\n
\\n \\n\\n
\\n \\n
\\n\\n {{#if this.supportsVarifocalLensReset}}\\n
\\n
\\n

{{t \\'generic.reset\\'}}

\\n

\\n {{tc this \\'resetDescription\\'}}\\n

\\n
\\n\\n
\\n \\n
\\n
\\n {{/if}}\\n
\\n
\\n
\\n{{/if}}\",{ moduleName: \"customer-site/components/video/settings/varifocal-input-settings/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { capitalize } from '@ember/string';\nimport { getCaughtError } from 'customer-site/utils/general';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface VarifocalAutoFocusResponse {\n message: string;\n varifocalFocus: number;\n varifocalFov: number;\n}\n\nconst [FocusKey, FovKey, BothKey] = ['focus', 'fov', 'both'];\n\ninterface VarifocalFovInputSignature {\n Args: {\n selectedVarifocalCamera: any;\n varifocalFocusValue: number;\n varifocalFov?: number;\n isSavingOrLoadingCamera: boolean;\n setIsSavingOrLoadingCamera: (value: boolean) => void;\n setVarifocalCameraModel: (key: string, value: number) => void;\n disableSliders: boolean;\n fovChanged: (oldFov: number, newFov: number) => void;\n isVSR?: boolean;\n };\n}\n\n/**\n * @classdesc\n *\n * Component for displaying Field of View / Focus options.\n */\n@intlPath({ path: 'video/settings/varifocal-input-settings' })\nexport default class VarifocalInputSettings extends Component {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationService;\n @service declare intl: ADCIntlService;\n\n // region Properties.\n\n /**\n * The focus input will be a tracked value since we want the ability for this parent to update\n * it's child slider value.\n */\n // Do not copy this deprecated usage. If you see this, please fix.\n // eslint-disable-next-line ember/no-tracked-properties-from-args\n @tracked varifocalFocusValue: number = this.args.varifocalFocusValue;\n\n /**\n * The fov input will just be a derived getter since for now it only needs to observe changes in the model.\n */\n get varifocalFovValue(): number {\n return this.args.selectedVarifocalCamera && this.args.selectedVarifocalCamera.varifocalFov;\n }\n\n /**\n * Do we need to display the help tooltip?\n */\n @tracked showCameraAdjustingToolTip = false;\n\n /**\n * Should advanced options for setting focus values be shown?\n */\n openAdvancedOptions = false;\n\n /**\n * Should the sliders be disabled on the UI?\n * @type {boolean}\n */\n get shouldDisableSliders(): boolean {\n return this.args.isSavingOrLoadingCamera || this.args.disableSliders;\n }\n\n /**\n * Does the camera supports varifocal lens reset?\n */\n @alias('args.selectedVarifocalCamera.supportsVarifocalLensReset')\n declare supportsVarifocalLensReset: boolean;\n\n // endregion Properties\n\n // region Private Functions.\n\n /**\n * Update the varifocal fov and focus on the camera and db.\n */\n private updateFovFocus(key: string, callBackPromise: Promise>): Promise {\n const { setIsSavingOrLoadingCamera, setVarifocalCameraModel, fovChanged } = this.args;\n const { varifocalFovValue } = this;\n\n // Set state on parent to true.\n setIsSavingOrLoadingCamera(true);\n\n return callBackPromise\n .then(({ value }: { value: VarifocalAutoFocusResponse }) => {\n // If we reset the lens we will need to update both varifocal fov and focus\n if (key === BothKey) {\n setVarifocalCameraModel(`varifocal${capitalize(FovKey)}`, value.varifocalFov);\n setVarifocalCameraModel(`varifocal${capitalize(FocusKey)}`, value.varifocalFocus);\n fovChanged(varifocalFovValue, value.varifocalFov);\n this.notificationManager.addSuccess(value.message);\n return true;\n }\n\n const cameraModelProperty = `varifocal${capitalize(key)}`;\n // Update the model so refresh page retains value.\n setVarifocalCameraModel(\n cameraModelProperty,\n key === FocusKey ? value.varifocalFocus : value.varifocalFov\n );\n\n // For focus input we need to update its tracked value.\n // Not making fov input tracked since we currently don't need that functionality for fov input.\n key === FocusKey && (() => (this.varifocalFocusValue = value.varifocalFocus))();\n\n if (key === FovKey) {\n fovChanged(varifocalFovValue, value.varifocalFov);\n }\n\n this.notificationManager.addSuccess(value.message);\n return true;\n })\n .catch((err) => {\n this.notificationManager.addError(getCaughtError(err));\n return false;\n })\n .finally(() => {\n // Set state on parent to false\n setIsSavingOrLoadingCamera(false);\n return true;\n });\n }\n\n // endregion Private Functions.\n\n // region Actions\n\n /**\n * Allows the customer to auto focus their varifocal camera.\n */\n @action autoFocus(): Promise {\n const { selectedVarifocalCamera } = this.args;\n return this.updateFovFocus(FocusKey, selectedVarifocalCamera.autoFocusCamera());\n }\n\n /**\n * Allows the customer to auto focus their varifocal camera.\n */\n @action resetVarifocalLens(): Promise {\n const { selectedVarifocalCamera } = this.args;\n return this.updateFovFocus(BothKey, selectedVarifocalCamera.resetVarifocalLens());\n }\n\n /**\n * Allows the customer to set the new fov value for their varifocal camera.\n */\n @action varifocalFovChanged(newFovValue: number): Promise {\n const { selectedVarifocalCamera } = this.args;\n return this.updateFovFocus(FovKey, selectedVarifocalCamera.updateFovFocus(FovKey, newFovValue));\n }\n\n /**\n * Allows the customer to set the new focus value for their varifocal camera.\n */\n @action varifocalFocusChanged(newFocusValue: number): Promise {\n const { selectedVarifocalCamera } = this.args;\n return this.updateFovFocus(FocusKey, selectedVarifocalCamera.updateFovFocus(FocusKey, newFocusValue));\n }\n\n // endregion Actions\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::VarifocalInputSettings': typeof VarifocalInputSettings;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n {{#unless (is-mobile-app)}}\\n \\n {{/unless}}\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/video-device-and-settings-selector/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed, action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { default as DropdownSelectItem, SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n *\n * The dropdown selectors for video devices and settings pages.\n *\n * @class components.video.settings.VideoDeviceAndSettingsSelector\n * @extends Ember.Component\n *\n * @param {function(deviceId: number):void} updateVideoDeviceSelection Method to call when the video device selection is changed.\n * @param {function(settingsPageUrl: string):void} updateSettingSelection Method to call when the setting selection is changed.\n * @param {number} deviceId The unit-local id of the currently selected device.\n * @param {number} settingsPageId The CustomerPageUrlEnum of the current page.\n * @param {number} settingsPageValueId The Settings Page dropdown value if the page ID is not the same.\n */\n@intlPath({ path: 'video/settings/video-device-and-settings-selector' })\nexport default class VideoDeviceAndSettingsSelector extends Component {\n @service intl;\n @service ajax;\n @service contextManager;\n\n // region Component state\n\n /**\n * Whether to disable the video cameras dropdown menu or not.\n */\n get disableVideoDropdown() {\n return !!this.args.disableVideoDropdown;\n }\n\n /**\n * Maps the available video devices to the dropdown select.\n *\n * @returns {Promise>}\n */\n // Don't want to recalcaulte on changing deviceId, only need to get new available video devices if settings page changes.\n // eslint-disable-next-line ember/require-computed-property-dependencies\n @computed('args.settingsPageId')\n get videoDeviceDropdownItems() {\n return (async () => {\n const videoDevices = await this.ajax\n .apiRequest(`video/settings/getVideoDevices?page=${this.args.settingsPageId}`)\n .then((data) => data.value);\n\n return videoDevices.map(({ deviceDesc, deviceId }) =>\n DropdownSelectItem.create({\n name: deviceDesc,\n value: deviceId,\n state: deviceId === this.args.deviceId ? SELECTED : UNSELECTED\n })\n );\n })();\n }\n\n /**\n * The list of settings page information items for the available settings pages.\n *\n * @returns {Promise>}\n */\n @computed('args.deviceId')\n get settingsPageItems() {\n return (async () => {\n return await this.ajax\n .apiRequest(`video/settings/getSettingsPages?deviceId=${this.args.deviceId}`)\n .then((data) => data.value);\n })();\n }\n\n /**\n * Maps the available settings page options to the dropdown select.\n *\n * @returns {Promise>}\n */\n @computed('args.settingsPageId', 'settingsPageItems')\n get settingsDropdownItems() {\n return (async () => {\n return (await this.settingsPageItems).map(({ title, urlEnum }) =>\n DropdownSelectItem.create({\n name: title,\n value: urlEnum,\n state: urlEnum === this.args.settingsPageId ? SELECTED : UNSELECTED\n })\n );\n })();\n }\n\n // endregion\n\n // region Actions\n\n /**\n * Calls the supplied update video device method.\n *\n * @param {string} deviceId\n */\n @action\n videoDeviceSelectionChanged(deviceId) {\n // Add the deviceID query param to the visited routes stack for VideoCameraSettingsOverview.\n // If the user clicks the back arrow, it will keep the selected device.\n // The last item (visitedRoutesStack.at(-1)) is the current video settings page,\n // and the item before that (visitedRoutesStack.at(-2)) is the VideoCameraSettingsOverview page.\n const visitedRoutesStack = this.contextManager.visitedRoutesStack;\n if (visitedRoutesStack && visitedRoutesStack.length > 1 && visitedRoutesStack.at(-2)?.queryParams) {\n this.contextManager.visitedRoutesStack.at(-2).queryParams.search = `?deviceID=${deviceId}`;\n } else {\n this.contextManager.resetVisitedRoutesStack();\n }\n\n this.args.updateVideoDeviceSelection(deviceId);\n }\n\n /**\n * Calls the supplied update settings page method.\n *\n * @param {string} settingsPageUrlEnum\n */\n @action\n async settingSelectionChanged(settingsPageUrlEnum) {\n // If the user is navigating to a legacy (.aspx) video settings page, add the deviceID query param to keep the selected device.\n const settingsPageItems = await this.settingsPageItems;\n const settingsPageInfo = settingsPageItems.findBy('urlEnum', parseInt(settingsPageUrlEnum));\n this.args.updateSettingSelection(\n settingsPageInfo.redirectUrl + `${settingsPageInfo.isEmber ? '' : `?deviceID=${this.args.deviceId}`}`\n );\n }\n\n // endregion\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck: Please convert to PageView. }}\\n\\n {{#unless @hideToolbar}}\\n \\n \\n \\n {{/unless}}\\n\\n \\n \\n \\n \\n\\n \\n
\\n {{yield data View.disposeNativeButtons View.updateNativeToolbarButtons}}\\n
\\n
\\n\\n \\n\\n \\n\\n \\n\\n
\\n\",{ moduleName: \"customer-site/components/video/settings/video-settings-container/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { getGlobalIdFromUnitAndDevice } from 'customer-site/utils/general';\n\nimport './_style.scss';\nimport type { NativeButtonType } from '@adc/ui-components/components/button/native';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\ntype ResolvedModel = NonNullable | M>>;\n\ninterface VideoSettingsContainerSignature {\n Element: HTMLDivElement;\n Args: {\n deviceId: string;\n settingsPageId: number;\n settingsPageValueId?: number;\n model?: M | Promise;\n dataLoaded?: (model: M | Promise | Partial) => void;\n removeDefaultClasses?: boolean;\n viewContainerClass?: string;\n hideToolbar?: boolean;\n };\n Blocks: {\n default: [\n /** The resolved model */\n ResolvedModel,\n /** disposeNativeButtons */\n ((buttons: string[]) => void) | undefined,\n /** updateNativeToolbarButtons */\n ((buttons: NativeButtonType[]) => void) | undefined\n ];\n };\n}\n\n/**\n * @classdesc\n *\n * Base controller file used for base Video Settings Container template.\n */\nexport default class VideoSettingsContainer extends Component> {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n\n /**\n * Redirects the user to the settings page they selected in the dropdown.\n *\n * @param settingsPageUrl The settings page to redirect to.\n */\n @action\n onUpdateSettingSelection(settingsPageUrl: string): void {\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n /**\n * Redirects the user to this page with the camera they selected in the dropdown.\n *\n * @param cameraId The new camera ID.\n */\n @action\n async onUpdateVideoDeviceSelection(cameraId: string): Promise {\n const unitId: string = (await this.identityManager.getSelectedSystem())?.unitId.toString() ?? '';\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n this.args.settingsPageId,\n undefined,\n undefined,\n getGlobalIdFromUnitAndDevice(unitId, cameraId)\n );\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Settings::VideoSettingsContainer': typeof VideoSettingsContainer;\n }\n}\n","import { get } from '@ember/object';\nimport { GET } from '@adc/ajax/services/adc-ajax';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type {\n OnvifNamingChildController,\n SnapshotInfo\n} from 'customer-site/video/onvif-install/naming/base-onvif-installation-naming-route';\n\n/**\n * The response returns a dictionary where value contains our requested data.\n * In value, bytes is a base 64 encoded string of the raw bytes and type is the Content-Type of the raw bytes.\n */\ntype SnapshotResponse = {\n value?: {\n bytes?: string;\n type?: string;\n errorMessage?: string;\n isSnapshotRetryable?: boolean;\n };\n};\n\n/**\n * How often we should make an attempt to retrieve snapshots.\n */\nconst SNAPSHOT_RETRY_TIME = 2000;\n\n/**\n * Polls for snapshot data until we retrieve it.\n */\nexport async function pollForSnapshotData(\n this: OnvifNamingChildController,\n camera: Camera\n): Promise {\n let { shouldLoadSnapshots } = this;\n if (!shouldLoadSnapshots) {\n return undefined;\n }\n\n // Before we start polling, check if we already have the blob url\n if (camera && this.snapshotDataObjects?.has(camera)) {\n return this.snapshotDataObjects.get(camera);\n }\n\n while (shouldLoadSnapshots) {\n const snapshotInfo = await getOrRetrieveSnapshotData.call(this, camera);\n\n // Explicitly checking for undefined because if blobUrl is null it means the snapshot errored out and we should stop doing snapshot polling.\n if (snapshotInfo !== undefined) {\n return snapshotInfo;\n }\n\n // Check if we should continue to still poll for snapshots.\n shouldLoadSnapshots = this.shouldLoadSnapshots;\n\n await new Promise((resolve) => setTimeout(resolve, SNAPSHOT_RETRY_TIME));\n }\n\n return undefined;\n}\n\n/**\n * This will either retrieve or request a snapshot's data. If we fail to obtain it, we return undefined.\n * (Undefined means the snapshot needs more time to retrieve, so we keep requesting for it until its ready)\n */\nasync function getOrRetrieveSnapshotData(\n this: OnvifNamingChildController,\n camera: Camera\n): Promise {\n const { snapshotDataObjects } = this;\n if (!snapshotDataObjects || !camera) {\n return undefined;\n }\n\n // If we have already saved the blub url.\n if (snapshotDataObjects.has(camera)) {\n return snapshotDataObjects.get(camera);\n }\n\n // Attempt to set the blobUrl.\n const snapshotInfo = await getSnapshotData.call(this, camera);\n\n // If snapshotInfo is undefined, that means the snapshot isn't ready yet (probably needs more time to load) in which case we'll keep polling for it.\n if (!snapshotInfo) {\n return undefined;\n }\n\n snapshotDataObjects.set(camera, snapshotInfo);\n return snapshotInfo;\n}\n\n/**\n * Attempts to retrieve a snapshot of the current frame, and we return it as a blob url that we can use as an image source.\n *\n * @returns {Promise} - We return undefined if the response isn't ready yet\n */\nasync function getSnapshotData(this: OnvifNamingChildController, camera: Camera): Promise {\n let blobUrl, errMsg;\n\n try {\n const id = get(camera, 'id');\n\n const response = await this.ajax.apiRequest(\n `video/onvifInstallation/getSnapshot/${id}`,\n undefined,\n undefined,\n GET\n ),\n { bytes, type, errorMessage, isSnapshotRetryable } = response?.value ?? {};\n\n if (bytes && type) {\n // Decrypt a base64 string\n const decryptedString = atob(bytes),\n // Fill an array buffer\n uintArray = Uint8Array.from(decryptedString, (c) => c.charCodeAt(0)),\n // Create a Blob object\n blob = new Blob([uintArray], { type });\n\n // Cache the blob and get a URL to access it\n blobUrl = URL.createObjectURL(blob);\n } else if (errorMessage) {\n errMsg = errorMessage;\n }\n\n // If the snapshot is retry-able (isn't ready) we return undefined instead of null so it can be tried again in a few seconds\n if (isSnapshotRetryable) {\n return undefined;\n }\n } catch (e) {\n // Do nothing.\n }\n\n return {\n blobUrl,\n errorMessage: errMsg\n };\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck: This component needs a signature, many of these arguments don\\'t exist. }}\\n\\n
\\n {{#if this.showSettingsChangingSpinner}}\\n
\\n \\n \\n
\\n {{/if}}\\n
\\n\\n\",{ moduleName: \"customer-site/components/video/video-player/overlay/fov-overlay/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport BaseVideoLiveOverlay from 'customer-site/components/video/video-player/overlay/base-live-overlay/index';\nimport { INITIALIZING_STATE, LOADING_STATE, PLAYING_STATE } from 'customer-site/enums/VideoPlayerStateEnum';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * The overlay for field of view that fits on top of the player and displays information about the current streaming status.\n */\n@intlPath({ path: 'video/video-player/overlay/fov-overlay' })\nexport default class VideoFovOverlay extends BaseVideoLiveOverlay {\n /**\n * If the liveview is playing/loading/initializing and we are displaying liveview on a page\n * that allows the user to modify camera settings then show the spinner if we are modifying settings for liveview.\n */\n get showSettingsChangingSpinner(): boolean {\n const playerStatesToShowSpinner = [LOADING_STATE, INITIALIZING_STATE, PLAYING_STATE];\n return playerStatesToShowSpinner.includes(this.args.playerState) && this.args.isModifyingSettings;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n \\n \\n
\\n
\",{ moduleName: \"customer-site/components/video/video-player/fov-player/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { action } from '@ember/object';\nimport BaseLivePlayer from 'customer-site/components/video/video-player/base-live-player/index';\nimport { StreamUsage } from 'customer-site/enums/StreamUsage';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * Component for displaying a video player for live view.\n */\nexport default class FovPlayer extends BaseLivePlayer {\n /** @override */\n playerType = StreamUsage.LiveViewFieldOfView;\n\n /**\n * @override\n */\n useHdStream = false;\n\n /**\n * Is the user modifying camera settings while watching liveview? This will only happen on certain customersite pages.\n *\n * @type {boolean}\n */\n isModifyingSettings = false;\n\n /** @override */\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-hooks\n init() {\n super.init(...arguments);\n\n this.setReloadStreamOnTimeoutMethod?.(() => {\n this.reloadStreamOnTimeout();\n });\n }\n\n /**\n * Initializes the video source if the stream has timed out.\n */\n @action reloadStreamOnTimeout() {\n if (this.hasStreamTimedOut) {\n this.initializeVideoSource.perform();\n }\n }\n}\n","import { helper } from '@ember/component/helper';\n\nexport interface AddSignature {\n Args: {\n Positional: number[];\n };\n Return: number;\n}\n\nexport function add(numbers: AddSignature['Args']['Positional']): AddSignature['Return'] {\n return numbers.reduce((total, n) => total + Number(n), 0);\n}\n\nexport default helper(add);\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n add: typeof add;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoAddDeviceRedirect, VideoAddNewDevice } from 'customer-site/enums/CustomerPageUrl';\n\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type Navigation from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n * Route to redirect to the Legacy Add Video Page\n */\nexport default class Route extends AdcBaseRoute {\n @service declare navigation: Navigation;\n @service declare contextManager: ContextManager;\n\n /** @override */\n routeId: number = EmberVideoAddDeviceRedirect;\n\n /**\n * Redirects to the legacy video add new device page.\n */\n redirect() {\n this.navigation.transitionToRouteId(VideoAddNewDevice);\n }\n}\n","import { computed } from '@ember/object';\nimport ActivityController from 'customer-site/activity/event-history/controller';\nimport { baseAdvancedSearchDefaultFilterValues } from 'customer-site/classes/video/advanced-video-search/helpers';\nimport { NUM_SECONDS_IN_HOUR } from 'customer-site/utils/datetime';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * A controller that provides support for the enterprise Advanced Video Search page.\n */\nexport default class EnterpriseAdvancedVideoSearchRoute extends ActivityController {\n // region QueryParameters\n queryParams = ['startDate', 'endDate', 'timeInterval'];\n\n /** @override */\n @computed()\n get defaultFilterValues() {\n return {\n ...super.defaultFilterValues,\n ...baseAdvancedSearchDefaultFilterValues\n };\n }\n\n /**\n * When the SVR timeline is loaded, this represents the amount of time (in seconds) the timeline should show\n */\n timeInterval = NUM_SECONDS_IN_HOUR;\n\n /**\n * The search start date\n */\n startDate;\n\n /**\n * The search end date\n */\n endDate;\n\n /**\n * Whether the activity search feature is disabled.\n * @type {boolean}\n */\n activitySearchDisabled = baseAdvancedSearchDefaultFilterValues.activitySearchDisabled;\n\n /**\n * The sensitivity that the activity search should use.\n * @type {number}\n */\n activitySensitivity = baseAdvancedSearchDefaultFilterValues.activitySensitivity;\n\n /**\n * Whether the motion search feature is disabled.\n * @type {boolean}\n */\n motionSearchDisabled = baseAdvancedSearchDefaultFilterValues.motionSearchDisabled;\n\n /**\n * The sensitivity that the motion search should use.\n * @type {number}\n */\n motionSensitivity = baseAdvancedSearchDefaultFilterValues.motionSensitivity;\n\n // endregion\n}\n","import { inject as service } from '@ember/service';\nimport ActivityRoute from 'customer-site/activity/event-history/route';\nimport {\n baseAdvancedSearchModelHook,\n cancelObjectSearchRequest\n} from 'customer-site/classes/video/advanced-video-search/helpers';\nimport { EmberVideoAdvancedVideoSearch } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n *\n * Base route for the Advanced Video Search page.\n */\nexport default class AdvancedVideoSearchRoute extends ActivityRoute {\n @service contextManager;\n @service ajax;\n @service store;\n @service envSettings;\n\n routeId = EmberVideoAdvancedVideoSearch;\n\n /** @override */\n doNotTimeOut = true;\n\n /** @override */\n queryParams = {\n endDate: { replace: true, type: 'date' },\n startDate: { replace: true, type: 'date' },\n timeInterval: { replace: true, type: 'number' }\n };\n\n /** @override */\n model(params, transition) {\n return baseAdvancedSearchModelHook.call(this, this.contextManager, this.store, params, transition);\n }\n\n deactivate() {\n super.deactivate();\n\n cancelObjectSearchRequest(this.ajax, this.slugs[0], this.envSettings);\n\n // clear the video intervals from the store since the intervals created for AVS will not be reused\n this.store.unloadAll('video/interval');\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport SvrTimelineController from '../svr-timeline/controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from 'customer-site/video/appearance-search-results/route';\nimport './_style.scss';\n\nexport type AppearanceSearchDataObject = {\n appliedFiltersCount: number;\n resultCount: number;\n searchInProgress: boolean;\n};\n\n// This is temporary for showing the UX for the page.\n// Will replace with the real data later\nconst fakeSearchResultData = [\n {\n id: '1',\n imageUrl: 'https://www.shutterstock.com/image-photo/lovely-bunny-easter-fluffy-baby-600nw-2493059551.jpg',\n cameraName: 'Camera 1',\n dateTime: new Date()\n },\n {\n id: '2',\n imageUrl:\n 'https://www.doi.gov/sites/default/files/content_images//uploads/hawksbill_sea_turtle_-_usfws_southeast_-_photo_by_caroline_s._rogers.jpg',\n cameraName: 'Camera 2',\n dateTime: new Date(Date.now() - 1000 * 60 * 30)\n },\n {\n id: '3',\n imageUrl: 'https://a-z-animals.com/media/2018/09/Frog-tree.jpg',\n cameraName: 'Camera 3',\n dateTime: new Date(Date.now() - 1000 * 60 * 60)\n },\n {\n id: '4',\n imageUrl:\n 'https://images.pexels.com/photos/1108099/pexels-photo-1108099.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500',\n cameraName: 'Camera 4',\n dateTime: new Date(Date.now() - 1000 * 60 * 100)\n },\n {\n id: '5',\n imageUrl: 'https://www.shutterstock.com/image-photo/lovely-bunny-easter-fluffy-baby-600nw-2493059551.jpg',\n cameraName: 'Camera 5',\n dateTime: new Date(Date.now() - 1000 * 60 * 150)\n },\n {\n id: '6',\n imageUrl:\n 'https://www.doi.gov/sites/default/files/content_images//uploads/hawksbill_sea_turtle_-_usfws_southeast_-_photo_by_caroline_s._rogers.jpg',\n cameraName: 'Camera 6',\n dateTime: new Date(Date.now() - 1000 * 60 * 250)\n },\n {\n id: '7',\n imageUrl: 'https://a-z-animals.com/media/2018/09/Frog-tree.jpg',\n cameraName: 'Camera 7',\n dateTime: new Date(Date.now() - 1000 * 60 * 1200)\n },\n {\n id: '8',\n imageUrl:\n 'https://images.pexels.com/photos/1108099/pexels-photo-1108099.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500',\n cameraName: 'Camera 8',\n dateTime: new Date(Date.now() - 1000 * 60 * 1300)\n },\n {\n id: '9',\n imageUrl: 'https://www.shutterstock.com/image-photo/lovely-bunny-easter-fluffy-baby-600nw-2493059551.jpg',\n cameraName: 'Camera 9',\n dateTime: new Date(Date.now() - 1000 * 60 * 1500)\n },\n {\n id: '10',\n imageUrl:\n 'https://www.doi.gov/sites/default/files/content_images//uploads/hawksbill_sea_turtle_-_usfws_southeast_-_photo_by_caroline_s._rogers.jpg',\n cameraName: 'Camera 10',\n dateTime: new Date(Date.now() - 1000 * 60 * 1525)\n },\n {\n id: '11',\n imageUrl: 'https://a-z-animals.com/media/2018/09/Frog-tree.jpg',\n cameraName: 'Camera 11',\n dateTime: new Date(Date.now() - 1000 * 60 * 1600)\n },\n {\n id: '12',\n imageUrl:\n 'https://images.pexels.com/photos/1108099/pexels-photo-1108099.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500',\n cameraName: 'Camera 12',\n dateTime: new Date(Date.now() - 1000 * 60 * 1662)\n }\n];\n\nexport type AppearanceSearchResult = {\n id: string;\n imageUrl: string;\n cameraName: string;\n dateTime: Date;\n};\n\nexport default class AppearanceSearchResultsController extends SvrTimelineController {\n declare model: ModelFrom;\n\n /*\n * How many filters are currently applied in the selected search\n */\n @tracked appliedFiltersCount = 4;\n\n /**\n * The confidence level to tell the object detection for matching\n */\n @tracked confidence = 5;\n\n /**\n * If the player (svr playback features) is visible, otherwise we are looking at the search results\n */\n @tracked playerIsVisible = false;\n\n /**\n * How many results are returned so far\n */\n @tracked resultCount = 0;\n\n /**\n * If a search is currently in progress\n */\n @tracked searchInProgress = true;\n\n /**\n * The search results given the parameters entered by the user\n */\n @tracked searchResults: AppearanceSearchResult[] = fakeSearchResultData;\n\n /**\n * If we should show the appearance search sidebar\n */\n @tracked showSearchSidebar = false;\n\n /**\n * If we are using small tile mode (more tiles displayed) vs large tile mode for search results\n */\n @tracked usingSmallTileMode = true;\n\n /**\n * Various data for this page which we pass down to svr playback features\n */\n @computed('resultCount')\n get appearanceSearchDataObject(): AppearanceSearchDataObject {\n const { appliedFiltersCount, resultCount, searchInProgress } = this;\n\n return {\n appliedFiltersCount,\n resultCount,\n searchInProgress\n };\n }\n\n /**\n * Set various initializing properties/actions\n */\n @action async initialize(): Promise {\n // this is temporary code. Since we dont have an API to connect this to, we're just going to make our data\n // change every second.\n for (let i = 0; i < 1000; i++) {\n this.resultCount++;\n\n if (i % 3 === 1) {\n this.appliedFiltersCount++;\n }\n\n if (this.resultCount > 99) {\n this.resultCount = 0;\n }\n\n if (this.appliedFiltersCount > 10) {\n this.appliedFiltersCount = 0;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n /**\n * Loads the selected clip in the player\n */\n @action playSelectedClip(resultId: string): void {\n // todo: will build the feature for playing the clip later\n console.log({ resultId });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/appearance-search-results': AppearanceSearchResultsController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoAppearanceSearchResults } from '../../enums/CustomerPageUrl';\nimport SvrTimelineRoute from '../svr-timeline/route';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type { SelectedOption } from 'customer-site/components/video/appearance-search/search-sidebar/index';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { BasePlaybackModel } from '../base-playback-route';\n\ninterface AppearanceSearchResultsModel extends BasePlaybackModel {\n cameraIds: string[];\n svrCameras: Camera[];\n selectedOptions?: SelectedOption[];\n startDate?: Date;\n endDate?: Date;\n}\n\ntype AppearanceSearchResultsParams = {\n startDate?: string;\n endDate?: string;\n selectedOptions?: string;\n // queryParams needed for BasePlayback\n cameraGroupId?: number;\n cameraId?: string;\n relay?: string;\n startTime?: Date;\n timeInterval?: number;\n};\n\n/**\n * @classdesc\n * A route for showing the results of appearance searches\n */\nexport default class AppearanceSearchResults extends SvrTimelineRoute {\n @service declare store: ServiceRegistry['store'];\n\n /** @override */\n queryParams = {\n startDate: { replace: true },\n endDate: { replace: true },\n selectedOptions: { replace: true },\n // These are BasePlayback params\n cameraGroupId: { replace: true },\n cameraId: { replace: true },\n relay: { replace: true },\n startTime: { replace: true },\n timeInterval: { replace: true, type: 'number' }\n };\n\n routeId = EmberVideoAppearanceSearchResults;\n\n async model(params: AppearanceSearchResultsParams): Promise {\n const playbackModel = await super.model(params);\n\n const { cameraId, startDate, endDate, selectedOptions } = this.paramsFor(\n this.routeName\n ) as AppearanceSearchResultsParams;\n\n const svrCameras = playbackModel.cameras.filterBy('hasSvrSchedule');\n\n const childModel = {\n cameraIds: cameraId ? JSON.parse(cameraId) : undefined,\n startDate: startDate ? new Date(startDate) : undefined,\n endDate: endDate ? new Date(endDate) : undefined,\n selectedOptions: selectedOptions ? JSON.parse(selectedOptions) : undefined,\n svrCameras\n };\n\n return { ...playbackModel, ...childModel };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { computed, action, set, setProperties } from '@ember/object';\nimport { alias, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { task } from 'ember-concurrency';\nimport { pluralize } from 'ember-inflector';\nimport { Heatmap } from 'customer-site/enums/OvlRuleType';\nimport { HeatMapMetricIndex } from 'customer-site/models/activity/heat-map-metric';\nimport { downloadCrossOriginImage } from '@adc/ui-components/utils/download-file';\nimport { default as DropdownSelectItem, SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\nimport { isDate, isEqual } from 'date-fns';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { default as HeatMapMetric } from 'customer-site/models/activity/heat-map-metric';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { HeatMapParameter } from 'customer-site/transforms/heat-map-parameter';\nimport type {\n ComparisonHeatMaps,\n HeatMap,\n HeatMapEditValues,\n HeatMapIndex,\n HeatMaps\n} from './helper-objects/heat-maps';\nimport type { HeatMappingModel } from './route';\n\n// #region Helper Functions\n\n/**\n * Requests a static or time lapse heat map.\n */\nexport async function makeHeatMapRequest(ajax: AjaxService, queryValues: string[]): Promise {\n return await ajax.apiRequestForValue(`activity/heat-map?${queryValues.join('&')}`);\n}\n\n/**\n * Requests a static or time lapse heat map as a comparison.\n */\nasync function makeHeatMapComparisonRequest(ajax: AjaxService, queryValues: string[]): Promise {\n return await ajax.apiRequestForValue(`activity/heat-map/comparison?${queryValues.join('&')}`);\n}\n\n/**\n * Constructs all the information needed to display a heat map.\n */\nexport function buildHeatMaps(\n editValues: HeatMapEditValues,\n cameras: OvReadyCamera[],\n queryValues: string[],\n requestValue: HeatMap\n): HeatMaps {\n return {\n ...getCameraAndRuleName(cameras, editValues.cameraId),\n startDate: editValues.startDate,\n endDate: editValues.endDate,\n downloadRequest: queryValues.concat('isDownload=true'),\n heatMapList: requestValue.heatMapUrlInfos.map((heatMapUrlInfo) => ({\n url: heatMapUrlInfo.heatMapUrl,\n hasRendered: false,\n failedToLoad: false,\n ruleSnapshotIndex: heatMapUrlInfo.ruleSnapshotIndex ?? 0\n })),\n ruleSnapshotList: requestValue.ruleSnapshotUrls.map((ruleSnapshotUrl) => ({\n ruleSnapshotUrl,\n hasRendered: false,\n failedToLoad: false\n }))\n };\n}\n\n/**\n * Gets the camera description and the heat map rule name for the currently selected camera.\n *\n * @private\n */\nfunction getCameraAndRuleName(cameras: OvReadyCamera[], cameraId: string): { ruleName: string; cameraName: string } {\n const camera = cameras.findBy('id', cameraId);\n return {\n cameraName: camera?.description ?? '',\n ruleName: camera?.ovRules.findBy('ruleType', Heatmap)?.name ?? ''\n };\n}\n\n// #endregion\n\nexport const MIN_GROUP_BY = 15,\n HEAT_MAP_CONFIG_PARAMETERS: HeatMapIndex[] = ['cameraId', 'startDate', 'endDate'];\n\ntype HeatMapEditValuesIndex = 'editValues' | 'secondEditValues';\ntype RuleHasMinDurationIndex = 'ruleHasMinDuration' | 'secondRuleHasMinDuration';\ntype SharedParamIndex = HeatMapMetricIndex.IncludeLowActivity | HeatMapMetricIndex.IsTimeLapse;\n\n/**\n * @classdesc View Heat Map page Controller\n */\nexport default class HeatMapController extends EmberController {\n @service declare ajax: AjaxService;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare navigation: NavigationService;\n\n declare model: Promise;\n\n /**\n * Query param.\n */\n queryParams = ['redirectedFromRouteId'];\n redirectedFromRouteId?: string;\n\n // #region Component state.\n\n /**\n * Whether the viewing options are expanded.\n */\n @tracked showViewingOptions = false;\n\n /**\n * Whether we are in single or comparison view.\n */\n @alias('heatMapMetrics.isComparison')\n declare isComparison: boolean;\n\n /**\n * Whether to include areas of low activity.\n */\n @alias('heatMapMetrics.includeLowActivity')\n declare includeLowActivity: boolean;\n\n /**\n * Whether we are in single image or time lapse mode.\n */\n @alias('heatMapMetrics.isTimeLapse')\n declare isTimeLapse: boolean;\n\n /**\n * The resolved collection of cameras.\n */\n declare cameras: OvReadyCamera[];\n\n /**\n * The resolved heat map metrics from the users previous session.\n */\n declare heatMapMetrics: HeatMapMetric;\n\n /**\n * Holds the required values for the non-comparison heat map.\n */\n declare editValues: HeatMapEditValues;\n\n /**\n * Whether the single heat map rule has existed long enough to get heat maps.\n */\n @tracked declare ruleHasMinDuration: boolean;\n\n /**\n * Holds the query values for the second heat map in the comparison.\n */\n declare secondEditValues: HeatMapEditValues;\n\n /**\n * Whether the second comparison heat map rule has existed long enough to get heat maps.\n */\n @tracked declare secondRuleHasMinDuration: boolean;\n\n /**\n * Information about the heat maps retrieved.\n */\n @reads('loadHeatMapTask.last.value')\n declare heatMaps: HeatMaps;\n\n /**\n * Holds the urls for last heat maps retrieved for comparison.\n */\n @reads('loadHeatMapComparisonTask.last.value')\n declare comparisonHeatMaps: ComparisonHeatMaps;\n\n /**\n * Whether any of the available cameras have a heat map rule.\n */\n @tracked declare hasHeatMapRule: boolean;\n\n /**\n * Whether this is the first heat map request.\n */\n isFirstRequest = true;\n\n /**\n * Whether this is the first comparison heat map request.\n */\n isFirstComparisonRequest = true;\n\n // #endregion\n\n // #region Computed properties\n\n /**\n * Contains the dropdown items to choose the heat map view type (single view or compare view).\n */\n @computed('isComparison')\n get heatMapViewTypeDropdownList(): DropdownSelectItem[] {\n const { isComparison } = this;\n return [\n DropdownSelectItem.create({\n name: this.intl.tc(this, 'singleMap'),\n value: 'singleMap',\n state: isComparison ? UNSELECTED : SELECTED\n }),\n DropdownSelectItem.create({\n name: this.intl.tc(this, 'compareMap'),\n value: 'compareMap',\n state: isComparison ? SELECTED : UNSELECTED\n })\n ];\n }\n\n /**\n * Contains the dropdown items to choose the heat map type (single image or time lapse).\n */\n @computed('isTimeLapse')\n get heatMapTypeDropdownList(): DropdownSelectItem[] {\n const { isTimeLapse } = this;\n return [\n DropdownSelectItem.create({\n name: this.intl.tc(this, 'timeLapse'),\n value: 'timeLapse',\n state: isTimeLapse ? SELECTED : UNSELECTED\n }),\n DropdownSelectItem.create({\n name: this.intl.tc(this, 'singleImage'),\n value: 'singleImage',\n state: isTimeLapse ? UNSELECTED : SELECTED\n })\n ];\n }\n\n /**\n * Can the user currently request a heat map -> determined by a valid camera being selected.\n * And whether or not the heat map rule on the camera has existed for the minimum allowed time.\n */\n @computed(\n 'isComparison',\n 'editValues.cameraId',\n 'secondEditValues.cameraId',\n 'ruleHasMinDuration',\n 'secondRuleHasMinDuration'\n )\n get canShowHeatMaps(): boolean {\n const { editValues, secondEditValues } = this;\n if (this.isComparison) {\n return (\n !!editValues.cameraId &&\n this.ruleHasMinDuration &&\n !!secondEditValues.cameraId &&\n this.secondRuleHasMinDuration\n );\n }\n\n return !!editValues.cameraId && this.ruleHasMinDuration;\n }\n\n /**\n * Whether or not the Playback section or a loading spinner is shown.\n * Determined by whether or not the appropriate load heat map task is running.\n */\n @computed(\n 'heatMapMetrics.isComparison',\n 'loadHeatMapComparisonTask.isIdle',\n 'loadHeatMapTask.isIdle',\n 'comparisonHeatMaps',\n 'heatMaps'\n )\n get areHeatMapsLoaded(): boolean {\n return this.heatMapMetrics?.isComparison\n ? this.loadHeatMapComparisonTask.isIdle && !!this.comparisonHeatMaps\n : this.loadHeatMapTask.isIdle && !!this.heatMaps;\n }\n\n /**\n * The keys for heat map request values determined by the sliders.\n */\n get sharedParameters(): SharedParamIndex[] {\n return [HeatMapMetricIndex.IncludeLowActivity, HeatMapMetricIndex.IsTimeLapse];\n }\n\n // #endregion\n\n // #region Tasks\n\n /**\n * Loads the heat map based on the current query parameter values.\n */\n loadHeatMapTask = task({ restartable: true }, async () => {\n // Are any required query parameters missing?\n if (this.checkValues(this.editValues, this.ruleHasMinDuration)) {\n return undefined;\n }\n\n const { editValues } = this,\n heatMapConfigValues = this.getConfigValues(editValues, false),\n heatMapTypeValues = this.getTypeValues(this, this.sharedParameters);\n\n try {\n const queryValues = [...heatMapConfigValues, ...heatMapTypeValues],\n src = await makeHeatMapRequest(this.ajax, queryValues);\n this.saveHeatMapMetrics();\n return buildHeatMaps(editValues, this.cameras, queryValues, src);\n } catch (ex) {\n this.notificationManager.addError(ex.errors[0].detail);\n return undefined;\n }\n });\n\n /**\n * Loads the two heat maps for comparison based on the parameter values.\n */\n loadHeatMapComparisonTask = task({ restartable: true }, async () => {\n const { editValues, secondEditValues, sharedParameters } = this,\n cameras = this.cameras;\n\n if (\n this.checkValues(editValues, this.ruleHasMinDuration) ||\n this.checkValues(secondEditValues, this.secondRuleHasMinDuration)\n ) {\n return undefined;\n }\n\n const firstConfigValues = this.getConfigValues(editValues),\n secondConfigValues = this.getConfigValues(secondEditValues),\n sharedConfigValues = this.getTypeValues(this, sharedParameters),\n queryValues = [...firstConfigValues, ...secondConfigValues, ...sharedConfigValues];\n\n try {\n const [firstHeatMapSrc, secondHeatMapSrc] = await makeHeatMapComparisonRequest(this.ajax, queryValues);\n this.saveHeatMapMetrics();\n return {\n firstHeatMaps: buildHeatMaps(editValues, cameras, queryValues, firstHeatMapSrc),\n secondHeatMaps: buildHeatMaps(secondEditValues, cameras, queryValues, secondHeatMapSrc)\n };\n } catch (ex) {\n this.notificationManager.addError(ex.errors[0].detail);\n return undefined;\n }\n });\n\n // #endregion\n\n // #region Actions\n\n /**\n * Handles setting the controller properties once the model has loaded.\n */\n @action\n dataLoaded(resolvedModel: HeatMappingModel) {\n const { heatMapMetrics, cameras } = resolvedModel;\n setProperties(this, {\n cameras,\n heatMapMetrics,\n hasHeatMapRule: !!heatMapMetrics.heatMapParameters.cameraId,\n editValues: { ...heatMapMetrics.heatMapParameters },\n secondEditValues: { ...heatMapMetrics.secondHeatMapParameters }\n });\n }\n\n /**\n * Retrieves a heat map based on the current metric values.\n */\n @action\n loadHeatMap(): void {\n (this.isComparison ? this.loadHeatMapComparisonTask : this.loadHeatMapTask).perform();\n }\n\n /**\n * Updates the edit values for the heat map selectors based on user input.\n */\n @action\n updateEditValues(editValueProperty: HeatMapEditValuesIndex, editValues: HeatMapEditValues): void {\n setProperties(this[editValueProperty], editValues);\n }\n\n /**\n * Sets the appropriate heat map type value and requests a new heat map\n */\n @action\n updateHeatMapTypeValue(key: HeatMapMetricIndex, value: boolean): void {\n const { heatMapMetrics } = this;\n if (heatMapMetrics[key] !== value) {\n set(heatMapMetrics, key, value);\n this.loadHeatMap();\n }\n }\n\n /**\n * Updates the isTimeLapse value based on the users selection of the heat map type.\n */\n @action\n updateHeatMapTypeDropdown(value: string): void {\n this.updateHeatMapTypeValue(HeatMapMetricIndex.IsTimeLapse, value === 'timeLapse');\n }\n\n /**\n * Updates the isComparison value based on the users selection of the heat map view type.\n */\n @action\n updateHeatMapViewDropdown(value: string): void {\n this.updateHeatMapTypeValue(HeatMapMetricIndex.IsComparison, value === 'compareMap');\n }\n\n /**\n * Toggles the includeLowActivity value.\n */\n @action\n updateIncludeLowActivity(): void {\n this.updateHeatMapTypeValue(HeatMapMetricIndex.IncludeLowActivity, !this.includeLowActivity);\n }\n\n /**\n * Updates the proper ruleHasMinDuration and then triggers the heat map loading.\n */\n @action\n updateRuleHasMinDuration(key: RuleHasMinDurationIndex, value: boolean, shouldLoadHeatMaps: boolean): void {\n this[key] = value;\n if (this.isComparison) {\n const hasMinDuration = this.ruleHasMinDuration && this.secondRuleHasMinDuration;\n if (this.isFirstComparisonRequest && shouldLoadHeatMaps && hasMinDuration) {\n this.isFirstComparisonRequest = false;\n this.loadHeatMap();\n }\n } else {\n if (this.isFirstRequest && shouldLoadHeatMaps) {\n this.isFirstRequest = false;\n this.loadHeatMap();\n }\n }\n }\n\n /**\n * Set playback speed tick.\n */\n @action\n setSpeedTick(idx: number): void {\n set(this.heatMapMetrics, 'playbackSpeedTick', idx);\n }\n\n /**\n * Downloads the static heat map image.\n */\n @action\n downloadHeatMap(): void {\n try {\n const { ajax, isComparison, comparisonHeatMaps, heatMaps } = this;\n (async () => {\n if (isComparison) {\n const { firstHeatMaps } = comparisonHeatMaps,\n heatMapInfos = await makeHeatMapComparisonRequest(ajax, firstHeatMaps.downloadRequest),\n firstHeatMapInfo = heatMapInfos[0]?.heatMapUrlInfos ?? [],\n secondHeatMapInfo = heatMapInfos[1]?.heatMapUrlInfos ?? [];\n await downloadCrossOriginImage(\n firstHeatMapInfo[0]?.heatMapUrl,\n this.getDownloadName(firstHeatMaps)\n );\n await downloadCrossOriginImage(\n secondHeatMapInfo[0]?.heatMapUrl,\n this.getDownloadName(comparisonHeatMaps.secondHeatMaps)\n );\n } else {\n const heatMapInfo =\n (await makeHeatMapRequest(ajax, heatMaps.downloadRequest))?.heatMapUrlInfos ?? [];\n await downloadCrossOriginImage(heatMapInfo[0]?.heatMapUrl, this.getDownloadName(heatMaps));\n }\n })();\n } catch (ex) {\n this.notificationManager.addError(this.intl.tc(this, 'failedToDownloadHeatMap'));\n }\n }\n\n // #endregion\n\n // #region Helpers\n\n /**\n * Checks to make sure the required query parameters are present.\n * Returns true if a value is missing or the request should not be made.\n */\n private checkValues(editValues: HeatMapEditValues, ruleHasMinDuration: boolean): boolean {\n const { cameraId, startDate, endDate } = editValues;\n return [cameraId, startDate, endDate].some(isEmpty) || !ruleHasMinDuration;\n }\n\n /**\n * Formats the heat map request values to something parsable by the api.\n */\n private getConfigValues(editValues: HeatMapEditValues, asArrayValues = true): string[] {\n return HEAT_MAP_CONFIG_PARAMETERS.map((key) => {\n let value = editValues[key];\n if (value && isDate(value)) {\n value = (value as Date).toISOString();\n }\n\n return value !== undefined ? `${asArrayValues ? pluralize(key) : key}=${value}` : undefined;\n }).compact();\n }\n\n /**\n * Formats the shared values for the heat map request.\n */\n private getTypeValues(editValues: HeatMapController, parameters: SharedParamIndex[]): string[] {\n return parameters\n .map((key) => {\n const value = editValues[key];\n return value !== undefined ? `${key}=${value}` : undefined;\n })\n .compact();\n }\n\n /**\n * Saves the heatMapMetrics model if any of the values have been changed.\n */\n private saveHeatMapMetrics() {\n const { heatMapMetrics } = this;\n\n if (heatMapMetrics.get('hasDirtyAttributes') || this.parametersHaveChanged(heatMapMetrics)) {\n heatMapMetrics.save();\n }\n }\n\n /**\n * Checks if any of the relevant heat map parameters have changed.\n */\n private parametersHaveChanged(heatMapMetrics: HeatMapMetric) {\n if (heatMapMetrics.isComparison) {\n return (\n this.checkDirtyParameters(heatMapMetrics.heatMapParameters, this.editValues) ||\n this.checkDirtyParameters(heatMapMetrics.secondHeatMapParameters, this.secondEditValues)\n );\n }\n\n return this.checkDirtyParameters(heatMapMetrics.heatMapParameters, this.editValues);\n }\n\n /**\n * Checks if any of the parameter attributes have been changed and updates them if so.\n */\n private checkDirtyParameters(heatMapParameters: HeatMapParameter, editValues: HeatMapEditValues) {\n const hasDirtyParameters =\n heatMapParameters.cameraId !== editValues.cameraId ||\n !isEqual(heatMapParameters.startDate, editValues.startDate) ||\n !isEqual(heatMapParameters.endDate, editValues.endDate);\n if (hasDirtyParameters) {\n setProperties(heatMapParameters, editValues);\n }\n\n return hasDirtyParameters;\n }\n\n /**\n * Formats the download name for a heat map image.\n */\n private getDownloadName(heatMaps: HeatMaps): string {\n const { intl } = this,\n getDownloadSafeDate = (date: Date): string =>\n intl\n .formatDateTz(date, {\n format: 'shortDateTimeFormat'\n })\n // Replace '/' and ':' with safe characters.\n .replace(/\\//g, '-')\n .replace(/:/g, '꞉');\n return intl.tc(this, 'downloadName', {\n cameraName: heatMaps.cameraName,\n startDate: getDownloadSafeDate(heatMaps.startDate),\n endDate: getDownloadSafeDate(heatMaps.endDate)\n });\n }\n\n // #endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/business-activity-analytics/heat-mapping': HeatMapController;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/business-activity-analytics/heat-mapping': HeatMapController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoBusinessActivityAnalyticsHeatMapping } from 'customer-site/enums/CustomerPageUrl';\nimport { Heatmap } from 'customer-site/enums/OvlRuleType';\nimport { asyncFind } from 'customer-site/utils/general';\nimport AdcBaseRoute from '../../../classes/base-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type HeatMapMetric from 'customer-site/models/activity/heat-map-metric';\nimport type System from 'customer-site/models/systems/system';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type HeatMapController from './controller';\n\nexport type HeatMappingModel = {\n cameras: OvReadyCamera[];\n heatMapMetrics: HeatMapMetric;\n};\n\n/**\n * @classdesc The route for displaying the Heat Map page\n */\nexport default class HeatMappingRoute extends AdcBaseRoute {\n routeId = EmberVideoBusinessActivityAnalyticsHeatMapping;\n\n queryParams = {\n redirectedFromRouteId: { replace: true }\n };\n\n beforeModel(transition: Transition) {\n // Update route ID when mirroring from BAA home page.\n const { redirectedFromRouteId } = this.paramsFor(this.routeName) as { redirectedFromRouteId?: string };\n\n // If we are mirroring this page from another, then we need to override the route id.\n if (redirectedFromRouteId) {\n this.routeId = parseInt(redirectedFromRouteId);\n }\n\n return super.beforeModel(transition);\n }\n\n model(): Promise {\n const selectedSystem = this.identityManager.getSelectedSystem(),\n cameras = this.store.findAll('video/devices/ov-ready-camera'),\n heatMapMetrics = selectedSystem.then(\n (system: System): Promise =>\n this.store.findRecord(\n 'activity/heat-map-metric',\n `${this.identityManager.identityModel?.id}-${system.unitId}`\n )\n );\n\n return Promise.all([cameras, heatMapMetrics]).then(async ([cameras, heatMapMetrics]) => {\n const camerasSupportingHeatMaps = cameras.filter((c) => c.supportedRuleTypes.includes(Heatmap));\n await this.validateCameraIds(heatMapMetrics, camerasSupportingHeatMaps);\n return {\n cameras: camerasSupportingHeatMaps,\n heatMapMetrics\n };\n });\n }\n\n resetController(controller: HeatMapController, isExiting: boolean) {\n if (controller && isExiting) {\n controller.setProperties({\n redirectedFromRouteId: undefined,\n isFirstRequest: true,\n isFirstComparisonRequest: true,\n showViewingOptions: false\n });\n }\n }\n\n /**\n * Stop all of the tasks when leaving the page.\n */\n @action\n willTransition() {\n const { loadHeatMapTask, loadHeatMapComparisonTask } = this.controller as HeatMapController;\n loadHeatMapTask.cancelAll();\n loadHeatMapComparisonTask.cancelAll();\n }\n\n // #region helpers\n\n /**\n * Checks all of the passed in/saved cameraIds and confirms the camera exists and has a heat map rule,\n * or sets the first valid cameraId.\n */\n private async validateCameraIds(heatMapMetrics: HeatMapMetric, cameras: OvReadyCamera[]) {\n const defaultCamera = await asyncFind(cameras, this.hasHeatMapRule),\n allParameters = [heatMapMetrics.heatMapParameters, heatMapMetrics.secondHeatMapParameters];\n for (let i = 0; i < allParameters.length; i++) {\n allParameters[i].cameraId =\n (await this.validateCameraId(allParameters[i].cameraId, cameras)) ?? defaultCamera?.id ?? '';\n }\n }\n\n /**\n * Checks whether the camera has an existing heat map rule.\n */\n private async hasHeatMapRule(camera: OvReadyCamera) {\n return (await camera.ovRules).any((rule) => rule.ruleType === Heatmap);\n }\n\n /**\n * Checks whether the passed in id is valid and returns a default id if it is not.\n */\n private async validateCameraId(cameraId: string, cameras: OvReadyCamera[]) {\n if (cameraId) {\n const selectedCamera = cameras.findBy('id', cameraId);\n if (selectedCamera && (await this.hasHeatMapRule(selectedCamera))) {\n return cameraId;\n }\n }\n\n return undefined;\n }\n\n // #endregion\n}\n","import EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberVideoBusinessActivityAnalyticsRule,\n EmberVideoBusinessActivityAnalyticsRuleList\n} from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n *\n * Controller for the BAA camera selection route.\n *\n * @class video.business-activity-analytics.index.Controller\n * @extends Ember.Controller\n */\nexport default class Controller extends EmberController {\n @service contextManager;\n @service intl;\n\n // region Actions\n\n /**\n * Transitions the user to the rule selection page based on the selected camera\n */\n @action\n async transitionToRuleSelection() {\n // The camera selection component updates model.rule based on the selection, so we can get the camera id from there.\n const cameraId = this.model.rule.camera.get('id');\n\n // On the mobile app, we skip the rule list page and go to the first open rule slot.\n if (this.contextManager.identityModel.isMobileApp) {\n // Find the first available rule slot, if there is one.\n // Note that all rule slots will be between one and three.\n const existingRuleIds = this.model.rule.camera.get('ovRules').filterBy('id').mapBy('id'),\n allPossibleRuleIds = [1, 2, 3].map((id) => `${cameraId}_${id}`),\n availableRuleIds = allPossibleRuleIds.filter((id) => !existingRuleIds.includes(id)),\n ruleId = availableRuleIds[0];\n\n // If there is an open rule slot, go straight to that rule's edit page.\n if (ruleId) {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n EmberVideoBusinessActivityAnalyticsRule,\n undefined,\n undefined,\n ruleId\n );\n return;\n }\n\n // If there are no open rules slots, transition back a page.\n // This should never happen since the camera selector handles this for us, but we should check just in case.\n this.contextManager.transitionToPreviousRoute();\n return;\n }\n\n // On web, we transition to the rule list page.\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberVideoBusinessActivityAnalyticsRuleList, { cameraId });\n }\n\n /**\n * Transitions back to the previous route.\n */\n @action\n cancel() {\n this.contextManager.transitionToPreviousRoute();\n }\n\n // endregion\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport AdcBaseRoute from '../../../classes/base-route';\nimport { EmberVideoBusinessActivityAnalytics } from '../../../enums/CustomerPageUrl';\n\n/**\n * @classdesc Business Activity Analytics index subroute - Allows the user to select an OV-ready camera.\n *\n * @class video.business-activity-analytics.Route\n * @extends classes.BaseRoute\n */\nexport default class Route extends AdcBaseRoute {\n @service contextManager;\n @service store;\n\n /** @override */\n routeId = EmberVideoBusinessActivityAnalytics;\n\n /** @override */\n skipWhenTransitioningBack = true;\n\n model() {\n return {\n cameras: this.store.findAll('video/devices/ov-ready-camera'),\n rule: this.store.createRecord('video/ov-rule')\n };\n }\n\n /**\n * Only show BAA cameras.\n *\n * @override\n */\n async afterModel(model) {\n // Filter out any cameras that don't support BAA.\n model.cameras = (await model.cameras).filterBy('supportsBusinessActivityAnalytics');\n }\n\n @action\n willTransition() {\n // Unload the temporary rule model that we passed to the camera selection component.\n this.store.unloadRecord(this.currentModel.rule);\n }\n}\n","import { EmberBusinessActivityAnalyticsReports } from 'customer-site/enums/CustomerPageUrl';\nimport { BusinessActivityAnalytics } from 'customer-site/enums/WebReportType';\nimport BaseReportsRoute from 'customer-site/home/base-reports-route';\n\nexport default class VideoBusinessActivityAnalyticsReports extends BaseReportsRoute {\n routeId = EmberBusinessActivityAnalyticsReports;\n\n getReportType() {\n return BusinessActivityAnalytics;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoBusinessActivityAnalyticsRuleGroupList } from 'customer-site/enums/CustomerPageUrl';\nimport { checkForBaaPackages } from 'customer-site/video/business-activity-analytics/rule-group/route';\n\n/**\n * @classdesc\n *\n * Sets up the controller for the index page that lists all the rule groups on the selected customer.\n */\nexport default class OvRuleGroupListRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoBusinessActivityAnalyticsRuleGroupList;\n\n @service contextManager;\n @service notificationManager;\n @service intl;\n @service store;\n @service('video.analytics-firmware-manager') analyticsFirmwareManager;\n\n model() {\n return {\n ruleGroups: this.store.findAll('video/ov-rule-group'),\n hasBAAWritePermission: this.ajax\n .apiRequest('video/ovRules/HasBusinessActivityAnalyticsWritePermission')\n .then((response) => response.value.booleanFlag)\n };\n }\n\n /** @override */\n async afterModel(model) {\n const cameras = await this.store.findAll('video/devices/ov-ready-camera'),\n { contextManager } = this;\n\n checkForBaaPackages.call(this, model, cameras, contextManager.transitionToPreviousRoute, true);\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.ruleListUrl}}\\n

{{tc this \\'ruleGroupHeaderWithLink\\' ruleType=@ruleTypeText link=(href-to \\'video.business-activity-analytics.rule-list\\') htmlSafe=true}}

\\n {{else}}\\n

{{tc this \\'ruleGroupHeader\\' ruleType=@ruleTypeText}}

\\n {{/if}}\\n

{{tc this \\'whichRules\\'}}

\\n \\n \\n \\n\\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-rule-group-selection/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoBusinessActivityAnalyticsRuleList } from 'customer-site/enums/CustomerPageUrl';\nimport { intlPath } from '@adc/i18n/path';\nimport CheckboxTreeItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit the selection of rules to include in an OV rule group.\n *\n * @param {models.video.OvRuleGroup} ruleGroup The rule group to be edited.\n */\n@intlPath({ path: 'video/advanced-analytics/edit-rule-ui/edit-rule-group-selection' })\nexport default class EditRuleGroupSelection extends Component {\n @service contextManager;\n @service store;\n @service router;\n @service intl;\n\n /**\n * The rule group to be edited.\n *\n * @type {models.video.OvRuleGroup}\n */\n @alias('args.ruleGroup')\n ruleGroup;\n\n /**\n * The url to link to the rule list page.\n *\n * @returns {string}\n */\n @computed()\n get ruleListUrl() {\n const { contextManager } = this,\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n routeItem = contextManager.getRouteItem(EmberVideoBusinessActivityAnalyticsRuleList);\n\n // Realistically, anyone who can see Rule Group page should be able to see the Rule List page,\n // but a little extra security never hurts.\n return routeItem ? this.router.urlFor(routeItem.url) : '';\n }\n\n /**\n * Loads the rules on the customer of the type we want.\n *\n * @returns {Promise>}\n */\n @computed('ruleGroup.ruleType')\n get availableRules() {\n return this.store.query('video/ovRule', { ruleType: this.ruleGroup.ruleType });\n }\n\n /**\n * Loads all the OvRule objects of the appropriate type on all cameras in the unit and groups them by camera name.\n *\n * @returns {Promise>}\n */\n rulesByCamera = (async () => {\n // First things first, load the rules.\n const rules = await this.availableRules;\n\n // Next, group them by id (since cameras can have the same name).\n // This will return a dictionary where the key is the camera id\n // and the value is an array of OvRule objects on that camera.\n const cameraGroups = rules.reduce((rulesByCamera, rule) => {\n // Get the existing list of rules on this camera or make a new empty list.\n const cameraId = rule.camera.get('id'),\n cameraGroup = rulesByCamera[cameraId] || [];\n\n // Add this rule to the list and update the dictionary.\n cameraGroup.push(rule);\n rulesByCamera[cameraId] = cameraGroup;\n return rulesByCamera;\n }, {});\n\n // Now make a checkbox tree with sections for each camera.\n const rulesByCamera = [];\n for (const cameraId of Object.keys(cameraGroups)) {\n // The camera relationship is an id-only relationship, so to get the description,\n // we have to wait for it to finish loading.\n const rules = cameraGroups[cameraId],\n camera = await rules.firstObject.camera,\n subitems = rules.map((rule) => {\n const state = this.ruleGroup.rules.any((ruleInGroup) => ruleInGroup.id === rule.id)\n ? SELECTED\n : UNSELECTED;\n return CheckboxTreeItem.create({\n name: rule.name,\n value: rule.id,\n state\n });\n }),\n parentItem = CheckboxTreeItem.create({\n name: camera.get('description'),\n value: camera,\n isSelectable: false,\n subitems\n });\n\n rulesByCamera.push(parentItem);\n }\n\n return rulesByCamera;\n })();\n\n /**\n * Sets the rules on the group model to the selected rules across all cameras.\n *\n * @param {Array} checkboxTree\n */\n @action\n async selectionChanged(checkboxTree) {\n const selectedRuleIds = checkboxTree\n .flatMap((parent) => parent.subitems)\n .filterBy('state', SELECTED)\n .mapBy('value'),\n allRules = await this.availableRules;\n\n this.ruleGroup.rules = allRules.filter((rule) => selectedRuleIds.includes(rule.id));\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n \\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-group-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport EditBusinessOccupancyUi from '../edit-business-occupancy-ui/index';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit a business occupancy rule group.\n *\n * @param {models.video.OvRuleGroup} rule The rule group to be edited.\n */\nexport default class EditBusinessOccupancyGroupUi extends EditBusinessOccupancyUi {\n /** @override */\n @computed()\n get ruleType() {\n return 'occupancy-and-people-counting-group';\n }\n\n /** @override */\n @computed()\n get missingCriteria() {\n return undefined;\n }\n\n /** @override */\n titleTextPath = 'components.video.advanced-analytics.edit-rule-ui.edit-rule.titleTextGroup';\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-people-counting-group-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport EditPeopleCountingUi from '../edit-people-counting-ui/index';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit a people counting rule group.\n *\n * @param {models.video.OvRuleGroup} rule The rule group to be edited.\n */\nexport default class EditPeopleCountingGroupUi extends EditPeopleCountingUi {\n /** @override */\n @computed()\n get ruleType() {\n return 'people-counting-group';\n }\n\n /** @override */\n titleTextPath = 'components.video.advanced-analytics.edit-rule-ui.edit-rule.titleTextGroup';\n}\n","import { computed } from '@ember/object';\nimport EditBusinessOccupancyGroupUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-group-ui/index';\nimport EditPeopleCountingGroupUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-people-counting-group-ui/index';\nimport { BusinessOccupancy, LineCount } from 'customer-site/enums/OvlRuleType';\nimport RuleEditController from '../rule/controller';\n\n/**\n * Maps rule types to their respective edit ui component paths.\n *\n * @type {{number: Component}}\n */\nexport const RuleGroupTypeEditUiPath = {\n [LineCount]: EditPeopleCountingGroupUi,\n [BusinessOccupancy]: EditBusinessOccupancyGroupUi\n};\n\n/**\n * @classdesc\n *\n * Controller for the rule group list route.\n */\nexport default class OvRuleGroupListController extends RuleEditController {\n /** @override */\n @computed('ruleType')\n get editUiComponentPath() {\n return RuleGroupTypeEditUiPath[this.ruleType];\n }\n}\n","import { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoBusinessActivityAnalyticsRuleGroup } from 'customer-site/enums/CustomerPageUrl';\nimport { navigateToCalibrationPageFlow } from 'customer-site/video/cameras/camera/controller';\nimport { hash } from 'rsvp';\n\n/**\n * Checks for the required OVReady packages to support BAA rule groups.\n *\n * @param model\n * @param cameras {Array}\n * @param doesNotSupportBaaAction {Function}\n * @param [isRuleGroupPage] {boolean}\n */\nexport function checkForBaaPackages(model, cameras, doesNotSupportBaaAction, isRuleGroupPage) {\n const baaSupportedCameras = cameras.filterBy('supportsBusinessActivityAnalytics'),\n packageCheckPropertyName = 'requiresOvReadyPackageUpdateForBaa' + (isRuleGroupPage ? 'Groups' : ''),\n { contextManager } = this;\n\n if (isEmpty(baaSupportedCameras)) {\n // If none of the selected cameras support BAA, transition back to the previous page.\n doesNotSupportBaaAction();\n return;\n }\n\n // Check for selected cameras that do support BAA but don't have OvReady installed.\n const camerasWithoutPackageInstalled = baaSupportedCameras.filterBy('hasOvReadyPackageInstalled', false);\n if (!isEmpty(camerasWithoutPackageInstalled)) {\n // For each uninstalled camera, prompt the user to install it and calibrate the camera.\n for (const selectedCamera in camerasWithoutPackageInstalled) {\n this.analyticsFirmwareManager.launchOvFirmwareUpgradeModalIfNecessary(\n selectedCamera,\n () => {\n // The package is now installed, so redirect to the calibration page.\n navigateToCalibrationPageFlow(selectedCamera, contextManager);\n },\n () => {\n // If the modal was canceled, then transition back to the settings page.\n contextManager.transitionBackToMobileAppOrPreviousRoute(model);\n },\n undefined,\n true,\n isRuleGroupPage\n );\n }\n }\n\n // Check for cameras that do support BAA but aren't calibrated.\n const camerasWithoutCalibration = baaSupportedCameras.filterBy('isCalibrationRequired');\n if (!isEmpty(camerasWithoutCalibration)) {\n // If any such cameras do exist, redirect the user to the calibration page for the first such camera.\n navigateToCalibrationPageFlow(camerasWithoutCalibration.firstObject, contextManager);\n this.notificationManager.addWarning(\n this.intl.t('video.business-activity-analytics.rule-list.cameraNeedsCalibration')\n );\n return;\n }\n\n // Check for cameras that do support BAA but have an older version installed.\n const camerasThatRequirePackageUpdate = baaSupportedCameras.filterBy(packageCheckPropertyName);\n if (!isEmpty(camerasThatRequirePackageUpdate)) {\n // If any are found, prompt the user to upgrade.\n for (const selectedCamera of camerasThatRequirePackageUpdate) {\n this.analyticsFirmwareManager.launchOvFirmwareUpgradeModalIfNecessary(\n selectedCamera,\n () => {\n // The package has been updated. If the camera was previously calibrated then we're done. If not, redirect user to\n // the calibration page\n navigateToCalibrationPageFlow(selectedCamera, contextManager);\n },\n () => {\n // If the modal was canceled, then transition back to the settings page.\n contextManager.transitionToPreviousRoute();\n },\n undefined,\n true,\n isRuleGroupPage\n );\n }\n }\n}\n\n/**\n * @classdesc\n *\n * Sets up the controller for the index page that lists all the rule groups on the selected customer.\n */\nexport default class OvRuleGroupRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoBusinessActivityAnalyticsRuleGroup;\n\n @service contextManager;\n @service notificationManager;\n @service intl;\n @service store;\n @service router;\n @service('video.analytics-firmware-manager') analyticsFirmwareManager;\n\n async model({ id_group }) {\n let ruleGroup;\n\n if (id_group === 'new') {\n const system = await this.identityManager.getSelectedSystem();\n ruleGroup = this.store.createRecord('video/ov-rule-group', { system, creatingNew: true });\n } else {\n ruleGroup = this.store.findRecord('video/ov-rule-group', id_group);\n }\n\n return hash({\n rule: ruleGroup,\n hasBusinessActivityAnalyticsWritePermission: this.ajax\n .apiRequest('video/ovRules/HasBusinessActivityAnalyticsWritePermission')\n .then((response) => response.value.booleanFlag)\n }).catch(() => {\n this.router.transitionTo('app-error');\n });\n }\n\n /** @override */\n async afterModel(model) {\n const cameras = await this.store.findAll('video/devices/ov-ready-camera'),\n { contextManager } = this;\n\n checkForBaaPackages.call(this, model, cameras, contextManager.transitionToPreviousRoute, true);\n }\n}\n","import EmberController from '@ember/controller';\nimport { computed, action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoBusinessActivityAnalyticsRuleList } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n *\n * Controller for the rule list route.\n *\n * @class video.business-activity-analytics.rule-list.Controller\n * @extends Ember.Controller\n */\nexport default class Controller extends EmberController {\n @service contextManager;\n @service identityManager;\n @service intl;\n\n // region Query params.\n\n queryParams = ['cameraId'];\n\n /**\n * The query param passed for selecting cameras.\n *\n * @type {string}\n */\n cameraId;\n\n // endregion\n\n // region Aliases\n\n /**\n * The CustomerPageUrlEnum of the current page.\n *\n * @type {number}\n */\n settingId = EmberVideoBusinessActivityAnalyticsRuleList;\n\n /**\n * The resolved collection of ov-ready cameras.\n *\n * @type {Array}\n */\n @alias('model.cameras')\n cameras;\n\n // endregion\n\n // region Computed properties\n\n /**\n * The currently selected camera.\n *\n * @returns {models.video.OvReadyCamera}\n */\n @computed('cameras', 'cameraId')\n get selectedCamera() {\n return this.cameras.findBy('id', this.cameraId);\n }\n\n /**\n * The unit-relative device id for the selected camera.\n *\n * @returns {number}\n */\n @computed('cameraId')\n get relativeCameraId() {\n return parseInt(this.cameraId.split('-')[1]);\n }\n\n // endregion\n\n // region Actions\n\n /**\n * Re-routes the user to this page with the new camera selected.\n *\n * @param relativeCameraId\n */\n @action\n async updateCamera(relativeCameraId) {\n const systemId = (await this.identityManager.getSelectedSystem()).unitId,\n cameraId = `${systemId}-${relativeCameraId}`;\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberVideoBusinessActivityAnalyticsRuleList, { cameraId });\n }\n\n /**\n * Re-routes the user to the appropriate settings page.\n *\n * @param settingsPageUrl\n */\n @action\n updateSettingSelection(settingsPageUrl) {\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n // endregion\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport {\n EmberVideoBusinessActivityAnalyticsRuleList,\n VideoCameraSettingsOverview\n} from 'customer-site/enums/CustomerPageUrl';\nimport { checkForBaaPackages } from 'customer-site/video/business-activity-analytics/rule-group/route';\n\n/**\n * @classdesc\n *\n * Sets up the controller for the index page that lists all the rules on the selected camera.\n */\nexport default class Route extends AdcBaseRoute {\n @service contextManager;\n @service navigation;\n @service router;\n @service notificationManager;\n @service intl;\n @service store;\n @service('video.analytics-firmware-manager') analyticsFirmwareManager;\n\n /** @override */\n routeId = EmberVideoBusinessActivityAnalyticsRuleList;\n\n /** @override */\n queryParams = {\n cameraId: {\n replace: true,\n refreshModel: true\n }\n };\n\n model(params) {\n return {\n cameras: this.store.findAll('video/devices/ov-ready-camera'),\n cameraId: params.cameraId,\n hasBAAWritePermission: this.ajax\n .apiRequest('video/ovRules/HasBusinessActivityAnalyticsWritePermission')\n .then((response) => response.value.booleanFlag),\n hasRecordingRulesWritePermission: this.ajax\n .apiRequest('video/ovRules/HasRecordingRulesWritePermission')\n .then((response) => response.value.booleanFlag)\n };\n }\n\n /**\n * Ensures a valid camera is selected.\n */\n async afterModel(model) {\n // filter out any cameras that don't support BAA.\n const cameras = (model.cameras = (await model.cameras).filterBy('supportsBusinessActivityAnalytics')),\n // Find the currently selected camera.\n selectedCamera = cameras.findBy('id', model.cameraId),\n doesNotSupportBaaAction = () => {\n const { contextManager } = this;\n\n // If none of the cameras supported BAA, go back to the settings page if we can or the previous page.\n // Note: this should never really happen.\n if (contextManager.identityModel.isMobileApp) {\n contextManager.transitionBackToMobileAppOrPreviousRoute();\n } else {\n this.navigation.transitionToRouteId(VideoCameraSettingsOverview);\n }\n };\n\n if (!cameras.length) {\n doesNotSupportBaaAction();\n } else if (!selectedCamera) {\n // If the selected camera doesn't support BAA, re-transition to this page with the first camera that does support BAA.\n this.router.transitionTo({\n queryParams: {\n cameraId: cameras.firstObject.id\n }\n });\n } else {\n checkForBaaPackages.call(this, model, [selectedCamera], doesNotSupportBaaAction);\n }\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-crowd-gathering-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport BaseEditBusinessActivityAnalyticsRuleUi from '../base-edit-business-activity-analytics-rule-ui/index';\n\n/**\n * @classdesc\n *\n * Component to render the ui to edit a crowd gathering rule.\n *\n * @class components.video.advanced-analytics.EditRuleUi.EditCrowdGatheringUi\n * @extends components.video.advanced-analytics.EditRuleUi.BaseEditBusinessActivityAnalyticsRuleUi\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\nexport default class EditCrowdGatheringUi extends BaseEditBusinessActivityAnalyticsRuleUi {\n @service intl;\n\n /** @override */\n @computed()\n get ruleType() {\n return 'crowd-gathering';\n }\n\n /** @override */\n @computed()\n get resourcePath() {\n return 'components.video.advanced-analytics.edit-rule-ui.edit-crowd-gathering-ui';\n }\n\n /**\n * List of options to include in the dropdown for maximum crowd size (1-20).\n *\n * @returns {Array<{name: string, value: number}>}\n */\n @computed()\n get maxCrowdSizeOptions() {\n return [...Array(20).keys()].map((zeroVal) => {\n const value = zeroVal + 1;\n return {\n name: this.intl.t('generic.people', { count: value }),\n value\n };\n });\n }\n\n /** @override */\n @computed('args.rule.maximumCrowdSizes', 'resourcePath')\n get missingCriteria() {\n const { maximumCrowdSizes } = this.args.rule;\n\n return maximumCrowdSizes?.length ? undefined : [this.intl.t(`${this.resourcePath}.missingMaximumCrowdSize`)];\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n

{{tc this \\'snapshotInstructions\\'}}

\\n\\n \\n \\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-heat-map-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { intlPath } from '@adc/i18n/path';\nimport BaseEditBusinessActivityAnalyticsRuleUi from '../base-edit-business-activity-analytics-rule-ui/index';\n\n/**\n * @classdesc\n * Component to render the ui to edit a heat map rule.\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\n@intlPath({ path: 'video/advanced-analytics/edit-rule-ui/edit-heat-map-ui' })\nexport default class EditHeatMapUi extends BaseEditBusinessActivityAnalyticsRuleUi {\n /** @override */\n @computed()\n get ruleType() {\n return 'heat-mapping';\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n \\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/components/video/advanced-analytics/edit-rule-ui/edit-queue-monitoring-ui/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport BaseEditBusinessActivityAnalyticsRuleUi from '../base-edit-business-activity-analytics-rule-ui/index';\n\n/**\n * @classdesc\n * Component to render the ui to edit a queue monitoring rule.\n *\n * @param {models.video.OvRule} rule The rule to be edited.\n */\n@intlPath({ path: 'video/advanced-analytics/edit-rule-ui/edit-queue-monitoring-ui' })\nexport default class EditQueueMonitoringUi extends BaseEditBusinessActivityAnalyticsRuleUi {\n @service intl;\n\n /** @override */\n @computed()\n get ruleType() {\n return 'queue-monitoring';\n }\n\n /** @override */\n @computed()\n get resourcePath() {\n return 'components.video.advanced-analytics.edit-rule-ui.edit-queue-monitoring-ui';\n }\n\n /**\n * List of options to include in the dropdown for maximum queue size (1-20).\n *\n * @returns {Array<{name: string, value: number}>}\n */\n @computed()\n get maxQueueSizeOptions() {\n return [...Array(20).keys()].map((zeroVal) => {\n const value = zeroVal + 1;\n return {\n name: this.intl.t('generic.people', { count: value }),\n value\n };\n });\n }\n\n /**\n * List of options to include in the dropdown for maximum wait time.\n *\n * @returns {Array<{name: string, value: number}>}\n */\n @computed()\n get maxWaitTimeOptions() {\n return [\n [30, '0:30'],\n [60, '1:00'],\n [120, '2:00'],\n [180, '3:00'],\n [240, '4:00'],\n [300, '5:00'],\n [600, '10:00'],\n [900, '15:00']\n ].map(([value, text]) => {\n const name = this.intl.tc(this, 'minutes', { numberOfSeconds: value, timeAsMmSs: text });\n return { name, value };\n });\n }\n\n /** @override */\n @computed('args.rule', 'resourcePath')\n get missingCriteria() {\n const { maxQueueSizes, maxWaitTimes } = this.args.rule,\n missingCriteria = [];\n\n if (!maxQueueSizes?.length) {\n this.intl.t(`${this.resourcePath}.missingQueueSize`);\n }\n\n if (!maxWaitTimes?.length) {\n this.intl.t(`${this.resourcePath}.missingWaitTime`);\n }\n\n return missingCriteria;\n }\n\n /**\n * Queue size threshold type text to be displayed above the threshold selections.\n *\n * @type {string}\n */\n queueSizeThresholdType = this.intl.t(`${this.resourcePath}.queueSizeThreshold`);\n\n /**\n * Wait time threshold type text to be displayed above the threshold selections.\n *\n * @type {string}\n */\n waitTimeThresholdType = this.intl.t(`${this.resourcePath}.waitTimeThreshold`);\n}\n","import EmberController from '@ember/controller';\nimport { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport EditBusinessOccupancyUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-business-occupancy-ui/index';\nimport EditCrowdGatheringUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-crowd-gathering-ui/index';\nimport EditHeatMapUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-heat-map-ui/index';\nimport EditPeopleCountingUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-people-counting-ui/index';\nimport EditQueueMonitoringUi from 'customer-site/components/video/advanced-analytics/edit-rule-ui/edit-queue-monitoring-ui/index';\nimport { BusinessOccupancy, CrowdGathering, Heatmap, LineCount, LineMonitor } from 'customer-site/enums/OvlRuleType';\n\n/**\n * Maps rule types to their respective edit ui component paths.\n *\n * @type {{number: Component}}\n */\nconst RuleTypeEditUiPath = {\n [LineMonitor]: EditQueueMonitoringUi,\n [LineCount]: EditPeopleCountingUi,\n [Heatmap]: EditHeatMapUi,\n [BusinessOccupancy]: EditBusinessOccupancyUi,\n [CrowdGathering]: EditCrowdGatheringUi\n};\n\n/**\n * @classdesc\n *\n * Controller for the Business Activity Analytics rule page.\n *\n * @class video.business-activity-analytics.rule.Controller\n * @extends Ember.Controller\n */\nexport default class Controller extends EmberController {\n // region Aliases\n\n /**\n * The rule type for the rule on this slot.\n *\n * @type {number}\n */\n @alias('model.rule.ruleType')\n ruleType;\n\n // endregion\n\n // region Computed properties\n\n /**\n * The path to the appropriate edit rule UI component, or undefined if no rule type has been selected yet.\n *\n * @returns {string|undefined}\n */\n @computed('ruleType')\n get editUiComponentPath() {\n return RuleTypeEditUiPath[this.ruleType];\n }\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay;\n\n // endregion\n}\n","import { isDestroyed } from '@adc/ember-utils/utils/ember-helpers';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport {\n EmberVideoBusinessActivityAnalytics,\n EmberVideoBusinessActivityAnalyticsRule,\n VideoCameraSettingsOverview\n} from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\nimport { checkForBaaPackages } from 'customer-site/video/business-activity-analytics/rule-group/route';\nimport { hash } from 'rsvp';\n\n/**\n * @classdesc\n * The base route for Business Activity Analytics.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n queryParams = {\n relay: { replace: false, refreshModel: false }\n };\n\n @service ajax;\n @service contextManager;\n @service notificationManager;\n @service intl;\n @service('video.analytics-firmware-manager') analyticsFirmwareManager;\n @service store;\n\n /** @override */\n routeId = EmberVideoBusinessActivityAnalyticsRule;\n\n /** @override */\n model({ id_rule, relay }) {\n const cameraId = id_rule.split('_')[0];\n\n // Check if a rule already exists on this slot.\n // If it does, fetch that rule and return it.\n // Otherwise, create a new rule with the given id.\n // We also have to load the camera first to make sure it's model is updated with the new rule relationship.\n return this.store.findRecord('video/devices/ov-ready-camera', cameraId).then((camera) => {\n return hash({\n camera,\n rule: this.store.findRecord('video/ov-rule', id_rule, {\n adapterOptions: {\n createIfDoesNotExist: true\n }\n }),\n permissions: this.store.findRecord(\n 'video/permissions/ov-rule-permission',\n this.contextManager.getSelectedSystemId()\n ),\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(relay, undefined)\n });\n });\n }\n\n /** @override */\n afterModel(model) {\n // If the rule doesn't have a name, that is an indicator that we are creating a new rule, so set the property accordingly.\n model.rule.set('creatingNew', isEmpty(model.rule.name));\n\n const selectedCamera = model.camera,\n { contextManager } = this;\n\n const doesNotSupportBaaAction = () =>\n contextManager.identityModel.isMobileApp\n ? // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberVideoBusinessActivityAnalytics)\n : // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(VideoCameraSettingsOverview);\n\n checkForBaaPackages.call(this, model, [selectedCamera], doesNotSupportBaaAction);\n }\n\n /** @override */\n deactivate() {\n super.deactivate();\n\n const { rule } = this.currentModel;\n\n // If the current rule on the model has unsaved properties after navigating away from the edit route, then role it back.\n // This prevents Ember from storing unsaved rules in the store.\n // We also confirm the rule hasn't already been destroyed, which can occur when switching systems, which unloads the store first.\n if (rule.hasDirtyAttributes && !isDestroyed(rule)) {\n rule.rollbackAttributes();\n this.store.unloadRecord(rule);\n }\n }\n\n /** @override */\n skipWhenTransitioningBack = true;\n}\n","import { EmberVideoCameraGroups, EmberVideoCameraGroupsEdit } from '../../enums/CustomerPageUrl';\nimport BaseCameraGroupsController from './base-objects/base-camera-groups-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * Controller for single-system manage camera groups page.\n */\nexport default class CameraGroupsController extends BaseCameraGroupsController {\n declare model: ModelFrom;\n\n /** @override */\n get manageGroupsRouteId(): number {\n return EmberVideoCameraGroups;\n }\n\n /** @override */\n get editGroupRouteId(): number {\n return EmberVideoCameraGroupsEdit;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/camera-groups': CameraGroupsController;\n }\n}\n","import { EmberVideoCameraGroupsEdit } from '../../../enums/CustomerPageUrl';\nimport BaseCameraGroupEditRoute from '../base-objects/base-camera-group-edit-route';\n\n/**\n * @classdesc\n * Route for single-system edit camera group page.\n */\nexport default class EditRoute extends BaseCameraGroupEditRoute {\n /** @override */\n routeId = EmberVideoCameraGroupsEdit;\n}\n","import { EmberVideoCameraGroups } from '../../enums/CustomerPageUrl';\nimport BaseCameraGroupsRoute from './base-objects/base-camera-groups-route';\n\n/**\n * @classdesc\n * Route for single-system manage camera groups page.\n */\nexport default class CameraGroupsRoute extends BaseCameraGroupsRoute {\n /** @override */\n routeId = EmberVideoCameraGroups;\n}\n","import EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type ContextManager from 'customer-site/services/context-manager';\n\n/**\n * @classdesc\n * Controller for saving analytics settings at camera level.\n */\nexport default class AnalyticsController extends EmberController {\n @service declare contextManager: ContextManager;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n /**\n * Saves analytics settings on the camera.\n */\n @action async save(): Promise {\n const camera = await this.model.camera;\n\n return camera.save();\n }\n\n /**\n * Go back to the previous route.\n */\n @action cancel(): void {\n this.contextManager.transitionToPreviousRoute();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/analytics': AnalyticsController;\n }\n}\n","import { EmberOvReadySettings } from '../../../../enums/CustomerPageUrl';\nimport BaseAnalyticsCameraRoute from '../base-analytics-camera-route';\n\n/**\n * @classdesc\n * Route for analytic settings at the camera level.\n */\nexport default class AnalyticsRoute extends BaseAnalyticsCameraRoute {\n /** @override */\n routeId = EmberOvReadySettings;\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { task } from 'ember-concurrency';\nimport BaseCalibrationController from '../base-controller';\n\nimport type Store from '@ember-data/store';\nimport type CalibrationSnapshot from 'customer-site/models/video/calibration/snapshot';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type Snapshot from 'customer-site/models/video/snapshot';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SafeString } from 'handlebars';\nimport type Route from './route';\n\n/**\n * Extracts information about the current snapshot.\n */\nasync function getSnapshotInfo(\n this: VideoCameraCalibrationCaptureController\n): Promise<{ camera: OvReadyCamera; index?: number; snapshot?: CalibrationSnapshot }> {\n const index = this.clipIndex,\n camera = await this.model.camera,\n snapshots = await camera.calibrationSnapshots;\n\n return {\n camera,\n index,\n snapshot: (snapshots ?? []).findBy('index', index)\n };\n}\n\n/**\n * Updates the previewDivWidth and previewDivHeight properties based on the natural image dimensions, the max preview div height and the mainDivWidth\n */\nfunction setPreviewDivSizing(\n this: VideoCameraCalibrationCaptureController,\n mainDiv?: HTMLDivElement | null,\n previewSnapshot?: HTMLImageElement | null\n): void {\n const { imageAspectRatio } = this;\n\n if (!imageAspectRatio || !mainDiv || !previewSnapshot) {\n return;\n }\n\n const mainDivWidth = mainDiv.clientWidth,\n MAX_PREVIEW_DIV_HEIGHT = 500;\n\n let { naturalWidth, naturalHeight } = previewSnapshot;\n\n if (naturalHeight > MAX_PREVIEW_DIV_HEIGHT) {\n naturalWidth = imageAspectRatio * MAX_PREVIEW_DIV_HEIGHT;\n naturalHeight = MAX_PREVIEW_DIV_HEIGHT;\n }\n\n if (naturalWidth > mainDivWidth) {\n naturalWidth = mainDivWidth;\n naturalHeight = (1 / imageAspectRatio) * naturalWidth;\n }\n\n Object.assign(this, {\n previewDivWidth: naturalWidth,\n previewDivHeight: naturalHeight\n });\n}\n\n/**\n * @classdesc\n * Route for capturing video calibration snapshots.\n */\nexport default class VideoCameraCalibrationCaptureController extends BaseCalibrationController {\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * The preview div width, set to 640 by default and then set to the size of the live feed after it loads\n */\n @tracked previewDivWidth = 640;\n\n /**\n * The preview div height, set to 360 by default and then set to the size of the live feed after it loads\n */\n @tracked previewDivHeight = 360;\n\n /**\n * The computed aspect ratio of the live snapshot feed (represents width divided by height).\n */\n imageAspectRatio?: number;\n\n /**\n * If the first capture image load is happening. (Spinner isn't necessary on image reloads since reloads happen constantly)\n */\n @tracked firstImageIsLoading = true;\n\n // region Computed properties\n\n /**\n * The css height and width to set the preview div to.\n */\n @computed('previewDivWidth', 'previewDivHeight')\n get previewDivSizeStyle(): SafeString {\n const { previewDivWidth, previewDivHeight } = this;\n return htmlSafe(`width:${previewDivWidth}px;height:${previewDivHeight}px;`);\n }\n\n /**\n * If we should be showing the stream failure message. Basically if there's an error and the user didn't just click retry.\n */\n @computed('model.camera.snapshot.error', 'reloadStream.isRunning')\n get showStreamFailureMessage(): Promise {\n return (async () => {\n const camera = await this.model.camera,\n snapshot = await camera.snapshot;\n\n return !!snapshot.error && !this.reloadStream.isRunning;\n })();\n }\n\n get snapshot(): Promise {\n return (async () => {\n const camera = await this.model.camera,\n snapshot = await camera.snapshot;\n\n return snapshot;\n })();\n }\n\n // endregion\n\n /**\n * Transitions to the edit route for the current clip index.\n */\n @action async capturePhoto(buttonAnimation: Promise): Promise {\n const { camera, index, snapshot } = await getSnapshotInfo.call(this);\n\n // Do we already have a snapshot?\n if (snapshot) {\n // Destroy and unload snapshot.\n await snapshot.destroyRecord();\n snapshot.unloadRecord();\n }\n\n try {\n // Create new snapshot and save.\n await this.store\n .createRecord('video/calibration/snapshot', {\n // We need to set the ID during creation so the store doesn't complain about reused IDs.\n id: `${camera.id}-${index}`,\n index,\n camera\n })\n .save();\n\n buttonAnimation.then(() => this.transitionToEditRoute(undefined, this.getQueryParams()));\n } catch (ex) {\n // swallow\n }\n }\n\n /**\n * Tries to get a new snapshot. This is called when snapshot fails to load and user clicks to Try Again.\n */\n reloadStream = task({ drop: true }, async () => {\n const snapshot = await this.snapshot;\n await snapshot.reload();\n });\n\n /**\n * Transition to the previous clip edit route, or the calibration index route if this is the first clip index.\n */\n @action cancel(): void {\n // Are we reviewing clips?\n if (this.isFeedbackRequired) {\n this.transitionToReviewRoute(this.getQueryParams());\n return;\n }\n\n // Is this the first index clip?\n const index = this.clipIndex;\n if (index === 0) {\n this.transitionToIndexRoute(this.getQueryParams());\n return;\n }\n\n if (index) {\n // Transition back to the edit route for the previous clip index.\n this.transitionToEditRoute(index - 1, this.getQueryParams());\n }\n }\n\n /**\n * Called whenever the image container resizes.\n */\n @action previewResized(elContainer: HTMLDivElement): void {\n setPreviewDivSizing.call(this, elContainer, elContainer.querySelector('.preview-snapshot'));\n }\n\n /**\n * Called whenever the snapshot image is loaded.\n */\n @action async imageLoaded(evt: Event & { target: HTMLImageElement }): Promise {\n const { target } = evt;\n\n this.firstImageIsLoading = false;\n\n // Update image aspect ratio and resize.\n this.imageAspectRatio = target.naturalWidth / target.naturalHeight;\n setPreviewDivSizing.call(this, target.closest('.capture-edit-section'), target);\n\n // Request another snapshot in a second now that the previous one has loaded.\n const snapshot = await this.snapshot;\n snapshot.reloadSnapshotLater(1000);\n }\n\n /**\n * Called when the snapshot image fails to load. We will retry to load it.\n */\n @action async imageError() {\n this.firstImageIsLoading = false;\n\n const snapshot = await this.snapshot;\n snapshot.reloadSnapshotLater(1000);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/calibrate/capture': VideoCameraCalibrationCaptureController;\n }\n}\n","import { EmberVideoCameraCalibrateCapture } from 'customer-site/enums/CustomerPageUrl';\nimport BaseCalibrationRoute from '../base-route';\n\n/**\n * @classdesc\n * Route for capturing video calibration snapshots.\n */\nexport default class Route extends BaseCalibrationRoute {\n /** @override */\n routeId = EmberVideoCameraCalibrateCapture;\n}\n","import { tracked } from '@glimmer/tracking';\nimport { computed, action, set } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { task } from 'ember-concurrency';\nimport { Calibrated, FeedbackRequired } from 'customer-site/enums/CalibrationStatus';\nimport { DISTINCT_COLORS } from 'customer-site/utils/colors';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport BaseCalibrationController from '../base-controller';\n\nimport type AdcIntlService from '@adc/i18n/services/adc-intl';\nimport type BoundingBox from 'customer-site/models/video/calibration/bounding-box';\nimport type CalibrationSnapshot from 'customer-site/models/video/calibration/snapshot';\nimport type AdcAjaxService from 'customer-site/services/ajax';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SafeString } from 'handlebars';\nimport type Route from './route';\n\ntype BoxOption = BinaryListItem<{\n id: number;\n}>;\n\n/**\n * @classdesc\n * Route for editing video calibration snapshots.\n */\nexport default class VideoCameraCalibrationEditController extends BaseCalibrationController {\n @service declare ajax: AdcAjaxService;\n @service declare intl: AdcIntlService;\n\n declare model: ModelFrom;\n\n /**\n * Which bounding box object index a user has selected (for when there are multiple bounding boxes found).\n */\n @tracked boxSelection?: number;\n\n /**\n * The list of bounding box items to send to the button-list component.\n */\n @tracked boundingBoxItems?: BoxOption[];\n\n @computed('snapshotToEdit.boundingBoxes.length')\n get boxes(): Promise {\n return (async () => {\n const snapshot = await this.snapshotToEdit,\n boxes = await snapshot?.boundingBoxes;\n\n return boxes?.toArray() ?? [];\n })();\n }\n\n /**\n * If more than one bounding box (object) was detected in a snapshot.\n */\n @computed('boxes.[]')\n get multipleObjectsFound(): Promise {\n return (async () => {\n const boxes = await this.boxes;\n return boxes.length > 1;\n })();\n }\n\n /**\n * If the calibration process failed because one or more of the snapshots was not done correctly.\n */\n @equal('model.camera.calibrationStatus.value', FeedbackRequired)\n declare isFeedbackRequired: boolean;\n\n /**\n * The snapshot to edit.\n */\n @computed('clipIndex', 'model.{camera,index}')\n get snapshotToEdit(): Promise {\n return (async () => {\n const camera = await this.model.camera,\n snapshots = await camera?.calibrationSnapshots;\n\n return (snapshots ?? []).findBy('index', this.clipIndex);\n })();\n }\n\n /**\n * Indicates the message to display for invalid bounding boxes (too many or missing).\n */\n @computed('boxes.[]')\n get snapshotInvalidText(): Promise {\n return (async () => {\n // Was one (and only one) bounding box identified?\n const count = (await this.boxes).length;\n if (count === 1) {\n // No message.\n return htmlSafe('');\n }\n\n // Return message.\n return htmlSafe(this.intl.tc(this, `${count ? 'multiple' : 'no'}BoundingBox`));\n })();\n }\n\n /**\n * Whether the confirm/next button on the page is submitting the list of snapshots or not.\n */\n @computed('isFeedbackRequired', 'model.index', 'snapshotsRequired')\n get readyToSubmit(): boolean {\n return this.isFeedbackRequired || (this.model.index ?? 0) + 1 >= this.snapshotsRequired;\n }\n\n /**\n * The text for the confirmation button on this page.\n */\n @computed('readyToSubmit')\n get confirmText(): string {\n return this.intl.t(this.readyToSubmit ? 'generic.submit' : 'generic.next');\n }\n\n /**\n * If there were multiple bounding box objects found for a snapshot and the user has not yet clicked one of them.\n */\n @computed('multipleObjectsFound', 'boxSelection')\n get waitingOnObjectSelection(): Promise {\n return (async () => {\n const multipleObjectsFound = await this.multipleObjectsFound;\n return multipleObjectsFound && this.boxSelection === undefined;\n })();\n }\n\n /**\n * If the Next/Submit button should be disabled.\n */\n @computed('waitingOnObjectSelection', 'isSnapshotInvalid')\n get disableConfirmButton(): Promise {\n return (async () => {\n return (await this.waitingOnObjectSelection) || (await this.isSnapshotInvalid);\n })();\n }\n\n /**\n * Indicates the snapshot is invalid due to missing bounding box or multiple bounding boxes found.\n */\n @computed('boxes.[]')\n get isSnapshotInvalid(): Promise {\n return (async () => {\n const { length } = await this.boxes;\n return length < 1 || length > 10;\n })();\n }\n\n /**\n * Sets the boundingBoxItems list based on what's in the boundingBoxes snapshot object and also which one is currently selected.\n */\n private updateBoxSelectionButtonItems = task({ drop: true }, async (boxSelection?: number) => {\n this.boundingBoxItems = (await this.boxes).map(\n (_, index) =>\n new BinaryListItem({\n label: this.intl.t('generic.objectName', {\n objectNumber: index + 1\n }),\n state: index == boxSelection,\n icon: 'rectangle',\n props: { id: index },\n color: `rgba(${DISTINCT_COLORS[index]})`\n }) as BoxOption\n );\n });\n\n /**\n * When a box selection has been changed.\n */\n @action\n boxSelectionChanged(boxOptions: BoxOption[]) {\n this.boxSelection = boxOptions.findBy('state')!.props.id;\n }\n\n /**\n * When a box is clicked directly we need to update the box selection value and also the button items so that it reflects the new selection.\n */\n @action\n onBoxClicked(boxIndexSelected: number): void {\n this.updateBoxSelectionButtonItems.perform(boxIndexSelected);\n this.boxSelection = boxIndexSelected;\n }\n\n /**\n * Clear bounding box edits and transition to the related snapshot capture route.\n */\n @action\n async retakePhoto(): Promise {\n return (async () => {\n const [box] = await this.boxes;\n\n // Does the first box exist AND have changes?\n if (box?.get('hasDirtyAttributes')) {\n box.rollbackAttributes();\n }\n\n this.transitionToCaptureRoute(undefined, this.getQueryParams());\n })();\n }\n\n /**\n * Transitions to the capture route for the next snapshot index, or the capture review route if five snapshots have been edited.\n */\n confirmSnapshot = task({ restartable: true }, async (buttonAnimation: Promise) => {\n const snapshot = await this.snapshotToEdit;\n if (!snapshot) {\n return;\n }\n\n const boundingBoxes = await snapshot.boundingBoxes,\n boxSelection = this.boxSelection ?? 0,\n boundingBox = boundingBoxes.objectAt(boxSelection),\n multipleObjectsFound = await this.multipleObjectsFound;\n\n // Have the bounding box dimensions changed?\n if (boundingBox?.hasDirtyAttributes) {\n // Save box.\n await boundingBox.save();\n }\n\n const camera = await this.model.camera;\n\n if (multipleObjectsFound) {\n set(snapshot, 'selectedBoundingBoxIndex', boxSelection);\n await snapshot.save();\n }\n\n if (this.readyToSubmit) {\n // Get status and reload.\n const status = camera.calibrationStatus;\n try {\n await status.reload();\n } catch (ex) {\n // Reload failed so we need to exit before transition.\n return Promise.reject();\n }\n\n // Get redirect method based on status.\n const method = {\n [Calibrated]: this.transitionToIndexRoute,\n [FeedbackRequired]: this.transitionToReviewRoute\n }[status.value];\n\n // Is there a route to redirect to?\n if (method) {\n // Redirect after button animation is complete.\n buttonAnimation.then((isSuccess) => {\n if (isSuccess) {\n method.call(this);\n }\n });\n }\n } else {\n this.transitionToCaptureRoute((this.clipIndex ?? 0) + 1, this.getQueryParams());\n }\n\n return Promise.resolve();\n });\n\n /**\n * Action to run when boxSelection has been updated.\n */\n @action\n async onBoxSelectionUpdate() {\n const boundingBoxes = await this.boxes;\n boundingBoxes.setEach('isSelected', false);\n\n const { boxSelection } = this;\n if (boxSelection !== undefined) {\n boundingBoxes.objectAt(boxSelection)?.set('isSelected', true);\n }\n }\n\n /**\n * Action to run when snapshotToEdit has been updated.\n */\n @action\n onSnapshotToEditUpdate() {\n (async () => {\n if (await this.snapshotToEdit) {\n this.updateBoxSelectionButtonItems.perform();\n }\n })();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/calibrate/edit': VideoCameraCalibrationEditController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoCameraCalibrateEdit } from 'customer-site/enums/CustomerPageUrl';\nimport BaseCalibrationRoute from '../base-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type Controller from './controller';\n\n/**\n * @classdesc\n * Route for editing video calibration captured snapshots.\n */\nexport default class Route extends BaseCalibrationRoute {\n routeId = EmberVideoCameraCalibrateEdit;\n\n declare controller: Controller;\n\n @action\n willTransition(transition: Transition) {\n super.actions.willTransition.call(this, transition);\n this.controller.set('boxSelection', undefined);\n this.controller.onBoxSelectionUpdate();\n }\n}\n","import { isMobileBrowser } from '@adc/ember-utils/utils/browser-helpers';\nimport { computed, action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { equal, notEmpty } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberOvReadyRuleSelect } from 'customer-site/enums/CustomerPageUrl';\nimport { SnapshotsRequired, Calibrated } from '../../../../../enums/CalibrationStatus';\nimport BaseCalibrationController from '../base-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nconst STATE_BEGIN = 1,\n STATE_COMPLETE = 2,\n STATE_FAILED = 3;\n\n/**\n * Reset calibration status and snapshots if status is in-process or complete.\n *\n * @private\n */\nasync function resetCalibrationProcess(this: IndexController): Promise {\n const camera = await this.model.camera,\n status = camera.calibrationStatus;\n\n // Is the camera calibration not yet begun AND are there no existing snapshots?\n if (!status || (status.value === SnapshotsRequired && !this.hasSnapshots)) {\n // Nothing to do.\n return;\n }\n\n // Get store and snapshots.\n const store = this.store,\n snapshots = await camera.calibrationSnapshots;\n\n // Reset calibration and delete/unload snapshots.\n await status.reset();\n await Promise.all(snapshots.map((m) => m.destroyRecord().then(() => store.unloadRecord(m))));\n}\n\n/**\n * @classdesc\n * Index controller for the video cameras calibration route, which displays current calibration state.\n */\nexport default class IndexController extends BaseCalibrationController {\n @service declare intl: ADCIntlService;\n @service declare store: Store;\n @service declare identityManager: IdentityManager;\n\n declare model: ModelFrom;\n\n /**\n * Indicates there is at least one snapshot loaded.\n */\n @notEmpty('model.camera.calibrationSnapshots')\n declare hasSnapshots: boolean;\n\n /**\n * Indicates the camera is currently calibrated.\n */\n @equal('calibrationStatus', Calibrated)\n declare isCalibrated: boolean;\n\n /**\n * Does this user have permission to recalibrate cameras\n */\n @reads('identityManager.canManageVideoAnalytics')\n declare canManageVideoAnalytics: boolean;\n\n /**\n * The current calibration state of the camera (e.g. begin, complete, or failed).\n */\n @computed('isCalibrated', 'hasSnapshots')\n get calibrationRouteState(): number {\n // Is the camera already calibrated?\n if (this.isCalibrated) {\n // State is complete.\n return STATE_COMPLETE;\n }\n\n // State is either failed (if there are snapshots) or begin.\n return this.hasSnapshots ? STATE_FAILED : STATE_BEGIN;\n }\n\n /**\n * The calibration state in textual form ('success', 'failure' or 'begin').\n */\n @computed('calibrationRouteState')\n get stateGroup(): string {\n return (\n {\n [STATE_COMPLETE]: 'success',\n [STATE_FAILED]: 'failure'\n }[this.calibrationRouteState] ?? 'begin'\n );\n }\n\n /**\n * The calibration page title depending on the calibration state.\n */\n @computed('calibrationRouteState')\n get stateTitle(): string {\n return this.intl.tc(\n this,\n {\n [STATE_COMPLETE]: 'successTitle',\n [STATE_FAILED]: 'failureTitle'\n }[this.calibrationRouteState] ?? 'beginTitle'\n );\n }\n\n /**\n * The calibration page message depending on the calibration state.\n */\n @computed('calibrationRouteState')\n get stateMessage(): string {\n return this.intl.tc(\n this,\n {\n [STATE_COMPLETE]: 'successMessage',\n [STATE_FAILED]: 'failureMessage'\n }[this.calibrationRouteState] ?? 'beginMessage'\n );\n }\n\n /**\n * Returns if calibration has been completed successfully.\n */\n @equal('calibrationRouteState', STATE_COMPLETE)\n declare isSuccessful: boolean;\n\n /**\n * The current state based text for the cancel button.\n */\n @computed('calibrationRouteState')\n get cancelButtonText(): string {\n return this.calibrationRouteState === STATE_COMPLETE\n ? this.intl.tc(this, 'startOver')\n : this.intl.t('generic.cancel');\n }\n\n /**\n * The current state based text for the confirm button.\n */\n @computed('calibrationRouteState')\n get confirmButtonText(): string {\n const key = {\n [STATE_COMPLETE]: 'done',\n [STATE_BEGIN]: 'continue'\n }[this.calibrationRouteState];\n\n return key ? this.intl.t(`generic.${key}`) : this.intl.tc(this, 'startOver');\n }\n\n /**\n * Returns whether the user is on a mobile device.\n */\n isMobile = isMobileBrowser();\n\n /**\n * Transitions to the next route, which is either the camera route, if calibration is complete, or the capture zero index route.\n */\n @action async confirm(): Promise {\n const { contextManager, newCamera, cameraModelID, isCalibrated, navigation } = this;\n\n // Was calibration successful?\n if (isCalibrated) {\n // This means we came from post install steps on the customer site, so we navigate back to the rule builder page,\n if (newCamera) {\n navigation.transitionToRouteId(EmberOvReadyRuleSelect, 'new', {\n queryParams: {\n deviceId: cameraModelID,\n newCamera: newCamera\n }\n });\n return;\n }\n\n contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n // Reset calibration (if necessary), and transition to first capture route..\n await resetCalibrationProcess.call(this);\n this.transitionToCaptureRoute(0, this.getQueryParams());\n }\n\n /**\n * Exits calibration and returns to the camera route, or starts calibration over if state is calibrated.\n */\n @action async cancel(): Promise {\n // Cache calibration value for later use.\n const isCalibrated = this.isCalibrated;\n\n // Reset calibration (if necessary).\n await resetCalibrationProcess.call(this);\n\n // Was calibration successful (before reset)?\n if (isCalibrated) {\n // User wants to start over, so redirect to first capture route.\n this.transitionToCaptureRoute(0, this.getQueryParams());\n return;\n }\n\n // User wants to exit, so redirect to the route where we came back from.\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/calibrate/index': IndexController;\n }\n}\n","import { EmberVideoCameraCalibrate } from '../../../../../enums/CustomerPageUrl';\nimport BaseCalibrationRoute from '../base-route';\n\n/**\n * @classdesc\n * Index route for the video cameras calibration route, which displays current calibration state.\n */\nexport default class Route extends BaseCalibrationRoute {\n /** @override */\n routeId = EmberVideoCameraCalibrate;\n}\n","import { computed } from '@ember/object';\nimport BaseCalibrationController from '../base-controller';\n\nimport type Snapshot from 'customer-site/models/video/calibration/snapshot';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * Route for reviewing captured video calibration snapshots.\n */\nexport default class VideoCameraCalibrationReviewController extends BaseCalibrationController {\n declare model: ModelFrom;\n\n /**\n * The snapshots to review, sorted by index.\n */\n @computed('model.camera.calibrationSnapshots.[]')\n get snapshots(): Promise {\n return (async () => {\n const camera = await this.model.camera,\n snapshots = await camera.calibrationSnapshots;\n\n return snapshots.sortBy('index');\n })();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/calibrate/review': VideoCameraCalibrationReviewController;\n }\n}\n","import { EmberVideoCameraCalibrateReview } from 'customer-site/enums/CustomerPageUrl';\nimport BaseCalibrationRoute from '../base-route';\n\n/**\n * @classdesc\n * Route for reviewing captured video calibration snapshots, with links to edit each.\n */\nexport default class Route extends BaseCalibrationRoute {\n /** @override */\n routeId = EmberVideoCameraCalibrateReview;\n}\n","import { EmberVideoCameraCalibrate } from '../../../../enums/CustomerPageUrl';\nimport BaseAnalyticsCameraRoute from '../base-analytics-camera-route';\n\n/**\n * @classdesc\n * Parent route for all video calibration routes.\n */\nexport default class CalibrationRoute extends BaseAnalyticsCameraRoute {\n routeId = EmberVideoCameraCalibrate;\n}\n","import EmberController from '@ember/controller';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoCameraCalibrate, EmberVideoVarifocalFovSettings } from '../../../enums/CustomerPageUrl';\n\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * Navigates into the calibration pages flow. If the camera supports varifocal field of view, we need to go to varifocal settings page\n * before going into the page for calibration. (This is because calibration won't work properly if the camera isn't properly focused)\n *\n * @param camera\n * @param contextManager\n */\nexport function navigateToCalibrationPageFlow(\n camera: BaseCamera,\n contextManager: ContextManager,\n queryParams = {}\n): void {\n // Due to a bug in the mobile client before version 600 (Roosterfish), we hide the varifocal page because otherwise it crashes\n const isMobileAllowed = contextManager.identityModel.isMobileApp\n ? contextManager.identityModel.applicationBuildNumber >= 600\n : true;\n if (camera.isVarifocalCamera && isMobileAllowed) {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberVideoVarifocalFovSettings, queryParams, undefined, camera.id);\n } else {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberVideoCameraCalibrate, queryParams, undefined, camera.id);\n }\n}\n\n/**\n * @classdesc\n * The edit video camera controller.\n */\nexport default class EditVideoCameraController extends EmberController {\n @service declare contextManager: ContextManager;\n\n declare model: ModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera': EditVideoCameraController;\n }\n}\n","import EmberController from '@ember/controller';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberVideoCameraCalibrate,\n VideoLiveViewSettings,\n EmberVideoLiveView,\n EmberOvReadySettings\n} from '../../../../enums/CustomerPageUrl';\n\nimport type Store from '@ember-data/store';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface Button {\n icon: string;\n text: string;\n action: () => void;\n}\n\n/**\n * @classdesc\n * Index controller for video camera editing.\n */\nexport default class VideoCameraController extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare store: Store;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n /**\n * The collection of camera buttons to show.\n *\n * @function\n */\n @computed('model.camera.id')\n get buttons(): Promise {\n return (async () => {\n const fnButton = (icon: string, text: string, action: () => void) => ({ icon, text, action }),\n cameraId = this.model.camera.get('id'),\n buttons: Button[] = [\n {\n icon: 'feature-video',\n text: 'View live video',\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n action: () => this.contextManager.transitionToRouteId(EmberVideoLiveView, { cameraId })\n },\n {\n icon: 'feature-equipment-setup',\n text: 'Edit live view settings',\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n action: () => this.contextManager.transitionToRouteId(VideoLiveViewSettings)\n }\n ];\n\n // See if this camera model has an equivalent OV ready camera model.\n const ovCamera = await this.store.findRecord('video/devices/ov-ready-camera', cameraId);\n\n // If it does, then attempt to add analytics settings pages.\n if (ovCamera) {\n buttons.push(\n fnButton('motion-idle', 'Edit analytics settings', () =>\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberOvReadySettings)\n )\n );\n\n // If the camera supports calibration, then add the calibration editing page.\n if (ovCamera.supportsCalibration) {\n buttons.push(\n fnButton('cog', 'Calibrate', () =>\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberVideoCameraCalibrate)\n )\n );\n }\n }\n\n return buttons;\n })();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/index': VideoCameraController;\n }\n}\n","import AdcBaseRoute from '../../../../classes/base-route';\nimport { EmberVideoCamera } from '../../../../enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * Index route for video camera editing.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoCamera;\n\n /**\n * Redirect back to the previous page if the user is not internal/DEV.\n */\n redirect(): void {\n const { contextManager } = this;\n\n // Is this NOT the ADC internal dealer?\n if (!contextManager.isAdcInternalDevDealer) {\n // Get out of here.\n contextManager.transitionToPreviousRoute();\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { getCaughtError } from 'customer-site/utils/general';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport { None, Mechanical, Digital } from '../../../../../enums/DoorbellChimeType';\nimport BasePostInstallController from '../base-controller';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from '../../route';\n\n/**\n * @classdesc\n * Route for selecting doorbell camera chime.\n *\n */\nexport default class ChimeSelectController extends BasePostInstallController {\n declare model: ModelFrom;\n\n /**\n * The type of chimes. Used to populate the buttons.\n */\n get chimeTypes(): BinaryListItem<{ type: typeof Mechanical | typeof Digital | typeof None }>[] {\n const { intl, selectedChimeType } = this;\n\n return [\n new BinaryListItem({\n label: intl.t('generic.mechanical'),\n state: selectedChimeType === Mechanical,\n props: { type: Mechanical }\n }),\n new BinaryListItem({\n label: intl.t('generic.digital'),\n state: selectedChimeType === Digital,\n props: { type: Digital }\n }),\n new BinaryListItem({\n label: intl.t('generic.noneOrWireless'),\n state: selectedChimeType === None,\n props: { type: None }\n })\n ];\n }\n\n /**\n * Which chime option is currently selected.\n */\n @tracked selectedChimeType: number = Mechanical;\n\n /**\n * Sends the selected chime to the backend to be saved.\n */\n @action async selectChime(): Promise {\n try {\n const chimeType = this.selectedChimeType;\n\n await this.ajax.apiRequest(\n `video/postInstall/chimeSelect/${this.cameraId}/${chimeType}`,\n undefined,\n null,\n 'PUT'\n );\n\n if (this.nativeBridge.doesSupportCloseWebViewV2) {\n await this.nativeBridge.closeWebViewV2();\n } else if (this.nativeBridge.doesSupportCloseWebView) {\n await this.nativeBridge.closeWebView();\n }\n } catch (error) {\n const errMsg = getCaughtError(error);\n this.notificationManager.addError(errMsg);\n }\n }\n\n /**\n * Called whenever a new chime is selected.\n */\n @action chimeSelectionChanged(chimeOptions: ChimeSelectController['chimeTypes']): void {\n const selectedOption = chimeOptions.findBy('state')?.props.type || 0;\n\n this.selectedChimeType = selectedOption as number;\n }\n\n /**\n * Called once the camera is resolved, used to automatically select the current\n * doorbell chime type in the button list.\n */\n @action cameraLoaded(camera: Camera): void {\n this.selectedChimeType = camera.doorbellChimeType;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/post-install/chime-select': ChimeSelectController;\n }\n}\n","import { EmberVideoCameraPostInstallChimeSelect } from '../../../../../enums/CustomerPageUrl';\nimport BasePostInstallRoute from '../base-route';\n\n/**\n * @classdesc\n * Route for selecting doorbell camera chime.\n */\nexport default class ChimeSelectRoute extends BasePostInstallRoute {\n routeId = EmberVideoCameraPostInstallChimeSelect;\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { Success, Warning, Failure } from 'customer-site/enums/PowerCheckState';\nimport BasePostInstallController from '../base-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from '../../route';\n\nconst StatusUnknown = -1,\n StatusSuccess = 0,\n StatusWarning = 1,\n StatusFailure = 2;\n\ninterface PowerCheckResults {\n description: string;\n icon: string;\n}\n\ninterface PromiseResult {\n data: {\n attributes: {\n powerCheckState: number;\n };\n };\n}\n\n/**\n * @classdesc\n * Route for checking the doorbell's power input.\n */\nexport default class PowerCheckController extends BasePostInstallController {\n @service declare intl: ADCIntlService;\n\n declare model: ModelFrom;\n\n /**\n * The results of the power check call to the camera.\n */\n @tracked powerCheckStatus = StatusUnknown;\n\n /**\n * The formatted results of the power check to be displayed to the user.\n */\n get powerCheckResult(): PowerCheckResults | undefined {\n switch (this.powerCheckStatus) {\n case Success:\n return {\n description: this.intl.tc(this, 'textPowerCheckSuccess'),\n icon: 'circle-check'\n };\n case Warning:\n return {\n description: this.intl.tc(this, 'textPowerCheckWarning'),\n icon: 'warning'\n };\n case Failure:\n return {\n description: this.intl.tc(this, 'textPowerCheckFailed'),\n icon: 'issue'\n };\n default:\n return undefined;\n }\n }\n\n /**\n * Parses the power check state that we get from the camera to control which display we want to show to the user.\n */\n parsePowerCheckResults(powerCheckState: number): void {\n switch (powerCheckState) {\n case Success:\n this.powerCheckStatus = StatusSuccess;\n break;\n case Warning:\n this.powerCheckStatus = StatusWarning;\n break;\n case Failure:\n this.powerCheckStatus = StatusFailure;\n break;\n default:\n this.powerCheckStatus = StatusUnknown;\n break;\n }\n }\n\n /**\n * Go to next route.\n */\n @action goToNextWebView(): void {\n if (this.nativeBridge.doesSupportCloseWebView) {\n this.nativeBridge.closeWebView();\n }\n }\n\n /**\n * Checks the voltage of the transformer powering the camera.\n */\n @action async checkPower(buttonAnimation: Promise): Promise {\n const powerCheckResults = (await this.ajax.apiRequest(\n `video/postInstall/powerCheck/${this.cameraId}`\n )) as PromiseResult;\n const powerCheckState = powerCheckResults.data.attributes.powerCheckState;\n\n buttonAnimation.then(() => {\n this.parsePowerCheckResults(powerCheckState);\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/post-install/power-check': PowerCheckController;\n }\n}\n","import { EmberVideoCameraPostInstallPowerCheck } from '../../../../../enums/CustomerPageUrl';\nimport BasePostInstallRoute from '../base-route';\n\n/**\n * @classdesc\n * Route for checking doorbell camera power.\n */\nexport default class PowerSelectRoute extends BasePostInstallRoute {\n /** @override */\n routeId = EmberVideoCameraPostInstallPowerCheck;\n}\n","import { action } from '@ember/object';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n MarginalPower,\n MarginalVoltage,\n Pass,\n InsufficientPower,\n InvalidPowerSourceType\n} from '../../../../../enums/AcPowerCheckResult';\nimport BasePostInstallController from '../base-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\n\nconst telusLink =\n 'https://www.telus.com/support/article/install-adc-vdb750-doorbell-camera#how-to-install-the-mechanical-chime-dongle';\n\n/**\n * @classdesc\n * Route for checking doorbell camera power.\n */\nexport default class QualitativePowerCheckController extends BasePostInstallController {\n @service declare intl: ADCIntlService;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n @computed('model.{powerCheck,dealer}')\n get displayTelusLink(): Promise {\n return (async () => {\n const telusLinkPowerCheckResults = [MarginalPower, MarginalVoltage];\n const powerCheckResult = await this.model.powerCheck;\n return telusLinkPowerCheckResults.includes(powerCheckResult.result) && powerCheckResult.isTelusDealerId;\n })();\n }\n\n /**\n * The formatted results of the power check to be displayed to the user.\n */\n @computed('model.powerCheck')\n get powerCheckResult(): Promise {\n return (async () => {\n switch (await this.model.powerCheck.get('result')) {\n case Pass:\n return this.intl.tc(this, 'statusPass');\n case MarginalVoltage:\n return this.intl.tc(this, 'statusMarginalVoltage');\n case MarginalPower:\n return this.intl.tc(this, 'statusMarginalPower');\n case InsufficientPower:\n return this.intl.tc(this, 'statusInsufficientPower');\n case InvalidPowerSourceType:\n return this.intl.tc(this, 'statusInvalidPowerSourceType');\n default:\n return '';\n }\n })();\n }\n\n /**\n * The formatted results of the power check to be displayed to the user.\n */\n @computed('model.powerCheck')\n get powerCheckResultText(): Promise {\n return (async () => {\n switch (await this.model.powerCheck.get('result')) {\n case MarginalVoltage:\n return this.intl.tc(this, 'marginalVoltageText');\n case MarginalPower:\n return this.intl.tc(this, 'marginalPowerText');\n case InsufficientPower:\n return this.intl.tc(this, 'insufficientPowerText');\n default:\n return '';\n }\n })();\n }\n\n /**\n * Go to next route.\n */\n @action goToNextWebView(): void {\n if (this.nativeBridge.doesSupportCloseWebView) {\n this.nativeBridge.closeWebView();\n }\n }\n\n @action learnMoreClick(): void {\n if (this.nativeBridge.doesSupportLaunchBrowser) {\n this.nativeBridge.launchBrowser(telusLink, true);\n } else {\n this.contextManager.transitionToUrlInNewBrowserWindow(telusLink);\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/post-install/qualitative-power-check': QualitativePowerCheckController;\n }\n}\n","import { EmberVideoCameraPostInstallQualitativePowerCheck } from '../../../../../enums/CustomerPageUrl';\nimport BasePostInstallRoute from '../base-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\n\n/**\n * @classdesc\n * Route for checking doorbell camera power.\n */\nexport default class QualitativePowerSelectRoute extends BasePostInstallRoute {\n /** @override */\n routeId = EmberVideoCameraPostInstallQualitativePowerCheck;\n async model(_: any, transition: Transition) {\n const parentModel = this.modelFor(transition?.to?.parent?.name as string) as {\n camera: ADCAsyncStoreFindRecord;\n },\n camera = await parentModel.camera;\n return {\n powerCheck: this.store.findRecord('video/post-install/qualitative-power-check', camera.id),\n dealer: this.contextManager.identityModel.dealer\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { computed, action } from '@ember/object';\nimport { bool } from '@ember/object/computed';\nimport { None } from 'customer-site/enums/DoorbellWedge';\nimport { getCaughtError } from 'customer-site/utils/general';\nimport { translateDoorbellWedge } from 'customer-site/utils/video/doorbell';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport BasePostInstallController from '../base-controller';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from '../../route';\n\n/**\n * @classdesc\n * Route for selecting doorbell camera's wedge.\n */\nexport default class WedgeSelectController extends BasePostInstallController {\n declare model: ModelFrom;\n\n /**\n * Image Path for swap wedge gif\n */\n @computed('contextManager')\n get imagePath(): string {\n return this.contextManager.getStaticResourcePath('webimages/doorbell_wedge_gifs/swap_wedge.gif');\n }\n\n /**\n * Get the Wedge Select page description depending on camera.\n */\n @computed('camera.supportsWedgeYesNo')\n get pageDescription(): string {\n const { intl, supportsWedgeYesNo } = this;\n return supportsWedgeYesNo ? intl.tc(this, 'descriptionYesNo') : intl.tc(this, 'description');\n }\n\n /**\n * Get the Wedge Select page title depending on camera.\n */\n @computed('camera.supportsWedgeYesNo')\n get pageTitle(): string {\n const { intl, supportsWedgeYesNo } = this;\n return supportsWedgeYesNo ? intl.tc(this, 'titleYesNo') : intl.tc(this, 'title');\n }\n\n /**\n * Which wedge option is currently selected.\n */\n @tracked selectedWedgeType: number = None;\n\n @tracked camera?: Camera;\n\n /**\n * does this camera display Yes or No instead of Wedge Types\n */\n @bool('camera.supportsWedgeYesNo')\n declare supportsWedgeYesNo: boolean;\n\n /**\n * The type of wedges. Used to populate the dropdown.\n */\n @computed('camera.supportedDoorbellWedgeOptions.[]')\n get wedgeTypes(): Array {\n const { intl, camera } = this,\n { supportedDoorbellWedgeOptions = [] } = camera ?? {};\n\n return supportedDoorbellWedgeOptions.map((wedge: number) =>\n DropdownSelectItem.create({\n value: String(wedge),\n name: translateDoorbellWedge(wedge, camera?.supportsWedgeYesNo, intl)\n })\n );\n }\n\n /**\n * Called whenever a new wedge is selected.\n */\n @action wedgeSelectionChanged(selectedWedge: number): void {\n this.selectedWedgeType = selectedWedge;\n }\n\n @action async selectWedge(): Promise {\n try {\n const wedgeType = this.selectedWedgeType;\n await this.ajax.apiRequest(\n `video/postInstall/wedgeSelect/${this.cameraId}/${wedgeType}`,\n undefined,\n null,\n 'PUT'\n );\n\n if (this.nativeBridge.doesSupportCloseWebViewV2) {\n await this.nativeBridge.closeWebViewV2();\n } else if (this.nativeBridge.doesSupportCloseWebView) {\n await this.nativeBridge.closeWebView();\n }\n } catch (error) {\n const errMsg = getCaughtError(error);\n this.notificationManager.addError(errMsg);\n }\n }\n\n /**\n * Called once the camera is resolved, used to automatically select the current\n * doorbell wedge type in the DropdownSelect list.\n */\n @action cameraLoaded(camera: Camera): void {\n this.camera = camera;\n this.selectedWedgeType = this.camera.doorbellWedgeType;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/camera/post-install/wedge-select': WedgeSelectController;\n }\n}\n","import { EmberVideoCameraPostInstallWedgeSelect } from '../../../../../enums/CustomerPageUrl';\nimport BasePostInstallRoute from '../base-route';\n\n/**\n * @classdesc\n * Route for selecting doorbell camera wedge.\n */\nexport default class WedgeSelectRoute extends BasePostInstallRoute {\n /** @override */\n routeId = EmberVideoCameraPostInstallWedgeSelect;\n}\n","import AdcBaseRoute from '../../../classes/base-route';\nimport { EmberVideoCamera } from '../../../enums/CustomerPageUrl';\n\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\n\n/**\n * @classdesc\n * The edit video camera route.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoCamera;\n\n /** @override */\n model({ id_camera }: { id_camera: string }): { camera: ADCAsyncStoreFindRecord } {\n return {\n camera: this.store.findRecord('video/devices/camera', id_camera)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { computed, action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberVideoLiveView,\n VideoCameraSettingsOverview,\n VideoMainSettings,\n VideoViewClips,\n VideoAddNewDevice\n} from '../../../enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\ninterface CameraSvrArrayModel {\n cameras: Camera[];\n svrs: Svr[];\n}\n\n/**\n * @classdesc\n * Index controller for the cameras route, which displays the list of a users cameras/devices.\n */\nexport default class Controller extends EmberController {\n @service declare contextManager: ContextManager;\n\n declare model: ModelFrom;\n\n /**\n * All of the cameras and SVRs on the unit.\n */\n @tracked declare resolvedModel: CameraSvrArrayModel;\n\n /**\n * Returns an array of cameras and svrs under the user sorted by description.\n */\n @computed('resolvedModel')\n get camerasAndSvrs(): (Camera | Svr)[] {\n const { cameras, svrs } = this.resolvedModel;\n\n return [...cameras.toArray(), ...svrs.toArray()].sortBy('description');\n }\n\n /**\n * Navigates to the AddVideoDevice page\n */\n @action\n goToAddNewVideoDevice(): void {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoAddNewDevice);\n }\n\n /**\n * Navigates to the SettingsOverview page for the specific device.\n *\n * @param deviceMac\n */\n @action\n goToSettings(deviceMac: string): void {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoCameraSettingsOverview, { search: `?mac=${deviceMac}` });\n }\n\n /**\n * Navigates to the LiveView page for the specific device\n *\n * @param deviceId\n */\n @action\n goToLiveView(deviceId: string): void {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberVideoLiveView, { cameraId: deviceId, cameraGroupId: null });\n }\n\n /**\n * Navigates to the Camera info (MainSettings) page for the device.\n *\n * @param deviceMac\n */\n @action\n goToCameraInfo(deviceMac: string): void {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoMainSettings, { search: `?mac=${deviceMac}` });\n }\n\n /**\n * Navigates to the Saved Clips (ViewClips) page for the device.\n *\n * @param deviceMac\n */\n @action\n goToSavedClips(deviceMac: string): void {\n // Todo, need to modify this page to utilize a preselected camera.\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoViewClips, { search: `?mac=${deviceMac}` });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/cameras/index': Controller;\n }\n}\n","import AdcBaseRoute from '../../../classes/base-route';\nimport { EmberVideoCameras, VideoCameraSettingsOverview } from '../../../enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\n\ninterface CameraSvrModel {\n cameras: ADCAsyncStoreFindAll;\n svrs: ADCAsyncStoreFindAll;\n}\n\n/**\n * @classdesc\n * Index route for cameras which lists all the cameras associated with the current account.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoCameras;\n\n /** @override */\n model(): CameraSvrModel {\n const { store } = this;\n return {\n cameras: store.findAll('video/devices/camera'),\n svrs: store.findAll('video/devices/svr')\n };\n }\n\n /** @override */\n async afterModel(model: CameraSvrModel): Promise {\n const cameras = await model.cameras;\n\n /**\n * If the customer has no cameras or only has one camera, this page isn't very useful.\n * As such, let's proactively navigate them away from this page.\n */\n if (!cameras.length || cameras.length === 1) {\n /**\n * On Mobile, the VideoCameraSettingsOverview is *not* exposed as a WebView, so that\n * transition will never actually work. To avoid the problem, let's just send them\n * back to the mobile app / page from which they came.\n */\n if (this.contextManager.identityModel.isMobileApp) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoCameraSettingsOverview);\n }\n }\n\n redirect(): void {\n if (this.routeItem.isHiddenFromNavigation) {\n this.contextManager.transitionToPreviousRoute();\n }\n }\n}\n","import AdcBaseRoute from '../../classes/base-route';\nimport { EmberVideoCameras } from '../../enums/CustomerPageUrl';\n\nimport type { AsyncHasMany } from '@ember-data/model';\nimport type Camera from 'customer-site/models/video/devices/camera';\n\n/**\n * @classdesc\n * Video cameras route.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoCameras;\n\n async model(): Promise<{ cameras?: AsyncHasMany }> {\n const system = await this.identityManager.getSelectedSystem(true, ['cameras']);\n return {\n cameras: system.cameras\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { downloadImageFromBytes } from '@adc/ui-components/utils/download-file';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport { EmberClassifierVisualization } from '../../enums/CustomerPageUrl';\n\n/**\n * Populates the dropdown list of clips with a certain number of video events.\n * Video events displayed all contain an ovready rule id and a target slice id.\n * For all list populations after the first, an updated/error message will display.\n *\n * @param {number} count\n * @param {Date} start\n * @param {Date} end\n */\nasync function populateClipList(count, start, end) {\n const ajax = this.ajax,\n setUpdateStatusMessage = (status) => {\n let update = { text: status, cssClass: 'update-list-error' };\n\n if (status === '') {\n update = { text: '', cssClass: '' };\n }\n\n if (status === 'Updated') {\n update = { text: 'Updated', cssClass: 'update-list-success' };\n }\n\n if (status === 'Loading') {\n update = { text: 'Loading', cssClass: 'update-list-loading' };\n }\n\n // For other input text, assume error.\n this.updateListStatus = update;\n };\n\n setUpdateStatusMessage('Loading');\n\n count = !Number.isNaN(count) ? count : null;\n\n // Do not search if all values are empty or invalid. Search is valid with at least one non-null value.\n if (count === null && start === null && end === null) {\n setUpdateStatusMessage('List size, start time, or end time required.');\n return;\n }\n\n // Confirm count is positive integer if not null.\n if (count !== null && count < 1) {\n setUpdateStatusMessage('List size is invalid.');\n return;\n }\n\n [start, end] = [start, end].map((d) => (d ? d.toISOString() : null));\n\n this.videoEvents = await ajax\n .apiRequest(\n `video/videoEvents/getLatestAnalyticsEvents?maxNumEvents=${count}&startTime=${start}&endTime=${end}`\n )\n .then(({ data = [] }) => {\n setUpdateStatusMessage(isEmpty(data) ? 'No Events Returned From Your Query' : 'Updated');\n return data;\n })\n .catch((error) => {\n setUpdateStatusMessage('Failed To Update');\n\n if (error.errors) {\n this.errorMessage = error.errors.mapBy('detail').join(' ');\n }\n });\n}\n\n/**\n * Determines which background color should be loaded for the relevant slice.\n *\n * @param {Object} slice\n * @returns {String}\n */\nfunction calculateBackgroundColor(slice) {\n if (!slice['sentToClassifier']) {\n return 'not-sent-to-classifier';\n }\n\n if (!slice['targetFound']) {\n return 'target-not-found';\n }\n\n if (slice['isThumbnailSlice']) {\n return 'thumbnail-slice';\n }\n\n return '';\n}\n\n/**\n * Returns the url of the image source.\n *\n * @param {String} url\n * @returns {String}\n */\nfunction imageSource(url) {\n return url || '';\n}\n\n/**\n * Reformats and converts UTC timestamp to be a local timestamp in \"Month Day, Year, HH:MM:SS \" 12-hr time format\n *\n * @param timestamp\n * @returns {String}\n */\nfunction formatTimestamp(timestamp) {\n // Format and return.\n return this.intl.formatDateTz(timestamp, {\n format: 'fullDateTimeFormat'\n });\n}\n\n/**\n * @classdesc\n *\n * Controller for the internal Classifier Visualization testing page.\n */\nexport default class ClassifierVisualizationController extends Controller {\n @service ajax;\n @service contextManager;\n @service intl;\n @service notificationManager;\n @service router;\n\n /**\n * Stores video events retrieved for dropdown.\n *\n * @type {Array}\n */\n @tracked videoEvents = null;\n\n /**\n * Converts videoEvents to an object with name and value for the drop-down.\n *\n * @returns {(CheckboxTreeItem & {name: string, description: string, value})[]}\n */\n @computed('videoEvents', 'videoEvents.isFulfilled')\n get clipList() {\n return (this.videoEvents || []).map((videoEvent) =>\n DropdownSelectItem.create({\n name:\n `Camera '${\n videoEvent.relationships.camera.data ? videoEvent.relationships.camera.data.id || '' : ''\n }' ` + `at Time ${formatTimestamp.call(this, videoEvent.attributes.timestamp)}`,\n value: videoEvent.id,\n description: `Event ID '${videoEvent.id}'`\n })\n );\n }\n\n /**\n * Maximum number of clips set here but ultimately overridden by value stored in backend.\n *\n * @type {number}\n */\n maximumNumClips = 50;\n\n /**\n * Stores the start and end times used for searching for saved clips.\n * If no starting or ending date is set, this is ignored and only the latest clips are grabbed.\n *\n * @type {Object}\n */\n @tracked updateListStartEndTimes = {\n start: new Date(Date.now()),\n end: new Date(Date.now())\n };\n\n /**\n * Stores the analytics details on the current query param video event id, if any.\n *\n * @type {Array>}\n */\n @tracked analyticsDetails = null;\n\n /**\n * An alias for the first object in the analyticsDetails object list.\n *\n * @type {Object}\n */\n @reads('analyticsDetails.slices.firstObject')\n firstAnalyticsDetails;\n\n /**\n * Stores the analytics details for all ovready events that have a snapshot.\n *\n * @type {Array>}\n */\n @computed('analyticsDetails.{slices,slices.isFulfilled}')\n get snapshotAnalyticsDetails() {\n const snapshotSlices = [];\n\n this.analyticsDetails.slices.forEach((slice) => {\n if (!isEmpty(slice['snapshotUrl'])) {\n snapshotSlices.push(slice);\n }\n });\n\n return snapshotSlices;\n }\n\n /**\n * The 'Month Day, Year' date format used in the video clip dropdown dates.\n *\n * @type {String}\n */\n dateFormat = 'MMMM dd, yyyy';\n\n /**\n * The video clip source - only shown if a user specifically requests the clip after loading video event details.\n *\n * @type {String}\n */\n @tracked videoSource = '';\n\n /**\n * Should the video clip be viewed? Save this so the video source doesn't need to be retrieved multiple times.\n *\n * @type {boolean}\n */\n @tracked viewVideo = false;\n\n /**\n * Is the video clip capped at a medium size or will it go full size?\n *\n * @type {boolean}\n */\n @tracked videoSizeCapped = true;\n\n /**\n * Stores the current status of the clip list update after either a successful update or a failure.\n *\n * @type {String}\n */\n @tracked updateListStatus = null;\n\n /**\n * Stores the current status of the analyticsDetails object loading.\n *\n * @type {String}\n */\n @tracked updateAnalyticsDetailsStatus = null;\n\n /**\n * Stores the current status of the zip file being downloaded.\n *\n * @type {Object}\n */\n @tracked downloadStatus = null;\n\n /**\n * Stores all sets of Background Key Name to Color Key Box classes.\n *\n * @type {Array}\n */\n @computed()\n get backgroundKeys() {\n return [\n { name: 'Is Thumbnail Slice', colorCssClass: 'color-key-box-is-thumbnail-slice' },\n { name: 'Target Not Found', colorCssClass: 'color-key-box-target-not-found' },\n { name: 'Not Sent to Classifier', colorCssClass: 'color-key-box-not-sent-to-classifier' }\n ];\n }\n\n /**\n * Stores all sets of Drawing Key Name to Color Key Box classes.\n *\n * @type {Array}\n */\n @computed()\n get drawingKeys() {\n return [\n { name: 'Rule (AOI/TW)', colorCssClass: 'color-key-box-rule' },\n { name: 'OVReady Classification Target', colorCssClass: 'color-key-box-ovready' },\n { name: 'Cloud Classification Target', colorCssClass: 'color-key-box-cloud' },\n { name: 'Cloud Classification Target of Interest', colorCssClass: 'color-key-box-cloud-interest' }\n ];\n }\n\n /**\n * Stores any error messages returned from api calls for debugging.\n *\n * @type {String}\n */\n @tracked errorMessage = null;\n\n constructor(...args) {\n super(...args);\n\n populateClipList.call(this, 10, null, null);\n }\n\n /**\n * Takes the video event id query param and makes an api call to get relevant analytics information.\n */\n async getInfoFromEventId() {\n const eventId = this.clipId,\n ajax = this.ajax;\n\n if (!Number.isInteger(parseInt(eventId))) {\n this.analyticsDetails = null;\n this.updateAnalyticsDetailsStatus = 'Invalid event id detected.';\n\n return;\n }\n\n this.updateAnalyticsDetailsStatus = 'Loading event information...';\n\n this.analyticsDetails = await ajax\n .apiRequest(`video/videoEventAnalyticsDetails/${parseInt(eventId)}`)\n .then(({ value = {} }) => {\n if (isEmpty(value.slices)) {\n this.updateAnalyticsDetailsStatus =\n 'No target slice information is associated with this clip, or this clip is not from your account.';\n } else {\n value.slices.forEach((slice) => {\n slice['thumbnailUrl'] = imageSource(slice['thumbnailUrl']);\n slice['backgroundColor'] = calculateBackgroundColor(slice);\n slice['snapshotUrl'] = imageSource(slice['snapshotUrl']);\n return slice;\n });\n }\n\n if (value.donationDetails) {\n this.feedback = value.donationDetails.clipQualityFeedback;\n this.feedbackText = value.donationDetails.clipQualityComments;\n }\n\n return value;\n })\n .catch(({ errors = [] }) => (this.errorMessage = errors.mapBy('detail').join(' ')));\n }\n\n /**\n * Stores the text of the clip donation button, which should accurately reflect the action-to-do given the donation status of the currently viewed clip.\n *\n * @type {String}\n */\n @computed('analyticsDetails.donationDetails.donated')\n get donateButtonText() {\n return this.analyticsDetails.donationDetails.donated ? 'Update' : 'Donate';\n }\n\n /**\n * If true, users can view and interact with clip donation UI as well as donate clips.\n *\n * @type {boolean}\n */\n @reads('contextManager.identityModel.canDonateClips')\n canDonateClips;\n\n /**\n * Disables the donate button while a donation is being processed.\n *\n * @type {boolean}\n */\n @tracked disableDonateButton = false;\n\n /**\n * The user entered clip feedback.\n *\n * @type {String}\n */\n @tracked feedbackText = '';\n\n /**\n * User entered indication if clip analytics are correct.\n *\n * @type {boolean|undefined}\n */\n @tracked feedback;\n\n /**\n * Indicates that no feedback has been provided yet.\n *\n * @type {boolean}\n */\n @computed('feedback')\n get hasNoFeedback() {\n return isEmpty(this.feedback);\n }\n\n /**\n * Indicates that no feedback text has been provided yet.\n *\n * @type {boolean}\n */\n @computed('feedbackText')\n get hasNoFeedbackText() {\n return isEmpty(this.feedbackText);\n }\n\n /**\n * Uses the router service to generate a URL for an anchor tag to show clip donation terms.\n */\n get urlForDonationTerms() {\n return this.router.urlFor('info', {\n queryParams: {\n type: 'clipDonation'\n }\n });\n }\n\n @action\n selectSavedClip(clipId) {\n // Reset potentially stored video clip source.\n (this.errorMessage = null), (this.videoSource = '');\n this.viewVideo = false;\n this.downloadStatus = null;\n\n clipId = parseInt(clipId, 10);\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRoute(\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n this.contextManager.getRouteItem(EmberClassifierVisualization) || {},\n null,\n { clipId }\n );\n this.getInfoFromEventId();\n }\n\n @action\n updateDateTimeRange({ startDate, endDate }) {\n this.updateListStartEndTimes = {\n start: startDate,\n end: endDate\n };\n }\n\n /**\n * On-click method to update clip list to display a certain number of video events.\n * Number of events comes from input box on the page.\n * Start and end times are from updateListStartEndTimes, updated whenever dates are updated via an ember action.\n */\n @action\n updateClipList() {\n const { start, end } = this.updateListStartEndTimes;\n\n populateClipList.call(\n this,\n Math.min(parseInt(document.getElementById('update-list-size-input').value, 10), this.maximumNumClips),\n start,\n end\n );\n }\n\n /**\n * On-click method that downloads the selected video event information as a ZIP archive.\n * Raw bytes corresponding to the ZIP file are returned as a response from the server and converted into a blob.\n */\n @action\n downloadClipZip() {\n const { clipId, ajax } = this;\n\n const parsedEventId = parseInt(clipId);\n\n if (!Number.isInteger(parsedEventId)) {\n this.downloadStatus = { text: 'Download Failed', cssClass: 'download-error' };\n\n return;\n }\n\n ajax.apiRequest(`video/videoEventAnalyticsDetails/${parsedEventId}/getZipFile`)\n .then(({ value = {} }) => {\n downloadImageFromBytes(value.zipData, value.fileName);\n\n this.downloadStatus = { text: 'Download Complete', cssClass: 'download-success' };\n\n return value;\n })\n .catch(({ errors = [] }) => {\n this.errorMessage = errors.mapBy('detail').join(' ');\n });\n }\n\n /**\n * Plays the saved clip from the passed in video event id.\n *\n * @param {number} clipId\n */\n @action\n async toggleViewVideo(clipId) {\n // Only grab the video source for valid clip ids, once per video event load.\n if (!Number.isNaN(clipId) && !this.videoSource && !this.viewVideo) {\n const eventId = this.clipId,\n ajax = this.ajax;\n\n this.videoSource = await ajax\n .apiRequest(`video/videoEvents/${parseInt(eventId)}/getClipPlaybackUrl`)\n .then(({ value }) => {\n return value;\n })\n .catch(({ errors = [] }) => (this.errorMessage = errors.mapBy('detail').join(' ')));\n }\n\n this.viewVideo = !this.viewVideo;\n }\n\n /**\n * Toggles the video clip maximum size between a medium value and a full width value.\n */\n @action\n toggleVideoSize() {\n this.videoSizeCapped = !this.videoSizeCapped;\n }\n\n /**\n * Handles any video display errors.\n */\n @action\n handlePlayError() {\n this.errorMessage = 'Failed to play video clip.';\n this.videoSource = '';\n this.viewVideo = false;\n }\n\n /**\n * Sends the clip and its descriptors from the descriptor components to the db.\n */\n @action\n donateClip() {\n this.disableDonateButton = true;\n const { donationDetails } = this.analyticsDetails;\n donationDetails.clipQualityFeedback = this.hasNoFeedback ? 0 : this.feedback;\n donationDetails.clipQualityComments = this.hasNoFeedbackText ? null : this.feedbackText;\n\n this.ajax\n .apiRequest(\n `video/videoEventAnalyticsDetails/donateClip/?clipId=${parseInt(this.clipId, 10)}`,\n null,\n this.analyticsDetails.donationDetails,\n 'PUT'\n )\n .then(({ value = {} }) => {\n if (isEmpty(value)) {\n this.notificationManager.addError(this.intl.tc(this, 'errorDonating'));\n } else {\n this.notificationManager.addSuccess(this.intl.tc(this, 'successfullyDonated'));\n }\n\n set(this, 'analyticsDetails.donationDetails', value);\n this.disableDonateButton = false;\n })\n .catch(({ errors = [] }) => {\n this.errorMessage = errors.mapBy('detail').join(' ');\n this.disableDonateButton = false;\n });\n }\n}\n","import AdcBaseRoute from '../../classes/base-route';\nimport { EmberClassifierVisualization } from '../../enums/CustomerPageUrl';\n\n/**\n * @classdesc\n *\n * Route for the internal Classifier Visualization testing page.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberClassifierVisualization;\n\n queryParams = {\n clipId: {\n defaultValue: null\n }\n };\n\n /** @override */\n setupController(controller) {\n controller.getInfoFromEventId();\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport CalibrationSnapshotInfo from 'customer-site/components/modals/video/calibration-snapshot-info/index';\n\n/**\n * @classdesc\n *\n * Controller for enabling automatic clip donation during rule setup process for OV camera.\n *\n * @class video.clip-feedback.Controller\n * @extends Ember.Controller\n\n */\nexport default class extends EmberController {\n @service contextManager;\n @service intl;\n @service modals;\n @service notificationManager;\n @service nativeBridge;\n\n queryParams = ['cameraId'];\n\n /**\n * The most recent version of the clip donation agreement. Used to compare against\n * the version that the selected camera has accepted.\n */\n @reads('contextManager.identityModel.clipDonationAgreement.newestAgreementVersion')\n newestClipDonationAgreementVersion;\n\n /**\n * The resolved model object.\n *\n * @type {{\n * camera: video.devices.ov-ready-camera,\n * clipDonationModel: video.clip-donation-agreement\n * }}\n */\n @tracked\n resolvedModel;\n\n /**\n * Has the user checked the checkbox for reading the legal agreement?\n *\n * @type {boolean}\n */\n @tracked\n reviewedTerms = false;\n\n /**\n * Has the user checked the checkbox for donating calibration snapshots?\n * (We initialize this to true as we want the checkbox to be pre-selected\n * by default.)\n *\n * @type {boolean}\n */\n @tracked\n donateCalibrationSnapshots = true;\n\n /**\n * Only prompt the user to donate calibration snapshots if the camera supports calibration\n * and they haven't already enabled snapshot donation.\n *\n * @returns {boolean}\n */\n @computed('resolvedModel.{camera.supportsCalibration,camera.donateCalibrationSnapshots}')\n get showCalibrationSnapshotDonationSetting() {\n const { camera } = this.resolvedModel;\n\n return camera.supportsCalibration && !camera.donateCalibrationSnapshots;\n }\n\n /**\n * If this camera is auto-donating under the orginal clip donation terms,\n * we reprompt the user with the updated terms the first time they edit an existing\n * rule or create a new rule with that same camera.\n */\n @computed(\n 'resolvedModel.{camera.hasAcceptedClipDonationAgreement,camera.acceptedClipDonationAgreementVersion,camera.autoDonate}',\n 'newestClipDonationAgreementVersion'\n )\n get isReprompt() {\n const { camera } = this.resolvedModel;\n\n return (\n camera.hasAcceptedClipDonationAgreement &&\n camera.acceptedClipDonationAgreementVersion < this.newestClipDonationAgreementVersion &&\n camera.autoDonate\n );\n }\n\n /**\n * The image source for the clip donation icons for this route.\n *\n * @type {String}\n */\n remoteImage = '';\n\n /** @ignore */\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/classic-decorator-hooks\n init() {\n super.init(...arguments);\n\n set(this, 'remoteImage', this.contextManager.getStaticResourcePath('webimages/FeedbackIntro.gif'));\n }\n\n /**\n * Cancels enabling automatic clip donation and saves the rule.\n */\n @action\n cancel() {\n // If we are reprompting the user and asking them to accept the\n // updated agreement terms and they decline, disable auto donation\n // for this camera.\n if (this.isReprompt) {\n const camera = this.resolvedModel.camera;\n camera.autoDonate = false;\n camera.save();\n }\n\n this.notificationManager.addSuccess(this.intl.tc(this, 'successNotEnabled'));\n this.contextManager.transitionBackToMobileAppOrPreviousRoute(null, true);\n }\n\n /**\n * Set the camera's clip quality comments to the text-input value.\n *\n * @param comments\n */\n @action\n onCommentsChange(comments) {\n this.resolvedModel.camera.clipQualityComments = comments;\n }\n\n /**\n * Changes the value of the reviewedTerms flag.\n *\n * @param {boolean} checked\n */\n @action\n userReviewedTerms(newValue) {\n const {\n target: { checked: isChecked }\n } = newValue;\n this.reviewedTerms = isChecked;\n\n if (isChecked) {\n let objDiv = document.getElementById('legalAgreementText');\n objDiv.scrollTop = objDiv.scrollHeight;\n }\n }\n\n /**\n * Enables automatic clip donation with feedback and transitions back.\n */\n @action\n save() {\n // Save the changes on the camera.\n const camera = this.resolvedModel.camera;\n camera.autoDonate = true;\n\n if (this.showCalibrationSnapshotDonationSetting) {\n camera.donateCalibrationSnapshots = this.donateCalibrationSnapshots;\n }\n\n return camera.save().then(() => {\n this.notificationManager.addSuccess(this.intl.tc(this, 'successEnabled'));\n\n this.contextManager.transitionBackToMobileAppOrPreviousRoute(null, true);\n });\n }\n\n /**\n * Displays a modal explaining what calibration snapshots are.\n */\n @action\n showCalibrationSnapshotInfoModal() {\n this.modals.showModal(CalibrationSnapshotInfo);\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from '../../classes/base-route';\nimport { EmberVideoClipFeedback } from '../../enums/CustomerPageUrl';\n\n/**\n * @classdesc\n *\n * Route for prompting user to enable automatic clip feedback.\n *\n * @class video.clip-feedback.Route\n * @extends classes.BaseRoute\n */\nconst Route = AdcBaseRoute.extend(\n /** @lends video.clip-feedback.Route# */ {\n store: service(),\n\n /** @override */\n routeId: EmberVideoClipFeedback,\n\n queryParams: {\n cameraId: {}\n },\n\n /** @override */\n model({ cameraId }) {\n return {\n camera: this.store.findRecord('video/devices/ov-ready-camera', cameraId),\n clipDonationAgreement: this.contextManager.identityModel.clipDonationAgreement\n };\n }\n }\n);\n\nexport default Route;\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n {{#unless @model.isUsageByDateReportSelected}}\\n

{{@model.ovClassifiedText}}

\\n

{{@model.ovClassifiedDescriptionText}}

\\n

{{t \\'generic.video.objectDetection.other\\'}}

\\n

{{@model.ovClipUnknownDescriptionText}}

\\n {{#if @model.showNonVideoAnaylticStatistics}}\\n

{{t \\'generic.video.nonVideoAnalytics\\'}}

\\n

{{@model.eventsInThisGroupIncludeText}}

\\n
    \\n {{#each @model.nonVideoAnalyticTriggers as |trigger|}}\\n
  • {{trigger}}
  • \\n {{/each}}\\n
\\n {{/if}}\\n {{else}}\\n

{{@model.remainingCamerasText}}

\\n

{{@model.remainingCamerasDescriptionText}}

\\n {{/unless}}\\n
\\n\\n\",{ moduleName: \"customer-site/components/modals/video/clip-usage-category-details/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface ClipUsageCategoryDetailsModalSignature {\n Args: {\n model: {\n title: string;\n isUsageByDateReportSelected: boolean;\n ovClassifiedText: string;\n ovClassifiedDescriptionText: string;\n ovClipUnknownDescriptionText: string;\n showNonVideoAnaylticStatistics: boolean;\n eventsInThisGroupIncludeText: string;\n nonVideoAnalyticTriggers: string[];\n remainingCamerasText: string;\n remainingCamerasDescriptionText: string;\n };\n };\n}\n\nconst ClipUsageCategoryDetailsModal = templateOnlyComponent();\nexport default ClipUsageCategoryDetailsModal;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n ClipUsageCategoryDetailsModal: typeof ClipUsageCategoryDetailsModal;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.isNarrow}}\\n
\\n \\n
\\n {{/if}}\\n\\n
\\n \\n \\n \\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/clips-usage-report/report-toolbar/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { A } from '@ember/array';\nimport { action, computed, get } from '@ember/object';\nimport { or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { ISelectItem } from '@adc/ui-components/utils/select-item';\nimport type Camera from 'customer-site/models/video/devices/camera';\n\ninterface VideoClipsUsageReportReportToolbarArgs {\n cameraOrRuleId: string;\n disableDropdowns: boolean;\n cameras?: Camera[];\n chartType: string;\n ovRules?: OvRule[];\n reportType: string;\n selectChartType: (chartType: ChartType) => void;\n selectReportOption: (option: string) => void;\n selectTimeFrame: (timeFrame: TimeFrame) => void;\n selectedReportTypeString: string;\n selectedTimeFrame: TimeFrame;\n selectedChartType: ChartType;\n timeFrameOption: string;\n}\n\n/**\n * The type of chart selected by the user.\n */\nexport enum ChartType {\n bar = 'BAR',\n line = 'LINE'\n}\n\n/**\n * The timeframe selected by the user.\n */\nexport enum TimeFrame {\n day = 'DAY',\n week = 'WEEK',\n month = 'MONTH'\n}\n\nexport enum ReportType {\n byDate = 'DATE',\n byCamera = 'CAMERA',\n byRule = 'RULE'\n}\n\n// Both '-' and '_' are used in camera or rule ids.\nconst ReportTypeStringDelimiter = '/';\n\nexport function toReportTypeString(type: string, cameraOrRuleid: string): string {\n return type.toUpperCase() + ReportTypeStringDelimiter + cameraOrRuleid;\n}\n\nexport function parseReportTypeString(id: string): { type: string; cameraOrRuleid: string } {\n const explodedId = id.split(ReportTypeStringDelimiter);\n return { type: explodedId[0].toUpperCase(), cameraOrRuleid: explodedId[1] };\n}\n\n@intlPath({ path: 'video/clips-usage-report/report-toolbar' })\nexport default class VideoClipsUsageReportReportToolbar extends Component {\n @service declare intl: ADCIntlService;\n @service declare media: ADCResponsiveMediaService;\n\n /**\n * Boolean to determine if toolbar is open or not.\n */\n @tracked isToolbarOpen = false;\n\n /**\n * Indicates if the screen size is narrow.\n */\n @or('media.isMobile', 'media.isTabletPortrait')\n declare isNarrow: boolean;\n\n /**\n * Options to list in the report options dropdown.\n */\n @computed('args.{cameras,ovRules}')\n get reportTypeOptions(): ISelectItem[] {\n const { cameras, ovRules } = this.args,\n { intl } = this;\n\n const cameraSubitems =\n cameras?.map((c) => ({\n value: toReportTypeString(ReportType.byCamera, c.id),\n name: intl.t('generic.twoWordsWithParanthesis', {\n first: c.description,\n second: c.deviceModel\n })\n })) ?? [];\n\n const ruleSubitems =\n ovRules?.map((rule: OvRule) => {\n const camDescription = get(get(rule, 'camera'), 'description');\n return {\n value: toReportTypeString(ReportType.byRule, rule.id),\n name: intl.t('generic.twoWordsWithParanthesis', {\n first: rule.name,\n second: camDescription\n })\n };\n }) ?? [];\n\n return A([\n {\n name: intl.t('generic.selectReport'),\n subitems: [{ value: toReportTypeString(ReportType.byDate, ''), name: intl.tc(this, 'clipUsageByDate') }]\n },\n {\n name: intl.t('generic.selectCamera'),\n subitems: cameraSubitems\n },\n ruleSubitems.length\n ? {\n name: intl.t('generic.selectRecordingRule'),\n subitems: ruleSubitems\n }\n : undefined\n ]).compact();\n }\n\n /**\n * Options to list in the time frame dropdown.\n */\n get timeFrameOptions(): ISelectItem[] {\n const { intl } = this;\n\n return [\n {\n value: TimeFrame.week,\n name: intl.t('video.clips-usage-report.lastSevenDays')\n },\n {\n value: TimeFrame.month,\n name: intl.t('video.clips-usage-report.lastThirtyDays')\n },\n {\n value: TimeFrame.day,\n name: intl.t('video.clips-usage-report.lastTwentyFourHours')\n }\n ];\n }\n\n /**\n * Options to list in the chart type dropdown.\n */\n get chartTypeOptions(): ISelectItem[] {\n const { intl } = this;\n\n return [\n {\n value: ChartType.bar,\n name: intl.tc(this, 'barGraph')\n },\n {\n value: ChartType.line,\n name: intl.tc(this, 'lineGraph')\n }\n ];\n }\n\n /**\n * Action to toggle the dropdown.\n */\n @action\n toggleToolbar(): void {\n this.isToolbarOpen = !this.isToolbarOpen;\n }\n\n /**\n * Action for updating the report type dropdown selected value depending on the query params.\n */\n @action\n updateReportTypeOptionWithParams(): void {\n const { reportTypeOptions } = this;\n const { reportType, cameraOrRuleId, selectReportOption } = this.args;\n\n if (!reportType) {\n return;\n }\n\n const reportTypeString = toReportTypeString(reportType, cameraOrRuleId ?? '');\n\n const isReportTypeValid = reportTypeOptions.some(\n (option) => !!option.subitems?.some((item) => item.value === reportTypeString)\n );\n\n if (!isReportTypeValid) {\n return;\n }\n\n selectReportOption(reportTypeString);\n }\n\n /**\n * Action for updating the time frame dropdown selected value depending on the query params.\n */\n @action\n updateTimeFrameOptionWithParams(): void {\n const { timeFrameOptions } = this;\n const { timeFrameOption, selectTimeFrame } = this.args;\n\n if (!timeFrameOption) {\n return;\n }\n\n const capitalizedTimeFrameOption = timeFrameOption.toUpperCase();\n const isTimeFrameValid = timeFrameOptions.some((option) => option.value === capitalizedTimeFrameOption);\n\n if (!isTimeFrameValid) {\n return;\n }\n\n selectTimeFrame(capitalizedTimeFrameOption as TimeFrame);\n }\n\n /**\n * Action for updating the chart type dropdown selected value depending on the query params.\n */\n @action\n updateChartTypeOptionWithParams(): void {\n const { chartTypeOptions } = this;\n const { chartType, selectChartType } = this.args;\n\n if (!chartType) {\n return;\n }\n const capitalizedChartType = chartType.toUpperCase();\n const isChartTypeValid = chartTypeOptions.some((option) => option.value === capitalizedChartType);\n\n if (!isChartTypeValid) {\n return;\n }\n\n selectChartType(capitalizedChartType as ChartType);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::ClipsUsageReport::ReportToolbar': typeof VideoClipsUsageReportReportToolbar;\n }\n}\n","import { cached, tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport ClipUsageCategoryDetailsModal from 'customer-site/components/modals/video/clip-usage-category-details/index';\nimport {\n ChartType,\n TimeFrame,\n ReportType,\n toReportTypeString,\n parseReportTypeString\n} from 'customer-site/components/video/clips-usage-report/report-toolbar/index';\nimport VideoClipsUsageReportReportToolbar from 'customer-site/components/video/clips-usage-report/report-toolbar/index';\nimport {\n UsageReportsBarClicked,\n UsageReportsLineClicked,\n UsageReportsWeekClicked,\n UsageReportsMonthClicked,\n UsageReportsDayClicked,\n UsageReportsByDateClicked,\n UsageReportsByCameraClicked,\n UsageReportsByRuleClicked\n} from 'customer-site/enums/TrackedEvent';\nimport LineChart from 'customer-site/utils/highcharts/line';\nimport VerticalBarChart from 'customer-site/utils/highcharts/vertical-bar-chart';\nimport { isWithinInterval, startOfDay, startOfHour, subDays, subHours } from 'date-fns';\nimport {\n localToZonedTime,\n ClipUsageByDateSeriesFormatter,\n ClassifiedUploadsSeriesFormatter,\n TimePeriod\n} from './series-formatters';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type Lock from 'customer-site/models/devices/lock';\nimport type System from 'customer-site/models/systems/system';\nimport type AggregatedVideoEventsSummaryModel from 'customer-site/models/video/aggregated-video-events-summary';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OVRule from 'customer-site/models/video/ov-rule';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type Stats from 'customer-site/services/stats';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { Options } from 'highcharts';\nimport type VideoClipsUsageReportRoute from './route';\nimport type { DateInterval, SeriesFormatter } from './series-formatters';\n\nconst SURFACE_LIGHT_BG_COLOR = '#fff',\n SURFACE_DARK_BG_COLOR = '#1c1c20';\n\nconst MEDIUM_BREAKPOINT_PX = 768;\n/**\n * The type of series (Highcharts' term for a set of data).\n *\n * @see https://api.highcharts.com/highcharts/series.column.type\n * @see https://api.highcharts.com/highcharts/series.line.type\n */\ntype SeriesType = 'column' | 'line';\n\nexport default class VideoClipsUsageReport extends Controller {\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare stats: Stats;\n @service declare modals: ModalService;\n\n declare model: ModelFrom;\n\n clipsUsageToolbar = VideoClipsUsageReportReportToolbar;\n\n queryParams = ['reportType', 'cameraOrRuleId', 'timeFrameOption', 'chartType'];\n\n /**\n * Query param for report type.\n */\n @tracked reportType?: ReportType;\n\n /**\n * Query param for report id (either a camera or rule id).\n */\n @tracked cameraOrRuleId?: string;\n\n /**\n * Query param for time frame option (day, week, or month)\n */\n @tracked timeFrameOption?: TimeFrame;\n\n /**\n * Query param for chart type (line or bar)\n */\n @tracked chartType?: ChartType;\n\n /**\n * Cameras to be displayed in the report options dropdown in the toolbar.\n */\n @tracked cameras?: Camera[];\n\n /**\n * Does the user have read access for video analytics?\n */\n @tracked canViewVideoAnalytics = false;\n\n /**\n * Locks on the account.\n */\n @tracked locks?: Lock[];\n\n /**\n * OV Rules to be displayed in the report options dropdown in the toolbar.\n */\n @tracked ovRules?: OVRule[];\n\n /**\n * Clip Upload statistics to be displayed in the table on the page.\n */\n @tracked eventsSummaries?: AggregatedVideoEventsSummaryModel[];\n\n /**\n * The ADC system (combination of Unit and Customer).\n */\n @tracked system?: System;\n\n /**\n * The user's high-level video usage data (used to display the monthly clip quota on the chart.)\n */\n @tracked videoUsage?: VideoUsageModel;\n\n /**\n * String to keep track of the report option selected.\n */\n @tracked selectedReportTypeString: string = toReportTypeString(ReportType.byDate, '');\n\n /**\n * String to keep track of the time frame selected.\n */\n @tracked selectedTimeFrame: TimeFrame = TimeFrame.week;\n\n /**\n * String to keep track of the chart type selected.\n */\n @tracked selectedChartType: ChartType = ChartType.bar;\n\n /**\n * Gets a chart object which is compatible with the Highcharts::AccessibleChart component.\n */\n get chart(): VerticalBarChart | LineChart {\n return this.selectedChartType === ChartType.bar\n ? new VerticalBarChart(this.chartOptions)\n : new LineChart(this.chartOptions);\n }\n\n /**\n * Gets the object containing the relevant chart options to pass to Highcharts.\n */\n get chartOptions(): { chartOptions: Options } {\n const { intl, tooltipDateTimeFormatOptions, xAxisDateTimeFormatOptions } = this,\n { dates } = this.seriesFormatter;\n\n return {\n chartOptions: {\n chart: {\n /**\n * Highcharts bases the mask for the `scrollablePlotArea` axes off of `backgroundColor`,\n * so we need to explicitly specify it here even though we also specify it in our SASS\n * file.\n */\n backgroundColor: this.identityManager.isDarkModeEnabled\n ? SURFACE_DARK_BG_COLOR\n : SURFACE_LIGHT_BG_COLOR,\n scrollablePlotArea: {\n minWidth: MEDIUM_BREAKPOINT_PX\n }\n },\n legend: {\n symbolRadius: 2\n },\n series: this.seriesFormatter.series.map((series) => {\n return {\n ...series,\n type: this.seriesType\n };\n }),\n subtitle: {\n align: 'left',\n text: this.chartSubTitle\n },\n title: {\n align: 'left',\n text: this.chartTitle\n },\n tooltip: {\n formatter: function () {\n const fmt = tooltipDateTimeFormatOptions,\n idx = Number(this.x);\n\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/require-tz-functions\n return `${intl.formatDate(dates[idx], fmt)}\n \n \n ${this.series.name}:\n ${this.y}\n `;\n },\n outside: true,\n className: 'adc-branded-tooltip'\n },\n xAxis: {\n labels: {\n formatter: function () {\n const fmt = xAxisDateTimeFormatOptions,\n idx = Number(this.value);\n\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/require-tz-functions\n return intl.formatDate(dates[idx], fmt);\n }\n },\n tickInterval: this.selectedTimeFrame === TimeFrame.week ? 1 : 2,\n tickmarkPlacement: 'on',\n tickWidth: 1,\n title: {\n text: this.selectedTimeFrame === TimeFrame.day ? this.intl.tc(this, 'hourOfDay') : ''\n },\n type: 'category'\n },\n yAxis: {\n allowDecimals: false,\n reversedStacks: false,\n stackLabels: {\n enabled: false\n },\n title: {\n text: this.intl.t('generic.clips')\n }\n }\n }\n };\n }\n\n /**\n * The chart's main title.\n */\n get chartTitle(): string {\n const { cameraOrRuleid } = parseReportTypeString(this.selectedReportTypeString),\n { cameras, isRuleReportSelected, intl, ovRules } = this;\n\n if (isRuleReportSelected) {\n return intl.tc(this, 'clipUsageForRuleChartTitle', {\n rule: ovRules!.findBy('id', cameraOrRuleid)!.name\n });\n } else if (this.isCameraReportSelected) {\n const camera = cameras!.findBy('id', cameraOrRuleid)!;\n\n return intl.tc(this, 'clipUsageForCameraChartTitle', {\n cameraName: camera.description,\n cameraModel: camera.deviceModel\n });\n }\n\n return intl.tc(this, 'clipUsageByDateAllCamerasChartTitle');\n }\n\n /**\n * The chart's subtitle.\n */\n get chartSubTitle(): string {\n return this.intl.tc(this, 'monthlyClipUsageLimit', {\n number: this.intl.formatNumber(this.videoUsage?.uploadQuota ?? 0)\n });\n }\n\n /**\n * Gets the chart description according to the selected report type.\n */\n get chartDescription(): string {\n const { intl, selectedTimeFrame, isUsageByDateReportSelected, isCameraReportSelected } = this,\n { day, week, month } = TimeFrame;\n\n let timeFrameResourceString = '';\n switch (selectedTimeFrame) {\n case day:\n timeFrameResourceString = 'Day';\n break;\n case week:\n timeFrameResourceString = 'Week';\n break;\n case month:\n timeFrameResourceString = 'Month';\n break;\n }\n\n let resourceName = 'clipUsageForRuleDescription';\n\n if (isUsageByDateReportSelected) {\n resourceName = 'clipUsageByDateDescription';\n } else if (isCameraReportSelected) {\n resourceName = 'clipUsageForCameraDescription';\n }\n\n return intl.tc(this, resourceName + timeFrameResourceString);\n }\n\n /**\n * Gets the chart summary texts describing the observable trends.\n */\n get chartSummaryTexts(): string[] {\n const { intl, seriesFormatter } = this,\n { eventCountsByDate } = seriesFormatter,\n highestEventDisplay = {\n rsc: 'highestClips',\n details: eventCountsByDate[0]\n },\n lowestEventDisplay = {\n rsc: 'lowestClips',\n details: eventCountsByDate[eventCountsByDate.length - 1]\n },\n summaryTexts: string[] = [];\n\n if (!highestEventDisplay.details || !lowestEventDisplay.details) {\n return summaryTexts;\n }\n\n const { selectedTimeFrame, isUsageByDateReportSelected, canViewVideoAnalytics } = this,\n mostTriggeredEvent = seriesFormatter.eventCountsByTrigger[0];\n\n if (selectedTimeFrame !== TimeFrame.day) {\n [highestEventDisplay, lowestEventDisplay].forEach((eventDisplay) => {\n summaryTexts.push(\n intl.tc(this, eventDisplay.rsc, {\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/require-tz-functions\n date: this.intl.formatDate(eventDisplay.details.date),\n number: this.intl.formatNumber(eventDisplay.details.total)\n })\n );\n });\n }\n\n if (isUsageByDateReportSelected) {\n const camera = mostTriggeredEvent.trigger as Camera,\n cameraName = camera.get('description'),\n cameraModel = camera.get('deviceModel'),\n rsc =\n selectedTimeFrame == TimeFrame.day ? 'highestTriggeredCameraLast24Hours' : 'highestTriggeredCamera';\n\n summaryTexts.push(\n intl.tc(this, rsc, {\n cameraName,\n cameraModel,\n number: this.intl.formatNumber(mostTriggeredEvent.total)\n })\n );\n } else if (canViewVideoAnalytics) {\n summaryTexts.push(\n intl.tc(this, 'highestTriggeredClassification', {\n classification: mostTriggeredEvent.trigger\n })\n );\n }\n\n return summaryTexts;\n }\n\n /**\n * Gets the date `Interval` over which we want to graph the user's data.\n */\n get dateInterval(): DateInterval {\n const now = localToZonedTime(new Date(), { timeZone: this.identityManager.getTimezone() });\n\n switch (this.selectedTimeFrame) {\n case TimeFrame.day:\n return {\n start: startOfHour(subHours(now, 23)),\n end: now\n };\n case TimeFrame.month:\n return {\n start: startOfDay(subDays(now, 29)),\n end: now\n };\n case TimeFrame.week:\n return {\n start: startOfDay(subDays(now, 6)),\n end: now\n };\n }\n }\n\n /**\n * Whether a camera-specific report option has been selected by the user.\n */\n get isCameraReportSelected(): boolean {\n const { type } = parseReportTypeString(this.selectedReportTypeString);\n return type == ReportType.byCamera;\n }\n\n /**\n * Whether the \"Category Details\" tooltip below the chart is visible to the user.\n */\n get isCategoryDetailsVisible(): boolean {\n return this.isCameraReportSelected || this.isRuleReportSelected || this.isRemainingGroupVisible;\n }\n\n /**\n * Whether the \"Remaining Cameras\" group is visible to the user.\n */\n get isRemainingGroupVisible(): boolean {\n return (\n this.isUsageByDateReportSelected &&\n this.seriesFormatter.series.any((series) => series.custom?.camerasInGroup > 1)\n );\n }\n\n /**\n * Whether a rule-specific report option has been selected by the user.\n */\n get isRuleReportSelected(): boolean {\n const { type } = parseReportTypeString(this.selectedReportTypeString);\n return type === ReportType.byRule;\n }\n\n /**\n * Whether the \"Clip Usage by Date\" report option has been selected by the user.\n */\n get isUsageByDateReportSelected(): boolean {\n const { type } = parseReportTypeString(this.selectedReportTypeString);\n return type === ReportType.byDate;\n }\n\n /**\n * Gets the stringified list of triggers to call out in the summary section describing Non-Video Analytic uploads.\n */\n get nonVideoAnalyticTriggers(): string[] {\n const triggers = [];\n\n if (this.system?.supportsSecureArming) {\n triggers.push(\n ...[\n this.intl.t('generic.alarms'),\n this.intl.tc(this, 'sensorOpenClose'),\n this.intl.tc(this, 'systemArmDisarm'),\n this.intl.tc(this, 'entryDelay')\n ]\n );\n }\n\n if (this.locks?.length) {\n triggers.push(this.intl.tc(this, 'lockActivity'));\n }\n\n if (this.videoUsage?.hasVMDRules) {\n triggers.push(this.intl.t('generic.video.vmd'));\n }\n\n return triggers;\n }\n\n /**\n * Gets the amount of time associated with each point on the chart.\n */\n get pointInterval(): TimePeriod {\n return this.selectedTimeFrame === TimeFrame.day ? TimePeriod.HOUR : TimePeriod.DAY;\n }\n\n /**\n * Gets the type of the series being charted.\n */\n get seriesType(): SeriesType {\n return this.selectedChartType === ChartType.bar ? 'column' : 'line';\n }\n\n /**\n * Gets the appropriate series formatter given the user's selected toolbar options.\n */\n @cached\n get seriesFormatter(): SeriesFormatter {\n const Formatter = this.isUsageByDateReportSelected\n ? ClipUsageByDateSeriesFormatter\n : ClassifiedUploadsSeriesFormatter;\n\n return new Formatter(\n this,\n this.dateInterval,\n this.pointInterval,\n this.statsForSelectedReport,\n this.showNonVideoAnaylticStatistics\n );\n }\n\n /**\n * Whether we should show the non-video analytic category on the camera-specific reports\n * and describe it in the 'Learn More' details.\n */\n get showNonVideoAnaylticStatistics(): boolean {\n return (\n this.isCameraReportSelected &&\n !!(this.system?.supportsSecureArming || this.locks?.length || this.videoUsage?.hasVMDRules)\n );\n }\n\n /**\n * Filters the feteched statistics down depending upon the user's selected options.\n */\n get statsForSelectedReport(): AggregatedVideoEventsSummaryModel[] {\n const { cameraOrRuleid } = parseReportTypeString(this.selectedReportTypeString);\n return (\n this.eventsSummaries?.filter(\n (summary: AggregatedVideoEventsSummaryModel) =>\n (this.isUsageByDateReportSelected ||\n [summary.belongsTo('rule').id(), summary.belongsTo('camera').id()].includes(cameraOrRuleid)) &&\n isWithinInterval(\n localToZonedTime(summary.eventDate, { timeZone: this.identityManager.getTimezone() }),\n this.dateInterval\n )\n ) ?? []\n );\n }\n\n /**\n * DateTimeFormatOptions associated with the timestamps on point tooltips on the chart.\n */\n get tooltipDateTimeFormatOptions(): Intl.DateTimeFormatOptions {\n return this.selectedTimeFrame === TimeFrame.day\n ? { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric', hour: 'numeric' }\n : { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' };\n }\n\n /**\n * DateTimeFormatOptions associated with the timestamps on the x-axis of the chart.\n */\n get xAxisDateTimeFormatOptions(): Intl.DateTimeFormatOptions {\n return this.selectedTimeFrame === TimeFrame.day ? { hour: 'numeric' } : { day: 'numeric', month: 'numeric' };\n }\n\n /**\n * Handles unpacking data loaded from the route model into internally tracked properties.\n *\n * @param model.cameras The cameras from the route model\n * @param model.locks The locks from the route model\n * @param model.ovRules The ov rules from the route model\n * @param model.eventsSummaries The clip statistics from the route model\n * @param model.clipUsageReportPermissions The clip usage report permissions from the route model\n * @param model.system The system from the route model\n * @param model.videoUsage The high level video usage from the route model\n */\n @action async dataLoaded({\n cameras,\n clipUsageReportPermissions,\n eventsSummaries,\n locks,\n ovRules,\n system,\n videoUsage\n }: ModelFrom): Promise {\n Object.assign(this, {\n cameras: await cameras,\n canViewVideoAnalytics: (await clipUsageReportPermissions)?.hasVideoAnalyticsReadAccess,\n eventsSummaries: await eventsSummaries,\n locks: await locks,\n ovRules: await ovRules,\n system: await system,\n videoUsage: await videoUsage\n });\n }\n\n /**\n * Action to set the selectedReportTypeString and log stats.\n *\n * @param {string} optionString\n */\n @action\n selectReportOption(optionString: string): void {\n this.selectedReportTypeString = optionString;\n\n const { type } = parseReportTypeString(optionString);\n switch (type) {\n case ReportType.byDate:\n this.stats.logEvent(UsageReportsByDateClicked);\n break;\n case ReportType.byCamera:\n this.stats.logEvent(UsageReportsByCameraClicked);\n break;\n case ReportType.byRule:\n this.stats.logEvent(UsageReportsByRuleClicked);\n break;\n }\n }\n\n /**\n * Action to set the selectedTimeFrame and log stats.\n *\n * @param {string} optionString\n */\n @action\n selectTimeFrame(optionString: string): void {\n this.selectedTimeFrame = optionString as TimeFrame;\n switch (optionString) {\n case TimeFrame.week:\n this.stats.logEvent(UsageReportsWeekClicked);\n break;\n case TimeFrame.month:\n this.stats.logEvent(UsageReportsMonthClicked);\n break;\n case TimeFrame.day:\n this.stats.logEvent(UsageReportsDayClicked);\n break;\n }\n }\n\n /**\n * Action to set the selectedChartType and log stats.\n *\n * @param {string} optionString\n */\n @action\n selectChartType(optionString: string): void {\n this.selectedChartType = optionString as ChartType;\n switch (optionString) {\n case ChartType.bar:\n this.stats.logEvent(UsageReportsBarClicked);\n break;\n case ChartType.line:\n this.stats.logEvent(UsageReportsLineClicked);\n break;\n }\n }\n\n /**\n * Action to open the category details modal.\n */\n @action\n showCategoryDetailsModal(): void {\n const { modals, intl } = this;\n\n modals.showModal(ClipUsageCategoryDetailsModal, {\n title: intl.tc(this, 'categoryDetails'),\n isUsageByDateReportSelected: this.isUsageByDateReportSelected,\n ovClassifiedText: intl.tc(this, 'ovClassified'),\n ovClassifiedDescriptionText: intl.tc(this, 'ovClassifiedDescription'),\n ovClipUnknownDescriptionText: intl.tc(this, 'ovClipUnknownDescription'),\n showNonVideoAnaylticStatistics: this.showNonVideoAnaylticStatistics,\n eventsInThisGroupIncludeText: intl.tc(this, 'eventsInThisGroupInclude'),\n nonVideoAnalyticTriggers: this.nonVideoAnalyticTriggers,\n remainingCamerasText: intl.tc(this, 'remainingCameras'),\n remainingCamerasDescriptionText: intl.tc(this, 'remainingCamerasDescription')\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/clips-usage-report': VideoClipsUsageReport;\n }\n}\n","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n\n/**\n * @name isWithinInterval\n * @category Interval Helpers\n * @summary Is the given date within the interval?\n *\n * @description\n * Is the given date within the interval? (Including start and end.)\n *\n * @param {Date|Number} date - the date to check\n * @param {Interval} interval - the interval to check\n * @returns {Boolean} the date is within the interval\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} The start of an interval cannot be after its end\n * @throws {RangeError} Date in interval cannot be `Invalid Date`\n *\n * @example\n * // For the date within the interval:\n * isWithinInterval(new Date(2014, 0, 3), {\n * start: new Date(2014, 0, 1),\n * end: new Date(2014, 0, 7)\n * })\n * //=> true\n *\n * @example\n * // For the date outside of the interval:\n * isWithinInterval(new Date(2014, 0, 10), {\n * start: new Date(2014, 0, 1),\n * end: new Date(2014, 0, 7)\n * })\n * //=> false\n *\n * @example\n * // For date equal to interval start:\n * isWithinInterval(date, { start, end: date }) // => true\n *\n * @example\n * // For date equal to interval end:\n * isWithinInterval(date, { start: date, end }) // => true\n */\nexport default function isWithinInterval(dirtyDate, interval) {\n requiredArgs(2, arguments);\n var time = toDate(dirtyDate).getTime();\n var startTime = toDate(interval.start).getTime();\n var endTime = toDate(interval.end).getTime(); // Throw an exception if start date is after end date or if any date is `Invalid Date`\n\n if (!(startTime <= endTime)) {\n throw new RangeError('Invalid interval');\n }\n\n return time >= startTime && time <= endTime;\n}","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoClipsUsageReport, EmberVideoRules } from 'customer-site/enums/CustomerPageUrl';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type ArrayProxy from '@ember/array/proxy';\nimport type Lock from 'customer-site/models/devices/lock';\nimport type System from 'customer-site/models/systems/system';\nimport type ClipStatisticsModel from 'customer-site/models/video/aggregated-video-events-summary';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type ClipsUsageReportPermission from 'customer-site/models/video/permissions/clips-usage-report-permission';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\nimport type ContextManager from 'customer-site/services/context-manager';\n\nexport type VideoClipsUsageReportModel = {\n cameras: Promise>;\n clipUsageReportPermissions: ADCAsyncStoreFindRecord;\n eventsSummaries: ADCAsyncStoreFindAll;\n locks: Promise | ArrayProxy | undefined>;\n ovCameras: ADCAsyncStoreFindAll;\n ovRules: Promise | ArrayProxy | undefined>;\n system: ADCAsyncStoreFindRecord;\n videoUsage: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n *\n * This route shows the user clip upload statistics broken down by camera,\n * rule, and date.\n *\n * @class video.clips-usage-report.Route\n * @extends AdcBaseRoute\n */\nexport default class VideoClipsUsageReportRoute extends AdcBaseRoute {\n @service declare contextManager: ContextManager;\n\n routeId = EmberVideoClipsUsageReport;\n\n /** @override */\n queryParams = {\n reportType: getQueryParam('string'),\n cameraOrRuleId: getQueryParam('string'),\n timeFrameOption: getQueryParam('string'),\n chartType: getQueryParam('string')\n };\n\n model(): VideoClipsUsageReportModel {\n const { contextManager, store } = this,\n clipUsageReportPermissions = store.findRecord(\n 'video/permissions/clips-usage-report-permission',\n contextManager.getSelectedSystemId()\n );\n\n return {\n cameras: store\n .findAll('video/devices/camera')\n .then((cameras) => cameras.filterBy('isVirtualCamera', false)),\n clipUsageReportPermissions: clipUsageReportPermissions,\n eventsSummaries: store.findAll('video/aggregated-video-events-summary'),\n locks: clipUsageReportPermissions.then((perm) => {\n return perm.hasZwaveLocksReadAccess ? store.findAll('devices/lock') : undefined;\n }),\n ovCameras: store.findAll('video/devices/ov-ready-camera'),\n ovRules: clipUsageReportPermissions.then((perm) => {\n return perm.hasVideoAnalyticsReadAccess ? store.findAll('video/ov-rule') : undefined;\n }),\n system: store.findRecord('systems/system', contextManager.getSelectedSystemId()),\n videoUsage: store.findRecord('video/video-usage', contextManager.getSelectedSystemId())\n };\n }\n\n afterModel(): void {\n /**\n * Let's try to ensure that the video/rules route is in the backstack if the user refreshes the page.\n * Do not apply this logic for the mobile app to use the mobile stack rather than the web routes.\n * See the comments in VID-58772's PR for more detail.\n */\n if (!this.contextManager.isMobileApp && !this.contextManager.visitedRoutesStack?.length) {\n this.contextManager.addRouteToVisitedRoutesStack(EmberVideoRules);\n }\n }\n}\n","import FilteringVideoClipsController from '../../classes/video/clips/filtering-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The parent controller for saved video clips.\n */\nexport default class VideoClipsController extends FilteringVideoClipsController {\n declare model: ModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/clips': VideoClipsController;\n }\n}\n","import FilterVideoClipResultsController from 'customer-site/classes/video/clips/filter-results-controller';\n\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The index controller for displaying a paginated list of saved video clips, grouped by day.\n */\nexport default class VideoClipsIndexController extends FilterVideoClipResultsController {\n declare model: ModelFrom;\n resolvedModel?: Pick<\n ResolvedModelFrom,\n 'permissions' | 'formats' | 'clips' | 'showPreferredTimezone' | 'videoUsage' | 'mediaFromQueryParams'\n >;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/clips/index': VideoClipsIndexController;\n }\n}\n","import FilterVideoClipResultsRoute from '../../../classes/video/clips/filter-results-route';\n\n/**\n * @classdesc\n * The index route for displaying a paginated list of saved video clips, grouped by day.\n *\n * @class video.clips.index.VideoClipsIndexRoute\n * @extends classes.video.clips.FilterVideoClipResultsRoute\n */\nexport default class VideoClipsIndexRoute extends FilterVideoClipResultsRoute {}\n","import { inject as service } from '@ember/service';\nimport FilteringVideoClipsRoute from '../../classes/video/clips/filtering-route';\nimport { EmberVideoClips, EmberVideoGallery } from '../../enums/CustomerPageUrl';\n\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n * The parent route for saved video clips.\n *\n * @class video.clips.VideoClipsRoute\n * @extends classes.video.clips.FilteringVideoClipsRoute\n */\nexport default class VideoClipsRoute extends FilteringVideoClipsRoute {\n @service declare identityManager: IdentityManager;\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoClips;\n\n redirect(): void {\n const hasStoriesAccess = !!this.identityManager.identityModel?.hasStoriesAccess;\n if (hasStoriesAccess && this.routeId != EmberVideoGallery) {\n console.log('Transitioning to the gallery page...');\n this.navigation.transitionToRouteId(EmberVideoGallery);\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type AdcAjaxService from '@adc/ajax/services/adc-ajax';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type RouterService from '@ember/routing/router-service';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { DroneInstallRouteModel, Hive } from './route';\nimport type Route from './route';\nimport './_style.scss';\n\ntype InstallResult = {\n value: {\n error?: number;\n };\n};\n\n@intlPath({ path: 'video/drone-install' })\nexport default class DroneInstallController extends Controller {\n @service declare navigation: NavigationService;\n @service declare router: RouterService;\n @service declare modals: ModalService;\n @service declare intl: ADCIntlService;\n @service declare ajax: AdcAjaxService;\n\n declare model: ModelFrom;\n\n /**\n * Query params for onboard page.\n * @override\n */\n queryParams = ['code'];\n\n /**\n * Enums for the various screens\n */\n screenEnum = {\n Discovery: 0,\n Congratulations: 1,\n NoDevices: 2,\n UnableToLink: 3,\n Loading: 4\n };\n\n /**\n * The currently viewed screen\n */\n @tracked\n screen = this.screenEnum.Discovery;\n\n /**\n * The sunflower authentication code\n */\n @tracked\n code?: string;\n\n /**\n * The hives discovered\n */\n @tracked\n declare hives: Hive[];\n\n /**\n * Gets the default display description for the hive\n */\n getDefaultDisplayDescriptionForHive(hive: Hive): string {\n const { intl } = this;\n\n if (hive.existingDevice) {\n return intl.t('generic.dashSeparatedString', {\n first: hive.hiveId,\n second: hive.existingDevice.deviceDescription\n });\n }\n\n if (hive.matchingThirdPartyCamera) {\n return intl.t('generic.dashSeparatedString', {\n first: hive.hiveId,\n second: hive.matchingThirdPartyCamera.deviceDescription\n });\n }\n\n return hive.hiveId;\n }\n\n /*\n * Sets the appropriate displayed device description for the hives passed in\n */\n getHivesWithUpdatedDescriptions(hives: Hive[]): Hive[] {\n hives.forEach((hive) => {\n hive.displayDescription = this.getDefaultDisplayDescriptionForHive(hive);\n });\n\n return hives;\n }\n\n /**\n * The hives that the user has selected to be linked/installed\n */\n @computed('readyToLinkHives.@each.shouldSkipInstallation')\n get hivesMarkedForLinking(): Hive[] {\n return this.readyToLinkHives.filter((hive) => !hive.shouldSkipInstallation);\n }\n\n /**\n * Hives which are ready to link\n */\n @computed('hives')\n get readyToLinkHives(): Hive[] {\n const filteredHives = this.hives.filter(\n (hive) =>\n !hive.existingDevice && hive.matchingThirdPartyCamera && hive.isHiveInstallationAllowedForCurrentUser\n );\n\n return this.getHivesWithUpdatedDescriptions(filteredHives);\n }\n\n /**\n * Hives which the current user doesn't have permissions to install\n */\n @computed('hives')\n get hivesWithoutPermissions(): Hive[] {\n const filteredHives = this.hives.filter((hive) => !hive.isHiveInstallationAllowedForCurrentUser);\n\n return this.getHivesWithUpdatedDescriptions(filteredHives);\n }\n\n /**\n * Hives which aren't yet installed (but the user has permissions)\n */\n @computed('hives')\n get notInstalledHivesWithPermissions(): Hive[] {\n const filteredHives = this.hives.filter(\n (hive) =>\n !hive.existingDevice && !hive.matchingThirdPartyCamera && hive.isHiveInstallationAllowedForCurrentUser\n );\n\n return this.getHivesWithUpdatedDescriptions(filteredHives);\n }\n\n /**\n * Hives which are already installed\n */\n @computed('hives.length')\n get alreadyInstalledHives(): Hive[] {\n const filteredHives = this.hives.filter((hive) => hive.existingDevice);\n\n return this.getHivesWithUpdatedDescriptions(filteredHives);\n }\n\n /**\n * Set the hives model on data loaded\n */\n @action\n onDataLoaded(resolvedModel: DroneInstallRouteModel): void {\n // todo this is temporary code, remove later\n resolvedModel.hives.forEach((hive, index) => {\n hive.displayDescription = `Sunflower Drone (${index})`;\n });\n\n this.hives = resolvedModel.hives;\n\n if (!this.hives.length) {\n this.screen = this.screenEnum.NoDevices;\n }\n }\n\n /**\n * Installs the selected devices\n */\n @action\n async installDevices(): Promise {\n this.screen = this.screenEnum.Loading;\n\n const requests: Promise[] = [];\n\n this.hivesMarkedForLinking.forEach((hive) => {\n const postData: {\n hiveId: string;\n deviceDescription?: string;\n } = { hiveId: hive.hiveId, deviceDescription: hive.displayDescription };\n\n requests.push(this.ajax.apiRequest('api/video/sunflowerHives', undefined, postData, POST));\n });\n\n const responses = await Promise.all(requests);\n\n let allResponsesSucceeded = true;\n\n responses.forEach((response) => {\n // we display the unable to link page if any of the devices error\n if (response.value.error) {\n allResponsesSucceeded = false;\n }\n });\n\n if (allResponsesSucceeded) {\n this.screen = this.screenEnum.Congratulations;\n } else {\n this.screen = this.screenEnum.UnableToLink;\n }\n }\n\n /**\n * Refreshes the page which triggers a new discovery\n */\n @action\n restartDiscovery(): void {\n this.router.refresh();\n }\n\n /**\n * Shows the rename modal\n */\n @action\n showRenameModal(hive: Hive): void {\n const hiveIndex = this.hives.findIndex((h) => h.hiveId === hive.hiveId);\n\n this.modals.showRenameModal({\n title: this.intl.tc(this, 'renameDevice'),\n rename: (newName: string) => {\n if (!newName) {\n return false;\n }\n\n set(this.hives[hiveIndex], 'displayDescription', newName);\n return true;\n },\n output: {\n value: this.hives[hiveIndex].displayDescription ?? '',\n error: undefined\n }\n });\n }\n\n /**\n * Toggles if a hive is selected for installation\n */\n @action\n toggleHiveSelected(hive: Hive): void {\n const hiveIndex = this.hives.findIndex((h) => h.hiveId === hive.hiveId);\n set(this.hives[hiveIndex], 'shouldSkipInstallation', !this.hives[hiveIndex].shouldSkipInstallation);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/drone-install': DroneInstallController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoDroneInstall } from '../../enums/CustomerPageUrl';\n\nimport type AjaxService from 'customer-site/services/ajax';\nimport type DroneInstallController from './controller';\n\ntype GetHivesResponse = {\n errors: any[];\n value: {\n hives: Hive[];\n };\n};\n\ntype DroneInstallQueryParams = {\n code?: string;\n state?: string;\n};\n\ntype SunflowerDeviceWithState = {\n deviceDescription: string;\n deviceId: string;\n mac: string;\n};\n\nexport type Hive = {\n displayDescription?: string;\n isHiveInstallationAllowedForCurrentUser: boolean;\n hiveId: string;\n primaryMac: string;\n secondaryMac: string;\n existingDevice?: SunflowerDeviceWithState;\n matchingThirdPartyCamera?: SunflowerDeviceWithState;\n shouldSkipInstallation?: boolean;\n};\n\nexport interface DroneInstallRouteModel {\n hives: Hive[];\n}\n\n/**\n * @classdesc\n * Route for installation of drones.\n */\nexport default class DroneInstallRoute extends AdcBaseRoute {\n @service declare ajax: AjaxService;\n\n /** @override */\n queryParams = {\n code: { replace: true },\n state: { replace: true }\n };\n\n routeId = EmberVideoDroneInstall;\n\n async model(): Promise {\n const { code, state } = this.paramsFor(this.routeName) as DroneInstallQueryParams;\n if (code && state) {\n // calls the API for storing the Oauth token that we received from logging in to sunflower\n await this.ajax.apiRequest(`/api/swa/AirFx/GetOAuth2AccessToken?state=${state}&code=${code}`);\n }\n\n const hivesResponse: GetHivesResponse = await this.ajax.apiRequest('api/video/sunflowerHives');\n\n return {\n hives: hivesResponse.value.hives ?? []\n };\n }\n\n /**\n * Sets the page back to its original status\n */\n resetController(controller: DroneInstallController) {\n controller.screen = controller.screenEnum.Discovery;\n }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type FamiliarTargetFeedbackEvent from 'customer-site/models/video/familiar-targets/familiar-target-feedback-event';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { FamiliarSubjectClipFeedbackRouteModel } from './route';\n\nexport default class FamiliarSubjectClipFeedbackController extends Controller {\n declare model: FamiliarSubjectClipFeedbackRouteModel;\n @service declare contextManager: ContextManager;\n\n /**\n * Check whether all the events have been reviewed, if so, redirect back to the saved clips page\n */\n @action\n reviewCompleted() {\n const feedbackEvents = this.model.feedbackEvents;\n // Check if every feedbackEvent has 'hasBeenReviewed' property set to true\n const allReviewed = feedbackEvents.every((event: FamiliarTargetFeedbackEvent) => event.hasBeenReviewed);\n\n if (allReviewed) {\n //reset the feedback clip status so if customer returns to the same clip redirection doesn't happen too early\n feedbackEvents.forEach((event: FamiliarTargetFeedbackEvent) => {\n event.hasBeenReviewed = false;\n });\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/familiar-subject-clip-feedback': FamiliarSubjectClipFeedbackController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsClipFeedback } from 'customer-site/enums/CustomerPageUrl';\nimport { Face, Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { findEnrollmentOfType } from 'customer-site/utils/video/settings/familiar-subject';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type { SyncHasMany } from '@ember-data/model';\nimport type Record from 'customer-site/models/activity/record';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetFeedbackEvent from 'customer-site/models/video/familiar-targets/familiar-target-feedback-event';\nimport type FamiliarTargetEvent from 'customer-site/utils/video/settings/familiar-target-event';\n\nexport type FamiliarSubjectEventModel = Record & FamiliarTargetEvent;\n\nexport interface FamiliarSubjectClipFeedbackRouteModel {\n videoEvent: FamiliarSubjectEventModel;\n enrollment: FamiliarTargetEnrollment;\n camera: Camera;\n hasMultipleFeedbackEvents: boolean;\n feedbackEvents: SyncHasMany;\n}\n\ninterface FamiliarSubjectClipFeedbackRouteArgs {\n id_clip: number;\n isNotificationEvent: string | undefined;\n isFamiliarVehicleFeedbackEvent: boolean | undefined;\n}\n\n/**\n * @classdesc\n *\n * Route for the Familiar Subject Saved Clip image feedback view\n */\nexport default class FamiliarSubjectClipFeedbackRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoFamiliarSubjectsClipFeedback;\n\n /** @override */\n queryParams = {\n isNotificationEvent: getQueryParam('string'),\n isFamiliarVehicleFeedbackEvent: getQueryParam('boolean')\n };\n\n async model({\n id_clip,\n isNotificationEvent,\n isFamiliarVehicleFeedbackEvent\n }: FamiliarSubjectClipFeedbackRouteArgs): Promise {\n const vehicleEnrollment = await findEnrollmentOfType(this.store, Vehicle),\n faceEnrollment = await findEnrollmentOfType(this.store, Face),\n videoSettingsPermission = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n ),\n hasVehicleAccessPermission =\n videoSettingsPermission.hasOnlyFamiliarVehicleAccess ||\n videoSettingsPermission.hasFamiliarFaceAndVehicleAccess,\n hasFaceAccessPermission =\n videoSettingsPermission.hasOnlyFamiliarFaceAccess ||\n videoSettingsPermission.hasFamiliarFaceAndVehicleAccess;\n\n if (!(vehicleEnrollment || faceEnrollment)) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n let event: FamiliarSubjectEventModel;\n try {\n event = await (isNotificationEvent\n ? this.store.findRecord('video/ov-event', id_clip)\n : this.store.peekRecord('video/video-event', id_clip) ??\n this.store.queryRecord('video/video-event', { id: id_clip, isFamiliarVehicleFeedbackEvent }));\n } catch {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n const feedbackEvents = event.familiarTargetFeedbackEvents,\n hasMultipleFeedbackEvents = feedbackEvents.length > 1,\n feedbackEventEnrollment = isFamiliarVehicleFeedbackEvent ? vehicleEnrollment : faceEnrollment;\n\n if (feedbackEvents.length === 0) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n if (vehicleEnrollment && hasMultipleFeedbackEvents && !vehicleEnrollment.multiVehicleFeedbackEnabled) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n if (!feedbackEventEnrollment) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n // If the intended enrollment is Vehicle and the user doesn't have familiar vehicle access, redirect to the previous route\n if (isFamiliarVehicleFeedbackEvent && !hasVehicleAccessPermission) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n // If the intended enrollment is Face, but the user does not have face permission, redirect to the previous route\n if (!isFamiliarVehicleFeedbackEvent && !hasFaceAccessPermission) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n return;\n }\n\n return {\n videoEvent: event,\n camera: await event.camera,\n feedbackEvents,\n enrollment: feedbackEventEnrollment,\n hasMultipleFeedbackEvents\n };\n }\n}\n","import FilteringVideoMediaController from 'customer-site/classes/video/gallery/filtering-video-media-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The parent controller for the gallery.\n */\nexport default class VideoGalleryController extends FilteringVideoMediaController {\n declare model: ModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/gallery': VideoGalleryController;\n }\n}\n","import FilterVideoMediaResultsController from 'customer-site/classes/video/gallery/filter-video-media-results-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The index controller for displaying a paginated list of saved video clips and snapshots, grouped by day.\n */\nexport default class VideoGalleryIndexController extends FilterVideoMediaResultsController {\n declare model: ModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/gallery/index': VideoGalleryIndexController;\n }\n}\n","import FilterVideoMediaResultsRoute from 'customer-site/classes/video/gallery/filter-video-media-results-route';\n\n/**\n * @classdesc\n * The index route for displaying a paginated list of saved video clips and snapshots, grouped by day.\n *\n * @class video.gallery.index.VideoGalleryIndexRoute\n * @extends classes.video.gallery.FilterVideoMediaResultsRoute\n */\nexport default class VideoGalleryIndexRoute extends FilterVideoMediaResultsRoute {}\n","import { inject as service } from '@ember/service';\nimport FilteringVideoMediaRoute from 'customer-site/classes/video/gallery/filtering-video-media-route';\nimport { EmberVideoClips, EmberVideoGallery } from '../../enums/CustomerPageUrl';\n\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n * The parent route for the gallery.\n *\n * @class video.gallery.VideoGalleryRoute\n * @extends classes.video.gallery.FilteringVideoMediaRoute\n */\nexport default class VideoGalleryRoute extends FilteringVideoMediaRoute {\n @service declare identityManager: IdentityManager;\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoGallery;\n\n redirect(): void {\n const hasStoriesAccess = !!this.identityManager.identityModel?.hasStoriesAccess;\n if (!hasStoriesAccess && this.routeId != EmberVideoClips) {\n console.log('Transitioning to the saved clips page...');\n this.navigation.transitionToRouteId(EmberVideoClips);\n }\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoInstallOverview } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * The parent route for video settings.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoInstallOverview;\n}\n","import { computed } from '@ember/object';\nimport { EmberVideoInstallTutorial } from 'customer-site/enums/CustomerPageUrl';\nimport BaseInstallOverviewController from '../base-install-overview-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nconst EnglishInstallTutorialUrlEnding = 'x6via87K2BA',\n FrenchInstallTutorialUrlEnding = '3eUIq6oIvxY';\n\n/**\n * @classdesc\n * The Controller for Install Overview Video page\n */\nexport default class VideoInstallTutorialController extends BaseInstallOverviewController {\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page\n */\n settingsPageId = EmberVideoInstallTutorial;\n\n /**\n * The source of the youtube video.\n */\n @computed('isAccountLanguageFrench')\n get youtubePlayerSrc(): string {\n return `https://www.youtube.com/embed/${\n this.isAccountLanguageFrench ? FrenchInstallTutorialUrlEnding : EnglishInstallTutorialUrlEnding\n }`;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/install-overview/install': VideoInstallTutorialController;\n }\n}\n","import { EmberVideoInstallTutorial } from 'customer-site/enums/CustomerPageUrl';\nimport BaseInstallOverviewRoute from '../base-install-overview-route';\n\n/**\n * The route for the replace device tutorial.\n */\nexport default class Route extends BaseInstallOverviewRoute {\n /** @override */\n routeId = EmberVideoInstallTutorial;\n}\n","import { computed } from '@ember/object';\nimport { EmberVideoReplaceTutorial } from 'customer-site/enums/CustomerPageUrl';\nimport BaseInstallOverviewController from '../base-install-overview-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nconst EnglishReplaceTutorialUrlEnding = '1CUZnYDuStM',\n FrenchReplaceTutorialUrlEnding = '-DQ0QhHYoc4';\n\n/**\n * @classdesc\n * The Controller for Replace Overview Video page\n */\nexport default class VideoReplaceTutorialController extends BaseInstallOverviewController {\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page\n */\n settingsPageId = EmberVideoReplaceTutorial;\n\n /**\n * The source of the youtube video.\n */\n @computed('isAccountLanguageFrench')\n get youtubePlayerSrc(): string {\n return `https://www.youtube.com/embed/${\n this.isAccountLanguageFrench ? FrenchReplaceTutorialUrlEnding : EnglishReplaceTutorialUrlEnding\n }`;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/install-overview/replace': VideoReplaceTutorialController;\n }\n}\n","import { EmberVideoReplaceTutorial } from 'customer-site/enums/CustomerPageUrl';\nimport BaseInstallOverviewRoute from '../base-install-overview-route';\n\n/**\n * The route for the replace device tutorial.\n */\nexport default class Route extends BaseInstallOverviewRoute {\n /** @override */\n routeId = EmberVideoReplaceTutorial;\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoInstallOverview } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * The parent route for video settings.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoInstallOverview;\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isBlank } from '@ember/utils';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type IntercomContactModel from 'customer-site/models/video/intercom/intercom-contact';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoIntercomContact from '../route';\n\nexport default class VideoIntercomContactEditController extends Controller {\n @service declare navigation: ServiceRegistry['navigation'];\n @service declare store: ServiceRegistry['store'];\n\n declare model: ModelFrom;\n\n /**\n * User-provided first name for the intercom contacts associated with this login.\n */\n @tracked\n firstName = this.model.firstName ?? '';\n\n /**\n * User-provided last name for the intercom contacts associated with this login.\n */\n @tracked\n lastName = this.model.firstName ? this.model.lastName ?? '' : '';\n\n /**\n * User-provided company name for the intercom contacts associated with this login.\n */\n @tracked\n companyName = !this.model.firstName ? this.model.lastName ?? '' : '';\n\n /**\n * Has the user filled out enough fields to submit the contact name?\n * The required fields are either the first and last name or the company name.\n */\n @computed('companyName', 'firstName', 'lastName')\n get canProceed(): boolean {\n return (!isBlank(this.firstName) && !isBlank(this.lastName)) || !isBlank(this.companyName);\n }\n\n @gt('model.contacts', 0)\n declare canEditName: boolean;\n\n /**\n * Run the task to update contact records.\n */\n @action\n async saveContacts(): Promise {\n const intercomPromises = this.model.contacts.map((contact: IntercomContactModel) => {\n contact.firstName = this.firstName;\n contact.lastName = isBlank(this.firstName) ? this.companyName : this.lastName;\n\n return contact.save();\n });\n\n await Promise.all(intercomPromises);\n\n set(this.model, 'firstName', this.firstName);\n set(this.model, 'lastName', isBlank(this.firstName) ? this.companyName : this.lastName);\n\n return Promise.resolve();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact/edit': VideoIntercomContactEditController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContactEdit } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoIntercomContactEdit extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoIntercomContactEdit;\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isBlank } from '@ember/utils';\nimport { EmberVideoIntercomContactEnrollmentNotifications } from 'customer-site/enums/CustomerPageUrl';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type IntercomContactModel from 'customer-site/models/video/intercom/intercom-contact';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoIntercomContact from '../../route';\n\nexport default class VideoIntercomContactEnrollmentEditController extends Controller {\n @service declare navigation: ServiceRegistry['navigation'];\n @service declare store: ServiceRegistry['store'];\n\n declare model: ModelFrom;\n\n /**\n * User-provided first name for the intercom contacts associated with this login.\n */\n @tracked\n firstName = this.model.firstName ?? '';\n\n /**\n * User-provided last name for the intercom contacts associated with this login.\n */\n @tracked\n lastName = this.model.firstName ? this.model.lastName ?? '' : '';\n\n /**\n * User-provided company name for the intercom contacts associated with this login.\n */\n @tracked\n companyName = !this.model.firstName ? this.model.lastName ?? '' : '';\n\n /**\n * Has the user filled out enough fields to submit the contact name?\n * The required fields are either the first and last name or the company name.\n */\n @computed('companyName', 'firstName', 'lastName')\n get canProceed(): boolean {\n return (!isBlank(this.firstName) && !isBlank(this.lastName)) || !isBlank(this.companyName);\n }\n\n @gt('model.contacts', 0)\n declare canEditName: boolean;\n\n /**\n * Update the contact records locally, but do not save them in the backend.\n */\n @action\n updateContacts(): void {\n this.model.contacts.forEach((contact: IntercomContactModel) => {\n contact.firstName = this.firstName;\n contact.lastName = isBlank(this.firstName) ? this.companyName : this.lastName;\n });\n\n this.navigation.transitionToRouteId(EmberVideoIntercomContactEnrollmentNotifications);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact/enrollment/edit': VideoIntercomContactEnrollmentEditController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContactEnrollmentEdit } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoIntercomContactEnrollmentEdit extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoIntercomContactEnrollmentEdit;\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoIntercomContactEnrollmentEdit } from 'customer-site/enums/CustomerPageUrl';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\n\nexport default class VideoIntercomContactEnrollmentController extends Controller {\n @service declare contextManager: ServiceRegistry['context-manager'];\n @service declare identityManager: ServiceRegistry['identity-manager'];\n @service declare navigation: ServiceRegistry['navigation'];\n\n /**\n * The community name to display when the user starts their enrollment.\n */\n @reads('identityManager.identityModel.selectedSystem.description')\n declare communityName: string;\n\n /**\n * Transition to the mobile app.\n */\n @action\n cancelEnrollment(): void {\n this.contextManager.transitionBackToMobileApp();\n }\n\n @action\n transitionToEdit(): void {\n this.navigation.transitionToRouteId(EmberVideoIntercomContactEnrollmentEdit);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact/enrollment': VideoIntercomContactEnrollmentController;\n }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { VideoIntercomCall } from 'customer-site/enums/CustomerNotificationType';\n\nimport type NativeBridgeService from '@adc/app-infrastructure/services/native-bridge';\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoIntercomContact from '../../route';\n\nexport default class VideoIntercomContactEnrollmentNotificationsController extends Controller {\n @service declare contextManager: ServiceRegistry['context-manager'];\n @service declare nativeBridge: NativeBridgeService;\n @service declare navigation: ServiceRegistry['navigation'];\n\n declare model: ModelFrom;\n\n /**\n * Prompts the login to enable and create push notifications for the new intercom contact.\n * If push notifications are enabled, saves the intercom contacts' names.\n *\n * @returns A resolved promise if the notification was enabled and the names were saved. Otherwise a rejected promise.\n */\n @action\n async saveNewNotification(): Promise {\n if (this.nativeBridge.doesSupportEnablePushNotifications) {\n const result = await this.nativeBridge.enablePushNotifications([VideoIntercomCall]);\n if (result?.enabled) {\n // We updated the intercom contacts' name locally in the edit route, and this will make the API calls to save those updates.\n await Promise.all(\n this.model.contacts.map((contact) => {\n contact.isActive = true;\n contact.save();\n })\n );\n this.contextManager.transitionBackToMobileApp();\n return Promise.resolve();\n }\n }\n\n this.contextManager.transitionBackToMobileApp();\n return Promise.reject();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact/enrollment/notifications': VideoIntercomContactEnrollmentNotificationsController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContactEnrollmentNotifications } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoIntercomContactEnrollmentNotifications extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoIntercomContactEnrollmentNotifications;\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContactEnrollment } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoIntercomEnrollment extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoIntercomContactEnrollment;\n}\n","import Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberVideoIntercomContactEdit,\n EmberVideoIntercomContactNotifications\n} from 'customer-site/enums/CustomerPageUrl';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoIntercomContact from '../route';\n\nexport default class VideoIntercomContactController extends Controller {\n @service declare navigation: ServiceRegistry['navigation'];\n\n declare model: ModelFrom;\n\n /**\n * Get and format the intercom contact's initials to use for the contact's avatar.\n */\n @computed('model.{firstName,lastName}')\n get initials(): string | undefined {\n return `${this.model.firstName?.charAt(0) ?? ''}${this.model.lastName?.charAt(0)}`;\n }\n\n /**\n * Transition to the edit contact name page.\n */\n @action\n transitionToEdit(): void {\n this.navigation.transitionToRouteId(EmberVideoIntercomContactEdit);\n }\n\n /**\n * Transition to the notification settings page.\n */\n @action\n transitionToNotifications(): void {\n this.navigation.transitionToRouteId(EmberVideoIntercomContactNotifications);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact': VideoIntercomContact;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { MINUTES_IN_DAY } from '@adc/ember-utils/constants/time';\nimport Controller from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { Unknown, TextOnly, AttachThumbnail } from 'customer-site/enums/VideoNotificationFormat';\nimport { EVERY_DAY } from 'customer-site/utils/datetime';\nimport ContactTypeEnum from '@adc/login-setup-addon/enums/ContactType';\nimport { default as DropdownSelectItem, UNSELECTED, SELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type PushDeviceAddress from 'customer-site/models/users/push-device-address';\nimport type IntercomCallRule from 'customer-site/models/video/intercom/intercom-call-rule';\nimport type IntercomContact from 'customer-site/models/video/intercom/intercom-contact';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ntype Schedule = {\n dayBits: number;\n beginTime: number;\n endTime: number;\n};\n\n/**\n * @classdesc\n * Inner class representing a notification item to be displayed.\n *\n * @property {{models.users.ContactAddress}} contact A single contact address.\n * @property {{Boolean}} isSelected Whether the contact address is currently selected or not.\n *\n */\nclass NotificationItem {\n @tracked contact;\n\n @tracked isSelected;\n\n @tracked options: DropdownSelectItem[] | null;\n\n @tracked selectedOption: string | null;\n\n constructor(\n contact: PushDeviceAddress,\n isSelected: boolean,\n options: DropdownSelectItem[] | null,\n selectedOption: string | null\n ) {\n this.contact = contact;\n this.isSelected = isSelected;\n this.options = options;\n this.selectedOption = selectedOption;\n }\n}\n\nexport default class VideoIntercomContactNotificationsController extends Controller {\n @service declare store: Store;\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationManager;\n\n /**\n * Initialize beginMinutes to 00:00 by default for new schedules.\n */\n defaultBeginMinutes = 0;\n\n /**\n * Initialize endMinutes to 00:00 (next day) by default for new schedules.\n */\n defaultEndMinutes = MINUTES_IN_DAY;\n\n /**\n * Initialize days to all days by default for new schedules.\n */\n defaultScheduleDays = EVERY_DAY;\n\n /**\n * The intercom call rules that we are editing.\n */\n @alias('model.rules')\n declare intercomRules: IntercomCallRule[];\n\n /**\n * The active intercom contact\n */\n @alias('model.contacts')\n declare contacts: IntercomContact[];\n\n /**\n * The intercom rules' schedule.\n * It is currently the same across all rules for a login.\n */\n @alias('model.schedule')\n declare schedule: Schedule;\n\n /**\n * Is the intercom contact represented by this login active?\n */\n @alias('model.isActive')\n declare isActive: boolean;\n\n /**\n * The push device recipients for this intercom call rule.\n */\n @alias('model.pushDeviceRecipients')\n declare pushDeviceRecipients: PushDeviceAddress[];\n\n /**\n * Can we add a panel as a recipient for intercom call rules?\n */\n @alias('model.canAddPanelRecipient')\n declare canAddPanelRecipient: boolean;\n\n /**\n * Has the current intercom call rule reicpient count reached the max quota?\n */\n @alias('model.hasReachedRecipientQuota')\n declare hasReachedRecipientQuota: boolean;\n\n panelContactType = ContactTypeEnum.Panel;\n\n /**\n * Whether any notification recipient item is selected.\n */\n @computed('pushDeviceRecipientsItem.@each.isSelected')\n get anyPushDeviceRecipients(): boolean {\n return this.pushDeviceRecipientsItem.some((item) => item.isSelected);\n }\n\n /**\n * Collection of notification push device recipients to be displayed.\n */\n @computed('canAddPanelRecipient', 'pushDeviceRecipients')\n get pushDeviceRecipientsItem(): NotificationItem[] {\n const items = this.pushDeviceRecipients;\n const sendingFormatOptions: { [key: number]: { text: string } } = {\n [TextOnly]: { text: this.intl.tc(this, 'textPreview') },\n [AttachThumbnail]: { text: this.intl.tc(this, 'thumbnailPreview') }\n };\n const dropdownItems = Object.entries(sendingFormatOptions).map(([formatValue, formatText]) => {\n return DropdownSelectItem.create({\n name: formatText.text,\n value: String(formatValue),\n state: UNSELECTED\n });\n });\n\n return items.map((item, index) => {\n // Last item will always be a panel recipient.\n if (this.canAddPanelRecipient && index === items.length - 1) {\n item.icon = 'panel';\n item.addressType = ContactTypeEnum.Panel;\n\n // Default to Text Only.\n if (item.sendingFormat === Unknown) {\n item.sendingFormat = TextOnly;\n }\n\n const selectedFormat = sendingFormatOptions[item.sendingFormat].text;\n\n // Update the selected dropdown value if it isn't TextOnly.\n if (item.sendingFormat === AttachThumbnail) {\n dropdownItems[1].state = SELECTED;\n }\n\n return new NotificationItem(item, item.canBeEnabled && item.enabled, dropdownItems, selectedFormat);\n }\n\n return new NotificationItem(item, item.canBeEnabled && item.enabled, null, null);\n });\n }\n\n /**\n * Is at least one intercom rule enabled?\n */\n @computed('intercomRules')\n get isIntercomCallRuleEnabled(): boolean {\n return this.intercomRules.some((rule) => rule.isEnabled === true);\n }\n\n /**\n * Whether or not to grey out the elements on the intercom call rule page.\n */\n @computed('anyPushDeviceRecipients', 'isIntercomCallRuleEnabled')\n get isDisabled(): boolean {\n return !this.anyPushDeviceRecipients || !this.isIntercomCallRuleEnabled;\n }\n\n /**\n * Is the current device an added recipient for the rule?\n */\n @computed('intercomRules')\n get isCurrentDeviceAdded(): boolean {\n return this.intercomRules.find((rule) => rule.includesCurrentDevice)?.includesCurrentDevice ?? false;\n }\n\n /**\n * The recipient list type.\n */\n get contactTypeEnum(): ContactTypeEnum {\n return ContactTypeEnum.IPhonePush;\n }\n\n /**\n * Update the rules' schedule.\n */\n @action\n scheduleChanged({ dayBits, beginTime, endTime }: Schedule): void {\n this.schedule = {\n dayBits,\n beginTime,\n endTime\n };\n }\n\n /**\n * Update whether the intercom rules are enabled for the push device.\n *\n * @param includesCurrentDevice Should the notification be enabled for the current push device?\n */\n async updateRulesIncludeCurrentDevice(includesCurrentDevice: boolean): Promise {\n const updatedRules = this.intercomRules.map((rule) => {\n rule.includesCurrentDevice = includesCurrentDevice;\n return rule;\n });\n\n set(this, 'intercomRules', updatedRules);\n await this.saveRule();\n }\n\n /**\n * Update the selected push device recipients for a rule.\n *\n * @param includesCurrentDevice Should the notification be enabled for the current push device?\n */\n @action\n updateSelectedRecipients(model: NotificationItem, isSelected: boolean): void {\n const recipients = this.pushDeviceRecipients.map((item) => {\n if (item === model.contact) {\n item.enabled = isSelected;\n }\n return item;\n });\n set(this, 'pushDeviceRecipients', recipients);\n }\n\n @action\n panelFormatToggled(sendingFormatString: string): void {\n const sendingFormat = Number(sendingFormatString);\n const recipients = this.pushDeviceRecipients;\n\n const panelRecipient = recipients.objectAt(recipients.length - 1);\n\n if (!panelRecipient) {\n this.notificationManager.addError(this.intl.tc(this, 'sendingFormatSaveError'));\n return;\n }\n\n panelRecipient.sendingFormat = sendingFormat;\n\n set(this, 'pushDeviceRecipients', recipients);\n }\n\n /**\n * Toggle the rule's enable status and the notification on and off.\n */\n @action\n onIsRuleEnabledChanged(): void {\n const updatedRules = this.intercomRules.map((rule) => {\n rule.isEnabled = !rule.isEnabled;\n return rule;\n });\n\n set(this, 'intercomRules', updatedRules);\n this.saveRule();\n }\n\n /**\n * Update the rules' includesCurrentDevice value.\n */\n @action\n async addCurrentDevice(): Promise {\n await this.updateRulesIncludeCurrentDevice(true);\n this.contextManager.transitionToPreviousRoute();\n }\n\n /**\n * Update and save the current login's isActive state based on the the isRuleEnabled toggle.\n */\n async updateContacts(): Promise {\n const contactPromises = this.contacts.map((contact) => {\n contact.isActive = this.isActive;\n return contact.save();\n });\n\n await Promise.all(contactPromises);\n }\n\n /**\n * Update the intercom rules based on their current schedules.\n */\n async updateRules(): Promise {\n const selectedRecipients = this.pushDeviceRecipientsItem.map((item) => item.contact);\n\n const rulePromises = this.intercomRules.map((rule) => {\n if (this.isIntercomCallRuleEnabled) {\n rule.dayBits = this.schedule.dayBits;\n rule.beginTime = this.schedule.beginTime;\n rule.endTime = this.schedule.endTime;\n }\n\n const currentDevice = this.pushDeviceRecipients.find((item) => item.isCurrentDevice);\n if (currentDevice) {\n rule.includesCurrentDevice = currentDevice.enabled;\n }\n\n rule.pushDeviceRecipients = selectedRecipients;\n\n return rule.save();\n });\n\n await Promise.all(rulePromises);\n }\n\n /**\n * Save the updated notifications and rule.\n */\n @action\n async saveRule(): Promise {\n await this.updateContacts();\n await this.updateRules();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/intercom-contact/notifications': VideoIntercomContactNotificationsController;\n }\n}\n","import { MINUTES_IN_DAY } from '@adc/ember-utils/constants/time';\nimport { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContactNotifications } from 'customer-site/enums/CustomerPageUrl';\nimport { EVERY_DAY_BITS } from 'customer-site/utils/datetime';\nimport { EnableIntercomNotifications } from '@adc/app-infrastructure/enums/NativeView';\n\nimport type NativeBridgeService from '@adc/app-infrastructure/services/native-bridge';\nimport type Transition from '@ember/routing/transition';\nimport type PushDeviceAddress from 'customer-site/models/users/push-device-address';\nimport type IntercomCallRule from 'customer-site/models/video/intercom/intercom-call-rule';\nimport type IntercomContact from 'customer-site/models/video/intercom/intercom-contact';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoIntercomContact from '../route';\n\ntype VideoIntercomContactNotificationsRouteModel = {\n contacts: ADCStoreQuery;\n isActive: boolean;\n rules?: IntercomCallRule[];\n schedule: { dayBits: number; beginTime: number; endTime: number };\n pushDeviceRecipients?: PushDeviceAddress[];\n canAddPanelRecipient: boolean;\n isEnabled: boolean;\n hasReachedRecipientQuota: boolean;\n};\n\nexport default class VideoIntercomContactNotifications extends AdcBaseRoute {\n @service declare nativeBridge: NativeBridgeService;\n\n /** @override */\n routeId = EmberVideoIntercomContactNotifications;\n\n beforeModel(transition: Transition) {\n if (!this.identityManager.identityModel /** || !this.contextManager.isMobileApp */) {\n transition.abort();\n }\n }\n\n /** @override */\n async model(_params: any, transition: Transition): Promise {\n // Get all rules for this login and the mobile device (this page is webview only).\n let rules: IntercomCallRule[] | undefined;\n\n // If there's an issue getting the rule, the API will throw an error and we should abort the transition to the notifications page.\n try {\n rules = (await this.store.findAll('video/intercom/intercom-call-rule')).toArray();\n } catch (error) {\n // An error means that the user does not have push notifications enabled,\n // so send them to the native page to enable push notifications.\n if (this.nativeBridge.doesSupportTransitionToNativeViewWithId(EnableIntercomNotifications)) {\n this.nativeBridge.transitionToNativeView(EnableIntercomNotifications);\n }\n\n transition.abort();\n }\n\n const rule = rules?.find((rule) => rule);\n\n const schedule = {\n dayBits: rule?.dayBits ?? EVERY_DAY_BITS,\n beginTime: rule?.beginTime ?? 0,\n endTime: rule?.endTime ?? MINUTES_IN_DAY\n };\n\n const contactModel: ModelFrom = this.modelFor('video.intercom-contact'),\n contacts = contactModel.contacts,\n isActive = contactModel.contacts.find((contact) => contact.isActive)?.isActive ?? false;\n\n const canAddPanelRecipient = rule?.canAddPanelRecipient ?? false;\n\n if (rule) {\n // Recipients enabled status should always be true when we load them here, except for panels.\n // When we remove the current device, its enabled status is cached in Ember Data and store.findAll() is grabbing that old data\n // even though we're loading the correct enabled value from the backend.\n // We'll set the enabled status to true for all recipients for now, unless its a panel.\n rule.pushDeviceRecipients.forEach((recipient, index, array) => {\n if (canAddPanelRecipient) {\n if (index !== array.length - 1) {\n recipient.enabled = true;\n }\n } else {\n recipient.enabled = true;\n }\n });\n }\n\n const pushDeviceRecipients = rule?.pushDeviceRecipients;\n const isEnabled = rule?.isEnabled ?? false;\n const hasReachedRecipientQuota = rule?.hasReachedRecipientQuota ?? false;\n\n return {\n contacts,\n isActive,\n rules,\n schedule,\n pushDeviceRecipients,\n canAddPanelRecipient,\n isEnabled,\n hasReachedRecipientQuota\n };\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoIntercomContact } from 'customer-site/enums/CustomerPageUrl';\n\nimport type IntercomContactModel from 'customer-site/models/video/intercom/intercom-contact';\n\ninterface IntercomContactRouteModel {\n contacts: ADCStoreQuery;\n firstName?: string;\n lastName?: string;\n unitName?: string;\n}\n\n/**\n * @classdesc\n *\n * Route for viewing intercom contact profile.\n */\nexport default class VideoIntercomContact extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoIntercomContact;\n\n /** @override */\n async model(): Promise {\n const contacts = await this.store.query('video/intercom/intercom-contact', {});\n\n const firstName = contacts.find((contact) => contact.firstName)?.firstName,\n lastName = contacts.find((contact) => contact.lastName)?.lastName,\n unitName = contacts.find((contact) => contact.unitName)?.unitName;\n\n return {\n contacts,\n firstName,\n lastName,\n unitName\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { set } from '@ember/object';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { Playing, Disconnected, FailedToConnect, Error, IceFailure } from '@adc/video-player/constants/player-messages';\n\n/**\n * @classdesc\n *\n * Run and display results of automated international video tests.\n *\n * @class video.international-tests.Controller\n * @extends Ember.Controller\n */\nexport default class InternationalTestsController extends Controller {\n @service intl;\n\n // Do not copy this deprecated usage. If you see this, please fix.\n // eslint-disable-next-line ember/no-tracked-properties-from-args\n @tracked camera = this.args.camera;\n\n @tracked\n startRunningTests = false;\n\n @tracked\n verifyLiveViewLoadingTimeTest = new VideoTest(\n 'Verify LiveView Loading Time',\n 'Check if LiveView loading time < 6 seconds',\n (time) => {\n return time != null && time < 6000;\n },\n this.intl.t('generic.video.test.success'),\n this.intl.t('generic.video.test.failed'),\n this.intl.t('generic.video.test.running')\n );\n\n @tracked\n tests = [this.verifyLiveViewLoadingTimeTest];\n\n /**\n * Runs when LiveView component is loaded\n * For the VerifyLiveViewLoadingTime test, calculates the live view component loading time.\n * @param event\n */\n @action\n internationalWebRtcEvent(id, event) {\n if (!this.model.cameras.findBy('id', id)?.runTests) {\n return;\n }\n\n switch (event) {\n case Playing:\n this.verifyLiveViewLoadingTimeTest.loadingTime =\n performance.now() - this.verifyLiveViewLoadingTimeTest.startTime;\n if (this.verifyLiveViewLoadingTimeTest.didTestFail) {\n this.verifyLiveViewLoadingTimeTest.failReason = 'Failed to load Live View under 6 seconds';\n }\n\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = true;\n break;\n\n case Error:\n this.verifyLiveViewLoadingTimeTest.failReason = this.intl.t('generic.video.errorFailConnect');\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = true;\n break;\n\n case Disconnected:\n this.verifyLiveViewLoadingTimeTest.failReason = this.intl.t(\n 'generic.video.streamingErrors.deviceNotConnected'\n );\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = true;\n break;\n\n case FailedToConnect:\n this.verifyLiveViewLoadingTimeTest.failReason = this.intl.t(\n 'generic.video.streamingErrors.failedToConnectShort'\n );\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = true;\n break;\n\n case IceFailure:\n this.verifyLiveViewLoadingTimeTest.failReason = this.intl.t(\n 'generic.video.streamingErrors.webRtcIceNegotiationFailedShort'\n );\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = true;\n break;\n }\n }\n\n @service notificationManager;\n @action\n runTests(camera) {\n // reset values\n this.verifyLiveViewLoadingTimeTest.isTestCompleted = false;\n this.verifyLiveViewLoadingTimeTest.failReason = '';\n\n this.model.cameras.forEach((c) => c.set('runTests', c.id === camera.id));\n this.notificationManager.addSuccess(`Running tests where Camera MAC = ${camera.macAddress}`);\n this.startRunningTests = true; // renders live view component\n\n this.verifyLiveViewLoadingTimeTest.isTestStarted = true;\n this.verifyLiveViewLoadingTimeTest.startTime = performance.now();\n }\n}\n\nclass VideoTest {\n @service intl;\n\n /**\n * Create an automated video test\n * @param name of the test\n * @param desc description of the test.\n * @param statusFunction calculates if the test succeeds or fails. Returns a boolean.\n */\n constructor(name, desc, statusFunction, success, fail, running) {\n this.name = name;\n this.desc = desc;\n this.statusFunction = statusFunction;\n set(this, 'testSuccess', success);\n set(this, 'testFail', fail);\n set(this, 'testRunning', running);\n }\n\n @tracked\n failReason = '';\n\n @tracked\n isTestCompleted = false;\n\n @tracked\n isTestStarted = false;\n\n @tracked\n loadingTime = null;\n\n @tracked\n startTime = null;\n\n @computed('failReason', 'isTestCompleted', 'isTestStarted', 'loadingTime', 'testFail', 'testRunning', 'testSuccess')\n get status() {\n if (!this.isTestStarted) {\n return '';\n } else if (!this.isTestCompleted) {\n return this.testRunning;\n } else if (this.failReason) {\n return this.testFail;\n }\n\n return this.statusFunction(this.loadingTime) ? this.testSuccess : this.testFail;\n }\n\n @computed('startTime', 'isTestCompleted')\n get timeToCompleteTest() {\n if (this.isTestCompleted) {\n return Math.floor(performance.now() - this.startTime);\n }\n\n return '';\n }\n\n @computed('isTestCompleted', 'status', 'testFail')\n get didTestFail() {\n return this.status === this.testFail;\n }\n\n @computed('isTestCompleted', 'status', 'testSuccess')\n get didTestSucceed() {\n return this.status === this.testSuccess;\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoInternationalTests } from 'customer-site/enums/CustomerPageUrl';\nimport AdcBaseRoute from '@adc/app-infrastructure/routes/base-route';\n\n/**\n * International Automated Video Test page for TAMs\n * (Technical Account Managers) to run after setting\n * up cameras. Verifies tests that need to be run on-site.\n */\nconst InternationalTestsRoute = AdcBaseRoute.extend(\n /** @lends video.international-tests.InternationalTestsRoute# */ {\n store: service(),\n\n /** @override */\n routeId: EmberVideoInternationalTests,\n\n /** @override */\n async model() {\n const { store } = this;\n const cameras = await store.findAll('video/devices/camera');\n return {\n cameras\n };\n }\n }\n);\n\nexport default InternationalTestsRoute;\n","import { EmberVideoCameraGroupsEdit, EmberVideoCameraGroups } from '../../enums/CustomerPageUrl';\nimport BaseLiveViewController from './base-live-view-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * Controller for single-system live view page.\n */\nexport default class LiveViewController extends BaseLiveViewController {\n declare model: ModelFrom;\n\n /** @override */\n get editGroupRouteId(): number {\n return EmberVideoCameraGroupsEdit;\n }\n\n /** @override */\n get manageGroupsRouteId(): number {\n return EmberVideoCameraGroups;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/live-view': LiveViewController;\n }\n}\n","import { EmberVideoLiveView } from '../../enums/CustomerPageUrl';\nimport BaseLiveViewRoute from './base-live-view-route';\n\n/**\n * @classdesc\n * Route for single-system live view page.\n */\nexport default class LiveViewRoute extends BaseLiveViewRoute {\n /** @override */\n routeId = EmberVideoLiveView;\n}\n","import { tracked } from '@glimmer/tracking';\nimport { ENTER_KEY } from '@adc/ember-utils/utils/a11y';\nimport { action, computed } from '@ember/object';\nimport { get } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { EmberOnvifInstallationNaming } from 'customer-site/enums/CustomerPageUrl';\nimport { ExplicitCredentials, StoredOrManufacturerDefaults } from 'customer-site/enums/OnvifCredentialsType';\nimport { getDoubleNewLineSeparatedString } from 'customer-site/utils/strings';\nimport { OnvifModalCssClass } from 'customer-site/video/onvif-install/naming/route';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport BaseOnvifInstallationController from '../base-onvif-installation-controller';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Transition from '@ember/routing/transition';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type {\n InstallationResult,\n OnvifCameraDiscoveryResultPostObject\n} from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type OnvifInstallCredentialsRoute from './route';\n\n/**\n * An Object with keys of ONVIF parent device global IDs mapping to values of OnvifCameraDiscoveryResult POST Object Lists.\n */\ntype ParentDeviceGroup = Record;\n\n/**\n * An object containing arrays separating discovery results by the results of their installation attempts.\n */\ntype GroupedDiscoveryResults = {\n successes: OnvifCameraDiscoveryResult[];\n failures: OnvifCameraDiscoveryResult[];\n};\n\n/**\n * The type of installation being performed.\n */\nexport const INSTALLATION_TYPE_DEFAULT = 0,\n INSTALLATION_TYPE_SHARED = 1,\n INSTALLATION_TYPE_INDIVIDUAL = 2;\n\n/**\n * The type of install performed for camera unlocks.\n */\ntype InstallationType =\n | typeof INSTALLATION_TYPE_DEFAULT\n | typeof INSTALLATION_TYPE_SHARED\n | typeof INSTALLATION_TYPE_INDIVIDUAL;\n\n/**\n * A helper which shows an error notification if we can grab an error message.\n */\nfunction showError(this: OnvifInstallCredentialsController, error: Error): void {\n const errorText = getErrorText(error);\n if (errorText) {\n this.notificationManager.addError(errorText);\n }\n}\n\n/**\n * A helper method that updates how many failures there are per device, and lets us know if any cameras requires a reset.\n */\nfunction checkIfUserShouldResetAnyCameras(\n this: OnvifInstallCredentialsController,\n failures: OnvifCameraDiscoveryResult[]\n): boolean {\n const { failedAttemptsPerDevice } = this;\n let hasUserPossiblyLockedTheirCamera = false;\n\n failures.forEach(({ id }) => {\n const failedAttempts = (failedAttemptsPerDevice[id] ?? 0) + 1;\n failedAttemptsPerDevice[id] = failedAttempts;\n if (failedAttempts >= MAX_FAILED_ATTEMPTS) {\n hasUserPossiblyLockedTheirCamera = true;\n }\n });\n\n return hasUserPossiblyLockedTheirCamera;\n}\n\n/**\n * This is used to group discovery results for the body of an installation POST request.\n */\nfunction groupResultsByParentDevice(onvifCameraDiscoveryResults: OnvifCameraDiscoveryResult[]): ParentDeviceGroup {\n return onvifCameraDiscoveryResults.reduce(\n (groupedDiscoveryResults: ParentDeviceGroup, onvifCameraDiscoveryResult) => {\n const parentId = get(onvifCameraDiscoveryResult.svr, 'id'),\n cameras = groupedDiscoveryResults[parentId];\n\n // Create new OnvifCameraDiscoveryResultPostObject, since using the original class directly in an ajax POST does not include the model id\n const postObject = onvifCameraDiscoveryResult.getPostObject();\n\n if (!cameras) {\n groupedDiscoveryResults[parentId] = [postObject];\n } else {\n cameras.push(postObject);\n }\n\n return groupedDiscoveryResults;\n },\n {}\n );\n}\n\n/**\n * Method to show the credentials exit modal that confirms if the user wants to exit the installation flow.\n */\nexport function showCredentialsExitModal(\n this: OnvifInstallCredentialsController,\n confirmButtonAction: () => void\n): void {\n const { contextManager, intl, modals, failureCount, successCount } = this;\n\n let fullBodyText;\n const bodyText1 = intl.tc(this, 'remainLocked', { failureCount });\n\n if (successCount > 0) {\n const bodyText2 = intl.tc(this, 'installedNowRecording', { successCount });\n fullBodyText = getDoubleNewLineSeparatedString(contextManager, bodyText1, bodyText2);\n } else {\n fullBodyText = bodyText1;\n }\n\n const confirmButton = {\n text: intl.t('generic.yesExit'),\n action: confirmButtonAction\n },\n backButton = {\n text: intl.t('generic.noGoBack'),\n action: () => modals.closeModal()\n },\n bailModalClassName = `credentials-bail-screen ${OnvifModalCssClass}`;\n\n modals.showConfirmationDialog(\n intl.tc(this, 'quitInstallation'),\n fullBodyText,\n confirmButton,\n backButton,\n bailModalClassName\n );\n}\n\n/**\n * The total number of failed attempts to unlock a device before a reset is required.\n */\nconst MAX_FAILED_ATTEMPTS = 3;\n\n/**\n * @classdesc\n * The controller for the ONVIF credentials section.\n */\nexport default class OnvifInstallCredentialsController extends BaseOnvifInstallationController {\n @service declare notificationManager: NotificationManager;\n @service declare ajax: AjaxService;\n @service declare store: Store;\n\n readonly nextRouteId = EmberOnvifInstallationNaming;\n\n declare model: ModelFrom;\n\n /**\n * An object mapping device id to the number of failures.\n */\n failedAttemptsPerDevice: Record = {};\n\n /**\n * The current username in the form.\n */\n @tracked username?: string;\n\n /**\n * The current password in the form.\n */\n @tracked password?: string;\n\n /**\n * The index of the current camera.\n * When the form is being used for shared credentials this will be undefined.\n */\n @tracked cameraIndex?: number;\n\n /**\n * The items that should be unlocked individually.\n */\n @tracked resultsToIndividuallyUnlock: OnvifCameraDiscoveryResult[] = [];\n\n /**\n * If the description shown should be a message about resetting the cameras.\n */\n @tracked showResetMessage = false;\n\n /**\n * The last installation's # of successes.\n */\n get successCount(): number {\n const successes = this.attemptUnlocks.last?.value?.successes ?? [];\n\n // If the install succeeded, account for multi-sensor subsequent cameras as part of the install count.\n return successes.flatMap((discoveryResult) => [\n discoveryResult.installationResult?.cameraId ?? [],\n ...(discoveryResult.installationResult?.subsequentCameraIds ?? [])\n ]).length;\n }\n\n /**\n * The last installation's # of failures, falling back to the # of uninstalled discovery results.\n */\n get failureCount(): number {\n return this.attemptUnlocks.last?.value?.failures?.length ?? this.getRemainingResults().length;\n }\n\n /**\n * If the device/s are currently unlocking or require reset\n * The current error message for the username and password input components.\n */\n @tracked inputErrorMessage?: string;\n\n /**\n * The number of results to individually unlock.\n */\n get numberOfResultsToIndividuallyUnlock(): number {\n return this.resultsToIndividuallyUnlock.length;\n }\n\n /**\n * The current credential type\n */\n credentialsType = StoredOrManufacturerDefaults;\n\n /**\n * The current installation type.\n */\n @tracked installationType: InstallationType = INSTALLATION_TYPE_DEFAULT;\n\n /**\n * If our current installation type is INSTALLATION_TYPE_INDIVIDUAL\n */\n @equal('installationType', INSTALLATION_TYPE_INDIVIDUAL)\n declare usingIndividualInstallation: boolean;\n\n /**\n * The number of cameras we are currently attempting to unlock. This is equal to numberOfResultsToIndividuallyUnlock in shared mode and 1 in individual mode.\n */\n @computed('numberOfResultsToIndividuallyUnlock', 'usingIndividualInstallation')\n get numberOfCamsUnlockingNow(): number {\n const { usingIndividualInstallation, numberOfResultsToIndividuallyUnlock } = this;\n\n return usingIndividualInstallation ? 1 : numberOfResultsToIndividuallyUnlock;\n }\n\n /**\n * Whether or not the ONVIF unlocker is still unlocking devices.\n */\n @computed('attemptDefaultUnlocks.isRunning', 'attemptSharedUnlock.isRunning', 'attemptIndividualUnlock.isRunning')\n get isUnlocking(): boolean {\n return (\n this.attemptDefaultUnlocks.isRunning ||\n this.attemptSharedUnlock.isRunning ||\n this.attemptIndividualUnlock.isRunning\n );\n }\n\n /**\n * The current ONVIF camera discovery result that should be unlocked.\n */\n @computed('cameraIndex', 'resultsToIndividuallyUnlock.[]')\n get currentResult(): OnvifCameraDiscoveryResult | undefined {\n const { cameraIndex, resultsToIndividuallyUnlock } = this;\n\n return cameraIndex == null ? undefined : resultsToIndividuallyUnlock[cameraIndex];\n }\n\n /**\n * Helper to get the remaining discovery results that have not been installed yet.\n */\n getRemainingResults(): OnvifCameraDiscoveryResult[] {\n return this.store\n .peekAll('video/onvif-camera-discovery-result')\n .filter((discoveryResult) => !discoveryResult.installationResult?.success);\n }\n\n /**\n * Clears errors on the user and password inputs\n */\n clearInputError(): void {\n this.inputErrorMessage = undefined;\n }\n\n /**\n * Called when the user enters a wrong user/password combination\n */\n onInputError(errorMessage: string): void {\n this.inputErrorMessage = errorMessage;\n this.notificationManager.addError(errorMessage);\n }\n\n /**\n * Called when all cameras have been successfully been unlocked - there are no failures.\n * This shows a success notification and transitions to the naming section of the installation flow.\n */\n onAllDevicesSucceeded(): Transition {\n const { intl, isTouchDevice, notificationManager, successCount } = this,\n resource = isTouchDevice ? 'allCamerasSucceededMobile' : 'allCamerasSucceededWeb',\n successMessage = intl.tc(this, resource, { successCount });\n notificationManager.addSuccess(successMessage);\n return this.transitionToNextInstallationRoute();\n }\n\n /**\n * This is called when the default installation (automatic installation attempt with default credentials) fails.\n */\n onDefaultFailure(failedInstalls: OnvifCameraDiscoveryResult[]): void {\n const { intl, modals, notificationManager, failureCount, successCount } = this,\n allFailed = successCount <= 0;\n\n // Automatically switch to SHARED install mode after default failure. If the user selects to go into individual mode (this.setupIndividualUnlocks) we'll switch it to\n // individual mode there\n this.installationType = INSTALLATION_TYPE_SHARED;\n\n // if only one failed, show the error as a notification message and take them to the individual unlock screen\n if (failureCount === 1) {\n if (allFailed) {\n if (failedInstalls[0]?.installationResult?.errorMessage === 'Failed') {\n notificationManager.addError(intl.tc(this, 'noUnlockedCameras'));\n } else {\n notificationManager.addError(\n failedInstalls[0]?.installationResult?.errorMessage ?? intl.tc(this, 'noUnlockedCameras')\n );\n }\n } else {\n // showing a success message instead of error message if atleast one succeeded\n notificationManager.addSuccess(\n `${intl.tc(this, 'successfullyUnlockedCameras', { successCount })} ${intl.tc(\n this,\n 'oneRemainsUnlocked'\n )}`\n );\n }\n\n this.setupIndividualUnlocks();\n } else {\n // else show the error message and also ask them if the remaining cameras have a shared password\n const errorMessage = allFailed\n ? `${intl.tc(this, 'noUnlockedCameras')} ${intl.tc(this, 'doAllCamsShare')}`\n : `${intl.tc(this, 'successfullyUnlockedCameras', { successCount })} ${intl.tc(\n this,\n 'doRemainingCamsShare',\n { failureCount }\n )}`;\n\n const modalTitle = intl.tc(this, 'unlockCameras'),\n confirmButton = {\n text: intl.t('generic.yes'),\n css: 'confirm-button'\n },\n cancelButton = {\n text: intl.t('generic.notSure'),\n action: () => this.setupIndividualUnlocks(),\n css: 'cancel-button'\n },\n cssClass = `on-default-failure-modal ${OnvifModalCssClass}`;\n\n modals.showConfirmationDialog(modalTitle, errorMessage, confirmButton, cancelButton, cssClass);\n }\n }\n\n /**\n * Gets called when a user enters invalid credentials (either in shared or individual mode). If we think a device or devices is locked and needs a reset we show a warning\n * and ask them to restart it before trying again.\n */\n onCredentialsFailure(requiresReset: boolean, errorMessage?: string): void {\n this.onInputError(errorMessage ?? this.intl.t('generic.video.installationErrors.incorrectCredentials'));\n if (requiresReset) {\n this.showResetMessage = true;\n }\n }\n\n /**\n * Sets up the page to individually unlock cameras instead of in batches\n */\n setupIndividualUnlocks(): void {\n this.installationType = INSTALLATION_TYPE_INDIVIDUAL;\n this.cameraIndex = 0;\n this.resultsToIndividuallyUnlock = this.getRemainingResults();\n\n // If no results to unlock individually move on.\n if (!this.resultsToIndividuallyUnlock.length) {\n this.transitionToNextInstallationRoute();\n }\n }\n\n /**\n * A modal that confirms if the user wants to continue attempting shared unlocks or start doing individual unlocks.\n */\n showPostResetModalForSharedInstall(): void {\n const { contextManager, intl } = this,\n modalDescriptionFirstSentence = intl.tc(this, 'sharedFailureFirst'),\n modalDescriptionSecondSentence = intl.tc(this, 'sharedFailureSecond');\n\n const modalTitle = intl.tc(this, 'unlockCameras'),\n modalDescription = getDoubleNewLineSeparatedString(\n contextManager,\n modalDescriptionFirstSentence,\n modalDescriptionSecondSentence\n ),\n confirmButton = {\n text: intl.t('generic.yes'),\n css: 'confirm-button'\n },\n cancelButton = {\n text: intl.t('generic.notSure'),\n action: () => this.setupIndividualUnlocks(),\n css: 'cancel-button'\n },\n cssClass = `shared-install-post-reset-modal ${OnvifModalCssClass}`;\n\n this.modals.showConfirmationDialog(modalTitle, modalDescription, confirmButton, cancelButton, cssClass);\n }\n\n /**\n * This marks that the relevant camera(s) were reset and resets the appearance of the credentials.\n */\n @action markThatCamerasWereReset(pointerEvent: PointerEvent): void {\n // Preventing the default behavior of tags. This was to resolve a bug related to context manager not being able to redirect after clicks\n pointerEvent.preventDefault();\n\n for (const deviceId in this.failedAttemptsPerDevice) {\n delete this.failedAttemptsPerDevice[deviceId];\n }\n\n this.showResetMessage = false;\n this.clearInputError();\n\n if (!this.usingIndividualInstallation) {\n this.showPostResetModalForSharedInstall();\n }\n }\n\n /**\n * Goes to the next device in the devices to unlock list, if one exists. If this is the last device (or we are in shared installation mode),\n * this will transition to the next section of the installation flow\n */\n @action goToNextDeviceOrNextInstallationRoute(isSkippingCurrentInstalls: boolean): Transition | undefined {\n const { cameraIndex, usingIndividualInstallation, resultsToIndividuallyUnlock } = this;\n\n // If we're in shared mode there's no \"next\" device to go to\n if (!usingIndividualInstallation) {\n const remainingResults = this.getRemainingResults();\n if (isSkippingCurrentInstalls) {\n this.markResultsAsSkipped(remainingResults);\n }\n\n return this.transitionToNextInstallationRoute();\n }\n\n if (cameraIndex === undefined) {\n return;\n }\n\n // Mark current cam as skipped.\n const currentResult = resultsToIndividuallyUnlock[cameraIndex];\n if (isSkippingCurrentInstalls) {\n this.markResultsAsSkipped([currentResult]);\n }\n\n const nextIndex = cameraIndex + 1;\n\n // Go to the next route if we're on the last device in the list in individual mode.\n if (nextIndex === resultsToIndividuallyUnlock.length) {\n return this.transitionToNextInstallationRoute();\n }\n\n // Reset the form\n this.cameraIndex = nextIndex;\n this.username = undefined;\n this.password = undefined;\n this.showResetMessage = false;\n this.clearInputError();\n return;\n }\n\n /**\n * Marks that the discovery result was skipped in our installation flow by updating our stored error message.\n */\n @action\n markResultsAsSkipped(results: OnvifCameraDiscoveryResult[]): void {\n const macAddresses = results.map(({ macAddress }) => macAddress);\n\n try {\n this.ajax.apiRequest('video/onvifInstallation/markSkipped', undefined, macAddresses as any, POST);\n } catch (e) {\n const errorText = getErrorText(e);\n if (errorText) {\n this.notificationManager.addError(errorText);\n }\n }\n }\n /**\n * When the skip button is clicked, go to the next device/installation route\n */\n @action onClickSkipButton(pointerEvent: PointerEvent): void {\n // Preventing the default behavior of tags. This was to resolve a bug related to context manager not being able to redirect after clicks\n pointerEvent.preventDefault();\n this.goToNextDeviceOrNextInstallationRoute(true);\n }\n\n /**\n * When a user changes the text in the username field\n */\n @action onUsernameChange(username: string): void {\n this.username = username;\n this.clearInputError();\n }\n\n /**\n * When a user changes the text in the password field\n */\n @action onPasswordChange(password: string): void {\n this.password = password;\n this.clearInputError();\n }\n\n /**\n * This shows a modal confirming if the user wants to exit. This is the same modal we show for the route's willTransition hook.\n * We cannot rely on the willTransition hook for Android (iOS works), because the webview is being closed so no transitions can be intercepted.\n */\n @action showExitModalForMobile(): void {\n showCredentialsExitModal.call(this, () => this.contextManager.transitionBackToMobileAppOrPreviousRoute());\n }\n\n /**\n * Attempting to unlock the device using credentials\n */\n @action async onTryCredentials(): Promise {\n this.credentialsType = ExplicitCredentials;\n\n let unlockSucceeded = true;\n\n if (this.resultsToIndividuallyUnlock.length) {\n unlockSucceeded = await this.attemptIndividualUnlock.perform(this.currentResult);\n } else {\n unlockSucceeded = await this.attemptSharedUnlock.perform();\n }\n\n if (!unlockSucceeded) {\n return Promise.reject();\n }\n }\n\n /**\n * If the user presses enter while typing in the inputs, it should be the same as clicking NEXT (do a credential attempt)\n */\n @action handleKeyUpOnInputs(event: KeyboardEvent): void {\n if (event.keyCode === ENTER_KEY) {\n this.onTryCredentials();\n }\n }\n\n /**\n * Shows the reset modal for when all devices fail to install.\n */\n @action showResetModalAllDevicesFailed(): void {\n const { intl, modals, numberOfCamsUnlockingNow } = this,\n modalTitle = intl.tc(this, 'invalidCredentials'),\n modalDescription = intl.tc(this, 'requiresResetWarning', { numCams: numberOfCamsUnlockingNow }),\n confirmButton = {\n text: intl.t('generic.yes'),\n css: 'confirm-button'\n },\n cancelButton = {\n text: intl.t('generic.no'),\n action: () => {\n this.showResetMessage = false;\n this.goToNextDeviceOrNextInstallationRoute(true);\n },\n css: 'cancel-button'\n },\n cssClass = `reset-credentials-modal ${OnvifModalCssClass}`;\n\n modals.showConfirmationDialog(modalTitle, modalDescription, confirmButton, cancelButton, cssClass);\n }\n\n /**\n * Show shared mixed failure modal.\n */\n @action showSharedMixedFailureModal(requiresReset: boolean): void {\n const { intl, contextManager, modals, successCount, failureCount } = this;\n\n const modalDescriptionFirstLine = intl.tc(this, 'sharedMixedFailureFirst', { successCount }),\n modalDescriptionSecondLine = requiresReset\n ? intl.tc(this, 'sharedMixedFailureSecondReset', { numCams: failureCount })\n : intl.tc(this, 'sharedMixedFailureSecondNonReset', { numCams: failureCount });\n\n const modalDescription = getDoubleNewLineSeparatedString(\n contextManager,\n modalDescriptionFirstLine,\n modalDescriptionSecondLine\n ),\n modalTitle = this.intl.tc(this, 'unlockCameras'),\n confirmButton = {\n text: intl.t('generic.yes'),\n css: 'confirm-button'\n },\n cancelButton = {\n text: intl.t('generic.notSure'),\n action: () => this.goToNextDeviceOrNextInstallationRoute(true),\n css: 'cancel-button'\n },\n cssClass = `shared-unlock-mixed-success-modal ${OnvifModalCssClass}`;\n\n modals.showConfirmationDialog(modalTitle, modalDescription, confirmButton, cancelButton, cssClass);\n }\n\n /**\n * This calls the helper to unlock all of the cameras using default credentials.\n */\n attemptDefaultUnlocks = task(async () => {\n this.installationType = INSTALLATION_TYPE_DEFAULT;\n this.credentialsType = StoredOrManufacturerDefaults;\n\n try {\n const toUnlock = this.model.onvifCameraDiscoveryResults,\n groupedDiscoveryResults = await this.attemptUnlocks.perform(toUnlock);\n\n const failedInstalls = groupedDiscoveryResults.failures;\n\n if (this.failureCount) {\n checkIfUserShouldResetAnyCameras.call(this, failedInstalls);\n this.onDefaultFailure(failedInstalls);\n } else {\n await this.onAllDevicesSucceeded();\n }\n } catch (e) {\n showError.call(this, e);\n }\n });\n\n /**\n * This calls the helper to unlock all of the cameras using the passed-in credentials.\n * Returns true if some devices succeeded unlocking, false otherwise.\n */\n attemptSharedUnlock = task(async () => {\n this.clearInputError();\n\n let someDevicesUnlocked = false;\n\n try {\n // Find all OnvifCameraDiscoveryResults that failed to install.\n const toUnlock = this.getRemainingResults(),\n groupedDiscoveryResults = await this.attemptUnlocks.perform(toUnlock),\n failedInstalls = groupedDiscoveryResults.failures;\n\n if (this.failureCount) {\n const requiresReset = checkIfUserShouldResetAnyCameras.call(this, failedInstalls);\n someDevicesUnlocked = this.successCount > 0;\n\n // Avoid showing the modal in onCredentialsFailure and use the modal below.\n this.onCredentialsFailure(requiresReset, failedInstalls.firstObject?.installationResult?.errorMessage);\n\n // Prefer showing the shared mixed failure modal over the requires reset modal\n if (someDevicesUnlocked) {\n this.showSharedMixedFailureModal(requiresReset);\n } else if (requiresReset) {\n this.showResetModalAllDevicesFailed();\n }\n } else {\n this.onAllDevicesSucceeded();\n someDevicesUnlocked = true;\n }\n } catch (e) {\n showError.call(this, e);\n }\n\n return someDevicesUnlocked;\n });\n\n /**\n * This calls the helper to unlock the discovery result.\n * Returns true if the unlock succeeded, false otherwise.\n */\n attemptIndividualUnlock = task(async (onvifCameraDiscoveryResult: OnvifCameraDiscoveryResult | undefined) => {\n if (!onvifCameraDiscoveryResult) {\n return false;\n }\n\n this.clearInputError();\n\n try {\n const toUnlock = [onvifCameraDiscoveryResult],\n groupedDiscoveryResults = await this.attemptUnlocks.perform(toUnlock),\n [individualFailure] = groupedDiscoveryResults.failures;\n\n if (individualFailure) {\n const requiresReset = checkIfUserShouldResetAnyCameras.call(this, groupedDiscoveryResults.failures);\n this.onCredentialsFailure(requiresReset, individualFailure.installationResult?.errorMessage);\n\n if (requiresReset) {\n this.showResetModalAllDevicesFailed();\n }\n } else {\n this.goToNextDeviceOrNextInstallationRoute(false);\n return true;\n }\n } catch (e) {\n showError.call(this, e);\n }\n\n return false;\n });\n\n /**\n * A task that attempts to unlock the passed in discovery results.\n * This'll update the discovery results with the result of the installation and\n * return the discovery results grouped by successes and failures.\n */\n attemptUnlocks = task({ drop: true }, async (onvifCameraDiscoveryResults: OnvifCameraDiscoveryResult[]) => {\n const { credentialsType, username, password } = this,\n installationResults = await this.ajax.apiRequestForValue(\n 'video/onvifInstallation/install',\n undefined,\n {\n credentialsType,\n username,\n password,\n onvifCameraDiscoveryResultsByParent: groupResultsByParentDevice(onvifCameraDiscoveryResults)\n },\n POST\n );\n\n installationResults.forEach((installationResult) => {\n const discoveryResult = onvifCameraDiscoveryResults.findBy('id', installationResult.discoveryId);\n\n if (discoveryResult) {\n discoveryResult.installationResult = installationResult;\n }\n });\n\n const groupedDiscoveryResults = onvifCameraDiscoveryResults.reduce(\n (accumulator: GroupedDiscoveryResults, discoveryResult) => {\n const success = discoveryResult.installationResult?.success;\n if (success) {\n accumulator.successes.push(discoveryResult);\n } else {\n accumulator.failures.push(discoveryResult);\n }\n\n return accumulator;\n },\n { successes: [], failures: [] }\n );\n\n return groupedDiscoveryResults;\n });\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/credentials': OnvifInstallCredentialsController;\n }\n}\n","import { action, setProperties } from '@ember/object';\nimport { EmberOnvifInstallationCredentials } from 'customer-site/enums/CustomerPageUrl';\nimport { restartOnvifInstallation } from '../base-onvif-installation-controller';\nimport BaseOnvifInstallationRoute from '../base-onvif-installation-route';\nimport { INSTALLATION_TYPE_DEFAULT, showCredentialsExitModal } from './controller';\n\nimport type Transition from '@ember/routing/transition';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type OnvifInstallCredentialsController from './controller';\n\ninterface OnvifInstallCredentialsRouteModel {\n onvifCameraDiscoveryResults: OnvifCameraDiscoveryResult[];\n}\n\n/**\n * @classdesc\n * The route which handles unlocking ONVIF devices.\n */\nexport default class OnvifInstallCredentialsRoute extends BaseOnvifInstallationRoute {\n readonly routeId = EmberOnvifInstallationCredentials;\n\n /**\n * If the user has clicked YES, EXIT from the modal\n */\n hasConfirmedExit = false;\n\n model(): OnvifInstallCredentialsRouteModel {\n return { onvifCameraDiscoveryResults: this.store.peekAll('video/onvif-camera-discovery-result').toArray() };\n }\n\n /** @override */\n afterModel(model: OnvifInstallCredentialsRouteModel): void {\n // This shouldn't happen unless the page was visited by url.\n if (!model.onvifCameraDiscoveryResults.length) {\n restartOnvifInstallation.call(this);\n }\n }\n\n /** @override */\n @action willTransition(transition: Transition): void {\n // transitionToNextInstallationRoute adds the forward queryParam. If willTransition is being triggered by transitionToNextInstallationRoute\n // we can ignore the bottom code, because the user isn't trying to bail on the installation. Also if hasConfirmedExit is true,\n // we dont need to show the bail window again because they've already confirmed YES while using it.\n if (transition.to.queryParams.forward || this.hasConfirmedExit) {\n this.hasConfirmedExit = false;\n return;\n }\n\n // If we're navigating to the previous route (and the user hasn't already clicked confirm on exiting), lets abort the transition\n // and open the bail window. (To give the user a chance to change their mind about exiting)\n transition.abort();\n showCredentialsExitModal.call(this.controller, () => {\n this.hasConfirmedExit = true;\n transition.retry();\n });\n }\n\n /** @override */\n resetController(controller: OnvifInstallCredentialsController, isExiting: boolean): void {\n if (isExiting) {\n setProperties(controller, {\n username: undefined,\n password: undefined,\n cameraIndex: undefined,\n resultsToIndividuallyUnlock: [],\n failedAttemptsPerDevice: {},\n showResetMessage: false,\n inputErrorMessage: undefined,\n installationType: INSTALLATION_TYPE_DEFAULT\n });\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, computed, get, setProperties } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberOnvifInstallationTermsOfService, VideoAddNewDevice } from 'customer-site/enums/CustomerPageUrl';\nimport { EmberSupport } from '../../../enums/CustomerPageUrl';\nimport BaseOnvifInstallationController from '../base-onvif-installation-controller';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type OnvifInstallIndexRoute from './route';\n\n/**\n * This is a comparator used for sorting OnvifCameraDiscoveryResults.\n * This sorts by svr name, then the port number, then by the device name (which should be the make & model)\n */\nexport function discoveryResultComparator(\n firstOnvifCameraDiscoveryResult: OnvifCameraDiscoveryResult,\n secondOnvifCameraDiscoveryResult: OnvifCameraDiscoveryResult\n): number {\n const firstSvrName = get(firstOnvifCameraDiscoveryResult.svr, 'description'),\n secondSvrName = get(secondOnvifCameraDiscoveryResult.svr, 'description'),\n svrNameComparison = firstSvrName.localeCompare(secondSvrName);\n\n if (svrNameComparison !== 0) {\n return svrNameComparison;\n }\n\n // Setting the port value to 9999 so that devices with unknown ports appear after devices with known ports\n const firstDevicePort = firstOnvifCameraDiscoveryResult.poePort || 9999,\n secondDevicePort = secondOnvifCameraDiscoveryResult.poePort || 9999;\n\n if (firstDevicePort !== secondDevicePort) {\n return firstDevicePort > secondDevicePort ? 1 : -1;\n }\n\n const firstDeviceName = firstOnvifCameraDiscoveryResult.name,\n secondDeviceName = secondOnvifCameraDiscoveryResult.name;\n\n return firstDeviceName.localeCompare(secondDeviceName);\n}\n\n/**\n * An item holding an ONVIF camera discovery result and if the item is selected.\n * This is used to the store the values of a CheckboxItem.\n *\n * @private\n */\nclass CheckboxItem {\n @tracked onvifCameraDiscoveryResult;\n @tracked selected;\n secondLineDisplay;\n\n constructor(onvifCameraDiscoveryResult: OnvifCameraDiscoveryResult, selected: boolean, secondLineDisplay: string) {\n this.onvifCameraDiscoveryResult = onvifCameraDiscoveryResult;\n this.selected = selected;\n this.secondLineDisplay = secondLineDisplay;\n }\n}\n\n/**\n * This extends a checkbox item to add a `isDisabled` property used when displayed.\n * This is used to display a CheckboxItem.\n *\n * @private\n */\ninterface CheckboxItemDisplay extends CheckboxItem {\n // Checkboxes are disabled when they are not already selected and the user cannot select anymore checkboxes.\n isDisabled: boolean;\n}\n\n/**\n * A display object for displaying the SVR's information and its found devices\n */\ninterface SvrDisplayObject {\n headerDeviceName: string;\n headerChannelsLeft: string;\n checkboxItemsDisplay: Array;\n}\n\n/**\n * @classdesc\n * The controller used for the ONVIF discover page.\n */\nexport default class OnvifInstallIndexController extends BaseOnvifInstallationController {\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n @service declare store: Store;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n readonly nextRouteId = EmberOnvifInstallationTermsOfService;\n\n /**\n * The current number of installed cameras on the user's account.\n */\n @tracked currentCameraCount?: number;\n\n /**\n * The max number of cameras possible to install on a user's account.\n */\n @tracked maxCameraCount?: number;\n\n /**\n * The ONVIF camera discovery results stored as checkbox items.\n */\n @tracked checkboxItems: CheckboxItem[] = [];\n\n /**\n * If the user's service package will prevent them from being able to install all of the discovered cameras\n */\n @tracked userCannotInstallAllDiscoveredCameras = false;\n\n /**\n * If the discovery warning for no cameras found should be shown as a page isntead of a notification.\n * This is meant for mobile.\n */\n @tracked showDiscoveryWarningAsPage = false;\n\n /**\n * If the service package warning should be shown as a page. This is covered in the parent route to\n * prevent a discovery request from occurring.\n */\n @tracked showMaxLimitPage = false;\n\n /**\n * If we have pre-selected cameras yet (this happens during page initialization)\n */\n camerasHaveBeenPreselected = false;\n\n /**\n * The current number of selected ONVIF camera discovery results.\n */\n @computed('checkboxItems.@each.selected')\n get selectedCount(): number {\n return this.checkboxItems.filterBy('selected').length;\n }\n\n /**\n * If the user has reached the max number of cameras possible.\n */\n @computed('selectedCount', 'currentCameraCount', 'maxCameraCount')\n get reachedMaxCameraCount(): boolean {\n const { currentCameraCount, maxCameraCount, selectedCount } = this;\n\n // If we haven't retrieved these values yet, return false.\n if (currentCameraCount == null || maxCameraCount == null) {\n return false;\n }\n\n return currentCameraCount == null || maxCameraCount == null\n ? false\n : selectedCount + currentCameraCount >= maxCameraCount;\n }\n\n /**\n * How many additional cameras is the user able to install (per their service package limitations)\n * NOTE: this does not subtract devices selected for installation\n */\n @computed('maxCameraCount', 'currentCameraCount')\n get numAdditionalCamsSupported(): number {\n const { maxCameraCount, currentCameraCount } = this;\n\n return maxCameraCount == null || currentCameraCount == null ? -1 : maxCameraCount - currentCameraCount;\n }\n\n /**\n * How many additional cameras is the user able to install (per their service package limitations) minus\n * the amount of items they currently have selected.\n */\n @computed('numAdditionalCamsSupported', 'selectedCount')\n get numAdditionalCamsSupportedMinusSelected(): number {\n return this.numAdditionalCamsSupported - this.selectedCount;\n }\n\n /**\n * The list of SVR's that have devices that can be discovered\n */\n @computed('model.onvifCameraDiscoveryResults.isSettled')\n get svrs() {\n const svrs: Array = [];\n\n if (!this.model.onvifCameraDiscoveryResults.isSettled) {\n return svrs;\n }\n\n // pushing all unique SVR's in the discovery results into an array.\n this.model.onvifCameraDiscoveryResults.forEach((result: OnvifCameraDiscoveryResult) => {\n if (!svrs.find((svr) => svr.id === result.svr.id)) {\n svrs.push(result.svr);\n }\n });\n\n return svrs;\n }\n\n /**\n * The recording capacities for all SVRs associated with our discovery results.\n */\n @computed('svrs', 'checkboxItems.{@each.selected,[]}')\n get svrsDisplayObject() {\n const { checkboxItems, intl, reachedMaxCameraCount, svrs } = this;\n const svrsDisplayObject: Array = [];\n\n svrs.forEach((svr) => {\n const checkboxItemsForThisSvr = checkboxItems.filter(\n (item) => item.onvifCameraDiscoveryResult.svr.id === svr.id\n );\n\n const checkedItemsCount = checkboxItemsForThisSvr.filter((item) => item.selected).length,\n channelsLeft = svr.numberOfChannelsSupported - svr.numberOfChannelsRecording,\n // uncheckedChannelsLeft is how many more things the user can select that they haven't already selected.\n // (we dont want them to select more than they are capable of installing, ie going over the channel limit)\n uncheckedChannelsLeft = channelsLeft - checkedItemsCount;\n\n const checkboxItemsDisplay = checkboxItemsForThisSvr.map((checkboxItem) => {\n const { onvifCameraDiscoveryResult, selected, secondLineDisplay } = checkboxItem,\n { isCurrentlyInstalled, svr } = onvifCameraDiscoveryResult,\n reachedCheckedLimits = reachedMaxCameraCount || uncheckedChannelsLeft <= 0,\n isDisabled = isCurrentlyInstalled || (!selected && reachedCheckedLimits);\n\n return {\n onvifCameraDiscoveryResult,\n selected,\n secondLineDisplay,\n isDisabled,\n svr\n };\n });\n\n const headerDeviceName = intl.tc(this, 'svrTitleHeaderDeviceName', { svrName: svr.description }),\n headerChannelsLeft = intl.t('generic.video.channelsAvailable', { channelsLeft });\n\n svrsDisplayObject.push({\n headerDeviceName,\n headerChannelsLeft,\n checkboxItemsDisplay\n });\n });\n\n return svrsDisplayObject;\n }\n\n /**\n * Update if a checkbox item is selected or not when the checkbox value changes.\n */\n @action\n toggleSelection(mac: string): void {\n const checkboxItem = this.checkboxItems.find((item) => item.onvifCameraDiscoveryResult.macAddress === mac);\n\n if (!checkboxItem) {\n return;\n }\n\n const isNowSelected = !checkboxItem.selected;\n checkboxItem.selected = isNowSelected;\n }\n\n /**\n * This unloads the discovery results we are not installing and continues to the next route.\n */\n @action unloadUnusedRecordsAndContinue(): void {\n this.checkboxItems.forEach(({ onvifCameraDiscoveryResult, selected }) => {\n if (!selected) {\n this.store.unloadRecord(onvifCameraDiscoveryResult);\n }\n });\n\n this.transitionToNextInstallationRoute();\n }\n\n @action dataLoaded(resolvedModel: ResolvedModelFrom): void {\n const { intl, contextManager } = this,\n { isMobileApp } = contextManager,\n { currentAndMaxCameraCounts, onvifCameraDiscoveryResults } = resolvedModel,\n { currentCameraCount, maxCameraCount } = currentAndMaxCameraCounts,\n discoveryResults = onvifCameraDiscoveryResults.toArray(),\n numberOfDiscoveryResults = discoveryResults.length;\n\n this.resetFlagsForMobilePageContent();\n\n if (isMobileApp && currentCameraCount >= maxCameraCount) {\n this.showMaxLimitPage = true;\n return;\n }\n\n // If there are no results found, show an error and navigate back to AddVideoDevice.\n if (!numberOfDiscoveryResults) {\n // For web, we show a notification and redirect to AddVideoDevice.\n // For mobile, AddVideoDevice is a native screen, so we will exit the webview and the customer will miss the notification.\n // So instead, for mobile we replace the current page's contents with the notification contents and a retry button.\n if (isMobileApp) {\n this.showDiscoveryWarningAsPage = true;\n return;\n }\n\n // We use add notification with 'issue' instead of addError, because it'll persist across navigating backwards.\n this.notificationManager.addNotification(\n intl.tc(this, 'noCamerasFound'),\n 'issue',\n undefined,\n 0,\n true,\n false,\n 'error'\n );\n\n // Clearing the visited routes stack so that the back button in the AddDevice page doesn't redirect back here (which would put them somewhat stuck in a loop)\n contextManager.clearVisitedRoutesStack();\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(VideoAddNewDevice);\n return;\n }\n\n // When the user has more available cameras than their service package supports\n this.userCannotInstallAllDiscoveredCameras = currentCameraCount + numberOfDiscoveryResults > maxCameraCount;\n\n const mappedCheckboxItems = (onvifCameraDiscoveryResults as OnvifCameraDiscoveryResult[]).map(\n (discoveryResult) => {\n const { ipAddress, macAddress, poePort, svr, isCurrentlyInstalled } = discoveryResult,\n portText = poePort ? `, ${intl.t('generic.video.port')} #${poePort}` : '',\n secondLineDisplay = isCurrentlyInstalled\n ? intl.tc(this, 'alreadyInstalledMessage', { macAddress })\n : `${macAddress} | ${svr.description}${portText} | ${ipAddress}`,\n // setting these to unselected until setInitialCheckedResults runs and sets it properly\n isSelected = false;\n return new CheckboxItem(discoveryResult, isSelected, secondLineDisplay);\n }\n );\n\n const sortedMappedCheckboxItems = mappedCheckboxItems.sort((firstCheckboxItem, secondCheckboxItem) => {\n return discoveryResultComparator(\n firstCheckboxItem.onvifCameraDiscoveryResult,\n secondCheckboxItem.onvifCameraDiscoveryResult\n );\n });\n\n setProperties(this, {\n currentCameraCount,\n maxCameraCount,\n checkboxItems: sortedMappedCheckboxItems\n });\n }\n\n /**\n * Refreshes the parent route model and the current route model.\n */\n @action refreshModelAndParentModel(): void {\n const { router } = this;\n\n const parentRoute = router.currentRoute.parent;\n if (parentRoute) {\n router.refresh(parentRoute.name);\n }\n\n this.refreshModel();\n }\n\n /**\n * This refreshes the route's model.\n */\n @action refreshModel(): void {\n const { router } = this;\n router.refresh(router.currentRouteName);\n }\n\n /**\n * A helper to reset flags used to show alternative page content for mobile.\n */\n @action resetFlagsForMobilePageContent(): void {\n // When we retry to reset these values to false for mobile retries in refreshModelAndParentModel and refreshModel\n // we'll get a UI flash. And we can't await the refresh() methods being called to coordinate setting these booleans.\n //\n // On web, we reset the values when exiting the route, but the route refreshes don't trigger those since we don't leave the route.\n // So we just end up resetting them in dataloaded, since there won't be any issues while dataloaded is running.\n this.showMaxLimitPage = false;\n this.showDiscoveryWarningAsPage = false;\n }\n\n /**\n * Sets devices to being selected based on the following logic.\n * We auto select devices if A. the user has enough room in their service package to install all cameras,\n * B. the svr has enough channels supported to install all of its discovered devices,\n * C. the device isn't already installed\n * NOTE: this function should only run once after data finishes loaded, and assumes the checkboxes are delesected\n *\n * @returns\n */\n @action\n setInitialCheckedResults() {\n if (\n this.camerasHaveBeenPreselected ||\n !this.svrs.length ||\n this.userCannotInstallAllDiscoveredCameras ||\n !this.checkboxItems.length\n ) {\n return;\n }\n\n this.svrs.forEach((svr) => {\n const uninstalledItemsForThisSvr = this.checkboxItems.filter(\n (item) =>\n item.onvifCameraDiscoveryResult.svr.id === svr.id &&\n !item.onvifCameraDiscoveryResult.isCurrentlyInstalled\n );\n\n const channelsLeft = svr.numberOfChannelsSupported - svr.numberOfChannelsRecording;\n\n // If the SVR doesn't have enough channels to install all of its discovered devices, lets not pre-select its stuff\n if (channelsLeft - uninstalledItemsForThisSvr.length < 0) {\n return;\n }\n\n uninstalledItemsForThisSvr.forEach((item) => {\n this.toggleSelection(item.onvifCameraDiscoveryResult.macAddress);\n });\n });\n\n this.camerasHaveBeenPreselected = true;\n }\n\n /**\n * Navigate to the support page\n */\n @action\n goToSupportPage() {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberSupport);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/index': OnvifInstallIndexController;\n }\n}\n","import { EmberOnvifInstallation } from 'customer-site/enums/CustomerPageUrl';\nimport BaseOnvifInstallationRoute from '../base-onvif-installation-route';\n\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\n// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport type DS from 'ember-data';\nimport type OnvifInstallRoute from '../route';\nimport type OnvifInstallIndexController from './controller';\n\ninterface OnvifInstallIndexRouteModel extends ModelFrom {\n onvifCameraDiscoveryResults: DS.PromiseArray | never[];\n}\n\n/**\n * @classdesc\n * The route which handles discovering ONVIF devices.\n */\nexport default class OnvifInstallIndexRoute extends BaseOnvifInstallationRoute {\n readonly routeId = EmberOnvifInstallation;\n\n model(): OnvifInstallIndexRouteModel {\n const parentModel = this.modelFor('video/onvif-install') as ModelFrom,\n { currentCameraCount, maxCameraCount } = parentModel.currentAndMaxCameraCounts;\n\n // Avoid performing a discovery when there's no room to install cameras.\n const onvifCameraDiscoveryResults =\n currentCameraCount >= maxCameraCount ? [] : this.store.findAll('video/onvif-camera-discovery-result');\n\n return {\n onvifCameraDiscoveryResults,\n ...parentModel\n };\n }\n\n /** @override */\n resetController(controller: OnvifInstallIndexController, isExiting: boolean): void {\n if (isExiting) {\n controller.checkboxItems = [];\n controller.resetFlagsForMobilePageContent();\n }\n }\n}\n","import Controller from '@ember/controller';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SnapshotInfo } from 'customer-site/video/onvif-install/naming/base-onvif-installation-naming-route';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The controller used for the ONVIF naming parent page.\n */\nexport default class OnvifInstallNamingController extends Controller {\n declare model: ModelFrom;\n\n /**\n * Caches snapshot data for each camera\n */\n snapshotDataObjects = new Map();\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/naming': OnvifInstallNamingController;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { ENTER_KEY } from '@adc/ember-utils/utils/a11y';\nimport { next } from '@adc/ember-utils/utils/runloop';\nimport Controller from '@ember/controller';\nimport { action, getProperties } from '@ember/object';\nimport { get, set } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { pollForSnapshotData } from 'customer-site/components/video/utils/onvif-snapshot-utils';\nimport {\n EmberOnvifInstallationNaming,\n EmberOnvifInstallationNamingEdit,\n VideoAddNewDevice\n} from 'customer-site/enums/CustomerPageUrl';\nimport { MaxCameraNameLength } from 'customer-site/video/onvif-install/base-onvif-installation-controller';\nimport { OnvifModalCssClass } from 'customer-site/video/onvif-install/naming/route';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { enforceMaxLength } from '../index/controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type OnvifCameraRenameResult from 'customer-site/models/video/onvif-camera-rename-result';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SnapshotInfo } from 'customer-site/video/onvif-install/naming/base-onvif-installation-naming-route';\nimport type OnvifInstallNamingIndexController from '../index/controller';\nimport type OnvifInstallNamingRoute from '../route';\nimport type OnvifInstallNamingEditRoute from './route';\n\n/**\n * This makes a request to rename cameras and ensures the ember-models are in sync with the changes.\n */\nexport function updateCameraNames(\n this: OnvifInstallNamingEditController | OnvifInstallNamingIndexController | OnvifInstallNamingRoute,\n cameras: Camera[]\n): Promise {\n return this.ajax\n .apiRequestForDataRecords(\n 'video/onvifInstallation/name',\n undefined,\n buildRequestBodyForCameraNaming(cameras),\n POST\n )\n .catch((e) => {\n const errorText = getErrorText(e);\n if (errorText) {\n this.notificationManager.addError(errorText);\n }\n\n cameras.forEach((camera) => camera.rollbackAttributes());\n throw e;\n })\n .then(async (results) => {\n await Promise.all(\n results.map(async (result) => {\n // If the rename failed, undo the changes to the model.\n if (result.error) {\n this.notificationManager.addError(result.error);\n\n const camera = this.store.peekRecord('video/devices/camera', result.id);\n camera?.rollbackAttributes();\n return;\n }\n\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error camera is async, so this code should be replaced with `await (await result.camera)?.reload();`.\n await result.camera?.reload();\n })\n );\n\n return results;\n });\n}\n\n/**\n * This builds the body used in our request to rename cameras.\n *\n * @private\n */\nfunction buildRequestBodyForCameraNaming(cameras: Camera[]): Record {\n return cameras.reduce((requestBody: Record, camera) => {\n const { id, description } = getProperties(camera, 'id', 'description');\n // description != null will make sure this value isnt null or undefined, but its okay if its an empty string\n if (id && description != null) {\n requestBody[id] = description;\n }\n\n return requestBody;\n }, {});\n}\n\n/**\n * The controller for the naming of an individual camera.\n */\nexport default class OnvifInstallNamingEditController extends Controller {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare modals: ModalsService;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * This should be a reference to the parent controller's thumbnail urls.\n * This is set through this route's setupController.\n */\n snapshotDataObjects?: Map;\n\n /**\n * Whether or not we should attempt to load snapshots.\n * Because controllers are singletons, this lets the promises to retrieve snapshots that they should stop.\n */\n shouldLoadSnapshots = false;\n\n /**\n * The camera name (as displayed). When the user hits save this value gets stored to the camera model object\n */\n @tracked cameraName = '';\n\n /**\n * The css style (containing height) for the snapshot div. Used to keep it at 16/9 dimensions\n */\n @tracked snapshotStyle = '';\n\n /**\n * The installation result associated with the camera we want to rename.\n */\n @reads('model.discoveryResult')\n onvifCameraDiscoveryResult?: OnvifCameraDiscoveryResult;\n\n /**\n * The associated camera.\n */\n @reads('model.camera')\n camera?: Camera;\n\n /**\n * The position we are in of the parent model's discoveryResults.\n */\n @reads('model.index')\n declare index: number;\n\n /**\n * The number of successful ONVIF camera installations.\n */\n @reads('model.discoveredCameras.length')\n declare numberOfInstalls: number;\n\n /**\n * True if the user is on a touch device, and false otherwise.\n * Translations will use \"tap\" instead of \"click\".\n */\n @reads('contextManager.isTouchDevice')\n declare isTouchDevice: boolean;\n\n /**\n * Whether or not to display an error that a camera is at max length.\n */\n @tracked displayMaxLengthError = false;\n\n /**\n * Whether the camera name is currently at its max length.\n */\n atMaxLength = false;\n\n /**\n * This attempts to rename the camera.\n */\n @action async saveCameraName(): Promise {\n const { camera, cameraName } = this;\n if (!camera) {\n return Promise.reject();\n }\n\n set(camera, 'description', cameraName);\n const cameraRenameResults = await updateCameraNames.call(this, [camera]);\n\n if (!cameraRenameResults || cameraRenameResults[0].error) {\n const errorMessage = !cameraRenameResults\n ? this.intl.tc(this, 'cameraNameSaveFail')\n : cameraRenameResults[0].error;\n if (errorMessage) {\n this.notificationManager.addError(errorMessage);\n }\n\n return Promise.reject();\n }\n\n this.notificationManager.addSuccess(this.intl.tc(this, 'cameraNameSaveSuccess'));\n this.navigateBack();\n }\n\n /**\n * Transitions back to the previous page, which is the naming/index route.\n */\n @action navigateBack(): void {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute(EmberOnvifInstallationNaming);\n }\n\n /**\n * An action that calls our logic to poll for snapshots and returns a SnapshotInfo object (with a blob url and/or error message)\n */\n @action loadSnapshotData(camera: Camera): Promise {\n return pollForSnapshotData.call(this, camera);\n }\n\n /**\n * A task that attempts to delete the current camera.\n */\n deleteCamera = task({ drop: true }, async () => {\n const { camera } = this;\n if (!camera) {\n return;\n }\n\n const id = get(camera, 'id');\n if (!id) {\n return;\n }\n\n try {\n // We know the request succeeded if an error isn't thrown.\n await this.ajax.apiRequest>(\n `video/onvifInstallation/remove/${id}`,\n undefined,\n undefined,\n POST\n );\n\n // We want to unload and navigate back at the same time\n await next(() => {\n const { discoveryResults, index, discoveredCameras } = this.model,\n discoveryIndex = discoveredCameras[index].discoveryIndex,\n camerasToRemove = discoveredCameras.filter(\n (cameraItem) => cameraItem.discoveryIndex === discoveryIndex\n );\n\n // Unload records for all cameras with the specified discoveryIndex\n camerasToRemove.forEach((cameraItem) => cameraItem.camera.unloadRecord());\n\n // Remove the discovery result\n discoveryResults.removeAt(discoveryIndex);\n\n // Update discoveredCameras to exclude the cameras with the specified discoveryIndex, and update their index.\n discoveredCameras.clear();\n discoveryResults.forEach((discoveryResult, index) => {\n // Initialize for the main camera\n if (discoveryResult.camera) {\n discoveredCameras.push({ camera: discoveryResult.camera, discoveryIndex: index });\n }\n\n // Initialize for subsequent cameras\n if (discoveryResult.subsequentCameras) {\n discoveryResult.subsequentCameras.forEach((camera) => {\n discoveredCameras.push({ camera, discoveryIndex: index });\n });\n }\n });\n\n if (this.onvifCameraDiscoveryResult) {\n this.onvifCameraDiscoveryResult.camera = undefined;\n }\n\n const message = this.intl.tc(this, 'cameraSuccessfullyRemoved');\n this.notificationManager.addSuccess(message);\n\n // If we still have installed cameras, navigate back to the naming list. Otherwise, go back to the AddVideoDevice page.\n if (discoveryResults.some((discoveryResult) => discoveryResult.camera != null)) {\n this.navigateBack();\n } else {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoAddNewDevice);\n }\n });\n } catch (e) {\n const errorText = getErrorText(e);\n if (errorText) {\n this.notificationManager.addError(errorText);\n }\n }\n });\n\n /**\n * Shows a modal asking the user to confirm they want to delete the current camera.\n */\n @action showDeletionModal(): void {\n const { intl, modals } = this;\n const { discoveryResults, index, discoveredCameras } = this.model,\n discoveryIndex = discoveredCameras[index].discoveryIndex,\n discoveryResult = discoveryResults[discoveryIndex],\n subsequentCamerasLength = discoveryResult.subsequentCameras?.length ?? 0,\n deletionInformationString =\n subsequentCamerasLength !== 0\n ? intl.tc(this, 'deletionInformationMultiSensor', { numberOfSensors: subsequentCamerasLength })\n : intl.tc(this, 'deletionInformation');\n\n modals.showConfirmationDialog(\n intl.tc(this, 'areYouSure'),\n deletionInformationString,\n {\n text: intl.tc(this, 'yesDelete'),\n action: () => {\n this.deleteCamera.perform();\n },\n css: 'confirm-deletion-button'\n },\n {\n text: intl.t('generic.cancel'),\n css: 'cancel-deletion-button'\n },\n `delete-camera-modal ${OnvifModalCssClass}`\n );\n }\n\n /**\n * Switching between the successful discovery results using the left/right arrows\n *\n * @param isLeft if the user clicked the left arrow. otherwise they clicked right\n */\n @action switchBetweenResults(isLeft: boolean): void {\n const { index } = this,\n { contextManager, numberOfInstalls } = this,\n newIndex: number = isLeft ? index - 1 : index + 1;\n\n if (newIndex <= -1 || newIndex >= numberOfInstalls) {\n return;\n }\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberOnvifInstallationNamingEdit, undefined, undefined, newIndex);\n }\n\n /**\n * Sets the height for the snapshot object based on its width (maintaining 16/9 aspect ratio)\n */\n @action setSnapshotSizing(): void {\n const snapshot = document.querySelector('.snapshot-content .snapshot');\n\n if (!snapshot) {\n return;\n }\n\n const { clientWidth } = snapshot as Element;\n\n this.snapshotStyle = `height: ${(clientWidth * 9) / 16}px`;\n }\n\n /**\n * Continues to the next page when the enter key is hit.\n */\n @action handleKeyUpOnName(event: KeyboardEvent): void {\n if (event.keyCode === ENTER_KEY) {\n this.saveCameraName();\n }\n }\n\n /**\n * Handles truncating the camera name and showing an error that the max length has been reached.\n * The truncation is necessary because Android webviews don't handle the maxlength attribute correclty.\n */\n @action onInput(event: KeyboardEvent): void {\n const target = event.target as HTMLInputElement,\n text = target.value;\n\n // Checks and stores if we've already reached or passed the max length.\n // Show an error when user continues entering text.\n const hasReachedOrPassedMaxLength = text.length >= MaxCameraNameLength,\n hasDescriptionAlreadyReachedMaxLength = this.atMaxLength;\n this.displayMaxLengthError = hasDescriptionAlreadyReachedMaxLength && hasReachedOrPassedMaxLength;\n\n // Update the status in case it has changed.\n this.atMaxLength = hasReachedOrPassedMaxLength;\n\n // Enforces the maxlength attribute for TextInputs, since it doesn't work correctly for Android Webviews.\n // This logic only works on input events (not keydown, keyup, change, etc.).\n enforceMaxLength.call(this, event);\n }\n\n /**\n * Sets the cameraName property from the camera object\n */\n @action dataLoaded(): void {\n const { camera } = this;\n\n if (!camera) {\n return;\n }\n\n this.cameraName = camera.get('description');\n this.atMaxLength = this.cameraName.length === MaxCameraNameLength;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/naming/edit': OnvifInstallNamingEditController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberOnvifInstallationNamingEdit } from 'customer-site/enums/CustomerPageUrl';\nimport { restartOnvifInstallation } from '../../base-onvif-installation-controller';\nimport BaseOnvifInstallationNamingRoute from '../base-onvif-installation-naming-route';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type OnvifInstallNamingRoute from '../route';\nimport './_style.scss';\n\ninterface OnvifInstallNamingEditRouteModel extends ModelFrom {\n /**\n * The discoveredCameras index\n */\n index: number;\n discoveryResult: OnvifCameraDiscoveryResult;\n camera: Camera;\n}\n\n/**\n * @classdesc\n * The route for renaming an individual camera, that came from an ONVIF installation.\n */\nexport default class OnvifInstallNamingEditRoute extends BaseOnvifInstallationNamingRoute {\n readonly routeId = EmberOnvifInstallationNamingEdit;\n\n /** @override */\n readonly skipWhenTransitioningBack = true;\n\n model({ index }: { index: string }): OnvifInstallNamingEditRouteModel {\n const parentModel = this.modelFor('video/onvif-install/naming') as ModelFrom,\n parsedIndex = parseInt(index) || 0,\n { camera, discoveryIndex } = parentModel.discoveredCameras[parsedIndex];\n\n return {\n ...parentModel,\n index: parsedIndex,\n discoveryResult: parentModel.discoveryResults[discoveryIndex],\n camera\n };\n }\n\n /** @override */\n afterModel(model: OnvifInstallNamingEditRouteModel): void {\n // If the user visits the url directly.\n if (!model.discoveryResult) {\n restartOnvifInstallation.call(this);\n }\n }\n\n /** @override */\n @action willTransition(): boolean {\n // Returning true makes sure the transition bubbles up and willTransition in (onvif-install\\naming\\route.ts) gets called also.\n return true;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { ENTER_KEY } from '@adc/ember-utils/utils/a11y';\nimport { A } from '@ember/array';\nimport { action, getProperties } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { task } from 'ember-concurrency';\nimport { pollForSnapshotData } from 'customer-site/components/video/utils/onvif-snapshot-utils';\nimport { EmberOnvifInstallationNamingEdit, VideoAddNewDevice } from 'customer-site/enums/CustomerPageUrl';\nimport { getDoubleNewLineSeparatedString } from 'customer-site/utils/strings';\nimport { OnvifModalCssClass } from 'customer-site/video/onvif-install/naming/route';\nimport { VideoCameraInstall } from '@adc/app-infrastructure/enums/NativeView';\nimport BaseOnvifInstallationController, {\n MaxCameraNameLength,\n restartOnvifInstallation\n} from '../../base-onvif-installation-controller';\nimport { updateCameraNames } from '../edit/controller';\n\nimport type NativeBridge from '@adc/app-infrastructure/services/native-bridge';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { ResolvedModelFrom, ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SnapshotInfo } from 'customer-site/video/onvif-install/naming/base-onvif-installation-naming-route';\nimport type OnvifInstallNamingEditController from '../edit/controller';\nimport type OnvifInstallNamingRoute from '../route';\n\n/**\n * Returns the default name we use for ONVIF cameras\n */\nexport function getDefaultOnvifCameraName(macAddress: string): string {\n return `Third-party ${macAddress.slice(-4)}`;\n}\n\n/**\n * This returns all of the unsaved cameras for the given discovery results.\n */\nexport function getUnsavedCamerasFromDiscoveryResults(\n onvifCameraDiscoveryResults: OnvifCameraDiscoveryResult[]\n): Camera[] {\n return onvifCameraDiscoveryResults\n .map((discoveryResult) => {\n const { camera } = discoveryResult;\n if (!camera) {\n return undefined;\n }\n\n const { isSaving, hasDirtyAttributes } = getProperties(camera, 'isSaving', 'hasDirtyAttributes');\n return !isSaving && hasDirtyAttributes ? camera : undefined;\n })\n .compact();\n}\n\n/**\n * If at least one of the devices still have their default given names `Third-party XXXX`\n */\nexport function someDevicesHaveDefaultNames(onvifCameraDiscoveryResults: Array): boolean {\n if (!onvifCameraDiscoveryResults.length) {\n return false;\n }\n\n for (const discoveryResult of onvifCameraDiscoveryResults) {\n const { camera } = discoveryResult;\n\n // For type-checking and should not happen, but if it does, skip this result.\n if (!camera) {\n continue;\n }\n\n if (camera.description === getDefaultOnvifCameraName(camera.macAddress)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Shows the modal which asks if they are sure they want to leave their camera name/s as the default names\n */\nexport function showDefaultNamesConfirmation(this: OnvifInstallNamingIndexController): void {\n const { contextManager, intl, modals } = this;\n\n modals.showConfirmationDialog(\n intl.tc(this, 'exitCameraSetup'),\n getDoubleNewLineSeparatedString(\n contextManager,\n intl.tc(this, 'defaultNamesWarning1'),\n intl.tc(this, 'defaultNamesWarning2')\n ),\n {\n text: this.intl.t('generic.yesExit'),\n action: () => {\n this.confirmedDefaultNames = true;\n this.continueToNextPage();\n }\n },\n {\n text: intl.t('generic.noGoBack')\n },\n OnvifModalCssClass\n );\n}\n\n/**\n * Attempts to close the webview browser for MobileTech and returns if we've done so.\n */\nexport function closeCustomerSiteIfComingFromMobiletech(this: OnvifInstallNamingIndexController): boolean {\n const { contextManager, external } = this,\n isMobileTech = contextManager.isMobileTech(external);\n\n if (!isMobileTech) {\n return false;\n }\n\n if (contextManager.isMobileTechApp) {\n contextManager.closeMobileTechWebView();\n } else {\n window.close();\n }\n\n return true;\n}\n\n/**\n * Truncates the camera name when it's longer than allowed.\n */\nexport function enforceMaxLength(\n this: OnvifInstallNamingIndexController | OnvifInstallNamingEditController,\n event: KeyboardEvent\n): void {\n const target = event.target as HTMLInputElement,\n shouldTruncateString = target.value.length > MaxCameraNameLength;\n\n if (shouldTruncateString) {\n target.value = target.value.substring(0, MaxCameraNameLength);\n }\n}\n\n/**\n * Gets the discovery index and the camera id from the provided string.\n * @param indexAndCameraId The discovery index and camera id in string form\n * @returns The separated discovery index and camera id\n */\nexport function splitIndexAndCameraId(indexAndCameraId: string): { index: number; cameraId: string } {\n const [indexString, ...cameraIdParts] = indexAndCameraId.split('-'),\n cameraId = cameraIdParts.join('-'),\n index = parseInt(indexString);\n return { index, cameraId };\n}\n\n/**\n * @classdesc\n * The controller used for the ONVIF naming page.\n */\nexport default class OnvifInstallNamingIndexController extends BaseOnvifInstallationController {\n readonly nextRouteId = VideoAddNewDevice;\n\n @service declare nativeBridge: NativeBridge;\n @service declare notificationManager: NotificationManager;\n @service declare ajax: AjaxService;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * This should be a reference to the parent controller's thumbnail urls.\n * This is set through this route's setupController.\n */\n snapshotDataObjects?: Map;\n\n /**\n * The resolved model's discovery results..\n */\n @tracked discoveryResults?: OnvifCameraDiscoveryResult[];\n\n /**\n * Whether or not to display an error that a camera is at max length.\n * (This is a map because the keys match the discoveryResults and camera id index)\n */\n @tracked displayMaxLengthError?: Map;\n\n /**\n * Whether the camera name is currently at its max length. (This is a map because the keys match the discoveryResults and camera id index)\n */\n atMaxLength?: Map;\n\n /**\n * The total list of cameras with their discovery result index\n */\n @tracked discoveredCameras?: { camera: Camera; discoveryIndex: number }[];\n\n /**\n * Maximum allowable camera name length\n */\n maxCameraNameLength = MaxCameraNameLength;\n\n /**\n * Whether or not we should attempt to load snapshots.\n * Because controllers are singletons, this lets the promises to retrieve snapshots know that they should stop.\n */\n shouldLoadSnapshots = false;\n\n /**\n\n * If the user has confirmed that they are okay with leaving devices as their default namings\n */\n confirmedDefaultNames = false;\n\n /**\n * If the user is currently renaming a camera (is only true for the very small period when the api request is made and the api request returns)\n */\n @reads('updateCameraNamesTask.isRunning')\n declare isRenamingCamera: boolean;\n\n /**\n * The number of successful ONVIF camera installations.\n */\n @reads('discoveredCameras.length')\n declare numberOfInstalls: number;\n\n /**\n * If this page is being displayed in the mobile app.\n */\n @reads('contextManager.identityModel.isMobileApp')\n declare isMobileApp: boolean;\n\n /**\n * Transitions to individual camera naming route.\n */\n @action async visitNamingEditRoute(indexAndCameraId: string): Promise {\n const { cameraId } = splitIndexAndCameraId(indexAndCameraId),\n currentCameraIndex = this.discoveredCameras?.findIndex((item) => item.camera.id === cameraId);\n\n if (currentCameraIndex == undefined || currentCameraIndex < 0 || currentCameraIndex > this.numberOfInstalls) {\n return;\n }\n\n const camera = this.discoveredCameras?.[currentCameraIndex]?.camera;\n\n // If the camera has been deleted, because it previously existed in the model hook.\n if (!camera) {\n return;\n }\n\n // the forward querystring is added so that we can distinguish this type of transition from other types (such as clicking the back button)\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n EmberOnvifInstallationNamingEdit,\n { forward: true },\n undefined,\n currentCameraIndex\n );\n }\n\n /**\n * This continues to the next route, as long as it wasn't triggered immediately after a rename error (from an input blur)\n */\n @action async continueToNextPage(): Promise {\n const { confirmedDefaultNames, contextManager, discoveryResults, isMobileApp, nativeBridge } = this;\n\n if (!discoveryResults) {\n return Promise.reject();\n }\n\n if (this.isMobileApp) {\n await this.saveAllUnsavedCameraNames();\n }\n\n // Because camera names are saved on input blur, if we are currently still in the process of doing a rename request, lets wait to see if it succeeded or not.\n try {\n while (this.isRenamingCamera) {\n await this.updateCameraNamesTask.last;\n }\n } catch (e) {\n return Promise.reject();\n }\n\n // If the user has left some of their devices with the default namings, we'll want to ask them to confirm first.\n if (!confirmedDefaultNames && someDevicesHaveDefaultNames.call(this, discoveryResults)) {\n showDefaultNamesConfirmation.call(this);\n return;\n }\n\n if (closeCustomerSiteIfComingFromMobiletech.call(this)) {\n return;\n }\n\n if (isMobileApp && nativeBridge.doesSupportTransitionToNativeViewWithId(VideoCameraInstall)) {\n const camerasInstalledFromWeb = discoveryResults\n .flatMap((discoveryResult) => {\n const { camera, subsequentCameras, manufacturer } = discoveryResult;\n\n // Create an array to hold the camera objects\n const cameras = [];\n\n // Add the main camera if it exists\n if (camera) {\n cameras.push({\n deviceName: camera.description,\n deviceMake: manufacturer,\n deviceModel: camera.deviceModel,\n macAddress: camera.macAddress\n });\n }\n\n // Add subsequent cameras if they exist\n if (subsequentCameras) {\n subsequentCameras.forEach((subsequentCamera) => {\n cameras.push({\n deviceName: subsequentCamera.description,\n deviceMake: manufacturer,\n deviceModel: subsequentCamera.deviceModel,\n macAddress: subsequentCamera.macAddress\n });\n });\n }\n\n return cameras;\n })\n .filter(Boolean);\n\n // In Blenny (800) a bug was resolved which made it no longer necessary to call closeWebView (VID-49109 APPS-38491)\n if (contextManager.identityModel.applicationBuildNumber < 800) {\n nativeBridge.closeWebViewV2();\n }\n\n nativeBridge.transitionToNativeView(VideoCameraInstall, { camerasInstalledFromWeb });\n } else {\n this.transitionToNextInstallationRoute();\n }\n }\n\n /**\n * Renames the camera name when the user types a new name\n * NOTE: This value is not pushed to the server until the input is blurred.\n */\n @action onNameInputValueChange(indexAndCameraId: string, value: string): void {\n const { discoveryResults = [] } = this,\n totalDiscoveryResults = discoveryResults.length,\n { index, cameraId } = splitIndexAndCameraId(indexAndCameraId);\n\n if (index < totalDiscoveryResults) {\n const discoveryResult = discoveryResults[index],\n allCameras = [discoveryResult?.camera, ...(discoveryResult?.subsequentCameras || [])],\n camera = allCameras.find((cam) => cam?.id === cameraId);\n\n if (camera) {\n camera.description = value;\n }\n }\n }\n\n /**\n * An action that calls our logic to poll for snapshots and returns a SnapshotInfo object (with a blob url and/or error message)\n */\n @action loadSnapshotData(camera: Camera): Promise {\n return pollForSnapshotData.call(this, camera);\n }\n\n /**\n * Handles truncating the camera name and showing an error that the max length has been reached.\n * The truncation is necessary because Android webviews don't handle the maxlength attribute correclty.\n */\n @action onInput(indexAndCameraId: string, event: KeyboardEvent): void {\n const target = event.target as HTMLInputElement,\n text = target.value;\n\n // Not possible, this is for type-checking.\n if (!this.atMaxLength || !this.displayMaxLengthError) {\n return;\n }\n\n // Checks and stores if we've already reached or passed the max length.\n // Show an error when user continues entering text.\n const hasReachedOrPassedMaxLength = text.length >= MaxCameraNameLength,\n hasDescriptionAlreadyReachedMaxLength = this.atMaxLength.get(indexAndCameraId) || false,\n shouldShowMaxLengthError = hasDescriptionAlreadyReachedMaxLength && hasReachedOrPassedMaxLength;\n\n this.atMaxLength.set(indexAndCameraId, hasReachedOrPassedMaxLength);\n\n if (this.displayMaxLengthError.get(indexAndCameraId) !== shouldShowMaxLengthError) {\n this.displayMaxLengthError.set(indexAndCameraId, shouldShowMaxLengthError);\n // Slightly hacky, but i'm setting this to a clone of itself so that the template does a re-render\n this.displayMaxLengthError = Object.assign({}, this.displayMaxLengthError);\n }\n\n // Enforces the maxlength attribute for TextInputs, since it doesn't work correctly for Android Webviews.\n // This logic only works on input events (not keydown, keyup, change, etc.).\n enforceMaxLength.call(this, event);\n }\n\n /**\n * Continues to the next page when the enter key is hit.\n */\n @action handleKeyUpOnName(event: KeyboardEvent): void {\n if (event.keyCode === ENTER_KEY) {\n this.continueToNextPage();\n }\n }\n\n /**\n * Action called for the back button on mobile.\n */\n @action async handleMobileBackButton(): Promise {\n await this.saveAllUnsavedCameraNames();\n\n if (!this.confirmedDefaultNames && someDevicesHaveDefaultNames.call(this, this.discoveryResults)) {\n showDefaultNamesConfirmation.call(this);\n } else {\n if (closeCustomerSiteIfComingFromMobiletech.call(this)) {\n return;\n }\n\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n }\n\n /**\n * Handles renaming any \"dirty\" (renamed) cameras from onNameInputValueChange, if we aren't already renaming them.\n */\n @action async saveAllUnsavedCameraNames(): Promise {\n const { discoveryResults } = this;\n\n // This is for type-checking and won't happen\n if (!discoveryResults) {\n return;\n }\n\n // Normally we save the camera name on text input blur events. This isn't triggered when the\n // something outside of the browser is tapped - which applies to our mobile app buttons.\n //\n // These lines ensure that if this action is called (only possible from mobile's confirm and cancel navigation buttons)\n // then we try to save any unsaved cameras before exiting.\n\n if (\n discoveryResults.some(\n (item) =>\n !!item.camera?.hasDirtyAttributes ||\n item.subsequentCameras?.some((camera) => camera.hasDirtyAttributes)\n ) &&\n !this.isRenamingCamera\n ) {\n // Combine main cameras and subsequent cameras into a single array\n const allCameras = discoveryResults.flatMap((item) => {\n const cameras = [];\n if (item.camera) {\n cameras.push(item.camera);\n }\n if (item.subsequentCameras) {\n cameras.push(...item.subsequentCameras);\n }\n return cameras;\n });\n\n // Filter dirty cameras\n const dirtyCameras = allCameras.filter((camera) => camera.hasDirtyAttributes);\n\n // Perform the update task\n // is this working for subsequent cameras? TODO: CHECK THIS\n await this.updateCameraNamesTask.perform(dirtyCameras);\n }\n }\n\n @action dataLoaded({ discoveryResults, discoveredCameras }: ResolvedModelFrom): void {\n const resultsLength = discoveryResults.length;\n\n // If the user navigates directly to this page\n if (!resultsLength) {\n restartOnvifInstallation.call(this);\n return;\n }\n\n this.discoveryResults = A(discoveryResults);\n this.discoveredCameras = A(discoveredCameras);\n\n this.displayMaxLengthError = new Map();\n this.atMaxLength = new Map();\n\n // Loop through discoveryResults to initialize the maps\n discoveryResults.forEach((discoveryResult, index) => {\n // Initialize for the main camera\n if (discoveryResult.camera) {\n const mainCameraId = discoveryResult.camera.id;\n const mainKey = `${index}-${mainCameraId}`;\n this.displayMaxLengthError?.set(mainKey, false);\n this.atMaxLength?.set(mainKey, false);\n }\n\n // Initialize for subsequent cameras\n if (discoveryResult.subsequentCameras) {\n discoveryResult.subsequentCameras.forEach((camera) => {\n const subsequentKey = `${index}-${camera.id}`;\n this.displayMaxLengthError?.set(subsequentKey, false);\n this.atMaxLength?.set(subsequentKey, false);\n });\n }\n });\n\n for (let i = 0; i < resultsLength; i++) {\n const discoveryResult = discoveryResults[i];\n\n // Handle the main camera\n if (discoveryResult.camera) {\n const mainCamera = discoveryResult.camera as Camera;\n const mainKey = `${i}-${mainCamera.id}`;\n this.atMaxLength.set(mainKey, mainCamera.get('description').length === MaxCameraNameLength);\n }\n\n // Handle subsequent cameras\n if (discoveryResult.subsequentCameras) {\n discoveryResult.subsequentCameras.forEach((camera) => {\n const subsequentKey = `${i}-${camera.id}`;\n this.atMaxLength?.set(subsequentKey, camera.get('description').length === MaxCameraNameLength);\n });\n }\n }\n }\n\n /**\n * Ember concurrency task to wrap the updateCameraNames method so we can track if it's running.\n */\n updateCameraNamesTask = task({}, async (cameras: Camera[]) => {\n await updateCameraNames.call(this, cameras);\n });\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/naming/index': OnvifInstallNamingIndexController;\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberOnvifInstallationNaming } from 'customer-site/enums/CustomerPageUrl';\nimport { restartOnvifInstallation } from '../../base-onvif-installation-controller';\nimport BaseOnvifInstallationNamingRoute from '../base-onvif-installation-naming-route';\nimport { showDefaultNamesConfirmation, someDevicesHaveDefaultNames } from './controller';\n\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type Transition from '@ember/routing/transition';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type OnvifInstallNamingRoute from '../route';\nimport type OnvifInstallNamingIndexController from './controller';\nimport './_style.scss';\n\n/**\n * @classdesc\n * The route which displays all of the ONVIF results that need to be named.\n * This inherits from the parent route OnvifInstallNamingRoute\n */\nexport default class OnvifInstallNamingIndexRoute extends BaseOnvifInstallationNamingRoute {\n @service declare modals: ModalService;\n\n readonly routeId = EmberOnvifInstallationNaming;\n\n /**\n * If someDevicesHaveDefaultNames was shown to be false.\n */\n noDefaultNames: boolean | undefined = undefined;\n\n /** @override */\n setupController(\n controller: OnvifInstallNamingIndexController,\n model: ModelFrom,\n transition: Transition\n ): void {\n super.setupController(controller, model, transition);\n\n // When there were no successful installations\n if (!model.discoveryResults.length) {\n const totalDiscoveryResults = this.store.peekAll('video/onvif-camera-discovery-result');\n\n if (totalDiscoveryResults.length) {\n // Assume that the discovery results were skipped, so the user should go to the end of the installation.\n controller.transitionToNextInstallationRoute();\n } else {\n // When there are no discovery results, the url was visited directly and assume the user wants to start a new installation.\n restartOnvifInstallation.call(this);\n }\n }\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as OnvifInstallNamingIndexController,\n { confirmedDefaultNames, discoveryResults } = controller,\n { noDefaultNames } = this;\n\n // transitionToNextInstallationRoute adds the forward queryParam. If willTransition is being triggered by transitionToNextInstallationRoute\n // we can ignore the bottom code, because the user isn't trying to bail on the installation. Also if confirmedDefaultNames is true,\n // we dont need to show the bail window again because they've already confirmed YES while using it.\n if (noDefaultNames || transition.to.queryParams.forward || confirmedDefaultNames) {\n // leaving the page but resetting these values so they are correct if you come back to the page\n controller.confirmedDefaultNames = false;\n this.noDefaultNames = undefined;\n } else {\n // Abort needs to trigger before the await below, otherwise abort doesn't always work properly (race condition stuff)\n transition.abort();\n\n if (someDevicesHaveDefaultNames.call(this, discoveryResults)) {\n showDefaultNamesConfirmation.call(controller);\n return;\n }\n\n // Need to set this to true so that transition.abort() doesn't get triggered from the retry here.\n this.noDefaultNames = true;\n transition.retry();\n return;\n }\n\n // Returning true makes sure the parent's willTransition gets called also. (onvif-install\\naming\\route.ts)\n return true;\n }\n\n /** @override */\n resetController(controller: OnvifInstallNamingIndexController, isExiting: boolean): void {\n super.resetController(controller, isExiting);\n\n if (isExiting) {\n controller.confirmedDefaultNames = false;\n }\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberOnvifInstallationNaming } from 'customer-site/enums/CustomerPageUrl';\nimport BaseOnvifInstallationRoute from '../base-onvif-installation-route';\nimport { updateCameraNames } from './edit/controller';\nimport { getUnsavedCamerasFromDiscoveryResults } from './index/controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Transition from '@ember/routing/transition';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OnvifCameraDiscoveryResult from 'customer-site/models/video/onvif-camera-discovery-result';\nimport type OnvifInstallNamingController from './controller';\n\nexport const OnvifModalCssClass = 'onvif-modal';\n\ninterface OnvifInstallNamingRouteModel {\n discoveryResults: OnvifCameraDiscoveryResult[];\n discoveredCameras: { camera: Camera; discoveryIndex: number }[];\n}\n\n/**\n * @classdesc\n * The parent route of the ONVIF naming routes.\n */\nexport default class OnvifInstallNamingRoute extends BaseOnvifInstallationRoute {\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n\n readonly routeId = EmberOnvifInstallationNaming;\n\n async model(): Promise {\n const discoveryResults = await this.getDiscoveryResultsWithCameras(),\n discoveredCameras: { camera: Camera; discoveryIndex: number }[] = [];\n\n discoveryResults.forEach((discoveryResult, index) => {\n // Initialize for the main camera\n if (discoveryResult.camera) {\n discoveredCameras.push({ camera: discoveryResult.camera, discoveryIndex: index });\n }\n\n // Initialize for subsequent cameras\n if (discoveryResult.subsequentCameras) {\n discoveryResult.subsequentCameras.forEach((camera) => {\n discoveredCameras.push({ camera, discoveryIndex: index });\n });\n }\n });\n\n return { discoveryResults, discoveredCameras };\n }\n\n /** @override */\n @action willTransition(transition: Transition): void {\n // If the destination is not a child route\n if (!transition.to.name.startsWith(this.routeName)) {\n const model = this.modelFor(this.routeName) as OnvifInstallNamingRouteModel,\n onvifCameraDiscoveryResults = model?.discoveryResults ?? [];\n\n const unsavedCameras = getUnsavedCamerasFromDiscoveryResults(onvifCameraDiscoveryResults);\n\n // Abort the transition and only attempt to leave if the user confirms they want to exit.\n // This is just in case the user closes the modal without hitting the No action.\n if (unsavedCameras?.length) {\n // When the transition is retried, mark that we've already opened the modal to avoid rechecking if cameras are unnamed.\n transition.abort();\n this.showExitConfirmation(transition, unsavedCameras);\n }\n }\n }\n\n /** @override */\n resetController(controller: OnvifInstallNamingController, isExiting: boolean): void {\n if (isExiting) {\n const { snapshotDataObjects } = controller;\n\n for (const snapshotDataObject of snapshotDataObjects.values()) {\n const { blobUrl } = snapshotDataObject;\n\n if (blobUrl) {\n // Gets rid of the cached blob for the url\n URL.revokeObjectURL(blobUrl);\n }\n }\n\n snapshotDataObjects.clear();\n }\n }\n\n /**\n * Shows a modal asking the user to confirm exiting or to stay on the page.\n */\n showExitConfirmation(transition: Transition, cameras: Camera[]): void {\n this.modals.showConfirmationDialog(\n this.intl.t('generic.video.exitCameraSetup'),\n this.intl.tc(this, 'exitCameraSetupModalDescription'),\n {\n text: this.intl.t('generic.yesExit'),\n action: async () => {\n try {\n await updateCameraNames.call(this, cameras);\n } catch (e) {\n // If we can't save camera names, just rollback attributes and transition.\n cameras.forEach((camera) => camera.rollbackAttributes());\n }\n\n transition.retry();\n }\n },\n {\n text: this.intl.t('generic.noGoBack')\n },\n OnvifModalCssClass\n );\n }\n\n /**\n * A helper to grab all installed discovery results that we can fetch cameras for.\n * This also sets the cameras on the discovery result records.\n */\n async getDiscoveryResultsWithCameras(): Promise {\n const installedDiscoveryResults = this.store\n .peekAll('video/onvif-camera-discovery-result')\n .filter((item) => item.installationResult?.success),\n installedCameraIds = installedDiscoveryResults\n .flatMap((discoveryResult) => {\n const cameraIds: string[] = [];\n if (discoveryResult.installationResult?.cameraId) {\n cameraIds.push(discoveryResult.installationResult.cameraId);\n }\n if (discoveryResult.installationResult?.subsequentCameraIds) {\n cameraIds.push(...discoveryResult.installationResult.subsequentCameraIds);\n }\n return cameraIds;\n })\n .filter(Boolean),\n installedCameras = await this.store.query('video/devices/camera', { ids: installedCameraIds });\n\n const installedDiscoveryResultsWithCameras = installedDiscoveryResults\n .map((discoveryResult) => {\n const cameraId = discoveryResult.installationResult?.cameraId;\n if (!cameraId) {\n return null;\n }\n\n const camera = installedCameras.findBy('id', cameraId);\n if (!camera) {\n return null;\n }\n\n // Ensure the camera is set on the record, so we can access it later.\n discoveryResult.camera = camera;\n\n // Handle subsequentCameraIds\n const subsequentCameraIds = discoveryResult.installationResult?.subsequentCameraIds;\n if (subsequentCameraIds && subsequentCameraIds.length > 0) {\n discoveryResult.subsequentCameras = subsequentCameraIds\n .map((subsequentCameraId) => installedCameras.findBy('id', subsequentCameraId))\n .compact();\n } else {\n discoveryResult.subsequentCameras = [];\n }\n\n return discoveryResult;\n })\n .compact();\n\n return installedDiscoveryResultsWithCameras;\n }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { VideoAddNewDevice } from 'customer-site/enums/CustomerPageUrl';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Controller from '@ember/controller';\nimport type Transition from '@ember/routing/transition';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ErrorPayload } from 'customer-site/utils/ember';\n\ninterface OnvifInstallRouteModel {\n currentAndMaxCameraCounts: CurrentAndMaxCameraCounts;\n svrs: Svr[];\n}\n\n/**\n * The user's current number of installed cameras and the max number of cameras their service package supports.\n */\ntype CurrentAndMaxCameraCounts = {\n currentCameraCount: number;\n maxCameraCount: number;\n};\n\n/**\n * @classdesc\n * The parent route of all ONVIF installation routes, which requires the user to have CSVRs.\n */\nexport default class OnvifInstallRoute extends Route {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare navigation: NavigationService;\n\n async model(): Promise {\n const [currentAndMaxCameraCounts, svrs] = await Promise.all([\n this.ajax.apiRequestForValue(\n 'video/onvifInstallation/currentAndMaxCameraCounts'\n ),\n this.store.findAll('video/devices/svr').then((svrs) => svrs.filterBy('supportsOnvif'))\n ]);\n\n return {\n currentAndMaxCameraCounts,\n svrs\n };\n }\n\n /** @override */\n afterModel(model: OnvifInstallRouteModel, transition: Transition): void {\n const { contextManager } = this,\n { currentAndMaxCameraCounts, svrs } = model,\n { currentCameraCount, maxCameraCount } = currentAndMaxCameraCounts;\n\n const hasReachedMaxCameraLimit = currentCameraCount >= maxCameraCount,\n isMissingSvrs = svrs.length === 0,\n { isMobileApp } = contextManager,\n hasNoPreviousRoute = transition.from == null;\n\n if (hasReachedMaxCameraLimit && !isMobileApp) {\n // For web, we avoid visiting the discovery page and show an error.\n //\n // We don't do anything here for mobile and just visit the discovery page normally.\n // But we'll show alternative page contents on the discovery page\n // by setting showMaxLimitPage to true in it's dataloaded hook.\n this.showError(this.intl.tc(this, 'cannotDiscoverDevicesErrorMsg'));\n this.transitionForErrorOnWeb();\n } else if (isMissingSvrs) {\n // Here we can exit for both web and mobile.\n if (isMobileApp || !hasNoPreviousRoute) {\n contextManager.transitionBackToMobileAppOrPreviousRoute(VideoAddNewDevice, true);\n return;\n }\n\n transition.abort();\n }\n }\n\n /**\n * Route lifecycle hook that handles errors in the model hook\n */\n @action\n error(error: ErrorPayload): void {\n const errorText = getErrorText(error);\n if (errorText) {\n this.showError(errorText);\n }\n\n this.transitionForErrorOnWeb();\n }\n\n /**\n * Shows an error that persists across page transitions.\n */\n @action\n showError(message: string): void {\n // We use add notification with 'issue' instead of addError, because it'll persist across navigating backwards.\n this.notificationManager.addNotification(message, 'issue', undefined, 0, true, false, 'error');\n }\n\n /**\n * Transitions to AddVideoDevice if there was no previous route, otherwise it cancels the current transiiton.\n */\n @action\n transitionForErrorOnWeb(): void {\n this.navigation.transitionToRouteId(VideoAddNewDevice);\n }\n\n /** @override */\n resetController(controller: Controller, isExiting: boolean, transition: Transition): void {\n if (isExiting) {\n this.store.unloadAll('video/onvif-camera-discovery-result');\n }\n\n super.resetController(controller, isExiting, transition);\n }\n}\n","import { action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { EmberOnvifInstallationCredentials } from 'customer-site/enums/CustomerPageUrl';\nimport BaseOnvifInstallationController from '../base-onvif-installation-controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type OnvifInstallTermsOfServiceRoute from './route';\n\n/**\n * @classdesc\n * The controller for the index route.\n */\nexport default class OnvifInstallTermsOfServiceController extends BaseOnvifInstallationController {\n readonly nextRouteId = EmberOnvifInstallationCredentials;\n\n declare model: ModelFrom;\n\n /**\n * Has the user accepted the agreement already?\n */\n @alias('model.hasAcceptedAgreement')\n declare hasAcceptedAgreement: boolean;\n\n /**\n * Mark the agreement as accepted and show the supported features.\n */\n @action acceptTOS(): void {\n this.hasAcceptedAgreement = true;\n }\n\n /**\n * Opens a mailto link with the ONVIF Terms and Conditions.\n */\n @action openMailToLink(): void {\n const body = this.intl.tc(this, 'agreement'),\n subject = this.intl.t('generic.thirdPartyCameraTermsOfUse');\n\n location.href = `mailto:%20?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/onvif-install/terms-of-service': OnvifInstallTermsOfServiceController;\n }\n}\n","import { EmberOnvifInstallationTermsOfService } from 'customer-site/enums/CustomerPageUrl';\nimport { restartOnvifInstallation } from '../base-onvif-installation-controller';\nimport BaseOnvifInstallationRoute from '../base-onvif-installation-route';\n\nimport type Transition from '@ember/routing/transition';\n\n/**\n * @classdesc\n * The index route which handles Terms of Service acceptance.\n */\nexport default class OnvifInstallTermsOfServiceRoute extends BaseOnvifInstallationRoute {\n readonly routeId = EmberOnvifInstallationTermsOfService;\n\n /** @override */\n async beforeModel(transition: Transition): Promise {\n await super.beforeModel(transition);\n\n // If the user navigates directly to this page, they won't have any discovery results.\n const totalDiscoveryResults = this.store.peekAll('video/onvif-camera-discovery-result').length;\n if (totalDiscoveryResults === 0) {\n restartOnvifInstallation.call(this);\n }\n }\n\n /**\n * This will always be false unless we implement VID-42277 Acceptance tracking.\n * The agreement has to always be shown at the start due to the legal concerns over the security of using third-party cameras.\n */\n model(): { hasAcceptedAgreement: boolean } {\n return { hasAcceptedAgreement: false };\n }\n}\n","import { action, set } from '@ember/object';\nimport { task, timeout } from 'ember-concurrency';\nimport { Vehicle } from 'customer-site/enums/SavedClipFilterOption';\nimport { AnalyticsRulesPushNotificationsTooltipClick } from 'customer-site/enums/TrackedEvent';\nimport { logEventIfHasNoOvRules } from 'customer-site/utils/video/rules-stats';\nimport DrawBaseController from '../draw-base-controller';\n\nimport type { ClassificationFilter } from 'customer-site/classes/video/rules/classification-filter';\nimport type OvRule from 'customer-site/models/video/ov-rule';\n\n/**\n * Duration that a user must hover over an info tooltip before the event is reported to the stats service.\n */\nconst TooltipFocusTimeForLoggingMs = 4000;\n\nexport default class DrawController extends DrawBaseController {\n /**\n * The tracked event ID for the user clicking the push notifications helper tooltip.\n */\n pushNotificationsTooltipClickEventId = AnalyticsRulesPushNotificationsTooltipClick;\n\n /**\n * Update the rule's notification filters if the user changed them.\n */\n @action onNotificationFilterSelectionChanged(filterSelection: ClassificationFilter[]): void {\n const selectedFilters = filterSelection.filter((item) => item.state);\n const filters = [...new Set([...selectedFilters.flatMap((f) => f.filters)])];\n\n set(this.model.rule, 'notificationFilters', filters);\n set(\n this.model.rule as OvRule,\n 'vehicleNotificationFilters',\n selectedFilters.find((item) => item.value === Vehicle)?.subjectIds ?? []\n );\n }\n\n /**\n * Log an event to the stats service if the customer does not have any OV rules saved.\n */\n @action logEvent(eventId: number): void {\n logEventIfHasNoOvRules(this.store, this.stats, eventId);\n }\n\n /**\n * Log a stat for a tooltip hover event if it has been active for long enough.\n */\n @task *logTooltipHoverInteractionTask(eventId: number) {\n yield timeout(TooltipFocusTimeForLoggingMs);\n this.logEvent(eventId);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/rules/analytics/draw/index': DrawController;\n }\n}\n","import DrawBaseRoute from '../draw-base-route';\n\nexport default class DrawRoute extends DrawBaseRoute {}\n","import { cached, tracked } from '@glimmer/tracking';\nimport { action, computed, get, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarFaces, EmberVideoFamiliarVehicles } from 'customer-site/enums/CustomerPageUrl';\nimport { PackageDeliveryAlert, PackageRetrievalAlert } from 'customer-site/enums/EventType';\nimport { Face as FamiliarFace, Vehicle as FamiliarVehicle } from 'customer-site/enums/FamiliarObjectType';\nimport {\n Person,\n Animal,\n Vehicle,\n Package,\n AnyUnfamiliarVehicle,\n AnyUnfamiliarFace,\n SpecificFamiliarFace,\n SpecificFamiliarVehicle,\n UnrecognizedPerson\n} from 'customer-site/enums/SavedClipFilterOption';\nimport { AttachThumbnail, AttachVideoClip } from 'customer-site/enums/VideoNotificationFormat';\nimport OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport OvRule from 'customer-site/models/video/ov-rule';\nimport {\n findEnrollmentOfType,\n getEnrollments,\n getFamiliarSubjectsForFiltering\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport CheckboxTreeItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport DrawBaseController from '../draw-base-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type { CompositeFilter, ValueFilter } from 'customer-site/classes/video/rules/classification-filter';\nimport type BaseAnalyticsRule from 'customer-site/models/video/base-analytics-rule';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\n\n// Dummy values for notification filter dropdown items because having the enums as values causes issues such as\n// Selecting a specific familiar subject would add the enum value to the rule's notification filters,\n// which would SELECT the entire dropdown item associated with the enum value, which selects all the children items when there was only a few selected\nconst ALL_PEOPLE = 'ALL PEOPLE';\nconst ALL_VEHICLES = 'ALL VEHICLES';\nconst SPECIFIC_FAMILIAR_FACE = 'SPECIFIC FAMILIAR FACE';\nconst SPECIFIC_FAMILIAR_VEHICLE = 'SPECIFIC FAMILIAR VEHICLE';\n\n/**\n * Props for the BinaryListItem componentBinaryListItemProps\n */\ninterface BinaryListItemProps {\n value: string;\n hasEnableFeatureButton?: boolean;\n hasNotificationFilterDropdown?: boolean;\n dropdownItems?: Promise;\n dropdownAction?: (dropdownValues: DropdownSelectItem[]) => void;\n placeholderText?: string;\n enableFeatureButtonProps?: {\n enableButtonText: string;\n enableButtonRoute: string;\n shouldShowButton: Promise;\n };\n}\n\nfunction createCheckboxTreeFromFilters(\n classifications: number[],\n disabled: boolean,\n filters: (CompositeFilter | ValueFilter)[]\n): CheckboxTreeItem[] {\n return filters.map((item) =>\n CheckboxTreeItem.create({\n name: item.label,\n value: item.value.toString(),\n state:\n // notification classification should match target classification\n getDetectionTypeState(item.value, classifications, true) === SELECTED || disabled\n ? SELECTED\n : UNSELECTED,\n icon: updateFilterIcon(item.icon as string),\n disabled: getDetectionTypeState(item.value, classifications, true) === UNSELECTED || disabled\n })\n );\n}\n\nfunction getDetectionTypeState(type: number, filters: number[] | undefined, canCreateParcelRule: boolean): number {\n return (filters == undefined || filters.includes(type)) && !(type === Package && !canCreateParcelRule)\n ? SELECTED\n : UNSELECTED;\n}\n\nfunction replaceVideoClipWithThumbnail(recipients: Record): void {\n for (const id in recipients) {\n if (recipients[id] === AttachVideoClip) {\n recipients[id] = AttachThumbnail;\n }\n }\n}\n\nfunction updateFilterIcon(icon: string): string {\n switch (icon) {\n case 'wellness-activity':\n return 'va-person';\n case 'car':\n return 'va-vehicle';\n case 'scenes-pets':\n return 'va-animal';\n default:\n return icon;\n }\n}\n\nexport default class DrawV2Controller extends DrawBaseController {\n @service declare intl: ADCIntlService;\n\n /**\n * The name of the parent rule of the parcel detection rule, if it exists for this camera.\n */\n parcelRuleName: string = '';\n\n /**\n * Controls whether or not the rule's exceptions are shown beneath the timeframe.\n * The inital value is set by if the rule has any exceptions.\n */\n @tracked\n showExceptionSettings = false;\n\n /**\n * Controls whether or not the light automation section should be expanded.\n * The inital value is set by if the rule has any lights selected.\n */\n @tracked\n showLightAutomation = false;\n\n /**\n * Controls whether or not the Perimeter Guard section should be expanded.\n * The inital value is set by if the rule has PG enabled.\n */\n @tracked\n showPerimeterGuard = false;\n\n /**\n * Should we display the familiar face features?\n */\n @cached\n get shouldDisplayFamiliarFaceFeatures(): Promise {\n return this.checkCameraFeatureAccess(\n (camera) => camera.supportsFamiliarFace,\n (videoSettingsPermissions) =>\n videoSettingsPermissions.hasFamiliarFaceAndVehicleAccess ||\n videoSettingsPermissions.hasOnlyFamiliarFaceAccess\n );\n }\n\n /**\n * Does the rule's camera support the familiar vehicle feature and does the user have access to it?\n */\n @cached\n get shouldDisplayFamiliarVehicleFeatures(): Promise {\n if (!this.identityManager.identityModel?.hasInternalBetaAccess) {\n return Promise.resolve(false);\n }\n\n return this.checkCameraFeatureAccess(\n (camera) => camera.supportsFamiliarSubjectRecognition,\n (videoSettingsPermissions) =>\n videoSettingsPermissions.hasFamiliarFaceAndVehicleAccess ||\n videoSettingsPermissions.hasOnlyFamiliarVehicleAccess\n );\n }\n\n /**\n * Determines whether or not the InlineAlert for package alerts being disabled should be displayed.\n */\n @computed('model.rule.{camera.supportsParcelRules,canCreateParcelRule}')\n get showPackageAlertsDisabledWarning(): boolean {\n const rule = this.model.rule as OvRule,\n supportsParcel = get(rule, 'camera.supportsParcelRules') as boolean;\n return supportsParcel && !rule.canCreateParcelRule;\n }\n\n /**\n * The detection types to be sent to the camera for rules on OVReady 2.1 and greater.\n */\n @computed(\n 'canEditRule',\n 'model.permissions.areAnimalEventsExcluded',\n 'model.rule.{camera.supportedNotificationFilterTypes,canCreateParcelRule,ruleClassificationFilters}'\n )\n get detectionTypes(): CheckboxTreeItem[] {\n const { intl, model } = this,\n rule = model.rule as OvRule,\n disabled = !this.canEditRule,\n excludeAnimals = model.permissions.areAnimalEventsExcluded,\n classifications = rule.ruleClassificationFilters,\n canCreateParcelRule = rule.canCreateParcelRule,\n supportedNotifications = get(rule, 'camera.supportedNotificationFilterTypes') as number[],\n items: [number, string, string][] = [\n [Person, intl.t('generic.video.objectDetection.person'), 'va-person'],\n [Vehicle, intl.t('generic.video.objectDetection.vehicle'), 'va-vehicle'],\n excludeAnimals ? undefined : [Animal, intl.t('generic.video.objectDetection.animal'), 'va-animal'],\n [Package, intl.t('video.rules.analytics.draw.package'), 'box-delivery']\n ].filter((i) => i != undefined) as [number, string, string][];\n\n return items\n .map(([type, name, icon]) =>\n supportedNotifications.includes(type)\n ? CheckboxTreeItem.create({\n name,\n value: type.toString(),\n state: getDetectionTypeState(type, classifications, canCreateParcelRule),\n icon,\n disabled: disabled || (type === Package && !canCreateParcelRule)\n })\n : undefined\n )\n .filter((i) => i != undefined) as CheckboxTreeItem[];\n }\n\n /**\n * The familiar face items to be used for selecting familiar faces.\n */\n get familiarFaceItems(): Promise {\n return (async () => {\n const { intl, getFamiliarSubjectProfiles, hasEnabledFamiliarFaceEnrollments } = this,\n { rule } = this.model,\n familiarSubjectNotificationFilters = rule instanceof OvRule ? rule.familiarFaceNotificationFilters : [];\n const selections = [AnyUnfamiliarFace, SpecificFamiliarFace, UnrecognizedPerson];\n\n if (!(await hasEnabledFamiliarFaceEnrollments)) {\n return [];\n }\n\n // Check if some of the face options are selected, if they are, that means only a subset of people filters are selected and not all faces\n const somePeopleSelected = selections.some((selection) => rule.notificationFilters.includes(selection)),\n familiarFaceProfiles = await getFamiliarSubjectProfiles(\n this.store,\n FamiliarFace,\n familiarSubjectNotificationFilters\n );\n\n const dropdownItems = [\n CheckboxTreeItem.create({\n name: intl.t('video.rules.analytics.draw.allPeople'),\n // dummy value, since the \"Person\" detection type selection controls if the filter is on.\n // If we deselect \"Person\" it would turn off the notificaiton filter which we don't want\n value: ALL_PEOPLE,\n state: somePeopleSelected ? UNSELECTED : SELECTED\n }),\n CheckboxTreeItem.create({\n name: intl.t('video.rules.analytics.draw.personOnly'),\n value: UnrecognizedPerson.toString(), // filtering for Person only and not familiar face\n state: rule.notificationFilters.includes(UnrecognizedPerson) ? SELECTED : UNSELECTED\n }),\n CheckboxTreeItem.create({\n name: intl.t('generic.video.objectDetection.anyUnfamiliarFace'),\n value: AnyUnfamiliarFace.toString(),\n state: rule.notificationFilters.includes(AnyUnfamiliarFace) ? SELECTED : UNSELECTED\n })\n ];\n\n if (familiarFaceProfiles.length > 0) {\n dropdownItems.push(\n DropdownSelectItem.create({\n name: intl.t('generic.video.objectDetection.specificFamiliarFace'),\n value: SPECIFIC_FAMILIAR_FACE,\n subitems: familiarFaceProfiles,\n isCollapsible: true\n })\n );\n }\n\n return dropdownItems;\n })();\n }\n\n /**\n * The familiar vehicle items to be used for selecting familiar vehicles.\n */\n get familiarVehicleItems(): Promise {\n return (async () => {\n const { intl, getFamiliarSubjectProfiles, hasEnabledFamiliarVehicleEnrollments } = this,\n { rule } = this.model,\n familiarSubjectNotificationFilters = rule instanceof OvRule ? rule.vehicleNotificationFilters : [];\n const selections = [AnyUnfamiliarVehicle, SpecificFamiliarVehicle];\n\n if (!(await hasEnabledFamiliarVehicleEnrollments)) {\n return [];\n }\n\n // Check if some vehicle options are selected, if they are, that means only a subset of vehicle filters are selected and not all vehicles\n const someVehiclesSelected = selections.some((selection) => rule.notificationFilters.includes(selection)),\n familiarVehiclePofiles = await getFamiliarSubjectProfiles(\n this.store,\n FamiliarVehicle,\n familiarSubjectNotificationFilters\n );\n\n const dropdownItems = [\n DropdownSelectItem.create({\n name: intl.t('video.rules.analytics.draw.allVehicles'),\n // dummy value, since the \"Vehicle\" detection type selection controls if the filter is on\n // If we deselect \"Vehicle\" it would turn off the notificaiton filter which we don't want.\n value: ALL_VEHICLES,\n state: someVehiclesSelected ? UNSELECTED : SELECTED\n }),\n DropdownSelectItem.create({\n name: intl.t('generic.video.objectDetection.anyUnfamiliarVehicle'),\n value: AnyUnfamiliarVehicle.toString(),\n state: rule.notificationFilters.includes(AnyUnfamiliarVehicle) ? SELECTED : UNSELECTED\n })\n ];\n\n if (familiarVehiclePofiles.length > 0) {\n dropdownItems.push(\n DropdownSelectItem.create({\n name: intl.t('generic.video.objectDetection.specificFamiliarVehicle'),\n value: SPECIFIC_FAMILIAR_VEHICLE,\n subitems: familiarVehiclePofiles,\n isCollapsible: true\n })\n );\n }\n\n return dropdownItems;\n })();\n }\n\n /**\n * The CheckboxTreeItems to be used for selecting light rule filters.\n */\n @computed(\n 'canEditRule',\n 'isThirdPartyCamera',\n 'lightRuleFilters',\n 'thirdPartySelectedLightRuleTriggers',\n 'model.rule.ruleClassificationFilters',\n 'thirdPartyLightRuleSupportedEvents'\n )\n get lightRuleFiltersCheckboxTreeItems(): CheckboxTreeItem[] {\n if (this.isThirdPartyCamera) {\n return this.thirdPartyLightRuleSupportedEvents;\n }\n\n const classifications = (this.model.rule as OvRule).ruleClassificationFilters,\n disabled = !this.canEditRule,\n lightFilters = this.lightRuleFilters;\n return createCheckboxTreeFromFilters(classifications, disabled, lightFilters);\n }\n\n /**\n * The BinaryListItems to be used for selecting notification filters.\n */\n @computed(\n 'canEditRule',\n 'familiarFaceItems',\n 'familiarFacePlaceholder',\n 'familiarVehiclePlaceholder',\n 'shouldDisplayFamiliarFaceFeatures',\n 'shouldDisplayFamiliarVehicleFeatures',\n 'familiarVehicleItems',\n 'model.rule.{activeParcelDetectionEvents,camera.supportedParcelEvents,canCreateParcelRule,ruleClassificationFilters}',\n 'notificationFilterSelection'\n )\n get notificationFiltersBinaryListItems(): BinaryListItem[] {\n const { intl, model, notificationFilterSelection } = this,\n rule = model.rule,\n activeParcelEvents = (rule as OvRule).activeParcelDetectionEvents,\n supportedParcelEvents = get(rule, 'camera.supportedParcelEvents') as number[],\n canCreateParcelRule = (rule as OvRule).canCreateParcelRule,\n classifications = (rule as OvRule).ruleClassificationFilters,\n disabled = !this.canEditRule,\n packageNotIncluded = classifications != undefined && !classifications.includes(Package),\n packageDisabled = disabled || packageNotIncluded || !canCreateParcelRule,\n packageFilters: [number, string, string][] = [\n [\n PackageDeliveryAlert,\n intl.t('video.rules.analytics.draw.packageDeliveryDescription'),\n 'package-delivery'\n ],\n [\n PackageRetrievalAlert,\n intl.t('video.rules.analytics.draw.packageRetrievalDescription'),\n 'package-retrieval'\n ]\n ],\n detectionNotifications: BinaryListItem[] = [];\n\n notificationFilterSelection.map((filter) => {\n detectionNotifications.push(\n new BinaryListItem({\n label: filter.label,\n state: filter.isSelected,\n icon: updateFilterIcon(filter.icon as string),\n disabled: getDetectionTypeState(filter.value, classifications, true) === UNSELECTED || disabled,\n props: {\n value: filter.value.toString(),\n hasEnableFeatureButton:\n (filter.value === Person && this.shouldDisplayFamiliarFaceFeatures) ||\n (filter.value === Vehicle && this.shouldDisplayFamiliarVehicleFeatures),\n enableFeatureButtonProps: {\n enableButtonText: this.getEnableFeatureText(filter.value),\n enableButtonRoute:\n filter.value === Person ? EmberVideoFamiliarFaces : EmberVideoFamiliarVehicles,\n hasUserEnabledFeature: this.getIsFamiliarSubjectEnabledPromise(filter.value)\n },\n hasNotificationFilterDropdown:\n filter.isSelected &&\n ((filter.value === Person && this.shouldDisplayFamiliarFaceFeatures) ||\n (filter.value === Vehicle && this.shouldDisplayFamiliarVehicleFeatures)),\n dropdownItems: this.familiarSubjectDropdownItems(filter.value),\n dropdownAction: this.mapFilterTypeToDropdownAction(filter.value),\n placeholderText:\n filter.value === Person\n ? intl.t('generic.video.settings.familiar-subject.people')\n : intl.t('generic.video.settings.familiar-subject.vehicles')\n }\n })\n );\n });\n\n packageFilters.map(([alert, name, icon]) => {\n if (supportedParcelEvents.includes(alert)) {\n detectionNotifications.push(\n new BinaryListItem({\n label: name,\n state: activeParcelEvents?.includes(alert) && !packageNotIncluded && canCreateParcelRule,\n icon,\n disabled: packageDisabled,\n props: {\n value: alert.toString()\n }\n })\n );\n }\n });\n\n return detectionNotifications;\n }\n\n /**\n * Is the account enrolled in vehicle?\n */\n get hasEnabledFamiliarFaceEnrollments(): Promise {\n return (async () => {\n const enrollments = await getEnrollments(this.store),\n faceEnrollments = enrollments.filter((enrollment) => enrollment.familiarObjectType === FamiliarFace);\n\n return faceEnrollments.length > 0;\n })();\n }\n\n /**\n * Check if the account is enrolled in vehicle\n */\n get hasEnabledFamiliarVehicleEnrollments(): Promise {\n return (async () => {\n const enrollments = await getEnrollments(this.store),\n vehicleEnrollments = enrollments.filter(\n (enrollment) => enrollment.familiarObjectType === FamiliarVehicle\n );\n\n return vehicleEnrollments.length > 0;\n })();\n }\n\n /**\n * Helper method to Update the rule's notification filters if the user changed them.\n * And also changes the familiar subject filters if the rule is OvRule. (familiarFaceNotificationFilters or vehicleNotificationFilters)\n * Case 1: If no familiar subject is selected, remove all filters\n * Case 2: Check if for all the possible selections not including specific subject, we want to include them in the notificationFilters\n * Case 3: Check if Specific Familiar is selected and which specific familiar subjects are selected\n * Case 4: If All Subjects are selected individually when All Subjects is NOT selected, select ALL subjects and remove all other filters\n * Case 5: If All People or All Vehicles is selected, remove all other filters\n */\n @action\n onNotificationDropdownSelectionChangedHelper(\n dropdownValues: DropdownSelectItem[],\n familiarObjectType: number\n ): void {\n const { removeAllFamiliarSubjectFilters } = this;\n const { rule } = this.model;\n\n // The selected dropdowns\n const selectedOrPartiallySelectedDropdownValues = dropdownValues.filter((item) => item.state !== UNSELECTED);\n // This will be the clusters\n const familiarClusters = dropdownValues.flatMap((item) => item.subitems).filter(Boolean);\n const selectedFamiliarClusters = familiarClusters.filter((item) => item.state === SELECTED);\n\n // The first dropdown value is the \"All Vehicles\" / \"All Faces\" option\n const allfamiliarSubjectsOption = dropdownValues[0];\n\n const isFace = familiarObjectType === FamiliarFace,\n personOrVehicle = isFace ? Person : Vehicle,\n anyUnfamiliar = isFace ? AnyUnfamiliarFace : AnyUnfamiliarVehicle,\n possibleSelections = [anyUnfamiliar, UnrecognizedPerson], // Possible individual selections that are not specific familiar subjects\n specificFamiliarSubject = isFace ? SpecificFamiliarFace : SpecificFamiliarVehicle,\n notificationFiltersSet = new Set(rule.notificationFilters);\n\n // Case 1: If no familiar subject is selected, remove all filters\n if (selectedOrPartiallySelectedDropdownValues.length === 0 && selectedFamiliarClusters.length === 0) {\n notificationFiltersSet.delete(personOrVehicle);\n removeAllFamiliarSubjectFilters(notificationFiltersSet, familiarObjectType, rule);\n rule.notificationFilters = Array.from(notificationFiltersSet);\n return;\n }\n\n // Case 2: Check if for all the possible selections not including specific subject, we want to include them in the notificationFilters\n dropdownValues.forEach((dropdownItem) => {\n // The selected value, converted to a number, since dropdown values are strings\n const selectedValue = Number(dropdownItem.value);\n\n if (possibleSelections.includes(selectedValue)) {\n if (dropdownItem.state === SELECTED) {\n notificationFiltersSet.add(selectedValue);\n } else {\n notificationFiltersSet.delete(selectedValue);\n }\n }\n });\n\n // Case 3: Check if Specific Familiar is selected and which specific familiar subjects are selected\n if (rule instanceof OvRule) {\n const selectedFamiliarSubjectValues = selectedFamiliarClusters.map((item) => item.value);\n\n if (familiarObjectType === FamiliarFace) {\n rule.familiarFaceNotificationFilters = selectedFamiliarSubjectValues;\n } else if (familiarObjectType === FamiliarVehicle) {\n rule.vehicleNotificationFilters = selectedFamiliarSubjectValues;\n }\n\n if (selectedFamiliarClusters.length > 0) {\n notificationFiltersSet.add(specificFamiliarSubject);\n } else {\n notificationFiltersSet.delete(specificFamiliarSubject);\n }\n }\n\n // Case 4: If All Subjects are selected individually, and All Subjects option is NOT selected, select ALL subjects option and remove all other filters\n if (\n allfamiliarSubjectsOption.state === UNSELECTED &&\n selectedOrPartiallySelectedDropdownValues.length === dropdownValues.length - 1 &&\n selectedFamiliarClusters.length === familiarClusters.length\n ) {\n notificationFiltersSet.add(personOrVehicle);\n removeAllFamiliarSubjectFilters(notificationFiltersSet, familiarObjectType, rule);\n }\n\n // Case 5: If All People or All Vehicles is selected, remove all other filters\n // We do this at the end because it overrides all other cases\n if (dropdownValues[0].state === SELECTED) {\n notificationFiltersSet.add(personOrVehicle);\n removeAllFamiliarSubjectFilters(notificationFiltersSet, familiarObjectType, rule);\n }\n\n rule.notificationFilters = Array.from(notificationFiltersSet);\n }\n\n /**\n * Recalculate the notification and light rule filters based on selections.\n */\n @action\n onFaceNotificationDropdownSelectionChanged(dropdownValues: DropdownSelectItem[]): void {\n this.onNotificationDropdownSelectionChangedHelper(dropdownValues, FamiliarFace);\n }\n\n /**\n * Recalculate the notification and light rule filters based on selections.\n */\n @action\n onVehicleNotificationDropdownSelectionChanged(dropdownValues: DropdownSelectItem[]): void {\n this.onNotificationDropdownSelectionChangedHelper(dropdownValues, FamiliarVehicle);\n }\n\n /**\n * Store the currently selected detection types in the dirty model instance.\n * Recalculate the notification and light rule filters based on selections.\n */\n @action onDetectionTypesChanged(): void {\n const classifications = this.detectionTypes\n .filter((type) => type.state == SELECTED)\n .map((type) => Number(type.value));\n set(this.model.rule as OvRule, 'ruleClassificationFilters', classifications);\n\n this.onNotificationBinaryListSelectionChanged(this.notificationFiltersBinaryListItems);\n this.onLightAutomationCheckboxTreeSelectionChanged(this.lightRuleFiltersCheckboxTreeItems);\n }\n\n /**\n * Action for when the light rule filters are changed. Filter by state and save the values to the dirty model.\n * @param checkboxTree\n */\n @action onLightAutomationCheckboxTreeSelectionChanged(checkboxTree: CheckboxTreeItem[]): void {\n const selectedFilters = checkboxTree.filter((f) => f.state),\n filters = [...new Set([...selectedFilters.flatMap((f) => f.value)])].map(Number);\n\n if (this.isThirdPartyCamera) {\n set(this, 'thirdPartySelectedLightRuleTriggers', filters);\n } else {\n set(this.model.rule, 'lightRuleFilters', filters);\n }\n }\n\n /**\n * Action for when the notification filters are changed. Filter by state and save the values to the dirty model.\n * @param checkboxTree\n */\n @action onNotificationBinaryListSelectionChanged(binaryListItems: BinaryListItem[]): void {\n const rule = this.model.rule,\n selectedFilters: BinaryListItem[] = binaryListItems.filter((f) => f.state),\n filtersSet = new Set([...selectedFilters.flatMap((f) => Number((f.props as BinaryListItemProps).value))]),\n packageAlerts = [PackageDeliveryAlert, PackageRetrievalAlert],\n notificationFilters: number[] = [],\n parcelEvents: number[] = [];\n\n if (!filtersSet.has(Person)) {\n this.removeAllFamiliarSubjectFilters(filtersSet, FamiliarFace, rule);\n }\n\n if (!filtersSet.has(Vehicle)) {\n this.removeAllFamiliarSubjectFilters(filtersSet, FamiliarVehicle, rule);\n }\n\n filtersSet.forEach((f) => (packageAlerts.includes(f) ? parcelEvents.push(f) : notificationFilters.push(f)));\n\n set(rule, 'notificationFilters', notificationFilters);\n if (rule instanceof OvRule) {\n set(rule, 'activeParcelDetectionEvents', parcelEvents);\n\n if (!rule.notificationFilters.includes(Person)) {\n rule.familiarFaceNotificationFilters = [];\n }\n\n if (!rule.notificationFilters.includes(Vehicle)) {\n rule.vehicleNotificationFilters = [];\n }\n }\n }\n\n /**\n * Toggle isClipUploadActive.\n * If false, change video clip notifications to thumbnail notifications.\n */\n @action onClipUploadChanged(): void {\n const { rule } = this.model,\n isClipUploadActive = rule.isClipUploadActive;\n\n rule.isClipUploadActive = !isClipUploadActive;\n if (!rule.isClipUploadActive) {\n replaceVideoClipWithThumbnail(rule.emailRecipients);\n replaceVideoClipWithThumbnail(rule.mobileRecipients);\n replaceVideoClipWithThumbnail(rule.pushDeviceRecipients);\n }\n }\n\n /**\n * Toggle the light automation section.\n * If turned off, remove all selected lights.\n */\n @action onLightAutomationToggleChanged(): void {\n this.showLightAutomation = !this.showLightAutomation;\n if (!this.showLightAutomation) {\n this.model.rule.lightsSelected.setObjects([]);\n } else if (this.isThirdPartyCamera) {\n // By default, the light triggers will equal the analytic triggers when turning light rule on.\n set(this, 'thirdPartySelectedLightRuleTriggers', this.analyticTriggers);\n }\n }\n\n /**\n * Toggle the notifications section.\n * If turned off, remove all recipients.\n */\n @action onNotificationsToggleChanged(): void {\n const { rule } = this.model;\n\n this.showNotifications = !this.showNotifications;\n if (!this.showNotifications) {\n if (rule instanceof OvRule) {\n rule.activeParcelDetectionEvents = [];\n }\n rule.emailRecipients = {};\n rule.mobileRecipients = {};\n rule.monitoringStationRecipients = {};\n rule.pushDeviceRecipients = {};\n }\n }\n\n /**\n * Toggle the Perimeter Guard section.\n * If toggled off, turn off the audio and the LED.\n */\n @action async onPerimeterGuardToggleChanged(): Promise {\n const perimeterGuard = await (this.model.rule as OvRule).perimeterGuardConfig;\n\n this.showPerimeterGuard = !this.showPerimeterGuard;\n if (!this.showPerimeterGuard) {\n perimeterGuard.audioEnabled = false;\n perimeterGuard.ledEnabled = false;\n perimeterGuard.lightEnabled = false;\n }\n }\n\n /**\n * Helper method to check if the camera supports a specific feature and if the user has access to it.\n */\n private async checkCameraFeatureAccess(\n cameraFeatureCheck: (camera: OvReadyCamera) => boolean,\n permissionCheck: (permissions: VideoSettingsPermission) => boolean\n ): Promise {\n const camera = await this.model.rule.camera;\n\n if (!(camera instanceof OvReadyCamera)) {\n return false;\n }\n\n const videoSettingsPermissions = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n );\n\n return cameraFeatureCheck(camera) && permissionCheck(videoSettingsPermissions);\n }\n\n /**\n * Match the familiar subject filter type to the corresponding enable feature button enabled promise.\n */\n private getIsFamiliarSubjectEnabledPromise(notificationFilterType: number): Promise {\n if (notificationFilterType === Person) {\n return this.hasEnabledFamiliarFaceEnrollments;\n }\n if (notificationFilterType === Vehicle) {\n return this.hasEnabledFamiliarVehicleEnrollments;\n }\n return Promise.resolve(false);\n }\n\n /**\n * Remove all the filters we need to remove from rule.notificationFilters\n */\n private removeAllFamiliarSubjectFilters(\n notificationFilters: Set,\n familiarObjectType: number,\n rule: BaseAnalyticsRule\n ): void {\n if (!(rule instanceof OvRule)) {\n return;\n }\n // Remove all the filters we need to remove\n const familiarFaceFilters = [UnrecognizedPerson, AnyUnfamiliarFace, SpecificFamiliarFace],\n familiarVehicleFilters = [AnyUnfamiliarVehicle, SpecificFamiliarVehicle];\n\n if (familiarObjectType === FamiliarFace) {\n familiarFaceFilters.forEach((filter) => notificationFilters.delete(filter));\n rule.familiarFaceNotificationFilters = [];\n }\n\n if (familiarObjectType === FamiliarVehicle) {\n familiarVehicleFilters.forEach((filter) => notificationFilters.delete(filter));\n rule.vehicleNotificationFilters = [];\n }\n }\n\n /**\n * Map the filter type to the corresponding dropdown action.\n */\n private mapFilterTypeToDropdownAction(\n filterType: number\n ): ((dropdownValues: DropdownSelectItem[]) => void) | undefined {\n if (filterType === Person) {\n return this.onFaceNotificationDropdownSelectionChanged;\n }\n if (filterType === Vehicle) {\n return this.onVehicleNotificationDropdownSelectionChanged;\n }\n return undefined;\n }\n\n /**\n * Get the familiar subject dropdown items for the given object type.\n */\n private familiarSubjectDropdownItems(filterType: number): Promise {\n if (filterType === Person) {\n return this.familiarFaceItems;\n }\n if (filterType === Vehicle) {\n return this.familiarVehicleItems;\n }\n return Promise.resolve([]);\n }\n\n /**\n * Get the text for the enable feature button.\n */\n private getEnableFeatureText(detectionType: number): string {\n const { intl } = this;\n return detectionType === Person\n ? intl.t('video.rules.analytics.draw.enableFamiliarFace')\n : intl.t('video.rules.analytics.draw.enableFamiliarVehicle');\n }\n\n /**\n * Get the familiar subject profiles for the given object type.\n */\n private async getFamiliarSubjectProfiles(\n store: Store,\n familiarObjectType: number,\n familiarSubjectNotificationFilters: string[]\n ): Promise {\n const items: CheckboxTreeItem[] = [];\n const enrollment = await findEnrollmentOfType(store, familiarObjectType);\n if (enrollment) {\n const clusters = await getFamiliarSubjectsForFiltering(enrollment);\n if (clusters) {\n clusters.forEach((item: FamiliarTargetEnrollmentCluster) => {\n items.push(\n CheckboxTreeItem.create({\n name: item.description,\n value: item.id,\n state: familiarSubjectNotificationFilters.includes(item.id) ? SELECTED : UNSELECTED\n })\n );\n });\n }\n }\n\n return items;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/rules/analytics/draw/v2': DrawV2Controller;\n }\n}\n","import { EmberOvReadyRuleDrawV2 } from 'customer-site/enums/CustomerPageUrl';\nimport { Package } from 'customer-site/enums/SavedClipFilterOption';\nimport OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport DrawBaseRoute from '../draw-base-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type DrawV2Controller from './controller';\n\nexport default class DrawV2Route extends DrawBaseRoute {\n /** @override */\n routeId = EmberOvReadyRuleDrawV2;\n\n /** @override */\n async setupController(controller: DrawV2Controller, model: ModelFrom, transition: Transition): Promise {\n super.setupController(controller, this.modelFor('video.rules.analytics.draw.v2'), transition);\n const rule = model.rule,\n camera = await rule.camera,\n rules = await camera.ovRules;\n\n if (rule.isNew) {\n rule.name = this.intl.t('video.rules.analytics.draw.defaultRuleName', {\n cameraName: camera.description,\n ruleNumber: rules.length + 1\n });\n }\n\n if (camera instanceof OvReadyCamera) {\n let parcelRuleName = '';\n rules.forEach((r: OvRule) => {\n if (r.ruleClassificationFilters?.includes(Package)) {\n parcelRuleName = r.name;\n return;\n }\n });\n controller.set('parcelRuleName', parcelRuleName);\n (rule as OvRule).canCreateParcelRule =\n camera.supportsParcelRules && (parcelRuleName.length == 0 || parcelRuleName == rule.name);\n }\n\n // Initialize the properties for showing the sections collapsed or expanded.\n const [lights, perimeterGuard] = await Promise.all([\n (rule as OvRule).lightsSelected,\n (rule as OvRule).perimeterGuardConfig\n ]);\n controller.set('showExceptionSettings', rule.exceptions?.length > 0);\n controller.set('showLightAutomation', lights?.length > 0);\n controller.set('showNotifications', rule.hasSelectedRecipients);\n controller.set('showPerimeterGuard', perimeterGuard?.enabled);\n }\n\n /**\n * You're not allowed to have more than one controller property map to the same query param key,\n * so 'relay' is mapped to 'relay-v2' here so both draw routes can have unique query params.\n *\n * @override\n */\n queryParams = {\n relay: { as: 'relay-v2', replace: false, refreshModel: false }\n };\n}\n","import AdcBaseRoute from '../../../../classes/base-route';\nimport { EmberOvReadyRuleSelect } from '../../../../enums/CustomerPageUrl';\n\n/**\n * @classdesc Index route for video analytic rules.\n *\n * @class video.rules.analytics.index.Route\n * @extends classes.BaseRoute\n */\nconst Route = AdcBaseRoute.extend(\n /** @lends video.rules.analytics.index.Route# */ {\n beforeModel() {\n // Index doesn't show anything yet, so we need to redirect to the first step.\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberOvReadyRuleSelect, this.queryParams);\n }\n }\n);\n\nexport default Route;\n","import { get, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { Vehicle as FamiliarObjectVehicle } from 'customer-site/enums/FamiliarObjectType';\nimport {\n Animal,\n Person,\n Vehicle as SavedClipFilterVehicle,\n DeliveryVehicle,\n ThirdPartyAnalytics\n} from 'customer-site/enums/SavedClipFilterOption';\nimport OvRule from 'customer-site/models/video/ov-rule';\nimport { getCaughtError } from 'customer-site/utils/general';\nimport ContactTypeEnum from '@adc/login-setup-addon/enums/ContactType';\nimport { hash, Promise as EmberPromise } from 'rsvp';\nimport { EmberOvReadyRule } from '../../../enums/CustomerPageUrl';\nimport { Disarmed } from '../../../enums/RecordingException';\nimport BaseVideoAutomationRoute from '../../base-video-automation-route';\n\nimport type Store from '@ember-data/store';\nimport type ArrayProxy from '@ember/array/proxy';\nimport type Transition from '@ember/routing/transition';\nimport type Light from 'customer-site/models/devices/light';\nimport type SystemConfig from 'customer-site/models/systems/configuration';\nimport type EmailAddress from 'customer-site/models/users/email-address';\nimport type MobileAddress from 'customer-site/models/users/mobile-address';\nimport type MonitoringStationAddress from 'customer-site/models/users/monitoring-station-address';\nimport type PushDeviceAddress from 'customer-site/models/users/push-device-address';\nimport type BaseAnalyticsRule from 'customer-site/models/video/base-analytics-rule';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type ThirdPartyAnalyticsCamera from 'customer-site/models/video/devices/third-party-analytics-camera';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type OvRulePermission from 'customer-site/models/video/permissions/ov-rule-permission';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\nexport type ContactData = Promise;\n\nexport interface AnalyticsModel {\n rule: BaseAnalyticsRule;\n systemConfig: SystemConfig;\n videoUsage: VideoUsageModel;\n ovCameras: ArrayProxy;\n thirdPartyAnalyticsCameras: ArrayProxy;\n familiarVehicles: FamiliarTargetEnrollmentCluster[];\n newestClipDonationAgreementVersion?: number;\n contacts?: Record | unknown;\n lights?: ArrayProxy;\n permissions: OvRulePermission;\n isTouchlessRingEnabled: boolean;\n}\n\n/**\n * Get the list of activated Familiar Vehicles for the current customer's vehicle enrollment if one exists. Returns an empty list if no enrollment is present\n * (i.e. Not opted in, hasn't accepted the legal agreement, etc)\n *\n * @returns An array of Familiar Vehicles, or empty list\n */\nasync function getEligibleFamiliarVehicles(store: Store): Promise {\n const enrollments = await store.findAll('video/familiar-targets/familiar-target-enrollment'),\n vehicleEnrollment = enrollments.find((enrollment) => enrollment.familiarObjectType === FamiliarObjectVehicle);\n return vehicleEnrollment?.get('clusters')?.filter((v) => v.isEligibleForNotifications) ?? [];\n}\n\n/**\n * @classdesc\n * Add/edit OV Ready rule route.\n */\nexport default class AnalyticsRoute extends BaseVideoAutomationRoute {\n @service declare store: Store;\n @service declare identityManager: IdentityManager;\n\n /** @override */\n routeId = EmberOvReadyRule;\n\n /** @override */\n ruleOrScheduleModelName = 'ovRules';\n\n declare currentModel: AnalyticsModel;\n\n /** @override */\n model({ id }: { id: string }): Promise {\n const { store, identityManager } = this;\n\n let ruleRecord: BaseAnalyticsRule | Promise;\n\n if (id === 'new') {\n const touchlessRingRecord = store.createRecord('video/touchless-ring-rule', {}),\n perimeterGuardConfigRecord = store.createRecord('video/perimeter-guard-config', {}),\n parcelDetectionRecord = store.createRecord('video/parcel-detection-rule', {});\n\n ruleRecord = store.createRecord('video/ov-rule', {\n touchlessRingRule: touchlessRingRecord,\n perimeterGuardConfig: perimeterGuardConfigRecord,\n parcelDetectionRule: parcelDetectionRecord\n });\n } else {\n ruleRecord = store.findRecord('video/base-analytics-rule', id);\n }\n\n const canHaveFamiliarVehicles = identityManager.identityModel?.hasFamiliarObjectEnrollmentBeta;\n\n return hash({\n rule: ruleRecord,\n systemConfig: store.findRecord('systems/configuration', identityManager.getSelectedSystemId()),\n videoUsage: store.findRecord('video/video-usage', identityManager.getSelectedSystemId()),\n permissions: store.findRecord(\n 'video/permissions/ov-rule-permission',\n identityManager.getSelectedSystemId()\n ),\n ovCameras: store.findAll('video/devices/ov-ready-camera', { reload: true }),\n thirdPartyAnalyticsCameras: store.findAll('video/devices/third-party-analytics-camera'),\n familiarVehicles: canHaveFamiliarVehicles ? getEligibleFamiliarVehicles(store) : [],\n isTouchlessRingEnabled: false\n }).catch((err) => {\n const errMsg = getCaughtError(err);\n\n this.notificationManager.addError(errMsg);\n\n this.router.transitionTo('index');\n return EmberPromise.reject(err);\n });\n }\n\n /** @override */\n async afterModel(model: AnalyticsModel): Promise {\n const store = this.store,\n systemConfig = model.systemConfig;\n\n const errorHandler = (e: any): void => {\n // We don't have permission for this specific contact type, or this api call failed for some reason.\n // Log the error, then continue processing/displaying the other contact types.\n const errorShort = e?.errors?.errors?.firstObject?.detail || e?.errors?.firstObject?.detail || e;\n console.error(`Failed to load ${name} contact type on the analytics rules route: ${errorShort}`, e);\n };\n\n // Set the contacts. Do a contact permissions check first before checking specific contact types.\n if (\n systemConfig.hasContactReadPermissions ||\n systemConfig.hasMobileContactReadPermissions ||\n systemConfig.hasMonitoringStationContactReadPermissions\n ) {\n hash(\n [\n systemConfig.hasContactReadPermissions ? [ContactTypeEnum.IPhonePush, 'push-device'] : undefined,\n systemConfig.hasMobileContactReadPermissions ? [ContactTypeEnum.Mobile, 'mobile'] : undefined,\n systemConfig.hasContactReadPermissions ? [ContactTypeEnum.Email, 'email'] : undefined,\n systemConfig.hasMonitoringStationContactReadPermissions\n ? [ContactTypeEnum.MonitoringStation, 'monitoring-station']\n : undefined\n ]\n .filter((contact): contact is (string | ContactTypeEnum)[] => contact !== undefined)\n .reduce(\n (contacts, [type, name]) => ({\n ...contacts,\n [type]:\n type === ContactTypeEnum.Mobile\n ? store\n .query('users/mobile-address', { onlyTwoFactorAddresses: true })\n .catch(errorHandler)\n : store.findAll(`users/${name}-address`).catch(errorHandler)\n }),\n {}\n )\n ).then((contacts) => {\n set(model, 'contacts', contacts);\n });\n } else {\n set(model, 'contacts', []);\n }\n\n if (systemConfig.hasAnalyticsLightRule) {\n // Set the lights.\n store.findAll('devices/light').then((lights) => set(model, 'lights', lights));\n }\n\n if (model.rule.isNew) {\n // Set default exceptions.\n const defaultExceptions =\n (await this.identityManager.identityModel?.selectedSystem)?.hasPartitions &&\n systemConfig.hasCommercialVideo\n ? [Disarmed]\n : [];\n\n set(model.rule, 'exceptions', defaultExceptions);\n\n // Set whether delivery vehicle events are included for the customer.\n // Set whether animal events are excluded for the customer.\n const defaultFilters = [\n Person,\n SavedClipFilterVehicle,\n model.permissions.isDeliveryVehicleIncluded ? DeliveryVehicle : undefined,\n model.permissions.areAnimalEventsExcluded ? undefined : Animal,\n model.thirdPartyAnalyticsCameras.length > 0 ? ThirdPartyAnalytics : undefined\n ].filter((filter): filter is number => filter !== undefined);\n\n set(model.rule, 'notificationFilters', defaultFilters);\n if (model.rule instanceof OvRule) {\n set(model.rule, 'lightRuleFilters', defaultFilters);\n }\n }\n\n // Use the points to enable the touchless ring rule on page initialization.\n // Afterwards, enabling/disabling behavior cannot depend on the points since the user\n // can clear their ground zone. It has to be controlled by the actual toggle.\n const points = get(model.rule, 'touchlessRingRule.points') as Record[];\n if (model.rule instanceof OvRule && points) {\n set(model, 'isTouchlessRingEnabled', !isEmpty(points));\n }\n\n const clipDonationAgreement = this.identityManager.identityModel?.clipDonationAgreement;\n\n if (clipDonationAgreement) {\n set(model, 'newestClipDonationAgreementVersion', clipDonationAgreement.get('newestAgreementVersion'));\n }\n }\n\n /** @override */\n deactivate(transition: Transition): void {\n const base = super.deactivate(transition),\n modelRule = this.currentModel.rule;\n\n // TODO: VID-28785 We should look into using ember concurrency on rule save and schedule save so we can just cancel a task.\n\n // Rollback prevents Ember from storing unsaved changes or unsaved new rules in the store.\n // We also confirm the rule hasn't already been destroyed, which can occur when switching systems, which unloads the store first.\n if (!modelRule.isDestroyed && !modelRule.isSaving) {\n modelRule.rollbackAttributes();\n }\n\n return base;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { getObjProperties } from '@adc/ember-utils/utils/ember-helpers';\nimport EmberController from '@ember/controller';\nimport { action, computed, get, setProperties } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport ThirdPartyAnalyticsCamera from 'customer-site/models/video/devices/third-party-analytics-camera';\nimport { selectCameraAtMaxRules } from '../../../../components/video/rules/select-camera-rule/index';\nimport { EmberOvReadyRuleSettings } from '../../../../enums/CustomerPageUrl';\nimport { GroundZone, Tripwire, PersonDetection, ThirdPartyAnalytics } from '../../../../enums/OvlRuleType';\nimport { ThirdPartyAnalytics as ThirdPartyAnalyticsFilterOption } from '../../../../enums/SavedClipFilterOption';\n\nexport const OV_RULE_TYPES = [\n ['groundZone', GroundZone],\n ['tripwire', Tripwire],\n ['personDetection', PersonDetection],\n ['thirdPartyAnalytics', ThirdPartyAnalytics]\n];\n\nexport const GIF_RESOURCE_PATH = 'images/video/rules/ovready/';\n\n/**\n * @classdesc\n * Controller for select camera and type for OV Ready rules.\n */\nexport default class AnalyticsSelectController extends EmberController {\n @service contextManager;\n @service navigation;\n @service store;\n\n queryParams = ['deviceId', 'ruleType', 'newCamera'];\n\n /**\n * All current OV Ready rule types to display on the rules page based on the selected camera.\n *\n * @type {Array>}\n */\n ovRuleTypes = OV_RULE_TYPES;\n\n /**\n * Resource path where GIFs live.\n *\n * @type {String}\n */\n gifResourcePath = GIF_RESOURCE_PATH;\n\n /**\n * Query parameter for pre-selecting camera.\n *\n * @type {String}\n */\n @tracked deviceId = '';\n\n /**\n * Query parameter for pre-selecting rule type.\n *\n * @type {String}\n */\n @tracked ruleType = '';\n\n /**\n * Query parameter for if the device is a new camera.\n *\n * @type {String}\n */\n @tracked newCamera = '';\n\n /**\n * List of OV cameras and third-party cameras to display\n *\n * @type {Array}\n */\n @computed('model.{ovCameras,thirdPartyAnalyticsCameras}', 'deviceId')\n get cameras() {\n const deviceId = this.deviceId;\n let ovCameras = this.model.ovCameras.toArray();\n let thirdPartyCameras = this.model.thirdPartyAnalyticsCameras.toArray();\n\n let combinedCameras = ovCameras.concat(thirdPartyCameras);\n\n // Sort cameras based on name\n combinedCameras.sort((a, b) => a.description.localeCompare(b.description));\n\n return deviceId ? combinedCameras.filterBy('id', deviceId) : combinedCameras;\n }\n\n /**\n * Indicates the \"Next\" step button should be enabled.\n *\n * @function\n * @returns {boolean}\n */\n @computed('model.rule.{camera.id,ruleType}')\n get enableNextButton() {\n // Button is enabled if the camera and type have been selected.\n const [id, type] = getObjProperties(get(this.model, 'rule'), 'camera.id', 'ruleType');\n return !isEmpty(id) && type > -1;\n }\n\n /**\n * Update deviceId, ruleType, and relay query parameters when the selection is changed.\n */\n @action\n async synchronizeQueryParameters() {\n const ruleType = await get(this.model, 'rule.ruleType'),\n relay = await get(this.model, 'relay'),\n props = {};\n\n if (relay) {\n props.relay = relay;\n }\n\n // Only synchronize rule type query parameter if it's a valid option.\n if (OV_RULE_TYPES.mapBy(1).includes(ruleType)) {\n props.ruleType = ruleType;\n }\n\n setProperties(this, props);\n }\n\n /**\n * Updates the rule's notification and light rule filters based on the selected camera and redirects to the correct page.\n */\n @action\n async configureCameraSettings() {\n const rule = await this.model.rule,\n camera = await rule.camera,\n { exceptions, lightRuleFilters, notificationFilters } = rule,\n { defaultLightRuleFilterTypes, defaultNotificationFilterTypes } = camera,\n isThirdPartyCamera = camera instanceof ThirdPartyAnalyticsCamera;\n\n // If this camera is a third party analytics camera, we need to create a different rule type.\n if (isThirdPartyCamera) {\n // Delete local ov-rule model.\n rule.destroyRecord();\n\n setProperties(this.model, {\n rule: this.store.createRecord('video/third-party-analytics-rule', {\n camera,\n ruleType: ThirdPartyAnalytics,\n exceptions\n })\n });\n }\n\n // Ensure the selected filter types are supported by the camera.\n setProperties(this.model.rule, {\n notificationFilters: notificationFilters.filter((type) => defaultNotificationFilterTypes?.includes(type)),\n lightRuleFilters: isThirdPartyCamera\n ? [ThirdPartyAnalyticsFilterOption]\n : lightRuleFilters.filter((type) => defaultLightRuleFilterTypes?.includes(type))\n });\n\n // If this camera has reached its max rules but has been selected with a workaround,\n // treat clicking the Next button as if the user is clicking the camera thumbnail.\n await selectCameraAtMaxRules.call(this, false, camera);\n\n this.navigation.transitionToRouteId(EmberOvReadyRuleSettings);\n }\n\n /**\n * Cancels rule setup and transitions back to the original route.\n */\n @action\n cancel() {\n // If we cancel the rule setup, we need to clear the visited routes stack.\n // This allows us to navigate back to the installation page for mobile instead of the calibration page again.\n if (this.newCamera) {\n this.contextManager.clearVisitedRoutesStack();\n }\n\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n}\n","import { getObjProperties } from '@adc/ember-utils/utils/ember-helpers';\nimport { action, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberOvReadyRuleSelect,\n EmberOvReadyRuleSettings,\n EmberVideoCameraCalibrate\n} from '../../../../enums/CustomerPageUrl';\nimport { GroundZone, Tripwire } from '../../../../enums/OvlRuleType';\nimport BaseAnalyticsRoute from '../base-analytics-route';\n\n/**\n * @classdesc\n * Route for selecting camera and type for an OV Ready rule.\n */\nexport default class AnalyticsSelectRoute extends BaseAnalyticsRoute {\n /** @override */\n routeId = EmberOvReadyRuleSelect;\n\n @service contextManager;\n\n /** @override */\n queryParams = {\n deviceId: { replace: true, refreshModel: false },\n ruleType: { replace: true, refreshModel: false },\n newCamera: { replace: true, refreshModel: false }\n };\n\n /** @override */\n async afterModel(model) {\n super.afterModel(model);\n\n // Is this not an existing rule?\n if (!model || !model.rule) {\n return;\n }\n\n // Get preselection query parameters.\n const { ruleType } = this.paramsFor(this.routeName) || {};\n\n // Pre-select rule type if possible.\n if (ruleType) {\n const ruleTypeInt = parseInt(ruleType, 10);\n\n // If this is a valid rule type, then pre-select it.\n if ([GroundZone, Tripwire].includes(ruleTypeInt)) {\n set(model.rule, 'ruleType', ruleTypeInt);\n }\n }\n }\n\n /** @override */\n async validateRouteRequirements(model) {\n const [id, ruleType, cameraId] = getObjProperties(model.rule, 'id', 'ruleType', 'camera.id');\n\n // Is this an existing rule?\n if (model && model.rule && id && Number.isInteger(ruleType) && cameraId) {\n // Then redirect to window settings sub-route because the camera is now locked to this rule.\n return { routeId: EmberOvReadyRuleSettings };\n }\n\n return {};\n }\n\n /**\n * When transitioning away from this route, we determine if we want to skip this route when transitioning back\n * depending on where we are going. For example:\n * - When leaving to calibrate a camera, we want to transition back to this route to create a rule.\n * - After saving a video analytics rule, we want to transition back to the previous rules page route, skipping this route.\n *\n * @param transition\n *\n * @override\n */\n @action\n willTransition(transition) {\n // The only time we want to stop on this route when transitioning back is when we leave analytics to calibrate a camera.\n // To check the next route, we need to get the route item from the targetName (like 'video.rules.analytics.settings'),\n // but we need to remove any trailing '.index' strings if they exist, otherwise it will not match the routeItem url.\n const nextRouteId = (this.contextManager.getRouteItemByUrl(transition.targetName.replace(/.index$/, '')) || {})\n .routeId;\n set(this, 'skipWhenTransitioningBack', nextRouteId !== EmberVideoCameraCalibrate);\n\n super.actions.willTransition.call(this, transition);\n }\n}\n","import EmberController from '@ember/controller';\nimport { action, computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { EmberOvReadyRuleDraw, EmberOvReadyRuleSelect } from '../../../../enums/CustomerPageUrl';\n\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type ContextManager from 'customer-site/services/context-manager';\n\n/**\n * @classdesc\n *\n * Controller for OV camera's settings during rule setup process.\n */\nexport default class AnalyticsSettingsController extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare modals: ModalService;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n /**\n * Should we disable the next button?\n */\n @computed('model.rule.camera.isIndoorScene')\n get disableNextButton(): boolean {\n return isEmpty(get(this.model.rule, 'camera.isIndoorScene'));\n }\n\n /**\n * Redirects to the OV Ready draw window route after saving the camera properties.\n */\n @action\n async drawWindow(): Promise {\n const { contextManager } = this,\n camera = await this.model.rule.camera;\n\n // If there are no changes, then just redirect.\n if (!camera.hasDirtyAttributes) {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberOvReadyRuleDraw);\n return;\n }\n\n // Else wise save the changes on the camera.\n const savingPromise = camera.save();\n\n // Then redirect if it's a successful save.\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n savingPromise.then(() => contextManager.transitionToRouteId(EmberOvReadyRuleDraw));\n\n if (contextManager.identityModel.isMobileApp) {\n this.modals.showLoadingModal(savingPromise);\n }\n\n return savingPromise;\n }\n\n /**\n * Cancels rule setup and transitions back to the original route.\n */\n @action\n cancel(): void {\n const { contextManager } = this;\n\n if (this.model.rule.id === null) {\n // We only want to transition back to the select page if we are creating a rule for the first time.\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberOvReadyRuleSelect);\n } else {\n // Otherwise, transition back to wherever we came from before the analytics routes.\n contextManager.transitionToPreviousRoute();\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/rules/analytics/settings': AnalyticsSettingsController;\n }\n}\n","import { get } from '@ember/object';\nimport {\n EmberOvReadyRuleSettings,\n EmberOvReadyRuleDraw,\n EmberOvReadyRuleSelect,\n EmberOvReadyRuleDrawV2,\n EmberVideoRules\n} from '../../../../enums/CustomerPageUrl';\nimport BaseEditableAnalyticsRoute from '../base-editable-analytics-route';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { RouteRequirementsValidationResult } from 'customer-site/video/base-video-automation-route';\n\n/**\n * @classdesc\n *\n * Route for updating OV ready camera settings prior to updating the rule itself.\n */\nexport default class Route extends BaseEditableAnalyticsRoute {\n /** @override */\n routeId = EmberOvReadyRuleSettings;\n\n /** @override */\n async validateRouteRequirements(model: ModelFrom): Promise {\n const camera = await get(model, 'rule.camera');\n\n // If the page was refreshed the selected camera will be missing, send them back to the camera select.\n if (!camera) {\n return { routeId: EmberOvReadyRuleSelect, reason: this.intl.t('video.rules.analytics.selectCameraType') };\n }\n\n // If the user doesnt have changeable settings on this page, just direct them to the next page (draw page).\n if (!camera.canChangeOvCameraSettings) {\n const lastRouteIndex = this.contextManager.getVisitedRoutesStackLength() - 2,\n previousRouteId = this.contextManager.visitedRoutesStack.objectAt(lastRouteIndex)?.route?.routeId;\n\n // If the last route is the draw page, redirect back to the rule index page.\n if (previousRouteId === EmberOvReadyRuleDrawV2 || previousRouteId === EmberOvReadyRuleDraw) {\n return { routeId: EmberVideoRules, reason: undefined };\n }\n\n return { routeId: EmberOvReadyRuleDraw, reason: this.intl.t('video.rules.analytics.selectCameraType') };\n }\n\n return {};\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n\\n {{#if this.showFilterOption}}\\n
\\n {{#each this.filterTags as |tag|}}\\n \\n {{/each}}\\n
\\n {{/if}}\\n\\n {{yield}}\\n
\",{ moduleName: \"customer-site/components/automation/filter-bar-radio/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { set, action } from '@ember/object';\nimport { BaseFilterBar } from '../base-filter-bar/index';\n\nimport type { BaseFilterBarSignature } from '../base-filter-bar/index';\n\nexport interface FilterBarRadioSignature extends BaseFilterBarSignature {\n Blocks: {\n default: [];\n };\n}\n\n/**\n * Search and a radio button group style filter.\n */\n\nexport default class FilterBarRadio extends BaseFilterBar {\n @action\n selectFilterTag(buttonId: number): void {\n this.filterTags.forEach((filterTag) => {\n const isSelected = buttonId === filterTag.value;\n set(filterTag, 'selected', isSelected);\n });\n\n this.doSearch();\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, setProperties, getProperties, computed, set, get } from '@ember/object';\nimport { reads, union, equal } from '@ember/object/computed';\nimport { once } from '@ember/runloop';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty, isPresent } from '@ember/utils';\nimport { task } from 'ember-concurrency';\nimport FilterBarRadio from 'customer-site/components/automation/filter-bar-radio/index';\nimport NewVideoRuleModal from 'customer-site/components/modals/automation/rules/new-video-rule/index';\nimport NewVideoScheduleModal from 'customer-site/components/modals/automation/rules/new-video-schedule/index';\nimport { VideoRulesPageTour } from 'customer-site/enums/HelpTourType';\nimport { NotProjected } from 'customer-site/enums/ProjectedVideoQuotaStatus';\nimport {\n VideoRule,\n VideoSchedule,\n VideoLocalSchedule as VideoLocalScheduleDisplayType\n} from 'customer-site/enums/RuleDisplayType';\nimport { VideoLocalSchedule as VideoLocalScheduleFilter, VideoCameras } from 'customer-site/enums/RuleFilter';\nimport { LocalSchedulesTab } from 'customer-site/enums/TrackedEvent';\nimport { COOKIE_PREFER_LOCAL_RULES, CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED } from 'customer-site/utils/video/cookies';\nimport DropdownActionItem from '@adc/ui-components/utils/dropdown-action-item';\nimport { endOfMonth } from 'date-fns';\nimport BaseController from '../../../automation/base-automation-controller';\nimport { VideoAddSvrRecordingSchedule, EmberVideoSdCardSchedule } from '../../../enums/CustomerPageUrl';\nimport { Video } from '../../../enums/WebDeviceType';\nimport { videoScheduleTransitionFunction } from '../../../utils/video/general';\nimport { startVideoRulesPageTour } from '../help-tour/tour';\n\nconst PAGE_WIDTH_SMALL = 0,\n PAGE_WIDTH_MEDIUM = 1,\n PAGE_WIDTH_LARGE = 2,\n PAGE_WIDTH_XL = 3;\n\n/**\n * Start a page tour on initial render if this is the first time the user sees this page.\n *\n * @private\n * @instance\n * @memberof VideoRulesIndexController\n */\nasync function startPageTourIfNeeded() {\n await get(this.model, 'svrs');\n\n const { identityModel } = this.contextManager;\n\n // The mobile view is missing some of the buttons and containers that the tour refers to.\n // We will disable the help tour on mobile for now because of that.\n if (!identityModel.isMobileApp && identityModel.helpTours.includes(VideoRulesPageTour)) {\n startVideoRulesPageTour.call(this);\n }\n}\n\n/**\n * Updates the search text.\n *\n * @param {string} newText\n *\n * @private\n * @instance\n * @memberof VideoRulesIndexController\n */\nfunction propagateSearchChange(newText) {\n set(this, 'search', newText);\n}\n\n/**\n * @classdesc\n * Video schedules controller.\n */\nexport default class VideoRulesIndexController extends BaseController {\n @service cookieManager;\n @service contextManager;\n @service modals;\n @service intl;\n @service stats;\n @service identityManager;\n\n routeToolbar = FilterBarRadio;\n\n /** @override */\n deviceType = Video;\n\n /** @override */\n filterTags = [VideoCameras];\n\n /**\n * The computed page size.\n *\n * @type {number}\n */\n @tracked pageSize = PAGE_WIDTH_SMALL;\n\n /**\n * Whether the user has permission to view the clip usage reports.\n *\n * @type {boolean}\n */\n @reads('contextManager.identityModel.canViewClipUsageReports')\n canViewClipUsageReports;\n\n /**\n * Whether the user has permission to view the clip suggestions card.\n *\n * @type {boolean}\n */\n @reads('contextManager.identityModel.canViewUpdatedClipLimitsUXRefresh')\n canViewUpdatedClipLimitsUXRefresh;\n\n /**\n * Alias to validate if the page is being displayed in a mobile app.\n *\n * @type {boolean}\n */\n @reads('contextManager.identityModel.isMobileApp')\n isMobileApp;\n\n /**\n * Alias to check if the customer has the AI Deterrence Service Package\n *\n * @type {boolean}\n */\n @reads('identityManager.identityModel.canUseAIDeterrence')\n canUseAIDeterrence;\n\n /**\n * If the user has camera arming access\n */\n @reads('model.permissions.hasCameraArmingAccess')\n hasCameraArmingAccess;\n\n /**\n * Resolves the individual properties of the route model.\n *\n * @function\n */\n @task *resolveRouteModel() {\n const { filterTagsOverride } = this.model;\n if (filterTagsOverride) {\n // Refresh model with the new filter tags applied. No need to continue resolving here - leave resolvedModel as undefined\n set(this, 'filterTags', filterTagsOverride);\n return;\n }\n\n const fnGetProperties = async () => {\n const props = [\n 'videoUsage',\n 'aiDeterrenceUsage',\n 'ruleSuggestions',\n 'svrs',\n 'sdCardCameras',\n 'permissions'\n ],\n [videoUsage, aiDeterrenceUsage, ruleSuggestions, svrs, sdCardCameras, permissions] = await Promise.all(\n Object.values(getProperties(this.model, ...props))\n );\n return { videoUsage, aiDeterrenceUsage, ruleSuggestions, svrs, sdCardCameras, permissions };\n };\n\n let properties = yield fnGetProperties();\n\n const { contextManager } = this,\n isAllowedToCreateVideoSchedules = properties.permissions?.allowedRuleDisplays?.includes(VideoSchedule),\n hasSvrsButNoAccessToSvrSchedulePage =\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n !isEmpty(properties.svrs) && !contextManager.getRouteItem(VideoAddSvrRecordingSchedule),\n hasSdCardCamerasButNoAccessToSdSchedulePage =\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n !isEmpty(properties.sdCardCameras) && !contextManager.getRouteItem(EmberVideoSdCardSchedule);\n if (\n isAllowedToCreateVideoSchedules &&\n (hasSvrsButNoAccessToSvrSchedulePage || hasSdCardCamerasButNoAccessToSdSchedulePage)\n ) {\n yield contextManager.identityModel.reloadContextAndModel();\n properties = yield fnGetProperties();\n }\n\n return properties;\n }\n\n /**\n * The resolved route model.\n *\n * @type {Object}\n */\n @reads('resolveRouteModel.last.value')\n resolvedModel;\n\n /**\n * If the cloud recordings tab is currently the one selected.\n *\n * @type {boolean}\n */\n @equal('filterTags.0', VideoCameras)\n isCloudRecordingsFilterSelected;\n\n /**\n * Indicates the local storage filter is currently selected.\n *\n * @type {boolean}\n */\n @equal('filterTags.0', VideoLocalScheduleFilter)\n isLocalStorageFilterSelected;\n\n /**\n * Whether or not we should show the cloud storage information component on the page.\n * We currently keep this hidden when viewed from inside the mobile app. We may undo this later.\n *\n * @type {boolean}\n */\n @computed(\n 'canViewClipUsageReports',\n 'isCloudRecordingsFilterSelected',\n 'isMobileApp',\n 'model.videoUsage.isFulfilled'\n )\n get showCloudStorageInfo() {\n return (\n (!this.isMobileApp || this.canViewClipUsageReports) &&\n this.isCloudRecordingsFilterSelected &&\n get(this.model, 'videoUsage.isFulfilled')\n );\n }\n\n /**\n * Whether or not we should show the AI Deterrence info card.\n *\n * @type {boolean}\n */\n @computed('canUseAIDeterrence', 'resolvedModel.aiDeterrenceUsage.maxEventQuota')\n get shouldShowAiDeterrenceInfoCard() {\n const { aiDeterrenceUsage } = this.resolvedModel;\n return this.canUseAIDeterrence && aiDeterrenceUsage.maxEventQuota > 0;\n }\n\n /**\n * Whether or not we should show the local storage information component on the page.\n * We should hide this section if there are no SVRs on the account.\n *\n * @type {boolean}\n */\n @computed('isLocalStorageFilterSelected', 'model.svrs.length')\n get showLocalStorageInfo() {\n return get(this.model, 'svrs.length') && this.isLocalStorageFilterSelected;\n }\n\n /**\n * Should we check the status per schedule?\n * This is needed for SVR and SD card schedules.\n *\n * @type {boolean}\n */\n @computed('model.{svrs.length,sdCardCameras.length}', 'isLocalStorageFilterSelected')\n get checkRecordingStatus() {\n return (\n (get(this.model, 'svrs.length') || get(this.model, 'sdCardCameras.length')) &&\n this.isLocalStorageFilterSelected\n );\n }\n\n /**\n * The collection of {@link components.automation.FilterTagType} to show as filter buttons.\n *\n * @type {Array<{name: String, icon: String, value: number, selected: boolean}>}\n */\n @computed('filterTags', 'model.permissions.allowedRuleDisplays', 'pageSize')\n get availableFilterTags() {\n const availableRuleDisplays = this.model.permissions.allowedRuleDisplays;\n\n if (isEmpty(availableRuleDisplays)) {\n return [];\n }\n\n const [selectedFilter] = this.filterTags,\n useShortenedText = this.pageSize !== PAGE_WIDTH_XL;\n\n return [\n [VideoCameras, VideoRule, useShortenedText ? 'cloud' : 'cloudRecordings'],\n [VideoLocalScheduleFilter, VideoLocalScheduleDisplayType, useShortenedText ? 'local' : 'localRecordings']\n ]\n .map(([value, p, key]) =>\n !availableRuleDisplays.includes(p)\n ? undefined\n : {\n name: this.intl.t(`generic.video.${key}`),\n value,\n selected: value === selectedFilter,\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line ember/no-side-effects\n clickEvent: () => set(this, 'filterTags', [value])\n }\n )\n .compact();\n }\n\n /**\n * What the add new rule/schedule button text is.\n *\n * @type {string}\n */\n @computed('isCloudRecordingsFilterSelected', 'pageSize')\n get addText() {\n if ([PAGE_WIDTH_SMALL, PAGE_WIDTH_MEDIUM].includes(this.pageSize)) {\n return this.intl.t('generic.add');\n }\n\n return this.intl.tc(this, this.isCloudRecordingsFilterSelected ? 'addNewRule' : 'addNewSchedule');\n }\n\n /**\n * The text to send to the rule list component representing the type of rule. In this case rule/s or schedule/s.\n *\n * @type {String}\n */\n @computed('isCloudRecordingsFilterSelected')\n get ruleTypeText() {\n return this.intl.t(`automation.${this.isCloudRecordingsFilterSelected ? 'rules' : 'schedules'}.index.type`, {\n count: 1\n });\n }\n\n /**\n * The header text to show above the rule/schedule list. Either Rules/Schedules.\n *\n * @type {String}\n */\n @computed('isCloudRecordingsFilterSelected')\n get ruleTypeTextHeader() {\n return this.intl.t(this.isCloudRecordingsFilterSelected ? 'generic.rules.rules' : 'generic.schedules');\n }\n\n /**\n * The types of new video rules to show.\n *\n * @type {DropdownActionItem[]}\n */\n @computed(\n 'isMobileApp',\n 'filterTags',\n 'modals.modalsToRender.[]',\n 'resolvedModel.{permissions,ruleSuggestions,sdCardCameras,svrs}'\n )\n get newAutomationItems() {\n const [selectedFilter] = this.filterTags,\n { resolvedModel, isMobileApp } = this;\n let shouldHideAddButton = false;\n\n /**\n * On Mobile, we should hide the \"Add\" button on the native toolbar when the new rule / new schedule\n * modal is open as the \"Add\" button won't actually do anything in this context, so it's a bit confusing\n * from a UX perspective.\n */\n if (isMobileApp) {\n shouldHideAddButton =\n this.modals.modalIsOpen(NewVideoRuleModal) || this.modals.modalIsOpen(NewVideoScheduleModal);\n }\n\n if (!resolvedModel || shouldHideAddButton) {\n return [];\n }\n\n const { ruleSuggestions } = resolvedModel,\n fnGetDropDownItem = (name, action) => [DropdownActionItem.create({ name, disabled: !action, action })];\n\n if (selectedFilter === VideoCameras) {\n return fnGetDropDownItem(this.intl.t('automation.rules.index.new.video'), () => {\n this.modals.showModal(NewVideoRuleModal, { videoRules: ruleSuggestions });\n });\n }\n\n const routeIds = [VideoAddSvrRecordingSchedule, EmberVideoSdCardSchedule],\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n availableRoutesIds = routeIds.filter((id) => this.contextManager.getRouteItem(id));\n\n let itemFn;\n\n // Does the user have access to at least one of the new schedule routes?\n if (isPresent(availableRoutesIds) && resolvedModel.permissions?.allowedRuleDisplays?.includes(VideoSchedule)) {\n const { svrs, sdCardCameras } = resolvedModel;\n\n // You are allowed to created the schedule, but if there's no transition route, we have to disable it.\n itemFn = videoScheduleTransitionFunction.call(\n this,\n availableRoutesIds,\n this.contextManager,\n this.modals,\n svrs,\n sdCardCameras,\n ruleSuggestions\n );\n }\n\n return fnGetDropDownItem(this.intl.t('automation.schedules.index.new.video'), itemFn);\n }\n\n /**\n * Is every rule suggestion disabled for mobile\n * and can only be created on the customer website?\n * Note: VMD is currently the only rule that should be disabled for mobile.\n *\n * @type {boolean}\n */\n @computed('resolvedModel.ruleSuggestions')\n get noAutomationItemsCanBeCreatedOnMobile() {\n return (\n this.resolvedModel?.ruleSuggestions?.every((ruleSuggestion) => ruleSuggestion.disabledForMobile) ?? false\n );\n }\n\n /**\n * The collection of email and mobile contact addresses.\n *\n * @type {Promise}\n */\n @union('model.email', 'model.mobile')\n contacts;\n\n /**\n * The list of editable video formats.\n *\n * @type {Promise<{id: String, name: String, addresses: {icon: String, address: String, description: String}[]}[]>}\n */\n @computed('contacts.@each.videoFormat', 'model.formats')\n get videoFormats() {\n // Are there no contacts?\n const { contacts } = this;\n if (isEmpty(contacts)) {\n // Done.\n return false;\n }\n\n return (async () => {\n const resolvedValues = await Promise.all(\n (\n await contacts\n ).map(async (contact) => {\n const user = (await contact.user) || {};\n return [\n ...Object.values(getProperties(user, 'id', 'displayName')),\n ...Object.values(getProperties(contact, 'icon', 'address')),\n this.model.formats.findBy('id', contact.belongsTo('videoFormat').id())\n ];\n })\n ),\n results = resolvedValues.reduce((results, [id, name, icon, address, vf]) => {\n const { addresses } = (results[id] = results[id] ?? { id, name, addresses: [] });\n\n addresses.push({\n icon,\n address,\n description: vf?.description ?? ''\n });\n\n return results;\n }, {});\n\n // Convert to sorted array.\n return Object.values(results).sortBy('name');\n })();\n }\n\n /**\n * The top rule usages property with resolved rules.\n *\n * @type {RuleUsage[]}\n */\n @computed('resolvedModel.videoUsage.topRuleUsages')\n get topRuleUsages() {\n const { resolvedModel } = this;\n\n return (async () => {\n const videoUsage = await resolvedModel.videoUsage,\n topRuleUsages = videoUsage.topRuleUsages;\n await Promise.all(\n topRuleUsages.map(async (ruleUsage) => {\n await ruleUsage.rule;\n return;\n })\n );\n return topRuleUsages;\n })();\n }\n\n /**\n * A boolean to decide whether or not to show the clip limits suggestion card.\n *\n * @type {boolean}\n */\n @computed('canViewUpdatedClipLimitsUXRefresh', 'resolvedModel.videoUsage.projectedVideoQuotaStatus')\n get showClipLimitCard() {\n if (!this.canViewUpdatedClipLimitsUXRefresh) {\n return false;\n }\n\n const { videoUsage } = this.resolvedModel;\n\n if (videoUsage?.projectedVideoQuotaStatus == null) {\n return false;\n }\n\n return videoUsage.projectedVideoQuotaStatus !== NotProjected;\n }\n\n /**\n * A boolean to decide whether or not to collapse the clip limits suggestion card.\n *\n * @type {boolean}\n */\n @computed('resolvedModel.videoUsage.projectedVideoQuotaStatus')\n get isClipLimitSuggestionCollapsed() {\n const { cookieManager } = this,\n projectedVideoQuotaStatusCookie = cookieManager.getEssentialCookie(CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED);\n\n // If the cookie isn't found, the card is not collapsed.\n if (!projectedVideoQuotaStatusCookie) {\n return false;\n }\n\n const { videoUsage } = this.resolvedModel;\n let isExpired = false;\n\n if (Number(projectedVideoQuotaStatusCookie) !== videoUsage.projectedVideoQuotaStatus) {\n isExpired = true;\n }\n\n if (isExpired) {\n this.cookieManager.deleteEssentialCookie(CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED);\n }\n\n return !isExpired;\n }\n\n /**\n * An action to toggle the clip limits suggestion card and store the cookie.\n *\n * @param {boolean} collapsed\n */\n @action setClipLimitSuggestionCollapsed(collapsed) {\n const { cookieManager } = this,\n { videoUsage } = this.resolvedModel;\n\n if (collapsed) {\n const cookieValue = videoUsage.projectedVideoQuotaStatus;\n cookieManager.setEssentialCookie(CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED, cookieValue, endOfMonth(new Date()));\n } else {\n cookieManager.deleteEssentialCookie(CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED);\n }\n }\n\n /**\n * Computes the pageSize value when the root element is resized.\n *\n * @param {HTMLDivElement} el The resized element.\n */\n @action updatePageSize(el) {\n const { clientWidth } = el;\n this.pageSize = (() => {\n if (clientWidth >= 1080) {\n return PAGE_WIDTH_XL;\n }\n\n if (clientWidth >= 768) {\n return PAGE_WIDTH_LARGE;\n }\n\n if (clientWidth >= 400) {\n return PAGE_WIDTH_MEDIUM;\n }\n\n return PAGE_WIDTH_SMALL;\n })();\n }\n\n @tracked contactsToEdit;\n\n /**\n * Is the editing contact format action sheet currently open?\n *\n * @type {boolean}\n */\n @tracked isEditingContacts = false;\n\n /**\n * Shows the action sheet for editing the video alert format.\n *\n * @param {string} userId\n */\n @action editContact(userId) {\n this.contactsToEdit = this.contacts.filterBy('user.id', userId);\n this.isEditingContacts = true;\n }\n\n /**\n * Starts the rules page tour for a new user if needed.\n */\n @action startVideoRulesPageTour() {\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n scheduleOnce('afterRender', this, startPageTourIfNeeded);\n }\n\n /**\n * Schedule a change of the search text.\n *\n * @param {string} newText\n */\n @action updateSearchText(newText) {\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n once(this, propagateSearchChange, newText);\n }\n\n /**\n * Re-runs all route hooks.\n */\n @action onRefreshModel() {\n this.send('refreshModel');\n }\n\n @action updateFilterTags(newTags) {\n if (newTags.includes(VideoLocalScheduleFilter) && this.isMobileApp) {\n this.stats.postEvent(LocalSchedulesTab);\n }\n\n this.cookieManager.setEssentialCookie(\n COOKIE_PREFER_LOCAL_RULES,\n newTags?.firstObject === VideoLocalScheduleFilter\n );\n set(this, 'filterTags', newTags);\n }\n\n /** @override */\n resetQueryParams() {\n setProperties(this, {\n deviceType: Video,\n search: '',\n filterTags: [VideoCameras],\n globalDeviceId: null\n });\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isFullTransition } from '../../../utils/ember';\nimport {\n VideoCameras as VideoCamerasFilter,\n VideoLocalSchedule as VideoLocalScheduleFilter\n} from 'customer-site/enums/RuleFilter';\nimport { COOKIE_PREFER_LOCAL_RULES } from 'customer-site/utils/video/cookies';\nimport BaseAutomationRoute from '../../../automation/base-automation-route';\nimport { EmberVideoRules } from '../../../enums/CustomerPageUrl';\nimport { VideoRule, VideoLocalSchedule as VideoLocalScheduleDisplayType } from '../../../enums/RuleDisplayType';\n\n/**\n * @classdesc\n * Video rules index route.\n */\nexport default class VideoRulesIndexRoute extends BaseAutomationRoute {\n @service cookieManager;\n\n /** @override */\n routeId = EmberVideoRules;\n\n /** @override */\n get itemModelPath() {\n const params = this.paramsFor(this.routeName);\n return params.filterTags.includes(VideoCamerasFilter)\n ? 'automation/rules/rule'\n : 'automation/schedules/schedule';\n }\n\n @action\n refreshModel() {\n this.refresh();\n }\n\n /** @override */\n async beforeModel(transition) {\n await super.beforeModel(...arguments); /* Obtain permissions */\n\n const { cookieManager } = this,\n preferLocalRules = cookieManager.getEssentialCookie(COOKIE_PREFER_LOCAL_RULES) === 'true',\n { from, to } = transition,\n isLocalRecordingAllowed = this.permissions.allowedRuleDisplays.includes(VideoLocalScheduleDisplayType),\n { queryParams } = to;\n\n // User didn't pre-select a filter tag. Lets load the page with the last filter tag used (from their cookie) if exists\n // We check if transition.from exists because there's an edge case bug where the transition can trigger an app-error if there's no previous route (VID-47647)\n if (from && !queryParams.filterTags) {\n this.transitionTo({\n queryParams: {\n ...queryParams,\n filterTags:\n preferLocalRules && isLocalRecordingAllowed ? [VideoLocalScheduleFilter] : [VideoCamerasFilter]\n }\n });\n\n return;\n }\n }\n\n /** @override */\n async model(params, transition) {\n const isLocalRecordingAllowed = this.permissions.allowedRuleDisplays.includes(VideoLocalScheduleDisplayType);\n\n let filterTagsOverride;\n\n // Is cloud recording NOT allowed AND is it currently selected?\n if (!this.isCloudRecordingAllowed && params.filterTags[0] === VideoCamerasFilter && isLocalRecordingAllowed) {\n // Show local schedule.\n //\n // Using transitionTo here ends up throwing a TransitionAborted error. Work around by having the controller\n // set the filterTags, which is a query param that refreshes the model\n filterTagsOverride = [VideoLocalScheduleFilter];\n }\n\n const { contextManager, identityManager, store } = this,\n currentModel = !isFullTransition(transition) ? this.currentModel ?? {} : {},\n reload = { reload: true };\n\n return {\n ...super.model(params, transition),\n filterTagsOverride,\n ruleSuggestions: store.query('automation/rules/ruleSuggestion', {\n type: {\n [VideoCamerasFilter]: VideoRule,\n [VideoLocalScheduleFilter]: VideoLocalScheduleDisplayType\n }[params.filterTags[0]]\n }),\n email: this.permissions.emailContactPermissions\n ? currentModel.email ?? (await store.query('users/email-address', { forRecordingRules: true }))\n : [],\n mobile: this.permissions.mobileContactPermissions\n ? currentModel.mobile ?? (await store.query('users/mobile-address', { onlyTwoFactorAddresses: true }))\n : [],\n formats: currentModel.formats ?? store.findAll('video/alert-format'),\n svrs: currentModel.svrs ?? store.findAll('video/devices/svr', reload),\n sdCardCameras: currentModel.sdCardCameras ?? store.findAll('video/devices/sd-card-camera', reload),\n videoUsage: this.isCloudRecordingAllowed\n ? currentModel.videoUsage ??\n store.findRecord('video/video-usage', contextManager.getSelectedSystemId(), reload)\n : {},\n aiDeterrenceUsage: identityManager.identityModel.canUseAIDeterrence\n ? currentModel.aiDeterrenceUsage ??\n store.findRecord('video/ai-deterrence-usage', contextManager.getSelectedSystemId(), reload)\n : {}\n };\n }\n}\n","import { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport DropdownActionItem from '@adc/ui-components/utils/dropdown-action-item';\nimport BaseController from '../../../automation/base-automation-controller';\nimport { VideoAddSvrRecordingSchedule, EmberVideoSdCardSchedule } from '../../../enums/CustomerPageUrl';\nimport { VideoSchedule } from '../../../enums/RuleDisplayType';\nimport { Video } from '../../../enums/WebDeviceType';\nimport { videoScheduleTransitionFunction } from '../../../utils/video/general';\n\n/**\n * @classdesc\n * Video schedules controller.\n */\nexport default class VideoSchedulesIndexController extends BaseController {\n @service contextManager;\n @service modals;\n @service intl;\n\n /** @override */\n deviceType = Video;\n\n /**\n * If the customer has camera arming access.\n */\n @alias('model.permissions.hasCameraArmingAccess')\n hasCameraArmingAccess;\n\n /** @override */\n @computed('model.{permissions.allowedRuleDisplays,svrs.isFulfilled}')\n get newAutomationItems() {\n const { contextManager, modals, model } = this;\n\n // Can the user create a video rule?\n if (model.permissions.allowedRuleDisplays.includes(VideoSchedule)) {\n const availableRoutesIds = [VideoAddSvrRecordingSchedule, EmberVideoSdCardSchedule].filter((id) =>\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n contextManager.getRouteItem(id)\n );\n\n // Does the user have access to at least one of the new schedule routes?\n if (isPresent(availableRoutesIds)) {\n // You are allowed to created the schedule, but if there's no transition route, we have to disable it.\n const itemFn = videoScheduleTransitionFunction(availableRoutesIds, contextManager, modals, model.svrs);\n return [\n DropdownActionItem.create({\n name: this.intl.t('automation.schedules.index.new.video'),\n disabled: !itemFn,\n action: itemFn\n })\n ];\n }\n }\n\n return [];\n }\n}\n","import { isFullTransition } from '../../../utils/ember';\nimport BaseAutomationRoute from '../../../automation/base-automation-route';\nimport { EmberVideoSchedules } from '../../../enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * Video schedules index route.\n */\nexport default class VideoSchedulesIndexRoute extends BaseAutomationRoute {\n /** @override */\n routeId = EmberVideoSchedules;\n\n /** @override */\n get itemModelPath() {\n return 'automation/schedules/schedule';\n }\n\n /** @override */\n model(params, transition) {\n const { store } = this,\n currentModel = !isFullTransition(transition) ? this.currentModel ?? {} : {};\n\n return {\n ...super.model(params, transition),\n svrs: currentModel.svrs ?? store.findAll('video/devices/svr'),\n sdCardCameras: currentModel.sdCardCameras ?? store.findAll('video/devices/sd-card-camera')\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, setProperties, set } from '@ember/object';\nimport { alias, reads, gte } from '@ember/object/computed';\nimport { next } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { task } from 'ember-concurrency';\nimport {\n Unknown,\n UnexpectedException,\n DeviceCommandFailed,\n NoSdCard,\n SdCardNotCompatible\n} from 'customer-site/enums/AccessCheckResult';\nimport BuildVersionInfoEnum from 'customer-site/enums/BuildVersionInfo';\nimport { VideoMainSettings, EmberVideoSettingsAudio } from 'customer-site/enums/CustomerPageUrl';\nimport { FourMPHigherFrameRate, Low } from 'customer-site/enums/SdRecordingQuality';\nimport { FourMP } from 'customer-site/enums/SdRecordingQuality';\nimport { AddNewSchedule, UpdateExistingSchedule } from 'customer-site/enums/TrackedEvent';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport DropdownSelectItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\nimport { reject } from 'rsvp';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { SvgSymbolSignature } from '@adc/svg-system/components/svg-symbol';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type CheckboxTreeItem from '@adc/ui-components/utils/dropdown-select-item';\nimport type Store from '@ember-data/store';\nimport type { StreamInfo } from 'customer-site/components/video/settings/playback-features/recording-quality-input/index';\nimport type SdCardCamera from 'customer-site/models/video/devices/sd-card-camera';\nimport type OnboardPermission from 'customer-site/models/video/permissions/onboard-permission';\nimport type SdCardRecordingSchedule from 'customer-site/models/video/schedules/sd-card-recording-schedule';\nimport type SdCard from 'customer-site/models/video/sd-card';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type Stats from 'customer-site/services/stats';\nimport type TroubleConditionsService from 'customer-site/services/trouble-conditions';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from 'customer-site/video/schedules/onboard/edit/route';\n\nexport const UnlimitedRetentionDropdownValue = 0;\n\nconst DEFAULT_BITRATE = 'DefaultBitrate',\n BITRATE_OPTIONS = 'BitrateOptions',\n BITRATE_OPTIONS_PROPERTIES = 'BitrateOptionsProperties',\n CONFIRM_DELETE_FOOTAGE = 'confirmDeleteFootage',\n CONFIRM_REFORMAT = 'confirmReformat',\n CONFIRM_UPGRADE_FIRMWARE = 'confirmUpgradeFirmware';\n\n/**\n * IDs for SD Card audio recording options list.\n */\nconst RECORD_AUDIO_ID = 0,\n DONT_RECORD_AUDIO_ID = 1;\n\ninterface SdCardStatusInfo {\n icon: string;\n text: string;\n color: SvgSymbolSignature['Args']['fillColor'];\n sdCard?: SdCard;\n}\n\n/**\n * Checks if a camera is selected.\n */\nfunction isCameraSelected(cameraId: string, scheduleCameraId: string, isNew: boolean): number {\n // If this is in edit mode (AKA not a new schedule) and the schedule ID matches the current camera ID,\n // Then preselect this drop down item.\n return !isNew && scheduleCameraId && scheduleCameraId === cameraId ? SELECTED : UNSELECTED;\n}\n\n/**\n * Attempts to save the schedule.\n *\n * @param successResource The success message to display\n * for prerequisites to saving the schedule\n * (e.g. confirmUpgradeFirmware, confirmReformat, or confirmDeleteFootage).\n */\nfunction saveScheduleAction(this: SdCardController, successResource: string | null = null): Promise {\n const { schedule, notificationManager, intl } = this;\n\n return schedule\n .save()\n .then((response) => {\n // The successResource will not be empty or null on retry attempts.\n if (successResource) {\n notificationManager.addSuccess(intl.tc(this, successResource));\n }\n\n handleSaveResponse.call(this, response);\n })\n .catch((error: { errors?: { source?: { pointer?: string }; detail?: string }[] }) => {\n const reason = error?.errors?.firstObject?.source?.pointer;\n // Close the modal currently displaying on the page because more than one modal cannot display at the same time.\n this.modals.closeModal();\n\n if (!reason) {\n return reject();\n }\n\n if (reason.includes(CONFIRM_DELETE_FOOTAGE)) {\n handleSaveResponse.call(this, {\n confirmUpgradeFirmware: false,\n confirmReformat: false,\n confirmDeleteFootage: true,\n confirmDeleteFootageWarningMessage: error?.errors?.firstObject?.detail\n });\n return;\n }\n\n if (reason.includes(CONFIRM_REFORMAT)) {\n handleSaveResponse.call(this, {\n confirmUpgradeFirmware: false,\n confirmReformat: true,\n confirmDeleteFootage: false\n });\n return;\n }\n\n if (reason.includes(CONFIRM_UPGRADE_FIRMWARE)) {\n handleSaveResponse.call(this, {\n confirmUpgradeFirmware: true,\n confirmReformat: false,\n confirmDeleteFootage: false\n });\n return;\n }\n\n return reject(reason);\n });\n}\n\n/**\n * Handles the behavior when we get a response from the backend after attempting to save the schedule.\n *\n * @param confirmUpgradeFirmware Should the Upgrade Firmware modal be shown?\n * @param confirmReformat Should the Format modal be shown?\n * @param confirmDeleteFootage Should the Delete Footage modal be shown?\n * @param confirmDeleteFootageWarningMessage The localized confirmation warning message body.\n */\nfunction handleSaveResponse(\n this: SdCardController,\n {\n confirmUpgradeFirmware,\n confirmReformat,\n confirmDeleteFootage,\n confirmDeleteFootageWarningMessage\n }: {\n confirmUpgradeFirmware?: boolean;\n confirmReformat?: boolean;\n confirmDeleteFootage?: boolean;\n confirmDeleteFootageWarningMessage?: string;\n }\n): void {\n const {\n schedule,\n modals,\n notificationManager,\n contextManager,\n intl,\n stats,\n troubleConditions,\n store,\n scheduleCamera\n } = this;\n\n // If the camera needs to be upgraded, show the confirmation modal for upgrading to a newer firmware.\n if (confirmUpgradeFirmware) {\n modals.showConfirmationDialog(\n intl.tc(this, 'upgradeCameraFirmware'),\n intl.tc(this, 'upgradeFirmwareModalDescription'),\n {\n text: intl.tc(this, 'upgrade'),\n action: async () => {\n // If the user clicked the Upgrade Firmware button, save the new confirmation status to the model.\n set(schedule, CONFIRM_UPGRADE_FIRMWARE, true);\n notificationManager.addSuccess(intl.tc(this, 'upgradeFirmwareInProgress'));\n\n // Attempt to save the schedule again.\n return saveScheduleAction.call(this, 'upgradeFirmwareSuccess');\n }\n },\n {\n action: () => {\n // If the user clicked the Cancel button, reset the confirmation status to false.\n set(schedule, CONFIRM_UPGRADE_FIRMWARE, false);\n }\n }\n );\n return;\n }\n\n // If the SD card needs to be formatted, show the confirmation modal for formatting.\n if (confirmReformat) {\n modals.showConfirmationDialog(\n intl.tc(this, 'formatSdCard'),\n intl.tc(this, 'reformatWarning'),\n {\n text: intl.tc(this, 'format'),\n action: async () => {\n // If the user clicked the Format button, save the new confirmation status to the model.\n set(schedule, CONFIRM_REFORMAT, true);\n\n // Attempt to save the schedule again.\n return saveScheduleAction.call(this, 'formatSuccess');\n }\n },\n {\n action: () => {\n // If the user clicked the Cancel button, reset the confirmation status to false.\n set(schedule, CONFIRM_REFORMAT, false);\n }\n }\n );\n return;\n }\n\n if (confirmDeleteFootage) {\n modals.showConfirmationDialog(\n intl.tc(this, 'deleteSdCardFootage'),\n confirmDeleteFootageWarningMessage ?? '',\n {\n text: intl.t('generic.enable'),\n action: async () => {\n // If the user clicked the Delete button, save the new confirmation status to the model.\n set(schedule, CONFIRM_DELETE_FOOTAGE, true);\n\n // Attempt to save the schedule again.\n return saveScheduleAction.call(this, 'deleteFootageSuccess');\n }\n },\n {\n action: () => {\n // If the user clicked the Cancel button, reset the confirmation status to false.\n set(schedule, CONFIRM_DELETE_FOOTAGE, false);\n }\n }\n );\n return;\n }\n\n // If the schedule saved successfully, reset the confirmation status and show the success message.\n setProperties(schedule, {\n [CONFIRM_UPGRADE_FIRMWARE]: false,\n [CONFIRM_REFORMAT]: false,\n [CONFIRM_DELETE_FOOTAGE]: false\n });\n\n // Refresh the customer's trouble conditions so that this camera's Onboard Recording Schedule Not Set Up trouble condition\n // does not appear if the customer navigates back to the Alerts & Issues page.\n troubleConditions.refresh();\n\n // Force this schedule's recording status to reload the next time\n // the user visits the Local Recordings page.\n const recordingStatusModel = store.peekRecord(\n 'automation/recording-status',\n `sd-card_${scheduleCamera.id.replace('-', '_')}_${schedule.id}`\n );\n if (recordingStatusModel) {\n store.unloadRecord(recordingStatusModel);\n }\n\n notificationManager.addSuccess(intl.tc(this, 'success'));\n contextManager.transitionToPreviousRoute();\n\n if (contextManager.identityModel.isMobileApp) {\n stats.postEvent(this.isNew ? AddNewSchedule : UpdateExistingSchedule);\n }\n}\n\n/**\n * Handles showing a warning popup for if the user updates the bitrate settings.\n */\nfunction handleAdvancedOptionsSaveResponse(this: SdCardController): void {\n const { intl } = this;\n\n this.modals.showConfirmationDialog(\n intl.tc(this, 'updateBitrateSettings'),\n intl.tc(this, 'updateBitrateSettingsWarning'),\n {\n text: intl.t('generic.save'),\n action: () => {\n // Set to false so this modal does not appear again.\n set(this, 'confirmUpdateAdvancedOptions', false);\n\n // Attempt to save the schedule again.\n return saveScheduleAction.call(this);\n }\n }\n );\n}\n\n/**\n * Gets the icon and text that should display below the camera dropdown\n * for the status of the SD card for the selected camera.\n */\nfunction getSdCardStatus(this: SdCardController, sdCard: SdCard | undefined): SdCardStatusInfo {\n const { intl, recordingQuality } = this,\n { sdCardStatusEnum, supports4MpRecording } = sdCard ?? { sdCardStatusEnum: Unknown },\n failIcon = 'circle-x',\n successIcon = 'circle-check',\n red = 'red',\n green = 'green';\n\n switch (sdCardStatusEnum) {\n case Unknown:\n case UnexpectedException:\n case DeviceCommandFailed:\n return {\n icon: failIcon,\n text: intl.tc(this, 'sdCardCameraDisconnected'),\n color: red,\n sdCard\n };\n case NoSdCard:\n return {\n icon: failIcon,\n text: intl.tc(this, 'sdCardNotDetected'),\n color: red,\n sdCard\n };\n case SdCardNotCompatible:\n return {\n icon: failIcon,\n text: intl.tc(this, 'sdCardNotSupported'),\n color: red,\n sdCard\n };\n default:\n // The frontend needs to perform these checks so the status can update as the user moves the recording quality slider.\n // Sometimes, the camera firmware is not able to get the size of the SD card if it is not formatted,\n // so it returns 0 for the size, which is why the \"> 0\" check is added here.\n if ((recordingQuality === FourMP || recordingQuality === FourMPHigherFrameRate) && !supports4MpRecording) {\n return {\n icon: failIcon,\n text: intl.tc(this, 'sdCardNotSupported4Mp'),\n color: red,\n sdCard\n };\n }\n\n return {\n icon: successIcon,\n text: intl.tc(this, 'sdCardDetected'),\n color: green,\n sdCard\n };\n }\n}\n\n/**\n * @classdesc\n * Controller for onboard recording schedule\n */\nexport default class SdCardController extends Controller {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare stats: Stats;\n @service declare store: Store;\n @service declare troubleConditions: TroubleConditionsService;\n\n /**\n * The SD card recording schedule.\n */\n @tracked\n declare schedule: SdCardRecordingSchedule;\n\n /**\n * The schedule for the SD card camera that was selected from the dropdown.\n */\n @tracked\n declare scheduleCamera: SdCardCamera;\n\n /**\n * The list of SD card cameras capable of having an SD card recording schedule.\n */\n @tracked\n declare sdCameras: SdCardCamera[];\n\n /**\n * The SD card permissions.\n */\n @tracked\n declare onboardPermission: OnboardPermission;\n\n /**\n * The maximum number of schedules the user is allowed to create based on their service plan.\n * This value will be -1 if it is unlimited.\n */\n @alias('onboardPermission.maxTotalSchedules')\n declare maxTotalSchedulesAllowedOnAccount: number;\n\n /**\n * Does the user have permission to view the VSR Audio page in the mobile app?\n */\n @alias('onboardPermission.mobileAppSupportsRedirectingToVsrAudioPage')\n declare mobileAppSupportsRedirectingToVsrAudioPage: boolean;\n\n /**\n * Does the user have permission to view the VSR Audio page in the customer site?\n */\n @alias('onboardPermission.webSupportsRedirectingToVsrAudioPage')\n declare webSupportsRedirectingToVsrAudioPage: boolean;\n\n /**\n * Is the user accessing this page using the mobile app?\n */\n @alias('contextManager.isMobileApp')\n declare isMobileApp: boolean;\n\n /**\n * Does the user's mobile app version support audio?\n */\n @gte('identityManager.identityModel.applicationBuildNumber', BuildVersionInfoEnum.Seadragon)\n declare mobileAppVersionSupportsAudio: boolean;\n\n /**\n * Should the advanced options be displayed?\n */\n @tracked\n showAdvancedOptions = false;\n\n /**\n * Should we alert the user after they have changed the bitrate settings?\n */\n @tracked\n confirmUpdateAdvancedOptions = false;\n\n /**\n * The SD card status icon and text.\n */\n @tracked\n sdCardStatus?: SdCardStatusInfo;\n\n /**\n * Does the camera support SD card audio recording?\n */\n @alias('scheduleCamera.supportsAudioRecording')\n declare supportsAudioRecording: boolean;\n\n /**\n * Does the camera support SD card automated recovery?\n */\n @alias('scheduleCamera.supportsAutomatedRecovery')\n declare supportsAutomatedRecovery: boolean;\n\n /**\n * Does the camera support smart rate control?\n */\n @alias('scheduleCamera.supportsSmartRateControl')\n declare supportsSmartRateControl: boolean;\n\n /**\n * Does the camera support bitrate control?\n */\n @alias('scheduleCamera.supportsBitrateControl')\n declare supportsBitrateControl: boolean;\n\n /**\n * Does the camera support smart rate control?\n */\n @alias('scheduleCamera.hasInternalBetaAccess')\n declare hasInternalBetaAccess: boolean;\n\n /**\n * Is smart rate control enabled on the camera?\n */\n @alias('scheduleCamera.smartRateControlEnabled')\n declare smartRateControlEnabled: boolean;\n\n /**\n * The current bitrate of the sd card stream.\n */\n @alias('scheduleCamera.bitrate')\n declare currentMaxBitrate: number;\n\n /**\n * Is the camera recording to an SVR?\n */\n @alias('scheduleCamera.hasSvrSchedule')\n declare cameraHasSvrSchedule: boolean;\n\n /**\n * Does the camera support dynamic stream mapping?\n */\n @alias('scheduleCamera.supportsDynamicStreamMapping')\n declare cameraSupportsDynamicStreamMapping: boolean;\n\n /**\n * The recording quality currently set for the schedule.\n */\n @alias('schedule.recordingQuality')\n declare recordingQuality: number;\n\n /**\n * Is SD card automated recovery enabled on the schedule?\n */\n @alias('schedule.automatedRecoveryEnabled')\n declare automatedRecoveryEnabled: boolean;\n\n /**\n * Is smart rate control enabled on the schedule?\n */\n @alias('schedule.smartRateControlEnabled')\n declare scheduleSmartRateControlEnabled: boolean;\n\n /**\n * Is create new schedule screen?\n */\n @reads('model.isNew')\n declare isNew: boolean;\n\n /**\n * The list of valid options for the retention period.\n */\n @tracked\n declare videoRetentionDays: number[];\n\n /**\n * The global device ID of the camera that should be preselected from the dropdown.\n * This value will be undefined if no camera should be preselected.\n */\n @reads('model.selectedDevice')\n declare selectedDevice: string | undefined;\n\n /**\n * The route model.\n */\n @tracked\n declare model: ModelFrom;\n\n /**\n * Should the bitrate controls be disabled?\n */\n @tracked\n declare disableBitrateControls: boolean;\n\n /**\n * Computes the total number of existing Onboard recording schedules that the customer has.\n */\n @computed('sdCameras')\n get existingSchedulesCount(): number {\n return this.sdCameras.filterBy('hasSdRecordingSchedule').length;\n }\n\n /**\n * A dictionary that maps the recording quality (Low, Medium, High, Max)\n * to information about the stream (resolution, frame rate, bitrate, etc.).\n */\n @computed('scheduleCamera.recordingQualityToStreamMapping')\n get recordingQualityToStreamMapping(): Record | undefined {\n return this.scheduleCamera?.recordingQualityToStreamMapping;\n }\n\n /**\n * The recording quality that we force this schedule to have,\n * likely due to a higher-priority feature that controls the stream.\n */\n @computed('scheduleCamera.forcedRecordingQuality')\n get forcedRecordingQuality(): number {\n return this.scheduleCamera?.forcedRecordingQuality;\n }\n\n /**\n * Should we disable the video retention toggle?\n */\n @computed('scheduleCamera.hasVideoRetentionMaxLimit')\n get hasMaxLimit(): boolean {\n return this.scheduleCamera?.hasVideoRetentionMaxLimit ?? false;\n }\n\n /**\n * Computes the text that should display if the customer is limited to a maximum number of Onboard recording schedules.\n */\n @computed('maxTotalSchedulesAllowedOnAccount', 'existingSchedulesCount')\n get existingSchedulesText(): string | null {\n const { maxTotalSchedulesAllowedOnAccount, existingSchedulesCount } = this;\n if (maxTotalSchedulesAllowedOnAccount < 0) {\n return null;\n }\n\n return this.intl.tc(this, 'existingSchedules', { existingSchedulesCount, maxTotalSchedulesAllowedOnAccount });\n }\n\n /**\n * Populate the dropdown used in the new schedule route to include the sd card cameras on the unit, and show the ones with schedules as disabled.\n */\n @computed('isNew', 'scheduleCamera.id', 'sdCameras')\n get eligibleCamerasDropdownItems(): CheckboxTreeItem[] {\n return this.sdCameras.map((camera) => {\n const fnGetItem = (value: string, name: string, disabled: boolean, state: number) =>\n DropdownSelectItem.create({ value, name, disabled, state }),\n isSelected = isCameraSelected(camera.id, this.scheduleCamera?.id, this.isNew);\n\n return fnGetItem(camera.id, camera.description, camera.hasSdRecordingSchedule, isSelected);\n });\n }\n\n /**\n * An array of dropdown select items to display in the dropdown list.\n * We pass in MaximumBitrateOptionsProperties, which contains a default bitrate and an array of ints for the available bitrates.\n */\n @computed(\n 'recordingQuality',\n 'recordingQualityToStreamMapping',\n 'supportsSmartRateControl',\n 'supportsBitrateControl'\n )\n get maxBitrateDropdownItems(): DropdownSelectItem[] | undefined {\n const { recordingQualityToStreamMapping, recordingQuality, supportsSmartRateControl, supportsBitrateControl } =\n this;\n\n if (!supportsSmartRateControl && !supportsBitrateControl) {\n return [];\n }\n\n const mapping = recordingQualityToStreamMapping?.[recordingQuality],\n defaultMaxBitrate = mapping?.[BITRATE_OPTIONS_PROPERTIES][DEFAULT_BITRATE],\n bitrateOptions = mapping?.[BITRATE_OPTIONS_PROPERTIES][BITRATE_OPTIONS];\n\n return bitrateOptions?.map((maxBitrateOption) => {\n const fnGetItem = (value: string, name: string) => DropdownSelectItem.create({ value, name });\n\n const displayBitrate = maxBitrateOption / 1024;\n return fnGetItem(\n maxBitrateOption.toString(),\n maxBitrateOption === defaultMaxBitrate\n ? this.intl.tc(this, 'default', { numMegabitsPerSecond: displayBitrate })\n : this.intl.tc(this, 'mbps', { numMegabitsPerSecond: displayBitrate })\n );\n });\n }\n\n /**\n * The audio recording options for SD card recording.\n */\n @computed('schedule.audioRecordingEnabled', 'showAudioDisabledWarning')\n get audioRecordingOptions(): BinaryListItem<{ id: number }>[] {\n const audioRecordingEnabled = this.schedule.audioRecordingEnabled && !this.showAudioDisabledWarning;\n return [\n ['record', audioRecordingEnabled, RECORD_AUDIO_ID],\n ['dontRecord', !audioRecordingEnabled, DONT_RECORD_AUDIO_ID]\n ].map(\n ([key, state, id]: [string, boolean, number]) =>\n new BinaryListItem({\n label: this.intl.tc(this, key),\n state,\n props: {\n id\n }\n })\n );\n }\n\n /**\n * The retention period for continuous recording.\n */\n @computed('hasMaxLimit', 'videoRetentionDays', 'schedule.retentionPeriod')\n get selectedRetentionTime(): number {\n const { hasMaxLimit, videoRetentionDays } = this,\n scheduleRetentionPeriod = this.schedule.retentionPeriod,\n dealerMaxRetentionPeriod = videoRetentionDays[videoRetentionDays.length - 1];\n\n // If there is no dealer max retention period (meaning the retention toggle is *not* disabled,\n // or the schedule's retention period is already at or below the dealer max,\n // then continue using the existing schedule's retention.\n if (!hasMaxLimit || (scheduleRetentionPeriod && scheduleRetentionPeriod <= dealerMaxRetentionPeriod)) {\n return scheduleRetentionPeriod;\n }\n\n // Otherwise, the schedule's retention period is above the dealer max,\n // so change the schedule's retention to the dealer max.\n return dealerMaxRetentionPeriod;\n }\n\n /**\n * If audio recording is not enabled on the camera, but the user wants to enable it on the schedule,\n * then display a warning message, redirecting them to the Device Settings page.\n */\n @computed('schedule.audioRecordingEnabled', 'scheduleCamera.isRecordedAudioEnabled')\n get showAudioDisabledWarning(): boolean {\n return !this.scheduleCamera.isRecordedAudioEnabled;\n }\n\n /**\n * Should the audio setting be displayed?\n * The camera must support audio recording,\n * and the mobile app version must be at least S-fish.\n */\n @computed('supportsAudioRecording', 'isMobileApp', 'mobileAppVersionSupportsAudio')\n get displayAudioSetting(): boolean {\n return this.supportsAudioRecording && (!this.isMobileApp || this.mobileAppVersionSupportsAudio);\n }\n\n /**\n * Should we show the SVR recording alert message?\n * The message is shown to let users know that any changes to SD stream settings will also affect their SVR schedule.\n * Only show the message if this camera also has an associated SVR recording schedule and the stream is not dynamically mapped,\n * meaning that both the SD and SVR usages must remain in sync because they map to the same stream ID.\n */\n @computed('cameraHasSvrSchedule', 'cameraSupportsDynamicStreamMapping')\n get showSvrRecordingAlert(): boolean {\n return this.cameraHasSvrSchedule && !this.cameraSupportsDynamicStreamMapping;\n }\n\n @computed('supportsBitrateControl', 'supportsSmartRateControl')\n get showBitrateControls(): boolean {\n return this.supportsBitrateControl || this.supportsSmartRateControl;\n }\n\n /**\n * Asynchronously performs an action to get the updated SD card status.\n *\n * @param id The ID of the camera to get the SD card status for.\n */\n sdCardActionTask = task({ restartable: true }, async (id: string) => {\n const { ajax, intl, notificationManager } = this;\n\n // Reset SD card status.\n this.sdCardStatus = undefined;\n\n try {\n const sdCard = await ajax.apiRequest<{ data: any }>( // Please fix this any\n `video/sdCards/status/${id}`,\n undefined,\n undefined,\n POST\n );\n\n if (!sdCard?.data?.attributes) {\n throw new Error();\n }\n\n this.sdCardStatus = getSdCardStatus.call(this, sdCard.data.attributes);\n } catch (error) {\n const defaultErrorMessage = error?.errors?.firstObject?.detail;\n notificationManager.addError(defaultErrorMessage || intl.tc(this, 'updateSdStatusFail'));\n this.sdCardStatus = getSdCardStatus.call(this, undefined);\n }\n });\n\n /**\n * Creates the resolvedModel after the route-model promises have resolved.\n */\n @action\n initModelData(resolvedModel: SdCardController) {\n Object.assign(this, resolvedModel);\n }\n\n /**\n * Saves the current state of the schedule.\n */\n @action\n async save(): Promise {\n const { schedule } = this;\n\n // Do we have a schedule?\n if (schedule) {\n if (schedule.dayBits <= 0) {\n this.notificationManager.addError(this.intl.tc(this, 'invalidSchedule'));\n return;\n }\n\n if (this.confirmUpdateAdvancedOptions) {\n handleAdvancedOptionsSaveResponse.call(this);\n return;\n }\n\n // Save the schedule.\n return await saveScheduleAction.call(this);\n }\n return;\n }\n\n /**\n * Transitions back to video schedules route.\n */\n @action\n back(): void {\n this.contextManager.transitionToPreviousRoute();\n }\n\n /**\n * Store the current isPaused flag in the dirty instance.\n */\n @action\n onIsPausedChange(event: Event & { target: HTMLInputElement }) {\n set(this.schedule, 'isPaused', !event.target.checked);\n }\n\n /**\n * Fired when the camera dropdown changes.\n */\n @action\n onDeviceDropdownChanged(id: string): void {\n const { sdCameras, store } = this,\n camera = sdCameras.findBy('id', id);\n\n // The camera could not be found in the dropdown.\n // This may happen if the query param value is invalid.\n if (!camera) {\n return;\n }\n\n this.sdCardActionTask.perform(id);\n\n // The schedule is new. Set the retention period to a default value chosen based on the max limit.\n const defaultRetentionPeriod =\n camera.hasVideoRetentionMaxLimit && camera.videoRetentionDays.length > 0\n ? camera.videoRetentionDays[camera.videoRetentionDays.length - 1]\n : null;\n\n Object.assign(this, {\n schedule: store.createRecord('video/schedules/sd-card-recording-schedule', {\n camera,\n retentionPeriod: defaultRetentionPeriod\n }),\n scheduleCamera: camera\n });\n\n // Update model so route can clean up new schedules.\n this.model.schedule = this.schedule;\n }\n\n /**\n * Fired when the schedule changes.\n */\n @action\n scheduleChanged({ dayBits, beginTime, endTime }: { dayBits: number; beginTime: number; endTime: number }): void {\n setProperties(this.schedule, {\n dayBits: dayBits,\n startTime: beginTime,\n stopTime: endTime\n });\n }\n\n /**\n * Fired when the recording quality changes.\n */\n @action\n recordingQualityChanged(sliderValue: number): void {\n const {\n schedule,\n smartRateControlEnabled,\n showBitrateControls,\n recordingQualityToStreamMapping,\n sdCardStatus\n } = this;\n\n if (!recordingQualityToStreamMapping) {\n return;\n }\n\n const quality = Number(Object.keys(recordingQualityToStreamMapping)[sliderValue]),\n newCurrentMaxBitRate = showBitrateControls\n ? recordingQualityToStreamMapping[quality][BITRATE_OPTIONS_PROPERTIES][DEFAULT_BITRATE]\n : 0;\n set(schedule, 'recordingQuality', quality);\n setProperties(this, {\n disableBitrateControls: quality === Low,\n smartRateControlEnabled: quality === Low ? false : smartRateControlEnabled,\n currentMaxBitrate: newCurrentMaxBitRate\n });\n set(schedule, 'maximumBitrate', newCurrentMaxBitRate);\n this.sdCardStatus = getSdCardStatus.call(this, sdCardStatus?.sdCard);\n }\n\n /**\n * Handler for when the SD card audio recording option is changed.\n */\n @action\n audioRecordingOptionChanged(items: SdCardController['audioRecordingOptions']) {\n set(this.schedule, 'audioRecordingEnabled', items.find((i) => i.state === true)?.props.id === RECORD_AUDIO_ID);\n }\n\n /**\n * Fired when the Advanced Options button is clicked to show or hide the advanced settings.\n */\n @action\n showHideAdvancedOptions(): void {\n this.showAdvancedOptions = !this.showAdvancedOptions;\n }\n\n /**\n * Fired when any settings under 'Advanced Options' change.\n */\n @action\n advancedOptionsChanged(\n automatedRecoveryEnabled: boolean,\n retentionPeriod: number,\n smartRateControlEnabled: boolean,\n maximumBitrate: number\n ) {\n const { schedule } = this;\n\n if (\n this.showBitrateControls &&\n (this.scheduleSmartRateControlEnabled !== smartRateControlEnabled ||\n schedule.maximumBitrate !== maximumBitrate)\n ) {\n this.confirmUpdateAdvancedOptions = true;\n }\n\n setProperties(schedule, {\n automatedRecoveryEnabled,\n retentionPeriod,\n smartRateControlEnabled,\n maximumBitrate\n });\n }\n\n /**\n * Fired when the svg-info icon corresponding to\n * the maximum allowed Onboard schedules is clicked on.\n */\n @action\n showMoreInfoModalForMaxSchedules(): void {\n const { existingSchedulesCount, maxTotalSchedulesAllowedOnAccount, intl } = this;\n this.modals.showInfoModal({\n title: intl.tc(this, 'maximumOnboardSchedules'),\n info: htmlSafe(\n `

${intl.tc(this, 'maxOnboardSchedulesHelpText', {\n existingSchedulesCount,\n maxTotalSchedulesAllowedOnAccount\n })}

`\n ),\n css: 'more-info'\n });\n }\n\n /**\n * Fired when the svg-info icon corresponding to\n * the audio radio button is clicked on.\n */\n @action\n showMoreInfoModalForAudio(): void {\n const { intl } = this;\n this.modals.showInfoModal({\n title: intl.t('generic.video.audioRecording'),\n info: htmlSafe(`

${intl.tc(this, 'audioRecordingHelpText')}

`),\n css: 'more-info'\n });\n }\n\n /**\n * Refreshes the SD card status again.\n */\n @action\n refreshSdCardStatus(): void {\n this.sdCardActionTask.perform(this.scheduleCamera.id);\n }\n\n /**\n * Sets the properties on the page based on the selected camera.\n */\n @action\n async updateProperties(): Promise {\n const { selectedDevice } = this;\n\n // If there is a query param for the selected device,\n // attempt to preselect that camera from the dropdown.\n if (selectedDevice) {\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n await next(() => this.onDeviceDropdownChanged(selectedDevice));\n // Reset the selected device so that it doesn't continue selecting this camera\n // when the user is modifying the schedule.\n this.selectedDevice = undefined;\n }\n\n const { scheduleCamera, schedule } = this;\n\n // If the user has not selected a camera from the dropdown yet,\n // then the schedule properties cannot be set because they need to come from the selected camera.\n if (!scheduleCamera) {\n return;\n }\n\n if (this.forcedRecordingQuality != null) {\n set(schedule, 'recordingQuality', this.forcedRecordingQuality);\n }\n\n setProperties(this, {\n videoRetentionDays: scheduleCamera.videoRetentionDays,\n smartRateControlEnabled: scheduleCamera.smartRateControlEnabled,\n currentMaxBitrate: scheduleCamera.bitrate,\n disableBitrateControls: this.showBitrateControls && schedule.recordingQuality === Low\n });\n\n if (this.showBitrateControls) {\n set(schedule, 'maximumBitrate', this.currentMaxBitrate);\n }\n\n // If there is no max limit and retention days does not have a 0, then 0 is added to the front of the array\n if (!this.hasMaxLimit && !this.videoRetentionDays.includes(UnlimitedRetentionDropdownValue)) {\n this.videoRetentionDays.unshift(UnlimitedRetentionDropdownValue);\n }\n }\n\n /**\n * Redirect to the Video Device Settings page or VSR Audio page,\n * depending on the user's permissions and whether they are using mobile or web.\n */\n @action\n redirectToDeviceSettings() {\n const { isMobileApp, navigation, webSupportsRedirectingToVsrAudioPage, scheduleCamera } = this;\n\n if (isMobileApp || webSupportsRedirectingToVsrAudioPage) {\n navigation.transitionToRouteId(EmberVideoSettingsAudio, scheduleCamera.id);\n return;\n }\n\n navigation.transitionToRouteId(VideoMainSettings, {\n queryParams: { deviceId: scheduleCamera.id.split('-')[1] }\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/schedules/onboard/edit': SdCardController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoSdCardSchedule } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoAutomationRoute from 'customer-site/video/base-video-automation-route';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type ArrayProxy from '@ember/array/proxy';\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type SdCardCamera from 'customer-site/models/video/devices/sd-card-camera';\nimport type OnboardPermission from 'customer-site/models/video/permissions/onboard-permission';\nimport type SdCardRecordingSchedule from 'customer-site/models/video/schedules/sd-card-recording-schedule';\n\nconst sdScheduleModelName = 'video/schedules/sd-card-recording-schedule';\nconst sdCameraModelName = 'video/devices/sd-card-camera';\n\nexport interface SdCardScheduleRouteModel {\n isNew: boolean;\n selectedDevice: string;\n onboardPermission: Awaited>;\n schedule?: Awaited>;\n scheduleCamera?: Awaited>;\n sdCameras?: Awaited>;\n}\n\n/**\n * @classdesc\n * Route for onboard schedule creation and editing\n */\nexport default class SdCardScheduleRoute extends BaseVideoAutomationRoute {\n // region Services.\n\n @service declare contextManager: ServiceRegistry['context-manager'];\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare notificationManager: NotificationManager;\n @service declare store: ServiceRegistry['store'];\n @service declare troubleConditions: ServiceRegistry['trouble-conditions'];\n @service declare identityManager: ServiceRegistry['identity-manager'];\n\n // endregion Services.\n\n // region Overrides.\n\n /** @override */\n routeId = EmberVideoSdCardSchedule;\n\n /** @override */\n ruleOrScheduleModelName = 'sdCardRecordingSchedule';\n\n declare currentModel: SdCardScheduleRouteModel;\n\n /** @override */\n queryParams = {\n selectedDevice: {\n as: 'globalDeviceId',\n ...getQueryParam('string')\n },\n previousRouteId: {\n as: 'back',\n ...getQueryParam('number')\n }\n };\n\n /** @override */\n async model({\n id_schedule,\n selectedDevice,\n previousRouteId\n }: {\n id_schedule: string;\n selectedDevice: string;\n previousRouteId: number;\n }): Promise {\n const { contextManager, identityManager, store } = this,\n isNew = id_schedule === 'new';\n\n // If the selectedDevice query param is valid, then set EmberAlertsIssues as the previous route,\n // so it will transition correctly when the back arrow is clicked.\n if (previousRouteId) {\n contextManager.addRouteToVisitedRoutesStack(previousRouteId);\n }\n\n let sdCameras = await store.findAll(sdCameraModelName);\n const schedule = isNew ? undefined : await store.findRecord(sdScheduleModelName, id_schedule),\n // The user can select a camera if there is at least one SD card camera\n // and the pre-selected device ID is valid (if the query param is present).\n canSelectCamera = (sdCameras: ArrayProxy) =>\n sdCameras.length && (!selectedDevice || sdCameras.find((c) => c.id === selectedDevice));\n\n // Check if there are no cameras for the user to select.\n // This can occur if the user does not have permission,\n // or if an SD card camera was recently installed.\n if (!canSelectCamera(sdCameras)) {\n // Reload the identity model to refresh the available routes,\n // and reload all the SD card cameras.\n await identityManager.identityModel?.reloadContextAndModel();\n sdCameras = await store.findAll(sdCameraModelName, { reload: true });\n // Re-check if there are available cameras for the user to select.\n // If there are still none, then the user does not have permission.\n if (!canSelectCamera(sdCameras)) {\n // Show a permissions error and redirect back.\n this.notificationManager.addError(this.intl.t('generic.routeNotAllowed'));\n contextManager.transitionToPreviousRoute();\n }\n }\n\n return {\n isNew,\n selectedDevice,\n onboardPermission: await store.findRecord(\n 'video/permissions/onboard-permission',\n identityManager.getContextId()\n ),\n schedule,\n scheduleCamera:\n !isNew && schedule\n ? await store.findRecord(sdCameraModelName, schedule.belongsTo('camera').id())\n : undefined,\n sdCameras\n };\n }\n\n /** @override */\n async afterModel(): Promise {\n // Get the SD Cameras and reload if they are not pending.\n this.store.findAll(sdCameraModelName).then((sdCameras) => {\n this.reloadVideoDevicesIfNotPending(sdCameras);\n });\n }\n\n /** @override */\n async rollbackModelOnTransition(): Promise {\n const schedule = await this.currentModel.schedule;\n\n // Was this model created just for this route?\n if (schedule) {\n // Unload from store because the user never saved it.\n this.store.unloadRecord(schedule);\n }\n }\n\n /** @override */\n canUserAccess(): boolean {\n // Always return true in case an SD card camera was recently installed.\n // Page access is restricted in the model() function.\n return true;\n }\n\n // endregion Overrides.\n}\n","import Controller from '@ember/controller';\n\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nexport default class SvrRecordingSchedulesController extends Controller {\n declare model: ModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/schedules/svr/edit': SvrRecordingSchedulesController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSvrRecordingSchedule } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class SvrRecordingSchedulesRoute extends AdcBaseRoute {\n // region Overrides.\n /** @override */\n routeId = EmberVideoSvrRecordingSchedule;\n\n /** @override */\n model({ id_schedule }: { id_schedule: string }) {\n return {\n id: id_schedule\n };\n }\n // endregion Overrides.\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:default>\\n
\\n

{{t \\'components.modals.video.svr-disconnected.svrIsDisconnectedRetry\\'}}

\\n
\\n \\n <:footer as |DialogFooter|>\\n \\n \\n
\\n\",{ moduleName: \"customer-site/components/modals/video/svr-disconnected/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface SvrDisconnectedModalSignature {\n Element: HTMLDivElement;\n Args: {\n model: {\n [key: string]: any;\n };\n };\n}\n\nconst SvrDisconnectedModal = templateOnlyComponent();\nexport default SvrDisconnectedModal;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n SvrDisconnectedModal: typeof SvrDisconnectedModal;\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport BaseController from 'customer-site/automation/base-automation-controller';\nimport SvrDisconnectedModal from 'customer-site/components/modals/video/svr-disconnected/index';\nimport { VideoAddSvrRecordingSchedule } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceId } from 'customer-site/utils/device';\n\nimport './_style.scss';\n\nexport default class SelectSvrController extends BaseController {\n @service contextManager;\n @service modals;\n\n @action showDisconnectedModal() {\n this.modals.showModal(SvrDisconnectedModal);\n }\n\n @action transitionToAddPage(id) {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(VideoAddSvrRecordingSchedule, null, { svr_device_id: getDeviceId(id) });\n }\n}\n","import { inject as service } from '@ember/service';\nimport BaseVideoAutomationRoute from 'customer-site/video/base-video-automation-route';\nimport { EmberVideoSelectSvrSchedule } from '../../../../enums/CustomerPageUrl';\n\n/**\n * This route will display all SVRs (connected or disconnected) to the user. The user\n * may then select from one of the connected SVRs in order to navigate to the page that\n * supports adding / editing a local SVR schedule for that particular SVR.\n */\nexport default class Route extends BaseVideoAutomationRoute {\n @service store;\n\n routeId = EmberVideoSelectSvrSchedule;\n\n skipWhenTransitioningBack = true;\n\n /** @override */\n model() {\n return {\n svrDevices: this.store.findAll('video/devices/svr')\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias, or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoCameraGroups, EmberEnterpriseVideoCameraGroups } from '../../enums/CustomerPageUrl';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ResolvedModelFrom, ModelFrom } from 'customer-site/utils/type-utils';\nimport type SettingsOverview from '../../models/video/settings/video-settings-overview';\nimport type SettingsOverviewRoute from './route';\n\n/**\n * @classdesc\n * The controller for the Video Settings Overview page.\n */\nexport default class SettingsOverviewController extends EmberController {\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * The settings overview model.\n */\n @alias('resolvedModel.videoSettingsOverview')\n declare videoSettingsOverview: SettingsOverview;\n\n /**\n * Should we display the recording rules link?\n */\n @alias('videoSettingsOverview.shouldDisplayRecordingRulesLink')\n declare shouldDisplayRecordingRulesLink: boolean;\n\n /**\n * Should we display the stream video to panel link?\n */\n @alias('videoSettingsOverview.shouldDisplayStreamVideoToPanelLink')\n declare shouldDisplayStreamVideoToPanelLink: boolean;\n\n /**\n * Should we display the camera groups link?\n */\n @alias('videoSettingsOverview.shouldDisplayCameraGroupsLink')\n declare shouldDisplayCameraGroupsLink: boolean;\n\n /**\n * Should we display the camera groups link?\n */\n @alias('videoSettingsOverview.shouldDisplayIntercomLink')\n declare shouldDisplayIntercomLink: boolean;\n\n /**\n * Should we display the card that contains the settings pages links?\n */\n @or(\n 'shouldDisplayRecordingRulesLink',\n 'shouldDisplayStreamVideoToPanelLink',\n 'shouldDisplayCameraGroupsLink',\n 'shouldDisplayIntercomLink'\n )\n declare shouldDisplaySettingsPagesLinksCard: boolean;\n\n /**\n * A list of all video devices on the account.\n */\n @computed()\n get allVideoDevices(): Promise<(Camera | Svr)[]> {\n return (async () => {\n const cameras = await this.store.findAll('video/devices/camera'),\n svrs = await this.store.findAll('video/devices/svr'),\n allVideoDevices = [...cameras.toArray(), ...svrs.toArray()];\n\n return allVideoDevices.sort((a, b) => a.description.localeCompare(b.description));\n })();\n }\n\n /**\n * Navigate to the correct camera groups page (depending on whether the account is enterprise or not).\n */\n @action\n navigateToCameraGroupsPage(): void {\n const pageEnum = this.identityManager.isEnterprise ? EmberEnterpriseVideoCameraGroups : EmberVideoCameraGroups;\n this.navigation.transitionToRouteId(pageEnum);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/settings-overview': SettingsOverviewController;\n }\n}\n","import AdcBaseRoute from '../../classes/base-route';\nimport { EmberVideoSettingsOverview } from '../../enums/CustomerPageUrl';\n\nimport type Transition from '@ember/routing/transition';\nimport type VideoSettingsOverview from '../../models/video/settings/video-settings-overview';\nimport type SettingsOverviewController from './controller';\n\nexport interface SettingsOverviewModel {\n videoSettingsOverview: ADCAsyncStoreFindRecord;\n}\n\n/**\n * @classdesc\n * The settings overview page route.\n */\nexport default class SettingsOverviewRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoSettingsOverview;\n\n /** @override */\n model(): SettingsOverviewModel {\n return {\n videoSettingsOverview: this.store.findRecord(\n 'video/settings/video-settings-overview',\n this.identityManager.getSelectedSystemId()\n )\n };\n }\n\n setupController(controller: SettingsOverviewController, model: SettingsOverviewModel, transition: Transition) {\n super.setupController(controller, model, transition);\n\n controller.notifyPropertyChange('allVideoDevices');\n }\n}\n","import EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoSettingsAdvancedSetup, VideoMainSettings } from 'customer-site/enums/CustomerPageUrl';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * The controller for Advanced Setup Settings page.\n */\nexport default class AdvancedSetupController extends EmberController {\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare notificationManager: ServiceRegistry['notification-manager'];\n @service declare store: ServiceRegistry['store'];\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n readonly settingsPageId = EmberVideoSettingsAdvancedSetup;\n\n /**\n * The customer page URL enum being set in the dropdown.\n */\n readonly settingsPageValueId = VideoMainSettings;\n\n /**\n * Updates the camera and dewarp config relationship.\n */\n @action\n async updateOrRollbackModels(camera: Camera): Promise {\n try {\n const hasChangedFisheyeEnabled = ('fisheyeEnabled' satisfies keyof Camera) in camera.changedAttributes();\n await camera.save();\n\n // Only update dewarp config relationship if fisheyeEnabled has changed.\n if (hasChangedFisheyeEnabled) {\n if (camera.fisheyeEnabled) {\n // Load relationship into the store.\n await camera.dewarpConfig;\n } else {\n // Remove the dewarp config from the store if it exists.\n const dewarpConfig = this.store.peekRecord('video/dewarp-config', camera.id);\n dewarpConfig?.unloadRecord();\n }\n }\n\n // Only notify success ourselves. On failure, the model's save method will add an error and throw earlier.\n this.notificationManager.addSuccess(this.intl.tc(this, 'deviceCapabilitiesSuccessfulyUpdated'));\n } catch (e) {\n camera.rollbackAttributes();\n throw e;\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/advanced-setup': AdvancedSetupController;\n }\n}\n","import { action } from '@ember/object';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsAdvancedSetup } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\n\nimport type Transition from '@ember/routing/transition';\nimport type CameraLinkInfo from 'customer-site/models/video/camera-link-info';\nimport type CameraPassword from 'customer-site/models/video/camera-password';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\n\ntype AdvancedSetupModel = {\n deviceId: string;\n camera: Promise;\n cameraLink: Promise;\n password: Promise;\n videoSettingsPermission: ADCAsyncStoreFindRecord;\n};\n\n/**\n * Advanced Setup Settings page.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoSettingsAdvancedSetup;\n\n declare currentModel: ReturnType;\n\n async beforeModel(transition: Transition): Promise {\n // If the user installed their first ONVIF camera without updating their route items, they won't have this access to this page.\n // Get/reload the route items before verifying the route exists in AdcBaseRoute's beforeModel\n await this.contextManager.getRouteItemWithIdentityReloadIfNeeded(this.routeId);\n await super.beforeModel(transition);\n }\n\n /** @override */\n model({ id_selected_camera }: { id_selected_camera: string }): AdvancedSetupModel {\n const cameraPromise = this.store.findRecord('video/devices/camera', id_selected_camera);\n const passwordPromise = cameraPromise.then((camera) => camera.password);\n\n return {\n deviceId: getDeviceIdFromGlobalId(id_selected_camera),\n camera: cameraPromise,\n cameraLink: this.store.findRecord('video/camera-link-info', id_selected_camera, { reload: true }),\n password: passwordPromise,\n videoSettingsPermission: this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n )\n };\n }\n\n /** @override */\n @action async willTransition(): Promise {\n const camera = await this.currentModel.camera;\n if (!camera.isSaving && camera.hasDirtyAttributes) {\n camera.rollbackAttributes();\n }\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoBatteryMotionSensitivitySettings } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoSettingsMotionDetectionTestRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoBatteryMotionSensitivitySettings;\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoBatteryStatus } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoSettingsMotionDetectionTestRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoBatteryStatus;\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { computed, setProperties } from '@ember/object';\nimport { action } from '@ember/object';\nimport { alias, gt } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { EmberVideoSettingsAlerts, EmberVideoSettingsAudio } from 'customer-site/enums/CustomerPageUrl';\nimport { DoesNotSupport, ReadWrite } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { lightAlertDropdownItems } from 'customer-site/utils/video/settings/light-alert-options';\nimport { perimeterGuardAudioDropdownItems } from 'customer-site/utils/video/settings/perimeter-guard-audio-options';\nimport { isAdapterErrorProcessingError } from '@adc/ajax/utils/status-codes';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport type { LightAlertOption } from 'customer-site/enums/LightAlertOption';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type AlertsSetting from 'customer-site/models/video/settings/alerts-setting';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nexport default class VideoSettingsCameraAlerts extends Controller {\n // region Services\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n // endregion\n\n declare model: ModelFrom;\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsAlerts;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked\n resolvedModel?: ResolvedModelFrom;\n\n /**\n * The camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: BaseCamera;\n\n /**\n * The audio settings for the device.\n */\n @alias('resolvedModel.alertsSetting')\n declare alertsSetting: AlertsSetting;\n\n /**\n * Is the disabled audio settings action sheet open?\n */\n @tracked isDisabledAudioSettingsActionSheetOpen = false;\n\n /**\n * Should we display the info icon?\n * Only display if the camera supports toggling the microphone speaker (two-way audio) setting and two-way audio is disabled.\n */\n @computed('alertsSetting.supportsTogglingMicrophoneSpeaker', 'camera.isTwoWayAudioEnabled')\n get supportsTwoWayAudioAndIsDisabled(): boolean {\n return this.alertsSetting.supportsTogglingMicrophoneSpeaker && !this.camera.isTwoWayAudioEnabled;\n }\n\n /**\n * Should the save button be disabled?\n */\n @computed(\n 'alertsSetting.{lightAlertSupport,alertSupport,canUserEditVideoSettings,supportsTogglingMicrophoneSpeaker}',\n 'camera.isTwoWayAudioEnabled'\n )\n get disableSave(): boolean {\n const { supportsTwoWayAudioAndIsDisabled, alertsSetting } = this,\n { alertSupport, lightAlertSupport, canUserEditVideoSettings } = alertsSetting;\n return (\n (alertSupport != ReadWrite && lightAlertSupport != ReadWrite) ||\n !canUserEditVideoSettings ||\n supportsTwoWayAudioAndIsDisabled\n );\n }\n\n /**\n * Should the audio selection dropdown be disabled\n */\n @computed('alertsSetting.isAudioAlertEnabled', 'disableSave')\n get shouldDisableAudioOptionDropdown(): boolean {\n return this.disableSave || !this.alertsSetting.isAudioAlertEnabled;\n }\n\n /**\n * Does this camera support a light?\n */\n @computed('alertsSetting.lightAlertSupport')\n get supportsLight(): boolean {\n return this.alertsSetting.lightAlertSupport != DoesNotSupport;\n }\n\n /**\n * Selection of camera floodlight options.\n */\n @computed('resolvedModel.alertsSetting.availableLightAlertOptions')\n get cameraLightAlertOptions(): DropdownSelectItem[] {\n return lightAlertDropdownItems(this.intl, this.resolvedModel?.alertsSetting.availableLightAlertOptions);\n }\n\n /**\n * Selection of audio options.\n */\n @computed('alertsSetting.availableAudioOptions')\n get cameraAudioOptions(): DropdownSelectItem[] {\n return perimeterGuardAudioDropdownItems(this.intl, this.alertsSetting.availableAudioOptions);\n }\n\n /**\n * Should the audio option dropdown be shown\n */\n @gt('alertsSetting.availableAudioOptions.length', 1)\n declare shouldShowAudioDropdown: boolean;\n\n /**\n * Sets the resolved model and isDisabledAudioSettingsActionSheetOpen.\n */\n @action dataLoaded(resolvedModel: ResolvedModelFrom): void {\n this.resolvedModel = resolvedModel;\n this.isDisabledAudioSettingsActionSheetOpen = this.supportsTwoWayAudioAndIsDisabled;\n }\n\n /**\n * Navigate to the audio settings page from the disabled audio settings action sheet.\n */\n @action\n navigateToAudioSettingsPage(): void {\n this.navigation.transitionToRouteId(EmberVideoSettingsAudio, this.resolvedModel?.id);\n }\n\n /**\n * Action for updating the led pattern options according to the selected floodlight option.\n */\n @action updateLightAlertOption(option: string) {\n setProperties(this.alertsSetting, { lightAlertOption: parseInt(option) as LightAlertOption });\n }\n\n /**\n * Action for updating the audio alert options according to the selected audio option.\n */\n @action updateAudioAlertOption(option: string) {\n setProperties(this.alertsSetting, { audioOption: parseInt(option) });\n }\n\n /**\n * Action for when save button is clicked.\n */\n @action\n async saveSettings(): Promise {\n return this.alertsSetting\n .save()\n .then(() =>\n this.notificationManager.addSuccess(this.intl.t('generic.video.deviceSettingsSavedSuccessfully'))\n )\n .catch((ex) => {\n if (!isAdapterErrorProcessingError(ex)) {\n this.notificationManager.addError(\n getErrorText(ex) ?? this.intl.t('generic.video.failedToUpdateVideoDevice')\n );\n }\n\n return Promise.reject();\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/alerts': VideoSettingsCameraAlerts;\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoSettingsAlerts, EmberVideoSettingsAudio } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type AlertsSetting from 'customer-site/models/video/settings/alerts-setting';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { BaseSettingsCameraModel } from '../route';\nimport type VideoSettingsCameraAlerts from './controller';\n\n// Model to be passed into page\ntype AlertSettingsRouteModel = {\n camera: ADCAsyncStoreFindRecord | Promise;\n id: string;\n alertsSetting: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n * Alert settings route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n @service declare contextManager: ContextManager;\n\n /** @override */\n routeId = EmberVideoSettingsAlerts;\n\n /**\n * Should we reload the camera model? Only reload if we are transitioning from the audio settings page.\n */\n shouldReloadCameraModel = false;\n\n /** @override */\n beforeModel(): void {\n if (this.contextManager.currentRouteData?.route?.routeId === EmberVideoSettingsAudio) {\n this.shouldReloadCameraModel = true;\n }\n }\n\n /** @override */\n model(): AlertSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n\n return {\n camera: this.shouldReloadCameraModel\n ? this.store.findRecord('video/devices/camera', model.id)\n : model.camera,\n id: model.id,\n alertsSetting: this.store.findRecord('video/settings/alerts-setting', model.id)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as VideoSettingsCameraAlerts,\n { alertsSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n alertsSetting.canUserEditVideoSettings,\n async () => {\n saveSettings();\n },\n [alertsSetting]\n );\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { alias, gte, not, or, equal, and } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { EmberSmartChime, EmberVideoSettingsAudio } from 'customer-site/enums/CustomerPageUrl';\nimport { Digital, Mechanical, None } from 'customer-site/enums/DoorbellChimeType';\nimport { ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { isAdapterErrorProcessingError } from '@adc/ajax/utils/status-codes';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type AudioSetting from 'customer-site/models/video/settings/audio-setting';\nimport type ChimeToneSetting from 'customer-site/models/video/settings/chime-tone-setting';\nimport type MicrophoneSpeakerSetting from 'customer-site/models/video/settings/microphone-speaker-setting';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The Controller for Audio Settings page.\n */\nexport default class AudioSettingController extends EmberController {\n // region Services\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare contextManager: ContextManager;\n // endregion\n\n declare model: ModelFrom;\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsAudio;\n\n /**\n * ReadOnly const to use in the template.\n */\n ReadOnly = ReadOnly;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * The camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: Camera;\n\n /**\n * The audio settings for the device.\n */\n @alias('resolvedModel.audioSetting')\n declare audioSetting: AudioSetting;\n\n /**\n * The microphone and speaker settings of the device.\n */\n @alias('resolvedModel.audioSetting.microphoneSpeakerSetting')\n declare microphoneSpeakerSetting: MicrophoneSpeakerSetting;\n\n /**\n * The microphone and speaker settings of the device.\n */\n @alias('resolvedModel.audioSetting.chimeToneSetting')\n declare chimeToneSetting: ChimeToneSetting;\n\n /**\n * Should we display the microphone speaker feature? Only display if it the support is at least ReadOnly.\n */\n @gte('microphoneSpeakerSetting.microphoneAndSpeakerFeatureSupport', ReadOnly)\n declare shouldDisplayMicrophoneSpeakerFeature: boolean;\n\n @alias('contextManager.isMobileApp')\n declare isMobileApp: boolean;\n\n /**\n * Are the microphone and speaker currently on for the video device?\n */\n @alias('microphoneSpeakerSetting.areMicrophoneAndSpeakerOn')\n declare areMicrophoneAndSpeakerOn: boolean;\n\n /**\n * Should the audio recording toggle be shown?\n */\n @alias('microphoneSpeakerSetting.canToggleAudioRecording')\n declare shouldDisplayAudioRecordingToggle: boolean;\n\n /**\n * Is the audio recording on?\n */\n @alias('microphoneSpeakerSetting.isAudioRecordingOn')\n declare isAudioRecordingOn: boolean;\n\n /**\n * Should the noise filtering toggle be shown?\n */\n @gte('microphoneSpeakerSetting.noiseFilteringFeatureSupport', ReadOnly)\n declare shouldDisplayNoiseFilteringToggle: boolean;\n\n /**\n * Is noise filtering on?\n */\n @alias('microphoneSpeakerSetting.isNoiseFilteringOn')\n declare isNoiseFilteringOn: boolean;\n\n /**\n * Microphone gain setting to use for noise filtering.\n */\n @alias('microphoneSpeakerSetting.microphoneGainForNoiseFiltering')\n declare microphoneGainForNoiseFiltering: number;\n\n /**\n * Should we display the call volume feature? Only display if the support is at least ReadOnly.\n */\n @gte('microphoneSpeakerSetting.callVolumeFeatureSupport', ReadOnly)\n declare shouldDisplayCallVolumeFeature: boolean;\n\n /**\n * Should we display the microphone gain feature? Only display if the support is at least ReadOnly.\n */\n @gte('microphoneSpeakerSetting.microphoneGainFeatureSupport', ReadOnly)\n declare shouldDisplayMicrophoneGainFeature: boolean;\n\n /**\n * The current call volume value of the device.\n */\n @alias('microphoneSpeakerSetting.callVolumeValue')\n declare callVolumeValue: number;\n\n /*\n * The current microphone gain value of the device.\n */\n @alias('microphoneSpeakerSetting.microphoneGainValue')\n declare microphoneGainValue: number;\n\n /**\n * Should we display the indoor chime toggle feature? Only display if it the support is at least ReadOnly.\n */\n @gte('chimeToneSetting.indoorChimeEnableDisableFeatureSupport', ReadOnly)\n declare shouldDisplayIndoorChimeToggleFeature: boolean;\n\n /**\n * Is the indoor chime currently on for the video device?\n */\n @alias('chimeToneSetting.isIndoorChimeOn')\n declare isIndoorChimeOn: boolean;\n\n /**\n * Should we display the indoor chime type feature? Only display if the support is at least ReadOnly.\n */\n @gte('chimeToneSetting.indoorChimeTypeFeatureSupport', ReadOnly)\n declare shouldDisplayIndoorChimeTypeFeature: boolean;\n\n /**\n * The current selected chime type of the device.\n */\n @alias('chimeToneSetting.selectedChimeType')\n declare selectedChimeType: number;\n\n /**\n * Is the current selected chime type None.\n */\n @equal('selectedChimeType', None)\n declare isSelectedChimeTypeNone: boolean;\n\n /**\n * If the current selected chime type is None we want to hide the indoor chime toggle. Only if multiple chime types is supported.\n */\n @and('isSelectedChimeTypeNone', 'shouldDisplayIndoorChimeTypeFeature')\n declare shouldHideIndoorChimeToggle: boolean;\n\n /**\n * Should we display the camera audio card?\n */\n @or(\n 'shouldDisplayMicrophoneSpeakerFeature',\n 'shouldDisplayAudioRecordingToggle',\n 'shouldDisplayCallVolumeFeature',\n 'shouldDisplayMicrophoneGainFeature'\n )\n declare shouldDisplayCameraAudioCard: boolean;\n\n /**\n * Should we display the chime card?\n */\n @or('shouldDisplayIndoorChimeToggleFeature', 'shouldDisplayIndoorChimeTypeFeature')\n declare shouldDisplayIndoorChimeCard: boolean;\n\n /**\n * Should we display the outdoor tone card?\n */\n @or('shouldDisplayOutdoorToneToggleFeature', 'shouldDisplayOutdoorToneVolume')\n declare shouldDisplayOutdoorToneCard: boolean;\n\n /**\n * Should we display the outdoor tone toggle feature? Only display if it the support is at least ReadOnly.\n */\n @gte('chimeToneSetting.outdoorToneEnableDisableFeatureSupport', ReadOnly)\n declare shouldDisplayOutdoorToneToggleFeature: boolean;\n\n /**\n * Is the outdoor tone currently on for the video device?\n */\n @alias('chimeToneSetting.isOutdoorToneOn')\n declare isOutdoorToneOn: boolean;\n\n /**\n * Should we display the outdoor tone toggle feature? Only display if it the support is at least ReadOnly.\n */\n @gte('chimeToneSetting.outdoorToneVolumeFeatureSupport', ReadOnly)\n declare shouldDisplayOutdoorToneVolume: boolean;\n\n /**\n * Is the outdoor tone currently on for the video device?\n */\n @alias('chimeToneSetting.outdoorToneVolumeValue')\n declare outdoorToneVolumeValue: boolean;\n\n /**\n * Should we display smart chimes link? Only display if it the support is at least ReadOnly.\n */\n @gte('chimeToneSetting.smartChimeSettingsLinkFeatureSupport', ReadOnly)\n declare shouldDisplaySmartChimeSettingsLink: boolean;\n\n /**\n * Should we display the save button? Only display if there are any modifiable features on the page.\n */\n @or(\n 'shouldDisplayMicrophoneSpeakerFeature',\n 'shouldDisplayAudioRecordingToggle',\n 'shouldDisplayCallVolumeFeature',\n 'shouldDisplayMicrophoneGainFeature',\n 'shouldDisplayIndoorChimeToggleFeature',\n 'shouldDisplayIndoorChimeTypeFeature',\n 'shouldDisplayOutdoorToneToggleFeature',\n 'shouldDisplayOutdoorToneVolume'\n )\n declare shouldDisplaySaveButton: boolean;\n\n /**\n * Should we disable the save button? Only disable if the user does not have edit permissions.\n */\n @not('audioSetting.canUserEditVideoSettings')\n declare shouldDisableSaveButton: boolean;\n\n /**\n * The microphone and speaker description.\n * The description will be based on whether the customer has declined the audio agreement or the camera has firmware for two-way audio.\n */\n @computed('audioSetting.hasCustomerAcceptedAudioAgreement', 'camera.{hasFirmwareForTwoWayAudio,isOnvifCamera}')\n get microphoneSpeakerDescription(): string {\n let resourceKey = this.camera.isOnvifCamera\n ? 'onvifMicrophoneSpeakerDescription'\n : 'microphoneSpeakerDescription';\n\n if (!this.audioSetting.hasCustomerAcceptedAudioAgreement) {\n resourceKey = 'audioAgreementNotAcceptedMessage';\n } else if (!this.camera.hasFirmwareForTwoWayAudio) {\n resourceKey = 'firmwareUpdateRequiredMessage';\n }\n\n return this.intl.tc(this, resourceKey);\n }\n\n /**\n * Should we disable the audio recording toggle.\n * Disable if the user can toggle microphone speaker but microphone and speaker are off.\n */\n @computed('shouldDisplayMicrophoneSpeakerFeature', 'areMicrophoneAndSpeakerOn')\n get isAudioFeatureDisabled(): boolean {\n return this.shouldDisplayMicrophoneSpeakerFeature && !this.areMicrophoneAndSpeakerOn;\n }\n\n /**\n * Options to list in the movement options dropdown.\n */\n @computed('intl', 'chimeToneSetting.chimeTypeOptions')\n get chimeTypeOptions(): DropdownSelectItem[] {\n const { intl, chimeToneSetting } = this,\n { chimeTypeOptions } = chimeToneSetting;\n\n return chimeTypeOptions.map((option) => {\n let name;\n switch (option) {\n case None:\n name = intl.t('generic.noneOrWireless');\n break;\n case Mechanical:\n name = intl.t('generic.mechanical');\n break;\n case Digital:\n name = intl.t('generic.digital');\n break;\n }\n\n return DropdownSelectItem.create({\n value: option.toString(),\n name\n });\n });\n }\n\n /*\n * Navigate to the smart chimes settings page.\n */\n @action\n navigateToSmartChimeSettings(): void {\n this.navigation.transitionToRouteId(EmberSmartChime, this.chimeToneSetting.smartChimeGlobalId);\n }\n\n /**\n * Change the chime type.\n */\n @action\n changeChimeType(option: string): void {\n // The dropdown option values are default as string types, which is different from the type we recieve them\n // Converting them to number values prevents them from being read as dirty attributes\n set(this.chimeToneSetting, 'selectedChimeType', Number(option));\n }\n\n /**\n * Changes the microphone and speaker setting on toggle\n * Also toggle audio recording to match microphone and speaker.\n */\n @action\n toggleMicrophoneSpeakerSettingOnOff(): void {\n set(this, 'areMicrophoneAndSpeakerOn', !this.areMicrophoneAndSpeakerOn);\n\n // turn on/off audio recording if microphone and speaker setting is turned on/off.\n if (this.areMicrophoneAndSpeakerOn) {\n set(this, 'isAudioRecordingOn', true);\n } else {\n set(this, 'isAudioRecordingOn', false);\n }\n }\n\n /**\n * Changes noise filtering setting on toggle.\n * Disables microphone gain slider if noise filtering is enabled.\n */\n @action\n toggleNoiseFilteringSettingOnOff(): void {\n set(this, 'isNoiseFilteringOn', !this.isNoiseFilteringOn);\n\n if (this.isNoiseFilteringOn) {\n set(this, 'microphoneGainValue', this.microphoneGainForNoiseFiltering);\n }\n }\n\n /**\n * Save the camera's audio settings to the camera and DB.\n */\n @action\n async saveSettings(): Promise {\n return this.audioSetting\n .save()\n .then(() =>\n this.notificationManager.addSuccess(this.intl.t('generic.video.deviceSettingsSavedSuccessfully'))\n )\n .catch((ex) => {\n if (!isAdapterErrorProcessingError(ex)) {\n this.notificationManager.addError(\n getErrorText(ex) ?? this.intl.t('generic.video.failedToUpdateVideoDevice')\n );\n }\n\n return Promise.reject();\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/audio': AudioSettingController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsAudio } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type AudioSetting from 'customer-site/models/video/settings/audio-setting';\nimport type { BaseSettingsCameraModel } from '../route';\nimport type AudioSettingController from './controller';\n\n// Model to be passed into page\ntype AudioSettingsRouteModel = {\n camera: Promise;\n id: string;\n audioSetting: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n * Audio settings route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsAudio;\n\n /** @override */\n model(): AudioSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n\n return {\n camera: model.camera,\n id: model.id,\n audioSetting: this.store.findRecord('video/settings/audio-setting', model.id)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as AudioSettingController,\n { audioSetting, chimeToneSetting, microphoneSpeakerSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n audioSetting.canUserEditVideoSettings,\n async () => {\n saveSettings();\n },\n [chimeToneSetting, microphoneSpeakerSetting]\n );\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { computed, action } from '@ember/object';\nimport { alias, bool } from '@ember/object/computed';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport ConnectionStatus from 'customer-site/enums/ConnectionStatus';\nimport CustomerKnowledgeBase from 'customer-site/enums/CustomerKnowledgeBase';\nimport { EmberVideoSettingsDeviceStatus } from 'customer-site/enums/CustomerPageUrl';\nimport DeviceConnectionStatusEnum from 'customer-site/enums/DeviceConnectionStatusEnum';\nimport FrequencyBandEnum from 'customer-site/enums/FrequencyBand';\nimport { buildKnowledgeBaseURL } from 'customer-site/helpers/knowledge-base-link';\nimport { convertDateToString } from 'customer-site/utils/datetime';\nimport { getConnectionFrequencyString, getConnectionTypeString } from 'customer-site/utils/device-wifi';\nimport SimpleListItem from '@adc/ui-components/components/simple-list/list-item';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type DeviceStatusHistoryItem from 'customer-site/models/video/settings/device-status-history-item';\nimport type DeviceStatusInfo from 'customer-site/models/video/settings/device-status-info';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type ADCIntlService from 'customer-site/services/intl';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type DeviceStatusRoute from './route';\n\ntype ListItemConditionals = {\n hasValue: boolean;\n listItem: SimpleListItem;\n};\n\ntype DeviceStatusItem = {\n icon: string;\n iconCss: string;\n iconTitle: string;\n};\n\n/**\n * Get the icon info for the device status.\n */\nfunction getDeviceStatusIconInfo(connectionStatus: DeviceConnectionStatusEnum): {\n icon: string;\n iconType: string;\n} {\n switch (connectionStatus) {\n case DeviceConnectionStatusEnum.Connected:\n return { icon: 'circle-check', iconType: 'connected' };\n case DeviceConnectionStatusEnum.Disconnected:\n return { icon: 'circle-close-o', iconType: 'disconnected' };\n default:\n return { icon: 'issue', iconType: 'unknown' };\n }\n}\n\n/**\n * The Controller for Device Status page.\n */\nexport default class DeviceStatusController extends EmberController {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n\n // The model from the route.\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsDeviceStatus;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: Pick, 'camera' | 'deviceStatusInfo'>;\n\n /**\n * Is the device status info modal open?\n */\n @tracked isDeviceStatusInfoModalOpen = false;\n\n /**\n * The camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: Camera;\n\n /**\n * Should the knowledge base link be displayed.\n */\n @bool('identityManager.identityModel.canViewKnowledgeBase')\n declare shouldDisplayKnowledgeBaseLink: boolean;\n\n /**\n * The device status info for the device.\n */\n @reads('resolvedModel.deviceStatusInfo')\n declare deviceStatusInfo: DeviceStatusInfo;\n\n /**\n * Get the translated frequency string.\n */\n @computed('deviceStatusInfo.connectionType')\n get connectionTypeString(): string {\n return getConnectionTypeString(this.deviceStatusInfo.connectionType, this.intl);\n }\n\n /**\n * Get the translated frequency string.\n */\n @computed('deviceStatusInfo.frequencyBand')\n get frequencyBandString(): string {\n return getConnectionFrequencyString(this.deviceStatusInfo.frequencyBand, this.intl);\n }\n\n /**\n * Get the list items to display in the template.\n */\n @computed('deviceStatusInfo', 'connectionTypeString', 'frequencyBandString')\n get networkItems(): SimpleListItem[] {\n const { intl, deviceStatusInfo, connectionTypeString, frequencyBandString, camera } = this,\n listItems: SimpleListItem[] = [];\n\n const conditionalItems: ListItemConditionals[] = [\n {\n hasValue: !!camera.description,\n listItem: new SimpleListItem({\n description: intl.t('generic.deviceName'),\n value: camera.description\n })\n },\n {\n hasValue: !!deviceStatusInfo.deviceSSID,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.networkName'),\n value: deviceStatusInfo.deviceSSID\n })\n },\n {\n hasValue: deviceStatusInfo.connectionType === ConnectionStatus.Remembered,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.connectionType'),\n value: connectionTypeString\n })\n },\n {\n hasValue: deviceStatusInfo.frequencyBand !== FrequencyBandEnum.None,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.frequencyBand'),\n value: frequencyBandString\n })\n }\n ];\n\n conditionalItems.forEach((item) => {\n if (item.hasValue) {\n listItems.push(item.listItem);\n }\n });\n\n return listItems;\n }\n\n /**\n * Returns an array of history items for the device status history card.\n */\n @computed('deviceStatusInfo.deviceStatusHistory')\n get statusHistory(): Promise[]> {\n const { intl, deviceStatusInfo } = this;\n\n const history = (async () => {\n const deviceStatusHistory = await deviceStatusInfo.deviceStatusHistory;\n return deviceStatusHistory.deviceStatusHistoryItems.length > 0\n ? deviceStatusHistory.deviceStatusHistoryItems.map((item: DeviceStatusHistoryItem) => {\n // Get the icon propertie\n const { icon, iconType } = getDeviceStatusIconInfo(item.connectionStatus);\n return new SimpleListItem({\n description: convertDateToString(intl, item.timestamp, true),\n props: {\n icon: icon,\n iconTitle: intl.t(`generic.${iconType}`),\n iconCss: iconType\n }\n });\n })\n : [\n new SimpleListItem({\n description: intl.tc(this, 'noHistory')\n })\n ];\n })();\n\n return history;\n }\n\n /**\n * Requests the device status from from the server.\n */\n @action\n async testConnectivity(): Promise {\n await this.deviceStatusInfo.reload().catch();\n }\n\n /**\n * Handles opening the knowledge base article for Device Status.\n */\n @action\n transitionToKnowledgeBase(): void {\n if (!this.shouldDisplayKnowledgeBaseLink) {\n return;\n }\n\n const knowledgeBaseLink = buildKnowledgeBaseURL(CustomerKnowledgeBase.DeviceStatusHistory, this.contextManager);\n\n // The browser will be open when on Mobile whereas a new tab when on Web.\n window.open(knowledgeBaseLink, '_blank');\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/device-status': DeviceStatusController;\n }\n}\n","import { EmberVideoSettingsDeviceStatus } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type DeviceStatusInfo from 'customer-site/models/video/settings/device-status-info';\nimport type { BaseSettingsCameraModel } from '../route';\n\n/**\n * @classdesc\n * Device Status page route.\n */\nexport default class DeviceStatusRoute extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsDeviceStatus;\n\n /** @override */\n model(): { camera: Promise; id: string; deviceStatusInfo: ADCAsyncStoreFindRecord } {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n return {\n camera: model.camera,\n id: model.id,\n deviceStatusInfo: this.store.findRecord('video/settings/device-status-info', model.id)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { EmberVideoSettingsUpdateFirmware } from 'customer-site/enums/CustomerPageUrl';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { BooleanResponseWrapper } from 'customer-site/utils/api-requests';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from '../../route';\n\n/**\n * @classdesc\n * The Controller for Firmware Settings page.\n */\nexport default class FirmwareSettingsController extends EmberController {\n // Region Services\n @service declare ajax: AjaxService;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare contextManager: ContextManager;\n // End Region\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsUpdateFirmware;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: Pick, 'camera'>;\n\n /**\n * The resolved camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: Camera;\n\n /**\n * Should we disable the firmware upgrade button?\n */\n @computed('camera.{isFirmwareUpToDate,canUpgradeFirmware}')\n get shouldDisableUpgradeFirmwareButton(): boolean {\n return this.camera.isFirmwareUpToDate || !this.camera.canUpgradeFirmware;\n }\n\n /**\n * Upgrade the current firmware version to the most recent firmware version\n */\n @action\n async upgradeFirmware(): Promise {\n const { ajax, notificationManager, camera, intl } = this;\n try {\n this.notificationManager.addInfo(intl.tc(this, 'firmwareUpgradeInProgress'));\n const response: BooleanResponseWrapper = await ajax.apiRequest(\n `video/devices/cameras/${camera.id}/upgradeFirmware`,\n undefined,\n undefined,\n 'POST'\n );\n\n if (!response.value.booleanFlag) {\n throw new Error();\n }\n } catch (ex) {\n const errorText = getErrorText(ex) ?? intl.tc(this, 'firmwareUpgradeFailed');\n notificationManager.addError(errorText);\n return Promise.reject(errorText);\n }\n await camera.reload();\n notificationManager.addSuccess(intl.tc(this, 'firmwareUpgradeSuccess'));\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/general/firmware': FirmwareSettingsController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsUpdateFirmware } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * Firmware settings route.\n */\nexport default class FirmwareRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoSettingsUpdateFirmware;\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { alias, notEmpty, gte, or, not, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { EmberVideoSettingsGeneral } from 'customer-site/enums/CustomerPageUrl';\nimport { EmberVideoSettingsUpdateFirmware } from 'customer-site/enums/CustomerPageUrl';\nimport { ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { translateDoorbellWedge } from 'customer-site/utils/video/doorbell';\nimport { isAdapterErrorProcessingError } from '@adc/ajax/utils/status-codes';\nimport SimpleListItem from '@adc/ui-components/components/simple-list/list-item';\nimport { hexToHSL } from '@adc/ui-components/utils/color-pickers/color';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { Color } from '@adc/ui-components/utils/color-pickers/color';\nimport type Store from '@ember-data/store';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type DoorbellNotificationSetting from 'customer-site/models/video/settings/doorbell-notification-setting';\nimport type GeneralSetting from 'customer-site/models/video/settings/general-setting';\nimport type LedLightSetting from 'customer-site/models/video/settings/led-light-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { SafeString } from 'handlebars';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The Controller for General Settings page.\n */\nexport default class GeneralSettingsController extends EmberController {\n @service declare ajax: AjaxService;\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare contextManager: ContextManager;\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsGeneral;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * Is the color picker action sheet opened.\n */\n @tracked isColorPickerOpened = false;\n\n /**\n * The previously selected color.\n */\n @tracked previousColorHex = '';\n\n /**\n * The resolved camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: Camera;\n\n /**\n * The resolved camera id.\n */\n @alias('resolvedModel.id')\n declare id: string;\n\n /**\n * The resolved video settings permission model.\n */\n @alias('resolvedModel.videoSettingsPermission')\n declare videoSettingsPermission: string;\n\n /**\n * The SVR device (if this device is an SVR).\n */\n @tracked svr: Svr | null = null;\n\n /**\n * Should we display the wedge dropdown feature?\n * If there are no wedge options, we do not enable the feature to change wedge options\n */\n @notEmpty('camera.supportedDoorbellWedgeOptions')\n declare shouldDisplayWedgeFeature: boolean;\n\n /**\n * The general settings for the device.\n */\n @alias('resolvedModel.generalSetting')\n declare generalSetting: GeneralSetting;\n\n /**\n * The doorbell notification settings for the device.\n */\n @alias('resolvedModel.generalSetting.doorbellNotificationSetting')\n declare doorbellNotificationSetting: DoorbellNotificationSetting;\n\n /**\n * The LED light settings for the device.\n */\n @alias('resolvedModel.generalSetting.ledLightSetting')\n declare ledLightSetting: LedLightSetting;\n\n /**\n * Should we display the firmware row\n */\n @notEmpty('camera.firmwareVersion')\n declare shouldDisplayFirmwareVersionRow: string;\n\n /**\n * Should we display the panel notification toggle feature? Only display if it the support is at least ReadOnly.\n */\n @gte('doorbellNotificationSetting.panelNotificationEnableDisableFeatureSupport', ReadOnly)\n declare shouldDisplayPanelNotificationToggleFeature: boolean;\n\n /**\n * Should we disable the panel notification toggles? Disable if the feature support value is ReadOnly.\n */\n @equal('doorbellNotificationSetting.panelNotificationEnableDisableFeatureSupport', ReadOnly)\n declare shouldDisablePanelNotificationToggles: boolean;\n\n /**\n * Should we display the panel notification toggle feature? Only display if it the support is at least ReadOnly.\n */\n @gte('doorbellNotificationSetting.smartChimeNotificationEnableDisableFeatureSupport', ReadOnly)\n declare shouldDisplaySmartChimeNotificationFeature: boolean;\n\n /**\n * Should we display the save button?\n */\n @or('canTurnOnOffLedLight', 'canChangeLedBrightness', 'canChangeLedColor')\n declare shouldDisplayLedLightFeature: boolean;\n\n /**\n * Should we display the save button?\n */\n @or(\n 'shouldDisplayPanelNotificationToggleFeature',\n 'shouldDisplayWedgeFeature',\n 'shouldDisplaySmartChimeNotificationFeature',\n 'shouldDisplayLedLightFeature'\n )\n declare shouldDisplaySaveButton: boolean;\n\n /**\n * Should we disable the save button? Only disable if the user does not have edit permissions.\n */\n @not('generalSetting.canUserEditVideoSettings')\n declare shouldDisableSaveButton: boolean;\n\n /**\n * Are the panel motion notifications enabled for the video device?\n */\n @alias('doorbellNotificationSetting.isMotionNotificationEnabled')\n declare isMotionNotificationsEnabled: boolean;\n\n /**\n * Are the panel motion notifications currently on for the video device?\n */\n @alias('doorbellNotificationSetting.isMotionNotificationsOn')\n declare isMotionNotificationsOn: boolean;\n\n /**\n * Are the panel button press notifications currently on for the video device?\n */\n @alias('doorbellNotificationSetting.isButtonPressNotificationsOn')\n declare isButtonPressNotificationsOn: boolean;\n\n /**\n * Are smart chime notifications currently on for the video device?\n */\n @alias('doorbellNotificationSetting.isSmartChimeNotificationsOn')\n declare isSmartChimeNotificationsOn: boolean;\n\n /**\n * Is LED light enabled for the video device?\n */\n @alias('ledLightSetting.isLedLightEnabled')\n declare isLedLightEnabled: boolean;\n\n /**\n * Can the user turn off Led Light?\n */\n @alias('ledLightSetting.canTurnOnOffLedLight')\n declare canTurnOnOffLedLight: boolean;\n\n /**\n * Can the user change LED brightness for device?\n */\n @alias('ledLightSetting.canChangeLedBrightness')\n declare canChangeLedBrightness: boolean;\n\n /**\n * Can the user change LED color for device?\n */\n @alias('ledLightSetting.canChangeLedColor')\n declare canChangeLedColor: boolean;\n\n /**\n * The current LED brightness value of the device.\n */\n @alias('ledLightSetting.ledBrightness')\n declare ledBrightness: number;\n\n /**\n * The type of wedges. Used to populate the dropdown.\n */\n @computed('camera.supportedDoorbellWedgeOptions.[]')\n get wedgeTypes(): Array {\n const { camera, intl } = this,\n { supportedDoorbellWedgeOptions = [] } = camera;\n\n return supportedDoorbellWedgeOptions.map((wedge: number) =>\n DropdownSelectItem.create({\n value: String(wedge),\n name: translateDoorbellWedge(wedge, camera.supportsWedgeYesNo, intl)\n })\n );\n }\n\n /**\n * The text for the wedge setting.\n */\n get wedgeText(): { title: string; description: string } {\n const { intl } = this;\n\n return this.camera.supportsWedgeYesNo\n ? {\n title: intl.tc(this, 'downwardWedgeTitle'),\n description: intl.tc(this, 'downwardWedgeDescription')\n }\n : {\n title: intl.t('generic.video.wedge'),\n description: intl.tc(this, 'wedgeDescription')\n };\n }\n\n /**\n * Get the device info list items to display in the template.\n */\n @computed('camera')\n get deviceInfoItems(): SimpleListItem[] {\n const { intl, camera } = this;\n return [\n ...(camera.deviceMake\n ? [\n new SimpleListItem({\n description: intl.t('generic.video.make'),\n value: camera.deviceMake\n })\n ]\n : []),\n new SimpleListItem({\n description: intl.t('generic.model'),\n value: camera.deviceModel\n }),\n new SimpleListItem({ description: intl.t('generic.macAddress'), value: camera.macAddress }),\n ...(camera.thirdPartySerialNumber\n ? [\n new SimpleListItem({\n description: intl.t('generic.serialNumber'),\n value: camera.thirdPartySerialNumber\n })\n ]\n : [])\n ];\n }\n\n /**\n * The SVR storage information items (capacity and number of drives installed).\n */\n get svrStorageInformationItems(): SimpleListItem[] | undefined {\n const { svr, intl } = this;\n\n if (svr && svr.storageCapacity && svr.numberDrivesInstalled) {\n return [\n new SimpleListItem({\n description: intl.t('generic.video.totalStorageCapacity'),\n value: intl.t('generic.video.numberStorageCapacity', { value: svr.storageCapacity })\n }),\n new SimpleListItem({\n description: intl.t('generic.video.numberOfDrivesInstalled'),\n value: svr.numberDrivesInstalled.toString()\n })\n ];\n }\n\n return;\n }\n\n /**\n * Get the current LED light color.\n */\n @computed('ledLightSetting.ledLightColor')\n get colorPickerButtonStyle(): SafeString {\n return htmlSafe(`background-color:${this.ledLightSetting.ledLightColor};`);\n }\n\n /**\n * Get the current LED color as HSL object.\n */\n @computed('ledLightSetting.{canChangeLedColor,ledLightColor}')\n get ledColorHsl(): Color | null {\n const { canChangeLedColor, ledLightColor } = this.ledLightSetting;\n return canChangeLedColor ? hexToHSL(ledLightColor) : null;\n }\n\n /**\n * Sets the resolvedModel and svr objects.\n */\n @action\n async dataLoaded(resolvedModel: ResolvedModelFrom) {\n this.resolvedModel = resolvedModel;\n\n try {\n this.svr = await this.store.findRecord('video/devices/svr', this.id);\n } catch (e) {\n // We need to hide notifications so that we won't display the \"device not found\" processing error if an SVR cannot be found with the device id.\n // This does not hide the trouble conditions notifications.\n this.notificationManager.hideNotifications();\n }\n }\n\n /**\n * Open color picker action sheet.\n */\n @action\n openColorPicker(): void {\n this.previousColorHex = this.ledLightSetting.ledLightColor;\n this.isColorPickerOpened = true;\n }\n\n /**\n * Select the new color.\n */\n @action\n onSaveColor(newColorHex: string): void {\n set(this.ledLightSetting, 'ledLightColor', newColorHex);\n }\n\n /**\n * Navigate to the device firmware page.\n */\n @action\n navigateToUpdateFirmwarePage(): void {\n this.navigation.transitionToRouteId(EmberVideoSettingsUpdateFirmware);\n }\n\n /**\n * Save the camera's general settings to the camera and DB.\n */\n @action\n async saveSettings(): Promise {\n const {\n ajax,\n doorbellNotificationSetting,\n intl,\n generalSetting,\n ledLightSetting,\n notificationManager,\n camera\n } = this,\n promises = [];\n\n if (camera.get('hasDirtyAttributes')) {\n promises.push(\n ajax.apiRequest(\n `video/postInstall/wedgeSelect/${camera.id}/${camera.doorbellWedgeType}`,\n undefined,\n null,\n 'PUT'\n ),\n camera.save()\n );\n }\n\n if (doorbellNotificationSetting.get('hasDirtyAttributes') || ledLightSetting.get('hasDirtyAttributes')) {\n promises.push(generalSetting.save());\n }\n\n return Promise.all(promises)\n .then(() => notificationManager.addSuccess(intl.t('generic.video.deviceSettingsSavedSuccessfully')))\n .catch((response) => {\n const errorText = getErrorText(response);\n if (!isAdapterErrorProcessingError(response)) {\n notificationManager.addError(errorText ?? intl.t('generic.video.failedToUpdateVideoDevice'));\n }\n\n return Promise.reject(errorText);\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/general': GeneralSettingsController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsGeneral } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type GeneralSetting from 'customer-site/models/video/settings/general-setting';\nimport type { BaseSettingsCameraModel } from '../../route';\nimport type GeneralSettingsController from './controller';\n\n// Model to be passed into page\nexport type GeneralSettingsRouteModel = {\n camera: Promise;\n id: string;\n videoSettingsPermission: Promise;\n generalSetting: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n * General settings page route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsGeneral;\n\n // model data\n /** @override */\n model(): GeneralSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n return {\n camera: model.camera,\n id: model.id,\n videoSettingsPermission: model.videoSettingsPermission,\n generalSetting: this.store.findRecord('video/settings/general-setting', model.id)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as GeneralSettingsController,\n { camera, generalSetting, doorbellNotificationSetting, ledLightSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n generalSetting.canUserEditVideoSettings,\n async () => {\n await saveSettings();\n },\n [camera, doorbellNotificationSetting, ledLightSetting]\n );\n }\n}\n","import { EmberVideoSettingsGeneral } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\n/**\n * @classdesc\n * General settings page route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsGeneral;\n}\n","import { tracked, cached } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { not, alias } from '@ember/object/computed';\nimport { service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { DoorbellCall } from 'customer-site/enums/CustomerNotificationType';\nimport {\n EmberVideoClipsUsageReport,\n EmberVideoLightsSettings,\n EmberVideoSettingsOverview,\n EmberVideoRules,\n EmberVideoSettingsAlerts,\n EmberVideoSettingsAudio,\n EmberVideoSettingsCamera,\n EmberVideoSettingsGeneral,\n EmberVideoSettingsLightsOverview,\n EmberVideoSettingsNetworkInfo,\n EmberVideoSettingsVideoConfiguration,\n NotificationsCenter,\n EmberVideoSdCardSchedule,\n VideoAddSvrRecordingSchedule,\n VideoSvrDriveManagement,\n VideoSvrDiveCare,\n VideoSvrSettingsDisplayMgmt\n} from 'customer-site/enums/CustomerPageUrl';\nimport Camera from 'customer-site/models/video/devices/camera';\nimport { getDeviceId } from 'customer-site/utils/device';\nimport { GET } from '@adc/ajax/services/adc-ajax';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type { ImageDataRecord } from 'customer-site/components/video/settings/image-multi-select';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\nimport type SdCardCamera from 'customer-site/models/video/devices/sd-card-camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type SdCardRecordingSchedule from 'customer-site/models/video/schedules/sd-card-recording-schedule';\nimport type SdCard from 'customer-site/models/video/sd-card';\nimport type SignalStrengthInfo from 'customer-site/models/video/signal-strength-info';\nimport type SvrVideoSource from 'customer-site/models/video/video-sources/svr-video-source';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type DeviceOverviewSettingsRoute from './route';\n\n/**\n * Consts for camera name min/max lengths.\n */\nconst CameraNameMinLength = 1,\n CameraNameMaxLength = 16;\n\n/**\n * The type for the content for a drill-through button.\n */\ninterface DrillThroughButtonContent {\n mainText: string;\n infoText?: string;\n onClick: () => void;\n style?: string;\n}\n\n/**\n * The Controller for Device Settings Overview page.\n */\nexport default class DeviceSettingsOverviewController extends EmberController {\n @service declare ajax: AjaxService;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n @service declare store: Store;\n\n // The model from the route.\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsCamera;\n\n /**\n * Should we display the delete device action sheet? Display upon clicking \"Remove this device\" button.\n */\n @tracked shouldDisplayDeleteDeviceActionSheet = false;\n\n /**\n * Should we display the action sheet to edit the camera's name? Display upon clicking the \"Edit\" icon button.\n */\n @tracked shouldDisplayEditCameraNameActionSheet = false;\n\n /**\n * Should we display the action sheet to edit the camera's reference snapshot? Display upon clicking the \"Update Reference Photo\" button.\n */\n @tracked shouldDisplayUpdateReferenceSnapshot = false;\n\n /**\n * If the device is currently using ethernet connection.\n */\n @tracked isUsingEthernetConnection = false;\n\n /**\n * The new camera name the user has entered in the input field.\n */\n @tracked newCameraName = '';\n\n /**\n * The video settings permission model.\n */\n @alias('model.videoSettingsPermission')\n declare videoSettingsPermission: VideoSettingsPermission;\n\n /**\n * Should we disable the save-related buttons (camera name, delete device)? Disable if user does not have ViewChangeCameraSettings permission.\n */\n @not('model.videoSettingsPermission.canUserEditVideoSettings')\n declare shouldDisableSaveButtons: boolean;\n\n /**\n * Should we use FOV Health Checks-specific features?\n */\n @alias('identityManager.identityModel.hasFovHealthChecks')\n declare hasFovHealthChecks: boolean;\n\n /**\n * Get the current device, could be Camera, SdCardCamera, or Svr\n */\n @cached\n get currentDevice(): Promise {\n return (async () => {\n const cameraCollection = await this.model.baseCameraCollection;\n\n if (cameraCollection.camera) {\n return cameraCollection.camera;\n }\n\n if (cameraCollection.sdCardCamera) {\n return cameraCollection.sdCardCamera;\n }\n\n if (cameraCollection.svr) {\n return cameraCollection.svr;\n }\n\n return undefined;\n })();\n }\n\n /**\n * Should we display the signal strength infocard? Display if the camera supports signal strength info.\n */\n get shouldDisplaySignalStrengthInfoCard(): Promise {\n return (async () => {\n const cameraCollection = await this.model.baseCameraCollection;\n\n if (cameraCollection.camera?.supportsSignalStrengthInfo) {\n return true;\n }\n\n return false;\n })();\n }\n\n /**\n * Should we disable the save button for editing the camera name?\n */\n @computed('shouldDisableSaveButtons', 'isNewCameraNameValid')\n get shouldDisableCameraNameSaveButton(): boolean {\n return this.shouldDisableSaveButtons || !this.isNewCameraNameValid;\n }\n\n /**\n * Is the new camera name valid?\n */\n @computed('newCameraName.length')\n get isNewCameraNameValid(): boolean {\n const { newCameraName } = this;\n\n return newCameraName.length >= CameraNameMinLength && newCameraName.length <= CameraNameMaxLength;\n }\n\n /**\n * If the device supports signal strength, request the signal strength info of the device.\n */\n get signalStrengthInfo(): Promise {\n return (async () => {\n const cameraCollection = await this.model.baseCameraCollection;\n return await cameraCollection.camera?.signalStrengthInfo;\n })();\n }\n\n /**\n * If we have FOV health checks, the current device is a camera, and we are able to retrieve a reference snapshot,\n * then the returned object will contain the URL for the reference snapshot.\n * Otherwise, the returned object will contain the URL for the stock device image.\n */\n get imageData(): Promise<{ path: string; isReferenceSnapshot: boolean }> {\n return (async () => {\n const currentDevice = await this.currentDevice;\n\n if (this.hasFovHealthChecks && currentDevice instanceof Camera) {\n try {\n const snapshotPath = await this.referenceSnapshotImagePath(currentDevice);\n\n // If the snapshotPath is valid (not null and not an empty string), return it\n if (snapshotPath && snapshotPath.trim() !== '') {\n return { path: snapshotPath, isReferenceSnapshot: true };\n }\n } catch (error) {\n // If the referenceSnapshots API request fails, just fall through to the getDeviceImagePath API request\n }\n }\n\n // If the referenceSnapshots API request returns null, an empty string, or fails, or if hasFovHealthChecks is false,\n // make the getDeviceImagePath API request\n const deviceImagePath = await this.deviceImagePath();\n return { path: deviceImagePath, isReferenceSnapshot: false };\n })();\n }\n\n /**\n * The camera name input error messages for min and max lengths.\n */\n @cached\n get cameraNameInputErrorMessage(): string {\n const { newCameraName, intl } = this;\n\n if (newCameraName.length < CameraNameMinLength) {\n return intl.tc(this, 'cameraNameEmptyMessage');\n }\n\n if (newCameraName.length > CameraNameMaxLength) {\n return intl.tc(this, 'cameraNameMaxLengthMessage');\n }\n\n return '';\n }\n\n /**\n * Get the settings navigation items.\n * General Settings\n * Network Settings\n * Video Settings\n * Audio Settings (if supported)\n * Alerts (if supported)\n * Lights Overview (if supported)\n * Lights (if supported)\n */\n get navigationItems(): Promise {\n const { model, navigation, intl } = this;\n return (async () => {\n const cameraCollection = await model.baseCameraCollection;\n const permissions = await model.videoSettingsPermission;\n const camera: Camera | undefined = cameraCollection.camera;\n const svr: Svr | undefined = cameraCollection.svr;\n const cameraLightSetting: CameraLightSetting | undefined = await camera?.cameraLightSetting;\n\n const items: DrillThroughButtonContent[] = [\n {\n mainText: intl.t('generic.general'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsGeneral);\n }\n }\n ];\n\n if (\n svr ||\n (camera && (camera.deviceModel !== 'ADC-V731B' || permissions.hasV731BVideoSettingsPagesAccess))\n ) {\n items.push(\n {\n mainText: intl.t('generic.wifi.network'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsNetworkInfo);\n }\n },\n {\n mainText: svr ? intl.tc(this, 'recordingOptions') : intl.t('generic.video.video'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsVideoConfiguration);\n }\n }\n );\n }\n\n if (\n camera &&\n ((camera.supportsTwoWayAudio && permissions.hasAudioPermissions) || camera.isDoorbellCamera)\n ) {\n items.push({\n mainText: intl.t('generic.audio'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsAudio);\n }\n });\n }\n\n if (camera && camera.supportsSiren) {\n items.push({\n mainText: intl.tc(this, 'alerts'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsAlerts);\n }\n });\n }\n\n if (cameraLightSetting && cameraLightSetting.supportsFloodlight) {\n items.push({\n mainText: intl.tc(this, 'lightsOverview'),\n onClick: () => {\n navigation.transitionToRouteId(EmberVideoSettingsLightsOverview);\n }\n });\n }\n\n if (\n camera &&\n camera.supportsLight &&\n (camera.deviceModel !== 'ADC-V731B' ||\n (camera.deviceModel === 'ADC-V731B' && permissions.hasV731BVideoSettingsPagesAccess))\n ) {\n items.push({\n mainText: intl.t('generic.devices.lights'),\n onClick: () => {\n this.navigation.transitionToRouteId(\n EmberVideoLightsSettings,\n undefined,\n undefined,\n this.model.id,\n {\n queryParams: { isVSR: true }\n }\n );\n }\n });\n }\n\n return items;\n })();\n }\n\n /**\n * Determines if we should display the automation navigation items.\n */\n get shouldDisplayAutomationNavigation(): Promise {\n const { model } = this;\n\n return (async () => {\n const cameraCollection = await model.baseCameraCollection;\n const camera: Camera | undefined = cameraCollection.camera;\n const svr: Svr | undefined = cameraCollection.svr;\n const sdCardCamera: SdCardCamera | undefined = cameraCollection.sdCardCamera;\n\n if (\n svr ||\n (camera && !camera.isOnvifCamera) ||\n (camera && camera.hasSvrSchedule) ||\n (sdCardCamera && sdCardCamera.hasSdRecordingSchedule) ||\n (camera && camera.isDoorbellCamera)\n ) {\n return true;\n }\n\n return false;\n })();\n }\n\n /**\n * Get the automation navigation items.\n * Recording Rules\n * Onboard Schedule (if supported)\n * Connected Recorder\n * Doorbell Call Notification (if supported)\n */\n get automationNavigationItems(): Promise {\n const { model, navigation, intl } = this;\n return (async () => {\n const cameraCollection = await model.baseCameraCollection;\n\n // If the camera is an SVR, we only show the recording rules and connected recorder items. VID-615\n if (cameraCollection.svr) {\n return [\n {\n mainText: intl.t('generic.video.recordingRules'),\n onClick: () =>\n navigation.transitionToRouteId(EmberVideoRules, {\n queryParams: { globalDeviceId: model.id }\n })\n },\n {\n mainText: intl.tc(this, 'connectedRecorder'),\n infoText: cameraCollection.svr.description,\n onClick: () =>\n navigation.transitionToRouteId(VideoAddSvrRecordingSchedule, {\n queryParams: {\n svr_device_id: getDeviceId(model.id)\n }\n })\n }\n ];\n }\n\n const items: DrillThroughButtonContent[] = [];\n\n if (cameraCollection.camera && !cameraCollection.camera.isOnvifCamera) {\n items.push({\n mainText: intl.t('generic.video.recordingRules'),\n onClick: () =>\n navigation.transitionToRouteId(EmberVideoRules, {\n queryParams: { globalDeviceId: model.id }\n })\n });\n }\n\n if (cameraCollection.sdCardCamera && cameraCollection.sdCardCamera.hasSdRecordingSchedule) {\n const sdCard: SdCard | undefined = await cameraCollection.sdCardCamera.sdCard;\n const recordingSchedule: SdCardRecordingSchedule | undefined = await sdCard?.recordingSchedule;\n\n items.push({\n mainText: intl.t('generic.video.onboardSchedule'),\n onClick: () =>\n this.contextManager.transitionToRouteWithIdentityReloadIfNeeded(\n false,\n EmberVideoSdCardSchedule,\n undefined,\n undefined,\n undefined,\n recordingSchedule?.id || 'new'\n )\n });\n }\n\n if (cameraCollection.camera && cameraCollection.camera.hasSvrSchedule) {\n const svrVideoSource: SvrVideoSource = await cameraCollection.camera.svrVideoSource;\n const parentSvr: Svr = await svrVideoSource.svr;\n if (parentSvr && parentSvr.description) {\n items.push({\n mainText: intl.tc(this, 'connectedRecorder'),\n infoText: parentSvr.description,\n onClick: () =>\n navigation.transitionToRouteId(VideoAddSvrRecordingSchedule, {\n queryParams: {\n svr_device_id: getDeviceId(parentSvr.id),\n channel: svrVideoSource.channel\n }\n })\n });\n }\n }\n\n if (cameraCollection.camera && cameraCollection.camera.isDoorbellCamera) {\n items.push({\n mainText: intl.tc(this, 'setupDoorbellCallNotification'),\n onClick: () =>\n navigation.transitionToRouteId(NotificationsCenter, {\n queryParams: { notificationTypeId: DoorbellCall }\n })\n });\n }\n\n return items;\n })();\n }\n\n /**\n * Get the device management navigation items.\n * Local Display (if supported)\n * Drive Care (if supported)\n * Drive Management (if supported)\n */\n get deviceManagementNavigationItems(): Promise {\n const { model, navigation, intl } = this;\n\n return (async () => {\n const cameraCollection = await model.baseCameraCollection;\n const svr: Svr | undefined = cameraCollection.svr;\n const videoSettingsPermission = await model.videoSettingsPermission;\n\n if (!svr) {\n return [];\n }\n\n const items: DrillThroughButtonContent[] = [];\n\n if (svr.supportsLocalSettings) {\n items.push({\n mainText: intl.tc(this, 'localDisplay'),\n onClick: () =>\n navigation.transitionToRouteId(VideoSvrSettingsDisplayMgmt, {\n queryParams: { deviceId: getDeviceId(model.id) }\n })\n });\n }\n\n if (videoSettingsPermission.canAccessSvrManagement) {\n items.push({\n mainText: intl.tc(this, 'driveCare'),\n onClick: () =>\n navigation.transitionToRouteId(VideoSvrDiveCare, {\n queryParams: { deviceId: getDeviceId(model.id) }\n })\n });\n }\n\n if (videoSettingsPermission.canAccessSvrManagement && svr.supportsDiskManagement) {\n items.push({\n mainText: intl.tc(this, 'driveManagement'),\n onClick: () =>\n navigation.transitionToRouteId(VideoSvrDriveManagement, {\n queryParams: { deviceId: getDeviceId(model.id) }\n })\n });\n }\n\n return items;\n })();\n }\n\n /**\n * Get a list of navigation items for the devices that are recording to the current SVR.\n */\n get connectedDevicesNavigationItems(): Promise {\n const { model, navigation } = this;\n\n return (async () => {\n const cameraCollection = await model.baseCameraCollection;\n const svr = cameraCollection.svr;\n\n if (!svr) {\n return [];\n }\n\n const connectedCameras = await svr.cameras;\n const items: DrillThroughButtonContent[] = [];\n\n connectedCameras.forEach((camera: Camera) => {\n items.push({\n mainText: camera.description,\n onClick: () => navigation.transitionToRouteId(EmberVideoSettingsCamera, camera.id)\n });\n });\n\n return items;\n })();\n }\n\n /**\n * Navigate to the usage report page.\n */\n @action\n navigateToUsageReport(): void {\n this.navigation.transitionToRouteId(EmberVideoClipsUsageReport, {\n queryParams: { reportType: 'camera', cameraOrRuleId: this.model.id }\n });\n }\n\n /**\n * Resets edit camera name properties upon closing the action sheet.\n */\n @action\n closeEditCameraNameActionSheet(): void {\n this.shouldDisplayEditCameraNameActionSheet = false;\n this.newCameraName = '';\n }\n\n /**\n * Updates the is using ethernet connection property based on the passed in value.\n */\n @action\n handleEthernetConnection(isUsingEthernet: boolean): void {\n this.isUsingEthernetConnection = isUsingEthernet;\n }\n\n /**\n * The deletion message.\n */\n @cached\n get deletionMessages(): Promise {\n return (async () => {\n const deviceCollection = await this.model.baseCameraCollection;\n if (!deviceCollection) {\n // The AsyncLoader that wraps the camera details does not wrap the deletion button.\n // If deletion button gets triggered before the camera loads we show the original VSR\n // deletion modal contents.\n return [this.intl.tc(this, 'verifyDeleteDevice'), this.intl.tc(this, 'deleteDeviceDescription')];\n }\n\n // The device collection is already awaited above, so this await doesn't affect performance.\n const currentDeviceName = (await this.currentDevice)?.description;\n\n // Deletion behavior of SettingsMainV2 and Manage Devices page\n if (deviceCollection.camera?.hasClipAgeLimit) {\n return [this.intl.t('generic.video.removeVideoDeviceWithClipLimit', { deviceName: currentDeviceName })];\n }\n\n return [this.intl.t('generic.video.removeVideoDevice', { deviceName: currentDeviceName })];\n })();\n }\n\n /**\n * Makes an API request to delete the video device from the account.\n */\n @action\n async deleteVideoDevice(): Promise {\n const { notificationManager, intl } = this;\n\n if (!(await this.videoSettingsPermission).canUserEditVideoSettings) {\n return;\n }\n\n try {\n await this.ajax.apiRequest(\n `video/devices/cameras/${this.model.id}/deleteVideoDevice`,\n undefined,\n null,\n 'PUT'\n );\n this.shouldDisplayDeleteDeviceActionSheet = false;\n this.navigation.transitionToRouteId(EmberVideoSettingsOverview);\n notificationManager.addSuccess(intl.tc(this, 'deleteDeviceSuccessMessage'));\n } catch (ex) {\n notificationManager.addError(getErrorText(ex) ?? intl.tc(this, 'deleteDeviceFailureMessage'));\n\n return Promise.reject();\n }\n\n return;\n }\n\n /**\n * Makes an API request to save the updated camera name to the DB.\n */\n @action\n async saveCameraName(): Promise {\n const { notificationManager, intl } = this;\n\n if (!this.videoSettingsPermission.canUserEditVideoSettings || !this.isNewCameraNameValid) {\n return Promise.reject();\n }\n\n try {\n await this.ajax.apiRequest(\n `video/devices/cameras/${this.model.id}/changeCameraName?newCameraName=${this.newCameraName}`,\n undefined,\n null,\n 'PUT'\n );\n this.shouldDisplayEditCameraNameActionSheet = false;\n this.newCameraName = '';\n notificationManager.addSuccess(intl.t('generic.video.deviceSettingsSavedSuccessfully'));\n this.router.refresh();\n } catch (ex) {\n notificationManager.addError(getErrorText(ex) ?? intl.t('generic.video.failedToUpdateVideoDevice'));\n\n return Promise.reject();\n }\n\n return;\n }\n\n /**\n * Get the device image path, size 128.\n */\n async deviceImagePath(): Promise {\n return await this.ajax\n .apiRequestForValue(`video/devices/cameras/${this.model.id}/getDeviceImagePath?size=128`)\n .catch(() => '');\n }\n\n /**\n * Get the reference snapshot for the current camera.\n */\n async referenceSnapshotImagePath(currentDevice: Camera): Promise {\n return this.ajax.apiRequest(\n `video/referenceSnapshots/${currentDevice?.macAddress}/false`,\n undefined,\n null,\n GET\n );\n }\n\n /**\n * Returns the imageData displayed in the ImageMultiSelect.\n * Placeholder; will be implemented in future for ImageMultiSelect component.\n * This is gated by this.hasFovHealthChecks, so this can be ignored.\n */\n get referenceSnapshotImageData(): ImageDataRecord {\n const placeholderAlt = 'Placeholder Camera';\n const dayImageUrl = '/Web/webimages/camera_images/VC838PF_64px.png?v=2';\n const nightImageUrl = '/Web/webimages/camera_images/VDB755P_64px.png?v=2';\n\n return {\n Day: [\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt },\n { url: dayImageUrl, alt: placeholderAlt }\n ],\n Night: [\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt },\n { url: nightImageUrl, alt: placeholderAlt }\n ]\n };\n }\n\n /**\n * Placeholder; will be implemented in future for ImageMultiSelect component.\n * This is gated by this.hasFovHealthChecks.\n * @param selectedImage The Reference Photo selected in ImageMultiSelect.\n */\n @action saveReferencePhoto(selectedImage: number): void {\n console.log('Selected image:', selectedImage);\n this.shouldDisplayUpdateReferenceSnapshot = false;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/index': DeviceSettingsOverviewController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsCamera } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCameraCollection from 'customer-site/models/video/devices/base-camera-collection';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type DeviceStatusInfo from 'customer-site/models/video/settings/device-status-info';\nimport type { BaseSettingsCameraModel } from '../route';\nimport type DeviceSettingsOverviewController from './controller';\n\n/**\n * Model to return for the route, device is a Polymorphic model and can be instances of Camera, Svr, and SdCardCamera.\n */\nexport type DeviceOverviewSettingsRouteModel = {\n baseCameraCollection: ADCAsyncStoreFindRecord;\n id: string;\n deviceStatusInfo: ADCAsyncStoreFindRecord;\n videoSettingsPermission: Promise;\n};\n\n/**\n * Route for device overview. This is the index route for VSR pages.\n */\nexport default class DeviceOverviewSettingsRoute extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsCamera;\n\n /** @override */\n model(): DeviceOverviewSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n\n return {\n baseCameraCollection: this.store.findRecord('video/devices/base-camera-collection', model.id),\n id: model.id,\n deviceStatusInfo: this.store.findRecord('video/settings/device-status-info', model.id),\n videoSettingsPermission: model.videoSettingsPermission\n };\n }\n\n /** @override */\n @action willTransition(transition: Transition): void {\n // Reset the ethernet connection tracked property when transitioning away from the page\n const controller = this.controller as DeviceSettingsOverviewController;\n controller.handleEthernetConnection(false);\n super.willTransition(transition);\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport BaseController from 'customer-site/automation/base-automation-controller';\nimport { EmberVideoLightsSettings } from 'customer-site/enums/CustomerPageUrl';\n\nimport type Navigation from 'customer-site/services/navigation';\nimport type { ResolvedModelFrom, ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nexport default class VideoSettingsCameraLightsOverview extends BaseController {\n @service declare navigation: Navigation;\n\n declare model: ModelFrom;\n resolvedModel?: ResolvedModelFrom;\n\n @action\n transitionToLightsSettings(): void {\n this.navigation.transitionToRouteId(EmberVideoLightsSettings, undefined, undefined, this.resolvedModel?.id, {\n queryParams: { isVSR: true }\n });\n }\n\n @action dataLoaded(resolvedModel: ResolvedModelFrom): void {\n this.resolvedModel = resolvedModel;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/lights-overview': VideoSettingsCameraLightsOverview;\n }\n}\n","import { EmberVideoSettingsLightsOverview } from 'customer-site/enums/CustomerPageUrl';\nimport { Light } from 'customer-site/enums/WebDeviceType';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type Rule from 'customer-site/models/automation/rules/rule';\nimport type Schedule from 'customer-site/models/automation/schedules/schedule';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\nimport type CameraPirSetting from 'customer-site/models/video/camera-pir-setting';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type { BaseSettingsCameraModel } from '../route';\n\n// Model to be passed into page\ntype LightsOverviewSettingsRouteModel = {\n camera: ADCAsyncStoreFindRecord;\n rules: ADCAsyncStoreQuery;\n schedules: ADCAsyncStoreQuery;\n ovRules: ADCAsyncStoreFindAll;\n cameraLightSetting: ADCAsyncStoreFindRecord;\n cameraPirSetting: ADCAsyncStoreFindRecord;\n id: string;\n};\n\n/**\n * @classdesc\n * Lights & alerts settings route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsLightsOverview;\n /** @override */\n model(): LightsOverviewSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n const automationParam = {\n deviceType: Light,\n globalDeviceId: model.id\n };\n\n return {\n camera: model.camera,\n schedules: this.store.query('automation/schedules/schedule', automationParam),\n rules: this.store.query('automation/rules/rule', automationParam),\n ovRules: this.store.findAll('video/ov-rule'),\n cameraLightSetting: this.store.findRecord('video/camera-light-setting', model.id),\n cameraPirSetting: this.store.findRecord('video/camera-pir-setting', model.id),\n id: model.id\n };\n }\n}\n","import { cached, tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { computed, action } from '@ember/object';\nimport { alias, and } from '@ember/object/computed';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport ConnectionStatus from 'customer-site/enums/ConnectionStatus';\nimport { EmberVideoSettingsNetworkInfo, VideoNetworkSettings } from 'customer-site/enums/CustomerPageUrl';\nimport FrequencyBandEnum from 'customer-site/enums/FrequencyBand';\nimport { Unknown, NoSignal } from 'customer-site/enums/SignalStrength';\nimport { convertDateToString } from 'customer-site/utils/datetime';\nimport { getDeviceId } from 'customer-site/utils/device';\nimport { getConnectionFrequencyString, getConnectionTypeString } from 'customer-site/utils/device-wifi';\nimport SimpleListItem from '@adc/ui-components/components/simple-list/list-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type { SignalStrength } from 'customer-site/enums/SignalStrength';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type SignalStrengthInfo from 'customer-site/models/video/signal-strength-info';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\ninterface ListItemConditionals {\n hasValue: boolean;\n listItem: SimpleListItem;\n}\n\n/**\n * Matches the frequency band enum to the icon string.\n */\nfunction getFrequencyIcon(frequency: FrequencyBandEnum) {\n switch (frequency) {\n case FrequencyBandEnum.TwoPointFourGHz:\n return 'wifi-2_4-ghz';\n case FrequencyBandEnum.FiveGHz:\n return 'wifi-5-ghz';\n default:\n return '';\n }\n}\n\nconst encryptionTypeNoneString = 'None';\n\n/**\n * @classdesc\n * The Controller for Network Settings page.\n */\nexport default class NetworkInfoController extends EmberController {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare navigation: NavigationService;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsNetworkInfo;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * The camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: BaseCamera;\n\n /**\n * The video settings permissions model.\n */\n @alias('resolvedModel.videoSettingsPermission')\n declare videoSettingsPermission: VideoSettingsPermission;\n\n /**\n * The timestamp for when the Ddns was last updated.\n */\n @reads('resolvedModel.camera.lastDdnsUpdateTime')\n lastDdnsUpdateTime: Date | null = null;\n\n /**\n * Are we on the mobile app?\n */\n @alias('identityManager.isMobileApp')\n declare isMobileApp: boolean;\n\n /**\n * The network info for the device.\n */\n @tracked signalStrengthInfo: SignalStrengthInfo | null = null;\n\n /**\n * Should we show the current network card?\n */\n @and('signalStrengthInfo.isConnected', 'identityManager.identityModel.hasInternalBetaAccess')\n declare shouldShowCurrentNetworkCard: boolean;\n\n /**\n * Should we show the change network button?\n */\n @and('signalStrengthInfo.canChangeNetwork', 'identityManager.identityModel.hasInternalBetaAccess')\n declare shouldShowChangeNetworkButton: boolean;\n\n /**\n * Should we display the advanced network setup link?\n */\n @computed('camera.supportsAdvancedNetworkSetup', 'identityManager.isMobileApp')\n get shouldDisplayAdvancedNetworkSetupLink(): boolean {\n return this.camera.supportsAdvancedNetworkSetup && !this.identityManager.isMobileApp;\n }\n\n /**\n * Are we currently loading the signal strength info?\n */\n @cached\n get isLoadingSignalStrengthInfo(): boolean {\n return this.camera.supportsSignalStrengthInfo && !this.signalStrengthInfo;\n }\n\n /**\n * Get the translated frequency string.\n */\n @computed('intl', 'signalStrengthInfo.connectionType')\n get connectionTypeString(): string | undefined {\n if (!this.signalStrengthInfo) {\n return;\n }\n\n return getConnectionTypeString(this.signalStrengthInfo.connectionType, this.intl);\n }\n\n /**\n * Get the translated frequency string.\n */\n @computed('intl', 'signalStrengthInfo.frequencyBand')\n get frequencyBandString(): string | undefined {\n if (!this.signalStrengthInfo) {\n return;\n }\n\n return getConnectionFrequencyString(this.signalStrengthInfo.frequencyBand, this.intl);\n }\n\n /**\n * Get the translated frequency string.\n */\n @computed('intl', 'lastDdnsUpdateTime')\n get lastDdnsUpdateDateString(): string {\n if (this.lastDdnsUpdateTime) {\n return convertDateToString(this.intl, this.lastDdnsUpdateTime, true);\n }\n return this.intl.t('generic.unknown');\n }\n\n /**\n * Get the network status string. For example (generic.connected)\n */\n @computed('signalStrengthInfo.signalStrengthEnum', 'intl')\n get networkStatusString(): string | undefined {\n const { signalStrengthInfo, intl } = this;\n\n if (!signalStrengthInfo) {\n return;\n }\n\n let key;\n\n switch (signalStrengthInfo.signalStrengthEnum) {\n case Unknown:\n key = 'unknown';\n break;\n case NoSignal:\n key = 'offline';\n break;\n default:\n key = 'connected';\n break;\n }\n\n return intl.t(`generic.${key}`);\n }\n\n /**\n * Get the network details\n */\n @computed('networkStatusString', 'intl', 'signalStrengthInfo')\n get networkInfoDetails():\n | SimpleListItem<{ isEncrypted: boolean; frequencyBandIcon: string; signalStrengthEnum: SignalStrength }>[]\n | undefined {\n const { signalStrengthInfo, networkStatusString } = this;\n\n if (!signalStrengthInfo) {\n return;\n }\n\n return [\n new SimpleListItem({\n description: signalStrengthInfo.deviceSSID,\n details: networkStatusString,\n props: {\n isEncrypted: signalStrengthInfo.encryptionType !== encryptionTypeNoneString,\n frequencyBandIcon: getFrequencyIcon(signalStrengthInfo.frequencyBand),\n signalStrengthEnum: signalStrengthInfo.signalStrengthEnum\n }\n })\n ];\n }\n\n /**\n * Get the list items to display in the template.\n */\n @computed('intl', 'camera', 'signalStrengthInfo')\n get networkItems(): SimpleListItem[] {\n const {\n intl,\n signalStrengthInfo,\n connectionTypeString,\n frequencyBandString,\n lastDdnsUpdateDateString,\n camera\n } = this,\n listItems: SimpleListItem[] = [];\n\n const conditionalItems: ListItemConditionals[] = [\n {\n hasValue: signalStrengthInfo ? !!signalStrengthInfo.deviceSSID : false,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.networkName'),\n value: signalStrengthInfo ? signalStrengthInfo.deviceSSID : ''\n })\n },\n {\n hasValue: signalStrengthInfo\n ? signalStrengthInfo.connectionType !== ConnectionStatus.NotConnected\n : false,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.connectionType'),\n value: connectionTypeString\n })\n },\n {\n hasValue: signalStrengthInfo ? signalStrengthInfo.frequencyBand !== FrequencyBandEnum.None : false,\n listItem: new SimpleListItem({\n description: intl.t('generic.wifi.frequencyBand'),\n value: frequencyBandString\n })\n },\n {\n hasValue: signalStrengthInfo ? signalStrengthInfo.encryptionType !== encryptionTypeNoneString : false,\n listItem: new SimpleListItem({\n description: intl.tc(this, 'encryptionType'),\n value: signalStrengthInfo ? signalStrengthInfo.encryptionType : ''\n })\n },\n {\n hasValue: !!camera.publicIp,\n listItem: new SimpleListItem({\n description: intl.t('generic.video.publicIPAddress'),\n value: camera.publicIp\n })\n },\n {\n hasValue: !!camera.privateIp,\n listItem: new SimpleListItem({\n description: intl.t('generic.video.privateIPAddress'),\n value: camera.privateIp\n })\n },\n {\n hasValue: !!camera.port,\n listItem: new SimpleListItem({ description: intl.t('generic.video.port'), value: camera.port })\n },\n {\n hasValue: !!camera.httpsPort,\n listItem: new SimpleListItem({\n description: intl.t('generic.video.httpsPort'),\n value: camera.httpsPort\n })\n },\n {\n hasValue: !!camera.lastDdnsUpdateTime,\n listItem: new SimpleListItem({\n description: intl.tc(this, 'lastDDNSUpdate'),\n value: lastDdnsUpdateDateString\n })\n }\n ];\n\n conditionalItems.forEach((item) => {\n if (item.hasValue) {\n listItems.push(item.listItem);\n }\n });\n\n return listItems;\n }\n\n /**\n * Sets the resolvedModel and signalStrengthInfo objects.\n */\n @action\n async dataLoaded(resolvedModel: ResolvedModelFrom): Promise {\n this.resolvedModel = resolvedModel;\n this.signalStrengthInfo = await this.store.findRecord('video/signal-strength-info', resolvedModel.id);\n return;\n }\n\n /**\n * Transition to the advanced network setup and testing aspx page.\n */\n @action\n transitionToAdvancedNetworkSetupPage(): void {\n if (!this.resolvedModel) {\n return;\n }\n\n this.navigation.transitionToRouteId(VideoNetworkSettings, {\n queryParams: { deviceId: getDeviceId(this.resolvedModel.id) }\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/network-info': NetworkInfoController;\n }\n}\n","import { action, set } from '@ember/object';\nimport { EmberVideoSettingsNetworkInfo } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type { BaseSettingsCameraModel } from '../../route';\nimport type NetworkInfoController from './controller';\n\n// Model to be passed into page\nexport type NetworkRouteModel = {\n camera: Promise;\n id: string;\n videoSettingsPermission: Promise;\n};\n\n/**\n * @classdesc\n *\n * Network Info index page route.\n *\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsNetworkInfo;\n\n // model data\n /** @override */\n model(): NetworkRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n return {\n camera: model.camera,\n id: model.id,\n videoSettingsPermission: model.videoSettingsPermission\n };\n }\n\n /** @override */\n @action\n willTransition(transition: Transition): void {\n const controller = this.controller as NetworkInfoController;\n set(controller, 'signalStrengthInfo', null);\n\n super.actions.willTransition.call(this, transition);\n }\n}\n","import { EmberVideoSettingsNetworkInfo } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\n/**\n * @classdesc\n *\n * Network Info page route.\n *\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsNetworkInfo;\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsCamera } from 'customer-site/enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\n\n// parent model containing device and id\nexport interface BaseSettingsCameraModel {\n camera: ADCAsyncStoreFindRecord;\n id: string;\n videoSettingsPermission: ADCAsyncStoreFindRecord;\n}\n\n/**\n * @classdesc\n * The parent route for video settings.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoSettingsCamera;\n\n /** @override */\n model({ id_selected_camera }: { id_selected_camera: string }): BaseSettingsCameraModel {\n return {\n camera: this.store.findRecord('video/devices/camera', id_selected_camera),\n id: id_selected_camera,\n videoSettingsPermission: this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.contextManager.getSelectedSystemId()\n )\n };\n }\n}\n","import { action, computed, set } from '@ember/object';\nimport { alias, gte, gt, or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport BaseVideoConfigController from '../base-video-config-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\n/**\n * @classdesc\n * The Controller for Clip Length page.\n */\nexport default class ClipLengthController extends BaseVideoConfigController {\n @service declare intl: ADCIntlService;\n @service declare store: Store;\n @service declare identityManager: IdentityManager;\n\n declare model: ModelFrom;\n\n /**\n * Should we display the alarm clip length feature? Only display if it the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.alarmClipsDurationFeatureSupport', ReadOnly)\n declare shouldDisplayAlarmClipsDurationDropdown: boolean;\n\n /**\n * Should we display the camera-triggered clips length setting? Only display if the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.cameraTriggeredClipsFeatureSupport', ReadOnly)\n declare shouldDisplayCameraTriggeredClipsSetting: boolean;\n\n /**\n * Should we display the event-triggered clips length setting? Only display if the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.eventTriggeredClipsFeatureSupport', ReadOnly)\n declare shouldDisplayEventTriggeredClipsSetting: boolean;\n\n /**\n * Should we display the pre-trigger recording setting? Only display if the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.preTriggerRecordingFeatureSupport', ReadOnly)\n declare shouldDisplayPreTriggerRecordingSetting: boolean;\n\n /**\n * Should we display the clip length card? Only display if any features exist on the card.\n */\n @or(\n 'shouldDisplayAlarmClipsDurationDropdown',\n 'shouldDisplayCameraTriggeredClipsSetting',\n 'shouldDisplayEventTriggeredClipsSetting',\n 'shouldDisplayPreTriggerRecordingSetting'\n )\n declare shouldDisplayClipLengthCard: boolean;\n\n /**\n * The selected alarm clip length.\n */\n @alias('savedVideoSetting.selectedAlarmClipsDuration')\n declare selectedAlarmClipsDuration: number;\n\n /**\n * Should we display the warning message for alarm clips duration? Only display if the selected clip duration is greater than 5 minutes.\n */\n @gt('selectedAlarmClipsDuration', 5)\n declare shouldDisplayAlarmClipsDurationWarningMessage: boolean;\n\n /**\n * The selected camera-triggered clip length.\n */\n @alias('savedVideoSetting.selectedCameraTriggeredClipsDuration')\n declare selectedCameraTriggeredClipsDuration: number;\n\n /**\n * Whether pre-trigger recording enabled or not.\n */\n @alias('savedVideoSetting.isPreTriggerRecordingEnabled')\n declare isPreTriggerRecordingEnabled: boolean;\n\n /**\n * Should we display the save button? Only display if there are any modifiable settings on the page.\n */\n @or(\n 'shouldDisplayAlarmClipsDurationDropdown',\n 'shouldDisplayCameraTriggeredClipsSetting',\n 'shouldDisplayPreTriggerRecordingSetting'\n )\n declare shouldDisplaySaveButton: boolean;\n\n /**\n * The total number of cameras on the account.\n */\n @computed('identityManager')\n get numberOfCamerasOnAccount(): Promise {\n return (async () => {\n const system = await this.identityManager.getSelectedSystem(),\n cameraIds = system.hasMany('cameras').ids();\n return cameraIds.length;\n })();\n }\n\n /**\n * The warning message to display with calculated values for the cameras, minClips, maxClips, and totalClips.\n */\n @computed('selectedAlarmClipsDuration', 'numberOfCamerasOnAccount')\n get alarmClipsDurationWarningMessage(): Promise {\n return (async () => {\n const numCameras = (await this.numberOfCamerasOnAccount) as number,\n minClips = this.selectedAlarmClipsDuration,\n maxClips = Number(minClips) + 3,\n totalClips = (Number(minClips) + 1) * numCameras;\n return this.intl.tc(this, 'alarmClipLengthWarning', {\n numCameras,\n minClips,\n maxClips,\n totalClips\n });\n })();\n }\n\n /**\n * Get dropdown items for alarm clip length.\n */\n @computed('savedVideoSetting.alarmClipsDurationOptions')\n get alarmClipsDurationDropdownItems(): DropdownSelectItem[] {\n return this.savedVideoSetting.alarmClipsDurationOptions.map((option) => {\n return DropdownSelectItem.create({\n value: option.toString(),\n name: this.intl.t('generic.minutes', { num: option })\n });\n });\n }\n\n /**\n * Should we display the camera-triggered clips dropdown? Only display if there is more than one item in the dictionary.\n */\n @computed('savedVideoSetting.cameraTriggeredClipsDurationOptions')\n get shouldDisplayCameraTriggeredClipsDropdown(): boolean {\n return Object.keys(this.savedVideoSetting.cameraTriggeredClipsDurationOptions).length > 1;\n }\n\n /**\n * The dropdown items for the camera-triggered clips duration dropdown.\n */\n @computed('savedVideoSetting.cameraTriggeredClipsDurationOptions')\n get cameraTriggeredClipsDurationDropdownItems(): DropdownSelectItem[] {\n const dropdownItems: DropdownSelectItem[] = [];\n\n for (const [key, value] of Object.entries(this.savedVideoSetting.cameraTriggeredClipsDurationOptions)) {\n dropdownItems.push(\n DropdownSelectItem.create({\n value: key.toString(),\n name: value\n })\n );\n }\n\n return dropdownItems;\n }\n\n /**\n * Retrieves the value of the selected camera-triggered clip length from the cameraTriggeredClipsDurationOptions dictionary.\n * We need to retrieve this in order to display the duration range.\n */\n @computed('savedVideoSetting.{cameraTriggeredClipsDurationOptions,selectedCameraTriggeredClipsDuration}')\n get selectedCameraTriggeredClipsDurationText(): string {\n const { savedVideoSetting } = this,\n { cameraTriggeredClipsDurationOptions, selectedCameraTriggeredClipsDuration } = savedVideoSetting;\n\n return cameraTriggeredClipsDurationOptions[selectedCameraTriggeredClipsDuration];\n }\n\n /**\n * The string value for the event-triggered clip length input box.\n */\n @computed(\n 'savedVideoSetting.{maxSystemTriggeredClipDurationSec,minSystemTriggeredClipDurationSec,useFixedClipDurationLayout}'\n )\n get eventTriggeredClipLengthText(): string {\n const { savedVideoSetting, intl } = this,\n { minSystemTriggeredClipDurationSec, maxSystemTriggeredClipDurationSec } = savedVideoSetting;\n\n const maxSystemTriggeredClipDurationSecText = `${intl.t('generic.seconds', {\n num: maxSystemTriggeredClipDurationSec\n })}`;\n\n return this.savedVideoSetting.useFixedClipDurationLayout\n ? maxSystemTriggeredClipDurationSecText\n : `${minSystemTriggeredClipDurationSec}-` + maxSystemTriggeredClipDurationSecText;\n }\n\n /**\n * Depending on if this camera displays a single value or a range, we display different descriptions for event-triggered clips\n */\n @computed(\n 'savedVideoSetting.{minSystemTriggeredClipDurationSec,maxSystemTriggeredClipDurationSec,useFixedClipDurationLayout}'\n )\n get eventTriggeredClipLengthDescription(): string {\n const { savedVideoSetting, intl } = this,\n { minSystemTriggeredClipDurationSec, maxSystemTriggeredClipDurationSec } = savedVideoSetting;\n\n return this.savedVideoSetting.useFixedClipDurationLayout\n ? intl.tc(this, 'fixedEventTriggeredClipLengthDescription')\n : intl.tc(this, 'eventTriggeredClipLengthDescription', {\n minDuration: minSystemTriggeredClipDurationSec,\n maxDuration: maxSystemTriggeredClipDurationSec\n });\n }\n\n /**\n * The pre-trigger clip length dependent on if the camera has different\n * pre-trigger durations for event vs camera triggered recordings\n */\n @computed('savedVideoSetting.pretriggerDurations', 'shouldDisplayEventTriggeredClipsSetting')\n get getPreTriggerDurations(): string[] {\n const { savedVideoSetting, intl } = this,\n { pretriggerDurations } = savedVideoSetting;\n\n if (pretriggerDurations.length == 2 && this.shouldDisplayEventTriggeredClipsSetting) {\n return [\n intl.tc(this, 'fixedCamPreTriggerDuration', { camPreTriggerDuration: pretriggerDurations[0] }),\n intl.tc(this, 'fixedEventPreTriggerDuration', { eventPreTriggerDuration: pretriggerDurations[1] })\n ];\n }\n return [intl.t('generic.seconds', { num: pretriggerDurations[0] })];\n }\n\n /**\n * Change the selected clip limit duration.\n */\n @action\n changeAlarmClipsDurationOption(option: string): void {\n set(this.savedVideoSetting, 'selectedAlarmClipsDuration', Number(option));\n }\n\n /**\n * Change the selected clip limit duration.\n */\n @action\n changeCameraTriggeredClipsDurationOption(option: string): void {\n set(this.savedVideoSetting, 'selectedCameraTriggeredClipsDuration', Number(option));\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/clip-length': ClipLengthController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsClipLength } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type ClipLengthController from './controller';\n\n/**\n * @classdesc\n * Clip Length settings route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsClipLength;\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as ClipLengthController,\n { videoConfig, savedVideoSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n videoConfig.canUserEditVideoSettings,\n async () => {\n await saveSettings();\n },\n [videoConfig, savedVideoSetting]\n );\n }\n}\n","import { computed, action, set } from '@ember/object';\nimport { alias, gte, equal, or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport {\n Reduced,\n Fair,\n Good,\n Standard,\n Normal,\n Better,\n Highest,\n Excellent,\n Best\n} from 'customer-site/enums/ClipQualityResource';\nimport { ReadWrite, ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport BaseVideoConfigController from '../base-video-config-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\n/**\n * @classdesc\n * The Controller for Clip Quality page.\n */\nexport default class ClipQualityController extends BaseVideoConfigController {\n @service declare intl: ADCIntlService;\n\n declare model: ModelFrom;\n\n /**\n * Should we display the clip frame rate feature? Only display if it the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.clipFrameRateFeatureSupport', ReadOnly)\n declare shouldDisplayClipFrameRateCard: boolean;\n\n /**\n * Should we display the frame rate dropdown? Only display if the feature has ReadWrite support.\n */\n @equal('savedVideoSetting.clipFrameRateFeatureSupport', ReadWrite)\n declare shouldDisplayClipFrameRateDropdown: boolean;\n\n /**\n * Should we display the clip quality feature? Only display if it the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.clipQualityFeatureSupport', ReadOnly)\n declare shouldDisplayClipQualityCard: boolean;\n\n /**\n * The selected frame rate.\n */\n @alias('savedVideoSetting.selectedClipFrameRate')\n declare selectedClipFrameRate: number;\n\n /**\n * Should we display the clip quality feature? Only display if it the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.selectedClipQuality', ReadOnly)\n declare selectedClipQuality: boolean;\n\n /**\n * Should we display the save button? Only display if there are any modifiable features on the page.\n */\n @or('shouldDisplayClipFrameRateDropdown', 'shouldDisplayClipQualityCard')\n declare shouldDisplaySaveButton: boolean;\n\n /**\n * Get dropdown items for a camera's frame rate options.\n */\n @computed('savedVideoSetting.clipFrameRateOptions')\n get clipFrameRateDropdownItems(): DropdownSelectItem[] {\n return this.savedVideoSetting.clipFrameRateOptions.map((option) => {\n return DropdownSelectItem.create({\n value: option.toString(),\n name: this.intl.t('generic.video.numberFramesPerSecond', { numFrames: option })\n });\n });\n }\n\n /**\n * Clip Quality binary list items for the selected camera.\n */\n @computed('savedVideoSetting.{clipQualityOptions,selectedClipQuality}')\n get clipQualityBinaryListItems(): BinaryListItem<{ id: string; content?: string }>[] {\n const { clipQualityOptions, selectedClipQuality } = this.savedVideoSetting,\n { intl } = this,\n keys = Object.keys(clipQualityOptions),\n values = Object.values(clipQualityOptions),\n binaryListItems: BinaryListItem<{ id: string; content?: string }>[] = [],\n clipQualityResourceDictionary: Record = {\n [Reduced]: { label: intl.t('generic.reduced'), content: intl.t('generic.video.clipQualitySmallest') },\n [Standard]: { label: intl.t('generic.standard'), content: intl.t('generic.defaultNoParenthesis') },\n [Highest]: { label: intl.t('generic.highest'), content: intl.t('generic.video.clipQualityLargest') },\n [Fair]: { label: intl.t('generic.fair') },\n [Normal]: { label: intl.t('generic.normal') },\n [Excellent]: { label: intl.t('generic.quality.excellent') },\n [Good]: { label: intl.t('generic.quality.good') },\n [Better]: { label: intl.t('generic.better') },\n [Best]: { label: intl.t('generic.best') }\n };\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i],\n clipQualityResourceEnum = values[i];\n\n const { label, content } = clipQualityResourceDictionary[clipQualityResourceEnum];\n\n binaryListItems.push(\n new BinaryListItem({\n state: key === selectedClipQuality,\n props: { id: key, content },\n label\n })\n );\n }\n\n return binaryListItems.reverse();\n }\n\n /**\n * Update the selected clip frame rate value.\n */\n @action\n changeClipFrameRateOption(option: string): void {\n set(this.savedVideoSetting, 'selectedClipFrameRate', Number(option));\n }\n\n /**\n * Updates the selected clip quality option to the new selected option\n */\n @action\n onClipQualityOptionChange(settingOptions: BinaryListItem[]): void {\n const { id } = settingOptions.findBy('state')?.props as { id: string };\n\n set(this.savedVideoSetting, 'selectedClipQuality', id);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/clip-quality': ClipQualityController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsClipQuality } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type ClipQualityController from './controller';\n\n/**\n * @classdesc\n * Clip Quality settings route.\n */\nexport default class ClipQualityRoute extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsClipQuality;\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as ClipQualityController,\n { videoConfig, savedVideoSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n videoConfig.canUserEditVideoSettings,\n async () => {\n await saveSettings();\n },\n [videoConfig, savedVideoSetting]\n );\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, get } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport {\n EmberOvReadyRuleSettings,\n EmberVideoSettingsDigitalFov,\n EmberVideoRules\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Narrow, Wide } from 'customer-site/enums/FieldOfView';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type DigitalFovCamera from 'customer-site/models/video/devices/digital-fov-camera';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\ninterface FovOption {\n label: string;\n icon: string;\n}\n\n/**\n * @classdesc\n *\n * The controller for Digital Fov Settings page.\n */\nexport default class DigitalFovController extends Controller {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationService;\n\n declare model: ModelFrom;\n\n /**\n * Query params for live view page.\n */\n queryParams = ['relay'];\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n /**\n * A boolean query param that's passed in if the user is navigating to this page from MobileTech\n */\n external = false;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId: number = EmberVideoSettingsDigitalFov;\n\n /**\n * This contains promises that have been resolved from the model\n */\n @tracked resolvedModel?: Pick<\n ResolvedModelFrom,\n 'selectedFovCamera' | 'id' | 'forcedStreamingMethodFromQueryParam' | 'ovReadyCamera'\n >;\n\n /**\n * Is the FOV still updating?\n * Disable buttons/stream when true\n */\n @tracked updating = false;\n\n /**\n * If the first snapshot image is loading\n */\n @tracked firstSnapshotImageLoading = true;\n\n /**\n * The camera we are viewing the settings for\n */\n @alias('resolvedModel.selectedFovCamera')\n declare selectedFovCamera: DigitalFovCamera;\n\n /**\n * The camera we are viewing the settings for\n */\n @alias('resolvedModel.ovReadyCamera')\n declare ovReadyCamera: OvReadyCamera;\n\n /**\n * Reloads the video source and is set in setReloadStreamOnTimeoutMethod.\n */\n reloadStreamOnTimeout: () => void = () => {};\n\n /**\n * Returns info mapping for FOV options\n */\n get fovInfoMapping(): Map {\n return new Map([\n [Narrow, { label: this.intl.tc(this, 'optimizedLabel'), icon: 'video-pt-center' }],\n [Wide, { label: this.intl.tc(this, 'expandedLabel'), icon: 'video-fullscreen' }]\n ]);\n }\n\n /**\n * We want to use snapshots if we're in a mobile context, either from the app or mobiletech\n */\n @computed('identityManager.isMobileApp', 'external')\n get shouldUseSnapshots(): boolean {\n return this.identityManager.isMobileApp || this.external;\n }\n\n /**\n * Only show the Review Rules button if the camera has rules\n */\n @computed('ovReadyCamera.ovRules')\n get hasOvRules(): Promise {\n return (async () => {\n const ovCameraRules = await this.ovReadyCamera.ovRules;\n return ovCameraRules.length > 0;\n })();\n }\n\n /**\n * Returns the BinaryListItems for the FOV selection buttons\n */\n @computed('fovInfoMapping', 'selectedFovCamera.fieldOfView', 'updating')\n get options(): BinaryListItem[] {\n return this.selectedFovCamera.get('supportedFieldOfViews').map((fov: number) => {\n const fovInfo = this.fovInfoMapping.get(fov) as FovOption;\n return new BinaryListItem({\n label: fovInfo.label,\n state: fov === this.selectedFovCamera.get('fieldOfView'),\n icon: fovInfo.icon,\n props: {\n fieldOfView: fov\n }\n });\n });\n }\n\n /**\n * Sets reloadStreamOnTimeout equal to the method passed in from the fov-player component\n */\n @action setReloadStreamOnTimeoutMethod(method: () => void): void {\n this.reloadStreamOnTimeout = method;\n }\n\n /**\n * Action called when a new FOV button is selected\n * @param options the options that make up the FOV buttons\n */\n @action async selectOption(options: DigitalFovController['options']): Promise {\n this.reloadStreamOnTimeout();\n this.updating = true;\n const camera = this.selectedFovCamera;\n const { fieldOfView } = options.find((item) => get(item, 'state'))?.props as { fieldOfView: number };\n\n camera.set('fieldOfView', fieldOfView);\n camera\n .save()\n .then(() => {\n this.notificationManager.addSuccess(this.intl.tc(this, 'updateSuccessMessage'));\n })\n .catch((error: any) => {\n camera.rollbackAttributes();\n this.notificationManager.addError(error.errors.errors[0].detail);\n })\n .finally(() => (this.updating = false));\n }\n\n /**\n * Transitions to the rules page when clicked\n */\n @action clickReviewRules(): void {\n if (this.ovReadyCamera.hasMaxRules && this.ovReadyCamera.maxNumberOfOvRules === 1) {\n const firstRule = get(this.ovReadyCamera.get('ovRules'), 'firstObject');\n if (firstRule) {\n this.navigation.transitionToRouteId(EmberOvReadyRuleSettings, undefined, undefined, firstRule.id);\n }\n } else {\n this.navigation.transitionToRouteId(EmberVideoRules, { queryParams: { globalDeviceId: this.model.id } });\n }\n }\n\n /**\n * Called whenever the snapshot image is loaded and when we retry.\n */\n @action\n async imageLoad(): Promise {\n this.firstSnapshotImageLoading = false;\n const snapshot = await this.selectedFovCamera.snapshot;\n snapshot.reloadSnapshotLater(1000);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/digital-fov': DigitalFovController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsDigitalFov } from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type ForcedStreamingMethodEnum from 'customer-site/enums/ForcedStreamingMethod';\nimport type DigitalFovCamera from 'customer-site/models/video/devices/digital-fov-camera';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type { BaseSettingsCameraModel } from '../../route';\n\nexport interface DigitalFovSettingsRouteModel {\n id: string;\n forcedStreamingMethodFromQueryParam: ForcedStreamingMethodEnum;\n ovReadyCamera: ADCAsyncStoreFindRecord;\n selectedFovCamera: ADCAsyncStoreFindRecord;\n}\n\n/**\n * Video Settings Redesign Digital Fov Settings page.\n */\nexport default class DigitalFovSettingsRoute extends AdcBaseRoute {\n routeId = EmberVideoSettingsDigitalFov;\n\n /** @override */\n queryParams = {\n external: getQueryParam('boolean'),\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n model({ relay }: { relay?: string }): DigitalFovSettingsRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera'),\n id = model.id;\n\n return {\n id,\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(relay),\n selectedFovCamera: this.store.findRecord('video/devices/digital-fov-camera', id),\n ovReadyCamera: this.store.findRecord('video/devices/ov-ready-camera', id)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed, set } from '@ember/object';\nimport { alias, reads, or, not, and, equal, gte } from '@ember/object/computed';\nimport { service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { EmberVideoSettingsImage } from 'customer-site/enums/CustomerPageUrl';\nimport { Low, Normal, High } from 'customer-site/enums/IRSwitchSensitivity';\nimport { ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { isAdapterErrorProcessingError } from '@adc/ajax/utils/status-codes';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { InfraredLightStatus } from 'customer-site/enums/IRSwitchSensitivity';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type ImageSetting from 'customer-site/models/video/settings/image-setting';\nimport type InfraredSetting from 'customer-site/models/video/settings/infrared-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * Maps the night vision enum type to translation key\n * @param nightVisionType\n * @returns\n */\nfunction getNightVisionText(nightVisionType: InfraredLightStatus): string {\n let nightVisionTranslation = '';\n switch (nightVisionType) {\n case Low:\n nightVisionTranslation = 'generic.low';\n break;\n case Normal:\n nightVisionTranslation = 'generic.normal';\n break;\n case High:\n nightVisionTranslation = 'generic.high';\n break;\n }\n return nightVisionTranslation;\n}\n\n/**\n * @classdesc\n * The Controller for Image Settings page\n */\nexport default class ImageSettingsController extends EmberController {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page\n */\n settingsPageId = EmberVideoSettingsImage;\n\n /**\n * This contains promises that have been resolved from the model\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * Is this page currently being accessed on the mobile app?\n */\n @alias('contextManager.identityModel.isMobileApp')\n declare isMobileApp: boolean;\n\n /**\n * The camera model\n */\n @alias('resolvedModel.camera')\n declare camera: BaseCamera;\n\n /**\n * The image setting for the device\n */\n @reads('resolvedModel.imageSetting')\n declare imageSetting: ImageSetting;\n\n /**\n * The infrared setting for the device\n */\n @reads('imageSetting.infraredSetting')\n declare infraredSetting: InfraredSetting;\n\n /**\n * Is the image orientation flipped?\n */\n @alias('imageSetting.isFlipped')\n declare isFlipped: boolean;\n\n /**\n * The brightness for the camera\n */\n @alias('imageSetting.brightness')\n declare brightness: number;\n\n /**\n * The contrast for the camera\n */\n @alias('imageSetting.contrast')\n declare contrast: number;\n\n /**\n * The sharpness for the camera\n */\n @alias('imageSetting.sharpness')\n declare sharpness: number;\n\n /**\n * The saturation for the camera\n */\n @alias('imageSetting.saturation')\n declare saturation: number;\n\n /**\n * Is the web onscreen display enabled?\n */\n @alias('imageSetting.isWebOsdEnabled')\n declare isWebOsdEnabled: boolean;\n\n /**\n * Is the infrared LED enabled?\n */\n @alias('infraredSetting.isInfraredLedEnabled')\n declare isInfraredLedEnabled: boolean;\n\n /**\n * Is the night vision setting enabled?\n */\n @alias('infraredSetting.isNightVisionEnabled')\n declare isNightVisionEnabled: boolean;\n\n /**\n * Is HDR (high dynamic range) enabled?\n */\n @alias('imageSetting.isHdrEnabled')\n declare isHdrEnabled: boolean;\n\n /**\n * The current max exposure option.\n */\n @alias('imageSetting.maxExposure')\n declare selectedMaxExposure: number;\n\n /**\n * The current infrared night vision sensitivity setting.\n */\n @alias('infraredSetting.infraredSensitivity')\n declare selectedNightVisionSensitivity: InfraredLightStatus;\n\n /**\n * Should we disable the night vision toggle? Disabled when infrared LED is turned on because night vision is on by default\n */\n @and('infraredSetting.{canControlInfraredLeds,canControlNightVision,isInfraredLedEnabled}')\n declare shouldDisableNightVisionToggle: boolean;\n\n /**\n * Should we show the image orientation card?\n */\n @or('imageSetting.{canFlipImage,canSetWebOsd}')\n declare shouldDisplayImageOrientationCard: boolean;\n\n /**\n * Should we show the advanced image settings card?\n */\n @or(\n 'infraredSetting.{canControlInfraredLeds,canControlNightVision,canControlInfraredSensitivity,canSetMaxExposure}',\n 'shouldDisplayHdrToggle'\n )\n declare shouldDisplayAdvancedImageSettingsCard: boolean;\n\n /**\n * Should we show the image quality card?\n */\n @or(\n 'imageSetting.canSetBrightness',\n 'imageSetting.canSetSaturation',\n 'imageSetting.canSetContrast',\n 'imageSetting.canSetSharpness'\n )\n declare shouldShowImageQualityCard: boolean;\n\n /**\n * Should we show the save button and the reset defaults buttons?\n */\n @or('shouldDisplayImageOrientationCard', 'shouldShowImageQualityCard', 'shouldDisplayAdvancedImageSettingsCard')\n declare shouldDisplayUpdateSettingsButtons: boolean;\n\n /**\n * Should we disable the save button and reset defaults buttons?\n * Only disable if the user does not have edit permissions.\n */\n @not('imageSetting.canUserEditVideoSettings')\n declare shouldDisableUpdateSettingsButtons: boolean;\n\n /**\n * Should we display the HDR toggle?\n * Only display if the support value is at least ReadOnly.\n */\n @gte('imageSetting.canSetHdr', ReadOnly)\n declare shouldDisplayHdrToggle: boolean;\n\n /**\n * Should we disable the HDR toggle?\n * Only disable if the support value is ReadOnly.\n */\n @equal('imageSetting.canSetHdr', ReadOnly)\n declare shouldDisableHdrToggle: boolean;\n\n /**\n * The night vision dropdown options\n */\n @computed('intl')\n get nightVisionSensitivityOptions(): DropdownSelectItem[] {\n const nightVisionSensitivityOptions = [Low, Normal, High],\n dropdownItems: DropdownSelectItem[] = [];\n\n nightVisionSensitivityOptions.forEach((item: InfraredLightStatus) => {\n dropdownItems.push(\n DropdownSelectItem.create({\n name: this.intl.t(getNightVisionText(item)),\n value: item.toString()\n })\n );\n });\n\n return dropdownItems;\n }\n\n /**\n * The max exposure dropdown items\n */\n @computed('intl', 'imageSetting.{maxExposure,maxExposureOptions}')\n get maxExposureOptions(): DropdownSelectItem[] {\n const { intl, imageSetting } = this,\n { automaticMaxExposure, supportsAutomaticExposure, maxExposureOptions } = imageSetting,\n dropdownItems: DropdownSelectItem[] = [];\n\n // Get the list of exposure options\n // If the device supports automatic exposure, then the option would be \"Automatic\"\n for (let i = 0; i < maxExposureOptions.length; i++) {\n const exposureOptionIsAutomatic = i == 0 && supportsAutomaticExposure,\n optionText = maxExposureOptions[i].toString(),\n exposureText = optionText === automaticMaxExposure.toString() ? optionText : `1/${optionText}`;\n\n dropdownItems.push(\n DropdownSelectItem.create({\n value: optionText,\n name: exposureOptionIsAutomatic\n ? intl.t('generic.automatic')\n : intl.tc(this, 'second', { secondText: exposureText })\n })\n );\n }\n\n return dropdownItems;\n }\n\n /**\n * Change the selected infrared night vision option.\n */\n @action\n changeNightVisionSensitivity(option: string): void {\n set(this.infraredSetting, 'infraredSensitivity', Number(option) as InfraredLightStatus);\n }\n\n /**\n * Change the selected max exposure option.\n */\n @action\n changeMaxExposure(option: string): void {\n set(this.imageSetting, 'maxExposure', Number(option));\n }\n\n /**\n * Flips the infrared led toggle.\n */\n @action\n changeInfraredLedToggle(): void {\n const { infraredSetting } = this,\n { isInfraredLedEnabled, canControlNightVision } = infraredSetting,\n newIrLedEnabledSetting = !isInfraredLedEnabled;\n\n set(infraredSetting, 'isInfraredLedEnabled', newIrLedEnabledSetting);\n\n // If the user can control night vision, and the infrared led is toggled on, we turn on night vision automatically\n if (canControlNightVision && newIrLedEnabledSetting) {\n set(infraredSetting, 'isNightVisionEnabled', true);\n }\n }\n\n /**\n * Update image quality slider values.\n * We do this to avoid a glitchy stutter effect when the user drags the slider\n * @param {keyof} modelKey The key for the image setting model.\n * @param {number} newValue What's the new value the user just slided to.\n * @param {boolean} isFromSlider Is the new value from the slider?\n * @param {boolean} isMouseUp Has the mouse up event occurred as if the user is satisfied with their slide selection?\n */\n @action\n onSliderChange(modelKey: keyof ImageSetting, newValue: number, isFromSlider: boolean, isMouseUp: boolean): void {\n // Only update the value once the user is done sliding to avoid jitter.\n if (!isFromSlider || !isMouseUp) {\n return;\n }\n\n this.imageSetting.set(modelKey, newValue);\n }\n\n /**\n * Action for restoring the default image settings values.\n */\n @action\n async restoreDefaults(): Promise {\n const { intl, notificationManager } = this;\n\n return this.ajax\n .apiRequest(\n `video/settings/imageSettings/${this.resolvedModel?.id}/restoreDefaults`,\n undefined,\n this.imageSetting,\n POST\n )\n .then(() => {\n this.imageSetting.reload();\n return notificationManager.addSuccess(intl.t('generic.video.deviceSettingsSavedSuccessfully'));\n })\n .catch((ex) => {\n notificationManager.addError(getErrorText(ex) ?? intl.t('generic.video.failedToUpdateVideoDevice'));\n return Promise.reject();\n });\n }\n\n /**\n * Save the camera's image settings to the camera and DB.\n */\n @action\n async saveSettings(): Promise {\n const { intl, imageSetting, notificationManager } = this;\n\n return imageSetting\n .save()\n .then(() => notificationManager.addSuccess(intl.t('generic.video.deviceSettingsSavedSuccessfully')))\n .catch((ex) => {\n if (!isAdapterErrorProcessingError(ex)) {\n notificationManager.addError(getErrorText(ex) ?? intl.t('generic.video.failedToUpdateVideoDevice'));\n }\n\n return Promise.reject();\n });\n }\n\n /**\n * Called whenever the snapshot image is loaded and when we retry.\n */\n @action\n async imageLoad(): Promise {\n const snapshot = await this.camera.snapshot;\n snapshot.reloadSnapshotLater(1000);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/image-setting': ImageSettingsController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsImage } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type ImageSetting from 'customer-site/models/video/settings/image-setting';\nimport type { BaseSettingsCameraModel } from '../../route';\nimport type ImageSettingsController from './controller';\n\n// Model to be passed into page\nexport type ImageSettingRouteModel = {\n camera: Promise;\n id: string;\n imageSetting: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n *\n * Image Settings.\n *\n */\nexport default class ImageSettingsRoute extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsImage;\n\n // model data\n /** @override */\n model(): ImageSettingRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n return {\n camera: model.camera,\n id: model.id,\n imageSetting: this.store.findRecord('video/settings/image-setting', model.id)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as ImageSettingsController,\n { imageSetting, infraredSetting, saveSettings } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n imageSetting.canUserEditVideoSettings,\n async () => {\n await saveSettings();\n },\n [imageSetting, infraredSetting]\n );\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n
\\n {{! @glint-nocheck clipDonationAgreement is async so we need to await it before loading the legal agreement text }}\\n {{safe-html this.contextManager.identityModel.clipDonationAgreement.legalAgreement}}\\n
\\n
\\n\",{ moduleName: \"customer-site/components/modals/video/clip-donation-legal-agreement/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { getModalFooterButton } from '@adc/ui-components/components/modals/base/footer/modal-footer';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { ModalButtonConfig } from '@adc/ui-components/components/modals/base/footer/modal-footer';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface ClipDonationLegalAgreementArgs {\n model: {\n acceptButtonAction(): Promise;\n declineButtonAction(): void;\n };\n}\n\n/**\n * @classdesc\n * A component for donating any number of video clips for analytics feedback.\n */\n@intlPath({ path: 'modals/video/clip-donation-legal-agreement' })\nexport default class ClipDonationLegalAgreementComponent extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n @computed('args.model.{acceptButtonAction,declineButtonAction}')\n get buttons(): ModalButtonConfig[] {\n const noButton = getModalFooterButton(\n this.intl.t('generic.no'),\n () => this.args.model.declineButtonAction(),\n 'no-button',\n false\n ),\n yesButton = getModalFooterButton(\n this.intl.t('generic.yes'),\n () => this.args.model.acceptButtonAction(),\n 'btn-color-primary',\n false\n );\n\n return [noButton, yesButton];\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Modals::Video::ClipDonationLegalAgreement': typeof ClipDonationLegalAgreementComponent;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, computed, set } from '@ember/object';\nimport { alias, equal, gte, or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport ClipDonationLegalAgreementComponent from 'customer-site/components/modals/video/clip-donation-legal-agreement/index';\nimport { Calibrated } from 'customer-site/enums/CalibrationStatus';\nimport {\n Low,\n LowDefault,\n StandardDefinition,\n Medium,\n MediumDefault,\n Hd,\n High,\n FullHd,\n FourMp\n} from 'customer-site/enums/ClipResolutionResource';\nimport {\n Unknown,\n EmberAlertsIssuesTroubleCondition,\n EmberVideoCameraCalibrate,\n EmberVideoFamiliarSubjectsEnrollment,\n EmberVideoFamiliarVehicles,\n EmberVideoFamiliarFaces,\n EmberVideoPrivacyZonesSettings,\n EmberVideoSettingsPrivacyZones,\n EmberVideoSdCardSettings,\n EmberVideoSettingsClipLength,\n EmberVideoSettingsClipQuality,\n EmberVideoSettingsImage,\n EmberVideoSettingsSdCardInfo,\n EmberVideoSettingsThirdPartyStream,\n EmberVideoStreamSettings,\n EmberVideoSettingsVarifocalFov,\n EmberVideoSettingsDigitalFov,\n EmberVideoDigitalFovSettings,\n EmberVideoVarifocalFovSettings,\n EmberVideoSettingsMotionConfiguration\n} from 'customer-site/enums/CustomerPageUrl';\nimport FamiliarSubjectSettingsLinkTypeEnum from 'customer-site/enums/FamiliarSubjectSettingsLinkType';\nimport { Version1 } from 'customer-site/enums/MotionDetectionVersionEnum';\nimport {\n VeryLow as MotionThresholdVeryLow,\n Low as MotionThresholdLow,\n Medium as MotionThresholdMedium,\n High as MotionThresholdHigh,\n VeryHigh as MotionThresholdVeryHigh,\n ExtremelyHigh as MotionThresholdExtremelyHigh\n} from 'customer-site/enums/MotionThreshold';\nimport { QualityOnly } from 'customer-site/enums/ResolutionQualityItemType';\nimport {\n SensorLowBattery_RechargeableVideoDevice,\n SensorLowBattery_CriticalRechargeableVideoDevice\n} from 'customer-site/enums/TroubleConditionSubType';\nimport {\n VideoDeviceLowVoltageShutdown,\n SensorLowBattery,\n VideoDeviceHighTemperatureCutoff,\n VideoDeviceLowTemperatureCutoff,\n VideoDeviceLowBatteryAndLowTemperatureAlert\n} from 'customer-site/enums/TroubleConditionType';\nimport { Standard, Good, Better, Excellent } from 'customer-site/enums/VideoQualityEnum';\nimport { ReadOnly } from 'customer-site/enums/VideoSettingsFeatureSupport';\nimport { getDeviceId } from 'customer-site/utils/device';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\nimport BaseVideoConfigController from '../base-video-config-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { SvgSymbolSignature } from '@adc/svg-system/components/svg-symbol';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type TroubleCondition from 'customer-site/models/trouble-conditions/trouble-condition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type DoorbellVideoConfig from 'customer-site/models/video/settings/doorbell-video-config';\nimport type LiveVideoConfig from 'customer-site/models/video/settings/live-video-config';\nimport type PirVideoConfig from 'customer-site/models/video/settings/pir-video-config';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type TroubleConditionsService from 'customer-site/services/trouble-conditions';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\n/**\n * Value that represents Unlimited clips\n */\nconst UNLIMITED_DAYS = -1;\n\n/**\n * The list of possible battery trouble conditions.\n */\nconst BatteryTroubleConditions = [\n VideoDeviceLowVoltageShutdown,\n SensorLowBattery,\n VideoDeviceHighTemperatureCutoff,\n VideoDeviceLowTemperatureCutoff,\n VideoDeviceLowBatteryAndLowTemperatureAlert\n];\n\n/**\n * Helper function to get the motion threshold tick translated text from the motion threshold min and max values.\n *\n * @param motionThresholdValue The motion threshold value we are getting translated text for.\n * @returns\n */\nfunction getMotionThresholdTickTextFromValue(this: VideoConfigController, motionThresholdValue: number): string {\n let resourceKey;\n\n switch (motionThresholdValue) {\n case MotionThresholdVeryLow:\n resourceKey = 'veryLow';\n break;\n case MotionThresholdLow:\n resourceKey = 'low';\n break;\n case MotionThresholdMedium:\n resourceKey = 'medium';\n break;\n case MotionThresholdHigh:\n resourceKey = 'high';\n break;\n case MotionThresholdVeryHigh:\n resourceKey = 'veryHigh';\n break;\n case MotionThresholdExtremelyHigh:\n resourceKey = 'extremelyHigh';\n break;\n default:\n resourceKey = 'unknown';\n break;\n }\n\n return this.intl.t(`generic.${resourceKey}`);\n}\n\n/**\n * Get the doorbell video quality option text, returns a string array with button label and sublabel\n */\nfunction getDoorbellVideoQualityOptionText(intl: ADCIntlService, option: number) {\n let optionLabel = '',\n optionSubLabel = '';\n switch (option) {\n case Excellent:\n optionLabel = '1080p';\n optionSubLabel = intl.t('generic.video.videoQuality.excellent');\n break;\n case Better:\n optionLabel = '720p';\n optionSubLabel = intl.t('generic.video.videoQuality.better');\n break;\n case Good:\n optionLabel = '720p';\n optionSubLabel = intl.t('generic.video.videoQuality.good');\n break;\n case Standard:\n optionLabel = '480p';\n optionSubLabel = intl.t('generic.video.videoQuality.standard');\n break;\n default:\n break;\n }\n\n return { optionLabel, optionSubLabel };\n}\n\n/**\n * @classdesc\n * The Controller for Video Config page.\n */\nexport default class VideoConfigController extends BaseVideoConfigController {\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare media: ADCResponsiveMediaService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare troubleConditions: TroubleConditionsService;\n\n declare model: ModelFrom;\n\n //#region Page Enums\n /**\n * Page enum for Camera Calibration settings page.\n */\n EmberVideoCameraCalibrate = EmberVideoCameraCalibrate;\n\n /**\n * Page enum for SD card settings page.\n */\n EmberVideoSdCardSettings = EmberVideoSdCardSettings;\n\n /**\n * Page enum for Privacy Zones settings page.\n */\n EmberVideoPrivacyZonesSettings = EmberVideoPrivacyZonesSettings;\n\n /**\n * Page enum for the internal beta Privacy Zones page.\n */\n EmberVideoSettingsPrivacyZones = EmberVideoSettingsPrivacyZones;\n\n /**\n * Page enum for the motion configuration settings page.\n */\n EmberVideoSettingsMotionConfiguration = EmberVideoSettingsMotionConfiguration;\n\n /**\n * Page enum for Clip Length settings page.\n */\n EmberVideoSettingsClipLength = EmberVideoSettingsClipLength;\n\n /**\n * Page enum for Clip Quality settings page.\n */\n EmberVideoSettingsClipQuality = EmberVideoSettingsClipQuality;\n\n /**\n * Page enum for Image settings page.\n */\n EmberVideoSettingsImage = EmberVideoSettingsImage;\n\n /**\n * Page enum for SD Card Info page.\n */\n EmberVideoSettingsSdCardInfo = EmberVideoSettingsSdCardInfo;\n\n /**\n * Page enum for VSR Third Party Stream settings page.\n */\n EmberVideoSettingsThirdPartyStream = EmberVideoSettingsThirdPartyStream;\n\n /**\n * Page enum for legacy Third Party Stream settings page.\n */\n EmberVideoStreamSettings = EmberVideoStreamSettings;\n\n //#endregion\n\n /**\n * is the user currently trying to edit the clip comment?\n */\n @tracked isChangingCommentsActionSheetOpened = false;\n\n /**\n * is the user currently trying to view info about calibration images?\n */\n @tracked isCalibrationImagesActionSheetOpened = false;\n\n /**\n * The text in the action sheet, which will be assigned to the donateClipComments when the users presses DONE\n */\n @tracked commentText = '';\n\n /**\n * Does this customer have permission to view video settings upgrades?\n */\n @or('identityManager.identityModel.hasInternalBetaAccess', 'videoSettingsPermission.hasVideoSettingsUpgrades')\n declare hasVideoSettingsUpgradesPermissions: boolean;\n\n /**\n * The camera model.\n */\n @alias('resolvedModel.camera')\n declare camera: BaseCamera;\n\n /**\n * The videoSettingsPermission model.\n */\n @alias('resolvedModel.videoSettingsPermission')\n declare videoSettingsPermission: VideoSettingsPermission;\n\n /**\n * The doorbell video settings for the device.\n */\n @alias('videoConfig.doorbellVideoConfig')\n declare doorbellVideoConfig: DoorbellVideoConfig;\n\n /**\n * The PIR video settings for the device.\n */\n @alias('videoConfig.pirVideoConfig')\n declare pirVideoConfig: PirVideoConfig;\n\n /**\n * The selected clip resolution for the device.\n */\n @alias('savedVideoSetting.selectedClipResolution')\n declare selectedClipResolution: string;\n\n /**\n * The selected doorbell quality option for the device. (only skybell for now)\n */\n @alias('doorbellVideoConfig.selectedDoorbellVideoOption')\n declare selectedDoorbellVideoOption: number;\n\n /**\n * The selected motion detection option\n */\n @alias('doorbellVideoConfig.selectedMotionDetectionOption')\n declare selectedMotionDetectionOption: number;\n\n /**\n * Should we display the motion detection dropdown?\n * If the device doesn't have a selected motion option we should hide the dropdown\n */\n @gte('doorbellVideoConfig.selectedMotionDetectionOption', Version1)\n declare shouldDisplayMotionDetectionOptions: boolean;\n\n /**\n * Should we display the motion threshold slider? Only display if it the support is at least ReadOnly.\n */\n @gte('doorbellVideoConfig.motionThresholdSliderFeatureSupport', ReadOnly)\n declare shouldDisplayMotionThresholdSlider: boolean;\n\n /**\n * The motion threshold value of the doorbell camera.\n */\n @alias('doorbellVideoConfig.motionThresholdValue')\n declare motionThresholdValue: number;\n\n /**\n * Should we display the Skybell motion settings card?\n */\n @or('shouldDisplayMotionDetectionOptions', 'shouldDisplayMotionThresholdSlider')\n declare shouldDisplaySkybellMotionSettingsCard: boolean;\n\n /**\n * The live video settings for the device.\n */\n @alias('resolvedModel.videoConfig.liveVideoConfig')\n declare liveVideoConfig: LiveVideoConfig;\n\n /**\n * Should we display the keep clips feature? Only display if it the support is at least ReadOnly.\n */\n @gte('savedVideoSetting.keepClipsForFeatureSupport', ReadOnly)\n declare shouldDisplayKeepClipsForFeature: boolean;\n\n /**\n * The donate clips enable disable feature support enum (ReadWrite, ReadOnly, DoesNotSupport).\n */\n @gte('savedVideoSetting.donateClipsFeatureSupport', ReadOnly)\n declare shouldDisplayDonateClips: boolean;\n\n /**\n * The donate images enable disable feature support enum (ReadWrite, ReadOnly, DoesNotSupport).\n */\n @gte('savedVideoSetting.donateCalibrationImagesFeatureSupport', ReadOnly)\n declare shouldDisplayDonateImages: boolean;\n\n /**\n * Should we display the saved clips card\n */\n @or('shouldDisplayKeepClipsForFeature', 'shouldDisplayDonateClips', 'shouldDisplayDonateImages')\n declare shouldDisplaySavedClipsCard: boolean;\n\n /**\n * The current selected day option of the device.\n */\n @alias('savedVideoSetting.selectedKeepClipsDays')\n declare selectedKeepClipsDays: number;\n\n /**\n * Should we display the Calibrate Video Device and SD Card Info card?\n */\n @or('videoConfig.shouldDisplayCalibrateCameraLink', 'videoConfig.shouldDisplaySdCardInfoLink')\n declare shouldDisplayCalibrateCameraAndSdCardInfoCard: boolean;\n\n /**\n * Should we display the live video resolution selection options?\n */\n @or('liveVideoConfig.selectedWebOption', 'liveVideoConfig.selectedMobileOption')\n declare shouldDisplayLiveVideoSettingsOptions: boolean;\n\n /**\n * Should we display the Live Video card?\n */\n @or(\n 'videoConfig.shouldDisplayFovLink',\n 'videoConfig.shouldDisplayPrivacyZonesLink',\n 'videoConfig.shouldDisplayImageSettingsLink',\n 'shouldDisplayLiveVideoSettingsOptions',\n 'videoConfig.shouldDisplayThirdPartyStreamLink'\n )\n declare shouldDisplayLiveVideoCard: boolean;\n\n /**\n * Should we display the save button? Only display if there are any editable features on the page.\n */\n @or(\n 'shouldDisplayLiveVideoConnectionFeature',\n 'shouldDisplayClipResolutionDropdown',\n 'shouldDisplayKeepClipsForFeature',\n 'shouldDisplayMotionLedToggle',\n 'shouldDisplayPirMotionSensitivitySlider',\n 'shouldDisplayLiveVideoSettingsOptions',\n 'shouldDisplayMotionDetectionOptions',\n 'shouldDisplayMotionThresholdSlider',\n 'shouldDisplayDirectStreamingToggle'\n )\n declare shouldDisplaySaveButton: boolean;\n\n /*\n * Should we display the live video connection feature? Only display if it the support is at least ReadOnly.\n */\n @alias('liveVideoConfig.doesSupportLiveVideoConnection')\n declare shouldDisplayLiveVideoConnectionFeature: boolean;\n\n /**\n * Is the live video connection currently enabled for the video device?\n */\n @alias('liveVideoConfig.isLiveVideoConnectionEnabled')\n declare isLiveVideoConnectionEnabled: boolean;\n\n /**\n * Does the device only support quality options?\n */\n @equal('liveVideoConfig.liveVideoSettingType', QualityOnly)\n declare onlySupportsQualityOptions: boolean;\n\n /**\n * Is direct streaming currently enabled for this device?\n */\n @alias('doorbellVideoConfig.isSpeedUpLocalNetworkConnectionEnabled')\n declare isSpeedUpLocalNetworkConnectionEnabled: boolean;\n\n /**\n * Is donating clips currently enabled for the video device?\n */\n @alias('savedVideoSetting.isDonateClipsEnabled')\n declare isDonateClipsEnabled: boolean;\n\n /**\n * Is donating images currently enabled for the video device?\n */\n @alias('savedVideoSetting.isDonateCalibrationImagesEnabled')\n declare isDonateCalibrationImagesEnabled: boolean;\n\n /**\n * The donated clip comment of what this device sees\n */\n @alias('savedVideoSetting.donatedClipComments')\n declare donatedClipComments: string;\n\n /**\n * Should we display the clip settings card?\n */\n @or('shouldDisplayClipResolutionDropdown', 'shouldDisplayClipLengthSettingsLink')\n declare shouldDisplayClipSettingsCard: boolean;\n\n /**\n * Should we display the clip resolution dropdown feature?\n */\n @gte('savedVideoSetting.clipResolutionFeatureSupport', ReadOnly)\n declare shouldDisplayClipResolutionDropdown: boolean;\n\n /**\n * Should we disable the clip resolution dropdown?\n */\n @equal('savedVideoSetting.clipResolutionFeatureSupport', ReadOnly)\n declare shouldDisableClipResolutionDropdown: boolean;\n\n /**\n * Should we display the video quality options for doorbell\n */\n @gte('doorbellVideoConfig.doorbellVideoQualityFeatureSupport', ReadOnly)\n declare shouldDisplayDoorbellVideoQualityOptions: boolean;\n\n /**\n * Should we display the PIR motion LED toggle?\n */\n @gte('pirVideoConfig.pirTriggerLedFeatureSupport', ReadOnly)\n declare shouldDisplayMotionLedToggle: boolean;\n\n /**\n * Is the PIR motion led currently enabled?\n */\n @alias('pirVideoConfig.isPirTriggerLedEnabled')\n declare isMotionLedEnabled: boolean;\n\n /**\n * Should we display the PIR motion sensitivity slider?\n */\n @gte('pirVideoConfig.pirMotionSensitivityFeatureSupport', ReadOnly)\n declare shouldDisplayPirMotionSensitivitySlider: boolean;\n\n /**\n * The current PIR motion senstivity value.\n */\n @alias('pirVideoConfig.pirMotionSensitivityValue')\n declare pirMotionSensitivityValue: number;\n\n /**\n * Should we display the PIR settings card?\n */\n @or('shouldDisplayMotionLedToggle', 'shouldDisplayPirMotionSensitivitySlider')\n declare shouldDisplayPirSettingsCard: boolean;\n\n /**\n * Should we display the Direct Streaming Toggle?\n */\n @gte('doorbellVideoConfig.directStreamingFeatureSupport', ReadOnly)\n declare shouldDisplayDirectStreamingToggle: boolean;\n\n /**\n * Labeled calibration image image path.\n */\n @computed('')\n get calibrationImagePath(): string {\n return this.contextManager.getStaticResourcePath('webimages/calibration-snapshot.png');\n }\n\n /**\n * The trouble condition notifications array.\n */\n @computed('troubleConditions.troubleNotifications.[]')\n get troubleNotifications(): AppNotification[] {\n return this.troubleConditions.troubleNotifications;\n }\n\n /**\n * Should we display the battery icon and trouble condition page link?\n * Only display if the user has state of charge permission and their battery has a trouble condition.\n */\n @computed('videoConfig.hasStateOfChargePermission', 'batteryTroubleCondition')\n get shouldDisplayBatteryIconAndLink(): boolean {\n return !!this.batteryTroubleCondition && this.videoConfig.hasStateOfChargePermission;\n }\n\n /**\n * The last time the battery level of the camera was updated (local time) in the format MM/dd/yyyy, HH:mm:ss.\n */\n @computed('videoConfig.lastBatteryStateUpdateDateUtc')\n get lastBatteryStateUpdateDateLocal(): string {\n return this.intl.formatDateTz(this.videoConfig.lastBatteryStateUpdateDateUtc, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n /**\n * Should we display the clip length settings link?\n * Only display if the user has internal beta access and there is at least one setting displayed on that page.\n */\n @computed(\n 'savedVideoSetting.{alarmClipsDurationFeatureSupport,cameraTriggeredClipsFeatureSupport,eventTriggeredClipsFeatureSupport,preTriggerRecordingFeatureSupport}'\n )\n get shouldDisplayClipLengthSettingsLink(): boolean {\n const { savedVideoSetting } = this;\n return (\n (savedVideoSetting.alarmClipsDurationFeatureSupport ||\n savedVideoSetting.cameraTriggeredClipsFeatureSupport ||\n savedVideoSetting.eventTriggeredClipsFeatureSupport ||\n savedVideoSetting.preTriggerRecordingFeatureSupport) >= ReadOnly\n );\n }\n\n /**\n * Should we display the clip quality settings link?\n * Only display if the user has internal beta access and there is at least one setting displayed on that page.\n */\n @computed('savedVideoSetting.{clipQualityFeatureSupport,clipFrameRateFeatureSupport}')\n get shouldDisplayClipQualitySettingsLink(): boolean {\n const { savedVideoSetting } = this,\n { clipQualityFeatureSupport, clipFrameRateFeatureSupport } = savedVideoSetting;\n\n return (clipQualityFeatureSupport || clipFrameRateFeatureSupport) >= ReadOnly;\n }\n\n /**\n * The device ID of the camera.\n */\n @computed('resolvedModel.id')\n get deviceId(): number | undefined {\n return this.resolvedModel && Number(getDeviceId(this.resolvedModel.id));\n }\n\n /**\n * The battery's trouble condition (based on priority).\n */\n @computed('troubleConditions.allTroubles.[]', 'videoConfig.batteryLevel', 'deviceId')\n get batteryTroubleCondition(): TroubleCondition | undefined {\n if (!this.troubleConditions.allTroubles) {\n this.troubleConditions.refresh();\n }\n\n const currentDeviceTroubles = this.troubleConditions.allTroubles?.filter(\n (trouble) =>\n trouble.deviceId === this.deviceId && BatteryTroubleConditions.includes(trouble.troubleConditionType)\n );\n let troubleCondition: TroubleCondition | undefined;\n\n if (currentDeviceTroubles) {\n const tcPriorityMapping: number[] = currentDeviceTroubles.map((trouble) => {\n switch (trouble.troubleConditionType) {\n case VideoDeviceLowVoltageShutdown:\n return 1;\n case VideoDeviceLowTemperatureCutoff:\n return 2;\n case VideoDeviceHighTemperatureCutoff:\n return 2;\n case VideoDeviceLowBatteryAndLowTemperatureAlert:\n return 3;\n case SensorLowBattery:\n return 4;\n }\n return 100;\n }),\n highestPriorityIndex = tcPriorityMapping.indexOf(Math.min(...tcPriorityMapping));\n\n troubleCondition = currentDeviceTroubles[highestPriorityIndex];\n }\n\n return troubleCondition;\n }\n\n /**\n * The battery's trouble condition SVG.\n */\n @computed('batteryTroubleCondition')\n get batteryTroubleConditionSvg(): string {\n const { batteryTroubleCondition } = this;\n\n switch (batteryTroubleCondition?.troubleConditionType) {\n case VideoDeviceLowVoltageShutdown:\n return 'battery-no-data';\n case VideoDeviceLowTemperatureCutoff:\n return 'battery-cold-weather';\n case VideoDeviceHighTemperatureCutoff:\n return 'thermostats-issues';\n case VideoDeviceLowBatteryAndLowTemperatureAlert:\n return 'battery-cold-weather';\n case SensorLowBattery:\n switch (batteryTroubleCondition.troubleConditionSubType) {\n case SensorLowBattery_RechargeableVideoDevice:\n return 'battery-1';\n case SensorLowBattery_CriticalRechargeableVideoDevice:\n return 'battery-0';\n }\n }\n\n return '';\n }\n\n /**\n * The color of the battery trouble condition icon.\n */\n @computed('batteryTroubleCondition.troubleConditionType')\n get batteryIconColor(): SvgSymbolSignature['Args']['fillColor'] {\n return this.batteryTroubleCondition?.troubleConditionType === VideoDeviceLowTemperatureCutoff\n ? 'cyanblue'\n : 'red';\n }\n\n /**\n * Load camera as OVReady camera and check its calibration status\n */\n @computed('camera.id')\n get wasCalibrationSuccessful(): Promise {\n return (async () => {\n const ovCam = await this.store.findRecord('video/devices/ov-ready-camera', this.camera.id);\n return ovCam.calibrationStatus?.value === Calibrated;\n })();\n }\n\n /**\n * The motion threshold minimum and maximum tick text.\n */\n @computed('doorbellVideoConfig.{motionThresholdMin,motionThresholdMax}')\n get motionThresholdTickText(): { minText: string; maxText: string } {\n return {\n minText: getMotionThresholdTickTextFromValue.call(this, this.doorbellVideoConfig.motionThresholdMin),\n maxText: getMotionThresholdTickTextFromValue.call(this, this.doorbellVideoConfig.motionThresholdMax)\n };\n }\n\n /**\n * Options to list in the clip resolution options dropdown.\n */\n @computed('intl', 'savedVideoSetting.clipResolutionOptions')\n get clipResolutionDropdownItems(): DropdownSelectItem[] {\n const { intl, savedVideoSetting } = this,\n { clipResolutionOptions } = savedVideoSetting,\n keys = Object.keys(clipResolutionOptions)\n .map((key) => Number(key))\n .sort()\n .reverse(),\n dropdownSelectItemsList = [];\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i],\n value = clipResolutionOptions[key];\n let name;\n\n switch (key) {\n case Low:\n name = `${intl.t('generic.low')} - ${value}`;\n break;\n case LowDefault:\n name = `${intl.t('generic.low')} - ${value} ${intl.t('generic.default')}`;\n break;\n case StandardDefinition:\n name = `${intl.t('generic.video.resolutions.standardDefinition')} - ${value}`;\n break;\n case Medium:\n name = `${intl.t('generic.medium')} - ${value}`;\n break;\n case MediumDefault:\n name = `${intl.t('generic.medium')} - ${value} ${intl.t('generic.default')}`;\n break;\n case Hd:\n name = `${intl.t('generic.video.resolutions.highDefinition')} - ${value}`;\n break;\n case High:\n name = `${intl.t('generic.high')} - ${value}`;\n break;\n case FullHd:\n name = `${intl.t('generic.video.resolutions.fullHighDefinition')} - ${value}`;\n break;\n case FourMp:\n name = `${intl.t('generic.video.resolutions.fourMegapixel')} - ${value}`;\n break;\n default:\n break;\n }\n\n dropdownSelectItemsList.push(\n DropdownSelectItem.create({\n value,\n name\n })\n );\n }\n\n return dropdownSelectItemsList;\n }\n\n /**\n * Days options for keep clips for feature\n */\n @computed('videoConfig.savedVideoSetting.keepClipsDaysOptions')\n get keepClipsDaysDropdownItems(): DropdownSelectItem[] {\n const { videoConfig } = this,\n savedVideoSetting = videoConfig?.savedVideoSetting,\n keepClipsDaysDropdownItems = savedVideoSetting.keepClipsDaysOptions || [];\n\n return keepClipsDaysDropdownItems.map((option) => {\n return DropdownSelectItem.create({\n value: option.toString(),\n name:\n option === UNLIMITED_DAYS\n ? this.intl.t('generic.unlimited')\n : this.intl.t('generic.days', { num: option })\n });\n });\n }\n\n /**\n * Web options\n */\n @computed('onlySupportsQualityOptions', 'liveVideoConfig.{selectedWebOption,webOptions}')\n get webOptionsItems(): BinaryListItem[] {\n const { webOptions, selectedWebOption } = this.liveVideoConfig;\n let radioItems: BinaryListItem[] = [];\n if (webOptions) {\n radioItems = Object.keys(webOptions).map((id) => {\n return new BinaryListItem({\n state: id === selectedWebOption,\n props: { id, optionType: 'selectedWebOption' },\n label: webOptions[id]\n });\n });\n // Image quality options are serialized in ascending order from backend\n if (this.onlySupportsQualityOptions) {\n radioItems.reverse();\n }\n }\n return radioItems;\n }\n\n /**\n * Mobile Options\n */\n @computed('liveVideoConfig.{mobileOptions,selectedMobileOption}')\n get mobileOptionsItems(): BinaryListItem<{ id: string; optionType: string }>[] {\n const { mobileOptions, selectedMobileOption } = this.liveVideoConfig;\n let radioItems: BinaryListItem<{ id: string; optionType: string }>[] = [];\n if (mobileOptions) {\n radioItems = Object.keys(mobileOptions).map((id) => {\n return new BinaryListItem({\n state: id === selectedMobileOption,\n props: { id, optionType: 'selectedMobileOption' },\n label: mobileOptions[id]\n });\n });\n }\n return radioItems;\n }\n\n /**\n * Doorbell Video Options\n */\n @computed('doorbellVideoConfig.{doorbellVideoOptions,selectedDoorbellVideoOption}')\n get doorbellVideoOptions(): BinaryListItem<{ id: number; content: string }>[] {\n const { doorbellVideoOptions, selectedDoorbellVideoOption } = this.doorbellVideoConfig,\n { intl } = this;\n\n return doorbellVideoOptions.map((id) => {\n // get the text for the option button\n const optionText = getDoorbellVideoQualityOptionText(intl, id);\n\n return new BinaryListItem({\n state: id === selectedDoorbellVideoOption,\n props: { id, content: optionText['optionSubLabel'] },\n label: optionText['optionLabel']\n });\n });\n }\n\n /**\n * Get dropdown items for skybell motion detection\n */\n @computed('doorbellVideoConfig.motionDetectionOptions')\n get motionDectionDropdownItems(): DropdownSelectItem[] {\n const { doorbellVideoConfig } = this,\n { motionDetectionOptions } = doorbellVideoConfig;\n\n return motionDetectionOptions.map((option) => {\n return DropdownSelectItem.create({\n value: option.toString(),\n name: option.toFixed(1).toString()\n });\n });\n }\n\n /**\n * Should we display the familiar subject link? Only display if the customer has at least one enrollment.\n */\n @computed('videoConfig.familiarSubjectLinkType')\n get shouldDisplayFamiliarSubjectLink(): boolean {\n return this.videoConfig.familiarSubjectLinkType !== FamiliarSubjectSettingsLinkTypeEnum.None;\n }\n\n /**\n * The familiar subject link title.\n */\n @computed('videoConfig.familiarSubjectLinkType')\n get familiarSubjectLinkTitle(): string {\n const { intl } = this;\n\n switch (this.videoConfig.familiarSubjectLinkType) {\n case FamiliarSubjectSettingsLinkTypeEnum.Vehicle:\n return intl.t('generic.video.familiarVehicles');\n case FamiliarSubjectSettingsLinkTypeEnum.Face:\n return intl.t('generic.video.familiarFace');\n case FamiliarSubjectSettingsLinkTypeEnum.VehicleAndFace:\n return intl.t('generic.video.familiarFaceAndVehicles');\n default:\n return '';\n }\n }\n\n //#region Actions\n\n /**\n * Hides the trouble condition notifications on the mobile app (since the app does not support the Alerts and Issues paget yet).\n * This is a temporary fix for the trouble conditions banners appearing on the page. Fix for root cause will be done in VID-62989.\n */\n @action\n hideTroubleConditionsOnMobileApp(): void {\n const { contextManager, troubleNotifications } = this;\n\n if (contextManager.identityModel.isMobileApp && troubleNotifications.length > 0) {\n troubleNotifications.forEach((n) => this.notificationManager.removeNotification(n));\n }\n }\n\n /**\n * Navigate to a specific settings page from the navigational row.\n *\n * @param pageEnum The settings page to transition to.\n */\n @action\n navigateToSettingsPage(pageEnum: number): void {\n this.navigation.transitionToRouteId(pageEnum, this.resolvedModel?.id);\n }\n\n /**\n * Navigate to the battery's trouble condition page.\n */\n @action\n navigateToBatteryTroubleConditionPage(): void {\n this.batteryTroubleCondition &&\n this.navigation.transitionToRouteId(EmberAlertsIssuesTroubleCondition, this.batteryTroubleCondition?.id);\n }\n\n /**\n * Navigate to the field of view page.\n * Remove in VID-69401 for release\n */\n @action\n navigateToFieldOfViewPage(): void {\n const fieldOfViewPageEnum = this.camera.isDigitalFovCamera\n ? this.hasVideoSettingsUpgradesPermissions\n ? EmberVideoSettingsDigitalFov\n : EmberVideoDigitalFovSettings\n : this.hasVideoSettingsUpgradesPermissions\n ? EmberVideoSettingsVarifocalFov\n : EmberVideoVarifocalFovSettings;\n\n this.navigation.transitionToRouteId(fieldOfViewPageEnum, this.resolvedModel?.id);\n }\n\n /**\n * Navigate to the correct familiar subject page based on the enrollment(s) the customer has.\n */\n @action\n async navigateToFamiliarSubjectPage(): Promise {\n let routeEnum = Unknown;\n\n switch (this.videoConfig.familiarSubjectLinkType) {\n case FamiliarSubjectSettingsLinkTypeEnum.Vehicle:\n routeEnum = EmberVideoFamiliarVehicles;\n break;\n case FamiliarSubjectSettingsLinkTypeEnum.Face:\n routeEnum = EmberVideoFamiliarFaces;\n break;\n case FamiliarSubjectSettingsLinkTypeEnum.VehicleAndFace:\n routeEnum = EmberVideoFamiliarSubjectsEnrollment;\n break;\n }\n\n this.navigation.transitionToRouteId(routeEnum);\n }\n\n /**\n * Navigate to the motion configuration page using the VSR query param to display the new design\n */\n @action\n navigateToMotionConfigurationPage(): void {\n this.navigation.transitionToRouteId(EmberVideoSettingsMotionConfiguration, this.resolvedModel?.id, {\n queryParams: { isVSR: true }\n });\n }\n\n /**\n * The user's inputted text fills the text input on the action sheet when typing\n */\n @action\n updateInput(newValue: string) {\n this.commentText = newValue;\n }\n\n /**\n * Make sure the outer text input is synced with the inner text input in action sheet\n */\n @action syncComments() {\n this.donatedClipComments = this.commentText;\n //This closes the action sheet\n this.isChangingCommentsActionSheetOpened = false;\n }\n\n /**\n * Opening action sheet and blurring the page's text input so that the user can type into the action sheet on mobile.\n */\n @action\n clickIntoActionSheet() {\n const { isMobile } = this.media;\n if (isMobile) {\n //This opens the action sheet\n this.isChangingCommentsActionSheetOpened = true;\n //syncs the action sheet text input to what's on the page so that it's not empty when a user reloads\n this.commentText = this.donatedClipComments;\n const focusedElement = document.activeElement;\n //Removing the focus from the text input on the page so that the user may refocus on the text input on the action sheet\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur();\n }\n }\n }\n\n /**\n * Update the pirSensitivityValue when the user changes the slider.\n */\n @action\n onPirMotionSensitivityValueChange(newValue: number, isFromSlider: boolean, isMouseUp: boolean): void {\n // If the mouse isn't done sliding from the slider, then don't update the value yet.\n // We need to check for this since we are setting the minimum value to a non-zero value.\n // Otherwise, the slider will always be the minimum value greater than what the user set it to.\n if (!isFromSlider || !isMouseUp) {\n return;\n }\n\n this.pirMotionSensitivityValue = newValue;\n }\n\n /**\n * Update the motionThresholdValue when the user changes the slider.\n */\n @action\n onMotionThresholdValueChange(newValue: number, isFromSlider: boolean, isMouseUp: boolean): void {\n // If the mouse isn't done sliding from the slider, then don't update the value yet.\n // We need to check for this since we are setting the minimum value to a non-zero value.\n // Otherwise, the slider will always be the minimum value greater than what the user set it to.\n if (!isFromSlider || !isMouseUp) {\n return;\n }\n\n this.motionThresholdValue = newValue;\n }\n\n /**\n * Updates the selected option to the new selected option\n */\n @action\n onLiveVideoOptionChange(settingOptions: BinaryListItem[]): void {\n const { id, optionType } = settingOptions.findBy('state')?.props as {\n id: string;\n optionType: keyof LiveVideoConfig;\n };\n\n set(this.liveVideoConfig, optionType, id);\n }\n\n /**\n * Change the selected motion detection option.\n */\n @action\n changeMotionDetectionOption(option: string): void {\n set(this.doorbellVideoConfig, 'selectedMotionDetectionOption', Number(option));\n }\n\n /**\n * Change the selected clip limit duration.\n */\n @action\n changeClipLimitDurationOption(option: string): void {\n set(this.savedVideoSetting, 'selectedKeepClipsDays', Number(option));\n }\n\n /**\n * Updates the selected doorbell quality option to the new selected option\n */\n @action\n onDoorbellQualityOptionChange(settingOptions: BinaryListItem[]): void {\n const { id } = settingOptions.findBy('state')?.props as { id: number };\n\n set(this.doorbellVideoConfig, 'selectedDoorbellVideoOption', id);\n }\n\n /**\n * Action upon toggling the donate clips setting.\n */\n @action\n onDonateClipsToggleChange(): void {\n set(this, 'isDonateClipsEnabled', !this.isDonateClipsEnabled);\n if (this.isDonateClipsEnabled && !this.isDonateCalibrationImagesEnabled) {\n this.displayClipDonationLegalAgreementModal();\n }\n }\n\n /**\n * Action upon toggling the donate calibration images setting.\n */\n @action\n onDonateImagesToggleChange(): void {\n set(this, 'isDonateCalibrationImagesEnabled', !this.isDonateCalibrationImagesEnabled);\n if (this.isDonateCalibrationImagesEnabled && !this.isDonateClipsEnabled) {\n this.displayClipDonationLegalAgreementModal();\n }\n }\n\n /**\n * Action to display the clip donation legal agreement modal.\n */\n @action\n displayClipDonationLegalAgreementModal(): void {\n this.modals.showModal(ClipDonationLegalAgreementComponent, {\n acceptButtonAction: async () => {\n await this.ajax.apiRequest('api/video/clipDonationAgreements/acceptAgreement', undefined, null, POST);\n },\n declineButtonAction: () => {\n set(this, 'isDonateClipsEnabled', false);\n set(this, 'isDonateCalibrationImagesEnabled', false);\n }\n });\n }\n\n /**\n * Action to refresh the battery info.\n */\n @action\n async refreshBatteryInfo(): Promise {\n try {\n await this.ajax.apiRequest(`api/video/settings/videoConfigs/${this.videoConfig.id}/refreshBatteryInfo`);\n await this.videoConfig.reload();\n this.troubleConditions.refresh();\n } catch (ex) {\n this.notificationManager.addError(getErrorText(ex) || this.intl.tc(this, 'requestBatteryLevelFailed'));\n return Promise.reject();\n }\n }\n\n //#endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/index': VideoConfigController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoSettingsVideoConfiguration } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type VideoConfigIndexController from './controller';\n\n/**\n * @classdesc\n * Video Configs settings route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsVideoConfiguration;\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as VideoConfigIndexController,\n { videoConfig, liveVideoConfig, savedVideoSetting, doorbellVideoConfig, pirVideoConfig, saveSettings } =\n controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n videoConfig.canUserEditVideoSettings,\n async () => {\n await saveSettings();\n },\n [videoConfig, savedVideoSetting, liveVideoConfig, doorbellVideoConfig, pirVideoConfig]\n );\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { isMobileBrowser } from '@adc/ember-utils/utils/browser-helpers';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { reads, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { Drawing } from 'customer-site/components/video/rules/draw-window/index';\nimport { EmberVideoPrivacyZonesSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { Rectangle } from 'customer-site/enums/DrawShape';\nimport {\n MAXIMUM_NUMBER_OF_PRIVACY_ZONE_POINTS,\n MAXIMUM_NUMBER_OF_RECTANGLE_POINTS,\n computeRectanglePoints,\n getRectangleCorners\n} from 'customer-site/utils/analytics-shape-validation';\nimport { reject } from 'rsvp';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type ArrayProxy from '@ember/array/proxy';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type PrivacyZone from 'customer-site/models/video/privacy-zone';\nimport type PrivacyZonesSetting from 'customer-site/models/video/privacy-zones-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type PrivacyZonesRoute from './route';\n\n/**\n * Action sheet types on this page. Either none, info, or best practices.\n */\nenum ActionSheetTypes {\n None,\n Info,\n BestPractices\n}\n\n/**\n * Represents the maximum number of privacy zones that can be stored on a camera.\n */\nconst MAX_NUM_PRIVACY_ZONES = 3;\n\n/**\n * The controller for the Privacy Zones Settings page.\n */\nexport default class PrivacyZonesControllerV2 extends EmberController {\n //# region Services\n\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n\n //# endregion\n\n declare model: ModelFrom;\n\n /**\n * This contains promises that have been resolved from the model.\n *\n * @todo This should not use declare, it should be optional because it doesn't exist for some period of time.\n */\n @tracked declare resolvedModel: Pick<\n ResolvedModelFrom,\n 'camera' | 'forcedStreamingMethodFromQueryParam' | 'privacyZonesSetting' | 'ovRules'\n >;\n\n /**\n * The action sheet that is currently open. (ActionSheetTypes.none if none are open)\n */\n @tracked actionSheetTypeOpen = ActionSheetTypes.None;\n\n /**\n * Should we show the privacy zones info action sheet?\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.Info)\n declare shouldShowPrivacyZonesInfoActionSheet: boolean;\n\n /**\n * Should we show the best practices action sheet?\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.BestPractices)\n declare shouldShowBestPracticesActionSheet: boolean;\n\n /**\n * The unitId-deviceId of the camera.\n */\n @reads('model.id')\n declare globalDeviceId: string;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoPrivacyZonesSettings;\n\n /**\n * The privacy zones settings for the camera.\n */\n @reads('resolvedModel.privacyZonesSetting')\n declare privacyZonesSetting: PrivacyZonesSetting;\n\n /**\n * Any OvRules established for the camera.\n */\n @reads('resolvedModel.ovRules')\n declare ovRules: ArrayProxy;\n\n /**\n * The shape of the privacy zones that we're drawing.\n */\n @reads('privacyZonesSetting.privacyZoneShape')\n declare selectedShape: number;\n\n /**\n * Whether the user can edit privacy zones.\n */\n @reads('privacyZonesSetting.canEditPrivacyZones')\n declare canEditPrivacyZones: boolean;\n\n /**\n * Whether all privacy zones should be enabled.\n */\n @tracked allDrawingsEnabled = true;\n\n /**\n * The privacy zone drawings which are passed to the DrawWindow.\n */\n @tracked dictionaryOfDrawings: Record = {\n 0: new Drawing(),\n 1: new Drawing(),\n 2: new Drawing()\n };\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n /**\n * A 2D list of points that represent the coordinates of the Privacy Zones.\n * Displayed in a hidden field on the settings page for use in testing.\n */\n @computed('dictionaryOfDrawings')\n get privacyZoneCoordinates(): string {\n const { dictionaryOfDrawings } = this;\n const zoneIndexes = Object.keys(dictionaryOfDrawings).map((index) => parseInt(index));\n\n return `[${zoneIndexes.map(\n (index) =>\n `${index}: [${dictionaryOfDrawings[index].points.map((point) => `(${point.x},${point.y})`).join()}]`\n )}]`;\n }\n\n /**\n * The analytics zones that we want to discourage the user from drawing privacy zones in.\n */\n @computed('ovRules')\n get warningZones(): Record[][] {\n const ovRuleZones = this.ovRules.map((rule) => rule.points);\n for (let i = 0; i < ovRuleZones.length; i++) {\n // Some OV rules may not contain any points if they are from a full-view analytics rule.\n // In this case, set the warning zone to be a rectangle that encompasses the whole screen.\n if (ovRuleZones[i].length == 0) {\n ovRuleZones[i] = [\n { x: 0.0, y: 0.0 },\n { x: 1.0, y: 0.0 },\n { x: 1.0, y: 1.0 },\n { x: 0.0, y: 1.0 }\n ];\n }\n }\n\n return ovRuleZones;\n }\n\n /**\n * This will override the maximum number of points that can be drawn on the DrawWindow.\n */\n @computed('selectedShape')\n get maxPoints(): number {\n return this.selectedShape === Rectangle\n ? MAXIMUM_NUMBER_OF_RECTANGLE_POINTS\n : MAXIMUM_NUMBER_OF_PRIVACY_ZONE_POINTS;\n }\n\n /**\n * This will override the editShapeInstructions when adjusting a pre-existing shape on the DrawWindow.\n */\n @computed('canEditPrivacyZones')\n get editShapeInstructions(): string | null {\n return this.canEditPrivacyZones\n ? this.intl.tc(\n this,\n isMobileBrowser() ? 'instructionsMovePrivacyZoneMobile' : 'instructionsMovePrivacyZone'\n )\n : null;\n }\n\n /**\n * This will override the instructions when drawing a new shape on the DrawWindow.\n */\n @computed('canEditPrivacyZones')\n get newShapeInstructions(): string | null {\n if (!this.canEditPrivacyZones) {\n return null;\n }\n\n const drawWindowResources = 'components.video.rules.draw-window',\n drawNewShape = this.intl.t(\n `${drawWindowResources}.${isMobileBrowser() ? 'drawNewShapeMobile' : 'drawNewShape'}`\n ),\n customShape = this.intl.tc(this, 'instructionsCreatePrivacyZone'),\n customShapeFinish = this.intl.t(`${drawWindowResources}.instructionsCustomShapeFinish`);\n\n return `${drawNewShape} ${customShape} ${customShapeFinish}`;\n }\n\n /**\n * Check if any privacy zones attributes changed. If so, display unsaved changes modal.\n * VID-68898: Figure out a way to check if the values of the points changed.\n */\n checkIfPrivacyZonesAttributesChanged(privacyZonesSetting: PrivacyZonesSetting): boolean {\n const changedAttributes = privacyZonesSetting.changedAttributes(),\n privacyZonesChangedAttributes = changedAttributes.privacyZones;\n\n if (privacyZonesChangedAttributes) {\n const [oldPrivacyZonesAttributes, newPrivacyZonesAttributes] = privacyZonesChangedAttributes;\n\n const oldPrivacyZonesKeys = Object.keys(oldPrivacyZonesAttributes),\n newPrivacyZonesKeys = Object.keys(newPrivacyZonesAttributes);\n\n if (oldPrivacyZonesKeys.length !== newPrivacyZonesKeys.length) {\n return true;\n }\n\n for (const oldKey of oldPrivacyZonesKeys) {\n const oldPrivacyZones = oldPrivacyZonesAttributes[oldKey],\n newPrivacyZones = newPrivacyZonesAttributes[oldKey];\n\n if (\n !newPrivacyZones ||\n oldPrivacyZones.points.length !== newPrivacyZones.points.length ||\n oldPrivacyZones.enabled !== newPrivacyZones.enabled\n ) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Update the privacy zones setting model with the dictionary of privacy zones to save.\n */\n updatePrivacyZonesSettingWithDictionaryOfDrawings(): void {\n const { allDrawingsEnabled, selectedShape } = this;\n\n const drawings = Object.keys(this.dictionaryOfDrawings).map((index) => parseInt(index)),\n dictionaryOfPrivacyZonesToSave: Record = {};\n\n drawings.forEach((index) => {\n let points = this.dictionaryOfDrawings[index].points;\n\n // There's no need to pass down an empty array of points.\n if (points.length) {\n if (selectedShape === Rectangle) {\n points = getRectangleCorners(points);\n }\n\n dictionaryOfPrivacyZonesToSave[index] = this.store.createRecord('video/privacy-zone', {\n points,\n enabled: allDrawingsEnabled\n });\n }\n });\n\n const { privacyZonesSetting } = this.resolvedModel;\n privacyZonesSetting.privacyZones = dictionaryOfPrivacyZonesToSave;\n }\n\n /**\n * Saves the privacy zones.\n */\n async save(): Promise {\n const { dictionaryOfDrawings, globalDeviceId, notificationManager } = this,\n allDrawingIndexes = Object.keys(dictionaryOfDrawings).map((index) => parseInt(index)),\n allDrawingsCompletedOrEmpty = allDrawingIndexes.every((index) => {\n const drawing = dictionaryOfDrawings[index];\n\n return drawing.drawingCompleted || !drawing.points.length;\n });\n\n if (!allDrawingsCompletedOrEmpty) {\n // If the unsaved changes modal is open, close it so that the user can stay on the page and finish their drawing.\n this.modals.closeModal();\n notificationManager.addError(this.intl.tc(this, 'completeOrClearShapesToSave'));\n return reject();\n }\n\n this.updatePrivacyZonesSettingWithDictionaryOfDrawings();\n\n try {\n await this.resolvedModel.privacyZonesSetting.save();\n const snapshot = this.store.peekRecord('video/snapshot', globalDeviceId);\n\n // Unload the snapshot so it's forced to reload and show the new privacy zone.\n if (snapshot) {\n snapshot.unloadRecord();\n }\n return notificationManager.addSuccess(this.intl.tc(this, 'savedSuccessfully'));\n } catch (response) {\n return notificationManager.addError(response.errors[0].detail);\n }\n }\n\n //# region Actions\n\n /**\n * When all the promises in the model have been resolved, store them in resolvedModel.\n * Also initialize the dictionaryOfDrawings with the privacy zone data.\n */\n @action\n dataLoaded(\n model: Pick<\n ResolvedModelFrom,\n 'camera' | 'forcedStreamingMethodFromQueryParam' | 'privacyZonesSetting' | 'ovRules'\n >\n ): void {\n this.resolvedModel = model;\n\n const { privacyZones, privacyZoneShape, someZonesEnabled } = this.privacyZonesSetting,\n indexes = [...Array(MAX_NUM_PRIVACY_ZONES).keys()],\n dictionaryOfDrawings: Record = {};\n\n indexes.forEach((index) => {\n const privacyZone = privacyZones[index];\n let points;\n\n if (privacyZone) {\n points = privacyZone.points;\n\n // If the shape is a rectangle, compute the four vertices of the rectangle\n // from the two corner points provided from the backend.\n if (privacyZoneShape === Rectangle) {\n points = computeRectanglePoints(points);\n }\n }\n\n dictionaryOfDrawings[index] = new Drawing(points, undefined, undefined);\n });\n\n // Consider all the drawings enabled if at least one zone is enabled, or if no zones exist.\n this.allDrawingsEnabled = someZonesEnabled || !Object.keys(privacyZones).length;\n this.dictionaryOfDrawings = dictionaryOfDrawings;\n\n if (!Object.keys(privacyZones).length || !someZonesEnabled) {\n this.actionSheetTypeOpen = ActionSheetTypes.Info;\n }\n }\n\n /**\n * Toggles whether the drawings are enabled.\n */\n @action\n onToggleDrawingsEnabled(): void {\n this.allDrawingsEnabled = !this.allDrawingsEnabled;\n }\n\n @action\n openBestPracticesActionSheet(): void {\n this.actionSheetTypeOpen = ActionSheetTypes.BestPractices;\n }\n\n /**\n * Close the action sheet.\n */\n @action\n closeActionSheet(): void {\n this.actionSheetTypeOpen = ActionSheetTypes.None;\n }\n\n /**\n * This is triggered when a user clicks the 'Save' button.\n */\n @action\n async onSave(): Promise {\n const { identityManager, intl, modals } = this,\n { isSectorDealer } = identityManager;\n\n // Sector dealers want users to confirm before saving.\n if (await isSectorDealer) {\n modals.showConfirmationDialog(\n intl.t('generic.warning'),\n intl.tc(this, 'sectorConfirmationModalDescription'),\n { action: async () => await this.save() }\n );\n\n return;\n }\n\n return this.save();\n }\n\n /**\n * Check if the privacy zones settings attributes changed.\n */\n @action\n onCheckPrivacyZonesAttributesChanged(): boolean {\n this.updatePrivacyZonesSettingWithDictionaryOfDrawings();\n\n return this.checkIfPrivacyZonesAttributesChanged(this.resolvedModel.privacyZonesSetting);\n }\n\n //# endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/privacy-zones': PrivacyZonesControllerV2;\n }\n}\n","import ArrayProxy from '@ember/array/proxy';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport {\n EmberVideoSettingsPrivacyZones,\n EmberVideoSettingsVideoConfiguration\n} from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\nimport BaseVideoSettingsRoute from '../../base-settings-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type ForcedStreamingMethodEnum from 'customer-site/enums/ForcedStreamingMethod';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type PrivacyZonesSetting from 'customer-site/models/video/privacy-zones-setting';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { BaseSettingsCameraModel } from '../../route';\nimport type PrivacyZonesControllerV2 from './controller';\n\nexport type VideoSettingsPrivacyZoneModel = {\n camera: Promise;\n forcedStreamingMethodFromQueryParam: ForcedStreamingMethodEnum;\n id: string;\n relay?: string;\n privacyZonesSetting: Promise;\n ovRules: Promise>;\n};\n\ntype VideoSettingsPrivacyZoneQueryParams = {\n relay?: string;\n id_selected_camera: string;\n};\n\n/**\n * Video Settings Redesign Privacy Zone Settings page.\n */\nexport default class PrivacyZonesRoute extends BaseVideoSettingsRoute {\n @service declare identityManager: IdentityManager;\n\n /** @override */\n routeId = EmberVideoSettingsPrivacyZones;\n\n /** @override */\n queryParams = {\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n model(params: VideoSettingsPrivacyZoneQueryParams): VideoSettingsPrivacyZoneModel {\n const baseModel: BaseSettingsCameraModel = this.modelFor('video.settings.camera'),\n camera = baseModel.camera,\n privacyZonesSetting = (async () => {\n const c = await camera;\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error privacyZonesSetting is async, so this code should be replace with `return (await c.privacyZonesSetting).reload();`.\n return await c.privacyZonesSetting.reload();\n })();\n\n return {\n camera,\n id: baseModel.id,\n privacyZonesSetting,\n ovRules: (async () => {\n const privacyZones = await privacyZonesSetting;\n if (privacyZones.ovRuleIds.length > 0) {\n return this.store.query('video/ov-rule', { ids: privacyZones.ovRuleIds });\n }\n\n const noRuleArray: OvRule[] = [];\n const noRuleArrayProxy: ArrayProxy = ArrayProxy.create({ content: noRuleArray });\n return noRuleArrayProxy;\n })(),\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(params.relay, undefined)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as PrivacyZonesControllerV2,\n { canEditPrivacyZones, privacyZonesSetting, onCheckPrivacyZonesAttributesChanged, onSave } = controller;\n\n let didPrivacyZonesUpdate = false;\n\n if (!this.hasConfirmedExit) {\n didPrivacyZonesUpdate = onCheckPrivacyZonesAttributesChanged();\n }\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n canEditPrivacyZones,\n async () => {\n await onSave();\n },\n [privacyZonesSetting],\n didPrivacyZonesUpdate,\n [EmberVideoSettingsVideoConfiguration, this.routeId]\n );\n }\n}\n","import { EmberVideoSettingsVideoConfiguration } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../base-settings-route';\n\nimport type VideoConfig from 'customer-site/models/video/settings/video-config';\nimport type { BaseSettingsCameraModel } from '../route';\n\ntype VideoConfigRouteModel = Pick & {\n videoConfig: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n * Video configuration settings page route.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n /** @override */\n routeId = EmberVideoSettingsVideoConfiguration;\n\n /** @override */\n model(): VideoConfigRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n\n return {\n camera: model.camera,\n id: model.id,\n videoSettingsPermission: model.videoSettingsPermission,\n videoConfig: this.store.findRecord('video/settings/video-config', model.id)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { next } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { fnEmpty } from 'customer-site/utils/ember';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { qualityKeyMapping } from 'customer-site/components/video/settings/playback-features/recording-quality-input/index';\nimport {\n Unknown,\n Success,\n UnexpectedException,\n DeviceCommandFailed,\n NoSdCard,\n SdCardNotFormatted,\n SdCardNotCompatible,\n ContainFootagesFromAnotherCamera,\n NoEncryptionKey,\n IncorrectEncryptionKeyInDevice,\n SdCardNotMounted,\n IncorrectAudioParameters,\n ContainBadDataForAudioRecording,\n ContainUnexpectedFiles,\n SdrDataNeedsToBeMigrated,\n IncorrectEncryptionKeyInDb,\n ContainFootagesFromAnotherCustomer,\n SdrDatabaseMoveFailed,\n AccessCheckInProgress\n} from 'customer-site/enums/AccessCheckResult';\nimport { EmberVideoSdCardSettings, EmberVideoSdCardSchedule } from 'customer-site/enums/CustomerPageUrl';\nimport {\n NoSchedule,\n Paused,\n OutsideActiveTimes,\n NotRecording,\n Recording\n} from 'customer-site/enums/SdCardRecordingStatus';\nimport { refresh, reformat } from 'customer-site/models/video/sd-card';\nimport { convertDateToString } from 'customer-site/utils/datetime';\nimport SimpleListItem from '@adc/ui-components/components/simple-list/list-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Transition from '@ember/routing/transition';\nimport type { StreamInfo } from 'customer-site/components/video/settings/playback-features/recording-quality-input/index';\nimport type SdCardRecordingSchedule from 'customer-site/models/video/schedules/sd-card-recording-schedule';\nimport type SdCardModel from 'customer-site/models/video/sd-card';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type TroubleConditionsService from 'customer-site/services/trouble-conditions';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { TaskInstance } from 'ember-concurrency';\nimport type Route from './route';\n\n// region Constants.\n\nconst ONE_MINUTE = 60,\n ONE_HOUR = 60 * ONE_MINUTE,\n ONE_DAY = 24 * ONE_HOUR,\n ONE_TB = 1024,\n NA = 'generic.na',\n SD_CARD_RESOURCE_KEY = 'generic.video.settings.sd-card';\n\n// endregion Constants.\n\n// region Private Functions.\n\n/**\n * Refreshes the SD card status and populates the new values on the page, including the last updated timestamp.\n */\nfunction refreshStatus(this: SDCardInfoController): void {\n const { id, ajax, intl, notificationManager } = this,\n action = () => refresh(ajax, id),\n fail = (message: string) => notificationManager.addError(message || intl.tc(this, 'refreshFail'));\n this.sdCardActionTaskInfo = this.sdCardActionTask\n .perform(action, fnEmpty, fail)\n .catch(() => {}) as TaskInstance;\n}\n\n// endregion Private Functions.\n\n/**\n * @classdesc\n * The controller for the SD Card Info page.\n */\nexport default class SDCardInfoController extends Controller {\n // region Services.\n\n @service declare store: Store;\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationService;\n @service declare troubleConditions: TroubleConditionsService;\n\n // endregion Services.\n\n declare model: ModelFrom;\n\n // region Properties.\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSdCardSettings;\n\n /**\n * Did the user click 'View' to navigate to reformatting their SD card?\n * If true, it shows the option to reformat the SD card.\n * If false, it shows generic information about the SD card.\n */\n @tracked\n showReformatOption = false;\n\n /**\n * Is the SD card data currently refreshing?\n */\n @tracked\n isRefreshing = false;\n\n /**\n * Has the SD card data been refreshed?\n */\n @tracked\n hasRefreshed = false;\n\n /**\n * Task info for SD card action.\n */\n @tracked\n sdCardActionTaskInfo?: TaskInstance;\n\n // endregion Properties.\n\n // region Computed Functions.\n\n @reads('model.id')\n id = '';\n\n /**\n * The timestamp when the SD card information was last updated.\n */\n @reads('sdCardModel.lastUpdatedDateUtc')\n lastUpdatedDate: Date | null = null;\n\n /**\n * The AccessCheckResultEnum corresponding to which state the SD card is in.\n */\n @reads('sdCardModel.sdCardStatusEnum')\n sdCardStatusEnum = Unknown;\n\n /**\n * The SdCardRecordingStatusEnum corresponding to which state the recording schedule is in.\n */\n @reads('sdCardModel.recordingStatusEnum')\n recordingStatusEnum = NoSchedule;\n\n /**\n * The active times of the recording schedule.\n */\n @reads('sdCardModel.activeScheduleTimes')\n activeScheduleTimes = '';\n\n /**\n * The product name of the SD card.\n */\n @reads('sdCardModel.name')\n sdCardName = '';\n\n /**\n * The make of the SD card.\n */\n @reads('sdCardModel.make')\n make = '';\n\n /**\n * The storage capacity of the SD card.\n */\n @reads('sdCardModel.storageCapacityGb')\n storageCapacityGb = 0;\n\n /**\n * The date of the oldest recorded video on the SD card.\n */\n @reads('sdCardModel.oldestRecordedVideoUtc')\n oldestRecordedVideoDate: Date | null = null;\n\n /**\n * The total number of seconds of recorded video on the SD card.\n */\n @reads('sdCardModel.recordedTimeSeconds')\n recordedTimeSeconds = 0;\n\n /**\n * The SD card recording schedule that this SD card is associated with.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('sdCardModel.recordingSchedule')\n recordingSchedule: SdCardRecordingSchedule | undefined = undefined;\n\n /**\n * The ID of the recording schedule associated with this SD card.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('recordingSchedule.id')\n recordingScheduleId: string | undefined = undefined;\n\n /**\n * The recording quality enum of the recording schedule.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('recordingSchedule.recordingQuality')\n recordingQualityEnum: number | undefined = undefined;\n\n /**\n * The mapping from recording quality enum to the stream properties (frame rate, resolution, etc.).\n */\n @reads('sdCardModel.camera.recordingQualityToStreamMapping')\n recordingQualityToStreamMapping: Record | undefined = undefined;\n\n /**\n * The SD card model for the SD card that is associated with the currently selected camera.\n *\n * @note\n * This would normally run synchronously and return an SdCard model if it were in the route,\n * but that would cause the page to take too long to load (particularly for disconnected devices),\n * which would result in a bad user experience.\n * Instead, this is added to the template's promise-hash, which allows the loading spinner to appear in the container.loading block.\n * The promise-hash turns this into a special promise object because it is run asynchronously.\n */\n @computed('id', 'store')\n get sdCardModel(): ADCAsyncStoreFindRecord {\n return this.store.findRecord('video/sd-card', this.id);\n }\n\n /**\n * Returns the timestamp that the SD card information was last updated.\n */\n @computed('intl', 'lastUpdatedDate')\n get lastUpdatedDateString(): string {\n const { intl, lastUpdatedDate } = this;\n return lastUpdatedDate ? convertDateToString(intl, lastUpdatedDate, true) : intl.t('generic.unknown');\n }\n\n /**\n * The status of the device.\n */\n @computed('intl', 'sdCardStatusEnum')\n get deviceStatusString(): string {\n const { intl, sdCardStatusEnum } = this;\n\n if ([Unknown, UnexpectedException].includes(sdCardStatusEnum)) {\n return intl.t('generic.unknown');\n }\n\n if (sdCardStatusEnum === DeviceCommandFailed) {\n return intl.t('generic.notConnected');\n }\n\n return intl.t('generic.connected');\n }\n\n /**\n * The quality of the recording schedule.\n *\n * @returns The translated string 'Low', 'Medium', 'High', or 'Max'.\n */\n @computed('intl', 'recordingQualityEnum')\n get recordingQualityString(): string {\n const { intl, recordingQualityEnum } = this;\n if (recordingQualityEnum === undefined) {\n return intl.t(NA);\n }\n\n const resource = qualityKeyMapping.get(recordingQualityEnum) || NA;\n return intl.t(resource);\n }\n\n /**\n * The frame rate of the recording schedule.\n *\n * @returns The translated string of the form 'Xfps'.\n */\n @computed('intl', 'recordingQualityEnum', 'recordingQualityToStreamMapping')\n get frameRateString(): string {\n const { intl, recordingQualityEnum, recordingQualityToStreamMapping } = this;\n if (recordingQualityEnum === undefined || recordingQualityToStreamMapping === undefined) {\n return intl.t(NA);\n }\n\n const frameRate = recordingQualityToStreamMapping[recordingQualityEnum]?.FrameRate;\n return frameRate ? intl.t('generic.video.frameRateWithFps', { numFramesPerSecond: frameRate }) : intl.t(NA);\n }\n\n /**\n * The resolution of the recording schedule.\n *\n * @returns The translated string of the form 'width x height'.\n */\n @computed('intl', 'recordingQualityEnum', 'recordingQualityToStreamMapping')\n get resolutionString(): string {\n const { intl, recordingQualityEnum, recordingQualityToStreamMapping } = this;\n if (recordingQualityEnum === undefined || recordingQualityToStreamMapping === undefined) {\n return intl.t(NA);\n }\n\n const resolution = recordingQualityToStreamMapping[recordingQualityEnum]?.Resolution,\n width = resolution?.Width,\n height = resolution?.Height;\n return width && height ? intl.t('generic.video.resolutionWidthAndHeight', { width, height }) : intl.t(NA);\n }\n\n /**\n * Did the access check enum indicate a failure and does it need to rerun?\n */\n @computed('recordingStatusEnum', 'sdCardStatusEnum')\n get accessCheckNeedsToRerun(): boolean {\n return (\n this.recordingStatusEnum !== NoSchedule &&\n [Unknown, UnexpectedException, DeviceCommandFailed].includes(this.sdCardStatusEnum)\n );\n }\n\n /**\n * Should the SD card be refreshed after the initial load from db?\n * This is true if the SD card has not already been refreshed,\n * and either the access check needs to rerun or there is a recording schedule without any intervals.\n */\n @computed(\n 'hasRefreshed',\n 'recordingStatusEnum',\n 'oldestRecordedVideoDate',\n 'recordedTimeSeconds',\n 'accessCheckNeedsToRerun'\n )\n get shouldRefreshOnInitialLoad(): boolean {\n const {\n hasRefreshed,\n recordingStatusEnum,\n oldestRecordedVideoDate,\n recordedTimeSeconds,\n accessCheckNeedsToRerun\n } = this,\n recordingScheduleWithoutIntervals =\n recordingStatusEnum !== NoSchedule && (!oldestRecordedVideoDate || !recordedTimeSeconds),\n shouldRefresh = !hasRefreshed && (accessCheckNeedsToRerun || recordingScheduleWithoutIntervals);\n if (shouldRefresh) {\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n next(() => {\n refreshStatus.call(this);\n });\n }\n\n return shouldRefresh;\n }\n\n /**\n * Converts an SdCardRecordingStatusEnum to its corresponding string.\n */\n @computed('intl', 'recordingStatusEnum')\n get stringFromRecordingStatusEnum(): string {\n const { intl, recordingStatusEnum } = this,\n mapping: Record = {\n [NoSchedule]: 'generic.video.noSchedule',\n [Paused]: 'generic.video.paused',\n [OutsideActiveTimes]: `${SD_CARD_RESOURCE_KEY}.outsideActiveTimes`,\n [NotRecording]: 'generic.video.notRecording',\n [Recording]: 'generic.active'\n };\n\n return intl.t(mapping[recordingStatusEnum]);\n }\n\n /**\n * Converts an AccessCheckResultEnum to its corresponding string.\n */\n @computed('intl', 'sdCardStatusEnum', 'recordingStatusEnum')\n get stringFromSdCardStatusEnum(): string {\n const { intl, sdCardStatusEnum, recordingStatusEnum } = this;\n const mapping: Record = {\n [Unknown]: 'generic.unknown',\n [Success]: recordingStatusEnum === Recording ? 'generic.video.recording' : 'generic.video.notRecording',\n [UnexpectedException]: 'generic.unknown',\n [DeviceCommandFailed]: 'generic.unknown',\n [NoSdCard]: `${SD_CARD_RESOURCE_KEY}.notInserted`,\n [SdCardNotFormatted]: `${SD_CARD_RESOURCE_KEY}.notFormatted`,\n [SdCardNotCompatible]: `${SD_CARD_RESOURCE_KEY}.notCompatible`,\n [ContainFootagesFromAnotherCamera]: `${SD_CARD_RESOURCE_KEY}.previousData`,\n [NoEncryptionKey]: `${SD_CARD_RESOURCE_KEY}.notFormatted`,\n [IncorrectEncryptionKeyInDevice]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [SdCardNotMounted]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [IncorrectAudioParameters]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [ContainBadDataForAudioRecording]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [ContainUnexpectedFiles]: `${SD_CARD_RESOURCE_KEY}.notFormatted`,\n [SdrDataNeedsToBeMigrated]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [IncorrectEncryptionKeyInDb]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [ContainFootagesFromAnotherCustomer]: `${SD_CARD_RESOURCE_KEY}.unknownData`,\n [SdrDatabaseMoveFailed]: `${SD_CARD_RESOURCE_KEY}.unableToPlayBackFootage`,\n [AccessCheckInProgress]: `${SD_CARD_RESOURCE_KEY}.busyProcessing`\n };\n\n return intl.t(mapping[sdCardStatusEnum]);\n }\n\n /**\n * Gets the storage capacity in GB to the appropriate string (using either GB or TB).\n *\n * @returns The translated string of the form 'X GB/TB Total Storage Capacity'.\n */\n @computed('intl', 'storageCapacityGb')\n get storageCapacityString(): string {\n const { intl, storageCapacityGb } = this;\n if (!storageCapacityGb) {\n return intl.t(NA);\n }\n\n const showSizeInGb = storageCapacityGb < ONE_TB;\n return intl.t(`generic.video.${showSizeInGb ? 'totalStorageCapacityGb' : 'totalStorageCapacityTb'}`, {\n size: storageCapacityGb / (showSizeInGb ? 1 : ONE_TB)\n });\n }\n\n /**\n * Gets the date of the oldest recorded video on the SD card.\n */\n @computed('intl', 'oldestRecordedVideoDate')\n get oldestRecordedVideoString(): string {\n const { intl, oldestRecordedVideoDate } = this;\n return oldestRecordedVideoDate\n ? intl.formatDateTz(oldestRecordedVideoDate, { month: 'short', day: 'numeric', year: 'numeric' })\n : intl.t(NA);\n }\n\n /**\n * Converts the number of seconds to the number of days, hours, and minutes of recording.\n *\n * @returns The translated string of the form 'X Days Y Hours Z Mins'.\n */\n @computed('intl', 'recordedTimeSeconds')\n get daysHoursMinutesStringFromRecordedTimeSeconds(): string {\n const { intl, recordedTimeSeconds } = this;\n\n // If the SD card requires formatting or the value is 0, use 'N/A'.\n // Otherwise, use the actual value.\n if (!recordedTimeSeconds) {\n return intl.t(NA);\n }\n\n // Convert the total number of seconds into days, hours, and minutes.\n const days: number = Math.floor(recordedTimeSeconds / ONE_DAY),\n hours: number = Math.floor((recordedTimeSeconds % ONE_DAY) / ONE_HOUR),\n minutes: number = Math.floor((recordedTimeSeconds % ONE_HOUR) / ONE_MINUTE);\n\n return intl.t('generic.video.daysHoursMins', { days, hours, minutes });\n }\n\n /**\n * Returns the list of SD card usage properties and their corresponding values to display.\n */\n @computed(\n 'intl',\n 'make',\n 'daysHoursMinutesStringFromRecordedTimeSeconds',\n 'oldestRecordedVideoString',\n 'shouldRefreshOnInitialLoad',\n 'sdCardName',\n 'storageCapacityString'\n )\n get sdCardUsageInfoItems(): SimpleListItem<{ loading: boolean }>[] {\n const {\n intl,\n make,\n daysHoursMinutesStringFromRecordedTimeSeconds,\n oldestRecordedVideoString,\n shouldRefreshOnInitialLoad,\n sdCardName,\n storageCapacityString\n } = this;\n\n return [\n new SimpleListItem({ description: intl.t('generic.name'), value: sdCardName || intl.t(NA) }),\n new SimpleListItem({ description: intl.t('generic.video.make'), value: make || intl.t(NA) }),\n new SimpleListItem({\n description: intl.t('generic.video.storageCapacity'),\n value: storageCapacityString\n }),\n new SimpleListItem({\n description: intl.t('generic.video.oldestRecordedVideo'),\n value: oldestRecordedVideoString,\n props: { loading: shouldRefreshOnInitialLoad }\n }),\n new SimpleListItem({\n description: intl.t('generic.video.recordedTime'),\n value: daysHoursMinutesStringFromRecordedTimeSeconds,\n props: { loading: shouldRefreshOnInitialLoad }\n })\n ];\n }\n\n /**\n * Returns the list of SD card status properties and their corresponding values to display.\n */\n @computed(\n 'intl',\n 'deviceStatusString',\n 'accessCheckNeedsToRerun',\n 'stringFromSdCardStatusEnum',\n 'stringFromRecordingStatusEnum',\n 'sdCardStatusEnum',\n 'recordingStatusEnum'\n )\n get sdCardStatusItems(): SimpleListItem[] {\n const {\n deviceStatusString,\n accessCheckNeedsToRerun,\n activeScheduleTimes,\n stringFromSdCardStatusEnum,\n stringFromRecordingStatusEnum,\n sdCardStatusEnum,\n recordingStatusEnum,\n intl\n } = this;\n\n return [\n new SimpleListItem({\n description: intl.t('generic.video.videoDevice'),\n value: deviceStatusString,\n css: accessCheckNeedsToRerun ? 'error' : ''\n }),\n new SimpleListItem({\n description: intl.t('generic.video.sdCard'),\n value: stringFromSdCardStatusEnum,\n css: recordingStatusEnum !== NoSchedule && sdCardStatusEnum !== Success ? 'error' : ''\n }),\n new SimpleListItem({\n description: intl.t('generic.video.recordingStatus'),\n value: stringFromRecordingStatusEnum,\n css: recordingStatusEnum === NotRecording ? 'error' : ''\n }),\n new SimpleListItem({\n description: intl.t('generic.schedule'),\n value: activeScheduleTimes || intl.t(NA)\n })\n ];\n }\n\n /**\n * Returns the list of sd card recording quality properties and their corresponding values to display.\n */\n @computed('intl', 'frameRateString', 'resolutionString', 'recordingQualityString')\n get recordingQualityItems(): SimpleListItem[] {\n const { frameRateString, resolutionString, recordingQualityString, intl } = this;\n\n return [\n new SimpleListItem({\n description: intl.t('generic.video.recordingQuality'),\n value: recordingQualityString\n }),\n new SimpleListItem({\n description: intl.t('generic.video.frameRate'),\n value: frameRateString\n }),\n new SimpleListItem({\n description: intl.t('generic.video.resolution'),\n value: resolutionString\n })\n ];\n }\n\n // endregion Computed Functions.\n\n // region Ember Concurrency Tasks.\n\n /**\n * Asynchronously performs the passed-in SD card action.\n *\n * @param action The function to call the correct API depending on the action.\n * @param successResponse The function to call if the request was successful.\n * @param failResponse The function to call if the request failed.\n */\n sdCardActionTask = task(\n this,\n { restartable: true },\n async (\n action: () => Promise>,\n successResponse: () => AppNotification | void,\n failResponse: (message?: string) => AppNotification | undefined\n ) => {\n this.isRefreshing = true;\n\n try {\n const sdCard = await action();\n\n if (!sdCard?.data?.attributes) {\n return failResponse();\n }\n\n this.sdCardModel.setProperties({ ...sdCard.data.attributes });\n successResponse();\n\n this.isRefreshing = false;\n this.hasRefreshed = true;\n } catch (error) {\n const errorMessage = getErrorText(error);\n failResponse(errorMessage);\n\n this.isRefreshing = false;\n this.hasRefreshed = true;\n throw error;\n }\n\n return;\n }\n );\n\n // endregion Ember Concurrency Tasks.\n\n // region Actions.\n\n /**\n * Displays the modal for the user to confirm that they wish to reformat their SD card.\n */\n @action\n async reformatSdCard(): Promise {\n const { intl, notificationManager, ajax, troubleConditions, id } = this;\n\n const action = () => reformat(ajax, troubleConditions, id),\n success = () => notificationManager.addSuccess(intl.t(`${SD_CARD_RESOURCE_KEY}.reformatSuccess`)),\n fail = (message: string) =>\n notificationManager.addError(message || intl.t(`${SD_CARD_RESOURCE_KEY}.reformatFail`));\n this.sdCardActionTaskInfo = (await this.sdCardActionTask.perform(action, success, fail).catch(() => {\n return Promise.reject();\n })) as unknown as TaskInstance;\n\n return Promise.resolve();\n }\n\n /**\n * Navigates to the Onboard recording schedule page.\n * If there is already a recording schedule, it navigates to the page to edit that schedule.\n * If there is no recording schedule, it navigates to the page to create a new schedule.\n * VID-51221: accounts that install their first camera that supports SD card recording doesn't cause the identity model to be reloaded, so Ember doesn't think the Onboard Schedule page can be accessed.\n */\n @action\n navigateToRecordingSchedule(): Promise> {\n return this.contextManager.transitionToRouteWithIdentityReloadIfNeeded(\n false,\n EmberVideoSdCardSchedule,\n undefined,\n undefined,\n undefined,\n this.recordingScheduleId || 'new'\n );\n }\n\n // endregion Actions.\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/sd-card-info': SDCardInfoController;\n }\n}\n","import { service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsSdCardInfo } from 'customer-site/enums/CustomerPageUrl';\n\nimport type SdCard from 'customer-site/models/video/sd-card';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { BaseSettingsCameraModel } from '../../route';\n\n/**\n * @classdesc\n * SD Card Info route.\n */\nexport default class SdCardInfoRoute extends AdcBaseRoute {\n @service declare identityManager: IdentityManager;\n\n /** @override */\n routeId = EmberVideoSettingsSdCardInfo;\n\n /** @override */\n model(): { id: string } {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera');\n const sdCardModel: SdCard | null = this.store.peekRecord('video/sd-card', model.id);\n\n // The sd card schedule is asynchronous, and it tries to load another sd-card schedule when we transition back from another route\n // So we need to unload the record to prevent sd card schedule from crashing the app\n // https://github.com/emberjs/ember.js/issues/16541\n if (sdCardModel) {\n sdCardModel.unloadRecord();\n }\n\n return {\n id: model.id\n };\n }\n}\n","import { action, computed, get } from '@ember/object';\nimport { createDropdownSelectItem } from 'customer-site/video/settings/camera/video-config/third-party-stream/index/controller';\nimport BaseThirdPartyStreamController, {\n isDirtyExistingRecord,\n MediumStreamId\n} from '../base-third-party-stream-controller';\n\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { StreamSection } from 'customer-site/video/settings/camera/video-config/third-party-stream/index/controller';\nimport type Route from './route';\n\n/**\n * @classdesc\n * Stream Settings Edit Controller\n */\nexport default class ThirdPartyStreamEditController extends BaseThirdPartyStreamController {\n declare model: ModelFrom;\n\n /**\n * The selected stream setting for this edit page.\n */\n @computed('streamSettings', 'resolvedModel.streamId')\n get selectedStreamSetting(): StreamSetting | undefined {\n return this.streamSettings.find((setting) => setting.streamId === this.resolvedModel?.streamId);\n }\n\n /**\n * The selected onvif camera stream for this edit page.\n */\n @computed('resolvedModel.streamId', 'onvifCameraStreams')\n get selectedOnvifCameraStream(): OnvifCameraStream | undefined {\n return this.onvifCameraStreams.find((stream) => stream.currentStreamId === this.resolvedModel?.streamId);\n }\n\n /**\n * Returns the stream settings properties that we need to display in the stream settings card.\n */\n @computed('isStreamMappingEnabled', 'selectedStreamSetting', 'selectedOnvifCameraStream')\n get editPageStreamSettingsDisplayProps(): StreamSection | undefined {\n const { selectedStreamSetting, selectedOnvifCameraStream } = this;\n\n if (!selectedStreamSetting || !selectedOnvifCameraStream) {\n return;\n }\n\n const [\n hasValidOptions,\n bitRateOptions,\n frameRateOptions,\n gopLengthOptions,\n resolutionOptions,\n shouldDisplayStreamSettingsSection\n ] = this.getStreamSettingsSectionData(selectedStreamSetting);\n\n return {\n name: selectedOnvifCameraStream?.name,\n bitRateOptions: bitRateOptions?.map(createDropdownSelectItem),\n frameRateOptions: frameRateOptions?.map(createDropdownSelectItem),\n gopLengthOptions: gopLengthOptions?.map(createDropdownSelectItem),\n resolutionOptions: resolutionOptions?.map(createDropdownSelectItem),\n setting: selectedStreamSetting,\n hasValidOptions,\n shouldDisplayStreamSettingsSection\n };\n }\n\n /**\n * Resets any edited stream settings, makes sure the dummy record has the correct stream ID, and switches to mapping mode if enabled.\n */\n @action\n resetStreamSettings(): void {\n this.streamSettings.filter(isDirtyExistingRecord).forEach((settings) => settings.rollbackAttributes());\n\n const dummySetting = this.streamSettings.find((setting) => get(setting, 'isNew'));\n if (dummySetting) {\n const doesMediumSettingExist = this.streamSettings.any(\n ({ streamId, isNew }) => streamId === MediumStreamId && !isNew\n );\n\n // Forcibly override stream id to undefined for dummy record, since we show settings with ids in streamSettingDisplayProps.\n dummySetting.streamId = doesMediumSettingExist ? (undefined as any) : MediumStreamId;\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/third-party-stream/edit': ThirdPartyStreamEditController;\n }\n}\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { EmberVideoSettingsThirdPartyStreamEdit } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../../base-settings-route';\n\nimport type EnvSettingsService from '@adc/app-infrastructure/services/env-settings';\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type { ThirdPartyStreamRouteModel } from '../route';\nimport type ThirdPartyStreamEditController from './controller';\n\ninterface ThirdPartyStreamEditRouteModel {\n id: string;\n camera: BaseCamera;\n svr: Svr;\n failedToRetrieveSettings: boolean;\n onvifCameraStreams: OnvifCameraStream[];\n streamSettings: StreamSetting[];\n streamId: number;\n}\n\n/**\n * @classdesc\n * Third party stream settings edit route.\n */\nexport default class ThirdPartyStreamSettingsEditRoute extends BaseVideoSettingsRoute {\n @service declare envSettings: EnvSettingsService;\n\n /** @override */\n routeId = EmberVideoSettingsThirdPartyStreamEdit;\n\n /**\n * Redirect back to the previous page if the camera doesn't have stream mapping enabled and tried to navigate to this page.\n */\n redirect(): void {\n const model: ThirdPartyStreamRouteModel = this.modelFor(\n 'video.settings.camera.video-config.third-party-stream'\n );\n\n if (model.onvifCameraStreams.length < 3) {\n this.contextManager.transitionToPreviousRoute();\n }\n }\n\n /** @override */\n model({ id_selected_stream }: { id_selected_stream: number }): ThirdPartyStreamEditRouteModel {\n const model: ThirdPartyStreamRouteModel = this.modelFor(\n 'video.settings.camera.video-config.third-party-stream'\n );\n\n return {\n id: model.id,\n camera: model.camera,\n svr: model.svr,\n failedToRetrieveSettings: model.failedToRetrieveSettings,\n onvifCameraStreams: model.onvifCameraStreams,\n streamSettings: model.streamSettings,\n streamId: Number(id_selected_stream)\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as ThirdPartyStreamEditController,\n { canEditOnvifSettings, resetStreamSettings, saveStreamSettings, selectedStreamSetting } = controller;\n\n if (!selectedStreamSetting) {\n return;\n }\n\n // Remove isTestEnvironment check in VID-67406\n if (!this.envSettings.isTestEnvironment()) {\n this.showUnsavedChangesModalIfNeeded(\n transition,\n canEditOnvifSettings,\n async () => {\n await saveStreamSettings(selectedStreamSetting);\n },\n [selectedStreamSetting]\n );\n }\n\n if (this.hasDiscardedChanges) {\n resetStreamSettings();\n }\n }\n}\n","import { action, computed, get } from '@ember/object';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { EmberVideoSettingsThirdPartyStreamEdit } from 'customer-site/enums/CustomerPageUrl';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { sentryWithScopeAndError } from '@adc/app-infrastructure/utils/sentry';\nimport DropdownSelectItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\nimport BaseThirdPartyStreamController, {\n HighStreamId,\n MediumStreamId,\n LowStreamId,\n isArrayNullOrEmpty\n} from '../base-third-party-stream-controller';\n\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\n// A stream with their index in the dropdown menu for selecting OnvifCameraStreams\ntype StreamIndexPair = { stream: OnvifCameraStream; index: number };\n\n// A stream that has a current stream ID.\ntype OnvifCameraStreamWithStreamId = OnvifCameraStream & { currentStreamId: number };\n\ninterface StreamMappingSection {\n stream: OnvifCameraStream;\n streamOptions: DropdownSelectItem[];\n shouldDisplayStreamSettingsSection: boolean;\n bitRateOptions?: DropdownSelectItem[];\n frameRateOptions?: DropdownSelectItem[];\n gopLengthOptions?: DropdownSelectItem[];\n resolutionOptions?: DropdownSelectItem[];\n}\n\n/**\n * An interface to hold properties we display for each stream section.\n */\nexport interface StreamSection {\n name: string;\n description?: string;\n bitRateOptions: DropdownSelectItem[] | undefined;\n frameRateOptions: DropdownSelectItem[] | undefined;\n gopLengthOptions: DropdownSelectItem[] | undefined;\n resolutionOptions: DropdownSelectItem[] | undefined;\n setting: StreamSetting;\n hasValidOptions: boolean;\n shouldDisplayStreamSettingsSection: boolean;\n}\n\n// Type-guard helper asserting that the streams in the stream-index pairs have a current stream ID.\nfunction hasStreamId(\n streamIndexPair: StreamIndexPair\n): streamIndexPair is StreamIndexPair & { stream: OnvifCameraStreamWithStreamId } {\n return streamIndexPair.stream.currentStreamId != null;\n}\n\n/**\n * Helper to create DropdownSelectItems.\n */\nexport function createDropdownSelectItem(option: string | number): DropdownSelectItem {\n return DropdownSelectItem.create({\n name: option.toString(),\n value: option.toString()\n });\n}\n\n/**\n * @classdesc\n * Stream Settings Index Controller\n */\nexport default class ThirdPartyStreamIndexController extends BaseThirdPartyStreamController {\n declare model: ModelFrom;\n\n /**\n * If stream mapping is visible to the user - requires support for stream mapping and streams to be loaded.\n * Does not mean stream mapping is enabled - see isStreamMappingEnabled.\n */\n @computed('supportsOnvifStreamMappings', 'onvifCameraStreams.length')\n get isStreamMappingVisible(): boolean {\n return this.supportsOnvifStreamMappings && this.onvifCameraStreams.length > 0;\n }\n\n /**\n * An array of properties that we display for StreamSettings sorted from High to Low streams\n */\n @computed('streamSettings', 'isStreamMappingEnabled')\n get streamSettingDisplayProps(): StreamSection[] {\n return this.streamSettings.sortBy('streamId').map((streamSetting) => {\n const [\n hasValidOptions,\n bitRateOptions,\n frameRateOptions,\n gopLengthOptions,\n resolutionOptions,\n shouldDisplayStreamSettingsSection\n ] = this.getStreamSettingsSectionData(streamSetting);\n\n const { name, description } = this.getNameAndDescription(streamSetting.streamId);\n\n return {\n name,\n description,\n bitRateOptions: bitRateOptions?.map(createDropdownSelectItem),\n frameRateOptions: frameRateOptions?.map(createDropdownSelectItem),\n gopLengthOptions: gopLengthOptions?.map(createDropdownSelectItem),\n resolutionOptions: resolutionOptions?.map(createDropdownSelectItem),\n setting: streamSetting,\n hasValidOptions,\n shouldDisplayStreamSettingsSection\n };\n });\n }\n\n /**\n * An array of properties that we display for OnvifCameraStreams sorted from High to Low streams\n */\n @computed('onvifCameraStreams.@each.currentStreamId', 'isStreamMappingEnabled')\n get onvifCameraStreamDisplayProps(): StreamMappingSection[] {\n // Grab all streams with their indices.\n const streamIndexPairs = this.onvifCameraStreams.map((stream, index) => {\n return { stream, index };\n });\n\n // For all streams that have a current stream id, get the props we need to display in the template\n return streamIndexPairs\n .filter(hasStreamId)\n .sortBy('stream.currentStreamId')\n .map(({ stream: currentStream }) => {\n const isDummyRecord = get(currentStream, 'isNew'),\n isMediumStream = currentStream.currentStreamId === MediumStreamId;\n\n const bitRateOptions = isDummyRecord ? null : [currentStream.bitRate],\n frameRateOptions = isDummyRecord ? null : [currentStream.frameRate],\n gopLengthOptions = isDummyRecord ? null : [currentStream.gopLength],\n resolutionOptions = isDummyRecord ? null : [currentStream.resolution];\n\n // The disabled stream can swap with any replacement stream except the current High and Low streams.\n const streamOptions = isDummyRecord\n ? streamIndexPairs.filter(\n ({ stream }) =>\n stream.currentStreamId !== HighStreamId && stream.currentStreamId !== LowStreamId\n )\n : isMediumStream\n ? // Medium streams can use any replacement stream, including the disabled stream.\n streamIndexPairs\n : // High or low stream can use any replacement stream except the disabled stream.\n streamIndexPairs.filter(({ stream }) => !get(stream, 'isNew'));\n\n const shouldDisplayStreamSettingsSection =\n !isArrayNullOrEmpty(bitRateOptions) &&\n !isArrayNullOrEmpty(frameRateOptions) &&\n !isArrayNullOrEmpty(gopLengthOptions) &&\n !isArrayNullOrEmpty(resolutionOptions) &&\n this.isStreamMappingEnabled;\n\n return {\n stream: currentStream,\n streamOptions: streamOptions.map(({ stream }) => {\n const { name } = stream,\n value = stream.id,\n state = stream === currentStream ? SELECTED : UNSELECTED;\n\n return DropdownSelectItem.create({ name, value, state });\n }),\n shouldDisplayStreamSettingsSection,\n bitRateOptions: bitRateOptions?.map(createDropdownSelectItem),\n frameRateOptions: frameRateOptions?.map(createDropdownSelectItem),\n gopLengthOptions: gopLengthOptions?.map(createDropdownSelectItem),\n resolutionOptions: resolutionOptions?.map(createDropdownSelectItem)\n };\n });\n }\n\n /**\n * Returns the resources for the name and description for the given stream ID.\n */\n // TODO: create enum for backend and frontend for onvif stream quality\n getNameAndDescription(streamId: number): { name: string; description: string } {\n let name = '',\n description = '';\n\n switch (streamId) {\n case HighStreamId:\n name = this.intl.tc(this, 'highStream');\n description = this.intl.tc(this, 'highStreamDesc');\n break;\n case MediumStreamId:\n name = this.intl.tc(this, 'mediumStream');\n description = this.intl.tc(this, 'mediumStreamDesc');\n break;\n case LowStreamId:\n name = this.intl.tc(this, 'lowStream');\n description = this.intl.tc(this, 'lowStreamDesc');\n break;\n }\n\n return {\n name,\n description\n };\n }\n\n /**\n * This sends the sync post request and refreshes the route's model.\n */\n syncAndRefreshModel = task({ drop: true }, async () => {\n const { ajax, intl, model, notificationManager } = this,\n url = `video/streamSettings/${model!.id}/sync`;\n\n try {\n await ajax.apiRequest(url, undefined, undefined, POST);\n await this.refreshModel();\n notificationManager.addSuccess(intl.tc(this, 'syncCompleted'));\n } catch (error) {\n const errorText = getErrorText(error);\n if (errorText) {\n notificationManager.addError(errorText);\n }\n\n notificationManager.addError(intl.tc(this, 'syncFailed'));\n }\n });\n\n /**\n * Saves the updated stream mappings and transitions to the edit page if successful.\n */\n saveStreamMappings = task({ drop: true }, async (streamId: number) => {\n const selectedStreams = this.onvifCameraStreams.filter(\n (stream) => stream.currentStreamId != null && !get(stream, 'isNew')\n );\n\n // If any of currently selected High/Medium/Low streams (excluding the dummy record) have a new stream ID\n const areExistingStreamsModified = selectedStreams.isAny('hasDirtyAttributes'),\n // Need to check if the Medium stream has been disabled, but we don't know if it started off as disabled.\n // ie. starting and ending with a dummy medium stream will have dirty attributes, though mappings have not changed.\n // So we iterate through all streams and check the changed attributes.\n isMediumStreamNowDisabled = this.onvifCameraStreams.any((stream) => {\n const { currentStreamId: currentStreamIdChanges } = stream.changedAttributes();\n if (!currentStreamIdChanges) {\n return false;\n }\n\n const [initialStreamId] = currentStreamIdChanges;\n return initialStreamId === MediumStreamId;\n });\n\n // We should only make a request if the stream mappings have changed.\n if (!(areExistingStreamsModified || isMediumStreamNowDisabled)) {\n this.navigation.transitionToRouteId(EmberVideoSettingsThirdPartyStreamEdit, streamId);\n return;\n }\n\n try {\n await this.ajax.apiRequestForDataRecords(\n `video/onvifCameraStreams/${this.model!.id}/map`,\n undefined,\n selectedStreams.invoke('serialize'),\n POST\n );\n await this.refreshModel();\n this.navigation.transitionToRouteId(EmberVideoSettingsThirdPartyStreamEdit, streamId);\n } catch (error) {\n this.notificationManager.addError(\n this.intl.t('generic.video.settings.third-party-stream.streamSettingsFailed')\n );\n throw error;\n }\n });\n\n /**\n * This swaps the stream ids for the original stream and the newly selected stream.\n */\n @action\n updateStreamMapping(originalStream: OnvifCameraStream, newStreamId: string): void {\n const newStream = this.onvifCameraStreams.findBy('id', newStreamId);\n\n if (!newStream) {\n sentryWithScopeAndError(\n 'Stream could not be selected',\n {\n newStreamId,\n existingStreamIds: JSON.stringify(this.onvifCameraStreams.mapBy('id'))\n },\n undefined\n );\n\n return;\n }\n\n [originalStream.currentStreamId, newStream.currentStreamId] = [\n newStream.currentStreamId,\n originalStream.currentStreamId\n ];\n }\n\n /**\n * Save the current stream mappings and transition to the edit page. Action triggered when user clicks the edit button.\n */\n @action\n async saveStreamMappingsAndTransitionToEditPage(streamId: number): Promise {\n if (this.isStreamMappingEnabled && this.canEditOnvifSettings) {\n await this.saveStreamMappings.perform(streamId);\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/third-party-stream/index': ThirdPartyStreamIndexController;\n }\n}\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { EmberVideoSettingsThirdPartyStream } from 'customer-site/enums/CustomerPageUrl';\nimport BaseVideoSettingsRoute from '../../../base-settings-route';\nimport {\n ThirdPartyStreamSettingsEditRouteName,\n ThirdPartyStreamSettingsIndexRouteName\n} from '../base-third-party-stream-controller';\n\nimport type EnvSettingsService from '@adc/app-infrastructure/services/env-settings';\nimport type Transition from '@ember/routing/transition';\nimport type ThirdPartyStreamIndexController from './controller';\n\n/**\n * @classdesc\n * Third party stream settings index route.\n */\nexport default class ThirdPartyStreamSettingsIndexRoute extends BaseVideoSettingsRoute {\n @service declare envSettings: EnvSettingsService;\n\n /** @override */\n routeId = EmberVideoSettingsThirdPartyStream;\n\n /** @override */\n @action async willTransition(transition: Transition & { targetName: string }): Promise {\n const controller = this.controller as ThirdPartyStreamIndexController,\n { canEditOnvifSettings, streamSettings, saveStreamSettings } = controller;\n\n // Remove isTestEnvironment check in VID-67406\n // We don't want to show the unsaved changes modal if we are transitioning to the edit page or the same page.\n if (\n !this.envSettings.isTestEnvironment() &&\n transition.targetName !== ThirdPartyStreamSettingsEditRouteName &&\n transition.targetName !== ThirdPartyStreamSettingsIndexRouteName\n ) {\n this.showUnsavedChangesModalIfNeeded(\n transition,\n canEditOnvifSettings,\n async () => {\n await saveStreamSettings();\n },\n streamSettings\n );\n }\n }\n}\n","import { service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsThirdPartyStream } from 'customer-site/enums/CustomerPageUrl';\nimport { EmberHome } from 'customer-site/enums/CustomerPageUrl';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Transition from '@ember/routing/transition';\nimport type BaseCamera from 'customer-site/models/video/devices/base-camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { BaseSettingsCameraModel } from '../../route';\n\nexport interface ThirdPartyStreamRouteModel {\n id: string;\n camera: BaseCamera;\n svr: Svr;\n failedToRetrieveSettings: boolean;\n onvifCameraStreams: OnvifCameraStream[];\n streamSettings: StreamSetting[];\n}\n\n/**\n * @classdesc\n * Third party stream settings route.\n */\nexport default class ThirdPartyStreamSettingsRoute extends AdcBaseRoute {\n @service declare ajax: AjaxService;\n @service declare notificationManager: NotificationManager;\n\n /** @override */\n routeId = EmberVideoSettingsThirdPartyStream;\n\n async beforeModel(transition: Transition): Promise {\n // If the user installed their first ONVIF camera without updating their route items, they won't have this access to this page.\n // Get/reload the route items before verifying the route exists in AdcBaseRoute's beforeModel\n await this.contextManager.getRouteItemWithIdentityReloadIfNeeded(this.routeId);\n await super.beforeModel(transition);\n }\n\n /** @override */\n async model(): Promise {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera'),\n id = model.id,\n camera = await model.camera,\n onvifParentId = camera.onvifParentId;\n\n if (!onvifParentId) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute(EmberHome, true);\n return;\n }\n\n const svr = await this.store.findRecord('video/devices/svr', onvifParentId),\n streamSettingsPromise = this.store.query('video/stream-setting', { id, include: 'streamOptions' }),\n onvifCameraStreamsPromise = svr.supportsOnvifStreamMappings\n ? this.store.query('video/onvif-camera-stream', { id })\n : undefined;\n\n const [streamSettingsResult, onvifCameraStreamsResult] = await Promise.allSettled([\n streamSettingsPromise,\n onvifCameraStreamsPromise\n ]);\n\n // Helper method to get the value of a result that is fulfilled or to show an error when the the promise is rejected.\n const grabValueOrShowNotificationError = (result: PromiseSettledResult): T | undefined => {\n if (result.status === 'rejected') {\n // For store.query(), the errors are in result.reason.errors.errors\n // For ajax.apiRequestForDataRecord(), the errors are in result.reason.errors\n const errorPayload = result.reason.errors ?? result.reason,\n errorText = getErrorText(errorPayload) as string;\n this.notificationManager.addError(errorText);\n return undefined;\n }\n\n return result.value;\n };\n\n const streamSettingsValue = grabValueOrShowNotificationError(streamSettingsResult),\n onvifCameraStreamsValue = grabValueOrShowNotificationError(onvifCameraStreamsResult);\n\n const streamSettings = streamSettingsValue?.toArray() ?? [],\n onvifCameraStreams = onvifCameraStreamsValue?.toArray() ?? [];\n\n return {\n id,\n camera,\n svr,\n onvifCameraStreams,\n streamSettings,\n failedToRetrieveSettings: streamSettingsResult.status === 'rejected'\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { Calibrated } from 'customer-site/enums/CalibrationStatus';\nimport { EmberVideoCameraCalibrate, EmberVideoSettingsVarifocalFov } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\n\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type VarifocalFovCamera from 'customer-site/models/video/devices/varifocal-fov-camera';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * Navigates to the Add Device page to finish installation and passes the page the relevant querystring properties that it needs to know the device status.\n * @private\n * @instance\n */\nfunction finishDeviceInstallation(this: VarifocalFovSettingsController) {\n const { navigation, newCamera, installParamWifiSkipped, installParamWifiDone, model } = this;\n\n navigation.transitionToRouteId(\n EmberVideoCameraCalibrate,\n {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n newCamera: newCamera,\n installParamWifiDone: installParamWifiDone,\n installParamWifiSkipped: installParamWifiSkipped,\n varifocalSetupComplete: this.deviceId\n },\n undefined,\n model.id\n );\n}\n\n/**\n * Resets the calibration status, because changing camera fov will affect ov ready calibration.\n */\nasync function resetCalibrationProcess(camera: OvReadyCamera, shouldResetCalibration: boolean): Promise {\n if (!camera) {\n return;\n }\n\n const status = camera.calibrationStatus;\n\n // Is the camera calibration not yet begun?\n if (!status) {\n return;\n }\n\n // If the camera's already calibrated and the FOV hasn't been changed more than 1 we don't need to recalibrate\n if (!shouldResetCalibration && status.value === Calibrated) {\n return;\n }\n\n const snapshots = camera.calibrationSnapshots;\n\n // Reset calibration status and delete/unload snapshots.\n await Promise.all(\n [await status.reset()].concat(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n snapshots.map(async (model) => {\n await model.destroyRecord();\n })\n )\n );\n}\n\n/**\n * @classdesc\n * The controller for Varifocal Fov Settings page.\n */\nexport default class VarifocalFovSettingsController extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare navigation: NavigationService;\n\n declare model: ModelFrom;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked declare resolvedModel: ResolvedModelFrom;\n\n /**\n * Query params for live view page.\n */\n queryParams = ['relay'];\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n // region Properties\n\n /**\n * If this device is a new camera in a post installation state. (This is for determining where we navigate to when the user clicks next)\n */\n newCamera: string | null = null;\n\n /**\n * A query param that's passed in if the user is navigating to this page from MobileTech\n */\n external = false;\n\n /**\n * If this device is currently in post installation and has had its wifi configuration skipped by the user, this is the mac address of the device\n */\n installParamWifiSkipped: string | null = null;\n\n /**\n * If this device is currently in post installation and has had its wifi configuration completed, this is the mac address of the device\n */\n installParamWifiDone: string | null = null;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSettingsVarifocalFov;\n\n /**\n * Has the FOV been changed by more than 1? We only want to recalibrate for changes greater than 1\n */\n shouldResetCalibration = false;\n\n /**\n * Is camera being saved or loaded?\n */\n @tracked isSavingOrLoadingCamera = false;\n\n /**\n * The selected varifocal camera.\n */\n @alias('resolvedModel.selectedVarifocalCamera')\n declare selectedVarifocalCamera: VarifocalFovCamera;\n\n /**\n * All the ov ready cameras on the account.\n */\n @alias('resolvedModel.ovReadyCameras')\n declare ovReadyCameras: OvReadyCamera[];\n\n // endregion Properties\n\n // region Computed Functions\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n @computed('model.id')\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * The OV ready camera corresonding to the selected varifocal camera.\n */\n @computed('ovReadyCameras', 'model.id')\n get ovReadyCamera(): OvReadyCamera | undefined {\n return this.ovReadyCameras.filter((o: OvReadyCamera) => o.id === this.model.id)[0];\n }\n\n /**\n * We want to use snapshots if we're in a mobile context, either from the app or mobiletech\n */\n @computed('identityManager.isMobileApp', 'external')\n get shouldUseSnapshots(): boolean {\n return this.identityManager.isMobileApp || this.external;\n }\n\n // endregion Computed Functions.\n\n // region Actions\n\n /**\n * If the FOV has changed more than 1, we will set the flag to reset the calibration\n */\n @action\n resetCalibration(oldFov: number, newFov: number): void {\n if (Math.abs(oldFov - newFov) > 1) {\n this.shouldResetCalibration = true;\n }\n }\n\n /**\n * Continue to next phase in camera calibration step.\n */\n @action\n async goToNextPage(): Promise {\n const { contextManager, newCamera, external, navigation, model, shouldResetCalibration, ovReadyCamera } = this;\n\n // If we're in the post installation flow, we need to navigate to the Add Video device page from here (to complete the device installation).\n if (newCamera) {\n finishDeviceInstallation.call(this);\n return;\n }\n\n if (this.identityManager.isLoginAsLoginRep && external) {\n contextManager.transitionToPreviousRoute();\n return;\n }\n\n if (ovReadyCamera) {\n await resetCalibrationProcess(ovReadyCamera, shouldResetCalibration);\n navigation.transitionToRouteId(EmberVideoCameraCalibrate, undefined, undefined, model.id);\n } else {\n console.error(`The varifocal camera model does not have a matching OV ready camera model. ID=${model.id}.`);\n }\n }\n\n /**\n * Closure to pass to childs to set the saving/loading state of the camera.\n */\n @action setIsSavingOrLoadingCamera(isSavingOrLoadingCamera: boolean): void {\n this.isSavingOrLoadingCamera = isSavingOrLoadingCamera;\n }\n\n /**\n * Closure to pass to childs to set the varifocal camera model object\n */\n @action setVarifocalCameraModel(key: string, value: number): void {\n this.selectedVarifocalCamera.set(key, value);\n }\n\n /**\n * Called whenever the snapshot image is loaded and when we retry\n */\n @action async imageLoad() {\n const snapshot = await this.selectedVarifocalCamera.snapshot;\n snapshot.reloadSnapshotLater(1000);\n }\n\n // endregion Actions\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/camera/video-config/varifocal-fov': VarifocalFovSettingsController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsVarifocalFov } from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type Store from '@ember-data/store';\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type VarifocalFovCamera from 'customer-site/models/video/devices/varifocal-fov-camera';\nimport type { BaseSettingsCameraModel } from '../../route';\n\ninterface VarifocalFovRouteModel {\n forcedStreamingMethodFromQueryParam: number;\n selectedVarifocalCamera: ADCAsyncStoreFindRecord;\n ovReadyCameras: ADCAsyncStoreFindAll;\n id: string;\n}\n\n/**\n * Varifocal Fov Settings route.\n */\nexport default class Route extends AdcBaseRoute {\n @service declare store: Store;\n\n // region Overrides.\n\n /** @override */\n queryParams = {\n newCamera: getQueryParam('number'),\n external: getQueryParam('boolean'),\n installParamWifiSkipped: {\n // The query parameter is 'wifi_skipped' but we want to attach it to installParamWifiSkipped\n as: 'wifi_skipped',\n ...getQueryParam('string')\n },\n installParamWifiDone: {\n // The query parameter is 'wifi_done' but we want to attach it to installParamWifiDone\n as: 'wifi_done',\n ...getQueryParam('string')\n },\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n routeId = EmberVideoSettingsVarifocalFov;\n\n /** @override */\n skipWhenTransitioningBack = true;\n\n /** @override */\n model({ relay }: { relay?: string }): VarifocalFovRouteModel {\n const model: BaseSettingsCameraModel = this.modelFor('video.settings.camera'),\n id = model.id;\n\n return {\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(relay),\n selectedVarifocalCamera: this.store.findRecord('video/devices/varifocal-fov-camera', id),\n ovReadyCameras: this.store.findAll('video/devices/ov-ready-camera'),\n id\n };\n }\n\n // endregion Overrides.\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport {\n EmberOvReadyRuleSettings,\n EmberVideoDigitalFovSettings,\n EmberVideoRules\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Narrow, Wide } from 'customer-site/enums/FieldOfView';\nimport DigitalFovCamera from 'customer-site/models/video/devices/digital-fov-camera';\nimport { getDeviceIdFromGlobalId, getGlobalIdFromUnitAndDevice } from 'customer-site/utils/general';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\ninterface FovOption {\n label: string;\n icon: string;\n}\n\n/**\n * @classdesc\n *\n * The controller for Digital Fov Settings page.\n */\nexport default class DigitalFovController extends Controller {\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationService;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n /**\n * Query params for live view page.\n */\n queryParams = ['relay'];\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId: number = EmberVideoDigitalFovSettings;\n\n /**\n * The camera we are viewing the settings for\n */\n @tracked selectedFovCamera: DigitalFovCamera = new DigitalFovCamera();\n\n /**\n * Is the FOV still updating?\n * Disable buttons/stream when true\n */\n @tracked updating = false;\n\n /**\n * Reloads the video source and is set in setReloadStreamOnTimeoutMethod.\n */\n reloadStreamOnTimeout: () => void = () => {};\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n @computed('model.id')\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * Only show the Review Rules button if the camera has rules\n */\n @computed('model.ovReadyCamera.ovRules')\n get hasOvRules(): Promise {\n return (async () => {\n const ovCameraRules = await this.model.ovReadyCamera.ovRules;\n return ovCameraRules.length > 0;\n })();\n }\n\n /**\n * Redirects the user to the settings page they selected in the dropdown.\n *\n * @param {string} settingsPageUrl The settings page to redirect to.\n */\n @action\n updateSettingSelection(settingsPageUrl: string): void {\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n /**\n * Redirects the user to this page with the camera they selected in the dropdown.\n *\n * @param {string} cameraId The new camera ID.\n */\n @action\n async updateCamera(cameraId: string): Promise {\n const unitId: string = (await this.identityManager.getSelectedSystem()).unitId.toString();\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n EmberVideoDigitalFovSettings,\n undefined,\n undefined,\n getGlobalIdFromUnitAndDevice(unitId, cameraId)\n );\n }\n\n @action dataLoaded(resolvedModel: Record): void {\n this.selectedFovCamera = resolvedModel.selectedFovCamera;\n }\n\n /**\n * Returns info mapping for FOV options\n */\n get fovInfoMapping(): Map {\n return new Map([\n [Narrow, { label: this.intl.tc(this, 'optimizedLabel'), icon: 'video-pt-center' }],\n [Wide, { label: this.intl.tc(this, 'expandedLabel'), icon: 'video-fullscreen' }]\n ]);\n }\n\n /**\n * Returns the BinaryListItems for the FOV selection buttons\n */\n @computed('fovInfoMapping', 'selectedFovCamera.fieldOfView', 'updating')\n get options(): BinaryListItem<{ icon: string; fieldOfView: number }>[] {\n return this.selectedFovCamera.get('supportedFieldOfViews').map((fov: number) => {\n const fovInfo = this.fovInfoMapping.get(fov) as FovOption;\n return new BinaryListItem<{ icon: string; fieldOfView: number }>({\n label: fovInfo.label,\n state: fov === this.selectedFovCamera.get('fieldOfView'),\n props: {\n icon: fovInfo.icon,\n fieldOfView: fov\n }\n });\n });\n }\n\n /**\n * Sets reloadStreamOnTimeout equal to the method passed in from the fov-player component\n */\n @action setReloadStreamOnTimeoutMethod(method: () => void): void {\n this.reloadStreamOnTimeout = method;\n }\n\n /**\n * Action called when a new FOV button is selected\n * @param options the options that make up the FOV buttons\n */\n @action async selectOption(options: DigitalFovController['options']): Promise {\n this.reloadStreamOnTimeout();\n this.updating = true;\n const camera = await this.model.selectedFovCamera;\n const selectedOption = options.findBy('state', true);\n\n camera.set('fieldOfView', selectedOption?.props.fieldOfView);\n camera\n .save()\n .then(() => {\n this.notificationManager.addSuccess(this.intl.tc(this, 'updateSuccessMessage'));\n })\n .catch((error: any) => {\n camera.rollbackAttributes();\n this.notificationManager.addError(error.errors.errors[0].detail);\n })\n .finally(() => (this.updating = false));\n }\n\n /**\n * Transitions to the rules page when clicked\n */\n @action clickReviewRules(): void {\n if (this.model.ovReadyCamera.get('hasMaxRules') && this.model.ovReadyCamera.get('maxNumberOfOvRules') == 1) {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n EmberOvReadyRuleSettings,\n undefined,\n undefined,\n get(this.model.ovReadyCamera.get('ovRules'), 'firstObject').id\n );\n } else {\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(EmberVideoRules, { globalDeviceId: this.model.id });\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/digital-fov': DigitalFovController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoDigitalFovSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\n\n/**\n * @classdesc\n * Digital Fov Settings page.\n */\nexport default class DigitalFovCameraRoute extends AdcBaseRoute {\n routeId = EmberVideoDigitalFovSettings;\n\n /** @override */\n queryParams = {\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n model({ id_selected_camera, relay }: { id_selected_camera: string; relay?: string }) {\n return {\n id: id_selected_camera,\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(relay, undefined),\n selectedFovCamera: this.store.findRecord('video/devices/digital-fov-camera', id_selected_camera),\n ovReadyCamera: this.store.findRecord('video/devices/ov-ready-camera', id_selected_camera)\n };\n }\n}\n","import EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarFaces, EmberVideoFamiliarVehicles } from 'customer-site/enums/CustomerPageUrl';\nimport { Face, Vehicle } from 'customer-site/enums/FamiliarObjectType';\n\nimport type Store from '@ember-data/store';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n *\n * Controller for the Familiar Target enrollment acceptance\n */\nexport default class Controller extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n /**\n * Checks if the page is for face enrollment\n */\n get isVehicleEnrollmentPage(): boolean {\n return this.model.familiarObjectType === Vehicle;\n }\n\n /**\n * Creates a new enrollment for the user when user agrees then transitions to the enrollment main page\n */\n @action async enableEnrollment(): Promise {\n const hasFaceEnrollment = this.model.familiarSubjectEnrollment?.some(\n (enrollment) => enrollment.familiarObjectType === Face\n );\n const hasVehicleEnrollment = this.model.familiarSubjectEnrollment?.some(\n (enrollment) => enrollment.familiarObjectType === Vehicle\n );\n const hasEnrollment = this.isVehicleEnrollmentPage ? hasVehicleEnrollment : hasFaceEnrollment;\n const routeIdToTransition = this.isVehicleEnrollmentPage ? EmberVideoFamiliarVehicles : EmberVideoFamiliarFaces;\n\n if (hasEnrollment) {\n return false;\n }\n\n const newEnrollment = this.store.createRecord('video/familiar-targets/familiar-target-enrollment', {\n familiarObjectType: this.model.familiarObjectType\n });\n\n try {\n await newEnrollment.save();\n } catch (ex) {\n newEnrollment.deleteRecord();\n newEnrollment.unloadRecord();\n return false;\n }\n this.navigation.transitionToRouteId(routeIdToTransition);\n return true;\n }\n\n /**\n * Navigates back to previous route\n */\n @action async cancelFamiliarSubjectEnrollment(): Promise {\n this.contextManager.transitionToPreviousRoute();\n this.contextManager.clearVisitedRoutesStack();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/enrollment-terms': Controller;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport {\n EmberVideoFamiliarSubjectsEnrollment,\n EmberVideoFamiliarSubjectsEnrollmentTerms\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Face, Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { getEnrollments } from 'customer-site/utils/video/settings/familiar-subject';\n\nimport type Transition from '@ember/routing/transition';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type NavigationService from 'customer-site/services/navigation';\nimport './_style.scss';\n\n/**\n * Interface for the model\n */\ninterface FamiliarSubjectEnrollmentTermsModel {\n familiarObjectType: number;\n familiarSubjectEnrollment?: FamiliarTargetEnrollment[];\n}\n\n/**\n * @classdesc\n *\n * Route Familiar Subject feature explanation and opt in/enabling\n */\nexport default class FamiliarSubjectEnrollmentTermsRoute extends AdcBaseRoute {\n @service declare navigation: NavigationService;\n\n routeId = EmberVideoFamiliarSubjectsEnrollmentTerms;\n\n enrollments: FamiliarTargetEnrollment[] | undefined = [];\n\n familiarObjectType = Vehicle;\n\n /**\n * Check to see if the user already has an existing enrollment and redirects to the landing page\n */\n async beforeModel(transition: Transition): Promise {\n super.beforeModel(transition);\n this.enrollments = await getEnrollments(this.store);\n const videoSettingsPermission = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n );\n\n // Check for existing enrollments\n const hasVehicleEnrollment = this.enrollments?.some(\n (enrollment: FamiliarTargetEnrollment) => enrollment.familiarObjectType === Vehicle\n ),\n hasFaceEnrollment = this.enrollments?.some(\n (enrollment: FamiliarTargetEnrollment) => enrollment.familiarObjectType === Face\n );\n\n // Check for permissions\n const hasVehicleAccessPermission =\n videoSettingsPermission.hasOnlyFamiliarVehicleAccess ||\n videoSettingsPermission.hasFamiliarFaceAndVehicleAccess,\n hasFaceAccessPermission =\n videoSettingsPermission.hasOnlyFamiliarFaceAccess ||\n videoSettingsPermission.hasFamiliarFaceAndVehicleAccess;\n\n // Get the familiar object type from the session storage\n this.familiarObjectType = Number(sessionStorage.getItem('familiarObjectType')) ?? Vehicle;\n\n // If the intended enrollment is Vehicle and the user has only familiar face access, redirect to the familiar faces page\n if (this.familiarObjectType === Vehicle && !hasVehicleAccessPermission) {\n this.contextManager.transitionToPreviousRoute();\n return;\n }\n\n // If the intended enrollment is Face, but the user does not have face permission, redirect to the previous route\n if (this.familiarObjectType === Face && !hasFaceAccessPermission) {\n this.contextManager.transitionToPreviousRoute();\n return;\n }\n\n // If there is an existing enrollment for the intended type, redirect to the enrollment page\n if (\n (this.familiarObjectType === Vehicle && hasVehicleEnrollment) ||\n (this.familiarObjectType === Face && hasFaceEnrollment)\n ) {\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollment);\n return;\n }\n }\n\n model(): FamiliarSubjectEnrollmentTermsModel {\n // Retrieve familiarObjectType from session storage\n sessionStorage.clear();\n return { familiarObjectType: this.familiarObjectType, familiarSubjectEnrollment: this.enrollments };\n }\n}\n","import { EmberVideoFamiliarSubjectsEnrollmentFacesCameraAccess } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectCameraAccessRoute from '../../camera-access-base-route';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n *\n * Route for the Familiar Subject Camera Access view\n */\nexport default class FamiliarVehicleCameraAccessRoute extends FamiliarSubjectCameraAccessRoute {\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentFacesCameraAccess;\n familiarSubjectObjectType = Face;\n}\n","import EmberController from '@ember/controller';\nimport { alias } from '@ember/object/computed';\n\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nexport default class FamiliarFacesFeatureManagementController extends EmberController {\n declare model: ModelFrom;\n\n /**\n * The Familiar Vehicle enrollment for the current context\n */\n declare enrollment: FamiliarTargetEnrollment;\n\n /**\n * Has the user requested that the enrollment be deleted?\n */\n @alias('enrollment.isDeleted')\n declare isDeleted: boolean;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/faces/feature-management': FamiliarFacesFeatureManagementController;\n }\n}\n","import { service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentFacesFeatureManagement } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectFeatureManagementRoute from '../../feature-management-base-route';\n\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n *\n * Route for the Familiar Subject Feature Management view\n */\nexport default class FamiliarFaceFeatureManagementRoute extends FamiliarSubjectFeatureManagementRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentFacesFeatureManagement;\n\n familiarSubjectObjectType = Face;\n}\n","import { service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentFacesIncorrectPhotos } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectIncorrectPhotosRoute from '../../incorrect-photos-base-route';\n\nimport './_style.scss';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * Model for familiar face incorrect photos route\n */\nexport interface FamiliarSubjectIncorrectPhotosRouteModel {\n enrollment: FamiliarTargetEnrollment;\n incorrectImages: FamiliarTargetEnrollmentImage[];\n}\n\n/**\n * Route for displaying images of images of familiar faces that have been reviewed as incorrect\n */\nexport default class FamiliarFaceIncorrectPhotosRoute extends FamiliarSubjectIncorrectPhotosRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentFacesIncorrectPhotos;\n\n familiarObjectTypes = Face;\n}\n","import EmberController from '@ember/controller';\nimport { computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { createNavButton } from 'customer-site/components/video/settings/familiar-targets/navigation-button-list/index';\nimport {\n EmberVideoFamiliarSubjectsEnrollmentFacesCameraAccess,\n EmberVideoFamiliarSubjectsEnrollmentFacesFeatureManagement,\n EmberVideoFamiliarSubjectsEnrollmentFacesIncorrectPhotos\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AsyncHasMany } from '@ember-data/model';\nimport type { NavigationButtonContent } from 'customer-site/components/video/settings/familiar-targets/navigation-button-list/index';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type FamiliarFacesRoute from './route';\n\n/**\n * @classdesc\n *\n * Controller for the familiar faces enrollment page.\n */\nexport default class Controller extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n // Model from the route\n declare model: ModelFrom;\n\n /**\n * Customer Enrollment for Familiar Face recognition, if available\n */\n @computed('model.enrollments.[]')\n get faceEnrollment(): FamiliarTargetEnrollment | undefined {\n return get(this.model, 'enrollments').find(\n (enrollment: FamiliarTargetEnrollment) => enrollment.familiarObjectType === Face\n );\n }\n\n /**\n * Faces that do not require an initial review.\n */\n @computed('faceEnrollment.clusters.[]')\n get faces(): AsyncHasMany | undefined {\n return this.faceEnrollment?.get('clusters');\n }\n\n /**\n * Button content for the settings section\n */\n get settingsButtons(): (NavigationButtonContent | undefined)[] {\n return [\n createNavButton(\n this.intl.t('generic.video.cameraAccess'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentFacesCameraAccess\n ),\n createNavButton(\n this.intl.t('generic.video.settings.familiar-subject.featureManagement'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentFacesFeatureManagement\n )\n ].filter((button) => button !== undefined && button !== null);\n }\n\n /**\n * Button content for the help section\n */\n @computed('faces.length', 'faceEnrollment.numIncorrectImages')\n get helpButtons(): (NavigationButtonContent | undefined)[] {\n const { faceEnrollment } = this,\n numIncorrectPhotos = faceEnrollment?.numIncorrectImages ?? 0;\n\n return [\n createNavButton(\n this.intl.t('generic.video.settings.familiar-subject.incorrectPhotos'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentFacesIncorrectPhotos,\n { shouldHide: !numIncorrectPhotos }\n )\n ].filter((button) => button !== undefined && button !== null);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/faces/index': Controller;\n }\n}\n","import { inject as service } from '@ember/service';\nimport {\n EmberVideoFamiliarFaces,\n EmberVideoFamiliarSubjectsEnrollmentTerms\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { navigateToCameraAccessPageIfNoCamerasOptedIn } from 'customer-site/utils/video/settings/familiar-subject';\nimport FamiliarSubjectRoute from '../../route';\n\nimport type NavigationService from 'customer-site/services/navigation';\nimport type FamiliarSubjectRouteModel from '../../route';\n\n/**\n * @classdesc\n *\n * Route for the familiar faces enrollment.\n */\nexport default class FamiliarFacesRoute extends FamiliarSubjectRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarFaces;\n\n /**@override */\n familiarObjectTypes = Face;\n\n clearVisitedRouteStackMobile = false;\n\n /**\n * Check if we have an enrollment for the given type\n * And if the user has opted in for camera access\n */\n async afterModel(model: FamiliarSubjectRouteModel): Promise {\n const faceEnrollment = model.enrollments.find((enrollment) => enrollment.familiarObjectType === Face);\n\n // The customer must have acknowledged the enrollment terms for their enrollment to be created\n if (!faceEnrollment) {\n sessionStorage.clear();\n sessionStorage.setItem('familiarObjectType', JSON.stringify(Face));\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollmentTerms);\n return;\n }\n\n await navigateToCameraAccessPageIfNoCamerasOptedIn(this.navigation, this.store, Face);\n\n const visitedRoutesStackLength = this.contextManager.getVisitedRoutesStackLength(),\n videoSettingsPermission = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n );\n\n if (\n this.identityManager.isMobileApp &&\n visitedRoutesStackLength === 0 &&\n videoSettingsPermission.hasOnlyFamiliarFaceAccess\n ) {\n this.clearVisitedRouteStackMobile = true;\n }\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentFacesRecentImages } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectsRecentImagesRoute from '../../recent-images-base-route';\n\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n *\n * Route for displaying recent images of familiar faces.\n */\nexport default class FamiliarFacesRecentImagesRoute extends FamiliarSubjectsRecentImagesRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentFacesRecentImages;\n\n familiarSubjectObjectType = Face;\n}\n","import { inject as service } from '@ember/service';\nimport {\n EmberVideoFamiliarFaces,\n EmberVideoFamiliarSubjectsEnrollment,\n EmberVideoFamiliarVehicles\n} from 'customer-site/enums/CustomerPageUrl';\nimport FamiliarSubjectRoute from '../route';\n\nimport type Transition from '@ember/routing/transition';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface FamiliarSubjectIndexRouteModel {\n enrollments: FamiliarTargetEnrollment[];\n videoSettingsPermission: VideoSettingsPermission;\n}\n\n/**\n * @classdesc\n *\n * Route for the familiar faces enrollment.\n */\nexport default class FamiliarSubjectIndexRoute extends FamiliarSubjectRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollment;\n\n declare videoSettingsPermission: VideoSettingsPermission;\n\n /**\n * Check to see if the user has all of the prerequisites to visit the page, and redirect them to the appropriate page if not\n */\n async beforeModel(transition: Transition): Promise {\n await super.beforeModel(transition);\n\n this.videoSettingsPermission = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n );\n\n if (this.videoSettingsPermission.hasOnlyFamiliarFaceAccess) {\n this.navigation.transitionToRouteId(EmberVideoFamiliarFaces);\n return;\n }\n\n if (this.videoSettingsPermission.hasOnlyFamiliarVehicleAccess) {\n this.navigation.transitionToRouteId(EmberVideoFamiliarVehicles);\n return;\n }\n\n if (!this.videoSettingsPermission.hasFamiliarFaceAndVehicleAccess) {\n this.contextManager.transitionToPreviousRoute();\n return;\n }\n }\n\n model(): FamiliarSubjectIndexRouteModel {\n return {\n enrollments: this.enrollments,\n videoSettingsPermission: this.videoSettingsPermission\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsReview } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport {\n checkIfDescriptionIsValid,\n checkIfClusterDescriptionIsUnique,\n MaxDescriptionTextLength,\n getFamiliarSubjectRouteEnum\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { clearAndSetPreviousRouteId } from 'customer-site/utils/video/settings/familiar-subject';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\n/**\n * @classdesc\n *\n * Component for familiar target profile editing. Allows user to update vehicle name and profile image\n */\nexport default class FamiliarSubjectProfileEditController extends EmberController {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n\n declare model: ModelFrom;\n\n /**\n * Max description length used for template\n */\n maxDescriptionTextLength = MaxDescriptionTextLength;\n\n /**\n * Tracks if the description has an error\n * Used for template\n */\n @tracked descriptionHasError = false;\n\n /**\n * Tracks if the photo selection action sheet is open\n */\n @tracked isPhotoSelectionActionSheetOpen = false;\n\n /**\n * User selected new profile image\n */\n @tracked selectedImage?: FamiliarTargetEnrollmentImage;\n\n /**\n * New user inserted description\n */\n @tracked newDescription?: string;\n\n /**\n * Updates profile image in template\n */\n @tracked profileImageUrl?: string;\n\n /**\n * Should the current user be able to edit this page?\n */\n @alias('model.cluster.enrollment.isEditableByCurrentUser')\n declare isEditableByCurrentUser: boolean;\n\n /**\n * Current vehicle\n */\n @alias('model.cluster')\n declare cluster: FamiliarTargetEnrollmentCluster;\n\n /**\n * Is the current enrolment type for familiar face?\n */\n get isFamiliarFaceEnrollment(): boolean {\n const { model } = this,\n { cluster } = model;\n\n return Face === cluster.familiarObjectType;\n }\n\n /**\n * The icon to display for a pending cluster.\n */\n get pendingClusterIcon(): string {\n return this.isFamiliarFaceEnrollment ? 'va-person' : 'va-vehicle';\n }\n\n /**\n * Gets the profile image for the vehicle\n */\n @computed('cluster.profileOrKeyImageUrl', 'profileImageUrl')\n get imageUrl(): string {\n return this.profileImageUrl ?? this.cluster.profileOrKeyImageUrl;\n }\n\n /**\n * Which photo prompt to display based on familiar object type\n */\n get subjectName(): string {\n const key = this.isFamiliarFaceEnrollment ? 'faceName' : 'vehicleName';\n return this.intl.tc(this, key);\n }\n\n /**\n * Which rename error message to display based on familiar object type\n */\n get errorMessage(): string | null {\n const errorMessage = this.isFamiliarFaceEnrollment\n ? this.intl.tc(this, 'faceRenameError')\n : this.intl.tc(this, 'renameError');\n return this.descriptionHasError ? errorMessage : null;\n }\n\n /**\n * Sets the url for the user selected image for the vehicle\n */\n set imageUrl(url: string) {\n this.profileImageUrl = url;\n }\n /**\n * Toggles the state of the action sheet\n */\n @action\n toggleActionSheet(): void {\n this.isPhotoSelectionActionSheetOpen = !this.isPhotoSelectionActionSheetOpen;\n }\n\n /**\n * Sets the new cluster information\n */\n @action\n updateClusterDescription(value: string): void {\n const { cluster } = this;\n this.descriptionHasError = !(\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error enrollment is async, so this code should be replaced with `(checkIfDescriptionIsValid(value) && checkIfClusterDescriptionIsUnique(await cluster.enrollment, cluster, value))`.\n (checkIfDescriptionIsValid(value) && checkIfClusterDescriptionIsUnique(cluster.enrollment, cluster, value))\n );\n if (!this.descriptionHasError) {\n this.newDescription = value;\n }\n }\n\n /**\n * Updates cluster description and profile picture\n * and sends toast message then redirects user to review page\n * @param cluster\n */\n @action\n saveCluster(): void {\n const { cluster, contextManager, navigation } = this;\n\n cluster.description = this.newDescription ?? cluster.description;\n cluster.profileOrKeyImageUrl = this.selectedImage?.imageUrl ?? cluster.profileOrKeyImageUrl;\n cluster.profileImageId = this.selectedImage?.id ?? cluster.profileImageId;\n\n const updateSuccessMessage = this.isFamiliarFaceEnrollment\n ? this.intl.tc(this, 'updateFaceSuccess')\n : this.intl.tc(this, 'updateVehicleSuccess');\n\n cluster.saveProfile().then(async (success: boolean) => {\n if (success) {\n this.notificationManager.addSuccess(updateSuccessMessage);\n cluster.reload();\n // Transition back to the Review Page and resetting the route stack\n clearAndSetPreviousRouteId(contextManager, getFamiliarSubjectRouteEnum(cluster.familiarObjectType));\n navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReview);\n } else {\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error `profile` is async, so this code should be replaced with: `(await cluster.profile).rollbackAttributes();`.\n cluster.profile.rollbackAttributes();\n }\n });\n }\n\n /**\n * Uses the selected image and updates the cluster profile\n */\n @action\n updateProfilePicture(photo: FamiliarTargetEnrollmentImage): void {\n this.selectedImage = photo;\n this.profileImageUrl = photo.imageUrl;\n this.toggleActionSheet();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/review/edit': FamiliarSubjectProfileEditController;\n }\n}\n","import { setProperties } from '@ember/object';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsReviewProfileEdit } from 'customer-site/enums/CustomerPageUrl';\n\nimport type FamiliarSubjectProfileEditController from './controller';\n\n/**\n * @classdesc\n *\n * Route for profile edit page for Familiar Vehicle\n */\nexport default class EditFamiliarSubjectRoute extends AdcBaseRoute {\n routeId = EmberVideoFamiliarSubjectsReviewProfileEdit;\n\n /** @override */\n resetController(controller: FamiliarSubjectProfileEditController, isExiting: boolean): void {\n if (isExiting) {\n setProperties(controller, {\n profileImageUrl: undefined,\n newDescription: undefined,\n selectedImage: undefined\n });\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport {\n EmberVideoFamiliarSubjectsReviewPhotoList,\n EmberVideoFamiliarSubjectsReviewProfileEdit,\n EmberVideoFamiliarSubjectsReviewFAQ,\n EmberVideoFamiliarSubjectsReviewNotifications,\n EmberVideoFamiliarSubjectsEnrollmentRecentImages,\n EmberVideoFamiliarSubjectsEnrollmentFacesRecentImages,\n EmberVideoFamiliarSubjectsReviewSummary\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport { Active, Adjusting, Pending } from 'customer-site/enums/FamiliarTargetStatus';\nimport {\n getFamiliarSubjectRouteEnum,\n MaxDescriptionTextLength,\n MinimumRecommendedPhotos,\n validateClusterDescription\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { modalFooterButton } from '@adc/ui-components/components/modals/base/footer/modal-footer';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { FamiliarSubjectReviewModel } from 'customer-site/video/settings/familiar-subject/review/route';\n\ntype onClickAction = () => any;\n\ninterface DrillThroughButtonContent {\n key: string;\n mainText: string;\n infoText: string;\n subTitle: string;\n infoIcon?: string | undefined;\n onClick: onClickAction;\n style: string;\n}\n\n/**\n * Get the localization key and class name for the subject status info text\n *\n * @param status\n */\nfunction getStatusTextContent(status: number): { statusKey: string; className: string; icon: string } {\n return (\n {\n [Active]: { statusKey: 'statusActive', className: 'active', icon: 'circle-check' },\n [Pending]: { statusKey: 'statusInactive', className: 'inactive', icon: 'clock' },\n [Adjusting]: { statusKey: 'statusAdjusting', className: 'adjusting', icon: 'circle-dash' }\n }[status] ?? { statusKey: '', className: '', icon: '' }\n );\n}\n\n/**\n * Creates button content\n */\nfunction createButtonContent(\n key: string,\n mainText: string,\n infoText: string,\n subTitle: string,\n onClick: onClickAction,\n { style = '', shouldHide = false } = {},\n infoIcon?: string\n): DrillThroughButtonContent | undefined {\n return !shouldHide\n ? {\n key,\n mainText,\n infoText,\n subTitle,\n onClick,\n style: style ?? '',\n infoIcon\n }\n : undefined;\n}\n\n/**\n * Rename the cluster and save the result on the backend\n *\n * @param cluster\n * @param newName\n * @returns true because the rename modal doesn't support async callbacks\n */\nasync function renameCluster(\n this: FamiliarSubjectReviewSummaryController,\n cluster: FamiliarTargetEnrollmentCluster,\n newName: string\n): Promise {\n const enrollment = await cluster.enrollment;\n\n if (await validateClusterDescription(newName, enrollment, cluster)) {\n cluster.description = newName;\n try {\n await cluster.saveProfile();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n cluster.rollbackAttributes();\n const message = this.isFamiliarFaceEnrollment ? 'faceRenameError' : 'renameError';\n this.notificationManager.addError(this.intl.tc(this, message));\n return false;\n}\n\n/**\n * @classdesc\n *\n * Component for familiar target summary view\n */\nexport default class FamiliarSubjectReviewSummaryController extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalsService;\n @service declare navigation: NavigationService;\n @service declare notificationManager: NotificationManager;\n\n declare model: FamiliarSubjectReviewModel;\n\n queryParams = ['promptForPhotos', 'rename'];\n\n /**\n * Are we suggesting to the user that the vehicle be renamed?\n */\n @tracked rename?: number;\n\n /**\n * If we should show the user the prompt for adding more photos to the vehicle\n */\n @tracked promptForPhotos = false;\n\n /**\n * Number of images that need to be reviewed by the user.\n */\n @reads('model.cluster.newImages.length')\n declare numNewPhotos: number;\n\n /**\n * Number of images that need to be reviewed by the user.\n */\n @reads('model.cluster.reviewedImages.length')\n declare numConfirmedPhotos: number;\n\n /**\n * Is the current enrolment type for familiar face?\n */\n get isFamiliarFaceEnrollment(): boolean {\n const { model } = this,\n { cluster } = model;\n\n const currentObjectType = cluster.get('enrollment').get('familiarObjectType');\n return currentObjectType === Face;\n }\n\n /**\n * Which pending alert to display based on familiar object type\n */\n get pendingInformationAlert(): string {\n return this.isFamiliarFaceEnrollment\n ? this.intl.tc(this, 'pendingFaceStatusInformationAlert')\n : this.intl.tc(this, 'pendingStatusInformationAlert');\n }\n\n /**\n * Which photo prompt to display based on familiar object type\n */\n get photoSheetIcon(): string {\n return this.isFamiliarFaceEnrollment ? 'va-person' : 'va-vehicle';\n }\n\n /**\n * Which photo prompt to display based on familiar object type\n */\n get photoPromptMessage(): string {\n return this.isFamiliarFaceEnrollment\n ? this.intl.tc(this, 'promptForFacePhotos')\n : this.intl.tc(this, 'promptForPhotos');\n }\n\n /**\n * Which photo prompt to display based on familiar object type\n */\n get subjectCreated(): string {\n return this.intl.tc(this, this.isFamiliarFaceEnrollment ? 'faceCreated' : 'carCreated', {\n subjectName: this.model.cluster.description\n });\n }\n\n /**\n * Buttons to display in the main drill-down section\n */\n @computed('model.cluster', 'numConfirmedPhotos', 'numNewPhotos')\n get primaryButtons(): DrillThroughButtonContent[] {\n const { intl, model, numConfirmedPhotos, numNewPhotos } = this,\n { cluster } = model,\n { statusKey, className, icon } = getStatusTextContent(cluster.get('status'));\n\n let photosInfoText =\n numNewPhotos > 0\n ? intl.tc(this, 'reviewNumberPhotos', { numPhotos: numNewPhotos })\n : `${numConfirmedPhotos}`,\n minimumRecommendedPhotosText = '';\n\n // making sure reviewed Images is loaded, otherwise numConfirmedPhotos returns as equal to 1 temporarily for some reason\n if (cluster.reviewedImages.isFulfilled && numConfirmedPhotos < MinimumRecommendedPhotos) {\n photosInfoText = '';\n minimumRecommendedPhotosText = intl.tc(this, 'minimumRecommendedPhotosText');\n }\n\n return [\n createButtonContent(\n 'status',\n intl.tc(this, 'recognitionStatus'),\n intl.tc(this, statusKey),\n '',\n () => this.showVehicleStatusInfo(),\n { style: `status-text hide-chevron ${className}` },\n icon\n ),\n createButtonContent(\n 'photos',\n intl.t('generic.photos'),\n photosInfoText,\n minimumRecommendedPhotosText,\n () => this.routeTo(EmberVideoFamiliarSubjectsReviewPhotoList, cluster.get('id')),\n { style: 'photo-list-option', shouldHide: cluster.isPending } // Don't show photo list button if the target is pending because there will be no photos\n ),\n createButtonContent('notifications', intl.t('generic.notifications'), '', '', () =>\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReviewNotifications)\n ),\n createButtonContent(\n 'faq',\n intl.t('generic.faq'),\n '',\n '',\n () => this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReviewFAQ),\n { shouldHide: cluster.familiarObjectType === Face }\n )\n ].compact();\n }\n\n /**\n * Styling for the delete button\n */\n @computed('model.cluster.enrollment.isEditableByCurrentUser', 'isFamiliarFaceEnrollment')\n get deleteButton(): DrillThroughButtonContent | undefined {\n const { intl, model } = this,\n { cluster } = model;\n\n const isEnabled = cluster.get('enrollment').get('isEditableByCurrentUser');\n const deleteSubject = this.isFamiliarFaceEnrollment ? 'deleteFace' : 'deleteVehicle';\n\n return createButtonContent(\n 'delete',\n intl.tc(this, deleteSubject),\n '',\n '',\n async () => {\n if (isEnabled) {\n this.showDeleteDialog(await cluster);\n }\n },\n { style: `warning hide-chevron ${!isEnabled ? 'disabled' : ''}` }\n );\n }\n\n /**\n * Go to the edit profile page\n */\n @action\n goToEditProfilePage(): void {\n this.routeTo(EmberVideoFamiliarSubjectsReviewProfileEdit, this.model.cluster.get('id'));\n }\n\n /**\n * Show information modal\n */\n @action\n showVehicleStatusInfo(): void {\n const info = this.getModalInformation();\n const statusModelHeader = this.isFamiliarFaceEnrollment\n ? this.intl.tc(this, 'faceStatusModalHeader')\n : this.intl.tc(this, 'statusModalHeader');\n\n this.modals.showInfoModal({\n info: htmlSafe(info),\n title: statusModelHeader,\n buttons: [modalFooterButton(this.intl.t('generic.dismiss'), () => {})]\n });\n }\n\n /**\n * Build the information modal from the strings for all possible statuses\n */\n getModalInformation(): string {\n if (this.isFamiliarFaceEnrollment) {\n return ['pending', 'recognized', 'adjusting'].reduce((text, key) => {\n return `${text}${this.intl.tc(this, `faceStatusText.${key}`)}`;\n }, '');\n }\n return ['pending', 'recognized', 'adjusting'].reduce((text, key) => {\n return `${text}${this.intl.tc(this, `statusText.${key}`)}`;\n }, '');\n }\n\n /**\n * Navigate to the route denoted by routeEnum\n */\n routeTo(routeEnum: number, slug: string): void {\n this.navigation.transitionToRouteId(routeEnum, undefined, undefined, slug);\n }\n\n /**\n * Present a delete dialog modal that upon confirmation will delete the given familiar subject\n * @param subject\n */\n showDeleteDialog(subject: FamiliarTargetEnrollmentCluster): void {\n const { intl, modals } = this;\n const title = this.isFamiliarFaceEnrollment ? 'deleteFaceModalTitle' : 'deleteVehicleModalTitle';\n const message = this.isFamiliarFaceEnrollment ? 'deleteFaceModalDetail' : 'deleteVehicleModalDetail';\n modals.showDeleteModal({\n title: intl.tc(this, title),\n message: intl.tc(this, message),\n delete: async () => await this.deleteSubject(subject)\n });\n }\n\n /**\n * Delete a Familiar Subject and all of its associated data\n */\n async deleteSubject(subject: FamiliarTargetEnrollmentCluster): Promise {\n const { intl, navigation, notificationManager } = this;\n const routeItem = getFamiliarSubjectRouteEnum(subject.familiarObjectType);\n\n try {\n subject.deleteRecord();\n await subject.save();\n\n // reload the enrollment to refresh all if its clusters. This operation can change a lot on the backend\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error enrollment is async, so this code should be replaced with `await (await subject.enrollment).reload();`.\n await subject.get('enrollment').reload();\n } catch (ex) {\n // This should always be a backend error if one occurs\n return false;\n }\n\n const message = subject.familiarObjectType === Face ? 'faceDeletedMessage' : 'vehicleDeletedMessage';\n notificationManager.addSuccess(intl.tc(this, message));\n navigation.transitionToRouteId(routeItem);\n return true;\n }\n\n /**\n * Create a model that allows the user to change the familiar subject's name if the rename query parameter\n * is present in the URL\n */\n @action async promptForNameChange(): Promise {\n const { intl, modals, rename } = this,\n cluster = await (this.model as FamiliarSubjectReviewModel).cluster;\n const message = this.isFamiliarFaceEnrollment ? 'renameFaceInstruction' : 'renameVehicleInstruction';\n\n if (rename) {\n modals.showRenameModal(\n {\n title: intl.t('generic.rename'),\n message: intl.tc(this, message),\n rename: (newName: string) => {\n renameCluster.call(this, cluster, newName);\n return true;\n },\n maxLength: MaxDescriptionTextLength,\n output: {\n value: cluster.description,\n error: undefined\n }\n },\n // Remove the rename query param from the URL\n () => (this.rename = undefined)\n );\n }\n }\n\n /**\n * Navigates to the recent images page\n */\n @action async goToRecentImagesPage(): Promise {\n // transitioning to the current page with prompt for photos set to false. this is to prevent\n // the behavior where clicking the back button after going to recent images shows the prompt here again\n await this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReviewSummary, {\n queryParams: { promptForPhotos: false }\n });\n this.isFamiliarFaceEnrollment\n ? this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollmentFacesRecentImages)\n : this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollmentRecentImages);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/review/index': FamiliarSubjectReviewSummaryController;\n }\n}\n","import { setProperties } from '@ember/object';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsReviewSummary } from '../../../../../enums/CustomerPageUrl';\n\nimport type FamiliarSubjectReviewSummaryController from './controller';\n\n/**\n * Controller for the familiar subject review summary page.\n */\nexport default class FamiliarSubjectReviewSummaryRoute extends AdcBaseRoute {\n /** @override */\n queryParams = {\n promptForPhotos: { replace: true, refreshModel: true }\n };\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsReviewSummary;\n\n /** @override */\n resetController(controller: FamiliarSubjectReviewSummaryController, isExiting: boolean): void {\n if (isExiting) {\n setProperties(controller, {\n promptForPhotos: false\n });\n }\n }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { EmberVideoFamiliarSubjectsReview, EmberVideoRules } from 'customer-site/enums/CustomerPageUrl';\nimport { Face } from 'customer-site/enums/FamiliarObjectType';\nimport {\n FamiliarFaceNotificationsDisable,\n FamiliarFaceNotificationsEnable,\n FamiliarVehicleNotificationsDisable,\n FamiliarVehicleNotificationsEnable,\n FamiliarVehicleNotificationsSkip\n} from 'customer-site/enums/TrackedEvent';\n\nimport type AdcAjaxService from '@adc/ajax/services/adc-ajax';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type RouterService from '@ember/routing/router-service';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type Stats from 'customer-site/services/stats';\nimport type { BooleanResponseWrapper } from 'customer-site/utils/api-requests';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type ParentRoute from '../route';\n\nexport default class VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsController extends Controller {\n @service declare ajax: AdcAjaxService;\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n @service declare navigation: NavigationService;\n @service declare stats: Stats;\n\n declare model: ModelFrom;\n\n /**\n * The ID slug from the URL.\n */\n @reads('model.cluster.id')\n declare clusterModelId: string;\n\n /**\n * The familiar vehicle's name.\n */\n @reads('model.cluster.profile.description')\n clusterDescription!: string;\n\n /**\n * If the vehicle is currently being onboarded. (If we got redirected here from vehicle creation)\n */\n onboarding = false;\n\n /**\n * Get the info text that tells customers they can update individual notifications on the recording rules page.\n * Add the link to the recording rules page.\n */\n get individualNotificationsText() {\n // Do not copy this deprecated usage. If you see this, please fix it\n // eslint-disable-next-line @adc/ember/no-context-manager-get-route\n const videoRulesRoute = this.contextManager.getRouteItem(EmberVideoRules);\n return htmlSafe(\n this.intl.tc(this, 'changeIndividualNotifications', {\n link: this.router.urlFor(videoRulesRoute.url)\n })\n );\n }\n\n /**\n * Send an API request to update all vehicle notifications to include the selected familiar vehicle.\n */\n @action\n async updateNotifications(enableNotifications: boolean): Promise {\n // Report an enabled/disabled notification event for monitoring.\n const isFamiliarFace = this.model.enrollment.familiarObjectType === Face;\n const notificationsEnabledEnum = isFamiliarFace\n ? FamiliarFaceNotificationsEnable\n : FamiliarVehicleNotificationsEnable,\n notificationsDisabledEnum = isFamiliarFace\n ? FamiliarFaceNotificationsDisable\n : FamiliarVehicleNotificationsDisable,\n enumForStats = enableNotifications ? notificationsEnabledEnum : notificationsDisabledEnum;\n\n this.stats.logEvent(enumForStats);\n\n // API request to update all familiar target recording rules that have a target filter.\n const url = `video/familiarTargets/familiarTargetRecordingRules/${this.clusterModelId}?addTarget=${enableNotifications}`;\n let response: BooleanResponseWrapper;\n try {\n response = await this.ajax.apiRequest(url, undefined, null, 'PUT');\n } catch (error) {\n // error.errors[0].detail is the first processing error message.\n this.notificationManager.addError(error.errors[0].detail);\n return Promise.reject();\n }\n\n // Display toast message based on success/failure and transition back to the review/subject-settings page.\n if (response.value.booleanFlag) {\n this.transitionBackOrToSubjectReview();\n\n return Promise.resolve();\n }\n\n const failMessage = this.intl.tc(\n this,\n enableNotifications ? 'enableNotificationsFail' : 'disableNotificationsFail'\n );\n this.notificationManager.addWarning(failMessage);\n\n return Promise.reject();\n }\n\n /**\n * Handle the skip button's actions:\n * 1. Reporting a skipped notification settings event.\n * 2. Going back to the subject settings page.\n */\n @action\n handleSkip(): void {\n this.stats.logEvent(FamiliarVehicleNotificationsSkip);\n\n this.transitionBackOrToSubjectReview();\n }\n\n /**\n * Navigate to the new vehicle if the user got here from vehicle creation/onboarding. Otherwise, transition to\n * the previous route, which is expected to be the familiar subject settings page.\n *\n * @private\n */\n transitionBackOrToSubjectReview(): void {\n if (this.onboarding) {\n const queryParams = {\n promptForPhotos: true\n };\n\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsReview, undefined, undefined, undefined, {\n queryParams\n });\n return;\n }\n\n this.contextManager.transitionToPreviousRoute();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/review/subject-settings/notifications': VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsController;\n }\n}\n","import { setProperties } from '@ember/object';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsReviewNotifications } from 'customer-site/enums/CustomerPageUrl';\n\nimport type VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsController from './controller';\n\n/**\n * @classdesc\n *\n * Notification settings page for an individual familiar subject.\n */\nexport default class VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsRoute extends AdcBaseRoute {\n /** @override */\n queryParams = {\n onboarding: { replace: true }\n };\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsReviewNotifications;\n\n /** @override */\n resetController(\n controller: VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsController,\n isExiting: boolean\n ): void {\n if (isExiting) {\n setProperties(controller, {\n onboarding: false\n });\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollment } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport {\n transitionToFamiliarSubjectReview,\n nameAndCreateSubject,\n ActionSheetTypes,\n getFamiliarSubjectRouteEnum\n} from 'customer-site/utils/video/settings/familiar-subject';\nimport { moveImagesToSubject } from 'customer-site/utils/video/settings/familiar-subject';\nimport { showDeleteImagesModal } from 'customer-site/utils/video/settings/familiar-subject';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type NavigationService from 'customer-site/services/navigation';\nimport type { FamiliarSubjectReviewModel } from 'customer-site/video/settings/familiar-subject/review/route';\n\n/**\n * @classdesc\n *\n * Controller for the Familiar Target Photo List route\n */\nexport default class FamiliarSubjectReviewPhotoListController extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare navigation: NavigationService;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare modals: ModalsService;\n\n declare model: FamiliarSubjectReviewModel;\n\n @tracked declare resolvedModel: FamiliarTargetEnrollmentCluster;\n\n /**\n * Review Images should be open if there is at least 1 image to review\n * This is a default value, we set it correctly in the router\n */\n @tracked showReviewPhotos = false;\n\n /**\n * Reviewed Images should be open if there is at least one reviewed image and no images to review\n * This is a default value, we set it correctly in the router\n */\n @tracked showReviewedPhotos = false;\n\n /**\n * The action sheet that is currently open. (ActionSheetTypes.none if none are open)\n */\n @tracked actionSheetTypeOpen = ActionSheetTypes.none;\n\n /**\n * The enrollment image currently open in the action sheet, if any\n */\n @tracked actionSheetPhoto?: FamiliarTargetEnrollmentImage;\n\n /**\n * If the large photo action sheet is currently open\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.photo)\n declare photoActionSheetIsOpen: boolean;\n\n /**\n * If the action sheet for moving/deleting/marking-incorrect an enrollment image is open\n */\n @equal('actionSheetTypeOpen', ActionSheetTypes.incorrectMove)\n declare incorrectMoveActionSheetIsOpen: boolean;\n\n /**\n * If the current selected action sheet photo is from the reviewed images section.\n * False if there is no selected action sheet photo\n */\n @computed('actionSheetPhoto.id', 'cluster.reviewedImages')\n get actionSheetPhotoIsInReviewedSection(): boolean {\n if (!this.actionSheetPhoto) {\n return false;\n }\n\n return this.cluster.reviewedImages.find(\n (reviewedImage: FamiliarTargetEnrollmentImage) => this.actionSheetPhoto?.id == reviewedImage.id\n );\n }\n\n /**\n * The cluster to display\n */\n @computed('resolvedModel.{reviewedImages.[],newImages.[]}')\n get cluster(): any {\n // This is a bandaid fix for the page blowing up when the cluster is destroyed by the last image being deleted\n const { isDestroyed } = this.resolvedModel;\n\n return isDestroyed ? null : this.resolvedModel;\n }\n\n /**\n * The instructions for reviewing new photos for a cluster.\n */\n get reviewInstructionsText(): string {\n const resourceKey =\n this.cluster.familiarObjectType === Vehicle ? 'reviewInstructionsVehicles' : 'reviewInstructionsFaces';\n return this.intl.tc(this, resourceKey);\n }\n\n /**\n * Does the user have unsaved changes on this page?\n */\n @computed('model.cluster.newImages.{@each.hasDirtyAttributes,length}')\n get hasUnsavedChanges(): boolean {\n return this.model.cluster.get('newImages').isAny('hasDirtyAttributes');\n }\n\n /**\n * Alt text for the the action sheet photo image. Test is dependent on if the photo has been reviewed or not\n */\n @computed('actionSheetPhotoIsInReviewedSection', 'actionSheetPhoto')\n get actionSheetPhotoAltText(): Promise {\n const { intl, actionSheetPhoto } = this;\n if (!actionSheetPhoto) {\n return Promise.resolve();\n }\n\n return (async () => {\n const clusterDescription = (await actionSheetPhoto.cluster).description;\n return this.actionSheetPhotoIsInReviewedSection\n ? intl.tc(this, 'reviewedPhotoAltText', {\n name: clusterDescription\n })\n : intl.tc(this, 'reviewPhotoAltText', {\n name: clusterDescription\n });\n })();\n }\n\n /**\n * Closes the action sheet\n */\n @action closeActionSheet(): void {\n this.actionSheetTypeOpen = ActionSheetTypes.none;\n }\n\n /**\n * Expands the review photo list\n */\n @action toggleReviewPhotos(): void {\n this.showReviewPhotos = !this.showReviewPhotos;\n }\n\n /**\n * Expands the reviewed photo list\n */\n @action toggleReviewedPhotos(): void {\n this.showReviewedPhotos = !this.showReviewedPhotos;\n }\n\n /**\n * Opens the action sheet for viewing the large photo\n */\n @action openPhotoActionSheet(photo: FamiliarTargetEnrollmentImage): void {\n this.actionSheetPhoto = photo;\n this.actionSheetTypeOpen = ActionSheetTypes.photo;\n }\n\n /**\n * Opens the action sheet for marking an image as incorrect or moving/deleting it\n */\n @action showMoveDeleteOptions(photo: FamiliarTargetEnrollmentImage): void {\n this.actionSheetPhoto = photo;\n this.actionSheetTypeOpen = ActionSheetTypes.incorrectMove;\n }\n\n /**\n * Shows the modal for deleting an image\n */\n @action deletePhoto(image: FamiliarTargetEnrollmentImage): void {\n showDeleteImagesModal(\n [image],\n this.model.enrollment,\n this.modals,\n this.intl,\n this.notificationManager,\n this.navigation\n );\n this.closeActionSheet();\n }\n\n /**\n * Attempts to move the image to a familiar vehicle and then close the action sheet\n */\n @action async moveImagesToSubject(subject: FamiliarTargetEnrollmentCluster): Promise {\n if (!this.actionSheetPhoto) {\n return;\n }\n\n const success = await moveImagesToSubject(\n [this.actionSheetPhoto],\n this.navigation,\n this.notificationManager,\n this.intl,\n subject\n );\n\n if (success) {\n this.closeActionSheet();\n }\n }\n\n /*\n * Marks the image as incorrect\n */\n @action async markAsIncorrect(image: FamiliarTargetEnrollmentImage, saveImageImmediately: boolean): Promise {\n this.closeActionSheet();\n\n image.setReview(false);\n\n // when marking images as incorrect from the reviewed section, we save this change immediately\n if (saveImageImmediately) {\n const cluster = await image.get('cluster');\n await image.save();\n cluster?.removeImage(image);\n\n image.unloadRecord();\n\n if (cluster.get('hasNoImages')) {\n cluster.unloadRecord();\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollment);\n }\n }\n }\n\n /**\n * Prompt for a name and create a new familiar subject with that name as the description, with the images provided\n */\n @action nameAndCreateSubject(): void {\n if (!this.actionSheetPhoto) {\n return;\n }\n\n nameAndCreateSubject(\n this.model.enrollment,\n [this.actionSheetPhoto],\n this.store,\n this.navigation,\n this.notificationManager,\n this.intl,\n this.modals\n );\n\n this.closeActionSheet();\n }\n\n /**\n * Complete the review with the selected images.\n */\n @action async save(isEditableByCurrentUser: boolean): Promise {\n if (!isEditableByCurrentUser) {\n return false;\n }\n\n const cluster = await this.model.cluster,\n isSuccess = await cluster.completeReview(),\n routeItem = getFamiliarSubjectRouteEnum(cluster.familiarObjectType);\n\n if (!isSuccess) {\n return false;\n }\n\n if (cluster.isDeleted || cluster.isDestroyed) {\n this.contextManager.clearVisitedRoutesStack();\n this.navigation.transitionToRouteId(routeItem);\n } else {\n // Navigate to the subject review summary page if the review was successful\n transitionToFamiliarSubjectReview(this.navigation, this.model.cluster.get('id'));\n }\n\n // Return the result to trigger the correct button animation\n return isSuccess;\n }\n\n /**\n * Return to the previous route\n */\n @action goBack(): void {\n this.contextManager.transitionToPreviousRoute();\n }\n\n /**\n * Promise that contains the array of images\n */\n @tracked declare asyncLoaderPromise: Promise;\n\n /**\n * Passes in images to the promise so that the loading indicator waits for it,\n * and sets the status of the Review Images tab\n */\n @action dataLoaded(cluster: FamiliarTargetEnrollmentCluster): void {\n this.resolvedModel = cluster;\n // Wait for the images to load to make sure the page loading indicator waits for the related content\n const newAndReviewedImages = [cluster.newImages, cluster.reviewedImages];\n // need to make sure these are loaded so that hasPhotosToReview and hasReviewedPhotos are correctly set\n this.asyncLoaderPromise = Promise.all(newAndReviewedImages);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/review/photos': FamiliarSubjectReviewPhotoListController;\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsReviewPhotoList } from 'customer-site/enums/CustomerPageUrl';\n\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type Transition from '@ember/routing/transition';\nimport type { FamiliarSubjectReviewModel } from 'customer-site/video/settings/familiar-subject/review/route';\nimport type FamiliarSubjectReviewPhotoListController from './controller';\n\n/**\n * @classdesc\n *\n * Route for reviewing previously confirmed familiar target images\n */\nexport default class Route extends AdcBaseRoute {\n @service declare modals: ModalService;\n\n routeId = EmberVideoFamiliarSubjectsReviewPhotoList;\n\n /**\n * If the user has confirmed that they wish to exit the page.\n * (this is only relevant for if they click the back button on the browser with unsaved changes)\n */\n hasConfirmedExit = false;\n\n /**\n * Shows a modal on the screen asking the user if they want to save their unsaved changes or leave without saving.\n */\n showExitConfirmationModal(exitWithoutSaving: () => void, saveAndExit: () => void): void {\n const { intl, modals } = this;\n\n const confirmButton = {\n text: intl.t('generic.save'),\n action: saveAndExit\n },\n backButton = {\n text: intl.t('generic.leavePage'),\n action: exitWithoutSaving\n },\n bailModalClassName = `fv-bail-screen`;\n\n modals.showConfirmationDialog(\n intl.tc(this, 'bailModalHeaderText'),\n intl.tc(this, 'bailModalBodyText'),\n confirmButton,\n backButton,\n bailModalClassName\n );\n }\n\n /** @override */\n @action willTransition(transition: Transition): void {\n const controller = this.controllerFor(this.routeName) as FamiliarSubjectReviewPhotoListController;\n const model = this.modelFor(this.routeName) as FamiliarSubjectReviewModel;\n\n if (this.hasConfirmedExit || !controller.hasUnsavedChanges) {\n return;\n }\n\n transition.abort();\n\n const retryTransition = function (this: Route) {\n this.hasConfirmedExit = true;\n transition.retry();\n };\n\n const isEditableByCurrentUser = model.enrollment?.isEditableByCurrentUser ?? false;\n\n this.showExitConfirmationModal(\n () => retryTransition.call(this),\n () => controller.save(isEditableByCurrentUser)\n );\n }\n\n /** @override */\n async setupController(\n controller: FamiliarSubjectReviewPhotoListController,\n model: FamiliarSubjectReviewModel,\n transition: Transition\n ): Promise {\n super.setupController(controller, model, transition);\n // resetting this here because the confirming exit then hitting the back button this value remains true otherwise\n this.hasConfirmedExit = false;\n const cluster = await model.cluster;\n const newAndReviewedImages = [cluster.newImages, cluster.reviewedImages];\n // need to make sure these are loaded so that hasPhotosToReview and hasReviewedPhotos are correctly set\n await Promise.all(newAndReviewedImages);\n // Review Images should be open if there is at least 1 image to review\n controller.set('showReviewPhotos', cluster.hasPhotosToReview);\n // Reviewed Images should be open if there is at least one reviewed image and no images to review\n controller.set('showReviewedPhotos', !cluster.hasPhotosToReview && cluster.hasReviewedPhotos);\n }\n\n @action reloadModel(): void {\n this.refresh();\n }\n}\n","import { get } from '@ember/object';\nimport { service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport {\n EmberVideoFamiliarSubjectsEnrollment,\n EmberVideoFamiliarSubjectsReview\n} from 'customer-site/enums/CustomerPageUrl';\nimport { navigateToCameraAccessPageIfNoCamerasOptedIn } from 'customer-site/utils/video/settings/familiar-subject';\n\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type NavigationService from 'customer-site/services/navigation';\n\ninterface FamiliarSubjectReviewParams {\n id_cluster: string;\n}\n\nexport interface FamiliarSubjectReviewModel {\n cluster: FamiliarTargetEnrollmentCluster;\n enrollment: FamiliarTargetEnrollment;\n}\n\n/**\n * @classdesc\n *\n * Route for Familiar Subject enrollment image review page. This page displays images that we believe\n * are of the same familiar subject and allow users to confirm/move/delete images for a cluster\n */\nexport default class FamiliarSubjectReviewRoute extends AdcBaseRoute {\n @service declare navigation: NavigationService;\n\n routeId = EmberVideoFamiliarSubjectsReview;\n\n /** @override */\n declare currentModel: FamiliarSubjectReviewModel;\n declare cluster: FamiliarTargetEnrollmentCluster;\n\n async model({ id_cluster }: FamiliarSubjectReviewParams): Promise {\n await this.store\n .findRecord('video/familiar-targets/familiar-target-enrollment-cluster', id_cluster)\n .then((c) => (this.cluster = c))\n .catch(() => {\n //If the cluster is null, then we transition to Familiar Subject landing page\n this.contextManager.clearVisitedRoutesStack();\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollment);\n });\n\n const cluster = this.cluster;\n const enrollment = await cluster.enrollment;\n return {\n cluster: cluster,\n enrollment: enrollment\n };\n }\n\n /** @override */\n async rollbackModelOnTransition(): Promise {\n const cluster = this.currentModel.cluster;\n if (get(cluster, 'isDestroyed') || get(cluster, 'isDeleted')) {\n this.store.unloadRecord(cluster);\n }\n }\n\n /**\n * Check if we have an enrollment for the given type\n * Edge case if the user access the review route with a valid cluster but no enrolled cameras, which can happen if they uninstall a camera\n */\n async afterModel(model: FamiliarSubjectReviewModel): Promise {\n await navigateToCameraAccessPageIfNoCamerasOptedIn(\n this.navigation,\n this.store,\n model.cluster.familiarObjectType\n );\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoFamiliarSubjectsEnrollment } from 'customer-site/enums/CustomerPageUrl';\nimport { getEnrollments } from 'customer-site/utils/video/settings/familiar-subject';\n\nimport type Transition from '@ember/routing/transition';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface FamiliarSubjectRouteModel {\n enrollments: FamiliarTargetEnrollment[];\n}\n\n/**\n * Top level route for Familiar Subject enrollment\n */\nexport default class FamiliarSubjectRoute extends AdcBaseRoute {\n @service declare navigation: NavigationService;\n\n routeId = EmberVideoFamiliarSubjectsEnrollment;\n\n enrollments: FamiliarTargetEnrollment[] = [];\n\n declare familiarObjectTypes: number;\n\n /**\n * Check to see if the user has all of the prerequisites to visit the page, and redirect them to the appropriate page if not\n */\n async beforeModel(transition: Transition): Promise {\n await super.beforeModel(transition);\n\n this.enrollments = await getEnrollments(this.store);\n }\n\n model(): FamiliarSubjectRouteModel {\n return {\n enrollments: this.enrollments\n };\n }\n}\n","import { EmberVideoFamiliarSubjectsEnrollmentVehiclesCameraAccess } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectCameraAccessRoute from '../../camera-access-base-route';\n\n/**\n * @classdesc\n *\n * Route for the Familiar Subject Camera Access view\n */\nexport default class FamiliarVehicleCameraAccessRoute extends FamiliarSubjectCameraAccessRoute {\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentVehiclesCameraAccess;\n familiarSubjectObjectType = Vehicle;\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\n\nimport type { FamiliarSubjectObjectType } from 'customer-site/enums/FamiliarObjectType';\n\nexport default class FamiliarTargetFAQController extends EmberController {\n @tracked showVehicleFAQ: FamiliarSubjectObjectType = Vehicle;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/vehicles/faq': FamiliarTargetFAQController;\n }\n}\n","import { EmberVideoFamiliarSubjectsReviewFAQ } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectFAQRoute from '../../faq-terms-base-route';\n\n/**\n * @classdesc\n *\n * FAQ page for the Familiar Vehicle feature.\n */\nexport default class VideoSettingsFamiliarSubjectReviewSubjectSettingsFAQRoute extends FamiliarSubjectFAQRoute {\n /** @override */\n routeId = EmberVideoFamiliarSubjectsReviewFAQ;\n familiarSubjectObjectType = Vehicle;\n}\n","import EmberController from '@ember/controller';\n\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\nexport default class FamiliarTargetFeatureManagementController extends EmberController {\n declare model: ResolvedModelFrom;\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/vehicles/feature-management': FamiliarTargetFeatureManagementController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentVehiclesFeatureManagement } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectFeatureManagementRoute from '../../feature-management-base-route';\n\nimport type NavigationService from 'customer-site/services/navigation';\n\n/**\n * @classdesc\n *\n * Route for the Familiar Subject Feature Management view\n */\nexport default class FamiliarVehicleFeatureManagementRoute extends FamiliarSubjectFeatureManagementRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentVehiclesFeatureManagement;\n\n familiarSubjectObjectType = Vehicle;\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentVehiclesIncorrectPhotos } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectIncorrectPhotosRoute from '../../incorrect-photos-base-route';\n\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface FamiliarSubjectIncorrectPhotosRouteModel {\n enrollment: FamiliarTargetEnrollment;\n incorrectImages: FamiliarTargetEnrollmentImage[];\n}\n\n/**\n * @classdesc\n *\n * Route for displaying images of images of familiar vehicles that have been reviewed as incorrect\n */\nexport default class FamiliarVehicleIncorrectPhotosRoute extends FamiliarSubjectIncorrectPhotosRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarSubjectsEnrollmentVehiclesIncorrectPhotos;\n\n familiarObjectTypes = Vehicle;\n}\n","import EmberController from '@ember/controller';\nimport { computed, get } from '@ember/object';\nimport { service } from '@ember/service';\nimport { createNavButton } from 'customer-site/components/video/settings/familiar-targets/navigation-button-list/index';\nimport {\n EmberVideoFamiliarSubjectsEnrollmentVehiclesCameraAccess,\n EmberVideoFamiliarSubjectsEnrollmentVehiclesFeatureManagement,\n EmberVideoFamiliarSubjectsEnrollmentVehiclesIncorrectPhotos,\n EmberVideoFamiliarSubjectsReviewFAQ\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { AsyncHasMany } from '@ember-data/model';\nimport type { NavigationButtonContent } from 'customer-site/components/video/settings/familiar-targets/navigation-button-list/index';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentCluster from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-cluster';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n *\n * Controller for the Familiar Vehicles index route\n */\nexport default class Controller extends EmberController {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n declare model: ModelFrom; // Please replace this 'any' with the actual model type!\n\n /**\n * Customer Enrollment for Familiar Vehicle recognition, if available\n */\n @computed('model.enrollments.[]')\n get vehicleEnrollment(): FamiliarTargetEnrollment | undefined {\n return get(this.model, 'enrollments').findBy('familiarObjectType', Vehicle);\n }\n\n /**\n * Vehicles that do not require an initial review.\n */\n @computed('vehicleEnrollment.clusters.[]')\n get vehicles(): AsyncHasMany | undefined {\n return this.vehicleEnrollment?.get('clusters');\n }\n\n /**\n * Button content for the settings section\n */\n get settingsButtons(): (NavigationButtonContent | undefined)[] {\n return [\n createNavButton(\n this.intl.t('generic.video.cameraAccess'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentVehiclesCameraAccess\n ),\n createNavButton(\n this.intl.t('generic.video.settings.familiar-subject.featureManagement'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentVehiclesFeatureManagement\n )\n ].filter((button) => button !== undefined && button !== null);\n }\n\n /**\n * Button content for the help section\n */\n @computed('vehicles.length', 'vehicleEnrollment.numIncorrectImages')\n get helpButtons(): (NavigationButtonContent | undefined)[] {\n const { vehicleEnrollment } = this,\n numIncorrectPhotos = vehicleEnrollment?.numIncorrectImages ?? 0;\n\n return [\n createNavButton(\n this.intl.t('generic.video.settings.familiar-subject.incorrectPhotos'),\n '',\n EmberVideoFamiliarSubjectsEnrollmentVehiclesIncorrectPhotos,\n { shouldHide: !numIncorrectPhotos }\n ),\n createNavButton(this.intl.t('generic.faq'), '', EmberVideoFamiliarSubjectsReviewFAQ)\n ].filter((button) => button !== undefined && button !== null);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/familiar-subject/vehicles/index': Controller;\n }\n}\n","import { inject as service } from '@ember/service';\nimport {\n EmberVideoFamiliarSubjectsEnrollmentTerms,\n EmberVideoFamiliarVehicles\n} from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport { navigateToCameraAccessPageIfNoCamerasOptedIn } from 'customer-site/utils/video/settings/familiar-subject';\nimport FamiliarSubjectRoute from '../../route';\n\nimport type NavigationService from 'customer-site/services/navigation';\nimport type FamiliarSubjectRouteModel from '../../route';\n\n/**\n * @classdesc\n *\n * Route for the familiar vehicles enrollment page.\n */\nexport default class FamiliarVehiclesRoute extends FamiliarSubjectRoute {\n @service declare navigation: NavigationService;\n\n /** @override */\n routeId = EmberVideoFamiliarVehicles;\n\n familiarObjectTypes = Vehicle;\n\n clearVisitedRouteStackMobile = false;\n\n /** Check if we have an enrollment for the given type */\n async afterModel(model: FamiliarSubjectRouteModel): Promise {\n const vehicleEnrollment = model.enrollments.find((enrollment) => enrollment.familiarObjectType === Vehicle);\n\n // The customer must have acknowledged the enrollment terms for their enrollment to be created\n if (!vehicleEnrollment) {\n sessionStorage.clear();\n sessionStorage.setItem('familiarObjectType', JSON.stringify(Vehicle));\n this.navigation.transitionToRouteId(EmberVideoFamiliarSubjectsEnrollmentTerms);\n return;\n }\n\n await navigateToCameraAccessPageIfNoCamerasOptedIn(this.navigation, this.store, Vehicle);\n\n const visitedRoutesStackLength = this.contextManager.getVisitedRoutesStackLength(),\n videoSettingsPermission = await this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n );\n\n if (\n this.identityManager.isMobileApp &&\n visitedRoutesStackLength === 0 &&\n videoSettingsPermission.hasOnlyFamiliarVehicleAccess\n ) {\n this.clearVisitedRouteStackMobile = true;\n }\n }\n}\n","import { inject as service } from '@ember/service';\nimport { EmberVideoFamiliarSubjectsEnrollmentRecentImages } from 'customer-site/enums/CustomerPageUrl';\nimport { Vehicle } from 'customer-site/enums/FamiliarObjectType';\nimport FamiliarSubjectsRecentImagesRoute from '../../recent-images-base-route';\n\nimport type ArrayProxy from '@ember/array/proxy';\nimport type FamiliarTargetEnrollment from 'customer-site/models/video/familiar-targets/familiar-target-enrollment';\nimport type FamiliarTargetEnrollmentImage from 'customer-site/models/video/familiar-targets/familiar-target-enrollment-image';\nimport type NavigationService from 'customer-site/services/navigation';\n\nexport interface FamiliarSubjectRecentPhotosRouteModel {\n enrollment: FamiliarTargetEnrollment;\n recentImages: ArrayProxy;\n shouldDisplayWaitText: boolean;\n}\n\n/**\n * @classdesc\n *\n * Route for displaying new, unreviewed familiar vehicle clusters for review\n */\nexport default class FamiliarVehiclesRecentImagesRoute extends FamiliarSubjectsRecentImagesRoute {\n @service declare navigation: NavigationService;\n\n routeId = EmberVideoFamiliarSubjectsEnrollmentRecentImages;\n\n familiarSubjectObjectType = Vehicle;\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport addLoginsToIntercom from 'customer-site/video/settings/intercom/add-logins-to-intercom';\nimport removeLoginsFromIntercoms from 'customer-site/video/settings/intercom/remove-logins-from-intercoms';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport DropdownSelectItem, { SELECTED } from '@adc/ui-components/utils/dropdown-select-item';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type AddDirectoryRoute from './route';\n\n/**\n * @classdesc\n * Controller for the add directory page.\n */\nexport default class AddDirectoryController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare identityManager: IdentityManager;\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n @service declare store: Store;\n @service declare ajax: AjaxService;\n\n @tracked directoryListOptions: BinaryListItem[] = [];\n @tracked directoryListSelectItems: DropdownSelectItem[] = [];\n @tracked existingDirectorySelected: boolean = false;\n @tracked newDirectorySelected: boolean = false;\n @tracked selectedDirectoryListId: string = '';\n\n declare model: ModelFrom;\n\n /**\n * Hitting back redirects to the customize directory page.\n */\n @action\n backAction(): void {\n this.router.transitionTo('video.settings.intercom.customize-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n\n /**\n * Hitting next saves the existing directory list and goes to the qr code page or redirects to the create directory page.\n */\n @action\n async nextAction(): Promise {\n if (this.newDirectorySelected) {\n this.router.transitionTo('video.settings.intercom.create-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n\n if (this.existingDirectorySelected) {\n try {\n const directoryListId = this.model.directory.directoryListId;\n const selectedDirectoryListId = Number(this.selectedDirectoryListId);\n\n if (directoryListId && directoryListId === selectedDirectoryListId) {\n // This happens when we pick the same directory list the directory is currently using.\n this.router.transitionTo('video.settings.intercom.qr-code', {\n queryParams: { deviceId: this.deviceId }\n });\n return;\n }\n\n this.model.directory.directoryListId = selectedDirectoryListId;\n this.model.directory.save();\n\n const intercomDeviceIds = this.deviceId ? [this.deviceId] : [];\n\n if (directoryListId) {\n // This happens when choose a new directory list for the directory when it has a old list, so we need to remove permissions for logins in the old list\n // and add permissions for the logins in the new list.\n this.handleDirectoryListChange(directoryListId, selectedDirectoryListId, intercomDeviceIds);\n } else {\n // This happens when the directory has no previous list, so we just need to give access to the logins in the newly added list.\n this.addPermissionsToNewList(selectedDirectoryListId);\n }\n\n this.router.transitionTo('video.settings.intercom.qr-code', {\n queryParams: { deviceId: this.deviceId }\n });\n } catch (error) {\n this.notificationManager.addError(error.errors[0].detail);\n }\n }\n }\n\n async handleDirectoryListChange(oldListId: number, newListId: number, deviceIds: number[]): Promise {\n const [oldIntercomContacts, newIntercomContacts] = await Promise.all([\n this.store.query('video/intercom/intercom-contact', { listId: oldListId }),\n this.store.query('video/intercom/intercom-contact', { listId: newListId })\n ]);\n\n const oldIntercomLoginIds = oldIntercomContacts.map((contact) => contact.loginId);\n const newIntercomLoginIds = newIntercomContacts.map((contact) => contact.loginId);\n\n removeLoginsFromIntercoms(oldIntercomLoginIds, newIntercomLoginIds, deviceIds, this.ajax);\n\n this.addPermissionsToNewList(newListId);\n }\n\n async addPermissionsToNewList(listId: number): Promise {\n const newIntercomContacts = await this.store.query('video/intercom/intercom-contact', { listId });\n\n const newIntercomLogins = this.model.intercomLogins\n .filter((login) => newIntercomContacts?.any((contact) => contact.loginId.toString() == login.id))\n .map((login) => `${login.id}_${login.unitName}_${login.contactUnitId}`);\n\n addLoginsToIntercom(newIntercomLogins, this.ajax);\n }\n\n @action\n onOptionChange(options: BinaryListItem[]) {\n const selectedOption = options.find((option) => option.state);\n this.existingDirectorySelected = selectedOption?.label === this.intl.tc(this, 'existingDirectory');\n this.newDirectorySelected = selectedOption?.label === this.intl.tc(this, 'newDirectory');\n }\n\n @action\n updateSelectedDirectoryList(directoryListId: string) {\n this.selectedDirectoryListId = directoryListId;\n }\n\n /**\n * Populates the directory list options and directory list select items.\n */\n @action\n dataLoaded() {\n this.directoryListOptions = [\n new BinaryListItem({\n label: this.intl.tc(this, 'existingDirectory')\n }),\n new BinaryListItem({\n label: this.intl.tc(this, 'newDirectory')\n })\n ];\n\n this.directoryListSelectItems = this.model.directoryLists.map((directoryList) =>\n DropdownSelectItem.create({\n name: directoryList.directoryListName,\n value: directoryList.id\n })\n );\n\n // Set up initial values based on whether there is a linked directory list.\n if (this.model.directory.directoryListId) {\n this.existingDirectorySelected = true;\n this.directoryListOptions[0].state = true;\n\n this.selectedDirectoryListId = this.model.directory.directoryListId.toString();\n const item = this.directoryListSelectItems.find((item) => item.value === this.selectedDirectoryListId);\n if (item) {\n item.state = SELECTED;\n }\n } else {\n this.selectedDirectoryListId = this.directoryListSelectItems[0].value;\n this.directoryListSelectItems[0].state = SELECTED;\n }\n }\n\n @computed('existingDirectorySelected', 'newDirectorySelected', 'selectedDirectoryListId')\n get isSelectionValid(): boolean {\n return (this.existingDirectorySelected && this.selectedDirectoryListId !== '') || this.newDirectorySelected;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/add-directory': AddDirectoryController;\n }\n}\n","import { EmberVideoIntercomAddDirectory } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type ArrayProxy from '@ember/array/proxy';\nimport type IntercomDirectory from 'customer-site/models/video/intercom/intercom-directory';\nimport type IntercomDirectoryList from 'customer-site/models/video/intercom/intercom-directory-list';\nimport type IntercomLogin from 'customer-site/models/video/settings/intercom/intercom-login';\n\nexport default class AddDirectoryRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomAddDirectory;\n\n async model({ deviceId }: { deviceId: string }): Promise<{\n directoryLists: ArrayProxy;\n directory: IntercomDirectory;\n intercomLogins: ArrayProxy;\n }> {\n try {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n\n return {\n directoryLists: await this.store.findAll('video/intercom/intercom-directory-list'),\n directory: await this.store.findRecord(\n 'video/intercom/intercom-directory',\n `${selectedSystem.unitId}_${deviceId}`\n ),\n intercomLogins: await this.store.findAll('video/settings/intercom/intercom-login')\n };\n } catch (error) {\n this.router.transitionTo('video.settings.intercom.setup');\n return Promise.reject(error);\n }\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport CheckboxTreeItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type AssociatedDeviceSelectRoute from './route';\n\n/**\n * @classdesc\n * Controller for the associated device select page.\n */\nexport default class AssociatedDeviceSelectController extends BaseIntercomSettingsController {\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare identityManager: ServiceRegistry['identity-manager'];\n @service declare notificationManager: ServiceRegistry['notification-manager'];\n @service declare store: ServiceRegistry['store'];\n @service declare router: ServiceRegistry['router'];\n\n @tracked associatedDevices: CheckboxTreeItem[] = [];\n\n declare model: ModelFrom;\n\n /**\n * Hitting back redirects to the video device select page.\n */\n @action\n backAction(): void {\n this.router.transitionTo('video.settings.intercom.video-device-select', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n\n /**\n * Hitting next saves the associated devices and redirects to the customize directory page.\n */\n @action\n async nextAction(): Promise {\n try {\n const selectedDeviceIds = this.associatedDevices\n .filter((item) => item.state === SELECTED)\n .map((item) => Number(item.value));\n\n this.model.camera.intercomAssociatedDeviceIds = selectedDeviceIds;\n this.model.camera.save();\n\n this.router.transitionTo('video.settings.intercom.customize-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n } catch (error) {\n this.notificationManager.addError(error.errors[0].detail);\n }\n }\n\n /**\n * Create the CheckboxTreeItems from the model.\n */\n @action\n didInsert(): void {\n this.associatedDevices = this.model.cardReaders.map((item) =>\n CheckboxTreeItem.create({\n name: item.cardReader.name,\n value: getDeviceIdFromGlobalId(item.cardReader.id),\n state: item.isSelected ? SELECTED : UNSELECTED\n })\n );\n }\n\n /**\n * The Next button is disabled unless at least one device is selected.\n */\n get anyDeviceSelected(): boolean {\n return this.associatedDevices.some((item) => item.state === SELECTED);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/associated-device-select': AssociatedDeviceSelectController;\n }\n}\n","import { EmberVideoIntercomAssociatedDeviceSelect } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type AccessControlAccessPoint from 'customer-site/models/access-control/access-control-access-point';\nimport type Camera from 'customer-site/models/video/devices/camera';\n\ntype AssociatedDeviceSelectModel = {\n camera: Camera;\n cardReaders: {\n cardReader: AccessControlAccessPoint;\n isSelected: boolean;\n }[];\n};\n\nexport default class AssociatedDeviceSelectRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomAssociatedDeviceSelect;\n\n model(params: { deviceId: number }): Promise {\n return (async () => {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n const camera = await this.store.findRecord(\n 'video/devices/camera',\n `${selectedSystem.unitId}-${params.deviceId}`\n );\n const cardReaders = await this.ajax.apiRequestForDataRecords(\n 'accessControl/accessControlAccessPoints/getAllCardReaders',\n undefined,\n null,\n 'GET'\n );\n\n return {\n camera: camera,\n cardReaders: cardReaders.map((cardReader) => {\n const deviceId = parseInt(getDeviceIdFromGlobalId(cardReader.id));\n\n return {\n cardReader: cardReader,\n isSelected: camera.intercomAssociatedDeviceIds.includes(deviceId)\n };\n })\n };\n })();\n }\n}\n","import './_style.scss';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed, set } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\nimport type IntercomCustomerApartmentInfo from 'customer-site/models/video/settings/intercom/intercom-customer-apartment-info';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomConnectUnitToSystemRoute from './route';\n\n/**\n * @classdesc\n * Controller for the connect unit to system page.\n */\nexport default class IntercomConnectUnitToSystemController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n\n declare model: ModelFrom;\n\n @alias('model.intercomApartments')\n intercomApartments: IntercomApartment[] = [];\n\n @alias('model.intercomCustomerApartmentInfo')\n intercomCustomerApartmentInfo: IntercomCustomerApartmentInfo[] = [];\n\n @tracked\n declare filterString: string | null;\n\n /**\n * Gets results for the searchbar.\n */\n @computed('filterString', 'intercomApartments')\n get filteredIntercomApartments(): IntercomApartment[] {\n const filter = this.filterString;\n if (!filter) {\n return this.intercomApartments;\n }\n\n return (\n this.intercomApartments.filter((a) => {\n return a.apartmentNumber.toString().includes(filter) || a.apartmentName.toLowerCase().includes(filter);\n }) || []\n );\n }\n\n /**\n * Creates dropdown items.\n */\n get intercomCustomerApartmentInfoDropdownItems(): { value: number; name: string }[] {\n return this.intercomCustomerApartmentInfo.map((i) => {\n return {\n value: i.unitId,\n name:\n (i.apartmentSuiteName === '' ? this.intl.tc(this, 'apartmentName') : i.apartmentSuiteName) +\n ` - ${i.unitDescription}`\n };\n });\n }\n\n @action\n filterApartments(searchString: string): void {\n this.filterString = searchString.toLowerCase();\n }\n\n /**\n * Chooses a default linkage between an apartment and customer based on the apartment number and apartment suite name.\n */\n @action\n getSelectedValueForApartment(apartment: IntercomApartment): number | undefined {\n const apartmentNumber = apartment.apartmentNumber.toString();\n const regex = new RegExp(`(? regex.test(i.apartmentSuiteName));\n if (selectedInfo) {\n set(apartment, 'unitId', selectedInfo.unitId);\n return selectedInfo.unitId;\n }\n\n return undefined;\n }\n\n /**\n * Links the customer unit id to the intercom apartment.\n */\n @action\n valueChange(apartment: IntercomApartment, newValue: number): void {\n const intercomApartment = this.intercomApartments.find((a) => a.apartmentId === apartment.apartmentId);\n if (intercomApartment) {\n set(intercomApartment, 'unitId', newValue);\n }\n }\n\n /**\n * Goes back to the base intercom setup page.\n */\n @action\n backAction(): void {\n this.router.transitionTo('video.settings.intercom.setup');\n }\n\n /**\n * Hitting next continues directory setup and sends forward the apartments with linked unit ids.\n */\n @action\n async nextAction(): Promise {\n if (this.intercomApartments.some((a) => !a.unitId)) {\n this.notificationManager.addError(this.intl.tc(this, 'errorMissingConnection'));\n return;\n }\n\n const unitIds = this.intercomApartments.map((a) => a.unitId);\n const uniqueUnitIds = new Set(unitIds);\n if (unitIds.length !== uniqueUnitIds.size) {\n this.notificationManager.addError(this.intl.tc(this, 'errorDuplicateConnection'));\n return;\n }\n\n this.router.transitionTo('video.settings.intercom.set-concierge', this.model.deviceId);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/connect-unit-to-system': IntercomConnectUnitToSystemController;\n }\n}\n","import { EmberVideoIntercomConnectUnitToSystem } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\nimport type IntercomCustomerApartmentInfo from 'customer-site/models/video/settings/intercom/intercom-customer-apartment-info';\n\nexport interface ConnectUnitToSystemModel {\n intercomApartments: IntercomApartment[];\n intercomCustomerApartmentInfo: IntercomCustomerApartmentInfo[];\n deviceId: string;\n}\n\nexport default class IntercomConnectUnitToSystemRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomConnectUnitToSystem;\n\n async model({ id_selected_intercom }: { id_selected_intercom: string }): Promise {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n let intercomApartments: IntercomApartment[];\n try {\n const result = this.store.peekAll('video/intercom/intercom-apartment');\n intercomApartments = result.toArray();\n } catch {\n intercomApartments = [];\n }\n\n let pairedUnitIds: number[];\n try {\n const result = await this.store.query(`video/intercom/intercom-paired-unit`, {\n intercomUnitId: `${selectedSystem.unitId}`\n });\n pairedUnitIds = result.map((p) => p.contactUnitId);\n } catch {\n pairedUnitIds = [];\n }\n\n let intercomCustomerApartmentInfo: IntercomCustomerApartmentInfo[];\n try {\n const result = await this.store.query(`video/settings/intercom/intercom-customer-apartment-info`, {\n unitIds: pairedUnitIds\n });\n intercomCustomerApartmentInfo = result.toArray();\n } catch {\n intercomCustomerApartmentInfo = [];\n }\n\n const model: ConnectUnitToSystemModel = {\n intercomApartments: intercomApartments,\n intercomCustomerApartmentInfo: intercomCustomerApartmentInfo,\n deviceId: id_selected_intercom\n };\n\n return model;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport addLoginsToIntercom from 'customer-site/video/settings/intercom/add-logins-to-intercom';\nimport removeLoginsFromIntercoms from 'customer-site/video/settings/intercom/remove-logins-from-intercoms';\nimport CheckboxTreeItem, { SELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomCreateDirectoryRoute from './route';\n\n/**\n * @classdesc\n * Controller for the create directory page.\n */\nexport default class IntercomCreateDirectoryController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare identityManager: IdentityManager;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n\n @tracked intercomLogins: CheckboxTreeItem[] = [];\n @tracked directoryName: string = '';\n\n declare model: ModelFrom;\n\n @action\n backAction(): void {\n this.identityManager.contextManager.transitionToPreviousRoute();\n }\n\n /**\n * Hitting next saves adds users to the intercom directory and redirects to the generate qr code page.\n */\n @action\n async nextAction(): Promise {\n try {\n const selectedIntercomLogins = this.intercomLogins\n .filter((item) => item.state === SELECTED)\n .map((item) => item.value);\n\n // Send update to micro API\n const selectedSystem = await this.identityManager.getSelectedSystem();\n const directoryListBody = {\n id: null,\n unitId: selectedSystem.unitId,\n defaultList: true,\n directoryListName: this.directoryName,\n intercomLogins: selectedIntercomLogins\n };\n\n const newDirectoryList = await this.store\n .createRecord('video/intercom/intercom-directory-list', directoryListBody)\n .save();\n\n // If we are creating a new directory list for a directory, then we need to give the logins in the list permission to the directory.\n if (this.deviceId && this.model.intercom) {\n const oldDirectoryListId = this.model.intercom.directoryListId;\n this.model.intercom.directoryListId = Number(newDirectoryList.id);\n this.model.intercom.save();\n\n // If the intercom was previously using a directory list, we would need to remove the permissions for the logins in the old directory list.\n if (oldDirectoryListId) {\n const oldIntercomContacts = await this.store.query(`video/intercom/intercom-contact`, {\n listId: oldDirectoryListId\n });\n const oldIntercomLoginIds = oldIntercomContacts.map((contact) => contact.loginId);\n const newIntercomLoginIds = selectedIntercomLogins.map((login) => Number(login.split('_')[0]));\n removeLoginsFromIntercoms(oldIntercomLoginIds, newIntercomLoginIds, [this.deviceId], this.ajax);\n }\n\n addLoginsToIntercom(selectedIntercomLogins, this.ajax);\n\n this.router.transitionTo('video.settings.intercom.qr-code', {\n queryParams: { deviceId: this.deviceId }\n });\n } else {\n this.router.transitionTo('video.settings.intercom.setup');\n }\n } catch (error) {\n this.notificationManager.addError(error.errors[0].detail);\n }\n }\n\n /**\n * Create the CheckboxTreeItems from the model and default directory name.\n */\n @action\n dataLoaded() {\n this.intercomLogins = this.model.intercomLogins.map((login) => {\n return CheckboxTreeItem.create({\n name: login.loginName,\n secondaryDescription: login.unitName,\n value: `${login.id}_${login.unitName}_${login.contactUnitId}`,\n state: SELECTED\n });\n });\n\n this.directoryName = this.intl.tc(this, 'defaultDirectoryName');\n }\n\n resetState(): void {\n this.deviceId = null;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/create-directory': IntercomCreateDirectoryController;\n }\n}\n","import { EmberVideoIntercomCreateDirectory } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type ArrayProxy from '@ember/array/proxy';\nimport type IntercomDirectory from 'customer-site/models/video/intercom/intercom-directory';\nimport type IntercomLogin from 'customer-site/models/video/settings/intercom/intercom-login';\nimport type Controller from './controller';\n\nexport interface CreateDirectoryModel {\n intercom?: IntercomDirectory;\n intercomLogins: ArrayProxy;\n}\n\nexport default class IntercomCreateDirectoryRoute extends BaseIntercomRoute {\n declare controller: Controller;\n routeId = EmberVideoIntercomCreateDirectory;\n\n queryParams = {\n deviceId: getQueryParam('string')\n };\n\n deactivate(): void {\n this.controller.resetState();\n }\n\n async model({ deviceId }: { deviceId: string }): Promise {\n const model: CreateDirectoryModel = {\n intercomLogins: await this.store.findAll('video/settings/intercom/intercom-login')\n };\n if (deviceId) {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n model.intercom = await this.store.findRecord(\n 'video/intercom/intercom-directory',\n `${selectedSystem.unitId}_${deviceId}`\n );\n }\n return model;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { dataUrlToFile } from 'customer-site/enterprise/settings/helpers/file-upload-functions';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type CustomizeDirectoryRoute from './route';\n\n/**\n * Controller for customizing the intercom directory web page.\n */\nexport default class CustomizeDirectoryController extends Controller {\n @service declare identityManager: IdentityManager;\n @service declare router: RouterService;\n @service declare store: Store;\n @service declare notificationManager: NotificationManager;\n\n @tracked logoFile: File | null = null;\n @tracked logoFileDataUrl = '';\n\n declare model: ResolvedModelFrom;\n\n queryParams = ['deviceId'];\n\n deviceId: number = -1; // using -1 here because the ID is required, and a passed-in ID will always be positive.\n\n /**\n * Navigates to the previous page in the intercom setup process.\n */\n @action\n navigateBack() {\n this.router.transitionTo('video.settings.intercom.associated-device-select', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n\n @action\n async navigateNext() {\n if (this.model.qrCode !== undefined) {\n this.model.qrCode.logoFileName = this.logoFile?.name;\n this.model.qrCode.save();\n\n const selectedSystem = await this.identityManager.getSelectedSystem();\n const logoBody = {\n fileName: this.logoFile?.name,\n fileDataUrl: this.logoFileDataUrl,\n id: `${selectedSystem.unitId}_${this.deviceId}`\n };\n this.model.logo.setProperties(logoBody);\n await this.model.logo.save();\n\n // Navigate to the add directory page if there are existing directory lists; otherwise, navigate to the create directory page.\n const directoryLists = await this.store.findAll('video/intercom/intercom-directory-list');\n\n if (directoryLists.length > 0) {\n this.router.transitionTo('video.settings.intercom.add-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n } else {\n this.router.transitionTo('video.settings.intercom.create-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n }\n }\n\n @action\n fileChanged(file: File, dataUrl: any) {\n this.notificationManager.clearNonPersistentNotifications();\n this.logoFile = file;\n this.logoFileDataUrl = dataUrl;\n }\n\n /**\n * Process the loaded model data\n */\n @action\n dataLoaded(customizeDirectoryModel: ResolvedModelFrom) {\n Object.assign(this, {\n logoFile: dataUrlToFile(\n customizeDirectoryModel.qrCode.logoFileName,\n customizeDirectoryModel.logo.fileDataUrl\n ),\n logoFileDataUrl: customizeDirectoryModel.logo.fileDataUrl\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/customize-directory': CustomizeDirectoryController;\n }\n}\n","import { action } from '@ember/object';\nimport { EmberVideoIntercomCustomizeDirectory } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type IntercomQrCode from 'customer-site/models/video/intercom/intercom-qr-code';\nimport type IntercomLogo from 'customer-site/models/video/settings/intercom/intercom-logo';\n\ntype CustomizeDirectoryArgs = {\n logo: IntercomLogo;\n qrCode: IntercomQrCode;\n};\n\n/**\n * Route loads the intercom data associated with a specific device.\n */\nexport default class CustomizeDirectoryRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomCustomizeDirectory;\n\n queryParams = {\n deviceId: getQueryParam('string')\n };\n\n model({ deviceId }: { deviceId: string }): Promise {\n return (async () => {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n return {\n logo: await this.store.findRecord(\n `video/settings/intercom/intercom-logo`,\n `${selectedSystem.unitId}_${deviceId}`,\n {}\n ),\n qrCode: await this.store.queryRecord(`video/intercom/intercom-qr-code`, {\n qrFilter: `${selectedSystem.unitId}_${deviceId}`\n })\n };\n })();\n }\n\n /** @override */\n @action willTransition(): void {\n this.notificationManager.clearNonPersistentNotifications();\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport addLoginsToIntercom from 'customer-site/video/settings/intercom/add-logins-to-intercom';\nimport removeLoginsFromIntercoms from 'customer-site/video/settings/intercom/remove-logins-from-intercoms';\nimport CheckboxTreeItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/checkbox-tree-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomCreateDirectoryRoute from './route';\n\nexport default class VideoSettingsIntercomEditDirectoryController extends Controller {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare identityManager: IdentityManager;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n\n @tracked intercomLogins: CheckboxTreeItem[] = [];\n @tracked directoryName: string = '';\n\n declare model: ModelFrom;\n\n @action\n backAction(): void {\n this.identityManager.contextManager.transitionToPreviousRoute();\n }\n\n /**\n * Hitting next saves adds users to the intercom directory and redirects back to the setup page.\n */\n @action\n async nextAction(): Promise {\n try {\n const selectedIntercomLogins = this.intercomLogins\n .filter((item) => item.state === SELECTED)\n .map((item) => item.value);\n\n // Send update to micro API\n this.model.intercomDirectoryList.intercomLogins = selectedIntercomLogins;\n this.model.intercomDirectoryList.directoryListName = this.directoryName;\n const updatedDirectoryList = await this.model.intercomDirectoryList.save();\n\n const intercomDeviceIds = updatedDirectoryList.intercomDeviceIds ?? [];\n\n if (intercomDeviceIds.length) {\n const oldIntercomLoginIds = this.model.intercomContacts.map((contact) => contact.loginId);\n const newIntercomLoginIds = selectedIntercomLogins.map((login) => Number(login.split('_')[0]));\n\n removeLoginsFromIntercoms(oldIntercomLoginIds, newIntercomLoginIds, intercomDeviceIds, this.ajax);\n addLoginsToIntercom(selectedIntercomLogins, this.ajax);\n }\n\n this.router.transitionTo('video.settings.intercom.setup');\n } catch (error) {\n this.notificationManager.addError(error.errors[0].detail);\n }\n }\n\n /**\n * Create the CheckboxTreeItems from the model and default directory name.\n */\n @action\n dataLoaded() {\n this.intercomLogins = this.model.intercomLogins.map((login) => {\n const contact = this.model.intercomContacts?.find((contact) => contact.loginId.toString() == login.id);\n let firstName;\n let lastName;\n if (contact !== undefined) {\n firstName = contact.firstName !== null ? contact.firstName + ' ' : '';\n lastName = contact.lastName !== null ? contact.lastName : '';\n }\n return CheckboxTreeItem.create({\n name:\n contact !== undefined && (contact?.firstName !== null || contact?.lastName !== null)\n ? `${firstName}${lastName}`\n : login.loginName,\n secondaryDescription: login.unitName,\n value: `${login.id}_${login.unitName}_${login.contactUnitId}`,\n state: contact !== undefined ? SELECTED : UNSELECTED\n });\n });\n\n this.directoryName =\n this.model.intercomDirectoryList.directoryListName ?? this.intl.tc(this, 'defaultDirectoryName');\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/edit-directory': VideoSettingsIntercomEditDirectoryController;\n }\n}\n","import ArrayProxy from '@ember/array/proxy';\nimport { EmberVideoIntercomEditDirectory } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type IntercomContact from 'customer-site/models/video/intercom/intercom-contact';\nimport type IntercomDirectoryList from 'customer-site/models/video/intercom/intercom-directory-list';\nimport type IntercomLogin from 'customer-site/models/video/settings/intercom/intercom-login';\n\nexport interface EditDirectoryModel {\n intercomDirectoryList: IntercomDirectoryList;\n intercomLogins: ArrayProxy;\n intercomContacts: ArrayProxy;\n}\n\nexport default class IntercomCreateDirectoryRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomEditDirectory;\n\n async model({ id_edit_directory }: { id_edit_directory: string }): Promise {\n // Ember hates receiving an empty response from a query\n let intercomContacts: ArrayProxy;\n try {\n intercomContacts = await this.store.query(`video/intercom/intercom-contact`, {\n listId: id_edit_directory\n });\n } catch {\n intercomContacts = new ArrayProxy();\n }\n\n return {\n intercomDirectoryList: await this.store.findRecord(\n 'video/intercom/intercom-directory-list',\n id_edit_directory\n ),\n intercomLogins: await this.store.findAll('video/settings/intercom/intercom-login'),\n intercomContacts: intercomContacts\n };\n }\n}\n","import './_style.scss';\nimport { action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport IntercomCreateCallForwardingRulesRequestBody from 'customer-site/video/settings/intercom/ajax-request-utils/intercom-create-call-forwarding-rules-request-body';\nimport addLoginsToIntercom from '../add-logins-to-intercom';\nimport IntercomBulkInsertContactsRequestBody from '../ajax-request-utils/intercom-bulk-insert-contacts-request-body';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomNameDirectoryListRoute from './route';\n\n/**\n * Type for intercom contacts to be inserted.\n */\nexport interface IntercomContactInsert {\n loginId: number;\n directoryListId: number;\n unitId: number;\n contactUnitId: number;\n unitName: string;\n isFavorite: boolean;\n isActive: boolean;\n}\n\n/**\n * @classdesc\n * Controller for the name directory list page.\n */\nexport default class IntercomNameDirectoryListController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n @service declare identityManager: IdentityManager;\n\n /**\n * The name directory list model.\n */\n declare model: ModelFrom;\n\n /**\n * The name inputted for the directory list.\n */\n declare directoryListName: string;\n\n /**\n * List of apartments on the intercom.\n */\n @alias('model.intercomApartments')\n intercomApartments: IntercomApartment[] = [];\n\n /**\n * Goes back to the set concierge page.\n */\n @action\n backAction(): void {\n this.router.transitionTo('video.settings.intercom.set-concierge', this.model.deviceId);\n }\n\n /**\n * Creates call forwarding rules on the intercom, saves the connected units and logins to the intercom microapi.\n */\n @action\n async saveAction(): Promise {\n if (!this.directoryListName) {\n this.notificationManager.addError(this.intl.tc(this, 'errorNoText'));\n return;\n }\n\n try {\n // Save directory list name.\n const directoryListAdapter = this.store.adapterFor('video/intercom/intercom-directory-list');\n const directoryListId = this.intercomApartments[0].directoryListId;\n await directoryListAdapter.renameDirectoryList(directoryListId, this.directoryListName);\n\n // Create call forwarding rules on the intercom.\n const apartmentNumbers = this.intercomApartments.map((a) => a.apartmentNumber);\n const request = new IntercomCreateCallForwardingRulesRequestBody(apartmentNumbers, this.model.deviceId);\n await this.ajax.apiRequest(\n 'api/video/settings/intercom/createCallForwardingRules',\n undefined,\n request.serialize(),\n 'POST'\n );\n\n // Create concierge call forwarding rule.\n await this.ajax.apiRequest(\n `api/video/settings/intercom/createConciergeCallForwardingRule/${this.model.deviceId}`,\n undefined,\n null,\n 'POST'\n );\n\n // Update lu_intercom_apartment with the connected customer unit ids and call forward numbers.\n type Value = { unit_id: number; call_forward_number: string };\n const apartmentUpdates = new Map();\n this.intercomApartments.forEach((apartment) => {\n if (apartment.unitId !== undefined) {\n const key = apartment.apartmentId + '_' + apartment.directoryListId;\n const value: Value = {\n unit_id: apartment.unitId,\n call_forward_number: 'adc:' + apartment.apartmentNumber\n };\n\n apartmentUpdates.set(key, value);\n }\n });\n const apartmentAdapter = this.store.adapterFor('video/intercom/intercom-apartment');\n await apartmentAdapter.bulkUpdateApartments(apartmentUpdates);\n\n // Get all logins for each connected unit.\n const selectedSystem = await this.identityManager.getSelectedSystem();\n const unitIds = this.intercomApartments.map((a) => a.unitId);\n const selectedSystemUnitId = selectedSystem.unitId;\n const selectedSystemDescription = selectedSystem.description;\n const result = await this.store.query(`video/settings/intercom/intercom-unit-login-pairing`, {\n unitIds: unitIds\n });\n const unitLoginPairings = result.toArray();\n\n // Insert logins into lu_intercom_contact_2, including the concierge login.\n // Insert logins into lu_intercom_contact_directory, including the concierge login.\n // Give logins the IntercomVideoCalls role to the intercom system, including the concierge login. Send enrollment invitations to these logins.\n const intercomCustomerApartmentInfo = this.store\n .peekAll(`video/settings/intercom/intercom-customer-apartment-info`)\n .toArray();\n\n const conciergeLoginId = this.model.conciergeLoginId;\n const intercomContactsToInsert: IntercomContactInsert[] = [\n {\n loginId: conciergeLoginId,\n directoryListId: directoryListId,\n unitId: selectedSystemUnitId,\n contactUnitId: selectedSystemUnitId,\n unitName: selectedSystemDescription,\n isFavorite: false,\n isActive: false\n }\n ];\n const loginsToEnroll: string[] = [\n `${conciergeLoginId}_${selectedSystemDescription}_${selectedSystemUnitId}`\n ];\n\n unitLoginPairings.flatMap((p) => {\n // Get the unit ID and login IDs from the pairings.\n const { unitId, loginIds } = p;\n\n // Find the corresponding unitDescription for the unitId.\n let unitDescription = '';\n const apartmentInfo = intercomCustomerApartmentInfo.find((info) => info.unitId === unitId);\n unitDescription = apartmentInfo ? apartmentInfo.unitDescription : '';\n\n loginIds.forEach((loginId) => {\n intercomContactsToInsert.push({\n loginId: loginId,\n directoryListId: directoryListId,\n unitId: selectedSystemUnitId,\n contactUnitId: unitId,\n unitName: unitDescription,\n isFavorite: false,\n isActive: false\n });\n\n loginsToEnroll.push(`${loginId}_${unitDescription}_${unitId}`);\n });\n });\n\n const contactAdapter = this.store.adapterFor('video/intercom/intercom-contact');\n contactAdapter.bulkInsertContacts(new IntercomBulkInsertContactsRequestBody(intercomContactsToInsert));\n\n addLoginsToIntercom(loginsToEnroll, this.ajax);\n\n this.router.transitionTo('video.settings.intercom.setup');\n this.notificationManager.addSuccess(\n htmlSafe(`

${this.intl.tc(this, 'successTitle')}

${this.intl.tc(this, 'successBody')}`),\n 15000\n );\n } catch (error) {\n this.notificationManager.addError(error.errors[0].detail);\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/name-directory-list': IntercomNameDirectoryListController;\n }\n}\n","import { EmberVideoIntercomNameDirectoryList } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\n\nexport interface NameDirectoryListModel {\n intercomApartments: IntercomApartment[];\n conciergeLoginId: number;\n deviceId: string;\n}\n\nexport default class IntercomNameDirectoryListRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomNameDirectoryList;\n\n queryParams = {\n conciergeLoginId: getQueryParam('number')\n };\n\n async model({\n id_selected_intercom,\n conciergeLoginId\n }: {\n id_selected_intercom: string;\n conciergeLoginId: number;\n }): Promise {\n let intercomApartments: IntercomApartment[];\n try {\n const result = this.store.peekAll('video/intercom/intercom-apartment');\n intercomApartments = result.toArray();\n } catch {\n intercomApartments = [];\n }\n\n const model: NameDirectoryListModel = {\n intercomApartments: intercomApartments,\n conciergeLoginId: conciergeLoginId,\n deviceId: id_selected_intercom\n };\n\n return model;\n }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport ENV from 'customer-site/config/environment';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type QrCodeRoute from './route';\n\nexport default class QrCodeController extends Controller {\n @service declare intl: ADCIntlService;\n @service declare identityManager: IdentityManager;\n @service declare store: Store;\n @service declare notificationManager: NotificationManager;\n @service declare router: RouterService;\n\n queryParams = ['deviceId'];\n\n deviceId: number = -1; // using -1 here because the ID is required, and a passed-in ID will always be positive.\n\n declare model: ModelFrom;\n\n get IntercomVisitorDirectoryUrl() {\n const windowUrl = window.location.href;\n\n // This needs to be more specific as the url includes the query parameter deviceId\n if (windowUrl.includes('alarm.dev.adcinternal')) {\n return ENV.intercomVisitorDirectoryUrls.development;\n }\n if (windowUrl.includes('test')) {\n return ENV.intercomVisitorDirectoryUrls.test;\n }\n if (windowUrl.includes('localhost')) {\n return ENV.intercomVisitorDirectoryUrls.local;\n }\n\n return ENV.intercomVisitorDirectoryUrls.production;\n }\n\n get qrCodeData(): string {\n return `${this.IntercomVisitorDirectoryUrl}/${this.model.qrCodeId}`;\n }\n\n /**\n * Hitting cancel redirects to the add directory page.\n */\n @action\n cancelAction(): void {\n this.router.transitionTo('video.settings.intercom.add-directory', {\n queryParams: { deviceId: this.deviceId }\n });\n }\n\n /**\n * Hitting Save & Download will download the QR Code and redirect to the completion page.\n */\n @action\n nextAction(): void {\n try {\n // Find the img element within the div with id \"qr-code\"\n const qrCodeContainer = document.getElementById('qr-code');\n const qrCodeImg = qrCodeContainer?.querySelector('img');\n if (qrCodeImg) {\n // Get the src property, which has the base64 image\n const qrCodeSrc = qrCodeImg.src;\n const link = document.createElement('a');\n link.href = qrCodeSrc;\n link.download = 'qrcode.png';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n this.router.transitionTo('video.settings.intercom.setup');\n } catch (error) {\n if (error) {\n this.notificationManager.addError(this.intl.tc(this, 'saveError'));\n }\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/qr-code': QrCodeController;\n }\n}\n","import { EmberVideoIntercomQrCode } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type VideoQrCode from 'customer-site/models/video/intercom/intercom-qr-code';\n\ntype modelArg = { deviceId: number };\n\nexport default class VideoQrCodeRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomQrCode;\n\n queryParams = {\n deviceId: {\n replace: true,\n defaultValue: ''\n }\n };\n\n model({ deviceId }: modelArg): Promise {\n return (async (): Promise => {\n try {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n const model = await this.store.queryRecord(`video/intercom/intercom-qr-code`, {\n qrFilter: `${selectedSystem.unitId}_${deviceId}`\n });\n\n return model;\n } catch (error) {\n return Promise.reject(error);\n }\n })();\n }\n}\n","import './_style.scss';\nimport { tracked } from '@glimmer/tracking';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { BinaryListItem } from '@adc/ui-components/components/simple-binary/list';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\nimport type IntercomConcierge from 'customer-site/models/video/settings/intercom/intercom-concierge';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomSetConciergeRoute from './route';\n\n/**\n * @classdesc\n * Controller for the set concierge page.\n */\nexport default class IntercomSetConciergeController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n\n /**\n * Set concierge model.\n */\n declare model: ModelFrom;\n\n /**\n * The concierge that gets selected.\n */\n declare selectedConcierge: IntercomConcierge | null;\n\n /**\n * List of apartments on the intercom.\n */\n @alias('model.intercomApartments')\n intercomApartments: IntercomApartment[] = [];\n\n /**\n * List of possible concierge logins.\n */\n @alias('model.intercomConciergeOptions')\n intercomConciergeOptions: IntercomConcierge[] = [];\n\n /**\n * Search string from the search bar.\n */\n @tracked\n declare filterString: string | null;\n\n /**\n * Gets results for the searchbar.\n */\n @computed('filterString', 'intercomConciergeOptions')\n get filteredIntercomConciergeOptions(): BinaryListItem<{ loginId: number; loginName: string }>[] {\n let options = [];\n const filter = this.filterString;\n if (!filter) {\n options = this.intercomConciergeOptions;\n } else {\n options = this.intercomConciergeOptions.filter((c) => {\n return c.loginEmail.toLowerCase().includes(filter) || c.loginName.toLowerCase().includes(filter);\n });\n }\n\n return options.map(\n (o) =>\n new BinaryListItem({\n label: o.loginEmail,\n props: {\n loginId: o.loginId,\n loginName: o.loginName\n }\n })\n );\n }\n\n /**\n * Filters with the search bar.\n * @param searchString\n */\n @action\n filterConciergeOptions(searchString: string): void {\n this.filterString = searchString.toLowerCase();\n }\n\n /**\n * Saves the selected concierge option.\n */\n @action\n onChange(items: BinaryListItem<{ loginId: number; loginName: string }>[]): void {\n items.find((i) => {\n if (i.state) {\n const concierge = this.intercomConciergeOptions.find((c) => c.loginId === i.props.loginId);\n if (concierge) {\n this.selectedConcierge = concierge;\n }\n }\n });\n }\n\n /**\n * Goes back to the first page of setup.\n */\n @action\n backAction(): void {\n this.router.transitionTo('video.settings.intercom.connect-unit-to-system', this.model.deviceId);\n }\n\n /**\n * Hitting next continues directory setup and sends forward the apartments with linked unit ids plus the selected concierge.\n */\n @action\n async nextAction(): Promise {\n if (!this.selectedConcierge) {\n this.notificationManager.addError(this.intl.tc(this, 'errorNoSelection'));\n return;\n }\n\n this.router.transitionTo('video.settings.intercom.name-directory-list', this.model.deviceId, {\n queryParams: { conciergeLoginId: this.selectedConcierge.loginId }\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/set-concierge': IntercomSetConciergeController;\n }\n}\n","import { EmberVideoIntercomSetConcierge } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type IntercomConcierge from 'customer-site/models/video/settings/intercom/intercom-concierge';\n\nexport interface SetConciergeModel {\n intercomConciergeOptions: IntercomConcierge[];\n deviceId: string;\n}\n\nexport default class IntercomSetConciergeRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomSetConcierge;\n\n async model({ id_selected_intercom }: { id_selected_intercom: string }): Promise {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n\n let intercomConciergeOptions: IntercomConcierge[];\n try {\n const result = await this.store.query(`video/settings/intercom/intercom-concierge`, {\n customerId: selectedSystem.id\n });\n intercomConciergeOptions = result.toArray();\n } catch {\n intercomConciergeOptions = [];\n }\n\n const model: SetConciergeModel = {\n intercomConciergeOptions: intercomConciergeOptions,\n deviceId: id_selected_intercom\n };\n\n return model;\n }\n}\n","import Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport ENV from 'customer-site/config/environment';\nimport removeLoginsFromIntercoms from 'customer-site/video/settings/intercom/remove-logins-from-intercoms';\nimport DropdownActionItem from '@adc/ui-components/utils/dropdown-action-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type IntercomDirectory from 'customer-site/models/video/intercom/intercom-directory';\nimport type IntercomDirectoryList from 'customer-site/models/video/intercom/intercom-directory-list';\nimport type IntercomQrCode from 'customer-site/models/video/intercom/intercom-qr-code';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type IntercomSetupRoute from './route';\n\nexport default class IntercomSetupController extends Controller {\n @service declare router: RouterService;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare modals: ModalService;\n @service declare ajax: AjaxService;\n @service declare store: Store;\n\n declare model: ResolvedModelFrom;\n\n get IntercomVisitorDirectoryUrl(): string {\n const windowUrl = window.location.href;\n\n if (windowUrl.includes('dev')) {\n return ENV.intercomVisitorDirectoryUrls.development;\n }\n if (windowUrl.includes('test')) {\n return ENV.intercomVisitorDirectoryUrls.test;\n }\n if (windowUrl.includes('localhost')) {\n return ENV.intercomVisitorDirectoryUrls.local;\n }\n\n return ENV.intercomVisitorDirectoryUrls.production;\n }\n\n /**\n * Go to video device selection page.\n */\n @action\n startAction(): void {\n this.router.transitionTo('video.settings.intercom.video-device-select');\n }\n\n @computed('model.intercoms')\n get directories(): Array {\n return this.model.intercoms.map((item) => item.directory);\n }\n\n @computed('model.{directoryLists.[],intercoms}')\n get directoryLists(): Array<{\n directoryList: IntercomDirectoryList;\n actionItems: DropdownActionItem[];\n directoryNames: string;\n needsSetup: boolean;\n }> {\n const { intl, router } = this;\n return this.model.directoryLists.map((item) => {\n // Represents the names of the directories using this directory list\n const currentIntercoms = this.model.intercoms.filter(\n (intercom) => intercom.directory.directoryListId === Number(item.id)\n );\n const directoryNameList = currentIntercoms.map((intercom) => intercom.camera.description);\n\n // For BAS-IP, check if the directory needs to be set up.\n const isIntercomDevice = currentIntercoms.some((intercom) => intercom.camera.isIntercomDevice);\n const needsSetup =\n isIntercomDevice &&\n currentIntercoms.some((intercom) => {\n return (\n intercom.intercomApartments.length === 0 ||\n intercom.intercomApartments.every((apartment) => apartment.unitId === null || !apartment.unitId)\n );\n });\n\n return {\n directoryList: item,\n actionItems: isIntercomDevice\n ? [\n DropdownActionItem.create({\n name: intl.tc(this, 'editDirectoryList'),\n action: () =>\n router.transitionTo(\n 'video.settings.intercom.connect-unit-to-system',\n currentIntercoms.map((intercom) => intercom.directory.deviceId)[0]\n )\n })\n ]\n : [\n DropdownActionItem.create({\n name: intl.tc(this, 'editDirectoryList'),\n action: () => router.transitionTo('video.settings.intercom.edit-directory', item.id)\n }),\n ...(directoryNameList.length\n ? []\n : [\n DropdownActionItem.create({\n name: intl.tc(this, 'deleteDirectoryList'),\n action: () =>\n this.modals.showConfirmationDialog(\n intl.tc(this, 'deleteDirectoryList'),\n intl.tc(this, 'confirmDeleteDirectoryList'),\n {\n text: intl.t('generic.delete'),\n css: 'btn-color-danger',\n action: async () => {\n item.destroyRecord();\n }\n }\n )\n })\n ])\n ],\n directoryNames: directoryNameList.join(', '),\n needsSetup: needsSetup\n };\n });\n }\n\n @computed('directories.@each.isActive')\n get directoryActive(): string {\n return this.directories.map((item) => item.isActive).join('|');\n }\n\n @computed('directoryActive', 'model.intercoms', 'IntercomVisitorDirectoryUrl')\n get directoryData(): Array<{\n directory: IntercomDirectory;\n camera: Camera;\n qrCode: IntercomQrCode;\n directoryList: IntercomDirectoryList;\n actionItems: DropdownActionItem[];\n }> {\n const { intl, router } = this;\n return this.model.intercoms.map((item) => {\n const { directory, qrCode, camera } = item;\n const { deviceId, isActive } = directory;\n return {\n ...item,\n actionItems: [\n DropdownActionItem.create({\n name: intl.tc(this, 'editIntercom'),\n action: () =>\n router.transitionTo('video.settings.intercom.video-device-select', {\n queryParams: { deviceId: deviceId }\n })\n }),\n DropdownActionItem.create({\n name: intl.tc(this, 'downloadQrCode'),\n action: () =>\n router.transitionTo('video.settings.intercom.qr-code', {\n queryParams: { deviceId: deviceId }\n })\n }),\n DropdownActionItem.create({\n name: intl.tc(this, 'viewDirectory'),\n action: () => {\n window.open(`${this.IntercomVisitorDirectoryUrl}/${qrCode.qrCodeId}`);\n }\n }),\n DropdownActionItem.create({\n name: intl.tc(this, isActive ? 'disableDirectory' : 'enableDirectory'),\n action: () => {\n item.directory.isActive = !isActive;\n item.directory\n .save()\n .then(() =>\n this.notificationManager.addSuccess(\n intl.tc(this, item.directory.isActive ? 'intercomEnabled' : 'intercomDisabled')\n )\n );\n },\n actionArguments: [this.directoryActive]\n }),\n DropdownActionItem.create({\n name: intl.tc(this, 'deleteDirectory'),\n action: () =>\n this.modals.showConfirmationDialog(\n intl.tc(this, 'deleteDirectory'),\n intl.tc(this, 'confirmDeleteDirectory'),\n {\n text: intl.t('generic.delete'),\n action: () => {\n this.deleteIntercom(directory, camera);\n }\n }\n )\n })\n ]\n };\n });\n }\n\n /**\n * Delete the associated device pairings and directory.\n */\n async deleteIntercom(directory: IntercomDirectory, camera: Camera): Promise {\n const { intl, notificationManager } = this;\n\n try {\n const oldIntercomContacts = await this.store.query('video/intercom/intercom-contact', {\n listId: directory.directoryListId\n });\n const oldIntercomLoginIds = oldIntercomContacts.map((contact) => contact.loginId);\n removeLoginsFromIntercoms(oldIntercomLoginIds, [], [directory.deviceId], this.ajax);\n camera.intercomAssociatedDeviceIds = [];\n camera.save();\n await directory.destroyRecord();\n this.router.refresh();\n } catch (error) {\n // An OPTIONS request with 204 undefined \"error\" response is OK.\n if (error) {\n notificationManager.addError(intl.tc(this, 'deleteError'));\n } else {\n directory.unloadRecord();\n this.router.refresh();\n notificationManager.addSuccess(intl.tc(this, 'intercomDeleted'));\n }\n }\n }\n\n @action\n createDirectory(): void {\n this.router.transitionTo('video.settings.intercom.create-directory');\n }\n\n @action\n editDirectory(directoryList: IntercomDirectoryList): void {\n this.router.transitionTo('video.settings.intercom.edit-directory', directoryList.id);\n }\n\n /**\n * Goes to the connect unit to system page.\n */\n @action\n setupAction(directoryListId: string): void {\n const intercom = this.model.intercoms.find(\n (intercom) => intercom.directory.directoryListId === Number(directoryListId)\n );\n if (intercom) {\n this.router.transitionTo('video.settings.intercom.connect-unit-to-system', intercom.directory.deviceId);\n } else {\n this.notificationManager.addError(this.intl.tc(this, 'setupError'));\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/setup': IntercomSetupController;\n }\n}\n","import { EmberVideoIntercomSetup } from 'customer-site/enums/CustomerPageUrl';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type ArrayProxy from '@ember/array/proxy';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type IntercomApartment from 'customer-site/models/video/intercom/intercom-apartment';\nimport type IntercomDirectory from 'customer-site/models/video/intercom/intercom-directory';\nimport type IntercomDirectoryList from 'customer-site/models/video/intercom/intercom-directory-list';\nimport type IntercomQrCode from 'customer-site/models/video/intercom/intercom-qr-code';\n\ntype IntercomSetupModel = {\n intercoms: {\n directory: IntercomDirectory;\n camera: Camera;\n qrCode: IntercomQrCode;\n directoryList: IntercomDirectoryList;\n intercomApartments: IntercomApartment[];\n }[];\n directoryLists: ArrayProxy;\n};\n\nexport default class IntercomSetupRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomSetup;\n\n async model(): Promise {\n const lists = await this.store.findAll('video/intercom/intercom-directory-list');\n return {\n intercoms: await this.store.findAll('video/intercom/intercom-directory').then((directories) => {\n const directoryData: Promise<{\n directory: IntercomDirectory;\n camera: Camera;\n qrCode: IntercomQrCode;\n directoryList: IntercomDirectoryList;\n intercomApartments: IntercomApartment[];\n }>[] = directories.map(async (directory) => {\n const camera = await this.store.findRecord(\n 'video/devices/camera',\n `${directory.unitId}-${directory.deviceId}`\n );\n\n // For BAS-IP intercoms.\n let intercomApartments: IntercomApartment[] = [];\n if (camera.isIntercomDevice) {\n try {\n this.store.unloadAll('video/intercom/intercom-apartment');\n const result = await this.store.query(`video/intercom/intercom-apartment`, {\n id: `${directory.unitId}_${directory.deviceId}`\n });\n intercomApartments = result.toArray();\n } catch {\n intercomApartments = [];\n }\n }\n\n return {\n directory: directory,\n camera: camera,\n qrCode: await this.store.queryRecord('video/intercom/intercom-qr-code', {\n qrFilter: `${directory.unitId}_${directory.deviceId}`\n }),\n directoryList:\n directory.directoryListId > 0\n ? await this.store.findRecord(\n 'video/intercom/intercom-directory-list',\n directory.directoryListId\n )\n : ({} as IntercomDirectoryList),\n intercomApartments: intercomApartments\n };\n });\n\n return Promise.all(directoryData);\n }),\n directoryLists: lists\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport DirectoryViewTypeEnum from 'customer-site/enums/DirectoryViewTypeEnum';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport BaseIntercomSettingsController from '../base-intercom-settings-controller';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type VideoDeviceSelectRoute from './route';\n\n/**\n * @classdesc\n * Controller for the video device select page.\n */\nexport default class VideoDeviceSelectController extends BaseIntercomSettingsController {\n @service declare intl: ADCIntlService;\n @service declare identityManager: IdentityManager;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service declare router: RouterService;\n\n @tracked declare selectedDeviceId: number | null;\n\n declare model: ResolvedModelFrom;\n\n /**\n * Hitting cancel redirects to the intercom setup page.\n */\n @action\n cancelAction(): void {\n this.router.transitionTo('video.settings.intercom.setup');\n }\n\n /**\n * Selects the device to use for the intercom.\n */\n @action\n selectDevice(cameraDeviceId: string): void {\n this.selectedDeviceId = parseInt(getDeviceIdFromGlobalId(cameraDeviceId));\n }\n\n /**\n * Determines if the camera device id ({unitId}-{deviceId}) is equal to the selected device id.\n */\n @action\n isDeviceSelected(cameraDeviceId: string): boolean {\n return parseInt(getDeviceIdFromGlobalId(cameraDeviceId)) == this.selectedDeviceId;\n }\n\n /**\n * Hitting next creates the intercom and redirects to the associated devices select page.\n */\n @action\n async nextAction(): Promise {\n const { store } = this;\n\n try {\n if (!this.deviceId || this.selectedDeviceId != this.deviceId) {\n const selectedSystem = await this.identityManager.getSelectedSystem();\n\n let oldDirectory;\n\n try {\n oldDirectory = await store.findRecord(\n 'video/intercom/intercom-directory',\n `${selectedSystem.unitId}_${this.deviceId}`\n );\n } catch (error) {\n oldDirectory = null;\n }\n\n let oldQrCode;\n\n try {\n oldQrCode = await store.queryRecord(`video/intercom/intercom-qr-code`, {\n qrFilter: `${selectedSystem.unitId}_${this.deviceId}`\n });\n } catch (error) {\n oldQrCode = null;\n }\n\n const selectedDevice = this.model.find(\n ({ camera }) => camera.id === `${selectedSystem.unitId}-${this.selectedDeviceId}`\n );\n\n const newDirectory = {\n unitId: selectedSystem.unitId,\n deviceId: this.selectedDeviceId,\n deviceModel: selectedDevice?.camera.deviceModel,\n isActive: oldDirectory ? oldDirectory.isActive : true,\n directoryViewType: oldDirectory ? oldDirectory.directoryViewType : DirectoryViewTypeEnum.Name,\n directoryListId: oldDirectory ? oldDirectory.directoryListId : 0,\n groupId: oldDirectory ? oldDirectory.groupId : null\n };\n\n // Create a new qr code with the previous qr code's configurations.\n if (oldQrCode) {\n const newQrCode = {\n unitId: selectedSystem.unitId,\n deviceId: this.selectedDeviceId,\n header: oldQrCode.header,\n helpText: oldQrCode.helpText,\n logoFileName: oldQrCode.logoFileName,\n deletionDateUtc: oldQrCode.deletionDateUtc\n };\n\n store.createRecord('video/intercom/intercom-qr-code', newQrCode).save();\n }\n\n // Handle the deletion and passing of associated devices to the newly chosen video device.\n if (oldDirectory) {\n const newCamera = await store.findRecord(\n 'video/devices/camera',\n `${selectedSystem.unitId}-${this.selectedDeviceId}`\n );\n\n const oldCamera = await store.findRecord(\n 'video/devices/camera',\n `${selectedSystem.unitId}-${oldDirectory.deviceId}`\n );\n\n newCamera.intercomAssociatedDeviceIds = oldCamera.intercomAssociatedDeviceIds;\n newCamera.save();\n\n oldCamera.intercomAssociatedDeviceIds = [];\n oldCamera.save();\n\n oldDirectory.destroyRecord();\n }\n\n store.createRecord('video/intercom/intercom-directory', newDirectory).save();\n }\n\n this.router.transitionTo('video.settings.intercom.associated-device-select', {\n queryParams: { deviceId: this.selectedDeviceId }\n });\n } catch (error) {\n // An OPTIONS request with 204 undefined \"error\" response is OK.\n if (error) {\n this.notificationManager.addError(this.intl.tc(this, 'saveError'));\n }\n }\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/intercom/video-device-select': VideoDeviceSelectController;\n }\n}\n","import { EmberVideoIntercomVideoDeviceSelect } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport BaseIntercomRoute from 'customer-site/video/settings/intercom/base-intercom-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoDeviceSelectController from './controller';\n\ntype VideoDeviceSelectItem = {\n camera: Camera;\n isDisabled: boolean;\n};\n\nexport default class VideoDeviceSelectRoute extends BaseIntercomRoute {\n routeId = EmberVideoIntercomVideoDeviceSelect;\n\n model(params: { deviceId: number }): Promise {\n return (async () => {\n const cameras = await this.ajax.apiRequestForDataRecords(\n 'video/devices/cameras/getIntercomCameras',\n undefined,\n null,\n 'GET'\n );\n const directories = await this.store.findAll('video/intercom/intercom-directory');\n\n const model = cameras.map((camera) => {\n const deviceId = parseInt(getDeviceIdFromGlobalId(camera.id));\n const found = directories.any((directory) => directory.deviceId == deviceId);\n\n return {\n camera: camera,\n isDisabled: found && params.deviceId != deviceId\n };\n });\n\n return model;\n })();\n }\n\n setupController(\n controller: VideoDeviceSelectController,\n model: VideoDeviceSelectItem[],\n transition: Transition\n ): void {\n super.setupController(controller, model, transition);\n controller.selectedDeviceId = controller.deviceId;\n }\n\n resetController(controller: VideoDeviceSelectController, isExiting: boolean): void {\n if (isExiting) {\n controller.deviceId = null;\n controller.selectedDeviceId = null;\n }\n }\n}\n","import EmberController from '@ember/controller';\nimport { reads } from '@ember/object/computed';\nimport { EmberVideoLightTriggers } from 'customer-site/enums/CustomerPageUrl';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\n\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type { ResolvedModelFrom, ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * Controller for Light Triggers ember page.\n */\nexport default class Controller extends EmberController {\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoLightTriggers;\n\n /**\n * Resolved camera floodlight setting model.\n */\n resolvedModel?: ResolvedModelFrom;\n\n /**\n * An alias for the ov rules property.\n */\n @reads('resolvedModel.ovRules')\n declare ovRules: OvRule[];\n\n @reads('model.id')\n declare cameraId: string;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.cameraId);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/light-triggers': Controller;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { Light } from 'customer-site/enums/WebDeviceType';\nimport { EmberVideoLightTriggers } from '../../../enums/CustomerPageUrl';\n\nimport type Rule from 'customer-site/models/automation/rules/rule';\nimport type Schedule from 'customer-site/models/automation/schedules/schedule';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\nimport type CameraPirSetting from 'customer-site/models/video/camera-pir-setting';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\ninterface LightTriggersRouteModel {\n camera: ADCAsyncStoreFindRecord;\n rules: ADCAsyncStoreQuery;\n schedules: ADCAsyncStoreQuery;\n ovRules: ADCAsyncStoreFindAll | [];\n cameraLightSetting: ADCAsyncStoreFindRecord;\n cameraPirSetting: ADCAsyncStoreFindRecord;\n id: string;\n canViewVideoAnalytics: Promise;\n}\n\ntype LightTriggersRouteParams = {\n id_selected_camera: string;\n};\n\nexport default class VideoSettingsLightTriggers extends AdcBaseRoute {\n @service declare identityManager: IdentityManager;\n routeId = EmberVideoLightTriggers;\n\n /** @override */\n model({ id_selected_camera }: LightTriggersRouteParams): LightTriggersRouteModel {\n const automationParam = {\n deviceType: Light,\n globalDeviceId: id_selected_camera\n };\n\n const { identityManager, store } = this;\n\n return {\n camera: store.findRecord('video/devices/camera', id_selected_camera),\n schedules: store.query('automation/schedules/schedule', automationParam),\n rules: store.query('automation/rules/rule', automationParam),\n ovRules: identityManager.canManageVideoAnalytics ? this.store.findAll('video/ov-rule') : [],\n cameraLightSetting: store.findRecord('video/camera-light-setting', id_selected_camera),\n cameraPirSetting: store.findRecord('video/camera-pir-setting', id_selected_camera),\n id: id_selected_camera,\n canViewVideoAnalytics: store\n .findRecord('video/permissions/clips-usage-report-permission', identityManager.getSelectedSystemId())\n .then((p) => p.hasVideoAnalyticsReadAccess)\n };\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n

\\n {{tc\\n
\\n
    \\n
  1. {{t \\\"generic.video.indicatorLight\\\"}}
  2. \\n
  3. {{t \\\"generic.video.warningLight\\\"}}
  4. \\n
  5. {{t \\\"generic.video.floodlight\\\"}}
  6. \\n
\\n\",{ moduleName: \"customer-site/components/modals/video/light-setting-tooltip/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ContextManager from 'customer-site/services/context-manager';\n\n@intlPath({ path: 'modals/video/light-setting-tooltip' })\nexport default class LightSettingToolTip extends Component {\n @service declare contextManager: ContextManager;\n\n /**\n * Labeled floodlight image path.\n */\n get floodlightImagePath(): string {\n return this.contextManager.getStaticResourcePath('webimages/floodlight_labeled.png');\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Modals::Video::LightSettingTooltip': typeof LightSettingToolTip;\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport LightSettingToolTip from 'customer-site/components/modals/video/light-setting-tooltip/index';\nimport { EmberVideoLightsSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { NUM_SECONDS_IN_MINUTE } from 'customer-site/utils/datetime';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type { ManuallyTriggeredLightsDuration } from 'customer-site/enums/ManuallyTriggeredLightsDuration';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { LightsRouteModel } from './route';\nimport type Route from './route';\n\nconst MinBrightness = 0,\n MaxBrightness = 100;\n\nexport default class LightsController extends EmberController {\n @service declare modals: ModalService;\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n\n /**\n * Route query params.\n */\n queryParams = ['isVSR'];\n\n /**\n * Query param for isVSR query param.\n */\n @tracked isVSR?: boolean;\n\n /**\n * Lights route model.\n */\n declare model: LightsRouteModel;\n\n /**\n * Resolved camera light setting model.\n */\n declare resolvedModel: ResolvedModelFrom;\n\n /**\n * Camera light brightness.\n */\n @alias('resolvedModel.cameraLightSetting.lightBrightness')\n declare lightBrightness: number;\n\n /**\n * Is color night vision enabled?\n */\n @alias('resolvedModel.cameraLightSetting.isColorNightVisionEnabled')\n declare isColorNightVisionEnabled: boolean;\n\n /**\n * Duration (in seconds) the lights will stay on after triggered manually via live view.\n */\n @alias('resolvedModel.cameraLightSetting.manualLightDurationSeconds')\n declare manualLightDurationSeconds: ManuallyTriggeredLightsDuration;\n\n @alias('resolvedModel.cameraLightSetting.supportsFloodlight')\n declare supportsFloodlight: boolean;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoLightsSettings;\n\n /**\n * Minimum camera light brightness.\n */\n brightnessMin = MinBrightness;\n\n /**\n * Maximum camera light brightness.\n */\n brightnessMax = MaxBrightness;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * Dropdown item options for manual light durations.\n */\n @computed('resolvedModel.cameraLightSetting.manualLightDurationSecondsOptions', 'supportsFloodlight')\n get manualLightDurationOptions() {\n const { intl } = this;\n\n const options = this.resolvedModel.cameraLightSetting.manualLightDurationSecondsOptions.map((seconds) => {\n const getDurationText = () => {\n if (seconds === 0) {\n if (this.supportsFloodlight) {\n return intl.tc(this, 'indefinitely');\n }\n return intl.tc(this, 'untilLiveViewEnds');\n }\n if (seconds < NUM_SECONDS_IN_MINUTE) {\n return intl.t('generic.seconds', { num: seconds });\n }\n return intl.t('generic.minutes', { num: seconds / NUM_SECONDS_IN_MINUTE });\n };\n\n return { value: seconds.toString(), name: getDurationText() };\n });\n\n return options.map(({ value, name }) =>\n DropdownSelectItem.create({\n value,\n name\n })\n );\n }\n\n @computed('supportsFloodlight')\n get brightnessDescriptionText() {\n const { intl } = this;\n return this.supportsFloodlight\n ? intl.tc(this, 'floodlightBrightnessDescription')\n : intl.tc(this, 'brightnessDescription');\n }\n\n @computed('supportsFloodlight')\n get tooltipIcon() {\n return this.supportsFloodlight ? 'info-outline' : null;\n }\n\n /**\n * Action for updating the manually light trigger duration.\n */\n @action\n updateManualLightDuration(durationSeconds: string) {\n this.manualLightDurationSeconds = parseInt(durationSeconds) as ManuallyTriggeredLightsDuration;\n }\n\n /**\n * Action for when tooltip is clicked.\n */\n @action\n onTooltipClick() {\n const { modals } = this;\n\n modals.showModal(LightSettingToolTip);\n }\n\n /**\n * Action for when save is clicked.\n */\n @action\n async onSaveClicked(): Promise {\n const { cameraLightSetting } = this.resolvedModel;\n\n return cameraLightSetting\n .save()\n .then(() => this.notificationManager.addSuccess(this.intl.tc(this, 'savedSuccessfully')));\n }\n\n /**\n * Action for when cancel is clicked.\n */\n @action\n onCancelClicked() {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/lights': LightsController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoLightsSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type Transition from '@ember/routing/transition';\nimport type CameraLightSetting from 'customer-site/models/video/camera-light-setting';\n\nexport interface LightsRouteModel {\n cameraLightSetting: Promise;\n id: string;\n}\n\nexport default class Route extends AdcBaseRoute {\n routeId = EmberVideoLightsSettings;\n\n /** @override */\n queryParams = {\n isVSR: getQueryParam('bool')\n };\n\n /** @override */\n model({ id_selected_camera }: { id_selected_camera: string }): LightsRouteModel {\n return {\n cameraLightSetting: this.store.findRecord('video/camera-light-setting', id_selected_camera),\n id: id_selected_camera\n };\n }\n\n async beforeModel(transition: Transition): Promise {\n // On the first install of a light camera, the permissions need to be reloaded to access this page\n\n await this.contextManager.getRouteItemWithIdentityReloadIfNeeded(this.routeId);\n\n await super.beforeModel(transition);\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSettingsMotionConfiguration } from 'customer-site/enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type MotionConfigurationSetting from 'customer-site/models/video/settings/motion-configuration-setting';\nimport type MotionConfigurationController from './controller';\n\nexport type VideoSettingsMotionConfigurationModel = {\n camera: ADCAsyncStoreFindRecord;\n id: string;\n motionConfigurationSetting: Promise;\n};\n\n/**\n * @classdesc\n * Motion Configuration Settings page.\n */\nexport default class VideoSettingsMotionConfiguration extends AdcBaseRoute {\n //#region Override Properties\n /** @override */\n routeId = EmberVideoSettingsMotionConfiguration;\n\n /** @override */\n resetController(controller: MotionConfigurationController, isExiting: boolean): void {\n const { motionConfigurationSetting } = controller;\n\n if (isExiting) {\n motionConfigurationSetting.rollbackAttributes();\n }\n }\n\n model({ id_selected_camera }: { id_selected_camera: string }): VideoSettingsMotionConfigurationModel {\n const camera = this.store.findRecord('video/devices/camera', id_selected_camera);\n const motionConfigurationSetting = (async () => {\n // We reload the motion configuration setting to check if we have reached the maximum number of schedules using DMD (VID-72064)\n const cameraRecord = await camera;\n const motionConfig = await cameraRecord.motionConfigurationSetting;\n await motionConfig.reload();\n return motionConfig;\n })();\n\n return {\n camera,\n id: id_selected_camera,\n motionConfigurationSetting\n };\n }\n //#endregion\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoMotionDetectionTest } from 'customer-site/enums/CustomerPageUrl';\n\nexport default class VideoSettingsMotionDetectionTestRoute extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoMotionDetectionTest;\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { EmberVideoLightGuardMotionDetectionSettings } from 'customer-site/enums/CustomerPageUrl';\nimport {\n TwoSeconds,\n QuarterMinute,\n HalfMinute,\n Minute,\n FiveMinute,\n QuarterHour\n} from 'customer-site/enums/FloodPirDurationOption';\nimport { VeryNear, Near, Middle, Far } from 'customer-site/enums/FloodPirRange';\nimport { Bright, Twilight, Dark } from 'customer-site/enums/LuxTrigger';\nimport { NUM_SECONDS_IN_MINUTE } from 'customer-site/utils/datetime';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport DropdownSelectItem from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type { FloodPirDuration } from 'customer-site/enums/FloodPirDurationOption';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { MotionDetectionModel } from './route';\nimport type Route from './route';\n\nconst MinRangeTickValue = 0,\n MaxRangeTickValue = 3,\n DefaultRangeTickValue = 2;\n\nexport default class MotionController extends EmberController {\n @service declare intl: ADCIntlService;\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationManager;\n\n /**\n * Route query params.\n */\n queryParams = ['isVSR'];\n\n /**\n * Query param for isVSR query param.\n */\n @tracked isVSR?: boolean;\n\n /**\n * Route Model.\n */\n declare model: MotionDetectionModel;\n\n /**\n * The minimum motion detection range.\n */\n minRangeTickValue = MinRangeTickValue;\n\n /**\n * The maximum motion detection range.\n */\n maxRangeTickValue = MaxRangeTickValue;\n\n declare resolvedModel: ResolvedModelFrom;\n\n /**\n * The motion detection sensitivity.\n */\n @alias('resolvedModel.cameraPirSetting.pirSensitivity')\n declare sensitivity: number;\n\n /**\n * The motion detection sensitivity.\n */\n @alias('resolvedModel.cameraPirSetting.pirRange')\n declare pirRange: number;\n\n /**\n * Is PIR motion detection floodlight active or not.\n */\n @alias('resolvedModel.cameraPirSetting.pirMotionEnabled')\n declare isPIRFloodlightActive: boolean;\n\n /**\n * Is the PIR left zone selected.\n */\n @alias('resolvedModel.cameraPirSetting.pirLeftEnabled')\n declare isLeftZoneSelected: boolean;\n\n /**\n * Is the PIR center zone selected.\n */\n @alias('resolvedModel.cameraPirSetting.pirCenterEnabled')\n declare isCenterZoneSelected: boolean;\n\n /**\n * Is the PIR right zone selected.\n */\n @alias('resolvedModel.cameraPirSetting.pirRightEnabled')\n declare isRightZoneSelected: boolean;\n\n /**\n * Duration the floodlight will remain on after last motion is detected.\n */\n @alias('resolvedModel.cameraPirSetting.pirFloodlightDuration')\n declare movementTime: FloodPirDuration;\n\n /**\n * How dark it needs to be for PIR to be triggered.\n */\n @alias('resolvedModel.cameraPirSetting.luxTriggerSetting')\n declare ambientLight: number;\n\n /**\n * The customer page URL enum for motion detection settings page.\n */\n settingsPageId = EmberVideoLightGuardMotionDetectionSettings;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * Options to list in the movement options dropdown.\n */\n get movementTimeOptions(): DropdownSelectItem[] {\n const { intl } = this;\n\n const options = [TwoSeconds, QuarterMinute, HalfMinute, Minute, FiveMinute, QuarterHour].map((seconds) => {\n const durationText =\n seconds < NUM_SECONDS_IN_MINUTE\n ? intl.t('generic.seconds', { num: seconds })\n : intl.t('generic.minutes', { num: seconds / NUM_SECONDS_IN_MINUTE });\n\n return { value: seconds.toString(), name: durationText };\n });\n\n return options.map(({ value, name }) =>\n DropdownSelectItem.create({\n value,\n name\n })\n );\n }\n\n /**\n * Options to list in the ambient light dropdown.\n */\n get ambientLightOptions(): DropdownSelectItem[] {\n const { intl } = this;\n\n const options = [\n { value: Bright.toString(), name: intl.tc(this, 'bright') },\n { value: Twilight.toString(), name: intl.tc(this, 'twilight') },\n { value: Dark.toString(), name: intl.tc(this, 'dark') }\n ];\n return options.map(({ value, name }) =>\n DropdownSelectItem.create({\n value,\n name\n })\n );\n }\n\n /**\n * Gets slider tick value from pir range.\n */\n get tickValueFromPirRange(): number {\n const { pirRange } = this;\n switch (pirRange) {\n case VeryNear:\n return 0;\n case Near:\n return 1;\n case Middle:\n return 2;\n case Far:\n return 3;\n }\n\n return DefaultRangeTickValue;\n }\n\n /**\n * Sets pir range from the given slider tick value.\n */\n @action\n setPirRangeFromTickValue(tickValue: number) {\n switch (tickValue) {\n case 0:\n this.pirRange = VeryNear;\n break;\n case 1:\n this.pirRange = Near;\n break;\n case 2:\n this.pirRange = Middle;\n break;\n case 3:\n this.pirRange = Far;\n break;\n }\n }\n\n /**\n * Action for when a movement time option is selected in the dropdown.\n */\n @action\n onMovementTimeSelected(secondsString: string) {\n this.movementTime = parseInt(secondsString) as FloodPirDuration;\n }\n\n /**\n * Action for when a ambient light option is selected in the dropdown.\n */\n @action\n onAmbientLightSelected(ambientLightString: string) {\n this.ambientLight = parseInt(ambientLightString);\n }\n\n /**\n * Action for when wedge is clicked.\n */\n @action\n onWedgeClicked(wedge: string) {\n switch (wedge) {\n case 'left':\n this.isLeftZoneSelected = !this.isLeftZoneSelected;\n break;\n case 'center':\n this.isCenterZoneSelected = !this.isCenterZoneSelected;\n break;\n case 'right':\n this.isRightZoneSelected = !this.isRightZoneSelected;\n break;\n }\n }\n\n /**\n * Action for when cancel is clicked.\n */\n @action\n onCancelClicked() {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute();\n }\n\n /**\n * Action for when save is clicked.\n */\n @action\n async onSaveClicked(): Promise {\n const { cameraPirSetting } = this.resolvedModel;\n\n return cameraPirSetting\n .save()\n .then(() => this.notificationManager.addSuccess(this.intl.tc(this, 'savedSuccessfully')));\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/motion-detection': MotionController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\nimport { EmberVideoLightGuardMotionDetectionSettings } from '../../../enums/CustomerPageUrl';\n\nimport type CameraPirSetting from 'customer-site/models/video/camera-pir-setting';\n\nexport type MotionDetectionModel = {\n cameraPirSetting: CameraPirSetting;\n id: string;\n};\n\nexport default class VideoSettingsMotionDetection extends AdcBaseRoute {\n routeId = EmberVideoLightGuardMotionDetectionSettings;\n\n /** @override */\n queryParams = {\n isVSR: getQueryParam('bool')\n };\n\n /** @override */\n model({ id_selected_camera }: { id_selected_camera: string }) {\n return {\n cameraPirSetting: this.store.findRecord('video/camera-pir-setting', id_selected_camera),\n id: id_selected_camera\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { isMobileBrowser } from '@adc/ember-utils/utils/browser-helpers';\nimport EmberController from '@ember/controller';\nimport { action } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { Drawing } from 'customer-site/components/video/rules/draw-window/index';\nimport { EmberVideoPrivacyZonesSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { Rectangle } from 'customer-site/enums/DrawShape';\nimport {\n MAXIMUM_NUMBER_OF_PRIVACY_ZONE_POINTS,\n MAXIMUM_NUMBER_OF_RECTANGLE_POINTS,\n computeRectanglePoints,\n getRectangleCorners\n} from 'customer-site/utils/analytics-shape-validation';\nimport { getDeviceIdFromGlobalId, getGlobalIdFromUnitAndDevice } from 'customer-site/utils/general';\nimport { reject } from 'rsvp';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type ArrayProxy from '@ember/array/proxy';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type PrivacyZone from 'customer-site/models/video/privacy-zone';\nimport type PrivacyZonesSetting from 'customer-site/models/video/privacy-zones-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { SafeString } from 'handlebars';\nimport type Route from './route';\n\ntype resolvedModelType = { camera: Camera; privacyZonesSetting: PrivacyZonesSetting };\n\n/**\n * Represents the maximum number of privacy zones that can be stored on a camera.\n */\nconst MAX_NUM_PRIVACY_ZONES = 3;\n\n/**\n * @classdesc\n * The controller for the Privacy Zones Settings page.\n */\nexport default class PrivacyZonesController extends EmberController {\n // region Services\n\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n\n declare model: ModelFrom;\n\n // endregion\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked declare resolvedModel: resolvedModelType;\n\n /**\n * The unitId-deviceId of the camera.\n */\n @reads('model.id')\n declare globalDeviceId: string;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.globalDeviceId);\n }\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoPrivacyZonesSettings;\n\n /**\n * The privacy zones settings for the camera.\n */\n @reads('resolvedModel.privacyZonesSetting')\n declare privacyZonesSetting: PrivacyZonesSetting;\n\n /**\n * Any OvRules established for the camera.\n */\n @reads('resolvedModel.ovRules')\n declare ovRules: ArrayProxy;\n\n /**\n * Whether the user can edit privacy zones.\n */\n @reads('privacyZonesSetting.canEditPrivacyZones')\n declare canEditPrivacyZones: boolean;\n\n /**\n * Whether all privacy zones should be enabled.\n */\n @tracked allDrawingsEnabled = true;\n\n /**\n * The privacy zone drawings which are passed to the DrawWindow.\n */\n @tracked dictionaryOfDrawings: Record = {\n 0: new Drawing(),\n 1: new Drawing(),\n 2: new Drawing()\n };\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n /**\n * A 2D list of points that represent the coordinates of the Privacy Zones.\n * Displayed in a hidden field on the settings page for use in testing.\n */\n get privacyZoneCoordinates(): string {\n const { dictionaryOfDrawings } = this;\n const zoneIndexes = Object.keys(dictionaryOfDrawings).map((index) => parseInt(index));\n\n return `[${zoneIndexes.map(\n (index) =>\n `${index}: [${dictionaryOfDrawings[index].points.map((point) => `(${point.x},${point.y})`).join()}]`\n )}]`;\n }\n\n /**\n * The analytics zones that we want to discourage the user from drawing privacy zones in.\n */\n get warningZones(): Record[][] {\n const ovRuleZones = this.ovRules.mapBy('points');\n for (let i = 0; i < ovRuleZones.length; i++) {\n // Some OV rules may not contain any points if they are from a full-view analytics rule.\n // In this case, set the warning zone to be a rectangle that encompasses the whole screen.\n if (ovRuleZones[i].length == 0) {\n ovRuleZones[i] = [\n { x: 0.0, y: 0.0 },\n { x: 1.0, y: 0.0 },\n { x: 1.0, y: 1.0 },\n { x: 0.0, y: 1.0 }\n ];\n }\n }\n\n return ovRuleZones;\n }\n\n /**\n * The shape of the privacy zones that we're drawing.\n */\n @reads('privacyZonesSetting.privacyZoneShape')\n declare selectedShape: number;\n\n /**\n * This will override the maximum number of points that can be drawn on the DrawWindow.\n */\n get maxPoints(): number {\n return this.selectedShape === Rectangle\n ? MAXIMUM_NUMBER_OF_RECTANGLE_POINTS\n : MAXIMUM_NUMBER_OF_PRIVACY_ZONE_POINTS;\n }\n\n /**\n * This will override the editShapeInstructions when adjusting a pre-existing shape on the DrawWindow.\n */\n get editShapeInstructions(): string | null {\n return this.canEditPrivacyZones\n ? this.intl.tc(\n this,\n isMobileBrowser() ? 'instructionsMovePrivacyZoneMobile' : 'instructionsMovePrivacyZone'\n )\n : null;\n }\n\n /**\n * This will override the instructions when drawing a new shape on the DrawWindow.\n */\n get newShapeInstructions(): string | null {\n if (!this.canEditPrivacyZones) {\n return null;\n }\n\n const drawWindowResources = 'components.video.rules.draw-window',\n drawNewShape = this.intl.t(\n `${drawWindowResources}.${isMobileBrowser() ? 'drawNewShapeMobile' : 'drawNewShape'}`\n ),\n customShape = this.intl.tc(this, 'instructionsCreatePrivacyZone'),\n customShapeFinish = this.intl.t(`${drawWindowResources}.instructionsCustomShapeFinish`);\n\n return `${drawNewShape} ${customShape} ${customShapeFinish}`;\n }\n\n /**\n * Text that shows up by the popup for the more info modal.\n */\n get infoModalLearnMore(): string {\n return this.intl.tc(this, 'privacyZoneInfo.learnMore');\n }\n\n /**\n * Text and HTML to display on the more info modal.\n */\n get moreInfoModalData(): { title: string; info: SafeString } {\n const { intl } = this,\n title = intl.tc(this, 'privacyZoneInfo.title'),\n info = htmlSafe(`${intl.tc(this, 'privacyZoneInfo.bulletListTitle')}\n
    \n
  • ${intl.tc(this, 'privacyZoneInfo.bulletList1')}
  • \n
  • ${intl.tc(this, 'privacyZoneInfo.bulletList2')}
  • \n
  • ${intl.tc(this, 'privacyZoneInfo.bulletList3')}
  • \n
  • ${intl.t('components.video.rules.draw-window.groundZoneInfo.examples')}\n
  • ${intl.tc(this, 'privacyZoneInfo.example1')}
  • \n
  • ${intl.tc(this, 'privacyZoneInfo.example2')}
  • \n
  • ${intl.tc(this, 'privacyZoneInfo.example3')}
  • \n
\n ${intl.tc(this, 'privacyZoneInfo.numberedListTitle')}\n
    \n
  1. ${intl.tc(this, 'privacyZoneInfo.numberedList1')}
  2. \n
  3. ${intl.tc(this, 'privacyZoneInfo.numberedList2')}
  4. \n
  5. ${intl.tc(this, 'privacyZoneInfo.numberedList3')}
  6. \n
  7. ${intl.tc(this, 'privacyZoneInfo.numberedList4')}
  8. \n
  9. ${intl.tc(this, 'privacyZoneInfo.numberedList5')}
  10. \n
  11. ${intl.tc(this, 'privacyZoneInfo.numberedList6')}
  12. \n
  13. ${intl.tc(this, 'privacyZoneInfo.numberedList7')}
  14. \n
  15. ${intl.tc(this, 'privacyZoneInfo.numberedList8')}
  16. \n
`);\n\n return { title, info };\n }\n\n /**\n * Saves the privacy zones.\n */\n async save(): Promise {\n const { dictionaryOfDrawings, allDrawingsEnabled, selectedShape, globalDeviceId } = this,\n allDrawingIndexes = Object.keys(dictionaryOfDrawings).map((index) => parseInt(index)),\n allDrawingsCompletedOrEmpty = allDrawingIndexes.every((index) => {\n const drawing = dictionaryOfDrawings[index];\n\n return drawing.drawingCompleted || !drawing.points.length;\n });\n\n if (!allDrawingsCompletedOrEmpty) {\n this.notificationManager.addError(this.intl.tc(this, 'completeOrClearShapesToSave'));\n return reject();\n }\n\n const drawings = Object.keys(this.dictionaryOfDrawings).map((index) => parseInt(index)),\n dictionaryOfPrivacyZonesToSave: Record = {};\n\n drawings.forEach((index) => {\n let points = this.dictionaryOfDrawings[index].points;\n\n // There's no need to pass down an empty array of points.\n if (points.length) {\n if (selectedShape === Rectangle) {\n points = getRectangleCorners(points);\n }\n\n dictionaryOfPrivacyZonesToSave[index] = this.store.createRecord('video/privacy-zone', {\n points,\n enabled: allDrawingsEnabled\n });\n }\n });\n\n const { privacyZonesSetting } = this.resolvedModel;\n privacyZonesSetting.privacyZones = dictionaryOfPrivacyZonesToSave;\n\n try {\n await privacyZonesSetting.save();\n const snapshot = this.store.peekRecord('video/snapshot', globalDeviceId);\n\n // Unload the snapshot so it's forced to reload and show the new privacy zone.\n if (snapshot) {\n snapshot.unloadRecord();\n }\n return this.notificationManager.addSuccess(this.intl.tc(this, 'savedSuccessfully'));\n } catch (response) {\n return this.notificationManager.addError(response.errors[0].detail);\n }\n }\n\n // region Actions\n\n /**\n * Redirects the user to the settings page they selected in the dropdown.\n *\n * @param {string} settingsPageUrl The settings page to redirect to.\n */\n @action\n onUpdateSettingSelection(settingsPageUrl: string): void {\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n /**\n * Redirects the user to this page with the camera they selected in the dropdown.\n *\n * @param {string} cameraId The new camera ID.\n */\n @action\n async onUpdateVideoDeviceSelection(cameraId: string): Promise {\n const unitId: string = (await this.identityManager.getSelectedSystem())?.unitId.toString();\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n this.settingsPageId,\n undefined,\n undefined,\n getGlobalIdFromUnitAndDevice(unitId, cameraId)\n );\n }\n\n /**\n * When all the promises in the model have been resolved, store them in resolvedModel.\n * Also initialize the dictionaryOfDrawings with the privacy zone data.\n *\n * @param model\n */\n @action\n dataLoaded(model: resolvedModelType): void {\n this.resolvedModel = model;\n\n const { privacyZones, privacyZoneShape, someZonesEnabled } = this.privacyZonesSetting,\n indexes = [...Array(MAX_NUM_PRIVACY_ZONES).keys()],\n dictionaryOfDrawings: Record = {};\n\n indexes.forEach((index) => {\n const privacyZone = privacyZones[index];\n let points;\n\n if (privacyZone) {\n points = privacyZone.points;\n\n // If the shape is a rectangle, compute the four vertices of the rectangle\n // from the two corner points provided from the backend.\n if (privacyZoneShape === Rectangle) {\n points = computeRectanglePoints(points);\n }\n }\n\n dictionaryOfDrawings[index] = new Drawing(points, undefined, undefined);\n });\n\n // Consider all the drawings enabled if at least one zone is enabled, or if no zones exist.\n this.allDrawingsEnabled = someZonesEnabled || !Object.keys(privacyZones).length;\n this.dictionaryOfDrawings = dictionaryOfDrawings;\n }\n\n /**\n * Toggles whether the drawings are enabled.\n */\n @action\n onToggleDrawingsEnabled(): void {\n this.allDrawingsEnabled = !this.allDrawingsEnabled;\n }\n\n /**\n * This is triggered when a user clicks the 'Save' button.\n */\n @action\n async onSave(): Promise {\n const { identityManager, intl, modals } = this,\n { isSectorDealer } = identityManager;\n\n // Sector dealers want users to confirm before saving.\n if (await isSectorDealer) {\n modals.showConfirmationDialog(\n intl.t('generic.warning'),\n intl.tc(this, 'sectorConfirmationModalDescription'),\n { action: async () => await this.save() }\n );\n\n return;\n }\n\n return this.save();\n }\n\n // endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/privacy-zones': PrivacyZonesController;\n }\n}\n","import ArrayProxy from '@ember/array/proxy';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoPrivacyZonesSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\n\nimport type ForcedStreamingMethodEnum from 'customer-site/enums/ForcedStreamingMethod';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type OvRule from 'customer-site/models/video/ov-rule';\nimport type PrivacyZonesSetting from 'customer-site/models/video/privacy-zones-setting';\n\nexport type VideoSettingsPrivacyZoneModel = {\n camera: Promise;\n forcedStreamingMethodFromQueryParam: ForcedStreamingMethodEnum;\n id: string;\n relay?: string;\n privacyZonesSetting: Promise;\n ovRules: Promise>;\n};\n\ntype VideoSettingsPrivacyZoneQueryParams = {\n relay?: string;\n id_selected_camera: string;\n};\n\n/**\n * @classdesc\n * Privacy Zone Settings page.\n */\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoPrivacyZonesSettings;\n\n /** @override */\n queryParams = {\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n model(params: VideoSettingsPrivacyZoneQueryParams): VideoSettingsPrivacyZoneModel {\n const camera = this.store.findRecord('video/devices/camera', params.id_selected_camera);\n const privacyZonesSetting = (async () => {\n const c = await camera;\n // DO NOT COPY THIS, PLEASE IMPLEMENT THE SUGGESTION AND TEST.\n // @ts-expect-error privacyZonesSetting is async, so this code should be replace with `return (await c.privacyZonesSetting).reload();`.\n return c.privacyZonesSetting.reload();\n })();\n\n return {\n camera,\n id: params.id_selected_camera,\n privacyZonesSetting,\n ovRules: (async () => {\n const privacyZones = await privacyZonesSetting;\n if (privacyZones.ovRuleIds.length > 0) {\n return this.store.query('video/ov-rule', { ids: privacyZones.ovRuleIds });\n }\n\n const noRuleArray: OvRule[] = [];\n const noRuleArrayProxy: ArrayProxy = ArrayProxy.create({ content: noRuleArray });\n return noRuleArrayProxy;\n })(),\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(params.relay, undefined)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { next } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { fnEmpty } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { qualityKeyMapping } from 'customer-site/components/video/settings/playback-features/recording-quality-input/index';\nimport {\n Unknown,\n Success,\n UnexpectedException,\n DeviceCommandFailed,\n NoSdCard,\n SdCardNotFormatted,\n SdCardNotCompatible,\n ContainFootagesFromAnotherCamera,\n NoEncryptionKey,\n IncorrectEncryptionKeyInDevice,\n SdCardNotMounted,\n IncorrectAudioParameters,\n ContainBadDataForAudioRecording,\n ContainUnexpectedFiles,\n SdrDataNeedsToBeMigrated,\n IncorrectEncryptionKeyInDb,\n ContainFootagesFromAnotherCustomer,\n SdrDatabaseMoveFailed,\n AccessCheckInProgress\n} from 'customer-site/enums/AccessCheckResult';\nimport { EmberVideoSdCardSettings, EmberVideoSdCardSchedule } from 'customer-site/enums/CustomerPageUrl';\nimport {\n NoSchedule,\n Paused,\n OutsideActiveTimes,\n NotRecording,\n Recording\n} from 'customer-site/enums/SdCardRecordingStatus';\nimport { refresh, reformat } from 'customer-site/models/video/sd-card';\nimport { getGlobalIdFromUnitAndDevice, getDeviceIdFromGlobalId } from 'customer-site/utils/general';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalsService from '@adc/ui-components/services/modals';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type Transition from '@ember/routing/transition';\nimport type { StreamInfo } from 'customer-site/components/video/settings/playback-features/recording-quality-input/index';\nimport type SdCardRecordingSchedule from 'customer-site/models/video/schedules/sd-card-recording-schedule';\nimport type SdCardModel from 'customer-site/models/video/sd-card';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type TroubleConditionsService from 'customer-site/services/trouble-conditions';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type { TaskInstance } from 'ember-concurrency';\nimport type Route from './route';\n\n// region Constants.\n\nconst ONE_MINUTE = 60,\n ONE_HOUR = 60 * ONE_MINUTE,\n ONE_DAY = 24 * ONE_HOUR,\n ONE_TB = 1024,\n NA = 'generic.na';\n\n// endregion Constants.\n\n// region Private Functions.\n\n/**\n * Refreshes the SD card status and populates the new values on the page, including the last updated timestamp.\n */\nfunction refreshStatus(this: SdCardManagementController): void {\n const { id, ajax, intl, notificationManager } = this,\n action = () => refresh(ajax, id),\n fail = (message: string) => notificationManager.addError(message || intl.tc(this, 'refreshFail'));\n this.sdCardActionTaskInfo = this.sdCardActionTask.perform(action, fnEmpty, fail);\n}\n\n/**\n * Resets the properties on the page when a new camera is selected.\n */\nfunction reset(this: SdCardManagementController): void {\n const { sdCardActionTaskInfo } = this;\n\n // Cancel any refresh action from the previous camera if it is running.\n if (sdCardActionTaskInfo?.isRunning) {\n sdCardActionTaskInfo.cancel();\n }\n\n this.isRefreshing = false;\n this.hasRefreshed = false;\n this.showReformatOption = false;\n this.hideBackButton = false;\n}\n\n// endregion Private Functions.\n\n/**\n * @classdesc\n * The controller for the SD Card Management page.\n */\nexport default class SdCardManagementController extends Controller {\n // region Services.\n\n @service declare store: Store;\n @service declare ajax: AjaxService;\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalsService;\n @service declare notificationManager: NotificationService;\n @service declare troubleConditions: TroubleConditionsService;\n\n // endregion Services.\n\n declare model: ModelFrom;\n\n // region Properties.\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSdCardSettings;\n\n /**\n * Did the user click 'View' to navigate to reformatting their SD card?\n * If true, it shows the option to reformat the SD card.\n * If false, it shows generic information about the SD card.\n */\n @tracked\n showReformatOption = false;\n\n /**\n * Should the back button be hidden on the page when showReformatOption is true?\n * This will be true when the user navigates to the page by clicking on the \"Fix It\" button on the Alerts & Issues page.\n */\n @tracked\n hideBackButton = false;\n\n /**\n * Is the SD card data currently refreshing?\n */\n @tracked\n isRefreshing = false;\n\n /**\n * Has the SD card data been refreshed?\n */\n @tracked\n hasRefreshed = false;\n\n /**\n * Task info for SD card action.\n */\n @tracked\n sdCardActionTaskInfo?: TaskInstance;\n\n // endregion Properties.\n\n // region Computed Functions.\n\n @reads('model.id')\n id = '';\n\n /**\n * The timestamp when the SD card information was last updated.\n */\n @reads('sdCardModel.lastUpdatedDateUtc')\n lastUpdatedDateUtc: Date | null = null;\n\n /**\n * The AccessCheckResultEnum corresponding to which state the SD card is in.\n */\n @reads('sdCardModel.sdCardStatusEnum')\n sdCardStatusEnum = Unknown;\n\n /**\n * The SdCardRecordingStatusEnum corresponding to which state the recording schedule is in.\n */\n @reads('sdCardModel.recordingStatusEnum')\n recordingStatusEnum = NoSchedule;\n\n /**\n * The active times of the recording schedule.\n */\n @reads('sdCardModel.activeScheduleTimes')\n activeScheduleTimes = '';\n\n /**\n * The make of the SD card.\n */\n @reads('sdCardModel.make')\n make = '';\n\n /**\n * The storage capacity of the SD card.\n */\n @reads('sdCardModel.storageCapacityGb')\n storageCapacityGb = 0;\n\n /**\n * The date of the oldest recorded video on the SD card.\n */\n @reads('sdCardModel.oldestRecordedVideoUtc')\n oldestRecordedVideoUtc: Date | null = null;\n\n /**\n * The total number of seconds of recorded video on the SD card.\n */\n @reads('sdCardModel.recordedTimeSeconds')\n recordedTimeSeconds = 0;\n\n /**\n * The SD card recording schedule that this SD card is associated with.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('sdCardModel.recordingSchedule')\n recordingSchedule: SdCardRecordingSchedule | undefined = undefined;\n\n /**\n * The ID of the recording schedule associated with this SD card.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('recordingSchedule.id')\n recordingScheduleId: string | undefined = undefined;\n\n /**\n * The recording quality enum of the recording schedule.\n * This value will be undefined if there is no recording schedule.\n */\n @reads('recordingSchedule.recordingQuality')\n recordingQualityEnum: number | undefined = undefined;\n\n /**\n * The mapping from recording quality enum to the stream properties (frame rate, resolution, etc.).\n */\n @reads('sdCardModel.camera.recordingQualityToStreamMapping')\n recordingQualityToStreamMapping: Record | undefined = undefined;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n @computed('id')\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.id);\n }\n\n /**\n * The SD card model for the SD card that is associated with the currently selected camera.\n *\n * @note\n * This would normally run synchronously and return an SdCard model if it were in the route,\n * but that would cause the page to take too long to load (particularly for disconnected devices),\n * which would result in a bad user experience.\n * Instead, this is added to the template's promise-hash, which allows the loading spinner to appear in the container.loading block.\n * The promise-hash turns this into a special promise object because it is run asynchronously.\n */\n @computed('id', 'store')\n get sdCardModel(): ADCAsyncStoreFindRecord {\n return this.store.findRecord('video/sd-card', this.id);\n }\n\n /**\n * Returns the timestamp that the SD card information was last updated.\n */\n @computed('intl', 'lastUpdatedDateUtc')\n get lastUpdatedDate(): string {\n const { intl, lastUpdatedDateUtc } = this;\n return intl.t('generic.lastUpdated', {\n lastUpdatedDate: lastUpdatedDateUtc\n ? intl.formatDateTz(lastUpdatedDateUtc, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric'\n })\n : intl.t('generic.unknown')\n });\n }\n\n /**\n * The status of the device.\n */\n @computed('intl', 'sdCardStatusEnum')\n get deviceStatusString(): string {\n const { intl, sdCardStatusEnum } = this;\n\n if ([Unknown, UnexpectedException].includes(sdCardStatusEnum)) {\n return intl.t('generic.unknown');\n }\n\n if (sdCardStatusEnum === DeviceCommandFailed) {\n return intl.t('generic.notConnected');\n }\n\n return intl.t('generic.connected');\n }\n\n /**\n * The quality of the recording schedule.\n *\n * @returns The translated string 'Low', 'Medium', 'High', or 'Max'.\n */\n @computed('intl', 'recordingQualityEnum')\n get recordingQualityString(): string {\n const { intl, recordingQualityEnum } = this;\n if (recordingQualityEnum === undefined) {\n return intl.t(NA);\n }\n\n const resource = qualityKeyMapping.get(recordingQualityEnum) || NA;\n return intl.t(resource);\n }\n\n /**\n * The frame rate of the recording schedule.\n *\n * @returns The translated string of the form 'Xfps'.\n */\n @computed('intl', 'recordingQualityEnum', 'recordingQualityToStreamMapping')\n get frameRateString(): string {\n const { intl, recordingQualityEnum, recordingQualityToStreamMapping } = this;\n if (recordingQualityEnum === undefined || recordingQualityToStreamMapping === undefined) {\n return intl.t(NA);\n }\n\n const frameRate = recordingQualityToStreamMapping[recordingQualityEnum]?.FrameRate;\n return frameRate ? intl.tc(this, 'frameRate', { numFramesPerSecond: frameRate }) : intl.t(NA);\n }\n\n /**\n * The resolution of the recording schedule.\n *\n * @returns The translated string of the form 'width x height'.\n */\n @computed('intl', 'recordingQualityEnum', 'recordingQualityToStreamMapping')\n get resolutionString(): string {\n const { intl, recordingQualityEnum, recordingQualityToStreamMapping } = this;\n if (recordingQualityEnum === undefined || recordingQualityToStreamMapping === undefined) {\n return intl.t(NA);\n }\n\n const resolution = recordingQualityToStreamMapping[recordingQualityEnum]?.Resolution,\n width = resolution?.Width,\n height = resolution?.Height;\n return width && height ? intl.tc(this, 'resolution', { width, height }) : intl.t(NA);\n }\n\n /**\n * Did the access check enum indicate a failure and does it need to rerun?\n */\n @computed('recordingStatusEnum', 'sdCardStatusEnum')\n get accessCheckNeedsToRerun(): boolean {\n return (\n this.recordingStatusEnum !== NoSchedule &&\n [Unknown, UnexpectedException, DeviceCommandFailed].includes(this.sdCardStatusEnum)\n );\n }\n\n /**\n * Should the SD card be refreshed after the initial load from db?\n * This is true if the SD card has not already been refreshed,\n * and either the access check needs to rerun or there is a recording schedule without any intervals.\n */\n @computed(\n 'hasRefreshed',\n 'recordingStatusEnum',\n 'oldestRecordedVideoUtc',\n 'recordedTimeSeconds',\n 'accessCheckNeedsToRerun'\n )\n get shouldRefreshOnInitialLoad(): boolean {\n const {\n hasRefreshed,\n recordingStatusEnum,\n oldestRecordedVideoUtc,\n recordedTimeSeconds,\n accessCheckNeedsToRerun\n } = this,\n recordingScheduleWithoutIntervals =\n recordingStatusEnum !== NoSchedule && (!oldestRecordedVideoUtc || !recordedTimeSeconds),\n shouldRefresh = !hasRefreshed && (accessCheckNeedsToRerun || recordingScheduleWithoutIntervals);\n if (shouldRefresh) {\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n next(() => {\n refreshStatus.call(this);\n });\n }\n\n return shouldRefresh;\n }\n\n /**\n * Converts an SdCardRecordingStatusEnum to its corresponding string.\n */\n @computed('intl', 'recordingStatusEnum')\n get stringFromRecordingStatusEnum(): string {\n const { intl, recordingStatusEnum } = this;\n const mapping: { [recordingStatus: number]: { local: boolean; resource: string } } = {\n [NoSchedule]: { local: true, resource: 'noSchedule' },\n [Paused]: { local: false, resource: 'generic.video.paused' },\n [OutsideActiveTimes]: { local: true, resource: 'outsideActiveTimes' },\n [NotRecording]: { local: true, resource: 'notRecording' },\n [Recording]: { local: false, resource: 'generic.active' }\n };\n const resourceInfoForStatus: { local: boolean; resource: string } = mapping[recordingStatusEnum],\n { local, resource } = resourceInfoForStatus;\n\n return local ? intl.tc(this, resource) : intl.t(resource);\n }\n\n /**\n * Converts an AccessCheckResultEnum to its corresponding string.\n */\n @computed('intl', 'sdCardStatusEnum', 'recordingStatusEnum')\n get stringFromSdCardStatusEnum(): string {\n const { intl, sdCardStatusEnum, recordingStatusEnum } = this;\n const mapping: { [recordingStatus: number]: { local: boolean; resource: string } } = {\n [Unknown]: { local: false, resource: 'generic.unknown' },\n [Success]: { local: true, resource: recordingStatusEnum === Recording ? 'recording' : 'notRecording' },\n [UnexpectedException]: { local: false, resource: 'generic.unknown' },\n [DeviceCommandFailed]: { local: false, resource: 'generic.unknown' },\n [NoSdCard]: { local: true, resource: 'notInserted' },\n [SdCardNotFormatted]: { local: true, resource: 'notFormatted' },\n [SdCardNotCompatible]: { local: true, resource: 'notCompatible' },\n [ContainFootagesFromAnotherCamera]: { local: true, resource: 'previousData' },\n [NoEncryptionKey]: { local: true, resource: 'notFormatted' },\n [IncorrectEncryptionKeyInDevice]: { local: true, resource: 'unableToPlayBackFootage' },\n [SdCardNotMounted]: { local: true, resource: 'unableToPlayBackFootage' },\n [IncorrectAudioParameters]: { local: true, resource: 'unableToPlayBackFootage' },\n [ContainBadDataForAudioRecording]: { local: true, resource: 'unableToPlayBackFootage' },\n [ContainUnexpectedFiles]: { local: true, resource: 'notFormatted' },\n [SdrDataNeedsToBeMigrated]: { local: true, resource: 'unableToPlayBackFootage' },\n [IncorrectEncryptionKeyInDb]: { local: true, resource: 'unableToPlayBackFootage' },\n [ContainFootagesFromAnotherCustomer]: { local: true, resource: 'unknownData' },\n [SdrDatabaseMoveFailed]: { local: true, resource: 'unableToPlayBackFootage' },\n [AccessCheckInProgress]: { local: true, resource: 'busyProcessing' }\n };\n const resourceInfoForStatus: { local: boolean; resource: string } = mapping[sdCardStatusEnum],\n { local, resource } = resourceInfoForStatus;\n\n return local ? intl.tc(this, resource) : intl.t(resource);\n }\n\n /**\n * Gets the storage capacity in GB to the appropriate string (using either GB or TB).\n *\n * @returns The translated string of the form 'X GB/TB Total Storage Capacity'.\n */\n @computed('intl', 'storageCapacityGb')\n get storageCapacityString(): string {\n const { intl, storageCapacityGb } = this;\n if (!storageCapacityGb) {\n return intl.t(NA);\n }\n\n const showSizeInGb = storageCapacityGb < ONE_TB;\n return intl.t(`generic.video.${showSizeInGb ? 'totalStorageCapacityGb' : 'totalStorageCapacityTb'}`, {\n size: storageCapacityGb / (showSizeInGb ? 1 : ONE_TB)\n });\n }\n\n /**\n * Gets the date of the oldest recorded video on the SD card.\n */\n @computed('intl', 'oldestRecordedVideoUtc')\n get oldestRecordedVideoString(): string {\n const { intl, oldestRecordedVideoUtc } = this;\n return oldestRecordedVideoUtc\n ? intl.formatDateTz(oldestRecordedVideoUtc, { month: 'short', day: 'numeric', year: 'numeric' })\n : intl.t(NA);\n }\n\n /**\n * Converts the number of seconds to the number of days, hours, and minutes of recording.\n *\n * @returns The translated string of the form 'X Days Y Hours Z Mins'.\n */\n @computed('intl', 'recordedTimeSeconds')\n get daysHoursMinutesStringFromRecordedTimeSeconds(): string {\n const { intl, recordedTimeSeconds } = this;\n\n // If the SD card requires formatting or the value is 0, use 'N/A'.\n // Otherwise, use the actual value.\n if (!recordedTimeSeconds) {\n return intl.t(NA);\n }\n\n // Convert the total number of seconds into days, hours, and minutes.\n const days: number = Math.floor(recordedTimeSeconds / ONE_DAY),\n hours: number = Math.floor((recordedTimeSeconds % ONE_DAY) / ONE_HOUR),\n minutes: number = Math.floor((recordedTimeSeconds % ONE_HOUR) / ONE_MINUTE);\n\n return intl.t('generic.video.daysHoursMins', { days, hours, minutes });\n }\n\n /**\n * Returns an object containing the SD card's status properties and their corresponding values to display.\n */\n @computed(\n 'deviceStatusString',\n 'accessCheckNeedsToRerun',\n 'stringFromSdCardStatusEnum',\n 'stringFromRecordingStatusEnum',\n 'sdCardStatusEnum',\n 'recordingStatusEnum',\n 'hasRefreshed'\n )\n get statusPropertiesAndValues(): Array<{\n cssClass: string;\n propertyResource: string;\n value: string;\n errorStatus: boolean;\n visible: boolean;\n }> {\n const {\n deviceStatusString,\n accessCheckNeedsToRerun,\n stringFromSdCardStatusEnum,\n stringFromRecordingStatusEnum,\n sdCardStatusEnum,\n recordingStatusEnum,\n hasRefreshed\n } = this;\n\n return [\n {\n cssClass: 'device-status',\n propertyResource: 'generic.device',\n value: deviceStatusString,\n errorStatus: accessCheckNeedsToRerun,\n visible: hasRefreshed\n },\n {\n cssClass: 'sd-card-status',\n propertyResource: 'generic.video.sdCard',\n value: stringFromSdCardStatusEnum,\n errorStatus: recordingStatusEnum !== NoSchedule && sdCardStatusEnum !== Success,\n visible: true\n },\n {\n cssClass: 'recording-status',\n propertyResource: 'generic.video.recordingStatus',\n value: stringFromRecordingStatusEnum,\n errorStatus: recordingStatusEnum === NotRecording,\n visible: true\n }\n ];\n }\n\n /**\n * Returns an object containing the recording quality properties and their corresponding values to display.\n */\n @computed('frameRateString', 'resolutionString')\n get recordingQualityPropertiesAndValues(): Array<{ cssClass: string; propertyResource: string; value: string }> {\n const { frameRateString, resolutionString } = this;\n\n return [\n {\n cssClass: 'frame-rate-recording-quality',\n propertyResource: 'generic.video.frameRate',\n value: frameRateString\n },\n {\n cssClass: 'resolution-recording-quality',\n propertyResource: 'generic.video.resolution',\n value: resolutionString\n }\n ];\n }\n\n /**\n * Returns an object containing the SD card's non-status and non-recording-quality properties and their corresponding values to display.\n */\n @computed(\n 'intl',\n 'shouldRefreshOnInitialLoad',\n 'storageCapacityString',\n 'activeScheduleTimes',\n 'make',\n 'oldestRecordedVideoString',\n 'daysHoursMinutesStringFromRecordedTimeSeconds'\n )\n get propertiesAndValues(): Array<{ cssClass: string; propertyResource: string; value: string; loading: boolean }> {\n const {\n intl,\n shouldRefreshOnInitialLoad,\n storageCapacityString,\n activeScheduleTimes,\n make,\n oldestRecordedVideoString,\n daysHoursMinutesStringFromRecordedTimeSeconds\n } = this;\n\n return [\n {\n cssClass: 'schedule',\n propertyResource: 'generic.schedule',\n value: activeScheduleTimes || intl.t(NA),\n loading: false\n },\n {\n cssClass: 'make',\n propertyResource: 'generic.video.make',\n value: make || intl.t(NA),\n loading: false\n },\n {\n cssClass: 'storage',\n propertyResource: 'generic.video.storage',\n value: storageCapacityString,\n loading: false\n },\n {\n cssClass: 'oldest-recorded-video',\n propertyResource: 'generic.video.oldestRecordedVideo',\n value: oldestRecordedVideoString,\n loading: shouldRefreshOnInitialLoad\n },\n {\n cssClass: 'recorded-time',\n propertyResource: 'generic.video.recordedTime',\n value: daysHoursMinutesStringFromRecordedTimeSeconds,\n loading: shouldRefreshOnInitialLoad\n }\n ];\n }\n\n // endregion Computed Functions.\n\n // region Ember Concurrency Tasks.\n\n /**\n * Asynchronously performs the passed-in SD card action.\n *\n * @param action The function to call the correct API depending on the action.\n * @param successResponse The function to call if the request was successful.\n * @param failResponse The function to call if the request failed.\n */\n sdCardActionTask = task(\n this,\n { restartable: true },\n async (\n action: () => Promise<{ data: { attributes: any } }>, // Video, please fix these types instead of using \"any\"\n successResponse: () => any,\n failResponse: (message?: string) => any\n ) => {\n this.isRefreshing = true;\n\n try {\n const sdCard = await action();\n\n if (!sdCard?.data?.attributes) {\n return failResponse();\n }\n\n this.sdCardModel.setProperties({ ...sdCard.data.attributes });\n successResponse();\n\n this.isRefreshing = false;\n this.hasRefreshed = true;\n } catch (error: any) {\n const errorMessage: string = error?.errors?.firstObject?.detail;\n failResponse(errorMessage);\n\n this.isRefreshing = false;\n this.hasRefreshed = true;\n }\n }\n );\n\n // endregion Ember Concurrency Tasks.\n\n // region Actions.\n\n /**\n * Redirects the user to the settings page they selected in the dropdown.\n *\n * @param settingsPageUrl The settings page to redirect to.\n */\n @action\n updateSettingSelection(settingsPageUrl: string): void {\n reset.call(this);\n\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n /**\n * Redirects the user to this page with the camera they selected in the dropdown.\n *\n * @param cameraId The new camera ID.\n */\n @action\n async updateCamera(cameraId: string): Promise {\n const { contextManager } = this,\n unitId: string = (await this.identityManager.getSelectedSystem())?.unitId.toString();\n reset.call(this);\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(\n EmberVideoSdCardSettings,\n undefined,\n undefined,\n getGlobalIdFromUnitAndDevice(unitId, cameraId)\n );\n }\n\n /**\n * Toggle showing the option to reformat the SD card.\n */\n @action\n toggleShowReformatOption(): void {\n this.showReformatOption = !this.showReformatOption;\n }\n\n /**\n * Displays the modal for the user to confirm that they wish to reformat their SD card.\n */\n @action\n showReformatModal(): void {\n const { intl, notificationManager, ajax, troubleConditions, id } = this,\n modalTitle = intl.tc(this, 'reformatCard'),\n modalDescription = intl.tc(this, 'reformatConfirmation'),\n cancelButton = { text: intl.tc(this, 'doNotReformat') },\n confirmButton = {\n text: intl.tc(this, 'reformat'),\n css: 'btn-color-danger reformat',\n action: async () => {\n const action = () => reformat(ajax, troubleConditions, id),\n success = () => notificationManager.addSuccess(intl.tc(this, 'reformatSuccess')),\n fail = (message: string) =>\n notificationManager.addError(message || intl.tc(this, 'reformatFail'));\n this.sdCardActionTaskInfo = (await this.sdCardActionTask.perform(\n action,\n success,\n fail\n )) as unknown as TaskInstance;\n }\n };\n\n this.modals.showConfirmationDialog(modalTitle, modalDescription, confirmButton, cancelButton);\n }\n\n /**\n * Calls the function to refresh the SD card status.\n */\n @action\n refresh(): void {\n refreshStatus.call(this);\n }\n\n /**\n * Navigates to the Onboard recording schedule page.\n * If there is already a recording schedule, it navigates to the page to edit that schedule.\n * If there is no recording schedule, it navigates to the page to create a new schedule.\n */\n @action\n navigateToRecordingSchedule(): Promise> {\n return this.contextManager.transitionToRouteWithIdentityReloadIfNeeded(\n false,\n EmberVideoSdCardSchedule,\n undefined,\n undefined,\n undefined,\n this.recordingScheduleId || 'new'\n );\n }\n\n // endregion Actions.\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/sd-card-management': SdCardManagementController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSdCardSettings, EmberAlertsIssues } from 'customer-site/enums/CustomerPageUrl';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type ContextManager from 'customer-site/services/context-manager';\n\n/**\n * @classdesc\n * SD Card Management page.\n */\nexport default class Route extends AdcBaseRoute {\n // region Services.\n\n @service declare contextManager: ContextManager;\n\n // endregion Services.\n\n // region Overrides.\n\n /** @override */\n routeId = EmberVideoSdCardSettings;\n\n /** @override */\n queryParams = {\n showReformatOption: {\n as: 'reformat',\n ...getQueryParam('boolean')\n },\n hideBackButton: {\n as: 'isRedirect',\n ...getQueryParam('boolean')\n }\n };\n\n /** @override */\n model({\n id_selected_camera,\n showReformatOption,\n hideBackButton\n }: {\n id_selected_camera: string;\n showReformatOption: boolean;\n hideBackButton: boolean;\n }): { id: string } {\n const { contextManager } = this;\n // If we are on the reformat page and navigating to this page was from a redirect (from EmberAlertsIssues route),\n // then set EmberAlertsIssues as the previous route, so it will transition correctly when the back arrow is clicked.\n if (showReformatOption && hideBackButton) {\n contextManager.addRouteToVisitedRoutesStack(EmberAlertsIssues);\n }\n\n return {\n id: id_selected_camera\n };\n }\n\n // endregion Overrides.\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { computed, action } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport ConnectionStatus from 'customer-site/enums/ConnectionStatus';\nimport CustomerKnowledgeBase from 'customer-site/enums/CustomerKnowledgeBase';\nimport { EmberVideoSignalStrength } from 'customer-site/enums/CustomerPageUrl';\nimport FrequencyBandEnum from 'customer-site/enums/FrequencyBand';\nimport { buildKnowledgeBaseURL } from 'customer-site/helpers/knowledge-base-link';\nimport { convertDateToString } from 'customer-site/utils/datetime';\nimport {\n getConnectionFrequencyString,\n getConnectionTypeString,\n getWifiSignalStrengthString\n} from 'customer-site/utils/device-wifi';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport { getModalFooterButton } from '@adc/ui-components/components/modals/base/footer/modal-footer';\nimport SimpleListItem from '@adc/ui-components/components/simple-list/list-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type Store from '@ember-data/store';\nimport type { SignalStrength } from 'customer-site/enums/SignalStrength';\nimport type SignalStrengthInfo from 'customer-site/models/video/signal-strength-info';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom, ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n * The controller for the Signal Strength page.\n */\nexport default class Controller extends EmberController {\n // Region services\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare modals: ModalService;\n @service declare store: Store;\n // end region\n\n declare model: ModelFrom;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoSignalStrength;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * Is the signal strength card data currently refreshing?\n */\n @tracked\n isRefreshing = false;\n\n /**\n * The signal strength info for the device.\n */\n @reads('resolvedModel.signalStrengthInfo')\n declare signalStrengthInfo: SignalStrengthInfo;\n\n /**\n * The timestamp when the signal strength was last updated.\n */\n @reads('signalStrengthInfo.lastUpdatedDate')\n lastUpdatedDate: Date | null = null;\n\n /**\n * If the device is currently using ethernet connection\n */\n @equal('signalStrengthInfo.connectionType', ConnectionStatus.Remembered)\n declare isUsingEthernetConnection: boolean;\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * Get the signal strength quality string and appends the normalized signal strength\n */\n get signalStrengthQualityString(): string {\n const { intl, signalStrengthInfo } = this,\n { signalStrengthEnum, normalizedSignalStrength } = signalStrengthInfo;\n\n return getWifiSignalStrengthString(signalStrengthEnum, normalizedSignalStrength, intl);\n }\n\n /**\n * Returns the list of device info items\n */\n @computed('intl', 'resolvedModel', 'signalStrengthInfo')\n get networkInfoItems(): SimpleListItem[] {\n const { intl, signalStrengthInfo, resolvedModel, isUsingEthernetConnection } = this,\n { deviceSSID, connectionType, frequencyBand } = signalStrengthInfo;\n\n return [\n new SimpleListItem({\n description: intl.t('generic.deviceName'),\n value: resolvedModel?.camera.description\n }),\n ...(!isUsingEthernetConnection\n ? [\n new SimpleListItem({\n description: intl.t('generic.wifi.networkName'),\n value: deviceSSID ? deviceSSID : intl.t('generic.na')\n })\n ]\n : []),\n ...(isUsingEthernetConnection\n ? [\n new SimpleListItem({\n description: intl.t('generic.wifi.connectionType'),\n value: getConnectionTypeString(connectionType, intl)\n })\n ]\n : []),\n ...(frequencyBand !== FrequencyBandEnum.None\n ? [\n new SimpleListItem({\n description: intl.t('generic.wifi.frequencyBand'),\n value: getConnectionFrequencyString(frequencyBand, intl)\n })\n ]\n : [])\n ];\n }\n\n /**\n * Returns an array of history items from the signal strength history.\n */\n @computed('intl', 'signalStrengthInfo', 'signalStrengthInfo.signalStrengthHistory')\n get history(): SimpleListItem<{ signalStrengthEnum?: SignalStrength }>[] {\n const { intl, signalStrengthInfo } = this,\n { signalStrengthHistory } = signalStrengthInfo;\n const history =\n signalStrengthHistory.length > 0\n ? signalStrengthHistory.map((signalHistoryItem) => {\n return new SimpleListItem({\n description: convertDateToString(intl, signalHistoryItem.timestamp, false),\n value: intl.t('generic.valuePercent', { value: signalHistoryItem.normalizedSignalStrength }),\n props: { signalStrengthEnum: signalHistoryItem.signalStrengthEnum }\n });\n })\n : [\n new SimpleListItem({\n description: intl.tc(this, 'noHistory')\n })\n ];\n\n return history;\n }\n\n /**\n * Returns the timestamp that the signal strength card information was last updated.\n */\n @computed('intl', 'lastUpdatedDate', 'signalStrengthInfo')\n get lastUpdatedDateTimestamp(): string {\n const { intl, lastUpdatedDate } = this;\n return intl.t('generic.lastUpdated', {\n lastUpdatedDate: lastUpdatedDate\n ? convertDateToString(intl, lastUpdatedDate, true)\n : intl.t('generic.unknown')\n });\n }\n\n /**\n * Requests the signal strength from the device.\n */\n @action\n showInfoModal() {\n const { intl } = this;\n\n const footerButtons = this.contextManager.identityModel.canViewKnowledgeBase\n ? [\n getModalFooterButton(\n intl.t('generic.learnMore'),\n () => {\n window.open(\n buildKnowledgeBaseURL(CustomerKnowledgeBase.VideoSignalStrength, this.contextManager),\n '_blank'\n );\n },\n 'btn btn-primary'\n )\n ]\n : [];\n\n this.modals.showInfoModal({\n title: intl.tc(this, 'signalStrengthHistoryTitle'),\n info: htmlSafe(`

${intl.tc(this, 'infoBodyOne')}

\n

${intl.tc(this, 'infoBodyTwo')}

`),\n buttons: footerButtons\n });\n }\n\n /**\n * Requests the signal strength from the device.\n */\n @action\n async refreshSignalStrength(): Promise {\n this.isRefreshing = true;\n try {\n await this.signalStrengthInfo.reload();\n } catch (e) {\n return false;\n } finally {\n this.isRefreshing = false;\n }\n\n return true;\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/signal-strength-info': Controller;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoSignalStrength } from 'customer-site/enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type SignalStrengthInfo from 'customer-site/models/video/signal-strength-info';\n\n// Model to be passed into page\nexport type SignalStrengthRouteModel = {\n camera: Promise;\n id: string;\n signalStrengthInfo: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n *\n * Signal Strength Info page\n *\n */\n\nexport default class Route extends AdcBaseRoute {\n /** @override */\n routeId = EmberVideoSignalStrength;\n\n // model data\n /** @override */\n model({ id_selected_camera }: { id_selected_camera: string }): SignalStrengthRouteModel {\n const camera = this.store.findRecord('video/devices/camera', id_selected_camera);\n return {\n camera,\n id: id_selected_camera,\n signalStrengthInfo: this.store.findRecord('video/signal-strength-info', id_selected_camera)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { isAdapterErrorProcessingError } from '@adc/ajax/utils/status-codes';\n\nimport type AdcAjaxService from '@adc/ajax/services/adc-ajax';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type { AppNotification } from '@adc/ui-components/services/notification-manager';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type StreamVideoToPanelInfo from 'customer-site/models/video/stream-video-to-panel-info';\nimport type { ResolvedModelFrom, ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n *\n * The controller for the redesigned Stream Video to Panel route.\n */\nexport default class StreamVideoPanelV2Controller extends Controller {\n @service declare ajax: AdcAjaxService;\n @service declare notificationManager: NotificationManager;\n @service declare intl: ADCIntlService;\n\n // region Properties\n\n declare model: ModelFrom;\n\n /**\n * This contains promises that have been resolved from the model.\n */\n @tracked resolvedModel?: ResolvedModelFrom;\n\n /**\n * Are we currently loading the panel cameras? If true, display the spinner.\n */\n @tracked isLoadingPanelCameras = true;\n\n /**\n * The cameras that can stream video to the panel.\n */\n @tracked panelCameras = [] as Camera[];\n\n /**\n * Is the outstanding legal agreement action sheet open?\n */\n @tracked isLegalAgreementsActionSheetOpen = false;\n\n /**\n * An array containing the stream video to panel information for each camera.\n */\n @tracked\n streamVideoToPanelInfos = [] as StreamVideoToPanelInfo[];\n\n /**\n * Determines if the save button should be disabled.\n * For instance, a 'login as' user may not be allowed to save changes.\n */\n @tracked\n isSaveDisabled?: boolean;\n\n /**\n * Determines if user can enable streaming for cameras or only disable cameras that are streaming already.\n */\n @tracked\n isEnableStreamingAllowed?: boolean;\n\n /**\n * The Video Settings Permission model.\n */\n @alias('resolvedModel.videoSettingsPermission')\n declare videoSettingsPermission: VideoSettingsPermission;\n\n /**\n * Should the enable/disable all buttons be disabled?\n */\n @computed('isSaveDisabled', 'isEnableStreamingAllowed')\n get isChangeAllDisabled(): boolean {\n return this.isSaveDisabled || !this.isEnableStreamingAllowed;\n }\n\n /**\n * Returns uppercased translation for all and none.\n */\n get uppercasedTranslation(): { all: string; none: string } {\n const { intl } = this;\n\n return { all: intl.t('generic.all').toLocaleUpperCase(), none: intl.t('generic.none').toLocaleUpperCase() };\n }\n\n // endregion\n\n /**\n * Processes the loaded data.\n */\n @action\n async dataLoaded(resolvedModel: ResolvedModelFrom): Promise {\n Object.assign(this, {\n resolvedModel: resolvedModel,\n panelCameras: [],\n streamVideoToPanelInfos: []\n });\n\n const allCameras = resolvedModel.cameras.toArray();\n\n for (const camera of allCameras) {\n if (await camera.streamVideoToPanelInfo) {\n this.panelCameras = [...this.panelCameras, camera];\n }\n }\n\n for (const panelCamera of this.panelCameras) {\n const streamVideoToPanelInfo = await panelCamera.streamVideoToPanelInfo;\n this.streamVideoToPanelInfos.push(streamVideoToPanelInfo);\n }\n\n this.isSaveDisabled = !this.streamVideoToPanelInfos?.some((info) => info.canChangeStreamToPanel === true);\n this.isEnableStreamingAllowed = this.streamVideoToPanelInfos?.some((info) => info.canStreamToPanelBeEnabled);\n this.isLegalAgreementsActionSheetOpen = !this.isEnableStreamingAllowed;\n this.isLoadingPanelCameras = false;\n }\n\n /**\n * Updates all camera models so that streaming to panel can be enabled.\n */\n @action\n enableAll(): void {\n this.streamVideoToPanelInfos.map((info) => (info.isStreamToPanelEnabled = true));\n }\n\n /**\n * Updates all camera models so that streaming to panel can be disabled.\n */\n @action\n disableAll(): void {\n this.streamVideoToPanelInfos.map((info) => (info.isStreamToPanelEnabled = false));\n }\n\n /**\n * Toggle the isStreamToPanelEnabled value for the selected camera.\n */\n @action\n async toggleIsStreamToPanelEnabled(cameraId: string): Promise {\n this.streamVideoToPanelInfos.map((info) => {\n if (info.id === cameraId) {\n info.isStreamToPanelEnabled = !info.isStreamToPanelEnabled;\n }\n });\n }\n\n /**\n * Saves the setting for the cameras eligible for streaming to the panel.\n */\n @action\n async save(): Promise {\n const { notificationManager, intl } = this;\n\n // Only save the camera model if isStreamToPanelEnabled actually changed.\n return Promise.all(\n this.streamVideoToPanelInfos\n .filter((s) => s.changedAttributes().isStreamToPanelEnabled)\n .map((s) => s.save())\n )\n .then(() => this.notificationManager.addSuccess(intl.tc(this, 'settingsSavedSuccess')))\n .catch((response) => {\n const errorText = getErrorText(response);\n if (!isAdapterErrorProcessingError(response)) {\n notificationManager.addError(errorText ?? intl.tc(this, 'failedToSaveSettings'));\n }\n\n return Promise.reject();\n });\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/stream-video-panel-v2': StreamVideoPanelV2Controller;\n }\n}\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport BaseVideoSettingsRoute from 'customer-site/video/settings/camera/base-settings-route';\nimport { EmberVideoSettingsStreamVideoPanel } from '../../../enums/CustomerPageUrl';\n\nimport type Transition from '@ember/routing/transition';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoSettingsPermission from 'customer-site/models/video/permissions/video-settings-permission';\nimport type IdentityManager from 'customer-site/services/identity-manager';\nimport type StreamVideoPanelV2Controller from './controller';\n\nexport type StreamVideoPanelModel = {\n cameras: ADCAsyncStoreFindAll;\n videoSettingsPermission: ADCAsyncStoreFindRecord;\n};\n\n/**\n * @classdesc\n * Stream Video to Panel Settings page.\n */\nexport default class Route extends BaseVideoSettingsRoute {\n @service declare identityManager: IdentityManager;\n\n // region override properties\n\n /** @override */\n routeId = EmberVideoSettingsStreamVideoPanel;\n\n // endregion\n\n model(): StreamVideoPanelModel {\n return {\n cameras: this.store.findAll('video/devices/camera'),\n videoSettingsPermission: this.store.findRecord(\n 'video/permissions/video-settings-permission',\n this.identityManager.getSelectedSystemId()\n )\n };\n }\n\n /** @override */\n @action async willTransition(transition: Transition): Promise {\n const controller = this.controller as StreamVideoPanelV2Controller,\n { videoSettingsPermission, streamVideoToPanelInfos, save } = controller;\n\n this.showUnsavedChangesModalIfNeeded(\n transition,\n videoSettingsPermission.canUserEditVideoSettings,\n async () => {\n await save();\n },\n streamVideoToPanelInfos\n );\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type StreamVideoToPanelInfo from 'customer-site/models/video/stream-video-to-panel-info';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from './route';\n\n/**\n * @classdesc\n *\n * The controller for the video/settings/stream-video-panel route.\n */\n\nexport default class StreamVideoPanelController extends Controller {\n @service declare notificationManager: NotificationManager;\n @service declare intl: ADCIntlService;\n\n declare model: ModelFrom;\n\n // region Properties\n\n /**\n * An array containing the stream video to panel information for each camera.\n */\n @tracked\n streamVideoToPanelInfos: StreamVideoToPanelInfo[] = [];\n\n /**\n * Determines if the save button should be disabled.\n * For instance, a 'login as' user may not be allowed to save changes.\n */\n get isSaveDisabled(): boolean {\n return this.streamVideoToPanelInfos.every((i) => !i.canChangeStreamToPanel) ?? false;\n }\n\n /**\n * Determines if user can enable streaming for cameras or only disable cameras that are streaming already.\n */\n get isEnableStreamingAllowed(): boolean {\n return this.streamVideoToPanelInfos.some((i) => i.canStreamToPanelBeEnabled) ?? false;\n }\n\n /**\n * Should the enable/disable all buttons be disabled?\n */\n get isChangeAllDisabled(): boolean {\n return this.isSaveDisabled || !this.isEnableStreamingAllowed;\n }\n\n // endregion\n\n @action\n toggleAll(state: boolean): void {\n this.streamVideoToPanelInfos.forEach((s) => (s.isStreamToPanelEnabled = state));\n }\n\n /**\n * Saves the setting for the cameras eligible for streaming to the panel.\n */\n @action\n save(buttonAnimation: Promise): Promise {\n buttonAnimation.then((isSuccess) => {\n if (isSuccess) {\n this.notificationManager.addSuccess(this.intl.tc(this, 'settingsSavedSuccess'));\n }\n });\n\n // Only save the camera model if isStreamToPanelEnabled actually changed.\n return Promise.all(\n this.streamVideoToPanelInfos\n .filter((s) => s.changedAttributes().isStreamToPanelEnabled)\n .map((s) => s.save())\n );\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/stream-video-panel': StreamVideoPanelController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from '../../../classes/base-route';\nimport { EmberVideoSetupPanelStreaming } from '../../../enums/CustomerPageUrl';\n\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type StreamVideoToPanelInfo from 'customer-site/models/video/stream-video-to-panel-info';\nimport type ContextManager from 'customer-site/services/context-manager';\n\nexport type StreamVideoPanelModel = {\n cameras: Camera[];\n streamVideoToPanelInfos: Promise;\n};\n\n/**\n * @classdesc\n * Stream Video to Panel Settings page.\n */\nexport default class Route extends AdcBaseRoute {\n @service declare contextManager: ContextManager;\n\n // region override properties\n\n /** @override */\n routeId = EmberVideoSetupPanelStreaming;\n\n /** @override */\n isMediumWidthPage = true;\n\n // endregion\n\n async model(): Promise {\n const panelCameras = [],\n allCameras = (await this.store.findAll('video/devices/camera')).toArray();\n\n for (const camera of allCameras) {\n if (await camera.streamVideoToPanelInfo) {\n panelCameras.push(camera);\n }\n }\n\n return {\n cameras: panelCameras,\n streamVideoToPanelInfos: Promise.all(panelCameras.map((camera) => camera.streamVideoToPanelInfo))\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport EmberController from '@ember/controller';\nimport { action, computed, get, getProperties } from '@ember/object';\nimport { gte, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport { task } from 'ember-concurrency';\nimport { EmberVideoStreamSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { High, Medium } from 'customer-site/enums/OnvifCameraStreamMap';\nimport { getDeviceIdFromGlobalId } from 'customer-site/utils/general';\nimport { POST } from '@adc/ajax/services/adc-ajax';\nimport { sentryWithScopeAndError } from '@adc/app-infrastructure/utils/sentry';\nimport DropdownSelectItem, { SELECTED, UNSELECTED } from '@adc/ui-components/utils/dropdown-select-item';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Store from '@ember-data/store';\nimport type RouterService from '@ember/routing/router-service';\nimport type Transition from '@ember/routing/transition';\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ResolvedModelFrom } from 'customer-site/utils/type-utils';\nimport type { SafeString } from 'handlebars';\nimport type SettingsStreamIndexRoute from './route';\n\n// TODO: use standard DropdownSelectItems and DropdownSelectItem.create()\ntype DropdownListItem = {\n name: string;\n value: string;\n};\n\n// A stream that has a current stream ID.\ntype OnvifCameraStreamWithStreamId = OnvifCameraStream & { currentStreamId: number };\n\n// A stream with their index in the dropdown menu for selecting OnvifCameraStreams\ntype StreamIndexPair = { stream: OnvifCameraStream; index: number };\n\ninterface StreamMappingSection {\n stream: OnvifCameraStream;\n streamOptions: DropdownSelectItem[];\n bitRateOptions?: DropdownListItem[];\n frameRateOptions?: DropdownListItem[];\n gopLengthOptions?: DropdownListItem[];\n resolutionOptions?: DropdownListItem[];\n}\n\n/**\n * The id to use for the dummy OnvifCameraStream and StreamSetting so we can easily\n * check if the record has already been made.\n */\nexport const DummyRecordId = 'dummy';\n\n/**\n * Helper to create DropdownListItems.\n */\nfunction createDropdownItem(option: string | number): DropdownListItem {\n return {\n name: option.toString(),\n value: option.toString()\n };\n}\n\n/**\n * Helper to get existing records that have been edited.\n */\nfunction isDirtyExistingRecord(record: OnvifCameraStream | StreamSetting): boolean {\n // Used get for both properties due to the error: \"This condition will always return true since this function is always defined.\"\n const { hasDirtyAttributes, isNew } = getProperties(record, 'hasDirtyAttributes', 'isNew');\n\n // Dummy records are always considered dirty\n return !isNew && hasDirtyAttributes;\n}\n\n// Type-guard helper asserting that the streams in the stream-index pairs have a current stream ID.\nfunction hasStreamId(\n streamIndexPair: StreamIndexPair\n): streamIndexPair is StreamIndexPair & { stream: OnvifCameraStreamWithStreamId } {\n return streamIndexPair.stream.currentStreamId != null;\n}\n\n/**\n * A class to hold properties we display for each stream section.\n */\nclass StreamSection {\n @tracked isOpen = true;\n\n constructor(\n public name: string,\n public description: string,\n public bitRateOptions: DropdownListItem[] | undefined,\n public frameRateOptions: DropdownListItem[] | undefined,\n public gopLengthOptions: DropdownListItem[] | undefined,\n public resolutionOptions: DropdownListItem[] | undefined,\n public setting: StreamSetting,\n public hasValidOptions: boolean\n ) {}\n}\n\n/**\n * @classdesc\n * Stream Settings Index Controller\n */\nexport default class SettingsStreamIndexController extends EmberController {\n @service declare intl: ADCIntlService;\n @service declare ajax: AjaxService;\n @service declare notificationManager: NotificationManager;\n @service declare contextManager: ContextManager;\n @service declare router: RouterService;\n @service declare store: Store;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId = EmberVideoStreamSettings;\n\n /**\n * The route's model after it is successfully loaded.\n */\n @tracked\n declare resolvedModel: ResolvedModelFrom;\n\n /**\n * The OnvifCameraStreams that we can select during stream mapping.\n */\n @tracked\n onvifCameraStreams: OnvifCameraStream[] = [];\n\n /**\n * The settings for each stream set up for the camera.\n */\n @tracked\n streamSettings: StreamSetting[] = [];\n\n /**\n * If the page is currently being used for stream mapping. If not, then it is being used for\n * editing stream settings.\n */\n @tracked\n isMapping = false;\n\n /**\n * The previous camera ID for the page.\n */\n @tracked\n previousId?: string;\n\n /**\n * If the settings network requests failed\n */\n @reads('resolvedModel.failedToRetrieveSettings')\n declare failedToRetrieveSettings: boolean;\n\n /**\n * If the user has permissions to save stream settings and mappings.\n */\n @reads('contextManager.identityModel.canEditOnvifSettings')\n declare canEditOnvifSettings: boolean;\n\n /**\n * If the svr supports ONVIF stream mappings.\n */\n @reads('resolvedModel.svr.supportsOnvifStreamMappings')\n declare supportsOnvifStreamMappings: boolean;\n\n /**\n * Users should only be allowed to remap their streams if they have at least 3 streams.\n * If they have just 2 streams, they can see their streams (isStreamMappingVisible) but won't be able to remap them.\n *\n * This assumes the user's SVR also supports ONVIF stream mapping (we wouldn't be able to load OnvifCameraStreams otherwise)\n */\n @gte('onvifCameraStreams.length', 3)\n declare isStreamMappingEnabled: boolean;\n\n /**\n * If stream mapping is visible to the user - requires support for stream mapping and streams to be loaded.\n * Does not mean stream mapping is enabled - see isStreamMappingEnabled.\n */\n @computed('supportsOnvifStreamMappings', 'onvifCameraStreams.length')\n get isStreamMappingVisible(): boolean {\n return this.supportsOnvifStreamMappings && this.onvifCameraStreams.length > 0;\n }\n\n /**\n * If the svr is syncing with the camera\n */\n @reads('syncAndRefreshModel.isRunning')\n declare isSyncing: boolean;\n\n /**\n * Returns the deviceId of the selected camera.\n *\n * This is grabbed off model instead of resolvedModel, since the template's VideoSettingsContainer requires this immediately.\n * After VideoSettingsContainer runs the dataLoaded hook, we'll have resolvedModel to use.\n */\n @computed('model.id')\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * If we should disable the save button\n */\n @computed('canEditOnvifSettings', 'failedToRetrieveSettings')\n get disableSaveButton(): boolean {\n return !this.canEditOnvifSettings || this.failedToRetrieveSettings;\n }\n\n /**\n * The CSS style indicating if the icon is spinning.\n */\n @computed('isSyncing')\n get isSpinningStyle(): SafeString | undefined {\n return this.isSyncing ? htmlSafe('spin') : undefined;\n }\n\n /**\n * The header rows we display for each row on the page.\n */\n @computed('intl', 'isStreamMappingVisible', 'isStreamMappingEnabled', 'editButtonAction')\n get headerRows(): { label: string; action?: () => void }[] {\n const { editButtonAction } = this;\n\n const labelsAndActions = [\n {\n label: this.intl.t('generic.video.stream')\n },\n {\n label: this.intl.tc(this, 'usedFor')\n },\n {\n label: this.intl.tc(this, 'cameraStream')\n },\n {\n label: this.intl.t('generic.video.resolution'),\n action: editButtonAction\n },\n {\n label: this.intl.t('generic.video.framesPerSecond'),\n action: editButtonAction\n },\n {\n label: this.intl.tc(this, 'gopLength'),\n action: editButtonAction\n },\n {\n label: this.intl.tc(this, 'maximumBitrate'),\n action: editButtonAction\n }\n ].compact();\n\n if (!this.isStreamMappingVisible) {\n labelsAndActions.removeAt(2);\n }\n\n return this.isStreamMappingEnabled ? labelsAndActions : labelsAndActions.map(({ label }) => ({ label }));\n }\n\n /**\n * The action to use for label's edit button.\n */\n @computed('isMapping', 'switchToEditingMode')\n get editButtonAction(): VoidFunction | undefined {\n return this.isMapping ? () => this.switchToEditingMode.perform() : undefined;\n }\n\n /**\n * An array of properties that we display for StreamSettings sorted from High to Low streams\n */\n @computed('streamSettings', 'failedToRetrieveSettings')\n get streamSettingDisplayProps(): StreamSection[] {\n return this.streamSettings.sortBy('streamId').map((streamSetting) => {\n const isDummyRecord = get(streamSetting, 'isNew'),\n streamOption = this.failedToRetrieveSettings ? undefined : streamSetting.streamOptions;\n\n const [hasValidOptions, bitRateOptions, frameRateOptions, gopLengthOptions, resolutionOptions] =\n isDummyRecord\n ? [\n // For dummy records, hide the dropdowns.\n false,\n null,\n null,\n null,\n null\n ]\n : streamOption\n ? [\n // When there are stream options, enable the dropdowns and use the options in the dropdowns\n true,\n streamOption.bitRateOptions,\n streamOption.frameRateOptions,\n streamOption.gopLengthOptions,\n streamOption.resolutionOptions\n ]\n : [\n // When there are no stream options, disable the dropdowns and show the current settings.\n false,\n [streamSetting.bitRate],\n [streamSetting.frameRate],\n [streamSetting.gopLength],\n [streamSetting.resolution]\n ];\n\n const { name, description } = this.getNameAndDescription(streamSetting.streamId);\n\n return new StreamSection(\n name,\n description,\n bitRateOptions?.map(createDropdownItem),\n frameRateOptions?.map(createDropdownItem),\n gopLengthOptions?.map(createDropdownItem),\n resolutionOptions?.map(createDropdownItem),\n streamSetting,\n hasValidOptions\n );\n });\n }\n\n /**\n * An array of properties that we display for OnvifCameraStreams sorted from High to Low streams\n */\n @computed('onvifCameraStreams.@each.currentStreamId')\n get onvifCameraStreamDisplayProps(): StreamMappingSection[] {\n // Grab all streams with their indices.\n const streamIndexPairs = this.onvifCameraStreams.map((stream, index) => {\n return { stream, index };\n });\n\n // For all streams that have a current stream id, get the props we need to display in the template\n return streamIndexPairs\n .filter(hasStreamId)\n .sortBy('stream.currentStreamId')\n .map(({ stream: currentStream }) => {\n const isDummyRecord = get(currentStream, 'isNew'),\n isMediumStream = currentStream.currentStreamId === 2;\n\n const bitRateOptions = isDummyRecord ? null : [currentStream.bitRate],\n frameRateOptions = isDummyRecord ? null : [currentStream.frameRate],\n gopLengthOptions = isDummyRecord ? null : [currentStream.gopLength],\n resolutionOptions = isDummyRecord ? null : [currentStream.resolution];\n\n // The disabled stream can swap with any replacement stream except the current High and Low streams.\n const streamOptions = isDummyRecord\n ? streamIndexPairs.filter(\n ({ stream }) => stream.currentStreamId !== 1 && stream.currentStreamId !== 3\n )\n : isMediumStream\n ? // Medium streams can use any replacement stream, including the disabled stream.\n streamIndexPairs\n : // High or low stream can use any replacement stream except the disabled stream.\n streamIndexPairs.filter(({ stream }) => !get(stream, 'isNew'));\n\n return {\n stream: currentStream,\n streamOptions: streamOptions.map(({ stream }) => {\n const { name } = stream,\n value = stream.id,\n state = stream === currentStream ? SELECTED : UNSELECTED;\n\n return DropdownSelectItem.create({ name, value, state });\n }),\n bitRateOptions: bitRateOptions?.map(createDropdownItem),\n frameRateOptions: frameRateOptions?.map(createDropdownItem),\n gopLengthOptions: gopLengthOptions?.map(createDropdownItem),\n resolutionOptions: resolutionOptions?.map(createDropdownItem)\n };\n });\n }\n\n /**\n * Makes a request to update all edited stream settings.\n */\n saveStreamSettings = task({ drop: true }, async () => {\n const { id } = this.model,\n records = this.streamSettings.filter(isDirtyExistingRecord);\n\n if (!records.length) {\n return;\n }\n\n // Convert values back to numbers since are set using DropdownSelect's values, which are only strings.\n records.forEach((record) => {\n record.bitRate = parseInt(record.bitRate.toString());\n record.frameRate = parseInt(record.frameRate.toString());\n record.gopLength = parseInt(record.gopLength.toString());\n });\n\n const url = `video/streamSettings/${id}/save`,\n body = records.invoke('serialize');\n\n try {\n this.streamSettings = await this.ajax.apiRequestForDataRecords(\n url,\n undefined,\n body as any,\n POST\n );\n } catch (error) {\n this.notificationManager.addError(this.intl.tc(this, 'streamSettingsFailed'));\n throw error;\n }\n\n // If we support stream mappings, then we need our OnvifCameraStream records to be up to date.\n if (this.supportsOnvifStreamMappings) {\n await this.refreshModel();\n }\n\n this.notificationManager.addSuccess(this.intl.tc(this, 'streamSettingsUpdated'));\n });\n\n /**\n * This sends the sync post request and refreshes the route's model.\n */\n syncAndRefreshModel = task({ drop: true }, async () => {\n const { ajax, intl, model, notificationManager } = this,\n url = `video/streamSettings/${model.id}/sync`;\n\n try {\n await ajax.apiRequest(url, undefined, undefined, POST);\n await this.refreshModel();\n notificationManager.addSuccess(intl.tc(this, 'syncCompleted'));\n } catch (error) {\n const errorText = getErrorText(error);\n if (errorText != null && errorText !== '') {\n notificationManager.addError(errorText);\n }\n\n notificationManager.addError(intl.tc(this, 'syncFailed'));\n }\n });\n\n /**\n * Saves the updated stream mappings.\n */\n saveStreamMappings = task({ drop: true }, async () => {\n const selectedStreams = this.onvifCameraStreams.filter(\n (stream) => stream.currentStreamId != null && !get(stream, 'isNew')\n );\n\n // If any of currently selected High/Medium/Low streams (excluding the dummy record) have a new stream ID\n const areExistingStreamsModified = selectedStreams.isAny('hasDirtyAttributes'),\n // Need to check if the Medium stream has been disabled, but we don't know if it started off as disabled.\n // ie. starting and ending with a dummy medium stream will have dirty attributes, though mappings have not changed.\n // So we iterate through all streams and check the changed attributes.\n isMediumStreamNowDisabled = this.onvifCameraStreams.any((stream) => {\n const { currentStreamId: currentStreamIdChanges } = stream.changedAttributes();\n if (!currentStreamIdChanges) {\n return false;\n }\n\n const [initialStreamId] = currentStreamIdChanges;\n return initialStreamId === 2;\n });\n\n // We should only make a request if the stream mappings have changed.\n if (!(areExistingStreamsModified || isMediumStreamNowDisabled)) {\n return;\n }\n\n try {\n await this.ajax.apiRequestForDataRecords(\n `video/onvifCameraStreams/${this.model.id}/map`,\n undefined,\n selectedStreams.invoke('serialize'),\n POST\n );\n await this.refreshModel();\n } catch (error) {\n this.notificationManager.addError(this.intl.tc(this, 'streamSettingsFailed'));\n throw error;\n }\n });\n\n /**\n * Attempts to save edited stream settings before changing the page mode to mapping mode.\n */\n saveSettingsAndSwitchToMappingMode = task({ drop: true }, async () => {\n await this.saveStreamSettings.perform();\n this.isMapping = true;\n });\n\n /**\n * Attempts to save remapped streams before changing the page to editing mode.\n */\n switchToEditingMode = task({ drop: true }, async () => {\n if (this.canEditOnvifSettings) {\n await this.saveStreamMappings.perform();\n }\n\n this.isMapping = false;\n });\n\n /**\n * Resets any edited stream settings, makes sure the dummy record has the correct stream ID, and switches to mapping mode if enabled.\n */\n @action\n resetSettingsAndSwitchToMappingModeIfEnabled(): void {\n this.streamSettings.filter(isDirtyExistingRecord).forEach((settings) => settings.rollbackAttributes());\n\n const dummySetting = this.streamSettings.find((setting) => get(setting, 'isNew'));\n if (dummySetting) {\n const doesMediumSettingExist = this.streamSettings.any(({ streamId, isNew }) => streamId === 2 && !isNew);\n\n // Forcibly override stream id to undefined for dummy record, since we show settings with ids in streamSettingDisplayProps.\n dummySetting.streamId = doesMediumSettingExist ? (undefined as any) : 2;\n }\n\n if (this.isStreamMappingEnabled) {\n this.isMapping = true;\n }\n }\n\n /**\n * Action for toggling sections open and closed\n */\n @action\n toggleOpenClosed(streamSection: StreamSection): void {\n streamSection.isOpen = !streamSection.isOpen;\n }\n\n /**\n * This swaps the stream ids for the original stream and the newly selected stream.\n */\n @action\n updateStreamMapping(originalStream: OnvifCameraStream, newStreamId: string): void {\n const newStream = this.onvifCameraStreams.findBy('id', newStreamId);\n\n if (!newStream) {\n sentryWithScopeAndError(\n 'Stream could not be selected',\n {\n newStreamId,\n existingStreamIds: JSON.stringify(this.onvifCameraStreams.mapBy('id'))\n },\n undefined\n );\n\n return;\n }\n\n [originalStream.currentStreamId, newStream.currentStreamId] = [\n newStream.currentStreamId,\n originalStream.currentStreamId\n ];\n }\n\n @action\n dataLoaded(resolvedModel: ResolvedModelFrom): void {\n this.resolvedModel = resolvedModel;\n\n // These arrays are copied out because they are still being referenced by {{promise-hash-tracked}}.\n // Calling pushObject with dummy records on these will cause dataLoaded to rerun.\n this.onvifCameraStreams = [...resolvedModel.onvifCameraStreams];\n this.streamSettings = [...resolvedModel.streamSettings];\n\n if (this.isStreamMappingEnabled) {\n const doesMediumStreamExist = this.onvifCameraStreams.findBy('currentStreamId', 2) != null,\n dummyStreamId = doesMediumStreamExist ? undefined : 2,\n dummyStream = this.getDummyStream(dummyStreamId);\n\n this.onvifCameraStreams.pushObject(dummyStream);\n\n // Users will see High, Medium, and Low streams for mapping. When the Medium stream is disabled, there'll be\n // just High and Low streams for editing. We create a disabled dummy stream setting to still show 3 columns.\n const shouldShowDisabledMediumSetting = this.isStreamMappingEnabled && this.streamSettings.length === 2;\n if (shouldShowDisabledMediumSetting) {\n const doesMediumSettingExist = this.streamSettings.findBy('streamId', 2) != null,\n dummySettingId = doesMediumSettingExist ? undefined : 2,\n dummySetting = this.getDummySetting(dummySettingId);\n\n this.streamSettings.pushObject(dummySetting);\n }\n }\n\n // dataLoaded is also triggered from refreshModel(), so we want to ensure that we only update the page mode when the camera changes.\n if (resolvedModel.id !== this.previousId) {\n this.isMapping = this.isStreamMappingEnabled;\n }\n\n this.previousId = resolvedModel.id;\n }\n\n // region Helpers\n\n /**\n * Returns the resources for the name and description for the given stream ID.\n */\n getNameAndDescription(streamId: number): { name: string; description: string } {\n let name, description;\n if (streamId === High) {\n name = this.intl.tc(this, 'highStream');\n description = this.intl.tc(this, 'highStreamDesc');\n } else if (streamId === Medium) {\n name = this.intl.tc(this, 'mediumStream');\n description = this.intl.tc(this, 'mediumStreamDesc');\n } else {\n // streamId === 3\n name = this.intl.tc(this, 'lowStream');\n description = this.intl.tc(this, 'lowStreamDesc');\n }\n\n return {\n name,\n description\n };\n }\n /**\n * Returns an existing or new dummy record that is used for disabled Medium streams.\n */\n getDummyStream(currentStreamId?: number): OnvifCameraStream {\n // Null values align with default values for unset properties\n // Also works well with our DropdownSelects\n const existingRecord = this.store.peekRecord('video/onvif-camera-stream', DummyRecordId);\n if (existingRecord) {\n existingRecord.currentStreamId = currentStreamId;\n return existingRecord;\n }\n\n return this.store.createRecord('video/onvif-camera-stream', {\n currentStreamId,\n id: DummyRecordId,\n name: this.intl.t('generic.disabled')\n });\n }\n\n /**\n * Returns a new or existing dummy record for the Medium stream that has null for all of its settings.\n */\n getDummySetting(streamId?: number): StreamSetting {\n const existingRecord = this.store.peekRecord('video/stream-setting', DummyRecordId);\n if (existingRecord) {\n // Avoid typecheck here by casting, we just want the existing record to not have an ID\n // since we display all stream settings with an ID in streamSettingDisplayProps\n existingRecord.streamId = streamId as any;\n return existingRecord;\n }\n\n return this.store.createRecord('video/stream-setting', {\n streamId,\n id: DummyRecordId\n });\n }\n\n /**\n * Refreshes the route's model.\n */\n refreshModel(): Transition {\n const { router } = this;\n return router.refresh(router.currentRouteName);\n }\n\n // endregion\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/stream/index': SettingsStreamIndexController;\n }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { getErrorText } from 'customer-site/utils/ember';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoStreamSettings } from 'customer-site/enums/CustomerPageUrl';\n\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type Transition from '@ember/routing/transition';\nimport type OnvifCameraStream from 'customer-site/models/video/onvif-camera-stream';\nimport type StreamSetting from 'customer-site/models/video/stream-setting';\nimport type AjaxService from 'customer-site/services/ajax';\nimport type { SettingsStreamRouteModel } from '../route';\nimport type SettingsStreamIndexController from './controller';\n\ninterface SettingsStreamIndexRouteModel extends SettingsStreamRouteModel {\n failedToRetrieveSettings: boolean;\n onvifCameraStreams: OnvifCameraStream[];\n streamSettings: StreamSetting[];\n}\n\n/**\n * @classdesc\n * Stream Settings Index page\n */\nexport default class SettingsStreamIndexRoute extends AdcBaseRoute {\n @service declare ajax: AjaxService;\n @service declare notificationManager: NotificationManager;\n\n /** @override */\n routeId = EmberVideoStreamSettings;\n\n declare controller: SettingsStreamIndexController;\n\n async beforeModel(transition: Transition): Promise {\n // If the user installed their first ONVIF camera without updating their route items, they won't have this access to this page.\n // Get/reload the route items before verifying the route exists in AdcBaseRoute's beforeModel\n await this.contextManager.getRouteItemWithIdentityReloadIfNeeded(this.routeId);\n await super.beforeModel(transition);\n }\n\n /** @override */\n async model(): Promise {\n const { id, camera, svr } = this.modelFor('video.settings.stream') as SettingsStreamRouteModel;\n\n const streamSettingsPromise = this.store.query('video/stream-setting', { id, include: 'streamOptions' }),\n onvifCameraStreamsPromise = svr.supportsOnvifStreamMappings\n ? this.store.query('video/onvif-camera-stream', { id })\n : undefined;\n\n const [streamSettingsResult, onvifCameraStreamsResult] = await Promise.allSettled([\n streamSettingsPromise,\n onvifCameraStreamsPromise\n ]);\n\n // Helper method to get the value of a result that is fulfilled or to show an error when the the promise is rejected.\n const grabValueOrShowNotificationError = (result: PromiseSettledResult): T | undefined => {\n if (result.status === 'rejected') {\n // For store.query(), the errors are in result.reason.errors.errors\n // For ajax.apiRequestForDataRecord(), the errors are in result.reason.errors\n const errorPayload = result.reason.errors ?? result.reason,\n errorText = getErrorText(errorPayload) as string;\n this.notificationManager.addError(errorText);\n return undefined;\n }\n\n return result.value;\n };\n\n const streamSettingsValue = grabValueOrShowNotificationError(streamSettingsResult),\n onvifCameraStreamsValue = grabValueOrShowNotificationError(onvifCameraStreamsResult);\n\n const streamSettings = streamSettingsValue?.toArray() ?? [],\n onvifCameraStreams = onvifCameraStreamsValue?.toArray() ?? [];\n\n return {\n id,\n camera,\n svr,\n onvifCameraStreams,\n streamSettings,\n failedToRetrieveSettings: streamSettingsResult.status === 'rejected'\n };\n }\n\n @action\n async willTransition(): Promise {\n this.controller.saveStreamMappings.perform();\n\n this.store.unloadAll('video/stream-setting');\n this.store.unloadAll('video/onvif-camera-stream');\n }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { EmberHome, EmberVideoStreamSettings } from 'customer-site/enums/CustomerPageUrl';\n\nimport type Store from '@ember-data/store';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface SettingsStreamRouteParams {\n id_selected_camera: string;\n}\n\nexport interface SettingsStreamRouteModel {\n id: string;\n camera: Camera;\n svr: Svr;\n}\n\n/**\n * @classdesc\n * Stream Settings parent route\n */\nexport default class SettingsStreamRoute extends Route {\n @service declare contextManager: ContextManager;\n @service declare store: Store;\n\n /** @override */\n routeId = EmberVideoStreamSettings;\n\n /** @override */\n async model(params: SettingsStreamRouteParams): Promise {\n const { id_selected_camera: id } = params,\n camera = await this.store.findRecord('video/devices/camera', id);\n\n if (!camera.onvifParentId) {\n this.contextManager.transitionBackToMobileAppOrPreviousRoute(EmberHome, true);\n return undefined;\n }\n\n return {\n id,\n camera,\n svr: await this.store.findRecord('video/devices/svr', camera.onvifParentId)\n };\n }\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { Calibrated } from 'customer-site/enums/CalibrationStatus';\nimport { EmberVideoVarifocalFovSettings, EmberVideoCameraCalibrate } from 'customer-site/enums/CustomerPageUrl';\nimport { getGlobalIdFromUnitAndDevice, getDeviceIdFromGlobalId } from 'customer-site/utils/general';\n\nimport type OvReadyCamera from 'customer-site/models/video/devices/ov-ready-camera';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type IdentityManager from 'customer-site/services/identity-manager';\n\n/**\n * Navigates to the Add Device page to finish installation and passes the page the relevant querystring properties that it needs to know the device status.\n * @private\n * @instance\n */\nfunction finishDeviceInstallation(this: VarifocalFovController) {\n const { contextManager, newCamera, installParamWifiSkipped, installParamWifiDone, model } = this;\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(\n EmberVideoCameraCalibrate,\n {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n newCamera: newCamera,\n installParamWifiDone: installParamWifiDone,\n installParamWifiSkipped: installParamWifiSkipped,\n varifocalSetupComplete: this.deviceId\n },\n undefined,\n model.id\n );\n}\n\n/**\n * Resets the calibration status, because changing camera fov will affect ov ready calibration.\n */\nasync function resetCalibrationProcess(camera: OvReadyCamera, shouldResetCalibration: boolean): Promise {\n if (!camera) {\n return;\n }\n\n const status = camera.calibrationStatus;\n\n // Is the camera calibration not yet begun?\n if (!status) {\n return;\n }\n\n // If the camera's already calibrated and the FOV hasn't been changed more than 1 we don't need to recalibrate\n if (!shouldResetCalibration && status.value === Calibrated) {\n return;\n }\n\n const snapshots = camera.calibrationSnapshots;\n\n // Reset calibration status and delete/unload snapshots.\n await Promise.all(\n [await status.reset()].concat(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n snapshots.map(async (model) => {\n await model.destroyRecord();\n })\n )\n );\n}\n\n/**\n * @classdesc\n *\n * The controller for Varifocal Fov Settings page.\n *\n * @class VarifocalFovController\n * @extends Ember.Controller\n * @memberOf video.settings\n */\nexport default class VarifocalFovController extends Controller {\n // region Services.\n\n @service declare contextManager: ContextManager;\n @service declare identityManager: IdentityManager;\n\n declare model: any; // Please replace this 'any' with the actual model type!\n\n // endregion Services.\n\n /**\n * Query params for live view page.\n */\n queryParams = ['relay'];\n\n /**\n * Should we force the page to only connect through proxy or end-to-end?\n * A value of 1 forces proxy; a value of 0 forces end-to-end.\n */\n relay?: string;\n\n // region Properties\n\n /**\n * If this device is a new camera in a post installation state. (This is for determining where we navigate to when the user clicks next)\n *\n * @type {string | null}\n */\n newCamera = null;\n\n /**\n * A query param that's passed in if the user is navigating to this page from MobileTech\n *\n * @type {boolean}\n */\n external = false;\n\n /**\n * If this device is currently in post installation and has had its wifi configuration skipped by the user, this is the mac address of the device\n *\n * @type {string | null}\n */\n installParamWifiSkipped = null;\n\n /**\n * If this device is currently in post installation and has had its wifi configuration completed, this is the mac address of the device\n *\n * @type {string | null}\n */\n installParamWifiDone = null;\n\n /**\n * The customer page URL enum for this particular settings page.\n */\n settingsPageId: number = EmberVideoVarifocalFovSettings;\n\n /**\n * Has the FOV been changed by more than 1? We only want to recalibrate for changes greater than 1\n */\n shouldResetCalibration = false;\n\n /**\n * Is camera being saved or loaded?\n */\n @tracked isSavingOrLoadingCamera = false;\n\n // endregion Properties\n\n // region Computed Functions\n\n /**\n * Returns the deviceId from the selectedCameraId.\n */\n @computed('model.id')\n get deviceId(): string {\n return getDeviceIdFromGlobalId(this.model.id);\n }\n\n /**\n * We want to use snapshots if we're in a mobile context, either from the app or mobiletech\n */\n @computed('contextManager.identityModel.isMobileApp', 'external')\n get shouldUseSnapshots(): boolean {\n return this.contextManager.identityModel.isMobileApp || this.external;\n }\n\n // endregion Computed Functions.\n\n // region Actions\n\n /**\n * If the FOV has changed more than 1, we will set the flag to reset the calibration\n * @param oldFov\n * @param newFov\n */\n @action\n resetCalibration(oldFov: number, newFov: number): void {\n if (Math.abs(oldFov - newFov) > 1) {\n this.shouldResetCalibration = true;\n }\n }\n\n /**\n * Redirects the user to the settings page they selected in the dropdown.\n *\n * @param {string} settingsPageUrl The settings page to redirect to.\n */\n @action\n updateSettingSelection(settingsPageUrl: string): void {\n this.contextManager.transitionToUrl(settingsPageUrl);\n }\n\n /**\n * Redirects the user to this page with the camera they selected in the dropdown.\n *\n * @param {string} cameraId The new camera ID.\n */\n @action\n async updateCamera(cameraId: string): Promise {\n const unitId: string = (await this.identityManager.getSelectedSystem())?.unitId.toString();\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n this.contextManager.transitionToRouteId(\n EmberVideoVarifocalFovSettings,\n undefined,\n undefined,\n getGlobalIdFromUnitAndDevice(unitId, cameraId)\n );\n }\n\n /**\n * Continue to next phase in camera calibration step.\n */\n @action\n async goToNextPage(): Promise {\n const { newCamera, external, contextManager, model, shouldResetCalibration } = this;\n\n // If we're in the post installation flow, we need to navigate to the Add Video device page from here (to complete the device installation).\n if (newCamera) {\n finishDeviceInstallation.call(this);\n return;\n }\n\n if (this.identityManager.isLoginAsLoginRep && external) {\n contextManager.transitionToPreviousRoute();\n return;\n }\n\n const ovReadyCamera = model.ovReadyCameras.filter((o: any) => o.id === model.id);\n\n if (ovReadyCamera) {\n await resetCalibrationProcess(ovReadyCamera[0], shouldResetCalibration);\n\n // TODO: This ignore is an existing deprecation that must be refactored, do not copy this usage\n // eslint-disable-next-line @adc/ember/no-context-manager-transition\n contextManager.transitionToRouteId(EmberVideoCameraCalibrate, undefined, undefined, model.id);\n } else {\n console.error(\n 'The varifocal camera model does not have a matching OV ready camera model. ID={this.model.id}.'\n );\n }\n }\n\n /**\n * Closure to pass to childs to set the saving/loading state of the camera.\n *\n * @param {boolean} isSavingOrLoadingCamera\n */\n @action setIsSavingOrLoadingCamera(isSavingOrLoadingCamera: boolean): void {\n this.isSavingOrLoadingCamera = isSavingOrLoadingCamera;\n }\n\n /**\n * Closure to pass to childs to set the varifocal camera model object\n * @param key\n * @param value\n */\n @action setVarifocalCameraModel(key: string, value: number): void {\n this.model.selectedVarifocalCamera.set(key, value);\n }\n\n /**\n * Called whenever the snapshot image is loaded and when we retry\n *\n */\n @action async imageLoad() {\n // Request another snapshot in a second now that the previous one has loaded.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line ember/classic-decorator-no-classic-methods,ember/no-get\n const snapshot = await this.get('model.selectedVarifocalCamera.snapshot');\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n snapshot.reloadSnapshotLater(1000);\n }\n\n // endregion Actions\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/varifocal-fov': VarifocalFovController;\n }\n}\n","import { inject as service } from '@ember/service';\nimport AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoVarifocalFovSettings } from 'customer-site/enums/CustomerPageUrl';\nimport { getForcedStreamingMethod } from 'customer-site/utils/video/streaming';\nimport { getQueryParam } from '@adc/app-infrastructure/routes/base-route';\n\nimport type CoreStore from '@ember-data/store';\n\n/**\n * Varifocal Fov Settings page.\n */\nexport default class Route extends AdcBaseRoute {\n // region Services.\n\n @service declare store: CoreStore;\n\n // endregion Services.\n\n // region Overrides.\n\n /** @override */\n queryParams = {\n newCamera: getQueryParam('number'),\n external: getQueryParam('boolean'),\n installParamWifiSkipped: {\n // The query parameter is 'wifi_skipped' but we want to attach it to installParamWifiSkipped\n as: 'wifi_skipped',\n ...getQueryParam('string')\n },\n installParamWifiDone: {\n // The query parameter is 'wifi_done' but we want to attach it to installParamWifiDone\n as: 'wifi_done',\n ...getQueryParam('string')\n },\n relay: { replace: false, refreshModel: false }\n };\n\n /** @override */\n routeId = EmberVideoVarifocalFovSettings;\n\n /** @override */\n skipWhenTransitioningBack = true;\n\n /** @override */\n model({ id_selected_camera, relay }: { id_selected_camera: string; relay?: string }) {\n return {\n forcedStreamingMethodFromQueryParam: getForcedStreamingMethod(relay, undefined),\n selectedVarifocalCamera: this.store.findRecord('video/devices/varifocal-fov-camera', id_selected_camera),\n ovReadyCameras: this.store.findAll('video/devices/ov-ready-camera'),\n id: id_selected_camera\n };\n }\n\n // endregion Overrides.\n}\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport * as PanelTypeEnumObj from 'customer-site/enums/PanelType';\nimport { NoSignal } from '../../../enums/SignalStrength';\n\nimport type NativeBridge from '@adc/app-infrastructure/services/native-bridge';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationManager from '@adc/ui-components/services/notification-manager';\nimport type SmartChimeDevice from 'customer-site/models/devices/smart-chime-device';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type AccessPointPanelSignalStrength from '../../../models/settings/access-point-wifi/access-point-panel-signal-strength';\nimport type Route from './route';\n\ntype PanelTypeEnum = typeof PanelTypeEnumObj;\n\nexport default class VideoDeviceSignalStrengthController extends Controller {\n @service declare notificationManager: NotificationManager;\n @service declare intl: ADCIntlService;\n @service declare nativeBridge: NativeBridge;\n\n declare model: ModelFrom;\n\n @tracked\n smartChimeDevice: SmartChimeDevice | undefined;\n\n /**\n * The signal strength info\n */\n @tracked accessPointPanelSignalStrengthInfo: AccessPointPanelSignalStrength | undefined;\n\n /**\n * Has the signal strength info loaded?\n * If false, display the loading spinner\n */\n @tracked signalStrengthLoaded: boolean | undefined;\n\n /**\n * Requests the signal strength from the device\n * @returns\n */\n @action\n refreshSignalStrength(): AccessPointPanelSignalStrength | undefined {\n this.signalStrengthLoaded = false;\n this.smartChimeDevice?.getAccessPointWifiSignalStrength().then(\n (value: AccessPointPanelSignalStrength) => {\n this.accessPointPanelSignalStrengthInfo = value;\n this.signalStrengthLoaded = true;\n return value;\n },\n () => undefined\n );\n\n return undefined;\n }\n\n /**\n * Processes the loaded data.\n */\n @action\n dataLoaded(smartChimeDevice: SmartChimeDevice): void {\n this.smartChimeDevice = smartChimeDevice;\n this.refreshSignalStrength();\n }\n\n /**\n * Closes the webview\n */\n @action\n transition() {\n // Don't let the user progress if there is no signal from the device\n if (\n !this.accessPointPanelSignalStrengthInfo ||\n this.accessPointPanelSignalStrengthInfo.signalStrengthEnum <= NoSignal\n ) {\n this.notificationManager.addError(this.intl.tc(this, 'cannotContinueReason'));\n return;\n }\n\n if (this.nativeBridge.doesSupportCloseWebViewV2) {\n this.nativeBridge.closeWebViewV2();\n } else if (this.nativeBridge.doesSupportCloseWebView) {\n this.nativeBridge.closeWebView();\n }\n }\n\n /**\n * Gets the text for the signal strength directions based on the chime model.\n */\n get signalStrengthDirections(): string {\n const name = (Object.keys(PanelTypeEnumObj) as Array).find(\n (key) => PanelTypeEnumObj[key] === Number(this.smartChimeDevice?.chimeModel)\n );\n return this.intl.tc(this, `signalStrengthDirections.${name}`);\n }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n interface Registry {\n 'video/settings/video-device-signal-strength': VideoDeviceSignalStrengthController;\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoDeviceSignalStrength } from 'customer-site/enums/CustomerPageUrl';\n\nimport type SmartChimeDevice from 'customer-site/models/devices/smart-chime-device';\n\n/**\n * @classdesc\n * 9/19/22: This page is only used as a mobile webview to display smartchime signal strength during install\n */\nexport default class Route extends AdcBaseRoute {\n routeId = EmberVideoDeviceSignalStrength;\n\n model({ id_smart_chime_device }: { id_smart_chime_device: number }): {\n smartChimeDevice: ADCAsyncStoreFindRecord;\n } {\n return {\n smartChimeDevice: this.store.findRecord('devices/smart-chime-device', id_smart_chime_device)\n };\n }\n}\n","import AdcBaseRoute from 'customer-site/classes/base-route';\nimport { EmberVideoYoutubePlayer } from 'customer-site/enums/CustomerPageUrl';\n\n/**\n * @classdesc\n * Base route for the Youtube Player test page.\n */\nexport default class YoutubePlayerRoute extends AdcBaseRoute {\n routeId = EmberVideoYoutubePlayer;\n\n /**\n * Redirect back to the previous page if the user doesn't have internal beta access and somehow got to this page\n */\n redirect(): void {\n if (!this.identityManager.identityModel?.hasInternalBetaAccess) {\n this.contextManager.transitionToPreviousRoute();\n }\n }\n}\n"],"names":["createTemplateFactory","scope","routeView_","videoAdvancedVideoSearchPage_","on","fn","videoHdStateImage_","t_","eq_","buttonIcon_","tc_","ResultsGrid","_dec","intlPath","path","_dec2","computed","_class2","Component","constructor","arguments","_initializerDefineProperty","_descriptor","_descriptor2","searchResultsDisplay","this","args","searchResults","map","result","id","cameraName","imageUrl","dateTime","intl","formatDateTz","month","day","year","hour","minute","_applyDecoratedDescriptor","prototype","service","configurable","enumerable","writable","initializer","tracked","Object","getOwnPropertyDescriptor","_class","setComponentTemplate","TEMPLATE","pageView_","didInsert_","videoAppearanceSearchResultsToolbar_","videoVideoPlayerPlaybackFeaturesSvrPlaybackFeatures_","betaFeatureUnderConstruction_","videoAppearanceSearchResultsGrid_","videoAppearanceSearchSearchSidebar_","roundToNearestMinutes","dirtyDate","options","_options$nearestTo","length","TypeError","nearestTo","toInteger","RangeError","date","toDate","seconds","getSeconds","minutes","getMinutes","roundedMinutes","getRoundingMethod","roundingMethod","remainderMinutes","addedMinutes","Math","round","Date","getFullYear","getMonth","getDate","getHours","formGroup_","dropdownSelectSingleSelect_","filtersDateTimeRangeFilter_","tc_0","HeatMapSelectors","_dec3","_dec4","_dec5","_dec6","_dec7","owner","super","_descriptor3","_descriptor4","_descriptor5","_defineProperty","_buildTask","context","generator","currentDate","maxDate","subMinutes","MIN_GROUP_BY","envSettings","isTestEnvironment","nextUpdateTime","addMinutes","timeout","differenceInMilliseconds","updateHasMinDuration","ruleHasMinDuration","getCurrentMaxTime","perform","willDestroy","cancelAll","cameraDropdownItems","Promise","all","cameras","camera","async","DropdownSelectItem","create","name","description","value","state","UNSELECTED","disabled","ovRules","any","rule","ruleType","Heatmap","createCameraDropdownItem","selectedCamera","_this$args$cameras","findBy","editValues","cameraId","selectedHeatMapRule","_this$selectedCamera","minDate","_this$intl$timeZone","minDateUtc","zonedTimeToUtc","heatMapMinDateUnit","timeZone","dateRangeFilter","startDate","endDate","DateRangeFilter","t","DateFilter","defaultValue","minimumDate","maximumDate","apply","setDates","validationFn","isBetween","differenceInHours","MAX_DAY_RANGE","checkDates","_this$selectedHeatMap","_this$selectedHeatMap2","heatMapMinDateUtc","zonedNow","utcToZonedTime","now","zonedYesterday","subDays","setHours","defaultStartUtc","useDefaultDates","addHours","dates","max","min","VALUE_CHANGE_ACTION","setCameraId","initHasMinDuration","scheduleOnce","action","uiImagesStateImage_","svgSymbol_","safeHtml_","buttonSimple_","HeatMapImages","snapshotLabel","ruleName","heatMaps","tc","ruleSnapshotIndex","currentHeatMap","heatMapIndex","heatMapList","currentRuleSnapshot","ruleSnapshotList","errorText","failedToLoad","transitionToRuleSetup","navigation","transitionToRouteId","EmberVideoBusinessActivityAnalyticsRuleList","queryParams","and_","not_","activityHeatMapHeatMapImages_","sliderAdc_","SPEED_OPTIONS","TimeLapse","reads","_dec8","_dec9","_dec10","alias","_dec11","_dec12","_dec13","_dec14","_dec15","_dec16","_dec17","_dec18","_dec19","_dec20","_dec21","_dec22","_descriptor6","_descriptor7","_descriptor8","_descriptor9","_descriptor10","scrollInterval","ticksPerScroll","updateSliderValue","sliderValue","maxSliderValue","restartable","rollTimeLapseTask","firstHeatMapList","isComparison","comparisonHeatMaps","firstHeatMaps","firstRuleSnapshotList","firstHeatMap","firstRuleSnapshot","firstHeatMapRendered","hasRendered","secondHeatMap","secondHeatMapList","undefined","secondRuleSnapshot","secondRuleSnapshotList","secondHeatMapRendered","maxHeatMapListLength","speedDropdownItems","num","idx","concat","String","playbackSpeedTick","SELECTED","imageClass","css","push","join","isCurrentHeatMapRendered","playPauseButtonInputs","isRunning","text","icon","pauseTimeLapse","playTimeLapse","updateSpeed","index","setSpeedTick","offset","newIndex","imageRendered","isFirst","isRuleSnapshot","setProperties","canPlay","isTimeLapse","isWaiting","simpleBinary_","activityHeatMapHeatMapSelectors_","activityHeatMapTimeLapse_","spinnerSvg_","navigateToRouteName_","videoRulesSelectCameraRule_","actionButtons_","videoAdvancedAnalyticsBusinessActivityAnalyticsRulesWrapper_","videoAdvancedAnalyticsDeviceRuleSlots_","videoSettingsVideoDeviceAndSettingsSelector_","videoEditCameraGroup_","videoManageCameraGroups_","videoSettingsCameraAnalytics_","await_","didResize_","t_0","buttonAsync_","didUpdate_","videoCalibrationEditSnapshot_","await_0","simpleBinaryButtonList_","perform_","AnalyticsSvg","videoCalibrationAnalyticsSvg_","buttonNative_","toString_","LinkTo","promiseHashTracked_","dateRangePicker_","coalesce_","uiIconTooltip_","multilineTextInput_","textInput_","handleBinaryChange_","highchartsAccessibleChart_","inlineAlert_","videoClipsRouteBody_","insetGroup_","videoSettingsFamiliarTargetsSubjectImage_","videoSettingsFamiliarTargetsExpandPhotoButton_","asyncLoader_","videoSettingsFamiliarTargetsPhotoCardPhotoCardActionButtons_","actionSheetsVideoFamiliarTargetViewPhoto_","actionSheetsVideoFamiliarTargetIncorrectMove_","FeedbackCard","equal","ActionSheetTypes","photo","incorrectMove","Vehicle","_descriptor11","_descriptor12","_descriptor13","_descriptor14","openPhotoActionSheet","actionSheetTypeOpen","closeActionSheet","none","eventHasFamiliarTarget","currentEvent","hasTarget","feedbackEvent","saveFeedbackWithTransition","familiarTarget","isCorrect","isNewVehicle","notificationManager","set","save","savedTarget","model","enrollment","reload","hasBeenReviewed","navigateToNotificationsPageForNewVehicle","resourceKeyPrefix","isFamiliarVehicleEnrollment","addSuccess","reviewCompleted","unloadRecord","_unused","feedbackPhotoAltText","event","vehicleName","get","processReview","openTargetSelectionModal","clusterToHideInIncorrectMoveModal","setPromiseForAsyncLoader","promise","reviewPromise","feedbackButtons","fnCreateActionButton","getReviewButtonResource","getCorrectButtonIcon","getIncorrectButtonIcon","promptForName","modals","title","familiarObjectType","showRenameModal","rename","createNewTarget","maxLength","MaxDescriptionTextLength","output","error","store","newTarget","createCluster","moveImageToSelectedTarget","target","videoSettingsFamiliarTargetsFeedbackCard_","isMobileApp_","hash","pageViewEdit_","videoIntercomContactEditContactName_","drillThroughItem_","automationScheduleInput_","uiNotificationList_","videoVideoPlayerLiveViewPlayer_","videoLiveVideo_","exists_","videoVideoPlayerPlaybackFeaturesSdPlaybackFeatures_","add_","passwordInput_","uiProgressBar_","knowledgeBaseLink_","wrapWithPromise_","math_","array","helper","cancelable","taskHelperClosure","reason","automationRulesRuleCollectionPauseBar_","fieldsetHeader_","videoRulesDrawWindowPlayersAnalyticsLiveViewPlayer_","dropdownSelectMultiSelect_","videoRulesDrawWindow_","uiTickedSliderWithDescriptions_","cancelAll_","or_","videoRulesPropertyStatusExceptions_","automationAtHomeExceptions_","videoPerimeterGuardRule_","videoRulesClassificationSelectionProxy_","videoRulesClassificationFilterSelection_","videoAnalyticsLightRule_","UiCollapsibleSection","templateOnlyComponent","checkboxTree_","htmlSafe_","uiCollapsibleSection_","simpleBinaryList_","navigateToRouteId_","VideoClipsStoragePercentItem","videoClipsStorageProgress_","formatNumber_","media_","expandButton_","guidFor_","videoClipsStoragePercentItem_","videoClipsStorageItem_","VideoRulesCloudStorageInfoComponent","toggleChevron","collapsedOnMobile","navigateToUsageReportPage","contextManager","EmberVideoClipsUsageReport","identityModel","canEnableRecordingRulesAfterQuotaReset","AiDeterrenceUsageInfoComponent","displayWarning","eventsThisMonth","maxEventQuota","shouldDisplayTooltip","currentEventQuota","LocalStorageInfo","mapBy","svrCountCss","svrs","svrUsageData","svrUsageObjects","usageInfo","svr","svrUsageInfo","loadingStatusCss","storageUsed","storageAvailable","oldestRecordingDate","projectedDaysRecording","wait48HoursForProjection","getObjProperties","toFixed","storageUsedPercent","Number","oldestRecordingCss","usageStatsCss","usageStatsString","storageIsFull","daysOfRecordingString","daysOfRecordingCss","numDays","usageStatsTooltipText","ClipLimitSuggestion","isCollapsed","isClipLimitSuggestionCollapsed","editItem","items","item","find","toggleCollapseState","setClipLimitSuggestionCollapsed","actionSheet_","willDestroy_","singleSelect_","ActionSheetsVideoEditAlertFormat","contacts","_this$args$contacts","formats","_ref","parseInt","optionsMap","ContactTypeEnum","Email","Windows_email_default","Mac_email_default","iPhone_default","Android","Blackberry","AttIPhone","TextOnlyNoVideo","Mobile","PhoneAttTmobileBlackberry","OtherPhoneVerizonSprint","reduce","_ref2","addressType","formatTypes","_objectSpread","filter","_ref3","includes","sortBy","contact","videoFormat","belongsTo","selected","address","changeFormat","contactId","changes","saveChanges","_args$contacts","isEmpty","resolve","keys","contactAddress","fmt","toString","invoke","then","sendTestClip","showRetryMessage","_findBy","_this$args$contacts2","testMessage","showConfirmationDialog","htmlSafe","closeModal","ex","reject","automationRulesRuleList_","videoRulesCloudStorageInfo_","videoRulesAiDeterrenceUsageInfo_","videoRulesLocalStorageInfo_","videoRulesClipLimitSuggestion_","actionSheetsVideoEditAlertFormat_","automatedRecoverySection","retentionSection","smartRateControlSection","maxBitrateSection","AdvancedOptionsInput","selectedAutomatedRecovery","selectedRetentionTime","selectedSmartRateControl","currentMaxBitrate","retentionDropdownValue","videoRetentionDays","retentionDropdownItems","time","fnGetItem","UnlimitedRetentionDropdownValue","onSettingToggled","section","checked","onDropdownChanged","showMoreInfoModal","_automatedRecoverySec","info","showInfoModal","createDropdownItems_","videoSettingsPlaybackFeaturesRecordingQualityInput_","videoSettingsPlaybackFeaturesAdvancedOptionsInput_","numbers","a","b","subtract_","videoSettingsDeviceImageContainer_","AdvancedSetupPage","updateOrRollbackModels","drop","password","passwordValue","isCameraLinkSectionVisible","supportsCameraLink","cameraLinkError","InsufficientPermission","canUserEditHasMicrophoneSettings","hasAudioAddOnAndAcceptedAgreement","canUserEditHasSpeakerSetting","hasThirdPartyCameraTwoWayAudio","svrSupportsTwoWayAudioTalkdown","canEditSomeDeviceCapability","canToggleDewarping","warnUser","passwordError","addError","warnForFailedCameraLinkResponse","ResponseFailed","saveDeviceCapabilities","hasDirtyAttributes","handleSavingDeviceCapabilities","clickCameraInternalPage","dataUsageMode","DataUsageModeEnum","CriticalDataMode","window","open","cameraLinkUrl","videoSettingsAdvancedSetupPage_","tickedSlider_","simpleList_","videoSettingsDeviceStatusInfoItem_","simpleListItem_","getSimpleListItem_","colorPickersAnalogousPicker_","validateBaseHue","hue","baseHue","isOutOfRange","minHue","maxHue","next","ActionSheetsVideoLedColorPicker","_this$args$hue","saturation","_this$args$saturation","lightness","_this$args$lightness","_this$selectedHue","selectedHue","newHue","call","changeHSLColor","hslColor","cleanHslColor","_objectWithoutProperties","_excluded","onSaveColor","hslToHex","closeColorPicker","previousColorHex","hexToHSL","onClose","actionSheetsVideoLedColorPicker_","ImageMultiSelect","tabs","imageData","showTabs","showSingleTab","displayImages","_this$args$maxImages","images","selectedTab","maxImages","slice","selectImage","selectedImage","saveSelection","saveAction","uiAsyncWithPulsatingLoadingText_","wifiSignalStrengthIcon_","SignalStrengthInfoItem","ConnectionStatus","Remembered","signalStrengthEnum","signalStrengthInfoModel","Unknown","signalStrengthItemSubtext","isUsingEthernetConnection","lastUpdatedDate","convertDateToString","signalStrengthString","getWifiSignalStrengthString","normalizedSignalStrength","handleEthernetConnectionChange","handleEthernetConnection","videoSettingsImageMultiSelect_","coalesce_0","isPending_","videoSettingsSignalStrengthInfoItem_","videoSettingsLightguardLightTriggersGroup_","videoSettingsLightguardLightActivationCard_","videoVideoPlayerFovPlayer_","UiSliderWithLabels","uiSliderWithLabels_","videoSettingsVarifocalInputSettings_","videoSettingsFamiliarTargetsFaqTerms_","videoSettingsFamiliarTargetsCameraAccess_","videoSettingsFamiliarTargetsFeatureManagement_","videoSettingsFamiliarTargetsIncorrectPhotos_","uiFadeOutText_","FaceEntry","subHeaderText","faces","MaxAllowedFaces","videoSettingsFamiliarTargetsFaceEntry_","videoSettingsFamiliarTargetsNavigationButtonList_","videoSettingsFamiliarTargetsRecentPhotos_","uiBadgeLabel_","noop_","PhotoCard","isFamiliarFace","image","Face","videoSettingsFamiliarTargetsPhotoCard_","PhotoReviewCard","isSelectedAndCorrect","requiresReview","isConfirmedForCluster","isSelectedAndIncorrect","buttons","isEditableByCurrentUser","showMoveDeleteOptions","isReviewedImage","correctButtonClass","incorrectButtonClass","unsetReview","setReview","videoSettingsFamiliarTargetsPhotoCardPhotoReviewCard_","ClusterSelection","transitionToReview","cluster","EmberVideoFamiliarSubjectsReview","videoSettingsFamiliarTargetsClusterSelection_","VehicleEntry","vehicles","MaxAllowedVehicles","goToRecentImagesPage","EmberVideoFamiliarSubjectsEnrollmentRecentImages","videoSettingsFamiliarTargetsVehicleEntry_","searchToolbar_","videoSettingsIntercomRecipientsSearchbar_","dragDropFileUpload_","qrCode_","chip_","dropdownActions_","getStaticResourcePath_","buttonSelected_","videoSettingsVideoSettingsContainer_","VideoSettingsMotionDetectionZoneSelections","videoSettingsLightguardMotionDetectionZoneSelections_","UiEnableDisableAll","uiEnableDisableAll_","responsiveTable_","Label","_this$args$action","_this$args","actionIsRunning","runAction","videoSettingsStreamSettingLabel_","WirelessSignalStrength","wifiWirelessSignalStrength_","videoThumbnailSearch_","ActivityController","FilterResultsController","defaultFilterValues","showOtherClips","categories","globalDeviceIds","ActivityRoute","FilterResultsRoute","EmberEventHistory","filterResultsRouteQueryParams","getQueryParam","d","define","esc","require","videoSettingsFamiliarTargetsSubjectSelectionCarousel_","FamiliarTargetIncorrectMoveActionSheet","unfamiliarLabel","FamiliarTargetViewPhoto","actionSheetPhotoDateString","getActionSheetPhotoDateString","photoDate","cameraTitle","cameraDescription","shouldDisplayEntireImage","isFeedbackCard","popoverMenu_","videoRulesExitDelay_","sendAction","overrides","exceptionValues","atHomeExceptionsChanged","getExceptionsToDisplay","devices","exceptionStates","geoDevices","partitions","showGeoExceptions","showPanelExceptions","_this","fnCreateItem","isSelected","subitems","CheckboxTreeItem","disabledPanelException","panelExceptionArmingItems","Disarmed","every","partition","isArmedOnly","ArmedStay","canUseAwayException","ArmedAway","forEach","key","GeoFence","isCurrentDevice","AtHomeExceptions","identityManager","classNames","init","component","properties","_super","fenceId","props","_get","geoFences","showDisabledPopup","isPresent","selectedPanelExceptions","e","availablePanelExceptions","exceptionToIcon","Map","disabledException","panelExceptionItems","geoExceptionItems","geoFenceItems","geoFenceIds","f","fence","exceptionsChanged","exceptions","fnFilterExceptions","panelExceptionsChanged","delayResult","findRecord","getSelectedSystemId","exitDelay","videoRuleExitDelayDefault","geoExceptionsChanged","fenceChanged","AsyncWithPulsatingLoadingText","FadeOutText","textStyle","maxWidth","checkIfFadeOutNeeded","el","useFadeOutEffect","clientWidth","TickedSliderWithDescriptions","VideoBusinessActivityAnalyticsRulesWrapper","BaseEditBusinessActivityAnalyticsRuleUi","CustomShape","logMissingAbstractMember","resourcePath","setupText","camelize","titleTextPath","descriptionText","dictionaryWithRuleDrawing","createDictionaryOfDrawingsFromRule","missingCriteria","thresholdPrompt","thresholdSubPrompt","videoAdvancedAnalyticsEditRuleUiEditRule_","videoAdvancedAnalyticsEditRuleUiEditThresholdsUi_","videoAdvancedAnalyticsEditRuleUiEditIncludeHistoricalData_","EditBusinessOccupancyUi","Line","maxCapacityOptions","Array","zeroVal","count","maximumOccupancies","EditIncludeHistoricalData","includeMetricsFromOldVersions","BinaryListItem","label","updateHistoricalDataSelection","_items$","EditPeopleCountingUi","SensorHeader","videoAdvancedAnalyticsSensorHeader_","EditRule","disableSave","rules","isRuleGroup","drawing","drawingCompleted","split","updateName","message","RSVPReject","points","direction","duration","transitionToPreviousRoute","catch","cancel","creatingNew","isNew","router","getOwner","lookup","currentRouteName","refresh","rollbackAttributes","EditThresholdsUi","savedValues","sort","dropdownInfos","selectOptions","thresholdTypeText","selectedValues","selectedThreshold","number","selectedThresholdValue","otherThresholds","val","validThresholds","unshift","dropdowns","dropdownSelectionChanged","newValue","updateValues","AnalyticsLightRule","lightDurations","lightCheckBoxItems","lights","light","displayLightRuleFilterTypes","isThirdPartyAnalyticsRule","lightRuleFilterTypeText","PersonDetection","onLightTimeOnChange","timeOn","lightsChanged","zWaveLights","rejectBy","lightScheduleChanged","timeValuesAsInts","lightDayBits","dayBits","lightRuleStartTime","beginTime","lightRuleStopTime","endTime","lightRuleFiltersChanged","lightRuleFilters","_selectedFilters$find","_selectedFilters$find2","selectedFilters","filterBy","Set","flatMap","filters","subjectIds","CANVAS","dragHandle","details","preventDefault","maxValue","inverseValue","box","side","dimension","getMousePosition","valuePercentage","updateProps","validateSide","isNaN","drawCheckboxImage","x","y","color","drawingContext","getContext","checkSvg","getStaticResourcePath","beginPath","arc","PI","lineWidth","fillStyle","fill","drawImage","updateStoredComponentHeightAndWidth","newHeight","newWidth","width","componentWidth","componentHeight","calculateNewHeightAndWidth","componentElement","querySelector","naturalWidth","naturalHeight","parentElementWidth","parentElement","offsetWidth","drawBox","boundingBox","withHandles","withCheckbox","strokeStyle","drawShape","drawSideHandles","boundingBoxResizeEvent","snapshot","boxes","boxSelection","selectedBoxIndex","objectAt","canvas","rect","getBoundingClientRect","height","isVertical","left","top","clientX","clientY","getMouseEvent","constrainRange","touches","usingTouchDevice","EditSnapshot","imageSource","_snapshot$imageUrl","showHandles","isEditable","boundingBoxPoints","boundingBoxes","boxPoints","right","bottom","DISTINCT_COLORS","snapshotStyle","document","guidFor","dom","addListener","onInsertElement","evtStart","evtMove","evtEnd","which","boundedBoxPoints","getMouseCoordinate","body","point","findMidPoint","pop","h","arePointsClose","HANDLE_RADIUS","mouseEvent","listenerId","bind","removeListener","isPointInShape","boxClicked","setImageLoaded","drawBoundingBoxes","clearShape","isMoreThanOneBox","VideoHdStateImage","VideoIntercomContactEditContactName","allBlank","isBlank","firstName","lastName","companyName","disableCompanyName","disableFirstLastName","CameraLightDurationValues","AudioDurationValues","AIDeterrenceMessageTypeValues","AIDeterrenceMessageType","CommercialPropertyClosed","Deterrence","LeaveAMessage","NotAcceptingVisitors","ProfessionallyMonitored","Trespassing","AIDeterrenceLanguageTypeValues","AIDeterrenceLanguageType","English_US_Azure","French_Canada_Azure","Spanish_Mexico_Azure","getResourceKeyForAiDeterrenceMessageTypeOption","aiDeterrenceMessageTypeOption","_AIDeterrenceMessageT2","DeterrenceWithSceneDescription","CommercialPropertyClosedLight","getResourceKeyForAiDeterrenceMessageSubTypeOption","aiDeterrenceMessageSubTypeOption","_AIDeterrenceMessageT3","getResourceKeyForAiDeterrenceVoiceTypeOption","aiDeterrenceVoiceTypeOption","_AIDeterrenceVoiceTyp","AIDeterrenceVoiceType","AdamNormal","JohnAngry","KarenCheerful","KarenFriendly","KarenNormal","KarenUnfriendly","MaryNormal","MaryUnfriendly","SteveAngry","SteveNeutral","SteveNormal","SteveUnfriendly","TomAngry","TomNormal","getResourceKeyForAiDeterrenceLanguageTypePreview","aiDeterrenceLanguageTypeOption","_AIDeterrenceLanguage","PerimeterGuardRule","not","_dec23","_dec24","_dec25","_dec26","_dec27","_dec28","_dec29","_dec30","_dec31","_dec32","_dec33","_dec34","_dec35","_dec36","_dec37","_dec38","_dec39","_dec40","_dec41","_dec42","_dec43","_dec44","_dec45","or","_dec46","and","_dec47","_dec48","_dec49","_dec50","_dec51","_dec52","TextToSpeechWithImage","_dec53","_dec54","gt","_dec55","_dec56","_dec57","_dec58","_dec59","_dec60","_dec61","_dec62","_dec63","_dec64","_dec65","_dec66","_dec67","_dec68","_descriptor15","_descriptor16","_descriptor17","_descriptor18","_descriptor19","_descriptor20","_descriptor21","_descriptor22","_descriptor23","_descriptor24","_descriptor25","_descriptor26","_descriptor27","_descriptor28","_descriptor29","_descriptor30","_descriptor31","_descriptor32","_descriptor33","_descriptor34","_descriptor35","_descriptor36","_descriptor37","_descriptor38","_descriptor39","_descriptor40","_descriptor41","_descriptor42","_descriptor43","_descriptor44","_descriptor45","_descriptor46","_descriptor47","_descriptor48","_descriptor49","_descriptor50","_descriptor51","_descriptor52","doesDeviceHaveAiDeterrenceEnabled","camerasWithAiDeterrence","deviceId","isAiDeterrenceBoostedSliderEnabled","isVolumeBoosted","isAIPerimeterGuardWithVideoEnabled","getDeviceId","showAiDeterrenceToggle","isAiDeterrenceQuotaMetOrExceeded","aiDeterrenceVoiceOptions","availableVoiceTypesMap","ExpectingDelivery","aiDeterrenceMessageSubTypeOptions","availableMessageSubTypeMap","hasAiDeterrenceServicePlan","numberOfCamerasWithAiDeterrence","aiDeterrenceMaxCameraQuota","shouldAIDeterrenceBeToggledOn","supportsFloodlight","sirenAudioEnabled","sirenLightEnabled","sirenLedEnabled","shouldShowAIDDetails","useStoriesUI","getPreviewString","quote","_AIDeterrenceMessageT","getResourceKeyForAiDeterrenceMessageTypePreview","aiDeterrenceMessageType","enableCameraLedDurationDropdown","cameraLightDurations","canModifyRuleUiElements","aiDeterrenceMessageTypeOptions","localeCompare","aiDeterrenceMessageSubTypeDropdownOptions","None","_this$aiDeterrenceMes","aiDeterrenceMessageSubType","aiDeterrenceLanguageTypeDropdownOptions","aiDeterrenceLanguageType","aiDeterrenceVoiceTypeDropdownOptions","messageType","_this$aiDeterrenceVoi","aiDeterrenceVoiceType","aiDeterrenceFreeTextVoiceTypeDropdownOptions","voiceOptions","_this$aiDeterrenceVoi2","cameraLightAlertOptions","lightAlertDropdownItems","availableLightAlertOptions","cameraSoundOptions","supportsPerimeterGuardAudioPlayback","supportedPerimeterGuardAudioOptions","perimeterGuardAudioDropdownItems","audioDurationsOptions","supportsMultipleSirenOptions","SingleSiren2","perimeterGuardCustomizationComponentsDisabled","perimeterGuardEnabled","perimeterGuardConfigMinimumDelays","enableDeterrenceVolumeSlider","aiDeterrenceMessageSubTypeOptionsEnabled","has","perimeterGuardConfigurationTestDisabled","canEditRule","perimeterGuardAudioWarningText","hasAccessToAudioForNonDoorbellCameras","perimeterGuardBeginTimeBound","scheduleIsCustom","perimeterGuardEndTimeBound","perimeterGuardDayBoundsBits","EVERY_DAY_BITS","displayAIPerimeterGuardPrompt","hasAiDeterrenceFeatureToggle","supportsAIDeterrence","hasTwoWayAudioAddOnAndAcceptedAudioAgreement","hasUpstreamAudioUrl","displayCameraFirmwareUpgradeAlert","canViewKnowledgeBaseLinks","canViewKnowledgeBase","isCpiDealer","showAudioFeaturesWarning","showAudioDurationWarning","redirectToLearnMore","showAIDeterrenceFeatureWarning","perimeterGuardConfig","NoAIPerimeterGuard","onCameraSoundToggleChange","toggleEvent","isEnabled","audioOpt","audioOption","audioEnabled","canPlaySound","shouldBoostVolumeGain","onCameraLedToggleChange","ledEnabled","onToggleAIPerimeterGuardWithImage","allDisabled","aIPerimeterGuardType","aiDeterrenceMessageVolume","aiDeterrenceMaxVolume","supportsSpotlight","lightEnabled","onCameraLightDurationChange","newDurationSeconds","newDuration","audioDuration","ledDurationSeconds","onChangeAiDeterrenceLanguageType","newAiDeterrenceLanguageType","languageType","onChangeAiDeterrenceMessageType","newAiDeterrenceMessageType","onChangeAiDeterrenceMessageSubType","newAiDeterrenceMessageSubType","onChangeAiDeterrenceVoiceType","newAiDeterrenceVoiceType","onCameraSoundChange","newAudioOption","onCameraAudioDurationChange","onPerimeterGuardConfigMinimumDelayChange","newMinimumDelaySeconds","minimumDelaySeconds","onPerimeterGuardSubScheduleChanged","_afterSunset","_oldDayTimes","displayCustomSchedule","startTime","setPerimeterGuardSubScheduleIsCustom","updateLightAlertOption","option","lightAlertOption","toggleLightguard","testPerimeterGuard","perimeterGuardConfigJson","getProperties","ajax","apiRequest","POST","testAIDeterrence","updateRandomizationState","evt","SelectionSubjectFilter","onFilterToggle","onItemChange","subjectFilters","onFilterChange","videoRulesClassificationFilterSelectionSubjectFilter_","ClassificationFilterComponent","subItemsSelectedText","subItems","allVehiclesItem","amountSelected","setIsSelected","onSubjectSelectionChange","videoRulesClassificationFilterSelectionClassificationFilter_","VideoRulesClassificationFilterSelection","toBinaryListItem","subjectId","si","toClassificationItem","_props$subitems","CompositeFilter","i","ValueFilter","ClassificationSelectionProxy","showClassificationFiltersAsDropdownSelection","vehicleEnrollment","findAll","clusters","filtersAsListItems","onFiltersChanged","listItems","ExitDelay","loadDefaultExitDelay","exitDelayOptions","exitDelayItems","exitDelayChanged","PropertyStatusExceptions","propertyStatusExceptionItems","PresenceStateHome","PresenceStateSleep","PresenceStateAway","selectedExceptions","availableExceptions","openModal","isDarkModeEnabled","showModal","PresenceStateExplainerModal","titleText","bodyMainText","bodySubText","closeButtonText","imagePath","showCloseButton","leavePageWarning","propertyStatusExceptionsChanged","modalsDialogModalsSimpleSimpleDialog_","AnalyticsBestPracticesModal","ThumbnailHelper","EmberObject","toastMessage","failedToCommunicateWithOvProxy","hasMaxRules","isCalibrationRequired","maxNumberOfOvRules","inCriticalDataMode","maxRulesText","isBusinessActivityAnalytics","flag","compact","selectThumbnail","thumbnailToSelect","thumbnails","setEach","cannotSetupRule","isDestroyed","supportsLurkerDetection","getCameraForSelectThumbnail","analyticsFirmwareManager","launchOvFirmwareUpgradeModalIfNecessary","selectThumbnailByDeviceId","thumbnail","selectTypeCard","ruleTypeOptions","foundMatch","ruleTypeOption","isMatch","deSelectAllRuleTypeCards","isValidRuleType","createGifUrl","gifResourcePath","baseUrl","setThumbnailHeight","thumbnailHeight","DESKTOP_THUMBNAIL_DIV_WIDTH_PIXELS","thumbnailElement","preselectCamera","numberOfCamerasWithMaxRules","shouldPreSelectSingleCamera","selectCameraAtMaxRules","allowBaaToSelectCamera","EmberOvReadyRuleDraw","firstObject","EmberVideoRules","SelectCameraRule","_class3","cameraThumbnails","onlyHasOneCamera","hasOvReadyPackageInstalled","selectCameraTypeMessage","headerText","allCamerasHaveMaxRules","camerasCountTranslationKey","camerasCount","selectedRuleType","isGroundZoneRecommended","supportedRuleTypes","ruleTypeOptionsArray","ruleTypes","ovRule","gifUrl","isRecommended","GroundZone","setInitialThumbnailHeight","selectCamera","_this$syncQueryParams","newCamera","navigateToCalibrationPageFlow","media","isMobile","syncQueryParams","selectType","_this$syncQueryParams2","showAnalyticsBestPracticesModal","stats","logEventIfHasNoOvRules","AnalyticsRulesTypeNotSureHelperViewed","AnalyticsBestPractices","STREAM_ASPECT_RATIO","SUGGESTED_SLIDER_VALUE","CircleSize","updateSlider","isSavingOrLoadingCamera","currentSliderValue","defaultSliderPosition","reverseSliderValue","setPreviewAndCirclesSizing","mainDiv","getElementsByClassName","previewAndCirclesWidth","previewAndCirclesHeight","previewAndCirclesSizeStyle","previewAndCirclesSizeHeight","shouldDisplayCircle","circleSize","areCirclesVisible","VerySmall","Suggested","Medium","Large","size","VeryLarge","console","warn","updateCircleVisibilities","displayVeryLargeCircle","displayLargeCircle","displayMediumCircle","displaySuggestedCircle","displayVerySmallCircle","currentValue","updateSliderFromCamera","minimumObjectDetectionSize","minimumObjectSizeSliderMaxValue","ovReadyCamera","CameraAnalytics","circles","circleVisibilities","fnGetSize","isVisible","type","divClass","dasherize","altText","isIndoorScene","setPreviewAndCircleSizing","onCameraChange","setCircleVisibilities","selectOption","newIsIndoor","toggleVisibility","circleVisibilitySelected","newSize","isFromSlider","isMouseUp","DeviceImageContainer","DeviceStatusInfoItem","deviceStatusItemSubtext","deviceStatusInfoModel","connectionStatus","DeviceConnectionStatusEnum","deviceStatusItem","iconCss","status","iconInfo","getDeviceStatusIconInfo","iconType","statusString","Connected","Disconnected","CameraAccess","_this$args$model$subj","subjectEnrollment","cameraAccessInstruction","saveCameras","cameraProperties","some","cameraProp","isFaceOptedIn","isVehicleOptedIn","_this$args$model$subj2","savePropertiesWithChanges","clearVisitedRoutesStack","routeEnum","EmberVideoFamiliarVehicles","EmberVideoFamiliarFaces","isMobileApp","addRouteToVisitedRoutesStack","VideoCameraSettingsOverview","ExpandPhotoButton","FaqTerms","isFamiliarVehicle","simpleListDetails_","deleteEnrollment","destroyRecord","unloadAll","isVehicleEnrollment","transitionBackToMobileApp","EmberHome","FeatureManagement","videoSettingsFamiliarTargetsPhotoGrid_","IncorrectPhotos","resourcePrefix","createNavButton","mainText","infoText","routeId","shouldHide","NavigationButtonList","style","onClick","PhotoCardActionButtons","elementHost_","PhotoGridComponent","selectedPhotosCount","_this$selectedPhotos$","_this$selectedPhotos","selectedPhotos","bulkActionsState","photos","_this$actionSheetPhot","actionSheetPhoto","createdUtc","floatingSubjectSelectionStyle","showFloatingSubjectSelection","floatingSubjectSelectionHeight","subjectSelectionBodyHeight","floatingSubjectSelectionCheckboxText","updateSubjectSelectionBodyHeight","offsetHeight","bulkSelectionChanged","img","handleActionButtonClick","onAction","stopPropagation","moveImagesToSubject","subject","nameAndCreateSubject","deleteAndCloseFloatingSubjectSelection","deleteImages","attemptCreateAndMove","showDeleteImagesModal","cached","RecentPhotos","isFamiliarFaceEnrollment","_this$args$enrollment","shouldDisplayAtLimitInlineAlert","isMaxFamiliarSubjectReached","recentPhotosProperties","genericResourcePath","atLimitInlineAlertText","noPhotosIcon","noPhotosHeaderText","noPhotosInstruction","noPhotosWaitInstruction","photoAltText","recentPhotosHeader","recentPhotosSubheader","SubjectImage","_this$args$errorText","defaultErrorText","textKey","isLoginAsLoginRep","VideoSubjectSelectionCarouselSelectionIcon","AsyncSelectionState","AsyncSelection","Pending","buttonAction","asyncState","Idle","videoSettingsFamiliarTargetsSubjectSelectionCarouselSelectionIcon_","videoSettingsFamiliarTargetsSubjectSelectionCarouselAsyncSelection_","SubjectSelectionCarousel","optionLabel","RecipientsSearchbar","selectAllCheckboxes","noCheckboxSelected","intercomLogins","filteredIntercomLogins","searchValue","intercomLogin","toLowerCase","secondaryDescription","updateIntercomLogins","toggleAllCheckboxes","VideoSettingsLightguardLightActivationCard","On","lightButtonIcon","isLightOn","alarmLightButtonIcon","isAlarmLightOn","toggleLight","toggleAlarmLight","cameraLightSetting","LightTriggerStatusEnum","VideoSettingsLightTriggerItem","isActive","Active","isPaused","Paused","isInactive","Inactive","triggerStatusText","showPreferredTimezone","preferredTimezone","pausedUntilDateTimeUtc","timestamp","videoSettingsLightguardLightTriggerItem_","automationItemStatus","VideoSettingsLightTriggersGroup","showVideoAnalyticsTrigger","canManageVideoAnalytics","canViewVideoAnalytics","lightEnabledRuleStatus","resolvedRuleDetails","ruleItem","isLightEnabled","lightEnabledRuleDetailsOnCamera","isAnyLightEnabledRulesActive","pausedLightEnabledRuleDetails","ruleDetails","pausedUntilA","pausedUntilB","differenceInMinutes","lightAnalyticsRuleStatus","resolvedLightEnabledRule","motionSettingStatus","cameraPirSetting","pirMotionEnabled","lightScheduleStatus","schedules","lightRuleStatus","onAnalyticsClicked","globalDeviceId","onMotionDetectionClicked","EmberVideoLightGuardMotionDetectionSettings","isVSR","onScheduleClicked","EmberLightsSchedules","onAutomationClicked","EmberLightsRules","qualityKeyMapping","Low","High","Higher","FourMP","FourMPHigherFrameRate","qualityToTextResourceMapping","quality","RecordingQualityInput","minRecordingQualityText","recordingQualityToStreamMapping","maxRecordingQualityText","allowsMaxQuality","maxValueForSlider","currentQualityInfo","recordingQuality","resolution","Resolution","frameRate","FrameRate","maxRecordingQuality","warningMessage","forcedRecordingQuality","supportsDynamicStreamMapping","indexOf","onSliderMoved","valueChange","SliderWithServerRequest","disableSlider","_this$args$disableSli","sliderValueChange","sliderValueChanged","success","lastSliderValue","onSliderChange","_isFromSlider","debounce","_","assign","uiSliderWithServerRequest_","FocusKey","FovKey","BothKey","VarifocalInputSettings","varifocalFovValue","selectedVarifocalCamera","varifocalFov","shouldDisableSliders","disableSliders","updateFovFocus","callBackPromise","setIsSavingOrLoadingCamera","setVarifocalCameraModel","fovChanged","capitalize","varifocalFocus","cameraModelProperty","varifocalFocusValue","err","getCaughtError","finally","autoFocus","autoFocusCamera","resetVarifocalLens","varifocalFovChanged","newFovValue","varifocalFocusChanged","newFocusValue","VideoDeviceAndSettingsSelector","disableVideoDropdown","videoDeviceDropdownItems","settingsPageId","data","deviceDesc","settingsPageItems","settingsDropdownItems","urlEnum","videoDeviceSelectionChanged","_visitedRoutesStack$a","visitedRoutesStack","at","search","resetVisitedRoutesStack","updateVideoDeviceSelection","settingSelectionChanged","settingsPageUrlEnum","settingsPageInfo","updateSettingSelection","redirectUrl","isEmber","VideoSettingsContainer","onUpdateSettingSelection","settingsPageUrl","transitionToUrl","onUpdateVideoDeviceSelection","_await$this$identityM","_await$this$identityM2","unitId","getSelectedSystem","getGlobalIdFromUnitAndDevice","SNAPSHOT_RETRY_TIME","pollForSnapshotData","_this$snapshotDataObj","shouldLoadSnapshots","snapshotDataObjects","snapshotInfo","getOrRetrieveSnapshotData","setTimeout","getSnapshotData","blobUrl","errMsg","_response$value","response","GET","bytes","errorMessage","isSnapshotRetryable","decryptedString","atob","uintArray","Uint8Array","from","c","charCodeAt","blob","Blob","URL","createObjectURL","videoVideoPlayerOverlay_","VideoFovOverlay","BaseVideoLiveOverlay","showSettingsChangingSpinner","LOADING_STATE","INITIALIZING_STATE","PLAYING_STATE","playerState","isModifyingSettings","liveVideoPlayer_","videoVideoPlayerOverlayFovOverlay_","FovPlayer","BaseLivePlayer","StreamUsage","LiveViewFieldOfView","_this$setReloadStream","setReloadStreamOnTimeoutMethod","reloadStreamOnTimeout","hasStreamTimedOut","initializeVideoSource","total","n","Route","AdcBaseRoute","EmberVideoAddDeviceRedirect","redirect","VideoAddNewDevice","EnterpriseAdvancedVideoSearchRoute","NUM_SECONDS_IN_HOUR","baseAdvancedSearchDefaultFilterValues","activitySearchDisabled","activitySensitivity","motionSearchDisabled","motionSensitivity","AdvancedVideoSearchRoute","EmberVideoAdvancedVideoSearch","replace","timeInterval","params","transition","baseAdvancedSearchModelHook","deactivate","cancelObjectSearchRequest","slugs","fakeSearchResultData","AppearanceSearchResultsController","SvrTimelineController","appearanceSearchDataObject","appliedFiltersCount","resultCount","searchInProgress","initialize","playSelectedClip","resultId","log","AppearanceSearchResults","SvrTimelineRoute","selectedOptions","cameraGroupId","relay","EmberVideoAppearanceSearchResults","playbackModel","paramsFor","routeName","svrCameras","childModel","cameraIds","JSON","parse","makeHeatMapRequest","queryValues","apiRequestForValue","makeHeatMapComparisonRequest","buildHeatMaps","requestValue","_camera$description","_camera$ovRules$findB","_camera$ovRules$findB2","getCameraAndRuleName","downloadRequest","heatMapUrlInfos","heatMapUrlInfo","_heatMapUrlInfo$ruleS","url","heatMapUrl","ruleSnapshotUrls","ruleSnapshotUrl","HEAT_MAP_CONFIG_PARAMETERS","HeatMapController","EmberController","checkValues","heatMapConfigValues","getConfigValues","heatMapTypeValues","getTypeValues","sharedParameters","src","saveHeatMapMetrics","errors","detail","secondEditValues","secondRuleHasMinDuration","firstHeatMapSrc","secondHeatMapSrc","secondHeatMaps","heatMapViewTypeDropdownList","heatMapTypeDropdownList","canShowHeatMaps","areHeatMapsLoaded","_this$heatMapMetrics","heatMapMetrics","loadHeatMapComparisonTask","isIdle","loadHeatMapTask","HeatMapMetricIndex","IncludeLowActivity","IsTimeLapse","dataLoaded","resolvedModel","hasHeatMapRule","heatMapParameters","secondHeatMapParameters","loadHeatMap","updateEditValues","editValueProperty","updateHeatMapTypeValue","updateHeatMapTypeDropdown","updateHeatMapViewDropdown","IsComparison","updateIncludeLowActivity","includeLowActivity","updateRuleHasMinDuration","shouldLoadHeatMaps","hasMinDuration","isFirstComparisonRequest","isFirstRequest","downloadHeatMap","_heatMapInfos$0$heatM","_heatMapInfos$","_heatMapInfos$1$heatM","_heatMapInfos$2","_firstHeatMapInfo$","_secondHeatMapInfo$","heatMapInfos","firstHeatMapInfo","secondHeatMapInfo","downloadCrossOriginImage","getDownloadName","_await$makeHeatMapReq","_await$makeHeatMapReq2","_heatMapInfo$","heatMapInfo","asArrayValues","isDate","toISOString","pluralize","parameters","parametersHaveChanged","checkDirtyParameters","hasDirtyParameters","isEqual","getDownloadSafeDate","format","HeatMappingRoute","EmberVideoBusinessActivityAnalyticsHeatMapping","redirectedFromRouteId","beforeModel","selectedSystem","system","_this$identityManager","camerasSupportingHeatMaps","validateCameraIds","resetController","controller","isExiting","showViewingOptions","willTransition","defaultCamera","asyncFind","allParameters","_await$this$validateC","validateCameraId","Controller","transitionToRuleSelection","existingRuleIds","ruleId","EmberVideoBusinessActivityAnalyticsRule","EmberVideoBusinessActivityAnalytics","createRecord","afterModel","currentModel","VideoBusinessActivityAnalyticsReports","BaseReportsRoute","EmberBusinessActivityAnalyticsReports","getReportType","BusinessActivityAnalytics","OvRuleGroupListRoute","EmberVideoBusinessActivityAnalyticsRuleGroupList","ruleGroups","hasBAAWritePermission","booleanFlag","checkForBaaPackages","hrefTo_","EditRuleGroupSelection","cameraGroups","availableRules","rulesByCamera","cameraGroup","ruleGroup","ruleInGroup","parentItem","isSelectable","ruleListUrl","routeItem","getRouteItem","urlFor","query","selectionChanged","checkboxTree","selectedRuleIds","parent","allRules","videoAdvancedAnalyticsEditRuleUiEditRuleGroupSelection_","EditBusinessOccupancyGroupUi","EditPeopleCountingGroupUi","RuleGroupTypeEditUiPath","LineCount","BusinessOccupancy","OvRuleGroupListController","RuleEditController","editUiComponentPath","doesNotSupportBaaAction","isRuleGroupPage","baaSupportedCameras","packageCheckPropertyName","camerasWithoutPackageInstalled","transitionBackToMobileAppOrPreviousRoute","camerasWithoutCalibration","addWarning","camerasThatRequirePackageUpdate","OvRuleGroupRoute","EmberVideoBusinessActivityAnalyticsRuleGroup","id_group","hasBusinessActivityAnalyticsWritePermission","transitionTo","relativeCameraId","updateCamera","systemId","refreshModel","hasRecordingRulesWritePermission","EditCrowdGatheringUi","maxCrowdSizeOptions","maximumCrowdSizes","EditHeatMapUi","EditQueueMonitoringUi","maxQueueSizeOptions","maxWaitTimeOptions","numberOfSeconds","timeAsMmSs","maxQueueSizes","maxWaitTimes","RuleTypeEditUiPath","LineMonitor","CrowdGathering","id_rule","adapterOptions","createIfDoesNotExist","permissions","forcedStreamingMethodFromQueryParam","getForcedStreamingMethod","CameraGroupsController","BaseCameraGroupsController","manageGroupsRouteId","EmberVideoCameraGroups","editGroupRouteId","EmberVideoCameraGroupsEdit","EditRoute","BaseCameraGroupEditRoute","CameraGroupsRoute","BaseCameraGroupsRoute","AnalyticsController","AnalyticsRoute","BaseAnalyticsCameraRoute","EmberOvReadySettings","getSnapshotInfo","clipIndex","snapshots","calibrationSnapshots","setPreviewDivSizing","previewSnapshot","imageAspectRatio","mainDivWidth","previewDivWidth","previewDivHeight","VideoCameraCalibrationCaptureController","BaseCalibrationController","previewDivSizeStyle","showStreamFailureMessage","reloadStream","capturePhoto","buttonAnimation","transitionToEditRoute","getQueryParams","isFeedbackRequired","transitionToReviewRoute","transitionToIndexRoute","previewResized","elContainer","imageLoaded","firstImageIsLoading","closest","reloadSnapshotLater","imageError","BaseCalibrationRoute","EmberVideoCameraCalibrateCapture","VideoCameraCalibrationEditController","FeedbackRequired","boundingBoxItems","objectNumber","_this$boxSelection","snapshotToEdit","multipleObjectsFound","readyToSubmit","calibrationStatus","method","Calibrated","isSuccess","_this$clipIndex","transitionToCaptureRoute","_boxes$toArray","toArray","snapshotInvalidText","_this$model$index","snapshotsRequired","confirmText","waitingOnObjectSelection","disableConfirmButton","isSnapshotInvalid","boxSelectionChanged","boxOptions","onBoxClicked","boxIndexSelected","updateBoxSelectionButtonItems","retakePhoto","onBoxSelectionUpdate","_boundingBoxes$object","onSnapshotToEditUpdate","EmberVideoCameraCalibrateEdit","actions","STATE_BEGIN","STATE_COMPLETE","STATE_FAILED","resetCalibrationProcess","SnapshotsRequired","hasSnapshots","reset","m","IndexController","notEmpty","isMobileBrowser","calibrationRouteState","isCalibrated","stateGroup","_STATE_COMPLETE$STATE","stateTitle","_STATE_COMPLETE$STATE2","stateMessage","_STATE_COMPLETE$STATE3","cancelButtonText","confirmButtonText","confirm","cameraModelID","EmberOvReadyRuleSelect","EmberVideoCameraCalibrate","VideoCameraCalibrationReviewController","EmberVideoCameraCalibrateReview","CalibrationRoute","isMobileAllowed","applicationBuildNumber","isVarifocalCamera","EmberVideoVarifocalFovSettings","EditVideoCameraController","VideoCameraController","fnButton","EmberVideoLiveView","VideoLiveViewSettings","ovCamera","supportsCalibration","EmberVideoCamera","isAdcInternalDevDealer","ChimeSelectController","BasePostInstallController","chimeTypes","selectedChimeType","Mechanical","Digital","selectChime","chimeType","nativeBridge","doesSupportCloseWebViewV2","closeWebViewV2","doesSupportCloseWebView","closeWebView","chimeSelectionChanged","chimeOptions","_chimeOptions$findBy","selectedOption","cameraLoaded","doorbellChimeType","ChimeSelectRoute","BasePostInstallRoute","EmberVideoCameraPostInstallChimeSelect","PowerCheckController","powerCheckResult","powerCheckStatus","Success","Warning","Failure","parsePowerCheckResults","powerCheckState","goToNextWebView","checkPower","attributes","PowerSelectRoute","EmberVideoCameraPostInstallPowerCheck","telusLink","QualitativePowerCheckController","displayTelusLink","telusLinkPowerCheckResults","MarginalPower","MarginalVoltage","powerCheck","isTelusDealerId","Pass","InsufficientPower","InvalidPowerSourceType","powerCheckResultText","learnMoreClick","doesSupportLaunchBrowser","launchBrowser","transitionToUrlInNewBrowserWindow","QualitativePowerSelectRoute","EmberVideoCameraPostInstallQualitativePowerCheck","_transition$to","parentModel","modelFor","to","dealer","WedgeSelectController","bool","pageDescription","supportsWedgeYesNo","pageTitle","wedgeTypes","supportedDoorbellWedgeOptions","wedge","translateDoorbellWedge","wedgeSelectionChanged","selectedWedge","selectedWedgeType","selectWedge","wedgeType","doorbellWedgeType","WedgeSelectRoute","EmberVideoCameraPostInstallWedgeSelect","id_camera","camerasAndSvrs","goToAddNewVideoDevice","goToSettings","deviceMac","goToLiveView","goToCameraInfo","VideoMainSettings","goToSavedClips","VideoViewClips","EmberVideoCameras","isHiddenFromNavigation","populateClipList","start","end","setUpdateStatusMessage","update","cssClass","updateListStatus","videoEvents","formatTimestamp","ClassifierVisualizationController","clipList","videoEvent","relationships","snapshotAnalyticsDetails","snapshotSlices","analyticsDetails","slices","backgroundKeys","colorCssClass","drawingKeys","getInfoFromEventId","eventId","clipId","isInteger","updateAnalyticsDetailsStatus","calculateBackgroundColor","donationDetails","feedback","clipQualityFeedback","feedbackText","clipQualityComments","donateButtonText","donated","hasNoFeedback","hasNoFeedbackText","urlForDonationTerms","selectSavedClip","videoSource","viewVideo","downloadStatus","transitionToRoute","EmberClassifierVisualization","updateDateTimeRange","_ref4","updateListStartEndTimes","updateClipList","getElementById","maximumNumClips","downloadClipZip","parsedEventId","_ref5","downloadImageFromBytes","zipData","fileName","_ref6","toggleViewVideo","_ref7","_ref8","toggleVideoSize","videoSizeCapped","handlePlayError","donateClip","disableDonateButton","_ref9","_ref10","setupController","showCalibrationSnapshotDonationSetting","donateCalibrationSnapshots","isReprompt","hasAcceptedClipDonationAgreement","acceptedClipDonationAgreementVersion","newestClipDonationAgreementVersion","autoDonate","onCommentsChange","comments","userReviewedTerms","isChecked","reviewedTerms","objDiv","scrollTop","scrollHeight","showCalibrationSnapshotInfoModal","CalibrationSnapshotInfo","extend","EmberVideoClipFeedback","clipDonationAgreement","ClipUsageCategoryDetailsModal","ChartType","TimeFrame","ReportType","toReportTypeString","cameraOrRuleid","toUpperCase","parseReportTypeString","explodedId","VideoClipsUsageReportReportToolbar","reportTypeOptions","_cameras$map","_ovRules$map","cameraSubitems","byCamera","first","second","deviceModel","ruleSubitems","camDescription","byRule","A","byDate","timeFrameOptions","week","chartTypeOptions","bar","line","toggleToolbar","isToolbarOpen","updateReportTypeOptionWithParams","reportType","cameraOrRuleId","selectReportOption","reportTypeString","_option$subitems","updateTimeFrameOptionWithParams","timeFrameOption","selectTimeFrame","capitalizedTimeFrameOption","updateChartTypeOptionWithParams","chartType","selectChartType","capitalizedChartType","VideoClipsUsageReport","chart","selectedChartType","VerticalBarChart","chartOptions","LineChart","tooltipDateTimeFormatOptions","xAxisDateTimeFormatOptions","seriesFormatter","backgroundColor","scrollablePlotArea","minWidth","legend","symbolRadius","series","seriesType","subtitle","align","chartSubTitle","chartTitle","tooltip","formatter","formatDate","colorIndex","outside","className","xAxis","labels","tickInterval","selectedTimeFrame","tickmarkPlacement","tickWidth","yAxis","allowDecimals","reversedStacks","stackLabels","enabled","selectedReportTypeString","isRuleReportSelected","isCameraReportSelected","cameraModel","_this$videoUsage$uplo","_this$videoUsage","formatNumber","videoUsage","uploadQuota","chartDescription","isUsageByDateReportSelected","timeFrameResourceString","resourceName","chartSummaryTexts","eventCountsByDate","highestEventDisplay","rsc","lowestEventDisplay","summaryTexts","mostTriggeredEvent","eventCountsByTrigger","eventDisplay","trigger","classification","dateInterval","localToZonedTime","getTimezone","startOfHour","subHours","startOfDay","isCategoryDetailsVisible","isRemainingGroupVisible","_series$custom","custom","camerasInGroup","nonVideoAnalyticTriggers","_this$system","_this$locks","_this$videoUsage2","triggers","supportsSecureArming","locks","hasVMDRules","pointInterval","TimePeriod","HOUR","DAY","ClipUsageByDateSeriesFormatter","ClassifiedUploadsSeriesFormatter","statsForSelectedReport","showNonVideoAnaylticStatistics","_this$system2","_this$locks2","_this$videoUsage3","_this$eventsSummaries","_this$eventsSummaries2","eventsSummaries","summary","interval","requiredArgs","getTime","isWithinInterval","eventDate","weekday","_await$clipUsageRepor","clipUsageReportPermissions","hasVideoAnalyticsReadAccess","optionString","logEvent","UsageReportsByDateClicked","UsageReportsByCameraClicked","UsageReportsByRuleClicked","UsageReportsWeekClicked","UsageReportsMonthClicked","UsageReportsDayClicked","UsageReportsBarClicked","UsageReportsLineClicked","showCategoryDetailsModal","ovClassifiedText","ovClassifiedDescriptionText","ovClipUnknownDescriptionText","eventsInThisGroupIncludeText","remainingCamerasText","remainingCamerasDescriptionText","VideoClipsUsageReportRoute","perm","hasZwaveLocksReadAccess","ovCameras","_this$contextManager$","VideoClipsController","FilteringVideoClipsController","VideoClipsIndexController","FilterVideoClipResultsController","VideoClipsIndexRoute","FilterVideoClipResultsRoute","VideoClipsRoute","FilteringVideoClipsRoute","EmberVideoClips","hasStoriesAccess","EmberVideoGallery","DroneInstallController","Discovery","Congratulations","NoDevices","UnableToLink","Loading","getDefaultDisplayDescriptionForHive","hive","existingDevice","hiveId","deviceDescription","matchingThirdPartyCamera","getHivesWithUpdatedDescriptions","hives","displayDescription","hivesMarkedForLinking","readyToLinkHives","shouldSkipInstallation","filteredHives","isHiveInstallationAllowedForCurrentUser","hivesWithoutPermissions","notInstalledHivesWithPermissions","alreadyInstalledHives","onDataLoaded","screen","screenEnum","installDevices","requests","postData","responses","allResponsesSucceeded","restartDiscovery","_this$hives$hiveIndex","hiveIndex","findIndex","newName","toggleHiveSelected","DroneInstallRoute","code","EmberVideoDroneInstall","_hivesResponse$value$","FamiliarSubjectClipFeedbackController","feedbackEvents","FamiliarSubjectClipFeedbackRoute","EmberVideoFamiliarSubjectsClipFeedback","isNotificationEvent","isFamiliarVehicleFeedbackEvent","id_clip","findEnrollmentOfType","faceEnrollment","videoSettingsPermission","hasVehicleAccessPermission","hasOnlyFamiliarVehicleAccess","hasFamiliarFaceAndVehicleAccess","hasFaceAccessPermission","hasOnlyFamiliarFaceAccess","_this$store$peekRecor","peekRecord","queryRecord","familiarTargetFeedbackEvents","hasMultipleFeedbackEvents","feedbackEventEnrollment","multiVehicleFeedbackEnabled","VideoGalleryController","FilteringVideoMediaController","VideoGalleryIndexController","FilterVideoMediaResultsController","VideoGalleryIndexRoute","FilterVideoMediaResultsRoute","VideoGalleryRoute","FilteringVideoMediaRoute","EmberVideoInstallOverview","VideoInstallTutorialController","BaseInstallOverviewController","EmberVideoInstallTutorial","youtubePlayerSrc","isAccountLanguageFrench","BaseInstallOverviewRoute","VideoReplaceTutorialController","EmberVideoReplaceTutorial","VideoIntercomContactEditController","canProceed","saveContacts","intercomPromises","_this$model$firstName","_this$model$lastName","_this$model$lastName2","VideoIntercomContactEdit","EmberVideoIntercomContactEdit","VideoIntercomContactEnrollmentEditController","updateContacts","EmberVideoIntercomContactEnrollmentNotifications","VideoIntercomContactEnrollmentEdit","EmberVideoIntercomContactEnrollmentEdit","VideoIntercomContactEnrollmentController","cancelEnrollment","transitionToEdit","VideoIntercomContactEnrollmentNotificationsController","saveNewNotification","doesSupportEnablePushNotifications","enablePushNotifications","VideoIntercomCall","VideoIntercomContactEnrollmentNotifications","VideoIntercomEnrollment","EmberVideoIntercomContactEnrollment","VideoIntercomContactController","initials","_this$model$firstName2","charAt","transitionToNotifications","EmberVideoIntercomContactNotifications","NotificationItem","VideoIntercomContactNotificationsController","MINUTES_IN_DAY","EVERY_DAY","Panel","anyPushDeviceRecipients","pushDeviceRecipientsItem","pushDeviceRecipients","sendingFormatOptions","TextOnly","AttachThumbnail","dropdownItems","entries","formatValue","formatText","canAddPanelRecipient","sendingFormat","selectedFormat","canBeEnabled","isIntercomCallRuleEnabled","intercomRules","isDisabled","isCurrentDeviceAdded","_this$intercomRules$f","_this$intercomRules$f2","includesCurrentDevice","contactTypeEnum","IPhonePush","scheduleChanged","schedule","updateRulesIncludeCurrentDevice","updatedRules","saveRule","updateSelectedRecipients","recipients","panelFormatToggled","sendingFormatString","panelRecipient","onIsRuleEnabledChanged","addCurrentDevice","contactPromises","updateRules","selectedRecipients","rulePromises","currentDevice","VideoIntercomContactNotifications","abort","_params","_rules","_rule$dayBits","_rule$beginTime","_rule$endTime","_contactModel$contact","_contactModel$contact2","_rule$canAddPanelReci","_rule$isEnabled","_rule$hasReachedRecip","doesSupportTransitionToNativeViewWithId","EnableIntercomNotifications","transitionToNativeView","contactModel","recipient","hasReachedRecipientQuota","VideoIntercomContact","EmberVideoIntercomContact","_contacts$find","_contacts$find2","_contacts$find3","unitName","InternationalTestsController","internationalWebRtcEvent","_this$model$cameras$f","runTests","Playing","verifyLiveViewLoadingTimeTest","loadingTime","performance","didTestFail","failReason","isTestCompleted","Error","FailedToConnect","IceFailure","macAddress","startRunningTests","isTestStarted","VideoTest","desc","statusFunction","fail","running","testFail","testSuccess","testRunning","timeToCompleteTest","floor","didTestSucceed","EmberVideoInternationalTests","LiveViewController","BaseLiveViewController","LiveViewRoute","BaseLiveViewRoute","INSTALLATION_TYPE_DEFAULT","INSTALLATION_TYPE_SHARED","INSTALLATION_TYPE_INDIVIDUAL","showError","getErrorText","checkIfUserShouldResetAnyCameras","failures","failedAttemptsPerDevice","hasUserPossiblyLockedTheirCamera","_failedAttemptsPerDev","failedAttempts","MAX_FAILED_ATTEMPTS","groupResultsByParentDevice","onvifCameraDiscoveryResults","groupedDiscoveryResults","onvifCameraDiscoveryResult","parentId","postObject","getPostObject","showCredentialsExitModal","confirmButtonAction","failureCount","successCount","fullBodyText","bodyText1","bodyText2","getDoubleNewLineSeparatedString","confirmButton","backButton","bailModalClassName","OnvifModalCssClass","OnvifInstallCredentialsController","BaseOnvifInstallationController","EmberOnvifInstallationNaming","StoredOrManufacturerDefaults","installationType","credentialsType","toUnlock","failedInstalls","attemptUnlocks","onDefaultFailure","onAllDevicesSucceeded","clearInputError","someDevicesUnlocked","getRemainingResults","_failedInstalls$first","requiresReset","onCredentialsFailure","installationResult","showSharedMixedFailureModal","showResetModalAllDevicesFailed","individualFailure","goToNextDeviceOrNextInstallationRoute","_individualFailure$in","username","onvifCameraDiscoveryResultsByParent","discoveryResult","discoveryId","accumulator","_discoveryResult$inst","successes","_this$attemptUnlocks$","_this$attemptUnlocks$2","last","_discoveryResult$inst2","_discoveryResult$inst3","_discoveryResult$inst4","_discoveryResult$inst5","subsequentCameraIds","_this$attemptUnlocks$3","_this$attemptUnlocks$4","numberOfResultsToIndividuallyUnlock","resultsToIndividuallyUnlock","numberOfCamsUnlockingNow","usingIndividualInstallation","isUnlocking","attemptDefaultUnlocks","attemptSharedUnlock","attemptIndividualUnlock","currentResult","cameraIndex","peekAll","_discoveryResult$inst6","inputErrorMessage","onInputError","isTouchDevice","resource","successMessage","transitionToNextInstallationRoute","allFailed","_failedInstalls$","_failedInstalls$0$ins","_failedInstalls$2","setupIndividualUnlocks","modalTitle","cancelButton","showResetMessage","showPostResetModalForSharedInstall","modalDescriptionFirstSentence","modalDescriptionSecondSentence","modalDescription","markThatCamerasWereReset","pointerEvent","isSkippingCurrentInstalls","remainingResults","markResultsAsSkipped","nextIndex","results","macAddresses","onClickSkipButton","onUsernameChange","onPasswordChange","showExitModalForMobile","onTryCredentials","ExplicitCredentials","unlockSucceeded","handleKeyUpOnInputs","keyCode","ENTER_KEY","numCams","modalDescriptionFirstLine","modalDescriptionSecondLine","OnvifInstallCredentialsRoute","BaseOnvifInstallationRoute","EmberOnvifInstallationCredentials","restartOnvifInstallation","forward","hasConfirmedExit","retry","discoveryResultComparator","firstOnvifCameraDiscoveryResult","secondOnvifCameraDiscoveryResult","firstSvrName","secondSvrName","svrNameComparison","firstDevicePort","poePort","secondDevicePort","firstDeviceName","secondDeviceName","CheckboxItem","secondLineDisplay","OnvifInstallIndexController","EmberOnvifInstallationTermsOfService","selectedCount","checkboxItems","reachedMaxCameraCount","currentCameraCount","maxCameraCount","numAdditionalCamsSupported","numAdditionalCamsSupportedMinusSelected","isSettled","svrsDisplayObject","checkboxItemsForThisSvr","checkedItemsCount","channelsLeft","numberOfChannelsSupported","numberOfChannelsRecording","uncheckedChannelsLeft","checkboxItemsDisplay","checkboxItem","isCurrentlyInstalled","headerDeviceName","svrName","headerChannelsLeft","toggleSelection","mac","isNowSelected","unloadUnusedRecordsAndContinue","currentAndMaxCameraCounts","numberOfDiscoveryResults","resetFlagsForMobilePageContent","showMaxLimitPage","showDiscoveryWarningAsPage","addNotification","userCannotInstallAllDiscoveredCameras","sortedMappedCheckboxItems","ipAddress","portText","firstCheckboxItem","secondCheckboxItem","refreshModelAndParentModel","parentRoute","currentRoute","setInitialCheckedResults","camerasHaveBeenPreselected","uninstalledItemsForThisSvr","goToSupportPage","EmberSupport","OnvifInstallIndexRoute","EmberOnvifInstallation","OnvifInstallNamingController","updateCameraNames","apiRequestForDataRecords","requestBody","buildRequestBodyForCameraNaming","_result$camera","OnvifInstallNamingEditController","discoveryResults","discoveredCameras","discoveryIndex","cameraItem","removeAt","clear","subsequentCameras","navigateBack","saveCameraName","cameraRenameResults","loadSnapshotData","showDeletionModal","_discoveryResult$subs","_discoveryResult$subs2","subsequentCamerasLength","deletionInformationString","numberOfSensors","deleteCamera","switchBetweenResults","isLeft","numberOfInstalls","EmberOnvifInstallationNamingEdit","setSnapshotSizing","handleKeyUpOnName","onInput","hasReachedOrPassedMaxLength","MaxCameraNameLength","hasDescriptionAlreadyReachedMaxLength","atMaxLength","displayMaxLengthError","enforceMaxLength","OnvifInstallNamingEditRoute","BaseOnvifInstallationNamingRoute","parsedIndex","getDefaultOnvifCameraName","getUnsavedCamerasFromDiscoveryResults","isSaving","someDevicesHaveDefaultNames","showDefaultNamesConfirmation","confirmedDefaultNames","continueToNextPage","closeCustomerSiteIfComingFromMobiletech","external","isMobileTech","isMobileTechApp","closeMobileTechWebView","close","substring","splitIndexAndCameraId","indexAndCameraId","indexString","cameraIdParts","OnvifInstallNamingIndexController","visitNamingEditRoute","_this$discoveredCamer","_this$discoveredCamer2","currentCameraIndex","saveAllUnsavedCameraNames","isRenamingCamera","updateCameraNamesTask","VideoCameraInstall","camerasInstalledFromWeb","manufacturer","deviceName","deviceMake","subsequentCamera","Boolean","onNameInputValueChange","totalDiscoveryResults","cam","shouldShowMaxLengthError","handleMobileBackButton","_item$camera","_item$subsequentCamer","dirtyCameras","resultsLength","_this$displayMaxLengt","_this$atMaxLength","mainCameraId","mainKey","_this$displayMaxLengt2","_this$atMaxLength2","subsequentKey","mainCamera","_this$atMaxLength3","OnvifInstallNamingIndexRoute","noDefaultNames","OnvifInstallNamingRoute","getDiscoveryResultsWithCameras","startsWith","_model$discoveryResul","unsavedCameras","showExitConfirmation","snapshotDataObject","values","revokeObjectURL","installedDiscoveryResults","_item$installationRes","installedCameraIds","installedCameras","ids","subsequentCameraId","OnvifInstallRoute","hasReachedMaxCameraLimit","isMissingSvrs","hasNoPreviousRoute","transitionForErrorOnWeb","OnvifInstallTermsOfServiceController","acceptTOS","hasAcceptedAgreement","openMailToLink","location","href","encodeURIComponent","OnvifInstallTermsOfServiceRoute","DrawController","DrawBaseController","AnalyticsRulesPushNotificationsTooltipClick","onNotificationFilterSelectionChanged","filterSelection","logTooltipHoverInteractionTask","task","DrawRoute","DrawBaseRoute","getDetectionTypeState","canCreateParcelRule","Package","replaceVideoClipWithThumbnail","AttachVideoClip","updateFilterIcon","DrawV2Controller","shouldDisplayFamiliarFaceFeatures","checkCameraFeatureAccess","supportsFamiliarFace","videoSettingsPermissions","shouldDisplayFamiliarVehicleFeatures","hasInternalBetaAccess","supportsFamiliarSubjectRecognition","showPackageAlertsDisabledWarning","detectionTypes","excludeAnimals","areAnimalEventsExcluded","classifications","ruleClassificationFilters","supportedNotifications","Person","Animal","familiarFaceItems","getFamiliarSubjectProfiles","hasEnabledFamiliarFaceEnrollments","familiarSubjectNotificationFilters","OvRule","familiarFaceNotificationFilters","selections","AnyUnfamiliarFace","SpecificFamiliarFace","UnrecognizedPerson","somePeopleSelected","selection","notificationFilters","familiarFaceProfiles","FamiliarFace","isCollapsible","familiarVehicleItems","hasEnabledFamiliarVehicleEnrollments","vehicleNotificationFilters","AnyUnfamiliarVehicle","SpecificFamiliarVehicle","someVehiclesSelected","familiarVehiclePofiles","FamiliarVehicle","lightRuleFiltersCheckboxTreeItems","isThirdPartyCamera","thirdPartyLightRuleSupportedEvents","notificationFiltersBinaryListItems","notificationFilterSelection","activeParcelEvents","activeParcelDetectionEvents","supportedParcelEvents","packageNotIncluded","packageDisabled","packageFilters","PackageDeliveryAlert","PackageRetrievalAlert","detectionNotifications","hasEnableFeatureButton","enableFeatureButtonProps","enableButtonText","getEnableFeatureText","enableButtonRoute","hasUserEnabledFeature","getIsFamiliarSubjectEnabledPromise","hasNotificationFilterDropdown","familiarSubjectDropdownItems","dropdownAction","mapFilterTypeToDropdownAction","placeholderText","alert","getEnrollments","onNotificationDropdownSelectionChangedHelper","dropdownValues","removeAllFamiliarSubjectFilters","selectedOrPartiallySelectedDropdownValues","familiarClusters","selectedFamiliarClusters","allfamiliarSubjectsOption","isFace","personOrVehicle","possibleSelections","specificFamiliarSubject","notificationFiltersSet","delete","dropdownItem","selectedValue","add","selectedFamiliarSubjectValues","onFaceNotificationDropdownSelectionChanged","onVehicleNotificationDropdownSelectionChanged","onDetectionTypesChanged","onNotificationBinaryListSelectionChanged","onLightAutomationCheckboxTreeSelectionChanged","binaryListItems","filtersSet","packageAlerts","parcelEvents","onClipUploadChanged","isClipUploadActive","emailRecipients","mobileRecipients","onLightAutomationToggleChanged","showLightAutomation","analyticTriggers","lightsSelected","setObjects","onNotificationsToggleChanged","showNotifications","monitoringStationRecipients","onPerimeterGuardToggleChanged","perimeterGuard","showPerimeterGuard","cameraFeatureCheck","permissionCheck","OvReadyCamera","notificationFilterType","familiarFaceFilters","familiarVehicleFilters","filterType","detectionType","getFamiliarSubjectsForFiltering","DrawV2Route","EmberOvReadyRuleDrawV2","as","_rule$exceptions","ruleNumber","parcelRuleName","r","_r$ruleClassification","supportsParcelRules","hasSelectedRecipients","getEligibleFamiliarVehicles","_vehicleEnrollment$ge","_vehicleEnrollment$ge2","FamiliarObjectVehicle","v","isEligibleForNotifications","BaseVideoAutomationRoute","EmberOvReadyRule","_identityManager$iden","ruleRecord","touchlessRingRecord","perimeterGuardConfigRecord","parcelDetectionRecord","touchlessRingRule","parcelDetectionRule","canHaveFamiliarVehicles","hasFamiliarObjectEnrollmentBeta","systemConfig","thirdPartyAnalyticsCameras","familiarVehicles","isTouchlessRingEnabled","EmberPromise","_this$identityManager2","errorHandler","_e$errors","_e$errors2","errorShort","hasContactReadPermissions","hasMobileContactReadPermissions","hasMonitoringStationContactReadPermissions","MonitoringStation","onlyTwoFactorAddresses","hasAnalyticsLightRule","defaultExceptions","hasPartitions","hasCommercialVideo","defaultFilters","SavedClipFilterVehicle","isDeliveryVehicleIncluded","DeliveryVehicle","ThirdPartyAnalytics","base","modelRule","OV_RULE_TYPES","Tripwire","GIF_RESOURCE_PATH","AnalyticsSelectController","thirdPartyCameras","combinedCameras","enableNextButton","synchronizeQueryParameters","configureCameraSettings","defaultLightRuleFilterTypes","defaultNotificationFilterTypes","ThirdPartyAnalyticsCamera","ThirdPartyAnalyticsFilterOption","EmberOvReadyRuleSettings","AnalyticsSelectRoute","BaseAnalyticsRoute","ruleTypeInt","validateRouteRequirements","nextRouteId","getRouteItemByUrl","targetName","AnalyticsSettingsController","disableNextButton","drawWindow","savingPromise","showLoadingModal","BaseEditableAnalyticsRoute","canChangeOvCameraSettings","lastRouteIndex","getVisitedRoutesStackLength","previousRouteId","route","FilterBarRadio","BaseFilterBar","selectFilterTag","buttonId","filterTags","filterTag","doSearch","PAGE_WIDTH_SMALL","PAGE_WIDTH_MEDIUM","startPageTourIfNeeded","helpTours","VideoRulesPageTour","startVideoRulesPageTour","propagateSearchChange","newText","VideoRulesIndexController","VideoCameras","VideoLocalScheduleFilter","union","BaseController","Video","resolveRouteModel","_properties$permissio","filterTagsOverride","fnGetProperties","aiDeterrenceUsage","ruleSuggestions","sdCardCameras","isAllowedToCreateVideoSchedules","allowedRuleDisplays","VideoSchedule","hasSvrsButNoAccessToSvrSchedulePage","VideoAddSvrRecordingSchedule","hasSdCardCamerasButNoAccessToSdSchedulePage","EmberVideoSdCardSchedule","reloadContextAndModel","showCloudStorageInfo","canViewClipUsageReports","isCloudRecordingsFilterSelected","shouldShowAiDeterrenceInfoCard","canUseAIDeterrence","showLocalStorageInfo","isLocalStorageFilterSelected","checkRecordingStatus","availableFilterTags","availableRuleDisplays","selectedFilter","useShortenedText","pageSize","VideoRule","VideoLocalScheduleDisplayType","p","clickEvent","addText","ruleTypeText","ruleTypeTextHeader","newAutomationItems","_resolvedModel$permis","shouldHideAddButton","modalIsOpen","NewVideoRuleModal","NewVideoScheduleModal","fnGetDropDownItem","DropdownActionItem","videoRules","availableRoutesIds","itemFn","videoScheduleTransitionFunction","noAutomationItemsCanBeCreatedOnMobile","_this$resolvedModel$r","_this$resolvedModel","ruleSuggestion","disabledForMobile","videoFormats","user","_results$id","_vf$description","vf","addresses","topRuleUsages","ruleUsage","showClipLimitCard","canViewUpdatedClipLimitsUXRefresh","projectedVideoQuotaStatus","NotProjected","cookieManager","projectedVideoQuotaStatusCookie","getEssentialCookie","CLIP_LIMIT_SUGGESTION_LAST_COLLAPSED","isExpired","deleteEssentialCookie","collapsed","cookieValue","setEssentialCookie","endOfMonth","updatePageSize","editContact","userId","contactsToEdit","isEditingContacts","updateSearchText","once","onRefreshModel","send","updateFilterTags","newTags","postEvent","LocalSchedulesTab","COOKIE_PREFER_LOCAL_RULES","resetQueryParams","deviceType","VideoRulesIndexRoute","BaseAutomationRoute","itemModelPath","VideoCamerasFilter","preferLocalRules","isLocalRecordingAllowed","_this$currentModel","_currentModel$email","_currentModel$mobile","_currentModel$formats","_currentModel$svrs","_currentModel$sdCardC","_currentModel$videoUs","_currentModel$aiDeter","isCloudRecordingAllowed","isFullTransition","email","emailContactPermissions","forRecordingRules","mobile","mobileContactPermissions","VideoSchedulesIndexController","VideoSchedulesIndexRoute","EmberVideoSchedules","DEFAULT_BITRATE","BITRATE_OPTIONS_PROPERTIES","CONFIRM_DELETE_FOOTAGE","CONFIRM_REFORMAT","CONFIRM_UPGRADE_FIRMWARE","RECORD_AUDIO_ID","DONT_RECORD_AUDIO_ID","saveScheduleAction","successResource","handleSaveResponse","_error$errors","source","pointer","_error$errors2","confirmUpgradeFirmware","confirmReformat","confirmDeleteFootage","confirmDeleteFootageWarningMessage","troubleConditions","scheduleCamera","recordingStatusModel","AddNewSchedule","UpdateExistingSchedule","handleAdvancedOptionsSaveResponse","getSdCardStatus","sdCard","sdCardStatusEnum","supports4MpRecording","failIcon","red","UnexpectedException","DeviceCommandFailed","NoSdCard","SdCardNotCompatible","SdCardController","gte","BuildVersionInfoEnum","Seadragon","sdCardStatus","_sdCard$data","_error$errors3","defaultErrorMessage","existingSchedulesCount","sdCameras","_this$scheduleCamera","_this$scheduleCamera2","hasMaxLimit","_this$scheduleCamera$","_this$scheduleCamera3","hasVideoRetentionMaxLimit","existingSchedulesText","maxTotalSchedulesAllowedOnAccount","eligibleCamerasDropdownItems","_this$scheduleCamera4","scheduleCameraId","hasSdRecordingSchedule","maxBitrateDropdownItems","supportsSmartRateControl","supportsBitrateControl","mapping","defaultMaxBitrate","bitrateOptions","maxBitrateOption","displayBitrate","numMegabitsPerSecond","audioRecordingOptions","audioRecordingEnabled","showAudioDisabledWarning","scheduleRetentionPeriod","retentionPeriod","dealerMaxRetentionPeriod","isRecordedAudioEnabled","displayAudioSetting","supportsAudioRecording","mobileAppVersionSupportsAudio","showSvrRecordingAlert","cameraHasSvrSchedule","cameraSupportsDynamicStreamMapping","showBitrateControls","initModelData","confirmUpdateAdvancedOptions","back","onIsPausedChange","onDeviceDropdownChanged","sdCardActionTask","defaultRetentionPeriod","stopTime","recordingQualityChanged","smartRateControlEnabled","newCurrentMaxBitRate","disableBitrateControls","audioRecordingOptionChanged","_items$find","showHideAdvancedOptions","showAdvancedOptions","advancedOptionsChanged","automatedRecoveryEnabled","maximumBitrate","scheduleSmartRateControlEnabled","showMoreInfoModalForMaxSchedules","showMoreInfoModalForAudio","refreshSdCardStatus","updateProperties","selectedDevice","bitrate","redirectToDeviceSettings","webSupportsRedirectingToVsrAudioPage","EmberVideoSettingsAudio","sdCameraModelName","SdCardScheduleRoute","id_schedule","canSelectCamera","onboardPermission","getContextId","reloadVideoDevicesIfNotPending","rollbackModelOnTransition","canUserAccess","SvrRecordingSchedulesController","SvrRecordingSchedulesRoute","EmberVideoSvrRecordingSchedule","modalsBaseBaseModal_","getModalButton_","SvrDisconnectedModal","SelectSvrController","showDisconnectedModal","transitionToAddPage","svr_device_id","EmberVideoSelectSvrSchedule","svrDevices","SettingsOverviewController","allVideoDevices","navigateToCameraGroupsPage","pageEnum","isEnterprise","EmberEnterpriseVideoCameraGroups","SettingsOverviewRoute","EmberVideoSettingsOverview","videoSettingsOverview","notifyPropertyChange","AdvancedSetupController","EmberVideoSettingsAdvancedSetup","hasChangedFisheyeEnabled","changedAttributes","fisheyeEnabled","dewarpConfig","getRouteItemWithIdentityReloadIfNeeded","id_selected_camera","cameraPromise","passwordPromise","getDeviceIdFromGlobalId","cameraLink","VideoSettingsMotionDetectionTestRoute","EmberVideoBatteryMotionSensitivitySettings","EmberVideoBatteryStatus","VideoSettingsCameraAlerts","EmberVideoSettingsAlerts","supportsTwoWayAudioAndIsDisabled","alertsSetting","supportsTogglingMicrophoneSpeaker","isTwoWayAudioEnabled","alertSupport","lightAlertSupport","canUserEditVideoSettings","ReadWrite","shouldDisableAudioOptionDropdown","isAudioAlertEnabled","supportsLight","DoesNotSupport","cameraAudioOptions","availableAudioOptions","isDisabledAudioSettingsActionSheetOpen","navigateToAudioSettingsPage","_this$resolvedModel2","updateAudioAlertOption","saveSettings","_getErrorText","isAdapterErrorProcessingError","BaseVideoSettingsRoute","currentRouteData","shouldReloadCameraModel","showUnsavedChangesModalIfNeeded","AudioSettingController","ReadOnly","microphoneSpeakerDescription","resourceKey","isOnvifCamera","audioSetting","hasCustomerAcceptedAudioAgreement","hasFirmwareForTwoWayAudio","isAudioFeatureDisabled","shouldDisplayMicrophoneSpeakerFeature","areMicrophoneAndSpeakerOn","chimeTypeOptions","chimeToneSetting","navigateToSmartChimeSettings","EmberSmartChime","smartChimeGlobalId","changeChimeType","toggleMicrophoneSpeakerSettingOnOff","toggleNoiseFilteringSettingOnOff","isNoiseFilteringOn","microphoneGainForNoiseFiltering","microphoneSpeakerSetting","DeviceStatusController","EmberVideoSettingsDeviceStatus","connectionTypeString","getConnectionTypeString","deviceStatusInfo","connectionType","frequencyBandString","getConnectionFrequencyString","frequencyBand","networkItems","hasValue","listItem","SimpleListItem","deviceSSID","FrequencyBandEnum","statusHistory","deviceStatusHistory","deviceStatusHistoryItems","iconTitle","testConnectivity","transitionToKnowledgeBase","shouldDisplayKnowledgeBaseLink","knowledgeBaseLink","buildKnowledgeBaseURL","CustomerKnowledgeBase","DeviceStatusHistory","DeviceStatusRoute","FirmwareSettingsController","EmberVideoSettingsUpdateFirmware","shouldDisableUpgradeFirmwareButton","isFirmwareUpToDate","canUpgradeFirmware","upgradeFirmware","addInfo","FirmwareRoute","GeneralSettingsController","EmberVideoSettingsGeneral","wedgeText","deviceInfoItems","thirdPartySerialNumber","svrStorageInformationItems","storageCapacity","numberDrivesInstalled","colorPickerButtonStyle","ledLightSetting","ledLightColor","ledColorHsl","canChangeLedColor","hideNotifications","openColorPicker","isColorPickerOpened","newColorHex","navigateToUpdateFirmwarePage","doorbellNotificationSetting","generalSetting","promises","DeviceSettingsOverviewController","EmberVideoSettingsCamera","cameraCollection","baseCameraCollection","sdCardCamera","shouldDisplaySignalStrengthInfoCard","_cameraCollection$cam","supportsSignalStrengthInfo","shouldDisableCameraNameSaveButton","shouldDisableSaveButtons","isNewCameraNameValid","newCameraName","signalStrengthInfo","_cameraCollection$cam2","hasFovHealthChecks","Camera","snapshotPath","referenceSnapshotImagePath","trim","isReferenceSnapshot","deviceImagePath","cameraNameInputErrorMessage","navigationItems","hasV731BVideoSettingsPagesAccess","EmberVideoSettingsNetworkInfo","EmberVideoSettingsVideoConfiguration","supportsTwoWayAudio","hasAudioPermissions","isDoorbellCamera","supportsSiren","EmberVideoSettingsLightsOverview","EmberVideoLightsSettings","shouldDisplayAutomationNavigation","hasSvrSchedule","automationNavigationItems","recordingSchedule","transitionToRouteWithIdentityReloadIfNeeded","svrVideoSource","parentSvr","channel","NotificationsCenter","notificationTypeId","DoorbellCall","deviceManagementNavigationItems","supportsLocalSettings","VideoSvrSettingsDisplayMgmt","canAccessSvrManagement","VideoSvrDiveCare","supportsDiskManagement","VideoSvrDriveManagement","connectedDevicesNavigationItems","connectedCameras","navigateToUsageReport","closeEditCameraNameActionSheet","shouldDisplayEditCameraNameActionSheet","isUsingEthernet","deletionMessages","_await$this$currentDe","_deviceCollection$cam","deviceCollection","currentDeviceName","hasClipAgeLimit","deleteVideoDevice","shouldDisplayDeleteDeviceActionSheet","_getErrorText2","referenceSnapshotImageData","placeholderAlt","dayImageUrl","nightImageUrl","Day","alt","Night","saveReferencePhoto","shouldDisplayUpdateReferenceSnapshot","DeviceOverviewSettingsRoute","VideoSettingsCameraLightsOverview","transitionToLightsSettings","automationParam","Light","getFrequencyIcon","frequency","TwoPointFourGHz","FiveGHz","encryptionTypeNoneString","NetworkInfoController","shouldDisplayAdvancedNetworkSetupLink","supportsAdvancedNetworkSetup","isLoadingSignalStrengthInfo","lastDdnsUpdateDateString","lastDdnsUpdateTime","networkStatusString","NoSignal","networkInfoDetails","isEncrypted","encryptionType","frequencyBandIcon","NotConnected","publicIp","privateIp","port","httpsPort","transitionToAdvancedNetworkSetupPage","VideoNetworkSettings","ClipLengthController","BaseVideoConfigController","numberOfCamerasOnAccount","hasMany","alarmClipsDurationWarningMessage","numCameras","minClips","selectedAlarmClipsDuration","maxClips","totalClips","alarmClipsDurationDropdownItems","savedVideoSetting","alarmClipsDurationOptions","shouldDisplayCameraTriggeredClipsDropdown","cameraTriggeredClipsDurationOptions","cameraTriggeredClipsDurationDropdownItems","selectedCameraTriggeredClipsDurationText","selectedCameraTriggeredClipsDuration","eventTriggeredClipLengthText","minSystemTriggeredClipDurationSec","maxSystemTriggeredClipDurationSec","maxSystemTriggeredClipDurationSecText","useFixedClipDurationLayout","eventTriggeredClipLengthDescription","minDuration","maxDuration","getPreTriggerDurations","pretriggerDurations","shouldDisplayEventTriggeredClipsSetting","camPreTriggerDuration","eventPreTriggerDuration","changeAlarmClipsDurationOption","changeCameraTriggeredClipsDurationOption","EmberVideoSettingsClipLength","videoConfig","ClipQualityController","clipFrameRateDropdownItems","clipFrameRateOptions","numFrames","clipQualityBinaryListItems","clipQualityOptions","selectedClipQuality","clipQualityResourceDictionary","Reduced","content","Standard","Highest","Fair","Normal","Excellent","Good","Better","Best","clipQualityResourceEnum","reverse","changeClipFrameRateOption","onClipQualityOptionChange","settingOptions","_settingOptions$findB","ClipQualityRoute","EmberVideoSettingsClipQuality","DigitalFovController","EmberVideoSettingsDigitalFov","fovInfoMapping","Narrow","Wide","shouldUseSnapshots","hasOvRules","selectedFovCamera","fov","fovInfo","fieldOfView","_options$find","updating","clickReviewRules","firstRule","imageLoad","firstSnapshotImageLoading","DigitalFovSettingsRoute","getNightVisionText","nightVisionType","nightVisionTranslation","ImageSettingsController","EmberVideoSettingsImage","nightVisionSensitivityOptions","maxExposureOptions","imageSetting","automaticMaxExposure","supportsAutomaticExposure","exposureOptionIsAutomatic","optionText","exposureText","secondText","changeNightVisionSensitivity","infraredSetting","changeMaxExposure","changeInfraredLedToggle","isInfraredLedEnabled","canControlNightVision","newIrLedEnabledSetting","modelKey","restoreDefaults","ImageSettingsRoute","ClipDonationLegalAgreementComponent","getModalFooterButton","declineButtonAction","acceptButtonAction","BatteryTroubleConditions","VideoDeviceLowVoltageShutdown","SensorLowBattery","VideoDeviceHighTemperatureCutoff","VideoDeviceLowTemperatureCutoff","VideoDeviceLowBatteryAndLowTemperatureAlert","getMotionThresholdTickTextFromValue","motionThresholdValue","MotionThresholdVeryLow","MotionThresholdLow","MotionThresholdMedium","MotionThresholdHigh","MotionThresholdVeryHigh","MotionThresholdExtremelyHigh","VideoConfigController","Version1","QualityOnly","EmberVideoSdCardSettings","EmberVideoPrivacyZonesSettings","EmberVideoSettingsPrivacyZones","EmberVideoSettingsMotionConfiguration","EmberVideoSettingsSdCardInfo","EmberVideoSettingsThirdPartyStream","EmberVideoStreamSettings","calibrationImagePath","troubleNotifications","shouldDisplayBatteryIconAndLink","batteryTroubleCondition","hasStateOfChargePermission","lastBatteryStateUpdateDateLocal","lastBatteryStateUpdateDateUtc","shouldDisplayClipLengthSettingsLink","alarmClipsDurationFeatureSupport","cameraTriggeredClipsFeatureSupport","eventTriggeredClipsFeatureSupport","preTriggerRecordingFeatureSupport","shouldDisplayClipQualitySettingsLink","clipQualityFeatureSupport","clipFrameRateFeatureSupport","_this$troubleConditio","allTroubles","currentDeviceTroubles","trouble","troubleConditionType","troubleCondition","tcPriorityMapping","batteryTroubleConditionSvg","troubleConditionSubType","SensorLowBattery_RechargeableVideoDevice","SensorLowBattery_CriticalRechargeableVideoDevice","batteryIconColor","_this$batteryTroubleC","wasCalibrationSuccessful","_ovCam$calibrationSta","motionThresholdTickText","minText","doorbellVideoConfig","motionThresholdMin","maxText","motionThresholdMax","clipResolutionDropdownItems","clipResolutionOptions","dropdownSelectItemsList","LowDefault","StandardDefinition","MediumDefault","Hd","FullHd","FourMp","keepClipsDaysDropdownItems","keepClipsDaysOptions","webOptionsItems","webOptions","selectedWebOption","liveVideoConfig","radioItems","optionType","onlySupportsQualityOptions","mobileOptionsItems","mobileOptions","selectedMobileOption","doorbellVideoOptions","selectedDoorbellVideoOption","optionSubLabel","getDoorbellVideoQualityOptionText","motionDectionDropdownItems","motionDetectionOptions","shouldDisplayFamiliarSubjectLink","familiarSubjectLinkType","FamiliarSubjectSettingsLinkTypeEnum","familiarSubjectLinkTitle","VehicleAndFace","hideTroubleConditionsOnMobileApp","removeNotification","navigateToSettingsPage","navigateToBatteryTroubleConditionPage","_this$batteryTroubleC2","EmberAlertsIssuesTroubleCondition","navigateToFieldOfViewPage","fieldOfViewPageEnum","isDigitalFovCamera","hasVideoSettingsUpgradesPermissions","EmberVideoDigitalFovSettings","EmberVideoSettingsVarifocalFov","navigateToFamiliarSubjectPage","EmberVideoFamiliarSubjectsEnrollment","navigateToMotionConfigurationPage","_this$resolvedModel3","updateInput","commentText","syncComments","donatedClipComments","isChangingCommentsActionSheetOpened","clickIntoActionSheet","focusedElement","activeElement","HTMLElement","blur","onPirMotionSensitivityValueChange","pirMotionSensitivityValue","onMotionThresholdValueChange","onLiveVideoOptionChange","changeMotionDetectionOption","changeClipLimitDurationOption","onDoorbellQualityOptionChange","_settingOptions$findB2","onDonateClipsToggleChange","isDonateClipsEnabled","isDonateCalibrationImagesEnabled","displayClipDonationLegalAgreementModal","onDonateImagesToggleChange","refreshBatteryInfo","pirVideoConfig","PrivacyZonesControllerV2","Info","BestPractices","privacyZoneCoordinates","dictionaryOfDrawings","zoneIndexes","warningZones","ovRuleZones","maxPoints","selectedShape","Rectangle","MAXIMUM_NUMBER_OF_RECTANGLE_POINTS","MAXIMUM_NUMBER_OF_PRIVACY_ZONE_POINTS","editShapeInstructions","canEditPrivacyZones","newShapeInstructions","drawWindowResources","drawNewShape","customShape","customShapeFinish","checkIfPrivacyZonesAttributesChanged","privacyZonesSetting","privacyZonesChangedAttributes","privacyZones","oldPrivacyZonesAttributes","newPrivacyZonesAttributes","oldPrivacyZonesKeys","newPrivacyZonesKeys","oldKey","oldPrivacyZones","newPrivacyZones","updatePrivacyZonesSettingWithDictionaryOfDrawings","allDrawingsEnabled","drawings","dictionaryOfPrivacyZonesToSave","getRectangleCorners","privacyZoneShape","someZonesEnabled","indexes","privacyZone","computeRectanglePoints","Drawing","onToggleDrawingsEnabled","openBestPracticesActionSheet","onSave","isSectorDealer","onCheckPrivacyZonesAttributesChanged","PrivacyZonesRoute","baseModel","ovRuleIds","ArrayProxy","didPrivacyZonesUpdate","NA","SD_CARD_RESOURCE_KEY","refreshStatus","sdCardActionTaskInfo","fnEmpty","SDCardInfoController","successResponse","failResponse","isRefreshing","sdCardModel","hasRefreshed","lastUpdatedDateString","deviceStatusString","recordingQualityString","recordingQualityEnum","frameRateString","_recordingQualityToSt","numFramesPerSecond","resolutionString","_recordingQualityToSt2","Width","Height","accessCheckNeedsToRerun","recordingStatusEnum","NoSchedule","shouldRefreshOnInitialLoad","oldestRecordedVideoDate","recordedTimeSeconds","recordingScheduleWithoutIntervals","shouldRefresh","stringFromRecordingStatusEnum","OutsideActiveTimes","NotRecording","Recording","stringFromSdCardStatusEnum","SdCardNotFormatted","ContainFootagesFromAnotherCamera","NoEncryptionKey","IncorrectEncryptionKeyInDevice","SdCardNotMounted","IncorrectAudioParameters","ContainBadDataForAudioRecording","ContainUnexpectedFiles","SdrDataNeedsToBeMigrated","IncorrectEncryptionKeyInDb","ContainFootagesFromAnotherCustomer","SdrDatabaseMoveFailed","AccessCheckInProgress","storageCapacityString","storageCapacityGb","showSizeInGb","oldestRecordedVideoString","daysHoursMinutesStringFromRecordedTimeSeconds","days","hours","sdCardUsageInfoItems","make","sdCardName","loading","sdCardStatusItems","activeScheduleTimes","recordingQualityItems","reformatSdCard","reformat","navigateToRecordingSchedule","recordingScheduleId","SdCardInfoRoute","ThirdPartyStreamEditController","BaseThirdPartyStreamController","selectedStreamSetting","streamSettings","setting","streamId","selectedOnvifCameraStream","onvifCameraStreams","stream","currentStreamId","editPageStreamSettingsDisplayProps","hasValidOptions","bitRateOptions","frameRateOptions","gopLengthOptions","resolutionOptions","shouldDisplayStreamSettingsSection","getStreamSettingsSectionData","createDropdownSelectItem","resetStreamSettings","isDirtyExistingRecord","settings","dummySetting","doesMediumSettingExist","MediumStreamId","ThirdPartyStreamSettingsEditRoute","EmberVideoSettingsThirdPartyStreamEdit","id_selected_stream","failedToRetrieveSettings","canEditOnvifSettings","saveStreamSettings","hasDiscardedChanges","hasStreamId","streamIndexPair","ThirdPartyStreamIndexController","selectedStreams","areExistingStreamsModified","isAny","isMediumStreamNowDisabled","currentStreamIdChanges","initialStreamId","isStreamMappingVisible","supportsOnvifStreamMappings","streamSettingDisplayProps","streamSetting","getNameAndDescription","onvifCameraStreamDisplayProps","streamIndexPairs","currentStream","isDummyRecord","isMediumStream","bitRate","gopLength","streamOptions","HighStreamId","LowStreamId","isArrayNullOrEmpty","isStreamMappingEnabled","updateStreamMapping","originalStream","newStreamId","newStream","sentryWithScopeAndError","existingStreamIds","stringify","saveStreamMappingsAndTransitionToEditPage","saveStreamMappings","ThirdPartyStreamSettingsIndexRoute","ThirdPartyStreamSettingsEditRouteName","ThirdPartyStreamSettingsIndexRouteName","ThirdPartyStreamSettingsRoute","_streamSettingsValue$","_onvifCameraStreamsVa","onvifParentId","streamSettingsPromise","include","onvifCameraStreamsPromise","streamSettingsResult","onvifCameraStreamsResult","allSettled","grabValueOrShowNotificationError","_result$reason$errors","errorPayload","streamSettingsValue","onvifCameraStreamsValue","finishDeviceInstallation","installParamWifiSkipped","installParamWifiDone","varifocalSetupComplete","VarifocalFovSettingsController","ovReadyCameras","o","resetCalibration","oldFov","newFov","abs","shouldResetCalibration","goToNextPage","DigitalFovCamera","DigitalFovCameraRoute","isVehicleEnrollmentPage","enableEnrollment","_this$model$familiarS","_this$model$familiarS2","hasFaceEnrollment","familiarSubjectEnrollment","hasVehicleEnrollment","hasEnrollment","routeIdToTransition","newEnrollment","deleteRecord","cancelFamiliarSubjectEnrollment","FamiliarSubjectEnrollmentTermsRoute","EmberVideoFamiliarSubjectsEnrollmentTerms","_this$enrollments","_this$enrollments2","_Number","enrollments","sessionStorage","getItem","FamiliarVehicleCameraAccessRoute","FamiliarSubjectCameraAccessRoute","EmberVideoFamiliarSubjectsEnrollmentFacesCameraAccess","FamiliarFacesFeatureManagementController","FamiliarFaceFeatureManagementRoute","FamiliarSubjectFeatureManagementRoute","EmberVideoFamiliarSubjectsEnrollmentFacesFeatureManagement","FamiliarFaceIncorrectPhotosRoute","FamiliarSubjectIncorrectPhotosRoute","EmberVideoFamiliarSubjectsEnrollmentFacesIncorrectPhotos","_this$faceEnrollment","settingsButtons","button","helpButtons","_faceEnrollment$numIn","numIncorrectPhotos","numIncorrectImages","FamiliarFacesRoute","FamiliarSubjectRoute","setItem","navigateToCameraAccessPageIfNoCamerasOptedIn","visitedRoutesStackLength","clearVisitedRouteStackMobile","FamiliarFacesRecentImagesRoute","FamiliarSubjectsRecentImagesRoute","EmberVideoFamiliarSubjectsEnrollmentFacesRecentImages","FamiliarSubjectIndexRoute","FamiliarSubjectProfileEditController","pendingClusterIcon","_this$profileImageUrl","profileImageUrl","profileOrKeyImageUrl","subjectName","descriptionHasError","toggleActionSheet","isPhotoSelectionActionSheetOpen","updateClusterDescription","checkIfDescriptionIsValid","checkIfClusterDescriptionIsUnique","newDescription","saveCluster","_this$newDescription","_this$selectedImage$i","_this$selectedImage","_this$selectedImage$i2","_this$selectedImage2","profileImageId","updateSuccessMessage","saveProfile","clearAndSetPreviousRouteId","getFamiliarSubjectRouteEnum","profile","updateProfilePicture","EditFamiliarSubjectRoute","EmberVideoFamiliarSubjectsReviewProfileEdit","createButtonContent","subTitle","infoIcon","renameCluster","validateClusterDescription","FamiliarSubjectReviewSummaryController","pendingInformationAlert","photoSheetIcon","photoPromptMessage","subjectCreated","primaryButtons","numConfirmedPhotos","numNewPhotos","statusKey","_Active$Pending$Adjus","Adjusting","photosInfoText","numPhotos","minimumRecommendedPhotosText","reviewedImages","isFulfilled","MinimumRecommendedPhotos","showVehicleStatusInfo","routeTo","EmberVideoFamiliarSubjectsReviewPhotoList","isPending","EmberVideoFamiliarSubjectsReviewNotifications","EmberVideoFamiliarSubjectsReviewFAQ","deleteButton","deleteSubject","showDeleteDialog","goToEditProfilePage","getModalInformation","statusModelHeader","modalFooterButton","slug","showDeleteModal","promptForNameChange","EmberVideoFamiliarSubjectsReviewSummary","promptForPhotos","FamiliarSubjectReviewSummaryRoute","VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsController","individualNotificationsText","videoRulesRoute","link","updateNotifications","enableNotifications","notificationsEnabledEnum","FamiliarFaceNotificationsEnable","FamiliarVehicleNotificationsEnable","notificationsDisabledEnum","FamiliarFaceNotificationsDisable","FamiliarVehicleNotificationsDisable","enumForStats","clusterModelId","transitionBackOrToSubjectReview","failMessage","handleSkip","FamiliarVehicleNotificationsSkip","onboarding","VideoSettingsFamiliarSubjectReviewSubjectSettingsNotificationsRoute","FamiliarSubjectReviewPhotoListController","actionSheetPhotoIsInReviewedSection","reviewedImage","reviewInstructionsText","hasUnsavedChanges","actionSheetPhotoAltText","clusterDescription","toggleReviewPhotos","showReviewPhotos","toggleReviewedPhotos","showReviewedPhotos","deletePhoto","markAsIncorrect","saveImageImmediately","removeImage","completeReview","isDeleted","transitionToFamiliarSubjectReview","goBack","newAndReviewedImages","newImages","asyncLoaderPromise","showExitConfirmationModal","exitWithoutSaving","saveAndExit","_model$enrollment$isE","_model$enrollment","controllerFor","retryTransition","hasPhotosToReview","hasReviewedPhotos","reloadModel","FamiliarSubjectReviewRoute","id_cluster","EmberVideoFamiliarSubjectsEnrollmentVehiclesCameraAccess","FamiliarTargetFAQController","VideoSettingsFamiliarSubjectReviewSubjectSettingsFAQRoute","FamiliarSubjectFAQRoute","FamiliarTargetFeatureManagementController","FamiliarVehicleFeatureManagementRoute","EmberVideoFamiliarSubjectsEnrollmentVehiclesFeatureManagement","FamiliarVehicleIncorrectPhotosRoute","EmberVideoFamiliarSubjectsEnrollmentVehiclesIncorrectPhotos","_this$vehicleEnrollme","_vehicleEnrollment$nu","FamiliarVehiclesRoute","FamiliarVehiclesRecentImagesRoute","AddDirectoryController","BaseIntercomSettingsController","backAction","nextAction","newDirectorySelected","existingDirectorySelected","directoryListId","directory","selectedDirectoryListId","intercomDeviceIds","handleDirectoryListChange","addPermissionsToNewList","oldListId","newListId","deviceIds","oldIntercomContacts","newIntercomContacts","listId","oldIntercomLoginIds","loginId","newIntercomLoginIds","removeLoginsFromIntercoms","newIntercomLogins","login","contactUnitId","addLoginsToIntercom","onOptionChange","updateSelectedDirectoryList","directoryListOptions","directoryListSelectItems","directoryLists","directoryList","directoryListName","isSelectionValid","AddDirectoryRoute","BaseIntercomRoute","EmberVideoIntercomAddDirectory","AssociatedDeviceSelectController","selectedDeviceIds","associatedDevices","intercomAssociatedDeviceIds","didInsert","cardReaders","cardReader","anyDeviceSelected","AssociatedDeviceSelectRoute","EmberVideoIntercomAssociatedDeviceSelect","IntercomConnectUnitToSystemController","filteredIntercomApartments","filterString","intercomApartments","apartmentNumber","apartmentName","intercomCustomerApartmentInfoDropdownItems","intercomCustomerApartmentInfo","apartmentSuiteName","unitDescription","filterApartments","searchString","getSelectedValueForApartment","apartment","regex","RegExp","selectedInfo","test","intercomApartment","apartmentId","unitIds","uniqueUnitIds","IntercomConnectUnitToSystemRoute","EmberVideoIntercomConnectUnitToSystem","id_selected_intercom","pairedUnitIds","intercomUnitId","_unused2","_unused3","IntercomCreateDirectoryController","selectedIntercomLogins","directoryListBody","defaultList","directoryName","newDirectoryList","intercom","oldDirectoryListId","loginName","resetState","IntercomCreateDirectoryRoute","EmberVideoIntercomCreateDirectory","CustomizeDirectoryController","navigateNext","qrCode","_this$logoFile","_this$logoFile2","logoFileName","logoFile","logoBody","fileDataUrl","logoFileDataUrl","logo","fileChanged","file","dataUrl","clearNonPersistentNotifications","customizeDirectoryModel","dataUrlToFile","CustomizeDirectoryRoute","EmberVideoIntercomCustomizeDirectory","qrFilter","VideoSettingsIntercomEditDirectoryController","_updatedDirectoryList","intercomDirectoryList","intercomContacts","_this$model$intercomD","_this$model$intercomC","EmberVideoIntercomEditDirectory","id_edit_directory","IntercomNameDirectoryListController","directoryListAdapter","adapterFor","renameDirectoryList","apartmentNumbers","request","IntercomCreateCallForwardingRulesRequestBody","serialize","apartmentUpdates","unit_id","call_forward_number","apartmentAdapter","bulkUpdateApartments","selectedSystemUnitId","selectedSystemDescription","unitLoginPairings","conciergeLoginId","intercomContactsToInsert","isFavorite","loginsToEnroll","loginIds","apartmentInfo","bulkInsertContacts","IntercomBulkInsertContactsRequestBody","IntercomNameDirectoryListRoute","EmberVideoIntercomNameDirectoryList","QrCodeController","IntercomVisitorDirectoryUrl","windowUrl","ENV","intercomVisitorDirectoryUrls","development","local","production","qrCodeData","qrCodeId","cancelAction","qrCodeContainer","qrCodeImg","qrCodeSrc","createElement","download","appendChild","click","removeChild","VideoQrCodeRoute","EmberVideoIntercomQrCode","IntercomSetConciergeController","filteredIntercomConciergeOptions","intercomConciergeOptions","loginEmail","filterConciergeOptions","onChange","concierge","selectedConcierge","IntercomSetConciergeRoute","EmberVideoIntercomSetConcierge","customerId","IntercomSetupController","startAction","directories","intercoms","currentIntercoms","directoryNameList","isIntercomDevice","needsSetup","actionItems","directoryNames","directoryActive","directoryData","actionArguments","deleteIntercom","createDirectory","editDirectory","setupAction","IntercomSetupRoute","EmberVideoIntercomSetup","lists","VideoDeviceSelectController","selectDevice","cameraDeviceId","selectedDeviceId","isDeviceSelected","oldDirectory","oldQrCode","newDirectory","directoryViewType","DirectoryViewTypeEnum","Name","groupId","newQrCode","header","helpText","deletionDateUtc","oldCamera","VideoDeviceSelectRoute","EmberVideoIntercomVideoDeviceSelect","EmberVideoLightTriggers","VideoSettingsLightTriggers","LightSettingToolTip","floodlightImagePath","LightsController","manualLightDurationOptions","manualLightDurationSecondsOptions","getDurationText","NUM_SECONDS_IN_MINUTE","brightnessDescriptionText","tooltipIcon","updateManualLightDuration","durationSeconds","manualLightDurationSeconds","onTooltipClick","onSaveClicked","onCancelClicked","VideoSettingsMotionConfiguration","motionConfigurationSetting","cameraRecord","motionConfig","EmberVideoMotionDetectionTest","MotionController","movementTimeOptions","TwoSeconds","QuarterMinute","HalfMinute","Minute","FiveMinute","QuarterHour","durationText","ambientLightOptions","Bright","Twilight","Dark","tickValueFromPirRange","pirRange","VeryNear","Near","Middle","Far","setPirRangeFromTickValue","tickValue","onMovementTimeSelected","secondsString","movementTime","onAmbientLightSelected","ambientLightString","ambientLight","onWedgeClicked","isLeftZoneSelected","isCenterZoneSelected","isRightZoneSelected","VideoSettingsMotionDetection","PrivacyZonesController","infoModalLearnMore","moreInfoModalData","showReformatOption","hideBackButton","SdCardManagementController","lastUpdatedDateUtc","oldestRecordedVideoUtc","resourceInfoForStatus","statusPropertiesAndValues","propertyResource","errorStatus","visible","recordingQualityPropertiesAndValues","propertiesAndValues","toggleShowReformatOption","showReformatModal","EmberAlertsIssues","EmberVideoSignalStrength","signalStrengthQualityString","networkInfoItems","history","signalStrengthHistory","signalHistoryItem","lastUpdatedDateTimestamp","footerButtons","VideoSignalStrength","refreshSignalStrength","StreamVideoPanelV2Controller","isChangeAllDisabled","isSaveDisabled","isEnableStreamingAllowed","uppercasedTranslation","toLocaleUpperCase","_this$streamVideoToPa","_this$streamVideoToPa2","panelCameras","streamVideoToPanelInfos","allCameras","streamVideoToPanelInfo","panelCamera","canChangeStreamToPanel","canStreamToPanelBeEnabled","isLegalAgreementsActionSheetOpen","isLoadingPanelCameras","enableAll","isStreamToPanelEnabled","disableAll","toggleIsStreamToPanelEnabled","s","EmberVideoSettingsStreamVideoPanel","StreamVideoPanelController","toggleAll","EmberVideoSetupPanelStreaming","DummyRecordId","createDropdownItem","record","StreamSection","SettingsStreamIndexController","records","isMapping","disableSaveButton","isSpinningStyle","isSyncing","headerRows","editButtonAction","labelsAndActions","switchToEditingMode","streamOption","resetSettingsAndSwitchToMappingModeIfEnabled","toggleOpenClosed","streamSection","isOpen","dummyStreamId","dummyStream","getDummyStream","pushObject","dummySettingId","getDummySetting","previousId","existingRecord","SettingsStreamIndexRoute","SettingsStreamRoute","VarifocalFovController","VideoDeviceSignalStrengthController","_this$smartChimeDevic","signalStrengthLoaded","smartChimeDevice","getAccessPointWifiSignalStrength","accessPointPanelSignalStrengthInfo","signalStrengthDirections","PanelTypeEnumObj","_this$smartChimeDevic2","chimeModel","EmberVideoDeviceSignalStrength","id_smart_chime_device","YoutubePlayerRoute","EmberVideoYoutubePlayer"],"sourceRoot":""}