react-native-input-select 0.4.0 → 0.8.0
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/README.md +33 -23
- package/lib/commonjs/Dropdown.js +20 -28
- package/lib/commonjs/Dropdown.js.map +1 -1
- package/lib/commonjs/DropdownList.js +15 -10
- package/lib/commonjs/DropdownList.js.map +1 -1
- package/lib/commonjs/DropdownListItem.js +5 -4
- package/lib/commonjs/DropdownListItem.js.map +1 -1
- package/lib/commonjs/Input.js +53 -0
- package/lib/commonjs/Input.js.map +1 -0
- package/lib/commonjs/Modal.js +2 -2
- package/lib/commonjs/Modal.js.map +1 -1
- package/lib/commonjs/constants/index.js +11 -0
- package/lib/commonjs/constants/index.js.map +1 -0
- package/lib/commonjs/index.js +51 -11
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/styles/colors.js +1 -0
- package/lib/commonjs/styles/colors.js.map +1 -1
- package/lib/commonjs/styles/input.js +32 -0
- package/lib/commonjs/styles/input.js.map +1 -0
- package/lib/module/Dropdown.js +20 -29
- package/lib/module/Dropdown.js.map +1 -1
- package/lib/module/DropdownList.js +16 -11
- package/lib/module/DropdownList.js.map +1 -1
- package/lib/module/DropdownListItem.js +5 -4
- package/lib/module/DropdownListItem.js.map +1 -1
- package/lib/module/Input.js +36 -0
- package/lib/module/Input.js.map +1 -0
- package/lib/module/Modal.js +2 -2
- package/lib/module/Modal.js.map +1 -1
- package/lib/module/constants/index.js +3 -0
- package/lib/module/constants/index.js.map +1 -0
- package/lib/module/index.js +49 -11
- package/lib/module/index.js.map +1 -1
- package/lib/module/styles/colors.js +1 -0
- package/lib/module/styles/colors.js.map +1 -1
- package/lib/module/styles/input.js +21 -0
- package/lib/module/styles/input.js.map +1 -0
- package/lib/typescript/Dropdown.d.ts +1 -1
- package/lib/typescript/DropdownList.d.ts +1 -1
- package/lib/typescript/DropdownListItem.d.ts +1 -1
- package/lib/typescript/Input.d.ts +1 -0
- package/lib/typescript/Modal.d.ts +1 -1
- package/lib/typescript/constants/index.d.ts +2 -0
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/styles/input.d.ts +1 -0
- package/package.json +8 -3
- package/src/Dropdown.tsx +26 -31
- package/src/DropdownList.tsx +10 -7
- package/src/DropdownListItem.tsx +4 -3
- package/src/Input.tsx +39 -0
- package/src/Modal.tsx +2 -2
- package/src/constants/index.ts +2 -0
- package/src/index.tsx +58 -7
- package/src/styles/colors.ts +1 -0
- package/src/styles/input.ts +21 -0
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["React","useState","Dropdown","CustomModal","DropdownList","DropdownSelect","placeholder","label","error","helperText","options","optionLabel","optionValue","onValueChange","selectedValue","isMultiple","labelStyle","dropdownStyle","dropdownContainerStyle","selectedItemStyle","modalBackgroundStyle","modalOptionsContainer","open","setOpen","selectedItem","setSelectedItem","selectedItems","setSelectedItems","Array","isArray","undefined","handleSingleSelection","value","handleMultipleSelections","selectedValues","includes","filter","item","push","getSelectedItemsLabel","selectedLabels","forEach","element","selectedItemLabel","find"],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport Dropdown from './Dropdown';\nimport CustomModal from './Modal';\nimport DropdownList from './DropdownList';\n\nexport const DropdownSelect = ({\n placeholder,\n label,\n error,\n helperText,\n options,\n optionLabel,\n optionValue,\n onValueChange,\n selectedValue,\n isMultiple,\n labelStyle,\n dropdownStyle,\n dropdownContainerStyle,\n selectedItemStyle,\n modalBackgroundStyle,\n modalOptionsContainer,\n}: any) => {\n const [open, setOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState(selectedValue); //for single selection\n const [selectedItems, setSelectedItems] = useState(\n Array.isArray(selectedValue)\n ? selectedValue\n : selectedValue === '' || selectedValue === undefined\n ? []\n : [selectedValue]\n ); //for multiple selection\n\n /*===========================================\n * Selection handlers\n *==========================================*/\n const handleSingleSelection = (value: any) => {\n if (selectedItem === value) {\n setSelectedItem(null);\n } else {\n setSelectedItem(value);\n onValueChange(value); //send value to parent\n setOpen(false); //close modal upon selection\n }\n };\n\n const handleMultipleSelections = (value: any) => {\n let selectedValues = [...selectedItems];\n\n if (selectedValues.includes(value)) {\n selectedValues = selectedValues.filter((item) => item !== value);\n } else {\n selectedValues.push(value);\n }\n setSelectedItems(selectedValues);\n };\n\n /*===========================================\n * Get label handler\n *==========================================*/\n const getSelectedItemsLabel = () => {\n if (isMultiple) {\n let selectedLabels: Array<string> = [];\n selectedItems &&\n selectedItems.forEach((element) => {\n let selectedItemLabel =\n options &&\n options.find(\n (item: string) => item[optionValue ?? 'value'] === element\n )?.[optionLabel];\n selectedLabels.push(selectedItemLabel);\n });\n return selectedLabels;\n }\n\n let selectedItemLabel =\n options &&\n options.find(\n (item: string) => item[optionValue ?? 'value'] === selectedItem\n );\n return selectedItemLabel?.[optionLabel];\n };\n\n return (\n <>\n <Dropdown\n label={label}\n placeholder={placeholder}\n helperText={helperText}\n error={error}\n getSelectedItemsLabel={getSelectedItemsLabel}\n selectedItem={selectedItem}\n selectedItems={selectedItems}\n setOpen={setOpen}\n open={open}\n labelStyle={labelStyle}\n dropdownStyle={dropdownStyle}\n dropdownContainerStyle={dropdownContainerStyle}\n selectedItemStyle={selectedItemStyle}\n isMultiple={isMultiple}\n />\n <CustomModal\n open={open}\n setOpen={setOpen}\n modalBackgroundStyle={modalBackgroundStyle}\n modalOptionsContainer={modalOptionsContainer}\n onRequestClose={() => {}}\n >\n <DropdownList\n options={options}\n optionLabel={optionLabel}\n optionValue={optionValue}\n isMultiple={isMultiple}\n selectedItems={selectedItems}\n selectedItem={selectedItem}\n handleMultipleSelections={handleMultipleSelections}\n handleSingleSelection={handleSingleSelection}\n />\n </CustomModal>\n </>\n );\n};\n\nexport default DropdownSelect;\n"]}
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","useState","Dropdown","CustomModal","DropdownList","DEFAULT_OPTION_LABEL","DEFAULT_OPTION_VALUE","Input","DropdownSelect","placeholder","label","error","helperText","options","optionLabel","optionValue","onValueChange","selectedValue","isMultiple","isSearchable","labelStyle","dropdownStyle","dropdownContainerStyle","selectedItemStyle","multipleSelectedItemStyle","modalBackgroundStyle","modalOptionsContainer","searchInputStyle","primaryColor","newOptions","setNewOptions","open","setOpen","selectedItem","setSelectedItem","selectedItems","setSelectedItems","Array","isArray","undefined","searchValue","setSearchValue","handleSingleSelection","value","handleMultipleSelections","selectedValues","includes","filter","item","push","getSelectedItemsLabel","selectedLabels","forEach","element","selectedItemLabel","find","onSearch","searchTerm","toString","toLocaleLowerCase","searchResults","toLowerCase","handleToggleModal","text"],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport Dropdown from './Dropdown';\nimport CustomModal from './Modal';\nimport DropdownList from './DropdownList';\nimport { DEFAULT_OPTION_LABEL, DEFAULT_OPTION_VALUE } from './constants';\nimport { Input } from './Input';\n\nexport const DropdownSelect = ({\n placeholder,\n label,\n error,\n helperText,\n options,\n optionLabel,\n optionValue,\n onValueChange,\n selectedValue,\n isMultiple,\n isSearchable,\n labelStyle,\n dropdownStyle,\n dropdownContainerStyle,\n selectedItemStyle,\n multipleSelectedItemStyle,\n modalBackgroundStyle,\n modalOptionsContainer,\n searchInputStyle,\n primaryColor,\n}: any) => {\n const [newOptions, setNewOptions] = useState(options ? options : []);\n const [open, setOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState(selectedValue); //for single selection\n const [selectedItems, setSelectedItems] = useState(\n Array.isArray(selectedValue)\n ? selectedValue\n : selectedValue === '' || selectedValue === undefined\n ? []\n : [selectedValue]\n ); //for multiple selection\n const [searchValue, setSearchValue] = useState('');\n\n /*===========================================\n * Selection handlers\n *==========================================*/\n const handleSingleSelection = (value: any) => {\n if (selectedItem === value) {\n setSelectedItem(null);\n } else {\n setSelectedItem(value);\n onValueChange(value); //send value to parent\n setOpen(false); //close modal upon selection\n }\n };\n\n const handleMultipleSelections = (value: any) => {\n let selectedValues = [...selectedItems];\n\n if (selectedValues.includes(value)) {\n selectedValues = selectedValues.filter((item) => item !== value);\n } else {\n selectedValues.push(value);\n }\n setSelectedItems(selectedValues);\n };\n\n /*===========================================\n * Get label handler\n *==========================================*/\n const getSelectedItemsLabel = () => {\n if (isMultiple) {\n let selectedLabels: Array<string> = [];\n selectedItems &&\n selectedItems.forEach((element) => {\n let selectedItemLabel =\n options &&\n options.find(\n (item: string) =>\n item[optionValue ?? DEFAULT_OPTION_VALUE] === element\n )?.[optionLabel];\n selectedLabels.push(selectedItemLabel);\n });\n return selectedLabels;\n }\n\n let selectedItemLabel =\n options &&\n options.find(\n (item: string) =>\n item[optionValue ?? DEFAULT_OPTION_VALUE] === selectedItem\n );\n return selectedItemLabel?.[optionLabel ?? DEFAULT_OPTION_LABEL];\n };\n\n /*===========================================\n * Search\n *==========================================*/\n const onSearch = (value: string) => {\n setSearchValue(value);\n let searchTerm = value.toString().toLocaleLowerCase();\n const searchResults = options.filter((item: any) => {\n return (\n item[optionLabel ?? DEFAULT_OPTION_LABEL]\n .toString()\n .toLowerCase()\n .includes(searchTerm) ||\n item[optionValue ?? DEFAULT_OPTION_VALUE]\n .toString(searchTerm)\n .toLowerCase()\n .includes()\n );\n });\n\n setNewOptions(searchResults);\n };\n\n /*===========================================\n * Modal\n *==========================================*/\n const handleToggleModal = () => {\n setOpen(!open);\n setSearchValue('');\n setNewOptions(options);\n };\n\n return (\n <>\n <Dropdown\n label={label}\n placeholder={placeholder}\n helperText={helperText}\n error={error}\n getSelectedItemsLabel={getSelectedItemsLabel}\n selectedItem={selectedItem}\n selectedItems={selectedItems}\n handleToggleModal={handleToggleModal}\n labelStyle={labelStyle}\n dropdownStyle={dropdownStyle}\n dropdownContainerStyle={dropdownContainerStyle}\n selectedItemStyle={selectedItemStyle}\n multipleSelectedItemStyle={multipleSelectedItemStyle}\n isMultiple={isMultiple}\n primaryColor={primaryColor}\n />\n <CustomModal\n open={open}\n handleToggleModal={handleToggleModal}\n modalBackgroundStyle={modalBackgroundStyle}\n modalOptionsContainer={modalOptionsContainer}\n onRequestClose={() => {}}\n >\n {isSearchable && (\n <Input\n value={searchValue}\n onChangeText={(text: string) => onSearch(text)}\n style={searchInputStyle}\n primaryColor={primaryColor}\n />\n )}\n <DropdownList\n options={newOptions}\n optionLabel={optionLabel}\n optionValue={optionValue}\n isMultiple={isMultiple}\n selectedItems={selectedItems}\n selectedItem={selectedItem}\n handleMultipleSelections={handleMultipleSelections}\n handleSingleSelection={handleSingleSelection}\n primaryColor={primaryColor}\n />\n </CustomModal>\n </>\n );\n};\n\nexport default DropdownSelect;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["colors.ts"],"names":["colors","primary","black","white","dark","gray","lightGray"],"mappings":"AAAA,OAAO,MAAMA,MAAW,GAAG;AACzBC,EAAAA,OAAO,EAAE,SADgB;AAEzBC,EAAAA,
|
|
1
|
+
{"version":3,"sources":["colors.ts"],"names":["colors","primary","red","black","white","dark","gray","lightGray"],"mappings":"AAAA,OAAO,MAAMA,MAAW,GAAG;AACzBC,EAAAA,OAAO,EAAE,SADgB;AAEzBC,EAAAA,GAAG,EAAE,SAFoB;AAGzBC,EAAAA,KAAK,EAAE,SAHkB;AAIzBC,EAAAA,KAAK,EAAE,SAJkB;AAKzBC,EAAAA,IAAI,EAAE,SALmB;AAMzBC,EAAAA,IAAI,EAAE,SANmB;AAOzBC,EAAAA,SAAS,EAAE;AAPc,CAApB","sourcesContent":["export const colors: any = {\n primary: '#EF8031',\n red: '#FA4169',\n black: '#000000',\n white: '#FFFFFF',\n dark: '#11142D',\n gray: '#808191',\n lightGray: '#F7F7F7',\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { StyleSheet } from 'react-native';
|
|
2
|
+
import { colors } from './colors';
|
|
3
|
+
export const inputStyles = StyleSheet.create({
|
|
4
|
+
input: {
|
|
5
|
+
paddingVertical: 18,
|
|
6
|
+
paddingHorizontal: 23,
|
|
7
|
+
backgroundColor: colors.lightGray,
|
|
8
|
+
borderRadius: 8,
|
|
9
|
+
borderColor: colors.dark,
|
|
10
|
+
borderWidth: 1,
|
|
11
|
+
color: colors.dark,
|
|
12
|
+
width: '100%',
|
|
13
|
+
minHeight: 64
|
|
14
|
+
},
|
|
15
|
+
inputFocusState: {
|
|
16
|
+
borderWidth: 2,
|
|
17
|
+
borderStyle: 'solid',
|
|
18
|
+
borderColor: colors.primary
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["input.ts"],"names":["StyleSheet","colors","inputStyles","create","input","paddingVertical","paddingHorizontal","backgroundColor","lightGray","borderRadius","borderColor","dark","borderWidth","color","width","minHeight","inputFocusState","borderStyle","primary"],"mappings":"AAAA,SAASA,UAAT,QAA2B,cAA3B;AACA,SAASC,MAAT,QAAuB,UAAvB;AAEA,OAAO,MAAMC,WAAgB,GAAGF,UAAU,CAACG,MAAX,CAAkB;AAChDC,EAAAA,KAAK,EAAE;AACLC,IAAAA,eAAe,EAAE,EADZ;AAELC,IAAAA,iBAAiB,EAAE,EAFd;AAGLC,IAAAA,eAAe,EAAEN,MAAM,CAACO,SAHnB;AAILC,IAAAA,YAAY,EAAE,CAJT;AAKLC,IAAAA,WAAW,EAAET,MAAM,CAACU,IALf;AAMLC,IAAAA,WAAW,EAAE,CANR;AAOLC,IAAAA,KAAK,EAAEZ,MAAM,CAACU,IAPT;AAQLG,IAAAA,KAAK,EAAE,MARF;AASLC,IAAAA,SAAS,EAAE;AATN,GADyC;AAYhDC,EAAAA,eAAe,EAAE;AACfJ,IAAAA,WAAW,EAAE,CADE;AAEfK,IAAAA,WAAW,EAAE,OAFE;AAGfP,IAAAA,WAAW,EAAET,MAAM,CAACiB;AAHL;AAZ+B,CAAlB,CAAzB","sourcesContent":["import { StyleSheet } from 'react-native';\nimport { colors } from './colors';\n\nexport const inputStyles: any = StyleSheet.create({\n input: {\n paddingVertical: 18,\n paddingHorizontal: 23,\n backgroundColor: colors.lightGray,\n borderRadius: 8,\n borderColor: colors.dark,\n borderWidth: 1,\n color: colors.dark,\n width: '100%',\n minHeight: 64,\n },\n inputFocusState: {\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: colors.primary,\n },\n});\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const Dropdown: ({ label, placeholder, helperText, error, getSelectedItemsLabel,
|
|
1
|
+
declare const Dropdown: ({ label, placeholder, helperText, error, getSelectedItemsLabel, handleToggleModal, isMultiple, selectedItem, selectedItems, labelStyle, dropdownStyle, dropdownContainerStyle, selectedItemStyle, multipleSelectedItemStyle, primaryColor, }: any) => JSX.Element;
|
|
2
2
|
export default Dropdown;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const DropdownList: ({ options, optionLabel, optionValue, isMultiple, selectedItems, selectedItem, handleMultipleSelections, handleSingleSelection, }: any) => JSX.Element;
|
|
1
|
+
declare const DropdownList: ({ options, optionLabel, optionValue, isMultiple, selectedItems, selectedItem, handleMultipleSelections, handleSingleSelection, primaryColor, }: any) => JSX.Element;
|
|
2
2
|
export default DropdownList;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
declare const _default: React.MemoExoticComponent<({ item, optionLabel, optionValue, isMultiple, selectedOption, onChange, }: any) => JSX.Element>;
|
|
2
|
+
declare const _default: React.MemoExoticComponent<({ item, optionLabel, optionValue, isMultiple, selectedOption, onChange, primaryColor, }: any) => JSX.Element>;
|
|
3
3
|
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Input: ({ placeholder, value, onChangeText, style, primaryColor, ...rest }: any) => JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const CustomModal: ({ open,
|
|
1
|
+
declare const CustomModal: ({ open, handleToggleModal, onRequestClose, modalBackgroundStyle, modalOptionsContainerStyle, children, }: any) => JSX.Element;
|
|
2
2
|
export default CustomModal;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const DropdownSelect: ({ placeholder, label, error, helperText, options, optionLabel, optionValue, onValueChange, selectedValue, isMultiple, labelStyle, dropdownStyle, dropdownContainerStyle, selectedItemStyle, modalBackgroundStyle, modalOptionsContainer, }: any) => JSX.Element;
|
|
1
|
+
export declare const DropdownSelect: ({ placeholder, label, error, helperText, options, optionLabel, optionValue, onValueChange, selectedValue, isMultiple, isSearchable, labelStyle, dropdownStyle, dropdownContainerStyle, selectedItemStyle, multipleSelectedItemStyle, modalBackgroundStyle, modalOptionsContainer, searchInputStyle, primaryColor, }: any) => JSX.Element;
|
|
2
2
|
export default DropdownSelect;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const inputStyles: any;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-input-select",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Dropdown package for react-native",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -29,12 +29,17 @@
|
|
|
29
29
|
"release": "release-it -- minor --ci",
|
|
30
30
|
"example": "yarn --cwd example",
|
|
31
31
|
"pods": "cd example && pod-install --quiet",
|
|
32
|
-
"bootstrap": "yarn example && yarn && yarn pods"
|
|
32
|
+
"bootstrap": "yarn example && yarn && yarn pods",
|
|
33
|
+
"start": "yarn example start",
|
|
34
|
+
"android": "yarn example android",
|
|
35
|
+
"ios": "yarn example ios"
|
|
33
36
|
},
|
|
34
37
|
"keywords": [
|
|
35
38
|
"react-native",
|
|
36
39
|
"ios",
|
|
37
|
-
"android"
|
|
40
|
+
"android",
|
|
41
|
+
"dropdown",
|
|
42
|
+
"selection"
|
|
38
43
|
],
|
|
39
44
|
"repository": "https://github.com/azeezat/react-native-select",
|
|
40
45
|
"author": "Azeezat <azeezat94@gmail.com> (https://github.com/azeezat)",
|
package/src/Dropdown.tsx
CHANGED
|
@@ -6,8 +6,10 @@ import {
|
|
|
6
6
|
ScrollView,
|
|
7
7
|
StyleSheet,
|
|
8
8
|
Image,
|
|
9
|
+
TouchableOpacity,
|
|
9
10
|
} from 'react-native';
|
|
10
11
|
import { colors } from './styles/colors';
|
|
12
|
+
import { inputStyles } from './styles/input';
|
|
11
13
|
import { typography } from './styles/typography';
|
|
12
14
|
|
|
13
15
|
const Dropdown = ({
|
|
@@ -16,8 +18,7 @@ const Dropdown = ({
|
|
|
16
18
|
helperText,
|
|
17
19
|
error,
|
|
18
20
|
getSelectedItemsLabel,
|
|
19
|
-
|
|
20
|
-
open,
|
|
21
|
+
handleToggleModal,
|
|
21
22
|
isMultiple,
|
|
22
23
|
selectedItem,
|
|
23
24
|
selectedItems,
|
|
@@ -25,6 +26,8 @@ const Dropdown = ({
|
|
|
25
26
|
dropdownStyle,
|
|
26
27
|
dropdownContainerStyle,
|
|
27
28
|
selectedItemStyle,
|
|
29
|
+
multipleSelectedItemStyle,
|
|
30
|
+
primaryColor,
|
|
28
31
|
}: any) => {
|
|
29
32
|
return (
|
|
30
33
|
<View style={[styles.dropdownInputContainer, dropdownContainerStyle]}>
|
|
@@ -32,10 +35,11 @@ const Dropdown = ({
|
|
|
32
35
|
<Text style={[styles.label, labelStyle]}>{label}</Text>
|
|
33
36
|
)}
|
|
34
37
|
<Pressable
|
|
35
|
-
onPress={() =>
|
|
38
|
+
onPress={() => handleToggleModal()}
|
|
36
39
|
style={({ pressed }) => [
|
|
37
|
-
pressed &&
|
|
38
|
-
|
|
40
|
+
pressed &&
|
|
41
|
+
inputStyles.inputFocusState && { borderColor: primaryColor },
|
|
42
|
+
inputStyles.input,
|
|
39
43
|
dropdownStyle,
|
|
40
44
|
]}
|
|
41
45
|
>
|
|
@@ -50,15 +54,23 @@ const Dropdown = ({
|
|
|
50
54
|
>
|
|
51
55
|
{isMultiple ? (
|
|
52
56
|
getSelectedItemsLabel().map((item: any, i: Number) => (
|
|
53
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
<TouchableOpacity onPress={() => handleToggleModal()}>
|
|
58
|
+
<Text
|
|
59
|
+
key={`SelectedItems${i}`}
|
|
60
|
+
style={[
|
|
61
|
+
styles.selectedItems,
|
|
62
|
+
{ backgroundColor: primaryColor },
|
|
63
|
+
multipleSelectedItemStyle,
|
|
64
|
+
]}
|
|
65
|
+
>
|
|
66
|
+
{item}
|
|
67
|
+
</Text>
|
|
68
|
+
</TouchableOpacity>
|
|
59
69
|
))
|
|
60
70
|
) : (
|
|
61
|
-
<Text style={styles.blackText}>
|
|
71
|
+
<Text style={[styles.blackText, selectedItemStyle]}>
|
|
72
|
+
{getSelectedItemsLabel()}
|
|
73
|
+
</Text>
|
|
62
74
|
)}
|
|
63
75
|
</View>
|
|
64
76
|
|
|
@@ -84,30 +96,13 @@ const Dropdown = ({
|
|
|
84
96
|
|
|
85
97
|
const styles = StyleSheet.create({
|
|
86
98
|
label: { marginBottom: 16, color: colors.gray, ...typography.caption },
|
|
87
|
-
input: {
|
|
88
|
-
paddingVertical: 18,
|
|
89
|
-
paddingHorizontal: 23,
|
|
90
|
-
backgroundColor: colors.lightGray,
|
|
91
|
-
borderRadius: 8,
|
|
92
|
-
borderColor: colors.dark,
|
|
93
|
-
borderWidth: 1,
|
|
94
|
-
color: colors.dark,
|
|
95
|
-
width: '100%',
|
|
96
|
-
minHeight: 64,
|
|
97
|
-
},
|
|
98
|
-
inputFocusState: {
|
|
99
|
-
borderWidth: 2,
|
|
100
|
-
borderStyle: 'solid',
|
|
101
|
-
borderColor: colors.primary,
|
|
102
|
-
borderRadius: 8,
|
|
103
|
-
},
|
|
104
99
|
inputFocusErrorState: {
|
|
105
100
|
borderWidth: 2,
|
|
106
101
|
borderStyle: 'solid',
|
|
107
|
-
borderColor: colors.
|
|
102
|
+
borderColor: colors.red,
|
|
108
103
|
},
|
|
109
104
|
iconStyle: { position: 'absolute', right: 25, top: 25 },
|
|
110
|
-
error: { color: colors.
|
|
105
|
+
error: { color: colors.red, marginTop: 8, ...typography.caption },
|
|
111
106
|
helper: { marginTop: 8, color: colors.primary, ...typography.caption },
|
|
112
107
|
dropdownInputContainer: { marginBottom: 23, width: '100%' },
|
|
113
108
|
selectedItemsContainer: { flexDirection: 'row', flexWrap: 'nowrap' },
|
package/src/DropdownList.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { View, FlatList, StyleSheet } from 'react-native';
|
|
2
|
+
import { View, FlatList, StyleSheet, Text } from 'react-native';
|
|
3
3
|
import DropdownListItem from './DropdownListItem';
|
|
4
4
|
import { colors } from './styles/colors';
|
|
5
5
|
|
|
@@ -12,18 +12,18 @@ const DropdownList = ({
|
|
|
12
12
|
selectedItem,
|
|
13
13
|
handleMultipleSelections,
|
|
14
14
|
handleSingleSelection,
|
|
15
|
+
primaryColor,
|
|
15
16
|
}: any) => {
|
|
16
17
|
return (
|
|
17
18
|
<FlatList
|
|
18
19
|
data={options}
|
|
19
20
|
extraData={isMultiple ? selectedItems : selectedItem}
|
|
20
21
|
initialNumToRender={5}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
// }
|
|
22
|
+
ListEmptyComponent={
|
|
23
|
+
<View style={styles.emptyListStyle}>
|
|
24
|
+
<Text>No options available</Text>
|
|
25
|
+
</View>
|
|
26
|
+
}
|
|
27
27
|
ItemSeparatorComponent={() => <View style={styles.itemSeparatorStyle} />}
|
|
28
28
|
renderItem={(item) =>
|
|
29
29
|
_renderItem(item, {
|
|
@@ -34,6 +34,7 @@ const DropdownList = ({
|
|
|
34
34
|
onChange: isMultiple
|
|
35
35
|
? handleMultipleSelections
|
|
36
36
|
: handleSingleSelection,
|
|
37
|
+
primaryColor,
|
|
37
38
|
})
|
|
38
39
|
}
|
|
39
40
|
keyExtractor={(_item, index) => `Options${index}`}
|
|
@@ -50,6 +51,7 @@ const _renderItem = ({ item }: any, props: any) => {
|
|
|
50
51
|
isMultiple={props.isMultiple}
|
|
51
52
|
selectedOption={props.selectedOption}
|
|
52
53
|
onChange={props.onChange}
|
|
54
|
+
primaryColor={props.primaryColor}
|
|
53
55
|
/>
|
|
54
56
|
);
|
|
55
57
|
};
|
|
@@ -71,6 +73,7 @@ const styles = StyleSheet.create({
|
|
|
71
73
|
height: 1,
|
|
72
74
|
opacity: 0.15,
|
|
73
75
|
},
|
|
76
|
+
emptyListStyle: { alignItems: 'center', width: '100%', marginVertical: 20 },
|
|
74
77
|
});
|
|
75
78
|
|
|
76
79
|
export default DropdownList;
|
package/src/DropdownListItem.tsx
CHANGED
|
@@ -10,6 +10,7 @@ const DropdownListItem = ({
|
|
|
10
10
|
isMultiple,
|
|
11
11
|
selectedOption,
|
|
12
12
|
onChange,
|
|
13
|
+
primaryColor,
|
|
13
14
|
}: any) => {
|
|
14
15
|
const selectedOptionValue = optionValue ?? 'value';
|
|
15
16
|
return (
|
|
@@ -26,9 +27,9 @@ const DropdownListItem = ({
|
|
|
26
27
|
}
|
|
27
28
|
onChange={() => onChange(item[selectedOptionValue])}
|
|
28
29
|
boxType="circle" //works on ios only
|
|
29
|
-
tintColors={{ true: colors.primary }} //android control
|
|
30
|
-
onCheckColor={colors.primary} //ios checkmark colour control
|
|
31
|
-
onTintColor={colors.primary} //ios box colour control
|
|
30
|
+
tintColors={{ true: primaryColor || colors.primary }} //android control
|
|
31
|
+
onCheckColor={primaryColor || colors.primary} //ios checkmark colour control
|
|
32
|
+
onTintColor={primaryColor || colors.primary} //ios box colour control
|
|
32
33
|
/>
|
|
33
34
|
</View>
|
|
34
35
|
<View>
|
package/src/Input.tsx
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { TextInput, StyleSheet, View } from 'react-native';
|
|
3
|
+
import { inputStyles } from './styles/input';
|
|
4
|
+
|
|
5
|
+
export const Input = ({
|
|
6
|
+
placeholder,
|
|
7
|
+
value,
|
|
8
|
+
onChangeText,
|
|
9
|
+
style,
|
|
10
|
+
primaryColor,
|
|
11
|
+
...rest
|
|
12
|
+
}: any) => {
|
|
13
|
+
const [isFocused, setFocus] = useState(false);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<View style={styles.container}>
|
|
17
|
+
<TextInput
|
|
18
|
+
placeholder={placeholder}
|
|
19
|
+
style={[
|
|
20
|
+
inputStyles.input,
|
|
21
|
+
isFocused &&
|
|
22
|
+
inputStyles.inputFocusState && { borderColor: primaryColor },
|
|
23
|
+
style,
|
|
24
|
+
]}
|
|
25
|
+
onFocus={() => {
|
|
26
|
+
setFocus(true);
|
|
27
|
+
}}
|
|
28
|
+
onBlur={() => setFocus(false)}
|
|
29
|
+
value={value}
|
|
30
|
+
onChangeText={onChangeText}
|
|
31
|
+
{...rest}
|
|
32
|
+
/>
|
|
33
|
+
</View>
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const styles = StyleSheet.create({
|
|
38
|
+
container: { margin: 23 },
|
|
39
|
+
});
|
package/src/Modal.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import { colors } from './styles/colors';
|
|
|
9
9
|
|
|
10
10
|
const CustomModal = ({
|
|
11
11
|
open,
|
|
12
|
-
|
|
12
|
+
handleToggleModal,
|
|
13
13
|
onRequestClose,
|
|
14
14
|
modalBackgroundStyle,
|
|
15
15
|
modalOptionsContainerStyle,
|
|
@@ -23,7 +23,7 @@ const CustomModal = ({
|
|
|
23
23
|
animationType="fade"
|
|
24
24
|
>
|
|
25
25
|
<TouchableOpacity
|
|
26
|
-
onPress={() =>
|
|
26
|
+
onPress={() => handleToggleModal()}
|
|
27
27
|
style={[
|
|
28
28
|
styles.modalContainer,
|
|
29
29
|
styles.modalBackgroundStyle,
|
package/src/index.tsx
CHANGED
|
@@ -2,6 +2,8 @@ import React, { useState } from 'react';
|
|
|
2
2
|
import Dropdown from './Dropdown';
|
|
3
3
|
import CustomModal from './Modal';
|
|
4
4
|
import DropdownList from './DropdownList';
|
|
5
|
+
import { DEFAULT_OPTION_LABEL, DEFAULT_OPTION_VALUE } from './constants';
|
|
6
|
+
import { Input } from './Input';
|
|
5
7
|
|
|
6
8
|
export const DropdownSelect = ({
|
|
7
9
|
placeholder,
|
|
@@ -14,13 +16,18 @@ export const DropdownSelect = ({
|
|
|
14
16
|
onValueChange,
|
|
15
17
|
selectedValue,
|
|
16
18
|
isMultiple,
|
|
19
|
+
isSearchable,
|
|
17
20
|
labelStyle,
|
|
18
21
|
dropdownStyle,
|
|
19
22
|
dropdownContainerStyle,
|
|
20
23
|
selectedItemStyle,
|
|
24
|
+
multipleSelectedItemStyle,
|
|
21
25
|
modalBackgroundStyle,
|
|
22
26
|
modalOptionsContainer,
|
|
27
|
+
searchInputStyle,
|
|
28
|
+
primaryColor,
|
|
23
29
|
}: any) => {
|
|
30
|
+
const [newOptions, setNewOptions] = useState(options ? options : []);
|
|
24
31
|
const [open, setOpen] = useState(false);
|
|
25
32
|
const [selectedItem, setSelectedItem] = useState(selectedValue); //for single selection
|
|
26
33
|
const [selectedItems, setSelectedItems] = useState(
|
|
@@ -30,6 +37,7 @@ export const DropdownSelect = ({
|
|
|
30
37
|
? []
|
|
31
38
|
: [selectedValue]
|
|
32
39
|
); //for multiple selection
|
|
40
|
+
const [searchValue, setSearchValue] = useState('');
|
|
33
41
|
|
|
34
42
|
/*===========================================
|
|
35
43
|
* Selection handlers
|
|
@@ -66,7 +74,8 @@ export const DropdownSelect = ({
|
|
|
66
74
|
let selectedItemLabel =
|
|
67
75
|
options &&
|
|
68
76
|
options.find(
|
|
69
|
-
(item: string) =>
|
|
77
|
+
(item: string) =>
|
|
78
|
+
item[optionValue ?? DEFAULT_OPTION_VALUE] === element
|
|
70
79
|
)?.[optionLabel];
|
|
71
80
|
selectedLabels.push(selectedItemLabel);
|
|
72
81
|
});
|
|
@@ -76,9 +85,41 @@ export const DropdownSelect = ({
|
|
|
76
85
|
let selectedItemLabel =
|
|
77
86
|
options &&
|
|
78
87
|
options.find(
|
|
79
|
-
(item: string) =>
|
|
88
|
+
(item: string) =>
|
|
89
|
+
item[optionValue ?? DEFAULT_OPTION_VALUE] === selectedItem
|
|
80
90
|
);
|
|
81
|
-
return selectedItemLabel?.[optionLabel];
|
|
91
|
+
return selectedItemLabel?.[optionLabel ?? DEFAULT_OPTION_LABEL];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/*===========================================
|
|
95
|
+
* Search
|
|
96
|
+
*==========================================*/
|
|
97
|
+
const onSearch = (value: string) => {
|
|
98
|
+
setSearchValue(value);
|
|
99
|
+
let searchTerm = value.toString().toLocaleLowerCase();
|
|
100
|
+
const searchResults = options.filter((item: any) => {
|
|
101
|
+
return (
|
|
102
|
+
item[optionLabel ?? DEFAULT_OPTION_LABEL]
|
|
103
|
+
.toString()
|
|
104
|
+
.toLowerCase()
|
|
105
|
+
.includes(searchTerm) ||
|
|
106
|
+
item[optionValue ?? DEFAULT_OPTION_VALUE]
|
|
107
|
+
.toString(searchTerm)
|
|
108
|
+
.toLowerCase()
|
|
109
|
+
.includes()
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
setNewOptions(searchResults);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/*===========================================
|
|
117
|
+
* Modal
|
|
118
|
+
*==========================================*/
|
|
119
|
+
const handleToggleModal = () => {
|
|
120
|
+
setOpen(!open);
|
|
121
|
+
setSearchValue('');
|
|
122
|
+
setNewOptions(options);
|
|
82
123
|
};
|
|
83
124
|
|
|
84
125
|
return (
|
|
@@ -91,23 +132,32 @@ export const DropdownSelect = ({
|
|
|
91
132
|
getSelectedItemsLabel={getSelectedItemsLabel}
|
|
92
133
|
selectedItem={selectedItem}
|
|
93
134
|
selectedItems={selectedItems}
|
|
94
|
-
|
|
95
|
-
open={open}
|
|
135
|
+
handleToggleModal={handleToggleModal}
|
|
96
136
|
labelStyle={labelStyle}
|
|
97
137
|
dropdownStyle={dropdownStyle}
|
|
98
138
|
dropdownContainerStyle={dropdownContainerStyle}
|
|
99
139
|
selectedItemStyle={selectedItemStyle}
|
|
140
|
+
multipleSelectedItemStyle={multipleSelectedItemStyle}
|
|
100
141
|
isMultiple={isMultiple}
|
|
142
|
+
primaryColor={primaryColor}
|
|
101
143
|
/>
|
|
102
144
|
<CustomModal
|
|
103
145
|
open={open}
|
|
104
|
-
|
|
146
|
+
handleToggleModal={handleToggleModal}
|
|
105
147
|
modalBackgroundStyle={modalBackgroundStyle}
|
|
106
148
|
modalOptionsContainer={modalOptionsContainer}
|
|
107
149
|
onRequestClose={() => {}}
|
|
108
150
|
>
|
|
151
|
+
{isSearchable && (
|
|
152
|
+
<Input
|
|
153
|
+
value={searchValue}
|
|
154
|
+
onChangeText={(text: string) => onSearch(text)}
|
|
155
|
+
style={searchInputStyle}
|
|
156
|
+
primaryColor={primaryColor}
|
|
157
|
+
/>
|
|
158
|
+
)}
|
|
109
159
|
<DropdownList
|
|
110
|
-
options={
|
|
160
|
+
options={newOptions}
|
|
111
161
|
optionLabel={optionLabel}
|
|
112
162
|
optionValue={optionValue}
|
|
113
163
|
isMultiple={isMultiple}
|
|
@@ -115,6 +165,7 @@ export const DropdownSelect = ({
|
|
|
115
165
|
selectedItem={selectedItem}
|
|
116
166
|
handleMultipleSelections={handleMultipleSelections}
|
|
117
167
|
handleSingleSelection={handleSingleSelection}
|
|
168
|
+
primaryColor={primaryColor}
|
|
118
169
|
/>
|
|
119
170
|
</CustomModal>
|
|
120
171
|
</>
|
package/src/styles/colors.ts
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { StyleSheet } from 'react-native';
|
|
2
|
+
import { colors } from './colors';
|
|
3
|
+
|
|
4
|
+
export const inputStyles: any = StyleSheet.create({
|
|
5
|
+
input: {
|
|
6
|
+
paddingVertical: 18,
|
|
7
|
+
paddingHorizontal: 23,
|
|
8
|
+
backgroundColor: colors.lightGray,
|
|
9
|
+
borderRadius: 8,
|
|
10
|
+
borderColor: colors.dark,
|
|
11
|
+
borderWidth: 1,
|
|
12
|
+
color: colors.dark,
|
|
13
|
+
width: '100%',
|
|
14
|
+
minHeight: 64,
|
|
15
|
+
},
|
|
16
|
+
inputFocusState: {
|
|
17
|
+
borderWidth: 2,
|
|
18
|
+
borderStyle: 'solid',
|
|
19
|
+
borderColor: colors.primary,
|
|
20
|
+
},
|
|
21
|
+
});
|