Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restore resources tab #1319

Merged
merged 33 commits into from
Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
88e2260
Restore resources tab
Dec 15, 2021
a442a56
Merge branch 'dev' into resource-explorer
millicentachieng Jan 19, 2022
61afb71
Merge branch 'dev' into resource-explorer
millicentachieng Feb 2, 2022
aa306df
Fix: Shorten overflowing resource links (#1353)
Onokaev Feb 7, 2022
b2a30a3
Update Sidebar.tsx
millicentachieng Feb 10, 2022
52195e2
Merge branch 'dev' into 'resource-explorer'
millicentachieng Feb 10, 2022
14a0155
fix overflow bug
Onokaev Feb 15, 2022
7ba5e91
disable link display
Onokaev Feb 15, 2022
5c23153
Merge branch 'dev' into resource-explorer
millicentachieng Feb 15, 2022
3675da3
Align node items on resource explorer horizontally
millicentachieng Feb 10, 2022
a16b0d3
Merge branch 'dev' into resource-explorer
millicentachieng Feb 17, 2022
7b8d918
Merge branch 'dev' into resource-explorer
millicentachieng Feb 21, 2022
5edb6d7
Simplify sortResourceLinks method
millicentachieng Feb 16, 2022
d12cafc
Search all resource nodes and expand node if hit is found in child
millicentachieng Feb 17, 2022
7ae58c0
Merge branch 'dev' into resource-explorer
millicentachieng Feb 24, 2022
03dfea7
Debounce resources search
millicentachieng Feb 24, 2022
d30a4ee
Deep copy resources when searching and filtering by version
millicentachieng Feb 24, 2022
a2d5d78
On searching resources, do not expand node if parent node is not expa…
millicentachieng Mar 2, 2022
9a0d604
Merge branch 'dev' into resource-explorer
millicentachieng Mar 2, 2022
a31219e
Use const on variable that's not been reassigned
millicentachieng Mar 2, 2022
f3251a9
switch versions using toggle button
thewahome Mar 3, 2022
b08cfcb
Merge branch 'dev' into resource-explorer
Onokaev Mar 7, 2022
e048a56
fix: ellipsis on resources (#1533)
Onokaev Mar 7, 2022
e5bb4b1
generate flattened postman collection
thewahome Mar 9, 2022
da42774
add multiple versions to collection
thewahome Mar 9, 2022
d4dcbbd
Merge branch 'dev' into resource-explorer
thewahome Mar 9, 2022
094d208
remove folder collections from test
thewahome Mar 9, 2022
c11dce0
Merge branch 'dev' into resource-explorer
thewahome Mar 14, 2022
2266cf0
discard entire collection without opening preview
thewahome Mar 14, 2022
8419731
make label inline
thewahome Mar 15, 2022
430c187
Merge branch 'dev' into resource-explorer
thewahome Mar 16, 2022
5c1b8ec
Merge branch 'dev' into resource-explorer
thewahome Mar 28, 2022
216706f
remove caret; add ariaLabel
thewahome Mar 30, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
"@types/enzyme-adapter-react-16": "1.0.5",
"@types/isomorphic-fetch": "0.0.35",
"@types/jest": "24.0.6",
"@types/lodash.debounce": "4.0.6",
"@types/react": "17.0.35",
"@types/react-dom": "17.0.11",
"@types/react-intl": "3.0.0",
Expand Down Expand Up @@ -123,4 +124,4 @@
"reportFile": "test-report.xml",
"indent": 4
}
}
}
17 changes: 15 additions & 2 deletions src/app/utils/string-operations.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
declare global {
interface String {
toSentenceCase(): String;
toSentenceCase(): string;
contains(searchText: string): boolean;
}
}

String.prototype.toSentenceCase = function () {
/**
* Converts the first character to uppercase if character is alphanumeric and the rest to lowercase
*/
String.prototype.toSentenceCase = function (): string {
return `${this.charAt(0).toUpperCase()}${this.toLowerCase().slice(1)}`;
};

/**
* Performs a case-insenstive search of a substring within a string and
* returns true if searchString appears as a substring of a string
* @param searchString search string
*/
String.prototype.contains = function (searchString: string): boolean {
return this.toLowerCase().includes(searchString.toLowerCase());
};

export {};
11 changes: 11 additions & 0 deletions src/app/views/sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import React from 'react';
import { telemetry } from '../../../telemetry';
import { translateMessage } from '../../utils/translate-messages';
import History from './history/History';
import { ResourceExplorer } from './resource-explorer';
import SampleQueries from './sample-queries/SampleQueries';
export const Sidebar = () => {
return (
Expand All @@ -19,6 +20,16 @@ export const Sidebar = () => {
>
<div id={'sample-queries-tab'}><SampleQueries /></div>
</PivotItem>
<PivotItem
headerText={translateMessage('Resources')}
itemIcon='ExploreData'
itemKey='resources'
headerButtonProps={{
'aria-controls': 'resources-tab'
}}
>
<div id={'resources-tab'}><ResourceExplorer /></div>
</PivotItem>
<PivotItem
headerText={translateMessage('History')}
itemIcon='History'
Expand Down
79 changes: 33 additions & 46 deletions src/app/views/sidebar/resource-explorer/ResourceExplorer.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import {
Breadcrumb, ChoiceGroup, DefaultButton,
IBreadcrumbItem, IChoiceGroupOption, INavLink, INavLinkGroup, Label, Nav, SearchBox, Spinner, SpinnerSize,
Stack, styled
Breadcrumb, DefaultButton,
IBreadcrumbItem, INavLink, INavLinkGroup, Label, Nav,
SearchBox, Spinner, SpinnerSize,
Stack, styled, Toggle
} from '@fluentui/react';
import React, { useEffect, useState } from 'react';
import debouce from 'lodash.debounce';
import React, { useEffect, useMemo, useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { useDispatch, useSelector } from 'react-redux';
import { telemetry, eventTypes, componentNames } from '../../../../telemetry';
import { IQuery } from '../../../../types/query-runner';

import { componentNames, eventTypes, telemetry } from '../../../../telemetry';
import { IQuery } from '../../../../types/query-runner';
import { IResource, IResourceLink, ResourceLinkType, ResourceOptions } from '../../../../types/resources';
import { IRootState } from '../../../../types/root';
import { setSampleQuery } from '../../../services/actions/query-input-action-creators';
Expand Down Expand Up @@ -40,27 +42,20 @@ const unstyledResourceExplorer = (props: any) => {
{ key: 'beta', text: 'beta', iconProps: { iconName: 'PartlyCloudyNight' } }
];
const [version, setVersion] = useState(versions[0].key);
const filteredPayload = getResourcesSupportedByVersion(data, version);
const navigationGroup = createResourcesList(filteredPayload.children, version);
const [searchText, setSearchText] = useState<string>('');
const filteredPayload = getResourcesSupportedByVersion(data.children, version, searchText);
const navigationGroup = createResourcesList(filteredPayload, version, searchText);

const [resourceItems, setResourceItems] = useState<IResource[]>(filteredPayload.children);
const [resourceItems, setResourceItems] = useState<IResource[]>(filteredPayload);
const [items, setItems] = useState<INavLinkGroup[]>(navigationGroup);

useEffect(() => {
setItems(navigationGroup);
setResourceItems(filteredPayload.children)
}, [filteredPayload.children.length]);
setResourceItems(filteredPayload)
}, [filteredPayload.length]);

const [isolated, setIsolated] = useState<any>(null);
const [searchText, setSearchText] = useState<string>('');

const performSearch = (needle: string, haystack: IResource[]) => {
const keyword = needle.toLowerCase();
return haystack.filter((sample: IResource) => {
const name = sample.segment.toLowerCase();
return name.toLowerCase().includes(keyword);
});
}
const [linkLevel, setLinkLevel] = useState(-1);

const generateBreadCrumbs = () => {
if (!!isolated && isolated.paths.length > 0) {
Expand All @@ -81,31 +76,20 @@ const unstyledResourceExplorer = (props: any) => {
dispatch(addResourcePaths(getResourcePaths(item, version)));
}

const changeVersion = (ev: React.FormEvent<HTMLElement | HTMLInputElement> | undefined,
option: IChoiceGroupOption | undefined): void => {
const selectedVersion = option!.key;
const changeVersion = (_event: React.MouseEvent<HTMLElement>, checked?: boolean | undefined): void => {
const selectedVersion = checked ? versions[1].key : versions[0].key;
setVersion(selectedVersion);
const list = getResourcesSupportedByVersion(data, selectedVersion);
const dataSet = (searchText) ? performSearch(searchText, list.children) : list.children;
setResourceItems(dataSet);
setItems(createResourcesList(dataSet, selectedVersion));
}

const changeSearchValue = (event: any, value?: string) => {
let filtered: any[] = [...data.children];
setSearchText(value || '');
if (value) {
filtered = performSearch(value, filtered);
}
const dataSet = getResourcesSupportedByVersion({
children: filtered,
labels: data.labels,
segment: data.segment
}, version).children;
setResourceItems(dataSet);
setItems(createResourcesList(dataSet, version));
const trimmedSearchText = value ? value.trim() : '';
setSearchText(trimmedSearchText);
}

const debouncedSearch = useMemo(() => {
return debouce(changeSearchValue, 300);
}, []);

const navigateToBreadCrumb = (ev?: any, item?: IBreadcrumbItem): void => {
const iterator = item!.key;
if (iterator === '/') {
Expand All @@ -130,6 +114,7 @@ const unstyledResourceExplorer = (props: any) => {
];
setItems(tree);
setIsolated(navLink);
setLinkLevel(navLink.level);
telemetry.trackEvent(eventTypes.LISTITEM_CLICK_EVENT,
{
ComponentName: componentNames.RESOURCES_ISOLATE_QUERY_LIST_ITEM,
Expand All @@ -140,8 +125,9 @@ const unstyledResourceExplorer = (props: any) => {
const disableIsolation = (): void => {
setIsolated(null);
setSearchText('');
const filtered = getResourcesSupportedByVersion(data, version);
setItems(createResourcesList(filtered.children, version));
const filtered = getResourcesSupportedByVersion(data.children, version);
setLinkLevel(-1);
setItems(createResourcesList(filtered, version));
}

const clickLink = (ev?: React.MouseEvent<HTMLElement>, item?: INavLink) => {
Expand Down Expand Up @@ -196,17 +182,17 @@ const unstyledResourceExplorer = (props: any) => {
{!isolated && <>
<SearchBox
placeholder={translateMessage('Search resources')}
onChange={changeSearchValue}
onChange={debouncedSearch}
disabled={!!isolated}
styles={searchBoxStyles}
/>
<hr />
<Stack wrap tokens={{ childrenGap: 10, padding: 10 }}>
<ChoiceGroup
label={translateMessage('Select version')}
defaultSelectedKey={version}
options={versions}
<Toggle label={`${translateMessage('Switch to beta')}`}
onChange={changeVersion}
onText={translateMessage('On')}
offText={translateMessage('Off')}
inlineLabel
/>
</Stack>
</>}
Expand Down Expand Up @@ -246,6 +232,7 @@ const unstyledResourceExplorer = (props: any) => {
link={link}
isolateTree={isolateTree}
resourceOptionSelected={(activity: string, context: unknown) => resourceOptionSelected(activity, context)}
linkLevel={linkLevel}
classes={classes}
/>
}}
Expand Down
21 changes: 13 additions & 8 deletions src/app/views/sidebar/resource-explorer/ResourceLink.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import { FormattedMessage } from 'react-intl';
import { ResourceLinkType, ResourceOptions } from '../../../../types/resources';
import { getStyleFor } from '../../../utils/http-methods.utils';
import { translateMessage } from '../../../utils/translate-messages';

interface IResourceLinkProps {
link: any;
isolateTree: Function;
resourceOptionSelected: Function;
linkLevel: number;
classes: any;
}

Expand All @@ -22,9 +22,10 @@ const ResourceLink = (props: IResourceLinkProps) => {
const tooltipId = getId('tooltip');
const buttonId = getId('targetButton');


const iconButtonStyles = {
root: { paddingBottom: 10 },
menuIcon: { fontSize: 20, padding: 10 }
root: { paddingBottom:10, marginTop: -5, marginRight: 2 },
menuIcon: { fontSize: 20, padding: 5 }
};

const methodButtonStyles: CSSProperties = {
Expand All @@ -44,8 +45,12 @@ const ResourceLink = (props: IResourceLinkProps) => {
>
{resourceLink.method}
</span>}
{resourceLink.name}

<span className={linkStyle.resourceLinkNameContainer}>
<span className={linkStyle.resourceLinkText}>
{resourceLink.name}
</span>
</span>

{items.length > 0 &&
<TooltipHost
Expand All @@ -65,7 +70,6 @@ const ResourceLink = (props: IResourceLinkProps) => {
role='button'
id={buttonId}
aria-describedby={tooltipId}
className={linkStyle.button}
styles={iconButtonStyles}
menuIconProps={{ iconName: 'MoreVertical' }}
title={translateMessage('More actions')}
Expand All @@ -77,7 +81,7 @@ const ResourceLink = (props: IResourceLinkProps) => {
/>
</TooltipHost>
}
</span>;
</span>

function getMenuItems() {
const menuItems: IContextualMenuItem[] = [];
Expand Down Expand Up @@ -108,8 +112,9 @@ const ResourceLink = (props: IResourceLinkProps) => {

const linkStyle = mergeStyleSets(
{
link: { display: 'flex', lineHeight: 'normal' },
button: { float: 'right', position: 'absolute', right: 0 }
link: { display: 'flex', lineHeight: 'normal', width: '100%', overflow: 'hidden' },
resourceLinkNameContainer: { textAlign: 'left', flex: '1', overflow:'hidden', display: 'flex' },
resourceLinkText: { textOverflow: 'ellipsis', overflow: 'hidden', whiteSpace: 'nowrap' }
}
);

Expand Down
Loading