2022-02-02 14:15:07 +00:00
|
|
|
/* eslint-disable no-console */
|
|
|
|
|
import React, {
|
|
|
|
|
useEffect,
|
|
|
|
|
useState,
|
|
|
|
|
useCallback,
|
|
|
|
|
useRef,
|
|
|
|
|
ChangeEvent,
|
|
|
|
|
useMemo,
|
|
|
|
|
} from "react";
|
|
|
|
|
import Select, { SelectProps } from "rc-select";
|
|
|
|
|
import {
|
|
|
|
|
DefaultValueType,
|
|
|
|
|
LabelValueType,
|
|
|
|
|
} from "rc-select/lib/interface/generator";
|
|
|
|
|
import MenuItemCheckBox, {
|
|
|
|
|
DropdownStyles,
|
|
|
|
|
MultiSelectContainer,
|
|
|
|
|
StyledCheckbox,
|
|
|
|
|
TextLabelWrapper,
|
|
|
|
|
StyledLabel,
|
|
|
|
|
} from "./index.styled";
|
|
|
|
|
import {
|
|
|
|
|
CANVAS_CLASSNAME,
|
|
|
|
|
MODAL_PORTAL_CLASSNAME,
|
|
|
|
|
TextSize,
|
|
|
|
|
} from "constants/WidgetConstants";
|
|
|
|
|
import Icon from "components/ads/Icon";
|
|
|
|
|
import { Button, Classes, InputGroup } from "@blueprintjs/core";
|
|
|
|
|
import { WidgetContainerDiff } from "widgets/WidgetUtils";
|
|
|
|
|
import { Colors } from "constants/Colors";
|
2022-02-22 08:43:35 +00:00
|
|
|
import { uniqBy } from "lodash";
|
2022-02-02 14:15:07 +00:00
|
|
|
|
|
|
|
|
const menuItemSelectedIcon = (props: { isSelected: boolean }) => {
|
|
|
|
|
return <MenuItemCheckBox checked={props.isSelected} />;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export interface MultiSelectProps
|
|
|
|
|
extends Required<
|
|
|
|
|
Pick<
|
|
|
|
|
SelectProps,
|
|
|
|
|
"disabled" | "options" | "placeholder" | "loading" | "dropdownStyle"
|
|
|
|
|
>
|
|
|
|
|
> {
|
|
|
|
|
mode?: "multiple" | "tags";
|
|
|
|
|
value: LabelValueType[];
|
|
|
|
|
onChange: (value: DefaultValueType) => void;
|
|
|
|
|
serverSideFiltering: boolean;
|
|
|
|
|
onFilterChange: (text: string) => void;
|
|
|
|
|
dropDownWidth: number;
|
|
|
|
|
width: number;
|
|
|
|
|
labelText?: string;
|
|
|
|
|
labelTextColor?: string;
|
|
|
|
|
labelTextSize?: TextSize;
|
|
|
|
|
labelStyle?: string;
|
|
|
|
|
compactMode: boolean;
|
|
|
|
|
isValid: boolean;
|
|
|
|
|
allowSelectAll?: boolean;
|
|
|
|
|
filterText?: string;
|
|
|
|
|
widgetId: string;
|
|
|
|
|
isFilterable: boolean;
|
feat: JSON Form widget (#8472)
* initial layout
* updated parser to support nested array
* array field rendering
* changes
* ts fix
* minor revert FormWidget
* modified schema structure
* select and switch fields
* added checkbox field
* added RadioGroupField
* partial DateField and defaults, typing refactoring
* added label and field type change
* minor ts changes
* changes
* modified widget/utils for nested panelConfig, modified schema to object approach
* array/object label support
* hide field configuration when children not present
* added tooltip
* field visibility option
* disabled state
* upgraded tslib, form initial values
* custom field configuration - add/hide/edit
* field configuration - label change
* return input when field configuration reaches max depth
* minor changes
* form - scroll, fixedfooter, enitity defn and other minior changes
* form title
* unregister on unmount
* fixes
* zero state
* fix field padding
* patched updating form values, removed linting warnings
* configured action buttons
* minor fix
* minor change
* property pane - sort fields in field configuration
* refactor include all properties
* checkbox properties
* date properties
* refactor typings and radio group properties
* switch, multselect, select, array, object properties
* minor changes
* default value
* ts fixes
* checkbox field properties implementation
* date field prop implementation
* switch field
* select field and fix deep nested meta properties
* multiselect implementation
* minor change
* input field implementation
* fix position jump on field type change
* initial accordian
* field state property and auto-complete of JSONFormComputeControl
* merge fixes
* renamed FormBuilder to JSONForm
* source data validation minor change
* custom field default value fix
* Editable keys for custom field
* minor fixes
* replaced useFieldArray with custom logic, added widget icon
* array and object accordian with border/background styling
* minor change
* disabled states for array and objects
* default value minor fix
* form level styles
* modified logic for isDisabled for array and object, added disabledWhenInvalid, exposed isValid to fieldState for text input, removed useDisableChildren
* added isValid for all field types
* fixed reset to default values
* debounce form values update
* minor change
* minor change
* fix crash - source data change multi-select to array, fix crash - change of options
* fix positioning
* detect date type in source data
* fix crash - when object is passed to regex input field
* fixed default sourceData path for fields
* accodion keep children mounted on collapse
* jest test for schemaParser
* widget/helper and useRegisterFieldInvalid test
* tests for property config helper and generatePanelPropertyConfig
* fix input field validation not appearing
* fix date field type detection
* rename data -> formData
* handle null/undefined field value change in sourceData
* added null/undefined as valid values for defaultValue text field
* auto detect email field
* set formData default value on initial load
* switch field inline positioning
* field margin fix for row direction
* select full width
* fiex date field default value - out of range
* fix any field type to array
* array default value logic change
* base cypress test changes
* initial json form render cy test
* key sanitization
* fix fieldState update logic
* required design, object/array background color, accordion changes, fix - add new custom field
* minor change
* cypress tests
* fix date formatted value, field state cypress test
* cypress - field properties test and fixes
* rename test file
* fix accessort change to blank value, cypress tests
* fix array field default value for modified accessor
* minor fix
* added animate loading
* fix empty state, add new custom field
* test data fix
* fix warnings
* fix timePrecision visibility
* button styling
* ported input v2
* fix jest tests
* fix cypress tests
* perf changes
* perf improvement
* added comments
* multiselect changes
* input field perf refactor
* array field, object field refactor performance
* checkbox field refactor
* refectored date, radio, select and switch
* fixes
* test fixes
* fixes
* minor fix
* rename field renderer
* remove tracked fieldRenderer field
* cypress test fixes
* cypress changes
* array default value fixes
* arrayfield passedDefaultValue
* auto enabled JS mode for few properties, reverted swith and date property controls
* cypress changes
* added widget sniping mode and fixed object passedDefaultValue
* multiselect v2
* select v2
* fix jest tests
* test fixes
* field limit
* rename field type dropdown texts
* field type changes fixes
* jest fixes
* loading state submit button
* default source data for new widget
* modify limit message
* multiseelct default value changes and cypress fix
* select default value
* keep default value intact on field type change
* TextTable cypress text fix
* review changes
* fixed footer changes
* collapse styles section by default
* fixed footer changes
* form modes
* custom field key rentention
* fixed footer fix in view mode
* non ascii characters
* fix meta merge in dataTreeWidget
* minor fixes
* rename useRegisterFieldInvalid.ts -> useRegisterFieldValidity.ts
* modified dependency injection into evaluated values
* refactored fixedfooter logic
* minor change
* accessor update
* minor change
* fixes
* QA fixes date field, scroll content
* fix phone number field, removed visiblity option from array item
* fix sourceData autocomplete
* reset logic
* fix multiselect reset
* form values hydration on widget drag
* code review changes
* reverted order of merge dataTreeWidget
* fixes
* added button titles, fixed hydration issue
* default value fixes
* upgraded react hook form, modified array-level/field-level default value logic
* fixed select validation
* added icon entity explorer, modified icon align control
* modify accessor validation for mongo db _id
* update email field regex
* review changes
* explicitly handle empty source data validation
2022-03-24 07:13:25 +00:00
|
|
|
onFocus?: (e: React.FocusEvent) => void;
|
|
|
|
|
onBlur?: (e: React.FocusEvent) => void;
|
2022-02-02 14:15:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const DEBOUNCE_TIMEOUT = 1000;
|
2022-03-11 05:35:05 +00:00
|
|
|
const FOCUS_TIMEOUT = 500;
|
2022-02-02 14:15:07 +00:00
|
|
|
|
|
|
|
|
function MultiSelectComponent({
|
|
|
|
|
allowSelectAll,
|
|
|
|
|
compactMode,
|
|
|
|
|
disabled,
|
|
|
|
|
dropdownStyle,
|
|
|
|
|
dropDownWidth,
|
|
|
|
|
filterText,
|
|
|
|
|
isFilterable,
|
|
|
|
|
isValid,
|
|
|
|
|
labelStyle,
|
|
|
|
|
labelText,
|
|
|
|
|
labelTextColor,
|
|
|
|
|
labelTextSize,
|
|
|
|
|
loading,
|
feat: JSON Form widget (#8472)
* initial layout
* updated parser to support nested array
* array field rendering
* changes
* ts fix
* minor revert FormWidget
* modified schema structure
* select and switch fields
* added checkbox field
* added RadioGroupField
* partial DateField and defaults, typing refactoring
* added label and field type change
* minor ts changes
* changes
* modified widget/utils for nested panelConfig, modified schema to object approach
* array/object label support
* hide field configuration when children not present
* added tooltip
* field visibility option
* disabled state
* upgraded tslib, form initial values
* custom field configuration - add/hide/edit
* field configuration - label change
* return input when field configuration reaches max depth
* minor changes
* form - scroll, fixedfooter, enitity defn and other minior changes
* form title
* unregister on unmount
* fixes
* zero state
* fix field padding
* patched updating form values, removed linting warnings
* configured action buttons
* minor fix
* minor change
* property pane - sort fields in field configuration
* refactor include all properties
* checkbox properties
* date properties
* refactor typings and radio group properties
* switch, multselect, select, array, object properties
* minor changes
* default value
* ts fixes
* checkbox field properties implementation
* date field prop implementation
* switch field
* select field and fix deep nested meta properties
* multiselect implementation
* minor change
* input field implementation
* fix position jump on field type change
* initial accordian
* field state property and auto-complete of JSONFormComputeControl
* merge fixes
* renamed FormBuilder to JSONForm
* source data validation minor change
* custom field default value fix
* Editable keys for custom field
* minor fixes
* replaced useFieldArray with custom logic, added widget icon
* array and object accordian with border/background styling
* minor change
* disabled states for array and objects
* default value minor fix
* form level styles
* modified logic for isDisabled for array and object, added disabledWhenInvalid, exposed isValid to fieldState for text input, removed useDisableChildren
* added isValid for all field types
* fixed reset to default values
* debounce form values update
* minor change
* minor change
* fix crash - source data change multi-select to array, fix crash - change of options
* fix positioning
* detect date type in source data
* fix crash - when object is passed to regex input field
* fixed default sourceData path for fields
* accodion keep children mounted on collapse
* jest test for schemaParser
* widget/helper and useRegisterFieldInvalid test
* tests for property config helper and generatePanelPropertyConfig
* fix input field validation not appearing
* fix date field type detection
* rename data -> formData
* handle null/undefined field value change in sourceData
* added null/undefined as valid values for defaultValue text field
* auto detect email field
* set formData default value on initial load
* switch field inline positioning
* field margin fix for row direction
* select full width
* fiex date field default value - out of range
* fix any field type to array
* array default value logic change
* base cypress test changes
* initial json form render cy test
* key sanitization
* fix fieldState update logic
* required design, object/array background color, accordion changes, fix - add new custom field
* minor change
* cypress tests
* fix date formatted value, field state cypress test
* cypress - field properties test and fixes
* rename test file
* fix accessort change to blank value, cypress tests
* fix array field default value for modified accessor
* minor fix
* added animate loading
* fix empty state, add new custom field
* test data fix
* fix warnings
* fix timePrecision visibility
* button styling
* ported input v2
* fix jest tests
* fix cypress tests
* perf changes
* perf improvement
* added comments
* multiselect changes
* input field perf refactor
* array field, object field refactor performance
* checkbox field refactor
* refectored date, radio, select and switch
* fixes
* test fixes
* fixes
* minor fix
* rename field renderer
* remove tracked fieldRenderer field
* cypress test fixes
* cypress changes
* array default value fixes
* arrayfield passedDefaultValue
* auto enabled JS mode for few properties, reverted swith and date property controls
* cypress changes
* added widget sniping mode and fixed object passedDefaultValue
* multiselect v2
* select v2
* fix jest tests
* test fixes
* field limit
* rename field type dropdown texts
* field type changes fixes
* jest fixes
* loading state submit button
* default source data for new widget
* modify limit message
* multiseelct default value changes and cypress fix
* select default value
* keep default value intact on field type change
* TextTable cypress text fix
* review changes
* fixed footer changes
* collapse styles section by default
* fixed footer changes
* form modes
* custom field key rentention
* fixed footer fix in view mode
* non ascii characters
* fix meta merge in dataTreeWidget
* minor fixes
* rename useRegisterFieldInvalid.ts -> useRegisterFieldValidity.ts
* modified dependency injection into evaluated values
* refactored fixedfooter logic
* minor change
* accessor update
* minor change
* fixes
* QA fixes date field, scroll content
* fix phone number field, removed visiblity option from array item
* fix sourceData autocomplete
* reset logic
* fix multiselect reset
* form values hydration on widget drag
* code review changes
* reverted order of merge dataTreeWidget
* fixes
* added button titles, fixed hydration issue
* default value fixes
* upgraded react hook form, modified array-level/field-level default value logic
* fixed select validation
* added icon entity explorer, modified icon align control
* modify accessor validation for mongo db _id
* update email field regex
* review changes
* explicitly handle empty source data validation
2022-03-24 07:13:25 +00:00
|
|
|
onBlur,
|
2022-02-02 14:15:07 +00:00
|
|
|
onChange,
|
|
|
|
|
onFilterChange,
|
feat: JSON Form widget (#8472)
* initial layout
* updated parser to support nested array
* array field rendering
* changes
* ts fix
* minor revert FormWidget
* modified schema structure
* select and switch fields
* added checkbox field
* added RadioGroupField
* partial DateField and defaults, typing refactoring
* added label and field type change
* minor ts changes
* changes
* modified widget/utils for nested panelConfig, modified schema to object approach
* array/object label support
* hide field configuration when children not present
* added tooltip
* field visibility option
* disabled state
* upgraded tslib, form initial values
* custom field configuration - add/hide/edit
* field configuration - label change
* return input when field configuration reaches max depth
* minor changes
* form - scroll, fixedfooter, enitity defn and other minior changes
* form title
* unregister on unmount
* fixes
* zero state
* fix field padding
* patched updating form values, removed linting warnings
* configured action buttons
* minor fix
* minor change
* property pane - sort fields in field configuration
* refactor include all properties
* checkbox properties
* date properties
* refactor typings and radio group properties
* switch, multselect, select, array, object properties
* minor changes
* default value
* ts fixes
* checkbox field properties implementation
* date field prop implementation
* switch field
* select field and fix deep nested meta properties
* multiselect implementation
* minor change
* input field implementation
* fix position jump on field type change
* initial accordian
* field state property and auto-complete of JSONFormComputeControl
* merge fixes
* renamed FormBuilder to JSONForm
* source data validation minor change
* custom field default value fix
* Editable keys for custom field
* minor fixes
* replaced useFieldArray with custom logic, added widget icon
* array and object accordian with border/background styling
* minor change
* disabled states for array and objects
* default value minor fix
* form level styles
* modified logic for isDisabled for array and object, added disabledWhenInvalid, exposed isValid to fieldState for text input, removed useDisableChildren
* added isValid for all field types
* fixed reset to default values
* debounce form values update
* minor change
* minor change
* fix crash - source data change multi-select to array, fix crash - change of options
* fix positioning
* detect date type in source data
* fix crash - when object is passed to regex input field
* fixed default sourceData path for fields
* accodion keep children mounted on collapse
* jest test for schemaParser
* widget/helper and useRegisterFieldInvalid test
* tests for property config helper and generatePanelPropertyConfig
* fix input field validation not appearing
* fix date field type detection
* rename data -> formData
* handle null/undefined field value change in sourceData
* added null/undefined as valid values for defaultValue text field
* auto detect email field
* set formData default value on initial load
* switch field inline positioning
* field margin fix for row direction
* select full width
* fiex date field default value - out of range
* fix any field type to array
* array default value logic change
* base cypress test changes
* initial json form render cy test
* key sanitization
* fix fieldState update logic
* required design, object/array background color, accordion changes, fix - add new custom field
* minor change
* cypress tests
* fix date formatted value, field state cypress test
* cypress - field properties test and fixes
* rename test file
* fix accessort change to blank value, cypress tests
* fix array field default value for modified accessor
* minor fix
* added animate loading
* fix empty state, add new custom field
* test data fix
* fix warnings
* fix timePrecision visibility
* button styling
* ported input v2
* fix jest tests
* fix cypress tests
* perf changes
* perf improvement
* added comments
* multiselect changes
* input field perf refactor
* array field, object field refactor performance
* checkbox field refactor
* refectored date, radio, select and switch
* fixes
* test fixes
* fixes
* minor fix
* rename field renderer
* remove tracked fieldRenderer field
* cypress test fixes
* cypress changes
* array default value fixes
* arrayfield passedDefaultValue
* auto enabled JS mode for few properties, reverted swith and date property controls
* cypress changes
* added widget sniping mode and fixed object passedDefaultValue
* multiselect v2
* select v2
* fix jest tests
* test fixes
* field limit
* rename field type dropdown texts
* field type changes fixes
* jest fixes
* loading state submit button
* default source data for new widget
* modify limit message
* multiseelct default value changes and cypress fix
* select default value
* keep default value intact on field type change
* TextTable cypress text fix
* review changes
* fixed footer changes
* collapse styles section by default
* fixed footer changes
* form modes
* custom field key rentention
* fixed footer fix in view mode
* non ascii characters
* fix meta merge in dataTreeWidget
* minor fixes
* rename useRegisterFieldInvalid.ts -> useRegisterFieldValidity.ts
* modified dependency injection into evaluated values
* refactored fixedfooter logic
* minor change
* accessor update
* minor change
* fixes
* QA fixes date field, scroll content
* fix phone number field, removed visiblity option from array item
* fix sourceData autocomplete
* reset logic
* fix multiselect reset
* form values hydration on widget drag
* code review changes
* reverted order of merge dataTreeWidget
* fixes
* added button titles, fixed hydration issue
* default value fixes
* upgraded react hook form, modified array-level/field-level default value logic
* fixed select validation
* added icon entity explorer, modified icon align control
* modify accessor validation for mongo db _id
* update email field regex
* review changes
* explicitly handle empty source data validation
2022-03-24 07:13:25 +00:00
|
|
|
onFocus,
|
2022-02-02 14:15:07 +00:00
|
|
|
options,
|
|
|
|
|
placeholder,
|
|
|
|
|
serverSideFiltering,
|
|
|
|
|
value,
|
|
|
|
|
widgetId,
|
|
|
|
|
width,
|
|
|
|
|
}: MultiSelectProps): JSX.Element {
|
|
|
|
|
const [isSelectAll, setIsSelectAll] = useState(false);
|
|
|
|
|
const [filter, setFilter] = useState(filterText ?? "");
|
|
|
|
|
const [filteredOptions, setFilteredOptions] = useState(options);
|
|
|
|
|
const _menu = useRef<HTMLElement | null>(null);
|
2022-03-11 05:35:05 +00:00
|
|
|
const labelRef = useRef<HTMLDivElement>(null);
|
|
|
|
|
const inputRef = useRef<HTMLInputElement>(null);
|
2022-02-02 14:15:07 +00:00
|
|
|
|
|
|
|
|
const clearButton = useMemo(
|
2022-03-11 05:35:05 +00:00
|
|
|
() =>
|
|
|
|
|
filter ? (
|
|
|
|
|
<Button icon="cross" minimal onClick={() => setFilter("")} />
|
|
|
|
|
) : null,
|
|
|
|
|
[filter],
|
2022-02-02 14:15:07 +00:00
|
|
|
);
|
|
|
|
|
const getDropdownPosition = useCallback(() => {
|
|
|
|
|
const node = _menu.current;
|
|
|
|
|
if (Boolean(node?.closest(`.${MODAL_PORTAL_CLASSNAME}`))) {
|
|
|
|
|
return document.querySelector(
|
|
|
|
|
`.${MODAL_PORTAL_CLASSNAME}`,
|
|
|
|
|
) as HTMLElement;
|
|
|
|
|
}
|
|
|
|
|
return document.querySelector(`.${CANVAS_CLASSNAME}`) as HTMLElement;
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const handleSelectAll = () => {
|
|
|
|
|
if (!isSelectAll) {
|
|
|
|
|
// Get all options
|
|
|
|
|
const allOption: LabelValueType[] = filteredOptions.map(
|
|
|
|
|
({ label, value }) => ({
|
|
|
|
|
value,
|
|
|
|
|
label,
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
// get unique selected values amongst SelectedAllValue and Value
|
2022-02-22 08:43:35 +00:00
|
|
|
const allSelectedOptions = uniqBy([...allOption, ...value], "value").map(
|
|
|
|
|
(val) => ({
|
|
|
|
|
...val,
|
|
|
|
|
key: val.value,
|
|
|
|
|
}),
|
|
|
|
|
);
|
2022-02-02 14:15:07 +00:00
|
|
|
onChange(allSelectedOptions);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
return onChange([]);
|
|
|
|
|
};
|
|
|
|
|
|
2022-03-11 05:35:05 +00:00
|
|
|
const onOpen = useCallback((open: boolean) => {
|
|
|
|
|
if (open) {
|
|
|
|
|
setTimeout(() => inputRef.current?.focus(), FOCUS_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
}, []);
|
|
|
|
|
|
2022-02-02 14:15:07 +00:00
|
|
|
const checkOptionsAndValue = () => {
|
|
|
|
|
const emptyFalseArr = [false];
|
|
|
|
|
if (value.length === 0 || filteredOptions.length === 0)
|
|
|
|
|
return emptyFalseArr;
|
|
|
|
|
return filteredOptions.map((x) => value.some((y) => y.value === x.value));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// SelectAll if all options are in Value
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (
|
|
|
|
|
!isSelectAll &&
|
|
|
|
|
filteredOptions.length &&
|
|
|
|
|
value.length &&
|
|
|
|
|
!checkOptionsAndValue().includes(false)
|
|
|
|
|
) {
|
|
|
|
|
setIsSelectAll(true);
|
|
|
|
|
}
|
|
|
|
|
if (isSelectAll && filteredOptions.length !== value.length) {
|
|
|
|
|
setIsSelectAll(false);
|
|
|
|
|
}
|
|
|
|
|
}, [filteredOptions, value]);
|
|
|
|
|
|
|
|
|
|
// Trigger onFilterChange once filter is Updated
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const timeOutId = setTimeout(
|
|
|
|
|
() => onFilterChange(filter),
|
|
|
|
|
DEBOUNCE_TIMEOUT,
|
|
|
|
|
);
|
|
|
|
|
return () => clearTimeout(timeOutId);
|
|
|
|
|
}, [filter]);
|
|
|
|
|
|
|
|
|
|
// Filter options based on serverSideFiltering
|
|
|
|
|
useEffect(
|
|
|
|
|
() => {
|
|
|
|
|
if (serverSideFiltering) {
|
|
|
|
|
return setFilteredOptions(options);
|
|
|
|
|
}
|
|
|
|
|
const filtered = options.filter((option) => {
|
|
|
|
|
return (
|
|
|
|
|
String(option.label)
|
|
|
|
|
.toLowerCase()
|
|
|
|
|
.indexOf(filter.toLowerCase()) >= 0 ||
|
|
|
|
|
String(option.value)
|
|
|
|
|
.toLowerCase()
|
|
|
|
|
.indexOf(filter.toLowerCase()) >= 0
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
setFilteredOptions(filtered);
|
|
|
|
|
},
|
|
|
|
|
serverSideFiltering ? [options] : [filter, options],
|
|
|
|
|
);
|
2022-03-11 05:35:05 +00:00
|
|
|
const memoDropDownWidth = useMemo(() => {
|
|
|
|
|
if (compactMode && labelRef.current) {
|
|
|
|
|
const labelWidth = labelRef.current.clientWidth;
|
|
|
|
|
const widthDiff = dropDownWidth - labelWidth;
|
|
|
|
|
return widthDiff > dropDownWidth ? widthDiff : dropDownWidth;
|
|
|
|
|
}
|
|
|
|
|
const parentWidth = width - WidgetContainerDiff;
|
|
|
|
|
return parentWidth > dropDownWidth ? parentWidth : dropDownWidth;
|
|
|
|
|
}, [compactMode, dropDownWidth, width]);
|
2022-02-02 14:15:07 +00:00
|
|
|
|
2022-03-11 05:35:05 +00:00
|
|
|
const onQueryChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {
|
2022-02-02 14:15:07 +00:00
|
|
|
event.stopPropagation();
|
|
|
|
|
setFilter(event.target.value);
|
2022-03-11 05:35:05 +00:00
|
|
|
}, []);
|
|
|
|
|
|
2022-02-02 14:15:07 +00:00
|
|
|
const dropdownRender = useCallback(
|
|
|
|
|
(
|
|
|
|
|
menu: React.ReactElement<any, string | React.JSXElementConstructor<any>>,
|
|
|
|
|
) => (
|
|
|
|
|
<>
|
|
|
|
|
{isFilterable ? (
|
|
|
|
|
<InputGroup
|
2022-03-11 05:35:05 +00:00
|
|
|
inputRef={inputRef}
|
2022-02-02 14:15:07 +00:00
|
|
|
leftIcon="search"
|
|
|
|
|
onChange={onQueryChange}
|
|
|
|
|
onKeyDown={(e) => e.stopPropagation()}
|
|
|
|
|
placeholder="Filter..."
|
2022-03-11 05:35:05 +00:00
|
|
|
// ref={inputRef}
|
|
|
|
|
rightElement={clearButton as JSX.Element}
|
2022-02-02 14:15:07 +00:00
|
|
|
small
|
|
|
|
|
type="text"
|
|
|
|
|
value={filter}
|
|
|
|
|
/>
|
|
|
|
|
) : null}
|
|
|
|
|
<div className={`${loading ? Classes.SKELETON : ""}`}>
|
|
|
|
|
{filteredOptions.length && allowSelectAll ? (
|
|
|
|
|
<StyledCheckbox
|
|
|
|
|
alignIndicator="left"
|
|
|
|
|
checked={isSelectAll}
|
|
|
|
|
className={`all-options ${isSelectAll ? "selected" : ""}`}
|
|
|
|
|
label="Select all"
|
|
|
|
|
onChange={handleSelectAll}
|
|
|
|
|
/>
|
|
|
|
|
) : null}
|
|
|
|
|
{menu}
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
),
|
|
|
|
|
[
|
|
|
|
|
isSelectAll,
|
|
|
|
|
filteredOptions,
|
|
|
|
|
loading,
|
|
|
|
|
allowSelectAll,
|
|
|
|
|
isFilterable,
|
|
|
|
|
filter,
|
2022-03-11 05:35:05 +00:00
|
|
|
onQueryChange,
|
2022-02-02 14:15:07 +00:00
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<MultiSelectContainer
|
|
|
|
|
compactMode={compactMode}
|
|
|
|
|
isValid={isValid}
|
|
|
|
|
ref={_menu as React.RefObject<HTMLDivElement>}
|
|
|
|
|
>
|
2022-03-11 05:35:05 +00:00
|
|
|
<DropdownStyles dropDownWidth={memoDropDownWidth} id={widgetId} />
|
2022-02-02 14:15:07 +00:00
|
|
|
{labelText && (
|
2022-03-11 05:35:05 +00:00
|
|
|
<TextLabelWrapper compactMode={compactMode} ref={labelRef}>
|
2022-02-02 14:15:07 +00:00
|
|
|
<StyledLabel
|
|
|
|
|
$compactMode={compactMode}
|
|
|
|
|
$disabled={disabled}
|
|
|
|
|
$labelStyle={labelStyle}
|
|
|
|
|
$labelText={labelText}
|
|
|
|
|
$labelTextColor={labelTextColor}
|
|
|
|
|
$labelTextSize={labelTextSize}
|
|
|
|
|
className={`tree-multiselect-label ${Classes.TEXT_OVERFLOW_ELLIPSIS}`}
|
|
|
|
|
>
|
|
|
|
|
{labelText}
|
|
|
|
|
</StyledLabel>
|
|
|
|
|
</TextLabelWrapper>
|
|
|
|
|
)}
|
|
|
|
|
<Select
|
|
|
|
|
animation="slide-up"
|
|
|
|
|
choiceTransitionName="rc-select-selection__choice-zoom"
|
|
|
|
|
// TODO: Make Autofocus a variable in the property pane
|
|
|
|
|
// autoFocus
|
|
|
|
|
className="rc-select"
|
2022-03-11 05:35:05 +00:00
|
|
|
defaultActiveFirstOption={false}
|
2022-02-02 14:15:07 +00:00
|
|
|
disabled={disabled}
|
|
|
|
|
dropdownClassName={`multi-select-dropdown multiselect-popover-width-${widgetId}`}
|
|
|
|
|
dropdownRender={dropdownRender}
|
|
|
|
|
dropdownStyle={dropdownStyle}
|
|
|
|
|
getPopupContainer={getDropdownPosition}
|
|
|
|
|
inputIcon={
|
|
|
|
|
<Icon
|
|
|
|
|
className="dropdown-icon"
|
|
|
|
|
fillColor={disabled ? Colors.GREY_7 : Colors.GREY_10}
|
|
|
|
|
name="dropdown"
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
labelInValue
|
|
|
|
|
listHeight={300}
|
|
|
|
|
loading={loading}
|
|
|
|
|
maxTagCount={"responsive"}
|
|
|
|
|
maxTagPlaceholder={(e) => `+${e.length} more`}
|
|
|
|
|
menuItemSelectedIcon={menuItemSelectedIcon}
|
|
|
|
|
mode="multiple"
|
|
|
|
|
notFoundContent="No Results Found"
|
feat: JSON Form widget (#8472)
* initial layout
* updated parser to support nested array
* array field rendering
* changes
* ts fix
* minor revert FormWidget
* modified schema structure
* select and switch fields
* added checkbox field
* added RadioGroupField
* partial DateField and defaults, typing refactoring
* added label and field type change
* minor ts changes
* changes
* modified widget/utils for nested panelConfig, modified schema to object approach
* array/object label support
* hide field configuration when children not present
* added tooltip
* field visibility option
* disabled state
* upgraded tslib, form initial values
* custom field configuration - add/hide/edit
* field configuration - label change
* return input when field configuration reaches max depth
* minor changes
* form - scroll, fixedfooter, enitity defn and other minior changes
* form title
* unregister on unmount
* fixes
* zero state
* fix field padding
* patched updating form values, removed linting warnings
* configured action buttons
* minor fix
* minor change
* property pane - sort fields in field configuration
* refactor include all properties
* checkbox properties
* date properties
* refactor typings and radio group properties
* switch, multselect, select, array, object properties
* minor changes
* default value
* ts fixes
* checkbox field properties implementation
* date field prop implementation
* switch field
* select field and fix deep nested meta properties
* multiselect implementation
* minor change
* input field implementation
* fix position jump on field type change
* initial accordian
* field state property and auto-complete of JSONFormComputeControl
* merge fixes
* renamed FormBuilder to JSONForm
* source data validation minor change
* custom field default value fix
* Editable keys for custom field
* minor fixes
* replaced useFieldArray with custom logic, added widget icon
* array and object accordian with border/background styling
* minor change
* disabled states for array and objects
* default value minor fix
* form level styles
* modified logic for isDisabled for array and object, added disabledWhenInvalid, exposed isValid to fieldState for text input, removed useDisableChildren
* added isValid for all field types
* fixed reset to default values
* debounce form values update
* minor change
* minor change
* fix crash - source data change multi-select to array, fix crash - change of options
* fix positioning
* detect date type in source data
* fix crash - when object is passed to regex input field
* fixed default sourceData path for fields
* accodion keep children mounted on collapse
* jest test for schemaParser
* widget/helper and useRegisterFieldInvalid test
* tests for property config helper and generatePanelPropertyConfig
* fix input field validation not appearing
* fix date field type detection
* rename data -> formData
* handle null/undefined field value change in sourceData
* added null/undefined as valid values for defaultValue text field
* auto detect email field
* set formData default value on initial load
* switch field inline positioning
* field margin fix for row direction
* select full width
* fiex date field default value - out of range
* fix any field type to array
* array default value logic change
* base cypress test changes
* initial json form render cy test
* key sanitization
* fix fieldState update logic
* required design, object/array background color, accordion changes, fix - add new custom field
* minor change
* cypress tests
* fix date formatted value, field state cypress test
* cypress - field properties test and fixes
* rename test file
* fix accessort change to blank value, cypress tests
* fix array field default value for modified accessor
* minor fix
* added animate loading
* fix empty state, add new custom field
* test data fix
* fix warnings
* fix timePrecision visibility
* button styling
* ported input v2
* fix jest tests
* fix cypress tests
* perf changes
* perf improvement
* added comments
* multiselect changes
* input field perf refactor
* array field, object field refactor performance
* checkbox field refactor
* refectored date, radio, select and switch
* fixes
* test fixes
* fixes
* minor fix
* rename field renderer
* remove tracked fieldRenderer field
* cypress test fixes
* cypress changes
* array default value fixes
* arrayfield passedDefaultValue
* auto enabled JS mode for few properties, reverted swith and date property controls
* cypress changes
* added widget sniping mode and fixed object passedDefaultValue
* multiselect v2
* select v2
* fix jest tests
* test fixes
* field limit
* rename field type dropdown texts
* field type changes fixes
* jest fixes
* loading state submit button
* default source data for new widget
* modify limit message
* multiseelct default value changes and cypress fix
* select default value
* keep default value intact on field type change
* TextTable cypress text fix
* review changes
* fixed footer changes
* collapse styles section by default
* fixed footer changes
* form modes
* custom field key rentention
* fixed footer fix in view mode
* non ascii characters
* fix meta merge in dataTreeWidget
* minor fixes
* rename useRegisterFieldInvalid.ts -> useRegisterFieldValidity.ts
* modified dependency injection into evaluated values
* refactored fixedfooter logic
* minor change
* accessor update
* minor change
* fixes
* QA fixes date field, scroll content
* fix phone number field, removed visiblity option from array item
* fix sourceData autocomplete
* reset logic
* fix multiselect reset
* form values hydration on widget drag
* code review changes
* reverted order of merge dataTreeWidget
* fixes
* added button titles, fixed hydration issue
* default value fixes
* upgraded react hook form, modified array-level/field-level default value logic
* fixed select validation
* added icon entity explorer, modified icon align control
* modify accessor validation for mongo db _id
* update email field regex
* review changes
* explicitly handle empty source data validation
2022-03-24 07:13:25 +00:00
|
|
|
onBlur={onBlur}
|
2022-02-02 14:15:07 +00:00
|
|
|
onChange={onChange}
|
2022-03-11 05:35:05 +00:00
|
|
|
onDropdownVisibleChange={onOpen}
|
feat: JSON Form widget (#8472)
* initial layout
* updated parser to support nested array
* array field rendering
* changes
* ts fix
* minor revert FormWidget
* modified schema structure
* select and switch fields
* added checkbox field
* added RadioGroupField
* partial DateField and defaults, typing refactoring
* added label and field type change
* minor ts changes
* changes
* modified widget/utils for nested panelConfig, modified schema to object approach
* array/object label support
* hide field configuration when children not present
* added tooltip
* field visibility option
* disabled state
* upgraded tslib, form initial values
* custom field configuration - add/hide/edit
* field configuration - label change
* return input when field configuration reaches max depth
* minor changes
* form - scroll, fixedfooter, enitity defn and other minior changes
* form title
* unregister on unmount
* fixes
* zero state
* fix field padding
* patched updating form values, removed linting warnings
* configured action buttons
* minor fix
* minor change
* property pane - sort fields in field configuration
* refactor include all properties
* checkbox properties
* date properties
* refactor typings and radio group properties
* switch, multselect, select, array, object properties
* minor changes
* default value
* ts fixes
* checkbox field properties implementation
* date field prop implementation
* switch field
* select field and fix deep nested meta properties
* multiselect implementation
* minor change
* input field implementation
* fix position jump on field type change
* initial accordian
* field state property and auto-complete of JSONFormComputeControl
* merge fixes
* renamed FormBuilder to JSONForm
* source data validation minor change
* custom field default value fix
* Editable keys for custom field
* minor fixes
* replaced useFieldArray with custom logic, added widget icon
* array and object accordian with border/background styling
* minor change
* disabled states for array and objects
* default value minor fix
* form level styles
* modified logic for isDisabled for array and object, added disabledWhenInvalid, exposed isValid to fieldState for text input, removed useDisableChildren
* added isValid for all field types
* fixed reset to default values
* debounce form values update
* minor change
* minor change
* fix crash - source data change multi-select to array, fix crash - change of options
* fix positioning
* detect date type in source data
* fix crash - when object is passed to regex input field
* fixed default sourceData path for fields
* accodion keep children mounted on collapse
* jest test for schemaParser
* widget/helper and useRegisterFieldInvalid test
* tests for property config helper and generatePanelPropertyConfig
* fix input field validation not appearing
* fix date field type detection
* rename data -> formData
* handle null/undefined field value change in sourceData
* added null/undefined as valid values for defaultValue text field
* auto detect email field
* set formData default value on initial load
* switch field inline positioning
* field margin fix for row direction
* select full width
* fiex date field default value - out of range
* fix any field type to array
* array default value logic change
* base cypress test changes
* initial json form render cy test
* key sanitization
* fix fieldState update logic
* required design, object/array background color, accordion changes, fix - add new custom field
* minor change
* cypress tests
* fix date formatted value, field state cypress test
* cypress - field properties test and fixes
* rename test file
* fix accessort change to blank value, cypress tests
* fix array field default value for modified accessor
* minor fix
* added animate loading
* fix empty state, add new custom field
* test data fix
* fix warnings
* fix timePrecision visibility
* button styling
* ported input v2
* fix jest tests
* fix cypress tests
* perf changes
* perf improvement
* added comments
* multiselect changes
* input field perf refactor
* array field, object field refactor performance
* checkbox field refactor
* refectored date, radio, select and switch
* fixes
* test fixes
* fixes
* minor fix
* rename field renderer
* remove tracked fieldRenderer field
* cypress test fixes
* cypress changes
* array default value fixes
* arrayfield passedDefaultValue
* auto enabled JS mode for few properties, reverted swith and date property controls
* cypress changes
* added widget sniping mode and fixed object passedDefaultValue
* multiselect v2
* select v2
* fix jest tests
* test fixes
* field limit
* rename field type dropdown texts
* field type changes fixes
* jest fixes
* loading state submit button
* default source data for new widget
* modify limit message
* multiseelct default value changes and cypress fix
* select default value
* keep default value intact on field type change
* TextTable cypress text fix
* review changes
* fixed footer changes
* collapse styles section by default
* fixed footer changes
* form modes
* custom field key rentention
* fixed footer fix in view mode
* non ascii characters
* fix meta merge in dataTreeWidget
* minor fixes
* rename useRegisterFieldInvalid.ts -> useRegisterFieldValidity.ts
* modified dependency injection into evaluated values
* refactored fixedfooter logic
* minor change
* accessor update
* minor change
* fixes
* QA fixes date field, scroll content
* fix phone number field, removed visiblity option from array item
* fix sourceData autocomplete
* reset logic
* fix multiselect reset
* form values hydration on widget drag
* code review changes
* reverted order of merge dataTreeWidget
* fixes
* added button titles, fixed hydration issue
* default value fixes
* upgraded react hook form, modified array-level/field-level default value logic
* fixed select validation
* added icon entity explorer, modified icon align control
* modify accessor validation for mongo db _id
* update email field regex
* review changes
* explicitly handle empty source data validation
2022-03-24 07:13:25 +00:00
|
|
|
onFocus={onFocus}
|
2022-02-02 14:15:07 +00:00
|
|
|
options={filteredOptions}
|
|
|
|
|
placeholder={placeholder || "select option(s)"}
|
|
|
|
|
removeIcon={
|
|
|
|
|
<Icon
|
|
|
|
|
className="remove-icon"
|
|
|
|
|
fillColor={Colors.GREY_10}
|
|
|
|
|
name="close-x"
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
showArrow
|
|
|
|
|
showSearch={false}
|
|
|
|
|
value={value}
|
|
|
|
|
/>
|
|
|
|
|
</MultiSelectContainer>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default MultiSelectComponent;
|