mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Fix endpoint links to not overflow text (#7312)
* Fix endpoint links to not overflow * Add titles to links * Re-add title to Text and fix errors
This commit is contained in:
@@ -242,13 +242,21 @@ function createServiceEndpointRow(modelBuilder: azdata.ModelBuilder, container:
|
|||||||
endPointRow.addItem(nameCell, { CSSStyles: { 'width': `${serviceEndpointRowServiceNameCellWidth}px`, 'min-width': `${serviceEndpointRowServiceNameCellWidth}px`, 'text-align': 'center' } });
|
endPointRow.addItem(nameCell, { CSSStyles: { 'width': `${serviceEndpointRowServiceNameCellWidth}px`, 'min-width': `${serviceEndpointRowServiceNameCellWidth}px`, 'text-align': 'center' } });
|
||||||
if (isHyperlink) {
|
if (isHyperlink) {
|
||||||
const endpointCell = modelBuilder.hyperlink()
|
const endpointCell = modelBuilder.hyperlink()
|
||||||
.withProperties({ label: endpoint.endpoint, url: endpoint.endpoint, CSSStyles: { 'height': '15px' } })
|
.withProperties<azdata.HyperlinkComponentProperties>({
|
||||||
|
label: endpoint.endpoint,
|
||||||
|
title: endpoint.endpoint,
|
||||||
|
url: endpoint.endpoint, CSSStyles: { 'height': '15px' }
|
||||||
|
})
|
||||||
.component();
|
.component();
|
||||||
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px`, 'overflow': 'hidden', ...cssStyles.hyperlink } });
|
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px`, 'overflow': 'hidden', 'text-overflow': 'ellipsis', ...cssStyles.hyperlink } });
|
||||||
}
|
}
|
||||||
else if (endpoint.name === Endpoint.sqlServerMaster) {
|
else if (endpoint.name === Endpoint.sqlServerMaster) {
|
||||||
const endpointCell = modelBuilder.text()
|
const endpointCell = modelBuilder.text()
|
||||||
.withProperties({ value: endpoint.endpoint, CSSStyles: { ...cssStyles.text, ...cssStyles.hyperlink } })
|
.withProperties<azdata.TextComponentProperties>({
|
||||||
|
value: endpoint.endpoint,
|
||||||
|
title: endpoint.endpoint,
|
||||||
|
CSSStyles: { 'overflow': 'hidden', 'text-overflow': 'ellipsis', ...cssStyles.text, ...cssStyles.hyperlink }
|
||||||
|
})
|
||||||
.component();
|
.component();
|
||||||
endpointCell.onDidClick(async () => {
|
endpointCell.onDidClick(async () => {
|
||||||
const connProfile = bdcModel.getSqlServerMasterConnectionProfile();
|
const connProfile = bdcModel.getSqlServerMasterConnectionProfile();
|
||||||
@@ -263,20 +271,23 @@ function createServiceEndpointRow(modelBuilder: azdata.ModelBuilder, container:
|
|||||||
azdata.connection.openConnectionDialog(undefined, connProfile);
|
azdata.connection.openConnectionDialog(undefined, connProfile);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px`, 'overflow': 'hidden' } });
|
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px` } });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const endpointCell = modelBuilder.text()
|
const endpointCell = modelBuilder.text()
|
||||||
.withProperties({ value: endpoint.endpoint, CSSStyles: { ...cssStyles.text } })
|
.withProperties<azdata.TextComponentProperties>({
|
||||||
|
value: endpoint.endpoint,
|
||||||
|
title: endpoint.endpoint,
|
||||||
|
CSSStyles: { 'overflow': 'hidden', 'text-overflow': 'ellipsis', ...cssStyles.text }
|
||||||
|
})
|
||||||
.component();
|
.component();
|
||||||
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px`, 'overflow': 'hidden' } });
|
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': `${serviceEndpointRowEndpointCellWidth}px`, 'min-width': `${serviceEndpointRowEndpointCellWidth}px` } });
|
||||||
}
|
}
|
||||||
const copyValueCell = modelBuilder.button().component();
|
const copyValueCell = modelBuilder.button().withProperties<azdata.ButtonProperties>({ title: localize('bdc.dashboard.copyTitle', "Copy") }).component();
|
||||||
copyValueCell.iconPath = IconPathHelper.copy;
|
copyValueCell.iconPath = IconPathHelper.copy;
|
||||||
copyValueCell.onDidClick(() => {
|
copyValueCell.onDidClick(() => {
|
||||||
vscode.env.clipboard.writeText(endpoint.endpoint);
|
vscode.env.clipboard.writeText(endpoint.endpoint);
|
||||||
});
|
});
|
||||||
copyValueCell.title = localize('bdc.dashboard.copyTitle', "Copy");
|
|
||||||
copyValueCell.iconHeight = '14px';
|
copyValueCell.iconHeight = '14px';
|
||||||
copyValueCell.iconWidth = '14px';
|
copyValueCell.iconWidth = '14px';
|
||||||
endPointRow.addItem(copyValueCell, { CSSStyles: { 'width': '14px', 'min-width': '14px', 'padding-left': '10px', ...cssStyles.text } });
|
endPointRow.addItem(copyValueCell, { CSSStyles: { 'width': '14px', 'min-width': '14px', 'padding-left': '10px', ...cssStyles.text } });
|
||||||
|
|||||||
@@ -60,16 +60,28 @@ export function registerServiceEndpoints(context: vscode.ExtensionContext): void
|
|||||||
|
|
||||||
const container = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'column', width: '100%', height: '100%', alignItems: 'left' }).component();
|
const container = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'column', width: '100%', height: '100%', alignItems: 'left' }).component();
|
||||||
endpointsArray.forEach(endpointInfo => {
|
endpointsArray.forEach(endpointInfo => {
|
||||||
|
|
||||||
const endPointRow = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'row' }).component();
|
const endPointRow = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'row' }).component();
|
||||||
const nameCell = view.modelBuilder.text().withProperties<azdata.TextComponentProperties>({ value: endpointInfo.description }).component();
|
const nameCell = view.modelBuilder.text().withProperties<azdata.TextComponentProperties>({ value: endpointInfo.description }).component();
|
||||||
endPointRow.addItem(nameCell, { CSSStyles: { 'width': '35%', 'font-weight': '600', 'user-select': 'text' } });
|
endPointRow.addItem(nameCell, { CSSStyles: { 'width': '35%', 'font-weight': '600', 'user-select': 'text' } });
|
||||||
if (hyperlinkedEndpoints.findIndex(e => e === endpointInfo.serviceName) >= 0) {
|
if (hyperlinkedEndpoints.findIndex(e => e === endpointInfo.serviceName) >= 0) {
|
||||||
const linkCell = view.modelBuilder.hyperlink().withProperties<azdata.HyperlinkComponentProperties>({ label: endpointInfo.endpoint, url: endpointInfo.endpoint }).component();
|
const linkCell = view.modelBuilder.hyperlink()
|
||||||
endPointRow.addItem(linkCell, { CSSStyles: { 'width': '62%', 'color': '#0078d4', 'text-decoration': 'underline', 'padding-top': '10px' } });
|
.withProperties<azdata.HyperlinkComponentProperties>({
|
||||||
|
label: endpointInfo.endpoint,
|
||||||
|
title: endpointInfo.endpoint,
|
||||||
|
url: endpointInfo.endpoint
|
||||||
|
}).component();
|
||||||
|
endPointRow.addItem(linkCell, { CSSStyles: { 'width': '62%', 'color': '#0078d4', 'text-decoration': 'underline', 'padding-top': '10px', 'overflow': 'hidden', 'text-overflow': 'ellipsis' } });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const endpointCell = view.modelBuilder.text().withProperties<azdata.TextComponentProperties>({ value: endpointInfo.endpoint }).component();
|
const endpointCell =
|
||||||
|
view.modelBuilder.text()
|
||||||
|
.withProperties<azdata.TextComponentProperties>(
|
||||||
|
{
|
||||||
|
value: endpointInfo.endpoint,
|
||||||
|
title: endpointInfo.endpoint,
|
||||||
|
CSSStyles: { 'overflow': 'hidden', 'text-overflow': 'ellipsis' }
|
||||||
|
})
|
||||||
|
.component();
|
||||||
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': '62%', 'user-select': 'text' } });
|
endPointRow.addItem(endpointCell, { CSSStyles: { 'width': '62%', 'user-select': 'text' } });
|
||||||
}
|
}
|
||||||
const copyValueCell = view.modelBuilder.button().component();
|
const copyValueCell = view.modelBuilder.button().component();
|
||||||
|
|||||||
@@ -526,7 +526,7 @@ export class ServiceSettingsPage extends WizardPageBase<DeployClusterWizard> {
|
|||||||
this.setEnableHadrCheckboxState(Number.parseInt(selectedValue));
|
this.setEnableHadrCheckboxState(Number.parseInt(selectedValue));
|
||||||
}));
|
}));
|
||||||
this.wizard.registerDisposable(enableHadrCheckbox.onChanged(() => {
|
this.wizard.registerDisposable(enableHadrCheckbox.onChanged(() => {
|
||||||
this.updateReadableSecondaryEndpointComponents(enableHadrCheckbox.checked);
|
this.updateReadableSecondaryEndpointComponents(!!enableHadrCheckbox.checked);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,7 +534,7 @@ export class ServiceSettingsPage extends WizardPageBase<DeployClusterWizard> {
|
|||||||
// 1. it is ok to enable HADR when there is only 1 replica
|
// 1. it is ok to enable HADR when there is only 1 replica
|
||||||
// 2. if there are multiple replicas, the hadr.enabled switch must be set to true.
|
// 2. if there are multiple replicas, the hadr.enabled switch must be set to true.
|
||||||
const enableHadrCheckbox = getCheckboxComponent(VariableNames.EnableHADR_VariableName, this.inputComponents);
|
const enableHadrCheckbox = getCheckboxComponent(VariableNames.EnableHADR_VariableName, this.inputComponents);
|
||||||
const hadrEnabled = sqlInstances === 1 ? enableHadrCheckbox.checked : true;
|
const hadrEnabled = sqlInstances === 1 ? !!enableHadrCheckbox.checked : true;
|
||||||
if (sqlInstances === 1) {
|
if (sqlInstances === 1) {
|
||||||
enableHadrCheckbox.enabled = true;
|
enableHadrCheckbox.enabled = true;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -415,15 +415,17 @@ export function setModelValues(inputComponents: InputComponents, model: Model):
|
|||||||
Object.keys(inputComponents).forEach(key => {
|
Object.keys(inputComponents).forEach(key => {
|
||||||
let value;
|
let value;
|
||||||
const input = inputComponents[key];
|
const input = inputComponents[key];
|
||||||
if ('checked' in input) {
|
if ('checked' in input) { // CheckBoxComponent
|
||||||
value = input.checked ? 'true' : 'false';
|
value = input.checked ? 'true' : 'false';
|
||||||
} else {
|
} else if ('value' in input) { // InputBoxComponent or DropDownComponent
|
||||||
const inputValue = input.value;
|
const inputValue = input.value;
|
||||||
if (typeof inputValue === 'string' || typeof inputValue === 'undefined') {
|
if (typeof inputValue === 'string' || typeof inputValue === 'undefined') {
|
||||||
value = inputValue;
|
value = inputValue;
|
||||||
} else {
|
} else {
|
||||||
value = inputValue.name;
|
value = inputValue.name;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error(`Unknown input type with ID ${input.id}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
model.setPropertyValue(key, value);
|
model.setPropertyValue(key, value);
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ export class ResourceTypePickerDialog extends DialogBase {
|
|||||||
const checkbox = this._view.modelBuilder.checkBox().component();
|
const checkbox = this._view.modelBuilder.checkBox().component();
|
||||||
checkbox.checked = false;
|
checkbox.checked = false;
|
||||||
this._toDispose.push(checkbox.onChanged(() => {
|
this._toDispose.push(checkbox.onChanged(() => {
|
||||||
this._agreementCheckboxChecked = checkbox.checked;
|
this._agreementCheckboxChecked = !!checkbox.checked;
|
||||||
}));
|
}));
|
||||||
const text = this._view.modelBuilder.text().withProperties<azdata.TextComponentProperties>({
|
const text = this._view.modelBuilder.text().withProperties<azdata.TextComponentProperties>({
|
||||||
value: agreementInfo.template,
|
value: agreementInfo.template,
|
||||||
|
|||||||
19
src/sql/azdata.d.ts
vendored
19
src/sql/azdata.d.ts
vendored
@@ -3062,12 +3062,11 @@ declare module 'azdata' {
|
|||||||
focused?: boolean;
|
focused?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TextComponentProperties {
|
export interface TextComponentProperties extends ComponentProperties, TitledComponentProperties {
|
||||||
value?: string;
|
value?: string;
|
||||||
links?: LinkArea[];
|
links?: LinkArea[];
|
||||||
description?: string;
|
description?: string;
|
||||||
requiredIndicator?: boolean;
|
requiredIndicator?: boolean;
|
||||||
CSSStyles?: { [key: string]: string };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ImageComponentProperties {
|
export interface ImageComponentProperties {
|
||||||
@@ -3081,7 +3080,7 @@ declare module 'azdata' {
|
|||||||
url: string;
|
url: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HyperlinkComponentProperties extends ComponentProperties {
|
export interface HyperlinkComponentProperties extends ComponentProperties, TitledComponentProperties {
|
||||||
label: string;
|
label: string;
|
||||||
url: string;
|
url: string;
|
||||||
}
|
}
|
||||||
@@ -3198,6 +3197,13 @@ declare module 'azdata' {
|
|||||||
clickable?: boolean;
|
clickable?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TitledComponentProperties {
|
||||||
|
/**
|
||||||
|
* The title for the component. This title will show when hovered over
|
||||||
|
*/
|
||||||
|
title?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CardComponent extends Component, CardProperties {
|
export interface CardComponent extends Component, CardProperties {
|
||||||
onDidActionClick: vscode.Event<ActionDescriptor>;
|
onDidActionClick: vscode.Event<ActionDescriptor>;
|
||||||
onCardSelectedChanged: vscode.Event<any>;
|
onCardSelectedChanged: vscode.Event<any>;
|
||||||
@@ -3207,8 +3213,7 @@ declare module 'azdata' {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TextComponent extends Component, ComponentProperties {
|
export interface TextComponent extends Component, TextComponentProperties {
|
||||||
value: string;
|
|
||||||
/**
|
/**
|
||||||
* An event called when the text is clicked
|
* An event called when the text is clicked
|
||||||
*/
|
*/
|
||||||
@@ -3232,9 +3237,7 @@ declare module 'azdata' {
|
|||||||
onDidClick: vscode.Event<any>;
|
onDidClick: vscode.Event<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CheckBoxComponent extends Component {
|
export interface CheckBoxComponent extends Component, CheckBoxProperties {
|
||||||
checked: boolean;
|
|
||||||
label: string;
|
|
||||||
onChanged: vscode.Event<any>;
|
onChanged: vscode.Event<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
22
src/sql/sqlops.proposed.d.ts
vendored
22
src/sql/sqlops.proposed.d.ts
vendored
@@ -550,7 +550,7 @@ declare module 'sqlops' {
|
|||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TextComponentProperties {
|
export interface TextComponentProperties extends ComponentProperties, TitledComponentProperties {
|
||||||
value?: string;
|
value?: string;
|
||||||
links?: LinkArea[];
|
links?: LinkArea[];
|
||||||
}
|
}
|
||||||
@@ -560,7 +560,7 @@ declare module 'sqlops' {
|
|||||||
url: string;
|
url: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HyperlinkComponentProperties extends ComponentProperties {
|
export interface HyperlinkComponentProperties extends ComponentProperties, TitledComponentProperties {
|
||||||
label: string;
|
label: string;
|
||||||
url: string;
|
url: string;
|
||||||
}
|
}
|
||||||
@@ -668,6 +668,13 @@ declare module 'sqlops' {
|
|||||||
yOffsetChange?: number;
|
yOffsetChange?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TitledComponentProperties {
|
||||||
|
/**
|
||||||
|
* The title for the component. This title will show when hovered over
|
||||||
|
*/
|
||||||
|
title?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CardComponent extends Component, CardProperties {
|
export interface CardComponent extends Component, CardProperties {
|
||||||
onDidActionClick: vscode.Event<ActionDescriptor>;
|
onDidActionClick: vscode.Event<ActionDescriptor>;
|
||||||
onCardSelectedChanged: vscode.Event<any>;
|
onCardSelectedChanged: vscode.Event<any>;
|
||||||
@@ -677,8 +684,11 @@ declare module 'sqlops' {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TextComponent extends Component, ComponentProperties {
|
export interface TextComponent extends Component, TextComponentProperties {
|
||||||
value: string;
|
/**
|
||||||
|
* An event called when the text is clicked
|
||||||
|
*/
|
||||||
|
onDidClick: vscode.Event<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HyperlinkComponent extends Component, HyperlinkComponentProperties {
|
export interface HyperlinkComponent extends Component, HyperlinkComponentProperties {
|
||||||
@@ -692,9 +702,7 @@ declare module 'sqlops' {
|
|||||||
onDidClick: vscode.Event<any>;
|
onDidClick: vscode.Event<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CheckBoxComponent extends Component {
|
export interface CheckBoxComponent extends Component, CheckBoxProperties {
|
||||||
checked: boolean;
|
|
||||||
label: string;
|
|
||||||
onChanged: vscode.Event<any>;
|
onChanged: vscode.Event<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1119,6 +1119,13 @@ class TextComponentWrapper extends ComponentWrapper implements azdata.TextCompon
|
|||||||
this.setProperty('value', v);
|
this.setProperty('value', v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get title(): string {
|
||||||
|
return this.properties['title'];
|
||||||
|
}
|
||||||
|
public set title(title: string) {
|
||||||
|
this.setProperty('title', title);
|
||||||
|
}
|
||||||
|
|
||||||
public get onDidClick(): vscode.Event<any> {
|
public get onDidClick(): vscode.Event<any> {
|
||||||
let emitter = this._emitterMap.get(ComponentEventType.onDidClick);
|
let emitter = this._emitterMap.get(ComponentEventType.onDidClick);
|
||||||
return emitter && emitter.event;
|
return emitter && emitter.event;
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ import {
|
|||||||
|
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
|
|
||||||
import { ComponentBase } from 'sql/workbench/browser/modelComponents/componentBase';
|
|
||||||
import { IComponent, IComponentDescriptor, IModelStore } from 'sql/workbench/browser/modelComponents/interfaces';
|
import { IComponent, IComponentDescriptor, IModelStore } from 'sql/workbench/browser/modelComponents/interfaces';
|
||||||
|
import { TitledComponent } from 'sql/workbench/browser/modelComponents/titledComponent';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'modelview-hyperlink',
|
selector: 'modelview-hyperlink',
|
||||||
template: `<a [href]="getUrl()" target="blank">{{getLabel()}}</a>`
|
template: `<a [href]="getUrl()" [title]="title" target="blank">{{getLabel()}}</a>`
|
||||||
})
|
})
|
||||||
export default class HyperlinkComponent extends ComponentBase implements IComponent, OnDestroy, AfterViewInit {
|
export default class HyperlinkComponent extends TitledComponent implements IComponent, OnDestroy, AfterViewInit {
|
||||||
@Input() descriptor: IComponentDescriptor;
|
@Input() descriptor: IComponentDescriptor;
|
||||||
@Input() modelStore: IModelStore;
|
@Input() modelStore: IModelStore;
|
||||||
|
|
||||||
|
|||||||
@@ -101,3 +101,7 @@ export interface IModelStore {
|
|||||||
*/
|
*/
|
||||||
validate(component: IComponent): Thenable<boolean>;
|
validate(component: IComponent): Thenable<boolean>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ITitledComponent {
|
||||||
|
title?: string;
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,22 +11,22 @@ import {
|
|||||||
|
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
|
|
||||||
import { ComponentBase } from 'sql/workbench/browser/modelComponents/componentBase';
|
|
||||||
import { IComponent, IComponentDescriptor, IModelStore, ComponentEventType } from 'sql/workbench/browser/modelComponents/interfaces';
|
import { IComponent, IComponentDescriptor, IModelStore, ComponentEventType } from 'sql/workbench/browser/modelComponents/interfaces';
|
||||||
import { SafeHtml, DomSanitizer } from '@angular/platform-browser';
|
import { SafeHtml, DomSanitizer } from '@angular/platform-browser';
|
||||||
|
import { TitledComponent } from 'sql/workbench/browser/modelComponents/titledComponent';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'modelview-text',
|
selector: 'modelview-text',
|
||||||
template: `
|
template: `
|
||||||
<div style="display:flex;flex-flow:row;align-items:center;" [style.width]="getWidth()">
|
<div style="display:flex;flex-flow:row;align-items:center;" [style.width]="getWidth()">
|
||||||
<p [innerHTML]="getValue()" [ngStyle]="this.CSSStyles"></p>
|
<p [innerHTML]="getValue()" [title]="title" [ngStyle]="this.CSSStyles" (click)="onClick()"></p>
|
||||||
<p *ngIf="requiredIndicator" style="color:red;margin-left:5px;">*</p>
|
<p *ngIf="requiredIndicator" style="color:red;margin-left:5px;">*</p>
|
||||||
<div *ngIf="description" tabindex="0" class="modelview-text-tooltip" [attr.aria-label]="description">
|
<div *ngIf="description" tabindex="0" class="modelview-text-tooltip" [attr.aria-label]="description">
|
||||||
<div class="modelview-text-tooltip-content" [innerHTML]="description"></div>
|
<div class="modelview-text-tooltip-content" [innerHTML]="description"></div>
|
||||||
</div>
|
</div>
|
||||||
<div>`
|
<div>`
|
||||||
})
|
})
|
||||||
export default class TextComponent extends ComponentBase implements IComponent, OnDestroy, AfterViewInit {
|
export default class TextComponent extends TitledComponent implements IComponent, OnDestroy, AfterViewInit {
|
||||||
@Input() descriptor: IComponentDescriptor;
|
@Input() descriptor: IComponentDescriptor;
|
||||||
@Input() modelStore: IModelStore;
|
@Input() modelStore: IModelStore;
|
||||||
|
|
||||||
|
|||||||
29
src/sql/workbench/browser/modelComponents/titledComponent.ts
Normal file
29
src/sql/workbench/browser/modelComponents/titledComponent.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
import {
|
||||||
|
ChangeDetectorRef, ElementRef
|
||||||
|
} from '@angular/core';
|
||||||
|
|
||||||
|
import { ITitledComponent } from 'sql/workbench/browser/modelComponents/interfaces';
|
||||||
|
import * as azdata from 'azdata';
|
||||||
|
import { ComponentBase } from 'sql/workbench/browser/modelComponents/componentBase';
|
||||||
|
|
||||||
|
|
||||||
|
export abstract class TitledComponent extends ComponentBase implements ITitledComponent {
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected _changeRef: ChangeDetectorRef,
|
||||||
|
protected _el: ElementRef) {
|
||||||
|
super(_changeRef, _el);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get title(): string {
|
||||||
|
return this.getPropertyOrDefault<azdata.HyperlinkComponentProperties, string>((props) => props.title, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
public set title(newTitle: string) {
|
||||||
|
this.setPropertyFromUI<azdata.HyperlinkComponentProperties, string>((properties, title) => { properties.title = title; }, newTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user