diff --git a/apps/exampleapp/apiserver.config.js b/apps/exampleapp/apiserver.config.js index ebb65bc3b..9a6b5d69a 100644 --- a/apps/exampleapp/apiserver.config.js +++ b/apps/exampleapp/apiserver.config.js @@ -12,11 +12,15 @@ const apiServer = require("./apiserver.config") */ let peaksData = require("./public/peaks.json") +let secretOptions = require("./public/secretOptions.json") const bodyParser = require("body-parser") module.exports = { getHandlers: () => { return (devServer) => { + devServer.app.get("/secrets", function (req, res) { + res.json(secretOptions) + }) devServer.app.get("/peaks", function (req, res) { res.json(peaksData) }) diff --git a/apps/exampleapp/package.json b/apps/exampleapp/package.json index 5ebf2433a..b0104ddc6 100644 --- a/apps/exampleapp/package.json +++ b/apps/exampleapp/package.json @@ -8,6 +8,7 @@ "@babel/core": "^7.20.2", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", + "@floating-ui/react": "^0.17.0", "@svgr/webpack": "^6.2.1", "@testing-library/dom": "^8.19.0", "@testing-library/jest-dom": "^5.16.5", diff --git a/apps/exampleapp/public/secretOptions.json b/apps/exampleapp/public/secretOptions.json new file mode 100644 index 000000000..13ca7de45 --- /dev/null +++ b/apps/exampleapp/public/secretOptions.json @@ -0,0 +1,222 @@ +[ + { + "label": "HN_TEST_1 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/7a03c517-df7e-48c1-aca2-5c700d5382b6)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/7a03c517-df7e-48c1-aca2-5c700d5382b6" + }, + { + "label": "HN_TEST_4 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/da2c2f70-e11a-4e8a-ba90-7ecf02858342)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/da2c2f70-e11a-4e8a-ba90-7ecf02858342" + }, + { + "label": "HN_TEST_2 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e876b43f-987f-40ee-82c9-e024e55c34e5)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e876b43f-987f-40ee-82c9-e024e55c34e5" + }, + { + "label": "HN_TEST_1 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d26555aa-7f7a-4c22-ad2d-edd8d10b9b28)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d26555aa-7f7a-4c22-ad2d-edd8d10b9b28" + }, + { + "label": "i331795-testserver.crt (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/fe558d24-db7e-455a-8ad4-819eb5a45c9e)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/fe558d24-db7e-455a-8ad4-819eb5a45c9e" + }, + { + "label": "tls_secret1 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e094d766-fd20-461c-8a95-23174d4ed412)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e094d766-fd20-461c-8a95-23174d4ed412" + }, + { + "label": "testSecret_9997 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ec31b126-f2d3-47a5-8cdc-3eb316f22afd)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ec31b126-f2d3-47a5-8cdc-3eb316f22afd" + }, + { + "label": "testSecret_9992 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d3a4e12e-c231-4edb-8ba2-51ed1e25e027)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d3a4e12e-c231-4edb-8ba2-51ed1e25e027" + }, + { + "label": "testSecret_9989 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d1ae4f8b-d0b0-4347-a6a0-e06d1d62ad1b)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d1ae4f8b-d0b0-4347-a6a0-e06d1d62ad1b" + }, + { + "label": "testSecret_9987 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f32a151d-7d98-4cec-915e-f7287d67b133)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f32a151d-7d98-4cec-915e-f7287d67b133" + }, + { + "label": "testSecret_9976 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cb8ee9d1-8f75-4fab-be12-136d18cc5e61)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cb8ee9d1-8f75-4fab-be12-136d18cc5e61" + }, + { + "label": "testSecret_9972 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f359d462-89d2-47e3-b7a5-42b412d287ae)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f359d462-89d2-47e3-b7a5-42b412d287ae" + }, + { + "label": "testSecret_9967 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0d9f463-926f-41ba-ab37-8c40a8eb8f05)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0d9f463-926f-41ba-ab37-8c40a8eb8f05" + }, + { + "label": "testSecret_9966 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cc8bf2d7-8bc1-4197-8ec0-b29a5135cb6a)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cc8bf2d7-8bc1-4197-8ec0-b29a5135cb6a" + }, + { + "label": "testSecret_9964 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0a07c84-eaa4-418c-ab0b-5eaf066937fa)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0a07c84-eaa4-418c-ab0b-5eaf066937fa" + }, + { + "label": "testSecret_9961 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f78af18f-7ddc-4510-9cbc-073867adce21)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f78af18f-7ddc-4510-9cbc-073867adce21" + }, + { + "label": "testSecret_9960 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5b872b9-b57b-4629-a582-2c9bd9c83dc0)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5b872b9-b57b-4629-a582-2c9bd9c83dc0" + }, + { + "label": "testSecret_9958 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f4c7d455-bd3b-4fb8-8e45-5226e3fce5bd)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f4c7d455-bd3b-4fb8-8e45-5226e3fce5bd" + }, + { + "label": "testSecret_9956 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f9640ac6-a206-4c0d-9831-068a91c91028)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f9640ac6-a206-4c0d-9831-068a91c91028" + }, + { + "label": "testSecret_9949 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e2ff0cf2-be5b-4bca-891b-e7c76e67614c)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e2ff0cf2-be5b-4bca-891b-e7c76e67614c" + }, + { + "label": "testSecret_9947 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d7fc6d91-9e21-4dac-90db-3310230286a4)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d7fc6d91-9e21-4dac-90db-3310230286a4" + }, + { + "label": "testSecret_9944 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d4fc4e89-1cb2-4295-933b-101dacc9025a)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d4fc4e89-1cb2-4295-933b-101dacc9025a" + }, + { + "label": "testSecret_9933 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e845a090-fe3f-45a2-938d-e4cb01120674)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e845a090-fe3f-45a2-938d-e4cb01120674" + }, + { + "label": "testSecret_9925 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ebea20d7-d1ab-4f9f-9519-bf76c568f834)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ebea20d7-d1ab-4f9f-9519-bf76c568f834" + }, + { + "label": "testSecret_9924 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f43d1f8c-d621-4b5f-8a60-e7871d59ee49)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f43d1f8c-d621-4b5f-8a60-e7871d59ee49" + }, + { + "label": "testSecret_9919 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/feb40d4f-f93f-42be-8d6c-bb28fbd292ef)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/feb40d4f-f93f-42be-8d6c-bb28fbd292ef" + }, + { + "label": "testSecret_9917 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cd65e6c9-e28a-45c1-9f33-ad8b2d1ce2a5)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cd65e6c9-e28a-45c1-9f33-ad8b2d1ce2a5" + }, + { + "label": "testSecret_9912 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d9e0e87d-774d-4f87-8246-3bfba84d57cb)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d9e0e87d-774d-4f87-8246-3bfba84d57cb" + }, + { + "label": "testSecret_9910 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0d52bbe-60db-4f80-b11d-38c0c1b72f80)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0d52bbe-60db-4f80-b11d-38c0c1b72f80" + }, + { + "label": "testSecret_9906 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5421539-7942-4e0c-939a-510e1f8e47e9)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5421539-7942-4e0c-939a-510e1f8e47e9" + }, + { + "label": "testSecret_9904 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e84852cf-fa78-40fd-b0ac-4d4b3dcb29a6)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e84852cf-fa78-40fd-b0ac-4d4b3dcb29a6" + }, + { + "label": "testSecret_9899 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/fc4c3f04-8862-4c80-974c-37d088202975)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/fc4c3f04-8862-4c80-974c-37d088202975" + }, + { + "label": "testSecret_9897 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/c90eb4dc-654e-44e4-bfbb-bb4446361ac9)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/c90eb4dc-654e-44e4-bfbb-bb4446361ac9" + }, + { + "label": "testSecret_9888 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f1674486-c6e7-4545-9b8f-bb78b255b147)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f1674486-c6e7-4545-9b8f-bb78b255b147" + }, + { + "label": "testSecret_9887 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e7f1e72a-74f8-4452-a6df-6abf39f7d619)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e7f1e72a-74f8-4452-a6df-6abf39f7d619" + }, + { + "label": "testSecret_9881 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cf7745fb-e41f-422a-a982-154def92ccf3)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cf7745fb-e41f-422a-a982-154def92ccf3" + }, + { + "label": "testSecret_9879 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d3d872b4-ed0b-430e-aa64-c47aaddbe75b)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d3d872b4-ed0b-430e-aa64-c47aaddbe75b" + }, + { + "label": "testSecret_9877 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e9042ce0-dc0b-47c9-a5f0-a083730d2526)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e9042ce0-dc0b-47c9-a5f0-a083730d2526" + }, + { + "label": "testSecret_9874 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0315199-a824-471b-aed9-ffb4ca95095b)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e0315199-a824-471b-aed9-ffb4ca95095b" + }, + { + "label": "testSecret_9870 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/c9d570fc-a274-4919-ba68-bac93cfa2d72)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/c9d570fc-a274-4919-ba68-bac93cfa2d72" + }, + { + "label": "testSecret_9867 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d0a62685-c9dc-49bb-8c40-98b9ea7a5d22)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d0a62685-c9dc-49bb-8c40-98b9ea7a5d22" + }, + { + "label": "testSecret_9866 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d67c6ef4-040e-495e-8a90-32aee1c3b380)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d67c6ef4-040e-495e-8a90-32aee1c3b380" + }, + { + "label": "testSecret_9862 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cbccb5ff-e771-48b6-8f25-ca871a9dea80)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cbccb5ff-e771-48b6-8f25-ca871a9dea80" + }, + { + "label": "testSecret_9857 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/eb47b161-6f2b-4b1e-97ec-3f5721f392eb)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/eb47b161-6f2b-4b1e-97ec-3f5721f392eb" + }, + { + "label": "testSecret_9847 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5202eb2-9548-424e-8b6c-af60e68bfcaa)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f5202eb2-9548-424e-8b6c-af60e68bfcaa" + }, + { + "label": "testSecret_9840 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/efd2b227-e106-456e-8ced-28d6f1bcaead)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/efd2b227-e106-456e-8ced-28d6f1bcaead" + }, + { + "label": "testSecret_9837 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e099b4ed-d92e-4408-a4fe-dc8be3edd101)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e099b4ed-d92e-4408-a4fe-dc8be3edd101" + }, + { + "label": "testSecret_9834 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ed86278b-b614-4830-81ed-3ea8cb17df42)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/ed86278b-b614-4830-81ed-3ea8cb17df42" + }, + { + "label": "testSecret_9824 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f9c62b2f-8b17-443c-b77c-d9633f45a81d)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/f9c62b2f-8b17-443c-b77c-d9633f45a81d" + }, + { + "label": "testSecret_9823 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cef7e105-4663-40bb-885a-b200ab55a946)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/cef7e105-4663-40bb-885a-b200ab55a946" + }, + { + "label": "testSecret_9821 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/eb6a3bad-e01b-46e5-84bb-419df7b06bd3)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/eb6a3bad-e01b-46e5-84bb-419df7b06bd3" + }, + { + "label": "testSecret_9818 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e53ab67a-c55a-4d99-8e1e-a9c429bea420)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/e53ab67a-c55a-4d99-8e1e-a9c429bea420" + }, + { + "label": "testSecret_9814 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/df3569c9-84df-4024-acee-885af99d6698)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/df3569c9-84df-4024-acee-885af99d6698" + }, + { + "label": "testSecret_9810 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d7cb0080-77c1-4fee-b132-ef196ae0c640)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d7cb0080-77c1-4fee-b132-ef196ae0c640" + }, + { + "label": "testSecret_9809 (https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d04eecd0-b4fb-4196-90d9-d103b27f99d1)", + "value": "https://keymanager-3.qa-de-1.cloud.sap:443/v1/secrets/d04eecd0-b4fb-4196-90d9-d103b27f99d1" + } +] diff --git a/apps/exampleapp/src/AppContent.js b/apps/exampleapp/src/AppContent.js index b22909c07..8b42994e4 100644 --- a/apps/exampleapp/src/AppContent.js +++ b/apps/exampleapp/src/AppContent.js @@ -17,6 +17,7 @@ import PanelManager from "./components/PanelManager" import { useQuery } from "react-query" import { fetchPeaks } from "./actions" import PeaksList from "./components/PeaksList/PeaksList" +import TabPanelTwo from "./components/TabPanelTwo" const AppContent = (props) => { const endpoint = useStore((state) => state.endpoint) @@ -99,6 +100,7 @@ const AppContent = (props) => { Content Panel two. Normally you will probably want to put the TabPanel content into separate components. + diff --git a/apps/exampleapp/src/actions.js b/apps/exampleapp/src/actions.js index 4e1d7f980..1df7ed1ad 100644 --- a/apps/exampleapp/src/actions.js +++ b/apps/exampleapp/src/actions.js @@ -29,7 +29,22 @@ const checkStatus = (response) => { } } -// Example fetch call. Adjust as needed for your API +export const fetchSecretOptions = ({ queryKey }) => { + const [_key, endpoint, options] = queryKey + const query = encodeUrlParamsFromObject(options) + return fetch(`${endpoint}/secrets?${query}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + }, + }) + .then(checkStatus) + .then((response) => { + return response.json() + }) +} + export const fetchPeaks = ({ queryKey }) => { const [_key, endpoint, options] = queryKey const query = encodeUrlParamsFromObject(options) diff --git a/apps/exampleapp/src/components/SmartSelectInput.js b/apps/exampleapp/src/components/SmartSelectInput.js new file mode 100644 index 000000000..f09224c46 --- /dev/null +++ b/apps/exampleapp/src/components/SmartSelectInput.js @@ -0,0 +1,273 @@ +import React, { useMemo, useState, useEffect } from "react" +import { + useFloating, + autoUpdate, + offset, + shift, + useDismiss, + useRole, + useClick, + useInteractions, + FloatingFocusManager, + useId, + size, +} from "@floating-ui/react" +import { + TextInputRow, + DataGrid, + DataGridRow, + DataGridCell, + Badge, + LoadingIndicator, + Stack, + Message, + Button, + Spinner, +} from "juno-ui-components" + +const optionsContainer = ` + smart-select-options-container + overflow-y-scroll + rounded-3px + ring-2 + ring-theme-focus + bg-theme-textinput + ` + +const optionFilter = ` + smart-select-options-filter + p-3 + bg-theme-background-lvl-2 + sticky + top-0 +` +const optionFilterInput = ` + w-full +` + +const optionsRow = ` + smart-select-options-row + hover:text-theme-accent +` + +const fakeInputText = (isOpen) => { + return ` + smart-select-input + text-theme-textinput + bg-theme-textinput + min-h-[2.5rem] + rounded-3px + p-2 + ${isOpen && `ring-2 ring-theme-focus`} + ` + .replace(/\n/g, " ") + .replace(/\s+/g, " ") +} + +const fakeInputTextPlaceholder = ` + smart-select-input-placeholder + opacity-50 +` + +const fakeInputTextOptions = ` + smart-select-input-selected-option + mr-1 +` + +const regexString = (string) => string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&") + +const SmartSelectInput = ({ + options, + isLoading, + error, + fetchPromise, + isFetching, + fetchStatus, + fetchButton, + onOptionClick, + onOptionRemove, + selectedOptions, + searchTerm, + onSearchTermChange, +}) => { + const [open, setOpen] = useState(false) + + // set default to empty string if not given + options = useMemo(() => { + if (!options) return [] + return options + }, [options]) + + // set default to empty string if not given + searchTerm = useMemo(() => { + if (!searchTerm) return "" + return searchTerm + }, [searchTerm]) + + // set default to empty array if not given + selectedOptions = useMemo(() => { + if (!selectedOptions) return [] + return selectedOptions + }, [selectedOptions]) + + // + // Set up Floating ui + // + const { x, y, reference, floating, strategy, context } = useFloating({ + open, + placement: "bottom-start", + onOpenChange: setOpen, + middleware: [ + offset(8), + shift(), + size({ + apply({ rects, elements, availableHeight }) { + Object.assign(elements.floating.style, { + maxHeight: `${availableHeight}px`, + width: `${rects.reference.width}px`, + }) + }, + padding: 10, + }), + ], + whileElementsMounted: autoUpdate, + }) + + const click = useClick(context, { + toggle: true, + event: "mousedown", + }) + const dismiss = useDismiss(context, { + referencePress: true, + }) + const role = useRole(context) + + const { getReferenceProps, getFloatingProps } = useInteractions([ + click, + dismiss, + role, + ]) + + const headingId = useId() + + // + // Callbacks + // + const onOptionClicked = (option) => { + if (onOptionClick) onOptionClick(option) + } + + const onOptionDeselected = (option) => { + if (onOptionRemove) onOptionRemove(option) + } + + return ( +
+
+ {selectedOptions.length > 0 ? ( + <> + {selectedOptions.map((item, index) => ( + onOptionDeselected(item)} + /> + ))} + + ) : ( +
Select...
+ )} +
+ + {open && ( + +
+
+ + + {searchTerm && fetchPromise && ( + + {fetchStatus && ( + + {fetchStatus} + + )} + {isFetching && } + {fetchButton && fetchButton} + + )} + +
+ + {error && ( + + + + + + )} + + {isLoading && ( + + + + + Loading Options... + + + + )} + + {options.length > 0 && ( + <> + {options.map((option, i) => ( + onOptionClicked(option)} + className={optionsRow} + > + {option.label} + + ))} + + )} + + {(!options || options.length === 0) && ( + + + No options available + + + )} + +
+
+ )} +
+ ) +} + +export default SmartSelectInput diff --git a/apps/exampleapp/src/components/TabPanelTwo.js b/apps/exampleapp/src/components/TabPanelTwo.js new file mode 100644 index 000000000..efeef463e --- /dev/null +++ b/apps/exampleapp/src/components/TabPanelTwo.js @@ -0,0 +1,184 @@ +import React from "react" + +import useStore from "../store" +import { useQuery } from "react-query" +import { fetchSecretOptions } from "../actions" +import SmartSelectInput from "./SmartSelectInput" + +const TabPanelTwo = ({}) => { + const endpoint = useStore((state) => state.endpoint) + const { isLoading, isError, data, error } = useQuery( + ["defaultSecrets", endpoint, {}], + fetchSecretOptions, + { + // enable the query also if the endpoint is set. For fetching local + // data is not necessary since it should be empty + // enabled: !!endpoint, + // If set to Infinity, the data will never be considered stale + // until a browser reload is triggered + staleTime: Infinity, + // refer to this documentation to see more options + // https://tanstack.com/query/v4/docs/guides/queries + } + ) + + return ( + <> + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo + ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis + dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies + nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. + Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In + enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo + ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis + dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies + nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. + Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In + enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, Lorem ipsum + dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget + dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, + pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec + pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim + justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum + felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus + elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo + ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem + ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla + ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies + nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam + rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper + libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit + vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante + tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam + quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed + fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed + consequat, leo eget bibendum sodales, augue velit cursus nunc, + + ) +} + +export default TabPanelTwo diff --git a/yarn.lock b/yarn.lock index 8d78277ba..383266ed1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3120,6 +3120,13 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.0.5": + version: 1.1.0 + resolution: "@floating-ui/core@npm:1.1.0" + checksum: ac48969915247320e52d173480c224e2ded94d557ba4cc504547bb314d126348dcc0aeef05686673e1b289596e6ce15118edc84900dd310c613d805f83b4e27d + languageName: node + linkType: hard + "@floating-ui/dom@npm:^1.0.5": version: 1.0.12 resolution: "@floating-ui/dom@npm:1.0.12" @@ -3129,6 +3136,15 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.1.0": + version: 1.1.0 + resolution: "@floating-ui/dom@npm:1.1.0" + dependencies: + "@floating-ui/core": ^1.0.5 + checksum: 717551da6f470101cd1de0edc449b229fade7f94c2ff98d09e14ced041e27092aac94bd78756c4247a42b57129f187292f145f0001a81ece399a89b20b4be60b + languageName: node + linkType: hard + "@floating-ui/react-dom-interactions@npm:^0.10.1": version: 0.10.3 resolution: "@floating-ui/react-dom-interactions@npm:0.10.3" @@ -3154,6 +3170,32 @@ __metadata: languageName: node linkType: hard +"@floating-ui/react-dom@npm:^1.2.0": + version: 1.2.0 + resolution: "@floating-ui/react-dom@npm:1.2.0" + dependencies: + "@floating-ui/dom": ^1.1.0 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 7c88eb27d33b910ad90b2aea66f90dcf3857f826ef9b403772693a0e3c91a02e56db123e48ecc2be502c3dc436e5d3bc7c974373515f38d4776fb1a838191990 + languageName: node + linkType: hard + +"@floating-ui/react@npm:^0.17.0": + version: 0.17.0 + resolution: "@floating-ui/react@npm:0.17.0" + dependencies: + "@floating-ui/react-dom": ^1.2.0 + aria-hidden: ^1.1.3 + tabbable: ^6.0.1 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: e9729a7825a612df88f588a2299375d4ce7f64a810b32e9f38be4c5f5332c164e24c346e101321ca33c3171afbeced554f7cdbaea19bf67cf31b4af811d433eb + languageName: node + linkType: hard + "@gar/promisify@npm:^1.0.1": version: 1.1.2 resolution: "@gar/promisify@npm:1.1.2" @@ -12373,6 +12415,7 @@ __metadata: "@babel/core": ^7.20.2 "@babel/preset-env": ^7.20.2 "@babel/preset-react": ^7.18.6 + "@floating-ui/react": ^0.17.0 "@svgr/webpack": ^6.2.1 "@testing-library/dom": ^8.19.0 "@testing-library/jest-dom": ^5.16.5 @@ -23716,6 +23759,13 @@ __metadata: languageName: node linkType: hard +"tabbable@npm:^6.0.1": + version: 6.0.1 + resolution: "tabbable@npm:6.0.1" + checksum: 65e378ad69a97416f2fdce34ade11b8ff68b33d9b2d978920a9d285c77e1bb88cb35113a8f00af8c4f0163d788d451a48840a216fa918d6a3f0c554951deb984 + languageName: node + linkType: hard + "tailwindcss@npm:*": version: 3.0.18 resolution: "tailwindcss@npm:3.0.18"