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"