@grafana/plugin-ui 0.14.1-dsconfig.4bdebf6 → 0.14.1-dsconfig.7535e54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1067 -1158
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +248 -158
- package/dist/cjs/schemas.cjs +20 -13391
- package/dist/cjs/schemas.cjs.map +1 -1
- package/dist/cjs/schemas.d.cts +112 -2
- package/dist/cjs/test-utils.d.cts +23 -23
- package/dist/cjs/useDatasourceSchema-DLkP-L1p.js +15795 -0
- package/dist/cjs/useDatasourceSchema-DLkP-L1p.js.map +1 -0
- package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +16 -11
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +18 -7
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +11 -6
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
- package/dist/esm/{datasource/schema → components/ConfigEditor/DatasourceConfigWizard}/config.js +37 -14
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
- package/dist/esm/{datasource/schema → components/ConfigEditor/DatasourceConfigWizard}/datasource.js +129 -3
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +62 -12
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useDatasourceConfigForm.js → hooks/useDatasourceConfigForm.js} +71 -29
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{AuthorizationHeaderField.js → inputs/AuthorizationHeaderField.js} +6 -8
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{ComplexFieldNote.js → inputs/ComplexFieldNote.js} +6 -4
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{IndexedPairEditor.js → inputs/IndexedPairEditor.js} +52 -52
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{PdcFieldNote.js → inputs/PdcFieldNote.js} +5 -8
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{SecureFieldInput.js → inputs/SecureFieldInput.js} +8 -10
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +76 -41
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{tabStyles.js → styles.js} +125 -6
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
- package/dist/esm/components/DataLinks/DataLink.js +2 -2
- package/dist/esm/components/DataLinks/DataLinks.js +2 -2
- package/dist/esm/components/DatePicker/styles.js +2 -2
- package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
- package/dist/esm/components/QueryEditor/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
- package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
- package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
- package/dist/esm/components/QueryEditor/Space.js +2 -2
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
- package/dist/esm/index.d.ts +248 -158
- package/dist/esm/index.js +8 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{datasource/schema/datasources → schema/registry}/cloudwatch.schema.json.js +3 -3
- package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js +508 -0
- package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js.map +1 -0
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-clickhouse-datasource.schema.json.js +206 -44
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-clickhouse-datasource.schema.json.js.map +1 -1
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-googlesheets-datasource.schema.json.js +103 -107
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-googlesheets-datasource.schema.json.js.map +1 -1
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mqtt-datasource.schema.json.js +3 -3
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-postgresql-datasource.schema.json.js +170 -223
- package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-postgresql-datasource.schema.json.js.map +1 -1
- package/dist/esm/schema/registry/index.js +137 -0
- package/dist/esm/schema/registry/index.js.map +1 -0
- package/dist/esm/{datasource/schema/datasources → schema/registry}/influxdb.schema.json.js +22 -8
- package/dist/esm/{datasource/schema/datasources → schema/registry}/influxdb.schema.json.js.map +1 -1
- package/dist/esm/{datasource/schema/datasources → schema/registry}/loki.schema.json.js +3 -3
- package/dist/esm/schema/registry/mysql.schema.json.js +304 -0
- package/dist/esm/schema/registry/mysql.schema.json.js.map +1 -0
- package/dist/esm/{datasource/schema/datasources → schema/registry}/prometheus.schema.json.js +1 -1
- package/dist/esm/schema/registry/stackdriver.schema.json.js +224 -0
- package/dist/esm/{datasource/schema/datasources → schema/registry}/stackdriver.schema.json.js.map +1 -1
- package/dist/esm/{datasource/schema/datasources → schema/registry}/tempo.schema.json.js +52 -6
- package/dist/esm/{datasource/schema/datasources → schema/registry}/tempo.schema.json.js.map +1 -1
- package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
- package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/utils/dsconfig.js +97 -0
- package/dist/esm/schema/utils/dsconfig.js.map +1 -0
- package/dist/esm/{datasource/schema/llmHints.js → schema/utils/llm.js} +1 -1
- package/dist/esm/schema/utils/llm.js.map +1 -0
- package/dist/esm/{datasource/schema/provisioningYaml.js → schema/utils/provisioning.js} +79 -3
- package/dist/esm/schema/utils/provisioning.js.map +1 -0
- package/dist/esm/schema/utils/useDatasourceSchema.js +16 -0
- package/dist/esm/schema/utils/useDatasourceSchema.js.map +1 -0
- package/dist/esm/schemas.d.ts +112 -2
- package/dist/esm/schemas.js +5 -1
- package/dist/esm/schemas.js.map +1 -1
- package/dist/esm/test-utils.d.ts +23 -23
- package/package.json +9 -6
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +0 -84
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useHealthChecks.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +0 -124
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +0 -1
- package/dist/esm/datasource/schema/config.js.map +0 -1
- package/dist/esm/datasource/schema/datasource.js.map +0 -1
- package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js +0 -159
- package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js.map +0 -1
- package/dist/esm/datasource/schema/datasources/mysql.schema.json.js +0 -137
- package/dist/esm/datasource/schema/datasources/mysql.schema.json.js.map +0 -1
- package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js +0 -135
- package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js +0 -386
- package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js.map +0 -1
- package/dist/esm/datasource/schema/llmHints.js.map +0 -1
- package/dist/esm/datasource/schema/provisioningYaml.js.map +0 -1
- package/dist/esm/datasource/schema/schemaRegistry.js +0 -139
- package/dist/esm/datasource/schema/schemaRegistry.js.map +0 -1
- /package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useHealthChecks.js → hooks/useHealthChecks.js} +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/alertmanager.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/alertmanager.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/cloudwatch.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/elasticsearch.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/elasticsearch.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-amazonprometheus-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-amazonprometheus-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-appdynamics-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-appdynamics-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-astradb-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-astradb-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-athena-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-athena-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-data-explorer-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-data-explorer-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-monitor-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-monitor-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azuredevops-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azuredevops-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azureprometheus-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azureprometheus-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-cockroachdb-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-cockroachdb-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-databricks-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-databricks-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-datadog-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-datadog-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-dynatrace-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-dynatrace-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-falconlogscale-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-falconlogscale-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-github-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-github-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-gitlab-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-gitlab-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-honeycomb-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-honeycomb-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-iot-sitewise-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-iot-sitewise-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-jira-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-jira-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-looker-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-looker-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mongodb-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mongodb-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mqtt-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-newrelic-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-newrelic-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-odbc-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-odbc-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-opensearch-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-opensearch-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-oracle-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-oracle-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pagerduty-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pagerduty-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pyroscope-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pyroscope-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-redshift-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-redshift-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-salesforce-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-salesforce-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-saphana-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-saphana-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sentry-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sentry-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-servicenow-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-servicenow-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-snowflake-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-snowflake-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunk-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunk-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunkobservability-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunkobservability-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-strava-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-strava-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sumologic-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sumologic-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-surrealdb-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-surrealdb-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-timestream-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-timestream-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-wavefront-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-wavefront-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-x-ray-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-x-ray-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-yugabyte-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-yugabyte-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/graphite.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/graphite.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/jaeger.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/jaeger.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/loki.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-csv-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-csv-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-json-datasource.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-json-datasource.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/mssql.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/mssql.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/opentsdb.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/opentsdb.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/prometheus.schema.json.js.map +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/zipkin.schema.json.js +0 -0
- /package/dist/esm/{datasource/schema/datasources → schema/registry}/zipkin.schema.json.js.map +0 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -17,12 +17,13 @@ var AutoSizer = require('react-virtualized-auto-sizer');
|
|
|
17
17
|
var sqlFormatter = require('sql-formatter');
|
|
18
18
|
var rxjs = require('rxjs');
|
|
19
19
|
var operators$1 = require('rxjs/operators');
|
|
20
|
+
var useDatasourceSchema = require('./useDatasourceSchema-DLkP-L1p.js');
|
|
20
21
|
var reactHookForm = require('react-hook-form');
|
|
22
|
+
require('@marcbachmann/cel-js');
|
|
21
23
|
var dnd = require('@hello-pangea/dnd');
|
|
22
24
|
var reactPopperTooltip = require('react-popper-tooltip');
|
|
23
25
|
var Prism = require('prismjs');
|
|
24
|
-
|
|
25
|
-
var schemas = require('./schemas.cjs');
|
|
26
|
+
require('js-yaml');
|
|
26
27
|
|
|
27
28
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
28
29
|
|
|
@@ -30,7 +31,6 @@ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
|
30
31
|
var Calendar__default = /*#__PURE__*/_interopDefaultCompat(Calendar);
|
|
31
32
|
var AutoSizer__default = /*#__PURE__*/_interopDefaultCompat(AutoSizer);
|
|
32
33
|
var Prism__default = /*#__PURE__*/_interopDefaultCompat(Prism);
|
|
33
|
-
var yaml__default = /*#__PURE__*/_interopDefaultCompat(yaml);
|
|
34
34
|
|
|
35
35
|
const QueryEditorRow = (props) => {
|
|
36
36
|
var _a, _b;
|
|
@@ -79,7 +79,7 @@ function Segment(props) {
|
|
|
79
79
|
);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
const getStyles$
|
|
82
|
+
const getStyles$x = (theme) => {
|
|
83
83
|
const containerBorder = theme.isDark ? theme.v1.palette.dark9 : theme.v1.palette.gray5;
|
|
84
84
|
return {
|
|
85
85
|
container: css.css`
|
|
@@ -229,7 +229,7 @@ const getBodyStyles = (theme) => {
|
|
|
229
229
|
|
|
230
230
|
const DatePicker = React.memo((props) => {
|
|
231
231
|
const theme = ui.useTheme2();
|
|
232
|
-
const styles = getStyles$
|
|
232
|
+
const styles = getStyles$x(theme);
|
|
233
233
|
const { isOpen, onClose } = props;
|
|
234
234
|
if (!isOpen) {
|
|
235
235
|
return null;
|
|
@@ -259,7 +259,7 @@ const Body = React.memo(({ value, onChange }) => {
|
|
|
259
259
|
});
|
|
260
260
|
Body.displayName = "Body";
|
|
261
261
|
|
|
262
|
-
function getStyles$
|
|
262
|
+
function getStyles$w() {
|
|
263
263
|
return {
|
|
264
264
|
input: css.css({
|
|
265
265
|
/* hides the native Calendar picker icon given when using type=date */
|
|
@@ -275,7 +275,7 @@ const formatDate = (date) => date.toISOString().split("T")[0];
|
|
|
275
275
|
const DatePickerWithInput = (props) => {
|
|
276
276
|
const { value, onChange, className, ...rest } = props;
|
|
277
277
|
const [open, setOpen] = React.useState(false);
|
|
278
|
-
const styles = getStyles$
|
|
278
|
+
const styles = getStyles$w();
|
|
279
279
|
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(
|
|
280
280
|
ui.Input,
|
|
281
281
|
{
|
|
@@ -437,7 +437,7 @@ __publicField$4(DataSourcePicker, "defaultProps", {
|
|
|
437
437
|
});
|
|
438
438
|
|
|
439
439
|
const { FormField, Switch } = ui.LegacyForms;
|
|
440
|
-
const getStyles$
|
|
440
|
+
const getStyles$v = ui.stylesFactory(() => ({
|
|
441
441
|
firstRow: css.css`
|
|
442
442
|
display: flex;
|
|
443
443
|
`,
|
|
@@ -454,7 +454,7 @@ const getStyles$t = ui.stylesFactory(() => ({
|
|
|
454
454
|
}));
|
|
455
455
|
const DataLink = (props) => {
|
|
456
456
|
const { value, onChange, onDelete, suggestions, className } = props;
|
|
457
|
-
const styles = getStyles$
|
|
457
|
+
const styles = getStyles$v();
|
|
458
458
|
const [showInternalLink, setShowInternalLink] = useInternalLink(value.datasourceUid);
|
|
459
459
|
const handleChange = (field) => (event) => {
|
|
460
460
|
onChange({
|
|
@@ -571,7 +571,7 @@ function useInternalLink(datasourceUid) {
|
|
|
571
571
|
return [showInternalLink, setShowInternalLink];
|
|
572
572
|
}
|
|
573
573
|
|
|
574
|
-
const getStyles$
|
|
574
|
+
const getStyles$u = (theme) => ({
|
|
575
575
|
infoText: css.css`
|
|
576
576
|
padding-bottom: ${theme.v1.spacing.md};
|
|
577
577
|
color: ${theme.v1.colors.textWeak};
|
|
@@ -583,7 +583,7 @@ const getStyles$s = (theme) => ({
|
|
|
583
583
|
const DataLinks = (props) => {
|
|
584
584
|
const { value, onChange } = props;
|
|
585
585
|
const theme = ui.useTheme2();
|
|
586
|
-
const styles = getStyles$
|
|
586
|
+
const styles = getStyles$u(theme);
|
|
587
587
|
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("h3", { className: "page-heading" }, "Data links"), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.infoText }, "Add links to existing fields. Links will be shown in log row details next to the field value."), /* @__PURE__ */ React__default.default.createElement("div", { className: "gf-form-group" }, value && value.map((field, index) => {
|
|
588
588
|
return /* @__PURE__ */ React__default.default.createElement(
|
|
589
589
|
DataLink,
|
|
@@ -5479,7 +5479,7 @@ const getButtonStyles = (theme) => ({
|
|
|
5479
5479
|
});
|
|
5480
5480
|
|
|
5481
5481
|
const InputGroup = ({ children }) => {
|
|
5482
|
-
const styles = ui.useStyles2(getStyles$
|
|
5482
|
+
const styles = ui.useStyles2(getStyles$t);
|
|
5483
5483
|
const modifiedChildren = React.Children.map(children, (child) => {
|
|
5484
5484
|
if (React.isValidElement(child) && child.props.invalid) {
|
|
5485
5485
|
return React.cloneElement(child, { className: css.cx(child.props.className, styles.invalidChild) });
|
|
@@ -5497,7 +5497,7 @@ const borderPriority = [
|
|
|
5497
5497
|
"focused"
|
|
5498
5498
|
// highest priority
|
|
5499
5499
|
];
|
|
5500
|
-
const getStyles$
|
|
5500
|
+
const getStyles$t = () => ({
|
|
5501
5501
|
root: css.css({
|
|
5502
5502
|
display: "flex",
|
|
5503
5503
|
// Style the direct children of the component
|
|
@@ -5580,10 +5580,10 @@ const EditorFieldGroup = ({ children }) => {
|
|
|
5580
5580
|
};
|
|
5581
5581
|
|
|
5582
5582
|
const EditorHeader = ({ children }) => {
|
|
5583
|
-
const styles = ui.useStyles2(getStyles$
|
|
5583
|
+
const styles = ui.useStyles2(getStyles$s);
|
|
5584
5584
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, children);
|
|
5585
5585
|
};
|
|
5586
|
-
const getStyles$
|
|
5586
|
+
const getStyles$s = (theme) => ({
|
|
5587
5587
|
root: css.css({
|
|
5588
5588
|
display: "flex",
|
|
5589
5589
|
flexWrap: "wrap",
|
|
@@ -5596,12 +5596,12 @@ const getStyles$q = (theme) => ({
|
|
|
5596
5596
|
const EditorField$1 = (props) => {
|
|
5597
5597
|
var _a;
|
|
5598
5598
|
const { label, optional, tooltip, tooltipInteractive, children, width, ...fieldProps } = props;
|
|
5599
|
-
const styles = ui.useStyles2(getStyles$
|
|
5599
|
+
const styles = ui.useStyles2(getStyles$r, width);
|
|
5600
5600
|
const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
|
|
5601
5601
|
const labelEl = /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { placement: "top", content: tooltip, theme: "info", interactive: tooltipInteractive }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { tabIndex: 0, name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React__default.default.createElement(ui.Space, { v: 0.5 }));
|
|
5602
5602
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(ui.Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
|
|
5603
5603
|
};
|
|
5604
|
-
const getStyles$
|
|
5604
|
+
const getStyles$r = (theme, width) => {
|
|
5605
5605
|
return {
|
|
5606
5606
|
root: css.css({
|
|
5607
5607
|
minWidth: theme.spacing(width != null ? width : 0)
|
|
@@ -5629,10 +5629,10 @@ const getStyles$p = (theme, width) => {
|
|
|
5629
5629
|
};
|
|
5630
5630
|
|
|
5631
5631
|
const EditorRow$1 = ({ children }) => {
|
|
5632
|
-
const styles = ui.useStyles2(getStyles$
|
|
5632
|
+
const styles = ui.useStyles2(getStyles$q);
|
|
5633
5633
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
|
|
5634
5634
|
};
|
|
5635
|
-
const getStyles$
|
|
5635
|
+
const getStyles$q = (theme) => {
|
|
5636
5636
|
return {
|
|
5637
5637
|
root: css.css({
|
|
5638
5638
|
padding: theme.spacing(1),
|
|
@@ -5647,10 +5647,10 @@ const EditorRows$1 = ({ children }) => {
|
|
|
5647
5647
|
};
|
|
5648
5648
|
|
|
5649
5649
|
const EditorSwitch = (props) => {
|
|
5650
|
-
const styles = getStyles$
|
|
5650
|
+
const styles = getStyles$p();
|
|
5651
5651
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.switch }, /* @__PURE__ */ React__default.default.createElement(ui.Switch, { ...props }));
|
|
5652
5652
|
};
|
|
5653
|
-
const getStyles$
|
|
5653
|
+
const getStyles$p = () => {
|
|
5654
5654
|
return {
|
|
5655
5655
|
switch: css.css({
|
|
5656
5656
|
display: "flex",
|
|
@@ -5708,10 +5708,10 @@ const getSelectStyles = (theme) => ({
|
|
|
5708
5708
|
});
|
|
5709
5709
|
|
|
5710
5710
|
const Space = ({ v = 0, h = 0, layout = "block" }) => {
|
|
5711
|
-
const styles = ui.useStyles2(getStyles$
|
|
5711
|
+
const styles = ui.useStyles2(getStyles$o, v, h, layout);
|
|
5712
5712
|
return /* @__PURE__ */ React__default.default.createElement("span", { className: css.cx(styles.wrapper) });
|
|
5713
5713
|
};
|
|
5714
|
-
const getStyles$
|
|
5714
|
+
const getStyles$o = (theme, v, h, layout) => ({
|
|
5715
5715
|
wrapper: css.css([
|
|
5716
5716
|
{
|
|
5717
5717
|
paddingRight: theme.spacing(h != null ? h : 0),
|
|
@@ -6323,7 +6323,7 @@ function RawEditor({
|
|
|
6323
6323
|
language = "sql"
|
|
6324
6324
|
}) {
|
|
6325
6325
|
const theme = ui.useTheme2();
|
|
6326
|
-
const styles = ui.useStyles2(getStyles$
|
|
6326
|
+
const styles = ui.useStyles2(getStyles$n);
|
|
6327
6327
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
|
6328
6328
|
const [toolboxRef, toolboxMeasure] = reactUse.useMeasure();
|
|
6329
6329
|
const [editorRef, editorMeasure] = reactUse.useMeasure();
|
|
@@ -6393,7 +6393,7 @@ function RawEditor({
|
|
|
6393
6393
|
renderEditor(true)
|
|
6394
6394
|
));
|
|
6395
6395
|
}
|
|
6396
|
-
function getStyles$
|
|
6396
|
+
function getStyles$n(theme) {
|
|
6397
6397
|
return {
|
|
6398
6398
|
modal: css.css`
|
|
6399
6399
|
width: 95vw;
|
|
@@ -6408,7 +6408,7 @@ function getStyles$l(theme) {
|
|
|
6408
6408
|
|
|
6409
6409
|
function Preview({ rawSql, language = "sql" }) {
|
|
6410
6410
|
const [_, copyToClipboard] = reactUse.useCopyToClipboard();
|
|
6411
|
-
const styles = ui.useStyles2(getStyles$
|
|
6411
|
+
const styles = ui.useStyles2(getStyles$m);
|
|
6412
6412
|
const labelElement = /* @__PURE__ */ React__default.default.createElement("div", { className: styles.labelWrapper }, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label }, "Preview"), /* @__PURE__ */ React__default.default.createElement(ui.IconButton, { tooltip: "Copy to clipboard", onClick: () => copyToClipboard(rawSql), name: "copy" }));
|
|
6413
6413
|
return /* @__PURE__ */ React__default.default.createElement(ui.Field, { label: labelElement, className: styles.grow }, /* @__PURE__ */ React__default.default.createElement(
|
|
6414
6414
|
ui.CodeEditor,
|
|
@@ -6422,7 +6422,7 @@ function Preview({ rawSql, language = "sql" }) {
|
|
|
6422
6422
|
}
|
|
6423
6423
|
));
|
|
6424
6424
|
}
|
|
6425
|
-
function getStyles$
|
|
6425
|
+
function getStyles$m(theme) {
|
|
6426
6426
|
return {
|
|
6427
6427
|
grow: css.css({ flexGrow: 1 }),
|
|
6428
6428
|
label: css.css({ fontSize: 12, fontWeight: theme.typography.fontWeightMedium }),
|
|
@@ -6541,7 +6541,7 @@ function SQLOrderByRow({ fields, query, onQueryChange, db }) {
|
|
|
6541
6541
|
const asteriskValue = { label: "*", value: "*" };
|
|
6542
6542
|
function SelectRow({ sql, columns, onSqlChange, functions }) {
|
|
6543
6543
|
var _a;
|
|
6544
|
-
const styles = ui.useStyles2(getStyles$
|
|
6544
|
+
const styles = ui.useStyles2(getStyles$l);
|
|
6545
6545
|
const columnsWithAsterisk = [asteriskValue, ...columns || []];
|
|
6546
6546
|
const onColumnChange = React.useCallback(
|
|
6547
6547
|
(item, index) => (column) => {
|
|
@@ -6637,7 +6637,7 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
|
|
|
6637
6637
|
}
|
|
6638
6638
|
));
|
|
6639
6639
|
}
|
|
6640
|
-
const getStyles$
|
|
6640
|
+
const getStyles$l = () => {
|
|
6641
6641
|
return { addButton: css.css({ alignSelf: "flex-start" }) };
|
|
6642
6642
|
};
|
|
6643
6643
|
function getColumnValue({ parameters }) {
|
|
@@ -6983,10 +6983,10 @@ function mapFieldsToTypes(columns) {
|
|
|
6983
6983
|
}
|
|
6984
6984
|
|
|
6985
6985
|
const EditorRow = ({ children }) => {
|
|
6986
|
-
const styles = ui.useStyles2(getStyles$
|
|
6986
|
+
const styles = ui.useStyles2(getStyles$k);
|
|
6987
6987
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
|
|
6988
6988
|
};
|
|
6989
|
-
const getStyles$
|
|
6989
|
+
const getStyles$k = (theme) => {
|
|
6990
6990
|
return {
|
|
6991
6991
|
root: css.css({
|
|
6992
6992
|
padding: theme.spacing(1),
|
|
@@ -7000,12 +7000,12 @@ const EditorField = (props) => {
|
|
|
7000
7000
|
var _a;
|
|
7001
7001
|
const { label, optional, tooltip, children, width, ...fieldProps } = props;
|
|
7002
7002
|
const theme = ui.useTheme2();
|
|
7003
|
-
const styles = getStyles$
|
|
7003
|
+
const styles = getStyles$j(theme, width);
|
|
7004
7004
|
const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
|
|
7005
7005
|
const labelEl = /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { placement: "top", content: tooltip, theme: "info" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React__default.default.createElement(Space, { v: 0.5 }));
|
|
7006
7006
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(ui.Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
|
|
7007
7007
|
};
|
|
7008
|
-
const getStyles$
|
|
7008
|
+
const getStyles$j = ui.stylesFactory((theme, width) => {
|
|
7009
7009
|
return {
|
|
7010
7010
|
root: css.css({
|
|
7011
7011
|
minWidth: theme.spacing(width != null ? width : 0)
|
|
@@ -7455,7 +7455,7 @@ const ConfigSubSection = ({ children, ...props }) => {
|
|
|
7455
7455
|
function ConfigDescriptionLink(props) {
|
|
7456
7456
|
const { description, suffix, feature } = props;
|
|
7457
7457
|
const text = `Learn more about ${feature}`;
|
|
7458
|
-
const styles = ui.useStyles2(getStyles$
|
|
7458
|
+
const styles = ui.useStyles2(getStyles$i);
|
|
7459
7459
|
return /* @__PURE__ */ React__default.default.createElement("span", { className: styles.container }, description, /* @__PURE__ */ React__default.default.createElement(
|
|
7460
7460
|
"a",
|
|
7461
7461
|
{
|
|
@@ -7467,7 +7467,7 @@ function ConfigDescriptionLink(props) {
|
|
|
7467
7467
|
text
|
|
7468
7468
|
));
|
|
7469
7469
|
}
|
|
7470
|
-
const getStyles$
|
|
7470
|
+
const getStyles$i = (theme) => {
|
|
7471
7471
|
return {
|
|
7472
7472
|
container: css.css({
|
|
7473
7473
|
color: theme.colors.text.secondary,
|
|
@@ -8436,240 +8436,53 @@ const AdvancedHttpSettings = ({
|
|
|
8436
8436
|
));
|
|
8437
8437
|
};
|
|
8438
8438
|
|
|
8439
|
-
|
|
8440
|
-
|
|
8441
|
-
|
|
8442
|
-
|
|
8443
|
-
|
|
8444
|
-
|
|
8445
|
-
return schema.groups.slice().sort((a, b) => {
|
|
8446
|
-
var _a, _b;
|
|
8447
|
-
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
8448
|
-
}).map((g) => ({
|
|
8449
|
-
group: g,
|
|
8450
|
-
fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f) => f != null)
|
|
8451
|
-
}));
|
|
8452
|
-
}
|
|
8453
|
-
const allFields = schema.fields.filter((f) => f.kind !== "virtual" && !f.isItemField);
|
|
8454
|
-
return [
|
|
8455
|
-
{
|
|
8456
|
-
group: { id: "default", title: "Configuration", fieldRefs: allFields.map((f) => f.id) },
|
|
8457
|
-
fields: allFields
|
|
8458
|
-
}
|
|
8459
|
-
];
|
|
8439
|
+
const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
|
|
8440
|
+
function resolveSecureKeyTemplate(template, item, index) {
|
|
8441
|
+
return template.replace(/\{index1\}/g, String(index + 1)).replace(/\{index\}/g, String(index)).replace(/\{item\.(\w+)\}/g, (_, key) => {
|
|
8442
|
+
var _a;
|
|
8443
|
+
return String((_a = item[key]) != null ? _a : "");
|
|
8444
|
+
});
|
|
8460
8445
|
}
|
|
8461
|
-
function
|
|
8462
|
-
|
|
8463
|
-
|
|
8464
|
-
|
|
8465
|
-
fieldMap.set(f.id, f);
|
|
8466
|
-
}
|
|
8467
|
-
const requiredIds = /* @__PURE__ */ new Set();
|
|
8468
|
-
for (const f of schema.fields) {
|
|
8469
|
-
if (f.required) {
|
|
8470
|
-
requiredIds.add(f.id);
|
|
8471
|
-
}
|
|
8472
|
-
}
|
|
8473
|
-
const authGroup = (_a = schema.groups) == null ? void 0 : _a.find((g) => g.id === "auth");
|
|
8474
|
-
if (authGroup) {
|
|
8475
|
-
for (const ref of authGroup.fieldRefs) {
|
|
8476
|
-
if (fieldMap.has(ref)) {
|
|
8477
|
-
requiredIds.add(ref);
|
|
8478
|
-
}
|
|
8479
|
-
}
|
|
8480
|
-
}
|
|
8481
|
-
if (requiredIds.size === 0) {
|
|
8482
|
-
return null;
|
|
8483
|
-
}
|
|
8484
|
-
const includeIds = /* @__PURE__ */ new Set();
|
|
8485
|
-
for (const id of requiredIds) {
|
|
8486
|
-
includeIds.add(id);
|
|
8487
|
-
const f = fieldMap.get(id);
|
|
8488
|
-
if (f == null ? void 0 : f.dependsOn) {
|
|
8489
|
-
const parsed = parseDependsOn(f.dependsOn);
|
|
8490
|
-
if (parsed && fieldMap.has(parsed.field)) {
|
|
8491
|
-
includeIds.add(parsed.field);
|
|
8492
|
-
}
|
|
8493
|
-
}
|
|
8446
|
+
function evaluateItemCondition(condition, item) {
|
|
8447
|
+
const trimmed = condition.trim();
|
|
8448
|
+
if (trimmed === "true") {
|
|
8449
|
+
return true;
|
|
8494
8450
|
}
|
|
8495
|
-
|
|
8496
|
-
|
|
8497
|
-
|
|
8498
|
-
if (parsed && requiredIds.has(parsed.field)) {
|
|
8499
|
-
includeIds.add(f.id);
|
|
8500
|
-
}
|
|
8501
|
-
}
|
|
8451
|
+
const match = trimmed.match(/^item\.(\w+)\s*==\s*(.+)$/);
|
|
8452
|
+
if (!match) {
|
|
8453
|
+
return false;
|
|
8502
8454
|
}
|
|
8503
|
-
const
|
|
8504
|
-
|
|
8505
|
-
|
|
8455
|
+
const [, key, rawValue] = match;
|
|
8456
|
+
const actualValue = item[key];
|
|
8457
|
+
const expected = rawValue.trim();
|
|
8458
|
+
if (expected === "true") {
|
|
8459
|
+
return actualValue === true;
|
|
8506
8460
|
}
|
|
8507
|
-
|
|
8508
|
-
|
|
8509
|
-
id: "_required",
|
|
8510
|
-
title: "Required",
|
|
8511
|
-
fieldRefs: virtualFields.map((f) => f.id)
|
|
8512
|
-
},
|
|
8513
|
-
fields: virtualFields
|
|
8514
|
-
};
|
|
8515
|
-
}
|
|
8516
|
-
function formKey(field) {
|
|
8517
|
-
return field.section ? `${field.section}.${field.key}` : field.key;
|
|
8518
|
-
}
|
|
8519
|
-
function parseDependsOn(expr) {
|
|
8520
|
-
var _a, _b;
|
|
8521
|
-
const m = expr.match(/^(.+?)\s*==\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
|
|
8522
|
-
if (!m) {
|
|
8523
|
-
return null;
|
|
8461
|
+
if (expected === "false") {
|
|
8462
|
+
return actualValue === false;
|
|
8524
8463
|
}
|
|
8525
|
-
|
|
8464
|
+
const unquoted = expected.replace(/^['"]|['"]$/g, "");
|
|
8465
|
+
return String(actualValue) === unquoted;
|
|
8526
8466
|
}
|
|
8527
|
-
function
|
|
8528
|
-
|
|
8529
|
-
|
|
8530
|
-
return void 0;
|
|
8531
|
-
}
|
|
8532
|
-
for (const ov of field.overrides) {
|
|
8533
|
-
const parsed = parseDependsOn(ov.when);
|
|
8534
|
-
if (!parsed) {
|
|
8467
|
+
function findActiveSecureOverride(itemFields, item, index) {
|
|
8468
|
+
for (const field of itemFields) {
|
|
8469
|
+
if (!field.overrides) {
|
|
8535
8470
|
continue;
|
|
8536
8471
|
}
|
|
8537
|
-
const
|
|
8538
|
-
|
|
8539
|
-
if (String((_a = watchedValues[depKey]) != null ? _a : "") === parsed.value) {
|
|
8540
|
-
return ov;
|
|
8541
|
-
}
|
|
8542
|
-
}
|
|
8543
|
-
return void 0;
|
|
8544
|
-
}
|
|
8545
|
-
function resolveFieldValue(ref, values, fields) {
|
|
8546
|
-
if (ref in values) {
|
|
8547
|
-
return values[ref];
|
|
8548
|
-
}
|
|
8549
|
-
const field = fields.find((f) => f.id === ref);
|
|
8550
|
-
if (field) {
|
|
8551
|
-
const fk = formKey(field);
|
|
8552
|
-
if (fk in values) {
|
|
8553
|
-
return values[fk];
|
|
8554
|
-
}
|
|
8555
|
-
}
|
|
8556
|
-
return void 0;
|
|
8557
|
-
}
|
|
8558
|
-
function evaluateComputedRead(expr, values, fields) {
|
|
8559
|
-
function evalExpr(s) {
|
|
8560
|
-
var _a;
|
|
8561
|
-
s = s.trim();
|
|
8562
|
-
if (s.startsWith("(") && findMatchingParen(s, 0) === s.length - 1) {
|
|
8563
|
-
s = s.slice(1, -1).trim();
|
|
8564
|
-
}
|
|
8565
|
-
const qIdx = findTopLevel(s, "?");
|
|
8566
|
-
if (qIdx !== -1) {
|
|
8567
|
-
const condition = s.slice(0, qIdx).trim();
|
|
8568
|
-
const rest = s.slice(qIdx + 1);
|
|
8569
|
-
const cIdx = findTopLevel(rest, ":");
|
|
8570
|
-
if (cIdx !== -1) {
|
|
8571
|
-
const trueExpr = rest.slice(0, cIdx).trim();
|
|
8572
|
-
const falseExpr = rest.slice(cIdx + 1).trim();
|
|
8573
|
-
return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);
|
|
8574
|
-
}
|
|
8575
|
-
}
|
|
8576
|
-
const strMatch = (_a = s.match(/^'([^']*)'$/)) != null ? _a : s.match(/^"([^"]*)"$/);
|
|
8577
|
-
if (strMatch) {
|
|
8578
|
-
return strMatch[1];
|
|
8579
|
-
}
|
|
8580
|
-
if (s === "true") {
|
|
8581
|
-
return true;
|
|
8582
|
-
}
|
|
8583
|
-
if (s === "false") {
|
|
8584
|
-
return false;
|
|
8585
|
-
}
|
|
8586
|
-
if (/^-?\d+(\.\d+)?$/.test(s)) {
|
|
8587
|
-
return Number(s);
|
|
8588
|
-
}
|
|
8589
|
-
return resolveFieldValue(s, values, fields);
|
|
8590
|
-
}
|
|
8591
|
-
function evalCondition(cond) {
|
|
8592
|
-
const eqMatch = cond.match(/^(.+?)\s*(==|!=)\s*(.+)$/);
|
|
8593
|
-
if (eqMatch) {
|
|
8594
|
-
const left = evalExpr(eqMatch[1]);
|
|
8595
|
-
const right = evalExpr(eqMatch[3]);
|
|
8596
|
-
const eq = String(left) === String(right);
|
|
8597
|
-
return eqMatch[2] === "==" ? eq : !eq;
|
|
8598
|
-
}
|
|
8599
|
-
return !!evalExpr(cond);
|
|
8600
|
-
}
|
|
8601
|
-
function findMatchingParen(s, start) {
|
|
8602
|
-
let depth = 0;
|
|
8603
|
-
for (let i = start; i < s.length; i++) {
|
|
8604
|
-
if (s[i] === "(") {
|
|
8605
|
-
depth++;
|
|
8606
|
-
} else if (s[i] === ")") {
|
|
8607
|
-
depth--;
|
|
8608
|
-
if (depth === 0) {
|
|
8609
|
-
return i;
|
|
8610
|
-
}
|
|
8611
|
-
}
|
|
8612
|
-
}
|
|
8613
|
-
return -1;
|
|
8614
|
-
}
|
|
8615
|
-
function findTopLevel(s, char) {
|
|
8616
|
-
let depth = 0;
|
|
8617
|
-
let inStr = null;
|
|
8618
|
-
for (let i = 0; i < s.length; i++) {
|
|
8619
|
-
const c = s[i];
|
|
8620
|
-
if (inStr) {
|
|
8621
|
-
if (c === inStr) {
|
|
8622
|
-
inStr = null;
|
|
8623
|
-
}
|
|
8624
|
-
continue;
|
|
8625
|
-
}
|
|
8626
|
-
if (c === "'" || c === '"') {
|
|
8627
|
-
inStr = c;
|
|
8628
|
-
continue;
|
|
8629
|
-
}
|
|
8630
|
-
if (c === "(") {
|
|
8631
|
-
depth++;
|
|
8472
|
+
for (const override of field.overrides) {
|
|
8473
|
+
if (!override.secureKey) {
|
|
8632
8474
|
continue;
|
|
8633
8475
|
}
|
|
8634
|
-
if (
|
|
8635
|
-
|
|
8636
|
-
|
|
8637
|
-
|
|
8638
|
-
|
|
8639
|
-
return i;
|
|
8640
|
-
}
|
|
8641
|
-
}
|
|
8642
|
-
return -1;
|
|
8643
|
-
}
|
|
8644
|
-
try {
|
|
8645
|
-
return evalExpr(expr);
|
|
8646
|
-
} catch (e) {
|
|
8647
|
-
return void 0;
|
|
8648
|
-
}
|
|
8649
|
-
}
|
|
8650
|
-
function computeVirtualFieldValues(schema, existingValues) {
|
|
8651
|
-
var _a;
|
|
8652
|
-
const virtualValues = {};
|
|
8653
|
-
for (const field of schema.fields) {
|
|
8654
|
-
if (field.kind !== "virtual") {
|
|
8655
|
-
continue;
|
|
8656
|
-
}
|
|
8657
|
-
const fk = formKey(field);
|
|
8658
|
-
if (((_a = field.storage) == null ? void 0 : _a.type) === "computed" && field.storage.read) {
|
|
8659
|
-
const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);
|
|
8660
|
-
if (val !== void 0) {
|
|
8661
|
-
virtualValues[fk] = val;
|
|
8662
|
-
} else if (field.defaultValue !== void 0) {
|
|
8663
|
-
virtualValues[fk] = field.defaultValue;
|
|
8476
|
+
if (evaluateItemCondition(override.when, item)) {
|
|
8477
|
+
return {
|
|
8478
|
+
fieldKey: field.key,
|
|
8479
|
+
resolvedKey: resolveSecureKeyTemplate(override.secureKey, item, index)
|
|
8480
|
+
};
|
|
8664
8481
|
}
|
|
8665
|
-
} else if (field.defaultValue !== void 0) {
|
|
8666
|
-
virtualValues[fk] = field.defaultValue;
|
|
8667
8482
|
}
|
|
8668
8483
|
}
|
|
8669
|
-
return
|
|
8484
|
+
return null;
|
|
8670
8485
|
}
|
|
8671
|
-
|
|
8672
|
-
const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
|
|
8673
8486
|
function patternToRegex(pattern) {
|
|
8674
8487
|
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
8675
8488
|
return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
|
|
@@ -8776,7 +8589,7 @@ function resolveRawPath(ref, ds) {
|
|
|
8776
8589
|
return void 0;
|
|
8777
8590
|
}
|
|
8778
8591
|
async function fetchExistingValues(dsUid, fields) {
|
|
8779
|
-
var _a, _b, _c, _d, _e;
|
|
8592
|
+
var _a, _b, _c, _d, _e, _f;
|
|
8780
8593
|
try {
|
|
8781
8594
|
const ds = await runtime.getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
|
|
8782
8595
|
showErrorAlert: false
|
|
@@ -8787,7 +8600,7 @@ async function fetchExistingValues(dsUid, fields) {
|
|
|
8787
8600
|
values[field.key] = expandIndexedPair(field, ds);
|
|
8788
8601
|
continue;
|
|
8789
8602
|
}
|
|
8790
|
-
const fk = formKey(field);
|
|
8603
|
+
const fk = useDatasourceSchema.formKey(field);
|
|
8791
8604
|
switch (field.target) {
|
|
8792
8605
|
case "root":
|
|
8793
8606
|
if (ds[field.key] !== void 0) {
|
|
@@ -8817,6 +8630,32 @@ async function fetchExistingValues(dsUid, fields) {
|
|
|
8817
8630
|
}
|
|
8818
8631
|
}
|
|
8819
8632
|
}
|
|
8633
|
+
for (const field of fields) {
|
|
8634
|
+
if (field.valueType !== "array" || !((_f = field.item) == null ? void 0 : _f.fields)) {
|
|
8635
|
+
continue;
|
|
8636
|
+
}
|
|
8637
|
+
const itemFields = field.item.fields;
|
|
8638
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
8639
|
+
var _a2;
|
|
8640
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
8641
|
+
});
|
|
8642
|
+
if (!hasSecureOverride) {
|
|
8643
|
+
continue;
|
|
8644
|
+
}
|
|
8645
|
+
const fk = useDatasourceSchema.formKey(field);
|
|
8646
|
+
const arr = values[fk];
|
|
8647
|
+
if (!Array.isArray(arr)) {
|
|
8648
|
+
continue;
|
|
8649
|
+
}
|
|
8650
|
+
values[fk] = arr.map((item, idx) => {
|
|
8651
|
+
var _a2;
|
|
8652
|
+
const match = findActiveSecureOverride(itemFields, item, idx);
|
|
8653
|
+
if (match && ((_a2 = ds.secureJsonFields) == null ? void 0 : _a2[match.resolvedKey])) {
|
|
8654
|
+
return { ...item, [match.fieldKey]: SECURE_FIELD_CONFIGURED };
|
|
8655
|
+
}
|
|
8656
|
+
return item;
|
|
8657
|
+
});
|
|
8658
|
+
}
|
|
8820
8659
|
return { values, readOnly: !!ds.readOnly };
|
|
8821
8660
|
} catch (err) {
|
|
8822
8661
|
const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
|
|
@@ -8824,7 +8663,7 @@ async function fetchExistingValues(dsUid, fields) {
|
|
|
8824
8663
|
}
|
|
8825
8664
|
}
|
|
8826
8665
|
function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
8827
|
-
var _a, _b, _c, _d;
|
|
8666
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
8828
8667
|
const rootFields = {};
|
|
8829
8668
|
const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
|
|
8830
8669
|
const secureJsonData = {};
|
|
@@ -8839,7 +8678,7 @@ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
|
8839
8678
|
if (!isManagedByEffect && !isFieldVisible(field)) {
|
|
8840
8679
|
continue;
|
|
8841
8680
|
}
|
|
8842
|
-
const fk = formKey(field);
|
|
8681
|
+
const fk = useDatasourceSchema.formKey(field);
|
|
8843
8682
|
const value = data[fk];
|
|
8844
8683
|
if (field.target === "secureJsonData") {
|
|
8845
8684
|
if (value === SECURE_FIELD_CONFIGURED) {
|
|
@@ -8873,6 +8712,60 @@ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
|
8873
8712
|
break;
|
|
8874
8713
|
}
|
|
8875
8714
|
}
|
|
8715
|
+
for (const field of fields) {
|
|
8716
|
+
if (field.valueType !== "array" || !((_e = field.item) == null ? void 0 : _e.fields) || field.target !== "jsonData") {
|
|
8717
|
+
continue;
|
|
8718
|
+
}
|
|
8719
|
+
const itemFields = field.item.fields;
|
|
8720
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
8721
|
+
var _a2;
|
|
8722
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
8723
|
+
});
|
|
8724
|
+
if (!hasSecureOverride) {
|
|
8725
|
+
continue;
|
|
8726
|
+
}
|
|
8727
|
+
const arr = field.section ? (_f = jsonData[field.section]) == null ? void 0 : _f[field.key] : jsonData[field.key];
|
|
8728
|
+
if (!Array.isArray(arr)) {
|
|
8729
|
+
continue;
|
|
8730
|
+
}
|
|
8731
|
+
const secureKeyOverrides = [];
|
|
8732
|
+
for (const f of itemFields) {
|
|
8733
|
+
for (const o of (_g = f.overrides) != null ? _g : []) {
|
|
8734
|
+
if (o.secureKey) {
|
|
8735
|
+
secureKeyOverrides.push({ fieldKey: f.key, override: o });
|
|
8736
|
+
}
|
|
8737
|
+
}
|
|
8738
|
+
}
|
|
8739
|
+
const activeSecureKeys = /* @__PURE__ */ new Set();
|
|
8740
|
+
for (let i = 0; i < arr.length; i++) {
|
|
8741
|
+
const item = arr[i];
|
|
8742
|
+
const match = findActiveSecureOverride(itemFields, item, i);
|
|
8743
|
+
if (!match) {
|
|
8744
|
+
continue;
|
|
8745
|
+
}
|
|
8746
|
+
const resolvedKey = match.resolvedKey;
|
|
8747
|
+
activeSecureKeys.add(resolvedKey);
|
|
8748
|
+
const itemValue = item[match.fieldKey];
|
|
8749
|
+
if (itemValue === SECURE_FIELD_CONFIGURED) {
|
|
8750
|
+
secureJsonFields[resolvedKey] = true;
|
|
8751
|
+
} else if (itemValue && itemValue !== "") {
|
|
8752
|
+
secureJsonData[resolvedKey] = String(itemValue);
|
|
8753
|
+
secureJsonFields[resolvedKey] = false;
|
|
8754
|
+
item[match.fieldKey] = "";
|
|
8755
|
+
}
|
|
8756
|
+
}
|
|
8757
|
+
const existingSecureFields = (_h = existing.secureJsonFields) != null ? _h : {};
|
|
8758
|
+
for (const existingKey of Object.keys(existingSecureFields)) {
|
|
8759
|
+
const couldBeFromThisField = secureKeyOverrides.some((sko) => {
|
|
8760
|
+
const staticPrefix = sko.override.secureKey.split("{")[0];
|
|
8761
|
+
return staticPrefix && existingKey.startsWith(staticPrefix);
|
|
8762
|
+
});
|
|
8763
|
+
if (couldBeFromThisField && !activeSecureKeys.has(existingKey)) {
|
|
8764
|
+
secureJsonFields[existingKey] = false;
|
|
8765
|
+
secureJsonData[existingKey] = "";
|
|
8766
|
+
}
|
|
8767
|
+
}
|
|
8768
|
+
}
|
|
8876
8769
|
return { rootFields, jsonData, secureJsonData, secureJsonFields };
|
|
8877
8770
|
}
|
|
8878
8771
|
async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
|
|
@@ -8910,23 +8803,25 @@ function evaluateEffectCondition(when, fieldValue) {
|
|
|
8910
8803
|
const eq = String(fieldValue) === String(target);
|
|
8911
8804
|
return op === "==" ? eq : !eq;
|
|
8912
8805
|
}
|
|
8913
|
-
function isFieldRequired(field, watchedValues, fieldById) {
|
|
8914
|
-
var _a;
|
|
8806
|
+
function isFieldRequired(field, watchedValues, fieldById, celContext) {
|
|
8915
8807
|
if (field.required) {
|
|
8916
8808
|
return true;
|
|
8917
8809
|
}
|
|
8918
8810
|
if (field.requiredWhen) {
|
|
8919
|
-
|
|
8811
|
+
if (celContext) {
|
|
8812
|
+
return useDatasourceSchema.evaluateCelExpression(field.requiredWhen, celContext);
|
|
8813
|
+
}
|
|
8814
|
+
const parsed = useDatasourceSchema.parseDependsOn(field.requiredWhen);
|
|
8920
8815
|
if (parsed) {
|
|
8921
8816
|
const depField = fieldById.get(parsed.field);
|
|
8922
|
-
const depKey = depField ? formKey(depField) : parsed.field;
|
|
8923
|
-
return
|
|
8817
|
+
const depKey = depField ? useDatasourceSchema.formKey(depField) : parsed.field;
|
|
8818
|
+
return useDatasourceSchema.evaluateDependsOn(parsed, useDatasourceSchema.getWatchedValue(watchedValues, depKey));
|
|
8924
8819
|
}
|
|
8925
8820
|
}
|
|
8926
8821
|
return false;
|
|
8927
8822
|
}
|
|
8928
8823
|
function buildValidationRules(field, required) {
|
|
8929
|
-
var _a, _b, _c, _d, _e, _f;
|
|
8824
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
8930
8825
|
const rules = {};
|
|
8931
8826
|
const label = (_a = field.label) != null ? _a : field.key;
|
|
8932
8827
|
if (required) {
|
|
@@ -8944,29 +8839,65 @@ function buildValidationRules(field, required) {
|
|
|
8944
8839
|
rules.required = `${label} is required`;
|
|
8945
8840
|
}
|
|
8946
8841
|
}
|
|
8842
|
+
if (field.valueType === "array" && ((_b = field.item) == null ? void 0 : _b.valueType) === "object" && ((_c = field.item.fields) == null ? void 0 : _c.length)) {
|
|
8843
|
+
const requiredItemFields = field.item.fields.filter((f) => f.required);
|
|
8844
|
+
if (requiredItemFields.length > 0) {
|
|
8845
|
+
const existingValidate = rules.validate;
|
|
8846
|
+
rules.validate = (value) => {
|
|
8847
|
+
var _a2;
|
|
8848
|
+
if (existingValidate) {
|
|
8849
|
+
const r = existingValidate(value);
|
|
8850
|
+
if (r !== true) {
|
|
8851
|
+
return r;
|
|
8852
|
+
}
|
|
8853
|
+
}
|
|
8854
|
+
if (!Array.isArray(value)) {
|
|
8855
|
+
return true;
|
|
8856
|
+
}
|
|
8857
|
+
const itemErrors = {};
|
|
8858
|
+
for (let i = 0; i < value.length; i++) {
|
|
8859
|
+
const item = value[i];
|
|
8860
|
+
const missing = [];
|
|
8861
|
+
for (const rf of requiredItemFields) {
|
|
8862
|
+
const v = item[rf.key];
|
|
8863
|
+
if (v === void 0 || v === null || v === "") {
|
|
8864
|
+
missing.push((_a2 = rf.label) != null ? _a2 : rf.key);
|
|
8865
|
+
}
|
|
8866
|
+
}
|
|
8867
|
+
if (missing.length > 0) {
|
|
8868
|
+
itemErrors[i] = `${missing.join(", ")} required`;
|
|
8869
|
+
}
|
|
8870
|
+
}
|
|
8871
|
+
if (Object.keys(itemErrors).length === 0) {
|
|
8872
|
+
return true;
|
|
8873
|
+
}
|
|
8874
|
+
return `__ITEM_ERRORS__${JSON.stringify(itemErrors)}`;
|
|
8875
|
+
};
|
|
8876
|
+
}
|
|
8877
|
+
}
|
|
8947
8878
|
if (field.validations) {
|
|
8948
8879
|
for (const v of field.validations) {
|
|
8949
8880
|
switch (v.type) {
|
|
8950
8881
|
case "pattern":
|
|
8951
8882
|
rules.pattern = {
|
|
8952
8883
|
value: new RegExp(v.pattern),
|
|
8953
|
-
message: (
|
|
8884
|
+
message: (_d = v.message) != null ? _d : `Invalid ${label}`
|
|
8954
8885
|
};
|
|
8955
8886
|
break;
|
|
8956
8887
|
case "range":
|
|
8957
8888
|
if (v.min !== void 0) {
|
|
8958
|
-
rules.min = { value: v.min, message: (
|
|
8889
|
+
rules.min = { value: v.min, message: (_e = v.message) != null ? _e : `Minimum value is ${v.min}` };
|
|
8959
8890
|
}
|
|
8960
8891
|
if (v.max !== void 0) {
|
|
8961
|
-
rules.max = { value: v.max, message: (
|
|
8892
|
+
rules.max = { value: v.max, message: (_f = v.message) != null ? _f : `Maximum value is ${v.max}` };
|
|
8962
8893
|
}
|
|
8963
8894
|
break;
|
|
8964
8895
|
case "length":
|
|
8965
8896
|
if (v.min !== void 0) {
|
|
8966
|
-
rules.minLength = { value: v.min, message: (
|
|
8897
|
+
rules.minLength = { value: v.min, message: (_g = v.message) != null ? _g : `Minimum length is ${v.min}` };
|
|
8967
8898
|
}
|
|
8968
8899
|
if (v.max !== void 0) {
|
|
8969
|
-
rules.maxLength = { value: v.max, message: (
|
|
8900
|
+
rules.maxLength = { value: v.max, message: (_h = v.message) != null ? _h : `Maximum length is ${v.max}` };
|
|
8970
8901
|
}
|
|
8971
8902
|
break;
|
|
8972
8903
|
}
|
|
@@ -8974,16 +8905,24 @@ function buildValidationRules(field, required) {
|
|
|
8974
8905
|
}
|
|
8975
8906
|
return rules;
|
|
8976
8907
|
}
|
|
8908
|
+
const ITEM_ERRORS_PREFIX = "__ITEM_ERRORS__";
|
|
8909
|
+
function parseItemErrors(errorMessage) {
|
|
8910
|
+
if (!errorMessage || !errorMessage.startsWith(ITEM_ERRORS_PREFIX)) {
|
|
8911
|
+
return null;
|
|
8912
|
+
}
|
|
8913
|
+
try {
|
|
8914
|
+
return JSON.parse(errorMessage.slice(ITEM_ERRORS_PREFIX.length));
|
|
8915
|
+
} catch (e) {
|
|
8916
|
+
return null;
|
|
8917
|
+
}
|
|
8918
|
+
}
|
|
8977
8919
|
|
|
8978
|
-
|
|
8979
|
-
enabled,
|
|
8980
|
-
|
|
8981
|
-
configUrl
|
|
8982
|
-
}) {
|
|
8983
|
-
const styles = ui.useStyles2(getStyles$f);
|
|
8920
|
+
const PdcFieldNote = (props) => {
|
|
8921
|
+
const { enabled, description, configUrl } = props;
|
|
8922
|
+
const styles = ui.useStyles2(getStyles$h);
|
|
8984
8923
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.wrapper }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.note }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "shield", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Private data source connect: ", /* @__PURE__ */ React__default.default.createElement("strong", null, enabled ? "Enabled" : "Disabled")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs" }))), /* @__PURE__ */ React__default.default.createElement(ui.LinkButton, { variant: "secondary", size: "sm", icon: "external-link-alt", href: configUrl }, "Configure in settings"));
|
|
8985
|
-
}
|
|
8986
|
-
const getStyles$
|
|
8924
|
+
};
|
|
8925
|
+
const getStyles$h = (theme) => ({
|
|
8987
8926
|
wrapper: css.css({
|
|
8988
8927
|
display: "flex",
|
|
8989
8928
|
alignItems: "center",
|
|
@@ -9003,18 +8942,14 @@ const getStyles$f = (theme) => ({
|
|
|
9003
8942
|
})
|
|
9004
8943
|
});
|
|
9005
8944
|
|
|
9006
|
-
function SecureFieldInput({
|
|
9007
|
-
formField,
|
|
9008
|
-
placeholder,
|
|
9009
|
-
disabled,
|
|
9010
|
-
label
|
|
9011
|
-
}) {
|
|
8945
|
+
function SecureFieldInput(props) {
|
|
9012
8946
|
var _a;
|
|
8947
|
+
const { formField, placeholder, disabled } = props;
|
|
9013
8948
|
const isConfigured = formField.value === SECURE_FIELD_CONFIGURED;
|
|
9014
8949
|
const [revealed, setRevealed] = React.useState(false);
|
|
9015
8950
|
const styles = ui.useStyles2(getSecureFieldStyles);
|
|
9016
8951
|
if (isConfigured) {
|
|
9017
|
-
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.configuredRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }),
|
|
8952
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.configuredRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), "Configured"), !disabled && /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", fill: "text", size: "sm", onClick: () => formField.onChange(""), type: "button" }, "Reset"));
|
|
9018
8953
|
}
|
|
9019
8954
|
return /* @__PURE__ */ React__default.default.createElement(
|
|
9020
8955
|
ui.Input,
|
|
@@ -9043,7 +8978,8 @@ const getSecureFieldStyles = (theme) => ({
|
|
|
9043
8978
|
configuredRow: css.css({
|
|
9044
8979
|
display: "flex",
|
|
9045
8980
|
alignItems: "center",
|
|
9046
|
-
gap: theme.spacing(1)
|
|
8981
|
+
gap: theme.spacing(1),
|
|
8982
|
+
whiteSpace: "nowrap"
|
|
9047
8983
|
}),
|
|
9048
8984
|
configuredBadge: css.css({
|
|
9049
8985
|
display: "inline-flex",
|
|
@@ -9053,108 +8989,180 @@ const getSecureFieldStyles = (theme) => ({
|
|
|
9053
8989
|
borderRadius: theme.shape.radius.pill,
|
|
9054
8990
|
backgroundColor: theme.colors.success.transparent,
|
|
9055
8991
|
color: theme.colors.success.text,
|
|
9056
|
-
fontSize: theme.typography.bodySmall.fontSize
|
|
8992
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
8993
|
+
whiteSpace: "nowrap"
|
|
9057
8994
|
})
|
|
9058
8995
|
});
|
|
9059
8996
|
|
|
9060
|
-
|
|
9061
|
-
|
|
9062
|
-
|
|
9063
|
-
|
|
9064
|
-
|
|
9065
|
-
|
|
9066
|
-
|
|
8997
|
+
const ComplexFieldNote = (props) => {
|
|
8998
|
+
const { count, label } = props;
|
|
8999
|
+
const styles = ui.useStyles2(getStyles$g);
|
|
9000
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.note }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, count > 0 ? `${count} ${label.toLowerCase()} configured.` : `No ${label.toLowerCase()} configured.`, " Configure in Grafana UI."));
|
|
9001
|
+
};
|
|
9002
|
+
const getStyles$g = (theme) => ({
|
|
9003
|
+
note: css.css({
|
|
9004
|
+
display: "inline-flex",
|
|
9005
|
+
alignItems: "center",
|
|
9006
|
+
gap: theme.spacing(0.5),
|
|
9007
|
+
padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
|
|
9008
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9009
|
+
color: theme.colors.text.secondary,
|
|
9010
|
+
backgroundColor: theme.colors.background.secondary,
|
|
9011
|
+
borderRadius: theme.shape.radius.default,
|
|
9012
|
+
border: `1px solid ${theme.colors.border.weak}`
|
|
9013
|
+
})
|
|
9014
|
+
});
|
|
9015
|
+
|
|
9016
|
+
function FileUploadField(props) {
|
|
9017
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
9018
|
+
const { field, formField, disabled, setValue } = props;
|
|
9019
|
+
const [mode, setModeLocal] = React.useState("upload");
|
|
9020
|
+
const [error, setError] = React.useState(null);
|
|
9021
|
+
const theme = ui.useTheme2();
|
|
9022
|
+
const mapping = (_a = field.ui) == null ? void 0 : _a.fileMapping;
|
|
9023
|
+
const accept = (_c = (_b = field.ui) == null ? void 0 : _b.accept) != null ? _c : [".json"];
|
|
9024
|
+
const setMode = React.useCallback(
|
|
9025
|
+
(next) => {
|
|
9026
|
+
setModeLocal(next);
|
|
9027
|
+
formField.onChange(next);
|
|
9028
|
+
},
|
|
9029
|
+
[formField]
|
|
9030
|
+
);
|
|
9031
|
+
const processJson = React.useCallback(
|
|
9032
|
+
(text) => {
|
|
9033
|
+
const fileMapping = mapping != null ? mapping : {};
|
|
9034
|
+
try {
|
|
9035
|
+
const parsed = JSON.parse(text);
|
|
9036
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
9037
|
+
setError("Invalid JSON object");
|
|
9038
|
+
return;
|
|
9039
|
+
}
|
|
9040
|
+
const requiredKeys = Object.keys(fileMapping);
|
|
9041
|
+
const missingKeys = requiredKeys.filter((k) => parsed[k] === void 0);
|
|
9042
|
+
if (missingKeys.length > 0) {
|
|
9043
|
+
setError(`Missing keys: ${missingKeys.join(", ")}`);
|
|
9044
|
+
return;
|
|
9045
|
+
}
|
|
9046
|
+
for (const [jsonKey, targetFieldId] of Object.entries(fileMapping)) {
|
|
9047
|
+
if (parsed[jsonKey] !== void 0) {
|
|
9048
|
+
const parts = targetFieldId.split(".");
|
|
9049
|
+
const fk = parts.length === 2 ? parts[1] : targetFieldId;
|
|
9050
|
+
setValue(fk, parsed[jsonKey]);
|
|
9051
|
+
}
|
|
9052
|
+
}
|
|
9053
|
+
setError(null);
|
|
9054
|
+
setModeLocal("manual");
|
|
9055
|
+
formField.onChange("manual");
|
|
9056
|
+
} catch (e) {
|
|
9057
|
+
setError("Invalid JSON");
|
|
9058
|
+
}
|
|
9059
|
+
},
|
|
9060
|
+
[mapping, setValue, formField]
|
|
9061
|
+
);
|
|
9062
|
+
const styles = getStyles$f(theme);
|
|
9063
|
+
if (mode === "manual") {
|
|
9064
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("paste"), disabled }, "Paste JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("upload"), disabled }, "Upload JWT Token"));
|
|
9065
|
+
}
|
|
9066
|
+
if (mode === "paste") {
|
|
9067
|
+
return /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(
|
|
9068
|
+
ui.TextArea,
|
|
9069
|
+
{
|
|
9070
|
+
placeholder: (_e = (_d = field.ui) == null ? void 0 : _d.placeholder) != null ? _e : "Paste Google JWT token here",
|
|
9071
|
+
rows: (_g = (_f = field.ui) == null ? void 0 : _f.rows) != null ? _g : 10,
|
|
9072
|
+
onBlur: (e) => {
|
|
9073
|
+
const val = e.currentTarget.value;
|
|
9074
|
+
if (val.trim()) {
|
|
9075
|
+
processJson(val);
|
|
9076
|
+
}
|
|
9077
|
+
},
|
|
9078
|
+
disabled
|
|
9079
|
+
}
|
|
9080
|
+
), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("upload"), disabled }, "Upload JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("manual"), disabled }, "Fill In JWT Token manually")), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.error }, error));
|
|
9081
|
+
}
|
|
9082
|
+
return /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(
|
|
9083
|
+
ui.FileDropzone,
|
|
9084
|
+
{
|
|
9085
|
+
options: { multiple: false, accept: accept.join(",") },
|
|
9086
|
+
readAs: "readAsText",
|
|
9087
|
+
onLoad: (result) => {
|
|
9088
|
+
if (typeof result === "string") {
|
|
9089
|
+
processJson(result);
|
|
9090
|
+
}
|
|
9091
|
+
}
|
|
9092
|
+
}
|
|
9093
|
+
), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("paste"), disabled }, "Paste JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("manual"), disabled }, "Fill In JWT Token manually")), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.error }, error));
|
|
9094
|
+
}
|
|
9095
|
+
function getStyles$f(theme) {
|
|
9096
|
+
return {
|
|
9097
|
+
buttonRow: css.css({
|
|
9098
|
+
marginTop: theme.spacing(1),
|
|
9099
|
+
display: "flex",
|
|
9100
|
+
alignItems: "center",
|
|
9101
|
+
gap: theme.spacing(0.5)
|
|
9102
|
+
}),
|
|
9103
|
+
separator: css.css({
|
|
9104
|
+
padding: `0 ${theme.spacing(0.5)}`,
|
|
9105
|
+
color: theme.colors.text.secondary
|
|
9106
|
+
}),
|
|
9107
|
+
error: css.css({
|
|
9108
|
+
color: theme.colors.error.text,
|
|
9109
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9110
|
+
marginTop: theme.spacing(0.5),
|
|
9111
|
+
display: "block"
|
|
9112
|
+
})
|
|
9113
|
+
};
|
|
9114
|
+
}
|
|
9115
|
+
|
|
9116
|
+
const IndexedPairEditor = (props) => {
|
|
9117
|
+
const { value, onChange, maxItems = 10, disabled, hideControls, itemLabel = "header" } = props;
|
|
9067
9118
|
const styles = ui.useStyles2(getStyles$e);
|
|
9068
|
-
const
|
|
9069
|
-
|
|
9070
|
-
if (
|
|
9071
|
-
|
|
9119
|
+
const items = Array.isArray(value) ? value : [];
|
|
9120
|
+
const addItem = () => {
|
|
9121
|
+
if (items.length >= maxItems) {
|
|
9122
|
+
return;
|
|
9072
9123
|
}
|
|
9073
|
-
|
|
9124
|
+
onChange([...items, { index: 0, name: "", value: "" }]);
|
|
9125
|
+
};
|
|
9126
|
+
const removeItem = (index) => {
|
|
9127
|
+
onChange(items.filter((_, i) => i !== index));
|
|
9074
9128
|
};
|
|
9075
|
-
const
|
|
9076
|
-
|
|
9129
|
+
const updateItem = (index, key, val) => {
|
|
9130
|
+
const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
|
|
9131
|
+
onChange(updated);
|
|
9077
9132
|
};
|
|
9078
|
-
return /* @__PURE__ */ React__default.default.createElement(
|
|
9079
|
-
|
|
9133
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 0.5 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
|
|
9134
|
+
IndexedPairRow,
|
|
9080
9135
|
{
|
|
9081
|
-
|
|
9082
|
-
|
|
9083
|
-
|
|
9084
|
-
|
|
9085
|
-
|
|
9086
|
-
|
|
9087
|
-
|
|
9136
|
+
key: item.index || `new-${i}`,
|
|
9137
|
+
item,
|
|
9138
|
+
index: i,
|
|
9139
|
+
disabled,
|
|
9140
|
+
onUpdate: updateItem,
|
|
9141
|
+
onRemove: removeItem,
|
|
9142
|
+
hideControls,
|
|
9143
|
+
itemLabel
|
|
9144
|
+
}
|
|
9145
|
+
)), !hideControls && items.length < maxItems && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", disabled, onClick: addItem, type: "button" }, "Add ", itemLabel)), !hideControls && items.length >= maxItems && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.limitNote }, "Maximum ", maxItems, " ", itemLabel, "s reached"));
|
|
9146
|
+
};
|
|
9147
|
+
const IndexedPairRow = (props) => {
|
|
9148
|
+
const { item, index, disabled, onUpdate, onRemove, hideControls, itemLabel = "header" } = props;
|
|
9149
|
+
const styles = ui.useStyles2(getStyles$e);
|
|
9150
|
+
const secureStyles = ui.useStyles2(getSecureFieldStyles);
|
|
9151
|
+
const isConfigured = item.value === SECURE_FIELD_CONFIGURED;
|
|
9152
|
+
const [editing, setEditing] = React.useState(false);
|
|
9153
|
+
const [revealed, setRevealed] = React.useState(false);
|
|
9154
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1 }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
|
|
9088
9155
|
ui.Input,
|
|
9089
9156
|
{
|
|
9090
|
-
value:
|
|
9091
|
-
|
|
9157
|
+
value: item.name,
|
|
9158
|
+
placeholder: "key",
|
|
9159
|
+
disabled: disabled || hideControls,
|
|
9160
|
+
onChange: (e) => onUpdate(index, "name", e.currentTarget.value),
|
|
9092
9161
|
onKeyDown: (e) => {
|
|
9093
9162
|
if (e.key === "Enter") {
|
|
9094
9163
|
e.preventDefault();
|
|
9095
|
-
addTag();
|
|
9096
9164
|
}
|
|
9097
|
-
}
|
|
9098
|
-
onBlur: addTag,
|
|
9099
|
-
placeholder,
|
|
9100
|
-
disabled
|
|
9101
|
-
}
|
|
9102
|
-
));
|
|
9103
|
-
}
|
|
9104
|
-
const getStyles$e = (theme) => ({
|
|
9105
|
-
container: css.css({
|
|
9106
|
-
display: "flex",
|
|
9107
|
-
flexDirection: "column",
|
|
9108
|
-
gap: theme.spacing(0.5)
|
|
9109
|
-
}),
|
|
9110
|
-
tags: css.css({
|
|
9111
|
-
display: "flex",
|
|
9112
|
-
flexWrap: "wrap",
|
|
9113
|
-
gap: theme.spacing(0.5)
|
|
9114
|
-
}),
|
|
9115
|
-
tag: css.css({
|
|
9116
|
-
display: "inline-flex",
|
|
9117
|
-
alignItems: "center",
|
|
9118
|
-
gap: theme.spacing(0.25),
|
|
9119
|
-
padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
|
|
9120
|
-
borderRadius: theme.shape.radius.pill,
|
|
9121
|
-
backgroundColor: theme.colors.background.secondary,
|
|
9122
|
-
border: `1px solid ${theme.colors.border.weak}`,
|
|
9123
|
-
fontSize: theme.typography.bodySmall.fontSize,
|
|
9124
|
-
color: theme.colors.text.primary
|
|
9125
|
-
}),
|
|
9126
|
-
tagRemove: css.css({
|
|
9127
|
-
display: "inline-flex",
|
|
9128
|
-
alignItems: "center",
|
|
9129
|
-
padding: 0,
|
|
9130
|
-
border: "none",
|
|
9131
|
-
backgroundColor: "transparent",
|
|
9132
|
-
cursor: "pointer",
|
|
9133
|
-
color: theme.colors.text.secondary,
|
|
9134
|
-
"&:hover": { color: theme.colors.text.primary }
|
|
9135
|
-
})
|
|
9136
|
-
});
|
|
9137
|
-
|
|
9138
|
-
function IndexedPairRow({
|
|
9139
|
-
item,
|
|
9140
|
-
index,
|
|
9141
|
-
disabled,
|
|
9142
|
-
onUpdate,
|
|
9143
|
-
onRemove,
|
|
9144
|
-
hideControls
|
|
9145
|
-
}) {
|
|
9146
|
-
const styles = ui.useStyles2(getStyles$d);
|
|
9147
|
-
const secureStyles = ui.useStyles2(getSecureFieldStyles);
|
|
9148
|
-
const isConfigured = item.value === SECURE_FIELD_CONFIGURED;
|
|
9149
|
-
const [editing, setEditing] = React.useState(false);
|
|
9150
|
-
const [revealed, setRevealed] = React.useState(false);
|
|
9151
|
-
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1 }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
|
|
9152
|
-
ui.Input,
|
|
9153
|
-
{
|
|
9154
|
-
value: item.name,
|
|
9155
|
-
placeholder: "Header name",
|
|
9156
|
-
disabled: disabled || hideControls,
|
|
9157
|
-
onChange: (e) => onUpdate(index, "name", e.currentTarget.value)
|
|
9165
|
+
}
|
|
9158
9166
|
}
|
|
9159
9167
|
)), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, isConfigured && !editing ? /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1, alignItems: "center" }, /* @__PURE__ */ React__default.default.createElement("span", { className: secureStyles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), "Configured"), !disabled && /* @__PURE__ */ React__default.default.createElement(
|
|
9160
9168
|
ui.Button,
|
|
@@ -9173,10 +9181,15 @@ function IndexedPairRow({
|
|
|
9173
9181
|
ui.Input,
|
|
9174
9182
|
{
|
|
9175
9183
|
value: item.value === SECURE_FIELD_CONFIGURED ? "" : item.value,
|
|
9176
|
-
placeholder:
|
|
9184
|
+
placeholder: `${itemLabel} value`,
|
|
9177
9185
|
disabled,
|
|
9178
9186
|
type: revealed ? "text" : "password",
|
|
9179
9187
|
onChange: (e) => onUpdate(index, "value", e.currentTarget.value),
|
|
9188
|
+
onKeyDown: (e) => {
|
|
9189
|
+
if (e.key === "Enter") {
|
|
9190
|
+
e.preventDefault();
|
|
9191
|
+
}
|
|
9192
|
+
},
|
|
9180
9193
|
suffix: /* @__PURE__ */ React__default.default.createElement(
|
|
9181
9194
|
ui.Button,
|
|
9182
9195
|
{
|
|
@@ -9190,34 +9203,56 @@ function IndexedPairRow({
|
|
|
9190
9203
|
}
|
|
9191
9204
|
)
|
|
9192
9205
|
}
|
|
9193
|
-
)), !hideControls && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content:
|
|
9206
|
+
)), !hideControls && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `Remove ${itemLabel}` }, /* @__PURE__ */ React__default.default.createElement(
|
|
9194
9207
|
ui.Button,
|
|
9195
9208
|
{
|
|
9196
9209
|
variant: "secondary",
|
|
9197
9210
|
fill: "text",
|
|
9198
9211
|
size: "sm",
|
|
9199
9212
|
icon: "trash-alt",
|
|
9200
|
-
"aria-label":
|
|
9213
|
+
"aria-label": `Remove ${itemLabel}`,
|
|
9201
9214
|
disabled,
|
|
9202
9215
|
onClick: () => onRemove(index),
|
|
9203
9216
|
type: "button"
|
|
9204
9217
|
}
|
|
9205
9218
|
)));
|
|
9206
|
-
}
|
|
9207
|
-
|
|
9208
|
-
|
|
9209
|
-
|
|
9210
|
-
|
|
9211
|
-
|
|
9212
|
-
|
|
9213
|
-
|
|
9219
|
+
};
|
|
9220
|
+
const getStyles$e = (theme) => ({
|
|
9221
|
+
inputCell: css.css({
|
|
9222
|
+
flex: "1 1 0",
|
|
9223
|
+
minWidth: 0,
|
|
9224
|
+
overflow: "hidden"
|
|
9225
|
+
}),
|
|
9226
|
+
limitNote: css.css({
|
|
9227
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9228
|
+
color: theme.colors.text.secondary
|
|
9229
|
+
})
|
|
9230
|
+
});
|
|
9231
|
+
|
|
9232
|
+
function ObjectArrayEditor(props) {
|
|
9233
|
+
var _a, _b, _c, _d, _e, _f;
|
|
9234
|
+
const { field, value, onChange, disabled, errorMessage } = props;
|
|
9214
9235
|
const styles = ui.useStyles2(getStyles$d);
|
|
9236
|
+
const itemFields = (_b = (_a = field.item) == null ? void 0 : _a.fields) != null ? _b : [];
|
|
9237
|
+
const layoutRows = computeLayoutRows(itemFields);
|
|
9215
9238
|
const items = Array.isArray(value) ? value : [];
|
|
9239
|
+
const maxItems = (_e = (_d = (_c = field.validations) == null ? void 0 : _c.find((v) => v.type === "itemCount")) == null ? void 0 : _d.max) != null ? _e : 20;
|
|
9240
|
+
const label = (_f = field.label) != null ? _f : field.key;
|
|
9241
|
+
const itemErrors = parseItemErrors(errorMessage);
|
|
9216
9242
|
const addItem = () => {
|
|
9243
|
+
var _a2, _b2;
|
|
9217
9244
|
if (items.length >= maxItems) {
|
|
9218
9245
|
return;
|
|
9219
9246
|
}
|
|
9220
|
-
|
|
9247
|
+
const empty = {};
|
|
9248
|
+
for (const f of itemFields) {
|
|
9249
|
+
if (f.valueType === "boolean") {
|
|
9250
|
+
empty[f.key] = (_a2 = f.defaultValue) != null ? _a2 : false;
|
|
9251
|
+
} else {
|
|
9252
|
+
empty[f.key] = (_b2 = f.defaultValue) != null ? _b2 : "";
|
|
9253
|
+
}
|
|
9254
|
+
}
|
|
9255
|
+
onChange([...items, empty]);
|
|
9221
9256
|
};
|
|
9222
9257
|
const removeItem = (index) => {
|
|
9223
9258
|
onChange(items.filter((_, i) => i !== index));
|
|
@@ -9226,78 +9261,241 @@ function IndexedPairEditor({
|
|
|
9226
9261
|
const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
|
|
9227
9262
|
onChange(updated);
|
|
9228
9263
|
};
|
|
9229
|
-
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap:
|
|
9230
|
-
|
|
9264
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 1 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
|
|
9265
|
+
ObjectArrayItemRow,
|
|
9231
9266
|
{
|
|
9232
|
-
key:
|
|
9267
|
+
key: i,
|
|
9233
9268
|
item,
|
|
9234
9269
|
index: i,
|
|
9235
|
-
|
|
9270
|
+
itemFields,
|
|
9271
|
+
layoutRows,
|
|
9272
|
+
disabled: !!disabled,
|
|
9236
9273
|
onUpdate: updateItem,
|
|
9237
9274
|
onRemove: removeItem,
|
|
9238
|
-
|
|
9275
|
+
showLabels: true,
|
|
9276
|
+
error: itemErrors == null ? void 0 : itemErrors[i]
|
|
9277
|
+
}
|
|
9278
|
+
)), items.length < maxItems && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", disabled, onClick: addItem, type: "button" }, "Add ", label.toLowerCase())), items.length >= maxItems && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.limitNote }, "Maximum ", maxItems, " items reached"));
|
|
9279
|
+
}
|
|
9280
|
+
function computeLayoutRows(fields) {
|
|
9281
|
+
var _a;
|
|
9282
|
+
const hasExplicitRow = fields.some((f) => {
|
|
9283
|
+
var _a2;
|
|
9284
|
+
return ((_a2 = f.ui) == null ? void 0 : _a2.row) !== void 0;
|
|
9285
|
+
});
|
|
9286
|
+
if (!hasExplicitRow) {
|
|
9287
|
+
if (fields.length <= 3) {
|
|
9288
|
+
return [fields];
|
|
9289
|
+
}
|
|
9290
|
+
return fields.map((f) => [f]);
|
|
9291
|
+
}
|
|
9292
|
+
const rowMap = /* @__PURE__ */ new Map();
|
|
9293
|
+
const noRow = [];
|
|
9294
|
+
for (const f of fields) {
|
|
9295
|
+
if (((_a = f.ui) == null ? void 0 : _a.row) !== void 0) {
|
|
9296
|
+
const existing = rowMap.get(f.ui.row);
|
|
9297
|
+
if (existing) {
|
|
9298
|
+
existing.push(f);
|
|
9299
|
+
} else {
|
|
9300
|
+
rowMap.set(f.ui.row, [f]);
|
|
9301
|
+
}
|
|
9302
|
+
} else {
|
|
9303
|
+
noRow.push(f);
|
|
9239
9304
|
}
|
|
9240
|
-
|
|
9305
|
+
}
|
|
9306
|
+
const sortedKeys = [...rowMap.keys()].sort((a, b) => a - b);
|
|
9307
|
+
const rows = sortedKeys.map((k) => rowMap.get(k));
|
|
9308
|
+
for (const f of noRow) {
|
|
9309
|
+
rows.push([f]);
|
|
9310
|
+
}
|
|
9311
|
+
return rows;
|
|
9312
|
+
}
|
|
9313
|
+
function makeItemFormField(item, index, fieldKey, onUpdate) {
|
|
9314
|
+
return {
|
|
9315
|
+
name: `item-${index}-${fieldKey}`,
|
|
9316
|
+
value: item[fieldKey],
|
|
9317
|
+
onChange: (eventOrValue) => {
|
|
9318
|
+
if (eventOrValue != null && typeof eventOrValue === "object" && "target" in eventOrValue) {
|
|
9319
|
+
onUpdate(index, fieldKey, eventOrValue.target.value);
|
|
9320
|
+
} else {
|
|
9321
|
+
onUpdate(index, fieldKey, eventOrValue);
|
|
9322
|
+
}
|
|
9323
|
+
},
|
|
9324
|
+
onBlur: () => {
|
|
9325
|
+
}
|
|
9326
|
+
};
|
|
9327
|
+
}
|
|
9328
|
+
function effectiveItemField(field, isSecure) {
|
|
9329
|
+
if (!isSecure) {
|
|
9330
|
+
return field;
|
|
9331
|
+
}
|
|
9332
|
+
return { ...field, semanticType: "password" };
|
|
9333
|
+
}
|
|
9334
|
+
function ObjectArrayItemRow({
|
|
9335
|
+
item,
|
|
9336
|
+
index,
|
|
9337
|
+
itemFields,
|
|
9338
|
+
layoutRows,
|
|
9339
|
+
disabled,
|
|
9340
|
+
onUpdate,
|
|
9341
|
+
onRemove,
|
|
9342
|
+
showLabels,
|
|
9343
|
+
error
|
|
9344
|
+
}) {
|
|
9345
|
+
const styles = ui.useStyles2(getStyles$d);
|
|
9346
|
+
const secureOverride = findActiveSecureOverride(itemFields, item, index);
|
|
9347
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.itemRow }, layoutRows.map((row, rowIdx) => /* @__PURE__ */ React__default.default.createElement(ui.Stack, { key: rowIdx, direction: "row", gap: 1, alignItems: "flex-end", wrap: "wrap" }, row.map((field) => {
|
|
9348
|
+
var _a;
|
|
9349
|
+
const isSecureTarget = (secureOverride == null ? void 0 : secureOverride.fieldKey) === field.key;
|
|
9350
|
+
const eff = effectiveItemField(field, !!isSecureTarget);
|
|
9351
|
+
const formField = makeItemFormField(item, index, field.key, onUpdate);
|
|
9352
|
+
if (isSecureTarget && item[field.key] === SECURE_FIELD_CONFIGURED) {
|
|
9353
|
+
formField.value = SECURE_FIELD_CONFIGURED;
|
|
9354
|
+
}
|
|
9355
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { key: field.key, className: field.valueType === "boolean" ? styles.boolCell : styles.inputCell }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.cellLabel }, (_a = field.label) != null ? _a : field.key, field.required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.required }, " *")), renderFieldInput(eff, formField, disabled));
|
|
9356
|
+
}), rowIdx === 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.removeCellWithLabel }, /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Remove" }, /* @__PURE__ */ React__default.default.createElement(
|
|
9357
|
+
ui.Button,
|
|
9358
|
+
{
|
|
9359
|
+
variant: "secondary",
|
|
9360
|
+
fill: "text",
|
|
9361
|
+
size: "sm",
|
|
9362
|
+
icon: "trash-alt",
|
|
9363
|
+
"aria-label": "Remove item",
|
|
9364
|
+
disabled,
|
|
9365
|
+
onClick: () => onRemove(index),
|
|
9366
|
+
type: "button"
|
|
9367
|
+
}
|
|
9368
|
+
))))), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.itemError }, error));
|
|
9241
9369
|
}
|
|
9242
9370
|
const getStyles$d = (theme) => ({
|
|
9371
|
+
itemRow: css.css({
|
|
9372
|
+
display: "flex",
|
|
9373
|
+
flexDirection: "column",
|
|
9374
|
+
gap: theme.spacing(0.5),
|
|
9375
|
+
padding: theme.spacing(1),
|
|
9376
|
+
borderRadius: theme.shape.radius.default,
|
|
9377
|
+
border: `1px solid ${theme.colors.border.weak}`
|
|
9378
|
+
}),
|
|
9243
9379
|
inputCell: css.css({
|
|
9244
|
-
flex: "1 1
|
|
9245
|
-
minWidth:
|
|
9380
|
+
flex: "1 1 120px",
|
|
9381
|
+
minWidth: 120,
|
|
9246
9382
|
overflow: "hidden"
|
|
9247
9383
|
}),
|
|
9384
|
+
boolCell: css.css({
|
|
9385
|
+
flex: "0 0 auto",
|
|
9386
|
+
minWidth: 0
|
|
9387
|
+
}),
|
|
9388
|
+
cellLabel: css.css({
|
|
9389
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9390
|
+
color: theme.colors.text.secondary,
|
|
9391
|
+
marginBottom: theme.spacing(0.25)
|
|
9392
|
+
}),
|
|
9393
|
+
required: css.css({
|
|
9394
|
+
color: theme.colors.error.text
|
|
9395
|
+
}),
|
|
9396
|
+
removeCellWithLabel: css.css({
|
|
9397
|
+
flex: "0 0 auto",
|
|
9398
|
+
display: "flex",
|
|
9399
|
+
alignItems: "flex-end",
|
|
9400
|
+
paddingBottom: theme.spacing(0.25)
|
|
9401
|
+
}),
|
|
9402
|
+
itemError: css.css({
|
|
9403
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9404
|
+
color: theme.colors.error.text
|
|
9405
|
+
}),
|
|
9248
9406
|
limitNote: css.css({
|
|
9249
9407
|
fontSize: theme.typography.bodySmall.fontSize,
|
|
9250
9408
|
color: theme.colors.text.secondary
|
|
9251
9409
|
})
|
|
9252
9410
|
});
|
|
9253
9411
|
|
|
9254
|
-
|
|
9412
|
+
const StringArrayInput = (props) => {
|
|
9413
|
+
const { value, onChange, placeholder, disabled, itemLabel = "item" } = props;
|
|
9255
9414
|
const styles = ui.useStyles2(getStyles$c);
|
|
9256
|
-
|
|
9257
|
-
|
|
9415
|
+
const items = Array.isArray(value) ? value : [];
|
|
9416
|
+
const lastInputRef = React.useRef(null);
|
|
9417
|
+
const shouldFocusLastRef = React.useRef(false);
|
|
9418
|
+
React.useEffect(() => {
|
|
9419
|
+
if (shouldFocusLastRef.current && lastInputRef.current) {
|
|
9420
|
+
lastInputRef.current.focus();
|
|
9421
|
+
shouldFocusLastRef.current = false;
|
|
9422
|
+
}
|
|
9423
|
+
}, [items.length]);
|
|
9424
|
+
const addItem = () => {
|
|
9425
|
+
shouldFocusLastRef.current = true;
|
|
9426
|
+
onChange([...items, ""]);
|
|
9427
|
+
};
|
|
9428
|
+
const removeItem = (index) => {
|
|
9429
|
+
onChange(items.filter((_, i) => i !== index));
|
|
9430
|
+
};
|
|
9431
|
+
const updateItem = (index, val) => {
|
|
9432
|
+
onChange(items.map((item, i) => i === index ? val : item));
|
|
9433
|
+
};
|
|
9434
|
+
const isItemValid = (index, val) => {
|
|
9435
|
+
const trimmed = val.trim();
|
|
9436
|
+
if (trimmed === "") {
|
|
9437
|
+
return false;
|
|
9438
|
+
}
|
|
9439
|
+
return !items.some((item, i) => i !== index && item.trim() === trimmed);
|
|
9440
|
+
};
|
|
9441
|
+
const handleEnter = (index, currentValue) => {
|
|
9442
|
+
if (!isItemValid(index, currentValue)) {
|
|
9443
|
+
return;
|
|
9444
|
+
}
|
|
9445
|
+
if (index === items.length - 1) {
|
|
9446
|
+
shouldFocusLastRef.current = true;
|
|
9447
|
+
onChange([...items, ""]);
|
|
9448
|
+
}
|
|
9449
|
+
};
|
|
9450
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 0.5 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1, key: i }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
|
|
9451
|
+
ui.Input,
|
|
9452
|
+
{
|
|
9453
|
+
ref: i === items.length - 1 ? lastInputRef : void 0,
|
|
9454
|
+
value: item,
|
|
9455
|
+
placeholder: placeholder != null ? placeholder : itemLabel,
|
|
9456
|
+
disabled,
|
|
9457
|
+
onChange: (e) => updateItem(i, e.currentTarget.value),
|
|
9458
|
+
onKeyDown: (e) => {
|
|
9459
|
+
if (e.key === "Enter") {
|
|
9460
|
+
e.preventDefault();
|
|
9461
|
+
handleEnter(i, e.currentTarget.value);
|
|
9462
|
+
}
|
|
9463
|
+
}
|
|
9464
|
+
}
|
|
9465
|
+
)), !disabled && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `Remove ${itemLabel}` }, /* @__PURE__ */ React__default.default.createElement(
|
|
9466
|
+
ui.Button,
|
|
9467
|
+
{
|
|
9468
|
+
variant: "secondary",
|
|
9469
|
+
fill: "text",
|
|
9470
|
+
size: "sm",
|
|
9471
|
+
icon: "trash-alt",
|
|
9472
|
+
"aria-label": `Remove ${itemLabel}`,
|
|
9473
|
+
onClick: () => removeItem(i),
|
|
9474
|
+
type: "button"
|
|
9475
|
+
}
|
|
9476
|
+
)))), !disabled && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", onClick: addItem, type: "button" }, "Add")));
|
|
9477
|
+
};
|
|
9258
9478
|
const getStyles$c = (theme) => ({
|
|
9259
|
-
|
|
9260
|
-
|
|
9261
|
-
|
|
9262
|
-
|
|
9263
|
-
padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
|
|
9264
|
-
fontSize: theme.typography.bodySmall.fontSize,
|
|
9265
|
-
color: theme.colors.text.secondary,
|
|
9266
|
-
backgroundColor: theme.colors.background.secondary,
|
|
9267
|
-
borderRadius: theme.shape.radius.default,
|
|
9268
|
-
border: `1px solid ${theme.colors.border.weak}`
|
|
9479
|
+
inputCell: css.css({
|
|
9480
|
+
flex: "1 1 0",
|
|
9481
|
+
minWidth: 0,
|
|
9482
|
+
overflow: "hidden"
|
|
9269
9483
|
})
|
|
9270
9484
|
});
|
|
9271
9485
|
|
|
9272
|
-
function renderFieldInput(field, formField, disabled) {
|
|
9273
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
9486
|
+
function renderFieldInput(field, formField, disabled, errorMessage, setValue) {
|
|
9487
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
9274
9488
|
const value = formField.value;
|
|
9275
9489
|
const placeholder = (_a = field.ui) == null ? void 0 : _a.placeholder;
|
|
9276
9490
|
const label = (_b = field.label) != null ? _b : field.key;
|
|
9491
|
+
if (((_c = field.ui) == null ? void 0 : _c.component) === "fileUpload" && field.ui.fileMapping && setValue) {
|
|
9492
|
+
return /* @__PURE__ */ React__default.default.createElement(FileUploadField, { field, formField, disabled, setValue });
|
|
9493
|
+
}
|
|
9277
9494
|
if (field.target === "secureJsonData" || field.semanticType === "password" || field.semanticType === "token") {
|
|
9278
9495
|
return /* @__PURE__ */ React__default.default.createElement(SecureFieldInput, { formField, placeholder: placeholder != null ? placeholder : label, disabled, label });
|
|
9279
9496
|
}
|
|
9280
|
-
if (field.
|
|
9281
|
-
|
|
9282
|
-
}
|
|
9283
|
-
if (field.valueType === "number") {
|
|
9284
|
-
return /* @__PURE__ */ React__default.default.createElement(
|
|
9285
|
-
ui.Input,
|
|
9286
|
-
{
|
|
9287
|
-
...formField,
|
|
9288
|
-
value: value !== void 0 && value !== null ? Number(value) : "",
|
|
9289
|
-
type: "number",
|
|
9290
|
-
placeholder,
|
|
9291
|
-
disabled,
|
|
9292
|
-
onChange: (e) => {
|
|
9293
|
-
const n = e.currentTarget.valueAsNumber;
|
|
9294
|
-
formField.onChange(Number.isNaN(n) ? void 0 : n);
|
|
9295
|
-
}
|
|
9296
|
-
}
|
|
9297
|
-
);
|
|
9298
|
-
}
|
|
9299
|
-
if (((_c = field.ui) == null ? void 0 : _c.component) === "radio") {
|
|
9300
|
-
const options = ((_e = (_d = field.ui) == null ? void 0 : _d.options) != null ? _e : []).map((opt) => ({
|
|
9497
|
+
if (((_d = field.ui) == null ? void 0 : _d.component) === "radio") {
|
|
9498
|
+
const options = ((_f = (_e = field.ui) == null ? void 0 : _e.options) != null ? _f : []).map((opt) => ({
|
|
9301
9499
|
label: opt.label,
|
|
9302
9500
|
value: String(opt.value),
|
|
9303
9501
|
description: opt.description
|
|
@@ -9307,13 +9505,20 @@ function renderFieldInput(field, formField, disabled) {
|
|
|
9307
9505
|
{
|
|
9308
9506
|
options,
|
|
9309
9507
|
value: String(value != null ? value : ""),
|
|
9310
|
-
onChange: (v) =>
|
|
9508
|
+
onChange: (v) => {
|
|
9509
|
+
if (field.valueType === "number") {
|
|
9510
|
+
const n = Number(v);
|
|
9511
|
+
formField.onChange(Number.isNaN(n) ? v : n);
|
|
9512
|
+
} else {
|
|
9513
|
+
formField.onChange(v);
|
|
9514
|
+
}
|
|
9515
|
+
},
|
|
9311
9516
|
disabled
|
|
9312
9517
|
}
|
|
9313
9518
|
));
|
|
9314
9519
|
}
|
|
9315
|
-
if (((
|
|
9316
|
-
const options = ((
|
|
9520
|
+
if (((_g = field.ui) == null ? void 0 : _g.component) === "select") {
|
|
9521
|
+
const options = ((_i = (_h = field.ui) == null ? void 0 : _h.options) != null ? _i : []).map((opt) => ({
|
|
9317
9522
|
label: opt.label,
|
|
9318
9523
|
value: String(opt.value),
|
|
9319
9524
|
description: opt.description
|
|
@@ -9324,260 +9529,88 @@ function renderFieldInput(field, formField, disabled) {
|
|
|
9324
9529
|
options,
|
|
9325
9530
|
value: options.find((o) => o.value === String(value != null ? value : "")),
|
|
9326
9531
|
onChange: (v) => formField.onChange(v == null ? void 0 : v.value),
|
|
9327
|
-
disabled
|
|
9328
|
-
}
|
|
9329
|
-
);
|
|
9330
|
-
}
|
|
9331
|
-
if (field.
|
|
9332
|
-
return /* @__PURE__ */ React__default.default.createElement(ui.
|
|
9333
|
-
}
|
|
9334
|
-
if (
|
|
9335
|
-
return /* @__PURE__ */ React__default.default.createElement(
|
|
9336
|
-
ui.TextArea,
|
|
9337
|
-
{
|
|
9338
|
-
...formField,
|
|
9339
|
-
value: String(value != null ? value : ""),
|
|
9340
|
-
placeholder,
|
|
9341
|
-
disabled,
|
|
9342
|
-
rows: (_k = (_j = field.ui) == null ? void 0 : _j.rows) != null ? _k : 3
|
|
9343
|
-
}
|
|
9344
|
-
);
|
|
9345
|
-
}
|
|
9346
|
-
if (field.valueType === "array" && ((_l = field.item) == null ? void 0 : _l.valueType) === "string") {
|
|
9347
|
-
return /* @__PURE__ */ React__default.default.createElement(
|
|
9348
|
-
StringArrayInput,
|
|
9349
|
-
{
|
|
9350
|
-
value: Array.isArray(value) ? value : [],
|
|
9351
|
-
onChange: formField.onChange,
|
|
9352
|
-
placeholder: placeholder != null ? placeholder : `Add ${label.toLowerCase()}\u2026`,
|
|
9353
|
-
disabled
|
|
9354
|
-
}
|
|
9355
|
-
);
|
|
9356
|
-
}
|
|
9357
|
-
if (((_m = field.storage) == null ? void 0 : _m.type) === "indexedPair") {
|
|
9358
|
-
const items = Array.isArray(value) ? value : [];
|
|
9359
|
-
const maxItems = (_p = (_o = (_n = field.validations) == null ? void 0 : _n.find((v) => v.type === "itemCount")) == null ? void 0 : _o.max) != null ? _p : 10;
|
|
9360
|
-
return /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: items, onChange: formField.onChange, maxItems, disabled });
|
|
9361
|
-
}
|
|
9362
|
-
if (field.valueType === "object" || field.valueType === "map" || field.valueType === "array" && (((_q = field.item) == null ? void 0 : _q.valueType) === "object" || ((_r = field.item) == null ? void 0 : _r.valueType) === "map")) {
|
|
9363
|
-
const count = Array.isArray(value) ? value.length : 0;
|
|
9364
|
-
return /* @__PURE__ */ React__default.default.createElement(ComplexFieldNote, { count, label });
|
|
9365
|
-
}
|
|
9366
|
-
return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), placeholder, disabled });
|
|
9367
|
-
}
|
|
9368
|
-
|
|
9369
|
-
const getWizardStyles = (theme) => ({
|
|
9370
|
-
container: css.css({
|
|
9371
|
-
position: "relative",
|
|
9372
|
-
display: "flex",
|
|
9373
|
-
flexDirection: "column",
|
|
9374
|
-
gap: theme.spacing(1),
|
|
9375
|
-
padding: theme.spacing(1.5),
|
|
9376
|
-
backgroundColor: theme.colors.background.secondary,
|
|
9377
|
-
borderRadius: theme.shape.radius.default,
|
|
9378
|
-
border: `1px solid ${theme.colors.border.weak}`,
|
|
9379
|
-
overflow: "hidden"
|
|
9380
|
-
}),
|
|
9381
|
-
overlay: css.css({
|
|
9382
|
-
position: "absolute",
|
|
9383
|
-
inset: 0,
|
|
9384
|
-
display: "flex",
|
|
9385
|
-
alignItems: "center",
|
|
9386
|
-
justifyContent: "center",
|
|
9387
|
-
gap: theme.spacing(1),
|
|
9388
|
-
background: theme.colors.background.secondary,
|
|
9389
|
-
borderRadius: theme.shape.radius.default,
|
|
9390
|
-
zIndex: 1,
|
|
9391
|
-
fontSize: theme.typography.bodySmall.fontSize,
|
|
9392
|
-
color: theme.colors.text.primary,
|
|
9393
|
-
opacity: 0.95
|
|
9394
|
-
}),
|
|
9395
|
-
readOnlyBanner: css.css({
|
|
9396
|
-
display: "inline-flex",
|
|
9397
|
-
alignItems: "center",
|
|
9398
|
-
gap: theme.spacing(0.5),
|
|
9399
|
-
padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
|
|
9400
|
-
fontSize: theme.typography.bodySmall.fontSize,
|
|
9401
|
-
color: theme.colors.text.secondary,
|
|
9402
|
-
backgroundColor: theme.colors.background.secondary,
|
|
9403
|
-
borderRadius: theme.shape.radius.default,
|
|
9404
|
-
border: `1px solid ${theme.colors.border.weak}`
|
|
9405
|
-
}),
|
|
9406
|
-
navBar: css.css({
|
|
9407
|
-
display: "flex",
|
|
9408
|
-
alignItems: "center",
|
|
9409
|
-
justifyContent: "space-between"
|
|
9410
|
-
}),
|
|
9411
|
-
navTitle: css.css({
|
|
9412
|
-
display: "inline-flex",
|
|
9413
|
-
alignItems: "center",
|
|
9414
|
-
gap: theme.spacing(0.5),
|
|
9415
|
-
fontSize: theme.typography.body.fontSize,
|
|
9416
|
-
fontWeight: theme.typography.fontWeightBold,
|
|
9417
|
-
color: theme.colors.text.primary
|
|
9418
|
-
}),
|
|
9419
|
-
stepCount: css.css({
|
|
9420
|
-
fontSize: "11px",
|
|
9421
|
-
fontWeight: "normal",
|
|
9422
|
-
color: theme.colors.text.secondary
|
|
9423
|
-
}),
|
|
9424
|
-
navActions: css.css({
|
|
9425
|
-
display: "flex",
|
|
9426
|
-
alignItems: "center",
|
|
9427
|
-
gap: theme.spacing(0.25)
|
|
9428
|
-
}),
|
|
9429
|
-
form: css.css({
|
|
9430
|
-
display: "flex",
|
|
9431
|
-
flexDirection: "column",
|
|
9432
|
-
gap: theme.spacing(0.75)
|
|
9433
|
-
}),
|
|
9434
|
-
buttons: css.css({
|
|
9435
|
-
display: "flex",
|
|
9436
|
-
gap: theme.spacing(1),
|
|
9437
|
-
paddingTop: theme.spacing(0.25)
|
|
9438
|
-
}),
|
|
9439
|
-
fieldRow: css.css({
|
|
9440
|
-
display: "grid",
|
|
9441
|
-
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
9442
|
-
gap: theme.spacing(0.75),
|
|
9443
|
-
alignItems: "start"
|
|
9444
|
-
}),
|
|
9445
|
-
fieldRowCenter: css.css({
|
|
9446
|
-
display: "grid",
|
|
9447
|
-
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
9448
|
-
gap: theme.spacing(0.75),
|
|
9449
|
-
alignItems: "center",
|
|
9450
|
-
padding: `${theme.spacing(0.5)} 0`
|
|
9451
|
-
}),
|
|
9452
|
-
fieldLabelRow: css.css({
|
|
9453
|
-
display: "flex",
|
|
9454
|
-
alignItems: "center",
|
|
9455
|
-
gap: theme.spacing(0.5),
|
|
9456
|
-
paddingTop: theme.spacing(0.5)
|
|
9457
|
-
}),
|
|
9458
|
-
fieldLabelRowCompact: css.css({
|
|
9459
|
-
display: "flex",
|
|
9460
|
-
alignItems: "center",
|
|
9461
|
-
gap: theme.spacing(0.5)
|
|
9462
|
-
}),
|
|
9463
|
-
fieldLabel: css.css({
|
|
9464
|
-
fontSize: theme.typography.bodySmall.fontSize,
|
|
9465
|
-
fontWeight: theme.typography.fontWeightMedium,
|
|
9466
|
-
color: theme.colors.text.primary
|
|
9467
|
-
}),
|
|
9468
|
-
fieldRequired: css.css({
|
|
9469
|
-
color: theme.colors.error.text,
|
|
9470
|
-
marginLeft: 2
|
|
9471
|
-
}),
|
|
9472
|
-
fieldInfoIcon: css.css({
|
|
9473
|
-
color: theme.colors.text.disabled,
|
|
9474
|
-
cursor: "help",
|
|
9475
|
-
flexShrink: 0
|
|
9476
|
-
}),
|
|
9477
|
-
fieldInputCol: css.css({
|
|
9478
|
-
display: "flex",
|
|
9479
|
-
flexDirection: "column",
|
|
9480
|
-
gap: theme.spacing(0.25),
|
|
9481
|
-
minWidth: 0
|
|
9482
|
-
}),
|
|
9483
|
-
fieldError: css.css({
|
|
9484
|
-
fontSize: "11px",
|
|
9485
|
-
color: theme.colors.error.text
|
|
9486
|
-
})
|
|
9487
|
-
});
|
|
9488
|
-
|
|
9489
|
-
function SchemaField({ field, control, errors, disabled, dsUid, watchedValues, fieldById }) {
|
|
9490
|
-
const styles = ui.useStyles2(getWizardStyles);
|
|
9491
|
-
const activeOverride = resolveActiveOverride(field, watchedValues, fieldById);
|
|
9492
|
-
const fk = formKey(field);
|
|
9493
|
-
if (field.key === "pdcInjected" && field.target === "jsonData") {
|
|
9532
|
+
disabled
|
|
9533
|
+
}
|
|
9534
|
+
);
|
|
9535
|
+
}
|
|
9536
|
+
if (field.valueType === "boolean") {
|
|
9537
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Switch, { value: !!value, onChange: (e) => formField.onChange(e.currentTarget.checked), disabled });
|
|
9538
|
+
}
|
|
9539
|
+
if (field.valueType === "number") {
|
|
9494
9540
|
return /* @__PURE__ */ React__default.default.createElement(
|
|
9495
|
-
|
|
9541
|
+
ui.Input,
|
|
9496
9542
|
{
|
|
9497
|
-
|
|
9498
|
-
|
|
9499
|
-
|
|
9500
|
-
|
|
9501
|
-
|
|
9502
|
-
|
|
9503
|
-
|
|
9504
|
-
|
|
9505
|
-
|
|
9506
|
-
)
|
|
9543
|
+
...formField,
|
|
9544
|
+
value: value !== void 0 && value !== null ? Number(value) : "",
|
|
9545
|
+
type: "number",
|
|
9546
|
+
placeholder,
|
|
9547
|
+
disabled,
|
|
9548
|
+
onChange: (e) => {
|
|
9549
|
+
const n = e.currentTarget.valueAsNumber;
|
|
9550
|
+
formField.onChange(Number.isNaN(n) ? void 0 : n);
|
|
9551
|
+
}
|
|
9507
9552
|
}
|
|
9508
9553
|
);
|
|
9509
9554
|
}
|
|
9510
|
-
|
|
9511
|
-
|
|
9512
|
-
|
|
9513
|
-
|
|
9514
|
-
|
|
9515
|
-
|
|
9516
|
-
|
|
9517
|
-
|
|
9518
|
-
|
|
9519
|
-
|
|
9520
|
-
|
|
9521
|
-
|
|
9522
|
-
const description = (_c = activeOverride == null ? void 0 : activeOverride.description) != null ? _c : field.description;
|
|
9523
|
-
const effectiveField = activeOverride ? {
|
|
9524
|
-
...field,
|
|
9525
|
-
ui: {
|
|
9526
|
-
...field.ui,
|
|
9527
|
-
placeholder: (_e = activeOverride.placeholder) != null ? _e : (_d = field.ui) == null ? void 0 : _d.placeholder
|
|
9528
|
-
}
|
|
9529
|
-
} : field;
|
|
9530
|
-
const isReadOnly = !!(activeOverride == null ? void 0 : activeOverride.readOnly);
|
|
9531
|
-
const isBool = field.valueType === "boolean";
|
|
9532
|
-
return /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldRowCenter : styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, label, required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldRequired }, "*")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, renderFieldInput(effectiveField, formField, disabled || isReadOnly), errorMessage && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldError }, errorMessage)));
|
|
9555
|
+
if (field.semanticType === "url") {
|
|
9556
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), type: "url", placeholder, disabled });
|
|
9557
|
+
}
|
|
9558
|
+
if (((_j = field.ui) == null ? void 0 : _j.component) === "textarea") {
|
|
9559
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
9560
|
+
ui.TextArea,
|
|
9561
|
+
{
|
|
9562
|
+
...formField,
|
|
9563
|
+
value: String(value != null ? value : ""),
|
|
9564
|
+
placeholder,
|
|
9565
|
+
disabled,
|
|
9566
|
+
rows: (_l = (_k = field.ui) == null ? void 0 : _k.rows) != null ? _l : 3
|
|
9533
9567
|
}
|
|
9534
|
-
|
|
9535
|
-
|
|
9536
|
-
|
|
9537
|
-
|
|
9538
|
-
|
|
9539
|
-
|
|
9540
|
-
|
|
9541
|
-
|
|
9542
|
-
|
|
9543
|
-
|
|
9544
|
-
|
|
9545
|
-
|
|
9546
|
-
|
|
9547
|
-
|
|
9548
|
-
);
|
|
9549
|
-
const authEntries = React.useMemo(() => {
|
|
9550
|
-
const entries = [];
|
|
9551
|
-
for (let i = 0; i < items.length; i++) {
|
|
9552
|
-
if (items[i].name.toLowerCase() === "authorization") {
|
|
9553
|
-
entries.push({ item: items[i], originalIdx: i });
|
|
9568
|
+
);
|
|
9569
|
+
}
|
|
9570
|
+
if (((_m = field.storage) == null ? void 0 : _m.type) === "indexedPair") {
|
|
9571
|
+
const items = Array.isArray(value) ? value : [];
|
|
9572
|
+
const maxItems = (_p = (_o = (_n = field.validations) == null ? void 0 : _n.find((v) => v.type === "itemCount")) == null ? void 0 : _o.max) != null ? _p : 10;
|
|
9573
|
+
const itemLabel = (_r = (_q = field.label) == null ? void 0 : _q.toLowerCase().replace(/s$/, "")) != null ? _r : "header";
|
|
9574
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
9575
|
+
IndexedPairEditor,
|
|
9576
|
+
{
|
|
9577
|
+
value: items,
|
|
9578
|
+
onChange: formField.onChange,
|
|
9579
|
+
maxItems,
|
|
9580
|
+
disabled,
|
|
9581
|
+
itemLabel
|
|
9554
9582
|
}
|
|
9555
|
-
|
|
9556
|
-
return entries;
|
|
9557
|
-
}, [items]);
|
|
9558
|
-
if (authEntries.length === 0) {
|
|
9559
|
-
return null;
|
|
9583
|
+
);
|
|
9560
9584
|
}
|
|
9561
|
-
|
|
9562
|
-
|
|
9563
|
-
|
|
9564
|
-
|
|
9565
|
-
|
|
9566
|
-
|
|
9567
|
-
|
|
9568
|
-
|
|
9569
|
-
|
|
9570
|
-
for (let i = 0; i < authEntries.length; i++) {
|
|
9571
|
-
if (i < updatedAuthItems.length) {
|
|
9572
|
-
updated[authEntries[i].originalIdx] = updatedAuthItems[i];
|
|
9573
|
-
}
|
|
9574
|
-
}
|
|
9575
|
-
formField.onChange(updated);
|
|
9576
|
-
};
|
|
9577
|
-
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, "Custom HTTP Headers"), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Authorization HTTP header(s) sent with every request." }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: authItems, onChange: handleChange, disabled, hideControls: true })));
|
|
9585
|
+
if (field.valueType === "array" && ((_s = field.item) == null ? void 0 : _s.valueType) === "string") {
|
|
9586
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
9587
|
+
StringArrayInput,
|
|
9588
|
+
{
|
|
9589
|
+
value: Array.isArray(value) ? value : [],
|
|
9590
|
+
onChange: formField.onChange,
|
|
9591
|
+
placeholder,
|
|
9592
|
+
disabled,
|
|
9593
|
+
itemLabel: label.toLowerCase().replace(/s$/, "")
|
|
9578
9594
|
}
|
|
9579
|
-
|
|
9580
|
-
|
|
9595
|
+
);
|
|
9596
|
+
}
|
|
9597
|
+
if (field.valueType === "array" && ((_t = field.item) == null ? void 0 : _t.valueType) === "object" && ((_u = field.item.fields) == null ? void 0 : _u.length)) {
|
|
9598
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
9599
|
+
ObjectArrayEditor,
|
|
9600
|
+
{
|
|
9601
|
+
field,
|
|
9602
|
+
value,
|
|
9603
|
+
onChange: formField.onChange,
|
|
9604
|
+
disabled,
|
|
9605
|
+
errorMessage
|
|
9606
|
+
}
|
|
9607
|
+
);
|
|
9608
|
+
}
|
|
9609
|
+
if (field.valueType === "object" || field.valueType === "map" || field.valueType === "array" && (((_v = field.item) == null ? void 0 : _v.valueType) === "object" || ((_w = field.item) == null ? void 0 : _w.valueType) === "map")) {
|
|
9610
|
+
const count = Array.isArray(value) ? value.length : 0;
|
|
9611
|
+
return /* @__PURE__ */ React__default.default.createElement(ComplexFieldNote, { count, label });
|
|
9612
|
+
}
|
|
9613
|
+
return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), placeholder, disabled });
|
|
9581
9614
|
}
|
|
9582
9615
|
|
|
9583
9616
|
const getTabStyles = (theme) => ({
|
|
@@ -9628,7 +9661,7 @@ const getTabStyles = (theme) => ({
|
|
|
9628
9661
|
width: 12,
|
|
9629
9662
|
flexShrink: 0,
|
|
9630
9663
|
alignSelf: "flex-start",
|
|
9631
|
-
paddingTop:
|
|
9664
|
+
paddingTop: theme.spacing(0.5)
|
|
9632
9665
|
}),
|
|
9633
9666
|
navDot: css.css({
|
|
9634
9667
|
width: 10,
|
|
@@ -9674,7 +9707,7 @@ const getTabStyles = (theme) => ({
|
|
|
9674
9707
|
}),
|
|
9675
9708
|
navLabel: css.css({
|
|
9676
9709
|
fontSize: theme.typography.body.fontSize,
|
|
9677
|
-
color:
|
|
9710
|
+
color: theme.colors.text.secondary,
|
|
9678
9711
|
lineHeight: 1.4
|
|
9679
9712
|
}),
|
|
9680
9713
|
navLabelActive: css.css({
|
|
@@ -9756,8 +9789,8 @@ const getTabStyles = (theme) => ({
|
|
|
9756
9789
|
textAlign: "left"
|
|
9757
9790
|
}),
|
|
9758
9791
|
sectionBadge: css.css({
|
|
9759
|
-
fontSize:
|
|
9760
|
-
fontWeight:
|
|
9792
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9793
|
+
fontWeight: theme.typography.fontWeightRegular,
|
|
9761
9794
|
color: theme.colors.text.disabled,
|
|
9762
9795
|
border: `1px solid ${theme.colors.border.weak}`,
|
|
9763
9796
|
borderRadius: theme.shape.radius.pill,
|
|
@@ -9816,6 +9849,226 @@ const getTabStyles = (theme) => ({
|
|
|
9816
9849
|
marginBottom: theme.spacing(1)
|
|
9817
9850
|
})
|
|
9818
9851
|
});
|
|
9852
|
+
const getWizardStyles = (theme) => ({
|
|
9853
|
+
container: css.css({
|
|
9854
|
+
position: "relative",
|
|
9855
|
+
display: "flex",
|
|
9856
|
+
flexDirection: "column",
|
|
9857
|
+
gap: theme.spacing(1),
|
|
9858
|
+
padding: theme.spacing(1.5),
|
|
9859
|
+
backgroundColor: theme.colors.background.secondary,
|
|
9860
|
+
borderRadius: theme.shape.radius.default,
|
|
9861
|
+
border: `1px solid ${theme.colors.border.weak}`,
|
|
9862
|
+
overflow: "hidden"
|
|
9863
|
+
}),
|
|
9864
|
+
overlay: css.css({
|
|
9865
|
+
position: "absolute",
|
|
9866
|
+
inset: 0,
|
|
9867
|
+
display: "flex",
|
|
9868
|
+
alignItems: "center",
|
|
9869
|
+
justifyContent: "center",
|
|
9870
|
+
gap: theme.spacing(1),
|
|
9871
|
+
background: theme.colors.background.secondary,
|
|
9872
|
+
borderRadius: theme.shape.radius.default,
|
|
9873
|
+
zIndex: 1,
|
|
9874
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9875
|
+
color: theme.colors.text.primary,
|
|
9876
|
+
opacity: 0.95
|
|
9877
|
+
}),
|
|
9878
|
+
readOnlyBanner: css.css({
|
|
9879
|
+
display: "inline-flex",
|
|
9880
|
+
alignItems: "center",
|
|
9881
|
+
gap: theme.spacing(0.5),
|
|
9882
|
+
padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
|
|
9883
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9884
|
+
color: theme.colors.text.secondary,
|
|
9885
|
+
backgroundColor: theme.colors.background.secondary,
|
|
9886
|
+
borderRadius: theme.shape.radius.default,
|
|
9887
|
+
border: `1px solid ${theme.colors.border.weak}`
|
|
9888
|
+
}),
|
|
9889
|
+
navBar: css.css({
|
|
9890
|
+
display: "flex",
|
|
9891
|
+
alignItems: "center",
|
|
9892
|
+
justifyContent: "space-between"
|
|
9893
|
+
}),
|
|
9894
|
+
navTitle: css.css({
|
|
9895
|
+
display: "inline-flex",
|
|
9896
|
+
alignItems: "center",
|
|
9897
|
+
gap: theme.spacing(0.5),
|
|
9898
|
+
fontSize: theme.typography.body.fontSize,
|
|
9899
|
+
fontWeight: theme.typography.fontWeightBold,
|
|
9900
|
+
color: theme.colors.text.primary
|
|
9901
|
+
}),
|
|
9902
|
+
stepCount: css.css({
|
|
9903
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9904
|
+
fontWeight: theme.typography.fontWeightRegular,
|
|
9905
|
+
color: theme.colors.text.secondary
|
|
9906
|
+
}),
|
|
9907
|
+
navActions: css.css({
|
|
9908
|
+
display: "flex",
|
|
9909
|
+
alignItems: "center",
|
|
9910
|
+
gap: theme.spacing(0.25)
|
|
9911
|
+
}),
|
|
9912
|
+
form: css.css({
|
|
9913
|
+
display: "flex",
|
|
9914
|
+
flexDirection: "column",
|
|
9915
|
+
gap: theme.spacing(0.75)
|
|
9916
|
+
}),
|
|
9917
|
+
buttons: css.css({
|
|
9918
|
+
display: "flex",
|
|
9919
|
+
gap: theme.spacing(1),
|
|
9920
|
+
paddingTop: theme.spacing(0.25)
|
|
9921
|
+
}),
|
|
9922
|
+
fieldRow: css.css({
|
|
9923
|
+
display: "grid",
|
|
9924
|
+
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
9925
|
+
gap: theme.spacing(0.75),
|
|
9926
|
+
alignItems: "start"
|
|
9927
|
+
}),
|
|
9928
|
+
fieldRowCenter: css.css({
|
|
9929
|
+
display: "grid",
|
|
9930
|
+
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
9931
|
+
gap: theme.spacing(0.75),
|
|
9932
|
+
alignItems: "center",
|
|
9933
|
+
padding: `${theme.spacing(0.5)} 0`
|
|
9934
|
+
}),
|
|
9935
|
+
fieldLabelRow: css.css({
|
|
9936
|
+
display: "flex",
|
|
9937
|
+
alignItems: "center",
|
|
9938
|
+
gap: theme.spacing(0.5),
|
|
9939
|
+
paddingTop: theme.spacing(0.5)
|
|
9940
|
+
}),
|
|
9941
|
+
fieldLabelRowCompact: css.css({
|
|
9942
|
+
display: "flex",
|
|
9943
|
+
alignItems: "center",
|
|
9944
|
+
gap: theme.spacing(0.5)
|
|
9945
|
+
}),
|
|
9946
|
+
fieldLabel: css.css({
|
|
9947
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9948
|
+
fontWeight: theme.typography.fontWeightMedium,
|
|
9949
|
+
color: theme.colors.text.primary
|
|
9950
|
+
}),
|
|
9951
|
+
fieldRequired: css.css({
|
|
9952
|
+
color: theme.colors.error.text,
|
|
9953
|
+
marginLeft: 2
|
|
9954
|
+
}),
|
|
9955
|
+
fieldInfoIcon: css.css({
|
|
9956
|
+
color: theme.colors.text.disabled,
|
|
9957
|
+
cursor: "help",
|
|
9958
|
+
flexShrink: 0
|
|
9959
|
+
}),
|
|
9960
|
+
fieldInputCol: css.css({
|
|
9961
|
+
display: "flex",
|
|
9962
|
+
flexDirection: "column",
|
|
9963
|
+
gap: theme.spacing(0.25),
|
|
9964
|
+
minWidth: 0
|
|
9965
|
+
}),
|
|
9966
|
+
fieldError: css.css({
|
|
9967
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
9968
|
+
color: theme.colors.error.text
|
|
9969
|
+
})
|
|
9970
|
+
});
|
|
9971
|
+
|
|
9972
|
+
function SchemaField({
|
|
9973
|
+
field,
|
|
9974
|
+
control,
|
|
9975
|
+
errors,
|
|
9976
|
+
disabled,
|
|
9977
|
+
dsUid,
|
|
9978
|
+
watchedValues,
|
|
9979
|
+
fieldById,
|
|
9980
|
+
celContext,
|
|
9981
|
+
setValue
|
|
9982
|
+
}) {
|
|
9983
|
+
const styles = ui.useStyles2(getWizardStyles);
|
|
9984
|
+
const activeOverride = useDatasourceSchema.resolveActiveOverride(field, watchedValues, fieldById);
|
|
9985
|
+
const fk = useDatasourceSchema.formKey(field);
|
|
9986
|
+
if (field.key === "pdcInjected" && field.target === "jsonData") {
|
|
9987
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
9988
|
+
reactHookForm.Controller,
|
|
9989
|
+
{
|
|
9990
|
+
name: fk,
|
|
9991
|
+
control,
|
|
9992
|
+
render: ({ field: formField }) => /* @__PURE__ */ React__default.default.createElement(
|
|
9993
|
+
PdcFieldNote,
|
|
9994
|
+
{
|
|
9995
|
+
enabled: !!formField.value,
|
|
9996
|
+
description: field.description,
|
|
9997
|
+
configUrl: `/connections/datasources/edit/${dsUid}`
|
|
9998
|
+
}
|
|
9999
|
+
)
|
|
10000
|
+
}
|
|
10001
|
+
);
|
|
10002
|
+
}
|
|
10003
|
+
const required = isFieldRequired(field, watchedValues, fieldById, celContext);
|
|
10004
|
+
const validationRules = buildValidationRules(field, required);
|
|
10005
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
10006
|
+
reactHookForm.Controller,
|
|
10007
|
+
{
|
|
10008
|
+
name: fk,
|
|
10009
|
+
control,
|
|
10010
|
+
rules: validationRules,
|
|
10011
|
+
render: ({ field: formField }) => {
|
|
10012
|
+
var _a, _b, _c, _d, _e;
|
|
10013
|
+
const errorMessage = (_a = errors[fk]) == null ? void 0 : _a.message;
|
|
10014
|
+
const label = (_b = field.label) != null ? _b : field.key;
|
|
10015
|
+
const description = (_c = activeOverride == null ? void 0 : activeOverride.description) != null ? _c : field.description;
|
|
10016
|
+
const effectiveField = activeOverride ? {
|
|
10017
|
+
...field,
|
|
10018
|
+
description,
|
|
10019
|
+
ui: {
|
|
10020
|
+
...field.ui,
|
|
10021
|
+
placeholder: (_e = activeOverride.placeholder) != null ? _e : (_d = field.ui) == null ? void 0 : _d.placeholder
|
|
10022
|
+
}
|
|
10023
|
+
} : field;
|
|
10024
|
+
const isReadOnly = !!(activeOverride == null ? void 0 : activeOverride.readOnly);
|
|
10025
|
+
const isBool = field.valueType === "boolean";
|
|
10026
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldRowCenter : styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, label, required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldRequired }, "*")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, renderFieldInput(effectiveField, formField, disabled || isReadOnly, errorMessage, setValue), errorMessage && !parseItemErrors(errorMessage) && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldError }, errorMessage)));
|
|
10027
|
+
}
|
|
10028
|
+
}
|
|
10029
|
+
);
|
|
10030
|
+
}
|
|
10031
|
+
|
|
10032
|
+
const AuthorizationHeaderField = (props) => {
|
|
10033
|
+
const { headersFieldKey, control, disabled, watchedValues } = props;
|
|
10034
|
+
const styles = ui.useStyles2(getWizardStyles);
|
|
10035
|
+
const items = React.useMemo(
|
|
10036
|
+
() => Array.isArray(watchedValues[headersFieldKey]) ? watchedValues[headersFieldKey] : [],
|
|
10037
|
+
[watchedValues, headersFieldKey]
|
|
10038
|
+
);
|
|
10039
|
+
const authEntries = React.useMemo(() => {
|
|
10040
|
+
const entries = [];
|
|
10041
|
+
for (let i = 0; i < items.length; i++) {
|
|
10042
|
+
if (items[i].name.toLowerCase() === "authorization") {
|
|
10043
|
+
entries.push({ item: items[i], originalIdx: i });
|
|
10044
|
+
}
|
|
10045
|
+
}
|
|
10046
|
+
return entries;
|
|
10047
|
+
}, [items]);
|
|
10048
|
+
if (authEntries.length === 0) {
|
|
10049
|
+
return null;
|
|
10050
|
+
}
|
|
10051
|
+
const authItems = authEntries.map((e) => e.item);
|
|
10052
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
10053
|
+
reactHookForm.Controller,
|
|
10054
|
+
{
|
|
10055
|
+
name: headersFieldKey,
|
|
10056
|
+
control,
|
|
10057
|
+
render: ({ field: formField }) => {
|
|
10058
|
+
const handleChange = (updatedAuthItems) => {
|
|
10059
|
+
const updated = [...items];
|
|
10060
|
+
for (let i = 0; i < authEntries.length; i++) {
|
|
10061
|
+
if (i < updatedAuthItems.length) {
|
|
10062
|
+
updated[authEntries[i].originalIdx] = updatedAuthItems[i];
|
|
10063
|
+
}
|
|
10064
|
+
}
|
|
10065
|
+
formField.onChange(updated);
|
|
10066
|
+
};
|
|
10067
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, "Custom HTTP Headers"), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Authorization HTTP header(s) sent with every request." }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: authItems, onChange: handleChange, disabled, hideControls: true })));
|
|
10068
|
+
}
|
|
10069
|
+
}
|
|
10070
|
+
);
|
|
10071
|
+
};
|
|
9819
10072
|
|
|
9820
10073
|
function SidebarNav({ groups, activeIndex, sectionStates, onSelect }) {
|
|
9821
10074
|
const styles = ui.useStyles2(getTabStyles);
|
|
@@ -9875,15 +10128,18 @@ function TabLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderA
|
|
|
9875
10128
|
handleSubmit,
|
|
9876
10129
|
errors,
|
|
9877
10130
|
watchedValues,
|
|
10131
|
+
celContext,
|
|
9878
10132
|
initializing,
|
|
9879
10133
|
fetchError,
|
|
9880
10134
|
submitting,
|
|
9881
10135
|
submitError,
|
|
9882
10136
|
readOnly,
|
|
9883
10137
|
isFieldVisible,
|
|
10138
|
+
isFieldDisabled,
|
|
9884
10139
|
isGroupValid,
|
|
9885
10140
|
groupHasData,
|
|
9886
|
-
onSubmit
|
|
10141
|
+
onSubmit,
|
|
10142
|
+
setValue
|
|
9887
10143
|
} = form;
|
|
9888
10144
|
const displayGroups = React.useMemo(() => resolvedGroups.filter((g) => g.group.id !== "_required"), [resolvedGroups]);
|
|
9889
10145
|
const [expandedSections, setExpandedSections] = React.useState(() => {
|
|
@@ -10007,19 +10263,21 @@ function TabLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderA
|
|
|
10007
10263
|
/* @__PURE__ */ React__default.default.createElement("div", { className: styles.sectionBody }, g.group.description && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.sectionDescription }, g.group.description), visibleFields.map((field) => /* @__PURE__ */ React__default.default.createElement(
|
|
10008
10264
|
SchemaField,
|
|
10009
10265
|
{
|
|
10010
|
-
key: formKey(field),
|
|
10266
|
+
key: useDatasourceSchema.formKey(field),
|
|
10011
10267
|
field,
|
|
10012
10268
|
control,
|
|
10013
10269
|
errors,
|
|
10014
|
-
disabled: allDisabled,
|
|
10270
|
+
disabled: allDisabled || isFieldDisabled(field),
|
|
10015
10271
|
dsUid,
|
|
10016
10272
|
watchedValues,
|
|
10017
|
-
fieldById
|
|
10273
|
+
fieldById,
|
|
10274
|
+
celContext,
|
|
10275
|
+
setValue
|
|
10018
10276
|
}
|
|
10019
10277
|
)), showHeaders && /* @__PURE__ */ React__default.default.createElement(
|
|
10020
10278
|
AuthorizationHeaderField,
|
|
10021
10279
|
{
|
|
10022
|
-
headersFieldKey: formKey(httpHeadersField),
|
|
10280
|
+
headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
|
|
10023
10281
|
control,
|
|
10024
10282
|
disabled: allDisabled,
|
|
10025
10283
|
watchedValues
|
|
@@ -10038,8 +10296,8 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10038
10296
|
const [detectedReadOnly, setDetectedReadOnly] = React.useState(false);
|
|
10039
10297
|
const readOnly = detectedReadOnly;
|
|
10040
10298
|
const resolvedGroups = React.useMemo(() => {
|
|
10041
|
-
const groups = resolveGroups(schema);
|
|
10042
|
-
const requiredGroup = resolveRequiredFieldsGroup(schema);
|
|
10299
|
+
const groups = useDatasourceSchema.resolveGroups(schema);
|
|
10300
|
+
const requiredGroup = useDatasourceSchema.resolveRequiredFieldsGroup(schema);
|
|
10043
10301
|
if (!requiredGroup) {
|
|
10044
10302
|
return groups;
|
|
10045
10303
|
}
|
|
@@ -10085,10 +10343,10 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10085
10343
|
when: eff.when,
|
|
10086
10344
|
targets: Object.entries(eff.set).map(([targetId, val]) => {
|
|
10087
10345
|
const targetField = fieldById.get(targetId);
|
|
10088
|
-
return { key: targetField ? formKey(targetField) : targetId, value: val };
|
|
10346
|
+
return { key: targetField ? useDatasourceSchema.formKey(targetField) : targetId, value: val };
|
|
10089
10347
|
})
|
|
10090
10348
|
}));
|
|
10091
|
-
result.push({ sourceKey: formKey(field), effects: mapped });
|
|
10349
|
+
result.push({ sourceKey: useDatasourceSchema.formKey(field), effects: mapped });
|
|
10092
10350
|
}
|
|
10093
10351
|
return result;
|
|
10094
10352
|
}, [schema.fields, fieldById]);
|
|
@@ -10109,11 +10367,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10109
10367
|
const defaults = {};
|
|
10110
10368
|
for (const field of allStorageFields) {
|
|
10111
10369
|
if (field.defaultValue !== void 0) {
|
|
10112
|
-
defaults[formKey(field)] = field.defaultValue;
|
|
10370
|
+
defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
|
|
10113
10371
|
}
|
|
10114
10372
|
}
|
|
10115
10373
|
const merged = { ...defaults, ...result.values };
|
|
10116
|
-
const virtualValues = computeVirtualFieldValues(schema, merged);
|
|
10374
|
+
const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
|
|
10117
10375
|
reset({ ...merged, ...virtualValues });
|
|
10118
10376
|
setInitializing(false);
|
|
10119
10377
|
});
|
|
@@ -10128,7 +10386,7 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10128
10386
|
return;
|
|
10129
10387
|
}
|
|
10130
10388
|
for (const { sourceKey, effects } of fieldsWithEffects) {
|
|
10131
|
-
const currentVal = watchedValues
|
|
10389
|
+
const currentVal = useDatasourceSchema.getWatchedValue(watchedValues, sourceKey);
|
|
10132
10390
|
const prevVal = prevEffectValuesRef.current[sourceKey];
|
|
10133
10391
|
if (currentVal === prevVal) {
|
|
10134
10392
|
continue;
|
|
@@ -10151,19 +10409,20 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10151
10409
|
continue;
|
|
10152
10410
|
}
|
|
10153
10411
|
const ovs = field.overrides.filter((ov) => ov.defaultValue !== void 0).map((ov) => {
|
|
10154
|
-
const parsed = parseDependsOn(ov.when);
|
|
10412
|
+
const parsed = useDatasourceSchema.parseDependsOn(ov.when);
|
|
10155
10413
|
if (!parsed) {
|
|
10156
10414
|
return null;
|
|
10157
10415
|
}
|
|
10158
10416
|
const depField = fieldById.get(parsed.field);
|
|
10159
10417
|
return {
|
|
10160
|
-
depKey: depField ? formKey(depField) : parsed.field,
|
|
10418
|
+
depKey: depField ? useDatasourceSchema.formKey(depField) : parsed.field,
|
|
10161
10419
|
depValue: parsed.value,
|
|
10420
|
+
negate: parsed.negate,
|
|
10162
10421
|
defaultValue: ov.defaultValue
|
|
10163
10422
|
};
|
|
10164
10423
|
}).filter(Boolean);
|
|
10165
10424
|
if (ovs.length > 0) {
|
|
10166
|
-
result.push({ targetKey: formKey(field), fieldDefault: field.defaultValue, overrides: ovs });
|
|
10425
|
+
result.push({ targetKey: useDatasourceSchema.formKey(field), fieldDefault: field.defaultValue, overrides: ovs });
|
|
10167
10426
|
}
|
|
10168
10427
|
}
|
|
10169
10428
|
return result;
|
|
@@ -10176,42 +10435,70 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10176
10435
|
}
|
|
10177
10436
|
for (const { targetKey, fieldDefault, overrides } of fieldsWithOverrideDefaults) {
|
|
10178
10437
|
for (const ov of overrides) {
|
|
10179
|
-
const currentDepVal = String((_a = watchedValues
|
|
10438
|
+
const currentDepVal = String((_a = useDatasourceSchema.getWatchedValue(watchedValues, ov.depKey)) != null ? _a : "");
|
|
10180
10439
|
const trackKey = `${targetKey}::${ov.depKey}`;
|
|
10181
10440
|
const prevDepVal = prevOverrideDepRef.current[trackKey];
|
|
10182
10441
|
if (currentDepVal === prevDepVal) {
|
|
10183
10442
|
continue;
|
|
10184
10443
|
}
|
|
10185
10444
|
prevOverrideDepRef.current[trackKey] = currentDepVal;
|
|
10186
|
-
|
|
10445
|
+
const active = useDatasourceSchema.evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, currentDepVal);
|
|
10446
|
+
const wasActive = prevDepVal !== void 0 && useDatasourceSchema.evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, prevDepVal);
|
|
10447
|
+
if (active) {
|
|
10187
10448
|
setValue(targetKey, ov.defaultValue);
|
|
10188
|
-
} else if (
|
|
10449
|
+
} else if (wasActive && fieldDefault !== void 0) {
|
|
10189
10450
|
setValue(targetKey, fieldDefault);
|
|
10190
10451
|
}
|
|
10191
10452
|
}
|
|
10192
10453
|
}
|
|
10193
10454
|
}, [watchedValues, fieldsWithOverrideDefaults, initializing, setValue]);
|
|
10455
|
+
const celContext = React.useMemo(() => {
|
|
10456
|
+
const ctx = {};
|
|
10457
|
+
for (const f of fieldById.values()) {
|
|
10458
|
+
const fk = useDatasourceSchema.formKey(f);
|
|
10459
|
+
const val = useDatasourceSchema.getWatchedValue(watchedValues, fk);
|
|
10460
|
+
if (val !== void 0) {
|
|
10461
|
+
const parts = f.id.split(".");
|
|
10462
|
+
let current = ctx;
|
|
10463
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
10464
|
+
if (!(parts[i] in current) || typeof current[parts[i]] !== "object" || current[parts[i]] === null) {
|
|
10465
|
+
current[parts[i]] = {};
|
|
10466
|
+
}
|
|
10467
|
+
current = current[parts[i]];
|
|
10468
|
+
}
|
|
10469
|
+
current[parts[parts.length - 1]] = val;
|
|
10470
|
+
}
|
|
10471
|
+
}
|
|
10472
|
+
return ctx;
|
|
10473
|
+
}, [watchedValues, fieldById]);
|
|
10194
10474
|
const isFieldVisible = React.useCallback(
|
|
10195
10475
|
(field) => {
|
|
10196
|
-
|
|
10197
|
-
|
|
10198
|
-
|
|
10199
|
-
|
|
10200
|
-
|
|
10201
|
-
|
|
10202
|
-
|
|
10203
|
-
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10207
|
-
|
|
10208
|
-
|
|
10476
|
+
function check(f, visited) {
|
|
10477
|
+
var _a;
|
|
10478
|
+
if (f.kind === "virtual" && !f.ui) {
|
|
10479
|
+
return false;
|
|
10480
|
+
}
|
|
10481
|
+
if ((_a = f.tags) == null ? void 0 : _a.some((t) => t.startsWith("managed-by:"))) {
|
|
10482
|
+
return false;
|
|
10483
|
+
}
|
|
10484
|
+
if (!f.dependsOn) {
|
|
10485
|
+
return true;
|
|
10486
|
+
}
|
|
10487
|
+
const refs = useDatasourceSchema.extractFieldRefs(f.dependsOn);
|
|
10488
|
+
for (const ref of refs) {
|
|
10489
|
+
const depField = fieldById.get(ref);
|
|
10490
|
+
if (depField && !visited.has(depField.id)) {
|
|
10491
|
+
visited.add(f.id);
|
|
10492
|
+
if (!check(depField, visited)) {
|
|
10493
|
+
return false;
|
|
10494
|
+
}
|
|
10495
|
+
}
|
|
10496
|
+
}
|
|
10497
|
+
return useDatasourceSchema.evaluateCelExpression(f.dependsOn, celContext);
|
|
10209
10498
|
}
|
|
10210
|
-
|
|
10211
|
-
const depKey = depField ? formKey(depField) : parsed.field;
|
|
10212
|
-
return String((_b = watchedValues[depKey]) != null ? _b : "") === parsed.value;
|
|
10499
|
+
return check(field, /* @__PURE__ */ new Set());
|
|
10213
10500
|
},
|
|
10214
|
-
[
|
|
10501
|
+
[celContext, fieldById]
|
|
10215
10502
|
);
|
|
10216
10503
|
const onSubmit = React.useCallback(
|
|
10217
10504
|
async (data) => {
|
|
@@ -10225,11 +10512,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10225
10512
|
const defaults = {};
|
|
10226
10513
|
for (const field of allStorageFields) {
|
|
10227
10514
|
if (field.defaultValue !== void 0) {
|
|
10228
|
-
defaults[formKey(field)] = field.defaultValue;
|
|
10515
|
+
defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
|
|
10229
10516
|
}
|
|
10230
10517
|
}
|
|
10231
10518
|
const merged = { ...defaults, ...refreshed.values };
|
|
10232
|
-
const virtualValues = computeVirtualFieldValues(schema, merged);
|
|
10519
|
+
const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
|
|
10233
10520
|
reset({ ...merged, ...virtualValues });
|
|
10234
10521
|
onSuccess("UPDATED", "Configuration saved.");
|
|
10235
10522
|
} catch (err) {
|
|
@@ -10248,11 +10535,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10248
10535
|
if (!isFieldVisible(field)) {
|
|
10249
10536
|
continue;
|
|
10250
10537
|
}
|
|
10251
|
-
if (errors[formKey(field)]) {
|
|
10538
|
+
if (errors[useDatasourceSchema.formKey(field)]) {
|
|
10252
10539
|
return false;
|
|
10253
10540
|
}
|
|
10254
|
-
if (isFieldRequired(field, watchedValues, fieldById)) {
|
|
10255
|
-
const val = watchedValues
|
|
10541
|
+
if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
|
|
10542
|
+
const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
|
|
10256
10543
|
if (val === SECURE_FIELD_CONFIGURED) {
|
|
10257
10544
|
continue;
|
|
10258
10545
|
}
|
|
@@ -10263,12 +10550,21 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10263
10550
|
}
|
|
10264
10551
|
return true;
|
|
10265
10552
|
},
|
|
10266
|
-
[errors, watchedValues, fieldById, isFieldVisible]
|
|
10553
|
+
[errors, watchedValues, fieldById, celContext, isFieldVisible]
|
|
10554
|
+
);
|
|
10555
|
+
const isFieldDisabled = React.useCallback(
|
|
10556
|
+
(field) => {
|
|
10557
|
+
if (!field.disabledWhen) {
|
|
10558
|
+
return false;
|
|
10559
|
+
}
|
|
10560
|
+
return useDatasourceSchema.evaluateCelExpression(field.disabledWhen, celContext);
|
|
10561
|
+
},
|
|
10562
|
+
[celContext]
|
|
10267
10563
|
);
|
|
10268
10564
|
const groupHasData = React.useCallback(
|
|
10269
10565
|
(group) => {
|
|
10270
10566
|
for (const field of group.fields) {
|
|
10271
|
-
const val = watchedValues
|
|
10567
|
+
const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
|
|
10272
10568
|
if (val === void 0 || val === null || val === "" || val === false) {
|
|
10273
10569
|
continue;
|
|
10274
10570
|
}
|
|
@@ -10292,6 +10588,7 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10292
10588
|
trigger,
|
|
10293
10589
|
errors,
|
|
10294
10590
|
watchedValues,
|
|
10591
|
+
celContext,
|
|
10295
10592
|
// State
|
|
10296
10593
|
initializing,
|
|
10297
10594
|
fetchError,
|
|
@@ -10300,9 +10597,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
|
|
|
10300
10597
|
readOnly,
|
|
10301
10598
|
// Callbacks
|
|
10302
10599
|
isFieldVisible,
|
|
10600
|
+
isFieldDisabled,
|
|
10303
10601
|
isGroupValid,
|
|
10304
10602
|
groupHasData,
|
|
10305
|
-
onSubmit
|
|
10603
|
+
onSubmit,
|
|
10604
|
+
setValue
|
|
10306
10605
|
};
|
|
10307
10606
|
}
|
|
10308
10607
|
|
|
@@ -10349,13 +10648,16 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
|
|
|
10349
10648
|
trigger,
|
|
10350
10649
|
errors,
|
|
10351
10650
|
watchedValues,
|
|
10651
|
+
celContext,
|
|
10352
10652
|
initializing,
|
|
10353
10653
|
fetchError,
|
|
10354
10654
|
submitting,
|
|
10355
10655
|
submitError,
|
|
10356
10656
|
readOnly,
|
|
10357
10657
|
isFieldVisible,
|
|
10358
|
-
|
|
10658
|
+
isFieldDisabled,
|
|
10659
|
+
onSubmit,
|
|
10660
|
+
setValue
|
|
10359
10661
|
} = form;
|
|
10360
10662
|
const arrowSteps = React.useMemo(() => {
|
|
10361
10663
|
const requiredGroup = resolvedGroups.find((g) => g.group.id === "_required");
|
|
@@ -10398,11 +10700,11 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
|
|
|
10398
10700
|
return true;
|
|
10399
10701
|
}
|
|
10400
10702
|
for (const field of visibleFieldsForStep) {
|
|
10401
|
-
if (errors[formKey(field)]) {
|
|
10703
|
+
if (errors[useDatasourceSchema.formKey(field)]) {
|
|
10402
10704
|
return false;
|
|
10403
10705
|
}
|
|
10404
|
-
if (isFieldRequired(field, watchedValues, fieldById)) {
|
|
10405
|
-
const val = watchedValues
|
|
10706
|
+
if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
|
|
10707
|
+
const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
|
|
10406
10708
|
if (val === SECURE_FIELD_CONFIGURED) {
|
|
10407
10709
|
continue;
|
|
10408
10710
|
}
|
|
@@ -10412,13 +10714,13 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
|
|
|
10412
10714
|
}
|
|
10413
10715
|
}
|
|
10414
10716
|
return true;
|
|
10415
|
-
}, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById]);
|
|
10717
|
+
}, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById, celContext]);
|
|
10416
10718
|
const goNext = React.useCallback(async () => {
|
|
10417
10719
|
if (!currentResolved) {
|
|
10418
10720
|
return;
|
|
10419
10721
|
}
|
|
10420
10722
|
if (!readOnly) {
|
|
10421
|
-
const visibleKeys = visibleFieldsForStep.map((f) => formKey(f));
|
|
10723
|
+
const visibleKeys = visibleFieldsForStep.map((f) => useDatasourceSchema.formKey(f));
|
|
10422
10724
|
const valid = await trigger(visibleKeys);
|
|
10423
10725
|
if (!valid) {
|
|
10424
10726
|
return;
|
|
@@ -10502,19 +10804,21 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
|
|
|
10502
10804
|
)))), currentResolved && /* @__PURE__ */ React__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: styles.form }, visibleFieldsForStep.map((field) => /* @__PURE__ */ React__default.default.createElement(
|
|
10503
10805
|
SchemaField,
|
|
10504
10806
|
{
|
|
10505
|
-
key: formKey(field),
|
|
10807
|
+
key: useDatasourceSchema.formKey(field),
|
|
10506
10808
|
field,
|
|
10507
10809
|
control,
|
|
10508
10810
|
errors,
|
|
10509
|
-
disabled: allDisabled,
|
|
10811
|
+
disabled: allDisabled || isFieldDisabled(field),
|
|
10510
10812
|
dsUid,
|
|
10511
10813
|
watchedValues,
|
|
10512
|
-
fieldById
|
|
10814
|
+
fieldById,
|
|
10815
|
+
celContext,
|
|
10816
|
+
setValue
|
|
10513
10817
|
}
|
|
10514
10818
|
)), (currentResolved.group.id === "_required" || currentResolved.group.id === "auth") && httpHeadersField && /* @__PURE__ */ React__default.default.createElement(
|
|
10515
10819
|
AuthorizationHeaderField,
|
|
10516
10820
|
{
|
|
10517
|
-
headersFieldKey: formKey(httpHeadersField),
|
|
10821
|
+
headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
|
|
10518
10822
|
control,
|
|
10519
10823
|
disabled: allDisabled,
|
|
10520
10824
|
watchedValues
|
|
@@ -12124,412 +12428,34 @@ const convertUnits = (queryStats) => {
|
|
|
12124
12428
|
return text + suffix;
|
|
12125
12429
|
};
|
|
12126
12430
|
|
|
12127
|
-
|
|
12128
|
-
|
|
12129
|
-
|
|
12130
|
-
|
|
12131
|
-
|
|
12132
|
-
|
|
12133
|
-
|
|
12134
|
-
|
|
12135
|
-
|
|
12136
|
-
|
|
12137
|
-
|
|
12138
|
-
|
|
12139
|
-
|
|
12140
|
-
|
|
12141
|
-
|
|
12142
|
-
|
|
12143
|
-
|
|
12144
|
-
|
|
12145
|
-
|
|
12146
|
-
|
|
12147
|
-
|
|
12148
|
-
|
|
12149
|
-
|
|
12150
|
-
|
|
12151
|
-
|
|
12152
|
-
|
|
12153
|
-
|
|
12154
|
-
|
|
12155
|
-
target: (_b = field.target) != null ? _b : "jsonData",
|
|
12156
|
-
type: field.valueType,
|
|
12157
|
-
required: !!field.required
|
|
12158
|
-
};
|
|
12159
|
-
if (field.description) {
|
|
12160
|
-
entry.description = field.description;
|
|
12161
|
-
}
|
|
12162
|
-
if (field.defaultValue != null) {
|
|
12163
|
-
entry.defaultValue = field.defaultValue;
|
|
12164
|
-
}
|
|
12165
|
-
if (((_c = field.ui) == null ? void 0 : _c.options) && field.ui.options.length > 0) {
|
|
12166
|
-
entry.options = field.ui.options.map((o) => String(o.value));
|
|
12167
|
-
}
|
|
12168
|
-
if (field.section) {
|
|
12169
|
-
entry.section = field.section;
|
|
12170
|
-
}
|
|
12171
|
-
if (field.dependsOn) {
|
|
12172
|
-
entry.dependsOn = field.dependsOn;
|
|
12173
|
-
}
|
|
12174
|
-
result.push(entry);
|
|
12175
|
-
}
|
|
12176
|
-
return result;
|
|
12177
|
-
}
|
|
12178
|
-
|
|
12179
|
-
function yamlIndent(depth) {
|
|
12180
|
-
return " ".repeat(depth);
|
|
12181
|
-
}
|
|
12182
|
-
function yamlString(value) {
|
|
12183
|
-
if (value === null || value === void 0) {
|
|
12184
|
-
return '""';
|
|
12185
|
-
}
|
|
12186
|
-
const s = String(value);
|
|
12187
|
-
if (s === "") {
|
|
12188
|
-
return '""';
|
|
12189
|
-
}
|
|
12190
|
-
return yaml__default.default.dump(s, { lineWidth: -1 }).trimEnd();
|
|
12191
|
-
}
|
|
12192
|
-
function yamlValue(value, depth) {
|
|
12193
|
-
if (value === null || value === void 0) {
|
|
12194
|
-
return '""';
|
|
12195
|
-
}
|
|
12196
|
-
if (typeof value === "boolean") {
|
|
12197
|
-
return value ? "true" : "false";
|
|
12198
|
-
}
|
|
12199
|
-
if (typeof value === "number") {
|
|
12200
|
-
return String(value);
|
|
12201
|
-
}
|
|
12202
|
-
if (typeof value === "string") {
|
|
12203
|
-
return yamlString(value);
|
|
12204
|
-
}
|
|
12205
|
-
if (Array.isArray(value)) {
|
|
12206
|
-
if (value.length === 0) {
|
|
12207
|
-
return "[]";
|
|
12208
|
-
}
|
|
12209
|
-
const lines = value.map((item) => {
|
|
12210
|
-
if (typeof item === "object" && item !== null && !Array.isArray(item)) {
|
|
12211
|
-
const entries = Object.entries(item);
|
|
12212
|
-
if (entries.length === 0) {
|
|
12213
|
-
return `${yamlIndent(depth)}- {}`;
|
|
12214
|
-
}
|
|
12215
|
-
const [firstKey, firstVal] = entries[0];
|
|
12216
|
-
const firstLine = `${yamlIndent(depth)}- ${yamlString(firstKey)}: ${yamlValue(firstVal, depth + 2)}`;
|
|
12217
|
-
const rest = entries.slice(1).map(([k, v]) => `${yamlIndent(depth + 1)}${yamlString(k)}: ${yamlValue(v, depth + 2)}`);
|
|
12218
|
-
return [firstLine, ...rest].join("\n");
|
|
12219
|
-
}
|
|
12220
|
-
return `${yamlIndent(depth)}- ${yamlValue(item, depth + 1)}`;
|
|
12221
|
-
});
|
|
12222
|
-
return "\n" + lines.join("\n");
|
|
12223
|
-
}
|
|
12224
|
-
if (typeof value === "object") {
|
|
12225
|
-
const entries = Object.entries(value);
|
|
12226
|
-
if (entries.length === 0) {
|
|
12227
|
-
return "{}";
|
|
12228
|
-
}
|
|
12229
|
-
const lines = entries.map(([k, v]) => `${yamlIndent(depth)}${yamlString(k)}: ${yamlValue(v, depth + 1)}`);
|
|
12230
|
-
return "\n" + lines.join("\n");
|
|
12231
|
-
}
|
|
12232
|
-
return yamlString(value);
|
|
12233
|
-
}
|
|
12234
|
-
function isCertField(field) {
|
|
12235
|
-
var _a;
|
|
12236
|
-
const k = field.key.toLowerCase();
|
|
12237
|
-
return field.target === "secureJsonData" && (k.includes("cert") || k.includes("key") || ((_a = field.ui) == null ? void 0 : _a.component) === "textarea");
|
|
12238
|
-
}
|
|
12239
|
-
function isExcludedFromProvisioning(field) {
|
|
12240
|
-
var _a, _b;
|
|
12241
|
-
if (field.kind === "virtual") {
|
|
12242
|
-
return true;
|
|
12243
|
-
}
|
|
12244
|
-
if (field.isItemField) {
|
|
12245
|
-
return true;
|
|
12246
|
-
}
|
|
12247
|
-
if (((_a = field.tags) == null ? void 0 : _a.some((t) => t.startsWith("managed-by:"))) && field.target !== "root") {
|
|
12248
|
-
return true;
|
|
12249
|
-
}
|
|
12250
|
-
if (((_b = field.storage) == null ? void 0 : _b.type) === "indexedPair") {
|
|
12251
|
-
return true;
|
|
12252
|
-
}
|
|
12253
|
-
return false;
|
|
12254
|
-
}
|
|
12255
|
-
function secretPlaceholder(field) {
|
|
12256
|
-
if (isCertField(field)) {
|
|
12257
|
-
return "|\n xxxxxx";
|
|
12258
|
-
}
|
|
12259
|
-
return "xxxxxx";
|
|
12260
|
-
}
|
|
12261
|
-
function templateValue(field) {
|
|
12262
|
-
var _a;
|
|
12263
|
-
if (field.defaultValue !== void 0) {
|
|
12264
|
-
return field.defaultValue;
|
|
12265
|
-
}
|
|
12266
|
-
if (((_a = field.ui) == null ? void 0 : _a.options) && field.ui.options.length > 0) {
|
|
12267
|
-
return field.ui.options[0].value;
|
|
12268
|
-
}
|
|
12269
|
-
switch (field.valueType) {
|
|
12270
|
-
case "string":
|
|
12271
|
-
return "";
|
|
12272
|
-
case "number":
|
|
12273
|
-
return 0;
|
|
12274
|
-
case "boolean":
|
|
12275
|
-
return false;
|
|
12276
|
-
case "array":
|
|
12277
|
-
return [];
|
|
12278
|
-
case "object":
|
|
12279
|
-
case "map":
|
|
12280
|
-
return {};
|
|
12281
|
-
default:
|
|
12282
|
-
return "";
|
|
12283
|
-
}
|
|
12284
|
-
}
|
|
12285
|
-
function fieldComment(field, indent) {
|
|
12286
|
-
var _a, _b, _c;
|
|
12287
|
-
const parts = [];
|
|
12288
|
-
const label = (_a = field.label) != null ? _a : field.key;
|
|
12289
|
-
let line = label;
|
|
12290
|
-
if (field.required) {
|
|
12291
|
-
line += " (REQUIRED)";
|
|
12292
|
-
}
|
|
12293
|
-
if (field.description) {
|
|
12294
|
-
line += ` \u2014 ${field.description}`;
|
|
12295
|
-
}
|
|
12296
|
-
parts.push(`${indent}# ${line}`);
|
|
12297
|
-
const options = (_b = field.ui) == null ? void 0 : _b.options;
|
|
12298
|
-
if (options && options.length > 0) {
|
|
12299
|
-
const vals = options.map((o) => String(o.value)).join(", ");
|
|
12300
|
-
parts.push(`${indent}# Allowed values: ${vals}`);
|
|
12301
|
-
}
|
|
12302
|
-
const allowedValuesRule = (_c = field.validations) == null ? void 0 : _c.find(
|
|
12303
|
-
(v) => v.type === "allowedValues"
|
|
12304
|
-
);
|
|
12305
|
-
if (allowedValuesRule && !options) {
|
|
12306
|
-
const vals = allowedValuesRule.values.map((v) => String(v)).join(", ");
|
|
12307
|
-
parts.push(`${indent}# Allowed values: ${vals}`);
|
|
12308
|
-
}
|
|
12309
|
-
if (field.dependsOn) {
|
|
12310
|
-
parts.push(`${indent}# Only when: ${field.dependsOn}`);
|
|
12311
|
-
}
|
|
12312
|
-
return parts.join("\n");
|
|
12313
|
-
}
|
|
12314
|
-
function toProvisioningYaml(schema, values, options) {
|
|
12315
|
-
var _a, _b, _c, _d, _e, _f;
|
|
12316
|
-
const isTemplate = !values;
|
|
12317
|
-
const showComments = (_a = options == null ? void 0 : options.comments) != null ? _a : isTemplate;
|
|
12318
|
-
const indent2 = " ";
|
|
12319
|
-
const indent3 = " ";
|
|
12320
|
-
const groups = resolveGroups(schema);
|
|
12321
|
-
const rootFields = [];
|
|
12322
|
-
const jsonDataFieldsByGroup = [];
|
|
12323
|
-
const secureJsonDataFieldsByGroup = [];
|
|
12324
|
-
const virtualFieldsWithOptions = [];
|
|
12325
|
-
for (const { group, fields } of groups) {
|
|
12326
|
-
const jd = [];
|
|
12327
|
-
const sd = [];
|
|
12328
|
-
for (const field of fields) {
|
|
12329
|
-
if (field.kind === "virtual" && ((_b = field.ui) == null ? void 0 : _b.options) && field.ui.options.length > 0) {
|
|
12330
|
-
virtualFieldsWithOptions.push(field);
|
|
12331
|
-
continue;
|
|
12332
|
-
}
|
|
12333
|
-
if (isExcludedFromProvisioning(field)) {
|
|
12334
|
-
continue;
|
|
12335
|
-
}
|
|
12336
|
-
switch (field.target) {
|
|
12337
|
-
case "root":
|
|
12338
|
-
rootFields.push(field);
|
|
12339
|
-
break;
|
|
12340
|
-
case "jsonData":
|
|
12341
|
-
jd.push(field);
|
|
12342
|
-
break;
|
|
12343
|
-
case "secureJsonData":
|
|
12344
|
-
sd.push(field);
|
|
12345
|
-
break;
|
|
12346
|
-
}
|
|
12347
|
-
}
|
|
12348
|
-
if (jd.length > 0) {
|
|
12349
|
-
jsonDataFieldsByGroup.push({ group, fields: jd });
|
|
12350
|
-
}
|
|
12351
|
-
if (sd.length > 0) {
|
|
12352
|
-
secureJsonDataFieldsByGroup.push({ group, fields: sd });
|
|
12353
|
-
}
|
|
12354
|
-
}
|
|
12355
|
-
const allSecureJsonDataFields = secureJsonDataFieldsByGroup.flatMap((g) => g.fields);
|
|
12356
|
-
const groupedFieldIds = new Set(groups.flatMap(({ group }) => group.fieldRefs));
|
|
12357
|
-
for (const field of schema.fields) {
|
|
12358
|
-
if (field.target === "root" && !groupedFieldIds.has(field.id) && !isExcludedFromProvisioning(field)) {
|
|
12359
|
-
rootFields.push(field);
|
|
12360
|
-
}
|
|
12361
|
-
}
|
|
12362
|
-
const lines = [];
|
|
12363
|
-
lines.push("apiVersion: 1");
|
|
12364
|
-
lines.push("");
|
|
12365
|
-
lines.push("datasources:");
|
|
12366
|
-
lines.push(`${indent2.slice(2)}- name: ${yamlString((_d = (_c = options == null ? void 0 : options.name) != null ? _c : values == null ? void 0 : values.name) != null ? _d : `my-${schema.pluginType}`)}`);
|
|
12367
|
-
lines.push(`${indent2}type: ${schema.pluginType}`);
|
|
12368
|
-
if (!isTemplate && (values == null ? void 0 : values.uid)) {
|
|
12369
|
-
lines.push(`${indent2}uid: ${yamlString(values.uid)}`);
|
|
12370
|
-
}
|
|
12371
|
-
const ALREADY_EMITTED_ROOT = /* @__PURE__ */ new Set(["name", "type", "uid"]);
|
|
12372
|
-
for (const field of rootFields) {
|
|
12373
|
-
if (ALREADY_EMITTED_ROOT.has(field.key)) {
|
|
12374
|
-
continue;
|
|
12375
|
-
}
|
|
12376
|
-
const val = values ? values[field.key] : templateValue(field);
|
|
12377
|
-
if (val === void 0 || val === null) {
|
|
12378
|
-
continue;
|
|
12379
|
-
}
|
|
12380
|
-
if (!isTemplate && val === false) {
|
|
12381
|
-
continue;
|
|
12382
|
-
}
|
|
12383
|
-
if (showComments) {
|
|
12384
|
-
lines.push(fieldComment(field, indent2));
|
|
12385
|
-
}
|
|
12386
|
-
lines.push(`${indent2}${field.key}: ${yamlValue(val, 3)}`);
|
|
12387
|
-
}
|
|
12388
|
-
if (showComments) {
|
|
12389
|
-
for (const vf of virtualFieldsWithOptions) {
|
|
12390
|
-
const label = (_e = vf.label) != null ? _e : vf.key;
|
|
12391
|
-
const opts = vf.ui.options.map((o) => `${String(o.value)} (${o.label})`).join(", ");
|
|
12392
|
-
lines.push(`${indent2}# ${label}: ${opts}`);
|
|
12393
|
-
if (vf.description) {
|
|
12394
|
-
lines.push(`${indent2}# ${vf.description}`);
|
|
12395
|
-
}
|
|
12396
|
-
}
|
|
12397
|
-
}
|
|
12398
|
-
const emittedJsonDataKeys = /* @__PURE__ */ new Set();
|
|
12399
|
-
const emittedSecureJsonDataKeys = /* @__PURE__ */ new Set();
|
|
12400
|
-
const jsonDataValues = values == null ? void 0 : values.jsonData;
|
|
12401
|
-
const hasJsonDataFromSchema = jsonDataFieldsByGroup.length > 0;
|
|
12402
|
-
const hasJsonDataFromValues = !isTemplate && jsonDataValues && Object.keys(jsonDataValues).length > 0;
|
|
12403
|
-
if (hasJsonDataFromSchema || hasJsonDataFromValues) {
|
|
12404
|
-
lines.push(`${indent2}jsonData:`);
|
|
12405
|
-
for (const { group, fields: groupFields } of jsonDataFieldsByGroup) {
|
|
12406
|
-
if (showComments && jsonDataFieldsByGroup.length > 1) {
|
|
12407
|
-
lines.push(`${indent3}# --- ${group.title} ---`);
|
|
12408
|
-
}
|
|
12409
|
-
for (const field of groupFields) {
|
|
12410
|
-
const val = values ? getNestedValue(values, "jsonData", field) : templateValue(field);
|
|
12411
|
-
if (val === void 0 || val === null) {
|
|
12412
|
-
continue;
|
|
12413
|
-
}
|
|
12414
|
-
if (!isTemplate && field.defaultValue !== void 0 && val === field.defaultValue) {
|
|
12415
|
-
continue;
|
|
12416
|
-
}
|
|
12417
|
-
emittedJsonDataKeys.add(field.key);
|
|
12418
|
-
if (showComments) {
|
|
12419
|
-
lines.push(fieldComment(field, indent3));
|
|
12420
|
-
}
|
|
12421
|
-
const rendered = yamlValue(val, 4);
|
|
12422
|
-
if (rendered.startsWith("\n")) {
|
|
12423
|
-
lines.push(`${indent3}${field.key}:${rendered}`);
|
|
12424
|
-
} else {
|
|
12425
|
-
lines.push(`${indent3}${field.key}: ${rendered}`);
|
|
12426
|
-
}
|
|
12427
|
-
}
|
|
12428
|
-
}
|
|
12429
|
-
if (!isTemplate && jsonDataValues) {
|
|
12430
|
-
for (const [key, val] of Object.entries(jsonDataValues)) {
|
|
12431
|
-
if (emittedJsonDataKeys.has(key)) {
|
|
12432
|
-
continue;
|
|
12433
|
-
}
|
|
12434
|
-
if (val === void 0 || val === null) {
|
|
12435
|
-
continue;
|
|
12436
|
-
}
|
|
12437
|
-
const rendered = yamlValue(val, 4);
|
|
12438
|
-
if (rendered.startsWith("\n")) {
|
|
12439
|
-
lines.push(`${indent3}${key}:${rendered}`);
|
|
12440
|
-
} else {
|
|
12441
|
-
lines.push(`${indent3}${key}: ${rendered}`);
|
|
12442
|
-
}
|
|
12443
|
-
}
|
|
12444
|
-
}
|
|
12445
|
-
}
|
|
12446
|
-
const secureJsonFields = (_f = values == null ? void 0 : values.secureJsonFields) != null ? _f : {};
|
|
12447
|
-
const inferredSecureKeys = !isTemplate ? inferSecureJsonDataKeys(jsonDataValues) : [];
|
|
12448
|
-
const activeSecureFields = isTemplate ? allSecureJsonDataFields : allSecureJsonDataFields.filter((f) => secureJsonFields[f.key] === true);
|
|
12449
|
-
if (activeSecureFields.length > 0 || inferredSecureKeys.length > 0) {
|
|
12450
|
-
lines.push(`${indent2}secureJsonData:`);
|
|
12451
|
-
for (const field of activeSecureFields) {
|
|
12452
|
-
emittedSecureJsonDataKeys.add(field.key);
|
|
12453
|
-
if (showComments) {
|
|
12454
|
-
lines.push(fieldComment(field, indent3));
|
|
12455
|
-
}
|
|
12456
|
-
lines.push(`${indent3}${field.key}: ${secretPlaceholder(field)}`);
|
|
12457
|
-
}
|
|
12458
|
-
for (const key of inferredSecureKeys) {
|
|
12459
|
-
if (emittedSecureJsonDataKeys.has(key)) {
|
|
12460
|
-
continue;
|
|
12461
|
-
}
|
|
12462
|
-
lines.push(`${indent3}${key}: xxxxxx`);
|
|
12463
|
-
}
|
|
12464
|
-
}
|
|
12465
|
-
return lines.join("\n");
|
|
12466
|
-
}
|
|
12467
|
-
function inferSecureJsonDataKeys(jsonData) {
|
|
12468
|
-
if (!jsonData) {
|
|
12469
|
-
return [];
|
|
12470
|
-
}
|
|
12471
|
-
const keys = [];
|
|
12472
|
-
for (const key of Object.keys(jsonData)) {
|
|
12473
|
-
const match = key.match(/^httpHeaderName(\d+)$/);
|
|
12474
|
-
if (match) {
|
|
12475
|
-
keys.push(`httpHeaderValue${match[1]}`);
|
|
12476
|
-
}
|
|
12477
|
-
}
|
|
12478
|
-
return keys;
|
|
12479
|
-
}
|
|
12480
|
-
function getNestedValue(values, target, field) {
|
|
12481
|
-
const nested = values[target];
|
|
12482
|
-
if (nested && typeof nested === "object") {
|
|
12483
|
-
return nested[field.key];
|
|
12484
|
-
}
|
|
12485
|
-
return void 0;
|
|
12486
|
-
}
|
|
12487
|
-
function datasourceToProvisioningYaml(ds, schema) {
|
|
12488
|
-
if (schema) {
|
|
12489
|
-
return toProvisioningYaml(schema, ds, { comments: false });
|
|
12490
|
-
}
|
|
12491
|
-
const lines = [];
|
|
12492
|
-
lines.push("apiVersion: 1");
|
|
12493
|
-
lines.push("");
|
|
12494
|
-
lines.push("datasources:");
|
|
12495
|
-
lines.push(` - name: ${yamlString(ds.name)}`);
|
|
12496
|
-
if (ds.uid) {
|
|
12497
|
-
lines.push(` uid: ${yamlString(ds.uid)}`);
|
|
12498
|
-
}
|
|
12499
|
-
lines.push(` type: ${yamlString(ds.type)}`);
|
|
12500
|
-
if (ds.url) {
|
|
12501
|
-
lines.push(` url: ${yamlString(ds.url)}`);
|
|
12502
|
-
}
|
|
12503
|
-
if (ds.database) {
|
|
12504
|
-
lines.push(` database: ${yamlString(ds.database)}`);
|
|
12505
|
-
}
|
|
12506
|
-
if (ds.isDefault) {
|
|
12507
|
-
lines.push(" isDefault: true");
|
|
12508
|
-
}
|
|
12509
|
-
if (ds.basicAuth) {
|
|
12510
|
-
lines.push(" basicAuth: true");
|
|
12511
|
-
if (ds.basicAuthUser) {
|
|
12512
|
-
lines.push(` basicAuthUser: ${yamlString(ds.basicAuthUser)}`);
|
|
12513
|
-
}
|
|
12514
|
-
}
|
|
12515
|
-
const jsonData = ds.jsonData;
|
|
12516
|
-
if (jsonData && Object.keys(jsonData).length > 0) {
|
|
12517
|
-
lines.push(" jsonData:");
|
|
12518
|
-
for (const [key, val] of Object.entries(jsonData)) {
|
|
12519
|
-
const rendered = yamlValue(val, 4);
|
|
12520
|
-
if (rendered.startsWith("\n")) {
|
|
12521
|
-
lines.push(` ${key}:${rendered}`);
|
|
12522
|
-
} else {
|
|
12523
|
-
lines.push(` ${key}: ${rendered}`);
|
|
12524
|
-
}
|
|
12525
|
-
}
|
|
12526
|
-
}
|
|
12527
|
-
lines.push(" # secureJsonData: (secrets are not exported \u2014 add manually)");
|
|
12528
|
-
lines.push(" # mySecret: xxxxxx");
|
|
12529
|
-
return lines.join("\n");
|
|
12530
|
-
}
|
|
12531
|
-
|
|
12532
|
-
exports.getConfigSchema = schemas.getConfigSchema;
|
|
12431
|
+
exports.ROOT_CONFIG_FIELDS = useDatasourceSchema.ROOT_CONFIG_FIELDS;
|
|
12432
|
+
exports.buildCelContext = useDatasourceSchema.buildCelContext;
|
|
12433
|
+
exports.buildCloneDatasourcePayload = useDatasourceSchema.buildCloneDatasourcePayload;
|
|
12434
|
+
exports.buildCreateDatasourcePayload = useDatasourceSchema.buildCreateDatasourcePayload;
|
|
12435
|
+
exports.buildUpdateDatasourcePayload = useDatasourceSchema.buildUpdateDatasourcePayload;
|
|
12436
|
+
exports.clearExpressionCache = useDatasourceSchema.clearExpressionCache;
|
|
12437
|
+
exports.computeVirtualFieldValues = useDatasourceSchema.computeVirtualFieldValues;
|
|
12438
|
+
exports.configToYaml = useDatasourceSchema.configToYaml;
|
|
12439
|
+
exports.datasourceToProvisioningYaml = useDatasourceSchema.datasourceToProvisioningYaml;
|
|
12440
|
+
exports.evaluateCelDirect = useDatasourceSchema.evaluateCelDirect;
|
|
12441
|
+
exports.evaluateCelExpression = useDatasourceSchema.evaluateCelExpression;
|
|
12442
|
+
exports.evaluateComputedRead = useDatasourceSchema.evaluateComputedRead;
|
|
12443
|
+
exports.evaluateDependsOn = useDatasourceSchema.evaluateDependsOn;
|
|
12444
|
+
exports.extractFieldRefs = useDatasourceSchema.extractFieldRefs;
|
|
12445
|
+
exports.fetchConfigSchema = useDatasourceSchema.fetchConfigSchema;
|
|
12446
|
+
exports.formKey = useDatasourceSchema.formKey;
|
|
12447
|
+
exports.formatYamlDiff = useDatasourceSchema.formatYamlDiff;
|
|
12448
|
+
exports.generateLLMHint = useDatasourceSchema.generateLLMHint;
|
|
12449
|
+
exports.generateTroubleshootingFields = useDatasourceSchema.generateTroubleshootingFields;
|
|
12450
|
+
exports.getConfigSchema = useDatasourceSchema.getConfigSchema;
|
|
12451
|
+
exports.getWatchedValue = useDatasourceSchema.getWatchedValue;
|
|
12452
|
+
exports.isValidCelExpression = useDatasourceSchema.isValidCelExpression;
|
|
12453
|
+
exports.parseDependsOn = useDatasourceSchema.parseDependsOn;
|
|
12454
|
+
exports.resolveActiveOverride = useDatasourceSchema.resolveActiveOverride;
|
|
12455
|
+
exports.resolveGroups = useDatasourceSchema.resolveGroups;
|
|
12456
|
+
exports.resolveRequiredFieldsGroup = useDatasourceSchema.resolveRequiredFieldsGroup;
|
|
12457
|
+
exports.toProvisioningYaml = useDatasourceSchema.toProvisioningYaml;
|
|
12458
|
+
exports.useDatasourceSchema = useDatasourceSchema.useDatasourceSchema;
|
|
12533
12459
|
exports.AccessoryButton = AccessoryButton;
|
|
12534
12460
|
exports.AdvancedHttpSettings = AdvancedHttpSettings;
|
|
12535
12461
|
exports.Auth = Auth;
|
|
@@ -12586,7 +12512,6 @@ exports.QueryModellerBase = QueryModellerBase;
|
|
|
12586
12512
|
exports.QueryOptionGroup = QueryOptionGroup;
|
|
12587
12513
|
exports.RawQuery = RawQuery;
|
|
12588
12514
|
exports.RunQueryButton = RunQueryButton;
|
|
12589
|
-
exports.SECURE_FIELD_CONFIGURED = SECURE_FIELD_CONFIGURED;
|
|
12590
12515
|
exports.SQLEditor = SQLEditor;
|
|
12591
12516
|
exports.SQLEditorMode = SQLEditorMode;
|
|
12592
12517
|
exports.SQLEditorTestUtils = SQLEditorTestUtils;
|
|
@@ -12600,28 +12525,12 @@ exports.SuggestionKind = SuggestionKind;
|
|
|
12600
12525
|
exports.TLSSettings = TLSSettings;
|
|
12601
12526
|
exports.TableSelector = TableSelector;
|
|
12602
12527
|
exports.TokenType = TokenType;
|
|
12603
|
-
exports.buildDatasourceConfigPayload = buildDatasourceConfigPayload;
|
|
12604
|
-
exports.computeVirtualFieldValues = computeVirtualFieldValues;
|
|
12605
12528
|
exports.convertLegacyAuthProps = convertLegacyAuthProps;
|
|
12606
|
-
exports.datasourceToProvisioningYaml = datasourceToProvisioningYaml;
|
|
12607
|
-
exports.evaluateComputedRead = evaluateComputedRead;
|
|
12608
|
-
exports.expandIndexedPair = expandIndexedPair;
|
|
12609
|
-
exports.fetchExistingValues = fetchExistingValues;
|
|
12610
|
-
exports.flattenIndexedPair = flattenIndexedPair;
|
|
12611
|
-
exports.formKey = formKey;
|
|
12612
12529
|
exports.formatDate = formatDate;
|
|
12613
|
-
exports.generateLLMHint = generateLLMHint;
|
|
12614
|
-
exports.generateTroubleshootingFields = generateTroubleshootingFields;
|
|
12615
12530
|
exports.getStandardSQLCompletionProvider = getStandardSQLCompletionProvider;
|
|
12616
12531
|
exports.grafanaStandardSQLLanguage = language;
|
|
12617
12532
|
exports.grafanaStandardSQLLanguageConf = conf;
|
|
12618
|
-
exports.parseDependsOn = parseDependsOn;
|
|
12619
|
-
exports.resolveActiveOverride = resolveActiveOverride;
|
|
12620
|
-
exports.resolveGroups = resolveGroups;
|
|
12621
12533
|
exports.resolvePluginName = resolvePluginName;
|
|
12622
|
-
exports.resolveRequiredFieldsGroup = resolveRequiredFieldsGroup;
|
|
12623
|
-
exports.submitDatasourceConfig = submitDatasourceConfig;
|
|
12624
12534
|
exports.toOption = toOption;
|
|
12625
|
-
exports.toProvisioningYaml = toProvisioningYaml;
|
|
12626
12535
|
exports.useHealthChecks = useHealthChecks;
|
|
12627
12536
|
//# sourceMappingURL=index.cjs.map
|