2022-02-02 14:15:07 +00:00
import React from "react" ;
import BaseWidget , { WidgetProps , WidgetState } from "../../BaseWidget" ;
import { WidgetType } from "constants/WidgetConstants" ;
import { EventType } from "constants/AppsmithActionConstants/ActionConstants" ;
import SelectComponent from "../component" ;
import { DropdownOption } from "../constants" ;
2022-02-22 08:43:35 +00:00
import {
ValidationResponse ,
ValidationTypes ,
} from "constants/WidgetValidation" ;
2022-02-02 14:15:07 +00:00
import { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory" ;
import { MinimumPopupRows , GRID_DENSITY_MIGRATION_V1 } from "widgets/constants" ;
feat: Controls for labels in widgets to align the widgets in forms and other places (#10600)
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Create a new property control for a label position
-- Create a new property control for a label alignment
-- Prototype a label section for Input widget
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Add a property, labelWidth in the property pane
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Input widget: Implement all the requirements in case its type is Text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adapt the functionalty on other types of the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into DropdownWidget
-- Clean up for the input widget and DRY
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectWidget
-- Eliminate unnecessary component prop, columns
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalties into Tree Select widget
-- Add styles for alignment between lable and input control over the widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectTreeWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Introduce label functionalities into DatePickerWidget2
-- Use width instead of columns prop in InputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RichTextEditorWidget
-- Eliminate compactMode from StyledLabel
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into CheckboxGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement switch group for the correct meaning of right alignment
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RadioGroupWidget
-- Add new properties, alignment and inline for consistency
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adjust cols and rows for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused StyledRadioProps
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete first MVP of enhanced SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete the first MVP of enhanced RadioGroupWidget
-- Eliminate unused StyledSwitch component for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add min-height, align-self rules for LabelContainer
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Use original label property for RadioGroupWidget
-- Add a migration for adding isInline and alignment properties for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Update version to latest one in DSLMigrationsUtils.test.ts
* fix failing jest test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement label functionalities on BaseInputWidget, InputWidgetV2, CurrencyInputWidget, PhoneInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DSLMigrationsUtils
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the label related test case which is failed in Input_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on #10119: The label text truncates on resizing the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix scroll issue when shrink with MultiSelectWidget and MultiSelectTreeWidget
* fix: Widget Popup test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement width and alginment features on the level of label element
-- Prevent actual inputs from DropdownWidget, MultiSelectWidget, SingleSelectTreeWidget, MultiSelectTreeWidget from overflow when resizing
-- Enable label feature on a RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set label container's default width to 33% when width is not set
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix crash issue when labelWidth is filled by non-numeric value, eliminating passing NaN as its value
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set flex-grow to zero on input types other than TEXT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label features on newly created MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate LabelPositionTypes, directly using enum LabelPosition
-- Add a comment for a constant LABEL_MAX_WIDTH_RATE
-- Directly import React for LabelAlignmentOptionsControl
-- Remove unnecessary constructor for LabelAlignmentOptionsControl
-- Define handleAlign instance method as a higher-order function
-- Only migrate alignment property for RadioGroupWidget
-- Use Object.hasOwnProperty instead of in operator
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Migrate alignment property of RadioGroupWidget in case of currentDSL.version is 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Revert currentDSL.version to 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a Jest test case for RadioGroupWidget's alignment property migration
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Replace all nested ternary operators with if statements
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label feature on new version of SelectWidget
-- Add Cypress tests for widgets' label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor code for BaseInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change CSS selector for step buttons for Numeric BaseInputWidget
-- Directly use migrateRadioGroupAlignmentProperty migration function without using transformDSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on typo about migrateRadioGroupAlignmentProperty
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add data-testid attributes for Cypress selectors
* feat: Deprecate form button widget
-- Assert flex-direction to row in CheckboxGroup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a missing data-testid for SelectWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on failed test cases: CheckboxGroup_spec, DatePicker_2_spec, MultiSelectWidgetV2
* fix: Select popup DSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new property control, NumericInputControl
-- Replace all the label properties with the newly created controls
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new Cypress command, checkLabelWidth and apply to all related test cases
-- Increase width in checkboxgroupDsl.json
-- Rename className for label in MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement the tooltip feature for labels
-- Add missing props for labels in DateField, MultiSelectField, RadioGroupField, SelectField fields for JSONFormWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor property controls, including LabelPositionOptionsControl, LabelAlignmentOptionsControl, NumericInputControl to keep consistency
-- Apply default values into label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract the label related parts from the various widgets as an independent component
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate TypeScript any type from BaseInputComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change labelPosition property type to DROP_DOWN
-- Modify LabelAlignmentOptionsControl to use ButtonTabComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Define getLabelWidth method into BaseWidget
-- Extract the common CSS rules for the widget containers
-- Revert rows and columns for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed test case in DSLMigrationsUtils.test.ts
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on overflow issue on CheckboxGroupWidget
-- Create a distinctive spec file for label feature
-- Eliminate the redundant label specs with the relevant widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Delete unnecessary files, including Select_spec.js, LabelButton.tsx and LabelPositionOptionsControl.tsx
-- Revise wrong comment for checkLabelForWidget Cypress command
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Do not set the label width only if its value is 0
-- Clean up the component for DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Make RadioGroupWidget's layout flexible in all modes
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on Cypress test case for RadioGroupWidget in Widgets_Labels_spec
-- Change Cypress commands, including addAction, addSuccessMessage, enterActionValue to accept parentSelector
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change getLabelWidth method to not have any argument
-- Define some constants for label numbers
-- Extract the common styles for SwitchGroupWidget and RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor some constants
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused width prop from RadioGroupWidget
-- Get labelWidth from getLabelWidth
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate the min-height restriction on a label
-- Eliminate the scroll on the earlier InputWidgetV2 which was not in compact mode
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add one more condition checking if the current input type is text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract common code base for MultiSelectTreeWidget and MultiSelectWidgetV2
-- Apply a few CSS fixes on the scrollbar issue select related widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply some tweaks for earlier widgets with labels so as not to be broken UX
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed Cypress test case in Widget_Popup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add constants, LABEL_DEFAULT_WIDTH_RATE, SELECT_DEFAULT_HEIGHT, LABEL_MARGIN_OLD_SELECT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Increase the widths of CheckboxGroupWidget and SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set the font size to 14px for NumericInputControl
Co-authored-by: ohansFavour <fohanekwu@gmail.com>
Co-authored-by: Tolulope Adetula <31691737+Tooluloope@users.noreply.github.com>
2022-04-14 08:47:25 +00:00
import { LabelPosition } from "components/constants" ;
import { Alignment } from "@blueprintjs/core" ;
2022-11-27 06:11:01 +00:00
import { AutocompleteDataType } from "utils/autocomplete/CodemirrorTernService" ;
2022-04-04 05:27:03 +00:00
import {
findIndex ,
isArray ,
2022-08-01 05:02:48 +00:00
isNil ,
2022-04-04 05:27:03 +00:00
isNumber ,
isString ,
LoDashStatic ,
} from "lodash" ;
2022-11-23 09:48:23 +00:00
import { isAutoHeightEnabledForWidget } from "widgets/WidgetUtils" ;
2022-09-02 09:16:30 +00:00
import equal from "fast-deep-equal/es6" ;
2022-08-01 05:02:48 +00:00
import derivedProperties from "./parseDerivedProperties" ;
2022-11-28 04:44:31 +00:00
import { Stylesheet } from "entities/AppTheming" ;
2022-02-22 08:43:35 +00:00
export function defaultOptionValueValidation (
value : unknown ,
props : SelectWidgetProps ,
2022-03-29 07:07:01 +00:00
_ : LoDashStatic ,
2022-02-22 08:43:35 +00:00
) : ValidationResponse {
let isValid ;
let parsed ;
let message = "" ;
2022-08-01 05:02:48 +00:00
const isServerSideFiltered = props . serverSideFiltering ;
// TODO: validation of defaultOption is dependent on serverSideFiltering and options, this property should reValidated once the dependencies change
//this issue is been tracked here https://github.com/appsmithorg/appsmith/issues/15303
2022-08-11 04:32:55 +00:00
let options = props . options ;
2022-02-22 08:43:35 +00:00
/ *
* Function to check if the object has ` label ` and ` value `
* /
const hasLabelValue = ( obj : any ) = > {
return (
_ . isPlainObject ( value ) &&
obj . hasOwnProperty ( "label" ) &&
obj . hasOwnProperty ( "value" ) &&
_ . isString ( obj . label ) &&
( _ . isString ( obj . value ) || _ . isFinite ( obj . value ) )
) ;
} ;
/ *
* When value is "{label: 'green', value: 'green'}"
* /
if ( typeof value === "string" ) {
try {
2022-03-29 07:07:01 +00:00
const parsedValue = JSON . parse ( value ) ;
if ( _ . isObject ( parsedValue ) ) {
value = parsedValue ;
}
2022-02-22 08:43:35 +00:00
} catch ( e ) { }
}
if ( _ . isString ( value ) || _ . isFinite ( value ) || hasLabelValue ( value ) ) {
/ *
* When value is "" , "green" , 444 , { label : "green" , value : "green" }
* /
isValid = true ;
parsed = value ;
} else {
isValid = false ;
2022-08-01 05:02:48 +00:00
parsed = undefined ;
2022-07-15 10:27:13 +00:00
message =
'value does not evaluate to type: string | number | { "label": "label1", "value": "value1" }' ;
2022-02-22 08:43:35 +00:00
}
2022-08-01 05:02:48 +00:00
if ( isValid && ! _ . isNil ( parsed ) && parsed !== "" ) {
2022-08-11 04:32:55 +00:00
if ( ! Array . isArray ( options ) && typeof options === "string" ) {
try {
const parsedOptions = JSON . parse ( options ) ;
if ( Array . isArray ( parsedOptions ) ) {
options = parsedOptions ;
} else {
options = [ ] ;
}
} catch ( e ) {
options = [ ] ;
}
}
2022-08-01 05:02:48 +00:00
const parsedValue = ( parsed as any ) . hasOwnProperty ( "value" )
? ( parsed as any ) . value
: parsed ;
const valueIndex = _ . findIndex (
options ,
( option ) = > option . value === parsedValue ,
) ;
if ( valueIndex === - 1 ) {
if ( ! isServerSideFiltered ) {
isValid = false ;
message = ` Default value is missing in options. Please update the value. ` ;
} else {
if ( ! hasLabelValue ( parsed ) ) {
isValid = false ;
message = ` Default value is missing in options. Please use {label : <string | num>, value : < string | num>} format to show default for server side data. ` ;
}
}
}
}
2022-02-22 08:43:35 +00:00
return {
isValid ,
parsed ,
messages : [ message ] ,
} ;
}
2022-02-02 14:15:07 +00:00
class SelectWidget extends BaseWidget < SelectWidgetProps , WidgetState > {
2022-02-22 08:43:35 +00:00
constructor ( props : SelectWidgetProps ) {
super ( props ) ;
}
2022-08-15 07:38:30 +00:00
static getPropertyPaneContentConfig() {
return [
{
sectionName : "Data" ,
children : [
{
helpText :
"Allows users to select a single option. Values must be unique" ,
propertyName : "options" ,
label : "Options" ,
controlType : "INPUT_TEXT" ,
placeholderText : '[{ "label": "label1", "value": "value1" }]' ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : {
type : ValidationTypes . ARRAY ,
params : {
unique : [ "value" ] ,
children : {
type : ValidationTypes . OBJECT ,
params : {
required : true ,
allowedKeys : [
{
name : "label" ,
type : ValidationTypes . TEXT ,
params : {
default : "" ,
requiredKey : true ,
} ,
} ,
{
name : "value" ,
type : ValidationTypes . TEXT ,
params : {
default : "" ,
requiredKey : true ,
} ,
} ,
] ,
} ,
} ,
} ,
} ,
evaluationSubstitutionType :
EvaluationSubstitutionType . SMART_SUBSTITUTE ,
} ,
{
helpText : "Selects the option with value by default" ,
propertyName : "defaultOptionValue" ,
label : "Default Selected Value" ,
2022-09-05 04:52:39 +00:00
controlType : "SELECT_DEFAULT_VALUE_CONTROL" ,
2022-08-15 07:38:30 +00:00
placeholderText : '{ "label": "label1", "value": "value1" }' ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : {
type : ValidationTypes . FUNCTION ,
params : {
fn : defaultOptionValueValidation ,
expected : {
type : 'value1 or { "label": "label1", "value": "value1" }' ,
example : ` value1 | { "label": "label1", "value": "value1" } ` ,
autocompleteDataType : AutocompleteDataType.STRING ,
} ,
} ,
} ,
dependencies : [ "serverSideFiltering" , "options" ] ,
} ,
] ,
} ,
{
sectionName : "Label" ,
children : [
{
helpText : "Sets the label text of the widget" ,
propertyName : "labelText" ,
label : "Text" ,
controlType : "INPUT_TEXT" ,
placeholderText : "Enter label text" ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
helpText : "Sets the label position of the widget" ,
propertyName : "labelPosition" ,
label : "Position" ,
2022-10-20 14:06:32 +00:00
controlType : "ICON_TABS" ,
fullWidth : true ,
2022-08-15 07:38:30 +00:00
options : [
{ label : "Left" , value : LabelPosition.Left } ,
{ label : "Top" , value : LabelPosition.Top } ,
{ label : "Auto" , value : LabelPosition.Auto } ,
] ,
2022-11-23 09:48:23 +00:00
defaultValue : LabelPosition.Top ,
2022-08-15 07:38:30 +00:00
isBindProperty : false ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
helpText : "Sets the label alignment of the widget" ,
propertyName : "labelAlignment" ,
label : "Alignment" ,
controlType : "LABEL_ALIGNMENT_OPTIONS" ,
options : [
{
icon : "LEFT_ALIGN" ,
value : Alignment.LEFT ,
} ,
{
icon : "RIGHT_ALIGN" ,
value : Alignment.RIGHT ,
} ,
] ,
isBindProperty : false ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
hidden : ( props : SelectWidgetProps ) = >
props . labelPosition !== LabelPosition . Left ,
dependencies : [ "labelPosition" ] ,
} ,
{
helpText :
"Sets the label width of the widget as the number of columns" ,
propertyName : "labelWidth" ,
label : "Width (in columns)" ,
controlType : "NUMERIC_INPUT" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
min : 0 ,
validation : {
type : ValidationTypes . NUMBER ,
params : {
natural : true ,
} ,
} ,
hidden : ( props : SelectWidgetProps ) = >
props . labelPosition !== LabelPosition . Left ,
dependencies : [ "labelPosition" ] ,
} ,
] ,
} ,
{
sectionName : "Search & Filters" ,
children : [
{
propertyName : "isFilterable" ,
label : "Allow Searching" ,
helpText : "Makes the dropdown list filterable" ,
controlType : "SWITCH" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
{
helpText : "Enables server side filtering of the data" ,
propertyName : "serverSideFiltering" ,
label : "Server Side Filtering" ,
controlType : "SWITCH" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
{
helpText : "Trigger an action on change of filterText" ,
hidden : ( props : SelectWidgetProps ) = > ! props . serverSideFiltering ,
dependencies : [ "serverSideFiltering" ] ,
propertyName : "onFilterUpdate" ,
label : "onFilterUpdate" ,
controlType : "ACTION_SELECTOR" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : true ,
} ,
] ,
} ,
{
sectionName : "Validations" ,
children : [
{
propertyName : "isRequired" ,
label : "Required" ,
helpText : "Makes input to the widget mandatory" ,
controlType : "SWITCH" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
] ,
} ,
{
sectionName : "General" ,
children : [
2022-12-03 11:58:02 +00:00
{
2022-12-13 10:35:08 +00:00
helpText : "Show help text or details about current selection" ,
2022-12-03 11:58:02 +00:00
propertyName : "labelTooltip" ,
label : "Tooltip" ,
controlType : "INPUT_TEXT" ,
2022-12-13 10:35:08 +00:00
placeholderText : "Add tooltip text here" ,
2022-12-03 11:58:02 +00:00
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
2022-08-15 07:38:30 +00:00
{
helpText : "Sets a Placeholder Text" ,
propertyName : "placeholderText" ,
label : "Placeholder" ,
controlType : "INPUT_TEXT" ,
placeholderText : "Enter placeholder text" ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
helpText : "Controls the visibility of the widget" ,
propertyName : "isVisible" ,
label : "Visible" ,
controlType : "SWITCH" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
{
propertyName : "isDisabled" ,
label : "Disabled" ,
helpText : "Disables input to this widget" ,
controlType : "SWITCH" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
{
propertyName : "animateLoading" ,
label : "Animate Loading" ,
controlType : "SWITCH" ,
helpText : "Controls the loading of the widget" ,
defaultValue : true ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . BOOLEAN } ,
} ,
] ,
} ,
{
sectionName : "Events" ,
children : [
{
helpText : "Triggers an action when a user selects an option" ,
propertyName : "onOptionChange" ,
label : "onOptionChange" ,
controlType : "ACTION_SELECTOR" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : true ,
} ,
2022-12-12 07:09:22 +00:00
{
helpText : "Triggers an action when the dropdown opens" ,
propertyName : "onDropdownOpen" ,
label : "onDropdownOpen" ,
controlType : "ACTION_SELECTOR" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : true ,
} ,
{
helpText : "Triggers an action when the dropdown closes" ,
propertyName : "onDropdownClose" ,
label : "onDropdownClose" ,
controlType : "ACTION_SELECTOR" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : true ,
} ,
2022-08-15 07:38:30 +00:00
] ,
} ,
] ;
}
static getPropertyPaneStyleConfig() {
return [
{
sectionName : "Label Styles" ,
children : [
{
propertyName : "labelTextColor" ,
label : "Font Color" ,
2022-10-20 14:06:32 +00:00
helpText : "Control the color of the label associated" ,
2022-08-15 07:38:30 +00:00
controlType : "COLOR_PICKER" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
propertyName : "labelTextSize" ,
label : "Font Size" ,
2022-10-20 14:06:32 +00:00
helpText : "Control the font size of the label associated" ,
2022-08-15 07:38:30 +00:00
controlType : "DROP_DOWN" ,
defaultValue : "0.875rem" ,
options : [
{
label : "S" ,
value : "0.875rem" ,
subText : "0.875rem" ,
} ,
{
label : "M" ,
value : "1rem" ,
subText : "1rem" ,
} ,
{
label : "L" ,
value : "1.25rem" ,
subText : "1.25rem" ,
} ,
{
label : "XL" ,
value : "1.875rem" ,
subText : "1.875rem" ,
} ,
{
label : "XXL" ,
value : "3rem" ,
subText : "3rem" ,
} ,
{
label : "3XL" ,
value : "3.75rem" ,
subText : "3.75rem" ,
} ,
] ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
propertyName : "labelStyle" ,
label : "Emphasis" ,
2022-10-20 14:06:32 +00:00
helpText : "Control if the label should be bold or italics" ,
2022-08-15 07:38:30 +00:00
controlType : "BUTTON_TABS" ,
options : [
{
icon : "BOLD_FONT" ,
value : "BOLD" ,
} ,
{
icon : "ITALICS_FONT" ,
value : "ITALIC" ,
} ,
] ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
] ,
} ,
{
sectionName : "Colors" ,
children : [
{
propertyName : "accentColor" ,
label : "Accent Color" ,
controlType : "COLOR_PICKER" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
invisible : true ,
} ,
] ,
} ,
{
sectionName : "Border and Shadow" ,
children : [
{
propertyName : "borderRadius" ,
label : "Border Radius" ,
helpText :
"Rounds the corners of the icon button's outer border edge" ,
controlType : "BORDER_RADIUS_OPTIONS" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
{
propertyName : "boxShadow" ,
label : "Box Shadow" ,
helpText :
"Enables you to cast a drop shadow from the frame of the widget" ,
controlType : "BOX_SHADOW_OPTIONS" ,
isJSConvertible : true ,
isBindProperty : true ,
isTriggerProperty : false ,
validation : { type : ValidationTypes . TEXT } ,
} ,
] ,
} ,
] ;
}
2022-11-28 04:44:31 +00:00
static getStylesheetConfig ( ) : Stylesheet {
return {
accentColor : "{{appsmith.theme.colors.primaryColor}}" ,
borderRadius : "{{appsmith.theme.borderRadius.appBorderRadius}}" ,
boxShadow : "none" ,
} ;
}
2022-02-22 08:43:35 +00:00
static getDefaultPropertiesMap ( ) : Record < string , string > {
2022-02-02 14:15:07 +00:00
return {
2022-02-22 08:43:35 +00:00
value : "defaultOptionValue" ,
label : "defaultOptionValue" ,
filterText : "" ,
2022-02-02 14:15:07 +00:00
} ;
}
2022-02-22 08:43:35 +00:00
static getMetaPropertiesMap ( ) : Record < string , any > {
2022-02-02 14:15:07 +00:00
return {
2022-02-22 08:43:35 +00:00
value : undefined ,
label : undefined ,
filterText : "" ,
2022-03-01 19:02:10 +00:00
isDirty : false ,
2022-02-02 14:15:07 +00:00
} ;
}
2022-08-01 05:02:48 +00:00
// https://github.com/appsmithorg/appsmith/issues/13664#issuecomment-1120814337
2022-02-22 08:43:35 +00:00
static getDerivedPropertiesMap() {
2022-02-02 14:15:07 +00:00
return {
2022-08-01 05:02:48 +00:00
isValid : ` {{(()=>{ ${ derivedProperties . getIsValid } })()}} ` ,
selectedOptionValue : ` {{(()=>{ ${ derivedProperties . getSelectedOptionValue } })()}} ` ,
selectedOptionLabel : ` {{(()=>{ ${ derivedProperties . getSelectedOptionLabel } })()}} ` ,
2022-02-02 14:15:07 +00:00
} ;
}
componentDidMount() {
2022-02-22 08:43:35 +00:00
super . componentDidMount ( ) ;
2022-02-02 14:15:07 +00:00
}
2022-03-01 19:02:10 +00:00
componentDidUpdate ( prevProps : SelectWidgetProps ) : void {
// Reset isDirty to false if defaultOptionValue changes
2022-03-03 13:57:22 +00:00
if (
2022-09-02 09:16:30 +00:00
! equal ( this . props . defaultOptionValue , prevProps . defaultOptionValue ) &&
2022-03-03 13:57:22 +00:00
this . props . isDirty
) {
2022-03-01 19:02:10 +00:00
this . props . updateWidgetMetaProperty ( "isDirty" , false ) ;
}
}
2022-02-22 08:43:35 +00:00
isStringOrNumber = ( value : any ) : value is string | number = >
isString ( value ) || isNumber ( value ) ;
2022-02-02 14:15:07 +00:00
getPageView() {
2022-02-22 08:43:35 +00:00
const options = isArray ( this . props . options ) ? this . props . options : [ ] ;
2022-02-02 14:15:07 +00:00
const isInvalid =
"isValid" in this . props && ! this . props . isValid && ! ! this . props . isDirty ;
const dropDownWidth = MinimumPopupRows * this . props . parentColumnSpace ;
2022-02-22 08:43:35 +00:00
const selectedIndex = findIndex ( this . props . options , {
2022-02-02 14:15:07 +00:00
value : this.props.selectedOptionValue ,
} ) ;
const { componentHeight , componentWidth } = this . getComponentDimensions ( ) ;
return (
< SelectComponent
2022-05-04 09:45:57 +00:00
accentColor = { this . props . accentColor }
borderRadius = { this . props . borderRadius }
boxShadow = { this . props . boxShadow }
2022-02-02 14:15:07 +00:00
compactMode = {
! (
( this . props . bottomRow - this . props . topRow ) /
GRID_DENSITY_MIGRATION_V1 >
1
)
}
disabled = { this . props . isDisabled }
dropDownWidth = { dropDownWidth }
filterText = { this . props . filterText }
hasError = { isInvalid }
height = { componentHeight }
2022-11-23 09:48:23 +00:00
isDynamicHeightEnabled = { isAutoHeightEnabledForWidget ( this . props ) }
2022-02-02 14:15:07 +00:00
isFilterable = { this . props . isFilterable }
isLoading = { this . props . isLoading }
isValid = { this . props . isValid }
2022-02-22 08:43:35 +00:00
label = { this . props . selectedOptionLabel }
feat: Controls for labels in widgets to align the widgets in forms and other places (#10600)
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Create a new property control for a label position
-- Create a new property control for a label alignment
-- Prototype a label section for Input widget
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Add a property, labelWidth in the property pane
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Input widget: Implement all the requirements in case its type is Text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adapt the functionalty on other types of the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into DropdownWidget
-- Clean up for the input widget and DRY
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectWidget
-- Eliminate unnecessary component prop, columns
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalties into Tree Select widget
-- Add styles for alignment between lable and input control over the widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectTreeWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Introduce label functionalities into DatePickerWidget2
-- Use width instead of columns prop in InputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RichTextEditorWidget
-- Eliminate compactMode from StyledLabel
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into CheckboxGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement switch group for the correct meaning of right alignment
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RadioGroupWidget
-- Add new properties, alignment and inline for consistency
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adjust cols and rows for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused StyledRadioProps
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete first MVP of enhanced SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete the first MVP of enhanced RadioGroupWidget
-- Eliminate unused StyledSwitch component for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add min-height, align-self rules for LabelContainer
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Use original label property for RadioGroupWidget
-- Add a migration for adding isInline and alignment properties for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Update version to latest one in DSLMigrationsUtils.test.ts
* fix failing jest test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement label functionalities on BaseInputWidget, InputWidgetV2, CurrencyInputWidget, PhoneInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DSLMigrationsUtils
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the label related test case which is failed in Input_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on #10119: The label text truncates on resizing the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix scroll issue when shrink with MultiSelectWidget and MultiSelectTreeWidget
* fix: Widget Popup test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement width and alginment features on the level of label element
-- Prevent actual inputs from DropdownWidget, MultiSelectWidget, SingleSelectTreeWidget, MultiSelectTreeWidget from overflow when resizing
-- Enable label feature on a RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set label container's default width to 33% when width is not set
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix crash issue when labelWidth is filled by non-numeric value, eliminating passing NaN as its value
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set flex-grow to zero on input types other than TEXT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label features on newly created MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate LabelPositionTypes, directly using enum LabelPosition
-- Add a comment for a constant LABEL_MAX_WIDTH_RATE
-- Directly import React for LabelAlignmentOptionsControl
-- Remove unnecessary constructor for LabelAlignmentOptionsControl
-- Define handleAlign instance method as a higher-order function
-- Only migrate alignment property for RadioGroupWidget
-- Use Object.hasOwnProperty instead of in operator
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Migrate alignment property of RadioGroupWidget in case of currentDSL.version is 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Revert currentDSL.version to 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a Jest test case for RadioGroupWidget's alignment property migration
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Replace all nested ternary operators with if statements
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label feature on new version of SelectWidget
-- Add Cypress tests for widgets' label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor code for BaseInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change CSS selector for step buttons for Numeric BaseInputWidget
-- Directly use migrateRadioGroupAlignmentProperty migration function without using transformDSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on typo about migrateRadioGroupAlignmentProperty
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add data-testid attributes for Cypress selectors
* feat: Deprecate form button widget
-- Assert flex-direction to row in CheckboxGroup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a missing data-testid for SelectWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on failed test cases: CheckboxGroup_spec, DatePicker_2_spec, MultiSelectWidgetV2
* fix: Select popup DSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new property control, NumericInputControl
-- Replace all the label properties with the newly created controls
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new Cypress command, checkLabelWidth and apply to all related test cases
-- Increase width in checkboxgroupDsl.json
-- Rename className for label in MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement the tooltip feature for labels
-- Add missing props for labels in DateField, MultiSelectField, RadioGroupField, SelectField fields for JSONFormWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor property controls, including LabelPositionOptionsControl, LabelAlignmentOptionsControl, NumericInputControl to keep consistency
-- Apply default values into label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract the label related parts from the various widgets as an independent component
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate TypeScript any type from BaseInputComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change labelPosition property type to DROP_DOWN
-- Modify LabelAlignmentOptionsControl to use ButtonTabComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Define getLabelWidth method into BaseWidget
-- Extract the common CSS rules for the widget containers
-- Revert rows and columns for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed test case in DSLMigrationsUtils.test.ts
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on overflow issue on CheckboxGroupWidget
-- Create a distinctive spec file for label feature
-- Eliminate the redundant label specs with the relevant widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Delete unnecessary files, including Select_spec.js, LabelButton.tsx and LabelPositionOptionsControl.tsx
-- Revise wrong comment for checkLabelForWidget Cypress command
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Do not set the label width only if its value is 0
-- Clean up the component for DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Make RadioGroupWidget's layout flexible in all modes
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on Cypress test case for RadioGroupWidget in Widgets_Labels_spec
-- Change Cypress commands, including addAction, addSuccessMessage, enterActionValue to accept parentSelector
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change getLabelWidth method to not have any argument
-- Define some constants for label numbers
-- Extract the common styles for SwitchGroupWidget and RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor some constants
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused width prop from RadioGroupWidget
-- Get labelWidth from getLabelWidth
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate the min-height restriction on a label
-- Eliminate the scroll on the earlier InputWidgetV2 which was not in compact mode
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add one more condition checking if the current input type is text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract common code base for MultiSelectTreeWidget and MultiSelectWidgetV2
-- Apply a few CSS fixes on the scrollbar issue select related widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply some tweaks for earlier widgets with labels so as not to be broken UX
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed Cypress test case in Widget_Popup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add constants, LABEL_DEFAULT_WIDTH_RATE, SELECT_DEFAULT_HEIGHT, LABEL_MARGIN_OLD_SELECT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Increase the widths of CheckboxGroupWidget and SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set the font size to 14px for NumericInputControl
Co-authored-by: ohansFavour <fohanekwu@gmail.com>
Co-authored-by: Tolulope Adetula <31691737+Tooluloope@users.noreply.github.com>
2022-04-14 08:47:25 +00:00
labelAlignment = { this . props . labelAlignment }
labelPosition = { this . props . labelPosition }
2022-02-02 14:15:07 +00:00
labelStyle = { this . props . labelStyle }
labelText = { this . props . labelText }
labelTextColor = { this . props . labelTextColor }
labelTextSize = { this . props . labelTextSize }
2022-12-03 11:58:02 +00:00
labelTooltip = { this . props . labelTooltip }
feat: Controls for labels in widgets to align the widgets in forms and other places (#10600)
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Create a new property control for a label position
-- Create a new property control for a label alignment
-- Prototype a label section for Input widget
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Add a property, labelWidth in the property pane
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Input widget: Implement all the requirements in case its type is Text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adapt the functionalty on other types of the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into DropdownWidget
-- Clean up for the input widget and DRY
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectWidget
-- Eliminate unnecessary component prop, columns
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalties into Tree Select widget
-- Add styles for alignment between lable and input control over the widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectTreeWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Introduce label functionalities into DatePickerWidget2
-- Use width instead of columns prop in InputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RichTextEditorWidget
-- Eliminate compactMode from StyledLabel
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into CheckboxGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement switch group for the correct meaning of right alignment
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RadioGroupWidget
-- Add new properties, alignment and inline for consistency
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adjust cols and rows for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused StyledRadioProps
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete first MVP of enhanced SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete the first MVP of enhanced RadioGroupWidget
-- Eliminate unused StyledSwitch component for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add min-height, align-self rules for LabelContainer
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Use original label property for RadioGroupWidget
-- Add a migration for adding isInline and alignment properties for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Update version to latest one in DSLMigrationsUtils.test.ts
* fix failing jest test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement label functionalities on BaseInputWidget, InputWidgetV2, CurrencyInputWidget, PhoneInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DSLMigrationsUtils
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the label related test case which is failed in Input_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on #10119: The label text truncates on resizing the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix scroll issue when shrink with MultiSelectWidget and MultiSelectTreeWidget
* fix: Widget Popup test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement width and alginment features on the level of label element
-- Prevent actual inputs from DropdownWidget, MultiSelectWidget, SingleSelectTreeWidget, MultiSelectTreeWidget from overflow when resizing
-- Enable label feature on a RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set label container's default width to 33% when width is not set
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix crash issue when labelWidth is filled by non-numeric value, eliminating passing NaN as its value
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set flex-grow to zero on input types other than TEXT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label features on newly created MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate LabelPositionTypes, directly using enum LabelPosition
-- Add a comment for a constant LABEL_MAX_WIDTH_RATE
-- Directly import React for LabelAlignmentOptionsControl
-- Remove unnecessary constructor for LabelAlignmentOptionsControl
-- Define handleAlign instance method as a higher-order function
-- Only migrate alignment property for RadioGroupWidget
-- Use Object.hasOwnProperty instead of in operator
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Migrate alignment property of RadioGroupWidget in case of currentDSL.version is 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Revert currentDSL.version to 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a Jest test case for RadioGroupWidget's alignment property migration
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Replace all nested ternary operators with if statements
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label feature on new version of SelectWidget
-- Add Cypress tests for widgets' label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor code for BaseInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change CSS selector for step buttons for Numeric BaseInputWidget
-- Directly use migrateRadioGroupAlignmentProperty migration function without using transformDSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on typo about migrateRadioGroupAlignmentProperty
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add data-testid attributes for Cypress selectors
* feat: Deprecate form button widget
-- Assert flex-direction to row in CheckboxGroup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a missing data-testid for SelectWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on failed test cases: CheckboxGroup_spec, DatePicker_2_spec, MultiSelectWidgetV2
* fix: Select popup DSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new property control, NumericInputControl
-- Replace all the label properties with the newly created controls
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new Cypress command, checkLabelWidth and apply to all related test cases
-- Increase width in checkboxgroupDsl.json
-- Rename className for label in MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement the tooltip feature for labels
-- Add missing props for labels in DateField, MultiSelectField, RadioGroupField, SelectField fields for JSONFormWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor property controls, including LabelPositionOptionsControl, LabelAlignmentOptionsControl, NumericInputControl to keep consistency
-- Apply default values into label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract the label related parts from the various widgets as an independent component
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate TypeScript any type from BaseInputComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change labelPosition property type to DROP_DOWN
-- Modify LabelAlignmentOptionsControl to use ButtonTabComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Define getLabelWidth method into BaseWidget
-- Extract the common CSS rules for the widget containers
-- Revert rows and columns for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed test case in DSLMigrationsUtils.test.ts
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on overflow issue on CheckboxGroupWidget
-- Create a distinctive spec file for label feature
-- Eliminate the redundant label specs with the relevant widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Delete unnecessary files, including Select_spec.js, LabelButton.tsx and LabelPositionOptionsControl.tsx
-- Revise wrong comment for checkLabelForWidget Cypress command
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Do not set the label width only if its value is 0
-- Clean up the component for DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Make RadioGroupWidget's layout flexible in all modes
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on Cypress test case for RadioGroupWidget in Widgets_Labels_spec
-- Change Cypress commands, including addAction, addSuccessMessage, enterActionValue to accept parentSelector
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change getLabelWidth method to not have any argument
-- Define some constants for label numbers
-- Extract the common styles for SwitchGroupWidget and RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor some constants
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused width prop from RadioGroupWidget
-- Get labelWidth from getLabelWidth
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate the min-height restriction on a label
-- Eliminate the scroll on the earlier InputWidgetV2 which was not in compact mode
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add one more condition checking if the current input type is text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract common code base for MultiSelectTreeWidget and MultiSelectWidgetV2
-- Apply a few CSS fixes on the scrollbar issue select related widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply some tweaks for earlier widgets with labels so as not to be broken UX
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed Cypress test case in Widget_Popup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add constants, LABEL_DEFAULT_WIDTH_RATE, SELECT_DEFAULT_HEIGHT, LABEL_MARGIN_OLD_SELECT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Increase the widths of CheckboxGroupWidget and SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set the font size to 14px for NumericInputControl
Co-authored-by: ohansFavour <fohanekwu@gmail.com>
Co-authored-by: Tolulope Adetula <31691737+Tooluloope@users.noreply.github.com>
2022-04-14 08:47:25 +00:00
labelWidth = { this . getLabelWidth ( ) }
2022-12-12 07:09:22 +00:00
onDropdownClose = { this . onDropdownClose }
onDropdownOpen = { this . onDropdownOpen }
2022-02-02 14:15:07 +00:00
onFilterChange = { this . onFilterChange }
onOptionSelected = { this . onOptionSelected }
options = { options }
placeholder = { this . props . placeholderText }
2022-09-30 04:03:53 +00:00
resetFilterTextOnClose = { ! this . props . serverSideFiltering }
2022-02-02 14:15:07 +00:00
selectedIndex = { selectedIndex > - 1 ? selectedIndex : undefined }
serverSideFiltering = { this . props . serverSideFiltering }
2022-02-22 08:43:35 +00:00
value = { this . props . selectedOptionValue }
2022-02-02 14:15:07 +00:00
widgetId = { this . props . widgetId }
width = { componentWidth }
/ >
) ;
}
onOptionSelected = ( selectedOption : DropdownOption ) = > {
let isChanged = true ;
// Check if the value has changed. If no option
// selected till now, there is a change
2022-08-01 05:02:48 +00:00
if ( ! isNil ( this . props . selectedOptionValue ) ) {
isChanged = this . props . selectedOptionValue !== selectedOption . value ;
2022-02-02 14:15:07 +00:00
}
if ( isChanged ) {
2022-03-01 19:02:10 +00:00
if ( ! this . props . isDirty ) {
this . props . updateWidgetMetaProperty ( "isDirty" , true ) ;
}
2022-02-22 08:43:35 +00:00
this . props . updateWidgetMetaProperty ( "label" , selectedOption . label ? ? "" ) ;
this . props . updateWidgetMetaProperty ( "value" , selectedOption . value ? ? "" , {
2022-02-02 14:15:07 +00:00
triggerPropertyName : "onOptionChange" ,
2022-02-22 08:43:35 +00:00
dynamicString : this.props.onOptionChange ,
2022-02-02 14:15:07 +00:00
event : {
type : EventType . ON_OPTION_CHANGE ,
} ,
} ) ;
2022-03-11 05:35:05 +00:00
if ( ! this . props . isDirty ) {
this . props . updateWidgetMetaProperty ( "isDirty" , true ) ;
}
2022-02-02 14:15:07 +00:00
}
2022-08-01 05:02:48 +00:00
// When Label changes but value doesnt change, Applies to serverside Filtering
if ( ! isChanged && this . props . selectedOptionLabel !== selectedOption . label ) {
this . props . updateWidgetMetaProperty ( "label" , selectedOption . label ? ? "" ) ;
}
2022-02-22 08:43:35 +00:00
} ;
2022-02-02 14:15:07 +00:00
onFilterChange = ( value : string ) = > {
this . props . updateWidgetMetaProperty ( "filterText" , value ) ;
2022-02-22 08:43:35 +00:00
if ( this . props . onFilterUpdate && this . props . serverSideFiltering ) {
super . executeAction ( {
triggerPropertyName : "onFilterUpdate" ,
dynamicString : this.props.onFilterUpdate ,
event : {
type : EventType . ON_FILTER_UPDATE ,
} ,
} ) ;
}
2022-02-02 14:15:07 +00:00
} ;
2022-12-12 07:09:22 +00:00
onDropdownOpen = ( ) = > {
if ( this . props . onDropdownOpen ) {
super . executeAction ( {
triggerPropertyName : "onDropdownOpen" ,
dynamicString : this.props.onDropdownOpen ,
event : {
type : EventType . ON_DROPDOWN_OPEN ,
} ,
} ) ;
}
} ;
onDropdownClose = ( ) = > {
if ( this . props . onDropdownClose ) {
super . executeAction ( {
triggerPropertyName : "onDropdownClose" ,
dynamicString : this.props.onDropdownClose ,
event : {
type : EventType . ON_DROPDOWN_CLOSE ,
} ,
} ) ;
}
} ;
2022-02-02 14:15:07 +00:00
static getWidgetType ( ) : WidgetType {
return "SELECT_WIDGET" ;
}
}
export interface SelectWidgetProps extends WidgetProps {
placeholderText? : string ;
feat: Controls for labels in widgets to align the widgets in forms and other places (#10600)
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Create a new property control for a label position
-- Create a new property control for a label alignment
-- Prototype a label section for Input widget
* feat: When there are multiple input widgets with different label lengths then the input box looks misaligned
-- Add a property, labelWidth in the property pane
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Input widget: Implement all the requirements in case its type is Text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adapt the functionalty on other types of the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into DropdownWidget
-- Clean up for the input widget and DRY
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectWidget
-- Eliminate unnecessary component prop, columns
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalties into Tree Select widget
-- Add styles for alignment between lable and input control over the widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add label functionalities into MultiSelectTreeWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Introduce label functionalities into DatePickerWidget2
-- Use width instead of columns prop in InputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RichTextEditorWidget
-- Eliminate compactMode from StyledLabel
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into CheckboxGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement switch group for the correct meaning of right alignment
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply label functionalities into RadioGroupWidget
-- Add new properties, alignment and inline for consistency
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Adjust cols and rows for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused StyledRadioProps
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete first MVP of enhanced SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Complete the first MVP of enhanced RadioGroupWidget
-- Eliminate unused StyledSwitch component for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add min-height, align-self rules for LabelContainer
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Use original label property for RadioGroupWidget
-- Add a migration for adding isInline and alignment properties for RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Update version to latest one in DSLMigrationsUtils.test.ts
* fix failing jest test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement label functionalities on BaseInputWidget, InputWidgetV2, CurrencyInputWidget, PhoneInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DSLMigrationsUtils
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the label related test case which is failed in Input_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on #10119: The label text truncates on resizing the input widget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix scroll issue when shrink with MultiSelectWidget and MultiSelectTreeWidget
* fix: Widget Popup test
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement width and alginment features on the level of label element
-- Prevent actual inputs from DropdownWidget, MultiSelectWidget, SingleSelectTreeWidget, MultiSelectTreeWidget from overflow when resizing
-- Enable label feature on a RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set label container's default width to 33% when width is not set
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix crash issue when labelWidth is filled by non-numeric value, eliminating passing NaN as its value
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set flex-grow to zero on input types other than TEXT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label features on newly created MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate LabelPositionTypes, directly using enum LabelPosition
-- Add a comment for a constant LABEL_MAX_WIDTH_RATE
-- Directly import React for LabelAlignmentOptionsControl
-- Remove unnecessary constructor for LabelAlignmentOptionsControl
-- Define handleAlign instance method as a higher-order function
-- Only migrate alignment property for RadioGroupWidget
-- Use Object.hasOwnProperty instead of in operator
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Migrate alignment property of RadioGroupWidget in case of currentDSL.version is 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Revert currentDSL.version to 52
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a Jest test case for RadioGroupWidget's alignment property migration
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Replace all nested ternary operators with if statements
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Implement label feature on new version of SelectWidget
-- Add Cypress tests for widgets' label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor code for BaseInputWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change CSS selector for step buttons for Numeric BaseInputWidget
-- Directly use migrateRadioGroupAlignmentProperty migration function without using transformDSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on typo about migrateRadioGroupAlignmentProperty
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add data-testid attributes for Cypress selectors
* feat: Deprecate form button widget
-- Assert flex-direction to row in CheckboxGroup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add a missing data-testid for SelectWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on failed test cases: CheckboxGroup_spec, DatePicker_2_spec, MultiSelectWidgetV2
* fix: Select popup DSL
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new property control, NumericInputControl
-- Replace all the label properties with the newly created controls
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Create a new Cypress command, checkLabelWidth and apply to all related test cases
-- Increase width in checkboxgroupDsl.json
-- Rename className for label in MultiSelectWidgetV2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Reimplement the tooltip feature for labels
-- Add missing props for labels in DateField, MultiSelectField, RadioGroupField, SelectField fields for JSONFormWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor property controls, including LabelPositionOptionsControl, LabelAlignmentOptionsControl, NumericInputControl to keep consistency
-- Apply default values into label section
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract the label related parts from the various widgets as an independent component
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate TypeScript any type from BaseInputComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change labelPosition property type to DROP_DOWN
-- Modify LabelAlignmentOptionsControl to use ButtonTabComponent
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Define getLabelWidth method into BaseWidget
-- Extract the common CSS rules for the widget containers
-- Revert rows and columns for SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed test case in DSLMigrationsUtils.test.ts
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on overflow issue on CheckboxGroupWidget
-- Create a distinctive spec file for label feature
-- Eliminate the redundant label specs with the relevant widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Delete unnecessary files, including Select_spec.js, LabelButton.tsx and LabelPositionOptionsControl.tsx
-- Revise wrong comment for checkLabelForWidget Cypress command
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Do not set the label width only if its value is 0
-- Clean up the component for DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused imports in DatePickerWidget2
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Make RadioGroupWidget's layout flexible in all modes
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on Cypress test case for RadioGroupWidget in Widgets_Labels_spec
-- Change Cypress commands, including addAction, addSuccessMessage, enterActionValue to accept parentSelector
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Change getLabelWidth method to not have any argument
-- Define some constants for label numbers
-- Extract the common styles for SwitchGroupWidget and RadioGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Refactor some constants
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate unused width prop from RadioGroupWidget
-- Get labelWidth from getLabelWidth
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Eliminate the min-height restriction on a label
-- Eliminate the scroll on the earlier InputWidgetV2 which was not in compact mode
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add one more condition checking if the current input type is text
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Extract common code base for MultiSelectTreeWidget and MultiSelectWidgetV2
-- Apply a few CSS fixes on the scrollbar issue select related widgets
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Apply some tweaks for earlier widgets with labels so as not to be broken UX
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Fix on the failed Cypress test case in Widget_Popup_spec.js
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Add constants, LABEL_DEFAULT_WIDTH_RATE, SELECT_DEFAULT_HEIGHT, LABEL_MARGIN_OLD_SELECT
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Increase the widths of CheckboxGroupWidget and SwitchGroupWidget
* feat: Controls for labels in widgets to align the widgets in forms and other places
-- Set the font size to 14px for NumericInputControl
Co-authored-by: ohansFavour <fohanekwu@gmail.com>
Co-authored-by: Tolulope Adetula <31691737+Tooluloope@users.noreply.github.com>
2022-04-14 08:47:25 +00:00
labelText : string ;
labelPosition? : LabelPosition ;
labelAlignment? : Alignment ;
labelWidth? : number ;
2022-02-02 14:15:07 +00:00
selectedIndex? : number ;
options? : DropdownOption [ ] ;
onOptionChange? : string ;
2022-12-12 07:09:22 +00:00
onDropdownOpen? : string ;
onDropdownClose? : string ;
2022-02-22 08:43:35 +00:00
defaultOptionValue? : any ;
value? : any ;
label? : any ;
2022-02-02 14:15:07 +00:00
isRequired : boolean ;
isFilterable : boolean ;
selectedOptionLabel : string ;
serverSideFiltering : boolean ;
onFilterUpdate : string ;
isDirty? : boolean ;
2022-03-24 12:57:39 +00:00
filterText : string ;
2022-02-02 14:15:07 +00:00
}
export default SelectWidget ;