reactbridge-sdk 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -2153,37 +2153,9 @@ const AnalyticsWidget = ({ position = 'bottom-right', theme: customTheme, onDire
|
|
|
2153
2153
|
isOpen && (React.createElement(AnalyticsDrawer, { isOpen: isOpen, onClose: () => setIsOpen(false), configs: configs, isLoading: isLoading, theme: theme, onDirectiveAction: onDirectiveAction }))));
|
|
2154
2154
|
};
|
|
2155
2155
|
|
|
2156
|
-
function
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
if (typeof document === 'undefined') { return; }
|
|
2161
|
-
|
|
2162
|
-
var head = document.head || document.getElementsByTagName('head')[0];
|
|
2163
|
-
var style = document.createElement('style');
|
|
2164
|
-
style.type = 'text/css';
|
|
2165
|
-
|
|
2166
|
-
if (insertAt === 'top') {
|
|
2167
|
-
if (head.firstChild) {
|
|
2168
|
-
head.insertBefore(style, head.firstChild);
|
|
2169
|
-
} else {
|
|
2170
|
-
head.appendChild(style);
|
|
2171
|
-
}
|
|
2172
|
-
} else {
|
|
2173
|
-
head.appendChild(style);
|
|
2174
|
-
}
|
|
2175
|
-
|
|
2176
|
-
if (style.styleSheet) {
|
|
2177
|
-
style.styleSheet.cssText = css;
|
|
2178
|
-
} else {
|
|
2179
|
-
style.appendChild(document.createTextNode(css));
|
|
2180
|
-
}
|
|
2181
|
-
}
|
|
2182
|
-
|
|
2183
|
-
var css_248z = ".analytics-dashboard{background:var(--rb-color-background,#fff);border:1px solid var(--rb-color-border,#e5e7eb);border-radius:8px;font-family:var(--rb-font-family,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif);min-height:600px;overflow:hidden;width:100%}.analytics-dashboard-header{align-items:center;background:var(--rb-color-surface,#fff);border-bottom:1px solid var(--rb-color-border,#e5e7eb);display:flex;justify-content:space-between;padding:24px}.analytics-dashboard-title{color:var(--rb-color-text,#111827);font-size:24px;font-weight:700;margin:0}.analytics-dashboard-subtitle{color:var(--rb-color-text-secondary,#6b7280);font-size:14px;margin:4px 0 0}.analytics-dashboard-refresh-btn{align-items:center;background:var(--rb-color-primary,#3b82f6);border:none;border-radius:6px;color:#fff;cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:8px;padding:8px 16px;transition:all .2s}.analytics-dashboard-refresh-btn:hover:not(:disabled){background:var(--rb-color-primary-dark,#2563eb);transform:translateY(-1px)}.analytics-dashboard-refresh-btn:disabled{cursor:not-allowed;opacity:.5}.analytics-dashboard-refresh-btn svg{animation:none}.analytics-dashboard-refresh-btn:disabled svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.analytics-dashboard-content{display:flex;min-height:600px}.analytics-dashboard-sidebar{background:var(--rb-color-surface,#fafafa);border-right:1px solid var(--rb-color-border,#e5e7eb);overflow-y:auto;width:320px}.analytics-sidebar-title{color:var(--rb-color-text-secondary,#6b7280);font-size:12px;font-weight:700;letter-spacing:.05em;margin:0;padding:16px 16px 8px;text-transform:uppercase}.analytics-list{padding:8px}.analytics-list-item{background:var(--rb-color-background,#fff);border:1px solid var(--rb-color-border,#e5e7eb);border-radius:6px;cursor:pointer;margin-bottom:4px;padding:12px;text-align:left;transition:all .2s;width:100%}.analytics-list-item:hover:not(.disabled){border-color:var(--rb-color-primary,#3b82f6);box-shadow:0 2px 4px rgba(0,0,0,.05)}.analytics-list-item.active{background:var(--rb-color-primary,#3b82f6);border-color:var(--rb-color-primary,#3b82f6);color:#fff}.analytics-list-item.disabled{cursor:not-allowed;opacity:.5}.analytics-list-item-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:4px}.analytics-list-item-name{font-size:14px;font-weight:600}.analytics-list-item.active .analytics-list-item-name{color:#fff}.analytics-list-item-badge{background:var(--rb-color-error,#ef4444);border-radius:4px;color:#fff;font-size:10px;font-weight:600;padding:2px 6px;text-transform:uppercase}.analytics-list-item-description{color:var(--rb-color-text-secondary,#6b7280);font-size:12px;line-height:1.4;margin:0 0 8px}.analytics-list-item.active .analytics-list-item-description{color:hsla(0,0%,100%,.9)}.analytics-list-item-meta{align-items:center;color:var(--rb-color-text-secondary,#9ca3af);display:flex;font-size:11px;justify-content:space-between}.analytics-list-item.active .analytics-list-item-meta{color:hsla(0,0%,100%,.8)}.analytics-list-item-frequency{font-weight:500;text-transform:capitalize}.analytics-dashboard-main{background:var(--rb-color-background,#fff);flex:1;overflow-y:auto;padding:24px}.analytics-dashboard-empty,.analytics-dashboard-loading,.analytics-dashboard-no-results,.analytics-dashboard-placeholder{align-items:center;color:var(--rb-color-text-secondary,#9ca3af);display:flex;flex-direction:column;justify-content:center;min-height:400px;text-align:center}.analytics-dashboard-empty svg,.analytics-dashboard-loading svg,.analytics-dashboard-no-results svg,.analytics-dashboard-placeholder svg{margin-bottom:16px;opacity:.3}.analytics-dashboard-empty p,.analytics-dashboard-no-results p,.analytics-dashboard-placeholder p{font-size:14px;margin:0}.analytics-dashboard-no-results h3{color:var(--rb-color-text,#111827);font-size:18px;font-weight:600;margin:0 0 8px}.analytics-spinner{animation:spin 1s linear infinite;border:4px solid var(--rb-color-border,#e5e7eb);border-radius:50%;border-top-color:var(--rb-color-primary,#3b82f6);height:40px;margin-bottom:16px;width:40px}.analytics-result-detail{animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.analytics-result-header{border-bottom:1px solid var(--rb-color-border,#e5e7eb);margin-bottom:24px;padding-bottom:16px}.analytics-result-title{color:var(--rb-color-text,#111827);font-size:20px;font-weight:700;margin:0 0 4px}.analytics-result-date{color:var(--rb-color-text-secondary,#6b7280);font-size:13px;margin:0}.analytics-section{margin-bottom:32px}.analytics-section-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.analytics-section-title{color:var(--rb-color-text,#111827);font-size:16px;font-weight:700;margin:0 0 16px}.analytics-metrics-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.analytics-metric-card{background:var(--rb-color-surface,#fafafa);border:1px solid var(--rb-color-border,#e5e7eb);border-left-width:4px;border-radius:8px;padding:16px}.analytics-metric-card.status-ok{border-left-color:var(--rb-color-success,#10b981)}.analytics-metric-card.status-warning{border-left-color:#f59e0b}.analytics-metric-card.status-critical{border-left-color:var(--rb-color-error,#ef4444)}.analytics-metric-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:8px}.analytics-metric-name{color:var(--rb-color-text,#111827);font-size:13px;font-weight:600}.analytics-metric-status{border-radius:4px;font-size:10px;font-weight:700;padding:2px 6px;text-transform:uppercase}.analytics-metric-status.status-ok{background:#d1fae5;color:#065f46}.analytics-metric-status.status-warning{background:#fef3c7;color:#92400e}.analytics-metric-status.status-critical{background:#fee2e2;color:#991b1b}.analytics-metric-value{color:var(--rb-color-text,#111827);font-size:24px;font-weight:700;margin-bottom:4px}.analytics-metric-explanation{color:var(--rb-color-text-secondary,#6b7280);font-size:12px;line-height:1.4;margin:0}.analytics-observations-list{display:flex;flex-direction:column;gap:12px}.analytics-observation{background:var(--rb-color-surface,#fafafa);border:1px solid var(--rb-color-border,#e5e7eb);border-left-width:4px;border-radius:8px;padding:16px}.analytics-observation.severity-low{border-left-color:#3b82f6}.analytics-observation.severity-medium{border-left-color:#f59e0b}.analytics-observation.severity-high{border-left-color:var(--rb-color-error,#ef4444)}.analytics-observation-header{display:flex;gap:8px;margin-bottom:8px}.analytics-observation-severity{border-radius:4px;font-size:10px;font-weight:700;padding:2px 6px;text-transform:uppercase}.analytics-observation-severity.severity-low{background:#dbeafe;color:#1e40af}.analytics-observation-severity.severity-medium{background:#fef3c7;color:#92400e}.analytics-observation-severity.severity-high{background:#fee2e2;color:#991b1b}.analytics-observation-scope{color:var(--rb-color-text-secondary,#9ca3af);font-size:11px;text-transform:capitalize}.analytics-observation-text{color:var(--rb-color-text,#111827);font-size:14px;line-height:1.5;margin:0}.analytics-directive-filters{display:flex;gap:8px}.analytics-filter-btn{background:var(--rb-color-surface,#fafafa);border:1px solid var(--rb-color-border,#e5e7eb);border-radius:6px;color:var(--rb-color-text,#111827);cursor:pointer;font-size:12px;font-weight:500;padding:6px 12px;transition:all .2s}.analytics-filter-btn.active,.analytics-filter-btn:hover{border-color:var(--rb-color-primary,#3b82f6)}.analytics-filter-btn.active{background:var(--rb-color-primary,#3b82f6);color:#fff}.analytics-directives-list{display:flex;flex-direction:column;gap:16px}.analytics-directives-empty{color:var(--rb-color-text-secondary,#9ca3af);font-size:14px;padding:32px;text-align:center}.analytics-directive-card{background:var(--rb-color-surface,#fafafa);border:1px solid var(--rb-color-border,#e5e7eb);border-left-width:4px;border-radius:8px;padding:20px}.analytics-directive-card.priority-high{border-left-color:var(--rb-color-error,#ef4444)}.analytics-directive-card.priority-medium{border-left-color:#f59e0b}.analytics-directive-card.priority-low{border-left-color:#3b82f6}.analytics-directive-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:12px}.analytics-directive-priority{border-radius:4px;font-size:10px;font-weight:700;margin-right:8px;padding:3px 8px;text-transform:uppercase}.analytics-directive-priority.priority-high{background:#fee2e2;color:#991b1b}.analytics-directive-priority.priority-medium{background:#fef3c7;color:#92400e}.analytics-directive-priority.priority-low{background:#dbeafe;color:#1e40af}.analytics-directive-action{color:var(--rb-color-text,#111827);font-family:monospace;font-size:14px;font-weight:600}.analytics-directive-status{border-radius:4px;font-size:11px;font-weight:600;padding:4px 8px;text-transform:capitalize}.analytics-directive-status.status-pending{background:#fef3c7;color:#92400e}.analytics-directive-status.status-executed{background:#d1fae5;color:#065f46}.analytics-directive-status.status-declined{background:#f3f4f6;color:#4b5563}.analytics-directive-status.status-failed{background:#fee2e2;color:#991b1b}.analytics-directive-rationale{color:var(--rb-color-text,#374151);font-size:14px;line-height:1.5;margin:0 0 12px}.analytics-directive-parameters{background:var(--rb-color-background,#fff);border:1px solid var(--rb-color-border,#e5e7eb);border-radius:6px;margin-bottom:16px;padding:12px}.analytics-directive-parameters-label{color:var(--rb-color-text-secondary,#6b7280);display:block;font-size:11px;font-weight:600;margin-bottom:8px;text-transform:uppercase}.analytics-directive-parameters-list{display:flex;flex-wrap:wrap;gap:8px}.analytics-directive-parameter{color:var(--rb-color-text-secondary,#6b7280);font-family:monospace;font-size:12px}.analytics-directive-parameter strong{color:var(--rb-color-text,#111827)}.analytics-directive-actions{display:flex;gap:12px}.analytics-directive-btn{border:none;border-radius:6px;cursor:pointer;flex:1;font-size:14px;font-weight:600;padding:10px 20px;transition:all .2s}.analytics-directive-btn.execute{background:var(--rb-color-success,#10b981);color:#fff}.analytics-directive-btn.execute:hover:not(:disabled){background:#059669;box-shadow:0 4px 6px rgba(16,185,129,.2);transform:translateY(-1px)}.analytics-directive-btn.decline{background:var(--rb-color-surface,#f3f4f6);border:1px solid var(--rb-color-border,#e5e7eb);color:var(--rb-color-text,#374151)}.analytics-directive-btn.decline:hover:not(:disabled){background:#e5e7eb}.analytics-directive-btn:disabled{cursor:not-allowed;opacity:.5}@media (max-width:768px){.analytics-dashboard-content{flex-direction:column}.analytics-dashboard-sidebar{border-bottom:1px solid var(--rb-color-border,#e5e7eb);border-right:none;max-height:300px;width:100%}.analytics-metrics-grid{grid-template-columns:1fr}.analytics-directive-actions{flex-direction:column}}";
|
|
2184
|
-
styleInject(css_248z,{"insertAt":"top"});
|
|
2185
|
-
|
|
2186
|
-
function AnalyticsDashboard({ onDirectiveAction, className = '', showRefresh = true, autoRefreshInterval = 0, }) {
|
|
2156
|
+
function AnalyticsDashboard({ onDirectiveAction, className = '', showRefresh = true, autoRefreshInterval = 0, theme: customTheme, }) {
|
|
2157
|
+
const { theme: contextTheme } = useReactBridgeContext();
|
|
2158
|
+
const theme = customTheme || contextTheme;
|
|
2187
2159
|
const [selectedAnalytics, setSelectedAnalytics] = React.useState(null);
|
|
2188
2160
|
const [directiveFilter, setDirectiveFilter] = React.useState('all');
|
|
2189
2161
|
// Fetch analytics configurations
|
|
@@ -2227,102 +2199,238 @@ function AnalyticsDashboard({ onDirectiveAction, className = '', showRefresh = t
|
|
|
2227
2199
|
return d.status === directiveFilter;
|
|
2228
2200
|
})) || [];
|
|
2229
2201
|
const selectedConfig = configs === null || configs === void 0 ? void 0 : configs.find(c => c.analyticsType === selectedAnalytics);
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2202
|
+
const proposedCount = (result === null || result === void 0 ? void 0 : result.directives.filter(d => d.status === 'proposed').length) || 0;
|
|
2203
|
+
const executedCount = (result === null || result === void 0 ? void 0 : result.directives.filter(d => d.status === 'executed').length) || 0;
|
|
2204
|
+
const declinedCount = (result === null || result === void 0 ? void 0 : result.directives.filter(d => d.status === 'declined').length) || 0;
|
|
2205
|
+
const containerStyle = {
|
|
2206
|
+
display: 'flex',
|
|
2207
|
+
gap: theme.spacing.lg,
|
|
2208
|
+
width: '100%',
|
|
2209
|
+
minHeight: '540px',
|
|
2210
|
+
backgroundColor: theme.colors.background,
|
|
2211
|
+
color: theme.colors.text,
|
|
2212
|
+
border: `1px solid ${theme.colors.border}`,
|
|
2213
|
+
borderRadius: theme.borderRadius,
|
|
2214
|
+
boxShadow: theme.boxShadow,
|
|
2215
|
+
padding: theme.spacing.lg,
|
|
2216
|
+
};
|
|
2217
|
+
const sidebarStyle = {
|
|
2218
|
+
width: '320px',
|
|
2219
|
+
borderRight: `1px solid ${theme.colors.border}`,
|
|
2220
|
+
paddingRight: theme.spacing.lg,
|
|
2221
|
+
display: 'flex',
|
|
2222
|
+
flexDirection: 'column',
|
|
2223
|
+
gap: theme.spacing.sm,
|
|
2224
|
+
};
|
|
2225
|
+
const listItemStyle = (isActive, isDisabled) => ({
|
|
2226
|
+
width: '100%',
|
|
2227
|
+
textAlign: 'left',
|
|
2228
|
+
padding: theme.spacing.md,
|
|
2229
|
+
backgroundColor: isActive ? theme.colors.primary : theme.colors.surface,
|
|
2230
|
+
color: isActive ? '#fff' : theme.colors.text,
|
|
2231
|
+
border: `1px solid ${isActive ? theme.colors.primary : theme.colors.border}`,
|
|
2232
|
+
borderRadius: theme.borderRadius,
|
|
2233
|
+
cursor: isDisabled ? 'not-allowed' : 'pointer',
|
|
2234
|
+
opacity: isDisabled ? 0.6 : 1,
|
|
2235
|
+
transition: 'transform 0.15s ease, box-shadow 0.15s ease',
|
|
2236
|
+
boxShadow: isActive ? theme.boxShadow : 'none',
|
|
2237
|
+
});
|
|
2238
|
+
const pillStyle = (bg) => ({
|
|
2239
|
+
fontSize: theme.fontSizes.xs,
|
|
2240
|
+
padding: '2px 8px',
|
|
2241
|
+
borderRadius: '999px',
|
|
2242
|
+
backgroundColor: bg,
|
|
2243
|
+
color: '#fff',
|
|
2244
|
+
fontWeight: 600,
|
|
2245
|
+
});
|
|
2246
|
+
const placeholderStyle = {
|
|
2247
|
+
flex: 1,
|
|
2248
|
+
minHeight: '420px',
|
|
2249
|
+
display: 'flex',
|
|
2250
|
+
flexDirection: 'column',
|
|
2251
|
+
alignItems: 'center',
|
|
2252
|
+
justifyContent: 'center',
|
|
2253
|
+
gap: theme.spacing.sm,
|
|
2254
|
+
color: theme.colors.textSecondary,
|
|
2255
|
+
textAlign: 'center',
|
|
2256
|
+
};
|
|
2257
|
+
const cardStyle = {
|
|
2258
|
+
backgroundColor: theme.colors.surface,
|
|
2259
|
+
border: `1px solid ${theme.colors.border}`,
|
|
2260
|
+
borderRadius: theme.borderRadius,
|
|
2261
|
+
padding: theme.spacing.md,
|
|
2262
|
+
};
|
|
2263
|
+
const statusBadgeStyle = (status) => {
|
|
2264
|
+
const colors = {
|
|
2265
|
+
proposed: { bg: theme.colors.primary, text: '#fff' },
|
|
2266
|
+
executed: { bg: theme.colors.success, text: '#fff' },
|
|
2267
|
+
declined: { bg: theme.colors.error, text: '#fff' },
|
|
2268
|
+
ok: { bg: '#d1fae5', text: '#065f46' },
|
|
2269
|
+
warning: { bg: '#fef3c7', text: '#92400e' },
|
|
2270
|
+
critical: { bg: '#fee2e2', text: '#991b1b' },
|
|
2271
|
+
high: { bg: '#fee2e2', text: '#991b1b' },
|
|
2272
|
+
medium: { bg: '#fef3c7', text: '#92400e' },
|
|
2273
|
+
low: { bg: '#e0ecff', text: '#1e3a8a' },
|
|
2274
|
+
};
|
|
2275
|
+
const palette = colors[status] || { bg: theme.colors.surface, text: theme.colors.text };
|
|
2276
|
+
return {
|
|
2277
|
+
fontSize: theme.fontSizes.xs,
|
|
2278
|
+
padding: '2px 8px',
|
|
2279
|
+
borderRadius: '999px',
|
|
2280
|
+
backgroundColor: palette.bg,
|
|
2281
|
+
color: palette.text,
|
|
2282
|
+
fontWeight: 700,
|
|
2283
|
+
textTransform: 'capitalize',
|
|
2284
|
+
};
|
|
2285
|
+
};
|
|
2286
|
+
const directiveCardStyle = (status) => (Object.assign(Object.assign({}, cardStyle), { borderLeft: `4px solid ${status === 'executed'
|
|
2287
|
+
? theme.colors.success
|
|
2288
|
+
: status === 'declined'
|
|
2289
|
+
? theme.colors.error
|
|
2290
|
+
: theme.colors.primary}`, display: 'flex', flexDirection: 'column', gap: theme.spacing.sm }));
|
|
2291
|
+
return (React.createElement("div", { className: className, style: containerStyle },
|
|
2292
|
+
React.createElement("div", { style: sidebarStyle },
|
|
2293
|
+
React.createElement("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
|
|
2294
|
+
React.createElement("h3", { style: { margin: 0, fontSize: theme.fontSizes.lg } }, "Analytics"),
|
|
2295
|
+
showRefresh && (React.createElement("button", { type: "button", onClick: handleRefresh, disabled: configsLoading, style: {
|
|
2296
|
+
border: `1px solid ${theme.colors.border}`,
|
|
2297
|
+
backgroundColor: theme.colors.surface,
|
|
2298
|
+
color: theme.colors.text,
|
|
2299
|
+
padding: `${theme.spacing.xs} ${theme.spacing.sm}`,
|
|
2300
|
+
borderRadius: theme.borderRadius,
|
|
2301
|
+
cursor: configsLoading ? 'not-allowed' : 'pointer',
|
|
2302
|
+
} }, configsLoading ? 'Refreshing...' : 'Refresh'))),
|
|
2303
|
+
configsLoading && (React.createElement("div", { style: placeholderStyle }, "Loading analytics...")),
|
|
2304
|
+
configsError && (React.createElement("div", { style: placeholderStyle },
|
|
2237
2305
|
"Error loading analytics: ",
|
|
2238
2306
|
configsError.message)),
|
|
2239
|
-
configs && configs.length === 0 && (React.createElement("div", {
|
|
2240
|
-
configs && configs.length > 0 && (React.createElement("div", {
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2307
|
+
configs && configs.length === 0 && (React.createElement("div", { style: placeholderStyle }, "No analytics configured. Configure analytics in your DirectivSys dashboard.")),
|
|
2308
|
+
configs && configs.length > 0 && (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.sm } }, configs.map((config) => {
|
|
2309
|
+
const isActive = selectedAnalytics === config.analyticsType;
|
|
2310
|
+
return (React.createElement("button", { key: config.configId, type: "button", onClick: () => config.isEnabled && setSelectedAnalytics(config.analyticsType), style: listItemStyle(isActive, !config.isEnabled), disabled: !config.isEnabled },
|
|
2311
|
+
React.createElement("div", { style: {
|
|
2312
|
+
display: 'flex',
|
|
2313
|
+
justifyContent: 'space-between',
|
|
2314
|
+
alignItems: 'center',
|
|
2315
|
+
marginBottom: theme.spacing.xs,
|
|
2316
|
+
width: '100%',
|
|
2317
|
+
} },
|
|
2318
|
+
React.createElement("span", { style: { fontSize: theme.fontSizes.md, fontWeight: 600 } }, config.analyticsType),
|
|
2319
|
+
!config.isEnabled && React.createElement("span", { style: pillStyle(theme.colors.textSecondary) }, "Disabled")),
|
|
2320
|
+
React.createElement("div", { style: {
|
|
2321
|
+
fontSize: theme.fontSizes.sm,
|
|
2322
|
+
color: isActive ? 'rgba(255,255,255,0.9)' : theme.colors.textSecondary,
|
|
2323
|
+
marginBottom: theme.spacing.xs,
|
|
2324
|
+
} }, config.templateDescription),
|
|
2325
|
+
React.createElement("div", { style: {
|
|
2326
|
+
display: 'flex',
|
|
2327
|
+
justifyContent: 'space-between',
|
|
2328
|
+
width: '100%',
|
|
2329
|
+
fontSize: theme.fontSizes.xs,
|
|
2330
|
+
color: isActive ? 'rgba(255,255,255,0.8)' : theme.colors.textSecondary,
|
|
2331
|
+
} },
|
|
2332
|
+
React.createElement("span", { style: { textTransform: 'capitalize' } }, config.frequency),
|
|
2333
|
+
config.lastExecutedAt && (React.createElement("span", null,
|
|
2334
|
+
"Last: ",
|
|
2335
|
+
new Date(config.lastExecutedAt).toLocaleDateString())))));
|
|
2336
|
+
})))),
|
|
2337
|
+
React.createElement("div", { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: theme.spacing.lg } },
|
|
2338
|
+
!selectedAnalytics && (React.createElement("div", { style: placeholderStyle },
|
|
2339
|
+
React.createElement("h3", { style: { margin: 0, color: theme.colors.text } }, "No analytics selected"),
|
|
2340
|
+
React.createElement("p", { style: { margin: 0 } }, "Select an analytics type from the left to view results."))),
|
|
2341
|
+
selectedAnalytics && resultLoading && (React.createElement("div", { style: placeholderStyle }, "Loading results...")),
|
|
2342
|
+
selectedAnalytics && resultError && (React.createElement("div", { style: placeholderStyle },
|
|
2256
2343
|
"Error loading results: ",
|
|
2257
2344
|
resultError.message)),
|
|
2258
|
-
selectedAnalytics && !resultLoading && !result && (React.createElement("div", {
|
|
2259
|
-
React.createElement("h3",
|
|
2260
|
-
React.createElement("p",
|
|
2261
|
-
selectedAnalytics && result && (React.createElement("div", {
|
|
2262
|
-
React.createElement("div", {
|
|
2263
|
-
React.createElement("
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
React.createElement("
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2345
|
+
selectedAnalytics && !resultLoading && !result && (React.createElement("div", { style: placeholderStyle },
|
|
2346
|
+
React.createElement("h3", { style: { margin: 0, color: theme.colors.text } }, "No results yet"),
|
|
2347
|
+
React.createElement("p", { style: { margin: 0 } }, "This analytics has not run yet. Results will appear after the first run."))),
|
|
2348
|
+
selectedAnalytics && result && (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.lg } },
|
|
2349
|
+
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.xs } },
|
|
2350
|
+
React.createElement("h2", { style: { margin: 0, fontSize: theme.fontSizes.xl, color: theme.colors.text } }, selectedConfig === null || selectedConfig === void 0 ? void 0 : selectedConfig.analyticsType),
|
|
2351
|
+
React.createElement("p", { style: { margin: 0, color: theme.colors.textSecondary, fontSize: theme.fontSizes.sm } },
|
|
2352
|
+
"Generated: ",
|
|
2353
|
+
new Date(result.createdAt).toLocaleString())),
|
|
2354
|
+
result.metrics && result.metrics.length > 0 && (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.md } },
|
|
2355
|
+
React.createElement("h3", { style: { margin: 0, fontSize: theme.fontSizes.lg } }, "Metrics"),
|
|
2356
|
+
React.createElement("div", { style: {
|
|
2357
|
+
display: 'grid',
|
|
2358
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))',
|
|
2359
|
+
gap: theme.spacing.md,
|
|
2360
|
+
} }, result.metrics.map((metric, index) => (React.createElement("div", { key: index, style: Object.assign(Object.assign({}, cardStyle), { borderLeft: `4px solid ${metric.status === 'ok'
|
|
2361
|
+
? theme.colors.success
|
|
2362
|
+
: metric.status === 'warning'
|
|
2363
|
+
? '#f59e0b'
|
|
2364
|
+
: theme.colors.error}` }) },
|
|
2365
|
+
React.createElement("div", { style: {
|
|
2366
|
+
display: 'flex',
|
|
2367
|
+
justifyContent: 'space-between',
|
|
2368
|
+
alignItems: 'center',
|
|
2369
|
+
marginBottom: theme.spacing.xs,
|
|
2370
|
+
} },
|
|
2371
|
+
React.createElement("span", { style: { fontWeight: 600 } }, metric.name),
|
|
2372
|
+
React.createElement("span", { style: statusBadgeStyle(metric.status) }, metric.status)),
|
|
2373
|
+
React.createElement("div", { style: { fontSize: theme.fontSizes.xl, fontWeight: 700 } },
|
|
2275
2374
|
metric.value,
|
|
2276
2375
|
" ",
|
|
2277
2376
|
metric.unit),
|
|
2278
|
-
React.createElement("div", {
|
|
2279
|
-
result.observations && result.observations.length > 0 && (React.createElement("div", {
|
|
2280
|
-
React.createElement("h3", {
|
|
2281
|
-
React.createElement("div", {
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
React.createElement("div", {
|
|
2290
|
-
|
|
2377
|
+
React.createElement("div", { style: { color: theme.colors.textSecondary, fontSize: theme.fontSizes.sm } }, metric.explanation))))))),
|
|
2378
|
+
result.observations && result.observations.length > 0 && (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.md } },
|
|
2379
|
+
React.createElement("h3", { style: { margin: 0, fontSize: theme.fontSizes.lg } }, "Observations"),
|
|
2380
|
+
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.sm } }, result.observations.map((observation, index) => (React.createElement("div", { key: index, style: Object.assign(Object.assign({}, cardStyle), { borderLeft: `4px solid ${observation.severity === 'high'
|
|
2381
|
+
? theme.colors.error
|
|
2382
|
+
: observation.severity === 'medium'
|
|
2383
|
+
? '#f59e0b'
|
|
2384
|
+
: theme.colors.primary}`, display: 'flex', flexDirection: 'column', gap: theme.spacing.xs }) },
|
|
2385
|
+
React.createElement("div", { style: { display: 'flex', gap: theme.spacing.sm, alignItems: 'center' } },
|
|
2386
|
+
React.createElement("span", { style: statusBadgeStyle(observation.severity) }, observation.severity),
|
|
2387
|
+
React.createElement("span", { style: { color: theme.colors.textSecondary, fontSize: theme.fontSizes.sm } }, observation.scope)),
|
|
2388
|
+
React.createElement("div", { style: { color: theme.colors.text, fontSize: theme.fontSizes.sm } }, observation.text))))))),
|
|
2389
|
+
result.directives && result.directives.length > 0 && (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.md } },
|
|
2390
|
+
React.createElement("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
|
|
2391
|
+
React.createElement("h3", { style: { margin: 0, fontSize: theme.fontSizes.lg } }, "Recommended actions"),
|
|
2392
|
+
React.createElement("div", { style: { display: 'flex', gap: theme.spacing.xs } },
|
|
2393
|
+
React.createElement("button", { type: "button", onClick: () => setDirectiveFilter('all'), style: Object.assign(Object.assign({}, pillStyle(directiveFilter === 'all' ? theme.colors.primary : theme.colors.surface)), { border: `1px solid ${theme.colors.border}`, color: directiveFilter === 'all' ? '#fff' : theme.colors.text }) },
|
|
2291
2394
|
"All (",
|
|
2292
2395
|
result.directives.length,
|
|
2293
2396
|
")"),
|
|
2294
|
-
React.createElement("button", { onClick: () => setDirectiveFilter('proposed'),
|
|
2397
|
+
React.createElement("button", { type: "button", onClick: () => setDirectiveFilter('proposed'), style: Object.assign(Object.assign({}, pillStyle(directiveFilter === 'proposed' ? theme.colors.primary : theme.colors.surface)), { border: `1px solid ${theme.colors.border}`, color: directiveFilter === 'proposed' ? '#fff' : theme.colors.text }) },
|
|
2295
2398
|
"Proposed (",
|
|
2296
|
-
|
|
2399
|
+
proposedCount,
|
|
2297
2400
|
")"),
|
|
2298
|
-
React.createElement("button", { onClick: () => setDirectiveFilter('executed'),
|
|
2401
|
+
React.createElement("button", { type: "button", onClick: () => setDirectiveFilter('executed'), style: Object.assign(Object.assign({}, pillStyle(directiveFilter === 'executed' ? theme.colors.primary : theme.colors.surface)), { border: `1px solid ${theme.colors.border}`, color: directiveFilter === 'executed' ? '#fff' : theme.colors.text }) },
|
|
2299
2402
|
"Executed (",
|
|
2300
|
-
|
|
2403
|
+
executedCount,
|
|
2301
2404
|
")"),
|
|
2302
|
-
React.createElement("button", { onClick: () => setDirectiveFilter('declined'),
|
|
2405
|
+
React.createElement("button", { type: "button", onClick: () => setDirectiveFilter('declined'), style: Object.assign(Object.assign({}, pillStyle(directiveFilter === 'declined' ? theme.colors.primary : theme.colors.surface)), { border: `1px solid ${theme.colors.border}`, color: directiveFilter === 'declined' ? '#fff' : theme.colors.text }) },
|
|
2303
2406
|
"Declined (",
|
|
2304
|
-
|
|
2407
|
+
declinedCount,
|
|
2305
2408
|
")"))),
|
|
2306
|
-
filteredDirectives.length === 0 && (React.createElement("div", {
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2409
|
+
filteredDirectives.length === 0 && (React.createElement("div", { style: placeholderStyle }, "No directives match the selected filter.")),
|
|
2410
|
+
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.sm } }, filteredDirectives.map((directive) => (React.createElement("div", { key: directive.directiveId, style: directiveCardStyle(directive.status) },
|
|
2411
|
+
React.createElement("div", { style: {
|
|
2412
|
+
display: 'flex',
|
|
2413
|
+
justifyContent: 'space-between',
|
|
2414
|
+
alignItems: 'center',
|
|
2415
|
+
gap: theme.spacing.sm,
|
|
2416
|
+
flexWrap: 'wrap',
|
|
2417
|
+
} },
|
|
2418
|
+
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', gap: theme.spacing.xs } },
|
|
2419
|
+
React.createElement("span", { style: { fontWeight: 700 } }, directive.action),
|
|
2420
|
+
React.createElement("span", { style: { color: theme.colors.textSecondary, fontSize: theme.fontSizes.sm } },
|
|
2313
2421
|
"Priority: ",
|
|
2314
2422
|
directive.priority)),
|
|
2315
|
-
React.createElement("span", {
|
|
2316
|
-
React.createElement("div", {
|
|
2317
|
-
directive.parameters && directive.parameters.length > 0 && (React.createElement("div", {
|
|
2318
|
-
React.createElement("strong",
|
|
2319
|
-
React.createElement("ul",
|
|
2423
|
+
React.createElement("span", { style: statusBadgeStyle(directive.status) }, directive.status)),
|
|
2424
|
+
React.createElement("div", { style: { color: theme.colors.text, fontSize: theme.fontSizes.sm } }, directive.rationale),
|
|
2425
|
+
directive.parameters && directive.parameters.length > 0 && (React.createElement("div", { style: { color: theme.colors.textSecondary, fontSize: theme.fontSizes.sm } },
|
|
2426
|
+
React.createElement("strong", { style: { color: theme.colors.text } }, "Parameters:"),
|
|
2427
|
+
React.createElement("ul", { style: { margin: `${theme.spacing.xs} 0 0 16px`, padding: 0 } }, directive.parameters.map((param, index) => (React.createElement("li", { key: index, style: { marginBottom: theme.spacing.xs } },
|
|
2320
2428
|
React.createElement("code", null, param.name),
|
|
2321
2429
|
": ",
|
|
2322
2430
|
param.value)))))),
|
|
2323
|
-
directive.status === 'proposed' && (React.createElement("div", {
|
|
2324
|
-
React.createElement("button", { onClick: () => handleDirectiveAction(directive, 'execute'), disabled: isProcessing,
|
|
2325
|
-
React.createElement("button", { onClick: () => handleDirectiveAction(directive, 'decline'), disabled: isProcessing,
|
|
2431
|
+
directive.status === 'proposed' && (React.createElement("div", { style: { display: 'flex', gap: theme.spacing.sm } },
|
|
2432
|
+
React.createElement("button", { type: "button", onClick: () => handleDirectiveAction(directive, 'execute'), disabled: isProcessing, style: Object.assign(Object.assign({}, pillStyle(theme.colors.success)), { border: 'none', cursor: isProcessing ? 'not-allowed' : 'pointer' }) }, isProcessing ? 'Processing...' : 'Execute'),
|
|
2433
|
+
React.createElement("button", { type: "button", onClick: () => handleDirectiveAction(directive, 'decline'), disabled: isProcessing, style: Object.assign(Object.assign({}, pillStyle(theme.colors.error)), { border: 'none', cursor: isProcessing ? 'not-allowed' : 'pointer' }) }, "Decline"))))))))))))));
|
|
2326
2434
|
}
|
|
2327
2435
|
|
|
2328
2436
|
exports.AnalyticsAPI = AnalyticsAPI;
|