| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import '/strings.m.js'; |
| |
| import {CustomElement} from 'chrome://resources/js/custom_element.js'; |
| import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; |
| import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.js'; |
| |
| import {getTemplate} from './status_box.html.js'; |
| |
| export interface Status { |
| policyDescriptionKey: string; |
| flexOrgWarning: any; |
| assetId?: string; |
| location?: string; |
| directoryApiId?: string; |
| clientId: string; |
| isOffHoursActive?: boolean; |
| deviceId: string; |
| enrollmentToken: string; |
| domain: string; |
| machine?: string; |
| version?: string; |
| username: string; |
| gaiaId: string; |
| profileId: string; |
| status: string; |
| refreshInterval: string; |
| timeSinceLastRefresh: string; |
| timeSinceLastFetchAttempt: string; |
| enterpriseDomainManager: string; |
| isAffiliated: boolean; |
| lastCloudReportSentTimestamp: string; |
| timeSinceLastCloudReportSent: string; |
| policiesPushAvailable: boolean; |
| error: boolean; |
| } |
| |
| export class StatusBoxElement extends CustomElement { |
| static override get template() { |
| return getTemplate(); |
| } |
| |
| /** |
| * Sets the text of a particular named label element in the status box |
| * and updates the visibility if needed. |
| */ |
| private setLabelAndShow( |
| labelName: string, labelValue: string, needsToBeShown: boolean = true) { |
| const labelElement = this.shadowRoot!.querySelector(labelName); |
| labelElement!.textContent = labelValue ? ' ' + labelValue : ''; |
| if (needsToBeShown) { |
| labelElement!.parentElement!.hidden = false; |
| } |
| } |
| |
| /** |
| * Sets the text of a particular named label element in the status box |
| * and updates the visibility if needed. |
| */ |
| private setLabelInnerHtmlAndShow( |
| labelName: string, labelValue: string, needsToBeShown: boolean = true) { |
| const labelElement = this.shadowRoot!.querySelector(labelName); |
| labelElement!.innerHTML = sanitizeInnerHtml(` ${labelValue}`); |
| if (needsToBeShown) { |
| labelElement!.parentElement!.hidden = false; |
| } |
| } |
| |
| /** |
| * Populate the box with the given cloud policy status. The policy scope, |
| * either "device", "machine", "user", or "updater". |
| */ |
| initialize(scope: string, status: Status) { |
| const notSpecifiedString = loadTimeData.getString('notSpecified'); |
| |
| // Set appropriate box heading based on status key. |
| this.shadowRoot!.querySelector('.status-box-heading')!.textContent = |
| loadTimeData.getString(status.policyDescriptionKey); |
| if (status.flexOrgWarning) { |
| this.setLabelInnerHtmlAndShow( |
| '.warning', loadTimeData.getString('statusFlexOrgNoPolicy'), true); |
| return; |
| } |
| if (scope === 'device') { |
| // Populate the device naming information. |
| // Populate the asset identifier. |
| this.setLabelAndShow('.asset-id', status.assetId || notSpecifiedString); |
| |
| // Populate the device location. |
| this.setLabelAndShow('.location', status.location || notSpecifiedString); |
| |
| // Populate the directory API ID. |
| this.setLabelAndShow( |
| '.directory-api-id', status.directoryApiId || notSpecifiedString); |
| this.setLabelAndShow('.client-id', status.clientId); |
| // For off-hours policy, indicate if it's active or not. |
| if (status.isOffHoursActive != null) { |
| this.setLabelAndShow( |
| '.is-offhours-active', |
| loadTimeData.getString( |
| status.isOffHoursActive ? 'offHoursActive' : |
| 'offHoursNotActive')); |
| } |
| } else if (scope === 'machine') { |
| this.setLabelAndShow('.machine-enrollment-device-id', status.deviceId); |
| this.setLabelAndShow('.machine-enrollment-token', status.enrollmentToken); |
| if (status.machine) { |
| this.setLabelAndShow('.machine-enrollment-name', status.machine); |
| } |
| this.setLabelAndShow('.machine-enrollment-domain', status.domain); |
| } else if (scope === 'updater') { |
| if (status.version) { |
| this.setLabelAndShow('.version', status.version); |
| } |
| if (status.domain) { |
| this.setLabelAndShow('.machine-enrollment-domain', status.domain); |
| } |
| } else if (status.enrollmentToken) { |
| this.setLabelAndShow('.machine-enrollment-domain', status.domain); |
| this.setLabelAndShow('.machine-enrollment-token', status.enrollmentToken); |
| this.setLabelAndShow('.client-id', status.clientId); |
| this.setLabelAndShow('.profile-id', status.profileId); |
| } else { |
| // Populate the topmost item with the username. |
| this.setLabelAndShow('.username', status.username); |
| // Populate the user gaia id. |
| this.setLabelAndShow('.gaia-id', status.gaiaId || notSpecifiedString); |
| this.setLabelAndShow('.client-id', status.clientId); |
| this.setLabelAndShow('.profile-id', status.profileId); |
| |
| if (status.isAffiliated != null) { |
| this.setLabelAndShow( |
| '.is-affiliated', |
| loadTimeData.getString( |
| status.isAffiliated ? 'isAffiliatedYes' : 'isAffiliatedNo')); |
| } |
| } |
| |
| if (status.enterpriseDomainManager) { |
| this.setLabelAndShow('.managed-by', status.enterpriseDomainManager); |
| } |
| |
| if (status.timeSinceLastFetchAttempt) { |
| this.setLabelAndShow( |
| '.time-since-last-fetch-attempt', status.timeSinceLastFetchAttempt); |
| } |
| |
| if (status.timeSinceLastRefresh) { |
| this.setLabelAndShow( |
| '.time-since-last-refresh', status.timeSinceLastRefresh); |
| } |
| |
| if (scope !== 'updater') { |
| if (status.refreshInterval) { |
| this.setLabelAndShow('.refresh-interval', status.refreshInterval); |
| } |
| this.setLabelAndShow('.status', status.status); |
| this.setLabelAndShow( |
| '.policy-push', |
| loadTimeData.getString( |
| status.policiesPushAvailable ? 'policiesPushOn' : |
| 'policiesPushOff')); |
| } |
| |
| if (status.lastCloudReportSentTimestamp) { |
| this.setLabelAndShow( |
| '.last-cloud-report-sent-timestamp', |
| status.lastCloudReportSentTimestamp + ' (' + |
| status.timeSinceLastCloudReportSent + ')'); |
| } |
| |
| if (status.error) { |
| this.setLabelAndShow( |
| '.error', loadTimeData.getString('statusErrorManagedNoPolicy')); |
| } |
| } |
| } |
| declare global { |
| interface HTMLElementTagNameMap { |
| 'status-box': StatusBoxElement; |
| } |
| } |
| customElements.define('status-box', StatusBoxElement); |