In order to unify package names, we decided to use `@appsmith` prefix as a marker to indicate that packages belong to our codebase and that these packages are developed internally. So that we can use this prefix, we need to rename the alias of the same name. But since `@appsmith` is currently being used as an alias for `ee` folder, we have to rename the alias as the first step. Related discussion https://theappsmith.slack.com/archives/CPG2ZTXEY/p1722516279126329 EE PR — https://github.com/appsmithorg/appsmith-ee/pull/4801 ## Automation /ok-to-test tags="@tag.All" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: <https://github.com/appsmithorg/appsmith/actions/runs/10267368821> > Commit: 2b00af2d257e4d4304db0a80072afef7513de6be > <a href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10267368821&attempt=2" target="_blank">Cypress dashboard</a>. > Tags: `@tag.All` > Spec: > <hr>Tue, 06 Aug 2024 14:24:22 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [x] No
200 lines
8.3 KiB
TypeScript
200 lines
8.3 KiB
TypeScript
import { getPropertyControlTypes } from "components/propertyControls";
|
|
import type {
|
|
ValidationResponse,
|
|
ValidationTypes,
|
|
} from "constants/WidgetValidation";
|
|
import type { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory";
|
|
import type { CodeEditorExpected } from "components/editorComponents/CodeEditor";
|
|
import type { UpdateWidgetPropertyPayload } from "actions/controlActions";
|
|
import type { AdditionalDynamicDataTree } from "utils/autocomplete/customTreeTypeDefCreator";
|
|
import type { Stylesheet } from "entities/AppTheming";
|
|
import type { ReduxActionType } from "ee/constants/ReduxActionConstants";
|
|
import type { PropertyUpdates } from "WidgetProvider/constants";
|
|
import type { WidgetProps } from "widgets/BaseWidget";
|
|
|
|
const ControlTypes = getPropertyControlTypes();
|
|
export type ControlType = (typeof ControlTypes)[keyof typeof ControlTypes];
|
|
|
|
export interface PropertyPaneSectionConfig {
|
|
sectionName: string;
|
|
id?: string;
|
|
children: PropertyPaneConfig[];
|
|
collapsible?: boolean; // Indicates whether the section could be collapsed or not
|
|
childrenId?: string; // A unique id generated by combining the ids of all the children
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
hidden?: (props: any, propertyPath: string) => boolean;
|
|
isDefaultOpen?: boolean;
|
|
propertySectionPath?: string;
|
|
tag?: string; // Used to show a tag right after the section name (only in the search results)
|
|
|
|
hasDynamicProperties?: boolean;
|
|
generateDynamicProperties?: (
|
|
widget: WidgetProps,
|
|
) => PropertyPaneControlConfig[];
|
|
expandedByDefault?: boolean;
|
|
}
|
|
|
|
export interface PanelConfig {
|
|
editableTitle: boolean;
|
|
titlePropertyName: string;
|
|
panelIdPropertyName: string;
|
|
children?: PropertyPaneConfig[];
|
|
contentChildren?: PropertyPaneConfig[];
|
|
styleChildren?: PropertyPaneConfig[];
|
|
searchConfig?: PropertyPaneConfig[]; // A combination of contentChildren and contentChildren which will be used to display search results
|
|
updateHook: (
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
props: any,
|
|
propertyPath: string,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
propertyValue: any,
|
|
) => Array<PropertyUpdates> | undefined;
|
|
}
|
|
|
|
export interface PropertyPaneControlConfig {
|
|
id?: string;
|
|
label: string;
|
|
propertyName: string;
|
|
// Serves in the tooltip
|
|
helpText?: string;
|
|
//Dynamic text serves below the property pane inputs
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
helperText?: ((props: any) => React.ReactNode) | React.ReactNode;
|
|
isJSConvertible?: boolean;
|
|
customJSControl?: string;
|
|
controlType: ControlType;
|
|
validationMessage?: string;
|
|
dataTreePath?: string;
|
|
children?: PropertyPaneConfig[];
|
|
panelConfig?: PanelConfig;
|
|
updateRelatedWidgetProperties?: (
|
|
propertyName: string,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
propertyValue: any,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
props: any,
|
|
) => UpdateWidgetPropertyPayload[];
|
|
updateHook?: (
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
props: any,
|
|
propertyName: string,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
propertyValue: any,
|
|
) => Array<PropertyUpdates> | undefined;
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
hidden?: (props: any, propertyPath: string) => boolean;
|
|
invisible?: boolean;
|
|
isBindProperty: boolean;
|
|
isTriggerProperty: boolean;
|
|
validation?: ValidationConfig;
|
|
useValidationMessage?: boolean;
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
additionalAutoComplete?: (props: any) => AdditionalDynamicDataTree;
|
|
evaluationSubstitutionType?: EvaluationSubstitutionType;
|
|
dependencies?: string[];
|
|
dynamicDependencies?: (widget: WidgetProps) => string[];
|
|
evaluatedDependencies?: string[]; // dependencies to be picked from the __evaluated__ object
|
|
expected?: CodeEditorExpected;
|
|
getStylesheetValue?: (
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
props: any,
|
|
propertyPath: string,
|
|
stylesheet?: Stylesheet,
|
|
) => Stylesheet[string];
|
|
// TODO(abhinav): To fix this, rename the options property of the controls which use this
|
|
// Alternatively, create a new structure
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
options?: any;
|
|
// The following should ideally be used internally
|
|
postUpdateAction?: ReduxActionType;
|
|
onBlur?: () => void;
|
|
onFocus?: () => void;
|
|
isPanelProperty?: boolean;
|
|
// Numeric Input Control
|
|
min?: number;
|
|
// Switch mode ( JS -> Text )
|
|
shouldSwitchToNormalMode?: (
|
|
isDynamic: boolean,
|
|
isToggleDisabled: boolean,
|
|
triggerFlag?: boolean,
|
|
) => boolean;
|
|
|
|
/**
|
|
* `controlConfig` is a generic record that can be used to pass additional configuration
|
|
* options to the property control. The specific structure and contents of this record
|
|
* will depend on the control type and its individual requirements.
|
|
*/
|
|
controlConfig?: Record<string, unknown>;
|
|
defaultValue?: unknown;
|
|
/** used to mark a property as reusable so that it can be reused in next dropping widget */
|
|
isReusable?: boolean;
|
|
}
|
|
|
|
interface ValidationConfigParams {
|
|
min?: number; // min allowed for a number
|
|
max?: number; // max allowed for a number
|
|
natural?: boolean; // is a positive integer
|
|
default?: unknown; // default for any type
|
|
unique?: boolean | string[]; // unique in an array (string if a particular path is unique)
|
|
required?: boolean; // required type
|
|
// required is now used to check if value is an empty string.
|
|
requiredKey?: boolean; //required key
|
|
regex?: RegExp; // validator regex for text type
|
|
allowedKeys?: Array<{
|
|
// Allowed keys in an object type
|
|
name: string;
|
|
type: ValidationTypes;
|
|
params?: ValidationConfigParams;
|
|
}>;
|
|
allowedValues?: unknown[]; // Allowed values in a string and array type
|
|
children?: ValidationConfig; // Children configurations in an ARRAY or OBJECT_ARRAY type
|
|
fn?: (
|
|
value: unknown,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
props: any,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
_?: any,
|
|
// TODO: Fix this the next time the file is edited
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
moment?: any,
|
|
) => ValidationResponse; // Function in a FUNCTION type
|
|
fnString?: string; // AUTO GENERATED, SHOULD NOT BE SET BY WIDGET DEVELOPER
|
|
expected?: CodeEditorExpected; // FUNCTION type expected type and example
|
|
strict?: boolean; //for strict string validation of TEXT type
|
|
ignoreCase?: boolean; //to ignore the case of key
|
|
type?: ValidationTypes; // Used for ValidationType.ARRAY_OF_TYPE_OR_TYPE to define sub type
|
|
types?: ValidationConfig[]; // Used for ValidationType.UNION to define sub type
|
|
params?: ValidationConfigParams; // Used for ValidationType.ARRAY_OF_TYPE_OR_TYPE to define sub type params
|
|
passThroughOnZero?: boolean; // Used for ValidationType.NUMBER to allow 0 to be passed through. Deafults value is true
|
|
limitLineBreaks?: boolean; // Used for ValidationType.TEXT to limit line breaks in a large json object.
|
|
defaultValue?: unknown; // used for ValidationType.UNION when none the union type validation is success
|
|
defaultErrorMessage?: string; // used for ValidationType.UNION when none the union type validation is success
|
|
}
|
|
|
|
export interface ValidationConfig {
|
|
type: ValidationTypes;
|
|
params?: ValidationConfigParams;
|
|
}
|
|
|
|
export type PropertyPaneConfig =
|
|
| PropertyPaneSectionConfig
|
|
| PropertyPaneControlConfig;
|
|
|
|
export interface ActionValidationConfigMap {
|
|
[configProperty: string]: ValidationConfig;
|
|
}
|