Skip to content

[ES|QL] Interactive LOOKUP JOIN indices with editor flyout#232686

Merged
darnautov merged 172 commits intomainfrom
feature/lookup-join-ux
Sep 15, 2025
Merged

[ES|QL] Interactive LOOKUP JOIN indices with editor flyout#232686
darnautov merged 172 commits intomainfrom
feature/lookup-join-ux

Conversation

@darnautov
Copy link
Contributor

@darnautov darnautov commented Aug 22, 2025

Summary

Closes #207330

This PR adds multiple enhancements to the LOOKUP JOIN UX in Discover.

⚠️ Note for reviewers: To fix multiple circular dependency issues, we had to update some plugins/packages — that’s why more codeowners are being triggered than expected.

ES|QL Editor

image
  • Index names in LOOKUP JOIN now have a custom decorator indicating they’re interactive.
  • On hover, users see a context action based on privileges:
    • Edit lookup index — shown when the index exists and the user has write privileges. Opens the flyout in edit mode.
    • View lookup index — shown when the index exists and the user has read-only (with view_index_metadata) privileges. Opens the flyout in read-only mode.
    • Create lookup index — shown when the index doesn’t exist but the user has create-index privileges for the pattern. Opens the flyout in create mode with an empty state.
  • Autocomplete now surfaces a “Create lookup index <index_input>” suggestion at the top when the user has the required privileges.
image

Index Editor flyout

The index editor lives in a dedicated package, kbn-index-editor, which provides:

  • A flyout for create/view/edit.
  • The UI action to open the flyout (registered by the esql plugin).

Key features

Inline editing

Built with the UnifiedDataTable component with some changes:

  • Click any cell to open an edit popover with basic client-side validation.
  • Add column lets users define a new field by name; Elasticsearch infers the data type on save.
  • For empty indices or those with fewer than 4 fields, placeholder columns are appended to make defining new fields easier.
  • Add row inserts an empty row at the top.
  • Save changes batches edits and persists them via the bulk_update API. On success, the flyout closes; on error, a message appears at the top of the flyout.
image

Update/create from file

The flyout integrates with the file upload plugin to:

  • Create an index from CSV files.
  • Append documents to an existing index.
  • Support multiple files per upload (click Upload file or drag-and-drop anywhere in the flyout).
  • Preview file contents before uploading.
  • Show overall upload progress; once complete, the regular grid renders documents from the index.

Query bar


Modes & behavior

Depending on how the flyout is opened:

Create mode

  • Set the index name inline in the flyout header. If the user typed an index name in the ES|QL editor, it’s prefilled (and editable).
  • Start from an empty state: define columns and add rows manually or upload files.
  • The entire flyout acts as a file drop zone.

Edit mode

  • Edit any document in the table.
  • Add new columns and rows.
  • Upload files to append documents.

View mode

  • Disabled actions:
    • File upload and drag-and-drop
    • Inline editing in the data grid

Permissions & visibility

Actions are gated by:

  • Write privileges (edit).
  • Read-only with view_index_metadata (view).
  • Create-index privileges on the pattern (create).

How to test

  1. Open Discover with ES|QL mode.
  2. Type a LOOKUP JOIN referencing:
    • an existing index you can write to,
    • an existing index you can only read,
    • and a non-existent index matching a pattern you can create.
  3. Hover each index name and verify the correct action label.
  4. Open the flyout:
    • Edit: modify a few cells, add a column and a row, click Save changes, confirm success closes the flyout and data persists.
    • Create: set an index name, add columns/rows, or upload a CSV; save and verify the index is created.
    • View: confirm editing and uploads are disabled.
  5. Use Upload file (and drag-and-drop) with multiple CSVs; verify preview, progress, and final grid.
  6. Enter a query in the query bar and click Query this index; confirm Discover opens with the prefilled ES|QL.

Release note

Improve Discover’s LOOKUP JOIN UX with an index editor flyout supporting inline editing, CSV import, contextual actions based on privileges, and a query bar that opens Discover with a prefilled ES|QL query.

Checklist

darnautov and others added 30 commits June 17, 2025 10:53
Sync latest changes from main

---------

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Georgiana-Andreea Onoleață <georgiana.onoleata@elastic.co>
Co-authored-by: mohamedhamed-ahmed <mohamed.ahmed@elastic.co>
Co-authored-by: Alejandro Fernández Haro <alejandro.haro@elastic.co>
Co-authored-by: Ahmad Bamieh <ahmad.bamyeh@elastic.co>
Co-authored-by: Alejandro García Parrondo <31973472+AlexGPlay@users.noreply.github.com>
Co-authored-by: Ania Kowalska <63072419+akowalska622@users.noreply.github.com>
Co-authored-by: Davis McPhee <davis.mcphee@elastic.co>
Co-authored-by: Umberto Pepato <umbopepato@users.noreply.github.com>
Co-authored-by: Damian Polewski <125268832+damian-polewski@users.noreply.github.com>
Co-authored-by: Gergő Ábrahám <gergo.abraham@elastic.co>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com>
Co-authored-by: florent-leborgne <florent.leborgne@elastic.co>
Co-authored-by: Viduni Wickramarachchi <viduni.ushanka@gmail.com>
Co-authored-by: David Olaru <dolaru@elastic.co>
Co-authored-by: Cesare de Cal <cesare.decal@elastic.co>
Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com>
Co-authored-by: Charis Kalpakis <39087493+fake-haris@users.noreply.github.com>
Co-authored-by: Kevin Delemme <kevin.delemme@elastic.co>
Co-authored-by: Tiago Costa <tiago.costa@elastic.co>
Co-authored-by: Mark Hopkin <mark.hopkin@elastic.co>
Co-authored-by: Kevin Lacabane <kevin.lacabane@elastic.co>
Co-authored-by: Larry Gregory <larry.gregory@elastic.co>
Co-authored-by: Nathan Reese <reese.nathan@elastic.co>
Co-authored-by: Søren Louv-Jansen <soren.louv@elastic.co>
Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <38698566+miloszmarcinkowski@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <milosz.marcinkowski@elastic.co>
Co-authored-by: Katerina <kate@kpatticha.com>
Co-authored-by: Jatin Kathuria <jatin.kathuria@elastic.co>
Co-authored-by: Paul Tavares <56442535+paul-tavares@users.noreply.github.com>
Co-authored-by: Marshall Main <55718608+marshallmain@users.noreply.github.com>
Co-authored-by: Maxim Palenov <maxim.palenov@elastic.co>
Co-authored-by: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com>
Co-authored-by: Alexi Doak <109488926+doakalexi@users.noreply.github.com>
Co-authored-by: Alexandra Doak <alexandra.doak@elastic.co>
Co-authored-by: Paulina Shakirova <paulina.shakirova@elastic.co>
Co-authored-by: Mason Herron <46727170+Supplementing@users.noreply.github.com>
Co-authored-by: Marta Bondyra <4283304+mbondyra@users.noreply.github.com>
Co-authored-by: Devon Thomson <devon.thomson@elastic.co>
Co-authored-by: Quynh Nguyen (Quinn) <43350163+qn895@users.noreply.github.com>
Co-authored-by: Ying Mao <ying.mao@elastic.co>
Co-authored-by: Ievgen Sorokopud <ievgen.sorokopud@elastic.co>
Co-authored-by: Kris Gross <57641133+k-g-elastic@users.noreply.github.com>
Co-authored-by: dkirchan <diamantis.kirchantzoglou@elastic.co>
Co-authored-by: Lola <omolola.akinleye@elastic.co>
Co-authored-by: Khristinin Nikita <nikita.khristinin@elastic.co>
Co-authored-by: Julian Gernun <17549662+jcger@users.noreply.github.com>
Co-authored-by: Nastasha Solomon <79124755+nastasha-solomon@users.noreply.github.com>
Co-authored-by: Maryam Saeidi <maryam.saeidi@elastic.co>
Co-authored-by: Konrad Szwarc <konrad.szwarc@elastic.co>
Co-authored-by: Angela Chuang <yi-chun.chuang@elastic.co>
…ES|QL editor (#213525)

## Summary

Related issue #207330

> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)

- Highlights LOOKUP JOIN indices in the ES|QL editor 

<img width="481" alt="image"
src="https://github.com/user-attachments/assets/d3ac2dce-bcde-42a2-9e32-bd5089a2a4c6"
/>


- Clicking on a token Opens a flyout with index content

<img width="1951" alt="image"
src="https://github.com/user-attachments/assets/73a80493-1170-4d7e-822a-2c17f1f72a9d"
/>

- The user can edit doc entires in the data grid 

<img width="1457" alt="image"
src="https://github.com/user-attachments/assets/77792beb-3a3b-4be4-a831-e59f08f7fcac"
/>

- All changes are scheduled and saved with the bulk update 
- There is a 5 second timer allowing the user to Undo the latest changes
before saving

<img width="1008" alt="image"
src="https://github.com/user-attachments/assets/92d39240-2767-48d8-be9f-8ff2be9a6bc9"
/>

### Checklist


- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [x] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary

Related issue #207330

Adds file upload support to the LOOKUP JOIN flyout. 


https://github.com/user-attachments/assets/dc9fde9c-1947-4722-9e84-d829342bae2d



> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)

### Checklist

- [ ] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [ ] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary
* Added the component for adding new rows and columns.
* Saves the row as a new doc synchronously.
* Shows a toast after saving new row.
* Shows a toast if request fails.
* Shows a validation error if no input has been filled.

### Pendings
* Refresh rows after adding new rows.
* Virtual scroll.
* Validations.

<img width="1286" alt="image"
src="https://github.com/user-attachments/assets/56768dcc-1cb1-4309-812a-37147801da28"
/>




### Checklist

Check the PR satisfies following conditions. 

Reviewers should verify this PR satisfies this list as well.

- [ ] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [ ] If a plugin configuration key changed, check if it needs to be
allowlisted in the cloud and added to the [docker
list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)
- [ ] This was checked for breaking HTTP API changes, and any breaking
changes have been approved by the breaking-change committee. The
`release_note:breaking` label should be applied in these situations.
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

### Identify risks

Does this PR introduce any risks? For example, consider risks like hard
to test bugs, performance regression, potential of data loss.

Describe the risk, its severity, and mitigation for each identified
risk. Invite stakeholders and evaluate how to proceed before merging.

- [ ] [See some risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx)
- [ ] ...
## Summary

> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)

Related issue #207330

Adds CSV file preview in Data Grid format. 

<img width="1532" alt="image"
src="https://github.com/user-attachments/assets/9969a1c5-e65b-4a19-8446-d825a515bb91"
/>

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co>
## Summary

> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)

Related issue #207330

- Fixes circular dependencies 
- Improves styles for the file import 
- Fixes file upload for an existing index

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary
Related issue #207330

Adds simple type validations when editing/adding a new cell in the index
editor.

<img width="1271" alt="image"
src="https://github.com/user-attachments/assets/6ec9fae4-f0d6-4ab2-b32e-64dc1594c36a"
/>
## Summary
Related issue #207330

Add the possibility of adding new columns.

* Extracted addColumn and addRow to separate components.
* Make full cells clickable.
* Display warning modal if the user tries to leave with unsaved columns.
* Parse cell values to primitives before saving to ES, this is needed to
be able to create number or boolean fields.


https://github.com/user-attachments/assets/158393b9-d0e9-43be-ae45-c6f06cbf0fc5

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Related issue #207330
## Summary

Display input validations as tooltips, instead of toasts.

<img width="1266" alt="image"
src="https://github.com/user-attachments/assets/18024851-86bd-4f4d-bf46-9c0c1cf4a72a"
/>

<img width="262" alt="image"
src="https://github.com/user-attachments/assets/39295aa6-83e2-4862-8a29-5de5a1964334"
/>
Part of #207330
## Summary

* Added index ad-hoc creation, this mode allows to add manually all the
index data before creating it.
* Empty fields column headers are now editable.
* Suggest up to 4 empty fields to be completed.
* Add a default row to allow editing.
* Fixed console warning message about no div inside p allowed.
* Fixed bug that prevented cells of the same row to be edited.

<img width="1303" height="778" alt="image"
src="https://github.com/user-attachments/assets/52976551-7e9a-4aba-8912-7246d183f301"
/>

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Dima Arnautov <arnautov.dima@gmail.com>
Part of #207330

## Summary
While columns are not saved into elastic search, allow editing it's
names.

* Created `colum_input_control.tsx` as counterpart to
`value_input_control.tsx` to hold the custom renderization of the header
columns.
* Moved both into a folder `grid_custom_redenderers` folder.
* Added a new action to edit the name of unsaved columns.
* Allow deleting unsaved columns.
* Improve how unsavedColumns are tracked:
* They are now added to the dataview after being saved, otherwise they
would be shown after discarding changes.
* This change is also present in
#228146, had to bring it as it was
needed here too.




https://github.com/user-attachments/assets/ee97a1cf-171a-4acb-b31a-020a359eb8ed
…refresh (#229320)

## Summary

Part of #207330

> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)


- Adds a hover action for opening the LOOKUP INDEX flyout
<img width="468" height="203" alt="image"
src="https://github.com/user-attachments/assets/44e08b7e-d2b6-4eaf-a2f2-278596eec3cd"
/>

<img width="550" height="197" alt="image"
src="https://github.com/user-attachments/assets/dffae7ce-78de-4ff4-bb19-15e00df82e63"
/>

- Fixes insertion of the created index name into the query, and
prettifies the query
- Refreshes LOOKUP INDEX decorators on flyout close 

### Checklist

- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
… and boolean visibility (#229077)

Part of #207330
## Summary
* After adding the first value in a newly created column, update the
dataview to display the infered type.
* Fix: When editing a column name, don't lose added values on it.
* Fix: deleted columns with added values where being created on index
save.
* Fix: undo button was only letting to undo one cell change.
* Boolean values where not being displayed when saving.
…unsaved data (#228146)

Part of #207330


[Design](https://www.figma.com/design/QltbaeErcZzbVbSqwpccvG/Lookup-UX?node-id=370-192968&t=OQJJ14tvxgLgcPFJ-0)

## Summary
* Add a warning message when dropping a file upon unsaved data.
* When deciding to override the data, it's cleaned up from memory.
* Improve how unsavedColumns are tracked:
* They are now added to the dataview after being saved, otherwise they
would be shown after discarding changes.



https://github.com/user-attachments/assets/a2271f2f-3503-4d3d-93e5-a4aaa18df9dc

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Part of #207330

> ⚠️ **Note for reviewers:** This PR is targeting the [feature
branch](https://github.com/elastic/kibana/tree/feature/lookup-join-ux)

## Summary
Improves the grid accessibility by:
* Allowing the user to modify cell values using arrows, enter and scape.
* The inputs are no longer displayed in the body of the cell, they are
now shown as a custom popup.
* The `dataGrid` ref has been forwarded so it can be used for
`UnifiedDataTable`, this ref exposes a method to programatically select
the focused cell, it's used to keep the focus in the correct place after
editing a cell.
* `WithRestorableState` HOC now forwards the ref of the component it's
wrapping. (Needed as `UnifiedDataTable` is wrapped with it.)
* Allow the user to modify columns using keyboard.
* Unfortunately `dataGrid` does not expose a way to set focus on column
headers, and does not allow to display popups on them. So making them
keyboard navegable has been more tricky. It requires to set a data
property in the html element that wraps the header and to manually put
focus on it when required.
  * We still need a double enter to edit it.
* Don't move the placeholder columns when filled.
* Previous implementation was pushing the placeholders at the end of the
columns array, now they preserve its place, this is done by treating the
placeholders as normal unsaved columns, the user now edits these
columns, instead of adding a new one. This requires now to ignore the
placeholders columns in some parts of the code.


https://github.com/user-attachments/assets/e286fbe7-514a-4ab2-bb06-19a6d286aa78

### Checklist

Check the PR satisfies following conditions. 

Reviewers should verify this PR satisfies this list as well.
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Part of #207330

> ⚠️ Built on top of #229907, that
needs to be merged first.
## Summary
* Both for creating an index from scratch as well as editing the
behaviour for adding a new row will be to push a new row in the grid in
the first position. The focus will be changed to the first cell of the
row, and if the user is in a different page than the first one, it will
be directed to the first page.

* For adding a new column, now the "Add field" button will push a new
placeholder column into the grid (in the last position), if the new
column is out of the viewport the grid will be auto scrolled until it's
visible.

* "Add row" button has been renamed as "Add document".

* Added an illustration to the empty state.

<img width="1726" height="874" alt="image"
src="https://github.com/user-attachments/assets/0bbd3476-e4e2-4e16-9060-38f5955d6e0f"
/>

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
{dataView ? (
<EuiFlexGroup direction="column" gutterSize="s" css={{ height: '100%' }}>
<EuiFlexItem grow={false}>
<QueryBar />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The search requires Enter keystroke. Might become confusing for some users that it does not filter right away and there is no button to submit the search.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, could be helpful to make the search case insensitive.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The file uploader creates the string field as keywords, so it's not allowing to perform case insensitive searches, will check if it's possible to change it.

With regard the onEnter behaviour, whats your take about it @ninoslavmiskovic ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also mentioned the case insensitive, but that is something that will require some additional work, so perhaps a separate PR.

Regarding the search, I don't see it as a blocker and it follows the EUI component. We can monitor feedback post launch, but I am not that concern since e.g. people are used to google.com and there is no search button here only "enter" for search.

} = useKibana<KibanaContextExtra>();

const isFetching = useObservable(indexUpdateService.isFetching$, false);
const sortOrder = useObservable(indexUpdateService.sortOrder$, []);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a couple of issues related to sorting:

  1. when in edit mode I add a new row, sorting does not account for their values
  2. when I after that add more empty rows and then try to delete them, my existing rows gets deleted instead

Sep-10-2025 17-41-09

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorting is being done server side, thats why unsaved values do not participate in it.

With regard the deletion bug, thanks for spotting it, it's happening because both, our sorting and the UnifiedDataTable inner sorting are being executed at the same time, leading to an inconsistent state.

It seems there is no way to disable the default sorting mechanism in UnifiedDataTable, talking with @darnautov we decided to disable the sorting functionality for now, as it's not critical for the feature and it's not trivial to solve.

CC: @jughosta @stratoula

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with this decision, let's create an issue to track it

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

@nreese nreese left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kibana-presentation changes LGTM - small changes in file upload
code review only

@darnautov darnautov requested a review from markov00 September 15, 2025 12:58
@sddonne sddonne requested a review from jughosta September 15, 2025 13:08
@elasticmachine
Copy link
Contributor

elasticmachine commented Sep 15, 2025

💚 Build Succeeded

Metrics [docs]

Module Count

Fewer modules leads to a faster build time

id before after diff
console 246 247 +1
controls 397 398 +1
dashboard 720 721 +1
data 516 517 +1
datasetQuality 844 845 +1
dataVisualizer 763 764 +1
discover 1553 1554 +1
esql 131 418 +287
eventAnnotationListing 567 568 +1
infra 1568 1569 +1
lens 1412 1417 +5
lists 336 337 +1
maps 1284 1285 +1
ml 2516 2517 +1
observability 1405 1406 +1
observabilityAIAssistantApp 441 442 +1
onechat 506 507 +1
securitySolution 7993 7994 +1
slo 1249 1250 +1
stackAlerts 282 304 +22
streamsApp 648 649 +1
triggersActionsUi 972 973 +1
unifiedSearch 462 463 +1
total +334

Public APIs missing comments

Total count of every public API that lacks a comment. Target amount is 0. Run node scripts/build_api_docs --plugin [yourplugin] --stats comments for more detailed information.

id before after diff
@kbn/discover-utils 355 363 +8
@kbn/es-types 31 32 +1
@kbn/esql-utils 102 103 +1
@kbn/esql-validation-autocomplete 29 33 +4
@kbn/file-upload 81 82 +1
@kbn/index-editor - 19 +19
@kbn/monaco 193 197 +4
@kbn/unified-data-table 112 113 +1
total +39

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
cloudSecurityPosture 565.0KB 565.8KB +806.0B
dashboard 646.1KB 646.1KB +17.0B
dataVisualizer 684.1KB 684.6KB +457.0B
discover 1.1MB 1.1MB +839.0B
esql 270.9KB 519.0KB ⚠️ +248.1KB
esqlDataGrid 145.0KB 145.8KB +777.0B
lens 1.5MB 1.5MB +241.0B
maps 3.1MB 3.1MB +17.0B
observabilityAIAssistantApp 177.7KB 177.7KB +17.0B
onechat 257.6KB 257.6KB +41.0B
securitySolution 10.5MB 10.5MB +805.0B
slo 974.2KB 975.0KB +807.0B
stackAlerts 64.9KB 64.9KB +20.0B
total +252.8KB

Page load bundle

Size of the bundles that are downloaded on every page load. Target size is below 100kb

id before after diff
dataVisualizer 26.4KB 26.5KB +76.0B
esql 9.3KB 11.0KB +1.7KB
esqlDataGrid 9.1KB 9.1KB +28.0B
fileUpload 15.8KB 16.0KB +214.0B
kbnUiSharedDeps-srcJs 3.8MB 3.8MB +1.1KB
lens 60.9KB 60.9KB +17.0B
total +3.1KB
Unknown metric groups

API count

id before after diff
@kbn/cell-actions 44 45 +1
@kbn/discover-utils 413 421 +8
@kbn/es-types 31 32 +1
@kbn/esql-utils 120 123 +3
@kbn/esql-validation-autocomplete 32 36 +4
@kbn/file-upload 81 82 +1
@kbn/index-editor - 20 +20
@kbn/monaco 193 197 +4
@kbn/unified-data-table 121 136 +15
total +57

async chunk count

id before after diff
esql 7 12 +5

ESLint disabled line counts

id before after diff
@kbn/esql-editor 6 7 +1
@kbn/index-editor - 1 +1
total +2

Total ESLint disabled count

id before after diff
@kbn/esql-editor 6 7 +1
@kbn/index-editor - 1 +1
total +2

History

cc @darnautov @sddonne

Copy link
Contributor

@jughosta jughosta left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good from my side, thanks for addressing the comments!

<EuiText size="xs">
<FormattedMessage
id="indexEditor.filePicker.uploadButtonLabel"
defaultMessage="Upload file"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!
Would be great if it were preselecting this tab or having a red badge next to the tab name. Otherwise, it's hard to notice the error message.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks!

@akowalska622
Copy link
Contributor

I've done an additional round of local testing and didn't spot anything wrong ✅

@darnautov darnautov enabled auto-merge (squash) September 15, 2025 14:48
@darnautov darnautov merged commit 8a3cfee into main Sep 15, 2025
13 checks passed
@darnautov darnautov deleted the feature/lookup-join-ux branch September 15, 2025 15:15
CAWilson94 pushed a commit to CAWilson94/kibana that referenced this pull request Sep 24, 2025
…32686)

## Summary

Closes  elastic#207330

This PR adds multiple enhancements to the **LOOKUP JOIN** UX in
Discover.

> ⚠️ **Note for reviewers:** To fix multiple circular dependency issues,
we had to update some plugins/packages — that’s why more codeowners are
being triggered than expected.


## ES|QL Editor

<img width="475" height="225" alt="image"
src="https://github.com/user-attachments/assets/bb96ef29-21a5-4f42-a9e7-59820b1fc127"
/>

- Index names in `LOOKUP JOIN` now have a custom decorator indicating
they’re interactive.
- On hover, users see a context action based on privileges:
- **Edit lookup index** — shown when the index exists and the user has
write privileges. Opens the flyout in edit mode.
- **View lookup index** — shown when the index exists and the user has
read-only (with `view_index_metadata`) privileges. Opens the flyout in
read-only mode.
- **Create lookup index** — shown when the index doesn’t exist but the
user has create-index privileges for the pattern. Opens the flyout in
create mode with an empty state.
- Autocomplete now surfaces a **“Create lookup index <index_input>”**
suggestion at the top when the user has the required privileges.

<img width="744" height="221" alt="image"
src="https://github.com/user-attachments/assets/da641619-070d-4990-8e3c-fc79c865b922"
/>

---

## Index Editor flyout 

The index editor lives in a dedicated package, **`kbn-index-editor`**,
which provides:
- A flyout for create/view/edit.
- The UI action to open the flyout (registered by the `esql` plugin).

### Key features

#### Inline editing
Built with the `UnifiedDataTable` component with some changes:
- Click any cell to open an edit popover with basic client-side
validation.
- **Add column** lets users define a new field by name; Elasticsearch
infers the data type on save.
- For empty indices or those with fewer than 4 fields, placeholder
columns are appended to make defining new fields easier.
- **Add row** inserts an empty row at the top.
- **Save changes** batches edits and persists them via the `bulk_update`
API. On success, the flyout closes; on error, a message appears at the
top of the flyout.

<img width="1802" height="1049" alt="image"
src="https://github.com/user-attachments/assets/a009d8ac-91b9-45ee-866a-8e48232f3ce9"
/>

#### Update/create from file
The flyout integrates with the file upload plugin to:
- Create an index from CSV files.
- Append documents to an existing index.
- Support multiple files per upload (click **Upload file** or
drag-and-drop anywhere in the flyout).
- Preview file contents before uploading.
- Show overall upload progress; once complete, the regular grid renders
documents from the index.

#### Query bar
- The query bar accepts the ES|QL **query string** format:
<https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions#esql-qstr>.
- **Query this index** opens Discover in a new tab with a prepopulated
ES|QL query.

---

## Modes & behavior

Depending on how the flyout is opened:

### Create mode
- Set the index name inline in the flyout header. If the user typed an
index name in the ES|QL editor, it’s prefilled (and editable).
- Start from an empty state: define columns and add rows manually or
upload files.
- The entire flyout acts as a file drop zone.

### Edit mode
- Edit any document in the table.
- Add new columns and rows.
- Upload files to append documents.

### View mode
- Disabled actions:
  - File upload and drag-and-drop
  - Inline editing in the data grid

---

## Permissions & visibility

Actions are gated by:
- Write privileges (edit).
- Read-only with `view_index_metadata` (view).
- Create-index privileges on the pattern (create).

---

## How to test

1. Open Discover with ES|QL mode.
2. Type a `LOOKUP JOIN` referencing:
   - an existing index you can write to,
   - an existing index you can only read,
   - and a non-existent index matching a pattern you can create.
3. Hover each index name and verify the correct action label.
4. Open the flyout:
- **Edit**: modify a few cells, add a column and a row, click **Save
changes**, confirm success closes the flyout and data persists.
- **Create**: set an index name, add columns/rows, or upload a CSV; save
and verify the index is created.
   - **View**: confirm editing and uploads are disabled.
5. Use **Upload file** (and drag-and-drop) with multiple CSVs; verify
preview, progress, and final grid.
6. Enter a query in the query bar and click **Query this index**;
confirm Discover opens with the prefilled ES|QL.

---

## Release note

Improve Discover’s LOOKUP JOIN UX with an index editor flyout supporting
inline editing, CSV import, contextual actions based on privileges, and
a query bar that opens Discover with a prefilled ES|QL query.


### Checklist

- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [x] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [x] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Georgiana-Andreea Onoleață <georgiana.onoleata@elastic.co>
Co-authored-by: mohamedhamed-ahmed <mohamed.ahmed@elastic.co>
Co-authored-by: Alejandro Fernández Haro <alejandro.haro@elastic.co>
Co-authored-by: Ahmad Bamieh <ahmad.bamyeh@elastic.co>
Co-authored-by: Alejandro García Parrondo <31973472+AlexGPlay@users.noreply.github.com>
Co-authored-by: Ania Kowalska <63072419+akowalska622@users.noreply.github.com>
Co-authored-by: Davis McPhee <davis.mcphee@elastic.co>
Co-authored-by: Umberto Pepato <umbopepato@users.noreply.github.com>
Co-authored-by: Damian Polewski <125268832+damian-polewski@users.noreply.github.com>
Co-authored-by: Gergő Ábrahám <gergo.abraham@elastic.co>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com>
Co-authored-by: florent-leborgne <florent.leborgne@elastic.co>
Co-authored-by: Viduni Wickramarachchi <viduni.ushanka@gmail.com>
Co-authored-by: David Olaru <dolaru@elastic.co>
Co-authored-by: Cesare de Cal <cesare.decal@elastic.co>
Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com>
Co-authored-by: Charis Kalpakis <39087493+fake-haris@users.noreply.github.com>
Co-authored-by: Kevin Delemme <kevin.delemme@elastic.co>
Co-authored-by: Tiago Costa <tiago.costa@elastic.co>
Co-authored-by: Mark Hopkin <mark.hopkin@elastic.co>
Co-authored-by: Kevin Lacabane <kevin.lacabane@elastic.co>
Co-authored-by: Larry Gregory <larry.gregory@elastic.co>
Co-authored-by: Nathan Reese <reese.nathan@elastic.co>
Co-authored-by: Søren Louv-Jansen <soren.louv@elastic.co>
Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <38698566+miloszmarcinkowski@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <milosz.marcinkowski@elastic.co>
Co-authored-by: Katerina <kate@kpatticha.com>
Co-authored-by: Jatin Kathuria <jatin.kathuria@elastic.co>
Co-authored-by: Paul Tavares <56442535+paul-tavares@users.noreply.github.com>
Co-authored-by: Marshall Main <55718608+marshallmain@users.noreply.github.com>
Co-authored-by: Maxim Palenov <maxim.palenov@elastic.co>
Co-authored-by: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com>
Co-authored-by: Alexi Doak <109488926+doakalexi@users.noreply.github.com>
Co-authored-by: Alexandra Doak <alexandra.doak@elastic.co>
Co-authored-by: Paulina Shakirova <paulina.shakirova@elastic.co>
Co-authored-by: Mason Herron <46727170+Supplementing@users.noreply.github.com>
Co-authored-by: Marta Bondyra <4283304+mbondyra@users.noreply.github.com>
Co-authored-by: Devon Thomson <devon.thomson@elastic.co>
Co-authored-by: Quynh Nguyen (Quinn) <43350163+qn895@users.noreply.github.com>
Co-authored-by: Ying Mao <ying.mao@elastic.co>
Co-authored-by: Ievgen Sorokopud <ievgen.sorokopud@elastic.co>
Co-authored-by: Kris Gross <57641133+k-g-elastic@users.noreply.github.com>
Co-authored-by: dkirchan <diamantis.kirchantzoglou@elastic.co>
Co-authored-by: Lola <omolola.akinleye@elastic.co>
Co-authored-by: Khristinin Nikita <nikita.khristinin@elastic.co>
Co-authored-by: Julian Gernun <17549662+jcger@users.noreply.github.com>
Co-authored-by: Nastasha Solomon <79124755+nastasha-solomon@users.noreply.github.com>
Co-authored-by: Maryam Saeidi <maryam.saeidi@elastic.co>
Co-authored-by: Konrad Szwarc <konrad.szwarc@elastic.co>
Co-authored-by: Angela Chuang <yi-chun.chuang@elastic.co>
Co-authored-by: Sebastian Delle Donne <sebastian.delledonne@elastic.co>
Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co>
niros1 pushed a commit that referenced this pull request Sep 30, 2025
## Summary

Closes  #207330

This PR adds multiple enhancements to the **LOOKUP JOIN** UX in
Discover.

> ⚠️ **Note for reviewers:** To fix multiple circular dependency issues,
we had to update some plugins/packages — that’s why more codeowners are
being triggered than expected.


## ES|QL Editor

<img width="475" height="225" alt="image"
src="https://github.com/user-attachments/assets/bb96ef29-21a5-4f42-a9e7-59820b1fc127"
/>

- Index names in `LOOKUP JOIN` now have a custom decorator indicating
they’re interactive.
- On hover, users see a context action based on privileges:
- **Edit lookup index** — shown when the index exists and the user has
write privileges. Opens the flyout in edit mode.
- **View lookup index** — shown when the index exists and the user has
read-only (with `view_index_metadata`) privileges. Opens the flyout in
read-only mode.
- **Create lookup index** — shown when the index doesn’t exist but the
user has create-index privileges for the pattern. Opens the flyout in
create mode with an empty state.
- Autocomplete now surfaces a **“Create lookup index <index_input>”**
suggestion at the top when the user has the required privileges.

<img width="744" height="221" alt="image"
src="https://github.com/user-attachments/assets/da641619-070d-4990-8e3c-fc79c865b922"
/>

---

## Index Editor flyout 

The index editor lives in a dedicated package, **`kbn-index-editor`**,
which provides:
- A flyout for create/view/edit.
- The UI action to open the flyout (registered by the `esql` plugin).

### Key features

#### Inline editing
Built with the `UnifiedDataTable` component with some changes:
- Click any cell to open an edit popover with basic client-side
validation.
- **Add column** lets users define a new field by name; Elasticsearch
infers the data type on save.
- For empty indices or those with fewer than 4 fields, placeholder
columns are appended to make defining new fields easier.
- **Add row** inserts an empty row at the top.
- **Save changes** batches edits and persists them via the `bulk_update`
API. On success, the flyout closes; on error, a message appears at the
top of the flyout.

<img width="1802" height="1049" alt="image"
src="https://github.com/user-attachments/assets/a009d8ac-91b9-45ee-866a-8e48232f3ce9"
/>

#### Update/create from file
The flyout integrates with the file upload plugin to:
- Create an index from CSV files.
- Append documents to an existing index.
- Support multiple files per upload (click **Upload file** or
drag-and-drop anywhere in the flyout).
- Preview file contents before uploading.
- Show overall upload progress; once complete, the regular grid renders
documents from the index.

#### Query bar
- The query bar accepts the ES|QL **query string** format:
<https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions#esql-qstr>.
- **Query this index** opens Discover in a new tab with a prepopulated
ES|QL query.

---

## Modes & behavior

Depending on how the flyout is opened:

### Create mode
- Set the index name inline in the flyout header. If the user typed an
index name in the ES|QL editor, it’s prefilled (and editable).
- Start from an empty state: define columns and add rows manually or
upload files.
- The entire flyout acts as a file drop zone.

### Edit mode
- Edit any document in the table.
- Add new columns and rows.
- Upload files to append documents.

### View mode
- Disabled actions:
  - File upload and drag-and-drop
  - Inline editing in the data grid

---

## Permissions & visibility

Actions are gated by:
- Write privileges (edit).
- Read-only with `view_index_metadata` (view).
- Create-index privileges on the pattern (create).

---

## How to test

1. Open Discover with ES|QL mode.
2. Type a `LOOKUP JOIN` referencing:
   - an existing index you can write to,
   - an existing index you can only read,
   - and a non-existent index matching a pattern you can create.
3. Hover each index name and verify the correct action label.
4. Open the flyout:
- **Edit**: modify a few cells, add a column and a row, click **Save
changes**, confirm success closes the flyout and data persists.
- **Create**: set an index name, add columns/rows, or upload a CSV; save
and verify the index is created.
   - **View**: confirm editing and uploads are disabled.
5. Use **Upload file** (and drag-and-drop) with multiple CSVs; verify
preview, progress, and final grid.
6. Enter a query in the query bar and click **Query this index**;
confirm Discover opens with the prefilled ES|QL.

---

## Release note

Improve Discover’s LOOKUP JOIN UX with an index editor flyout supporting
inline editing, CSV import, contextual actions based on privileges, and
a query bar that opens Discover with a prefilled ES|QL query.


### Checklist

- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [x] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [x] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Georgiana-Andreea Onoleață <georgiana.onoleata@elastic.co>
Co-authored-by: mohamedhamed-ahmed <mohamed.ahmed@elastic.co>
Co-authored-by: Alejandro Fernández Haro <alejandro.haro@elastic.co>
Co-authored-by: Ahmad Bamieh <ahmad.bamyeh@elastic.co>
Co-authored-by: Alejandro García Parrondo <31973472+AlexGPlay@users.noreply.github.com>
Co-authored-by: Ania Kowalska <63072419+akowalska622@users.noreply.github.com>
Co-authored-by: Davis McPhee <davis.mcphee@elastic.co>
Co-authored-by: Umberto Pepato <umbopepato@users.noreply.github.com>
Co-authored-by: Damian Polewski <125268832+damian-polewski@users.noreply.github.com>
Co-authored-by: Gergő Ábrahám <gergo.abraham@elastic.co>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com>
Co-authored-by: florent-leborgne <florent.leborgne@elastic.co>
Co-authored-by: Viduni Wickramarachchi <viduni.ushanka@gmail.com>
Co-authored-by: David Olaru <dolaru@elastic.co>
Co-authored-by: Cesare de Cal <cesare.decal@elastic.co>
Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com>
Co-authored-by: Charis Kalpakis <39087493+fake-haris@users.noreply.github.com>
Co-authored-by: Kevin Delemme <kevin.delemme@elastic.co>
Co-authored-by: Tiago Costa <tiago.costa@elastic.co>
Co-authored-by: Mark Hopkin <mark.hopkin@elastic.co>
Co-authored-by: Kevin Lacabane <kevin.lacabane@elastic.co>
Co-authored-by: Larry Gregory <larry.gregory@elastic.co>
Co-authored-by: Nathan Reese <reese.nathan@elastic.co>
Co-authored-by: Søren Louv-Jansen <soren.louv@elastic.co>
Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <38698566+miloszmarcinkowski@users.noreply.github.com>
Co-authored-by: Milosz Marcinkowski <milosz.marcinkowski@elastic.co>
Co-authored-by: Katerina <kate@kpatticha.com>
Co-authored-by: Jatin Kathuria <jatin.kathuria@elastic.co>
Co-authored-by: Paul Tavares <56442535+paul-tavares@users.noreply.github.com>
Co-authored-by: Marshall Main <55718608+marshallmain@users.noreply.github.com>
Co-authored-by: Maxim Palenov <maxim.palenov@elastic.co>
Co-authored-by: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com>
Co-authored-by: Alexi Doak <109488926+doakalexi@users.noreply.github.com>
Co-authored-by: Alexandra Doak <alexandra.doak@elastic.co>
Co-authored-by: Paulina Shakirova <paulina.shakirova@elastic.co>
Co-authored-by: Mason Herron <46727170+Supplementing@users.noreply.github.com>
Co-authored-by: Marta Bondyra <4283304+mbondyra@users.noreply.github.com>
Co-authored-by: Devon Thomson <devon.thomson@elastic.co>
Co-authored-by: Quynh Nguyen (Quinn) <43350163+qn895@users.noreply.github.com>
Co-authored-by: Ying Mao <ying.mao@elastic.co>
Co-authored-by: Ievgen Sorokopud <ievgen.sorokopud@elastic.co>
Co-authored-by: Kris Gross <57641133+k-g-elastic@users.noreply.github.com>
Co-authored-by: dkirchan <diamantis.kirchantzoglou@elastic.co>
Co-authored-by: Lola <omolola.akinleye@elastic.co>
Co-authored-by: Khristinin Nikita <nikita.khristinin@elastic.co>
Co-authored-by: Julian Gernun <17549662+jcger@users.noreply.github.com>
Co-authored-by: Nastasha Solomon <79124755+nastasha-solomon@users.noreply.github.com>
Co-authored-by: Maryam Saeidi <maryam.saeidi@elastic.co>
Co-authored-by: Konrad Szwarc <konrad.szwarc@elastic.co>
Co-authored-by: Angela Chuang <yi-chun.chuang@elastic.co>
Co-authored-by: Sebastian Delle Donne <sebastian.delledonne@elastic.co>
Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:skip This PR does not require backporting ci:cloud-deploy Create or update a Cloud deployment Feature:ES|QL ES|QL related features in Kibana needs_docs release_note:feature Makes this part of the condensed release notes Team:ESQL ES|QL related features in Kibana t// v9.2.0