blob: d65304c82a26542d9e737c4edd3c52603f1a3095 [file] [log] [blame]
/**
* @license
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import '../../../styles/shared-styles';
import '../../../styles/gr-form-styles';
import '../../admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog';
import '../../shared/gr-button/gr-button';
import '../../shared/gr-overlay/gr-overlay';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-identities_html';
import {getBaseUrl} from '../../../utils/url-util';
import {customElement, property} from '@polymer/decorators';
import {AccountExternalIdInfo, ServerInfo} from '../../../types/common';
import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
import {PolymerDomRepeatEvent} from '../../../types/types';
import {appContext} from '../../../services/app-context';
const AUTH = ['OPENID', 'OAUTH'];
export interface GrIdentities {
$: {
overlay: GrOverlay;
};
}
@customElement('gr-identities')
export class GrIdentities extends PolymerElement {
static get template() {
return htmlTemplate;
}
@property({type: Array})
_identities: AccountExternalIdInfo[] = [];
@property({type: String})
_idName?: string;
@property({type: Object})
serverConfig?: ServerInfo;
@property({
type: Boolean,
computed: '_computeShowLinkAnotherIdentity(serverConfig)',
})
_showLinkAnotherIdentity?: boolean;
private readonly restApiService = appContext.restApiService;
loadData() {
return this.restApiService.getExternalIds().then(id => {
this._identities = id ?? [];
});
}
_computeIdentity(id: string) {
return id && id.startsWith('mailto:') ? '' : id;
}
_computeHideDeleteClass(canDelete?: boolean) {
return canDelete ? 'show' : '';
}
_handleDeleteItemConfirm() {
this.$.overlay.close();
return this.restApiService
.deleteAccountIdentity([this._idName!])
.then(() => {
this.loadData();
});
}
_handleConfirmDialogCancel() {
this.$.overlay.close();
}
_handleDeleteItem(e: PolymerDomRepeatEvent<AccountExternalIdInfo>) {
const name = e.model.item.identity;
if (!name) {
return;
}
this._idName = name;
this.$.overlay.open();
}
_computeIsTrusted(item?: boolean) {
return item ? '' : 'Untrusted';
}
filterIdentities(item: AccountExternalIdInfo) {
return !item.identity.startsWith('username:');
}
_computeShowLinkAnotherIdentity(config?: ServerInfo) {
if (config?.auth?.git_basic_auth_policy) {
return AUTH.includes(config.auth.git_basic_auth_policy.toUpperCase());
}
return false;
}
_computeLinkAnotherIdentity() {
const baseUrl = getBaseUrl() || '';
let pathname = window.location.pathname;
if (baseUrl) {
pathname = '/' + pathname.substring(baseUrl.length);
}
return baseUrl + '/login/' + encodeURIComponent(pathname) + '?link';
}
}
declare global {
interface HTMLElementTagNameMap {
'gr-identities': GrIdentities;
}
}