blob: 3f5ecdc16b8b95642d7813a4a8378c38206e805d [file] [log] [blame]
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../styles/gr-form-styles';
import '../../../styles/shared-styles';
import {GroupName} from '../../../types/common';
import {getAppContext} from '../../../services/app-context';
import {grFormStyles} from '../../../styles/gr-form-styles';
import {sharedStyles} from '../../../styles/shared-styles';
import {css, html, LitElement, PropertyValues} from 'lit';
import {customElement, property, query, state} from 'lit/decorators.js';
import {fire} from '../../../utils/event-util';
import {createGroupUrl} from '../../../models/views/group';
import {resolve} from '../../../models/dependency';
import {navigationToken} from '../../core/gr-navigation/gr-navigation';
import '@material/web/textfield/outlined-text-field';
import {MdOutlinedTextField} from '@material/web/textfield/outlined-text-field';
import {materialStyles} from '../../../styles/gr-material-styles';
import '@material/web/checkbox/checkbox';
declare global {
interface HTMLElementTagNameMap {
'gr-create-group-dialog': GrCreateGroupDialog;
}
interface HTMLElementEventMap {
'has-new-group-name': CustomEvent<{}>;
}
}
@customElement('gr-create-group-dialog')
export class GrCreateGroupDialog extends LitElement {
@query('md-outlined-text-field') private input!: MdOutlinedTextField;
@property({type: String})
name: GroupName | '' = '';
@state()
visibleToAll = false;
private readonly restApiService = getAppContext().restApiService;
private readonly getNavigation = resolve(this, navigationToken);
static override get styles() {
return [
materialStyles,
grFormStyles,
sharedStyles,
css`
:host {
display: inline-block;
}
div.title-flex,
div.value-flex {
display: flex;
flex-direction: column;
justify-content: center;
}
div.gr-form-styles section {
margin: var(--spacing-m) 0;
}
div.gr-form-styles span.title {
width: 13em;
}
md-outlined-text-field {
width: 20em;
}
`,
];
}
override render() {
return html`
<div class="gr-form-styles">
<div id="form">
<section>
<div class="title-flex">
<span class="title">Group name</span>
</div>
<div class="value-flex">
<span class="value">
<md-outlined-text-field
class="showBlueFocusBorder"
.value=${this.name ?? ''}
@input=${(e: InputEvent) => {
const target = e.target as MdOutlinedTextField;
this.name = target.value as GroupName;
}}
>
</md-outlined-text-field>
</span>
</div>
</section>
<section>
<div class="title-flex">
<span class="title">
Make group visible to all registered users
</span>
</div>
<div class="value-flex">
<span class="value">
<md-checkbox
?checked=${this.visibleToAll}
@change=${() => {
this.visibleToAll = !this.visibleToAll;
}}
></md-checkbox>
</span>
</div>
</section>
</div>
</div>
`;
}
override updated(changedProperties: PropertyValues) {
if (changedProperties.has('name')) {
this.updateGroupName();
}
}
private updateGroupName() {
fire(this, 'has-new-group-name', {});
}
override focus() {
this.input.focus();
}
handleCreateGroup() {
const name = this.name as GroupName;
const visible_to_all = this.visibleToAll;
return this.restApiService
.createGroup({name, visible_to_all})
.then(groupRegistered => {
if (groupRegistered.status !== 201) return;
return this.restApiService.getGroupConfig(name).then(group => {
if (!group) return;
this.getNavigation().setUrl(createGroupUrl({groupId: group.id}));
});
});
}
}