PromucFlow_constructor/app/client/src/pages/Settings/SettingsForm.tsx

182 lines
5.2 KiB
TypeScript
Raw Normal View History

refactor: admin settings (#9906) * 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>
2022-02-11 18:08:46 +00:00
import React, { useCallback, useEffect } from "react";
import { saveSettings } from "actions/settingsAction";
import { SETTINGS_FORM_NAME } from "constants/forms";
import { ReduxActionTypes } from "constants/ReduxActionConstants";
import _ from "lodash";
import ProductUpdatesModal from "pages/Applications/ProductUpdatesModal";
import { connect, useDispatch } from "react-redux";
import { RouteComponentProps, useParams, withRouter } from "react-router";
import { AppState } from "reducers";
import { formValueSelector, InjectedFormProps, reduxForm } from "redux-form";
import {
getSettings,
getSettingsSavingState,
getShowReleaseNotes,
} from "selectors/settingsSelectors";
import styled from "styled-components";
import Group from "./FormGroup/group";
import RestartBanner from "./RestartBanner";
import AdminConfig from "./config";
import SaveAdminSettings from "./SaveSettings";
import { SettingTypes } from "@appsmith/pages/AdminSettings/config/types";
import SettingsBreadcrumbs from "./SettingsBreadcrumbs";
const Wrapper = styled.div`
flex-basis: calc(100% - ${(props) => props.theme.homePage.leftPane.width}px);
margin-left: ${(props) => props.theme.homePage.main.marginLeft}px;
padding-top: 40px;
height: calc(100vh - ${(props) => props.theme.homePage.header}px);
overflow: auto;
`;
const SettingsFormWrapper = styled.div``;
export const BottomSpace = styled.div`
height: ${(props) => props.theme.settings.footerHeight + 20}px;
`;
export const SettingsHeader = styled.h2`
font-size: 24px;
font-weight: 500;
text-transform: capitalize;
margin-bottom: 0;
`;
export const SettingsSubHeader = styled.div`
font-size: 12px;
`;
type FormProps = {
settings: Record<string, string>;
settingsConfig: Record<string, string | boolean>;
isSaving: boolean;
showReleaseNotes: boolean;
};
function getSettingLabel(name = "") {
return name.replace(/-/g, "");
}
function getSettingDetail(category: string, subCategory: string) {
return AdminConfig.getCategoryDetails(category, subCategory);
}
function useSettings(category: string, subCategory?: string) {
return AdminConfig.get(subCategory ?? category);
}
export function SettingsForm(
props: InjectedFormProps & RouteComponentProps & FormProps,
) {
const params = useParams() as any;
const { category, subCategory } = params;
const settings = useSettings(category, subCategory);
const details = getSettingDetail(category, subCategory);
const dispatch = useDispatch();
const isSavable = AdminConfig.savableCategories.includes(
subCategory ?? category,
);
const onSave = () => {
dispatch(saveSettings(props.settings));
};
const onClear = () => {
_.forEach(props.settingsConfig, (value, settingName) => {
const setting = AdminConfig.settingsMap[settingName];
if (setting && setting.controlType == SettingTypes.TOGGLE) {
props.settingsConfig[settingName] =
props.settingsConfig[settingName].toString() == "true";
if (
typeof props.settingsConfig["APPSMITH_SIGNUP_DISABLED"] ===
"undefined"
) {
props.settingsConfig["APPSMITH_SIGNUP_DISABLED"] = true;
}
}
});
props.initialize(props.settingsConfig);
};
useEffect(onClear, []);
const onReleaseNotesClose = useCallback(() => {
dispatch({
type: ReduxActionTypes.TOGGLE_RELEASE_NOTES,
payload: false,
});
}, []);
return (
<Wrapper>
<SettingsBreadcrumbs category={category} subCategory={subCategory} />
<SettingsFormWrapper>
<SettingsHeader>
{getSettingLabel(details?.title || (subCategory ?? category))}
</SettingsHeader>
{details?.subText && (
<SettingsSubHeader>{details.subText}</SettingsSubHeader>
)}
<Group
category={category}
settings={settings}
subCategory={subCategory}
/>
{isSavable && (
<SaveAdminSettings
isSaving={props.isSaving}
onClear={onClear}
onSave={onSave}
settings={props.settings}
valid={props.valid}
/>
)}
<BottomSpace />
</SettingsFormWrapper>
{props.showReleaseNotes && (
<ProductUpdatesModal hideTrigger isOpen onClose={onReleaseNotesClose} />
)}
<RestartBanner />
</Wrapper>
);
}
const validate = (values: Record<string, any>) => {
const errors: any = {};
_.filter(values, (value, name) => {
const message = AdminConfig.validate(name, value);
if (message) {
errors[name] = message;
}
});
return errors;
};
const selector = formValueSelector(SETTINGS_FORM_NAME);
export default withRouter(
connect((state: AppState) => {
const settingsConfig = getSettings(state);
const newProps: any = {
settings: {},
settingsConfig,
isSaving: getSettingsSavingState(state),
showReleaseNotes: getShowReleaseNotes(state),
};
_.forEach(AdminConfig.settingsMap, (setting, name) => {
const fieldValue = selector(state, name);
if (fieldValue !== settingsConfig[name]) {
newProps.settings[name] = fieldValue;
}
});
return newProps;
}, null)(
reduxForm<any, any>({
validate,
form: SETTINGS_FORM_NAME,
touchOnBlur: true,
})(SettingsForm),
),
);