@datum-cloud/activity-ui 0.1.0
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/README.md +334 -0
- package/dist/api/client.d.ts +264 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/components/ActionMultiSelect.d.ts +25 -0
- package/dist/components/ActionMultiSelect.d.ts.map +1 -0
- package/dist/components/ActionToggle.d.ts +16 -0
- package/dist/components/ActionToggle.d.ts.map +1 -0
- package/dist/components/ActivityExpandedDetails.d.ts +21 -0
- package/dist/components/ActivityExpandedDetails.d.ts.map +1 -0
- package/dist/components/ActivityFeed.d.ts +60 -0
- package/dist/components/ActivityFeed.d.ts.map +1 -0
- package/dist/components/ActivityFeedFilters.d.ts +26 -0
- package/dist/components/ActivityFeedFilters.d.ts.map +1 -0
- package/dist/components/ActivityFeedItem.d.ts +39 -0
- package/dist/components/ActivityFeedItem.d.ts.map +1 -0
- package/dist/components/ActivityFeedItemSkeleton.d.ts +11 -0
- package/dist/components/ActivityFeedItemSkeleton.d.ts.map +1 -0
- package/dist/components/ActivityFeedSummary.d.ts +23 -0
- package/dist/components/ActivityFeedSummary.d.ts.map +1 -0
- package/dist/components/ApiErrorAlert.d.ts +10 -0
- package/dist/components/ApiErrorAlert.d.ts.map +1 -0
- package/dist/components/AuditEventViewer.d.ts +14 -0
- package/dist/components/AuditEventViewer.d.ts.map +1 -0
- package/dist/components/AuditLogExpandedDetails.d.ts +20 -0
- package/dist/components/AuditLogExpandedDetails.d.ts.map +1 -0
- package/dist/components/AuditLogFeedItem.d.ts +22 -0
- package/dist/components/AuditLogFeedItem.d.ts.map +1 -0
- package/dist/components/AuditLogFilters.d.ts +50 -0
- package/dist/components/AuditLogFilters.d.ts.map +1 -0
- package/dist/components/AuditLogQueryComponent.d.ts +18 -0
- package/dist/components/AuditLogQueryComponent.d.ts.map +1 -0
- package/dist/components/CelEditor.d.ts +31 -0
- package/dist/components/CelEditor.d.ts.map +1 -0
- package/dist/components/ChangeSourceToggle.d.ts +17 -0
- package/dist/components/ChangeSourceToggle.d.ts.map +1 -0
- package/dist/components/DateTimeRangePicker.d.ts +15 -0
- package/dist/components/DateTimeRangePicker.d.ts.map +1 -0
- package/dist/components/EventExpandedDetails.d.ts +17 -0
- package/dist/components/EventExpandedDetails.d.ts.map +1 -0
- package/dist/components/EventFeedItem.d.ts +29 -0
- package/dist/components/EventFeedItem.d.ts.map +1 -0
- package/dist/components/EventFeedItemSkeleton.d.ts +11 -0
- package/dist/components/EventFeedItemSkeleton.d.ts.map +1 -0
- package/dist/components/EventTypeToggle.d.ts +17 -0
- package/dist/components/EventTypeToggle.d.ts.map +1 -0
- package/dist/components/EventsFeed.d.ts +51 -0
- package/dist/components/EventsFeed.d.ts.map +1 -0
- package/dist/components/EventsFeedFilters.d.ts +28 -0
- package/dist/components/EventsFeedFilters.d.ts.map +1 -0
- package/dist/components/FilterBuilder.d.ts +12 -0
- package/dist/components/FilterBuilder.d.ts.map +1 -0
- package/dist/components/FilterBuilderWithAutocomplete.d.ts +12 -0
- package/dist/components/FilterBuilderWithAutocomplete.d.ts.map +1 -0
- package/dist/components/PolicyActivityView.d.ts +25 -0
- package/dist/components/PolicyActivityView.d.ts.map +1 -0
- package/dist/components/PolicyActivityViewSkeleton.d.ts +9 -0
- package/dist/components/PolicyActivityViewSkeleton.d.ts.map +1 -0
- package/dist/components/PolicyDetailView.d.ts +22 -0
- package/dist/components/PolicyDetailView.d.ts.map +1 -0
- package/dist/components/PolicyEditView.d.ts +22 -0
- package/dist/components/PolicyEditView.d.ts.map +1 -0
- package/dist/components/PolicyEditor.d.ts +24 -0
- package/dist/components/PolicyEditor.d.ts.map +1 -0
- package/dist/components/PolicyList.d.ts +23 -0
- package/dist/components/PolicyList.d.ts.map +1 -0
- package/dist/components/PolicyPreviewPanel.d.ts +23 -0
- package/dist/components/PolicyPreviewPanel.d.ts.map +1 -0
- package/dist/components/PolicyPreviewResult.d.ts +17 -0
- package/dist/components/PolicyPreviewResult.d.ts.map +1 -0
- package/dist/components/PolicyResourceForm.d.ts +19 -0
- package/dist/components/PolicyResourceForm.d.ts.map +1 -0
- package/dist/components/PolicyRuleEditor.d.ts +22 -0
- package/dist/components/PolicyRuleEditor.d.ts.map +1 -0
- package/dist/components/PolicyRuleEditorDialog.d.ts +30 -0
- package/dist/components/PolicyRuleEditorDialog.d.ts.map +1 -0
- package/dist/components/PolicyRuleList.d.ts +26 -0
- package/dist/components/PolicyRuleList.d.ts.map +1 -0
- package/dist/components/PolicyRuleListItem.d.ts +29 -0
- package/dist/components/PolicyRuleListItem.d.ts.map +1 -0
- package/dist/components/ReindexJobCreate.d.ts +21 -0
- package/dist/components/ReindexJobCreate.d.ts.map +1 -0
- package/dist/components/ReindexJobDetailView.d.ts +21 -0
- package/dist/components/ReindexJobDetailView.d.ts.map +1 -0
- package/dist/components/ReindexJobDialog.d.ts +21 -0
- package/dist/components/ReindexJobDialog.d.ts.map +1 -0
- package/dist/components/ReindexJobList.d.ts +21 -0
- package/dist/components/ReindexJobList.d.ts.map +1 -0
- package/dist/components/ResourceHistoryView.d.ts +54 -0
- package/dist/components/ResourceHistoryView.d.ts.map +1 -0
- package/dist/components/RulePreviewPanel.d.ts +23 -0
- package/dist/components/RulePreviewPanel.d.ts.map +1 -0
- package/dist/components/SampleInputTemplates.d.ts +26 -0
- package/dist/components/SampleInputTemplates.d.ts.map +1 -0
- package/dist/components/SimpleQueryBuilder.d.ts +12 -0
- package/dist/components/SimpleQueryBuilder.d.ts.map +1 -0
- package/dist/components/TenantBadge.d.ts +17 -0
- package/dist/components/TenantBadge.d.ts.map +1 -0
- package/dist/components/UserSelect.d.ts +24 -0
- package/dist/components/UserSelect.d.ts.map +1 -0
- package/dist/components/VerbToggle.d.ts +16 -0
- package/dist/components/VerbToggle.d.ts.map +1 -0
- package/dist/components/ui/add-filter-dropdown.d.ts +26 -0
- package/dist/components/ui/add-filter-dropdown.d.ts.map +1 -0
- package/dist/components/ui/alert.d.ts +9 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/card.d.ts +9 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/combobox.d.ts +27 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +20 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/filter-chip.d.ts +37 -0
- package/dist/components/ui/filter-chip.d.ts.map +1 -0
- package/dist/components/ui/input.d.ts +6 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/label.d.ts +8 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/multi-combobox.d.ts +24 -0
- package/dist/components/ui/multi-combobox.d.ts.map +1 -0
- package/dist/components/ui/select.d.ts +14 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/sheet.d.ts +23 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/time-range-dropdown.d.ts +29 -0
- package/dist/components/ui/time-range-dropdown.d.ts.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/hooks/useActivityFeed.d.ts +101 -0
- package/dist/hooks/useActivityFeed.d.ts.map +1 -0
- package/dist/hooks/useAuditLogFacets.d.ts +33 -0
- package/dist/hooks/useAuditLogFacets.d.ts.map +1 -0
- package/dist/hooks/useAuditLogQuery.d.ts +21 -0
- package/dist/hooks/useAuditLogQuery.d.ts.map +1 -0
- package/dist/hooks/useEventFacets.d.ts +30 -0
- package/dist/hooks/useEventFacets.d.ts.map +1 -0
- package/dist/hooks/useEventsFeed.d.ts +93 -0
- package/dist/hooks/useEventsFeed.d.ts.map +1 -0
- package/dist/hooks/useFacets.d.ts +29 -0
- package/dist/hooks/useFacets.d.ts.map +1 -0
- package/dist/hooks/usePolicyEditor.d.ts +71 -0
- package/dist/hooks/usePolicyEditor.d.ts.map +1 -0
- package/dist/hooks/usePolicyList.d.ts +35 -0
- package/dist/hooks/usePolicyList.d.ts.map +1 -0
- package/dist/hooks/usePolicyPreview.d.ts +72 -0
- package/dist/hooks/usePolicyPreview.d.ts.map +1 -0
- package/dist/hooks/useReindexJobs.d.ts +37 -0
- package/dist/hooks/useReindexJobs.d.ts.map +1 -0
- package/dist/index.d.ts +150 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +16224 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +16377 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +50 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/extractFieldPaths.d.ts +33 -0
- package/dist/lib/extractFieldPaths.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/types/activity.d.ts +366 -0
- package/dist/types/activity.d.ts.map +1 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/k8s-event.d.ts +224 -0
- package/dist/types/k8s-event.d.ts.map +1 -0
- package/dist/types/policy.d.ts +333 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/reindex.d.ts +102 -0
- package/dist/types/reindex.d.ts.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Activity, ChangeSource, EffectiveTimeRange } from '../types/activity';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
/**
|
|
4
|
+
* Filter options for the activity feed
|
|
5
|
+
*/
|
|
6
|
+
export interface ActivityFeedFilters {
|
|
7
|
+
/** Filter by change source (human/system/all) */
|
|
8
|
+
changeSource?: ChangeSource | 'all';
|
|
9
|
+
/** Full-text search on summaries */
|
|
10
|
+
search?: string;
|
|
11
|
+
/** Filter to a specific resource UID */
|
|
12
|
+
resourceUid?: string;
|
|
13
|
+
/** Filter by resource kinds (multi-select) */
|
|
14
|
+
resourceKinds?: string[];
|
|
15
|
+
/** Filter by actor names (multi-select) */
|
|
16
|
+
actorNames?: string[];
|
|
17
|
+
/** Filter by API groups (multi-select) */
|
|
18
|
+
apiGroups?: string[];
|
|
19
|
+
/** Filter by resource name (partial match) */
|
|
20
|
+
resourceName?: string;
|
|
21
|
+
/** Filter by resource namespaces (multi-select) */
|
|
22
|
+
resourceNamespaces?: string[];
|
|
23
|
+
/** Filter by actions (multi-select) - prepared for future backend support */
|
|
24
|
+
actions?: string[];
|
|
25
|
+
/** Custom CEL filter expression */
|
|
26
|
+
customFilter?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Time range for the activity feed
|
|
30
|
+
*/
|
|
31
|
+
export interface TimeRange {
|
|
32
|
+
/** Start of time range (RFC3339 or relative like "now-24h") */
|
|
33
|
+
start: string;
|
|
34
|
+
/** End of time range (RFC3339 or relative, default: now) */
|
|
35
|
+
end?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for the useActivityFeed hook
|
|
39
|
+
*/
|
|
40
|
+
export interface UseActivityFeedOptions {
|
|
41
|
+
/** API client instance */
|
|
42
|
+
client: ActivityApiClient;
|
|
43
|
+
/** Initial filter settings */
|
|
44
|
+
initialFilters?: ActivityFeedFilters;
|
|
45
|
+
/** Initial time range */
|
|
46
|
+
initialTimeRange?: TimeRange;
|
|
47
|
+
/** Number of items per page (default: 30) */
|
|
48
|
+
pageSize?: number;
|
|
49
|
+
/** Enable real-time streaming (default: false) */
|
|
50
|
+
enableStreaming?: boolean;
|
|
51
|
+
/** Auto-start streaming when enabled (default: true) */
|
|
52
|
+
autoStartStreaming?: boolean;
|
|
53
|
+
/** Callback invoked when the effective time range is resolved */
|
|
54
|
+
onEffectiveTimeRangeChange?: (timeRange: EffectiveTimeRange) => void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Result returned by the useActivityFeed hook
|
|
58
|
+
*/
|
|
59
|
+
export interface UseActivityFeedResult {
|
|
60
|
+
/** List of activities */
|
|
61
|
+
activities: Activity[];
|
|
62
|
+
/** Whether the feed is loading */
|
|
63
|
+
isLoading: boolean;
|
|
64
|
+
/** Error if any occurred */
|
|
65
|
+
error: Error | null;
|
|
66
|
+
/** Watch stream error if any occurred */
|
|
67
|
+
watchError: Error | null;
|
|
68
|
+
/** Whether there are more activities to load */
|
|
69
|
+
hasMore: boolean;
|
|
70
|
+
/** Current filter settings */
|
|
71
|
+
filters: ActivityFeedFilters;
|
|
72
|
+
/** Current time range */
|
|
73
|
+
timeRange: TimeRange;
|
|
74
|
+
/** Execute/refresh the feed query */
|
|
75
|
+
refresh: () => Promise<void>;
|
|
76
|
+
/** Load more activities (pagination) */
|
|
77
|
+
loadMore: () => Promise<void>;
|
|
78
|
+
/** Update filter settings */
|
|
79
|
+
setFilters: (filters: ActivityFeedFilters) => void;
|
|
80
|
+
/** Update time range */
|
|
81
|
+
setTimeRange: (timeRange: TimeRange) => void;
|
|
82
|
+
/** Reset to initial state */
|
|
83
|
+
reset: () => void;
|
|
84
|
+
/** Total count if available */
|
|
85
|
+
totalCount?: number;
|
|
86
|
+
/** Whether streaming is currently active */
|
|
87
|
+
isStreaming: boolean;
|
|
88
|
+
/** Start streaming (when enableStreaming is true) */
|
|
89
|
+
startStreaming: () => void;
|
|
90
|
+
/** Stop streaming */
|
|
91
|
+
stopStreaming: () => void;
|
|
92
|
+
/** Number of new activities received via streaming since last refresh */
|
|
93
|
+
newActivitiesCount: number;
|
|
94
|
+
/** Effective time range after query resolution (undefined until first query completes) */
|
|
95
|
+
effectiveTimeRange?: EffectiveTimeRange;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* React hook for fetching and managing the activity feed with optional real-time streaming
|
|
99
|
+
*/
|
|
100
|
+
export declare function useActivityFeed({ client, initialFilters, initialTimeRange, pageSize, enableStreaming, autoStartStreaming, onEffectiveTimeRangeChange, }: UseActivityFeedOptions): UseActivityFeedResult;
|
|
101
|
+
//# sourceMappingURL=useActivityFeed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActivityFeed.d.ts","sourceRoot":"","sources":["../../src/hooks/useActivityFeed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ActivityApiClient } from '../api/client';
|
|
2
|
+
import type { FacetValue } from '../types/activity';
|
|
3
|
+
/**
|
|
4
|
+
* Time range for facet queries
|
|
5
|
+
*/
|
|
6
|
+
export interface AuditLogTimeRange {
|
|
7
|
+
start: string;
|
|
8
|
+
end: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Result returned by the useAuditLogFacets hook
|
|
12
|
+
*/
|
|
13
|
+
export interface UseAuditLogFacetsResult {
|
|
14
|
+
/** Distinct verbs (actions) with counts */
|
|
15
|
+
verbs: FacetValue[];
|
|
16
|
+
/** Distinct resource types with counts */
|
|
17
|
+
resources: FacetValue[];
|
|
18
|
+
/** Distinct namespaces with counts */
|
|
19
|
+
namespaces: FacetValue[];
|
|
20
|
+
/** Distinct usernames with counts */
|
|
21
|
+
usernames: FacetValue[];
|
|
22
|
+
/** Whether facets are loading */
|
|
23
|
+
isLoading: boolean;
|
|
24
|
+
/** Error if any occurred */
|
|
25
|
+
error: Error | null;
|
|
26
|
+
/** Manually refresh facets */
|
|
27
|
+
refresh: () => Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook to fetch audit log facets for filter dropdowns
|
|
31
|
+
*/
|
|
32
|
+
export declare function useAuditLogFacets(client: ActivityApiClient, timeRange: AuditLogTimeRange | null): UseAuditLogFacetsResult;
|
|
33
|
+
//# sourceMappingURL=useAuditLogFacets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuditLogFacets.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuditLogFacets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,0CAA0C;IAC1C,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,sCAAsC;IACtC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,qCAAqC;IACrC,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,iCAAiC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,iBAAiB,GAAG,IAAI,GAClC,uBAAuB,CAqFzB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AuditLogQuery, AuditLogQuerySpec, Event } from '../types';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
export interface UseAuditLogQueryOptions {
|
|
4
|
+
client: ActivityApiClient;
|
|
5
|
+
autoExecute?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface UseAuditLogQueryResult {
|
|
8
|
+
query: AuditLogQuery | null;
|
|
9
|
+
events: Event[];
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
error: Error | null;
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
executeQuery: (spec: AuditLogQuerySpec) => Promise<void>;
|
|
14
|
+
loadMore: () => Promise<void>;
|
|
15
|
+
reset: () => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* React hook for executing audit log queries
|
|
19
|
+
*/
|
|
20
|
+
export declare function useAuditLogQuery({ client, autoExecute, }: UseAuditLogQueryOptions): UseAuditLogQueryResult;
|
|
21
|
+
//# sourceMappingURL=useAuditLogQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuditLogQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuditLogQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,WAAmB,GACpB,EAAE,uBAAuB,GAAG,sBAAsB,CAwGlD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ActivityApiClient } from '../api/client';
|
|
2
|
+
import type { FacetValue } from '../types/activity';
|
|
3
|
+
import type { TimeRange, EventsFeedFilters } from './useEventsFeed';
|
|
4
|
+
/**
|
|
5
|
+
* Result returned by the useEventFacets hook
|
|
6
|
+
*/
|
|
7
|
+
export interface UseEventFacetsResult {
|
|
8
|
+
/** Distinct involved object kinds with counts */
|
|
9
|
+
involvedKinds: FacetValue[];
|
|
10
|
+
/** Distinct event reasons with counts */
|
|
11
|
+
reasons: FacetValue[];
|
|
12
|
+
/** Distinct event types with counts */
|
|
13
|
+
eventTypes: FacetValue[];
|
|
14
|
+
/** Distinct source components with counts */
|
|
15
|
+
sourceComponents: FacetValue[];
|
|
16
|
+
/** Distinct namespaces with counts */
|
|
17
|
+
namespaces: FacetValue[];
|
|
18
|
+
/** Whether facets are loading */
|
|
19
|
+
isLoading: boolean;
|
|
20
|
+
/** Error if any occurred */
|
|
21
|
+
error: Error | null;
|
|
22
|
+
/** Manually refresh facets */
|
|
23
|
+
refresh: () => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Hook to fetch Kubernetes event facets for filter dropdowns.
|
|
27
|
+
* Results are cached based on time range to avoid redundant fetches.
|
|
28
|
+
*/
|
|
29
|
+
export declare function useEventFacets(client: ActivityApiClient, timeRange: TimeRange, _filters?: EventsFeedFilters): UseEventFacetsResult;
|
|
30
|
+
//# sourceMappingURL=useEventFacets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEventFacets.d.ts","sourceRoot":"","sources":["../../src/hooks/useEventFacets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,yCAAyC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,uCAAuC;IACvC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,6CAA6C;IAC7C,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,sCAAsC;IACtC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,iCAAiC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,SAAS,EAEpB,QAAQ,GAAE,iBAAsB,GAC/B,oBAAoB,CA4FtB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { K8sEvent, K8sEventType } from '../types/k8s-event';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
/**
|
|
4
|
+
* Filter options for the events feed
|
|
5
|
+
*/
|
|
6
|
+
export interface EventsFeedFilters {
|
|
7
|
+
/** Filter by event type (Normal/Warning/all) */
|
|
8
|
+
eventType?: K8sEventType | 'all';
|
|
9
|
+
/** Filter by namespaces (multi-select) */
|
|
10
|
+
namespaces?: string[];
|
|
11
|
+
/** Filter by involved object API group (multi-select) */
|
|
12
|
+
involvedApiGroups?: string[];
|
|
13
|
+
/** Filter by involved object kind (multi-select) */
|
|
14
|
+
involvedKinds?: string[];
|
|
15
|
+
/** Filter by involved object name */
|
|
16
|
+
involvedName?: string;
|
|
17
|
+
/** Filter by event reasons (multi-select) */
|
|
18
|
+
reasons?: string[];
|
|
19
|
+
/** Filter by source components (multi-select) */
|
|
20
|
+
sourceComponents?: string[];
|
|
21
|
+
/** Full-text search on event messages */
|
|
22
|
+
search?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Time range for the events feed
|
|
26
|
+
*/
|
|
27
|
+
export interface TimeRange {
|
|
28
|
+
/** Start of time range (RFC3339 or relative like "now-24h") */
|
|
29
|
+
start: string;
|
|
30
|
+
/** End of time range (RFC3339 or relative, default: now) */
|
|
31
|
+
end?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Options for the useEventsFeed hook
|
|
35
|
+
*/
|
|
36
|
+
export interface UseEventsFeedOptions {
|
|
37
|
+
/** API client instance */
|
|
38
|
+
client: ActivityApiClient;
|
|
39
|
+
/** Initial filter settings */
|
|
40
|
+
initialFilters?: EventsFeedFilters;
|
|
41
|
+
/** Initial time range */
|
|
42
|
+
initialTimeRange?: TimeRange;
|
|
43
|
+
/** Number of items per page (default: 50) */
|
|
44
|
+
pageSize?: number;
|
|
45
|
+
/** Namespace to filter events (optional) */
|
|
46
|
+
namespace?: string;
|
|
47
|
+
/** Enable real-time streaming (default: false) */
|
|
48
|
+
enableStreaming?: boolean;
|
|
49
|
+
/** Auto-start streaming when enabled (default: true) */
|
|
50
|
+
autoStartStreaming?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result returned by the useEventsFeed hook
|
|
54
|
+
*/
|
|
55
|
+
export interface UseEventsFeedResult {
|
|
56
|
+
/** List of events */
|
|
57
|
+
events: K8sEvent[];
|
|
58
|
+
/** Whether the feed is loading */
|
|
59
|
+
isLoading: boolean;
|
|
60
|
+
/** Whether a filter/time change is pending (shows during debounce period) */
|
|
61
|
+
isRefreshing: boolean;
|
|
62
|
+
/** Error if any occurred */
|
|
63
|
+
error: Error | null;
|
|
64
|
+
/** Whether there are more events to load */
|
|
65
|
+
hasMore: boolean;
|
|
66
|
+
/** Current filter settings */
|
|
67
|
+
filters: EventsFeedFilters;
|
|
68
|
+
/** Current time range */
|
|
69
|
+
timeRange: TimeRange;
|
|
70
|
+
/** Execute/refresh the feed query */
|
|
71
|
+
refresh: () => Promise<void>;
|
|
72
|
+
/** Load more events (pagination) */
|
|
73
|
+
loadMore: () => Promise<void>;
|
|
74
|
+
/** Update filter settings */
|
|
75
|
+
setFilters: (filters: EventsFeedFilters) => void;
|
|
76
|
+
/** Update time range */
|
|
77
|
+
setTimeRange: (timeRange: TimeRange) => void;
|
|
78
|
+
/** Reset to initial state */
|
|
79
|
+
reset: () => void;
|
|
80
|
+
/** Whether streaming is currently active */
|
|
81
|
+
isStreaming: boolean;
|
|
82
|
+
/** Start streaming (when enableStreaming is true) */
|
|
83
|
+
startStreaming: () => void;
|
|
84
|
+
/** Stop streaming */
|
|
85
|
+
stopStreaming: () => void;
|
|
86
|
+
/** Number of new events received via streaming since last refresh */
|
|
87
|
+
newEventsCount: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* React hook for fetching and managing the Kubernetes events feed
|
|
91
|
+
*/
|
|
92
|
+
export declare function useEventsFeed({ client, initialFilters, initialTimeRange, pageSize, namespace, enableStreaming, autoStartStreaming, }: UseEventsFeedOptions): UseEventsFeedResult;
|
|
93
|
+
//# sourceMappingURL=useEventsFeed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEventsFeed.d.ts","sourceRoot":"","sources":["../../src/hooks/useEventsFeed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAKlD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,SAAS,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;IACjC,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,8BAA8B;IAC9B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB;IACrB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,YAAY,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,yBAAyB;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,qCAAqC;IACrC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,6BAA6B;IAC7B,UAAU,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,wBAAwB;IACxB,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAC7C,6BAA6B;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,qBAAqB;IACrB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;CACxB;AAuHD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,cAAmB,EACnB,gBAAuC,EACvC,QAAa,EACb,SAAS,EACT,eAAuB,EACvB,kBAAyB,GAC1B,EAAE,oBAAoB,GAAG,mBAAmB,CAuX5C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ActivityApiClient } from '../api/client';
|
|
2
|
+
import type { FacetValue } from '../types/activity';
|
|
3
|
+
import type { TimeRange, ActivityFeedFilters } from './useActivityFeed';
|
|
4
|
+
/**
|
|
5
|
+
* Result returned by the useFacets hook
|
|
6
|
+
*/
|
|
7
|
+
export interface UseFacetsResult {
|
|
8
|
+
/** Distinct resource kinds with counts */
|
|
9
|
+
resourceKinds: FacetValue[];
|
|
10
|
+
/** Distinct actor names with counts */
|
|
11
|
+
actorNames: FacetValue[];
|
|
12
|
+
/** Distinct API groups with counts */
|
|
13
|
+
apiGroups: FacetValue[];
|
|
14
|
+
/** Distinct resource namespaces with counts */
|
|
15
|
+
resourceNamespaces: FacetValue[];
|
|
16
|
+
/** Whether facets are loading */
|
|
17
|
+
isLoading: boolean;
|
|
18
|
+
/** Error if any occurred */
|
|
19
|
+
error: Error | null;
|
|
20
|
+
/** Manually refresh facets */
|
|
21
|
+
refresh: () => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Hook to fetch activity facets for filter dropdowns.
|
|
25
|
+
* When filters are provided, facet results are narrowed to show only
|
|
26
|
+
* values relevant to the current filter selection.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useFacets(client: ActivityApiClient, timeRange: TimeRange, filters?: ActivityFeedFilters): UseFacetsResult;
|
|
29
|
+
//# sourceMappingURL=useFacets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFacets.d.ts","sourceRoot":"","sources":["../../src/hooks/useFacets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA0ExE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,uCAAuC;IACvC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,sCAAsC;IACtC,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,+CAA+C;IAC/C,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,iCAAiC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,mBAAwB,GAChC,eAAe,CAuFjB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ActivityPolicy, ActivityPolicySpec, ActivityPolicyRule, ActivityPolicyResource } from '../types/policy';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
/**
|
|
4
|
+
* Options for the usePolicyEditor hook
|
|
5
|
+
*/
|
|
6
|
+
export interface UsePolicyEditorOptions {
|
|
7
|
+
/** API client instance */
|
|
8
|
+
client: ActivityApiClient;
|
|
9
|
+
/** Initial policy name for editing (undefined for new policy) */
|
|
10
|
+
initialPolicyName?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Result returned by the usePolicyEditor hook
|
|
14
|
+
*/
|
|
15
|
+
export interface UsePolicyEditorResult {
|
|
16
|
+
/** The original policy being edited (null for new policy) */
|
|
17
|
+
policy: ActivityPolicy | null;
|
|
18
|
+
/** Current editable spec state */
|
|
19
|
+
spec: ActivityPolicySpec;
|
|
20
|
+
/** Policy name (editable for new policies) */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Whether there are unsaved changes */
|
|
23
|
+
isDirty: boolean;
|
|
24
|
+
/** Whether the editor is loading */
|
|
25
|
+
isLoading: boolean;
|
|
26
|
+
/** Whether a save is in progress */
|
|
27
|
+
isSaving: boolean;
|
|
28
|
+
/** Error if any occurred */
|
|
29
|
+
error: Error | null;
|
|
30
|
+
/** Whether this is a new policy (not yet created) */
|
|
31
|
+
isNew: boolean;
|
|
32
|
+
/** Update the policy name (only for new policies) */
|
|
33
|
+
setName: (name: string) => void;
|
|
34
|
+
/** Update the entire spec */
|
|
35
|
+
setSpec: (spec: ActivityPolicySpec) => void;
|
|
36
|
+
/** Update the resource section */
|
|
37
|
+
setResource: (resource: ActivityPolicyResource) => void;
|
|
38
|
+
/** Update audit rules */
|
|
39
|
+
setAuditRules: (rules: ActivityPolicyRule[]) => void;
|
|
40
|
+
/** Update event rules */
|
|
41
|
+
setEventRules: (rules: ActivityPolicyRule[]) => void;
|
|
42
|
+
/** Add a new audit rule */
|
|
43
|
+
addAuditRule: () => void;
|
|
44
|
+
/** Add a new event rule */
|
|
45
|
+
addEventRule: () => void;
|
|
46
|
+
/** Update a specific audit rule */
|
|
47
|
+
updateAuditRule: (index: number, rule: ActivityPolicyRule) => void;
|
|
48
|
+
/** Update a specific event rule */
|
|
49
|
+
updateEventRule: (index: number, rule: ActivityPolicyRule) => void;
|
|
50
|
+
/** Remove an audit rule */
|
|
51
|
+
removeAuditRule: (index: number) => void;
|
|
52
|
+
/** Remove an event rule */
|
|
53
|
+
removeEventRule: (index: number) => void;
|
|
54
|
+
/** Update a rule by name */
|
|
55
|
+
updateRuleByName: (ruleType: 'audit' | 'event', name: string, updates: Partial<ActivityPolicyRule>) => void;
|
|
56
|
+
/** Remove a rule by name */
|
|
57
|
+
removeRuleByName: (ruleType: 'audit' | 'event', name: string) => void;
|
|
58
|
+
/** Save the policy (create or update) */
|
|
59
|
+
save: (dryRun?: boolean) => Promise<ActivityPolicy>;
|
|
60
|
+
/** Load an existing policy by name */
|
|
61
|
+
load: (name: string) => Promise<void>;
|
|
62
|
+
/** Reset to last saved state (or initial state for new policy) */
|
|
63
|
+
reset: () => void;
|
|
64
|
+
/** Clear all state and start with a new policy */
|
|
65
|
+
clear: () => void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* React hook for editing an ActivityPolicy
|
|
69
|
+
*/
|
|
70
|
+
export declare function usePolicyEditor({ client, initialPolicyName, }: UsePolicyEditorOptions): UsePolicyEditorResult;
|
|
71
|
+
//# sourceMappingURL=usePolicyEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePolicyEditor.d.ts","sourceRoot":"","sources":["../../src/hooks/usePolicyEditor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,kCAAkC;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,6BAA6B;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,kCAAkC;IAClC,WAAW,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACxD,yBAAyB;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACrD,yBAAyB;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACrD,2BAA2B;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,mCAAmC;IACnC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnE,mCAAmC;IACnC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnE,2BAA2B;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,2BAA2B;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC;IAC5G,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,yCAAyC;IACzC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,sCAAsC;IACtC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,kEAAkE;IAClE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,kDAAkD;IAClD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAqDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GAClB,EAAE,sBAAsB,GAAG,qBAAqB,CA+PhD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ActivityPolicy, PolicyGroup } from '../types/policy';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
/**
|
|
4
|
+
* Options for the usePolicyList hook
|
|
5
|
+
*/
|
|
6
|
+
export interface UsePolicyListOptions {
|
|
7
|
+
/** API client instance */
|
|
8
|
+
client: ActivityApiClient;
|
|
9
|
+
/** Whether to group policies by API group (default: true) */
|
|
10
|
+
groupByApiGroup?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Result returned by the usePolicyList hook
|
|
14
|
+
*/
|
|
15
|
+
export interface UsePolicyListResult {
|
|
16
|
+
/** List of all policies */
|
|
17
|
+
policies: ActivityPolicy[];
|
|
18
|
+
/** Policies grouped by API group */
|
|
19
|
+
groups: PolicyGroup[];
|
|
20
|
+
/** Whether the list is loading */
|
|
21
|
+
isLoading: boolean;
|
|
22
|
+
/** Error if any occurred */
|
|
23
|
+
error: Error | null;
|
|
24
|
+
/** Reload the policy list */
|
|
25
|
+
refresh: () => Promise<void>;
|
|
26
|
+
/** Delete a policy by name */
|
|
27
|
+
deletePolicy: (name: string) => Promise<void>;
|
|
28
|
+
/** Whether a delete is in progress */
|
|
29
|
+
isDeleting: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* React hook for managing the policy list
|
|
33
|
+
*/
|
|
34
|
+
export declare function usePolicyList({ client, groupByApiGroup, }: UsePolicyListOptions): UsePolicyListResult;
|
|
35
|
+
//# sourceMappingURL=usePolicyList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePolicyList.d.ts","sourceRoot":"","sources":["../../src/hooks/usePolicyList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,oCAAoC;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,8BAA8B;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,sCAAsC;IACtC,UAAU,EAAE,OAAO,CAAC;CACrB;AA+BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,eAAsB,GACvB,EAAE,oBAAoB,GAAG,mBAAmB,CA0D5C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { PolicyPreviewInput, PolicyPreviewStatus, PolicyPreviewPolicySpec, PolicyPreviewInputType, KubernetesEvent, AutoFetchSpec } from '../types/policy';
|
|
2
|
+
import type { Event } from '../types';
|
|
3
|
+
import { ActivityApiClient } from '../api/client';
|
|
4
|
+
/**
|
|
5
|
+
* Options for the usePolicyPreview hook
|
|
6
|
+
*/
|
|
7
|
+
export interface UsePolicyPreviewOptions {
|
|
8
|
+
/** API client instance */
|
|
9
|
+
client: ActivityApiClient;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Result returned by the usePolicyPreview hook
|
|
13
|
+
*/
|
|
14
|
+
export interface UsePolicyPreviewResult {
|
|
15
|
+
/** Current preview inputs (multiple) */
|
|
16
|
+
inputs: PolicyPreviewInput[];
|
|
17
|
+
/** Selected input indices for preview */
|
|
18
|
+
selectedIndices: Set<number>;
|
|
19
|
+
/** Last preview result (status from server) */
|
|
20
|
+
result: PolicyPreviewStatus | null;
|
|
21
|
+
/** Whether a preview is running */
|
|
22
|
+
isLoading: boolean;
|
|
23
|
+
/** Error if any occurred */
|
|
24
|
+
error: Error | null;
|
|
25
|
+
/** Set all inputs */
|
|
26
|
+
setInputs: (inputs: PolicyPreviewInput[]) => void;
|
|
27
|
+
/** Add an input */
|
|
28
|
+
addInput: (input: PolicyPreviewInput) => void;
|
|
29
|
+
/** Remove an input by index */
|
|
30
|
+
removeInput: (index: number) => void;
|
|
31
|
+
/** Toggle selection of an input */
|
|
32
|
+
toggleSelection: (index: number) => void;
|
|
33
|
+
/** Select all inputs */
|
|
34
|
+
selectAll: () => void;
|
|
35
|
+
/** Deselect all inputs */
|
|
36
|
+
deselectAll: () => void;
|
|
37
|
+
/** Set inputs from audit events */
|
|
38
|
+
setAuditInputs: (events: Event[]) => void;
|
|
39
|
+
/** Set inputs from Kubernetes events */
|
|
40
|
+
setEventInputs: (events: KubernetesEvent[]) => void;
|
|
41
|
+
/** Run the preview with selected inputs */
|
|
42
|
+
runPreview: (policySpec: PolicyPreviewPolicySpec, kindLabel?: string, kindLabelPlural?: string) => Promise<PolicyPreviewStatus>;
|
|
43
|
+
/** Run the preview with auto-fetch (fetches sample data automatically) */
|
|
44
|
+
runPreviewWithAutoFetch: (policySpec: PolicyPreviewPolicySpec, autoFetch?: AutoFetchSpec, kindLabel?: string, kindLabelPlural?: string) => Promise<PolicyPreviewStatus>;
|
|
45
|
+
/** Clear the preview result */
|
|
46
|
+
clearResult: () => void;
|
|
47
|
+
/** Clear all state */
|
|
48
|
+
reset: () => void;
|
|
49
|
+
/** Get selected inputs */
|
|
50
|
+
getSelectedInputs: () => PolicyPreviewInput[];
|
|
51
|
+
/** Whether there are selected inputs */
|
|
52
|
+
hasSelection: boolean;
|
|
53
|
+
/** @deprecated Use inputs[0] */
|
|
54
|
+
input: PolicyPreviewInput;
|
|
55
|
+
/** @deprecated Use setInputs([input]) */
|
|
56
|
+
setInput: (input: PolicyPreviewInput) => void;
|
|
57
|
+
/** @deprecated Use setAuditInputs([event]) */
|
|
58
|
+
setAuditInput: (audit: Event) => void;
|
|
59
|
+
/** @deprecated Use setEventInputs([event]) */
|
|
60
|
+
setEventInput: (event: KubernetesEvent) => void;
|
|
61
|
+
/** @deprecated Use setInputs with parsed JSON */
|
|
62
|
+
setInputFromJson: (json: string) => void;
|
|
63
|
+
/** @deprecated Use setInputs */
|
|
64
|
+
setInputType: (type: PolicyPreviewInputType) => void;
|
|
65
|
+
/** Get the current input as formatted JSON */
|
|
66
|
+
getInputJson: () => string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* React hook for managing policy preview state
|
|
70
|
+
*/
|
|
71
|
+
export declare function usePolicyPreview({ client, }: UsePolicyPreviewOptions): UsePolicyPreviewResult;
|
|
72
|
+
//# sourceMappingURL=usePolicyPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePolicyPreview.d.ts","sourceRoot":"","sources":["../../src/hooks/usePolicyPreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ReindexJob } from '../types/reindex';
|
|
2
|
+
import { ActivityApiClient } from '../api/client';
|
|
3
|
+
/**
|
|
4
|
+
* Options for the useReindexJobs hook
|
|
5
|
+
*/
|
|
6
|
+
export interface UseReindexJobsOptions {
|
|
7
|
+
/** API client instance */
|
|
8
|
+
client: ActivityApiClient;
|
|
9
|
+
/** Whether to watch for real-time updates (default: true) */
|
|
10
|
+
watch?: boolean;
|
|
11
|
+
/** Whether to auto-refresh on mount (default: true) */
|
|
12
|
+
autoRefresh?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Result returned by the useReindexJobs hook
|
|
16
|
+
*/
|
|
17
|
+
export interface UseReindexJobsResult {
|
|
18
|
+
/** List of all reindex jobs */
|
|
19
|
+
jobs: ReindexJob[];
|
|
20
|
+
/** Whether the list is loading */
|
|
21
|
+
isLoading: boolean;
|
|
22
|
+
/** Error if any occurred */
|
|
23
|
+
error: Error | null;
|
|
24
|
+
/** Reload the job list */
|
|
25
|
+
refresh: () => Promise<void>;
|
|
26
|
+
/** Delete a job by name */
|
|
27
|
+
deleteJob: (name: string) => Promise<void>;
|
|
28
|
+
/** Whether a delete is in progress */
|
|
29
|
+
isDeleting: boolean;
|
|
30
|
+
/** Whether watching is active */
|
|
31
|
+
isWatching: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* React hook for managing ReindexJobs with optional real-time watching
|
|
35
|
+
*/
|
|
36
|
+
export declare function useReindexJobs({ client, watch, autoRefresh, }: UseReindexJobsOptions): UseReindexJobsResult;
|
|
37
|
+
//# sourceMappingURL=useReindexJobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReindexJobs.d.ts","sourceRoot":"","sources":["../../src/hooks/useReindexJobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,sCAAsC;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAY,EACZ,WAAkB,GACnB,EAAE,qBAAqB,GAAG,oBAAoB,CA0J9C"}
|