2022-12-14 15:02:13 +00:00
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants" ;
2022-11-23 09:48:23 +00:00
import {
PropertyPaneConfig ,
PropertyPaneControlConfig ,
} from "constants/PropertyControlConstants" ;
2022-11-24 18:40:06 +00:00
import {
GridDefaults ,
WidgetHeightLimits ,
WidgetType ,
} from "constants/WidgetConstants" ;
2022-04-22 09:44:22 +00:00
import { WidgetProps } from "widgets/BaseWidget" ;
2022-11-23 09:48:23 +00:00
import { WidgetConfiguration } from "widgets/constants" ;
2022-04-22 09:44:22 +00:00
2022-11-23 09:48:23 +00:00
export enum RegisteredWidgetFeatures {
DYNAMIC_HEIGHT = "dynamicHeight" ,
2022-04-22 09:44:22 +00:00
}
2022-11-24 18:40:06 +00:00
interface WidgetFeatureConfig {
active : boolean ;
defaultValue? : DynamicHeight ;
sectionIndex : number ;
}
export type WidgetFeatures = Record <
RegisteredWidgetFeatures ,
WidgetFeatureConfig
> ;
2022-11-23 09:48:23 +00:00
2022-04-22 09:44:22 +00:00
export enum DynamicHeight {
2022-11-23 09:48:23 +00:00
AUTO_HEIGHT = "AUTO_HEIGHT" ,
2022-04-22 09:44:22 +00:00
FIXED = "FIXED" ,
2022-11-23 09:48:23 +00:00
AUTO_HEIGHT_WITH_LIMITS = "AUTO_HEIGHT_WITH_LIMITS" ,
2022-04-22 09:44:22 +00:00
}
2022-11-24 18:40:06 +00:00
/ * T h i s c o n t a i n s a l l p r o p e r t i e s w h i c h w i l l b e a d d e d
2022-04-22 09:44:22 +00:00
to a widget , automatically , by the Appsmith platform
Each feature , is a unique key , whose value is an object
with the list of properties to be added to a widget along
with their default values
Note : These are added to the widget configs during registration
* /
2022-11-23 09:48:23 +00:00
export const WidgetFeatureProps : Record <
RegisteredWidgetFeatures ,
Record < string , unknown >
> = {
[ RegisteredWidgetFeatures . DYNAMIC_HEIGHT ] : {
minDynamicHeight : WidgetHeightLimits.MIN_HEIGHT_IN_ROWS ,
maxDynamicHeight : WidgetHeightLimits.MAX_HEIGHT_IN_ROWS ,
2022-04-22 09:44:22 +00:00
dynamicHeight : DynamicHeight.FIXED ,
} ,
} ;
2022-11-23 09:48:23 +00:00
export const WidgetFeaturePropertyEnhancements : Record <
RegisteredWidgetFeatures ,
( config : WidgetConfiguration ) = > Record < string , unknown >
> = {
[ RegisteredWidgetFeatures . DYNAMIC_HEIGHT ] : ( config : WidgetConfiguration ) = > {
const newProperties : Partial < WidgetProps > = { } ;
2022-11-24 18:40:06 +00:00
newProperties . dynamicHeight =
config . features ? . dynamicHeight ? . defaultValue || DynamicHeight . AUTO_HEIGHT ;
2022-11-23 09:48:23 +00:00
if ( config . isCanvas ) {
newProperties . dynamicHeight = DynamicHeight . AUTO_HEIGHT ;
2022-11-24 18:40:06 +00:00
newProperties . minDynamicHeight =
config . defaults . minDynamicHeight ||
WidgetHeightLimits . MIN_CANVAS_HEIGHT_IN_ROWS ;
2022-11-23 09:48:23 +00:00
newProperties . shouldScrollContents = true ;
}
if ( config . defaults . overflow ) newProperties . overflow = "NONE" ;
return newProperties ;
} ,
} ;
function findAndUpdatePropertyPaneControlConfig (
config : PropertyPaneConfig [ ] ,
propertyPaneUpdates : Record < string , Record < string , unknown > > ,
) : PropertyPaneConfig [ ] {
return config . map ( ( sectionConfig : PropertyPaneConfig ) = > {
if (
Array . isArray ( sectionConfig . children ) &&
sectionConfig . children . length > 0
) {
Object . keys ( propertyPaneUpdates ) . forEach ( ( propertyName : string ) = > {
const controlConfigIndex :
| number
| undefined = sectionConfig . children ? . findIndex (
( controlConfig : PropertyPaneConfig ) = >
( controlConfig as PropertyPaneControlConfig ) . propertyName ===
propertyName ,
) ;
if (
controlConfigIndex !== undefined &&
controlConfigIndex > - 1 &&
sectionConfig . children
) {
sectionConfig . children [ controlConfigIndex ] = {
. . . sectionConfig . children [ controlConfigIndex ] ,
. . . propertyPaneUpdates [ propertyName ] ,
} ;
}
} ) ;
}
return sectionConfig ;
} ) ;
}
export const WidgetFeaturePropertyPaneEnhancements : Record <
RegisteredWidgetFeatures ,
2022-11-24 18:40:06 +00:00
(
config : PropertyPaneConfig [ ] ,
widgetType? : WidgetType ,
) = > PropertyPaneConfig [ ]
2022-11-23 09:48:23 +00:00
> = {
2022-11-24 18:40:06 +00:00
[ RegisteredWidgetFeatures . DYNAMIC_HEIGHT ] : (
config : PropertyPaneConfig [ ] ,
widgetType? : WidgetType ,
) = > {
2022-11-23 09:48:23 +00:00
function hideWhenDynamicHeightIsEnabled ( props : WidgetProps ) {
return (
props . dynamicHeight === DynamicHeight . AUTO_HEIGHT_WITH_LIMITS ||
props . dynamicHeight === DynamicHeight . AUTO_HEIGHT
) ;
}
2022-11-24 18:40:06 +00:00
let update = findAndUpdatePropertyPaneControlConfig ( config , {
2022-11-23 09:48:23 +00:00
shouldScrollContents : {
hidden : hideWhenDynamicHeightIsEnabled ,
dependencies : [ "dynamicHeight" ] ,
} ,
scrollContents : {
hidden : hideWhenDynamicHeightIsEnabled ,
dependencies : [ "dynamicHeight" ] ,
} ,
fixedFooter : {
hidden : hideWhenDynamicHeightIsEnabled ,
dependencies : [ "dynamicHeight" ] ,
} ,
overflow : {
hidden : hideWhenDynamicHeightIsEnabled ,
dependencies : [ "dynamicHeight" ] ,
} ,
} ) ;
2022-11-24 18:40:06 +00:00
if ( widgetType === "MODAL_WIDGET" ) {
update = findAndUpdatePropertyPaneControlConfig ( update , {
dynamicHeight : {
options : [
{
label : "Auto Height" ,
value : DynamicHeight.AUTO_HEIGHT ,
} ,
{
label : "Fixed" ,
value : DynamicHeight.FIXED ,
} ,
] ,
} ,
} ) ;
}
return update ;
2022-11-23 09:48:23 +00:00
} ,
} ;
2022-04-22 09:44:22 +00:00
/ * H i d e t h e m i n h e i g h t a n d m a x h e i g h t p r o p e r t i e s u s i n g t h i s f u n c t i o n
as the ` hidden ` hook in the property pane configuration
This function checks if the ` dynamicHeight ` property is enabled
and returns true if disabled , and false if enabled .
* /
export function hideDynamicHeightPropertyControl ( props : WidgetProps ) {
2022-11-23 09:48:23 +00:00
return props . dynamicHeight !== DynamicHeight . AUTO_HEIGHT_WITH_LIMITS ;
2022-04-22 09:44:22 +00:00
}
2022-11-23 09:48:23 +00:00
// TODO (abhinav): ADD_UNIT_TESTS
function updateMinMaxDynamicHeight (
props : WidgetProps ,
propertyName : string ,
propertyValue : unknown ,
) {
const updates = [
{
propertyPath : propertyName ,
propertyValue : propertyValue ,
} ,
] ;
if ( propertyValue === DynamicHeight . AUTO_HEIGHT_WITH_LIMITS ) {
const minDynamicHeight = parseInt ( props . minDynamicHeight , 10 ) ;
if (
isNaN ( minDynamicHeight ) ||
minDynamicHeight < WidgetHeightLimits . MIN_HEIGHT_IN_ROWS
) {
updates . push ( {
propertyPath : "minDynamicHeight" ,
propertyValue : WidgetHeightLimits.MIN_HEIGHT_IN_ROWS ,
} ) ;
}
const maxDynamicHeight = parseInt ( props . maxDynamicHeight , 10 ) ;
if (
isNaN ( maxDynamicHeight ) ||
maxDynamicHeight === WidgetHeightLimits . MAX_HEIGHT_IN_ROWS ||
maxDynamicHeight <= WidgetHeightLimits . MIN_HEIGHT_IN_ROWS
) {
updates . push ( {
propertyPath : "maxDynamicHeight" ,
2022-11-24 18:40:06 +00:00
propertyValue :
props . bottomRow - props . topRow + GridDefaults . CANVAS_EXTENSION_OFFSET ,
2022-11-23 09:48:23 +00:00
} ) ;
}
// Case where maxDynamicHeight is zero
if ( isNaN ( maxDynamicHeight ) || maxDynamicHeight === 0 ) {
updates . push ( {
propertyPath : "maxDynamicHeight" ,
propertyValue : props.bottomRow - props . topRow ,
} ) ;
}
} else if ( propertyValue === DynamicHeight . AUTO_HEIGHT ) {
2022-11-24 18:40:06 +00:00
const minHeightInRows = props . isCanvas
? WidgetHeightLimits . MIN_CANVAS_HEIGHT_IN_ROWS
: WidgetHeightLimits . MIN_HEIGHT_IN_ROWS ;
2022-11-23 09:48:23 +00:00
updates . push (
2022-04-22 09:44:22 +00:00
{
2022-11-23 09:48:23 +00:00
propertyPath : "minDynamicHeight" ,
2022-11-24 18:40:06 +00:00
propertyValue : minHeightInRows ,
2022-04-22 09:44:22 +00:00
} ,
{
2022-11-23 09:48:23 +00:00
propertyPath : "maxDynamicHeight" ,
propertyValue : WidgetHeightLimits.MAX_HEIGHT_IN_ROWS ,
2022-04-22 09:44:22 +00:00
} ,
2022-11-23 09:48:23 +00:00
) ;
}
if ( propertyValue === DynamicHeight . FIXED ) {
updates . push ( {
propertyPath : "originalBottomRow" ,
propertyValue : undefined ,
} ) ;
updates . push ( {
propertyPath : "originalTopRow" ,
propertyValue : undefined ,
} ) ;
}
// The following are updates which apply to specific widgets.
if (
propertyValue === DynamicHeight . AUTO_HEIGHT ||
propertyValue === DynamicHeight . AUTO_HEIGHT_WITH_LIMITS
) {
if ( props . dynamicHeight === DynamicHeight . FIXED ) {
updates . push ( {
propertyPath : "originalBottomRow" ,
propertyValue : props.bottomRow ,
} ) ;
updates . push ( {
propertyPath : "originalTopRow" ,
propertyValue : props.topRow ,
} ) ;
}
if ( ! props . shouldScrollContents ) {
updates . push ( {
propertyPath : "shouldScrollContents" ,
propertyValue : true ,
} ) ;
}
if ( props . overflow !== undefined ) {
updates . push ( {
propertyPath : "overflow" ,
propertyValue : "NONE" ,
} ) ;
}
if ( props . scrollContents === true ) {
updates . push ( {
propertyPath : "scrollContents" ,
propertyValue : false ,
} ) ;
}
if ( props . fixedFooter === true ) {
updates . push ( {
propertyPath : "fixedFooter" ,
propertyValue : false ,
} ) ;
}
}
return updates ;
}
// TODO FEATURE:(abhinav) Add validations to these properties
const CONTAINER_SCROLL_HELPER_TEXT =
2022-11-24 18:40:06 +00:00
"This widget shows an internal scroll when you add widgets in edit mode. It'll resize after you've added widgets. The scroll won't exist in view mode." ;
2022-11-23 09:48:23 +00:00
export const PropertyPaneConfigTemplates : Record <
RegisteredWidgetFeatures ,
PropertyPaneConfig [ ]
> = {
[ RegisteredWidgetFeatures . DYNAMIC_HEIGHT ] : [
{
helpText :
"Auto Height: Configure the way the widget height reacts to content changes." ,
propertyName : "dynamicHeight" ,
label : "Height" ,
controlType : "DROP_DOWN" ,
isBindProperty : false ,
isTriggerProperty : false ,
dependencies : [
"shouldScrollContents" ,
"maxDynamicHeight" ,
"minDynamicHeight" ,
"bottomRow" ,
"topRow" ,
"overflow" ,
"dynamicHeight" ,
"isCanvas" ,
] ,
updateHook : updateMinMaxDynamicHeight ,
helperText : ( props : WidgetProps ) = > {
return props . isCanvas &&
props . dynamicHeight === DynamicHeight . AUTO_HEIGHT
? CONTAINER_SCROLL_HELPER_TEXT
: "" ;
2022-04-22 09:44:22 +00:00
} ,
2022-11-23 09:48:23 +00:00
options : [
{
label : "Auto Height" ,
value : DynamicHeight.AUTO_HEIGHT ,
} ,
{
label : "Auto Height with limits" ,
value : DynamicHeight.AUTO_HEIGHT_WITH_LIMITS ,
} ,
{
label : "Fixed" ,
value : DynamicHeight.FIXED ,
} ,
] ,
postUpdateAction : ReduxActionTypes.CHECK_CONTAINERS_FOR_AUTO_HEIGHT ,
} ,
] ,
2022-04-22 09:44:22 +00:00
} ;