reactbridge-sdk 0.2.1 → 0.2.2

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,7 +2153,180 @@ 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 styleInject(css, ref) {
2157
+ if ( ref === void 0 ) ref = {};
2158
+ var insertAt = ref.insertAt;
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, }) {
2187
+ const [selectedAnalytics, setSelectedAnalytics] = React.useState(null);
2188
+ const [directiveFilter, setDirectiveFilter] = React.useState('all');
2189
+ // Fetch analytics configurations
2190
+ const { configs, isLoading: configsLoading, error: configsError, refetch: refetchConfigs, } = useAnalyticsConfigs();
2191
+ // Fetch latest result for selected analytics
2192
+ const { result, isLoading: resultLoading, error: resultError, refetch: refetchResult, } = useAnalyticsResult(selectedAnalytics);
2193
+ // Handle directive actions
2194
+ const { handleAction, isProcessing } = useDirectiveAction(onDirectiveAction);
2195
+ // Auto-select first analytics if none selected
2196
+ React.useEffect(() => {
2197
+ if (configs && configs.length > 0 && !selectedAnalytics) {
2198
+ setSelectedAnalytics(configs[0].analyticsType);
2199
+ }
2200
+ }, [configs, selectedAnalytics]);
2201
+ // Auto-refresh
2202
+ React.useEffect(() => {
2203
+ if (autoRefreshInterval > 0) {
2204
+ const interval = setInterval(() => {
2205
+ refetchConfigs();
2206
+ if (selectedAnalytics) {
2207
+ refetchResult();
2208
+ }
2209
+ }, autoRefreshInterval * 1000);
2210
+ return () => clearInterval(interval);
2211
+ }
2212
+ }, [autoRefreshInterval, selectedAnalytics, refetchConfigs, refetchResult]);
2213
+ const handleRefresh = () => {
2214
+ refetchConfigs();
2215
+ if (selectedAnalytics) {
2216
+ refetchResult();
2217
+ }
2218
+ };
2219
+ const handleDirectiveAction = (directive, action) => __awaiter(this, void 0, void 0, function* () {
2220
+ yield handleAction(directive, action);
2221
+ // Refetch result to get updated directive statuses
2222
+ refetchResult();
2223
+ });
2224
+ const filteredDirectives = (result === null || result === void 0 ? void 0 : result.directives.filter(d => {
2225
+ if (directiveFilter === 'all')
2226
+ return true;
2227
+ return d.status === directiveFilter;
2228
+ })) || [];
2229
+ const selectedConfig = configs === null || configs === void 0 ? void 0 : configs.find(c => c.analyticsType === selectedAnalytics);
2230
+ return (React.createElement("div", { className: `rb-analytics-dashboard ${className}` },
2231
+ React.createElement("div", { className: "rb-analytics-sidebar" },
2232
+ React.createElement("div", { className: "rb-analytics-sidebar-header" },
2233
+ React.createElement("h3", null, "Analytics"),
2234
+ showRefresh && (React.createElement("button", { onClick: handleRefresh, disabled: configsLoading, className: "rb-analytics-refresh-btn", title: "Refresh" }, "\u21BB"))),
2235
+ configsLoading && (React.createElement("div", { className: "rb-analytics-loading" }, "Loading analytics...")),
2236
+ configsError && (React.createElement("div", { className: "rb-analytics-error" },
2237
+ "Error loading analytics: ",
2238
+ configsError.message)),
2239
+ configs && configs.length === 0 && (React.createElement("div", { className: "rb-analytics-empty" }, "No analytics configured. Please configure analytics in your DirectivSys dashboard.")),
2240
+ configs && configs.length > 0 && (React.createElement("div", { className: "rb-analytics-list" }, configs.map((config) => (React.createElement("button", { key: config.configId, onClick: () => setSelectedAnalytics(config.analyticsType), className: `rb-analytics-item ${selectedAnalytics === config.analyticsType ? 'active' : ''} ${!config.isEnabled ? 'disabled' : ''}` },
2241
+ React.createElement("div", { className: "rb-analytics-item-header" },
2242
+ React.createElement("span", { className: "rb-analytics-item-name" }, config.analyticsType),
2243
+ !config.isEnabled && (React.createElement("span", { className: "rb-analytics-item-badge disabled" }, "Disabled"))),
2244
+ React.createElement("div", { className: "rb-analytics-item-description" }, config.templateDescription),
2245
+ React.createElement("div", { className: "rb-analytics-item-footer" },
2246
+ React.createElement("span", { className: "rb-analytics-item-frequency" }, config.frequency),
2247
+ config.lastExecutedAt && (React.createElement("span", { className: "rb-analytics-item-date" },
2248
+ "Last: ",
2249
+ new Date(config.lastExecutedAt).toLocaleDateString()))))))))),
2250
+ React.createElement("div", { className: "rb-analytics-main" },
2251
+ !selectedAnalytics && (React.createElement("div", { className: "rb-analytics-empty-state" },
2252
+ React.createElement("h3", null, "No Analytics Selected"),
2253
+ React.createElement("p", null, "Select an analytics type from the sidebar to view results."))),
2254
+ selectedAnalytics && resultLoading && (React.createElement("div", { className: "rb-analytics-loading" }, "Loading results...")),
2255
+ selectedAnalytics && resultError && (React.createElement("div", { className: "rb-analytics-error" },
2256
+ "Error loading results: ",
2257
+ resultError.message)),
2258
+ selectedAnalytics && !resultLoading && !result && (React.createElement("div", { className: "rb-analytics-empty-state" },
2259
+ React.createElement("h3", null, "No Results Available"),
2260
+ React.createElement("p", null, "This analytics has not been executed yet. Results will appear here once the first run completes."))),
2261
+ selectedAnalytics && result && (React.createElement("div", { className: "rb-analytics-content" },
2262
+ React.createElement("div", { className: "rb-analytics-content-header" },
2263
+ React.createElement("div", null,
2264
+ React.createElement("h2", null, selectedConfig === null || selectedConfig === void 0 ? void 0 : selectedConfig.analyticsType),
2265
+ React.createElement("p", { className: "rb-analytics-content-date" },
2266
+ "Generated: ",
2267
+ new Date(result.createdAt).toLocaleString()))),
2268
+ result.metrics && result.metrics.length > 0 && (React.createElement("div", { className: "rb-analytics-section" },
2269
+ React.createElement("h3", { className: "rb-analytics-section-title" }, "Metrics"),
2270
+ React.createElement("div", { className: "rb-analytics-metrics-grid" }, result.metrics.map((metric, index) => (React.createElement("div", { key: index, className: `rb-analytics-metric-card status-${metric.status}` },
2271
+ React.createElement("div", { className: "rb-analytics-metric-header" },
2272
+ React.createElement("span", { className: "rb-analytics-metric-name" }, metric.name),
2273
+ React.createElement("span", { className: `rb-analytics-metric-status ${metric.status}` }, metric.status)),
2274
+ React.createElement("div", { className: "rb-analytics-metric-value" },
2275
+ metric.value,
2276
+ " ",
2277
+ metric.unit),
2278
+ React.createElement("div", { className: "rb-analytics-metric-explanation" }, metric.explanation))))))),
2279
+ result.observations && result.observations.length > 0 && (React.createElement("div", { className: "rb-analytics-section" },
2280
+ React.createElement("h3", { className: "rb-analytics-section-title" }, "Observations"),
2281
+ React.createElement("div", { className: "rb-analytics-observations-list" }, result.observations.map((observation, index) => (React.createElement("div", { key: index, className: `rb-analytics-observation severity-${observation.severity}` },
2282
+ React.createElement("div", { className: "rb-analytics-observation-header" },
2283
+ React.createElement("span", { className: `rb-analytics-observation-severity ${observation.severity}` }, observation.severity),
2284
+ React.createElement("span", { className: "rb-analytics-observation-scope" }, observation.scope)),
2285
+ React.createElement("div", { className: "rb-analytics-observation-text" }, observation.text))))))),
2286
+ result.directives && result.directives.length > 0 && (React.createElement("div", { className: "rb-analytics-section" },
2287
+ React.createElement("div", { className: "rb-analytics-directives-header" },
2288
+ React.createElement("h3", { className: "rb-analytics-section-title" }, "Recommended Actions"),
2289
+ React.createElement("div", { className: "rb-analytics-directive-filters" },
2290
+ React.createElement("button", { onClick: () => setDirectiveFilter('all'), className: directiveFilter === 'all' ? 'active' : '' },
2291
+ "All (",
2292
+ result.directives.length,
2293
+ ")"),
2294
+ React.createElement("button", { onClick: () => setDirectiveFilter('proposed'), className: directiveFilter === 'proposed' ? 'active' : '' },
2295
+ "Proposed (",
2296
+ result.directives.filter(d => d.status === 'proposed').length,
2297
+ ")"),
2298
+ React.createElement("button", { onClick: () => setDirectiveFilter('executed'), className: directiveFilter === 'executed' ? 'active' : '' },
2299
+ "Executed (",
2300
+ result.directives.filter(d => d.status === 'executed').length,
2301
+ ")"),
2302
+ React.createElement("button", { onClick: () => setDirectiveFilter('declined'), className: directiveFilter === 'declined' ? 'active' : '' },
2303
+ "Declined (",
2304
+ result.directives.filter(d => d.status === 'declined').length,
2305
+ ")"))),
2306
+ filteredDirectives.length === 0 && (React.createElement("div", { className: "rb-analytics-empty-state" },
2307
+ React.createElement("p", null, "No directives match the selected filter."))),
2308
+ React.createElement("div", { className: "rb-analytics-directives-list" }, filteredDirectives.map((directive) => (React.createElement("div", { key: directive.directiveId, className: `rb-analytics-directive status-${directive.status}` },
2309
+ React.createElement("div", { className: "rb-analytics-directive-header" },
2310
+ React.createElement("div", null,
2311
+ React.createElement("span", { className: "rb-analytics-directive-action" }, directive.action),
2312
+ React.createElement("span", { className: `rb-analytics-directive-priority priority-${directive.priority}` },
2313
+ "Priority: ",
2314
+ directive.priority)),
2315
+ React.createElement("span", { className: `rb-analytics-directive-status ${directive.status}` }, directive.status)),
2316
+ React.createElement("div", { className: "rb-analytics-directive-rationale" }, directive.rationale),
2317
+ directive.parameters && directive.parameters.length > 0 && (React.createElement("div", { className: "rb-analytics-directive-parameters" },
2318
+ React.createElement("strong", null, "Parameters:"),
2319
+ React.createElement("ul", null, directive.parameters.map((param, index) => (React.createElement("li", { key: index },
2320
+ React.createElement("code", null, param.name),
2321
+ ": ",
2322
+ param.value)))))),
2323
+ directive.status === 'proposed' && (React.createElement("div", { className: "rb-analytics-directive-actions" },
2324
+ React.createElement("button", { onClick: () => handleDirectiveAction(directive, 'execute'), disabled: isProcessing, className: "rb-analytics-directive-btn execute" }, isProcessing ? 'Processing...' : 'Execute'),
2325
+ React.createElement("button", { onClick: () => handleDirectiveAction(directive, 'decline'), disabled: isProcessing, className: "rb-analytics-directive-btn decline" }, "Decline"))))))))))))));
2326
+ }
2327
+
2156
2328
  exports.AnalyticsAPI = AnalyticsAPI;
2329
+ exports.AnalyticsDashboard = AnalyticsDashboard;
2157
2330
  exports.AnalyticsReport = AnalyticsReport;
2158
2331
  exports.AnalyticsWidget = AnalyticsWidget;
2159
2332
  exports.DirectivesPanel = DirectivesPanel;