diff --git a/src/Sass/_domains.scss b/src/Sass/_domains.scss index 236d2da..fbfb311 100644 --- a/src/Sass/_domains.scss +++ b/src/Sass/_domains.scss @@ -1,19 +1,36 @@ -@import './_esuiteVariables.scss'; +@import "./_esuiteVariables.scss"; .two-column-grid-1-1 { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: $gridGap; + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: $gridGap; } .two-column-grid-1-3 { - display: grid; - grid-template-columns: 1fr 3fr; - grid-gap: $gridGap; + display: grid; + grid-template-columns: 1fr 3fr; + grid-gap: $gridGap; } .mail-types { - padding-left: 0rem; - list-style: none; - width: $mailtemplateNameListWidth; -} \ No newline at end of file + padding-left: 0rem; + list-style: none; + width: $mailtemplateNameListWidth; + + li { + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 4px; + transition: background-color 0.2s ease; + + &:hover { + background-color: rgba(0, 0, 0, 0.05); + } + + &.selected { + background-color: #0078d4; + color: white; + font-weight: 500; + } + } +} diff --git a/src/components/common/HorizionalTabs.tsx b/src/components/common/HorizionalTabs.tsx index a1434ac..c2fa079 100644 --- a/src/components/common/HorizionalTabs.tsx +++ b/src/components/common/HorizionalTabs.tsx @@ -3,17 +3,22 @@ import TabHeader from "./TabHeader"; interface HorizontalTabsProps { children: JSX.Element[]; + initialTab?: string; } -const HorizontalTabs: React.FC = ({ children }) => { +const HorizontalTabs: React.FC = ({ + children, + initialTab, +}) => { const [activeTab, setActiveTab] = useState(""); // Set initial tab on mount useEffect(() => { if (children.length > 0) { - setActiveTab(children[0].props.label); + const tabToSelect = initialTab || children[0].props.label; + setActiveTab(tabToSelect); } - }, [children]); + }, [children, initialTab]); const onClickTabItem = useCallback((tab: string) => { setActiveTab((prev) => (prev !== tab ? tab : prev)); diff --git a/src/components/common/formHelpers.ts b/src/components/common/formHelpers.ts new file mode 100644 index 0000000..84be9e7 --- /dev/null +++ b/src/components/common/formHelpers.ts @@ -0,0 +1,644 @@ +export * from "./formHelpers.tsx"; +/* +import React from "react"; +import Input, { InputType } from "./Input"; +import ToggleSlider from "./ToggleSlider"; +import Select from "./Select"; +import Option from "./option"; +import { GeneralIdRef } from "../../utils/GeneralIdRef"; +import SequencePicker from "../pickers/SequencePicker"; +import GlossaryPicker from "../pickers/GlossaryPicker"; +import CustomFieldsEditor, { CustomFieldEditorAdd, CustomFieldEditorDelete } from "./CustomFieldsEditor"; +import { CustomField, numberParams, textParams } from "../../modules/manager/customfields/services/customFieldsService"; +import FormTemplatePicker from "../pickers/FormTemplatePicker"; +import { CustomFieldValue } from "../../modules/manager/glossary/services/glossaryService"; +import TemplateEditor from "./TemplateEditor"; +import DomainPicker from "../pickers/DomainPicker"; +import UserPicker from "../pickers/UserPicker"; +import Button, { ButtonType } from "./Button"; +import Expando from "./expando"; +import ErrorBlock from "./ErrorBlock"; +import SsoProviderPicker from "../pickers/SsoProviderPicker"; +import { FormData, FormError } from "./useForm"; + +export const renderButton = ( + label: string, + errors: FormError, + name?: string, + onClick?: (keyValue: any) => void, + testid?: string, + enabled: boolean = true, + buttonType: ButtonType = ButtonType.primary, + overrideErrorChecking: boolean = false +) => { + let disabled = !enabled || Object.keys(errors).filter((x) => !x.startsWith("_")).length > 0; + + if (overrideErrorChecking) disabled = !enabled; + + return ( + + ); +}; + +export const renderError = (name: string, errors: FormError) => { + return ; +}; + +export const renderInput = ( + name: string, + label: string, + data: FormData, + errors: FormError, + type: InputType = InputType.text, + readOnly = false, + defaultValue: string = "", + placeHolder: string = "", + maxLength: number = 0, + visible: boolean = true, + autoComplete: string | undefined = undefined, + onChange?: (e: React.ChangeEvent) => void +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = (value as CustomFieldValue).displayValue ?? (value as CustomFieldValue).value.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderInputWithChangeEvent = ( + name: string, + label: string, + data: FormData, + errors: FormError, + type: InputType = InputType.text, + readOnly = false, + handleChangeEvent?: (e: React.ChangeEvent) => void, + defaultValue: string = "", + placeHolder: string = "", + maxLength: number = 0 +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = (value as CustomFieldValue).displayValue ?? (value as CustomFieldValue).value.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderInputNumber = ( + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + min?: number, + max?: number, + step: number = 1, + onChange?: (e: React.ChangeEvent) => void +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = (value as CustomFieldValue).displayValue ?? (value as CustomFieldValue).value.toString(); + } + + if (readOnly) { + return ; + } else { + return ( + + ); + } +}; + +export const renderInputTextarea = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + onTextAreaChange?: (e: React.ChangeEvent) => void +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderCustomFieldInput = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + type: InputType = InputType.text, + readOnly = false, + defaultValue: string = "", + onChange?: (e: React.ChangeEvent) => void +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + const customFieldValue = value as CustomFieldValue[]; + cleanValue = customFieldValue[0].displayValue ?? customFieldValue[0].value?.toString(); + } + + if (readOnly) { + return ; + } else { + return ( + + ); + } +}; + +export const renderCustomFieldNumber = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + min?: number, + max?: number, + step: number = 1, + onChange?: (e: React.ChangeEvent) => void +) => { + let values: CustomFieldValue[] = data[name] as CustomFieldValue[]; + + let value: CustomFieldValue | undefined = undefined; + + if (values) { + if (values.length > 0) { + value = values[0]; + } + } + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = (value as CustomFieldValue).displayValue ?? (value as CustomFieldValue).value?.toString(); + } + + if (readOnly) { + return ; + } else { + return ( + + ); + } +}; + +export const renderTemplateEditor = ( + className: string, + name: string, + label: string, + data: FormData, + allowCustomFields: boolean, + onChange?: (name: string, value: string) => void +) => { + let value = data[name] as string; + + return ( +
+ + +
+ ); +}; + +export const renderSelect = ( + name: string, + label: string, + data: FormData, + errors: FormError, + options: Option[], + onChange?: (e: React.ChangeEvent) => void +) => { + return + ); + } else { + return ( + + ); + } +}; + +export const renderInputWithChangeEvent = ( + name: string, + label: string, + data: FormData, + errors: FormError, + type: InputType = InputType.text, + readOnly = false, + handleChangeEvent?: (e: React.ChangeEvent) => void, + defaultValue: string = "", + placeHolder: string = "", + maxLength: number = 0, +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = + (value as CustomFieldValue).displayValue ?? + (value as CustomFieldValue).value.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderInputNumber = ( + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + min?: number, + max?: number, + step: number = 1, + onChange?: (e: React.ChangeEvent) => void, +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = + (value as CustomFieldValue).displayValue ?? + (value as CustomFieldValue).value.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderInputTextarea = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + onTextAreaChange?: (e: React.ChangeEvent) => void, +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderCustomFieldInput = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + type: InputType = InputType.text, + readOnly = false, + defaultValue: string = "", + onChange?: (e: React.ChangeEvent) => void, +) => { + let value = data[name]; + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (typeof value === "boolean") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + const customFieldValue = value as CustomFieldValue[]; + cleanValue = + customFieldValue[0].displayValue ?? customFieldValue[0].value?.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderCustomFieldNumber = ( + includeLabel: boolean, + name: string, + label: string, + data: FormData, + errors: FormError, + readOnly = false, + defaultValue: string = "", + min?: number, + max?: number, + step: number = 1, + onChange?: (e: React.ChangeEvent) => void, +) => { + let values: CustomFieldValue[] = data[name] as CustomFieldValue[]; + + let value: CustomFieldValue | undefined = undefined; + + if (values) { + if (values.length > 0) { + value = values[0]; + } + } + + let cleanValue: string | undefined; + if (value === undefined) { + cleanValue = defaultValue; + } else if (typeof value === "string") { + cleanValue = value as string; + } else if (typeof value === "number") { + cleanValue = String(value); + } else if (value as CustomFieldValue) { + cleanValue = + (value as CustomFieldValue).displayValue ?? + (value as CustomFieldValue).value?.toString(); + } + + if (readOnly) { + return ( + + ); + } else { + return ( + + ); + } +}; + +export const renderTemplateEditor = ( + className: string, + name: string, + label: string, + data: FormData, + allowCustomFields: boolean, + onChange?: (name: string, value: string) => void, +) => { + let value = data[name] as string; + + return ( +
+ + {})} + showFields={allowCustomFields} + /> +
+ ); +}; + +export const renderSelect = ( + name: string, + label: string, + data: FormData, + errors: FormError, + options: Option[], + onChange?: (e: React.ChangeEvent) => void, +) => { + return ( +