@odigos/ui-kit 0.0.65 → 0.0.67

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.67](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.66...ui-kit-v0.0.67) (2025-07-23)
4
+
5
+
6
+ ### Features
7
+
8
+ * change system setting fields ([#267](https://github.com/odigos-io/ui-kit/issues/267)) ([25b483a](https://github.com/odigos-io/ui-kit/commit/25b483a8bc92bb07cb251f14859567d51631c641))
9
+
10
+ ## [0.0.66](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.65...ui-kit-v0.0.66) (2025-07-22)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * allow null values ([#265](https://github.com/odigos-io/ui-kit/issues/265)) ([cd92ec8](https://github.com/odigos-io/ui-kit/commit/cd92ec89e84893d69a126300ce8e6a232852223e))
16
+
3
17
  ## [0.0.65](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.64...ui-kit-v0.0.65) (2025-07-21)
4
18
 
5
19
 
@@ -1,6 +1,7 @@
1
1
  import { type FC } from 'react';
2
- import type { OdigosConfig } from '@/types';
2
+ import { InstallationMethod, type OdigosConfig } from '@/types';
3
3
  interface SystemSettingsProps {
4
+ installationMethod: InstallationMethod;
4
5
  fetchSettings: () => Promise<OdigosConfig | undefined>;
5
6
  onSave: (payload: OdigosConfig) => Promise<void>;
6
7
  }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const AdvancedSettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
+ export { AdvancedSettings };
@@ -1,4 +1,4 @@
1
- import { type FC } from 'react';
2
- import type { SettingsProps } from './types';
3
- declare const CollectorGatewaySettings: FC<SettingsProps>;
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const CollectorGatewaySettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
4
  export { CollectorGatewaySettings };
@@ -1,4 +1,4 @@
1
- import { type FC } from 'react';
2
- import type { SettingsProps } from './types';
3
- declare const CollectorNodeSettings: FC<SettingsProps>;
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const CollectorNodeSettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
4
  export { CollectorNodeSettings };
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const GeneralSettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
+ export { GeneralSettings };
@@ -1,7 +1,4 @@
1
1
  import type { DropdownOption } from '@/components';
2
- import { AgentEnvVarsInjectionMethod, MountMethod, Profile, ProgrammingLanguages, UiMode } from '@/types';
3
- export declare const UI_MODE_OPTIONS: DropdownOption<UiMode>[];
4
- export declare const INSTRUMENTATION_LANG_OPTIONS: DropdownOption<ProgrammingLanguages>[];
2
+ import { AgentEnvVarsInjectionMethod, MountMethod } from '@/types';
5
3
  export declare const MOUNT_METHOD_OPTIONS: DropdownOption<MountMethod>[];
6
4
  export declare const AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS: DropdownOption<AgentEnvVarsInjectionMethod>[];
7
- export declare const PROFILE_OPTIONS: DropdownOption<Profile>[];
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const RollbackSettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
+ export { RollbackSettings };
@@ -1,2 +1,8 @@
1
1
  export declare const Card: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
2
2
  export declare const CardTitle: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("@/components").TextProps, never>> & string & Omit<import("react").FC<import("@/components").TextProps>, keyof import("react").Component<any, {}, any>>;
3
+ export declare const RowOfFields: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$gap" | "$alignItems" | "$justifyContent" | "$wrap"> & {
4
+ $gap?: number;
5
+ $alignItems?: import("styled-components").CSSProperties["alignItems"];
6
+ $justifyContent?: import("styled-components").CSSProperties["justifyContent"];
7
+ $wrap?: import("styled-components").CSSProperties["flexWrap"];
8
+ }, never>> & string;
@@ -1,4 +1,12 @@
1
1
  import type { OdigosConfig } from '@/types';
2
+ export declare enum SettingsTabs {
3
+ General = "General",
4
+ Ui = "UI",
5
+ Rollback = "Rollback",
6
+ CollectorNode = "Collector Node",
7
+ CollectorGateway = "Collector Gateway",
8
+ Advanced = "Advanced"
9
+ }
2
10
  export interface SettingsProps {
3
11
  formData: OdigosConfig;
4
12
  handleFormChange: (key: keyof OdigosConfig | string, value: any) => void;
@@ -1,4 +1,4 @@
1
- import { type FC } from 'react';
2
- import type { SettingsProps } from './types';
3
- declare const UiSettings: FC<SettingsProps>;
1
+ import React from 'react';
2
+ import { type SettingsProps } from './types';
3
+ declare const UiSettings: React.ForwardRefExoticComponent<SettingsProps & React.RefAttributes<HTMLDivElement>>;
4
4
  export { UiSettings };
package/lib/containers.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, Fragment, useCallback, Children } from 'react';
2
2
  import styled, { css } from 'styled-components';
3
3
  import { b as DISPLAY_TITLES, T as Theme, U as usePendingStore, V as useNotificationStore, O as useDrawerStore, B as BUTTON_TEXTS, W as useEntityStore, A as ACTION_OPTIONS, g as getActionIcon, z as useModalStore, F as FORM_ALERTS, X as useFilterStore, D as DISPLAY_LANGUAGES, M as MONITORS_OPTIONS, d as getInstrumentationRuleIcon, Y as useDataStreamStore, Z as useInstrumentStore, c as getEntityId, S as STORAGE_KEYS, a as DEFAULT_DATA_STREAM_NAME, _ as useSetupStore, e as getProgrammingLanguageIcon, I as INSTRUMENTATION_RULE_OPTIONS, $ as useSelectedStore, j as ImageErrorIcon, a0 as useDarkMode } from './index-bd48e6e2.js';
4
- import { ActionType, ActionKeyTypes, InputTypes, FieldTypes, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, EdgeTypes, AddNodeTypes, SignalType, HeadersCollectionKeyTypes, CustomInstrumentationsKeyTypes, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType, K8sResourceKind, UiMode, ProgrammingLanguages, MountMethod, AgentEnvVarsInjectionMethod, Profile } from './types.js';
4
+ import { ActionType, ActionKeyTypes, InputTypes, FieldTypes, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, EdgeTypes, AddNodeTypes, SignalType, HeadersCollectionKeyTypes, CustomInstrumentationsKeyTypes, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType, K8sResourceKind, MountMethod, AgentEnvVarsInjectionMethod, InstallationMethod } from './types.js';
5
5
  import { e as DataCardFieldTypes, p as FieldLabel, C as Checkbox, o as FieldError, v as Input, x as InputTable, K as KeyValueInputsList, w as InputList, _ as Text, R as Segment, Q as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, $ as TextArea, k as Drawer, c as ConditionDetails, D as DataCard, a5 as FlexColumn, M as Modal, N as NavigationButtons, a9 as ModalBody, L as NotificationNote, A as AutocompleteInput, i as Divider, W as Status, a4 as FlexRow, a1 as Tooltip, s as IconWrapped, G as MonitorsIcons, aa as TableContainer, ab as TableTitleWrap, r as IconTitleBadge, ac as TableWrap, y as InteractiveTable, a6 as CenterThis, J as NoDataFound, a2 as TraceLoader, a as Badge, E as ExtendArrow, a7 as VerticalScroll, U as SelectionButton, B as Button, n as Dropdown, ad as nodeConfig, ae as useNodesState, af as useEdgesState, ag as Flow, ah as applyNodeChanges, P as Popup, a0 as Toggle, I as IconButton, ai as AddButton, F as FadeLoader, g as DataTab, X as Stepper, d as DataCardFields, Z as Tag, aj as MarkerType, t as IconsNav, ak as CopyText, h as DescribeRow, al as PodContainer, am as SourceContainer, q as IconGroup, O as PopupForm } from './index-f2da9ad4.js';
6
6
  import { i as isEmpty, s as safeJsonParse, d as deepClone } from './index-5e5f7bda.js';
7
7
  import { C as CheckCircledIcon, O as OdigosLogo } from './index-50101bec.js';
@@ -4723,6 +4723,16 @@ const SystemOverview = ({ tokens, saveToken, fetchDescribeOdigos }) => {
4723
4723
  React.createElement(Describe, { fetchDescribeOdigos: fetchDescribeOdigos })))));
4724
4724
  };
4725
4725
 
4726
+ var SettingsTabs;
4727
+ (function (SettingsTabs) {
4728
+ SettingsTabs["General"] = "General";
4729
+ SettingsTabs["Ui"] = "UI";
4730
+ SettingsTabs["Rollback"] = "Rollback";
4731
+ SettingsTabs["CollectorNode"] = "Collector Node";
4732
+ SettingsTabs["CollectorGateway"] = "Collector Gateway";
4733
+ SettingsTabs["Advanced"] = "Advanced";
4734
+ })(SettingsTabs || (SettingsTabs = {}));
4735
+
4726
4736
  const Card = styled.div `
4727
4737
  align-self: stretch;
4728
4738
  display: flex;
@@ -4739,182 +4749,203 @@ const CardTitle = styled(Text) `
4739
4749
  font-weight: 600;
4740
4750
  line-height: 20px;
4741
4751
  `;
4752
+ const RowOfFields = styled(FlexRow) `
4753
+ width: 100%;
4754
+ gap: 12px;
4755
+ align-items: flex-start;
4756
+ `;
4757
+
4758
+ const UiSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4759
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.Ui },
4760
+ React.createElement(CardTitle, null, "UI"),
4761
+ React.createElement(Input, { title: 'Central Backend URL', tooltip: 'URL of the central backend', required: true, value: formData.centralBackendURL || '', onChange: (e) => {
4762
+ const { value } = e.target;
4763
+ handleFormChange('centralBackendURL', value || null);
4764
+ } }),
4765
+ React.createElement(Input, { title: 'OIDC Tenant URL', tooltip: 'URL of the OIDC tenant', required: true, value: formData.oidc?.tenantUrl || '', onChange: (e) => {
4766
+ const { value } = e.target;
4767
+ handleFormChange('oidc.tenantUrl', value || null);
4768
+ } }),
4769
+ React.createElement(Input, { title: 'OIDC Client ID', tooltip: 'Client ID of the OIDC application', required: true, value: formData.oidc?.clientId || '', onChange: (e) => {
4770
+ const { value } = e.target;
4771
+ handleFormChange('oidc.clientId', value || null);
4772
+ } }),
4773
+ React.createElement(Input, { title: 'OIDC Client Secret', tooltip: 'Client Secret of the OIDC application', type: 'password', required: true, value: formData.oidc?.clientSecret || '', onChange: (e) => {
4774
+ const { value } = e.target;
4775
+ handleFormChange('oidc.clientSecret', value || null);
4776
+ } })));
4777
+ });
4778
+ UiSettings.displayName = UiSettings.name;
4779
+
4780
+ const GeneralSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4781
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.General },
4782
+ React.createElement(CardTitle, null, "General"),
4783
+ React.createElement(Toggle, { title: 'Karpenter Enabled', tooltip: 'Enable Karpenter support', initialValue: formData.karpenterEnabled || false, onChange: (bool) => handleFormChange('karpenterEnabled', bool) }),
4784
+ React.createElement(Toggle, { title: 'Allow Concurrent Agents', tooltip: 'Allow concurrent running agents', initialValue: formData.allowConcurrentAgents || false, onChange: (bool) => handleFormChange('allowConcurrentAgents', bool) }),
4785
+ React.createElement(Toggle, { title: 'Automatic Rollout Disabled', tooltip: 'Disable automatic rollout of pods after instrumentation', initialValue: formData.rollout?.automaticRolloutDisabled || false, onChange: (bool) => handleFormChange('rollout.automaticRolloutDisabled', bool) }),
4786
+ React.createElement(Input, { title: 'Cluster Name', tooltip: 'Name of the cluster', required: true, value: formData.clusterName || '', onChange: (e) => {
4787
+ const { value } = e.target;
4788
+ handleFormChange('clusterName', value || null);
4789
+ } }),
4790
+ React.createElement(Input, { title: 'Image Prefix', tooltip: 'Docker image prefix for all Odigos components', disabled: true, required: true, value: formData.imagePrefix || '', onChange: (e) => {
4791
+ const { value } = e.target;
4792
+ handleFormChange('imagePrefix', value || null);
4793
+ } }),
4794
+ React.createElement(KeyValueInputsList, { title: 'Node Selector', tooltip: 'NodeSelector is a map of key-value Kubernetes NodeSelector labels to apply to all Odigos components. Note that Odigos will only be able to instrument applications on the same node. This setting can be applied only via the CLI.', disabled: true, required: true, value: Object.entries(formData.nodeSelector || {}).map(([key, value]) => ({ key, value })) }),
4795
+ React.createElement(RowOfFields, null,
4796
+ React.createElement(InputList, { title: 'Ignored Namespaces', tooltip: 'List of namespaces to exclude from instrumentation', required: true, value: formData.ignoredNamespaces || [], onChange: (arr) => handleFormChange('ignoredNamespaces', arr) }),
4797
+ React.createElement(InputList, { title: 'Ignored Containers', tooltip: 'List of container names to exclude from instrumentation, this is a global setting and will be applied to all applications', required: true, value: formData.ignoredContainers || [], onChange: (arr) => handleFormChange('ignoredContainers', arr) }))));
4798
+ });
4799
+ GeneralSettings.displayName = GeneralSettings.name;
4800
+
4801
+ const RollbackSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4802
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.Rollback },
4803
+ React.createElement(CardTitle, null, "Rollback"),
4804
+ React.createElement(Toggle, { title: 'Rollback Disabled', tooltip: 'Disable rollback', initialValue: formData.rollbackDisabled || false, onChange: (bool) => handleFormChange('rollbackDisabled', bool) }),
4805
+ React.createElement(RowOfFields, null,
4806
+ React.createElement(Input, { title: 'Rollback Grace Time', tooltip: 'Grace time for rollback', required: true, value: formData.rollbackGraceTime || '', onChange: (e) => {
4807
+ const { value } = e.target;
4808
+ handleFormChange('rollbackGraceTime', value || null);
4809
+ } }),
4810
+ React.createElement(Input, { title: 'Rollback Stability Window', tooltip: 'Stability window for rollback', required: true, value: formData.rollbackStabilityWindow || '', onChange: (e) => {
4811
+ const { value } = e.target;
4812
+ handleFormChange('rollbackStabilityWindow', value || null);
4813
+ } }))));
4814
+ });
4815
+ RollbackSettings.displayName = RollbackSettings.name;
4742
4816
 
4743
- const UI_MODE_OPTIONS = [
4744
- { id: UiMode.Default, value: 'Default' },
4745
- { id: UiMode.ReadOnly, value: 'Read Only' },
4746
- ];
4747
- const INSTRUMENTATION_LANG_OPTIONS = [
4748
- {
4749
- id: ProgrammingLanguages.Go,
4750
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.Go],
4751
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.Go),
4752
- },
4753
- {
4754
- id: ProgrammingLanguages.JavaScript,
4755
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.JavaScript],
4756
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.JavaScript),
4757
- },
4758
- {
4759
- id: ProgrammingLanguages.Python,
4760
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.Python],
4761
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.Python),
4762
- },
4763
- {
4764
- id: ProgrammingLanguages.Java,
4765
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.Java],
4766
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.Java),
4767
- },
4768
- {
4769
- id: ProgrammingLanguages.Php,
4770
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.Php],
4771
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.Php),
4772
- },
4773
- {
4774
- id: ProgrammingLanguages.Ruby,
4775
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.Ruby],
4776
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.Ruby),
4777
- },
4778
- {
4779
- id: ProgrammingLanguages.DotNet,
4780
- value: DISPLAY_LANGUAGES[ProgrammingLanguages.DotNet],
4781
- icon: getProgrammingLanguageIcon(ProgrammingLanguages.DotNet),
4782
- },
4783
- ];
4784
4817
  const MOUNT_METHOD_OPTIONS = [
4785
4818
  { id: MountMethod.VirtualDevice, value: 'Virtual Device' },
4786
4819
  { id: MountMethod.HostPath, value: 'Host Path' },
4787
- // { id: MountMethod.InitContainer, value: 'Init Container' },
4820
+ { id: MountMethod.InitContainer, value: 'Init Container' },
4788
4821
  ];
4789
4822
  const AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS = [
4790
4823
  { id: AgentEnvVarsInjectionMethod.Loader, value: 'Loader' },
4791
4824
  { id: AgentEnvVarsInjectionMethod.PodManifest, value: 'Pod Manifest' },
4792
4825
  { id: AgentEnvVarsInjectionMethod.LoaderFallbackToPodManifest, value: 'Loader Fallback to Pod Manifest' },
4793
4826
  ];
4794
- const PROFILE_OPTIONS = [
4795
- // { id: Profile.CategoryAttributes, value: 'Category Attributes' },
4796
- { id: Profile.CodeAttributes, value: 'Code Attributes' },
4797
- // { id: Profile.CopyScope, value: 'Copy Scope' },
4798
- // { id: Profile.HostnameAsPodname, value: 'Hostname as Podname' },
4799
- { id: Profile.FullPayloadCollection, value: 'Full Payload Collection' },
4800
- { id: Profile.DbPayloadCollection, value: 'DB Payload Collection' },
4801
- { id: Profile.QueryOperationDetector, value: 'Query Operation Detector' },
4802
- // { id: Profile.Semconv, value: 'Semconv' },
4803
- // { id: Profile.ReduceSpanNameCardinality, value: 'Reduce Span Name Cardinality' },
4804
- { id: Profile.AllowConcurrentAgents, value: 'Allow Concurrent Agents' },
4805
- { id: Profile.JavaEbpfInstrumentations, value: 'Java EBPF Instrumentations' },
4806
- { id: Profile.JavaNativeInstrumentations, value: 'Java Native Instrumentations' },
4807
- // { id: Profile.LegacyDotnetInstrumentation, value: 'Legacy .NET Instrumentation' },
4808
- // { id: Profile.MountMethodK8sHostPath, value: 'Mount Method K8s Host Path' },
4809
- // { id: Profile.MountMethodK8sVirtualDevice, value: 'Mount Method K8s Virtual Device' },
4810
- // { id: Profile.PodManifestEnvVarInjection, value: 'Pod Manifest Env Var Injection' },
4811
- // { id: Profile.DisableGin, value: 'Disable Gin' },
4812
- // { id: Profile.SmallBatches, value: 'Small Batches' },
4813
- { id: Profile.SizeS, value: 'Size S' },
4814
- { id: Profile.SizeM, value: 'Size M' },
4815
- { id: Profile.SizeL, value: 'Size L' },
4816
- ];
4817
-
4818
- const UiSettings = ({ formData, handleFormChange }) => {
4819
- return (React.createElement(Card, null,
4820
- React.createElement(CardTitle, null, "UI"),
4821
- React.createElement(Dropdown, { title: 'UI Mode', tooltip: 'Mode of the UI - default or readonly', options: UI_MODE_OPTIONS, value: UI_MODE_OPTIONS.find((option) => option.id === formData.uiMode), onSelect: (option) => handleFormChange('uiMode', option.id) }),
4822
- React.createElement(Input, { title: 'UI Pagination Limit', tooltip: 'Pagination limit for UI paginated fetching', type: 'number', value: formData.uiPaginationLimit.toString(), onChange: (e) => handleFormChange('uiPaginationLimit', Number(e.target.value)) }),
4823
- React.createElement(Input, { title: 'Central Backend URL', tooltip: 'URL of the central backend', value: formData.centralBackendURL, onChange: (e) => handleFormChange('centralBackendURL', e.target.value) }),
4824
- React.createElement(Input, { title: 'OIDC Tenant URL', tooltip: 'URL of the OIDC tenant', value: formData.oidc?.tenantUrl, onChange: (e) => handleFormChange('oidc.tenantUrl', e.target.value) }),
4825
- React.createElement(Input, { title: 'OIDC Client ID', tooltip: 'Client ID of the OIDC application', value: formData.oidc?.clientId, onChange: (e) => handleFormChange('oidc.clientId', e.target.value) }),
4826
- React.createElement(Input, { title: 'OIDC Client Secret', tooltip: 'Client Secret of the OIDC application', type: 'password', value: formData.oidc?.clientSecret, onChange: (e) => handleFormChange('oidc.clientSecret', e.target.value) })));
4827
- };
4828
4827
 
4829
- const OtherSettings = ({ formData, handleFormChange }) => {
4830
- return (React.createElement(Card, null,
4831
- React.createElement(CardTitle, null, "Other"),
4832
- React.createElement(Toggle, { title: 'Telemetry Enabled', tooltip: 'Enable anonymous telemetry collection', initialValue: formData.telemetryEnabled, onChange: (bool) => handleFormChange('telemetryEnabled', bool) }),
4833
- React.createElement(Toggle, { title: 'OpenShift Enabled', tooltip: 'Enable OpenShift-specific features', initialValue: formData.openshiftEnabled, onChange: (bool) => handleFormChange('openshiftEnabled', bool) }),
4834
- React.createElement(Toggle, { title: 'Karpenter Enabled', tooltip: 'Enable Karpenter support', initialValue: formData.karpenterEnabled, onChange: (bool) => handleFormChange('karpenterEnabled', bool) }),
4835
- React.createElement(Toggle, { title: 'PSP Enabled', tooltip: 'Enable Pod Security Policy support', initialValue: formData.psp, onChange: (bool) => handleFormChange('psp', bool) }),
4836
- React.createElement(Toggle, { title: 'Allow Concurrent Agents', tooltip: 'Allow concurrent running agents', initialValue: formData.allowConcurrentAgents, onChange: (bool) => handleFormChange('allowConcurrentAgents', bool) }),
4837
- React.createElement(Toggle, { title: 'Skip Webhook Issuer Creation', tooltip: 'Skip creation of the webhook issuer', initialValue: formData.skipWebhookIssuerCreation, onChange: (bool) => handleFormChange('skipWebhookIssuerCreation', bool) }),
4838
- React.createElement(Toggle, { title: 'Automatic Rollout Disabled', tooltip: 'Disable automatic rollout of pods after instrumentation', initialValue: formData.rollout?.automaticRolloutDisabled, onChange: (bool) => handleFormChange('rollout.automaticRolloutDisabled', bool) }),
4839
- React.createElement(Input, { title: 'Cluster Name', tooltip: 'Name of the cluster', value: formData.clusterName, onChange: (e) => handleFormChange('clusterName', e.target.value) }),
4840
- React.createElement(Input, { title: 'Image Prefix', tooltip: 'Image prefix for all Odigos components', value: formData.imagePrefix, onChange: (e) => handleFormChange('imagePrefix', e.target.value) }),
4841
- React.createElement(InputList, { title: 'Ignored Namespaces', tooltip: 'List of namespaces to exclude from instrumentation', value: formData.ignoredNamespaces, onChange: (arr) => handleFormChange('ignoredNamespaces', arr) }),
4842
- React.createElement(InputList, { title: 'Ignored Containers', tooltip: 'List of container names to exclude from instrumentation', value: formData.ignoredContainers, onChange: (arr) => handleFormChange('ignoredContainers', arr) }),
4843
- React.createElement(Dropdown, { title: 'Profiles', tooltip: 'Profiles to enable', isMulti: true, options: PROFILE_OPTIONS, value: PROFILE_OPTIONS.filter((option) => formData.profiles.includes(option.id)), onSelect: (option) => handleFormChange('profiles', [...formData.profiles, option.id]), onDeselect: (option) => handleFormChange('profiles', formData.profiles.filter((p) => p !== option.id)) }),
4844
- React.createElement(Dropdown, { title: 'Mount Method', tooltip: 'Method used to mount volume', options: MOUNT_METHOD_OPTIONS, value: MOUNT_METHOD_OPTIONS.find((option) => option.id === formData.mountMethod), onSelect: (option) => handleFormChange('mountMethod', option.id) }),
4845
- React.createElement(Dropdown, { title: 'Agent Env Vars Injection Method', tooltip: 'How to inject env vars into agents', options: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS, value: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS.find((option) => option.id === formData.agentEnvVarsInjectionMethod), onSelect: (option) => handleFormChange('agentEnvVarsInjectionMethod', option.id) }),
4846
- React.createElement(Input, { title: 'Custom Container Runtime Socket Path', tooltip: 'Path to the custom container runtime socket', value: formData.customContainerRuntimeSocketPath, onChange: (e) => handleFormChange('customContainerRuntimeSocketPath', e.target.value) }),
4847
- React.createElement(Input, { title: 'Odiglet Health Probe Bind Port', tooltip: 'Port to bind the health probe', value: formData.odigletHealthProbeBindPort.toString(), onChange: (e) => handleFormChange('odigletHealthProbeBindPort', Number(e.target.value)) }),
4848
- React.createElement(Toggle, { title: 'Rollback Disabled', tooltip: 'Disable rollback', initialValue: formData.rollbackDisabled, onChange: (bool) => handleFormChange('rollbackDisabled', bool) }),
4849
- React.createElement(Input, { title: 'Rollback Grace Time', tooltip: 'Grace time for rollback', value: formData.rollbackGraceTime, onChange: (e) => handleFormChange('rollbackGraceTime', e.target.value) }),
4850
- React.createElement(Input, { title: 'Rollback Stability Window', tooltip: 'Stability window for rollback', value: formData.rollbackStabilityWindow, onChange: (e) => handleFormChange('rollbackStabilityWindow', e.target.value) }),
4851
- React.createElement(KeyValueInputsList, { title: 'Node Selector', value: Object.entries(formData.nodeSelector || {}).map(([key, value]) => ({
4852
- key,
4853
- value,
4854
- })), onChange: (arr) => handleFormChange('nodeSelector', arr.reduce((acc, { key, value }) => ({
4855
- ...acc,
4856
- [key]: value,
4857
- }), {})) })));
4858
- };
4828
+ const AdvancedSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4829
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.Advanced },
4830
+ React.createElement(CardTitle, null, "Advanced"),
4831
+ React.createElement(Input, { title: 'UI Pagination Limit', tooltip: 'Pagination limit for fetching data from the UI backend, bigger limit means more data will be fetched at once, and less requests will be made to the backend', type: 'number', required: true, value: formData.uiPaginationLimit?.toString() || '', onChange: (e) => {
4832
+ const { value } = e.target;
4833
+ handleFormChange('uiPaginationLimit', value === '' ? null : Number(value));
4834
+ } }),
4835
+ React.createElement(Dropdown, { title: 'Mount Method', tooltip: 'Method used to mount volume', options: MOUNT_METHOD_OPTIONS, required: true, value: MOUNT_METHOD_OPTIONS.find((option) => option.id === formData.mountMethod) || undefined, onSelect: (option) => handleFormChange('mountMethod', option.id) }),
4836
+ React.createElement(Dropdown, { title: 'Agent Env Vars Injection Method', tooltip: 'How to inject env vars into agents', options: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS, required: true, value: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS.find((option) => option.id === formData.agentEnvVarsInjectionMethod) || undefined, onSelect: (option) => handleFormChange('agentEnvVarsInjectionMethod', option.id) }),
4837
+ React.createElement(Input, { title: 'Odiglet Health Probe Bind Port', tooltip: 'Port to bind the health probe', type: 'number', required: true, value: formData.odigletHealthProbeBindPort?.toString() || '', onChange: (e) => {
4838
+ const { value } = e.target;
4839
+ handleFormChange('odigletHealthProbeBindPort', value === '' ? null : Number(value));
4840
+ } }),
4841
+ React.createElement(Input, { title: 'Custom Container Runtime Socket Path', tooltip: 'Path to the custom container runtime socket', required: true, value: formData.customContainerRuntimeSocketPath || '', onChange: (e) => {
4842
+ const { value } = e.target;
4843
+ handleFormChange('customContainerRuntimeSocketPath', value || null);
4844
+ } }),
4845
+ React.createElement(Input, { title: 'K8s Node Logs Directory', tooltip: 'Target directory for K8s logs if `/var/log` is a symlink', required: true, value: formData.collectorNode?.k8sNodeLogsDirectory || '', onChange: (e) => {
4846
+ const { value } = e.target;
4847
+ handleFormChange('collectorNode.k8sNodeLogsDirectory', value || null);
4848
+ } }),
4849
+ React.createElement(Input, { title: 'Coll. Node Own Metrics Port', tooltip: "Port for the collector node's own Prometheus metrics", type: 'number', required: true, value: formData.collectorNode?.collectorOwnMetricsPort?.toString() || '', onChange: (e) => {
4850
+ const { value } = e.target;
4851
+ handleFormChange('collectorNode.collectorOwnMetricsPort', value === '' ? null : Number(value));
4852
+ } }),
4853
+ React.createElement(RowOfFields, null,
4854
+ React.createElement(Input, { title: 'Coll. Node Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4855
+ const { value } = e.target;
4856
+ handleFormChange('collectorNode.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4857
+ } }),
4858
+ React.createElement(Input, { title: 'Coll. Node Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4859
+ const { value } = e.target;
4860
+ handleFormChange('collectorNode.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4861
+ } })),
4862
+ React.createElement(Input, { title: 'Coll. Node Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4863
+ const { value } = e.target;
4864
+ handleFormChange('collectorNode.goMemLimitMiB', value === '' ? null : Number(value));
4865
+ } }),
4866
+ React.createElement(RowOfFields, null,
4867
+ React.createElement(Input, { title: 'Coll. Gateway Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4868
+ const { value } = e.target;
4869
+ handleFormChange('collectorGateway.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4870
+ } }),
4871
+ React.createElement(Input, { title: 'Coll. Gateway Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4872
+ const { value } = e.target;
4873
+ handleFormChange('collectorGateway.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4874
+ } })),
4875
+ React.createElement(Input, { title: 'Coll. Gateway Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4876
+ const { value } = e.target;
4877
+ handleFormChange('collectorGateway.goMemLimitMiB', value === '' ? null : Number(value));
4878
+ } })));
4879
+ });
4880
+ AdvancedSettings.displayName = AdvancedSettings.name;
4859
4881
 
4860
- const CollectorNodeSettings = ({ formData, handleFormChange }) => {
4861
- return (React.createElement(Card, null,
4882
+ const CollectorNodeSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4883
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.CollectorNode },
4862
4884
  React.createElement(CardTitle, null, "Collector Node"),
4863
- React.createElement(Input, { title: 'Collector Own Metrics Port', tooltip: "Port for the collector's own Prometheus metrics", type: 'number', value: formData.collectorNode?.collectorOwnMetricsPort?.toString() || '', onChange: (e) => handleFormChange('collectorNode.collectorOwnMetricsPort', Number(e.target.value)) }),
4864
- React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector node in Megabytes', type: 'number', value: formData.collectorNode?.requestMemoryMiB?.toString() || '', onChange: (e) => handleFormChange('collectorNode.requestMemoryMiB', Number(e.target.value)) }),
4865
- React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector node in Megabytes', type: 'number', value: formData.collectorNode?.limitMemoryMiB?.toString() || '', onChange: (e) => handleFormChange('collectorNode.limitMemoryMiB', Number(e.target.value)) }),
4866
- React.createElement(Input, { title: 'Request CPU (Millicores)', tooltip: 'Request CPU for the collector node in Millicores', type: 'number', value: formData.collectorNode?.requestCPUm?.toString() || '', onChange: (e) => handleFormChange('collectorNode.requestCPUm', Number(e.target.value)) }),
4867
- React.createElement(Input, { title: 'Limit CPU (Millicores)', tooltip: 'Limit CPU for the collector node in Millicores', type: 'number', value: formData.collectorNode?.limitCPUm?.toString() || '', onChange: (e) => handleFormChange('collectorNode.limitCPUm', Number(e.target.value)) }),
4868
- React.createElement(Input, { title: 'Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector node in Megabytes', type: 'number', value: formData.collectorNode?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorNode.memoryLimiterLimitMiB', Number(e.target.value)) }),
4869
- React.createElement(Input, { title: 'Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector node in Megabytes', type: 'number', value: formData.collectorNode?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorNode.memoryLimiterSpikeLimitMiB', Number(e.target.value)) }),
4870
- React.createElement(Input, { title: 'Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector node in Megabytes', type: 'number', value: formData.collectorNode?.goMemLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorNode.goMemLimitMiB', Number(e.target.value)) }),
4871
- React.createElement(Input, { title: 'K8s Node Logs Directory', tooltip: 'Target directory for K8s logs if `/var/log` is a symlink', value: formData.collectorNode?.k8sNodeLogsDirectory || '', onChange: (e) => handleFormChange('collectorNode.k8sNodeLogsDirectory', e.target.value) })));
4872
- };
4885
+ React.createElement(RowOfFields, null,
4886
+ React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4887
+ const { value } = e.target;
4888
+ handleFormChange('collectorNode.requestMemoryMiB', value === '' ? null : Number(value));
4889
+ } }),
4890
+ React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4891
+ const { value } = e.target;
4892
+ handleFormChange('collectorNode.limitMemoryMiB', value === '' ? null : Number(value));
4893
+ } })),
4894
+ React.createElement(RowOfFields, null,
4895
+ React.createElement(Input, { title: 'Request CPU (m)', tooltip: 'Request CPU for the collector node in Millicores', type: 'number', required: true, value: formData.collectorNode?.requestCPUm?.toString() || '', onChange: (e) => {
4896
+ const { value } = e.target;
4897
+ handleFormChange('collectorNode.requestCPUm', value === '' ? null : Number(value));
4898
+ } }),
4899
+ React.createElement(Input, { title: 'Limit CPU (m)', tooltip: 'Limit CPU for the collector node in Millicores', type: 'number', required: true, value: formData.collectorNode?.limitCPUm?.toString() || '', onChange: (e) => {
4900
+ const { value } = e.target;
4901
+ handleFormChange('collectorNode.limitCPUm', value === '' ? null : Number(value));
4902
+ } }))));
4903
+ });
4904
+ CollectorNodeSettings.displayName = CollectorNodeSettings.name;
4873
4905
 
4874
- const CollectorGatewaySettings = ({ formData, handleFormChange }) => {
4875
- return (React.createElement(Card, null,
4906
+ const CollectorGatewaySettings = forwardRef(({ formData, handleFormChange }, ref) => {
4907
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.CollectorGateway },
4876
4908
  React.createElement(CardTitle, null, "Collector Gateway"),
4877
- React.createElement(Input, { title: 'Min. Replicas', tooltip: 'Minimum number of replicas for the collector gateway', type: 'number', value: formData.collectorGateway?.minReplicas?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.minReplicas', Number(e.target.value)) }),
4878
- React.createElement(Input, { title: 'Max. Replicas', tooltip: 'Maximum number of replicas for the collector gateway', type: 'number', value: formData.collectorGateway?.maxReplicas?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.maxReplicas', Number(e.target.value)) }),
4879
- React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector gateway in Megabytes', type: 'number', value: formData.collectorGateway?.requestMemoryMiB?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.requestMemoryMiB', Number(e.target.value)) }),
4880
- React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector gateway in Megabytes', type: 'number', value: formData.collectorGateway?.limitMemoryMiB?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.limitMemoryMiB', Number(e.target.value)) }),
4881
- React.createElement(Input, { title: 'Request CPU (Millicores)', tooltip: 'Request CPU for the collector gateway in Millicores', type: 'number', value: formData.collectorGateway?.requestCPUm?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.requestCPUm', Number(e.target.value)) }),
4882
- React.createElement(Input, { title: 'Limit CPU (Millicores)', tooltip: 'Limit CPU for the collector gateway in Millicores', type: 'number', value: formData.collectorGateway?.limitCPUm?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.limitCPUm', Number(e.target.value)) }),
4883
- React.createElement(Input, { title: 'Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector gateway in Megabytes', type: 'number', value: formData.collectorGateway?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.memoryLimiterLimitMiB', Number(e.target.value)) }),
4884
- React.createElement(Input, { title: 'Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector gateway in Megabytes', type: 'number', value: formData.collectorGateway?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.memoryLimiterSpikeLimitMiB', Number(e.target.value)) }),
4885
- React.createElement(Input, { title: 'Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector gateway in Megabytes', type: 'number', value: formData.collectorGateway?.goMemLimitMiB?.toString() || '', onChange: (e) => handleFormChange('collectorGateway.goMemLimitMiB', Number(e.target.value)) })));
4886
- };
4887
-
4888
- const UserInstrumentationEnvsSettings = ({ formData, handleFormChange }) => {
4889
- return (React.createElement(Card, null,
4890
- React.createElement(CardTitle, null, "User Instrumentation Environment Variables"),
4891
- INSTRUMENTATION_LANG_OPTIONS.map(({ id, value, icon }) => (React.createElement(Card, { key: `${id}-card` },
4892
- React.createElement(FlexRow, { "$gap": 8, "$alignItems": 'flex-start' },
4893
- React.createElement(FlexRow, { "$gap": 8 },
4894
- React.createElement(FlexRow, { "$gap": 8, style: { minWidth: '100px' } },
4895
- React.createElement(IconWrapped, { icon: icon }),
4896
- React.createElement(Text, { size: 14 }, value)),
4897
- React.createElement(Tooltip, { text: 'enable/disable user instrumentation for this language' },
4898
- React.createElement(Toggle, { initialValue: formData.userInstrumentationEnvs?.languages[id]?.enabled, onChange: (bool) => handleFormChange(`userInstrumentationEnvs.languages.${id}.enabled`, bool) }))),
4899
- React.createElement(KeyValueInputsList, { inputMaxWidth: 220, disabled: !formData.userInstrumentationEnvs?.languages[id]?.enabled, value: Object.entries(formData.userInstrumentationEnvs?.languages[id]?.env || {}).map(([k, v]) => ({
4900
- key: k,
4901
- value: v,
4902
- })), onChange: (rows) => {
4903
- handleFormChange(`userInstrumentationEnvs.languages.${id}.env`, rows.reduce((acc, { key, value }) => ({
4904
- ...acc,
4905
- [key]: value,
4906
- }), {}));
4907
- } })))))));
4908
- };
4909
+ React.createElement(RowOfFields, null,
4910
+ React.createElement(Input, { title: 'Autoscaler Min. Replicas', tooltip: 'Minimum number of replicas for the collector gateway', type: 'number', required: true, value: formData.collectorGateway?.minReplicas?.toString() || '', onChange: (e) => {
4911
+ const { value } = e.target;
4912
+ handleFormChange('collectorGateway.minReplicas', value === '' ? null : Number(value));
4913
+ } }),
4914
+ React.createElement(Input, { title: 'Autoscaler Max. Replicas', tooltip: 'Maximum number of replicas for the collector gateway', type: 'number', required: true, value: formData.collectorGateway?.maxReplicas?.toString() || '', onChange: (e) => {
4915
+ const { value } = e.target;
4916
+ handleFormChange('collectorGateway.maxReplicas', value === '' ? null : Number(value));
4917
+ } })),
4918
+ React.createElement(RowOfFields, null,
4919
+ React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4920
+ const { value } = e.target;
4921
+ handleFormChange('collectorGateway.requestMemoryMiB', value === '' ? null : Number(value));
4922
+ } }),
4923
+ React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4924
+ const { value } = e.target;
4925
+ handleFormChange('collectorGateway.limitMemoryMiB', value === '' ? null : Number(value));
4926
+ } })),
4927
+ React.createElement(RowOfFields, null,
4928
+ React.createElement(Input, { title: 'Request CPU (m)', tooltip: 'Request CPU for the collector gateway in Millicores', type: 'number', required: true, value: formData.collectorGateway?.requestCPUm?.toString() || '', onChange: (e) => {
4929
+ const { value } = e.target;
4930
+ handleFormChange('collectorGateway.requestCPUm', value === '' ? null : Number(value));
4931
+ } }),
4932
+ React.createElement(Input, { title: 'Limit CPU (m)', tooltip: 'Limit CPU for the collector gateway in Millicores', type: 'number', required: true, value: formData.collectorGateway?.limitCPUm?.toString() || '', onChange: (e) => {
4933
+ const { value } = e.target;
4934
+ handleFormChange('collectorGateway.limitCPUm', value === '' ? null : Number(value));
4935
+ } }))));
4936
+ });
4937
+ CollectorGatewaySettings.displayName = CollectorGatewaySettings.name;
4909
4938
 
4910
4939
  const DataContainer = styled.div `
4911
4940
  display: flex;
4912
4941
  flex-direction: column;
4913
4942
  gap: 12px;
4943
+ max-height: 100vh;
4944
+ overflow-y: auto;
4914
4945
  `;
4915
4946
  const DRAWER_WIDTH = '750px';
4916
4947
  const TITLE_TEXT = 'System Settings';
4917
- const SystemSettings = ({ fetchSettings, onSave }) => {
4948
+ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
4918
4949
  const [settings, setSettings] = useState(undefined);
4919
4950
  const { formData, handleFormChange, resetFormData, isFormDirty } = useGenericForm(settings);
4920
4951
  useEffect(() => {
@@ -4935,12 +4966,100 @@ const SystemSettings = ({ fetchSettings, onSave }) => {
4935
4966
  callback();
4936
4967
  }
4937
4968
  };
4969
+ const handleSave = async () => {
4970
+ setIsSaving(true);
4971
+ await onSave(formData);
4972
+ setSettings(await fetchSettings());
4973
+ setIsSaving(false);
4974
+ toggleOpen();
4975
+ };
4976
+ const [selectedTab, setSelectedTab] = useState(SettingsTabs.General);
4977
+ const scrollContainerRef = useRef(null);
4978
+ const generalRef = useRef(null);
4979
+ const uiRef = useRef(null);
4980
+ const rollbackRef = useRef(null);
4981
+ const collectorNodeRef = useRef(null);
4982
+ const collectorGatewayRef = useRef(null);
4983
+ const advancedRef = useRef(null);
4984
+ const refsArray = [generalRef, uiRef, rollbackRef, collectorNodeRef, collectorGatewayRef, advancedRef];
4985
+ const tabsArray = [SettingsTabs.General, SettingsTabs.Ui, SettingsTabs.Rollback, SettingsTabs.CollectorNode, SettingsTabs.CollectorGateway, SettingsTabs.Advanced];
4986
+ const scrollTo = (id) => {
4987
+ const scrollContainer = scrollContainerRef.current;
4988
+ if (!scrollContainer)
4989
+ return;
4990
+ let relativeTop = 0;
4991
+ for (let i = 0; i < refsArray.length; i++) {
4992
+ const curr = refsArray[i].current;
4993
+ if (curr && curr.id === id) {
4994
+ const containerRect = scrollContainer.getBoundingClientRect();
4995
+ const targetRect = curr.getBoundingClientRect();
4996
+ relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop - 20; // -20px offset for better visual spacing
4997
+ break;
4998
+ }
4999
+ }
5000
+ scrollContainer.scrollTo({
5001
+ top: id === SettingsTabs.General ? 0 : relativeTop,
5002
+ behavior: 'smooth',
5003
+ });
5004
+ };
5005
+ const onScroll = (e) => {
5006
+ const scrollContainer = scrollContainerRef.current;
5007
+ if (!scrollContainer)
5008
+ return;
5009
+ const scrollTop = e.currentTarget.scrollTop;
5010
+ for (let i = 0; i < refsArray.length; i++) {
5011
+ const curr = refsArray[i].current;
5012
+ if (curr) {
5013
+ const containerRect = scrollContainer.getBoundingClientRect();
5014
+ const targetRect = curr.getBoundingClientRect();
5015
+ const relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop;
5016
+ if (relativeTop <= scrollTop)
5017
+ setSelectedTab(tabsArray[i]);
5018
+ }
5019
+ }
5020
+ };
5021
+ const handleTabChange = (tab) => {
5022
+ setSelectedTab(tab);
5023
+ scrollTo(tab);
5024
+ };
4938
5025
  return (React.createElement(React.Fragment, null,
4939
5026
  React.createElement(IconButton, { key: TITLE_TEXT, onClick: toggleOpen, tooltip: TITLE_TEXT },
4940
5027
  React.createElement(GearIcon, { size: 18 })),
4941
5028
  React.createElement(Drawer, { width: DRAWER_WIDTH, isOpen: isOpen, onClose: () => handleWithCancelWarning(toggleOpen), header: {
4942
5029
  icons: [GearIcon],
4943
5030
  title: TITLE_TEXT,
5031
+ tabs: [
5032
+ {
5033
+ label: SettingsTabs.General,
5034
+ onClick: () => handleTabChange(SettingsTabs.General),
5035
+ selected: selectedTab === SettingsTabs.General,
5036
+ },
5037
+ {
5038
+ label: SettingsTabs.Ui,
5039
+ onClick: () => handleTabChange(SettingsTabs.Ui),
5040
+ selected: selectedTab === SettingsTabs.Ui,
5041
+ },
5042
+ {
5043
+ label: SettingsTabs.Rollback,
5044
+ onClick: () => handleTabChange(SettingsTabs.Rollback),
5045
+ selected: selectedTab === SettingsTabs.Rollback,
5046
+ },
5047
+ {
5048
+ label: SettingsTabs.CollectorNode,
5049
+ onClick: () => handleTabChange(SettingsTabs.CollectorNode),
5050
+ selected: selectedTab === SettingsTabs.CollectorNode,
5051
+ },
5052
+ {
5053
+ label: SettingsTabs.CollectorGateway,
5054
+ onClick: () => handleTabChange(SettingsTabs.CollectorGateway),
5055
+ selected: selectedTab === SettingsTabs.CollectorGateway,
5056
+ },
5057
+ {
5058
+ label: SettingsTabs.Advanced,
5059
+ onClick: () => handleTabChange(SettingsTabs.Advanced),
5060
+ selected: selectedTab === SettingsTabs.Advanced,
5061
+ },
5062
+ ],
4944
5063
  }, footer: {
4945
5064
  isOpen: isFormDirty,
4946
5065
  centerButtons: [
@@ -4953,22 +5072,18 @@ const SystemSettings = ({ fetchSettings, onSave }) => {
4953
5072
  {
4954
5073
  'data-id': 'drawer-save',
4955
5074
  variant: 'primary',
4956
- onClick: async () => {
4957
- setIsSaving(true);
4958
- await onSave(formData);
4959
- setSettings(await fetchSettings());
4960
- setIsSaving(false);
4961
- toggleOpen();
4962
- },
5075
+ onClick: handleSave,
4963
5076
  children: BUTTON_TEXTS.SAVE,
4964
5077
  },
4965
5078
  ],
4966
- } }, formData?.imagePrefix !== undefined && !isSaving ? (React.createElement(DataContainer, null,
4967
- React.createElement(UserInstrumentationEnvsSettings, { formData: formData, handleFormChange: handleFormChange }),
4968
- React.createElement(UiSettings, { formData: formData, handleFormChange: handleFormChange }),
4969
- React.createElement(CollectorNodeSettings, { formData: formData, handleFormChange: handleFormChange }),
4970
- React.createElement(CollectorGatewaySettings, { formData: formData, handleFormChange: handleFormChange }),
4971
- React.createElement(OtherSettings, { formData: formData, handleFormChange: handleFormChange }))) : (React.createElement(CenterThis, null,
5079
+ } }, formData?.imagePrefix !== undefined && !isSaving ? (React.createElement(DataContainer, { ref: scrollContainerRef, onScroll: onScroll },
5080
+ installationMethod === InstallationMethod.Helm && React.createElement(NotificationNote, { type: StatusType.Warning, title: 'Helm', message: "Changes won't persist unless you update the `values.yaml` file" }),
5081
+ React.createElement(GeneralSettings, { ref: generalRef, formData: formData, handleFormChange: handleFormChange }),
5082
+ React.createElement(UiSettings, { ref: uiRef, formData: formData, handleFormChange: handleFormChange }),
5083
+ React.createElement(RollbackSettings, { ref: rollbackRef, formData: formData, handleFormChange: handleFormChange }),
5084
+ React.createElement(CollectorNodeSettings, { ref: collectorNodeRef, formData: formData, handleFormChange: handleFormChange }),
5085
+ React.createElement(CollectorGatewaySettings, { ref: collectorGatewayRef, formData: formData, handleFormChange: handleFormChange }),
5086
+ React.createElement(AdvancedSettings, { ref: advancedRef, formData: formData, handleFormChange: handleFormChange }))) : (React.createElement(CenterThis, null,
4972
5087
  React.createElement(FadeLoader, { scale: 1.2 })))),
4973
5088
  React.createElement(CancelWarning, { isOpen: cancelWarningOpen, name: TITLE_TEXT, onApprove: () => {
4974
5089
  cancelApproveCallback?.();
@@ -34,6 +34,11 @@ export declare enum PlatformType {
34
34
  K8s = "k8s",
35
35
  Vm = "vm"
36
36
  }
37
+ export declare enum InstallationMethod {
38
+ Cli = "odigos-cli",
39
+ Helm = "helm",
40
+ Operator = "odigos-operator"
41
+ }
37
42
  export declare enum ProgrammingLanguages {
38
43
  Go = "go",
39
44
  JavaScript = "javascript",
@@ -1,23 +1,8 @@
1
1
  import { ProgrammingLanguages } from '..';
2
- export declare enum UiMode {
3
- Default = "default",
4
- ReadOnly = "readonly"
5
- }
6
- export declare enum Profile {
7
- CodeAttributes = "code-attributes",
8
- FullPayloadCollection = "full-payload-collection",
9
- DbPayloadCollection = "db-payload-collection",
10
- QueryOperationDetector = "query-operation-detector",
11
- AllowConcurrentAgents = "allow_concurrent_agents",
12
- JavaEbpfInstrumentations = "java-ebpf-instrumentations",
13
- JavaNativeInstrumentations = "java-native-instrumentations",
14
- SizeS = "size_s",
15
- SizeM = "size_m",
16
- SizeL = "size_l"
17
- }
18
2
  export declare enum MountMethod {
19
3
  VirtualDevice = "VirtualDevice",
20
- HostPath = "HostPath"
4
+ HostPath = "HostPath",
5
+ InitContainer = "InitContainer"
21
6
  }
22
7
  export declare enum AgentEnvVarsInjectionMethod {
23
8
  Loader = "loader",
@@ -59,31 +44,24 @@ export interface OidcConfiguration {
59
44
  clientSecret: string;
60
45
  }
61
46
  export interface OdigosConfig {
62
- telemetryEnabled: boolean;
63
- openshiftEnabled: boolean;
64
- karpenterEnabled: boolean;
65
- psp: boolean;
66
- allowConcurrentAgents: boolean;
67
- skipWebhookIssuerCreation: boolean;
68
- uiMode: UiMode;
69
- uiPaginationLimit: number;
70
- centralBackendURL: string;
71
- oidc?: OidcConfiguration;
72
- clusterName: string;
73
- imagePrefix: string;
74
- ignoredNamespaces: string[];
75
- ignoredContainers: string[];
76
- profiles: Profile[];
77
- mountMethod: MountMethod;
78
- agentEnvVarsInjectionMethod: AgentEnvVarsInjectionMethod;
79
- customContainerRuntimeSocketPath: string;
80
- odigletHealthProbeBindPort: number;
81
- rollbackDisabled: boolean;
82
- rollbackGraceTime: string;
83
- rollbackStabilityWindow: string;
84
- nodeSelector?: Record<string, string>;
85
- rollout?: RolloutConfiguration;
86
- collectorNode?: CollectorNode;
87
- collectorGateway?: CollectorGateway;
88
- userInstrumentationEnvs?: UserInstrumentationEnvs;
47
+ karpenterEnabled: boolean | null;
48
+ allowConcurrentAgents: boolean | null;
49
+ uiPaginationLimit: number | null;
50
+ centralBackendURL: string | null;
51
+ oidc: OidcConfiguration | null;
52
+ clusterName: string | null;
53
+ imagePrefix: string | null;
54
+ ignoredNamespaces: string[] | null;
55
+ ignoredContainers: string[] | null;
56
+ mountMethod: MountMethod | null;
57
+ agentEnvVarsInjectionMethod: AgentEnvVarsInjectionMethod | null;
58
+ customContainerRuntimeSocketPath: string | null;
59
+ odigletHealthProbeBindPort: number | null;
60
+ rollbackDisabled: boolean | null;
61
+ rollbackGraceTime: string | null;
62
+ rollbackStabilityWindow: string | null;
63
+ nodeSelector: Record<string, string> | null;
64
+ rollout: RolloutConfiguration | null;
65
+ collectorNode: CollectorNode | null;
66
+ collectorGateway: CollectorGateway | null;
89
67
  }
package/lib/types.js CHANGED
@@ -91,6 +91,12 @@ var PlatformType;
91
91
  PlatformType["K8s"] = "k8s";
92
92
  PlatformType["Vm"] = "vm";
93
93
  })(PlatformType || (PlatformType = {}));
94
+ var InstallationMethod;
95
+ (function (InstallationMethod) {
96
+ InstallationMethod["Cli"] = "odigos-cli";
97
+ InstallationMethod["Helm"] = "helm";
98
+ InstallationMethod["Operator"] = "odigos-operator";
99
+ })(InstallationMethod || (InstallationMethod = {}));
94
100
  var ProgrammingLanguages;
95
101
  (function (ProgrammingLanguages) {
96
102
  ProgrammingLanguages["Go"] = "go";
@@ -178,40 +184,11 @@ var SortDirection;
178
184
  SortDirection["Descending"] = "desc";
179
185
  })(SortDirection || (SortDirection = {}));
180
186
 
181
- var UiMode;
182
- (function (UiMode) {
183
- UiMode["Default"] = "default";
184
- UiMode["ReadOnly"] = "readonly";
185
- })(UiMode || (UiMode = {}));
186
- var Profile;
187
- (function (Profile) {
188
- // CategoryAttributes = 'category-attributes',
189
- Profile["CodeAttributes"] = "code-attributes";
190
- // CopyScope = 'copy-scope',
191
- // HostnameAsPodname = 'hostname-as-podname',
192
- Profile["FullPayloadCollection"] = "full-payload-collection";
193
- Profile["DbPayloadCollection"] = "db-payload-collection";
194
- Profile["QueryOperationDetector"] = "query-operation-detector";
195
- // Semconv = 'semconv',
196
- // ReduceSpanNameCardinality = 'reduce-span-name-cardinality',
197
- Profile["AllowConcurrentAgents"] = "allow_concurrent_agents";
198
- Profile["JavaEbpfInstrumentations"] = "java-ebpf-instrumentations";
199
- Profile["JavaNativeInstrumentations"] = "java-native-instrumentations";
200
- // LegacyDotnetInstrumentation = 'legacy-dotnet-instrumentation',
201
- // MountMethodK8sHostPath = 'mount-method-k8s-host-path',
202
- // MountMethodK8sVirtualDevice = 'mount-method-k8s-virtual-device',
203
- // PodManifestEnvVarInjection = 'pod-manifest-env-var-injection',
204
- // DisableGin = 'disable-gin',
205
- // SmallBatches = 'small-batches',
206
- Profile["SizeS"] = "size_s";
207
- Profile["SizeM"] = "size_m";
208
- Profile["SizeL"] = "size_l";
209
- })(Profile || (Profile = {}));
210
187
  var MountMethod;
211
188
  (function (MountMethod) {
212
189
  MountMethod["VirtualDevice"] = "VirtualDevice";
213
190
  MountMethod["HostPath"] = "HostPath";
214
- // InitContainer = 'InitContainer',
191
+ MountMethod["InitContainer"] = "InitContainer";
215
192
  })(MountMethod || (MountMethod = {}));
216
193
  var AgentEnvVarsInjectionMethod;
217
194
  (function (AgentEnvVarsInjectionMethod) {
@@ -363,4 +340,4 @@ var K8sResourceKind;
363
340
  K8sResourceKind["CronJob"] = "CronJob";
364
341
  })(K8sResourceKind || (K8sResourceKind = {}));
365
342
 
366
- export { ActionCategory, ActionKeyTypes, ActionType, AddNodeTypes, AgentEnvVarsInjectionMethod, BooleanOperation, CodeAttributesKeyTypes, Crud, CustomInstrumentationsKeyTypes, DestinationTypes, EdgeTypes, EntityTypes, FieldTypes, HeadersCollectionKeyTypes, InputTypes, InstrumentationRuleType, IntrumentationStatus, JsonOperation, K8sResourceKind, MountMethod, NodeTypes, NumberOperation, OtherEntityTypes, OtherStatus, PayloadCollectionKeyTypes, PlatformType, Profile, ProgrammingLanguages, SignalType, SortDirection, StatusType, StringOperation, Tier, UiMode };
343
+ export { ActionCategory, ActionKeyTypes, ActionType, AddNodeTypes, AgentEnvVarsInjectionMethod, BooleanOperation, CodeAttributesKeyTypes, Crud, CustomInstrumentationsKeyTypes, DestinationTypes, EdgeTypes, EntityTypes, FieldTypes, HeadersCollectionKeyTypes, InputTypes, InstallationMethod, InstrumentationRuleType, IntrumentationStatus, JsonOperation, K8sResourceKind, MountMethod, NodeTypes, NumberOperation, OtherEntityTypes, OtherStatus, PayloadCollectionKeyTypes, PlatformType, ProgrammingLanguages, SignalType, SortDirection, StatusType, StringOperation, Tier };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odigos/ui-kit",
3
- "version": "0.0.65",
3
+ "version": "0.0.67",
4
4
  "author": "Odigos",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,4 +0,0 @@
1
- import { type FC } from 'react';
2
- import type { SettingsProps } from './types';
3
- declare const OtherSettings: FC<SettingsProps>;
4
- export { OtherSettings };
@@ -1,4 +0,0 @@
1
- import { type FC } from 'react';
2
- import type { SettingsProps } from './types';
3
- declare const UserInstrumentationEnvsSettings: FC<SettingsProps>;
4
- export { UserInstrumentationEnvsSettings };