* temp commit * using onsubmit to continue using action on form * added recaptcha site key to env example file * moved the recaptcha lib loading logic to signup page * removed unnecessary edit * handle the case where the recaptcha token is not provided as env var * added proper env var config for client * recaptcha config for ansible * recaptcha config for heroku * recaptcha config for k8s * updated app.json * fixed the typos * added more description for env vars * removed api key * minor typo fix * added new integration button * updated the add int default link * added active and create new tabs * added the empty components to tabs. will control the section manually. * added proper grid for integrations page * added vertical tabs * Added secondary tabs to integrations page * added separate page for new apis * classname changes * added new components for active queries, new queries etc. * added a separate component for data source list * adding screen component conditionally, to be showing upon user's choice * 1. Added grid styling to datasource home 2. Added connect buttons to em * fixed data source security banner * updated the styling for new api page * added tertiary menu for active integrations * updated styling for active connections * updated collapse component to work properly * added show more option to active data sources * removed apis/db tabs and replaced em with integrations tab * removed the unnecessary + integrations btn * Ordered the action entries under integrations * updated the getURL with proper params * updated the link of create datasource btn * updated the back btn link from data source editor * added scrollable content to create new * added on click scroll to create new page * fixed a bug, creating new datasource twice * added new action creator for integrations. * updated the query editor to match the over all theme * updated the query editor tabs * Added the run btn to empty response screens * minor fix * updated the bg color of api type drop down * updated the url being visited after delete api/query * removed log * removed unnecessary junk from integrations editor index * clean up, removed unnecessary files * removed useless routes * for debugger only checking if integrations editor * Removed all the links for api/query home pages * not routing to integrations on create query/api * removed the query/datasource/api home pages * fixed scrolling issue * will show a list of queries and apis for action picker * showing icons for each action under integrations * added a way to list data sources in action creators * cam show icons for datasources * linked integration tab movement to URL * fixed the create new query bug * removed search * added the auto redirection mode * added new mode to support showing mock data bases * on click show more works properly * removed extra padding * removed height * showing all the data sources on active tab * fixed the creation of google sheet * updated the proper routing for curl * fixed page height * removed loader * added a spinner for creating a new api * will be showing edit/add query permanantly * updated the redirection on save and delete datasource * fixed the redirection logic on delete * will not show security banner * added empty state for active data sources * updated the hover state * minor fix to redirect on delete from entity pane * fixed a cy command to create new api * fixed a command to select api/query from lightning menu * updated the navigate to data source editor * removed add btns for new int creation * updated the testSaveDeleteDatasource command * fixed bind table text pagination spec * more test case fixes for deleting a query using context menu * update curl test * updated curl post import spec * fixed click from apis to integrations * updated execute db query command + updated delete query mech * updated CreationOfUniqueAPIcheck command * updated query datasource spec * fixed an action creator bug. * fixed curl api creation bug * removed irrelavent part of the test * fixed the button colors * updated back link from datasource page * Revert url validation changes for the debugger since this is used to check whether we are on a query or an api and show its dependencies * updated a test case to open integrations option in action selectors * Update app/client/src/pages/Editor/IntegrationEditor/DatasourceCard.tsx Co-authored-by: Rishabh Saxena <rishabh.robben@gmail.com> * separated msg * styling fixes for collapse component * renamed a file * declared a new const in theme * updated border * removed a faint line from collapse card * removed unnecessary condition * updated component name * log removed * split action creator file * updated the icon usage in action creators * can properly fetch mock data sources * can show mock databases in create new * can use mock db sources * fixed the scrollbars * updated the api icon for both global search + action creator * updated integrations name in datasources * added a back to canvas ribbon * updated query and api editor to show back to canvas ribbon * added a ribbon to go back * updated button styles * updated the action creator and test commands/classes * updates to show the proper mock databases * added proper type for mock datasources * removed unnecessary log * updated a test case to work with new nav * minor updates for tests * updated a command to properly delete a datasource * minor redirection fix * made the mock db api call unblocking * fixed scroll bars all over * fixed bg colors for back ribbons * declared a constant for thin scrollbar * removed unnecessary action. Co-authored-by: Akash N <akash@codemonk.in> Co-authored-by: Rishabh Saxena <rishabh.robben@gmail.com>
242 lines
6.5 KiB
TypeScript
242 lines
6.5 KiB
TypeScript
import React, { useState } from "react";
|
|
import { find, noop } from "lodash";
|
|
import { DropdownOption } from "widgets/DropdownWidget";
|
|
import {
|
|
PopoverInteractionKind,
|
|
PopoverPosition,
|
|
IPopoverSharedProps,
|
|
MenuItem,
|
|
Popover,
|
|
Menu,
|
|
Button,
|
|
Classes,
|
|
} from "@blueprintjs/core";
|
|
import styled from "styled-components";
|
|
import { IconNames } from "@blueprintjs/icons";
|
|
|
|
export type TreeDropdownOption = DropdownOption & {
|
|
onSelect?: (value: TreeDropdownOption, setter?: Setter) => void;
|
|
children?: TreeDropdownOption[];
|
|
className?: string;
|
|
type?: string;
|
|
icon?: React.ReactNode;
|
|
};
|
|
|
|
type Setter = (value: TreeDropdownOption, defaultVal?: string) => void;
|
|
|
|
type TreeDropdownProps = {
|
|
optionTree: TreeDropdownOption[];
|
|
selectedValue: string;
|
|
getDefaults?: (value: any) => any;
|
|
defaultText: string;
|
|
onSelect: Setter;
|
|
selectedLabelModifier?: (
|
|
option: TreeDropdownOption,
|
|
displayValue?: string,
|
|
) => React.ReactNode;
|
|
displayValue?: string;
|
|
toggle?: React.ReactNode;
|
|
className?: string;
|
|
modifiers?: IPopoverSharedProps["modifiers"];
|
|
onMenuToggle?: (isOpen: boolean) => void;
|
|
};
|
|
|
|
const StyledMenu = styled(Menu)`
|
|
min-width: 220px;
|
|
padding: 0px;
|
|
border-radius: 0px;
|
|
background-color: ${(props) => props.theme.colors.treeDropdown.menuBg.normal};
|
|
.${Classes.MENU} {
|
|
min-width: 220px;
|
|
padding: 0px;
|
|
border-radius: 0px;
|
|
background-color: ${(props) =>
|
|
props.theme.colors.treeDropdown.menuBg.normal};
|
|
}
|
|
.${Classes.MENU_ITEM} {
|
|
border-radius: 0px;
|
|
font-size: 14px;
|
|
line-height: 14px;
|
|
display: flex;
|
|
align-items: center;
|
|
height: 30px;
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.normal};
|
|
.${Classes.ICON} > svg:not([fill]) {
|
|
margin-top: 0px;
|
|
fill: #9f9f9f;
|
|
}
|
|
|
|
&:hover {
|
|
background-color: ${(props) =>
|
|
props.theme.colors.treeDropdown.menuBg.hover};
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.hover};
|
|
.${Classes.ICON} > svg:not([fill]) {
|
|
fill: ${(props) => props.theme.colors.treeDropdown.menuText.hover};
|
|
}
|
|
}
|
|
|
|
&.${Classes.ACTIVE} {
|
|
background-color: ${(props) =>
|
|
props.theme.colors.treeDropdown.menuBg.selected};
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.selected};
|
|
.${Classes.ICON} > svg:not([fill]) {
|
|
fill: ${(props) => props.theme.colors.treeDropdown.menuText.selected};
|
|
}
|
|
}
|
|
}
|
|
.${Classes.MENU_SUBMENU}
|
|
.${Classes.POPOVER_TARGET}.${Classes.POPOVER_OPEN}
|
|
> .${Classes.MENU_ITEM} {
|
|
background-color: ${(props) =>
|
|
props.theme.colors.treeDropdown.menuBg.hover};
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.hover};
|
|
}
|
|
`;
|
|
|
|
const DropdownTarget = styled.div`
|
|
&&&& .${Classes.BUTTON} {
|
|
width: 100%;
|
|
box-shadow: none;
|
|
border-radius: 0px;
|
|
background-color: ${(props) => props.theme.colors.treeDropdown.targetBg};
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.normal};
|
|
background-image: none;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
padding: 5px 12px;
|
|
}
|
|
&&&& .${Classes.ICON} {
|
|
color: ${(props) => props.theme.colors.treeDropdown.menuText.normal};
|
|
}
|
|
`;
|
|
|
|
function getSelectedOption(
|
|
selectedValue: string,
|
|
defaultText: string,
|
|
options: TreeDropdownOption[],
|
|
) {
|
|
let selectedOption: TreeDropdownOption = {
|
|
label: defaultText,
|
|
value: "",
|
|
};
|
|
options.length > 0 &&
|
|
options.forEach((option) => {
|
|
// Find the selected option in the OptionsTree
|
|
if (option.value === selectedValue) {
|
|
selectedOption = option;
|
|
} else {
|
|
const childOption = find(option.children, {
|
|
value: selectedValue,
|
|
});
|
|
if (childOption) {
|
|
selectedOption = childOption;
|
|
}
|
|
}
|
|
});
|
|
return selectedOption;
|
|
}
|
|
|
|
export default function TreeDropdown(props: TreeDropdownProps) {
|
|
const {
|
|
defaultText,
|
|
displayValue,
|
|
getDefaults,
|
|
onSelect,
|
|
optionTree,
|
|
selectedLabelModifier,
|
|
selectedValue,
|
|
toggle,
|
|
} = props;
|
|
const selectedOption = getSelectedOption(
|
|
selectedValue,
|
|
defaultText,
|
|
optionTree,
|
|
);
|
|
|
|
const [isOpen, setIsOpen] = useState<boolean>(false);
|
|
|
|
const handleSelect = (option: TreeDropdownOption) => {
|
|
if (option.onSelect) {
|
|
option.onSelect(option, props.onSelect);
|
|
} else {
|
|
const defaultVal = getDefaults ? getDefaults(option.value) : undefined;
|
|
onSelect(option, defaultVal);
|
|
}
|
|
};
|
|
|
|
function renderTreeOption(option: TreeDropdownOption) {
|
|
const isSelected =
|
|
selectedOption.value === option.value ||
|
|
selectedOption.type === option.value;
|
|
return (
|
|
<MenuItem
|
|
active={isSelected}
|
|
className={option.className || "single-select"}
|
|
icon={option.icon}
|
|
intent={option.intent}
|
|
key={option.value}
|
|
onClick={
|
|
option.children
|
|
? noop
|
|
: (e: any) => {
|
|
handleSelect(option);
|
|
setIsOpen(false);
|
|
props.onMenuToggle && props.onMenuToggle(false);
|
|
e.stopPropagation();
|
|
}
|
|
}
|
|
popoverProps={{
|
|
minimal: true,
|
|
interactionKind: PopoverInteractionKind.CLICK,
|
|
position: PopoverPosition.LEFT,
|
|
targetProps: { onClick: (e: any) => e.stopPropagation() },
|
|
}}
|
|
text={option.label}
|
|
>
|
|
{option.children && option.children.map(renderTreeOption)}
|
|
</MenuItem>
|
|
);
|
|
}
|
|
|
|
const list = optionTree.map(renderTreeOption);
|
|
const menuItems = <StyledMenu>{list}</StyledMenu>;
|
|
const defaultToggle = (
|
|
<DropdownTarget>
|
|
<Button
|
|
className={`t--open-dropdown-${defaultText.split(" ").join("-")} ${
|
|
selectedLabelModifier ? "code-highlight" : ""
|
|
}`}
|
|
rightIcon={IconNames.CHEVRON_DOWN}
|
|
text={
|
|
selectedLabelModifier
|
|
? selectedLabelModifier(selectedOption, displayValue)
|
|
: selectedOption.label
|
|
}
|
|
/>
|
|
</DropdownTarget>
|
|
);
|
|
return (
|
|
<Popover
|
|
className="wrapper-popover"
|
|
content={menuItems}
|
|
isOpen={isOpen}
|
|
minimal
|
|
modifiers={props.modifiers}
|
|
onClose={() => {
|
|
setIsOpen(false);
|
|
props.onMenuToggle && props.onMenuToggle(false);
|
|
}}
|
|
position={PopoverPosition.LEFT}
|
|
targetProps={{
|
|
onClick: (e: any) => {
|
|
setIsOpen(true);
|
|
props.onMenuToggle && props.onMenuToggle(true);
|
|
e.stopPropagation();
|
|
},
|
|
}}
|
|
>
|
|
{toggle ? toggle : defaultToggle}
|
|
</Popover>
|
|
);
|
|
}
|