@bigbinary/neetoui-rn 0.0.118 → 0.0.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/MultiSelect.js +1 -1
- package/lib/components/Select.js +1 -1
- package/package.json +1 -1
- package/src/components/MultiSelect.js +207 -68
- package/src/components/Select.js +197 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.MultiSelect=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","labelExtractor","valueExtractor","onSelect","selectedValue","deletedValue","isLoading","isSearchable","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","multiSelectedItemContainerStyle","multiSelectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var MultiSelectItem=function MultiSelectItem(_ref){var label=_ref.label,onUnselect=_ref.onUnselect,multiSelectedItemContainerStyle=_ref.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref.multiSelectedItemTextStyle;return _react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.base",bg:"background.grey100",borderRadius:2,flexDirection:"row",alignItems:"center",justifyContent:"space-between",p:1,m:1},multiSelectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:26,columnNumber:3}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",mr:2,maxWidth:"90%"},multiSelectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:38,columnNumber:5}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onUnselect,__self:_this,__source:{fileName:_jsxFileName,lineNumber:47,columnNumber:5}},_react.default.createElement(_reactNativeRemixIcon.default,{name:"ri-close-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:48,columnNumber:7}})));};MultiSelectItem.propTypes={label:_propTypes.default.string,onUnselect:_propTypes.default.func,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};var DropdownItem=function DropdownItem(_ref2){var label=_ref2.label,onPress=_ref2.onPress,defaultDropdownItemHeight=_ref2.defaultDropdownItemHeight,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle;return _react.default.createElement(_.Touchable,{bg:"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:68,columnNumber:5}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:69,columnNumber:7}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},itemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:74,columnNumber:9}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string,onPress:_propTypes.default.func,defaultDropdownItemHeight:_propTypes.default.number,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object};var MultiSelect=function MultiSelect(_ref3){var options=_ref3.options,label=_ref3.label,value=_ref3.value,placeholder=_ref3.placeholder,labelExtractor=_ref3.labelExtractor,valueExtractor=_ref3.valueExtractor,onSelect=_ref3.onSelect,selectedValue=_ref3.selectedValue,deletedValue=_ref3.deletedValue,isLoading=_ref3.isLoading,isSearchable=_ref3.isSearchable,labelStyle=_ref3.labelStyle,containerStyle=_ref3.containerStyle,inputContainerStyle=_ref3.inputContainerStyle,dropdownContainerStyle=_ref3.dropdownContainerStyle,itemContainerStyle=_ref3.itemContainerStyle,itemTextStyle=_ref3.itemTextStyle,multiSelectedItemContainerStyle=_ref3.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref3.multiSelectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref3,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var multipleOptionsSelected=(value==null?void 0:value.length)>0;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*6;var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease})};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease}};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease})};}}";_f.__workletHash=10836038512691;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (172:42)";_f.__optimalization=2;return _f;}());var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");setShowDropdown(!showDropdown);toggleAnimation();};var handleUnselection=function handleUnselection(item){var newValue=value.filter(function(selectedItem){return valueExtractor(selectedItem)!==valueExtractor(item);});onSelect(newValue);deletedValue(item);};var handleSelection=function handleSelection(item){onSelect([].concat((0,_toConsumableArray2.default)(value),[item]));selectedValue(item);};return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:207,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:208,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:217,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",flexDirection:"row",justifyContent:"space-between",alignItems:"center",p:multipleOptionsSelected?1:2,pr:2,maxHeight:120},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:221,columnNumber:9}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:234,columnNumber:13}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_reactNativeGestureHandler.ScrollView,{showsVerticalScrollIndicator:false,__self:_this,__source:{fileName:_jsxFileName,lineNumber:239,columnNumber:13}},_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",onStartShouldSetResponder:function onStartShouldSetResponder(){return true;},__self:_this,__source:{fileName:_jsxFileName,lineNumber:240,columnNumber:15}},value==null?void 0:value.map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(MultiSelectItem,{key:index,label:optionLabel,onUnselect:function onUnselect(){return handleUnselection(item);},multiSelectedItemContainerStyle:multiSelectedItemContainerStyle,multiSelectedItemTextStyle:multiSelectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:249,columnNumber:21}});}))),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:264,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:269,columnNumber:13}}))),_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:277,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:278,columnNumber:9}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:279,columnNumber:11}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:15}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:288,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:295,columnNumber:13}},options.filter(function(item,index){var optionValue=valueExtractor(item,index);var isItemAlreadySelected=Boolean(value==null?void 0:value.find(function(selectedItem){return valueExtractor(selectedItem)===optionValue;}));return!isItemAlreadySelected;}).filter(function(item,index){var optionLabel=labelExtractor(item,index);if(searchQuery.length===0)return true;return formatStr(optionLabel).includes(formatStr(searchQuery));}).map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,onPress:function onPress(){return handleSelection(item);},itemContainerStyle:itemContainerStyle,defaultDropdownItemHeight:defaultDropdownItemHeight,itemTextStyle:itemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:317,columnNumber:21}});}))))));};exports.MultiSelect=MultiSelect;MultiSelect.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.oneOfType([_propTypes.default.string,_propTypes.default.array]),onSelect:_propTypes.default.func,selectedValue:_propTypes.default.func,deletedValue:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};MultiSelect.defaultProps={label:null,placeholder:"Select Option",labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},selectedValue:function selectedValue(){},deletedValue:function deletedValue(){},isLoading:false,isSearchable:false};
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.MultiSelect=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","emptyOptionsPlaceholder","labelExtractor","valueExtractor","onSelect","selectedValue","deletedValue","isLoading","isSearchable","showCreateOption","showCreateOptionLoader","createOptionLabel","onPressCreateOption","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemLabelStyle","multiSelectedItemContainerStyle","multiSelectedItemLabelStyle","searchInputContainerStyle","searchInputStyle","emptyOptionsContainerStyle","emptyOptionsLabelStyle","createSearchedOptionContainerStyle","createSearchedOptionLabelStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var MultiSelectItem=function MultiSelectItem(_ref){var label=_ref.label,onUnselect=_ref.onUnselect,multiSelectedItemContainerStyle=_ref.multiSelectedItemContainerStyle,multiSelectedItemLabelStyle=_ref.multiSelectedItemLabelStyle;return _react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.base",bg:"background.grey100",borderRadius:2,flexDirection:"row",alignItems:"center",justifyContent:"space-between",p:1,m:1},multiSelectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:27,columnNumber:3}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",mr:2,maxWidth:"90%"},multiSelectedItemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:39,columnNumber:5}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onUnselect,__self:_this,__source:{fileName:_jsxFileName,lineNumber:48,columnNumber:5}},_react.default.createElement(_reactNativeRemixIcon.default,{name:"ri-close-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:49,columnNumber:7}})));};MultiSelectItem.propTypes={label:_propTypes.default.string,onUnselect:_propTypes.default.func,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemLabelStyle:_propTypes.default.object};var DropdownItem=function DropdownItem(_ref2){var label=_ref2.label,onPress=_ref2.onPress,defaultDropdownItemHeight=_ref2.defaultDropdownItemHeight,itemContainerStyle=_ref2.itemContainerStyle,itemLabelStyle=_ref2.itemLabelStyle;return _react.default.createElement(_.Touchable,{bg:"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:69,columnNumber:5}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:70,columnNumber:7}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},itemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:75,columnNumber:9}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string,onPress:_propTypes.default.func,defaultDropdownItemHeight:_propTypes.default.number,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object};var MultiSelect=function MultiSelect(_ref3){var options=_ref3.options,label=_ref3.label,value=_ref3.value,placeholder=_ref3.placeholder,emptyOptionsPlaceholder=_ref3.emptyOptionsPlaceholder,labelExtractor=_ref3.labelExtractor,valueExtractor=_ref3.valueExtractor,onSelect=_ref3.onSelect,selectedValue=_ref3.selectedValue,deletedValue=_ref3.deletedValue,isLoading=_ref3.isLoading,isSearchable=_ref3.isSearchable,showCreateOption=_ref3.showCreateOption,showCreateOptionLoader=_ref3.showCreateOptionLoader,createOptionLabel=_ref3.createOptionLabel,onPressCreateOption=_ref3.onPressCreateOption,labelStyle=_ref3.labelStyle,containerStyle=_ref3.containerStyle,inputContainerStyle=_ref3.inputContainerStyle,dropdownContainerStyle=_ref3.dropdownContainerStyle,itemContainerStyle=_ref3.itemContainerStyle,itemLabelStyle=_ref3.itemLabelStyle,multiSelectedItemContainerStyle=_ref3.multiSelectedItemContainerStyle,multiSelectedItemLabelStyle=_ref3.multiSelectedItemLabelStyle,searchInputContainerStyle=_ref3.searchInputContainerStyle,searchInputStyle=_ref3.searchInputStyle,emptyOptionsContainerStyle=_ref3.emptyOptionsContainerStyle,emptyOptionsLabelStyle=_ref3.emptyOptionsLabelStyle,createSearchedOptionContainerStyle=_ref3.createSearchedOptionContainerStyle,createSearchedOptionLabelStyle=_ref3.createSearchedOptionLabelStyle,rest=(0,_objectWithoutProperties2.default)(_ref3,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var filteredOptions=options.filter(function(item,index){var optionValue=valueExtractor(item,index);var isItemAlreadySelected=Boolean(value==null?void 0:value.find(function(selectedItem){return valueExtractor(selectedItem)===optionValue;}));return!isItemAlreadySelected;}).filter(function(item,index){var optionLabel=labelExtractor(item,index);if(searchQuery.length===0)return true;return formatStr(optionLabel).includes(formatStr(searchQuery));});var isOptionsEmpty=!options||(options==null?void 0:options.length)===0;var isSearchedOptionsEmpty=searchQuery.length>0&&filteredOptions.length===0;var emptyOptionsPlaceholderHeight=40;var emptySearchedOptionsHeight=40;var searchInputHeight=35;var multipleOptionsSelected=(value==null?void 0:value.length)>0;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*Math.min(filteredOptions==null?void 0:filteredOptions.length,6)+(isSearchable?searchInputHeight+10:0)+(isOptionsEmpty?emptyOptionsPlaceholderHeight:0)+(isSearchedOptionsEmpty&&showCreateOption?emptySearchedOptionsHeight:0);var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease},function(){var _f=function _f(){if(dropdownAnimatedHeight.value===0){(0,_reactNativeReanimated.runOnJS)(setShowDropdown)(false);}};_f._closure={dropdownAnimatedHeight:dropdownAnimatedHeight,runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{dropdownAnimatedHeight,runOnJS,setShowDropdown}=jsThis._closure;{if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}}}";_f.__workletHash=8540692570337;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (219:8)";return _f;}())};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease},runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing,runOnJS,setShowDropdown}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease},function(){if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}})};}}";_f.__workletHash=4835541372615;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (211:42)";return _f;}(),[]);var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");if(!showDropdown){setShowDropdown(true);}if(showDropdown){dropdownAnimatedHeight.value=0;}};var handleUnselection=function handleUnselection(item){var newValue=value.filter(function(selectedItem){return valueExtractor(selectedItem)!==valueExtractor(item);});onSelect(newValue);deletedValue(item);};var handleSelection=function handleSelection(item){onSelect([].concat((0,_toConsumableArray2.default)(value),[item]));selectedValue(item);};(0,_react.useEffect)(function(){if(showDropdown){dropdownAnimatedHeight.value=dropdownHeight;}},[showDropdown,dropdownHeight]);return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:260,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:261,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:270,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",flexDirection:"row",justifyContent:"space-between",alignItems:"center",p:multipleOptionsSelected?1:2,pr:2,maxHeight:120},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:274,columnNumber:9}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:13}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_reactNativeGestureHandler.ScrollView,{showsVerticalScrollIndicator:false,__self:_this,__source:{fileName:_jsxFileName,lineNumber:292,columnNumber:13}},_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",onStartShouldSetResponder:function onStartShouldSetResponder(){return true;},__self:_this,__source:{fileName:_jsxFileName,lineNumber:293,columnNumber:15}},value==null?void 0:value.map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(MultiSelectItem,{key:index,label:optionLabel,onUnselect:function onUnselect(){return handleUnselection(item);},multiSelectedItemContainerStyle:multiSelectedItemContainerStyle,multiSelectedItemLabelStyle:multiSelectedItemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:302,columnNumber:21}});}))),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:317,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:322,columnNumber:13}}))),showDropdown&&_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:331,columnNumber:9}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:332,columnNumber:11}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:333,columnNumber:13}}),isSearchable&&_react.default.createElement(_.Container,(0,_extends2.default)({p:1},searchInputContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:341,columnNumber:17}}),_react.default.createElement(_.Input,(0,_extends2.default)({placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",containerStyles:{height:searchInputHeight,justifyContent:"center"}},searchInputStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:342,columnNumber:19}}))),isOptionsEmpty&&_react.default.createElement(_.Container,(0,_extends2.default)({height:emptyOptionsPlaceholderHeight,justifyContent:"center",alignItems:"center"},emptyOptionsContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:356,columnNumber:17}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},emptyOptionsLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:362,columnNumber:19}}),emptyOptionsPlaceholder||"No Options")),isSearchedOptionsEmpty&&showCreateOption&&_react.default.createElement(_.Touchable,(0,_extends2.default)({height:emptySearchedOptionsHeight,justifyContent:"center",alignItems:"center",onPress:function onPress(){return onPressCreateOption(searchQuery);}},createSearchedOptionContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:374,columnNumber:17}}),showCreateOptionLoader?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:382,columnNumber:21}}):_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},createSearchedOptionLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:387,columnNumber:21}}),createOptionLabel||"Create "+searchQuery+" option")),_react.default.createElement(_.Container,{height:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:399,columnNumber:15}},_react.default.createElement(_.Input,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:400,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:402,columnNumber:15}},filteredOptions.map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,onPress:function onPress(){return handleSelection(item);},itemContainerStyle:itemContainerStyle,defaultDropdownItemHeight:defaultDropdownItemHeight,itemLabelStyle:itemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:406,columnNumber:21}});}))))));};exports.MultiSelect=MultiSelect;MultiSelect.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,emptyOptionsPlaceholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.oneOfType([_propTypes.default.string,_propTypes.default.array]),onSelect:_propTypes.default.func,selectedValue:_propTypes.default.func,deletedValue:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,showCreateOption:_propTypes.default.bool,showCreateOptionLoader:_propTypes.default.bool,createOptionLabel:_propTypes.default.string,onPressCreateOption:_propTypes.default.func,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemLabelStyle:_propTypes.default.object,searchInputContainerStyle:_propTypes.default.object,searchInputStyle:_propTypes.default.object,emptyOptionsContainerStyle:_propTypes.default.object,emptyOptionsLabelStyle:_propTypes.default.object,createSearchedOptionContainerStyle:_propTypes.default.object,createSearchedOptionLabelStyle:_propTypes.default.object};MultiSelect.defaultProps={label:null,placeholder:"Select Option",emptyOptionsPlaceholder:null,labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},selectedValue:function selectedValue(){},deletedValue:function deletedValue(){},isLoading:false,isSearchable:false,showCreateOption:false,showCreateOptionLoader:false,createOptionLabel:null,onPressCreateOption:function onPressCreateOption(){}};
|
package/lib/components/Select.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Select=void 0;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","labelExtractor","valueExtractor","onSelect","isLoading","isSearchable","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","selectedItemContainerStyle","selectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var DropdownItem=function DropdownItem(_ref){var label=_ref.label,isSelectedItem=_ref.isSelectedItem,defaultDropdownItemHeight=_ref.defaultDropdownItemHeight,onPress=_ref.onPress,itemContainerStyle=_ref.itemContainerStyle,selectedItemContainerStyle=_ref.selectedItemContainerStyle,itemTextStyle=_ref.itemTextStyle,selectedItemTextStyle=_ref.selectedItemTextStyle;return _react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:30,columnNumber:3}},_react.default.createElement(_.Container,(0,_extends2.default)({bg:isSelectedItem?"background.base":"background.white",height:defaultDropdownItemHeight,p:2},itemContainerStyle,isSelectedItem&&selectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:isSelectedItem?"font.white":"font.grey"},itemTextStyle,isSelectedItem&&selectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:38,columnNumber:7}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string.isRequired,isSelectedItem:_propTypes.default.bool,defaultDropdownItemHeight:_propTypes.default.number,onPress:_propTypes.default.func,itemContainerStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};var Select=function Select(_ref2){var options=_ref2.options,label=_ref2.label,value=_ref2.value,placeholder=_ref2.placeholder,labelExtractor=_ref2.labelExtractor,valueExtractor=_ref2.valueExtractor,onSelect=_ref2.onSelect,isLoading=_ref2.isLoading,isSearchable=_ref2.isSearchable,labelStyle=_ref2.labelStyle,containerStyle=_ref2.containerStyle,inputContainerStyle=_ref2.inputContainerStyle,dropdownContainerStyle=_ref2.dropdownContainerStyle,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle,selectedItemContainerStyle=_ref2.selectedItemContainerStyle,selectedItemTextStyle=_ref2.selectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*6;var selectedOptionLabel=labelExtractor(value||{});var selectedOptionValue=valueExtractor(value||{});var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease})};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease}};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease})};}}";_f.__workletHash=10836038512691;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (139:42)";_f.__optimalization=2;return _f;}());var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");setShowDropdown(!showDropdown);toggleAnimation();};var handleItemSelection=function handleItemSelection(item,index){setShowDropdown(false);toggleAnimation();onSelect(item,index);};return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:167,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:168,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:177,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",p:2,flexDirection:"row",justifyContent:"space-between",alignItems:"center"},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:181,columnNumber:9}}),_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:191,columnNumber:11}},selectedOptionLabel||placeholder),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:195,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:200,columnNumber:13}}))),_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:208,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:209,columnNumber:9}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:210,columnNumber:11}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:218,columnNumber:15}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:219,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:226,columnNumber:13}},options.filter(function(item,index){var label=labelExtractor(item,index);if((searchQuery==null?void 0:searchQuery.length)===0)return true;return formatStr(label).includes(formatStr(searchQuery));}).map(function(item,index){var optionLabel=labelExtractor(item,index);var optionValue=valueExtractor(item,index);var isSelectedItem=selectedOptionValue&&selectedOptionValue===optionValue;return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,isSelectedItem:isSelectedItem,defaultDropdownItemHeight:defaultDropdownItemHeight,onPress:function onPress(){return handleItemSelection(item,index);},itemContainerStyle:itemContainerStyle,selectedItemContainerStyle:selectedItemContainerStyle,itemTextStyle:itemTextStyle,selectedItemTextStyle:selectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:239,columnNumber:21}});}))))));};exports.Select=Select;Select.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.object,onSelect:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};Select.defaultProps={label:null,placeholder:"Select Option",labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},isLoading:false,isSearchable:false};
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Select=void 0;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","emptyOptionsPlaceholder","labelExtractor","valueExtractor","onSelect","isLoading","isSearchable","showCreateOption","showCreateOptionLoader","createOptionLabel","onPressCreateOption","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemLabelStyle","selectedItemContainerStyle","selectedItemLabelStyle","searchInputContainerStyle","searchInputStyle","emptyOptionsContainerStyle","emptyOptionsLabelStyle","createSearchedOptionContainerStyle","createSearchedOptionLabelStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var DropdownItem=function DropdownItem(_ref){var label=_ref.label,isSelectedItem=_ref.isSelectedItem,defaultDropdownItemHeight=_ref.defaultDropdownItemHeight,onPress=_ref.onPress,itemContainerStyle=_ref.itemContainerStyle,selectedItemContainerStyle=_ref.selectedItemContainerStyle,itemLabelStyle=_ref.itemLabelStyle,selectedItemLabelStyle=_ref.selectedItemLabelStyle;return _react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:3}},_react.default.createElement(_.Container,(0,_extends2.default)({bg:isSelectedItem?"background.base":"background.white",height:defaultDropdownItemHeight,p:2},itemContainerStyle,isSelectedItem&&selectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:32,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:isSelectedItem?"font.white":"font.grey"},itemLabelStyle,isSelectedItem&&selectedItemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:39,columnNumber:7}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string.isRequired,isSelectedItem:_propTypes.default.bool,defaultDropdownItemHeight:_propTypes.default.number,onPress:_propTypes.default.func,itemContainerStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object,selectedItemLabelStyle:_propTypes.default.object};var Select=function Select(_ref2){var options=_ref2.options,label=_ref2.label,value=_ref2.value,placeholder=_ref2.placeholder,emptyOptionsPlaceholder=_ref2.emptyOptionsPlaceholder,labelExtractor=_ref2.labelExtractor,valueExtractor=_ref2.valueExtractor,onSelect=_ref2.onSelect,isLoading=_ref2.isLoading,isSearchable=_ref2.isSearchable,showCreateOption=_ref2.showCreateOption,showCreateOptionLoader=_ref2.showCreateOptionLoader,createOptionLabel=_ref2.createOptionLabel,onPressCreateOption=_ref2.onPressCreateOption,labelStyle=_ref2.labelStyle,containerStyle=_ref2.containerStyle,inputContainerStyle=_ref2.inputContainerStyle,dropdownContainerStyle=_ref2.dropdownContainerStyle,itemContainerStyle=_ref2.itemContainerStyle,itemLabelStyle=_ref2.itemLabelStyle,selectedItemContainerStyle=_ref2.selectedItemContainerStyle,selectedItemLabelStyle=_ref2.selectedItemLabelStyle,searchInputContainerStyle=_ref2.searchInputContainerStyle,searchInputStyle=_ref2.searchInputStyle,emptyOptionsContainerStyle=_ref2.emptyOptionsContainerStyle,emptyOptionsLabelStyle=_ref2.emptyOptionsLabelStyle,createSearchedOptionContainerStyle=_ref2.createSearchedOptionContainerStyle,createSearchedOptionLabelStyle=_ref2.createSearchedOptionLabelStyle,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var filteredOptions=options.filter(function(item,index){var label=labelExtractor(item,index);if((searchQuery==null?void 0:searchQuery.length)===0)return true;return formatStr(label).includes(formatStr(searchQuery));});var isOptionsEmpty=!options||(options==null?void 0:options.length)===0;var isSearchedOptionsEmpty=searchQuery.length>0&&filteredOptions.length===0;var emptyOptionsPlaceholderHeight=40;var emptySearchedOptionsHeight=40;var searchInputHeight=35;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*Math.min(filteredOptions==null?void 0:filteredOptions.length,6)+(isSearchable?searchInputHeight+10:0)+(isOptionsEmpty?emptyOptionsPlaceholderHeight:0)+(isSearchedOptionsEmpty&&showCreateOption?emptySearchedOptionsHeight:0);var selectedOptionLabel=labelExtractor(value||{});var selectedOptionValue=valueExtractor(value||{});var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease},function(){var _f=function _f(){if(dropdownAnimatedHeight.value===0){(0,_reactNativeReanimated.runOnJS)(setShowDropdown)(false);}};_f._closure={dropdownAnimatedHeight:dropdownAnimatedHeight,runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{dropdownAnimatedHeight,runOnJS,setShowDropdown}=jsThis._closure;{if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}}}";_f.__workletHash=8540692570337;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (176:8)";return _f;}())};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease},runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing,runOnJS,setShowDropdown}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease},function(){if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}})};}}";_f.__workletHash=4835541372615;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (168:42)";return _f;}(),[]);var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");if(!showDropdown){setShowDropdown(true);}if(showDropdown){toggleAnimation();}};var handleItemSelection=function handleItemSelection(item,index){toggleAnimation();onSelect(item,index);};(0,_react.useEffect)(function(){if(showDropdown){dropdownAnimatedHeight.value=dropdownHeight;}},[showDropdown,dropdownHeight]);return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:214,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:215,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:224,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",p:2,flexDirection:"row",justifyContent:"space-between",alignItems:"center"},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:228,columnNumber:9}}),_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:238,columnNumber:11}},selectedOptionLabel||placeholder),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:242,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:247,columnNumber:13}}))),showDropdown&&_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:256,columnNumber:9}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:257,columnNumber:11}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:258,columnNumber:13}}),isSearchable&&_react.default.createElement(_.Container,(0,_extends2.default)({p:1},searchInputContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:266,columnNumber:17}}),_react.default.createElement(_.Input,(0,_extends2.default)({placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",containerStyles:{height:searchInputHeight,justifyContent:"center"}},searchInputStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:267,columnNumber:19}}))),isOptionsEmpty&&_react.default.createElement(_.Container,(0,_extends2.default)({height:emptyOptionsPlaceholderHeight,justifyContent:"center",alignItems:"center"},emptyOptionsContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:281,columnNumber:17}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},emptyOptionsLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:19}}),emptyOptionsPlaceholder||"No Options")),isSearchedOptionsEmpty&&showCreateOption&&_react.default.createElement(_.Touchable,(0,_extends2.default)({height:emptySearchedOptionsHeight,justifyContent:"center",alignItems:"center",onPress:function onPress(){return onPressCreateOption(searchQuery);}},createSearchedOptionContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:298,columnNumber:17}}),showCreateOptionLoader?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:306,columnNumber:21}}):_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},createSearchedOptionLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:311,columnNumber:21}}),createOptionLabel||"Create "+searchQuery+" option")),_react.default.createElement(_.Container,{height:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:323,columnNumber:15}},_react.default.createElement(_.Input,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:324,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:326,columnNumber:15}},filteredOptions.map(function(item,index){var optionLabel=labelExtractor(item,index);var optionValue=valueExtractor(item,index);var isSelectedItem=selectedOptionValue&&selectedOptionValue===optionValue;return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,isSelectedItem:isSelectedItem,defaultDropdownItemHeight:defaultDropdownItemHeight,onPress:function onPress(){return handleItemSelection(item,index);},itemContainerStyle:itemContainerStyle,selectedItemContainerStyle:selectedItemContainerStyle,itemLabelStyle:itemLabelStyle,selectedItemLabelStyle:selectedItemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:333,columnNumber:21}});}))))));};exports.Select=Select;Select.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,emptyOptionsPlaceholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.object,onSelect:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,showCreateOption:_propTypes.default.bool,showCreateOptionLoader:_propTypes.default.bool,createOptionLabel:_propTypes.default.string,onPressCreateOption:_propTypes.default.func,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,selectedItemLabelStyle:_propTypes.default.object,searchInputContainerStyle:_propTypes.default.object,searchInputStyle:_propTypes.default.object,emptyOptionsContainerStyle:_propTypes.default.object,emptyOptionsLabelStyle:_propTypes.default.object,createSearchedOptionContainerStyle:_propTypes.default.object,createSearchedOptionLabelStyle:_propTypes.default.object};Select.defaultProps={label:null,placeholder:"Select Option",emptyOptionsPlaceholder:null,labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},isLoading:false,isSearchable:false,showCreateOption:false,showCreateOptionLoader:false,createOptionLabel:null,onPressCreateOption:function onPressCreateOption(){}};
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useContext } from "react";
|
|
1
|
+
import React, { useState, useContext, useEffect } from "react";
|
|
2
2
|
import Icon from "react-native-remix-icon";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import Animated, {
|
|
@@ -6,6 +6,7 @@ import Animated, {
|
|
|
6
6
|
useAnimatedStyle,
|
|
7
7
|
withTiming,
|
|
8
8
|
Easing,
|
|
9
|
+
runOnJS,
|
|
9
10
|
} from "react-native-reanimated";
|
|
10
11
|
import {
|
|
11
12
|
ActivityIndicator,
|
|
@@ -21,7 +22,7 @@ const MultiSelectItem = ({
|
|
|
21
22
|
label,
|
|
22
23
|
onUnselect,
|
|
23
24
|
multiSelectedItemContainerStyle,
|
|
24
|
-
|
|
25
|
+
multiSelectedItemLabelStyle,
|
|
25
26
|
}) => (
|
|
26
27
|
<Container
|
|
27
28
|
borderWidth={1}
|
|
@@ -40,7 +41,7 @@ const MultiSelectItem = ({
|
|
|
40
41
|
fontSize="s"
|
|
41
42
|
mr={2}
|
|
42
43
|
maxWidth="90%"
|
|
43
|
-
{...
|
|
44
|
+
{...multiSelectedItemLabelStyle}
|
|
44
45
|
>
|
|
45
46
|
{label}
|
|
46
47
|
</Typography>
|
|
@@ -54,7 +55,7 @@ MultiSelectItem.propTypes = {
|
|
|
54
55
|
label: PropTypes.string,
|
|
55
56
|
onUnselect: PropTypes.func,
|
|
56
57
|
multiSelectedItemContainerStyle: PropTypes.object,
|
|
57
|
-
|
|
58
|
+
multiSelectedItemLabelStyle: PropTypes.object,
|
|
58
59
|
};
|
|
59
60
|
|
|
60
61
|
const DropdownItem = ({
|
|
@@ -62,7 +63,7 @@ const DropdownItem = ({
|
|
|
62
63
|
onPress,
|
|
63
64
|
defaultDropdownItemHeight,
|
|
64
65
|
itemContainerStyle,
|
|
65
|
-
|
|
66
|
+
itemLabelStyle,
|
|
66
67
|
}) => {
|
|
67
68
|
return (
|
|
68
69
|
<Touchable bg="background.white" onPress={onPress}>
|
|
@@ -75,7 +76,7 @@ const DropdownItem = ({
|
|
|
75
76
|
fontFamily="inter400"
|
|
76
77
|
fontSize="s"
|
|
77
78
|
color="font.grey"
|
|
78
|
-
{...
|
|
79
|
+
{...itemLabelStyle}
|
|
79
80
|
>
|
|
80
81
|
{label}
|
|
81
82
|
</Typography>
|
|
@@ -89,7 +90,7 @@ DropdownItem.propTypes = {
|
|
|
89
90
|
onPress: PropTypes.func,
|
|
90
91
|
defaultDropdownItemHeight: PropTypes.number,
|
|
91
92
|
itemContainerStyle: PropTypes.object,
|
|
92
|
-
|
|
93
|
+
itemLabelStyle: PropTypes.object,
|
|
93
94
|
};
|
|
94
95
|
|
|
95
96
|
/**
|
|
@@ -139,6 +140,7 @@ export const MultiSelect = ({
|
|
|
139
140
|
label,
|
|
140
141
|
value,
|
|
141
142
|
placeholder,
|
|
143
|
+
emptyOptionsPlaceholder,
|
|
142
144
|
labelExtractor,
|
|
143
145
|
valueExtractor,
|
|
144
146
|
onSelect,
|
|
@@ -146,14 +148,24 @@ export const MultiSelect = ({
|
|
|
146
148
|
deletedValue,
|
|
147
149
|
isLoading,
|
|
148
150
|
isSearchable,
|
|
151
|
+
showCreateOption,
|
|
152
|
+
showCreateOptionLoader,
|
|
153
|
+
createOptionLabel,
|
|
154
|
+
onPressCreateOption,
|
|
149
155
|
labelStyle,
|
|
150
156
|
containerStyle,
|
|
151
157
|
inputContainerStyle,
|
|
152
158
|
dropdownContainerStyle,
|
|
153
159
|
itemContainerStyle,
|
|
154
|
-
|
|
160
|
+
itemLabelStyle,
|
|
155
161
|
multiSelectedItemContainerStyle,
|
|
156
|
-
|
|
162
|
+
multiSelectedItemLabelStyle,
|
|
163
|
+
searchInputContainerStyle,
|
|
164
|
+
searchInputStyle,
|
|
165
|
+
emptyOptionsContainerStyle,
|
|
166
|
+
emptyOptionsLabelStyle,
|
|
167
|
+
createSearchedOptionContainerStyle,
|
|
168
|
+
createSearchedOptionLabelStyle,
|
|
157
169
|
...rest
|
|
158
170
|
}) => {
|
|
159
171
|
const theme = useContext(ThemeContext);
|
|
@@ -161,33 +173,67 @@ export const MultiSelect = ({
|
|
|
161
173
|
const [searchQuery, setSearchQuery] = useState("");
|
|
162
174
|
const dropdownAnimatedHeight = useSharedValue(0);
|
|
163
175
|
|
|
176
|
+
const formatStr = str => str?.toLowerCase()?.trim();
|
|
177
|
+
const filteredOptions = options
|
|
178
|
+
.filter((item, index) => {
|
|
179
|
+
const optionValue = valueExtractor(item, index);
|
|
180
|
+
const isItemAlreadySelected = Boolean(
|
|
181
|
+
value?.find(
|
|
182
|
+
selectedItem => valueExtractor(selectedItem) === optionValue
|
|
183
|
+
)
|
|
184
|
+
);
|
|
185
|
+
return !isItemAlreadySelected;
|
|
186
|
+
})
|
|
187
|
+
.filter((item, index) => {
|
|
188
|
+
const optionLabel = labelExtractor(item, index);
|
|
189
|
+
if (searchQuery.length === 0) return true;
|
|
190
|
+
return formatStr(optionLabel).includes(formatStr(searchQuery));
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const isOptionsEmpty = !options || options?.length === 0;
|
|
194
|
+
const isSearchedOptionsEmpty =
|
|
195
|
+
searchQuery.length > 0 && filteredOptions.length === 0;
|
|
196
|
+
const emptyOptionsPlaceholderHeight = 40;
|
|
197
|
+
const emptySearchedOptionsHeight = 40;
|
|
198
|
+
const searchInputHeight = 35;
|
|
164
199
|
const multipleOptionsSelected = value?.length > 0;
|
|
165
200
|
const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
|
|
166
201
|
const dropdownHeight =
|
|
167
202
|
dropdownContainerStyle?.height ||
|
|
168
203
|
dropdownContainerStyle?.maxHeight ||
|
|
169
|
-
defaultDropdownItemHeight * 6
|
|
170
|
-
|
|
204
|
+
defaultDropdownItemHeight * Math.min(filteredOptions?.length, 6) +
|
|
205
|
+
(isSearchable ? searchInputHeight + 10 : 0) +
|
|
206
|
+
(isOptionsEmpty ? emptyOptionsPlaceholderHeight : 0) +
|
|
207
|
+
(isSearchedOptionsEmpty && showCreateOption
|
|
208
|
+
? emptySearchedOptionsHeight
|
|
209
|
+
: 0);
|
|
171
210
|
|
|
172
211
|
const animatedStyles = useAnimatedStyle(() => {
|
|
173
212
|
return {
|
|
174
|
-
height: withTiming(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
213
|
+
height: withTiming(
|
|
214
|
+
dropdownAnimatedHeight.value,
|
|
215
|
+
{
|
|
216
|
+
duration: 100,
|
|
217
|
+
easing: Easing.ease,
|
|
218
|
+
},
|
|
219
|
+
() => {
|
|
220
|
+
if (dropdownAnimatedHeight.value === 0) {
|
|
221
|
+
runOnJS(setShowDropdown)(false);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
),
|
|
178
225
|
};
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const toggleAnimation = () => {
|
|
182
|
-
dropdownAnimatedHeight.value =
|
|
183
|
-
dropdownAnimatedHeight.value === 0 ? dropdownHeight : 0;
|
|
184
|
-
};
|
|
226
|
+
}, []);
|
|
185
227
|
|
|
186
228
|
const handleOpenDropdown = () => {
|
|
187
229
|
Keyboard.dismiss();
|
|
188
230
|
setSearchQuery("");
|
|
189
|
-
|
|
190
|
-
|
|
231
|
+
if (!showDropdown) {
|
|
232
|
+
setShowDropdown(true);
|
|
233
|
+
}
|
|
234
|
+
if (showDropdown) {
|
|
235
|
+
dropdownAnimatedHeight.value = 0;
|
|
236
|
+
}
|
|
191
237
|
};
|
|
192
238
|
|
|
193
239
|
const handleUnselection = item => {
|
|
@@ -203,6 +249,13 @@ export const MultiSelect = ({
|
|
|
203
249
|
selectedValue(item);
|
|
204
250
|
};
|
|
205
251
|
|
|
252
|
+
useEffect(() => {
|
|
253
|
+
if (showDropdown) {
|
|
254
|
+
dropdownAnimatedHeight.value = dropdownHeight;
|
|
255
|
+
}
|
|
256
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
257
|
+
}, [showDropdown, dropdownHeight]);
|
|
258
|
+
|
|
206
259
|
return (
|
|
207
260
|
<Container {...containerStyle}>
|
|
208
261
|
<Typography
|
|
@@ -253,7 +306,7 @@ export const MultiSelect = ({
|
|
|
253
306
|
multiSelectedItemContainerStyle={
|
|
254
307
|
multiSelectedItemContainerStyle
|
|
255
308
|
}
|
|
256
|
-
|
|
309
|
+
multiSelectedItemLabelStyle={multiSelectedItemLabelStyle}
|
|
257
310
|
/>
|
|
258
311
|
);
|
|
259
312
|
})}
|
|
@@ -274,44 +327,80 @@ export const MultiSelect = ({
|
|
|
274
327
|
)}
|
|
275
328
|
</Container>
|
|
276
329
|
</TouchableWithoutFeedback>
|
|
277
|
-
|
|
278
|
-
<
|
|
279
|
-
<
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
<
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
330
|
+
{showDropdown && (
|
|
331
|
+
<Container overflow="hidden">
|
|
332
|
+
<Animated.View style={animatedStyles}>
|
|
333
|
+
<Card
|
|
334
|
+
bg="background.white"
|
|
335
|
+
borderWidth={1}
|
|
336
|
+
borderColor="border.grey400"
|
|
337
|
+
maxHeight={dropdownHeight}
|
|
338
|
+
{...dropdownContainerStyle}
|
|
339
|
+
>
|
|
340
|
+
{isSearchable && (
|
|
341
|
+
<Container p={1} {...searchInputContainerStyle}>
|
|
342
|
+
<Input
|
|
343
|
+
placeholder="Search"
|
|
344
|
+
onChangeText={setSearchQuery}
|
|
345
|
+
fontSize="s"
|
|
346
|
+
// eslint-disable-next-line react-native/no-inline-styles
|
|
347
|
+
containerStyles={{
|
|
348
|
+
height: searchInputHeight,
|
|
349
|
+
justifyContent: "center",
|
|
350
|
+
}}
|
|
351
|
+
{...searchInputStyle}
|
|
352
|
+
/>
|
|
353
|
+
</Container>
|
|
354
|
+
)}
|
|
355
|
+
{isOptionsEmpty && (
|
|
356
|
+
<Container
|
|
357
|
+
height={emptyOptionsPlaceholderHeight}
|
|
358
|
+
justifyContent="center"
|
|
359
|
+
alignItems="center"
|
|
360
|
+
{...emptyOptionsContainerStyle}
|
|
361
|
+
>
|
|
362
|
+
<Typography
|
|
363
|
+
fontFamily="inter400"
|
|
364
|
+
fontSize="s"
|
|
365
|
+
color="font.grey"
|
|
366
|
+
{...emptyOptionsLabelStyle}
|
|
367
|
+
>
|
|
368
|
+
{emptyOptionsPlaceholder || "No Options"}
|
|
369
|
+
</Typography>
|
|
370
|
+
</Container>
|
|
371
|
+
)}
|
|
372
|
+
|
|
373
|
+
{isSearchedOptionsEmpty && showCreateOption && (
|
|
374
|
+
<Touchable
|
|
375
|
+
height={emptySearchedOptionsHeight}
|
|
376
|
+
justifyContent="center"
|
|
377
|
+
alignItems="center"
|
|
378
|
+
onPress={() => onPressCreateOption(searchQuery)}
|
|
379
|
+
{...createSearchedOptionContainerStyle}
|
|
380
|
+
>
|
|
381
|
+
{showCreateOptionLoader ? (
|
|
382
|
+
<ActivityIndicator
|
|
383
|
+
size="small"
|
|
384
|
+
color={theme.colors.background.base}
|
|
385
|
+
/>
|
|
386
|
+
) : (
|
|
387
|
+
<Typography
|
|
388
|
+
fontFamily="inter400"
|
|
389
|
+
fontSize="s"
|
|
390
|
+
color="font.grey"
|
|
391
|
+
{...createSearchedOptionLabelStyle}
|
|
392
|
+
>
|
|
393
|
+
{createOptionLabel || `Create ${searchQuery} option`}
|
|
394
|
+
</Typography>
|
|
395
|
+
)}
|
|
396
|
+
</Touchable>
|
|
397
|
+
)}
|
|
398
|
+
{/* Animation not working without this hidden input */}
|
|
399
|
+
<Container height={0}>
|
|
400
|
+
<Input />
|
|
293
401
|
</Container>
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
{options
|
|
297
|
-
.filter((item, index) => {
|
|
298
|
-
const optionValue = valueExtractor(item, index);
|
|
299
|
-
const isItemAlreadySelected = Boolean(
|
|
300
|
-
value?.find(
|
|
301
|
-
selectedItem =>
|
|
302
|
-
valueExtractor(selectedItem) === optionValue
|
|
303
|
-
)
|
|
304
|
-
);
|
|
305
|
-
return !isItemAlreadySelected;
|
|
306
|
-
})
|
|
307
|
-
.filter((item, index) => {
|
|
308
|
-
const optionLabel = labelExtractor(item, index);
|
|
309
|
-
if (searchQuery.length === 0) return true;
|
|
310
|
-
return formatStr(optionLabel).includes(
|
|
311
|
-
formatStr(searchQuery)
|
|
312
|
-
);
|
|
313
|
-
})
|
|
314
|
-
.map((item, index) => {
|
|
402
|
+
<ScrollView>
|
|
403
|
+
{filteredOptions.map((item, index) => {
|
|
315
404
|
const optionLabel = labelExtractor(item, index);
|
|
316
405
|
return (
|
|
317
406
|
<DropdownItem
|
|
@@ -320,14 +409,15 @@ export const MultiSelect = ({
|
|
|
320
409
|
onPress={() => handleSelection(item)}
|
|
321
410
|
itemContainerStyle={itemContainerStyle}
|
|
322
411
|
defaultDropdownItemHeight={defaultDropdownItemHeight}
|
|
323
|
-
|
|
412
|
+
itemLabelStyle={itemLabelStyle}
|
|
324
413
|
/>
|
|
325
414
|
);
|
|
326
415
|
})}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
416
|
+
</ScrollView>
|
|
417
|
+
</Card>
|
|
418
|
+
</Animated.View>
|
|
419
|
+
</Container>
|
|
420
|
+
)}
|
|
331
421
|
</Container>
|
|
332
422
|
);
|
|
333
423
|
};
|
|
@@ -350,6 +440,10 @@ MultiSelect.propTypes = {
|
|
|
350
440
|
* The text to be displayed if no option is selected.
|
|
351
441
|
*/
|
|
352
442
|
placeholder: PropTypes.string,
|
|
443
|
+
/**
|
|
444
|
+
* The text to be displayed if no options are provided.
|
|
445
|
+
*/
|
|
446
|
+
emptyOptionsPlaceholder: PropTypes.string,
|
|
353
447
|
/**
|
|
354
448
|
* Use custom key as label.
|
|
355
449
|
*/
|
|
@@ -382,6 +476,22 @@ MultiSelect.propTypes = {
|
|
|
382
476
|
* Toggle Search bar within the options dropdown to search through the options.
|
|
383
477
|
*/
|
|
384
478
|
isSearchable: PropTypes.bool,
|
|
479
|
+
/**
|
|
480
|
+
* Show option to create the searched label if not present in the options list
|
|
481
|
+
*/
|
|
482
|
+
showCreateOption: PropTypes.bool,
|
|
483
|
+
/**
|
|
484
|
+
* Show loader while creating a searched option not present in the options list
|
|
485
|
+
*/
|
|
486
|
+
showCreateOptionLoader: PropTypes.bool,
|
|
487
|
+
/**
|
|
488
|
+
* Custom label for creating searched option not present in the options list
|
|
489
|
+
*/
|
|
490
|
+
createOptionLabel: PropTypes.string,
|
|
491
|
+
/**
|
|
492
|
+
* Callback when create searched option is pressed
|
|
493
|
+
*/
|
|
494
|
+
onPressCreateOption: PropTypes.func,
|
|
385
495
|
/**
|
|
386
496
|
* To customise floating label styles.
|
|
387
497
|
*/
|
|
@@ -405,7 +515,7 @@ MultiSelect.propTypes = {
|
|
|
405
515
|
/**
|
|
406
516
|
* To customise dropdown item text styles.
|
|
407
517
|
*/
|
|
408
|
-
|
|
518
|
+
itemLabelStyle: PropTypes.object,
|
|
409
519
|
/**
|
|
410
520
|
* To customise item container styles for multi selected items.
|
|
411
521
|
*/
|
|
@@ -413,12 +523,37 @@ MultiSelect.propTypes = {
|
|
|
413
523
|
/**
|
|
414
524
|
* To customise item text styles for multi selected item.
|
|
415
525
|
*/
|
|
416
|
-
|
|
526
|
+
multiSelectedItemLabelStyle: PropTypes.object,
|
|
527
|
+
/**
|
|
528
|
+
* To customise search input containerr style.
|
|
529
|
+
*/
|
|
530
|
+
searchInputContainerStyle: PropTypes.object,
|
|
531
|
+
/**
|
|
532
|
+
* To customise search input style.
|
|
533
|
+
*/
|
|
534
|
+
searchInputStyle: PropTypes.object,
|
|
535
|
+
/**
|
|
536
|
+
* To customise empty options placeholder container style.
|
|
537
|
+
*/
|
|
538
|
+
emptyOptionsContainerStyle: PropTypes.object,
|
|
539
|
+
/**
|
|
540
|
+
* To customise empty options placeholder text style.
|
|
541
|
+
*/
|
|
542
|
+
emptyOptionsLabelStyle: PropTypes.object,
|
|
543
|
+
/**
|
|
544
|
+
* To customise empty options placeholder container style.
|
|
545
|
+
*/
|
|
546
|
+
createSearchedOptionContainerStyle: PropTypes.object,
|
|
547
|
+
/**
|
|
548
|
+
* To customise empty options placeholder text style.
|
|
549
|
+
*/
|
|
550
|
+
createSearchedOptionLabelStyle: PropTypes.object,
|
|
417
551
|
};
|
|
418
552
|
|
|
419
553
|
MultiSelect.defaultProps = {
|
|
420
554
|
label: null,
|
|
421
555
|
placeholder: "Select Option",
|
|
556
|
+
emptyOptionsPlaceholder: null,
|
|
422
557
|
labelExtractor: option => option?.label,
|
|
423
558
|
valueExtractor: option => option?.value,
|
|
424
559
|
value: null,
|
|
@@ -427,4 +562,8 @@ MultiSelect.defaultProps = {
|
|
|
427
562
|
deletedValue: () => {},
|
|
428
563
|
isLoading: false,
|
|
429
564
|
isSearchable: false,
|
|
565
|
+
showCreateOption: false,
|
|
566
|
+
showCreateOptionLoader: false,
|
|
567
|
+
createOptionLabel: null,
|
|
568
|
+
onPressCreateOption: () => {},
|
|
430
569
|
};
|
package/src/components/Select.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useContext } from "react";
|
|
1
|
+
import React, { useState, useContext, useEffect } from "react";
|
|
2
2
|
import Icon from "react-native-remix-icon";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import Animated, {
|
|
@@ -6,6 +6,7 @@ import Animated, {
|
|
|
6
6
|
useAnimatedStyle,
|
|
7
7
|
withTiming,
|
|
8
8
|
Easing,
|
|
9
|
+
runOnJS,
|
|
9
10
|
} from "react-native-reanimated";
|
|
10
11
|
import {
|
|
11
12
|
ActivityIndicator,
|
|
@@ -15,7 +16,7 @@ import {
|
|
|
15
16
|
import { ThemeContext } from "styled-components/native";
|
|
16
17
|
import { ScrollView } from "react-native-gesture-handler";
|
|
17
18
|
|
|
18
|
-
import { Card, Container, Input, Typography } from "@components";
|
|
19
|
+
import { Card, Container, Input, Touchable, Typography } from "@components";
|
|
19
20
|
|
|
20
21
|
const DropdownItem = ({
|
|
21
22
|
label,
|
|
@@ -24,8 +25,8 @@ const DropdownItem = ({
|
|
|
24
25
|
onPress,
|
|
25
26
|
itemContainerStyle,
|
|
26
27
|
selectedItemContainerStyle,
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
itemLabelStyle,
|
|
29
|
+
selectedItemLabelStyle,
|
|
29
30
|
}) => (
|
|
30
31
|
<TouchableWithoutFeedback onPress={onPress}>
|
|
31
32
|
<Container
|
|
@@ -39,8 +40,8 @@ const DropdownItem = ({
|
|
|
39
40
|
fontFamily="inter400"
|
|
40
41
|
fontSize="s"
|
|
41
42
|
color={isSelectedItem ? "font.white" : "font.grey"}
|
|
42
|
-
{...
|
|
43
|
-
{...(isSelectedItem &&
|
|
43
|
+
{...itemLabelStyle}
|
|
44
|
+
{...(isSelectedItem && selectedItemLabelStyle)}
|
|
44
45
|
>
|
|
45
46
|
{label}
|
|
46
47
|
</Typography>
|
|
@@ -55,8 +56,8 @@ DropdownItem.propTypes = {
|
|
|
55
56
|
onPress: PropTypes.func,
|
|
56
57
|
itemContainerStyle: PropTypes.object,
|
|
57
58
|
selectedItemContainerStyle: PropTypes.object,
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
itemLabelStyle: PropTypes.object,
|
|
60
|
+
selectedItemLabelStyle: PropTypes.object,
|
|
60
61
|
};
|
|
61
62
|
|
|
62
63
|
/**
|
|
@@ -107,19 +108,30 @@ export const Select = ({
|
|
|
107
108
|
label,
|
|
108
109
|
value,
|
|
109
110
|
placeholder,
|
|
111
|
+
emptyOptionsPlaceholder,
|
|
110
112
|
labelExtractor,
|
|
111
113
|
valueExtractor,
|
|
112
114
|
onSelect,
|
|
113
115
|
isLoading,
|
|
114
116
|
isSearchable,
|
|
117
|
+
showCreateOption,
|
|
118
|
+
showCreateOptionLoader,
|
|
119
|
+
createOptionLabel,
|
|
120
|
+
onPressCreateOption,
|
|
115
121
|
labelStyle,
|
|
116
122
|
containerStyle,
|
|
117
123
|
inputContainerStyle,
|
|
118
124
|
dropdownContainerStyle,
|
|
119
125
|
itemContainerStyle,
|
|
120
|
-
|
|
126
|
+
itemLabelStyle,
|
|
121
127
|
selectedItemContainerStyle,
|
|
122
|
-
|
|
128
|
+
selectedItemLabelStyle,
|
|
129
|
+
searchInputContainerStyle,
|
|
130
|
+
searchInputStyle,
|
|
131
|
+
emptyOptionsContainerStyle,
|
|
132
|
+
emptyOptionsLabelStyle,
|
|
133
|
+
createSearchedOptionContainerStyle,
|
|
134
|
+
createSearchedOptionLabelStyle,
|
|
123
135
|
...rest
|
|
124
136
|
}) => {
|
|
125
137
|
const theme = useContext(ThemeContext);
|
|
@@ -127,23 +139,48 @@ export const Select = ({
|
|
|
127
139
|
const [searchQuery, setSearchQuery] = useState("");
|
|
128
140
|
const dropdownAnimatedHeight = useSharedValue(0);
|
|
129
141
|
|
|
142
|
+
const formatStr = str => str?.toLowerCase()?.trim();
|
|
143
|
+
const filteredOptions = options.filter((item, index) => {
|
|
144
|
+
const label = labelExtractor(item, index);
|
|
145
|
+
if (searchQuery?.length === 0) return true;
|
|
146
|
+
return formatStr(label).includes(formatStr(searchQuery));
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const isOptionsEmpty = !options || options?.length === 0;
|
|
150
|
+
const isSearchedOptionsEmpty =
|
|
151
|
+
searchQuery.length > 0 && filteredOptions.length === 0;
|
|
152
|
+
const emptyOptionsPlaceholderHeight = 40;
|
|
153
|
+
const emptySearchedOptionsHeight = 40;
|
|
154
|
+
const searchInputHeight = 35;
|
|
130
155
|
const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
|
|
131
156
|
const dropdownHeight =
|
|
132
157
|
dropdownContainerStyle?.height ||
|
|
133
158
|
dropdownContainerStyle?.maxHeight ||
|
|
134
|
-
defaultDropdownItemHeight * 6
|
|
159
|
+
defaultDropdownItemHeight * Math.min(filteredOptions?.length, 6) +
|
|
160
|
+
(isSearchable ? searchInputHeight + 10 : 0) +
|
|
161
|
+
(isOptionsEmpty ? emptyOptionsPlaceholderHeight : 0) +
|
|
162
|
+
(isSearchedOptionsEmpty && showCreateOption
|
|
163
|
+
? emptySearchedOptionsHeight
|
|
164
|
+
: 0);
|
|
135
165
|
const selectedOptionLabel = labelExtractor(value || {});
|
|
136
166
|
const selectedOptionValue = valueExtractor(value || {});
|
|
137
|
-
const formatStr = str => str?.toLowerCase()?.trim();
|
|
138
167
|
|
|
139
168
|
const animatedStyles = useAnimatedStyle(() => {
|
|
140
169
|
return {
|
|
141
|
-
height: withTiming(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
170
|
+
height: withTiming(
|
|
171
|
+
dropdownAnimatedHeight.value,
|
|
172
|
+
{
|
|
173
|
+
duration: 100,
|
|
174
|
+
easing: Easing.ease,
|
|
175
|
+
},
|
|
176
|
+
() => {
|
|
177
|
+
if (dropdownAnimatedHeight.value === 0) {
|
|
178
|
+
runOnJS(setShowDropdown)(false);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
),
|
|
145
182
|
};
|
|
146
|
-
});
|
|
183
|
+
}, []);
|
|
147
184
|
|
|
148
185
|
const toggleAnimation = () => {
|
|
149
186
|
dropdownAnimatedHeight.value =
|
|
@@ -153,16 +190,26 @@ export const Select = ({
|
|
|
153
190
|
const handleOpenDropdown = () => {
|
|
154
191
|
Keyboard.dismiss();
|
|
155
192
|
setSearchQuery("");
|
|
156
|
-
|
|
157
|
-
|
|
193
|
+
if (!showDropdown) {
|
|
194
|
+
setShowDropdown(true);
|
|
195
|
+
}
|
|
196
|
+
if (showDropdown) {
|
|
197
|
+
toggleAnimation();
|
|
198
|
+
}
|
|
158
199
|
};
|
|
159
200
|
|
|
160
201
|
const handleItemSelection = (item, index) => {
|
|
161
|
-
setShowDropdown(false);
|
|
162
202
|
toggleAnimation();
|
|
163
203
|
onSelect(item, index);
|
|
164
204
|
};
|
|
165
205
|
|
|
206
|
+
useEffect(() => {
|
|
207
|
+
if (showDropdown) {
|
|
208
|
+
dropdownAnimatedHeight.value = dropdownHeight;
|
|
209
|
+
}
|
|
210
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
211
|
+
}, [showDropdown, dropdownHeight]);
|
|
212
|
+
|
|
166
213
|
return (
|
|
167
214
|
<Container {...containerStyle}>
|
|
168
215
|
<Typography
|
|
@@ -205,32 +252,79 @@ export const Select = ({
|
|
|
205
252
|
)}
|
|
206
253
|
</Container>
|
|
207
254
|
</TouchableWithoutFeedback>
|
|
208
|
-
|
|
209
|
-
<
|
|
210
|
-
<
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
<
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
255
|
+
{showDropdown && (
|
|
256
|
+
<Container overflow="hidden">
|
|
257
|
+
<Animated.View style={animatedStyles}>
|
|
258
|
+
<Card
|
|
259
|
+
bg="background.white"
|
|
260
|
+
borderWidth={1}
|
|
261
|
+
borderColor="border.grey400"
|
|
262
|
+
maxHeight={dropdownHeight}
|
|
263
|
+
{...dropdownContainerStyle}
|
|
264
|
+
>
|
|
265
|
+
{isSearchable && (
|
|
266
|
+
<Container p={1} {...searchInputContainerStyle}>
|
|
267
|
+
<Input
|
|
268
|
+
placeholder="Search"
|
|
269
|
+
onChangeText={setSearchQuery}
|
|
270
|
+
fontSize="s"
|
|
271
|
+
// eslint-disable-next-line react-native/no-inline-styles
|
|
272
|
+
containerStyles={{
|
|
273
|
+
height: searchInputHeight,
|
|
274
|
+
justifyContent: "center",
|
|
275
|
+
}}
|
|
276
|
+
{...searchInputStyle}
|
|
277
|
+
/>
|
|
278
|
+
</Container>
|
|
279
|
+
)}
|
|
280
|
+
{isOptionsEmpty && (
|
|
281
|
+
<Container
|
|
282
|
+
height={emptyOptionsPlaceholderHeight}
|
|
283
|
+
justifyContent="center"
|
|
284
|
+
alignItems="center"
|
|
285
|
+
{...emptyOptionsContainerStyle}
|
|
286
|
+
>
|
|
287
|
+
<Typography
|
|
288
|
+
fontFamily="inter400"
|
|
289
|
+
fontSize="s"
|
|
290
|
+
color="font.grey"
|
|
291
|
+
{...emptyOptionsLabelStyle}
|
|
292
|
+
>
|
|
293
|
+
{emptyOptionsPlaceholder || "No Options"}
|
|
294
|
+
</Typography>
|
|
295
|
+
</Container>
|
|
296
|
+
)}
|
|
297
|
+
{isSearchedOptionsEmpty && showCreateOption && (
|
|
298
|
+
<Touchable
|
|
299
|
+
height={emptySearchedOptionsHeight}
|
|
300
|
+
justifyContent="center"
|
|
301
|
+
alignItems="center"
|
|
302
|
+
onPress={() => onPressCreateOption(searchQuery)}
|
|
303
|
+
{...createSearchedOptionContainerStyle}
|
|
304
|
+
>
|
|
305
|
+
{showCreateOptionLoader ? (
|
|
306
|
+
<ActivityIndicator
|
|
307
|
+
size="small"
|
|
308
|
+
color={theme.colors.background.base}
|
|
309
|
+
/>
|
|
310
|
+
) : (
|
|
311
|
+
<Typography
|
|
312
|
+
fontFamily="inter400"
|
|
313
|
+
fontSize="s"
|
|
314
|
+
color="font.grey"
|
|
315
|
+
{...createSearchedOptionLabelStyle}
|
|
316
|
+
>
|
|
317
|
+
{createOptionLabel || `Create ${searchQuery} option`}
|
|
318
|
+
</Typography>
|
|
319
|
+
)}
|
|
320
|
+
</Touchable>
|
|
321
|
+
)}
|
|
322
|
+
{/* Animation not working without this hidden input */}
|
|
323
|
+
<Container height={0}>
|
|
324
|
+
<Input />
|
|
224
325
|
</Container>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
{options
|
|
228
|
-
.filter((item, index) => {
|
|
229
|
-
const label = labelExtractor(item, index);
|
|
230
|
-
if (searchQuery?.length === 0) return true;
|
|
231
|
-
return formatStr(label).includes(formatStr(searchQuery));
|
|
232
|
-
})
|
|
233
|
-
.map((item, index) => {
|
|
326
|
+
<ScrollView>
|
|
327
|
+
{filteredOptions.map((item, index) => {
|
|
234
328
|
const optionLabel = labelExtractor(item, index);
|
|
235
329
|
const optionValue = valueExtractor(item, index);
|
|
236
330
|
const isSelectedItem =
|
|
@@ -244,15 +338,16 @@ export const Select = ({
|
|
|
244
338
|
onPress={() => handleItemSelection(item, index)}
|
|
245
339
|
itemContainerStyle={itemContainerStyle}
|
|
246
340
|
selectedItemContainerStyle={selectedItemContainerStyle}
|
|
247
|
-
|
|
248
|
-
|
|
341
|
+
itemLabelStyle={itemLabelStyle}
|
|
342
|
+
selectedItemLabelStyle={selectedItemLabelStyle}
|
|
249
343
|
/>
|
|
250
344
|
);
|
|
251
345
|
})}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
346
|
+
</ScrollView>
|
|
347
|
+
</Card>
|
|
348
|
+
</Animated.View>
|
|
349
|
+
</Container>
|
|
350
|
+
)}
|
|
256
351
|
</Container>
|
|
257
352
|
);
|
|
258
353
|
};
|
|
@@ -275,6 +370,10 @@ Select.propTypes = {
|
|
|
275
370
|
* The text to be displayed if no option is selected.
|
|
276
371
|
*/
|
|
277
372
|
placeholder: PropTypes.string,
|
|
373
|
+
/**
|
|
374
|
+
* The text to be displayed if no options are provided.
|
|
375
|
+
*/
|
|
376
|
+
emptyOptionsPlaceholder: PropTypes.string,
|
|
278
377
|
/**
|
|
279
378
|
* Use custom key as label.
|
|
280
379
|
*/
|
|
@@ -299,6 +398,22 @@ Select.propTypes = {
|
|
|
299
398
|
* Toggle Search bar within the options dropdown to search through the options.
|
|
300
399
|
*/
|
|
301
400
|
isSearchable: PropTypes.bool,
|
|
401
|
+
/**
|
|
402
|
+
* Show option to create the searched label if not present in the options list
|
|
403
|
+
*/
|
|
404
|
+
showCreateOption: PropTypes.bool,
|
|
405
|
+
/**
|
|
406
|
+
* Show loader while creating a searched option not present in the options list
|
|
407
|
+
*/
|
|
408
|
+
showCreateOptionLoader: PropTypes.bool,
|
|
409
|
+
/**
|
|
410
|
+
* Custom label for creating searched option not present in the options list
|
|
411
|
+
*/
|
|
412
|
+
createOptionLabel: PropTypes.string,
|
|
413
|
+
/**
|
|
414
|
+
* Callback when create searched option is pressed
|
|
415
|
+
*/
|
|
416
|
+
onPressCreateOption: PropTypes.func,
|
|
302
417
|
/**
|
|
303
418
|
* To customise floating label styles.
|
|
304
419
|
*/
|
|
@@ -322,7 +437,7 @@ Select.propTypes = {
|
|
|
322
437
|
/**
|
|
323
438
|
* To customise dropdown item text styles.
|
|
324
439
|
*/
|
|
325
|
-
|
|
440
|
+
itemLabelStyle: PropTypes.object,
|
|
326
441
|
/**
|
|
327
442
|
* To customise dropdown item container styles for selected item.
|
|
328
443
|
*/
|
|
@@ -330,16 +445,45 @@ Select.propTypes = {
|
|
|
330
445
|
/**
|
|
331
446
|
* To customise dropdown item text styles for selected item.
|
|
332
447
|
*/
|
|
333
|
-
|
|
448
|
+
selectedItemLabelStyle: PropTypes.object,
|
|
449
|
+
/**
|
|
450
|
+
* To customise search input containerr style.
|
|
451
|
+
*/
|
|
452
|
+
searchInputContainerStyle: PropTypes.object,
|
|
453
|
+
/**
|
|
454
|
+
* To customise search input style.
|
|
455
|
+
*/
|
|
456
|
+
searchInputStyle: PropTypes.object,
|
|
457
|
+
/**
|
|
458
|
+
* To customise empty options placeholder container style.
|
|
459
|
+
*/
|
|
460
|
+
emptyOptionsContainerStyle: PropTypes.object,
|
|
461
|
+
/**
|
|
462
|
+
* To customise empty options placeholder text style.
|
|
463
|
+
*/
|
|
464
|
+
emptyOptionsLabelStyle: PropTypes.object,
|
|
465
|
+
/**
|
|
466
|
+
* To customise empty options placeholder container style.
|
|
467
|
+
*/
|
|
468
|
+
createSearchedOptionContainerStyle: PropTypes.object,
|
|
469
|
+
/**
|
|
470
|
+
* To customise empty options placeholder text style.
|
|
471
|
+
*/
|
|
472
|
+
createSearchedOptionLabelStyle: PropTypes.object,
|
|
334
473
|
};
|
|
335
474
|
|
|
336
475
|
Select.defaultProps = {
|
|
337
476
|
label: null,
|
|
338
477
|
placeholder: "Select Option",
|
|
478
|
+
emptyOptionsPlaceholder: null,
|
|
339
479
|
labelExtractor: option => option?.label,
|
|
340
480
|
valueExtractor: option => option?.value,
|
|
341
481
|
value: null,
|
|
342
482
|
onSelect: () => {},
|
|
343
483
|
isLoading: false,
|
|
344
484
|
isSearchable: false,
|
|
485
|
+
showCreateOption: false,
|
|
486
|
+
showCreateOptionLoader: false,
|
|
487
|
+
createOptionLabel: null,
|
|
488
|
+
onPressCreateOption: () => {},
|
|
345
489
|
};
|