ag-grid-autocomplete 1.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.
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/main.css +3 -0
- package/dist/main.css.map +1 -0
- package/package.json +116 -0
- package/types/ag-grid-autocomplete.d.ts +41 -0
- package/types/autocompleter/types.d.ts +39 -0
- package/types/index.d.ts +4 -0
- package/types/types.d.ts +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 - Andrew Valleteau
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# ag-grid-autocomplete
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/js/ag-grid-autocomplete)
|
|
4
|
+
[](https://github.com/gus-costa/ag-grid-autocomplete/actions/workflows/cd.yml)
|
|
5
|
+
|
|
6
|
+
**Transform AG Grid cells into intelligent search interfaces.**
|
|
7
|
+
|
|
8
|
+
A powerful autocomplete cell editor for [ag-Grid](https://github.com/ag-grid/ag-grid) that enhances data selection with typeahead functionality, grouping capabilities, and flexible data retrieval.
|
|
9
|
+
|
|
10
|
+
> **Note:** This package is a direct, drop-in replacement for `ag-grid-autocomplete-editor` with enhanced compatibility for AG Grid v23-v32 (v33 support coming soon!). All imports, APIs, and configurations work exactly the same - just update your package name!
|
|
11
|
+
|
|
12
|
+
## Why ag-grid-autocomplete?
|
|
13
|
+
|
|
14
|
+
Data grids often struggle with selection interfaces for large datasets. Traditional dropdowns become unwieldy, and free-text entry lacks validation. This component bridges that gap by providing:
|
|
15
|
+
|
|
16
|
+
- Intuitive typeahead search within grid cells
|
|
17
|
+
- Support for grouped options with visual hierarchy
|
|
18
|
+
- Local and remote data source flexibility
|
|
19
|
+
- Keyboard navigation and accessibility features
|
|
20
|
+
- Full compatibility with all AG Grid versions from v23 to v32
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install --save ag-grid-autocomplete
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
If migrating from ag-grid-autocomplete-editor:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm uninstall ag-grid-autocomplete-editor
|
|
32
|
+
npm install --save ag-grid-autocomplete
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Then update your imports:
|
|
36
|
+
|
|
37
|
+
```js
|
|
38
|
+
// Old import
|
|
39
|
+
import { AutocompleteSelectCellEditor } from 'ag-grid-autocomplete-editor';
|
|
40
|
+
import 'ag-grid-autocomplete-editor/dist/main.css';
|
|
41
|
+
|
|
42
|
+
// New import
|
|
43
|
+
import { AutocompleteSelectCellEditor } from 'ag-grid-autocomplete';
|
|
44
|
+
import 'ag-grid-autocomplete/dist/main.css';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Key Features
|
|
48
|
+
|
|
49
|
+
- **Simple Configuration** - Works with minimal setup using local data
|
|
50
|
+
- **Remote Data** - Fetch options from APIs with built-in debouncing
|
|
51
|
+
- **Grouped Options** - Organize related choices with intuitive grouping
|
|
52
|
+
- **Free Text Support** - Allow users to enter custom values when needed
|
|
53
|
+
- **Broad Compatibility** - Works with AG Grid v23 through v32
|
|
54
|
+
|
|
55
|
+
## Usage Examples
|
|
56
|
+
|
|
57
|
+
### Basic Local Data Autocomplete
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
// In your column definitions:
|
|
61
|
+
{
|
|
62
|
+
headerName: "Country",
|
|
63
|
+
field: "country",
|
|
64
|
+
cellEditor: AutocompleteSelectCellEditor,
|
|
65
|
+
cellEditorParams: {
|
|
66
|
+
selectData: [
|
|
67
|
+
{ label: 'Canada', value: 'CA', group: 'North America' },
|
|
68
|
+
{ label: 'United States', value: 'US', group: 'North America' },
|
|
69
|
+
{ label: 'Uzbekistan', value: 'UZ', group: 'Asia' },
|
|
70
|
+
{ label: 'Japan', value: 'JP', group: 'Asia' },
|
|
71
|
+
{ label: 'South Korea', value: 'KR', group: 'Asia' },
|
|
72
|
+
],
|
|
73
|
+
placeholder: 'Select a country',
|
|
74
|
+
},
|
|
75
|
+
valueFormatter: (params) => {
|
|
76
|
+
if (params.value) {
|
|
77
|
+
return params.value.label || params.value.value || params.value;
|
|
78
|
+
}
|
|
79
|
+
return "";
|
|
80
|
+
},
|
|
81
|
+
editable: true,
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Remote Data with API
|
|
86
|
+
|
|
87
|
+
```js
|
|
88
|
+
{
|
|
89
|
+
headerName: "Country Search",
|
|
90
|
+
field: "country",
|
|
91
|
+
cellEditor: AutocompleteSelectCellEditor,
|
|
92
|
+
cellEditorParams: {
|
|
93
|
+
placeholder: 'Search for a country',
|
|
94
|
+
autocomplete: {
|
|
95
|
+
fetch: (cellEditor, text, update) => {
|
|
96
|
+
const match = text.toLowerCase();
|
|
97
|
+
fetch(`https://restcountries.com/v3.1/name/${match}`)
|
|
98
|
+
.then(response => response.json())
|
|
99
|
+
.then(data => {
|
|
100
|
+
const items = data.map(country => ({
|
|
101
|
+
value: country.cca3,
|
|
102
|
+
label: country.name.common,
|
|
103
|
+
group: country.region
|
|
104
|
+
}));
|
|
105
|
+
update(items);
|
|
106
|
+
})
|
|
107
|
+
.catch(() => update([]));
|
|
108
|
+
},
|
|
109
|
+
debounceWaitMs: 300,
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
valueFormatter: (params) => {
|
|
113
|
+
if (params.value) {
|
|
114
|
+
return params.value.label || params.value.value || params.value;
|
|
115
|
+
}
|
|
116
|
+
return "";
|
|
117
|
+
},
|
|
118
|
+
editable: true,
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Free Text Entry with Suggestions
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
{
|
|
126
|
+
headerName: "Tag Input",
|
|
127
|
+
field: "tag",
|
|
128
|
+
cellEditor: AutocompleteSelectCellEditor,
|
|
129
|
+
cellEditorParams: {
|
|
130
|
+
selectData: [
|
|
131
|
+
{ label: 'JavaScript', value: 'js' },
|
|
132
|
+
{ label: 'TypeScript', value: 'ts' },
|
|
133
|
+
{ label: 'Python', value: 'py' },
|
|
134
|
+
],
|
|
135
|
+
placeholder: 'Enter or select a tag',
|
|
136
|
+
autocomplete: {
|
|
137
|
+
strict: false,
|
|
138
|
+
autoselectfirst: false,
|
|
139
|
+
onFreeTextSelect: (cellEditor, item) => {
|
|
140
|
+
// Create a new tag from free text
|
|
141
|
+
return { label: item.label, value: item.label.toLowerCase() };
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
editable: true,
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Configuration
|
|
150
|
+
|
|
151
|
+
### Cell Editor Parameters
|
|
152
|
+
|
|
153
|
+
| Parameter | Type | Description |
|
|
154
|
+
|-----------|------|-------------|
|
|
155
|
+
| `selectData` | `Array` or `fn(params: IAutocompleteSelectCellEditorParams)` | Data source for autocomplete suggestions with format `{value: string, label: string, group?: string}` |
|
|
156
|
+
| `placeholder` | String | Input field placeholder text |
|
|
157
|
+
| `required` | `boolean` | Whether to cancel changes if no selection made (default: `false`) |
|
|
158
|
+
| `autocomplete` | Object | Configuration for the autocomplete behavior (see below) |
|
|
159
|
+
|
|
160
|
+
### Autocomplete Options
|
|
161
|
+
|
|
162
|
+
| Option | Type | Default | Description |
|
|
163
|
+
|--------|------|---------|-------------|
|
|
164
|
+
| `className` | `string` | `'ag-cell-editor-autocomplete'` | CSS class for the autocomplete dropdown |
|
|
165
|
+
| `minLength` | `number` | `1` | Minimum character length to trigger suggestions |
|
|
166
|
+
| `showOnFocus` | `boolean` | `false` | Show suggestions when input is focused |
|
|
167
|
+
| `emptyMsg` | `string` | `'None'` | Message when no results match |
|
|
168
|
+
| `strict` | `boolean` | `true` | Only allow selection from the dropdown |
|
|
169
|
+
| `autoselectfirst` | `boolean` | `true` | Auto-select first item in dropdown |
|
|
170
|
+
| `debounceWaitMs` | `number` | `200` | Debounce time for fetch requests |
|
|
171
|
+
| `onFreeTextSelect` | Function | - | Called when user selects text not in suggestions (requires `strict: false`) |
|
|
172
|
+
|
|
173
|
+
### Custom Rendering Functions
|
|
174
|
+
|
|
175
|
+
The following functions can be customized for advanced control:
|
|
176
|
+
|
|
177
|
+
| Function | Parameters | Description |
|
|
178
|
+
|----------|------------|-------------|
|
|
179
|
+
| `render` | `(cellEditor, item, currentValue)` | Customize rendering of each suggestion |
|
|
180
|
+
| `renderGroup` | `(cellEditor, groupName)` | Customize rendering of group headers |
|
|
181
|
+
| `onSelect` | `(cellEditor, item)` | Called when an item is selected |
|
|
182
|
+
| `fetch` | `(cellEditor, text, update)` | Custom function to retrieve and filter suggestions |
|
|
183
|
+
| `customize` | `(cellEditor, input, inputRect, container, maxHeight)` | Customize autocomplete dropdown position and appearance |
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
cellEditorParams: {
|
|
187
|
+
// ...
|
|
188
|
+
autocomplete: {
|
|
189
|
+
render: (cellEditor, item, currentValue) => {
|
|
190
|
+
// Custom item rendering
|
|
191
|
+
const div = document.createElement('div');
|
|
192
|
+
div.textContent = item.label;
|
|
193
|
+
return div;
|
|
194
|
+
},
|
|
195
|
+
renderGroup: (cellEditor, groupName) => {
|
|
196
|
+
// Custom group header rendering
|
|
197
|
+
const div = document.createElement('div');
|
|
198
|
+
div.textContent = groupName;
|
|
199
|
+
div.className = 'group';
|
|
200
|
+
return div;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Credits
|
|
207
|
+
|
|
208
|
+
- Original package by [Andrew Valleteau](https://github.com/avallete/ag-grid-autocomplete-editor)
|
|
209
|
+
- Based on [autocompleter](https://github.com/denis-taran/autocomplete) for the core autocomplete functionality
|
|
210
|
+
- Works with [ag-Grid](https://github.com/ag-grid/ag-grid) Community and Enterprise editions
|
|
211
|
+
|
|
212
|
+
## License
|
|
213
|
+
|
|
214
|
+
MIT
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@ag-grid-community/core"));else if("function"==typeof define&&define.amd)define(["@ag-grid-community/core"],t);else{var n="object"==typeof exports?t(require("@ag-grid-community/core")):t(e["@ag-grid-community/core"]);for(var i in n)("object"==typeof exports?exports:e)[i]=n[i]}}(self,(e=>(()=>{"use strict";var t={104:(e,t,n)=>{n.r(t)},151:t=>{t.exports=e}},n={};function i(e){var o=n[e];if(void 0!==o)return o.exports;var r=n[e]={exports:{}};return t[e](r,r.exports,i),r.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};i.r(o),i.d(o,{AutocompleteSelectCellEditor:()=>w,default:()=>O});var r=i(151);class s{constructor(){this.version=24}isEnableCellEditingOnBackspace(){return!0}}class c{constructor(e){this.gridOptionsWrapper=e,this.version="function"==typeof this.gridOptionsWrapper.isEnableCellEditingOnBackspace?28:27}isEnableCellEditingOnBackspace(){return this.version<28||this.gridOptionsWrapper.isEnableCellEditingOnBackspace()}}class a{constructor(e){this.gridOptionsService=e,this.version=29}isEnableCellEditingOnBackspace(){return this.gridOptionsService.is("enableCellEditingOnBackspace")}}class u{constructor(e){this.gridOptionsService=e,this.version=31}isEnableCellEditingOnBackspace(){return this.gridOptionsService.get("enableCellEditingOnBackspace")}}function l(e){const t=document.createElement("div");return t.textContent=e,t.className="group",t}function d(e){const t=document.createElement("div");return t.textContent=e.label||"",t}function p(e,t,n,i,o=d,r=l){const s=document.createDocumentFragment(),c=[];let a="#9?$";for(const s of e){if(s.group&&s.group!==a){a=s.group;const e=r(s.group,n);c.push(e)}const e=o(s,n);e.addEventListener("click",(e=>i(s,e))),s===t&&e.classList.add("selected"),c.push(e)}return s.append(...c),s}function f(e){let t=e;return[()=>t,e=>(t=e,t)]}const g="input",h=new Set([38,13,27,39,37,16,17,18,20,91,9]),v=2;function m(e){const[t,n]=f(e.input.ownerDocument||globalThis.document),[i,o]=f([]),[r,s]=f(""),[c,a]=f(void 0),[u,l]=f(0),[d,m]=f(void 0),{strict:y,autoselectfirst:E,onFreeTextSelect:b,minLength:S=v,showOnFocus:w,input:O,className:x,customize:C,emptyMsg:T,render:L,renderGroup:A}=e,k=e.debounceWaitMs||0,D=S,I=document.createElement("div"),M=I.style;I.className=`autocomplete ${x||""}`,M.position="fixed";const N=()=>{l(u()+1)};function B(){const e=d();void 0!==e&&(globalThis.clearTimeout(e),m(void 0))}function P(){return!!I.parentNode}function K(){N(),o([]),s(""),a(void 0),I&&I.remove()}function W(t,n){n.preventDefault(),n.stopPropagation(),e.onSelect(t,O,n),K()}function $(){!function(e){for(;e.firstChild;)e.firstChild.remove()}(I);const e=i(),o=p(e,c(),r(),W,L,A);if(I.append(o),0===e.length&&y){if(!T)return void K();{const e=document.createElement("div");e.className="empty",e.textContent=T,I.append(e),a(void 0)}}n(O.ownerDocument||globalThis.document),I.parentNode||t().body.append(I),function(){if(P()){const e=t();M.height="auto",M.width=`${O.offsetWidth}px`;const n=O.getBoundingClientRect(),i=n.top+O.offsetHeight;let o=e.defaultView.innerHeight-i;o<0&&(o=0),M.top=`${i}px`,M.bottom="",M.left=`${n.left}px`,M.maxHeight=`${o}px`,C&&C(O,n,I,o)}}(),function(){let e=I.querySelector(".selected");if(e){const t=e.previousElementSibling;if(t&&null===t.previousElementSibling&&t.className.includes("group")&&(e=t),e.offsetTop<I.scrollTop)I.scrollTop=e.offsetTop;else{const t=e.offsetTop+e.offsetHeight,n=I.scrollTop+I.offsetHeight;t>n&&(I.scrollTop+=t-n)}}}()}function q(){P()&&$()}function F(){q()}function H(e){e.target===I?e.preventDefault():q()}function j(t){N();const{value:n}=O;n.length>=D||1===t?(B(),m(function(t){const n=u(),i=0===t?k:0,{value:r}=O,c=e=>{u()===n&&e&&(o(e),s(r),a(e.length>0&&E?e[0]:void 0),$())};return globalThis.setTimeout((()=>{e.fetch(r,c,t)}),i)}(t))):K()}function z(e){const t=e.which||e.keyCode||0;h.has(t)||40===t&&P()||j(0)}function G(t){const n=t.which||t.keyCode||0;if(38===n||40===n||27===n||13===n||9===n){if(t.preventDefault(),P()&&t.stopPropagation(),38===n||40===n||27===n)return void(27===n?(e.onSelect(void 0,O,t),K()):function(e){if(P()&&i().length>0){switch(e){case 38:!function(){const e=i(),t=c();if(0!==e.length)if(void 0!==t&&t!==e[0]){for(let n=e.length-1;n>0;n-=1)if(t===e[n]||1===n)return void a(e[n-1])}else a(e.at(-1));else a(void 0)}();break;case 40:!function(){const e=i(),t=c();if(0!==e.length)if(void 0!==t&&t!==e.at(-1)){for(let n=0;n<e.length-1;n+=1)if(t===e[n])return void a(e[n+1])}else a(e[0]);else a(void 0)}()}$()}}(n));13!==n&&9!==n||function(t){const n=c();if(y)e.onSelect(n,O,t);else{const i={label:O.value};if(n)return void e.onSelect(n,O,t);b&&b(i,O),e.onSelect(i,O,t)}K()}(t)}}function V(){w&&j(1)}function R(e){e.preventDefault(),e.stopPropagation(),setTimeout((()=>{t().activeElement!==O&&K()}),200)}return function(){const e=t();O.addEventListener("keydown",G),O.addEventListener(g,z),O.addEventListener("focusout",R),O.addEventListener("focus",V),e.addEventListener("resize",F),e.addEventListener("scroll",H,!0)}(),{destroy:function(){!function(){const e=t();O.removeEventListener("focus",V),O.removeEventListener("keydown",G),O.removeEventListener(g,z),O.removeEventListener("focusout",R),e.removeEventListener("resize",F),e.removeEventListener("scroll",H,!0)}(),B(),K(),N()}}}i(104);const y="Backspace",E="Delete",b=new Set([8,46,13,9,38,40]),S=new Set([y,E,"Enter","Tab","ArrowUp","ArrowDown"]);class w extends r.PopupComponent{static getSelectData(e){return"function"==typeof e.selectData?e.selectData(e):Array.isArray(e.selectData)?e.selectData:[]}static getDefaultAutocompleteSettings(e){return{showOnFocus:!1,render(e,t,n){const i=document.createElement("div"),o=(n??"").replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`),r=new RegExp(o,"gi"),s=document.createElement("span");s.innerHTML=t.label.replace(r,(function(e){return`<strong>${e}</strong>`})),i.append(s);const c=n=>{e.currentItem=t,n.stopPropagation()};return"addManagedListeners"in e?e.addManagedListeners(i,{mousedown:c}):e.addManagedListener(i,"mousedown",c),i},renderGroup(e,t){const n=document.createElement("div");return n.textContent=t,n.className="group",n},className:"ag-cell-editor-autocomplete",minLength:1,emptyMsg:"None",strict:!0,autoselectfirst:!0,onFreeTextSelect(){},onSelect(e,t){e.currentItem=t},fetch:(t,n,i)=>{const o=w.getSelectData(e),r=n.toLowerCase()||t.eInput.value.toLowerCase();i(o.filter((function(e){return e.label.toLowerCase().includes(r)})))},debounceWaitMs:200,customize(e,t,n,i,o){o<100&&(i.style.top="10px",i.style.bottom=`${window.innerHeight-n.bottom+t.offsetHeight}px`,i.style.maxHeight="140px")}}}static suppressKeyboardEvent(e,t=!1,n=!0,i=!1){const{keyCode:o}=e.event,{key:r}=e.event;return!(!e.editing||!(r?S.has(r):b.has(o)))||!(!i||!t||e.editing)&&((r?r===E:46===o)||!n&&(r?r===y:8===o))}static getStartValue(e){const t=e.eventKey,n=e.keyPress;return(t?t===y:8===n)||(t?t===E:46===n)?"":1===e.eventKey?.length?e.eventKey:e.formatValue(e.value)}constructor(){super('<div class="ag-wrapper ag-input-wrapper ag-text-field-input-wrapper ag-cell-editor-autocomplete-wrapper" style="padding: 0 !important;"><input class="ag-input-field-input ag-text-field-input ag-cell-editor-autocomplete-input" type="text"/></div>'),this.focusAfterAttached=!1,this.required=!1,this.backspaceTriggersEdit=!0,this.eInput=this.getGui().querySelector("input"),this.currentItem&&(this.eInput.value=this.currentItem.label||this.currentItem.value)}init(e){this.gridApi=e.api,this.stopEditing=e.stopEditing;const t=w.getDefaultAutocompleteSettings(e);this.focusAfterAttached=e.cellStartedEdit,this.eInput.placeholder=e.placeholder||"",this.eInput.value=w.getStartValue(e);const n={...t,...e.autocomplete};var i;this.autocompleter=m({input:this.eInput,render:(e,t)=>n.render(this,e,t),renderGroup:(e,t)=>n.renderGroup(this,e,t),className:n.className,minLength:n.minLength,emptyMsg:n.emptyMsg,strict:n.strict,autoselectfirst:n.autoselectfirst,showOnFocus:n.showOnFocus,onFreeTextSelect:(e,t)=>n.onFreeTextSelect(this,e,t),onSelect:(e,t,i)=>{const o=n.onSelect(this,e,t);return i instanceof KeyboardEvent||i instanceof i.view.document.defaultView.KeyboardEvent?this.handleTabEvent(i):this.destroy(),o},fetch:(e,t,i)=>n.fetch(this,e,t,i),debounceWaitMs:n.debounceWaitMs,customize:(e,t,i,o)=>n.customize(this,e,t,i,o)}),e.required&&(this.required=!0),this.gridOptionsAdapter="gos"in(i=this)?new u(i.gos):"gridOptionsService"in i?"in"in i.gridOptionsService?new a(i.gridOptionsService):new u(i.gridOptionsService):"gridOptionsWrapper"in i?new c(i.gridOptionsWrapper):new s,e.colDef.suppressKeyboardEvent||(e.colDef.suppressKeyboardEvent=e=>w.suppressKeyboardEvent(e,this.required,this.backspaceTriggersEdit,this.gridOptionsAdapter.version>=28)),this.gridOptionsAdapter.version>=28&&(this.backspaceTriggersEdit=this.gridOptionsAdapter.isEnableCellEditingOnBackspace())}handleTabEvent(e){9===(e.which||e.keyCode||0)&&this.gridApi?e.shiftKey?this.gridApi.tabToPreviousCell():this.gridApi.tabToNextCell():this.destroy()}afterGuiAttached(){if(!this.focusAfterAttached)return;const{eInput:e}=this;e.focus(),e.select();const t=e.value?e.value.length:0;t>0&&e.setSelectionRange(t,t)}focusIn(){this.eInput.focus(),this.eInput.select()}focusOut(){this.eInput.blur(),this.autocompleter.destroy()}destroy(){this.focusOut(),this.stopEditing&&this.stopEditing()}getValue(){return this.currentItem}isCancelAfterEnd(){return!!this.required&&!this.currentItem}isCancelBeforeStart(){return!1}isPopup(){return!1}}const O=w;return o})()));
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://ag-grid-autocomplete/webpack/universalModuleDefinition","webpack://ag-grid-autocomplete/external umd \"@ag-grid-community/core\"","webpack://ag-grid-autocomplete/webpack/bootstrap","webpack://ag-grid-autocomplete/webpack/runtime/define property getters","webpack://ag-grid-autocomplete/webpack/runtime/hasOwnProperty shorthand","webpack://ag-grid-autocomplete/webpack/runtime/make namespace object","webpack://ag-grid-autocomplete/./src/adapters/grid-options-v24-adapter.ts","webpack://ag-grid-autocomplete/./src/adapters/grid-options-v28-adapter.ts","webpack://ag-grid-autocomplete/./src/adapters/grid-options-v29-adapter.ts","webpack://ag-grid-autocomplete/./src/adapters/grid-options-v31-adapter.ts","webpack://ag-grid-autocomplete/./autocompleter/rendering.ts","webpack://ag-grid-autocomplete/./autocompleter/singleton.ts","webpack://ag-grid-autocomplete/./autocompleter/autocomplete.ts","webpack://ag-grid-autocomplete/./ag-grid-autocomplete.ts","webpack://ag-grid-autocomplete/./src/adapters/grid-options-adapter.ts","webpack://ag-grid-autocomplete/./index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@ag-grid-community/core\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@ag-grid-community/core\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@ag-grid-community/core\")) : factory(root[\"@ag-grid-community/core\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE__151__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__151__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { IGridOptionsAdapter } from './grid-options-interfaces'\n\n/**\n * Adapter implementation for AG Grid v24\n */\nexport default class GridOptionsV24Adapter implements IGridOptionsAdapter {\n version = 24\n\n // eslint-disable-next-line class-methods-use-this\n isEnableCellEditingOnBackspace(): boolean {\n return true\n }\n}\n","import { IGridOptionsAdapter } from './grid-options-interfaces'\n\n/**\n * Adapter implementation for AG Grid v28\n * Uses gridOptionsWrapper\n */\nexport default class GridOptionsV28Adapter implements IGridOptionsAdapter {\n version: 27 | 28\n\n constructor(private readonly gridOptionsWrapper: any) {\n // isEnableCellEditingOnBackspace is new on version 28, so it is safe to assume v28+\n this.version = typeof this.gridOptionsWrapper.isEnableCellEditingOnBackspace === 'function' ? 28 : 27\n }\n\n isEnableCellEditingOnBackspace(): boolean {\n // This option didn't exist before v28, the original behavior is as it was always set to true\n if (this.version < 28) return true\n return this.gridOptionsWrapper.isEnableCellEditingOnBackspace()\n }\n}\n","import { IGridOptionsAdapter } from './grid-options-interfaces'\n\n/**\n * Adapter implementation for AG Grid v29\n * Uses gridOptionsService\n */\nexport default class GridOptionsV29Adapter implements IGridOptionsAdapter {\n version = 29\n\n constructor(private readonly gridOptionsService: any) {}\n\n isEnableCellEditingOnBackspace(): boolean {\n return this.gridOptionsService.is('enableCellEditingOnBackspace')\n }\n}\n","import { IGridOptionsAdapter } from './grid-options-interfaces'\n\n/**\n * Adapter implementation for AG Grid v31\n * Uses gridOptionsService\n */\nexport default class GridOptionsV31Adapter implements IGridOptionsAdapter {\n version = 31\n\n constructor(private readonly gridOptionsService: any) {}\n\n isEnableCellEditingOnBackspace(): boolean {\n return this.gridOptionsService.get('enableCellEditingOnBackspace')\n }\n}\n","import { AutocompleteItem, RenderFunction, RenderGroupFunction } from './types'\n\nexport function removeChildren(container: Node) {\n while (container.firstChild) {\n container.firstChild.remove()\n }\n}\n\nexport function defaultRenderGroup(groupName: string): HTMLDivElement {\n const groupDiv = document.createElement('div')\n groupDiv.textContent = groupName\n groupDiv.className = 'group'\n return groupDiv\n}\n\nexport function defaultRender(item: AutocompleteItem): HTMLDivElement {\n const itemElement = document.createElement('div')\n itemElement.textContent = item.label || ''\n return itemElement\n}\n\nexport function renderItems<T extends AutocompleteItem>(\n items: T[],\n selected: T | undefined,\n inputValue: string,\n clickHandler: (item: T, event: MouseEvent) => void,\n render: RenderFunction<T> = defaultRender,\n renderGroup: RenderGroupFunction = defaultRenderGroup,\n): DocumentFragment {\n const fragment = document.createDocumentFragment()\n const elements: HTMLElement[] = []\n let previousGroup = '#9?$'\n // eslint-disable-next-line no-restricted-syntax\n for (const item of items) {\n if (item.group && item.group !== previousGroup) {\n previousGroup = item.group\n const groupDiv = renderGroup(item.group, inputValue)\n elements.push(groupDiv)\n }\n const div = render(item, inputValue)\n div.addEventListener('click', (event: MouseEvent) => clickHandler(item, event))\n if (item === selected) {\n div.classList.add('selected')\n }\n elements.push(div)\n }\n fragment.append(...elements)\n return fragment\n}\n","/**\n * Simple function to create typed and scope safe singletons inspired by react hooks\n * @param initialValue: The initial value of the singleton\n * @example\n * // declare and use a new singleton\n * const [getValue, setValue] = singleton(0)\n * // increment the singleton value\n * setValue(getValue() + 1)\n * @returns [singletonGetter, singletonSetter]\n */\nexport default function singleton<T>(initialValue: T) {\n let value = initialValue\n const setValue = (newValue: T) => {\n value = newValue\n return value\n }\n const getValue = () => {\n return value\n }\n return [getValue, setValue] as const\n}\n","import { removeChildren, renderItems } from './rendering'\nimport { AutocompleteItem, EventTrigger, AutocompleteSettings, AutocompleteResult } from './types'\nimport singleton from './singleton'\n\nconst enum Keys {\n Enter = 13,\n Esc = 27,\n Up = 38,\n Down = 40,\n Left = 37,\n Right = 39,\n Shift = 16,\n Ctrl = 17,\n Alt = 18,\n CapsLock = 20,\n WindowsKey = 91,\n Tab = 9,\n}\n\nconst KEYUP_EVENT_NAME = 'input'\n\nconst KEYS_TO_IGNORE = new Set([\n Keys.Up,\n Keys.Enter,\n Keys.Esc,\n Keys.Right,\n Keys.Left,\n Keys.Shift,\n Keys.Ctrl,\n Keys.Alt,\n Keys.CapsLock,\n Keys.WindowsKey,\n Keys.Tab,\n])\nconst DEFAULT_MIN_LENGTH = 2\n\nexport default function autocomplete<T extends AutocompleteItem>(\n settings: AutocompleteSettings<T>,\n): AutocompleteResult {\n /* eslint-disable unicorn/no-useless-undefined */\n const [getDocument, setDocument] = singleton(settings.input.ownerDocument || globalThis.document)\n const [getItems, setItems] = singleton<T[]>([])\n const [getInputValue, setInputValue] = singleton('')\n const [getSelected, setSelected] = singleton<T | undefined>(undefined)\n const [getKeypressCounter, setKeypressCounter] = singleton(0)\n const [getDebounceTimer, setDebounceTimer] = singleton<NodeJS.Timeout | undefined>(undefined)\n /* eslint-enable */\n\n const {\n strict,\n autoselectfirst,\n onFreeTextSelect,\n minLength = DEFAULT_MIN_LENGTH,\n showOnFocus,\n input,\n className,\n customize,\n emptyMsg,\n render,\n renderGroup,\n } = settings\n const debounceWaitMs = settings.debounceWaitMs || 0\n const minimumInputLength = minLength\n const container: HTMLDivElement = document.createElement('div')\n const containerStyle = container.style\n\n container.className = `autocomplete ${className || ''}`\n containerStyle.position = 'fixed'\n\n const incrementKeypressCounter = () => {\n setKeypressCounter(getKeypressCounter() + 1)\n }\n\n /**\n * Detach the container from DOM\n */\n function detach() {\n if (container) {\n container.remove()\n }\n }\n\n /**\n * Clear debouncing timer if assigned\n */\n function clearDebounceTimer() {\n const debounceTimer = getDebounceTimer()\n if (debounceTimer !== undefined) {\n globalThis.clearTimeout(debounceTimer)\n // eslint-disable-next-line unicorn/no-useless-undefined\n setDebounceTimer(undefined)\n }\n }\n\n /**\n * Attach the container to DOM\n */\n function attach() {\n setDocument(input.ownerDocument || globalThis.document)\n if (!container.parentNode) {\n getDocument().body.append(container)\n }\n }\n\n /**\n * Check if container for autocomplete is displayed\n */\n function containerDisplayed(): boolean {\n return !!container.parentNode\n }\n\n /**\n * Clear autocomplete state and hide container\n */\n function clear() {\n incrementKeypressCounter()\n setItems([])\n setInputValue('')\n // eslint-disable-next-line unicorn/no-useless-undefined\n setSelected(undefined)\n detach()\n }\n\n /**\n * Update autocomplete position to put it under the input field\n */\n function updatePosition() {\n if (containerDisplayed()) {\n const document = getDocument()\n\n containerStyle.height = 'auto'\n containerStyle.width = `${input.offsetWidth}px`\n\n const inputRect = input.getBoundingClientRect()\n const top = inputRect.top + input.offsetHeight\n let maxHeight = document.defaultView!.innerHeight - top\n\n if (maxHeight < 0) {\n maxHeight = 0\n }\n\n containerStyle.top = `${top}px`\n containerStyle.bottom = ''\n containerStyle.left = `${inputRect.left}px`\n containerStyle.maxHeight = `${maxHeight}px`\n\n if (customize) {\n customize(input, inputRect, container, maxHeight)\n }\n }\n }\n\n /**\n * Automatically move scroll bar if selected item is not visible\n */\n function updateScroll() {\n let element = container.querySelector('.selected') as HTMLDivElement\n if (element) {\n // make group visible\n const previous = element.previousElementSibling\n if (previous && previous.previousElementSibling === null && previous.className.includes('group')) {\n element = previous as HTMLDivElement\n }\n\n if (element.offsetTop < container.scrollTop) {\n container.scrollTop = element.offsetTop\n } else {\n const selectBottom = element.offsetTop + element.offsetHeight\n const containerBottom = container.scrollTop + container.offsetHeight\n if (selectBottom > containerBottom) {\n container.scrollTop += selectBottom - containerBottom\n }\n }\n }\n }\n\n /**\n * Handle the click on an item of the selection list\n * @param item: data of the clicked item\n * @param event: MouseEvent who has triggered the selection\n */\n function itemClickHandler(item: T, event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n settings.onSelect(item, input, event)\n clear()\n }\n\n /**\n * Redraw the autocomplete div element with suggestions\n */\n function update() {\n // Clear all child from container\n removeChildren(container)\n\n const items = getItems()\n const fragment = renderItems<T>(items, getSelected(), getInputValue(), itemClickHandler, render, renderGroup)\n container.append(fragment)\n if (items.length === 0 && strict) {\n // if no items display empty message\n if (emptyMsg) {\n const empty = document.createElement('div')\n empty.className = 'empty'\n empty.textContent = emptyMsg\n container.append(empty)\n // eslint-disable-next-line unicorn/no-useless-undefined\n setSelected(undefined)\n } else {\n clear()\n return\n }\n }\n\n attach()\n updatePosition()\n updateScroll()\n }\n\n function updateIfDisplayed() {\n if (containerDisplayed()) {\n update()\n }\n }\n\n function resizeEventHandler() {\n updateIfDisplayed()\n }\n\n function scrollEventHandler(event: Event) {\n if (event.target === container) {\n event.preventDefault()\n } else {\n updateIfDisplayed()\n }\n }\n\n function debouncedFetch(trigger: EventTrigger) {\n const savedKeypressCounter = getKeypressCounter()\n const debouncingTime = trigger === EventTrigger.Keyboard ? debounceWaitMs : 0\n const { value } = input\n // Hydrate this.items with retrieved items\n const handleFetchResult = (elements: T[] | false) => {\n if (getKeypressCounter() === savedKeypressCounter && elements) {\n setItems(elements)\n setInputValue(value)\n setSelected(elements.length > 0 && autoselectfirst ? elements[0] : undefined)\n update()\n }\n }\n return globalThis.setTimeout(() => {\n settings.fetch(value, handleFetchResult, trigger)\n }, debouncingTime)\n }\n\n function startFetch(trigger: EventTrigger) {\n // if multiple keys were pressed, before we get update from server,\n // this may cause redrawing our autocomplete multiple times after the last key press.\n // to avoid this, the number of times keyboard was pressed will be\n // saved and checked before redraw our autocomplete box.\n incrementKeypressCounter()\n\n const { value } = input\n if (value.length >= minimumInputLength || trigger === EventTrigger.Focus) {\n clearDebounceTimer()\n setDebounceTimer(debouncedFetch(trigger))\n } else {\n clear()\n }\n }\n\n function keyupEventHandler(event: KeyboardEvent) {\n // eslint-disable-next-line sonarjs/deprecation\n const keyCode = event.which || event.keyCode || 0\n\n if (KEYS_TO_IGNORE.has(keyCode)) {\n return\n }\n\n // the down key is used to open autocomplete\n if (keyCode === Keys.Down && containerDisplayed()) {\n return\n }\n\n startFetch(EventTrigger.Keyboard)\n }\n\n /**\n * Select the previous item in suggestions\n */\n function selectPreviousItem() {\n const items = getItems()\n const selected = getSelected()\n if (items.length === 0) {\n // eslint-disable-next-line unicorn/no-useless-undefined\n setSelected(undefined)\n return\n }\n if (selected === undefined || selected === items[0]) {\n setSelected(items.at(-1))\n return\n }\n for (let index = items.length - 1; index > 0; index -= 1) {\n if (selected === items[index] || index === 1) {\n setSelected(items[index - 1])\n return\n }\n }\n }\n\n /**\n * Select the next item in suggestions\n */\n function selectNextItem() {\n const items = getItems()\n const selected = getSelected()\n if (items.length === 0) {\n // eslint-disable-next-line unicorn/no-useless-undefined\n setSelected(undefined)\n return\n }\n if (selected === undefined || selected === items.at(-1)) {\n // eslint-disable-next-line prefer-destructuring\n setSelected(items[0])\n return\n }\n for (let index = 0; index < items.length - 1; index += 1) {\n if (selected === items[index]) {\n setSelected(items[index + 1])\n return\n }\n }\n }\n\n function handleArrowKeysDown(arrowKey: Keys.Up | Keys.Down) {\n const containerIsDisplayed = containerDisplayed()\n if (containerIsDisplayed && getItems().length > 0) {\n switch (arrowKey) {\n case Keys.Up: {\n selectPreviousItem()\n break\n }\n case Keys.Down: {\n selectNextItem()\n break\n }\n default:\n }\n update()\n }\n }\n\n function handleSelectKeysDown(event: KeyboardEvent) {\n const selected = getSelected()\n if (strict) {\n settings.onSelect(selected, input, event)\n } else {\n const freeTextSelect = { label: input.value } as T\n if (selected) {\n settings.onSelect(selected, input, event)\n return\n }\n if (onFreeTextSelect) {\n onFreeTextSelect(freeTextSelect, input)\n }\n settings.onSelect(freeTextSelect, input, event)\n }\n clear()\n }\n\n function keydownEventHandler(event: KeyboardEvent) {\n // eslint-disable-next-line sonarjs/deprecation\n const keyCode = event.which || event.keyCode || 0\n\n if (\n keyCode === Keys.Up ||\n keyCode === Keys.Down ||\n keyCode === Keys.Esc ||\n keyCode === Keys.Enter ||\n keyCode === Keys.Tab\n ) {\n event.preventDefault()\n if (containerDisplayed()) {\n event.stopPropagation()\n }\n if (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\n if (keyCode === Keys.Esc) {\n settings.onSelect(undefined, input, event)\n clear()\n } else {\n handleArrowKeysDown(keyCode)\n }\n return\n }\n\n if (keyCode === Keys.Enter || keyCode === Keys.Tab) {\n handleSelectKeysDown(event)\n }\n }\n }\n\n function focusEventHandler() {\n if (showOnFocus) {\n startFetch(EventTrigger.Focus)\n }\n }\n\n function focusOutEventHandler(event: Event) {\n // we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\n event.preventDefault()\n event.stopPropagation()\n setTimeout(() => {\n if (getDocument().activeElement !== input) {\n clear()\n }\n }, 200)\n }\n\n function removeEventListeners() {\n const document = getDocument()\n\n input.removeEventListener('focus', focusEventHandler)\n input.removeEventListener('keydown', keydownEventHandler)\n input.removeEventListener(KEYUP_EVENT_NAME, keyupEventHandler as EventListenerOrEventListenerObject)\n input.removeEventListener('focusout', focusOutEventHandler)\n document.removeEventListener('resize', resizeEventHandler)\n document.removeEventListener('scroll', scrollEventHandler, true)\n }\n\n function addEventListeners() {\n const document = getDocument()\n\n input.addEventListener('keydown', keydownEventHandler)\n input.addEventListener(KEYUP_EVENT_NAME, keyupEventHandler as EventListenerOrEventListenerObject)\n input.addEventListener('focusout', focusOutEventHandler)\n input.addEventListener('focus', focusEventHandler)\n document.addEventListener('resize', resizeEventHandler)\n document.addEventListener('scroll', scrollEventHandler, true)\n }\n\n /**\n * This function will remove DOM elements and clear event handlers\n */\n function destroy() {\n removeEventListeners()\n clearDebounceTimer()\n clear()\n\n // prevent the update call if there are pending AJAX requests\n incrementKeypressCounter()\n }\n\n addEventListeners()\n return {\n destroy,\n }\n}\n\nexport { AutocompleteItem, AutocompleteSettings, EventTrigger } from './types'\n","import { GridApi, ICellEditorComp, PopupComponent, SuppressKeyboardEventParams } from '@ag-grid-community/core'\nimport { IAutocompleteSelectCellEditorParameters, DataFormat, IAutocompleterSettings } from './types'\nimport createGridOptionsAdapter from './src/adapters/grid-options-adapter'\nimport { IGridOptionsAdapter } from './src/adapters/grid-options-interfaces'\n\nimport autocomplete from './autocompleter/autocomplete'\n\n// use require instead of import to generate the .css file with webpack but avoid import into the .d.ts file\n// eslint-disable-next-line unicorn/prefer-module\nrequire('./ag-grid-autocomplete.scss')\n\nconst KEY_BACKSPACE = 8\nconst KEY_DELETE = 46\nconst KEY_ENTER = 13\nconst KEY_TAB = 9\nconst KEY_UP = 38\nconst KEY_DOWN = 40\n\n// New key string constants for eventKey\nconst KEY_BACKSPACE_STRING = 'Backspace'\nconst KEY_DELETE_STRING = 'Delete'\nconst KEY_ENTER_STRING = 'Enter'\nconst KEY_TAB_STRING = 'Tab'\nconst KEY_UP_STRING = 'ArrowUp'\nconst KEY_DOWN_STRING = 'ArrowDown'\n\nconst KeysHandled = new Set([KEY_BACKSPACE, KEY_DELETE, KEY_ENTER, KEY_TAB, KEY_UP, KEY_DOWN])\nconst KeysHandledStrings = new Set([\n KEY_BACKSPACE_STRING,\n KEY_DELETE_STRING,\n KEY_ENTER_STRING,\n KEY_TAB_STRING,\n KEY_UP_STRING,\n KEY_DOWN_STRING,\n])\nexport default class AutocompleteSelectCellEditor extends PopupComponent implements ICellEditorComp {\n public currentItem?: DataFormat\n\n private focusAfterAttached: boolean = false\n\n private readonly eInput: HTMLInputElement\n\n private autocompleter?: any\n\n private required: boolean = false\n\n private stopEditing?: (cancel?: boolean) => void\n\n /**\n * Originally AgGrid would always trigger cell editing when backspace was hit\n */\n private backspaceTriggersEdit = true\n\n private gridApi?: GridApi\n\n private gridOptionsAdapter!: IGridOptionsAdapter\n\n private static getSelectData(\n parameters: IAutocompleteSelectCellEditorParameters<AutocompleteSelectCellEditor>,\n ): Array<DataFormat> {\n if (typeof parameters.selectData === 'function') {\n return parameters.selectData(parameters)\n }\n\n if (Array.isArray(parameters.selectData)) {\n return parameters.selectData as Array<DataFormat>\n }\n return []\n }\n\n private static getDefaultAutocompleteSettings(\n parameters: IAutocompleteSelectCellEditorParameters<AutocompleteSelectCellEditor>,\n ): Required<IAutocompleterSettings<DataFormat, AutocompleteSelectCellEditor>> {\n return {\n showOnFocus: false,\n render(cellEditor, item, value) {\n const itemElement = document.createElement('div')\n const escapedValue = (value ?? '').replaceAll(/[$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`)\n const regex = new RegExp(escapedValue, 'gi')\n const fieldItem = document.createElement('span')\n fieldItem.innerHTML = item.label.replace(regex, function strongify(match: string) {\n return `<strong>${match}</strong>`\n })\n itemElement.append(fieldItem)\n const eventFunction = (event: MouseEvent) => {\n // eslint-disable-next-line no-param-reassign\n cellEditor.currentItem = item\n event.stopPropagation()\n }\n if ('addManagedListeners' in cellEditor) {\n // ag-grid v32+\n ;(cellEditor as any).addManagedListeners(itemElement, { mousedown: eventFunction })\n } else {\n ;(cellEditor as any).addManagedListener(itemElement, 'mousedown', eventFunction)\n }\n return itemElement\n },\n renderGroup(_, name) {\n const div = document.createElement('div')\n div.textContent = name\n div.className = 'group'\n return div\n },\n className: 'ag-cell-editor-autocomplete',\n minLength: 1,\n emptyMsg: 'None',\n strict: true,\n autoselectfirst: true,\n onFreeTextSelect() {},\n onSelect(cellEditor, item: DataFormat | undefined) {\n // eslint-disable-next-line no-param-reassign\n cellEditor.currentItem = item\n },\n fetch: (cellEditor, text, callback) => {\n const items = AutocompleteSelectCellEditor.getSelectData(parameters)\n const match = text.toLowerCase() || cellEditor.eInput.value.toLowerCase()\n callback(\n items.filter(function caseInsensitiveIncludes(n) {\n return n.label.toLowerCase().includes(match)\n }),\n )\n },\n debounceWaitMs: 200,\n customize(_, input, inputRect, container, maxHeight) {\n if (maxHeight < 100) {\n /* eslint-disable no-param-reassign */\n container.style.top = '10px'\n container.style.bottom = `${window.innerHeight - inputRect.bottom + input.offsetHeight}px`\n container.style.maxHeight = '140px'\n /* eslint-enable no-param-reassign */\n }\n },\n }\n }\n\n /**\n * Determines whether a keyboard event should be suppressed in a grid cell.\n * Supports both modern (key-based) and legacy (keyCode-based) keyboard event handling.\n *\n * @param parameters - Event parameters from ag-grid\n * @param isRequired - Whether the cell represents a required field\n * @param backspaceTriggersEdit - Whether pressing backspace should trigger cell editing\n * @param isVersionGte28 - Whether using ag-grid version 28 or greater (which changed edit behavior)\n * @returns True if the event should be suppressed, false otherwise\n */\n private static suppressKeyboardEvent(\n parameters: SuppressKeyboardEventParams,\n isRequired = false,\n backspaceTriggersEdit = true,\n isVersionGte28 = false,\n ): boolean {\n // Check for both keyCode (deprecated) and key (new string-based approach)\n // eslint-disable-next-line sonarjs/deprecation\n const { keyCode } = parameters.event\n const { key } = parameters.event\n\n // Handle both numeric keyCode and string key approaches\n if (parameters.editing && (key ? KeysHandledStrings.has(key) : KeysHandled.has(keyCode))) {\n return true\n }\n\n // Logic below this point is required only if we are using ag-grid>=28, field is required, and is not in edit mode\n if (!isVersionGte28 || !isRequired || parameters.editing) {\n return false\n }\n\n // If the user hits delete, prevent it as it doesn't trigger a cell edit anymore\n if (key ? key === KEY_DELETE_STRING : keyCode === KEY_DELETE) {\n return true\n }\n\n // If the user hits backspace and cell editing is not enabled, prevent it\n return !backspaceTriggersEdit && (key ? key === KEY_BACKSPACE_STRING : keyCode === KEY_BACKSPACE)\n }\n\n private static getStartValue(parameters: IAutocompleteSelectCellEditorParameters<AutocompleteSelectCellEditor>) {\n // Check for new eventKey (v27+) or fall back to keyPress for backward compatibility\n // Use type assertion with 'as any' to access potentially undefined properties\n // without modifying the interface definition\n const eventKey = (parameters as any).eventKey as string\n const keyPress = (parameters as any).keyPress as number\n\n // Check for backspace or delete using either the string eventKey or numeric keyPress\n const isBackspace = eventKey ? eventKey === KEY_BACKSPACE_STRING : keyPress === KEY_BACKSPACE\n const isDelete = eventKey ? eventKey === KEY_DELETE_STRING : keyPress === KEY_DELETE\n const keyPressBackspaceOrDelete = isBackspace || isDelete\n\n if (keyPressBackspaceOrDelete) {\n return ''\n }\n // Detecting if the pressed key is a character\n if (parameters.eventKey?.length === 1) {\n return parameters.eventKey\n }\n return parameters.formatValue(parameters.value)\n }\n\n constructor() {\n super(\n '<div class=\"ag-wrapper ag-input-wrapper ag-text-field-input-wrapper ag-cell-editor-autocomplete-wrapper\" style=\"padding: 0 !important;\"><input class=\"ag-input-field-input ag-text-field-input ag-cell-editor-autocomplete-input\" type=\"text\"/></div>',\n )\n this.eInput = this.getGui().querySelector('input') as HTMLInputElement\n if (this.currentItem) {\n this.eInput.value = this.currentItem.label || (this.currentItem.value as string)\n }\n }\n\n public init(parameters: IAutocompleteSelectCellEditorParameters<AutocompleteSelectCellEditor>) {\n this.gridApi = parameters.api\n this.stopEditing = parameters.stopEditing\n const defaultSettings = AutocompleteSelectCellEditor.getDefaultAutocompleteSettings(parameters)\n this.focusAfterAttached = parameters.cellStartedEdit\n\n this.eInput.placeholder = parameters.placeholder || ''\n this.eInput.value = AutocompleteSelectCellEditor.getStartValue(parameters)\n\n const autocompleteParameters = { ...defaultSettings, ...parameters.autocomplete }\n\n this.autocompleter = autocomplete<DataFormat>({\n input: this.eInput,\n render: (item: DataFormat, currentValue: string) => {\n return autocompleteParameters.render(this, item, currentValue)\n },\n renderGroup: (name: string, currentValue: string) => {\n return autocompleteParameters.renderGroup(this, name, currentValue)\n },\n className: autocompleteParameters.className,\n minLength: autocompleteParameters.minLength,\n emptyMsg: autocompleteParameters.emptyMsg,\n strict: autocompleteParameters.strict,\n autoselectfirst: autocompleteParameters.autoselectfirst,\n showOnFocus: autocompleteParameters.showOnFocus,\n onFreeTextSelect: (item: DataFormat, input: HTMLInputElement) => {\n return autocompleteParameters.onFreeTextSelect(this, item, input)\n },\n onSelect: (item: DataFormat | undefined, input: HTMLInputElement, event: KeyboardEvent | MouseEvent) => {\n const result = autocompleteParameters.onSelect(this, item, input)\n // need the second argument because of cypress testing changing the view context\n if (event instanceof KeyboardEvent || event instanceof event.view!.document.defaultView!.KeyboardEvent) {\n this.handleTabEvent(event)\n } else {\n this.destroy()\n }\n return result\n },\n fetch: (text: string, update: (items: DataFormat[] | false) => void, trigger) => {\n return autocompleteParameters.fetch(this, text, update, trigger)\n },\n debounceWaitMs: autocompleteParameters.debounceWaitMs,\n customize: (input: HTMLInputElement, inputRect: DOMRect, container: HTMLDivElement, maxHeight: number) => {\n return autocompleteParameters.customize(this, input, inputRect, container, maxHeight)\n },\n })\n\n if (parameters.required) {\n this.required = true\n }\n\n // Create the grid options adapter based on the instance\n this.gridOptionsAdapter = createGridOptionsAdapter(this)\n\n if (!parameters.colDef.suppressKeyboardEvent) {\n // eslint-disable-next-line no-param-reassign\n parameters.colDef.suppressKeyboardEvent = (suppressParameters) =>\n AutocompleteSelectCellEditor.suppressKeyboardEvent(\n suppressParameters,\n this.required,\n this.backspaceTriggersEdit,\n this.gridOptionsAdapter.version >= 28,\n )\n }\n\n // The behavior for deleting cell values changed from v28 and beyond, so we need to track this option's value\n if (this.gridOptionsAdapter.version >= 28) {\n this.backspaceTriggersEdit = this.gridOptionsAdapter.isEnableCellEditingOnBackspace()\n }\n }\n\n handleTabEvent(event: KeyboardEvent) {\n // eslint-disable-next-line sonarjs/deprecation\n const keyCode = event.which || event.keyCode || 0\n\n if (keyCode === KEY_TAB && this.gridApi) {\n if (event.shiftKey) {\n this.gridApi.tabToPreviousCell()\n } else {\n this.gridApi.tabToNextCell()\n }\n } else {\n this.destroy()\n }\n }\n\n afterGuiAttached(): void {\n if (!this.focusAfterAttached) {\n return\n }\n\n const { eInput } = this\n eInput.focus()\n eInput.select()\n // when we started editing, we want the caret at the end, not the start.\n // this comes into play in two scenarios: a) when user hits F2 and b)\n // when user hits a printable character, then on IE (and only IE) the caret\n // was placed after the first character, thus 'apply' would end up as 'pplea'\n const length = eInput.value ? eInput.value.length : 0\n if (length > 0) {\n eInput.setSelectionRange(length, length)\n }\n }\n\n focusIn(): void {\n this.eInput.focus()\n this.eInput.select()\n }\n\n focusOut(): void {\n this.eInput.blur()\n this.autocompleter.destroy()\n }\n\n destroy(): void {\n this.focusOut()\n if (this.stopEditing) {\n this.stopEditing()\n }\n }\n\n getValue(): DataFormat | undefined {\n return this.currentItem\n }\n\n isCancelAfterEnd(): boolean {\n if (this.required) {\n return !this.currentItem\n }\n return false\n }\n\n // eslint-disable-next-line class-methods-use-this\n isCancelBeforeStart(): boolean {\n return false\n }\n\n // eslint-disable-next-line class-methods-use-this\n isPopup(): boolean {\n return false\n }\n}\n","import GridOptionsV24Adapter from './grid-options-v24-adapter'\nimport GridOptionsV28Adapter from './grid-options-v28-adapter'\nimport GridOptionsV29Adapter from './grid-options-v29-adapter'\nimport GridOptionsV31Adapter from './grid-options-v31-adapter'\nimport { IGridOptionsAdapter } from './grid-options-interfaces'\n\n/**\n * Factory function to create the appropriate adapter based on the available properties\n */\nexport default function createGridOptionsAdapter(gridInstance: any): IGridOptionsAdapter {\n if ('gos' in gridInstance) {\n // gridOptionsService was renamed to gos on v31.3.0\n return new GridOptionsV31Adapter(gridInstance.gos)\n }\n if ('gridOptionsService' in gridInstance) {\n if ('in' in gridInstance.gridOptionsService) {\n return new GridOptionsV29Adapter(gridInstance.gridOptionsService)\n }\n // Method `in` was removed from `gridOptionsService` on V31.0.0\n return new GridOptionsV31Adapter(gridInstance.gridOptionsService)\n }\n if ('gridOptionsWrapper' in gridInstance) {\n return new GridOptionsV28Adapter(gridInstance.gridOptionsWrapper)\n }\n return new GridOptionsV24Adapter()\n}\n","import AutocompleteSelectCellEditor from './ag-grid-autocomplete'\n\nexport { DataFormat, IAutocompleteSelectCellEditorParameters } from './types'\nexport { default as AutocompleteSelectCellEditor } from './ag-grid-autocomplete'\n// eslint-disable-next-line unicorn/prefer-export-from\nexport default AutocompleteSelectCellEditor\n"],"names":["root","factory","exports","module","require","define","amd","a","i","self","__WEBPACK_EXTERNAL_MODULE__151__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","GridOptionsV24Adapter","version","isEnableCellEditingOnBackspace","GridOptionsV28Adapter","constructor","gridOptionsWrapper","this","GridOptionsV29Adapter","gridOptionsService","is","GridOptionsV31Adapter","defaultRenderGroup","groupName","groupDiv","document","createElement","textContent","className","defaultRender","item","itemElement","label","renderItems","items","selected","inputValue","clickHandler","render","renderGroup","fragment","createDocumentFragment","elements","previousGroup","group","push","div","addEventListener","event","classList","add","append","singleton","initialValue","newValue","KEYUP_EVENT_NAME","KEYS_TO_IGNORE","Set","DEFAULT_MIN_LENGTH","autocomplete","settings","getDocument","setDocument","input","ownerDocument","globalThis","getItems","setItems","getInputValue","setInputValue","getSelected","setSelected","getKeypressCounter","setKeypressCounter","getDebounceTimer","setDebounceTimer","strict","autoselectfirst","onFreeTextSelect","minLength","showOnFocus","customize","emptyMsg","debounceWaitMs","minimumInputLength","container","containerStyle","style","position","incrementKeypressCounter","clearDebounceTimer","debounceTimer","clearTimeout","containerDisplayed","parentNode","clear","remove","itemClickHandler","preventDefault","stopPropagation","onSelect","update","firstChild","removeChildren","length","empty","body","height","width","offsetWidth","inputRect","getBoundingClientRect","top","offsetHeight","maxHeight","defaultView","innerHeight","bottom","left","updatePosition","element","querySelector","previous","previousElementSibling","includes","offsetTop","scrollTop","selectBottom","containerBottom","updateScroll","updateIfDisplayed","resizeEventHandler","scrollEventHandler","target","startFetch","trigger","savedKeypressCounter","debouncingTime","handleFetchResult","setTimeout","fetch","debouncedFetch","keyupEventHandler","keyCode","which","has","keydownEventHandler","arrowKey","index","at","selectPreviousItem","selectNextItem","handleArrowKeysDown","freeTextSelect","handleSelectKeysDown","focusEventHandler","focusOutEventHandler","activeElement","addEventListeners","destroy","removeEventListener","removeEventListeners","KEY_BACKSPACE_STRING","KEY_DELETE_STRING","KeysHandled","KeysHandledStrings","AutocompleteSelectCellEditor","PopupComponent","getSelectData","parameters","selectData","Array","isArray","getDefaultAutocompleteSettings","cellEditor","escapedValue","replaceAll","String","raw","regex","RegExp","fieldItem","innerHTML","replace","match","eventFunction","currentItem","addManagedListeners","mousedown","addManagedListener","_","name","text","callback","toLowerCase","eInput","filter","n","window","suppressKeyboardEvent","isRequired","backspaceTriggersEdit","isVersionGte28","editing","getStartValue","eventKey","keyPress","formatValue","super","focusAfterAttached","required","getGui","init","gridApi","api","stopEditing","defaultSettings","cellStartedEdit","placeholder","autocompleteParameters","gridInstance","autocompleter","currentValue","result","KeyboardEvent","view","handleTabEvent","gridOptionsAdapter","gos","colDef","suppressParameters","shiftKey","tabToPreviousCell","tabToNextCell","afterGuiAttached","focus","select","setSelectionRange","focusIn","focusOut","blur","getValue","isCancelAfterEnd","isCancelBeforeStart","isPopup"],"sourceRoot":""}
|
package/dist/main.css
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
.ag-cell-editor-autocomplete{background-color:#f5f6fa;z-index:1000;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;border:1px solid rgba(50,50,50,.6);max-height:25% !important;max-width:25% !important}.ag-cell-editor-autocomplete *{font:inherit}.ag-cell-editor-autocomplete>div{margin:0}.ag-cell-editor-autocomplete>div.group{background-color:#7f8fa6;color:#fff}.ag-cell-editor-autocomplete>div:hover:not(.group),.ag-cell-editor-autocomplete>div.selected{background:#dcdde1;cursor:pointer}.ag-cell-editor-autocomplete>div>*>strong{font-weight:bold !important}
|
|
2
|
+
|
|
3
|
+
/*# sourceMappingURL=main.css.map*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.css","mappings":"AAOA,6BACE,wBARgB,CAShB,aACA,gBACA,kBACA,sBACA,mCACA,0BACA,yBAGF,+BACE,aAGF,iCACE,SAGF,uCACE,wBAzBW,CA0BX,WAGF,6FAEE,kBAhCc,CAiCd,eAGF,0CACE,4B","sources":["webpack://ag-grid-autocomplete/./ag-grid-autocomplete.scss"],"sourcesContent":["$backgroundColor: #f5f6fa;\n$selectedColor: #dcdde1;\n$groupColor: #7f8fa6;\n\n.autocomplete {\n}\n\n.ag-cell-editor-autocomplete {\n background-color: $backgroundColor;\n z-index: 1000;\n overflow-y: auto;\n overflow-x: hidden;\n box-sizing: border-box;\n border: 1px solid rgba(50, 50, 50, 0.6);\n max-height: 25% !important;\n max-width: 25% !important;\n}\n\n.ag-cell-editor-autocomplete * {\n font: inherit;\n}\n\n.ag-cell-editor-autocomplete > div {\n margin: 0;\n}\n\n.ag-cell-editor-autocomplete > div.group {\n background-color: $groupColor;\n color: white;\n}\n\n.ag-cell-editor-autocomplete > div:hover:not(.group),\n.ag-cell-editor-autocomplete > div.selected {\n background: $selectedColor;\n cursor: pointer;\n}\n\n.ag-cell-editor-autocomplete > div > * > strong {\n font-weight: bold !important;\n}\n\n// can be use to customize default agGridEditor wrapper\n.ag-cell-editor-autocomplete-wrapper {\n}\n\n// can be use to customize default agGridEditor input text editor\n.ag-cell-editor-autocomplete-input {\n}\n"],"names":[],"sourceRoot":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ag-grid-autocomplete",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Quick implementation of autocompletion into ag-Grid cell using autocompleter package.",
|
|
5
|
+
"deprecated": false,
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"types/ag-grid-autocomplete.d.ts",
|
|
9
|
+
"types/types.d.ts",
|
|
10
|
+
"types/index.d.ts",
|
|
11
|
+
"types/autocompleter/types.d.ts",
|
|
12
|
+
"dist/index.js",
|
|
13
|
+
"dist/index.js.map",
|
|
14
|
+
"dist/main.css",
|
|
15
|
+
"dist/main.css.map"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/gus-costa/ag-grid-autocomplete.git"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "webpack --config config/webpack.prod.js --progress --profile --bail",
|
|
23
|
+
"build:test": "webpack --config config/webpack.test.js --progress --profile --bail",
|
|
24
|
+
"build:watch": "webpack --config config/webpack.prod.js --progress --profile --watch",
|
|
25
|
+
"clean": "rm -rf **/*.map **/*.d.ts *.d.ts *.map ag-grid-autocomplete.js dist/",
|
|
26
|
+
"pretest": "npm run clean && npm run build",
|
|
27
|
+
"test": "npx cypress run",
|
|
28
|
+
"test:matrix": "./test-helpers/cache-deps.sh && ./test-helpers/test-matrix.sh",
|
|
29
|
+
"format": "prettier --write .",
|
|
30
|
+
"lint": "eslint .",
|
|
31
|
+
"lint:fix": "eslint --fix .",
|
|
32
|
+
"semantic-release": "semantic-release",
|
|
33
|
+
"prepare": "husky"
|
|
34
|
+
},
|
|
35
|
+
"author": "Gus Costa",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"keywords": [
|
|
38
|
+
"ag-grid",
|
|
39
|
+
"ag-grid-component",
|
|
40
|
+
"ag-grid-editor",
|
|
41
|
+
"autocomplete",
|
|
42
|
+
"select",
|
|
43
|
+
"dropdown",
|
|
44
|
+
"typeahead",
|
|
45
|
+
"cell-editor",
|
|
46
|
+
"ag-grid-enterprise",
|
|
47
|
+
"ag-grid-community",
|
|
48
|
+
"react-ag-grid",
|
|
49
|
+
"angular-ag-grid",
|
|
50
|
+
"vue-ag-grid",
|
|
51
|
+
"datatable",
|
|
52
|
+
"grid-component",
|
|
53
|
+
"search-component",
|
|
54
|
+
"typescript",
|
|
55
|
+
"ag-grid-autocomplete-editor"
|
|
56
|
+
],
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@ag-grid-community/core": ">= 23 < 33"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@commitlint/cli": "^19.8.0",
|
|
62
|
+
"@commitlint/config-conventional": "^19.8.0",
|
|
63
|
+
"@types/chai": "^5.2.0",
|
|
64
|
+
"@types/node": "^20.17.24",
|
|
65
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
66
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
67
|
+
"ag-grid-autocomplete": "file:./",
|
|
68
|
+
"ag-grid-community": "^32.3.4",
|
|
69
|
+
"autoprefixer": "10.2.5",
|
|
70
|
+
"css-loader": "5.2.2",
|
|
71
|
+
"cypress": "^14.2.0",
|
|
72
|
+
"cypress-real-events": "^1.14.0",
|
|
73
|
+
"eslint": "^8.57.1",
|
|
74
|
+
"eslint-config-airbnb-typescript": "^18.0.0",
|
|
75
|
+
"eslint-config-prettier": "^10.0.1",
|
|
76
|
+
"eslint-plugin-chai-friendly": "^1.0.1",
|
|
77
|
+
"eslint-plugin-cypress": "^3.6.0",
|
|
78
|
+
"eslint-plugin-import": "^2.31.0",
|
|
79
|
+
"eslint-plugin-prettier": "^5.2.3",
|
|
80
|
+
"eslint-plugin-sonarjs": "^3.0.2",
|
|
81
|
+
"eslint-plugin-unicorn": "^56.0.1",
|
|
82
|
+
"husky": "^9.1.7",
|
|
83
|
+
"lint-staged": "^15.5.0",
|
|
84
|
+
"mini-css-extract-plugin": "1.5.0",
|
|
85
|
+
"postcss": "^8.5.2",
|
|
86
|
+
"postcss-loader": "8.1.1",
|
|
87
|
+
"postcss-scss": "4.0.9",
|
|
88
|
+
"prettier": "^3.5.3",
|
|
89
|
+
"sass": "1.32.10",
|
|
90
|
+
"sass-loader": "11.0.1",
|
|
91
|
+
"semantic-release": "^24.2.3",
|
|
92
|
+
"ts-loader": "9.5.2",
|
|
93
|
+
"typescript": "^4.7.4",
|
|
94
|
+
"webpack": "5.98.0",
|
|
95
|
+
"webpack-cli": "6.0.1"
|
|
96
|
+
},
|
|
97
|
+
"commitlint": {
|
|
98
|
+
"extends": [
|
|
99
|
+
"@commitlint/config-conventional"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"lint-staged": {
|
|
103
|
+
"*": [
|
|
104
|
+
"prettier --write --ignore-unknown"
|
|
105
|
+
],
|
|
106
|
+
"*.{js,jsx,ts,tsx,css}": [
|
|
107
|
+
"eslint --cache --fix"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"release": {
|
|
111
|
+
"branches": [
|
|
112
|
+
"main"
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"types": "types/index.d.ts"
|
|
116
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ICellEditorComp, PopupComponent } from '@ag-grid-community/core';
|
|
2
|
+
import { IAutocompleteSelectCellEditorParameters, DataFormat } from './types';
|
|
3
|
+
export default class AutocompleteSelectCellEditor extends PopupComponent implements ICellEditorComp {
|
|
4
|
+
currentItem?: DataFormat;
|
|
5
|
+
private focusAfterAttached;
|
|
6
|
+
private readonly eInput;
|
|
7
|
+
private autocompleter?;
|
|
8
|
+
private required;
|
|
9
|
+
private stopEditing?;
|
|
10
|
+
/**
|
|
11
|
+
* Originally AgGrid would always trigger cell editing when backspace was hit
|
|
12
|
+
*/
|
|
13
|
+
private backspaceTriggersEdit;
|
|
14
|
+
private gridApi?;
|
|
15
|
+
private gridOptionsAdapter;
|
|
16
|
+
private static getSelectData;
|
|
17
|
+
private static getDefaultAutocompleteSettings;
|
|
18
|
+
/**
|
|
19
|
+
* Determines whether a keyboard event should be suppressed in a grid cell.
|
|
20
|
+
* Supports both modern (key-based) and legacy (keyCode-based) keyboard event handling.
|
|
21
|
+
*
|
|
22
|
+
* @param parameters - Event parameters from ag-grid
|
|
23
|
+
* @param isRequired - Whether the cell represents a required field
|
|
24
|
+
* @param backspaceTriggersEdit - Whether pressing backspace should trigger cell editing
|
|
25
|
+
* @param isVersionGte28 - Whether using ag-grid version 28 or greater (which changed edit behavior)
|
|
26
|
+
* @returns True if the event should be suppressed, false otherwise
|
|
27
|
+
*/
|
|
28
|
+
private static suppressKeyboardEvent;
|
|
29
|
+
private static getStartValue;
|
|
30
|
+
constructor();
|
|
31
|
+
init(parameters: IAutocompleteSelectCellEditorParameters<AutocompleteSelectCellEditor>): void;
|
|
32
|
+
handleTabEvent(event: KeyboardEvent): void;
|
|
33
|
+
afterGuiAttached(): void;
|
|
34
|
+
focusIn(): void;
|
|
35
|
+
focusOut(): void;
|
|
36
|
+
destroy(): void;
|
|
37
|
+
getValue(): DataFormat | undefined;
|
|
38
|
+
isCancelAfterEnd(): boolean;
|
|
39
|
+
isCancelBeforeStart(): boolean;
|
|
40
|
+
isPopup(): boolean;
|
|
41
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const enum EventTrigger {
|
|
2
|
+
Keyboard = 0,
|
|
3
|
+
Focus = 1
|
|
4
|
+
}
|
|
5
|
+
export interface AutocompleteItem {
|
|
6
|
+
label?: string;
|
|
7
|
+
group?: string;
|
|
8
|
+
}
|
|
9
|
+
export type RenderFunction<T extends AutocompleteItem> = (item: T, currentValue: string) => HTMLElement;
|
|
10
|
+
export type RenderGroupFunction = (groupName: string, currentValue: string) => HTMLElement;
|
|
11
|
+
export interface AutocompleteSettings<T extends AutocompleteItem> {
|
|
12
|
+
input: HTMLInputElement;
|
|
13
|
+
render?: RenderFunction<T>;
|
|
14
|
+
renderGroup?: RenderGroupFunction;
|
|
15
|
+
className?: string;
|
|
16
|
+
minLength?: number;
|
|
17
|
+
emptyMsg?: string;
|
|
18
|
+
strict: boolean;
|
|
19
|
+
autoselectfirst: boolean;
|
|
20
|
+
onFreeTextSelect?: (item: T, input: HTMLInputElement) => void;
|
|
21
|
+
onSelect: (item: T | undefined, input: HTMLInputElement, event: KeyboardEvent | MouseEvent) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.
|
|
24
|
+
*/
|
|
25
|
+
showOnFocus?: boolean;
|
|
26
|
+
fetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger) => void;
|
|
27
|
+
debounceWaitMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Callback for additional autocomplete customization
|
|
30
|
+
* @param {HTMLInputElement} input - input box associated with autocomplete
|
|
31
|
+
* @param {DOMRect} inputRect - size of the input box and its position relative to the viewport
|
|
32
|
+
* @param {HTMLDivElement} container - container with suggestions
|
|
33
|
+
* @param {number} maxHeight - max height that can be used by autocomplete
|
|
34
|
+
*/
|
|
35
|
+
customize?: (input: HTMLInputElement, inputRect: DOMRect, container: HTMLDivElement, maxHeight: number) => void;
|
|
36
|
+
}
|
|
37
|
+
export interface AutocompleteResult {
|
|
38
|
+
destroy: () => void;
|
|
39
|
+
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import AutocompleteSelectCellEditor from './ag-grid-autocomplete';
|
|
2
|
+
export { DataFormat, IAutocompleteSelectCellEditorParameters } from './types';
|
|
3
|
+
export { default as AutocompleteSelectCellEditor } from './ag-grid-autocomplete';
|
|
4
|
+
export default AutocompleteSelectCellEditor;
|
package/types/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ICellEditorParams, PopupComponent } from '@ag-grid-community/core';
|
|
2
|
+
import { AutocompleteItem, EventTrigger } from './autocompleter/types';
|
|
3
|
+
export interface DataFormat extends AutocompleteItem {
|
|
4
|
+
value: number | string;
|
|
5
|
+
label: string;
|
|
6
|
+
group?: string;
|
|
7
|
+
}
|
|
8
|
+
export type AutocompleteClient = DataFormat & AutocompleteItem;
|
|
9
|
+
export interface IAutocompleterSettings<T extends AutocompleteItem, U extends PopupComponent> {
|
|
10
|
+
render?: (cellEditor: U, item: T, currentValue: string) => HTMLElement;
|
|
11
|
+
renderGroup?: (cellEditor: U, name: string, currentValue: string) => HTMLElement;
|
|
12
|
+
className?: string;
|
|
13
|
+
minLength?: number;
|
|
14
|
+
emptyMsg?: string;
|
|
15
|
+
strict?: boolean;
|
|
16
|
+
autoselectfirst?: boolean;
|
|
17
|
+
onFreeTextSelect?: (cellEditor: U, item: T, input: HTMLInputElement) => void;
|
|
18
|
+
onSelect?: (cellEditor: U, item: T | undefined, input: HTMLInputElement) => void;
|
|
19
|
+
fetch?: (cellEditor: U, text: string, update: (items: T[] | false) => void, trigger?: EventTrigger) => void;
|
|
20
|
+
debounceWaitMs?: number;
|
|
21
|
+
showOnFocus?: boolean;
|
|
22
|
+
customize?: (cellEditor: U, input: HTMLInputElement, inputRect: DOMRect, container: HTMLDivElement, maxHeight: number) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface IAutocompleteSelectCellEditorParameters<U extends PopupComponent> extends ICellEditorParams {
|
|
25
|
+
autocomplete?: IAutocompleterSettings<DataFormat, U>;
|
|
26
|
+
selectData: Array<DataFormat> | ((parameters: IAutocompleteSelectCellEditorParameters<U>) => Array<DataFormat>);
|
|
27
|
+
placeholder?: string;
|
|
28
|
+
required?: boolean;
|
|
29
|
+
}
|