jb-select 5.3.2 → 6.0.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.
Files changed (69) hide show
  1. package/README.md +67 -29
  2. package/dist/index.cjs.js +2 -0
  3. package/dist/index.cjs.js.br +0 -0
  4. package/dist/index.cjs.js.gz +0 -0
  5. package/dist/index.cjs.js.map +1 -0
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.br +0 -0
  8. package/dist/index.js.gz +0 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/index.umd.js +2 -0
  11. package/dist/index.umd.js.br +0 -0
  12. package/dist/index.umd.js.gz +0 -0
  13. package/dist/index.umd.js.map +1 -0
  14. package/dist/web-component/jb-select/lib/index.d.ts +7 -0
  15. package/dist/web-component/jb-select/lib/jb-option/jb-option.d.ts +21 -0
  16. package/dist/web-component/jb-select/lib/jb-option/render.d.ts +1 -0
  17. package/dist/web-component/jb-select/lib/jb-option/types.d.ts +4 -0
  18. package/dist/web-component/jb-select/lib/jb-option-list/jb-option-list.d.ts +10 -0
  19. package/dist/web-component/jb-select/lib/jb-option-list/types.d.ts +5 -0
  20. package/dist/web-component/jb-select/lib/jb-select.d.ts +3 -7
  21. package/dist/web-component/jb-select/lib/types.d.ts +6 -10
  22. package/index.js +2 -2
  23. package/lib/index.ts +8 -0
  24. package/lib/jb-option/jb-option.scss +23 -0
  25. package/lib/jb-option/jb-option.ts +136 -0
  26. package/lib/jb-option/render.ts +9 -0
  27. package/lib/jb-option/types.ts +4 -0
  28. package/lib/jb-option-list/jb-option-list.ts +125 -0
  29. package/lib/jb-option-list/types.ts +5 -0
  30. package/lib/jb-select.html +1 -1
  31. package/lib/jb-select.scss +36 -45
  32. package/lib/jb-select.ts +165 -238
  33. package/lib/types.ts +8 -9
  34. package/package.json +5 -3
  35. package/react/README.md +188 -0
  36. package/react/dist/common/hooks/use-event.d.ts +3 -0
  37. package/react/dist/common/hooks/useLazyRef.d.ts +4 -0
  38. package/react/dist/common/hooks/useMobx.d.ts +4 -0
  39. package/react/dist/common/scripts/device-detection.d.ts +1 -0
  40. package/react/dist/common/scripts/persian-helper.d.ts +3 -0
  41. package/react/dist/index.cjs.js +122 -0
  42. package/react/dist/index.cjs.js.map +1 -0
  43. package/react/dist/index.js +118 -0
  44. package/react/dist/index.js.map +1 -0
  45. package/react/dist/index.umd.js +125 -0
  46. package/react/dist/index.umd.js.map +1 -0
  47. package/react/dist/web-component/jb-select/react/lib/JBOption.d.ts +19 -0
  48. package/react/dist/web-component/jb-select/react/lib/JBOptionList.d.ts +22 -0
  49. package/react/dist/web-component/jb-select/react/lib/JBSelect.d.ts +38 -0
  50. package/react/dist/web-component/jb-select/react/lib/index.d.ts +3 -0
  51. package/react/index.js +1 -0
  52. package/react/lib/JBOption.tsx +45 -0
  53. package/react/lib/JBOptionList.tsx +59 -0
  54. package/react/lib/JBSelect.tsx +105 -0
  55. package/react/lib/index.tsx +3 -0
  56. package/react/package.json +33 -0
  57. package/react/tsconfig.json +19 -0
  58. package/dist/jb-select.cjs.js +0 -2
  59. package/dist/jb-select.cjs.js.br +0 -0
  60. package/dist/jb-select.cjs.js.gz +0 -0
  61. package/dist/jb-select.cjs.js.map +0 -1
  62. package/dist/jb-select.js +0 -2
  63. package/dist/jb-select.js.br +0 -0
  64. package/dist/jb-select.js.gz +0 -0
  65. package/dist/jb-select.js.map +0 -1
  66. package/dist/jb-select.umd.js +0 -2
  67. package/dist/jb-select.umd.js.br +0 -0
  68. package/dist/jb-select.umd.js.gz +0 -0
  69. package/dist/jb-select.umd.js.map +0 -1
package/lib/types.ts CHANGED
@@ -1,11 +1,9 @@
1
- export type JBSelectCallbacks<TOption,TValue> = {
2
- getOptionTitle: (option:TOption) => string;
3
- getOptionValue?: (option:TOption) => TValue;
4
- getOptionDOM: null | ((option:TOption, onSelectCallback:(e:MouseEvent)=>void, isSelected:boolean) => HTMLElement);
5
- getSelectedValueDOM: null | ((option:TOption) => HTMLElement);
1
+ import { type JBOptionWebComponent } from "./jb-option/jb-option";
2
+
3
+ export type JBSelectCallbacks<TValue> = {
4
+ getSelectedValueDOM?:(value:TValue,content:HTMLElement) => HTMLElement;
6
5
  }
7
- //TODO: create real custom element for select options
8
- export type JBSelectOptionElement<TOption> = HTMLElement & {value?: TOption};
6
+
9
7
  export type JBSelectElements = {
10
8
  input: HTMLInputElement,
11
9
  componentWrapper: HTMLDivElement,
@@ -13,6 +11,7 @@ export type JBSelectElements = {
13
11
  messageBox:HTMLDivElement,
14
12
  optionList: HTMLDivElement,
15
13
  optionListWrapper: HTMLDivElement,
14
+ optionListSlot:HTMLSlotElement,
16
15
  arrowIcon: HTMLDivElement,
17
16
  label:{
18
17
  wrapper: HTMLLabelElement,
@@ -20,8 +19,8 @@ export type JBSelectElements = {
20
19
  },
21
20
  emptyListPlaceholder: HTMLDivElement,
22
21
  }
23
- export type ValidationValue<TOption,TValue> = {
24
- selectedOption:TOption | null,
22
+ export type ValidationValue<TValue> = {
23
+ selectedOption:JBOptionWebComponent<TValue> | null,
25
24
  value:TValue | null,
26
25
  inputtedText:string
27
26
  }
package/package.json CHANGED
@@ -12,16 +12,18 @@
12
12
  "select",
13
13
  "web component"
14
14
  ],
15
- "version": "5.3.2",
15
+ "version": "6.0.0",
16
16
  "bugs": "https://github.com/javadbat/jb-select/issues",
17
17
  "license": "MIT",
18
18
  "files": [
19
19
  "LICENSE",
20
20
  "README.md",
21
21
  "lib/",
22
- "dist/"
22
+ "dist/",
23
+ "react/",
24
+ "react/dist/"
23
25
  ],
24
- "types": "./dist/web-component/jb-select/lib/jb-select.d.ts",
26
+ "types": "./dist/web-component/jb-select/lib/index.d.ts",
25
27
  "main": "index.js",
26
28
  "repository": {
27
29
  "type": "git",
@@ -0,0 +1,188 @@
1
+ # jb-select-react
2
+
3
+ select component for react
4
+
5
+ > this component is a react wrapper for [jb-select](https://github.com/javadbat/jb-select)
6
+
7
+ ## installation
8
+
9
+ run `npm install jb-select` to install package with npm
10
+
11
+ ## usage
12
+
13
+ use below syntax in your render function.
14
+ ```jsx
15
+ import {JBSelect} from 'jb-select/react';
16
+
17
+ <JBSelect></JBSelect>
18
+ ```
19
+
20
+ ### label
21
+ use label property to describe your select component.
22
+
23
+ ```jsx
24
+ <JBSelect label='your label name' ></JBSelect>
25
+ ```
26
+
27
+ ## option list
28
+ if you want to add option to jb-select, you have 2 way:
29
+
30
+ - use `<JBOption>`
31
+ - use `<jbOptionList>`
32
+
33
+ ### using `JBOption`:
34
+
35
+ using `JBOption` is quite an easy job:
36
+
37
+ ```jsx
38
+ import {JBSelect,JBOption} from 'jb-select/react';
39
+
40
+ <JBSelect label="gender">
41
+ <JBOption value="male">Male</JBOption>
42
+ <JBOption value="female">Female</JBOption>
43
+ <JBOption value="0">Other</JBOption>
44
+ </JBSelect>
45
+ //or
46
+ const optionList = ["1","2","3"]
47
+ <JBSelect { ...args}>
48
+ {
49
+ optionList.map((option)=>(<JBOption key={option} value={option}>{option}</JBOption>))
50
+ }
51
+ </JBSelect>
52
+ ```
53
+ you can also set object or any other data type as an value
54
+ ```jsx
55
+ const [colorList] = useState([
56
+ {
57
+ id: 1,
58
+ name: "Red",
59
+ value: "#f00",
60
+ },
61
+ {
62
+ id: 2,
63
+ name: "Green",
64
+ value: "#0f0",
65
+ },
66
+ {
67
+ id: 3,
68
+ name: "Blue",
69
+ value: "#00f",
70
+ },
71
+ {
72
+ id: 4,
73
+ name: "Yellow",
74
+ value: "#ff0",
75
+ },
76
+ ]);
77
+ //this function is used to create selected value dom and can be styled using jb-select::part.
78
+ function getSelectedValueDOM(option) {
79
+ const optionElement = document.createElement("div");
80
+ optionElement.classList.add("selected-value");
81
+ optionElement.innerHTML =
82
+ '<span part="color-box" style="background-color:' + option.value +
83
+ ';width:16px;height:16px;display:inline-block;"></span>' + "&nbsp;" +
84
+ option.name;
85
+ return optionElement;
86
+ }
87
+ return(
88
+ <JBSelect label="normal" getSelectedValueDOM={getSelectedValueDOM}>
89
+ {
90
+ colorList.map((color)=>{
91
+ return (<JBOption key={color.value} value={color}><span className="color-circle" style={{backgroundColor:color.value}}></span>{color.name}</JBOption>);
92
+ })
93
+ }
94
+ </JBSelect>
95
+ )
96
+ ```
97
+ ### using `jbOptionList`:
98
+ `JBOptionList` will create options for you and it's good for when you want some easy to use options without complexity of update & manage JSX and it's a little faster for high performance app
99
+
100
+ example:
101
+
102
+ ```jsx
103
+ import {JBSelect,JBOptionList} from 'jb-select/react';
104
+
105
+ render(){
106
+ const list = [{name:'reza',family:'asadi',userId:1},{name:'peter',family:'peterson',userId:2}];
107
+ getOptionTitle:(option)=>{
108
+ return `${option.name} ${option.family}`;
109
+ },
110
+ getOptionValue:(option)=>{
111
+ return option.userId;
112
+ }
113
+ return(
114
+ <JBSelect label='your label name' >
115
+ <JBOptionList optionList={list} getTitle={getOptionTitle} getValue={getOptionValue}/>
116
+ </JBSelect>;
117
+ );
118
+ }
119
+ ```
120
+
121
+ ### Add Icon or Any Element into box
122
+
123
+ sometimes you want to add icon into the select box before value box.
124
+ you can customize this entire section by adding a div or any other Tag with the `slot="start-section"`
125
+
126
+ like the example the below:
127
+
128
+ ```jsx
129
+ <JBSelect>
130
+ <div slot="start-section">
131
+ <img class="your-custom-icon" src="./path/to/file.svg">
132
+ </div>
133
+ </JBSelect>
134
+ ```
135
+
136
+ ### set custom style
137
+
138
+ in some cases in your project you need to change defualt style of the component for example you need zero margin or different border-radius and etc.
139
+ if you want to set a custom style to this component all you need is to set css variable.
140
+ | css variable name | description |
141
+ | ------------- | ------------- |
142
+ | --jb-select-margin | web-component margin default is `0 0` |
143
+ | --jb-select-width | change the select component width default is `100%` |
144
+ | --jb-select-border-radius | web-component border-radius defualt is `16px` |
145
+ | --jb-select-border-color | border color of select in normal mode |
146
+ | --jb-select-border-color-selected | border color when user select a value from list |
147
+ | --jb-select-bgcolor | background color of input |
148
+ | --jb-select-overlay-bgcolor | background of select overlay when open in mobile and tablet screen |
149
+ | --jb-select-list-max-height | max height of option list |
150
+ | --jb-select-border-bottom-width | width of border bottom |
151
+ | --jb-select-border-width | width of border |
152
+ | --jb-select-label-color | color of label default is `#1f1735` |
153
+ | --jb-input-label-font-size | label font size default is `0.8em` |
154
+ | --jb-input-label-font-weight | color of label defualt is `#1f1735` |
155
+ | --jb-select-option-color | change option text color |
156
+ | --jb-select-option-color-hover | change option text color on hover |
157
+ | --jb-select-option-background-color | background of options default is `transparent` |
158
+ | --jb-select-option-background-color-hover | background of options on mouse hover default is `#1073db` |
159
+ | --jb-select-input-color | color of input value |
160
+ | --jb-select-bgcolor-selected | set background color for selected status |
161
+ | --jb-select-selected-value-color | selected value text color default is `#1f1735` |
162
+ | --jb-select-selected-value-font-size | font-size of selected value default is `1.1rem` |
163
+ | --jb-select-message-color | message text color default is `#929292` |
164
+ | --jb-select-message-font-size | font size of message default is `0.7em` |
165
+ | --jb-select-message-font-weight | font weight of message box default is `normal` |
166
+ | --jb-select-placeholder-color | placeholder color default is `initial` |
167
+ | --jb-select-placeholder-font-size | placeholder font-size default is `1.1em` |
168
+ | --jb-select-height | jb-select box height |
169
+ | --jb-select-mobile-search-input-height | when user open select on mobile there is a search box input this var will set its height |
170
+ | --jb-select-mobile-item-list-margin | when user open select on mobile there is gap between search box & list that can be customized |
171
+ | --jb-select-list-padding | padding of opened list box default is `16px 0` |
172
+ | --jb-select-close-bg-color | close button bg-color default is `#1f1735` |
173
+ | --jb-select-close-x-color | close button x color default is `#fff` |
174
+ | --jb-select-close-bg-opacity | close button bg opacity default is `0.4` |
175
+ | --jb-select-mobile-input-bgcolor | background color search input when open in mobile |
176
+ | --jb-select-mobile-search-border-width | when user open select on mobile, search box can have its own border width config |
177
+ | --jb-select-mobile-search-border-color | when user open select on mobile, search box can have its own border color config |
178
+ | --jb-select-mobile-search-border-bottom-width | when user open select on mobile, search box can have its own border bottom width config |
179
+ | --jb-select-mobile-search-border-bottom-color | when user open select on mobile, search box can have its own border bottom color config |
180
+ | --jb-select-mobile-search-border-radius | when user open select on mobile, search box can have its own border radius |
181
+ | --jb-select-middle-div-height | separator line between input and list default is `0px` and hidden but you can cahange it |
182
+ | --jb-select-middle-div-color | change separator line color |
183
+ | --jb-select-middle-div-margin | change seprator line margin |
184
+ | --jb-select-middle-div-mobile-margin | change separator line margin in mobile modal |
185
+ | --jb-select-middle-div-radius | change separator line border-radius |
186
+ | --jb-select-list-scroll-color | list item scroll color default is `#c3c3c3` |
187
+ | --jb-select-list-scroll-border-radius | list item scroll border-radius default is `4px` |
188
+ | --jb-select-select-box-margin | margin of internal element called select box that wrapper display element of form in one box |
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ export declare function useEvent(dom: HTMLElement, event: any, handler: any, passive?: boolean): void;
3
+ export declare function useBindEvent<TRef extends React.MutableRefObject<any | null>, TEvent>(ref: TRef, event: string, handler: (e: TEvent) => void, passive?: boolean): void;
@@ -0,0 +1,4 @@
1
+ import { MutableRefObject } from "react";
2
+ type InitFunc<T> = () => T;
3
+ export declare const useLazyRef: <T>(initValFunc: InitFunc<T>) => MutableRefObject<any>;
4
+ export {};
@@ -0,0 +1,4 @@
1
+ type Initializers = any[];
2
+ type Constructor<T extends object = object> = new (...args: any[]) => T;
3
+ export declare const useMobx: <T extends object>(Store: Constructor<T>, initializers: Initializers) => T;
4
+ export {};
@@ -0,0 +1 @@
1
+ export declare const isMobile: () => boolean;
@@ -0,0 +1,3 @@
1
+ declare function faToEnDigits(input: string | number): string;
2
+ declare function enToFaDigits(input: string | number): string;
3
+ export { enToFaDigits, faToEnDigits };
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ require('jb-select');
5
+
6
+ /* eslint-disable react/display-name */
7
+ const JBOptionList = React.forwardRef((props, ref) => {
8
+ const element = React.useRef(null);
9
+ React.useImperativeHandle(ref, () => (element ? element.current : undefined), [element]);
10
+ React.useEffect(() => {
11
+ if (element.current && Array.isArray(props.optionList)) {
12
+ element.current.optionList = props.optionList;
13
+ }
14
+ }, [props.optionList, element]);
15
+ React.useEffect(() => {
16
+ if (element.current && typeof props.getTitle == "function") {
17
+ element.current.setCallback("getTitle", props.getTitle);
18
+ }
19
+ }, [props.getTitle, element]);
20
+ React.useEffect(() => {
21
+ if (element.current && typeof props.getValue == "function") {
22
+ element.current.setCallback("getValue", props.getValue);
23
+ }
24
+ }, [props.getValue, element]);
25
+ React.useEffect(() => {
26
+ if (element.current && typeof props.getContentDOM == "function") {
27
+ element.current.setCallback("getContentDOM", props.getContentDOM);
28
+ }
29
+ }, [props.getContentDOM, element]);
30
+ return (React.createElement("jb-option-list", { ref: element }));
31
+ });
32
+ JBOptionList.displayName = 'JBOptionList';
33
+
34
+ function useBindEvent(ref, event, handler, passive = false) {
35
+ React.useEffect(() => {
36
+ const dom = ref.current;
37
+ if (dom) {
38
+ // initiate the event handler
39
+ dom.addEventListener(event, handler, passive);
40
+ }
41
+ // this will clean up the event every time the component is re-rendered
42
+ return function cleanup() {
43
+ if (dom) {
44
+ dom.removeEventListener(event, handler, passive);
45
+ }
46
+ };
47
+ }, [ref, event, handler, passive]);
48
+ }
49
+
50
+ /* eslint-disable react/display-name */
51
+ const JBSelect = React.forwardRef((props, ref) => {
52
+ const element = React.useRef(null);
53
+ const [refChangeCount, refChangeCountSetter] = React.useState(0);
54
+ React.useImperativeHandle(ref, () => (element ? element.current : {}), [element]);
55
+ React.useEffect(() => {
56
+ refChangeCountSetter(refChangeCount + 1);
57
+ }, [element.current]);
58
+ React.useEffect(() => {
59
+ if (element.current) {
60
+ element.current.value = props.value;
61
+ }
62
+ }, [props.value]);
63
+ React.useEffect(() => {
64
+ if (typeof props.getSelectedValueDOM == "function" && element.current && element.current) {
65
+ element.current.callbacks.getSelectedValueDOM = props.getSelectedValueDOM;
66
+ }
67
+ }, [props.getSelectedValueDOM]);
68
+ React.useEffect(() => {
69
+ if (props.message !== null && props.message !== undefined) {
70
+ element.current?.setAttribute("message", props.message);
71
+ }
72
+ }, [props.message]);
73
+ React.useEffect(() => {
74
+ if (props.placeholder !== null && props.placeholder !== undefined) {
75
+ element.current?.setAttribute("placeholder", props.placeholder);
76
+ }
77
+ }, [props.placeholder]);
78
+ React.useEffect(() => {
79
+ if (props.searchPlaceholder !== null && props.searchPlaceholder !== undefined) {
80
+ element.current?.setAttribute("search-placeholder", props.searchPlaceholder);
81
+ }
82
+ }, [props.searchPlaceholder]);
83
+ function onKeyup(e) {
84
+ if (typeof props.onKeyup == "function") {
85
+ props.onKeyup(e);
86
+ }
87
+ }
88
+ function onChange(e) {
89
+ if (typeof props.onChange == "function") {
90
+ props.onChange(e);
91
+ }
92
+ }
93
+ function onInput(e) {
94
+ if (typeof props.onInput == "function") {
95
+ props.onInput(e);
96
+ }
97
+ }
98
+ useBindEvent(element, 'keyup', onKeyup);
99
+ useBindEvent(element, 'change', onChange);
100
+ useBindEvent(element, 'input', onInput);
101
+ return (React.createElement("jb-select", { style: props.style ? props.style : undefined, class: props.className ? props.className : "", label: props.label, ref: element, required: props.required || 'false', name: props.name ?? undefined }, props.children));
102
+ });
103
+ JBSelect.displayName = 'JBSelect';
104
+
105
+ /* eslint-disable react/display-name */
106
+ const JBOption = React.forwardRef((props, ref) => {
107
+ const element = React.useRef(null);
108
+ const { value, children, className, ...rest } = props;
109
+ React.useImperativeHandle(ref, () => (element ? element.current : undefined), [element]);
110
+ React.useEffect(() => {
111
+ if (element.current && value !== undefined) {
112
+ element.current.value = value;
113
+ }
114
+ }, [value, element]);
115
+ return (React.createElement("jb-option", { class: className, ref: element, ...rest }, children));
116
+ });
117
+ JBOption.displayName = 'JBOption';
118
+
119
+ exports.JBOption = JBOption;
120
+ exports.JBOptionList = JBOptionList;
121
+ exports.JBSelect = JBSelect;
122
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../lib/JBOptionList.tsx","../../../../common/hooks/use-event.ts","../lib/JBSelect.tsx","../lib/JBOption.tsx"],"sourcesContent":["/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useImperativeHandle } from 'react';\r\n// eslint-disable-next-line no-duplicate-imports\r\nimport { JBOptionListWebComponent } from 'jb-select';\r\ntype TOption = any;\r\ntype TValue = any;\r\n\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-option-list': JBOptionListType;\r\n }\r\n interface JBOptionListType extends React.DetailedHTMLProps<React.HTMLAttributes<JBOptionListWebComponent<TOption, TValue>>, JBOptionListWebComponent<TOption, TValue>> {\r\n class?: string,\r\n // ref:React.RefObject<JBDateInputWebComponent>,\r\n }\r\n }\r\n}\r\nexport const JBOptionList = React.forwardRef((props: JBOptionListProps<TOption,TValue>, ref) => {\r\n const element = useRef<JBOptionListWebComponent<TOption, TValue>>(null);\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : undefined),\r\n [element],\r\n );\r\n useEffect(() => {\r\n if (element.current && Array.isArray(props.optionList)) {\r\n element.current.optionList = props.optionList;\r\n }\r\n }, [props.optionList, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getTitle == \"function\") {\r\n element.current.setCallback(\"getTitle\",props.getTitle);\r\n }\r\n }, [props.getTitle, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getValue == \"function\") {\r\n element.current.setCallback(\"getValue\",props.getValue);\r\n }\r\n }, [props.getValue, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getContentDOM == \"function\") {\r\n element.current.setCallback(\"getContentDOM\",props.getContentDOM);\r\n }\r\n }, [props.getContentDOM, element]);\r\n return (\r\n <jb-option-list ref={element}>\r\n </jb-option-list>\r\n );\r\n});\r\n\r\nexport type JBOptionListProps<TOption,TValue> = {\r\n optionList: TOption[],\r\n getTitle?: (option: TOption) => string,\r\n getValue?: (option: TOption) => TValue,\r\n getContentDOM?: (option: TOption) => HTMLElement,\r\n}\r\nJBOptionList.displayName = 'JBOptionList';","import { useEffect } from \"react\";\r\n\r\nexport function useEvent(dom:HTMLElement, event:any, handler:any, passive = false) {\r\n useEffect(() => {\r\n if (dom) {\r\n // initiate the event handler\r\n dom.addEventListener(event, handler, passive); \r\n }\r\n // this will clean up the event every time the component is re-rendered\r\n return function cleanup() {\r\n if(dom){\r\n dom.removeEventListener(event, handler, passive);\r\n }\r\n };\r\n });\r\n}\r\nexport function useBindEvent<TRef extends React.MutableRefObject<any|null>,TEvent>(ref:TRef, event:string, handler:(e:TEvent)=>void, passive = false) {\r\n useEffect(() => {\r\n const dom = ref.current;\r\n if (dom) {\r\n // initiate the event handler\r\n dom.addEventListener(event, handler, passive); \r\n }\r\n // this will clean up the event every time the component is re-rendered\r\n return function cleanup() {\r\n if(dom){\r\n dom.removeEventListener(event, handler, passive);\r\n }\r\n };\r\n },[ref,event,handler,passive]);\r\n}","/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useState, useImperativeHandle,CSSProperties } from 'react';\r\nimport 'jb-select';\r\nimport { useBindEvent } from '../../../../common/hooks/use-event.js';\r\n// eslint-disable-next-line no-duplicate-imports\r\nimport { JBSelectWebComponent } from 'jb-select';\r\nexport type JBSelectEventType<T> = T & {\r\n target: JBSelectWebComponent\r\n}\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-select': JBSelectType;\r\n }\r\n interface JBSelectType extends React.DetailedHTMLProps<React.HTMLAttributes<JBSelectWebComponent>, JBSelectWebComponent> {\r\n class?:string,\r\n label?: string,\r\n name?:string,\r\n required?:string | boolean,\r\n message?:string,\r\n tabindex?:string,\r\n // ref:React.RefObject<JBDateInputWebComponent>,\r\n }\r\n }\r\n}\r\n\r\nexport const JBSelect = React.forwardRef((props:JBSelectProps, ref) => {\r\n const element = useRef<JBSelectWebComponent>(null);\r\n const [refChangeCount, refChangeCountSetter] = useState(0);\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : {}),\r\n [element],\r\n );\r\n useEffect(() => {\r\n refChangeCountSetter(refChangeCount + 1);\r\n }, [element.current]);\r\n useEffect(() => {\r\n if(element.current){\r\n element.current.value = props.value;\r\n }\r\n }, [props.value]);\r\n useEffect(() => {\r\n if (typeof props.getSelectedValueDOM == \"function\" && element.current && element.current) {\r\n element.current.callbacks.getSelectedValueDOM = props.getSelectedValueDOM;\r\n }\r\n }, [props.getSelectedValueDOM]);\r\n useEffect(() => {\r\n if (props.message !== null && props.message !== undefined ) {\r\n element.current?.setAttribute(\"message\", props.message);\r\n }\r\n }, [props.message]);\r\n useEffect(() => {\r\n if (props.placeholder !== null && props.placeholder !== undefined) {\r\n element.current?.setAttribute(\"placeholder\", props.placeholder);\r\n }\r\n }, [props.placeholder]);\r\n useEffect(() => {\r\n if (props.searchPlaceholder !== null && props.searchPlaceholder !== undefined) {\r\n element.current?.setAttribute(\"search-placeholder\", props.searchPlaceholder);\r\n }\r\n }, [props.searchPlaceholder]);\r\n function onKeyup(e:JBSelectEventType<KeyboardEvent>) {\r\n if ( typeof props.onKeyup == \"function\") {\r\n props.onKeyup(e);\r\n }\r\n }\r\n function onChange(e:JBSelectEventType<Event>) {\r\n if (typeof props.onChange ==\"function\") {\r\n props.onChange(e);\r\n }\r\n }\r\n function onInput(e:JBSelectEventType<InputEvent>) {\r\n if (typeof props.onInput == \"function\") {\r\n props.onInput(e);\r\n }\r\n }\r\n useBindEvent(element, 'keyup', onKeyup);\r\n useBindEvent(element, 'change', onChange);\r\n useBindEvent(element, 'input', onInput);\r\n return (\r\n <jb-select style={props.style?props.style:undefined} class={props.className?props.className:\"\"} label={props.label} ref={element} required={props.required || 'false'} name={props.name??undefined}>\r\n {props.children}\r\n </jb-select>\r\n );\r\n});\r\n\r\nexport type JBSelectProps = {\r\n style?:CSSProperties,\r\n label?: string,\r\n getSelectedValueDOM?: (option:any)=>HTMLElement,\r\n value?: any,\r\n onChange?: (e:JBSelectEventType<Event>)=>void,\r\n onKeyup?: (e:JBSelectEventType<KeyboardEvent>)=>void,\r\n onInput?: (e:JBSelectEventType<InputEvent>)=>void,\r\n required?: boolean,\r\n message?: string,\r\n placeholder?: string,\r\n searchPlaceholder?: string,\r\n className?: string,\r\n children?:React.ReactNode,\r\n name?:string\r\n}\r\nJBSelect.displayName = 'JBSelect';","/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useImperativeHandle, PropsWithChildren, ComponentProps } from 'react';\r\nimport { JBOptionWebComponent } from 'jb-select';\r\n//TODO: make it generic when remove forward ref\r\ntype TValue = any;\r\n\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-option': JBOptionType;\r\n }\r\n interface JBOptionType extends React.DetailedHTMLProps<React.HTMLAttributes<JBOptionWebComponent<TValue>>, JBOptionWebComponent<TValue>> {\r\n class?: string,\r\n }\r\n }\r\n}\r\nexport const JBOption = React.forwardRef((props: JBOptionProps<TValue>, ref) => {\r\n const element = useRef<JBOptionWebComponent<TValue>>(null);\r\n const {value,children,className, ...rest} = props;\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : undefined),\r\n [element],\r\n );\r\n \r\n useEffect(() => {\r\n if (element.current && value !== undefined) {\r\n element.current.value = value;\r\n }\r\n }, [value, element]);\r\n\r\n return (\r\n <jb-option class={className} ref={element} {...rest}>\r\n {children}\r\n </jb-option>\r\n );\r\n});\r\n\r\ntype Props<TValue> = {\r\n value:TValue\r\n}\r\n\r\nexport type JBOptionProps<TValue> = PropsWithChildren<JSX.JBOptionType & Props<TValue>>\r\nJBOption.displayName = 'JBOption';"],"names":["useRef","useImperativeHandle","useEffect","useState"],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import React, { useRef, useImperativeHandle, useEffect, useState } from 'react';
2
+ import 'jb-select';
3
+
4
+ /* eslint-disable react/display-name */
5
+ const JBOptionList = React.forwardRef((props, ref) => {
6
+ const element = useRef(null);
7
+ useImperativeHandle(ref, () => (element ? element.current : undefined), [element]);
8
+ useEffect(() => {
9
+ if (element.current && Array.isArray(props.optionList)) {
10
+ element.current.optionList = props.optionList;
11
+ }
12
+ }, [props.optionList, element]);
13
+ useEffect(() => {
14
+ if (element.current && typeof props.getTitle == "function") {
15
+ element.current.setCallback("getTitle", props.getTitle);
16
+ }
17
+ }, [props.getTitle, element]);
18
+ useEffect(() => {
19
+ if (element.current && typeof props.getValue == "function") {
20
+ element.current.setCallback("getValue", props.getValue);
21
+ }
22
+ }, [props.getValue, element]);
23
+ useEffect(() => {
24
+ if (element.current && typeof props.getContentDOM == "function") {
25
+ element.current.setCallback("getContentDOM", props.getContentDOM);
26
+ }
27
+ }, [props.getContentDOM, element]);
28
+ return (React.createElement("jb-option-list", { ref: element }));
29
+ });
30
+ JBOptionList.displayName = 'JBOptionList';
31
+
32
+ function useBindEvent(ref, event, handler, passive = false) {
33
+ useEffect(() => {
34
+ const dom = ref.current;
35
+ if (dom) {
36
+ // initiate the event handler
37
+ dom.addEventListener(event, handler, passive);
38
+ }
39
+ // this will clean up the event every time the component is re-rendered
40
+ return function cleanup() {
41
+ if (dom) {
42
+ dom.removeEventListener(event, handler, passive);
43
+ }
44
+ };
45
+ }, [ref, event, handler, passive]);
46
+ }
47
+
48
+ /* eslint-disable react/display-name */
49
+ const JBSelect = React.forwardRef((props, ref) => {
50
+ const element = useRef(null);
51
+ const [refChangeCount, refChangeCountSetter] = useState(0);
52
+ useImperativeHandle(ref, () => (element ? element.current : {}), [element]);
53
+ useEffect(() => {
54
+ refChangeCountSetter(refChangeCount + 1);
55
+ }, [element.current]);
56
+ useEffect(() => {
57
+ if (element.current) {
58
+ element.current.value = props.value;
59
+ }
60
+ }, [props.value]);
61
+ useEffect(() => {
62
+ if (typeof props.getSelectedValueDOM == "function" && element.current && element.current) {
63
+ element.current.callbacks.getSelectedValueDOM = props.getSelectedValueDOM;
64
+ }
65
+ }, [props.getSelectedValueDOM]);
66
+ useEffect(() => {
67
+ if (props.message !== null && props.message !== undefined) {
68
+ element.current?.setAttribute("message", props.message);
69
+ }
70
+ }, [props.message]);
71
+ useEffect(() => {
72
+ if (props.placeholder !== null && props.placeholder !== undefined) {
73
+ element.current?.setAttribute("placeholder", props.placeholder);
74
+ }
75
+ }, [props.placeholder]);
76
+ useEffect(() => {
77
+ if (props.searchPlaceholder !== null && props.searchPlaceholder !== undefined) {
78
+ element.current?.setAttribute("search-placeholder", props.searchPlaceholder);
79
+ }
80
+ }, [props.searchPlaceholder]);
81
+ function onKeyup(e) {
82
+ if (typeof props.onKeyup == "function") {
83
+ props.onKeyup(e);
84
+ }
85
+ }
86
+ function onChange(e) {
87
+ if (typeof props.onChange == "function") {
88
+ props.onChange(e);
89
+ }
90
+ }
91
+ function onInput(e) {
92
+ if (typeof props.onInput == "function") {
93
+ props.onInput(e);
94
+ }
95
+ }
96
+ useBindEvent(element, 'keyup', onKeyup);
97
+ useBindEvent(element, 'change', onChange);
98
+ useBindEvent(element, 'input', onInput);
99
+ return (React.createElement("jb-select", { style: props.style ? props.style : undefined, class: props.className ? props.className : "", label: props.label, ref: element, required: props.required || 'false', name: props.name ?? undefined }, props.children));
100
+ });
101
+ JBSelect.displayName = 'JBSelect';
102
+
103
+ /* eslint-disable react/display-name */
104
+ const JBOption = React.forwardRef((props, ref) => {
105
+ const element = useRef(null);
106
+ const { value, children, className, ...rest } = props;
107
+ useImperativeHandle(ref, () => (element ? element.current : undefined), [element]);
108
+ useEffect(() => {
109
+ if (element.current && value !== undefined) {
110
+ element.current.value = value;
111
+ }
112
+ }, [value, element]);
113
+ return (React.createElement("jb-option", { class: className, ref: element, ...rest }, children));
114
+ });
115
+ JBOption.displayName = 'JBOption';
116
+
117
+ export { JBOption, JBOptionList, JBSelect };
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../lib/JBOptionList.tsx","../../../../common/hooks/use-event.ts","../lib/JBSelect.tsx","../lib/JBOption.tsx"],"sourcesContent":["/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useImperativeHandle } from 'react';\r\n// eslint-disable-next-line no-duplicate-imports\r\nimport { JBOptionListWebComponent } from 'jb-select';\r\ntype TOption = any;\r\ntype TValue = any;\r\n\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-option-list': JBOptionListType;\r\n }\r\n interface JBOptionListType extends React.DetailedHTMLProps<React.HTMLAttributes<JBOptionListWebComponent<TOption, TValue>>, JBOptionListWebComponent<TOption, TValue>> {\r\n class?: string,\r\n // ref:React.RefObject<JBDateInputWebComponent>,\r\n }\r\n }\r\n}\r\nexport const JBOptionList = React.forwardRef((props: JBOptionListProps<TOption,TValue>, ref) => {\r\n const element = useRef<JBOptionListWebComponent<TOption, TValue>>(null);\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : undefined),\r\n [element],\r\n );\r\n useEffect(() => {\r\n if (element.current && Array.isArray(props.optionList)) {\r\n element.current.optionList = props.optionList;\r\n }\r\n }, [props.optionList, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getTitle == \"function\") {\r\n element.current.setCallback(\"getTitle\",props.getTitle);\r\n }\r\n }, [props.getTitle, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getValue == \"function\") {\r\n element.current.setCallback(\"getValue\",props.getValue);\r\n }\r\n }, [props.getValue, element]);\r\n useEffect(() => {\r\n if (element.current && typeof props.getContentDOM == \"function\") {\r\n element.current.setCallback(\"getContentDOM\",props.getContentDOM);\r\n }\r\n }, [props.getContentDOM, element]);\r\n return (\r\n <jb-option-list ref={element}>\r\n </jb-option-list>\r\n );\r\n});\r\n\r\nexport type JBOptionListProps<TOption,TValue> = {\r\n optionList: TOption[],\r\n getTitle?: (option: TOption) => string,\r\n getValue?: (option: TOption) => TValue,\r\n getContentDOM?: (option: TOption) => HTMLElement,\r\n}\r\nJBOptionList.displayName = 'JBOptionList';","import { useEffect } from \"react\";\r\n\r\nexport function useEvent(dom:HTMLElement, event:any, handler:any, passive = false) {\r\n useEffect(() => {\r\n if (dom) {\r\n // initiate the event handler\r\n dom.addEventListener(event, handler, passive); \r\n }\r\n // this will clean up the event every time the component is re-rendered\r\n return function cleanup() {\r\n if(dom){\r\n dom.removeEventListener(event, handler, passive);\r\n }\r\n };\r\n });\r\n}\r\nexport function useBindEvent<TRef extends React.MutableRefObject<any|null>,TEvent>(ref:TRef, event:string, handler:(e:TEvent)=>void, passive = false) {\r\n useEffect(() => {\r\n const dom = ref.current;\r\n if (dom) {\r\n // initiate the event handler\r\n dom.addEventListener(event, handler, passive); \r\n }\r\n // this will clean up the event every time the component is re-rendered\r\n return function cleanup() {\r\n if(dom){\r\n dom.removeEventListener(event, handler, passive);\r\n }\r\n };\r\n },[ref,event,handler,passive]);\r\n}","/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useState, useImperativeHandle,CSSProperties } from 'react';\r\nimport 'jb-select';\r\nimport { useBindEvent } from '../../../../common/hooks/use-event.js';\r\n// eslint-disable-next-line no-duplicate-imports\r\nimport { JBSelectWebComponent } from 'jb-select';\r\nexport type JBSelectEventType<T> = T & {\r\n target: JBSelectWebComponent\r\n}\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-select': JBSelectType;\r\n }\r\n interface JBSelectType extends React.DetailedHTMLProps<React.HTMLAttributes<JBSelectWebComponent>, JBSelectWebComponent> {\r\n class?:string,\r\n label?: string,\r\n name?:string,\r\n required?:string | boolean,\r\n message?:string,\r\n tabindex?:string,\r\n // ref:React.RefObject<JBDateInputWebComponent>,\r\n }\r\n }\r\n}\r\n\r\nexport const JBSelect = React.forwardRef((props:JBSelectProps, ref) => {\r\n const element = useRef<JBSelectWebComponent>(null);\r\n const [refChangeCount, refChangeCountSetter] = useState(0);\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : {}),\r\n [element],\r\n );\r\n useEffect(() => {\r\n refChangeCountSetter(refChangeCount + 1);\r\n }, [element.current]);\r\n useEffect(() => {\r\n if(element.current){\r\n element.current.value = props.value;\r\n }\r\n }, [props.value]);\r\n useEffect(() => {\r\n if (typeof props.getSelectedValueDOM == \"function\" && element.current && element.current) {\r\n element.current.callbacks.getSelectedValueDOM = props.getSelectedValueDOM;\r\n }\r\n }, [props.getSelectedValueDOM]);\r\n useEffect(() => {\r\n if (props.message !== null && props.message !== undefined ) {\r\n element.current?.setAttribute(\"message\", props.message);\r\n }\r\n }, [props.message]);\r\n useEffect(() => {\r\n if (props.placeholder !== null && props.placeholder !== undefined) {\r\n element.current?.setAttribute(\"placeholder\", props.placeholder);\r\n }\r\n }, [props.placeholder]);\r\n useEffect(() => {\r\n if (props.searchPlaceholder !== null && props.searchPlaceholder !== undefined) {\r\n element.current?.setAttribute(\"search-placeholder\", props.searchPlaceholder);\r\n }\r\n }, [props.searchPlaceholder]);\r\n function onKeyup(e:JBSelectEventType<KeyboardEvent>) {\r\n if ( typeof props.onKeyup == \"function\") {\r\n props.onKeyup(e);\r\n }\r\n }\r\n function onChange(e:JBSelectEventType<Event>) {\r\n if (typeof props.onChange ==\"function\") {\r\n props.onChange(e);\r\n }\r\n }\r\n function onInput(e:JBSelectEventType<InputEvent>) {\r\n if (typeof props.onInput == \"function\") {\r\n props.onInput(e);\r\n }\r\n }\r\n useBindEvent(element, 'keyup', onKeyup);\r\n useBindEvent(element, 'change', onChange);\r\n useBindEvent(element, 'input', onInput);\r\n return (\r\n <jb-select style={props.style?props.style:undefined} class={props.className?props.className:\"\"} label={props.label} ref={element} required={props.required || 'false'} name={props.name??undefined}>\r\n {props.children}\r\n </jb-select>\r\n );\r\n});\r\n\r\nexport type JBSelectProps = {\r\n style?:CSSProperties,\r\n label?: string,\r\n getSelectedValueDOM?: (option:any)=>HTMLElement,\r\n value?: any,\r\n onChange?: (e:JBSelectEventType<Event>)=>void,\r\n onKeyup?: (e:JBSelectEventType<KeyboardEvent>)=>void,\r\n onInput?: (e:JBSelectEventType<InputEvent>)=>void,\r\n required?: boolean,\r\n message?: string,\r\n placeholder?: string,\r\n searchPlaceholder?: string,\r\n className?: string,\r\n children?:React.ReactNode,\r\n name?:string\r\n}\r\nJBSelect.displayName = 'JBSelect';","/* eslint-disable react/display-name */\r\nimport React, { useEffect, useRef, useImperativeHandle, PropsWithChildren, ComponentProps } from 'react';\r\nimport { JBOptionWebComponent } from 'jb-select';\r\n//TODO: make it generic when remove forward ref\r\ntype TValue = any;\r\n\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'jb-option': JBOptionType;\r\n }\r\n interface JBOptionType extends React.DetailedHTMLProps<React.HTMLAttributes<JBOptionWebComponent<TValue>>, JBOptionWebComponent<TValue>> {\r\n class?: string,\r\n }\r\n }\r\n}\r\nexport const JBOption = React.forwardRef((props: JBOptionProps<TValue>, ref) => {\r\n const element = useRef<JBOptionWebComponent<TValue>>(null);\r\n const {value,children,className, ...rest} = props;\r\n useImperativeHandle(\r\n ref,\r\n () => (element ? element.current : undefined),\r\n [element],\r\n );\r\n \r\n useEffect(() => {\r\n if (element.current && value !== undefined) {\r\n element.current.value = value;\r\n }\r\n }, [value, element]);\r\n\r\n return (\r\n <jb-option class={className} ref={element} {...rest}>\r\n {children}\r\n </jb-option>\r\n );\r\n});\r\n\r\ntype Props<TValue> = {\r\n value:TValue\r\n}\r\n\r\nexport type JBOptionProps<TValue> = PropsWithChildren<JSX.JBOptionType & Props<TValue>>\r\nJBOption.displayName = 'JBOption';"],"names":[],"mappings":"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"}