{"version":3,"file":"assets/chunk.8297d554bd4cc91f7e6a.js","mappings":"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","sources":["./components/activity/filter-panel/index.hbs","./components/activity/filter-panel/index.ts","./components/filters/no-results/index.hbs","./components/filters/no-results/index.ts","./components/video/advanced-video-search/motion-search-filter-panel/index.hbs","./components/video/advanced-video-search/motion-search-filter-panel/index.ts","./components/video/advanced-video-search/filter-bar/index.hbs","./components/video/advanced-video-search/filter-bar/index.ts","./components/video/advanced-video-search/page/index.hbs","./components/video/advanced-video-search/page/index.ts","./components/video/clips/storage/indicator.js","./components/video/clips/storage/alert/index.hbs","./components/video/clips/storage/alert/index.ts","./components/video/clips/deleted-by/index.hbs","./components/video/clips/deleted-by/index.ts","./components/video/clips/playable-clip/selectable-clip/index.hbs","./components/video/clips/playable-clip/selectable-clip/index.ts","./components/video/clips/clip-display/clip-day/index.hbs","./components/video/clips/clip-display/clip-day/index.js","./components/video/clips/storage/popup/index.hbs","./components/video/clips/storage/popup/index.ts","./components/video/clips/storage/info/index.hbs","./components/video/clips/storage/info/index.ts","./components/video/clips/storage/next-clip/index.hbs","./components/video/clips/storage/next-clip/index.ts","./components/video/clips/route-body/index.hbs","./components/video/clips/route-body/index.ts","./components/video/clips/storage/item/index.hbs","./components/video/clips/storage/item/index.ts","./components/video/clips/storage/progress/index.hbs","./components/video/clips/storage/progress/index.ts","./components/video/edit-camera-group/camera-slot/index.hbs","./components/video/edit-camera-group/camera-slot/index.ts","./components/video/edit-camera-group/camera-slot-page/index.hbs","./components/video/edit-camera-group/camera-slot-page/index.ts","./components/video/edit-camera-group/camera-slot-page-container/index.hbs","./components/video/edit-camera-group/camera-slot-page-container/index.ts","./components/video/edit-camera-group/index.hbs","./components/video/edit-camera-group/index.ts","./components/video/manage-camera-groups/camera-group-row/index.hbs","./components/video/manage-camera-groups/camera-group-row/index.ts","./components/video/manage-camera-groups/index.hbs","./components/video/manage-camera-groups/index.ts","./components/video/svr-indicator/index.hbs","./components/video/svr-indicator/index.ts","../../../../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/hoursToSeconds/index.js","./components/video/thumbnail-search/thumbnail-grid/index.hbs","./components/video/thumbnail-search/thumbnail-grid/index.ts","./components/video/thumbnail-search/index.hbs","./components/video/thumbnail-search/index.ts","./video/thumbnail-search/controller.ts","../rewritten-packages/ember-href-to.757a6976/node_modules/ember-href-to/helpers/href-to.js","../rewritten-packages/ember-intl.4169306b/node_modules/ember-intl/helpers/format-number.js","../../../../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/set/index.js"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\",{ moduleName: \"customer-site/components/activity/filter-panel/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type FilterManager from 'customer-site/classes/activity/event-history/helpers/filter-manager';\n\ninterface ActivityFilterPanelSignature {\n Args: {\n filtersManager: FilterManager;\n rightPanel?: boolean;\n };\n}\n\nconst ActivityFilterPanel = templateOnlyComponent();\nexport default ActivityFilterPanel;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Activity::FilterPanel': typeof ActivityFilterPanel;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n

{{t \\'generic.resultsFound\\' resultCount=0}}

\\n\\n {{#if @resetSearch}}\\n \\n {{/if}}\\n
\\n\",{ moduleName: \"customer-site/components/filters/no-results/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface FiltersNoResultsSignature {\n Element: HTMLDivElement;\n Args: {\n resetSearch?: VoidFunction;\n resetText?: string;\n };\n}\n\nconst FiltersNoResults = templateOnlyComponent();\nexport default FiltersNoResults;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Filters::NoResults': typeof FiltersNoResults;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#unless @filtersManager.disabled}}\\n

{{t \\'components.video.advanced-video-search.motion-search-filter-panel.drawMotionAreaDescription\\'}}

\\n {{/unless}}\\n \\n
\\n\",{ moduleName: \"customer-site/components/video/advanced-video-search/motion-search-filter-panel/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport type MotionSearchFilterManager from 'customer-site/classes/video/advanced-video-search/motion-search-filter-manager';\nimport './_style.scss';\nimport type { FilterPanelSignature } from 'customer-site/components/filters/filter-panel';\n\ninterface MotionSearchFilterPanelSignature {\n Element: FilterPanelSignature['Element'];\n Args: {\n filtersManager: MotionSearchFilterManager;\n };\n}\n\nconst MotionSearchFilterPanel = templateOnlyComponent();\nexport default MotionSearchFilterPanel;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AdvancedVideoSearch::MotionSearchFilterPanel': typeof MotionSearchFilterPanel;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n\\n \\n\\n
\\n {{#if this.hasAppliedFilters}}\\n
\\n

{{t \\'generic.appliedFiltersCount\\' numFilters=@appliedFiltersCount}}

\\n\\n \\n
\\n {{/if}}\\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\",{ moduleName: \"customer-site/components/video/advanced-video-search/filter-bar/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { next } from '@adc/ember-utils/utils/runloop';\nimport { action, computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { DateFilter, DateRangeFilter } from 'customer-site/classes/helpers/filters/filters';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type Store from '@ember-data/store';\nimport type ActivityFilterManager from 'customer-site/classes/activity/event-history/helpers/filter-manager';\nimport type BaseFilterManager from 'customer-site/classes/helpers/filter-manager';\nimport type MotionSearchFilterManager from 'customer-site/classes/video/advanced-video-search/motion-search-filter-manager';\nimport './_style.scss';\n\ninterface VideoAdvancedVideoSearchFilterBarSignature {\n Args: {\n motionSearchFiltersManager: MotionSearchFilterManager;\n activityFiltersManager: ActivityFilterManager;\n filterValues: Record;\n queryParams: Record;\n applyFilters: (value: { queryParams: Record }) => void | undefined;\n submitSearch: (requestModelData: Record) => Promise;\n resultCount?: number;\n confirmButtonDisabled: boolean;\n appliedFiltersCount: number;\n enabledFilterManagers: BaseFilterManager[];\n earliestRecord: Date;\n userHasDrawnMotionArea: boolean;\n showMotionSearchOptions?: boolean;\n clearDrawWindow: VoidFunction;\n };\n}\n\n@intlPath({ path: 'video/advanced-video-search/filter-bar' })\nexport default class VideoAdvancedVideoSearchFilterBar extends Component {\n @service declare intl: ADCIntlService;\n @service declare store: Store;\n\n // region Component State\n\n /**\n * The maximum allowed date that you can select for the date range filter.\n */\n maxDate = new Date();\n\n // endregion\n\n // region Computed Properties\n\n /**\n * The date range filter that holds all inputs for the date range selectors.\n */\n @computed('args.filterValues.{endDate,startDate}', 'args.earliestRecord', 'maxDate', 'setDates')\n get dateTimeRangeFilter(): DateRangeFilter | undefined {\n if (!this.args.filterValues) {\n return undefined;\n }\n\n const { intl } = this,\n { timeZone = '' } = intl,\n { startDate, endDate } = this.args.filterValues;\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.args.earliestRecord\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 }\n );\n }\n\n /**\n * Whether there are any applied filters in this filter bar.\n * Note: the date range filters are excluded from this search, since they are mandatory.\n */\n @computed('args.enabledFilterManagers.@each.hasAppliedFilters')\n get hasAppliedFilters(): boolean {\n return this.args.enabledFilterManagers.isAny('hasAppliedFilters');\n }\n\n /**\n * If we should hide the CLEAR MOTION AREA button\n */\n @computed('args.{userHasDrawnMotionArea,motionSearchFiltersManager.disabled}')\n get hideClearMotionButton(): boolean {\n return this.args.motionSearchFiltersManager.disabled || !this.args.userHasDrawnMotionArea;\n }\n\n // endregion\n\n // region Actions\n\n /**\n * Sets the start/endDates for the date range filter.\n */\n @action\n setDates(dates: { startDate: Date; endDate: Date }): void {\n const { startDate, endDate } = dates;\n this.args.applyFilters({\n queryParams: {\n ...this.args.filterValues,\n startDate,\n endDate\n }\n });\n }\n\n @action\n async submitSearch() {\n const requestModel = this.createRequestModelData();\n return this.args.submitSearch(requestModel);\n }\n\n /**\n * Resets all the query params except the dates.\n */\n @action\n resetFilters() {\n const { startDate, endDate, timeInterval } = this.args.queryParams;\n\n // adding next otherwise page params can update twice in the same cycle\n next(() => {\n this.args.applyFilters({\n queryParams: {\n ...this.args.filterValues,\n startDate,\n endDate,\n timeInterval\n }\n });\n\n if (!this.args.activityFiltersManager.disabled) {\n this.args.activityFiltersManager.toggleDisableState();\n }\n\n if (!this.args.motionSearchFiltersManager.disabled) {\n this.args.motionSearchFiltersManager.toggleDisableState();\n }\n });\n }\n\n /**\n * Toggles the disabled state of the activity filter manager\n * and updates the visibility of some filters on the motion search filter manager.\n */\n @action\n toggleActivityFilter(): void {\n // First, toggle the activity filter's disabled state.\n this.args.activityFiltersManager.toggleDisableState();\n const activitySearchDisabled = this.args.activityFiltersManager.disabled;\n\n // Now set the visibility of the activity proximity dropdown on the motion search filter.\n this.args.motionSearchFiltersManager.setActivitySearchVisibility(!activitySearchDisabled);\n }\n\n /**\n * Toggles the disabled state of the motion search filter manager.\n */\n @action\n toggleMotionFilter(): void {\n this.args.motionSearchFiltersManager.toggleDisableState();\n }\n\n // endregion\n\n // region Private functions\n\n /**\n * Simple helper to cast the applied activity filters into an object\n * representing the advanced video search request model.\n * @private\n */\n private getActivityModelRelationships(): Record {\n // If the activity filter is disabled, then we want to ignore (but not clear) the selections.\n if (this.args.activityFiltersManager.disabled) {\n return {};\n }\n\n // Parse each applied activity filter into the correct fields.\n return this.args.activityFiltersManager.appliedFilters.reduce(\n (data, filter: any) => ({\n ...data,\n [filter.filteringFieldName]: filter.value\n }),\n {}\n );\n }\n\n /**\n * Simple helper to cast the applied motion search filters into an object\n * representing the advanced video search request model.\n * @private\n */\n private getMotionSearchModelRelationships(): Record {\n // If the motion search filter is disabled, then we want to ignore (but not clear) the selections.\n if (this.args.motionSearchFiltersManager.disabled) {\n return {};\n }\n\n // Parse the applied motion search filters into the correct fields.\n return this.args.motionSearchFiltersManager.appliedFilters.reduce(\n (data, filter) => ({\n ...data,\n [filter.filteringFieldName]: filter.value\n }),\n {}\n );\n }\n\n /**\n * Aggregates all the applied filters into a single object to be used to submit the search request.\n * @private\n */\n private createRequestModelData(): Record {\n return {\n ...this.getActivityModelRelationships(),\n ...this.getMotionSearchModelRelationships(),\n startTime: this.args.filterValues.startDate.toISOString(),\n endTime: this.args.filterValues.endDate?.toISOString()\n };\n }\n\n // endregion\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AdvancedVideoSearch::FilterBar': typeof VideoAdvancedVideoSearchFilterBar;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{!--\\n As initializing SVRPlaybackFeatures is a fairly heavy operation, we intentionally keep it on the page (conditionally\\n hiding it with CSS).\\n --}}\\n {{!-- @glint-expect-error: Signature for this component doesn\\'t indicate an element, please fix this. --}}\\n
\\n\\n\",{ moduleName: \"customer-site/components/video/advanced-video-search/page/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { next } from '@adc/ember-utils/utils/runloop';\nimport { computed, action, getProperties } from '@ember/object';\nimport { alias, reads } from '@ember/object/computed';\nimport { sendEvent } from '@ember/object/events';\nimport { inject as service } from '@ember/service';\nimport { task } from 'ember-concurrency';\nimport ActivityFilterManager from 'customer-site/classes/activity/event-history/helpers/filter-manager';\nimport DateRange from 'customer-site/classes/date-range';\nimport {\n aggregateDatesForSearch,\n cancelObjectSearchRequest,\n constructObjectSearchParams,\n splitDateRanges,\n submitObjectSearchRequest\n} from 'customer-site/classes/video/advanced-video-search/helpers';\nimport MotionSearchFilterManager from 'customer-site/classes/video/advanced-video-search/motion-search-filter-manager';\nimport ObjectSearchResult from 'customer-site/classes/video/advanced-video-search/object-search-result';\nimport { Drawing } from 'customer-site/components/video/rules/draw-window/index';\nimport { AutoView } from 'customer-site/components/video/video-streaming/video-streaming-features/index';\nimport { CustomShape } from 'customer-site/enums/DrawShape';\nimport { Motion } from 'customer-site/enums/RecordingIntervalType';\nimport { getSVRConnectivity } from 'customer-site/models/video/devices/svr';\nimport { EVENT_CLEAR_SELECTED_DRAWING } from 'customer-site/services/video/draw-window-event-bus';\nimport { NUM_SECONDS_IN_HOUR } from 'customer-site/utils/datetime';\nimport { getContextAwareSvrTimelinePage } from 'customer-site/video/svr-timeline/route';\nimport { sentryWithScopeAndError } from '@adc/app-infrastructure/utils/sentry';\nimport { intlPath } from '@adc/i18n/path';\nimport addSeconds from 'date-fns/addSeconds';\n\nimport type { Registry as ServiceRegistry } from '@ember/service';\nimport type BaseFilterManager from 'customer-site/classes/helpers/filter-manager';\nimport type ActivityDay from 'customer-site/models/activity/activity-day';\nimport type HistoryEvent from 'customer-site/models/activity/history-event';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type Svr from 'customer-site/models/video/devices/svr';\nimport type Interval from 'customer-site/models/video/interval';\nimport type VideoStreamingPermissionsCollection from 'customer-site/models/video/permissions/video-streaming-permissions-collection';\nimport './_style.scss';\n\nexport type AVSQueryParams = {\n timeInterval: number;\n startDate: Date;\n endDate: Date;\n};\n\ninterface AdvancedVideoSearchSignature {\n Args: {\n camera: Camera;\n svr: Svr;\n showMotionSearchOptions: boolean;\n queryParams: AVSQueryParams;\n defaultFilterValues: Record;\n groupResolution: number;\n videoStreamingPermissions: VideoStreamingPermissionsCollection;\n earliestRecord: Date;\n };\n}\n\n/**\n * The number of seconds back to display on each result.\n */\nconst ActivityOnlySecondsBackToDisplay = -5;\n\n/**\n * The number of seconds forward to display on each result.\n */\nconst ActivityOnlySecondsForwardToDisplay = 20;\n\nexport type AVSDataObject = {\n appliedFiltersCount: number;\n searchFailed: boolean;\n searchInProgress: boolean;\n searchWasInterrupted: boolean;\n selectedResultIndex?: number;\n searchResults?: Interval[];\n svrTimelineIsHidden: boolean;\n};\n\ntype SVRPlayerModelState = {\n cameras: Camera[];\n cameraGroups: Camera[];\n groupResolution: AdvancedVideoSearchSignature['Args']['groupResolution'];\n videoStreamingPermissions: AdvancedVideoSearchSignature['Args']['videoStreamingPermissions'];\n};\n\n/**\n * @classdesc\n * The advanced video search page.\n */\n@intlPath({ path: 'video/advanced-video-search/page' })\nexport default class AdvancedVideoSearchComponent extends Component {\n @service('video.draw-window-event-bus') declare drawWindowEventBus: ServiceRegistry['video/draw-window-event-bus'];\n @service declare store: ServiceRegistry['store'];\n @service declare intl: ServiceRegistry['adc-intl'];\n @service declare ajax: ServiceRegistry['ajax'];\n @service declare notificationManager: ServiceRegistry['notification-manager'];\n @service declare contextManager: ServiceRegistry['context-manager'];\n @service declare navigation: ServiceRegistry['navigation'];\n @service declare envSettings: ServiceRegistry['env-settings'];\n @service declare router: ServiceRegistry['router'];\n\n @alias('args.camera.id')\n declare cameraId: string;\n\n /**\n * The time interval value we send to the svr-playback-features component (how many seconds between the start and end on the timeline)\n */\n @tracked timeInterval = NUM_SECONDS_IN_HOUR;\n\n // region Component state.\n\n /**\n * The filter manager for the activity search parameters.\n */\n activityFiltersManager: ActivityFilterManager = (() => {\n const { queryParams } = this.args;\n\n // Create the filter manager.\n const filterManager = new ActivityFilterManager(this, this.filtersUpdated, false, true, true);\n\n // Instantiate it.\n filterManager.updateFilters(queryParams, this.args.defaultFilterValues, true);\n\n return filterManager;\n })();\n\n /**\n * The filter manager for the motion sensitivity search parameters.\n */\n motionSearchFiltersManager: MotionSearchFilterManager = (() => {\n const { queryParams } = this.args;\n\n // Create the filter manager.\n const filterManager = new MotionSearchFilterManager(\n this,\n this.filtersUpdated,\n false,\n true,\n !this.activityFiltersManager.disabled\n );\n\n // Instantiate it.\n filterManager.updateFilters(queryParams, this.args.defaultFilterValues, false);\n\n return filterManager;\n })();\n\n /**\n * Allow the customer to draw a custom shape (as opposed to a Line, Rectangle, or other options).\n */\n shapeOfDrawing = CustomShape;\n\n /**\n * Default to an empty drawing with no points.\n */\n drawings = {\n 0: new Drawing([], -1, -1)\n };\n\n /**\n * Whether or not the user has used the draw-window to draw points.\n */\n get userHasDrawnPoints(): boolean {\n return !!this.drawing?.points.length;\n }\n\n /**\n * Clears the draw window.\n */\n @action clearDrawWindow(): void {\n sendEvent(this.drawWindowEventBus, EVENT_CLEAR_SELECTED_DRAWING);\n }\n\n /**\n * The number of results found by the search.\n */\n @alias('results.length')\n declare resultCount?: number;\n\n /**\n * The list of results as an array of Intervals representing the times to highlight on the playback component.\n */\n @tracked\n results?: Interval[];\n\n /**\n * If there is an object search in progress\n */\n @reads('createSearch.isRunning')\n declare searchInProgress: boolean;\n\n /**\n * If the current search was interrupted. (Someone else made a request on the same device while the request was running)\n */\n @tracked searchWasInterrupted = false;\n\n /**\n * If the current search failed. This is different from a search being interrupted, as this indicates a complete failure with no results.\n */\n @tracked searchFailed = false;\n\n /**\n * Resets the error variables searchWasInterrupted and searchFailed to false\n */\n resetErrors(): void {\n this.searchWasInterrupted = false;\n this.searchFailed = false;\n }\n\n /**\n * Playback features expects a json array of camera id's\n */\n @computed('args.camera.id')\n get cameraIdForPlaybackFeatures(): string {\n return JSON.stringify([this.args.camera.id]);\n }\n\n /**\n * Alias to the object representing the drawing the customer used for their AOI.\n */\n @computed('drawings')\n get drawing(): Drawing {\n return this.drawings[0];\n }\n\n /**\n * Whether all the criteria have been met for a proper search.\n * At least one filter must be selected, and if the motion search filter is selected,\n * then a full drawing much also be present.\n */\n @computed('activityFiltersManager.disabled', 'drawing.drawingCompleted', 'motionSearchFiltersManager.disabled')\n get confirmButtonDisabled(): boolean {\n const { disabled } = this.motionSearchFiltersManager;\n\n return (this.activityFiltersManager.disabled && disabled) || (!this.drawing.drawingCompleted && !disabled);\n }\n\n /**\n * A simplified list of the currently active filter managers.\n */\n @computed('activityFiltersManager.disabled', 'motionSearchFiltersManager.disabled')\n get enabledFilterManagers(): BaseFilterManager[] {\n return [this.motionSearchFiltersManager, this.activityFiltersManager].rejectBy('disabled');\n }\n\n /**\n * The number of currently applied filters.\n */\n @computed('enabledFilterManagers.@each.appliedFilters')\n get appliedFiltersCount(): number {\n return this.enabledFilterManagers.map((item) => item.appliedFilters.length).reduce((sum, val) => sum + val, 0);\n }\n\n /**\n * A combined object representing all the AVS related data that we want to sent to the SvrPlaybackFeatures component (to minimize the amount of arguments required for that)\n */\n @computed(\n 'appliedFiltersCount',\n 'resultCount',\n 'results',\n 'searchFailed',\n 'searchInProgress',\n 'searchWasInterrupted',\n 'showTimeline',\n 'selectedResultIndex'\n )\n get avsDataObject(): AVSDataObject {\n return {\n ...getProperties(\n this,\n 'appliedFiltersCount',\n 'searchFailed',\n 'searchInProgress',\n 'searchWasInterrupted',\n 'selectedResultIndex'\n ),\n searchResults: this.results,\n svrTimelineIsHidden: !this.showTimeline\n };\n }\n\n /**\n * Layout type for the SVR player.\n */\n layoutType = AutoView;\n\n /**\n * Assorted model state for the SVR player.\n */\n get svrModel(): SVRPlayerModelState {\n const { camera } = this.args;\n return {\n cameras: [camera],\n cameraGroups: [camera],\n ...getProperties(this.args, 'groupResolution', 'videoStreamingPermissions')\n };\n }\n\n /**\n * Whether we should show the draw-window / filter region or the svr timeline.\n */\n @tracked showTimeline = false;\n\n /**\n * How many pixels in height that we should allow the snapshot to be on the page\n */\n @tracked snapshotMaxHeight?: number;\n\n /**\n * The result currently selected, if any\n */\n @tracked selectedResultIndex?: number;\n\n /**\n * If we are currently waiting to see if the svr is connected\n */\n @tracked isWaitingForConnectivity = false;\n\n /**\n * The values we are filtering on.\n */\n @tracked filterValues = { ...this.args.defaultFilterValues };\n\n // endregion\n\n /**\n * Model data for making search requests\n */\n requestModelData?: Record;\n\n /**\n * A method for controlling the time window in the results page (Svr-timeline component). This gets overridden in setSelectTimeWindowMethod\n */\n selectTimeWindowMethod: (newTimelineStartTime: Date, newCurrentTime?: Date) => void = () => {};\n\n /**\n * Navigates back to the svr timeline or enterprise svr timeline page (depending on context) with the selected camera\n */\n navigateToContextAwareSvrPage() {\n const svrTimelinePage = getContextAwareSvrTimelinePage(this.contextManager.isEnterprise);\n\n this.navigation.transitionToRouteId(svrTimelinePage, {\n queryParams: {\n cameraId: this.args.camera.id,\n cameraGroupId: null\n }\n });\n }\n\n /**\n * Submits the filters as a search to the back-end.\n */\n createSearch = task({ restartable: true }, async (requestModelData: Record) => {\n // Make sure at least one filter manager is enabled.\n if (this.activityFiltersManager.disabled && this.motionSearchFiltersManager.disabled) {\n // This should never happen, but handle it just in case.\n return false;\n }\n\n // Reset the results.\n this.results = [];\n\n let dateRanges;\n\n const svrVideoSource = await this.args.camera.get('svrVideoSource'),\n intervals = await svrVideoSource.get('intervals'),\n earliestRecord = await intervals.get('earliestRecord');\n\n const { startTime, endTime = new Date() } = requestModelData;\n\n if (earliestRecord > new Date(startTime)) {\n this.notificationManager.addError(this.intl.tc(this, 'startTimeCannot'));\n return false;\n }\n\n // Unloading video intervals from the store to clear out the data created from the last search\n this.store.unloadAll('video/interval');\n\n if (this.activityFiltersManager.disabled) {\n // The activity filters are disabled, but the motion filters are enabled.\n // Set the requested date range to the entire interval.\n dateRanges = [new DateRange(new Date(startTime), new Date(endTime))];\n } else {\n // Fetch the activity days.\n const activityEvents = (await this.store.query('activity/activity-day', requestModelData))\n .toArray()\n .flatMap((day: ActivityDay) => day.events.toArray())\n .sortBy('eventDate');\n\n if (this.motionSearchFiltersManager.disabled) {\n // The motion search selection was disabled, so we can simply use the activity days as our results.\n\n this.results = activityEvents.map((event: HistoryEvent) => {\n return this.store.createRecord('video/interval', {\n startTime: addSeconds(event.eventDate, ActivityOnlySecondsBackToDisplay),\n endTime: addSeconds(event.eventDate, ActivityOnlySecondsForwardToDisplay),\n type: Motion\n });\n });\n\n return true;\n }\n\n // Use the provided sensitivity if we have one, if not use the default value.\n const activitySensitivity =\n requestModelData?.activitySensitivity ?? this.args.defaultFilterValues.activitySensitivity;\n\n // The motion search is enabled, so set up the request using the dates of the events we found as a basis.\n dateRanges = aggregateDatesForSearch(activityEvents.mapBy('eventDate'), activitySensitivity);\n }\n\n // Make sure none of the ranges span more than 24 hours.\n const splitDates = splitDateRanges(dateRanges);\n\n // Format the search requests.\n const searchRequests = constructObjectSearchParams(\n this.cameraId,\n splitDates,\n requestModelData.motionSensitivity ?? this.args.defaultFilterValues.motionSensitivity,\n this.drawing\n );\n\n let allSearchesCompleted = true;\n\n // Submit the searches.\n for (let i = 0; i < searchRequests.length; i++) {\n // Note: OpenEye's system has a hard requirement of only submitting one request per device at any given time.\n // To that end, we want to submit each request sequentially, rather than in parallel.\n try {\n const requestCompleted = await submitObjectSearchRequest(\n this.ajax,\n this.cameraId,\n searchRequests[i],\n this.parseResults.bind(this)\n );\n\n if (!requestCompleted) {\n allSearchesCompleted = false;\n }\n } catch (e) {\n this.searchFailed = true;\n return false;\n }\n }\n\n this.searchWasInterrupted = !allSearchesCompleted;\n\n return !!this.results?.length;\n });\n\n /**\n * On page load, make sure the filters are set to default state.\n */\n @action\n resetFiltersOnPageLoad() {\n const { startDate, endDate, timeInterval } = this.args.queryParams;\n\n // adding next otherwise page params can update twice in the same cycle\n next(() => {\n this.filtersUpdated({\n queryParams: {\n ...this.args.defaultFilterValues,\n startDate,\n endDate,\n timeInterval\n }\n });\n });\n }\n\n /**\n * Makes sure the SVR is connected, otherwise navigates back to svr-timeline\n */\n @action\n async checkConnectivity() {\n const svrId = this.args.svr.get('id');\n\n this.isWaitingForConnectivity = true;\n\n try {\n const connectivity = await getSVRConnectivity(this.ajax, svrId);\n\n if (connectivity.isConnected) {\n this.isWaitingForConnectivity = false;\n return;\n }\n } catch (e) {\n sentryWithScopeAndError('could not get connectivity information for svr', { svrId }, undefined);\n }\n\n this.notificationManager.addNotification(\n this.intl.tc(this, 'couldntConnectToDevice'),\n 'issue',\n undefined,\n 0,\n true,\n false,\n 'error'\n );\n\n this.navigateToContextAwareSvrPage();\n }\n\n @action\n filtersUpdated(value: { queryParams: AVSQueryParams }): void | undefined {\n // Update the filter managers.\n this.activityFiltersManager.updateFilters(value.queryParams, this.args.defaultFilterValues, false);\n this.motionSearchFiltersManager.updateFilters(value.queryParams, this.args.defaultFilterValues, false);\n this.filterValues = value.queryParams;\n }\n\n /**\n * Handles the overhead of sending a search request to the back-end.\n * Since this request sends the results to the front-end via websockets,\n * rather than in the response of the API,\n * we don't want this method to be blocked by the submit API call.\n * As such, we don't actually wait for the submit call to resolve in this method.\n */\n @action\n async submitSearch(requestModelData: Record): Promise {\n // First, cancel any running tasks.\n await this.cancelSearch();\n\n // Save the requestModelData for potential future usage\n this.requestModelData = requestModelData;\n\n this.selectTimeWindowMethod(new Date(requestModelData.startTime));\n\n // Submit a new request.\n this.createSearch.perform(requestModelData!);\n this.showTimeline = true;\n }\n\n /**\n * Goes back to the search page\n */\n @action\n goBackToSearch() {\n this.showTimeline = false;\n this.selectedResultIndex = undefined;\n this.resetErrors();\n }\n\n /**\n * Cancels any ongoing search request tasks in this window,\n * then sends a request to OpenEye to stop processing results on this device.\n * Note: This will cancel any requests that anyone else has running, as well as cancelling your own.\n */\n @action\n async cancelSearch(): Promise {\n // First, kill the task if it's already running.\n if (this.createSearch.isRunning) {\n await this.createSearch.cancelAll();\n }\n\n // Now send a cancellation request to OpenEye.\n await cancelObjectSearchRequest(this.ajax, this.cameraId, this.envSettings);\n }\n\n /**\n * Restarts the same search request\n */\n @action\n restartSearch(): void {\n this.resetErrors();\n this.submitSearch(this.requestModelData!);\n }\n\n /**\n * Resizes the draw window based on the draw-window div height minus the padding of the snapshot component\n */\n @action\n resizeDrawWindow(el: HTMLDivElement): void {\n this.snapshotMaxHeight = el.clientHeight;\n }\n\n /**\n * Sets selectTimeWindowMethod as passed in from the svr-timeline component, so we can change the time window on svr-timeline from this component\n */\n @action\n setSelectTimeWindowMethod(method: (newTimelineStartTime: Date, newCurrentTime?: Date) => void): void {\n this.selectTimeWindowMethod = method;\n }\n\n /**\n * Changes the selected result (by index)\n */\n @action\n changeSelectedResult(i?: number) {\n this.selectedResultIndex = i;\n }\n\n /**\n * If svr-playback-features fails to get interval data for the device, lets show an error and send them back, as any AVS\n * search will fail if we aren't getting interval data\n */\n @action\n async onSetIntervalsFailed() {\n // using add notification instead of add error so that we can make the error persistent after transition\n this.notificationManager.addNotification(\n this.intl.tc(this, 'couldntRetrieveIntervals'),\n 'issue',\n undefined,\n 0,\n true,\n false,\n 'error'\n );\n\n this.navigateToContextAwareSvrPage();\n }\n\n /**\n * Parses a json response from OpenEye's ObjectSearch API into a HistoryEvent model.\n */\n private parseResults(data: string): void {\n // All entries after the first will begin with a comma, so parse that out.\n // Also, the last entry will include some metadata on a new line, so parse that out too.\n const json = data.replace(/\\n.*/i, '').replace(',{', '{');\n\n try {\n const result = new ObjectSearchResult(json);\n\n const resultAsInterval = this.store.createRecord('video/interval', {\n startTime: result.dateRange.startTime,\n endTime: result.dateRange.endTime,\n type: Motion\n });\n\n this.results?.pushObject(resultAsInterval);\n } catch (e) {\n if (!(e instanceof SyntaxError)) {\n // Syntax errors are expected for the first row of the response.\n // No other errors are expected, so re-throw them.\n throw e;\n }\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::AdvancedVideoSearch::Page': typeof AdvancedVideoSearchComponent;\n }\n}\n","import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * Base class for information about cloud clip storage state.\n */\nexport default class VideoClipsStorageIndicatorComponent extends Component {\n @service intl;\n\n /**\n * Indicates the popup is open.\n *\n * @type {boolean}\n */\n @tracked isPopupOpen = false;\n\n /**\n * Toggles the open state for the popup.\n */\n @action togglePopup() {\n this.isPopupOpen = !this.isPopupOpen;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n\\n {{#if this.isOverQuota}}\\n

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

\\n {{else}}\\n

{{safe-html (tc this \\'resetRulesMessage\\' recordingRulesEnable=(if this.canEnableRecordingRulesAfterQuotaReset (tc this \\'recordingRulesAutoEnable\\') (tc this \\'recordingRulesManualEnable\\')))}}

\\n {{/if}}\\n\\n \\n\\n \\n
\\n\\n\\n {{#if this.isOverQuota}}\\n {{#if this.canEnableRecordingRulesAfterQuotaReset}}\\n

{{safe-html (tc this \\'storageLimitAutoEnableText\\' link=(knowledge-base-link \\'VideoClipStorageLimitReached\\'))}}

\\n\\n

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

\\n {{else}}\\n

{{safe-html (tc this \\'storageLimitText\\' link=(knowledge-base-link \\'VideoClipStorageLimitReached\\'))}}

\\n\\n

{{safe-html (tc this \\'reactivateNextMonthText\\' link=(coalesce (href-to \\'video.rules\\') \\'test-link\\'))}}

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

{{if this.canEnableRecordingRulesAfterQuotaReset (safe-html (tc this \\'reduceClipsUploadedOptionsText\\'))(safe-html (tc this \\'reactivateNowText\\' link=(coalesce (href-to \\'video.rules\\') \\'test-link\\')))}}

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

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

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

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

\\n\\n \\n {{/if}}\\n\\n\\n\",{ moduleName: \"customer-site/components/video/clips/storage/alert/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed, action } from '@ember/object';\nimport { or } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport Indicator from '../indicator';\n\nimport './_style.scss';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface VideoClipsStorageAlertSignature {\n Args: {\n /** The video usage model */\n videoUsage: VideoUsageModel;\n };\n}\n\n/**\n * @classdesc\n * An inline warning for when clip storage is approaching the limits.\n */\n@intlPath({ path: 'video/clips/storage/alert' })\nexport default class VideoClipsStorageAlertComponent extends Indicator {\n @service declare contextManager: ContextManager;\n\n /**\n * Whether the user has the automatic re-enabling of recording rules after quota reset feature.\n */\n @computed('contextManager.identityModel.canEnableRecordingRulesAfterQuotaReset')\n get canEnableRecordingRulesAfterQuotaReset(): boolean {\n return this.contextManager.identityModel.canEnableRecordingRulesAfterQuotaReset;\n }\n\n /**\n * Indicates the alert should show the over clip upload quota status.\n */\n @computed('args.videoUsage.{isOverUploadQuota,suppressUploadQuotaWarning}')\n get isOverQuota(): boolean {\n const { isOverUploadQuota, suppressUploadQuotaWarning } = this.args.videoUsage;\n return isOverUploadQuota && !suppressUploadQuotaWarning;\n }\n\n /**\n * Indicate the account has video analytics rules.\n */\n @or('args.videoUsage.hasVMDRules', 'args.videoUsage.hasVARules')\n declare showKnowledgeBaseLinks: boolean;\n\n /**\n * Dismisses this alert.\n */\n @action dismiss(): Promise | void {\n const { videoUsage } = this.args;\n\n if (this.isOverQuota) {\n videoUsage.set('suppressUploadQuotaWarning', true);\n return videoUsage.save();\n }\n\n // Need to save after this as well once VID-30961 is complete.\n videoUsage.set('shouldUserEnableRules', false);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::Alert': typeof VideoClipsStorageAlertComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"

\\n ( {{t \\'generic.byUser\\' userName=@userName}})\\n

\\n\",{ moduleName: \"customer-site/components/video/clips/deleted-by/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface VideoClipsDeletedBySignature {\n Args: {\n userName: string;\n };\n}\n\nconst VideoClipsDeletedBy = templateOnlyComponent();\nexport default VideoClipsDeletedBy;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::DeletedBy': typeof VideoClipsDeletedBy;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n {{#if @showSelection}}\\n
\\n {{else}}\\n
\\n \\n \\n
\\n\\n
\\n \\n\\n \\n
\\n
\\n {{/if}}\\n
\\n\\n \\n \\n\\n
\\n
{{await @mediaItem.cameraName}}
\\n
{{@mediaItem.model.description}}
\\n {{#if @mediaItem.model.deletedBy}}\\n
\\n {{/if}}\\n
\\n
\\n
\\n\\n {{#if (and @showSelection @mediaItem.isSelected)}}\\n \\n {{/if}}\\n\\n\",{ moduleName: \"customer-site/components/video/clips/playable-clip/selectable-clip/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport BasePlayableClipComponent from '../base-playable-clip';\n\nimport './_style.scss';\nimport type { MediaItem } from 'customer-site/classes/video/clips/helpers/clip-management';\n\nexport interface VideoClipsPlayableClipSelectableClipSignature {\n Args: {\n mediaItem: MediaItem;\n showSelection?: boolean;\n toggleSelection: (mediaItem: MediaItem) => unknown;\n playMediaItem: (mediaItem: MediaItem) => unknown;\n showDetails?: boolean;\n };\n}\n\nexport default class VideoClipsPlayableClipSelectableClip extends BasePlayableClipComponent {}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::PlayableClip::SelectableClip': typeof VideoClipsPlayableClipSelectableClip;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n {{#if this.showLocations}}\\n

{{this.displayDate}} {{this.dayTimeRange}}

\\n\\n {{#each this.locations as |location|}}\\n

{{await location.description}}{{location.timeRange}}

\\n\\n
\\n {{#each location.media as |mediaItem|}}\\n \\n {{/each}}\\n
\\n\\n {{/each}}\\n {{else}}\\n

{{this.displayDate}}{{this.dayTimeRange}}

\\n\\n
\\n {{#each this.media as |mediaItem|}}\\n \\n {{/each}}\\n
\\n\\n {{/if}}\\n\\n
\\n
\\n\\n\",{ moduleName: \"customer-site/components/video/clips/clip-display/clip-day/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\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 ContainerObject from '../../../../../utils/container-object';\nimport BaseClipDisplay, { getTimeRange, playMediaItems } from '../base-clip-display/index';\n\nimport './_style.scss';\n\n/**\n * @classdesc\n * Groups media for this day by location.\n *\n * @inner\n * @class components.video.clips.ClipDisplay.ClipDay.Location\n */\nclass Location extends ContainerObject {\n @service intl;\n @service modals;\n @service contextManager;\n @tracked media;\n\n /**\n * @param {Object} host The host object (controller, route, component, etc) that is instantiating this instance.\n * @param {EmberArray} media The media to render within this location.\n */\n constructor(host, media) {\n super(host);\n\n this.media = media;\n }\n\n /**\n * The location description.\n *\n * @type {String}\n */\n @alias('media.firstObject.model.location.description')\n description;\n\n /**\n * The time range for the media in this location.\n *\n * @returns {String}\n */\n @computed('media', 'contextManager.identityModel.preferredTimezone')\n get timeRange() {\n return getTimeRange.call(this, this.media, 'model.timestamp', false);\n }\n\n /**\n * Opens the media player modal for the passed media.\n *\n * @param {classes.video.clips.helpers.MediaItem} mediaItem The media to play.\n */\n @action playMediaItem(mediaItem) {\n return playMediaItems.call(this, mediaItem);\n }\n}\n\n/**\n * @classdesc\n * A collection of media, grouped by the day they were captured.\n *\n * @class components.video.clips.ClipDisplay.ClipDay\n *\n * @param {EmberArray} media The media to render within this day.\n * @param {boolean} showDetails Indicates media details should be visible.\n * @param {boolean} showSelection Indicates media can be selected.\n * @param {function(classes.video.clips.helpers.MediaItem)} toggleSelection Toggles selection for the passed media.\n */\nexport default class ClipDay extends BaseClipDisplay {\n /**\n * Indicates we should show the media grouped by location.\n *\n * @type {boolean}\n */\n @alias('contextManager.isEnterprise')\n showLocations;\n\n /**\n * The media locations.\n *\n * @returns {Array}\n */\n @computed('showLocations', 'media.[]')\n get locations() {\n if (!this.showLocations) {\n return [];\n }\n\n const map = this.media.reduce((map, media) => {\n const id = media.model.belongsTo('location').id();\n (map[id] = map[id] || []).push(media);\n return map;\n }, {});\n\n return Object.keys(map).map((id) => new Location(this, map[id]));\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n
\\n {{tc this \\'details\\'}}\\n {{#unless (is-enterprise)}}\\n {{tc this \\'manageRules\\'}}\\n {{/unless}}\\n
\\n\\n
\\n \\n\\n \\n
\\n\\n
\\n \\n \\n {{#if @videoUsage.projectedOverQuota}}\\n \\n {{/if}}\\n \\n
\\n\",{ moduleName: \"customer-site/components/video/clips/storage/popup/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 { getClipUploadIcon } from '../info/index';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { PopoverMenuSignature } from '@adc/ui-components/components/popover-menu';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\n\ntype PopoverMenuArgs = PopoverMenuSignature['Args'];\n\ninterface VideoClipsStoragePopupSignature {\n Args: Pick & {\n videoUsage: VideoUsageModel;\n closePopup: PopoverMenuArgs['on-backdrop-click'];\n };\n}\n\n/**\n * @classdesc\n * Popup showing video clip storage usage.\n */\n@intlPath({ path: 'video/clips/storage/popup' })\nexport default class VideoClipsStoragePopupComponent extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * The video clip upload status icon.\n */\n @computed('args.videoUsage.{isOverUploadQuota,isHealthBad}')\n get icon(): string {\n return getClipUploadIcon(this.args.videoUsage);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::Popup': typeof VideoClipsStoragePopupComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n
\\n \\n

\\n \\n {{tc this \\'summary\\' monthly=(format-number @videoUsage.uploadsThisMonth) quota=(format-number @videoUsage.uploadQuota)}}\\n

\\n
\\n\\n \\n
\",{ moduleName: \"customer-site/components/video/clips/storage/info/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { computed } from '@ember/object';\nimport { intlPath } from '@adc/i18n/path';\nimport Indicator from '../indicator';\n\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\n\n/**\n * Returns the video clip upload status icon.\n *\n * @returns {string}\n *\n * @memberof VideoClipsStorageInfoComponent\n */\nexport function getClipUploadIcon(videoUsage: VideoUsageModel): string {\n const { isOverUploadQuota, isHealthBad } = videoUsage;\n\n if (isOverUploadQuota) {\n return 'issue';\n }\n\n return isHealthBad ? 'warning' : 'video';\n}\n\ninterface VideoClipsStorageInfoSignature {\n Element: HTMLDivElement;\n Args: {\n /** The video usage model */\n videoUsage: VideoUsageModel;\n };\n}\n\n/**\n * @classdesc\n * Information about cloud clip storage state.\n */\n@intlPath({ path: 'video/clips/storage/info' })\nexport default class VideoClipsStorageInfoComponent extends Indicator {\n /**\n * The video clip upload status icon.\n */\n @computed('args.videoUsage.{isOverUploadQuota,isHealthBad}')\n get icon(): string {\n return getClipUploadIcon(this.args.videoUsage);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::Info': typeof VideoClipsStorageInfoComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n

\\n \\n {{#if @videoUsage.nextDeletedClipDate}}\\n {{format-date-tz @videoUsage.nextDeletedClipDate month=\\\"long\\\" day=\\\"numeric\\\" year=\\\"numeric\\\"}}\\n {{else}}\\n {{t \\'generic.na\\'}}\\n {{/if}}\\n

\\n
\\n\\n \\n {{#if @videoUsage.isOverUploadQuota}}\\n

{{tc this \\'overQuotaText\\' clipDate=(format-date-tz @videoUsage.nextDeletedClipDate month=\\\"long\\\" day=\\\"numeric\\\" year=\\\"numeric\\\") htmlSafe=true}}

\\n {{else}}\\n

{{tc this \\'underQuotaText\\'}}

\\n {{/if}}\\n\\n {{#if @savedClipPermissions.canViewKnowledgeBase}}\\n

{{tc this \\'learnMore\\' link=(knowledge-base-link \\'ProtectVideoClip\\') htmlSafe=true}}

\\n {{/if}}\\n\\n {{#unless @videoUsage.isOverUploadQuota}}\\n

\\n {{tc this \\'currentStoragePercentage\\'\\n storageUsagePercent=@videoUsage.storageUsagePercent\\n totalStorage=@videoUsage.storageQuota\\n htmlSafe=true\\n }}\\n

\\n {{/unless}}\\n \\n
\",{ moduleName: \"customer-site/components/video/clips/storage/next-clip/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport { intlPath } from '@adc/i18n/path';\nimport Indicator from '../indicator';\n\nimport type SavedClipPermissions from 'customer-site/models/video/permissions/saved-clip-permission';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\n\ninterface VideoClipsStorageNextClipSignature {\n Element: HTMLDivElement;\n Args: {\n /** The video usage model */\n videoUsage: VideoUsageModel;\n /** The saved clip permissions model */\n savedClipPermissions: SavedClipPermissions;\n };\n}\n\n/**\n * @classdesc\n * Clip storage indicator to show the user the date of the next unprotected clip that will be deleted.\n */\n@intlPath({ path: 'video/clips/storage/next-clip' })\nexport default class VideoClipsStorageNextClipComponent extends Indicator {}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::NextClip': typeof VideoClipsStorageNextClipComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if this.showStorageAlert}}\\n \\n {{/if}}\\n\\n \\n {{#if this.noSearchResults}}\\n {{!-- @glint-expect-error ViewContainer has a required model property, please convert to PageView. --}}\\n \\n \\n \\n\\n {{else if (not this.days.length)}}\\n \\n\\n {{else}}\\n {{#if this.showMaxMediaWarningForFilter}}\\n
\\n \\n

{{tc this \\'maxClipWarningForFilter\\'}}

\\n
\\n {{/if}}\\n\\n {{#if this.isGalleryView}}\\n {{#each this.days as |media idx|}}\\n {{!-- @glint-expect-error Please convert this component to TS. --}}\\n \\n {{/each}}\\n\\n
\\n\\n {{else}}\\n {{!-- @glint-expect-error ViewContainer has a required model property, please convert to PageView. --}}\\n \\n \\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#unless cell.row.isEventDeleted}}\\n \\n\\n {{#if (media \\'isMobile\\')}}\\n {{#unless this.hasSelectedMedia}}\\n \\n {{/unless}}\\n\\n \\n {{/if}}\\n {{/unless}}\\n \\n\\n {{#unless (media \\'isMobile\\')}}\\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#if (or cell.row.isEventDeleted this.hasSelectedMedia)}}\\n
\\n {{else}}\\n \\n {{/if}}\\n \\n {{/unless}}\\n\\n {{#if (is-enterprise)}}\\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#if (or (media \\'isMobile\\') cell.row.isEventDeleted this.hasSelectedMedia)}}\\n {{!-- @glint-expect-error location is async, we need to use get to access, please fix this. --}}\\n {{cell.row.model.location.description}}\\n {{else}}\\n \\n {{!-- @glint-expect-error location is async, we need to use get to access, please fix this. --}}\\n {{cell.row.model.location.description}}\\n
\\n {{/if}}\\n
\\n {{/if}}\\n\\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#if (or (media \\'isMobile\\') cell.row.isEventDeleted this.hasSelectedMedia)}}\\n {{await cell.row.cameraName}}\\n {{else}}\\n \\n {{await cell.row.cameraName}}\\n
\\n {{/if}}\\n \\n\\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#if (or (media \\'isMobile\\') cell.row.isEventDeleted this.hasSelectedMedia)}}\\n

{{cell.row.model.description}}

\\n\\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#if (and cell.row.isEventDeleted cell.row.model.deletedBy)}}\\n {{!-- @glint-expect-error deletedBy can be undefined, please fix this. --}}\\n \\n {{/if}}\\n {{else}}\\n \\n {{cell.row.model.description}}\\n \\n {{/if}}\\n \\n\\n \\n {{format-date-tz cell.row.model.timestamp month=\\\"numeric\\\" day=\\\"numeric\\\" year=\\\"numeric\\\" hour=\\\"numeric\\\" minute=\\\"2-digit\\\" second=\\\"2-digit\\\" timeZone=(coalesce (await this.selectedTimezone) \\'UTC\\')}}\\n \\n\\n \\n {{#each cell.row.stateIcons as |icon|}}\\n \\n {{/each}}\\n {{#if (media \\'isMobile\\')}}\\n {{! template-lint-disable no-bare-strings }}\\n  \\n {{/if}}\\n \\n\\n \\n\\n {{#unless (media \\'isMobile\\')}}\\n \\n {{!-- @glint-expect-error MediaItem doesn\\'t have a isEventDeleted property, but it does have isDeleted, please fix this. --}}\\n {{#unless cell.row.isEventDeleted}}\\n \\n {{/unless}}\\n \\n {{/unless}}\\n \\n\\n
\\n \\n\\n {{/if}}\\n {{/if}}\\n\\n \\n\\n {{#if this.showMaxMediaWarning}}\\n
\\n \\n

{{tc this \\'maxClipWarning\\'}}

\\n
\\n {{/if}}\\n\\n {{!-- @glint-expect-error ViewContainer has a required model property, please convert to PageView. --}}\\n \\n \\n {{#unless (is-enterprise)}}\\n \\n\\n \\n {{/unless}}\\n \\n \\n\\n\",{ moduleName: \"customer-site/components/video/clips/route-body/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 { sort } from '@ember/object/computed';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { NotOperatorSite } from 'customer-site/components/video/clips/video-modal/index';\nimport VideoClipsModal from 'customer-site/components/video/clips/video-modal/index';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type ModalService from '@adc/ui-components/services/modals';\nimport type { MediaItem } from 'customer-site/classes/video/clips/helpers/clip-management';\nimport type ClipsFilterManager from 'customer-site/classes/video/clips/helpers/filter-manager';\nimport type SavedClipPermissions from 'customer-site/models/video/permissions/saved-clip-permission';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\nimport type ContextManager from 'customer-site/services/context-manager';\n\ninterface RouteBodySignature {\n Args: {\n /** Action for changing current pagination page. */\n changePage(): void;\n changeEventId(eventId?: string): void;\n /** Action for changing pagination page size. */\n changePageSize(): void;\n /** which media should be loaded in the modal. */\n mediaFromQueryParams: MediaItem;\n /** The media filters manager. */\n filtersManager: ClipsFilterManager;\n /** Indicates if media should be displayed in gallery view (as opposed to list view). */\n isGalleryView: boolean;\n /** The media to show. */\n media: MediaItem[];\n /** The total number of media items found (for pagination). */\n mediaCount: number;\n /** Action called when media has been rendered. */\n mediaHasRendered: VoidFunction;\n pageSize: number;\n /** The current query parameters (for filtering). */\n queryParams: ClipFilteringRouteQueryParams;\n /** The saved clip permissions model. */\n savedClipPermissions: SavedClipPermissions;\n /** Indicates media details should be visible. */\n showDetails: boolean;\n /** Indicates that media items should be in bulk selection mode. */\n showSelection: boolean;\n /** Action for toggling media selection. */\n toggleMediaSelection(): void;\n /** The video usage model. */\n videoUsage: VideoUsageModel;\n };\n}\n\ninterface ClipFilteringRouteQueryParams {\n cameras: number[];\n detectionFilters: number;\n thirdPartyDetection: number[];\n endDate?: Date;\n page: number;\n pageSize: number;\n search: string;\n startDate: Date;\n status: number;\n trigger: number;\n familiarVehicles: number[];\n familiarFaces: number[];\n eventId?: number;\n}\n\nconst SORT_LOCATION = 1,\n SORT_CAMERA = 2,\n SORT_TIME = 3,\n SORT_SIZE = 4;\n\n/**\n * @classdesc\n * The route body for the single system and enterprise saved clips / gallery routes.\n */\n@intlPath({ path: 'video/clips/route-body' })\nexport default class VideoClipsRouteBodyComponent extends Component {\n @service declare contextManager: ContextManager;\n @service declare modals: ModalService;\n @service declare media: ADCResponsiveMediaService;\n @service declare intl: ADCIntlService;\n\n /**\n * Indicates media should be obscured as we transition view mode.\n */\n @tracked obscureResults = false;\n\n /**\n * Indicates media should be shown in the gallery view (not list view).\n */\n @tracked isGalleryView = true;\n\n /**\n * The page size options.\n */\n pageSizeOptions = [12, 24, 48, 96];\n\n /**\n * The matching media specified from the query params.\n */\n @computed('args.mediaFromQueryParams')\n get queryParamsMedia(): MediaItem | undefined {\n const { mediaFromQueryParams } = this.args;\n\n if (!mediaFromQueryParams) {\n return undefined;\n }\n\n return mediaFromQueryParams;\n }\n\n // region Sorting\n\n /**\n * The current table sorting key.\n */\n @tracked sortKey = -SORT_TIME;\n\n /**\n * The sort order (used only by computed sort helper).\n */\n get mediaSortOrder(): string[] {\n const { sortKey } = this,\n sortType = Math.abs(sortKey);\n\n let key = {\n [SORT_TIME]: 'timestamp',\n [SORT_CAMERA]: 'camera.description',\n [SORT_LOCATION]: 'location.description',\n [SORT_SIZE]: 'size'\n }[sortType];\n\n if (sortKey < 0) {\n key += ':desc';\n }\n\n return [`model.${key}`, sortType !== SORT_TIME ? 'model.timestamp:desc' : undefined].compact();\n }\n\n /**\n * The sorted media for list view mode (not used in gallery view mode).\n */\n @sort('args.media', 'mediaSortOrder')\n declare sortedMedia: MediaItem[];\n\n /**\n * The column sorting interface.\n */\n\n get sorting(): Record void }> {\n const { sortKey } = this;\n\n // Create sort info for each column header.\n return [\n ['timestamp', -SORT_TIME],\n ['camera', SORT_CAMERA],\n ['location', SORT_LOCATION],\n ['size', -SORT_SIZE]\n ].reduce(\n (map, [columnName, defaultSortValue]: [string, number]) => ({\n ...map,\n [columnName]: {\n // Current sort value for this column (undefined for unsorted, true for ascending, and false for descending)\n currentValue: (() => {\n if (Math.abs(sortKey) === Math.abs(defaultSortValue)) {\n return sortKey > 0;\n }\n\n return undefined;\n })(),\n\n apply: () => {\n // The new sort value if this column is clicked (default value if this column is not currently sorted, opposite if it is sorted).\n this.updateSortKey(sortKey === defaultSortValue ? -defaultSortValue : defaultSortValue);\n }\n }\n }),\n {}\n );\n }\n\n // endregion\n\n /**\n * The collection of days (with media) to render.\n */\n @computed('args.media')\n get days(): MediaItem[][] {\n const map = this.args.media.reduce>((map, media) => {\n (map[media.key] = map[media.key] ?? []).push(media);\n return map;\n }, {});\n\n // Store in reverse order and return.\n return Object.keys(map)\n .sort()\n .reverse()\n .map((key) => map[key]);\n }\n\n /**\n * Indicates there is currently at least one selected media.\n */\n @computed('args.media.@each.isSelected')\n get hasSelectedMedia(): boolean {\n return !isEmpty(this.args.media.findBy('isSelected'));\n }\n\n /**\n * Indicates the results are filtered, and no results were found.\n */\n @computed('args.filtersManager.hasAppliedFilters', 'days.[]')\n get noSearchResults(): boolean {\n return this.args.filtersManager.hasAppliedFilters && isEmpty(this.days);\n }\n\n /**\n * Indicates we should show the storage alert component.\n */\n @computed(\n 'args.videoUsage.{isOverUploadQuota,shouldUserEnableRules,suppressUploadQuotaWarning}',\n 'contextManager.isEnterprise'\n )\n get showStorageAlert(): boolean {\n if (this.contextManager.isEnterprise) {\n return false;\n }\n\n const { isOverUploadQuota, suppressUploadQuotaWarning, shouldUserEnableRules } = this.args.videoUsage;\n if (isOverUploadQuota) {\n return !suppressUploadQuotaWarning;\n }\n\n return shouldUserEnableRules;\n }\n\n /**\n * Return the current selected timezone (only for enterprise accounts with units in multiple zones)\n */\n @computed('contextManager.{showPreferredTimezone,identityModel.preferredTimezone}', 'intl.timeZone')\n get selectedTimezone(): Promise {\n return (async () => {\n return (await this.contextManager.showPreferredTimezone)\n ? this.contextManager.identityModel.preferredTimezone\n : this.intl.timeZone;\n })();\n }\n\n /**\n * Is the media count at its max?\n */\n @computed('args.{mediaCount,savedClipPermissions.maxClipCapacityForQuerying}')\n get hasMaxMediaCount(): boolean {\n const { mediaCount, savedClipPermissions } = this.args;\n return savedClipPermissions && mediaCount >= savedClipPermissions.maxClipCapacityForQuerying;\n }\n\n /**\n * Should a warning be shown to the user\n * that we are unable to show all media?\n * This is true if the number of media items is at least 500,\n * and they are on the last page.\n */\n @computed('hasMaxMediaCount', 'args.queryParams.{page,pageSize}')\n get showMaxMediaWarning(): boolean {\n const { args, hasMaxMediaCount } = this,\n { mediaCount, queryParams } = args,\n { page, pageSize } = queryParams,\n selectedPageIsLastPage = page === Math.ceil(mediaCount / pageSize);\n return hasMaxMediaCount && selectedPageIsLastPage;\n }\n\n /**\n * Should a warning be shown to the user\n * that we are unable to show all media?\n * This is true if there is a filter\n * and that filter results in the number of media items to be at least 500.\n */\n @computed('hasMaxMediaCount', 'args.filtersManager.hasAppliedFilters')\n get showMaxMediaWarningForFilter(): boolean {\n const { hasMaxMediaCount, args } = this,\n { hasAppliedFilters } = args.filtersManager;\n return hasMaxMediaCount && hasAppliedFilters;\n }\n\n /**\n * Called when the page first loads.\n * Initializes the view mode and play the video specified in the query params.\n */\n @action pageHasLoaded(): void {\n this.initViewMode();\n this.playQueryParamMedia();\n }\n\n /**\n * Called when media is done rendering to show non-obscured media.\n */\n @action mediaHasRendered(): void {\n this.obscureResults = false;\n this.args.mediaHasRendered();\n }\n\n /**\n * Initializes the isGalleryView mode state.\n */\n @action initViewMode(): void {\n this.isGalleryView = this.args.isGalleryView;\n }\n\n /**\n * Changes the view mode (isGalleryView).\n *\n * @param {HTMLElement} el Ignored\n * @param {boolean} isGalleryView True if the new view mode should be gallery.\n */\n @action updateViewMode(el: HTMLElement, [isGalleryView]: [boolean]): void {\n if (this.isGalleryView !== isGalleryView) {\n if (this.args.mediaCount) {\n this.obscureResults = true;\n }\n\n // Do not copy this deprecated usage. If you see this, please fix\n // eslint-disable-next-line ember/no-runloop\n later(() => {\n const appContentWrapper = el.closest('#app-content-wrapper');\n if (appContentWrapper) {\n appContentWrapper.scrollTop = 0;\n }\n this.isGalleryView = isGalleryView;\n }, 25);\n }\n }\n\n /**\n * Plays the passed media, within the context of all media.\n *\n * @param {classes.video.clips.helpers.MediaItem} media the media to play\n */\n @action playAllMedia(media: MediaItem): void {\n const { sortedMedia } = this;\n const mediaWithQueryParam = sortedMedia;\n\n // If the media item isn't in the sorted media, then add the media item to the array\n if (sortedMedia.indexOf(media) == -1) {\n mediaWithQueryParam.push(media);\n }\n\n this.modals.showModal(\n VideoClipsModal,\n {\n media: mediaWithQueryParam,\n selectedIndex: sortedMedia.indexOf(media),\n operatorSiteEnum: NotOperatorSite\n },\n () => {\n // When the modal is closed, we want to clear out the event id.\n this.args.changeEventId(undefined);\n }\n );\n }\n\n /**\n * Updating SortKey (avoiding Lint side-effects message)\n */\n private updateSortKey(newSortKey: number): void {\n this.sortKey = newSortKey;\n }\n\n /**\n * If a media item has been specified in the query params, launch the video player for that media.\n */\n private playQueryParamMedia(): void {\n const { queryParamsMedia } = this;\n\n if (queryParamsMedia) {\n this.playAllMedia(queryParamsMedia);\n }\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::RouteBody': typeof VideoClipsRouteBodyComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n {{#if @icon}}\\n \\n {{/if}}\\n\\n
\\n
{{t \\'components.video.clips.storage.item.clipCount\\' count=@clipCount}} {{yield}}
\\n
{{@details}}
\\n
\\n
\\n\",{ moduleName: \"customer-site/components/video/clips/storage/item/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { SvgSymbolSignature } from '@adc/svg-system/components/svg-symbol';\n\nexport interface VideoClipsStorageItemSignature {\n Element: HTMLDivElement;\n Args: Pick & {\n clipCount: number;\n details: string;\n };\n Blocks: {\n default: [];\n };\n}\n\nconst VideoClipsStorageItem = templateOnlyComponent();\nexport default VideoClipsStorageItem;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::Item': typeof VideoClipsStorageItem;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n\\n
\\n {{this.minimum}}\\n {{#if @videoUsage.isHealthBad}}\\n \\n {{/if}}\\n {{#if @description}}\\n {{@description}}\\n {{/if}}\\n {{format-number @videoUsage.uploadQuota}}\\n
\\n\\n {{yield}}\\n
\\n\",{ moduleName: \"customer-site/components/video/clips/storage/progress/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\n\nimport './_style.scss';\nimport type { ProgressBarSignature } from 'customer-site/components/ui/progress-bar/index';\nimport type VideoUsageModel from 'customer-site/models/video/video-usage';\n\ntype ProgressBarArgs = ProgressBarSignature['Args'];\n\ninterface VideoClipsStorageProgressSignature {\n Element: HTMLDivElement;\n Args: {\n videoUsage: VideoUsageModel;\n description?: string;\n };\n Blocks: {\n default: [];\n };\n}\n\nconst barColorModelMap: Map = new Map([\n ['good', 'green'],\n ['warning', 'yellow'],\n ['danger', 'red']\n]);\n\n/**\n * @classdesc\n * Progress indicator for video cloud clip storage.\n */\nexport default class VideoClipsStorageProgressComponent extends Component {\n /**\n * Minimum upload value.\n */\n minimum = 0;\n\n /**\n * The computed progress bar color.\n */\n @computed('args.videoUsage.health')\n get barColor(): ProgressBarArgs['barColor'] {\n return barColorModelMap.get(this.args.videoUsage.health)!;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::Clips::Storage::Progress': typeof VideoClipsStorageProgressComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n {{#if @slot.model}}\\n
\\n

{{@slot.model.description}}

\\n {{#if @isEnterprise}}\\n {{!-- @glint-expect-error system is an async belongs to so this should be `get @slot.model.system \\'description\\'` --}}\\n

{{@slot.model.system.description}}

\\n {{/if}}\\n
\\n\\n {{#if @slot.model.hasSvrSchedule}}\\n \\n {{/if}}\\n {{/if}}\\n\\n {{#if (and @slot.model @slot.snapshot)}}\\n \\n {{else}}\\n \\n
\\n

{{this.selectCameraInstructions}}

\\n
\\n {{/if}}\\n
\\n {{#if @slot.model}}\\n
\\n \\n \\n
\\n {{/if}}\\n {{yield}}\\n\",{ moduleName: \"customer-site/components/video/edit-camera-group/camera-slot/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { and } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW } from 'customer-site/components/video/edit-camera-group/index';\nimport { MAX_SMALL_PLAYER_WIDTH } from 'customer-site/components/video/video-player/base-video-player';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { SafeString } from 'handlebars';\nimport './_style.scss';\nimport type EnvSettingsService from '@adc/app-infrastructure/services/env-settings';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { Slot } from 'customer-site/components/video/edit-camera-group/index';\nimport type Camera from 'customer-site/models/video/devices/camera';\n\nexport interface CameraSlotSignature {\n Args: {\n slot: Slot;\n removeCamera: (camera: Camera) => void;\n cameraSlotStyle: SafeString;\n isEnterprise?: boolean;\n };\n Blocks: {\n default: [];\n };\n}\n\n/**\n * @classdesc\n *\n * Component to represent a camera slot where a user can drag cameras in the edit camera group page.\n */\n@intlPath({ path: 'video/edit-camera-group/camera-slot' })\nexport default class CameraSlot extends Component {\n @service declare envSettings: EnvSettingsService;\n @service declare intl: ADCIntlService;\n\n /**\n * The disconnected error message to show, if the camera is disconnected.\n */\n @tracked\n disconnectedError?: string;\n\n /**\n * The instructions to select a camera.\n */\n @tracked\n selectCameraInstructions = '';\n\n /**\n * Whether the user is hovering over this slot.\n */\n @tracked\n isHovering = false;\n\n /**\n * Whether to show the hover buttons for this slot.\n\n */\n @and('isHovering', 'args.slot.model')\n declare showHoverButtons: boolean;\n\n /**\n * Ensure component is destroyed post-drag.\n *\n * We have to do this because of a strange bug where the component wasn't getting cleaned up post-drag if you moved it to the last slot.\n */\n @action ensureComponentIsDestroyed(element: HTMLElement): void {\n if (!this.envSettings.isTestEnvironment() && element) {\n const el = element,\n parent = el.parentElement;\n\n if (parent) {\n parent.removeChild(el);\n }\n }\n\n super.willDestroy();\n }\n\n /**\n * Set isHovering to true on mouse enter.\n */\n @action handleMouseEnter(): void {\n this.isHovering = true;\n }\n\n /**\n * Set isHovering to false on mouse leave.\n */\n @action handleMouseLeave(): void {\n this.isHovering = false;\n }\n\n /**\n * Removes the relevant camera from the drag-drop area.\n */\n @action removeCamera(camera: Camera): void {\n this.args.removeCamera(camera);\n }\n\n /**\n * Change text in camera slot to shorter version based on camera-slot width or page-container width\n */\n @action\n rewordCameraSlotText(slot: HTMLDivElement): void {\n const { intl } = this,\n snapshotError = this.args.slot?.snapshot ? this.args.slot?.snapshot.error : undefined,\n slotWidth = slot.clientWidth ?? 0,\n pageContainerWidth = slot.closest('.page-container')?.clientWidth ?? 0,\n smallText =\n slotWidth <= MAX_SMALL_PLAYER_WIDTH ||\n pageContainerWidth < MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW;\n\n this.disconnectedError =\n smallText && snapshotError === intl.t('generic.video.errorFailConnect')\n ? intl.t('generic.video.streamingErrors.failedToConnectShort')\n : snapshotError;\n this.selectCameraInstructions = smallText\n ? intl.tc(this, 'selectCameraInstructionsShort')\n : intl.tc(this, 'selectCameraInstructions');\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::EditCameraGroup::CameraSlot': typeof CameraSlot;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n {{#each @cameraSlots as |slot|}}\\n \\n {{/each}}\\n \\n
\\n\",{ moduleName: \"customer-site/components/video/edit-camera-group/camera-slot-page/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\nimport type { EmberDragulaContainerSignature } from '@adc/drag-drop/components/ember-dragula-container';\nimport type { CameraSlotSignature } from '../camera-slot/index';\n\nexport interface VideoEditCameraGroupSlotPageSignature {\n Element: HTMLDivElement;\n Args: Pick & {\n drake: EmberDragulaContainerSignature['Args']['drake'];\n cameraSlots: CameraSlotSignature['Args']['slot'][];\n };\n}\n\nconst VideoEditCameraGroupSlotPage = templateOnlyComponent();\nexport default VideoEditCameraGroupSlotPage;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::EditCameraGroup::CameraSlotPage': typeof VideoEditCameraGroupSlotPage;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{#each this.cameraSlotPages as |cameraSlotPage|}}\\n
\\n
\\n \\n \\n
\\n \\n
\\n {{/each}}\\n\\n\",{ moduleName: \"customer-site/components/video/edit-camera-group/camera-slot-page-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 { MAX_CAMERAS_PER_PAGE } from 'customer-site/components/video/edit-camera-group/index';\nimport { intlPath } from '@adc/i18n/path';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { Slot } from 'customer-site/components/video/edit-camera-group/index';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type { DragulaOptions } from 'dragula';\nimport type { SafeString } from 'handlebars';\n\ninterface CameraSlotPageContainerSignature {\n Args: {\n cameraSlots: Slot[];\n isEnterprise: boolean;\n onDrop: () => void;\n removeCamera: (camera: Camera) => void;\n cameraSlotStyle: SafeString;\n };\n}\n\ninterface CameraSlotPage {\n pageNumber: number;\n cameraSlots?: Slot[];\n startIndex?: number;\n}\n\n/**\n * @classdesc\n *\n * Component representing the container that holds all of the camera slot pages.\n */\n@intlPath({ path: 'video/edit-camera-group/camera-slot-page-container' })\nexport default class CameraSlotPageContainer extends Component {\n @service declare intl: ADCIntlService;\n\n /**\n * The config for dragula.\n */\n get dragulaConfig(): { options: DragulaOptions; enabledEvents: string[] } {\n return {\n options: {\n copy: false,\n direction: 'vertical',\n revertOnSpill: false,\n removeOnSpill: false,\n mirrorContainer: document.querySelector('.edit-camera-group') ?? undefined,\n\n // We only allow moves if the element being dragged is a camera slot, it's coming from the camera slots container, and the user is grabbing with the handle.\n moves: (el: HTMLElement, source: HTMLElement, handle: HTMLElement) => {\n return (\n el.classList.contains('camera-slot-wrapper') &&\n source.classList.contains('camera-slots') &&\n handle.classList.contains('handle')\n );\n },\n\n // We only allow drop if the element being dragged is a camera slot, and it's coming from/dropping into the camera slots container.\n accepts: (el: HTMLElement, target: HTMLElement, source: HTMLElement) => {\n return (\n el.classList.contains('camera-slot-wrapper') &&\n source.classList.contains('camera-slots') &&\n target.classList.contains('camera-slots') &&\n source.parentElement?.getAttribute('data-page-number') ===\n target.parentElement?.getAttribute('data-page-number')\n );\n }\n },\n\n enabledEvents: ['drop']\n };\n }\n\n /**\n * Generates the cameraSlotPages based on the number of cameraSlots\n */\n get cameraSlotPages(): CameraSlotPage[] {\n const { cameraSlots } = this.args,\n pages = cameraSlots\n ? Array.from(new Array(cameraSlots.length / MAX_CAMERAS_PER_PAGE), (_, index) => index)\n : [];\n return pages.map((page, index) => {\n const startIndex = page * MAX_CAMERAS_PER_PAGE;\n return {\n pageNumber: index + 1,\n cameraSlots: cameraSlots.slice(startIndex, startIndex + MAX_CAMERAS_PER_PAGE)\n };\n });\n }\n\n /** @ignore */\n /**\n * Fires the onDrop action in the parent component.\n */\n @action\n onDrop(): void {\n this.args.onDrop();\n }\n\n /**\n * Removes the selected camera from the group.\n */\n @action\n removeCamera(camera: Camera): void {\n this.args.removeCamera(camera);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::EditCameraGroup::CameraSlotPageContainer': typeof CameraSlotPageContainer;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n \\n\\n \\n\\n \\n
\\n
\\n
\\n

{{tc this \\'customizeGroupLayout\\'}}

\\n

({{t \\'generic.video.camerasSelected\\' num=this.selectedCameras.length}})

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

{{tc this \\'allCamerasWithCount\\' count=this.cameras.length}}

\\n

{{this.selectCamerasInstructionText}}

\\n {{#if this.sidebarCameraClusters}}\\n {{#each this.sidebarCameraClusters as |sidebarCameraCluster|}}\\n {{#if sidebarCameraCluster.cameraItems.length}}\\n
\\n {{#if this.isEnterprise}}\\n
\\n \\n
\\n {{/if}}\\n {{#each sidebarCameraCluster.cameraItems as |cameraItem|}}\\n
\\n
\\n {{#if cameraItem.camera.supportsLiveView}}\\n
\\n \\n \\n
\\n {{else}}\\n
\\n {{tc this \\'appOnly\\'}}\\n
\\n {{/if}}\\n
\\n
\\n

{{cameraItem.camera.description}}

\\n

{{cameraItem.camera.deviceModel}}

\\n
\\n
\\n {{#if cameraItem.isSelected}}\\n \\n {{else if cameraItem.camera.hasSvrSchedule}}\\n \\n {{/if}}\\n
\\n
\\n {{/each}}\\n
\\n {{/if}}\\n {{/each}}\\n {{else}}\\n \\n {{/if}}\\n
\\n
\\n
\\n \\n \\n
\\n \\n
\\n
\\n
\\n\\n
\\n\\n \\n\\n \\n\\n\\n{{yield}}\\n\",{ moduleName: \"customer-site/components/video/edit-camera-group/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { isArray } from '@ember/array';\nimport { computed, action } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { task } from 'ember-concurrency';\nimport { HdAspectRatio } from 'customer-site/components/video/video-streaming/video-streaming-features/index';\nimport { updateCameraOrderFromCameras } from 'customer-site/models/video/camera-group';\nimport { POLL_WAIT_TIME_MS } from 'customer-site/services/video/snapshot-poller';\nimport { intlPath } from '@adc/i18n/path';\n\nimport type { SafeString } from 'handlebars';\nimport './_style.scss';\nimport type ContextManager from '@adc/app-infrastructure/services/context-manager';\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 System from 'customer-site/models/systems/system';\nimport type CameraGroup from 'customer-site/models/video/camera-group';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoStreamingPermissionsCollection from 'customer-site/models/video/permissions/video-streaming-permissions-collection';\nimport type Snapshot from 'customer-site/models/video/snapshot';\nimport type SnapshotPoller from 'customer-site/services/video/snapshot-poller';\n\nexport const MAX_CAMERAS_PER_PAGE = 4,\n MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW = 722;\nconst MAX_GROUP_NAME_LENGTH = 256;\n\nexport interface Slot {\n index: number;\n model?: Camera;\n snapshot?: Snapshot;\n}\n\ninterface CameraItem {\n camera: Camera;\n isSelected?: boolean;\n snapshot?: Snapshot;\n}\n\ninterface SidebarCameraCluster {\n cameraItems: CameraItem[];\n system: System;\n}\n\ninterface EditCameraGroupModel {\n cameraGroup: CameraGroup;\n cameras: Camera[];\n systems: System[];\n videoStreamingPermissions: VideoStreamingPermissionsCollection;\n}\n\n/**\n * Gets an array of indices used to create the cameras slots for the edit camera group page.\n */\nfunction getCameraSlots(this: EditCameraGroup): number[] {\n const { selectedCameras = [] } = this,\n lastCameraIndex = Math.max(...selectedCameras.mapBy('index')),\n lastCameraNumber = lastCameraIndex + 1,\n createIndexArray = (length: number) => Array.from(new Array(length), (_, idx) => idx);\n\n // If no cameras, just return one blank page.\n if (lastCameraIndex <= 0) {\n return createIndexArray(MAX_CAMERAS_PER_PAGE);\n }\n\n let totalPages = Math.ceil((lastCameraIndex + 1) / MAX_CAMERAS_PER_PAGE);\n\n // If all pages filled, then add a blank page.\n if (lastCameraNumber % MAX_CAMERAS_PER_PAGE === 0 && lastCameraNumber === selectedCameras.length) {\n totalPages++;\n }\n\n return createIndexArray(totalPages * MAX_CAMERAS_PER_PAGE);\n}\n\n/**\n * Updates snapshots for camera slots and sidebar.\n */\nasync function updateSnapshots(this: EditCameraGroup): Promise {\n const { snapshots, cameraSlots, sidebarCameraClusters } = this;\n\n cameraSlots.forEach((slot: Slot) => {\n if (slot.model) {\n slot.snapshot = snapshots.findBy('id', slot.model.id);\n }\n });\n\n sidebarCameraClusters.forEach((sidebarCameraCluster: SidebarCameraCluster) =>\n sidebarCameraCluster.cameraItems.forEach(\n (cameraItem) => (cameraItem.snapshot = snapshots.findBy('id', cameraItem.camera.id))\n )\n );\n}\n\ninterface EditCameraGroupSignature {\n Args: {\n model: EditCameraGroupModel;\n };\n Blocks: {\n default: [];\n };\n}\n\n/**\n * @classdesc\n * Component to house all editing functionality for camera groups.\n */\n@intlPath({ path: 'video/edit-camera-group' })\nexport default class EditCameraGroup extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n @service declare notificationManager: NotificationManager;\n @service declare store: Store;\n @service('video.snapshot-poller') declare snapshotPoller: SnapshotPoller;\n\n // region Component state\n\n /**\n * The camera group being edited.\n */\n @tracked\n declare cameraGroup: CameraGroup;\n\n /**\n * All available cameras.\n */\n @tracked\n declare cameras: Camera[];\n\n /**\n * All available systems.\n */\n @tracked\n declare systems: System[];\n\n /**\n * All selected cameras.\n */\n @tracked\n selectedCameras: Slot[] = [];\n\n /**\n * Whether we are in enterprise context.\n */\n @alias('contextManager.identityModel.isEnterprise')\n declare isEnterprise: boolean;\n\n /**\n * The style attributes for the camera-slot class.\n * Only resize the camera slots after they have rendered.\n */\n @tracked\n declare cameraSlotStyle: SafeString;\n\n /**\n * The instruction text to display for selecting cameras and rearranging the group's layout.\n */\n selectCamerasInstructionText = '';\n\n /**\n * Snapshots for cameras.\n */\n @tracked\n snapshots: Snapshot[] = [];\n\n /**\n * Whether we've started polling for snapshots.\n */\n pollingStarted = false;\n\n /**\n * Whether there is an error with the snapshot poll API call.\n */\n pollingError = false;\n\n /**\n * Should editing camera groups be disabled for the user?\n * If true, this means that the user does not have read/write permissions.\n */\n declare disableEditCameraGroups: boolean;\n\n // endregion\n\n /**\n * Information for all camera slots.\n */\n get cameraSlots(): Slot[] {\n const { selectedCameras = [], snapshots = [] } = this;\n\n return getCameraSlots.call(this).map((index: number) => {\n const selectedCamera = selectedCameras.findBy('index', index),\n model = selectedCamera ? selectedCamera.model : undefined;\n\n return {\n model,\n index,\n snapshot: model ? snapshots.findBy('id', model.id) : undefined\n };\n });\n }\n\n /**\n * Whether we should allow the user to save the camera group.\n */\n get confirmButtonDisabled(): boolean {\n const { disableEditCameraGroups, selectedCameras = [], trimmedCameraGroupName = '' } = this;\n return (\n disableEditCameraGroups ||\n !trimmedCameraGroupName ||\n trimmedCameraGroupName.length > MAX_GROUP_NAME_LENGTH ||\n !selectedCameras.length\n );\n }\n\n /**\n * The first slot a camera can be placed in.\n */\n get firstAvailableSlot(): number {\n const slot = this.cameraSlots.findBy('model', undefined);\n return slot ? slot.index : 0;\n }\n\n /**\n * Information for the sidebar cameras.\n */\n get sidebarCameraClusters(): SidebarCameraCluster[] {\n return (this.systems || []).sortBy('description').map((system) => ({\n system,\n cameraItems: (this.cameras || [])\n .filter((camera) => system.hasMany('cameras').ids().includes(camera.id))\n .sortBy('description')\n .map((camera) => ({\n camera,\n isSelected: (this.selectedCameras || []).mapBy('model.id').includes(camera.id),\n snapshot: camera ? this.snapshots.findBy('id', camera.id) : undefined\n }))\n }));\n }\n\n // region Computed properties\n\n /**\n * Trims the camera group name to remove leading and trailing spaces.\n */\n @computed('cameraGroup.name')\n get trimmedCameraGroupName(): string {\n const { cameraGroup } = this;\n return cameraGroup.name ? cameraGroup.name.trim() : '';\n }\n\n // endregion\n\n // region Actions\n\n /**\n * Saves the camera group, redirecting to the manage camera groups page on success.\n */\n @action\n async saveCameraGroup(): Promise {\n const { cameraGroup } = this;\n\n cameraGroup.setProperties({\n cameras: this.selectedCameras.sortBy('index').mapBy('model'),\n name: this.trimmedCameraGroupName\n });\n\n updateCameraOrderFromCameras(cameraGroup);\n\n // Have to await here, using then() prematurely redirects & displays old version of camera group.\n await cameraGroup.save();\n\n this.notificationManager.addSuccess(this.intl.tc(this, 'saveSuccess'));\n }\n\n /**\n * Adds or removes camera from selected cameras.\n */\n @action\n toggleCamera(cameraItem: CameraItem): void {\n const selectedCameras = this.selectedCameras.mapBy('model'),\n { camera, isSelected } = cameraItem;\n\n cameraItem.isSelected = !isSelected;\n\n if (selectedCameras.includes(camera)) {\n this.selectedCameras.removeAt(selectedCameras.indexOf(camera));\n } else {\n this.selectedCameras.pushObject({ model: camera, index: this.firstAvailableSlot });\n }\n }\n\n /**\n * Removes relevant camera from selected cameras.\n */\n @action\n async removeCamera(camera: Camera): Promise {\n const { selectedCameras } = this,\n cameraToRemove = selectedCameras.findBy('model', camera),\n sidebarCameraClusters = this.sidebarCameraClusters,\n sidebarCameras = sidebarCameraClusters.find(\n (cameraCluster) => cameraCluster.system.id == camera.belongsTo('system').id()\n )?.cameraItems,\n sidebarCamera = sidebarCameras?.find((item) => item.camera.id == camera.id);\n\n if (sidebarCamera) {\n sidebarCamera.isSelected = !sidebarCamera.isSelected;\n }\n\n if (cameraToRemove) {\n selectedCameras.removeObject(cameraToRemove);\n }\n }\n\n /**\n * Sets selectedCameras to appropriate value when camera is dropped.\n */\n @action\n onDrop(): Slot[] {\n // Get all camera slot elements (minus the drag mirror), then filter out the slots that are empty, then set selectedCameras to the resulting array.\n this.selectedCameras = Array.from(document.querySelectorAll('.camera-slot'))\n .filter((el) => !el.parentElement?.classList.contains('gu-mirror'))\n .reduce((arr: Slot[], el, index) => {\n const cameraId = el.getAttribute('data-camera-id')!;\n\n if (cameraId !== '0') {\n arr.push({ model: this.cameras.findBy('id', cameraId), index });\n }\n\n return arr;\n }, []);\n\n return [];\n }\n\n /**\n * Sets up page after data loaded.\n */\n @action\n onDataLoaded({ cameraGroup, cameras, systems, videoStreamingPermissions }: EditCameraGroupModel): void {\n // Update base component state properties.\n this.cameraGroup = cameraGroup;\n this.cameras = cameras;\n this.systems = isArray(systems) ? systems : [systems];\n this.disableEditCameraGroups = !videoStreamingPermissions.canEditCameraGroups;\n\n // I tried to make this part of the template view-container model, so that this would be resolved during load and we could avoid this\n // `dataLoaded` action all together, but it broke the action-buttons shouldGoBackAfterAction.\n (async () => {\n const orderedCameras = await this.cameraGroup.orderedCameras;\n this.selectedCameras = orderedCameras.map((model, index) => ({ model, index }));\n })();\n }\n\n /**\n * Initiates polling.\n */\n @action\n startPolling(): void {\n if (!this.pollingStarted) {\n this.pollingStarted = true;\n\n (async () => {\n const snapshotIds = this.cameras.mapBy('id'),\n idsToPoll = await this.getSnapshots.perform(snapshotIds);\n\n if (idsToPoll.length) {\n const pollingSuccessful = await this.snapshotPoller.poll.perform(true, idsToPoll);\n\n if (!pollingSuccessful) {\n this.pollingError = true;\n }\n }\n })();\n }\n }\n\n /**\n * Changes the select cameras instruction text depending on whether the sidebar is to the right of the page layout view or below it.\n */\n @action\n adjustSelectCamerasText(el: HTMLDivElement): void {\n this.selectCamerasInstructionText = this.intl.tc(\n this,\n el.clientWidth >= MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW\n ? 'dragCamerasDescription'\n : 'selectCamerasDescription'\n );\n }\n\n // endregion\n\n /**\n * Used in the later() call in getSnapshots\n */\n callSnapshotTask(idsToPoll: string[]): void {\n this.getSnapshots.perform(idsToPoll);\n }\n\n /**\n * Gets snapshots.\n */\n getSnapshots = task(async (ids: string[]) => {\n const { store, snapshots, pollingError } = this,\n idsToPoll: string[] = [];\n\n ids.forEach((id) => {\n const snapshot = snapshots.findBy('id', id),\n snapshotFromStore: Snapshot | null = store.peekRecord('video/snapshot', id);\n\n // If we didn't get the snapshot yet, add to next poll\n if (!snapshotFromStore) {\n idsToPoll.push(id);\n }\n\n // If we haven't added this snapshot to the snapshots property yet, put it in\n if (!snapshot && snapshotFromStore) {\n snapshots.push(snapshotFromStore);\n }\n\n // If we need to update the snapshot with the record, do that\n if (snapshotFromStore && snapshot) {\n snapshots[snapshots.indexOf(snapshot)] = snapshotFromStore;\n }\n });\n\n this.snapshots = snapshots;\n\n // Update the DOM.\n await updateSnapshots.call(this);\n\n // Poll if necessary.\n if (idsToPoll.length && !pollingError) {\n // Do not copy this deprecated usage. If you see this, please fix.\n // eslint-disable-next-line ember/no-runloop\n later(this, this.callSnapshotTask, idsToPoll, POLL_WAIT_TIME_MS);\n }\n\n return idsToPoll;\n });\n\n /**\n * Determines the height and width for the camera slots in order to maintain aspect ratio.\n */\n @action resizeCameraSlots(el: HTMLDivElement) {\n const availableSpace = Array.from(el.querySelectorAll('.edit-camera-order'));\n if (!availableSpace.length) {\n return;\n }\n\n const [{ clientHeight: availableHeight, clientWidth: availableWidth }] = availableSpace,\n horizontalPadding = 32,\n verticalPadding = 8;\n\n let desiredSlotWidth, desiredSlotHeight;\n\n if (el.clientWidth >= MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW) {\n // The cameras are displaying in a 2x2 grid, so use the entire width available.\n // The width for one camera slot is half the available width since two cameras must fit in the space\n // minus twice the vertical padding because each camera needs padding.\n desiredSlotWidth = availableWidth / 2 - verticalPadding * 2;\n desiredSlotHeight = desiredSlotWidth / HdAspectRatio;\n } else {\n // The cameras are displaying in a 1x4 grid.\n const preRatioSlotHeight = availableHeight - horizontalPadding,\n preRatioSlotWidth = availableWidth - verticalPadding;\n // If the user would have to scroll to view a single camera slot,\n // then shrink the width, so that the height of one entire camera slot is visible without scrolling.\n desiredSlotWidth =\n preRatioSlotWidth / HdAspectRatio > preRatioSlotHeight\n ? preRatioSlotHeight * HdAspectRatio\n : preRatioSlotWidth;\n desiredSlotHeight = desiredSlotWidth / HdAspectRatio;\n }\n\n this.cameraSlotStyle = htmlSafe(`height: ${desiredSlotHeight}px; width: ${desiredSlotWidth}px;`);\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::EditCameraGroup': typeof EditCameraGroup;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n \\n {{#if @isReordering}}\\n \\n {{else}}\\n \\n {{/if}}\\n\\n

{{@model.name}}

\\n

{{t \\'generic.video.camerasSelected\\' num=this.numCameras}}

\\n \\n\\n {{#if this.showCameraRows}}\\n {{#each this.cameraRows as |cameraRow|}}\\n
\\n
\\n \\n

{{if cameraRow.supportsLiveView cameraRow.description (tc this \\\"appOnlyDescription\\\" description=cameraRow.description)}}

\\n\\n {{#if this.isEnterprise}}\\n {{!-- @glint-expect-error system is async, so we need to await and use get here, please fix this. --}}\\n

{{concat \\'(\\' cameraRow.system.description \\')\\'}}

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

{{cameraRow.deviceModel}}

\\n \\n\\n
\\n {{#unless this.isAllCamerasGroup}}\\n \\n {{/unless}}\\n
\\n
\\n
\\n {{/each}}\\n {{/if}}\\n
\",{ moduleName: \"customer-site/components/video/manage-camera-groups/camera-group-row/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { isDestroyed } from '@adc/ember-utils/utils/ember-helpers';\nimport { computed, action } from '@ember/object';\nimport { alias, and, not, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { AllCameras as AllCamerasGroup } from 'customer-site/enums/CameraGroupType';\nimport { intlPath } from '@adc/i18n/path';\nimport { DeleteActionItem, EditActionItem } from '@adc/ui-components/utils/action-item';\n\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type CameraGroup from 'customer-site/models/video/camera-group';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type ContextManager from 'customer-site/services/context-manager';\n\n/**\n * Arguments for the CameraGroupRowArgs component.\n */\ninterface CameraGroupRowArgs {\n model: CameraGroup;\n isReordering: boolean;\n canEditCameraGroups: boolean;\n editCameraGroup: (cameraGroup: CameraGroup) => void;\n deleteCameraGroup: (cameraGroup: CameraGroup) => void;\n deleteCameraFromGroup: (cameraGroup: CameraGroup, camera: Camera) => void;\n}\n\n/**\n * @classdesc\n *\n * Component representing a camera group row on the manage camera groups page.\n */\n@intlPath({ path: 'video/manage-camera-groups/camera-group-row' })\nexport default class CameraGroupRow extends Component {\n @service declare contextManager: ContextManager;\n @service declare intl: ADCIntlService;\n\n @alias('args.model')\n declare cameraGroup: CameraGroup;\n\n /**\n * Whether the row is expanded to show the cameras in the camera group.\n */\n @tracked isExpanded = false;\n\n /**\n * A promise array that stores the list of ordered cameras from the model.\n */\n @tracked cameraRows: Camera[] | null = null;\n\n /**\n * Does the user have read/write access for camera groups?\n */\n canEditCameraGroups = true;\n\n /**\n * The number of cameras in the group. Have to do this to prevent fetch.\n */\n @computed('cameraGroup.cameras.[]')\n get numCameras(): number {\n return this.cameraGroup.hasMany('cameras').ids().length;\n }\n\n /**\n * Whether the camera rows should be shown.\n */\n @and('isExpanded', 'notReordering')\n declare showCameraRows: boolean;\n\n /**\n * If we are not reordering.\n */\n @not('args.isReordering')\n declare notReordering: boolean;\n\n /**\n * Whether the group only has one camera.\n */\n @equal('numCameras', 1)\n declare hasOneCamera: boolean;\n\n /**\n * Are the edit and delete buttons disabled for this row?\n */\n @computed('args.{canEditCameraGroups,isReordering}', 'isAllCamerasGroup')\n get editDisabled(): boolean {\n const { isReordering, canEditCameraGroups } = this.args;\n return isReordering || !canEditCameraGroups || this.isAllCamerasGroup;\n }\n\n /**\n * Whether we are in enterprise context.\n */\n @alias('contextManager.identityModel.isEnterprise')\n declare isEnterprise: boolean;\n\n /**\n * Toggles whether the row is expanded.\n */\n @action toggleExpanded(): void {\n // Had to move this here from init because it was making a network call for the cameras.\n if (!this.isExpanded && !this.cameraRows) {\n this.cameraGroup.orderedCameras.then((cameras) => {\n this.cameraRows = cameras;\n this.isExpanded = true;\n });\n } else {\n this.isExpanded = !this.isExpanded;\n }\n }\n\n /**\n * Checks if the group type is \"all cameras\".\n */\n @computed('cameraGroup.groupType')\n get isAllCamerasGroup(): boolean {\n return this.cameraGroup.groupType === AllCamerasGroup;\n }\n\n /**\n * Deletes camera from camera group.\n */\n @action deleteCamera(camera: Camera): void {\n this.args.deleteCameraFromGroup(this.cameraGroup, camera);\n this.cameraRows && this.cameraRows.removeObject(camera);\n }\n\n /**\n * Group Delete/Edit action items\n *\n * @param model - the camera group to gather action items for\n */\n @action getActionItems(model: CameraGroup): EditActionItem[] {\n if (!model || isDestroyed(model) || this.isAllCamerasGroup) {\n return [];\n }\n\n return [\n // Transitions to edit page for camera group.\n EditActionItem.create({ disabled: this.editDisabled, action: () => this.args.editCameraGroup(model) }),\n // Deletes camera group.\n DeleteActionItem.create({ disabled: this.editDisabled, action: () => this.args.deleteCameraGroup(model) })\n ];\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::ManageCameraGroups::CameraGroupRow': typeof CameraGroupRow;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{! @glint-nocheck: Convert to PageView and document @model parameter please. }}\\n\\n \\n {{#each this.toolbarButtons as |btn|}}\\n \\n {{/each}}\\n \\n\\n \\n \\n\\n \\n {{#if this.sortedCameraGroups}}\\n \\n \\n {{#each this.sortedCameraGroups as |cameraGroup|}}\\n \\n {{/each}}\\n \\n \\n {{else}}\\n {{tc this \\'noCameraGroups\\'}}\\n {{/if}}\\n \\n\\n \\n\\n \\n \\n\\n\",{ moduleName: \"customer-site/components/video/manage-camera-groups/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 { equal, sort } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport { all } from 'rsvp';\nimport { updateCameraOrderFromCameras } from '../../../models/video/camera-group';\n\nimport type CameraGroup from '../../../models/video/camera-group';\nimport './_style.scss';\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type NotificationService from '@adc/ui-components/services/notification-manager';\nimport type Camera from 'customer-site/models/video/devices/camera';\nimport type VideoStreamingPermissionsCollection from 'customer-site/models/video/permissions/video-streaming-permissions-collection';\nimport type ContextManager from 'customer-site/services/context-manager';\nimport type { ModelFrom } from 'customer-site/utils/type-utils';\nimport type Route from 'customer-site/video/camera-groups/base-objects/base-camera-groups-route';\n\n/**\n * Arguments for the ManageCameraGroups component.\n */\ninterface ManageCameraGroupsArgs {\n editCameraGroupTransitionFn: (id: string) => void;\n model: ModelFrom;\n}\n\n/**\n * Data model properties for the ManageCameraGroups component.\n */\ninterface ManageCameraGroupsData {\n cameraGroups: CameraGroup[];\n videoStreamingPermissions: VideoStreamingPermissionsCollection;\n}\n\n/**\n * Representation of a ManageCameraGroups toolbar button\n */\ninterface ManageCameraGroupToolbarButton {\n action: () => void | Promise;\n text: string;\n primary: boolean;\n isDisabled: boolean;\n}\n\n/**\n * Deletes a camera group.\n *\n * @param cameraGroup The camera group to delete.\n */\nasync function deleteCameraGroup(this: ManageCameraGroups, cameraGroup: CameraGroup) {\n const notificationManager = this.notificationManager;\n\n await cameraGroup.destroyRecord();\n notificationManager.addSuccess(this.intl.tc(this, 'deleteSuccess'));\n}\n\n/**\n * Component for managing saved camera groups.\n */\n@intlPath({ path: 'video/manage-camera-groups' })\nexport default class ManageCameraGroups extends Component {\n @service declare contextManager: ContextManager;\n @service declare notificationManager: NotificationService;\n @service declare intl: ADCIntlService;\n\n /**\n * Required to sort camera groups\n *\n * @ignore\n */\n @computed()\n get cameraGroupsSorting(): string[] {\n return ['order'];\n }\n\n /**\n * Camera groups for the unit/system group. Set in the dataLoaded action.\n */\n @tracked cameraGroups: CameraGroup[] | null = null;\n\n /**\n * Can the current user edit camera groups?\n */\n @tracked canEditCameraGroups = false;\n\n /**\n * The camera groups to display, in sorted order.\n */\n @sort('cameraGroups', 'cameraGroupsSorting')\n declare sortedCameraGroups: CameraGroup[];\n\n /**\n * Are there no camera groups?\n **/\n @equal('cameraGroups.length', 0)\n declare noCameraGroups: boolean;\n\n /**\n * Buttons to display in route toolbar.\n */\n @computed('cameraGroups.[]', 'dataLoaded', 'isReordering', 'startReorder')\n get toolbarButtons(): ManageCameraGroupToolbarButton[] {\n if (!this.dataLoaded) {\n return [];\n }\n\n const { isReordering, canEditCameraGroups } = this,\n buttons = !isReordering\n ? // action, text, isPrimary, isDisabled\n [[() => this.createCameraGroup(), 'video.cameraGroups.newCameraGroup', true, !canEditCameraGroups]]\n : [\n [() => this.cancelReorder(), 'cancel', false, !canEditCameraGroups],\n [() => this.saveReorder(), 'save', true, !canEditCameraGroups]\n ];\n\n // If there are camera groups, add reorder button.\n if (!isReordering && this.cameraGroups?.length) {\n buttons.unshift([() => this.startReorder(), 'reorder', false, !canEditCameraGroups]);\n }\n\n // Map buttons to button configurations.\n return buttons.map(\n ([action, text, primary, isDisabled]) =>\n ({\n primary,\n action,\n isDisabled,\n text: this.intl.t(`generic.${text}`)\n } as ManageCameraGroupToolbarButton)\n );\n }\n\n /**\n * The config for dragula.\n */\n @computed('isReordering')\n get dragulaConfig(): any {\n return {\n options: {\n copy: false,\n direction: 'vertical',\n revertOnSpill: false,\n removeOnSpill: false,\n mirrorContainer: document.querySelector('.camera-groups-wrap'),\n\n // Only allow drag if currently in reorder mode AND click was within the drag handle.\n moves: (_el: Element, _source: Element, handle: Element) => {\n return this.isReordering && handle.classList.contains('handle');\n }\n }\n };\n }\n\n /**\n * Whether the async data has been loaded yet.\n */\n @tracked dataLoaded = false;\n\n /**\n * Are the camera groups being reordered?\n */\n @tracked isReordering = false;\n\n /**\n * Transitions to edit camera group page.\n */\n @action editCameraGroup(cameraGroup: CameraGroup): void {\n this.args.editCameraGroupTransitionFn(cameraGroup.id);\n }\n\n /**\n * Deletes camera group.\n *\n * @param cameraGroup The camera group to delete.\n */\n @action async deleteCameraGroup(cameraGroup: CameraGroup): Promise {\n await deleteCameraGroup.call(this, cameraGroup);\n }\n\n /**\n * Deletes a camera from a camera group.\n */\n @action async deleteCamera(cameraGroup: CameraGroup, cameraToDelete: Camera): Promise {\n if (!this.canEditCameraGroups) {\n return;\n }\n\n if (cameraGroup.get('cameras').length === 1) {\n deleteCameraGroup.call(this, cameraGroup);\n return;\n }\n\n const notificationManager = this.notificationManager;\n\n cameraGroup.set(\n 'cameras',\n cameraGroup.cameras.filter((camera) => camera.id !== cameraToDelete.id)\n );\n\n updateCameraOrderFromCameras(cameraGroup);\n\n await cameraGroup.save();\n notificationManager.addSuccess(this.intl.tc(this, 'deleteCameraSuccess'));\n }\n\n /**\n * Transitions to create camera group page.\n */\n @action createCameraGroup(): void {\n this.args.editCameraGroupTransitionFn('new');\n }\n\n /**\n * Starts camera group reordering.\n */\n @action startReorder(): void {\n this.isReordering = true;\n }\n\n /**\n * Cancels any changes from the current reorder operation.\n */\n @action cancelReorder(): void {\n // Get map of camera group item nodes (by model ID).\n const container = document.querySelector('.camera-groups-wrap .camera-groups-host');\n\n if (container) {\n const nodes = [...container.children].reduce((map: Map, el: Element) => {\n map.set(el?.querySelector('p')?.getAttribute('data-camera-group-id') as string, el);\n return map;\n }, new Map());\n\n // Iterate camera group models and append to container.\n this.sortedCameraGroups.forEach((cameraGroup) =>\n container.appendChild(nodes.get(cameraGroup.id) as Element)\n );\n }\n\n this.isReordering = false;\n }\n\n /**\n * Saves the current camera groups order.\n */\n @action saveReorder(): void {\n const notificationManager = this.notificationManager,\n cameraGroups = this.cameraGroups;\n\n if (!cameraGroups) {\n return;\n }\n\n // Iterate camera group rows and update sort order.\n Array.from(document.querySelectorAll('.camera-groups-wrap .list-row-item')).forEach(\n (el: Element, idx: number) =>\n cameraGroups\n ?.findBy('id', el?.querySelector('p')?.getAttribute('data-camera-group-id') as string)\n ?.set('order', idx)\n );\n\n // Save dirty models.\n all(cameraGroups.filterBy('hasDirtyAttributes').map((cameraGroup) => cameraGroup.save())).then(() =>\n notificationManager.addSuccess(this.intl.tc(this, 'orderSaved'))\n );\n\n // Return from reordering display\n this.isReordering = false;\n }\n\n /**\n * Sets things up once camera groups loaded.\n */\n @action onDataLoaded({ cameraGroups, videoStreamingPermissions }: ManageCameraGroupsData): void {\n this.cameraGroups = cameraGroups;\n this.canEditCameraGroups = videoStreamingPermissions.canEditCameraGroups;\n this.dataLoaded = true;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::ManageCameraGroups': typeof ManageCameraGroups;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"
\\n
\\n \\n

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

\\n
\\n
\",{ moduleName: \"customer-site/components/video/svr-indicator/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport templateOnlyComponent from '@ember/component/template-only';\n\nimport './_style.scss';\n\nexport interface SvrIndicatorSignature {\n Element: HTMLDivElement;\n}\n\nconst SvrIndicator = templateOnlyComponent();\nexport default SvrIndicator;\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::SvrIndicator': typeof SvrIndicator;\n }\n}\n","import requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport { secondsInHour } from \"../constants/index.js\";\n/**\n * @name hoursToSeconds\n * @category Conversion Helpers\n * @summary Convert hours to seconds.\n *\n * @description\n * Convert a number of hours to a full number of seconds.\n *\n * @param {number} hours - number of hours to be converted\n *\n * @returns {number} the number of hours converted in seconds\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Convert 2 hours to seconds:\n * const result = hoursToSeconds(2)\n * //=> 7200\n */\n\nexport default function hoursToSeconds(hours) {\n requiredArgs(1, arguments);\n return Math.floor(hours * secondsInHour);\n}","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n {{#each this.thumbnailInfos as |thumbnailInfo index|}}\\n \\n {{#if (this.hasImageLoaded index)}}\\n {{#let (eq this.shownOverlayIndex index) as |isVisible|}}\\n
\\n
\\n {{thumbnailInfo.timestampText}}\\n
\\n \\n {{#if @canDrillIntoThumbnails}}\\n \\n {{/if}}\\n
\\n {{/let}}\\n {{/if}}\\n \\n {{/each}}\\n\",{ moduleName: \"customer-site/components/video/thumbnail-search/thumbnail-grid/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport './_style.scss';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport {\n isArrowCode,\n ARROW_UP_CODE,\n ARROW_DOWN_CODE,\n ARROW_RIGHT_CODE,\n ARROW_LEFT_CODE\n} from '@adc/ember-utils/utils/a11y';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { restartableTask, timeout } from 'ember-concurrency';\nimport { EmberSDCard } from 'customer-site/enums/CustomerPageUrl';\nimport { ThumbnailSearchToTimeline } from 'customer-site/enums/TrackedEvent';\nimport { getContextAwareSvrTimelinePage } from 'customer-site/video/svr-timeline/route';\nimport { intlPath } from '@adc/i18n/path';\nimport { addSeconds, format } from 'date-fns';\nimport { utcToZonedTime } from 'date-fns-tz';\n\nimport type LocaleService from '@adc/app-infrastructure/services/locale';\nimport type AjaxService from 'customer-site/services/ajax';\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';\n\ninterface ThumbnailGridSignature {\n Args: {\n baseUrl: string;\n startTimeUtc: Date;\n timeSpanSeconds: number;\n gridSize: number;\n isSdCard: boolean;\n canDrillIntoThumbnails: boolean;\n drillIntoThumbnail: (thumbnailDate: Date) => void;\n cameraId: string;\n };\n}\n\n/**\n * Interface containing the information we need to display each thumbnail\n */\ninterface ThumbnailInfo {\n url: Promise;\n datetimeUtc: Date;\n timestampText: string;\n}\n\n/**\n * How long do we debounce updating thumbnails?\n */\nconst ThumbnailDebounceTimeMs = 250;\n\n@intlPath({ path: 'video/thumbnail-search/thumbnail-grid' })\nexport default class VideoThumbnailSearchThumbnailGridComponent extends Component {\n @service declare ajax: AjaxService;\n @service declare navigation: NavigationService;\n @service declare stats: Stats;\n @service declare identityManager: IdentityManager;\n @service declare locale: LocaleService;\n\n /**\n * Set that contains all the indexs of the images have loaded.\n */\n @tracked loadedImageIndices: Set = new Set();\n\n /**\n * Array of information needed to display each thumbnail.\n */\n @tracked thumbnailInfos: ThumbnailInfo[] = [];\n\n /**\n * The size of the grid we're displaying. This is used to tell the hbs/css how many thumbnails to show on each row.\n * Will usually be the same as args.gridSize, but kept as a seperate variable for debouncing purposes.\n */\n @tracked displayGridSize: number;\n\n /**\n * Index of the thumbnail whose overlay is showing.\n */\n @tracked shownOverlayIndex: number | undefined;\n\n constructor(owner: unknown, args: ThumbnailGridSignature['Args']) {\n super(owner, args);\n this.displayGridSize = args.gridSize;\n }\n\n /**\n * Total amount of thumbnails shown.\n */\n get totalThumbnails(): number {\n const { gridSize } = this.args;\n return gridSize * gridSize;\n }\n\n /**\n * Interval in seconds between each thumbnail.\n */\n get intervalSeconds(): number {\n const { totalThumbnails } = this,\n { timeSpanSeconds } = this.args;\n return timeSpanSeconds / (totalThumbnails - 1);\n }\n\n /**\n * Gets the enum assosiated with the timeline page thumbnail search redirects to.\n */\n get timelineRouteId(): number {\n const { isSdCard } = this.args;\n if (isSdCard) {\n return EmberSDCard;\n }\n\n return getContextAwareSvrTimelinePage(this.identityManager.isEnterprise);\n }\n\n /**\n * Task that handeles updating the display/thumbnails shown when component props change.\n */\n handleArgsChange = restartableTask(async () => {\n // debounce any changes\n await timeout(ThumbnailDebounceTimeMs);\n\n this.displayGridSize = this.args.gridSize;\n this.getThumbnailInfoList();\n this.loadedImageIndices = new Set();\n });\n\n /**\n * Method that sets thumbnailInfos according to the arguments passed to this component.\n */\n async getThumbnailInfoList(): Promise {\n const { totalThumbnails, intervalSeconds } = this;\n const thumbnailInfos = [];\n\n const { baseUrl, isSdCard, startTimeUtc, timeSpanSeconds } = this.args;\n // if this is a SD card carmera, we need to make the inital call to load the thumbnails\n let preloadPromise: Promise = Promise.resolve();\n if (isSdCard) {\n // make initial call here.\n const preloadUrl = new URL(baseUrl);\n preloadUrl.searchParams.append('start', startTimeUtc.toISOString());\n preloadUrl.searchParams.append('end', addSeconds(startTimeUtc, timeSpanSeconds).toISOString());\n preloadUrl.searchParams.append('interval', (intervalSeconds / 60).toString());\n preloadPromise = this.ajax.request(preloadUrl.toString(), undefined, undefined, 'POST', false);\n }\n for (let i = 0; i < totalThumbnails; i++) {\n const thumbnailUrl = new URL(baseUrl);\n const thumbnailTime = addSeconds(startTimeUtc, i * intervalSeconds);\n thumbnailUrl.searchParams.append('start', thumbnailTime.toISOString());\n thumbnailUrl.searchParams.append('interval', (intervalSeconds / 60).toString());\n const thumbnailUrlPromise = preloadPromise.then(() => thumbnailUrl.toString());\n\n thumbnailInfos.push({\n url: thumbnailUrlPromise,\n datetimeUtc: thumbnailTime,\n timestampText: this.formatDate(thumbnailTime)\n });\n }\n\n this.thumbnailInfos = thumbnailInfos;\n }\n\n /**\n * Method for formatting a date time into the format used for the overlay timestamp.\n * @param dateUtc time to format in utc.\n * @returns formatted timestamp.\n */\n formatDate(dateUtc: Date): string {\n const { timeZone } = this.locale;\n return format(utcToZonedTime(dateUtc, timeZone), 'yyyy-MM-dd HH:mm:ss');\n }\n\n /**\n * Action that redirects to the video timeline with the correct camera and start time set.\n * @param startTime Start time on timeline after redirect.\n */\n @action goToTimeline(startTime: Date): void {\n const { args, timelineRouteId } = this,\n { cameraId } = args;\n\n this.stats.logEvent(ThumbnailSearchToTimeline);\n this.navigation.transitionToRouteId(timelineRouteId, {\n queryParams: { cameraId, startTime }\n });\n }\n\n /**\n * Method that runs when we successfully load a thumbnail.\n * @param index Index of the image that loaded in thumbnailInfos\n */\n @action onImageLoad(index: number): void {\n this.loadedImageIndices = this.loadedImageIndices.add(index);\n }\n\n /**\n * Method that checks if a thumbnail has been loaded.\n * @param index index of the thumbnail in thumbnailInfos that we're checking\n * @returns true if an image has loaded, false otherwise.\n */\n @action\n hasImageLoaded(index: number): boolean {\n return this.loadedImageIndices.has(index);\n }\n\n /**\n * Action that runs when we hover over a thumbnail, used to show the overlay.\n */\n @action\n onThumbnailMouseEnter(index: number): void {\n this.shownOverlayIndex = index;\n }\n\n /**\n * Action that runs when the mouse leaves a thumbnail, used to hide the overlay.\n */\n @action\n onThumbnailMouseLeave(index: number): void {\n if (this.shownOverlayIndex === index) {\n this.shownOverlayIndex = undefined;\n }\n }\n\n /**\n * Action that runs on keypress when the thumbnail grid is focused on, used to change the shown overlay with arrow key presses.\n */\n @action\n onGridKeyPress(event: KeyboardEvent): void {\n const { key } = event;\n const { displayGridSize, shownOverlayIndex, locale, loadedImageIndices } = this;\n const horizontalIncrement = locale.isRtl ? -1 : 1;\n if (!isArrowCode(key)) {\n return;\n }\n if (shownOverlayIndex === undefined) {\n this.shownOverlayIndex = Math.min(...loadedImageIndices);\n return;\n }\n let newShownOverlayRow = Math.floor(shownOverlayIndex / displayGridSize);\n let newShownOverlayColumn = shownOverlayIndex % displayGridSize;\n switch (key) {\n case ARROW_UP_CODE:\n newShownOverlayRow = (newShownOverlayRow - 1 + displayGridSize) % displayGridSize;\n break;\n case ARROW_DOWN_CODE:\n newShownOverlayRow = (newShownOverlayRow + 1) % displayGridSize;\n break;\n case ARROW_RIGHT_CODE:\n newShownOverlayColumn =\n (newShownOverlayColumn + horizontalIncrement + displayGridSize) % displayGridSize;\n break;\n case ARROW_LEFT_CODE:\n newShownOverlayColumn =\n (newShownOverlayColumn - horizontalIncrement + displayGridSize) % displayGridSize;\n break;\n default:\n return;\n }\n\n const newShownOverlayIndex = newShownOverlayRow * displayGridSize + newShownOverlayColumn;\n this.shownOverlayIndex = newShownOverlayIndex;\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::ThumbnailSearch::ThumbnailGrid': typeof VideoThumbnailSearchThumbnailGridComponent;\n }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"\\n <:toolbar>\\n \\n
\\n \\n \\n
\\n
\\n \\n \\n \\n
\\n\\n
\\n
\\n \\n

\\n {{this.timespanString}}\\n

\\n \\n
\\n\\n \\n <:default as |PageViewContainer|>\\n \\n <:loading as |PageViewLoading|>\\n \\n \\n <:default as |data|>\\n \\n \\n \\n \\n
\",{ moduleName: \"customer-site/components/video/thumbnail-search/index.hbs\" })","/* import __COLOCATED_TEMPLATE__ from './index.hbs'; */\nimport './_style.scss';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { intlPath } from '@adc/i18n/path';\nimport {\n addSeconds,\n differenceInSeconds,\n hoursToSeconds,\n isAfter,\n isBefore,\n max,\n min,\n minutesToSeconds,\n subSeconds\n} from 'date-fns';\n\nimport type ADCIntlService from '@adc/i18n/services/adc-intl';\nimport type { VideoThumbnailSearchRouteModel } from 'customer-site/video/thumbnail-search/route';\n\ninterface ThumbnailSearchSignature {\n Args: { model: VideoThumbnailSearchRouteModel };\n}\n\nexport const THREE_MINUTE_SECONDS = minutesToSeconds(3);\nexport const TWENTY_FIVE_MINUTE_SECONDS = minutesToSeconds(25);\nexport const THREE_HOUR_SECONDS = hoursToSeconds(3);\nexport const ONE_DAY_SECONDS = hoursToSeconds(24);\nexport const SIXTEEN_DAYS_SECONDS = hoursToSeconds(24 * 16);\n\n@intlPath({ path: 'video/thumbnail-search' })\nexport default class VideoThumbnailSearchComponent extends Component {\n @service declare intl: ADCIntlService;\n /**\n * The height/width of the thumbnail grid.\n */\n @tracked gridSize = 4;\n\n /**\n * The currently selected time span for thumbnail search.\n */\n @tracked declare selectedTimeSpanSeconds: number;\n\n /**\n * The currently selected time for thumbnail search.\n */\n @tracked declare selectedTimeUtc: Date;\n\n /**\n * The minimum possible timespan selected for thumbnail search.\n */\n readonly minimumSpanSeconds: number;\n\n constructor(owner: unknown, args: ThumbnailSearchSignature['Args']) {\n super(owner, args);\n this.initializeSelectedTime();\n this.minimumSpanSeconds = Math.min(...this.timeSpanItems.map((item) => item.value));\n }\n\n /**\n * Sets the initial values for selectedTimeSpanSeconds and selectedTimeUtc.\n */\n initializeSelectedTime(): void {\n const { timeSpanItems, args } = this,\n { model } = args,\n { intervals, timeUtc } = model,\n { earliestRecord } = intervals;\n\n // the initial span needs to be the smaller of 24 hours or the biggest time span in the dropdown\n const initialSelectedTimeSpan = Math.min(ONE_DAY_SECONDS, Math.max(...timeSpanItems.map((item) => item.value)));\n this.selectedTimeSpanSeconds = initialSelectedTimeSpan;\n\n // the initial selected time needs to be the later of initialSelctedTime and earliestRecord\n const initialSelectedTime = subSeconds(timeUtc, initialSelectedTimeSpan);\n this.selectedTimeUtc = max([initialSelectedTime, earliestRecord]);\n }\n\n /**\n * Gets all possible timespan dropdown items that are shorter than the camera has footage for.\n */\n get timeSpanItems(): { name: string; value: number }[] {\n const { earliestRecord, latestRecord } = this.args.model.intervals;\n const items = [\n {\n nameKey: 'threeMins',\n value: THREE_MINUTE_SECONDS\n },\n {\n nameKey: 'twentyFiveMins',\n value: TWENTY_FIVE_MINUTE_SECONDS\n },\n {\n nameKey: 'threeHours',\n value: THREE_HOUR_SECONDS\n },\n {\n nameKey: 'twentyFourHours',\n value: ONE_DAY_SECONDS\n },\n {\n nameKey: 'sixteenDays',\n value: SIXTEEN_DAYS_SECONDS\n }\n ];\n\n const validItems = items.filter((item) => item.value <= differenceInSeconds(latestRecord, earliestRecord));\n\n return validItems.map(({ nameKey, value }) => ({ name: this.intl.tc(this, nameKey), value }));\n }\n\n /**\n * The time thumbnail search starts from, will be the selectedTimeUtc unless the selected\n * timespan is too large.\n */\n get searchStartTimeUtc(): Date {\n const { selectedTimeUtc, selectedTimeSpanSeconds, args } = this,\n { latestRecord } = args.model.intervals;\n if (isAfter(addSeconds(selectedTimeUtc, selectedTimeSpanSeconds), latestRecord)) {\n return subSeconds(latestRecord, selectedTimeSpanSeconds);\n }\n return selectedTimeUtc;\n }\n\n /**\n * The displayed timespan, shown in the pagination header.\n */\n get timespanString(): string {\n const timeFmt: Intl.DateTimeFormatOptions = {\n hour: 'numeric',\n minute: '2-digit'\n };\n\n const { selectedTimeSpanSeconds, searchStartTimeUtc } = this,\n dates = [searchStartTimeUtc, addSeconds(searchStartTimeUtc, selectedTimeSpanSeconds)],\n fnFormat = (dates: Date[], options: Partial): string[] => {\n return dates.map((d) => this.intl.formatDateTz(d, options));\n },\n [startDate, endDate] = fnFormat(dates, {\n day: 'numeric',\n month: 'long',\n year: 'numeric'\n }),\n [startTime, endTime] = fnFormat(dates, timeFmt);\n\n // Is this a single date range?\n if (startDate === endDate) {\n return `${startDate}, ${startTime} - ${endTime}`;\n }\n\n return `${startDate} ${startTime} - ${endDate} ${endTime}`;\n }\n\n /**\n * Can we move backwards to the previous page of thumbnails?\n */\n get moveBackDisabled(): boolean {\n const { searchStartTimeUtc, args } = this,\n { earliestRecord } = args.model.intervals;\n\n return !isAfter(searchStartTimeUtc, earliestRecord);\n }\n\n /**\n * Can we move forward to the next page of thumbnails?\n */\n get moveForwardDisabled(): boolean {\n const { selectedTimeSpanSeconds, searchStartTimeUtc, args } = this,\n { latestRecord } = args.model.intervals,\n searchEndTimeUtc = addSeconds(searchStartTimeUtc, selectedTimeSpanSeconds);\n\n return !isBefore(searchEndTimeUtc, latestRecord);\n }\n\n /**\n * Can users drill into thumbnails to refine the search?\n */\n get canDrillIntoThumbnails(): boolean {\n const { selectedTimeSpanSeconds, minimumSpanSeconds } = this;\n return minimumSpanSeconds !== selectedTimeSpanSeconds;\n }\n\n /**\n * The maximum time we can select to start thumbnails from. Will the the latest record - the smallest possible timespan\n */\n get maximumSelectedTime(): Date {\n const { minimumSpanSeconds, args } = this;\n return subSeconds(args.model.intervals.latestRecord, minimumSpanSeconds);\n }\n\n // Actions\n\n /**\n * Sets selectedTimeUtc to the newly selected time, and adjusts the selected timespan accordingly\n * @param selectedTimeUtc The newly selected time\n */\n @action onSelectedTimeChange(selectedTimeUtc: Date): void {\n const { selectedTimeSpanSeconds, args, minimumSpanSeconds } = this,\n { latestRecord } = args.model.intervals,\n secondsDifference = differenceInSeconds(latestRecord, selectedTimeUtc);\n\n if (secondsDifference < minimumSpanSeconds) {\n return;\n }\n\n this.selectedTimeUtc = selectedTimeUtc;\n // If the current timespan is too large, change it to the largest one that fits the available footage.\n if (isAfter(addSeconds(selectedTimeUtc, selectedTimeSpanSeconds), latestRecord)) {\n this.selectedTimeSpanSeconds = this.getNextSmallestTimespan(secondsDifference);\n }\n }\n\n /**\n * Moves forward to the next page of thumbnails.\n */\n @action\n moveBack(): void {\n const { searchStartTimeUtc, selectedTimeSpanSeconds, args } = this,\n { earliestRecord } = args.model.intervals;\n\n // Move back either selectedTimeSpanSeconds seconds, or until the selected time is the earliest record.\n this.selectedTimeUtc = max([subSeconds(searchStartTimeUtc, selectedTimeSpanSeconds), earliestRecord]);\n }\n\n /**\n * Moves backwards to the previous page of thumbnails.\n */\n @action\n moveForward(): void {\n const { searchStartTimeUtc, selectedTimeSpanSeconds, args } = this,\n { latestRecord } = args.model.intervals;\n\n // Move forward either selectedTimeSpanSeconds seconds, or until the end time is the latest record.\n this.selectedTimeUtc = min([\n addSeconds(searchStartTimeUtc, selectedTimeSpanSeconds),\n subSeconds(latestRecord, selectedTimeSpanSeconds)\n ]);\n }\n\n /**\n * Action that centers the thumbnail search around a given time.\n */\n @action\n drillIntoThumbnail(thumbnailTime: Date): void {\n const { args, selectedTimeSpanSeconds } = this,\n newTimeSpanSeconds = this.getNextSmallestTimespan(selectedTimeSpanSeconds);\n\n if (!newTimeSpanSeconds) {\n return;\n }\n\n this.selectedTimeSpanSeconds = newTimeSpanSeconds;\n this.selectedTimeUtc = max([\n args.model.intervals.earliestRecord,\n subSeconds(thumbnailTime, newTimeSpanSeconds / 2)\n ]);\n }\n\n /**\n * Gets the largest timespan option smaller than the passed timespan.\n * @param timespanSeconds A number representing a timespan in seconds\n * @returns The largest timespan option smaller than timespanSeconds\n */\n private getNextSmallestTimespan(timespanSeconds: number): number {\n const { timeSpanItems } = this;\n return Math.max(...timeSpanItems.map((item) => item.value).filter((span) => span < timespanSeconds));\n }\n}\n\ndeclare module '@glint/environment-ember-loose/registry' {\n export default interface Registry {\n 'Video::ThumbnailSearch': typeof VideoThumbnailSearchComponent;\n }\n}\n","import Controller from '@ember/controller';\n\nimport type { VideoThumbnailSearchRouteModel } from './route';\n\nexport default class VideoThumbnailSearchController extends Controller {\n declare model: VideoThumbnailSearchRouteModel;\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/thumbnail-search': VideoThumbnailSearchController;\n }\n}\n","import Helper from \"@ember/component/helper\";\nimport { getOwner } from \"@ember/application\";\n\nexport function hrefTo(routing, params) {\n return routing.generateURL(...getParamsForGenerateURL(params));\n}\n\nfunction getParamsForGenerateURL(params) {\n params = params.slice(); // create a copy\n let targetRouteName = params.shift(); // the first param is always the target route name\n let lastParam = params[params.length - 1]; // the last param might be queryParams\n let queryParams;\n if (lastParam && lastParam.isQueryParams) {\n queryParams = params.pop().values;\n } else {\n queryParams = {};\n }\n let models = params; // the remainder are the models\n return [targetRouteName, models, queryParams];\n}\n\nexport default class HrefToHelper extends Helper {\n get routing() {\n return getOwner(this).lookup(\"service:-routing\");\n }\n\n get router() {\n return getOwner(this).lookup(\"service:router\");\n }\n\n init() {\n super.init();\n\n if (this.router && this.router.on) { // skip if the router service is mocked\n this.router.on(\"routeDidChange\", this.recompute.bind(this));\n }\n }\n\n compute(params, namedArgs) {\n if (namedArgs.params) {\n return hrefTo(this.routing, namedArgs.params);\n } else {\n return hrefTo(this.routing, params);\n }\n }\n}\n","var _class, _descriptor;\nfunction _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\nfunction _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\nimport Helper from '@ember/component/helper';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nlet FormatNumberHelper = (_class = class FormatNumberHelper extends Helper {\n constructor() {\n // eslint-disable-next-line prefer-rest-params\n super(...arguments);\n\n // @ts-expect-error: Property 'onLocaleChanged' is private and only accessible within class 'IntlService'.\n _initializerDefineProperty(this, \"intl\", _descriptor, this);\n _defineProperty(this, \"allowEmpty\", false);\n this.intl.onLocaleChanged(this.recompute, this);\n }\n compute([value, positionalOptions], namedOptions) {\n const options = positionalOptions ? Object.assign({}, positionalOptions, namedOptions) : namedOptions;\n if (isEmpty(value)) {\n if (options?.allowEmpty ?? this.allowEmpty) {\n return '';\n }\n if (typeof value === 'undefined') {\n throw new Error('{{format-number}} helper requires a value.');\n }\n }\n return this.intl.formatNumber(value, options);\n }\n}, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"intl\", [service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _class);\nexport { FormatNumberHelper as default };","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nimport toDate from \"../toDate/index.js\";\nimport setMonth from \"../setMonth/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n\n/**\n * @name set\n * @category Common Helpers\n * @summary Set date values to a given date.\n *\n * @description\n * Set date values to a given date.\n *\n * Sets time values to date from object `values`.\n * A value is not set if it is undefined or null or doesn't exist in `values`.\n *\n * Note about bundle size: `set` does not internally use `setX` functions from date-fns but instead opts\n * to use native `Date#setX` methods. If you use this function, you may not want to include the\n * other `setX` functions that date-fns provides if you are concerned about the bundle size.\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Object} values - an object with options\n * @param {Number} [values.year] - the number of years to be set\n * @param {Number} [values.month] - the number of months to be set\n * @param {Number} [values.date] - the number of days to be set\n * @param {Number} [values.hours] - the number of hours to be set\n * @param {Number} [values.minutes] - the number of minutes to be set\n * @param {Number} [values.seconds] - the number of seconds to be set\n * @param {Number} [values.milliseconds] - the number of milliseconds to be set\n * @returns {Date} the new date with options set\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `values` must be an object\n *\n * @example\n * // Transform 1 September 2014 into 20 October 2015 in a single line:\n * const result = set(new Date(2014, 8, 20), { year: 2015, month: 9, date: 20 })\n * //=> Tue Oct 20 2015 00:00:00\n *\n * @example\n * // Set 12 PM to 1 September 2014 01:23:45 to 1 September 2014 12:00:00:\n * const result = set(new Date(2014, 8, 1, 1, 23, 45), { hours: 12 })\n * //=> Mon Sep 01 2014 12:23:45\n */\nexport default function set(dirtyDate, values) {\n requiredArgs(2, arguments);\n\n if (_typeof(values) !== 'object' || values === null) {\n throw new RangeError('values parameter must be an object');\n }\n\n var date = toDate(dirtyDate); // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n\n if (isNaN(date.getTime())) {\n return new Date(NaN);\n }\n\n if (values.year != null) {\n date.setFullYear(values.year);\n }\n\n if (values.month != null) {\n date = setMonth(date, values.month);\n }\n\n if (values.date != null) {\n date.setDate(toInteger(values.date));\n }\n\n if (values.hours != null) {\n date.setHours(toInteger(values.hours));\n }\n\n if (values.minutes != null) {\n date.setMinutes(toInteger(values.minutes));\n }\n\n if (values.seconds != null) {\n date.setSeconds(toInteger(values.seconds));\n }\n\n if (values.milliseconds != null) {\n date.setMilliseconds(toInteger(values.milliseconds));\n }\n\n return date;\n}"],"names":["createTemplateFactory","scope","filtersFilterPanel_","ActivityFilterPanel","templateOnlyComponent","setComponentTemplate","TEMPLATE","t_","buttonSimple_","coalesce_","t_0","on","FiltersNoResults","MotionSearchFilterPanel","filtersDateTimeRangeFilter_","buttonIcon_","guidFor_","simpleBinary_","not_","tc_","videoAdvancedVideoSearchMotionSearchFilterPanel_","activityFilterPanel_","actionButtons_","VideoAdvancedVideoSearchFilterBar","_dec","intlPath","path","_dec2","computed","_dec3","_dec4","_class2","Component","constructor","arguments","_initializerDefineProperty","_descriptor","_descriptor2","_defineProperty","Date","dateTimeRangeFilter","this","args","filterValues","intl","timeZone","startDate","endDate","DateRangeFilter","t","DateFilter","value","defaultValue","minimumDate","earliestRecord","maximumDate","maxDate","apply","setDates","hasAppliedFilters","enabledFilterManagers","isAny","hideClearMotionButton","motionSearchFiltersManager","disabled","userHasDrawnMotionArea","dates","applyFilters","queryParams","_objectSpread","submitSearch","requestModel","createRequestModelData","resetFilters","timeInterval","next","activityFiltersManager","toggleDisableState","toggleActivityFilter","activitySearchDisabled","setActivitySearchVisibility","toggleMotionFilter","getActivityModelRelationships","appliedFilters","reduce","data","filter","filteringFieldName","getMotionSearchModelRelationships","_this$args$filterValu","startTime","toISOString","endTime","_applyDecoratedDescriptor","prototype","service","configurable","enumerable","writable","initializer","Object","getOwnPropertyDescriptor","action","_class","didInsert_","videoVideoPlayerPlaybackFeaturesSvrPlaybackFeatures_","didResize_","videoRulesDrawWindow_","videoAdvancedVideoSearchFilterBar_","uiPageBlockingLoadingOverlay_","AdvancedVideoSearchComponent","alias","_dec5","reads","_dec6","_dec7","_dec8","_dec9","_dec10","_dec11","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_descriptor8","_descriptor9","_descriptor10","_descriptor11","filterManager","ActivityFilterManager","filtersUpdated","updateFilters","defaultFilterValues","MotionSearchFilterManager","CustomShape","Drawing","_descriptor12","_descriptor13","_descriptor14","_descriptor15","_descriptor16","AutoView","_descriptor17","_descriptor18","_descriptor19","_descriptor20","_descriptor21","_buildTask","context","generator","requestModelData","_requestModelData$mot","_this$results","dateRanges","results","svrVideoSource","camera","get","intervals","notificationManager","addError","tc","store","unloadAll","DateRange","_requestModelData$act","activityEvents","query","toArray","flatMap","day","events","sortBy","map","event","createRecord","addSeconds","eventDate","type","Motion","activitySensitivity","aggregateDatesForSearch","mapBy","splitDates","splitDateRanges","searchRequests","constructObjectSearchParams","cameraId","motionSensitivity","drawing","allSearchesCompleted","i","length","submitObjectSearchRequest","ajax","parseResults","bind","e","searchFailed","searchWasInterrupted","restartable","userHasDrawnPoints","_this$drawing","points","clearDrawWindow","sendEvent","drawWindowEventBus","EVENT_CLEAR_SELECTED_DRAWING","resetErrors","cameraIdForPlaybackFeatures","JSON","stringify","id","drawings","confirmButtonDisabled","drawingCompleted","rejectBy","appliedFiltersCount","item","sum","val","avsDataObject","getProperties","searchResults","svrTimelineIsHidden","showTimeline","svrModel","cameras","cameraGroups","navigateToContextAwareSvrPage","svrTimelinePage","getContextAwareSvrTimelinePage","contextManager","isEnterprise","navigation","transitionToRouteId","cameraGroupId","resetFiltersOnPageLoad","checkConnectivity","svrId","svr","isWaitingForConnectivity","getSVRConnectivity","isConnected","sentryWithScopeAndError","undefined","addNotification","cancelSearch","selectTimeWindowMethod","createSearch","perform","goBackToSearch","selectedResultIndex","isRunning","cancelAll","cancelObjectSearchRequest","envSettings","restartSearch","resizeDrawWindow","el","snapshotMaxHeight","clientHeight","setSelectTimeWindowMethod","method","changeSelectedResult","onSetIntervalsFailed","json","replace","_this$results2","result","ObjectSearchResult","resultAsInterval","dateRange","pushObject","SyntaxError","tracked","NUM_SECONDS_IN_HOUR","VideoClipsStorageIndicatorComponent","togglePopup","isPopupOpen","svgSymbol_","safeHtml_","popoverMenu_","knowledgeBaseLink_","hrefTo_","safeHtml_0","tc_0","VideoClipsStorageAlertComponent","or","Indicator","canEnableRecordingRulesAfterQuotaReset","identityModel","isOverQuota","isOverUploadQuota","suppressUploadQuotaWarning","videoUsage","dismiss","set","save","VideoClipsDeletedBy","videoClipsSavedClip_","fn","videoClipsActionMenu_","noop_","videoClipsAnalyticsIcon_","await_","videoClipsDeletedBy_","and_","VideoClipsPlayableClipSelectableClip","BasePlayableClipComponent","videoClipsPlayableClipSelectableClip_","Location","ContainerObject","host","media","super","timeRange","getTimeRange","call","playMediaItem","mediaItem","playMediaItems","ClipDay","BaseClipDisplay","locations","showLocations","model","belongsTo","push","keys","isEnterprise_","videoClipsStorageItem_","videoClipsStorageProgress_","VideoClipsStoragePopupComponent","icon","getClipUploadIcon","uiIconTooltip_","formatNumber_","videoClipsStoragePopup_","guidFor_0","isHealthBad","VideoClipsStorageInfoComponent","formatDateTz_","formatDateTz_0","VideoClipsStorageNextClipComponent","videoClipsStorageAlert_","didUpdate_","routeViewViewContainer_","filtersNoResults_","videoClipsClipDisplayClipDay_","responsiveTable_","media_","or_","await_0","paginationBar_","videoClipsStorageInfo_","videoClipsStorageNextClip_","SORT_LOCATION","SORT_CAMERA","SORT_TIME","SORT_SIZE","VideoClipsRouteBodyComponent","sort","queryParamsMedia","mediaFromQueryParams","mediaSortOrder","sortKey","sortType","Math","abs","key","concat","compact","sorting","_ref","columnName","defaultSortValue","currentValue","updateSortKey","days","_map$media$key","reverse","hasSelectedMedia","isEmpty","findBy","noSearchResults","filtersManager","showStorageAlert","shouldUserEnableRules","selectedTimezone","showPreferredTimezone","preferredTimezone","hasMaxMediaCount","mediaCount","savedClipPermissions","maxClipCapacityForQuerying","showMaxMediaWarning","page","pageSize","selectedPageIsLastPage","ceil","showMaxMediaWarningForFilter","pageHasLoaded","initViewMode","playQueryParamMedia","mediaHasRendered","obscureResults","isGalleryView","updateViewMode","_ref2","later","appContentWrapper","closest","scrollTop","playAllMedia","sortedMedia","mediaWithQueryParam","indexOf","modals","showModal","VideoClipsModal","selectedIndex","operatorSiteEnum","NotOperatorSite","changeEventId","newSortKey","VideoClipsStorageItem","uiProgressBar_","formatNumber_0","barColorModelMap","Map","VideoClipsStorageProgressComponent","barColor","health","willDestroy_","videoSvrIndicator_","uiImagesStateImage_","CameraSlot","and","ensureComponentIsDestroyed","element","isTestEnvironment","parent","parentElement","removeChild","willDestroy","handleMouseEnter","isHovering","handleMouseLeave","removeCamera","rewordCameraSlotText","slot","_this$args$slot","_this$args$slot2","_slot$clientWidth","_slot$closest$clientW","_slot$closest","snapshotError","snapshot","error","slotWidth","clientWidth","pageContainerWidth","smallText","MAX_SMALL_PLAYER_WIDTH","MIN_PAGE_CONTAINER_WIDTH_FOR_TWO_BY_TWO_VIEW","disconnectedError","selectCameraInstructions","emberDragulaContainer_","videoEditCameraGroupCameraSlot_","VideoEditCameraGroupSlotPage","emberDragula_","eq_","videoEditCameraGroupCameraSlotPage_","CameraSlotPageContainer","dragulaConfig","_document$querySelect","options","copy","direction","revertOnSpill","removeOnSpill","mirrorContainer","document","querySelector","moves","source","handle","classList","contains","accepts","target","_source$parentElement","_target$parentElement","getAttribute","enabledEvents","cameraSlotPages","cameraSlots","Array","from","MAX_CAMERAS_PER_PAGE","_","index","startIndex","pageNumber","slice","onDrop","routeView_","promiseHashTracked_","videoEditCameraGroupCameraSlotPageContainer_","uiImagesStatelessImage_","spinnerSvg_","textInput_","getCameraSlots","selectedCameras","lastCameraIndex","max","lastCameraNumber","createIndexArray","idx","totalPages","async","updateSnapshots","snapshots","sidebarCameraClusters","forEach","sidebarCameraCluster","cameraItems","cameraItem","EditCameraGroup","ids","pollingError","idsToPoll","snapshotFromStore","peekRecord","callSnapshotTask","POLL_WAIT_TIME_MS","selectedCamera","disableEditCameraGroups","trimmedCameraGroupName","firstAvailableSlot","systems","system","hasMany","includes","isSelected","cameraGroup","name","trim","saveCameraGroup","setProperties","updateCameraOrderFromCameras","addSuccess","toggleCamera","removeAt","_sidebarCameraCluster","cameraToRemove","sidebarCameras","find","cameraCluster","sidebarCamera","removeObject","querySelectorAll","_el$parentElement","arr","onDataLoaded","videoStreamingPermissions","isArray","canEditCameraGroups","orderedCameras","startPolling","pollingStarted","snapshotIds","getSnapshots","snapshotPoller","poll","adjustSelectCamerasText","selectCamerasInstructionText","resizeCameraSlots","availableSpace","availableHeight","availableWidth","desiredSlotWidth","desiredSlotHeight","verticalPadding","HdAspectRatio","preRatioSlotHeight","preRatioSlotWidth","cameraSlotStyle","htmlSafe","listRowItem_","expandButton_","CameraGroupRow","not","equal","numCameras","editDisabled","isReordering","isAllCamerasGroup","toggleExpanded","isExpanded","cameraRows","then","groupType","AllCamerasGroup","deleteCamera","deleteCameraFromGroup","getActionItems","isDestroyed","EditActionItem","create","editCameraGroup","DeleteActionItem","deleteCameraGroup","videoManageCameraGroupsCameraGroupRow_","destroyRecord","ManageCameraGroups","cameraGroupsSorting","toolbarButtons","_this$cameraGroups","dataLoaded","buttons","cancelReorder","saveReorder","createCameraGroup","unshift","startReorder","text","primary","isDisabled","_el","_source","editCameraGroupTransitionFn","cameraToDelete","container","nodes","children","_el$querySelector","sortedCameraGroups","appendChild","_cameraGroups$findBy","_el$querySelector2","all","filterBy","SvrIndicator","hoursToSeconds","hours","requiredArgs","floor","secondsInHour","toString_","VideoThumbnailSearchThumbnailGridComponent","owner","timeout","displayGridSize","gridSize","getThumbnailInfoList","loadedImageIndices","Set","totalThumbnails","intervalSeconds","timeSpanSeconds","timelineRouteId","isSdCard","EmberSDCard","identityManager","thumbnailInfos","baseUrl","startTimeUtc","preloadPromise","Promise","resolve","preloadUrl","URL","searchParams","append","toString","request","thumbnailUrl","thumbnailTime","thumbnailUrlPromise","url","datetimeUtc","timestampText","formatDate","dateUtc","locale","format","utcToZonedTime","goToTimeline","stats","logEvent","ThumbnailSearchToTimeline","onImageLoad","add","hasImageLoaded","has","onThumbnailMouseEnter","shownOverlayIndex","onThumbnailMouseLeave","onGridKeyPress","horizontalIncrement","isRtl","isArrowCode","min","newShownOverlayRow","newShownOverlayColumn","ARROW_UP_CODE","ARROW_DOWN_CODE","ARROW_RIGHT_CODE","ARROW_LEFT_CODE","newShownOverlayIndex","pageView_","searchToolbar_","selectDateTime_","singleSelect_","sliderAdc_","videoThumbnailSearchThumbnailGrid_","THREE_MINUTE_SECONDS","minutesToSeconds","TWENTY_FIVE_MINUTE_SECONDS","THREE_HOUR_SECONDS","ONE_DAY_SECONDS","SIXTEEN_DAYS_SECONDS","VideoThumbnailSearchComponent","initializeSelectedTime","minimumSpanSeconds","timeSpanItems","timeUtc","initialSelectedTimeSpan","selectedTimeSpanSeconds","initialSelectedTime","subSeconds","selectedTimeUtc","latestRecord","nameKey","differenceInSeconds","searchStartTimeUtc","isAfter","timespanString","fnFormat","d","formatDateTz","month","year","hour","minute","moveBackDisabled","moveForwardDisabled","searchEndTimeUtc","isBefore","canDrillIntoThumbnails","maximumSelectedTime","onSelectedTimeChange","secondsDifference","getNextSmallestTimespan","moveBack","moveForward","drillIntoThumbnail","newTimeSpanSeconds","timespanSeconds","span","VideoThumbnailSearchController","Controller","hrefTo","routing","params","generateURL","targetRouteName","shift","lastParam","isQueryParams","pop","values","getParamsForGenerateURL","HrefToHelper","Helper","getOwner","lookup","router","init","recompute","compute","namedArgs","FormatNumberHelper","r","defineProperty","Symbol","toPrimitive","TypeError","String","_toPrimitive","_toPropertyKey","onLocaleChanged","namedOptions","positionalOptions","assign","_options$allowEmpty","allowEmpty","Error","formatNumber","n","a","_typeof","obj","iterator","dirtyDate","RangeError","date","toDate","isNaN","getTime","NaN","setFullYear","setMonth","setDate","toInteger","setHours","minutes","setMinutes","seconds","setSeconds","milliseconds","setMilliseconds"],"sourceRoot":""}