[ES|QL] Interactive LOOKUP JOIN indices with editor flyout#232686
[ES|QL] Interactive LOOKUP JOIN indices with editor flyout#232686
Conversation
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>
…eature/lookup-join-ux
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>
…ibana into feature/lookup-join-ux
| {dataView ? ( | ||
| <EuiFlexGroup direction="column" gutterSize="s" css={{ height: '100%' }}> | ||
| <EuiFlexItem grow={false}> | ||
| <QueryBar /> |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Also, could be helpful to make the search case insensitive.
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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$, []); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
I agree with this decision, let's create an issue to track it
src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx
Outdated
Show resolved
Hide resolved
nreese
left a comment
There was a problem hiding this comment.
kibana-presentation changes LGTM - small changes in file upload
code review only
💚 Build Succeeded
Metrics [docs]Module Count
Public APIs missing comments
Async chunks
Page load bundle
Unknown metric groupsAPI count
async chunk count
ESLint disabled line counts
Total ESLint disabled count
History
|
jughosta
left a comment
There was a problem hiding this comment.
Looks good from my side, thanks for addressing the comments!
| <EuiText size="xs"> | ||
| <FormattedMessage | ||
| id="indexEditor.filePicker.uploadButtonLabel" | ||
| defaultMessage="Upload file" |
There was a problem hiding this comment.
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.
|
I've done an additional round of local testing and didn't spot anything wrong ✅ |
…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>
## 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>

Summary
Closes #207330
This PR adds multiple enhancements to the LOOKUP JOIN UX in Discover.
ES|QL Editor
LOOKUP JOINnow have a custom decorator indicating they’re interactive.view_index_metadata) privileges. Opens the flyout in read-only mode.Index Editor flyout
The index editor lives in a dedicated package,
kbn-index-editor, which provides:esqlplugin).Key features
Inline editing
Built with the
UnifiedDataTablecomponent with some changes:bulk_updateAPI. On success, the flyout closes; on error, a message appears at the top of the flyout.Update/create from file
The flyout integrates with the file upload plugin to:
Query bar
Modes & behavior
Depending on how the flyout is opened:
Create mode
Edit mode
View mode
Permissions & visibility
Actions are gated by:
view_index_metadata(view).How to test
LOOKUP JOINreferencing: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
release_note:*label is applied per the guidelines