* refactor admin settings feature * separated save-restart bar to separate component * created new CE dir to facilitate code split * created separate ee dir and exporting everything we have in ce file. * little mod * minor fix * splitting settings types config * using object literals for category types instead of enums * CE: support use of component for each category * minor style fix * authentication page UI changes implemented * github signup doc url added back * removed comments * routing updates * made subcategories listing in left pane optional * added muted saml to auth listing * added breadcrumbs and enabled button * created separate component for auth page and auth config * added callout and disconnect components * updated breadcrumbs component * minor updates to common components * updated warning callout and added icon * ce: test cases fixed * updated test file name * warning banner callout added on auth page * updated callout banner for form login * CE: Split config files * CE: moved the window declaration in EE file as its dependency will be updated in EE * CE: Splitting ApiConstants and SocialLogin constants * CE: split login page * CE: moved getSocialLoginButtonProps func to EE file as it's dependencies will be updated in EE * added key icon * CE: created a factory class to share social auths list * Minor style fix for social btns * Updated the third party auth styles * Small fixes to styling * ce: splitting forms constants * breadcrumbs implemented for all pages in admin settings * Settings breadcrumbs separated * splitted settings breadcrumbs between ce and ee * renamed default import * minor style fix * added login form config. * updated login/signup pages to use form login disabled config * removed common functionality outside * implemented breadcrumb component from scratch without using blueprint * removed unwanted code * Small style update * updated breadcrumb categories file name and breadcrumb icon * added cypress tests for admin settings auth page * added comments * update locator for upgrade button * added link for intercom on upgrade button * removed unnecessary file * minor style fix * style fix for auth option cards * split messages constant * fixed imports for message constants splitting. * added message constants * updated unit test cases * fixed messages import in cypress index * fixed messages import again, cypress fails to read re-exported objs. * added OIDC auth method on authentication page * updated import statements from ee to @appsmith * removed dead code * updated read more link UI * PR comments fixes * some UI fixes * used color and fonts from theme * fixed some imports * fixed some imports * removed warning imports * updated OIDC logo and auth method desc copies * css changes * css changes * css changes * updated cypress test for breadcrumb * moved callout component to ads as calloutv2 * UI changes for form fields * updated css for spacing between form fields * added sub-text on auth pages * added active class for breadcrumb item * added config for disable signup toggle and fixed UI issues of restart banner * fixed admin settings page bugs * assigned true as default state for signup * fixed messages import statements * updated code for PR comments related suggestions * reverted file path change in cypress support * updated cypress test * updated cypress test Co-authored-by: Ankita Kinger <ankita@appsmith.com>
179 lines
4.2 KiB
TypeScript
179 lines
4.2 KiB
TypeScript
import React from "react";
|
|
|
|
import scrollIntoView from "scroll-into-view-if-needed";
|
|
|
|
import {
|
|
modText,
|
|
flashElementsById,
|
|
isMac,
|
|
flashElement,
|
|
hasClass,
|
|
} from "./helpers";
|
|
import localStorage from "./localStorage";
|
|
import { Toaster } from "components/ads/Toast";
|
|
import {
|
|
createMessage,
|
|
WIDGET_ADDED,
|
|
BULK_WIDGET_ADDED,
|
|
WIDGET_REMOVED,
|
|
BULK_WIDGET_REMOVED,
|
|
} from "@appsmith/constants/messages";
|
|
|
|
/**
|
|
* get the text for toast
|
|
*
|
|
* @param replayType
|
|
* @returns
|
|
*/
|
|
export const getReplayToastActionText = (replayType = "undo") => {
|
|
switch (replayType) {
|
|
case "undo":
|
|
return <>UNDO ({modText()}+Z) </>;
|
|
case "redo":
|
|
return isMac() ? (
|
|
<>
|
|
REDO ({modText()}+<span>⇪</span>+Z){" "}
|
|
</>
|
|
) : (
|
|
<>REDO ({modText()}+Y) </>
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* process the toast for undo/redo
|
|
*
|
|
* @param undoRedoToasts
|
|
*/
|
|
export const processUndoRedoToasts = (
|
|
undoRedoToasts: {
|
|
isCreated: boolean;
|
|
isUndo: boolean;
|
|
widgetName: string | undefined;
|
|
widgetId: string;
|
|
}[],
|
|
) => {
|
|
const { isCreated, isUndo } = undoRedoToasts[0];
|
|
const isMultipleToasts = undoRedoToasts.length > 1;
|
|
const widgetName = isMultipleToasts
|
|
? `${undoRedoToasts.length}`
|
|
: undoRedoToasts[0].widgetName;
|
|
|
|
if (isCreated)
|
|
flashElementsById(
|
|
undoRedoToasts.map((toast) => toast.widgetId),
|
|
100,
|
|
1000,
|
|
);
|
|
showUndoRedoToast(widgetName, isMultipleToasts, isCreated, !isUndo);
|
|
};
|
|
|
|
/**
|
|
* shows a toast for undo/redo
|
|
*
|
|
* @param widgetName
|
|
* @param isMultiple
|
|
* @param isCreated
|
|
* @param shouldUndo
|
|
* @returns
|
|
*/
|
|
export const showUndoRedoToast = (
|
|
widgetName: string | undefined,
|
|
isMultiple: boolean,
|
|
isCreated: boolean,
|
|
shouldUndo: boolean,
|
|
) => {
|
|
if (shouldDisallowToast(shouldUndo)) return;
|
|
|
|
const actionDescription = getActionDescription(isCreated, isMultiple);
|
|
|
|
const text = createMessage(actionDescription, widgetName);
|
|
const actionElement = getReplayToastActionText(shouldUndo ? "undo" : "redo");
|
|
|
|
Toaster.show({
|
|
text,
|
|
actionElement,
|
|
maxWidth: "500px",
|
|
});
|
|
};
|
|
|
|
function getActionDescription(isCreated: boolean, isMultiple: boolean) {
|
|
if (isCreated) return isMultiple ? BULK_WIDGET_ADDED : WIDGET_ADDED;
|
|
else return isMultiple ? BULK_WIDGET_REMOVED : WIDGET_REMOVED;
|
|
}
|
|
|
|
/**
|
|
* search the dom with id of element and scroll the page to its position
|
|
*
|
|
* @param id
|
|
*/
|
|
export const scrollWidgetIntoView = (id: string) => {
|
|
const el = document.getElementById(id);
|
|
if (el)
|
|
scrollIntoView(el, {
|
|
scrollMode: "if-needed",
|
|
block: "center",
|
|
inline: "center",
|
|
});
|
|
};
|
|
|
|
/**
|
|
* checks if toast should be shown to user or not
|
|
* if the item key is true, then disallowing showing toast
|
|
*
|
|
* @param shouldUndo
|
|
* @returns
|
|
*/
|
|
export function shouldDisallowToast(shouldUndo: boolean): boolean {
|
|
const itemKey = shouldUndo ? "undoToastShown" : "redoToastShown";
|
|
|
|
const flag = localStorage.getItem(itemKey);
|
|
|
|
if (flag === null || !flag) {
|
|
localStorage.setItem(itemKey, "true");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
export function highlightReplayElement(configProperties: Array<string> = []) {
|
|
const elements = configProperties
|
|
.map((configProperty: string) => {
|
|
const replayId = btoa(configProperty);
|
|
return document.querySelector(
|
|
`[data-replay-id="${replayId}"]`,
|
|
) as HTMLElement;
|
|
})
|
|
.filter((el) => Boolean(el));
|
|
if (elements.length === 1) {
|
|
elements[0].scrollIntoView({ behavior: "smooth" });
|
|
}
|
|
elements.forEach((element) => flashElement(element));
|
|
}
|
|
|
|
export function switchTab(replayId: string): boolean {
|
|
if (!replayId) return false;
|
|
const element = document.querySelector(
|
|
`[data-replay-id="${replayId}"]`,
|
|
) as HTMLElement;
|
|
if (!element) return false;
|
|
if (hasClass(element, "react-tabs__tab--selected")) return false;
|
|
element?.click();
|
|
return true;
|
|
}
|
|
|
|
export function expandAccordion(replayId: string): boolean {
|
|
if (!replayId) return false;
|
|
const element = document.querySelector(
|
|
`[data-replay-id="section-${replayId}"]`,
|
|
);
|
|
if (!element) return false;
|
|
const accordion = element.querySelector(
|
|
".bp3-icon-chevron-down",
|
|
) as HTMLElement;
|
|
if (!accordion) return false;
|
|
accordion.click();
|
|
return true;
|
|
}
|