mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2026-01-05 01:01:46 +00:00
Compare commits
3 Commits
defect2280
...
defect2392
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6af0546361 | ||
|
|
e442e5fd0b | ||
|
|
10586d44f8 |
@@ -15,13 +15,13 @@ import {
|
||||
import {
|
||||
ChangeFeedPolicyState,
|
||||
GeospatialConfigType,
|
||||
getSanitizedInputValue,
|
||||
IsComponentDirtyResult,
|
||||
isDirty,
|
||||
TtlOff,
|
||||
TtlOn,
|
||||
TtlOnNoDefault,
|
||||
TtlType,
|
||||
getSanitizedInputValue,
|
||||
isDirty,
|
||||
} from "../SettingsUtils";
|
||||
import { ToolTipLabelComponent } from "./ToolTipLabelComponent";
|
||||
|
||||
@@ -55,6 +55,18 @@ export interface SubSettingsComponentProps {
|
||||
onSubSettingsSaveableChange: (isSubSettingsSaveable: boolean) => void;
|
||||
onSubSettingsDiscardableChange: (isSubSettingsDiscardable: boolean) => void;
|
||||
}
|
||||
const stylingforvisuallyhiddenspan = {
|
||||
position: "absolute",
|
||||
|
||||
width: "1px",
|
||||
height: "1px",
|
||||
margin: "-1px",
|
||||
border: 0,
|
||||
padding: 0,
|
||||
|
||||
clip: "rect(0 0 0 0)",
|
||||
overflow: "hidden",
|
||||
};
|
||||
|
||||
export class SubSettingsComponent extends React.Component<SubSettingsComponentProps> {
|
||||
private shouldCheckComponentIsDirty = true;
|
||||
@@ -197,17 +209,26 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
|
||||
</MessageBar>
|
||||
)}
|
||||
{this.props.timeToLive === TtlType.On && (
|
||||
<TextField
|
||||
id="timeToLiveSeconds"
|
||||
styles={getTextFieldStyles(this.props.timeToLiveSeconds, this.props.timeToLiveSecondsBaseline)}
|
||||
type="number"
|
||||
required
|
||||
min={1}
|
||||
max={Int32.Max}
|
||||
value={this.props.timeToLiveSeconds?.toString()}
|
||||
onChange={this.onTimeToLiveSecondsChange}
|
||||
suffix="second(s)"
|
||||
/>
|
||||
<div>
|
||||
<span id="timetoliveon" style={stylingforvisuallyhiddenspan}>
|
||||
Time to live on
|
||||
</span>
|
||||
<TextField
|
||||
id="timeToLiveSeconds"
|
||||
styles={getTextFieldStyles(this.props.timeToLiveSeconds, this.props.timeToLiveSecondsBaseline)}
|
||||
type="number"
|
||||
required
|
||||
min={1}
|
||||
max={Int32.Max}
|
||||
value={this.props.timeToLiveSeconds?.toString()}
|
||||
onChange={this.onTimeToLiveSecondsChange}
|
||||
suffix="second(s)"
|
||||
aria-labelledby="timetoliveon secondssuffixforscreenreader"
|
||||
/>
|
||||
<span id="secondssuffixforscreenreader" style={stylingforvisuallyhiddenspan}>
|
||||
Second(s)
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
|
||||
@@ -59,31 +59,68 @@ exports[`SubSettingsComponent analyticalTimeToLive hidden 1`] = `
|
||||
}
|
||||
}
|
||||
/>
|
||||
<StyledTextFieldBase
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
<div>
|
||||
<span
|
||||
id="timetoliveon"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
>
|
||||
Time to live on
|
||||
</span>
|
||||
<StyledTextFieldBase
|
||||
aria-labelledby="timetoliveon secondssuffixforscreenreader"
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
<span
|
||||
id="secondssuffixforscreenreader"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
>
|
||||
Second(s)
|
||||
</span>
|
||||
</div>
|
||||
</Stack>
|
||||
<StyledChoiceGroup
|
||||
id="geoSpatialConfig"
|
||||
@@ -283,31 +320,68 @@ exports[`SubSettingsComponent analyticalTimeToLiveSeconds hidden 1`] = `
|
||||
}
|
||||
}
|
||||
/>
|
||||
<StyledTextFieldBase
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
<div>
|
||||
<span
|
||||
id="timetoliveon"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
>
|
||||
Time to live on
|
||||
</span>
|
||||
<StyledTextFieldBase
|
||||
aria-labelledby="timetoliveon secondssuffixforscreenreader"
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
<span
|
||||
id="secondssuffixforscreenreader"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
>
|
||||
Second(s)
|
||||
</span>
|
||||
</div>
|
||||
</Stack>
|
||||
<StyledChoiceGroup
|
||||
id="geoSpatialConfig"
|
||||
@@ -560,31 +634,68 @@ exports[`SubSettingsComponent changeFeedPolicy hidden 1`] = `
|
||||
}
|
||||
}
|
||||
/>
|
||||
<StyledTextFieldBase
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
<div>
|
||||
<span
|
||||
id="timetoliveon"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
>
|
||||
Time to live on
|
||||
</span>
|
||||
<StyledTextFieldBase
|
||||
aria-labelledby="timetoliveon secondssuffixforscreenreader"
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
<span
|
||||
id="secondssuffixforscreenreader"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
>
|
||||
Second(s)
|
||||
</span>
|
||||
</div>
|
||||
</Stack>
|
||||
<StyledChoiceGroup
|
||||
id="geoSpatialConfig"
|
||||
@@ -799,31 +910,68 @@ exports[`SubSettingsComponent renders 1`] = `
|
||||
}
|
||||
}
|
||||
/>
|
||||
<StyledTextFieldBase
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
<div>
|
||||
<span
|
||||
id="timetoliveon"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
>
|
||||
Time to live on
|
||||
</span>
|
||||
<StyledTextFieldBase
|
||||
aria-labelledby="timetoliveon secondssuffixforscreenreader"
|
||||
id="timeToLiveSeconds"
|
||||
max={2147483647}
|
||||
min={1}
|
||||
onChange={[Function]}
|
||||
required={true}
|
||||
styles={
|
||||
Object {
|
||||
"fieldGroup": Object {
|
||||
"borderColor": "",
|
||||
"height": 25,
|
||||
"selectors": Object {
|
||||
":disabled": Object {
|
||||
"backgroundColor": undefined,
|
||||
"borderColor": undefined,
|
||||
},
|
||||
},
|
||||
"width": 300,
|
||||
},
|
||||
}
|
||||
}
|
||||
suffix="second(s)"
|
||||
type="number"
|
||||
value="1000"
|
||||
/>
|
||||
<span
|
||||
id="secondssuffixforscreenreader"
|
||||
style={
|
||||
Object {
|
||||
"border": 0,
|
||||
"clip": "rect(0 0 0 0)",
|
||||
"height": "1px",
|
||||
"margin": "-1px",
|
||||
"overflow": "hidden",
|
||||
"padding": 0,
|
||||
"position": "absolute",
|
||||
"width": "1px",
|
||||
}
|
||||
}
|
||||
>
|
||||
Second(s)
|
||||
</span>
|
||||
</div>
|
||||
</Stack>
|
||||
<StyledChoiceGroup
|
||||
id="geoSpatialConfig"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import * as React from "react";
|
||||
import { AccessibleElement } from "../../Controls/AccessibleElement/AccessibleElement";
|
||||
import "./TabComponent.less";
|
||||
|
||||
export interface TabContent {
|
||||
@@ -18,15 +19,11 @@ interface TabComponentProps {
|
||||
onTabIndexChange: (newIndex: number) => void;
|
||||
hideHeader: boolean;
|
||||
}
|
||||
interface TabRefs {
|
||||
[key: string]: HTMLElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* We assume there's at least one tab
|
||||
*/
|
||||
export class TabComponent extends React.Component<TabComponentProps> {
|
||||
private tabRefs: TabRefs = {};
|
||||
public constructor(props: TabComponentProps) {
|
||||
super(props);
|
||||
|
||||
@@ -36,41 +33,11 @@ export class TabComponent extends React.Component<TabComponentProps> {
|
||||
throw new Error(msg);
|
||||
}
|
||||
}
|
||||
state = {
|
||||
activeTabIndex: this.props.currentTabIndex,
|
||||
};
|
||||
|
||||
private setActiveTab(index: number): void {
|
||||
this.setState({ activeTabIndex: index });
|
||||
this.props.onTabIndexChange(index);
|
||||
}
|
||||
private setIndex = (index: number) => {
|
||||
const tab = this.tabRefs[index];
|
||||
if (tab) {
|
||||
tab.focus();
|
||||
this.setState({ activeTabIndex: index });
|
||||
}
|
||||
};
|
||||
private handlekeypress = (event: React.KeyboardEvent<HTMLSpanElement>): void => {
|
||||
const { tabs, onTabIndexChange } = this.props;
|
||||
const { activeTabIndex } = this.state;
|
||||
const count = tabs.length;
|
||||
|
||||
const prevTab = () => {
|
||||
this.setIndex((activeTabIndex - 1 + count) % count);
|
||||
onTabIndexChange((activeTabIndex - 1 + count) % count);
|
||||
};
|
||||
const nextTab = () => {
|
||||
this.setIndex((activeTabIndex + 1) % count);
|
||||
onTabIndexChange((activeTabIndex + 1) % count);
|
||||
};
|
||||
|
||||
if (event.key === "ArrowLeft") {
|
||||
prevTab();
|
||||
} else if (event.key === "ArrowRight") {
|
||||
nextTab();
|
||||
}
|
||||
};
|
||||
|
||||
private renderTabTitles(): JSX.Element[] {
|
||||
return this.props.tabs.map((tab: Tab, index: number) => {
|
||||
@@ -80,32 +47,26 @@ export class TabComponent extends React.Component<TabComponentProps> {
|
||||
|
||||
let className = "toggleSwitch";
|
||||
let ariaselected;
|
||||
let tabindex;
|
||||
if (index === this.props.currentTabIndex) {
|
||||
className += " selectedToggle";
|
||||
ariaselected = true;
|
||||
tabindex = 0;
|
||||
} else {
|
||||
className += " unselectedToggle";
|
||||
ariaselected = false;
|
||||
tabindex = -1;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="tab" key={index}>
|
||||
<span
|
||||
<AccessibleElement
|
||||
as="span"
|
||||
className={className}
|
||||
role="tab"
|
||||
onClick={() => this.setActiveTab(index)}
|
||||
onKeyDown={(event: React.KeyboardEvent<HTMLSpanElement>) => this.handlekeypress(event)}
|
||||
onFocus={() => this.setState({ activeTabIndex: index })}
|
||||
onActivated={() => this.setActiveTab(index)}
|
||||
aria-label={`Select tab: ${tab.title}`}
|
||||
aria-selected={ariaselected}
|
||||
tabIndex={tabindex}
|
||||
ref={(element) => (this.tabRefs[index] = element)}
|
||||
>
|
||||
{tab.title}
|
||||
</span>
|
||||
</AccessibleElement>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { DefaultButton, IconButton, Image, Modal, PrimaryButton, Stack, Text } from "@fluentui/react";
|
||||
import { useCarousel } from "hooks/useCarousel";
|
||||
import React, { useState } from "react";
|
||||
import Youtube from "react-youtube";
|
||||
import { Action } from "Shared/Telemetry/TelemetryConstants";
|
||||
import { traceSuccess } from "Shared/Telemetry/TelemetryProcessor";
|
||||
import { userContext } from "UserContext";
|
||||
import { useCarousel } from "hooks/useCarousel";
|
||||
import React, { useState } from "react";
|
||||
import Youtube from "react-youtube";
|
||||
import Image1 from "../../../images/CarouselImage1.svg";
|
||||
import Image2 from "../../../images/CarouselImage2.svg";
|
||||
|
||||
@@ -25,7 +25,7 @@ export const QuickstartCarousel: React.FC<QuickstartCarouselProps> = ({
|
||||
<Stack>
|
||||
<Stack horizontal horizontalAlign="space-between" style={{ padding: 16 }}>
|
||||
<Text variant="xLarge">{getHeaderText(page)}</Text>
|
||||
<IconButton iconProps={{ iconName: "Cancel" }} onClick={() => setPage(4)} />
|
||||
<IconButton iconProps={{ iconName: "Cancel" }} onClick={() => setPage(4)} ariaLabel="Close"/>
|
||||
</Stack>
|
||||
{getContent(page)}
|
||||
<Text variant="medium" style={{ padding: "0 16px" }}>
|
||||
|
||||
@@ -134,6 +134,7 @@
|
||||
data-bind="click: selectQueryOptions, event: { keydown: onselectQueryOptionsKeyDown }"
|
||||
tabindex="0"
|
||||
role="button"
|
||||
href=""
|
||||
>
|
||||
<span>Choose Columns... </span>
|
||||
</a>
|
||||
|
||||
Reference in New Issue
Block a user