@memberjunction/ng-dashboards 5.37.0 → 5.39.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 +46 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +550 -532
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
- package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
- package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
- package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
- package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
- package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
- package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
- package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
- package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
- package/dist/Home/home-application.d.ts +21 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +60 -8
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +47 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +34 -22
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +65 -9
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +55 -53
|
@@ -1,48 +1,53 @@
|
|
|
1
1
|
import { Component, Output, EventEmitter, ViewChild } from '@angular/core';
|
|
2
2
|
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { buildCuratedFormSchema, } from '@memberjunction/interactive-component-types/forms';
|
|
3
4
|
import { MJReactComponent } from '@memberjunction/ng-react';
|
|
5
|
+
import { CompositeKey, LogError, RunView, } from '@memberjunction/core';
|
|
4
6
|
import { SharedService } from '@memberjunction/ng-shared';
|
|
7
|
+
import { buildFixtureFormHostProps } from '../../services/form-host-props-fixture';
|
|
5
8
|
import * as i0 from "@angular/core";
|
|
6
9
|
import * as i1 from "../../services/component-studio-state.service";
|
|
7
10
|
import * as i2 from "@angular/common";
|
|
8
|
-
import * as i3 from "@
|
|
11
|
+
import * as i3 from "@angular/forms";
|
|
12
|
+
import * as i4 from "@memberjunction/ng-react";
|
|
9
13
|
const _c0 = ["reactComponent"];
|
|
10
14
|
const _forTrack0 = ($index, $item) => $item.Size;
|
|
15
|
+
const _forTrack1 = ($index, $item) => $item.ID;
|
|
11
16
|
function ComponentPreviewComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
12
17
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
13
|
-
i0.ɵɵelementStart(0, "button",
|
|
18
|
+
i0.ɵɵelementStart(0, "button", 14);
|
|
14
19
|
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_3_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.StopComponent()); });
|
|
15
|
-
i0.ɵɵelement(1, "i",
|
|
20
|
+
i0.ɵɵelement(1, "i", 15);
|
|
16
21
|
i0.ɵɵelementStart(2, "span");
|
|
17
22
|
i0.ɵɵtext(3, "Stop");
|
|
18
23
|
i0.ɵɵelementEnd()();
|
|
19
|
-
i0.ɵɵelementStart(4, "button",
|
|
24
|
+
i0.ɵɵelementStart(4, "button", 16);
|
|
20
25
|
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_3_Conditional_0_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RefreshComponent()); });
|
|
21
|
-
i0.ɵɵelement(5, "i",
|
|
26
|
+
i0.ɵɵelement(5, "i", 17);
|
|
22
27
|
i0.ɵɵelementStart(6, "span");
|
|
23
28
|
i0.ɵɵtext(7, "Refresh");
|
|
24
29
|
i0.ɵɵelementEnd()();
|
|
25
30
|
} }
|
|
26
31
|
function ComponentPreviewComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
27
32
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
28
|
-
i0.ɵɵelementStart(0, "button",
|
|
33
|
+
i0.ɵɵelementStart(0, "button", 18);
|
|
29
34
|
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_3_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RunSelectedComponent()); });
|
|
30
|
-
i0.ɵɵelement(1, "i",
|
|
35
|
+
i0.ɵɵelement(1, "i", 19);
|
|
31
36
|
i0.ɵɵelementStart(2, "span");
|
|
32
37
|
i0.ɵɵtext(3, "Run");
|
|
33
38
|
i0.ɵɵelementEnd()();
|
|
34
39
|
} }
|
|
35
40
|
function ComponentPreviewComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
-
i0.ɵɵconditionalCreate(0, ComponentPreviewComponent_Conditional_3_Conditional_0_Template, 8, 0)(1, ComponentPreviewComponent_Conditional_3_Conditional_1_Template, 4, 0, "button",
|
|
41
|
+
i0.ɵɵconditionalCreate(0, ComponentPreviewComponent_Conditional_3_Conditional_0_Template, 8, 0)(1, ComponentPreviewComponent_Conditional_3_Conditional_1_Template, 4, 0, "button", 13);
|
|
37
42
|
} if (rf & 2) {
|
|
38
43
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
39
44
|
i0.ɵɵconditional(ctx_r1.State.IsRunning ? 0 : 1);
|
|
40
45
|
} }
|
|
41
46
|
function ComponentPreviewComponent_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
42
47
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
43
|
-
i0.ɵɵelementStart(0, "button",
|
|
48
|
+
i0.ɵɵelementStart(0, "button", 21);
|
|
44
49
|
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_5_For_2_Template_button_click_0_listener() { const preset_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SetViewport(preset_r5.Size)); });
|
|
45
|
-
i0.ɵɵelement(1, "i",
|
|
50
|
+
i0.ɵɵelement(1, "i", 22);
|
|
46
51
|
i0.ɵɵelementEnd();
|
|
47
52
|
} if (rf & 2) {
|
|
48
53
|
const preset_r5 = ctx.$implicit;
|
|
@@ -54,7 +59,7 @@ function ComponentPreviewComponent_Conditional_5_For_2_Template(rf, ctx) { if (r
|
|
|
54
59
|
} }
|
|
55
60
|
function ComponentPreviewComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
56
61
|
i0.ɵɵelementStart(0, "div", 5);
|
|
57
|
-
i0.ɵɵrepeaterCreate(1, ComponentPreviewComponent_Conditional_5_For_2_Template, 2, 4, "button",
|
|
62
|
+
i0.ɵɵrepeaterCreate(1, ComponentPreviewComponent_Conditional_5_For_2_Template, 2, 4, "button", 20, _forTrack0);
|
|
58
63
|
i0.ɵɵelementEnd();
|
|
59
64
|
} if (rf & 2) {
|
|
60
65
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -63,16 +68,16 @@ function ComponentPreviewComponent_Conditional_5_Template(rf, ctx) { if (rf & 1)
|
|
|
63
68
|
} }
|
|
64
69
|
function ComponentPreviewComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
65
70
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
66
|
-
i0.ɵɵelementStart(0, "button",
|
|
71
|
+
i0.ɵɵelementStart(0, "button", 23);
|
|
67
72
|
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SendErrorToAI()); });
|
|
68
|
-
i0.ɵɵelement(1, "i",
|
|
73
|
+
i0.ɵɵelement(1, "i", 24);
|
|
69
74
|
i0.ɵɵelementStart(2, "span");
|
|
70
75
|
i0.ɵɵtext(3, "Ask AI to Fix");
|
|
71
76
|
i0.ɵɵelementEnd()();
|
|
72
77
|
} }
|
|
73
78
|
function ComponentPreviewComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
74
79
|
i0.ɵɵelementStart(0, "span", 8);
|
|
75
|
-
i0.ɵɵelement(1, "i",
|
|
80
|
+
i0.ɵɵelement(1, "i", 25);
|
|
76
81
|
i0.ɵɵtext(2);
|
|
77
82
|
i0.ɵɵelementEnd();
|
|
78
83
|
} if (rf & 2) {
|
|
@@ -80,9 +85,76 @@ function ComponentPreviewComponent_Conditional_8_Template(rf, ctx) { if (rf & 1)
|
|
|
80
85
|
i0.ɵɵadvance(2);
|
|
81
86
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetComponentName(), " ");
|
|
82
87
|
} }
|
|
83
|
-
function
|
|
84
|
-
i0.ɵɵelementStart(0, "
|
|
85
|
-
i0.ɵɵ
|
|
88
|
+
function ComponentPreviewComponent_Conditional_9_Conditional_12_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
89
|
+
i0.ɵɵelementStart(0, "option", 34);
|
|
90
|
+
i0.ɵɵtext(1);
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
} if (rf & 2) {
|
|
93
|
+
const r_r9 = ctx.$implicit;
|
|
94
|
+
i0.ɵɵproperty("value", r_r9.ID);
|
|
95
|
+
i0.ɵɵadvance();
|
|
96
|
+
i0.ɵɵtextInterpolate(r_r9.Display);
|
|
97
|
+
} }
|
|
98
|
+
function ComponentPreviewComponent_Conditional_9_Conditional_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelement(0, "i", 35);
|
|
100
|
+
} }
|
|
101
|
+
function ComponentPreviewComponent_Conditional_9_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
103
|
+
i0.ɵɵelementStart(0, "div", 31)(1, "label");
|
|
104
|
+
i0.ɵɵtext(2, "Record");
|
|
105
|
+
i0.ɵɵelementEnd();
|
|
106
|
+
i0.ɵɵelementStart(3, "select", 32);
|
|
107
|
+
i0.ɵɵlistener("change", function ComponentPreviewComponent_Conditional_9_Conditional_12_Template_select_change_3_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnPickRecord($event)); });
|
|
108
|
+
i0.ɵɵelementStart(4, "option", 33);
|
|
109
|
+
i0.ɵɵtext(5, "\u2014 Fixture data \u2014");
|
|
110
|
+
i0.ɵɵelementEnd();
|
|
111
|
+
i0.ɵɵrepeaterCreate(6, ComponentPreviewComponent_Conditional_9_Conditional_12_For_7_Template, 2, 2, "option", 34, _forTrack1);
|
|
112
|
+
i0.ɵɵelementEnd();
|
|
113
|
+
i0.ɵɵconditionalCreate(8, ComponentPreviewComponent_Conditional_9_Conditional_12_Conditional_8_Template, 1, 0, "i", 35);
|
|
114
|
+
i0.ɵɵelementEnd();
|
|
115
|
+
} if (rf & 2) {
|
|
116
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
117
|
+
i0.ɵɵadvance(3);
|
|
118
|
+
i0.ɵɵproperty("value", ctx_r1.SelectedRecordID ?? "");
|
|
119
|
+
i0.ɵɵadvance(3);
|
|
120
|
+
i0.ɵɵrepeater(ctx_r1.RecentRecords);
|
|
121
|
+
i0.ɵɵadvance(2);
|
|
122
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingRecord ? 8 : -1);
|
|
123
|
+
} }
|
|
124
|
+
function ComponentPreviewComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
126
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 26);
|
|
127
|
+
i0.ɵɵelement(2, "i", 27);
|
|
128
|
+
i0.ɵɵtext(3, " PREVIEW \u2014 changes will not be saved ");
|
|
129
|
+
i0.ɵɵelementEnd();
|
|
130
|
+
i0.ɵɵelementStart(4, "div", 28)(5, "div", 29)(6, "button", 30);
|
|
131
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_9_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetFormPreviewMode("view")); });
|
|
132
|
+
i0.ɵɵtext(7, "View");
|
|
133
|
+
i0.ɵɵelementEnd();
|
|
134
|
+
i0.ɵɵelementStart(8, "button", 30);
|
|
135
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_9_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetFormPreviewMode("edit")); });
|
|
136
|
+
i0.ɵɵtext(9, "Edit");
|
|
137
|
+
i0.ɵɵelementEnd();
|
|
138
|
+
i0.ɵɵelementStart(10, "button", 30);
|
|
139
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_9_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetFormPreviewMode("create")); });
|
|
140
|
+
i0.ɵɵtext(11, "Create");
|
|
141
|
+
i0.ɵɵelementEnd()();
|
|
142
|
+
i0.ɵɵconditionalCreate(12, ComponentPreviewComponent_Conditional_9_Conditional_12_Template, 9, 2, "div", 31);
|
|
143
|
+
i0.ɵɵelementEnd()();
|
|
144
|
+
} if (rf & 2) {
|
|
145
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
146
|
+
i0.ɵɵadvance(6);
|
|
147
|
+
i0.ɵɵclassProp("active", ctx_r1.FormPreviewMode === "view");
|
|
148
|
+
i0.ɵɵadvance(2);
|
|
149
|
+
i0.ɵɵclassProp("active", ctx_r1.FormPreviewMode === "edit");
|
|
150
|
+
i0.ɵɵadvance(2);
|
|
151
|
+
i0.ɵɵclassProp("active", ctx_r1.FormPreviewMode === "create");
|
|
152
|
+
i0.ɵɵadvance(2);
|
|
153
|
+
i0.ɵɵconditional(ctx_r1.FormPreviewMode !== "create" && ctx_r1.FormTargetEntity ? 12 : -1);
|
|
154
|
+
} }
|
|
155
|
+
function ComponentPreviewComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
156
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
157
|
+
i0.ɵɵelement(1, "i", 36);
|
|
86
158
|
i0.ɵɵelementStart(2, "h3");
|
|
87
159
|
i0.ɵɵtext(3, "Select a component to preview");
|
|
88
160
|
i0.ɵɵelementEnd();
|
|
@@ -90,19 +162,19 @@ function ComponentPreviewComponent_Conditional_10_Template(rf, ctx) { if (rf & 1
|
|
|
90
162
|
i0.ɵɵtext(5, "Choose a component from the sidebar to see its live preview here.");
|
|
91
163
|
i0.ɵɵelementEnd()();
|
|
92
164
|
} }
|
|
93
|
-
function
|
|
94
|
-
const
|
|
95
|
-
i0.ɵɵelementStart(0, "div",
|
|
96
|
-
i0.ɵɵelement(1, "i",
|
|
165
|
+
function ComponentPreviewComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
166
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
167
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
168
|
+
i0.ɵɵelement(1, "i", 37);
|
|
97
169
|
i0.ɵɵelementStart(2, "h3");
|
|
98
170
|
i0.ɵɵtext(3);
|
|
99
171
|
i0.ɵɵelementEnd();
|
|
100
172
|
i0.ɵɵelementStart(4, "p");
|
|
101
173
|
i0.ɵɵtext(5);
|
|
102
174
|
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(6, "button",
|
|
104
|
-
i0.ɵɵlistener("click", function
|
|
105
|
-
i0.ɵɵelement(7, "i",
|
|
175
|
+
i0.ɵɵelementStart(6, "button", 38);
|
|
176
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_12_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RunSelectedComponent()); });
|
|
177
|
+
i0.ɵɵelement(7, "i", 19);
|
|
106
178
|
i0.ɵɵtext(8, " Run Component ");
|
|
107
179
|
i0.ɵɵelementEnd()();
|
|
108
180
|
} if (rf & 2) {
|
|
@@ -112,24 +184,64 @@ function ComponentPreviewComponent_Conditional_11_Template(rf, ctx) { if (rf & 1
|
|
|
112
184
|
i0.ɵɵadvance(2);
|
|
113
185
|
i0.ɵɵtextInterpolate(ctx_r1.GetComponentDescription() || "No description available");
|
|
114
186
|
} }
|
|
115
|
-
function
|
|
116
|
-
|
|
117
|
-
i0.ɵɵ
|
|
118
|
-
i0.ɵɵ
|
|
119
|
-
i0.ɵɵ
|
|
187
|
+
function ComponentPreviewComponent_Conditional_13_Conditional_3_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
188
|
+
i0.ɵɵelementStart(0, "li", 48)(1, "span", 49);
|
|
189
|
+
i0.ɵɵtext(2);
|
|
190
|
+
i0.ɵɵpipe(3, "date");
|
|
191
|
+
i0.ɵɵelementEnd();
|
|
192
|
+
i0.ɵɵelementStart(4, "span", 50);
|
|
120
193
|
i0.ɵɵtext(5);
|
|
194
|
+
i0.ɵɵelementEnd();
|
|
195
|
+
i0.ɵɵelementStart(6, "span", 51);
|
|
196
|
+
i0.ɵɵtext(7);
|
|
121
197
|
i0.ɵɵelementEnd()();
|
|
122
|
-
|
|
198
|
+
} if (rf & 2) {
|
|
199
|
+
const e_r13 = ctx.$implicit;
|
|
200
|
+
i0.ɵɵadvance(2);
|
|
201
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 3, e_r13.Timestamp, "HH:mm:ss"));
|
|
202
|
+
i0.ɵɵadvance(3);
|
|
203
|
+
i0.ɵɵtextInterpolate(e_r13.Type);
|
|
204
|
+
i0.ɵɵadvance(2);
|
|
205
|
+
i0.ɵɵtextInterpolate(e_r13.Payload);
|
|
206
|
+
} }
|
|
207
|
+
function ComponentPreviewComponent_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
208
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
209
|
+
i0.ɵɵelementStart(0, "div", 41)(1, "div", 43);
|
|
210
|
+
i0.ɵɵelement(2, "i", 44);
|
|
211
|
+
i0.ɵɵelementStart(3, "span");
|
|
212
|
+
i0.ɵɵtext(4, "Events (sandboxed)");
|
|
213
|
+
i0.ɵɵelementEnd();
|
|
214
|
+
i0.ɵɵelement(5, "span", 45);
|
|
215
|
+
i0.ɵɵelementStart(6, "button", 46);
|
|
216
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_13_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ClearEventLog()); });
|
|
217
|
+
i0.ɵɵtext(7, "Clear");
|
|
218
|
+
i0.ɵɵelementEnd()();
|
|
219
|
+
i0.ɵɵelementStart(8, "ul", 47);
|
|
220
|
+
i0.ɵɵrepeaterCreate(9, ComponentPreviewComponent_Conditional_13_Conditional_3_For_10_Template, 8, 6, "li", 48, i0.ɵɵrepeaterTrackByIndex);
|
|
221
|
+
i0.ɵɵelementEnd()();
|
|
222
|
+
} if (rf & 2) {
|
|
223
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
224
|
+
i0.ɵɵadvance(9);
|
|
225
|
+
i0.ɵɵrepeater(ctx_r1.EventLog);
|
|
226
|
+
} }
|
|
227
|
+
function ComponentPreviewComponent_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
229
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "div", 52)(2, "div", 53);
|
|
230
|
+
i0.ɵɵelement(3, "i", 54);
|
|
231
|
+
i0.ɵɵelementStart(4, "span", 55);
|
|
232
|
+
i0.ɵɵtext(5);
|
|
233
|
+
i0.ɵɵelementEnd()();
|
|
234
|
+
i0.ɵɵelementStart(6, "p", 56);
|
|
123
235
|
i0.ɵɵtext(7);
|
|
124
236
|
i0.ɵɵelementEnd();
|
|
125
|
-
i0.ɵɵelementStart(8, "div",
|
|
126
|
-
i0.ɵɵlistener("click", function
|
|
127
|
-
i0.ɵɵelement(10, "i",
|
|
237
|
+
i0.ɵɵelementStart(8, "div", 57)(9, "button", 58);
|
|
238
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_13_Conditional_4_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RefreshComponent()); });
|
|
239
|
+
i0.ɵɵelement(10, "i", 17);
|
|
128
240
|
i0.ɵɵtext(11, " Retry ");
|
|
129
241
|
i0.ɵɵelementEnd();
|
|
130
|
-
i0.ɵɵelementStart(12, "button",
|
|
131
|
-
i0.ɵɵlistener("click", function
|
|
132
|
-
i0.ɵɵelement(13, "i",
|
|
242
|
+
i0.ɵɵelementStart(12, "button", 59);
|
|
243
|
+
i0.ɵɵlistener("click", function ComponentPreviewComponent_Conditional_13_Conditional_4_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SendErrorToAI()); });
|
|
244
|
+
i0.ɵɵelement(13, "i", 24);
|
|
133
245
|
i0.ɵɵtext(14, " Ask AI to Fix ");
|
|
134
246
|
i0.ɵɵelementEnd()()()();
|
|
135
247
|
} if (rf & 2) {
|
|
@@ -139,20 +251,23 @@ function ComponentPreviewComponent_Conditional_12_Conditional_3_Template(rf, ctx
|
|
|
139
251
|
i0.ɵɵadvance(2);
|
|
140
252
|
i0.ɵɵtextInterpolate(ctx_r1.State.CurrentError.message);
|
|
141
253
|
} }
|
|
142
|
-
function
|
|
143
|
-
const
|
|
144
|
-
i0.ɵɵelementStart(0, "div",
|
|
145
|
-
i0.ɵɵlistener("componentEvent", function
|
|
254
|
+
function ComponentPreviewComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
255
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
256
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "mj-react-component", 40, 0);
|
|
257
|
+
i0.ɵɵlistener("componentEvent", function ComponentPreviewComponent_Conditional_13_Template_mj_react_component_componentEvent_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnComponentEvent($event)); })("initialized", function ComponentPreviewComponent_Conditional_13_Template_mj_react_component_initialized_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnReactInitialized()); })("openEntityRecord", function ComponentPreviewComponent_Conditional_13_Template_mj_react_component_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnOpenEntityRecord($event)); });
|
|
146
258
|
i0.ɵɵelementEnd()();
|
|
147
|
-
i0.ɵɵconditionalCreate(3,
|
|
259
|
+
i0.ɵɵconditionalCreate(3, ComponentPreviewComponent_Conditional_13_Conditional_3_Template, 11, 0, "div", 41);
|
|
260
|
+
i0.ɵɵconditionalCreate(4, ComponentPreviewComponent_Conditional_13_Conditional_4_Template, 15, 2, "div", 42);
|
|
148
261
|
} if (rf & 2) {
|
|
149
262
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
150
263
|
i0.ɵɵstyleProp("max-width", ctx_r1.GetPreviewContainerMaxWidth());
|
|
151
264
|
i0.ɵɵclassProp("mobile", ctx_r1.ActiveViewport === "mobile")("tablet", ctx_r1.ActiveViewport === "tablet")("desktop", ctx_r1.ActiveViewport === "desktop");
|
|
152
265
|
i0.ɵɵadvance();
|
|
153
|
-
i0.ɵɵproperty("component", ctx_r1.LocalComponentSpec);
|
|
266
|
+
i0.ɵɵproperty("component", ctx_r1.LocalComponentSpec)("componentProps", ctx_r1.FixtureFormHostProps);
|
|
154
267
|
i0.ɵɵadvance(2);
|
|
155
|
-
i0.ɵɵconditional(ctx_r1.
|
|
268
|
+
i0.ɵɵconditional(ctx_r1.IsFormRolePreview && ctx_r1.EventLog.length > 0 ? 3 : -1);
|
|
269
|
+
i0.ɵɵadvance();
|
|
270
|
+
i0.ɵɵconditional(ctx_r1.State.CurrentError ? 4 : -1);
|
|
156
271
|
} }
|
|
157
272
|
/**
|
|
158
273
|
* Component Preview - TOP section of CENTER panel.
|
|
@@ -172,7 +287,17 @@ export class ComponentPreviewComponent {
|
|
|
172
287
|
];
|
|
173
288
|
// --- Local spec for refresh cycle ---
|
|
174
289
|
LocalComponentSpec = null;
|
|
290
|
+
// ----- Form-role preview controls (sandboxed) -----
|
|
291
|
+
/** Recent records of the target entity for the optional real-record picker. */
|
|
292
|
+
RecentRecords = [];
|
|
293
|
+
SelectedRecordID = null;
|
|
294
|
+
/** When a real record is loaded, this holds its fields keyed by name. */
|
|
295
|
+
LoadedRecordValues = null;
|
|
296
|
+
IsLoadingRecord = false;
|
|
297
|
+
/** Last 20 events emitted by the previewed component, newest first. */
|
|
298
|
+
EventLog = [];
|
|
175
299
|
destroy$ = new Subject();
|
|
300
|
+
lastLoadedEntity = null;
|
|
176
301
|
constructor(State, cdr) {
|
|
177
302
|
this.State = State;
|
|
178
303
|
this.cdr = cdr;
|
|
@@ -183,6 +308,7 @@ export class ComponentPreviewComponent {
|
|
|
183
308
|
.pipe(takeUntil(this.destroy$))
|
|
184
309
|
.subscribe(() => {
|
|
185
310
|
this.syncSpecFromState();
|
|
311
|
+
this.maybeRefreshRecentRecords();
|
|
186
312
|
this.cdr.detectChanges();
|
|
187
313
|
});
|
|
188
314
|
this.State.RefreshComponent
|
|
@@ -190,6 +316,7 @@ export class ComponentPreviewComponent {
|
|
|
190
316
|
.subscribe(() => {
|
|
191
317
|
this.refreshPreview();
|
|
192
318
|
});
|
|
319
|
+
this.maybeRefreshRecentRecords();
|
|
193
320
|
}
|
|
194
321
|
ngOnDestroy() {
|
|
195
322
|
this.destroy$.next();
|
|
@@ -243,8 +370,145 @@ export class ComponentPreviewComponent {
|
|
|
243
370
|
technicalDetails: event.payload?.errorInfo || event.payload
|
|
244
371
|
};
|
|
245
372
|
this.cdr.detectChanges();
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
// Form-role event sandbox — log BeforeSave / BeforeDelete /
|
|
376
|
+
// FieldChanged events but never let them persist. The previewed
|
|
377
|
+
// component should treat the response as a no-op.
|
|
378
|
+
if (this.IsFormRolePreview) {
|
|
379
|
+
this.logEvent(event.type, event.payload);
|
|
380
|
+
this.cdr.detectChanges();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// ============================================================
|
|
384
|
+
// FORM PREVIEW HELPERS
|
|
385
|
+
// ============================================================
|
|
386
|
+
/** True when the current spec is form-role (drives the sandbox UI). */
|
|
387
|
+
get IsFormRolePreview() {
|
|
388
|
+
const spec = this.LocalComponentSpec;
|
|
389
|
+
return !!spec && (spec.componentRole === 'form' || spec.type === 'form');
|
|
390
|
+
}
|
|
391
|
+
/** Convenience for the template — the entity name the form binds to. */
|
|
392
|
+
get FormTargetEntity() {
|
|
393
|
+
return this.State.FormTargetEntityName;
|
|
394
|
+
}
|
|
395
|
+
/** Selected preview mode (delegates to the shared state). */
|
|
396
|
+
get FormPreviewMode() {
|
|
397
|
+
return this.State.FormPreviewMode;
|
|
398
|
+
}
|
|
399
|
+
SetFormPreviewMode(mode) {
|
|
400
|
+
this.State.FormPreviewMode = mode;
|
|
401
|
+
// Switching mode invalidates any loaded record diff — clear it so the
|
|
402
|
+
// refreshed render starts fresh.
|
|
403
|
+
if (mode === 'create') {
|
|
404
|
+
this.SelectedRecordID = null;
|
|
405
|
+
this.LoadedRecordValues = null;
|
|
406
|
+
}
|
|
407
|
+
this.refreshPreview();
|
|
408
|
+
}
|
|
409
|
+
/** Add an entry to the event log; keep the log bounded to 20 entries. */
|
|
410
|
+
logEvent(type, payload) {
|
|
411
|
+
const entry = {
|
|
412
|
+
Timestamp: new Date(),
|
|
413
|
+
Type: type,
|
|
414
|
+
Payload: this.summarisePayload(payload),
|
|
415
|
+
};
|
|
416
|
+
this.EventLog = [entry, ...this.EventLog].slice(0, 20);
|
|
417
|
+
}
|
|
418
|
+
summarisePayload(payload) {
|
|
419
|
+
if (payload == null)
|
|
420
|
+
return '—';
|
|
421
|
+
try {
|
|
422
|
+
const s = JSON.stringify(payload);
|
|
423
|
+
return s.length > 200 ? s.slice(0, 200) + '…' : s;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return String(payload);
|
|
246
427
|
}
|
|
247
428
|
}
|
|
429
|
+
ClearEventLog() {
|
|
430
|
+
this.EventLog = [];
|
|
431
|
+
this.cdr.detectChanges();
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Load the top 10 most-recent records for the target entity so the
|
|
435
|
+
* preview can swap from fixture to real-record mode. Re-runs whenever
|
|
436
|
+
* the target entity changes; quiet no-op if entity isn't set yet.
|
|
437
|
+
*/
|
|
438
|
+
async maybeRefreshRecentRecords() {
|
|
439
|
+
const entityName = this.State.FormTargetEntityName;
|
|
440
|
+
if (!entityName || entityName === this.lastLoadedEntity)
|
|
441
|
+
return;
|
|
442
|
+
this.lastLoadedEntity = entityName;
|
|
443
|
+
this.RecentRecords = [];
|
|
444
|
+
try {
|
|
445
|
+
const rv = RunView.FromMetadataProvider(this.State.Provider);
|
|
446
|
+
const entityInfo = this.State.Provider.EntityByName(entityName);
|
|
447
|
+
const nameField = entityInfo?.NameField?.Name ?? 'ID';
|
|
448
|
+
const fields = nameField === 'ID' ? ['ID'] : ['ID', nameField];
|
|
449
|
+
const result = await rv.RunView({
|
|
450
|
+
EntityName: entityName,
|
|
451
|
+
Fields: fields,
|
|
452
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
453
|
+
MaxRows: 10,
|
|
454
|
+
ResultType: 'simple',
|
|
455
|
+
});
|
|
456
|
+
if (result.Success && Array.isArray(result.Results)) {
|
|
457
|
+
this.RecentRecords = result.Results.map(r => ({
|
|
458
|
+
ID: String(r['ID'] ?? ''),
|
|
459
|
+
Display: String(r[nameField] ?? r['ID'] ?? ''),
|
|
460
|
+
})).filter(r => r.ID.length > 0);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
catch (err) {
|
|
464
|
+
LogError(`ComponentPreview.maybeRefreshRecentRecords: ${err instanceof Error ? err.message : String(err)}`);
|
|
465
|
+
}
|
|
466
|
+
this.cdr.detectChanges();
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Load a real record for preview. We pull the full entity object then
|
|
470
|
+
* extract its field values into a plain object for FormHostProps.
|
|
471
|
+
* Sandboxed — any BeforeSave/BeforeDelete events emitted by the previewed
|
|
472
|
+
* component are logged, never applied.
|
|
473
|
+
*/
|
|
474
|
+
async OnPickRecord(event) {
|
|
475
|
+
const id = event.target.value || null;
|
|
476
|
+
this.SelectedRecordID = id;
|
|
477
|
+
if (!id) {
|
|
478
|
+
this.LoadedRecordValues = null;
|
|
479
|
+
this.refreshPreview();
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const entityName = this.State.FormTargetEntityName;
|
|
483
|
+
if (!entityName)
|
|
484
|
+
return;
|
|
485
|
+
this.IsLoadingRecord = true;
|
|
486
|
+
this.cdr.detectChanges();
|
|
487
|
+
try {
|
|
488
|
+
const provider = this.State.Provider;
|
|
489
|
+
const entity = await provider.GetEntityObject(entityName, provider.CurrentUser);
|
|
490
|
+
const compositeKey = CompositeKey.FromID(id);
|
|
491
|
+
const loaded = await entity.InnerLoad(compositeKey);
|
|
492
|
+
if (loaded) {
|
|
493
|
+
const values = {};
|
|
494
|
+
for (const f of entity.Fields) {
|
|
495
|
+
values[f.Name] = f.Value;
|
|
496
|
+
}
|
|
497
|
+
this.LoadedRecordValues = values;
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
this.LoadedRecordValues = null;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
catch (err) {
|
|
504
|
+
LogError(`ComponentPreview.OnPickRecord: ${err instanceof Error ? err.message : String(err)}`);
|
|
505
|
+
this.LoadedRecordValues = null;
|
|
506
|
+
}
|
|
507
|
+
finally {
|
|
508
|
+
this.IsLoadingRecord = false;
|
|
509
|
+
}
|
|
510
|
+
this.refreshPreview();
|
|
511
|
+
}
|
|
248
512
|
/**
|
|
249
513
|
* Fires once the React bridge has resolved the full component hierarchy from the
|
|
250
514
|
* registry. The bridge stores the resolved spec (with real dependency code, not
|
|
@@ -280,6 +544,50 @@ export class ComponentPreviewComponent {
|
|
|
280
544
|
syncSpecFromState() {
|
|
281
545
|
this.LocalComponentSpec = this.State.ComponentSpec;
|
|
282
546
|
}
|
|
547
|
+
/**
|
|
548
|
+
* Fixture `FormHostProps` for form-role component previews. Built from
|
|
549
|
+
* the curated schema of `State.FormTargetEntityName` — the entity the
|
|
550
|
+
* user picked in the Field Binding Inspector. Returns an empty object
|
|
551
|
+
* when (a) the current spec isn't a form, (b) no target entity is
|
|
552
|
+
* selected, or (c) the entity isn't registered with the provider — in
|
|
553
|
+
* which case the previewed component sees `record === undefined` and
|
|
554
|
+
* should handle that gracefully (the Studio skeleton does).
|
|
555
|
+
*
|
|
556
|
+
* The mode toggles to 'edit' so authors can see how inputs render
|
|
557
|
+
* without manually flipping mode each refresh.
|
|
558
|
+
*/
|
|
559
|
+
get FixtureFormHostProps() {
|
|
560
|
+
const spec = this.LocalComponentSpec;
|
|
561
|
+
if (!spec || (spec.componentRole !== 'form' && spec.type !== 'form')) {
|
|
562
|
+
return {};
|
|
563
|
+
}
|
|
564
|
+
const entityName = this.State.FormTargetEntityName;
|
|
565
|
+
if (!entityName) {
|
|
566
|
+
return {};
|
|
567
|
+
}
|
|
568
|
+
const provider = this.State.Provider;
|
|
569
|
+
if (!provider)
|
|
570
|
+
return {};
|
|
571
|
+
const schema = buildCuratedFormSchema(entityName, provider);
|
|
572
|
+
if (!schema)
|
|
573
|
+
return {};
|
|
574
|
+
const mode = this.State.FormPreviewMode;
|
|
575
|
+
const fixture = buildFixtureFormHostProps(schema, mode);
|
|
576
|
+
// If the user picked a real record, overlay its field values on top of
|
|
577
|
+
// the fixture (which has the right shape for entityMetadata + caps).
|
|
578
|
+
// The record is still sandboxed — events fired by the previewed
|
|
579
|
+
// component never reach a Save().
|
|
580
|
+
if (this.LoadedRecordValues && mode !== 'create') {
|
|
581
|
+
return {
|
|
582
|
+
...fixture,
|
|
583
|
+
record: this.LoadedRecordValues,
|
|
584
|
+
primaryKey: this.SelectedRecordID
|
|
585
|
+
? { ID: this.SelectedRecordID }
|
|
586
|
+
: fixture.primaryKey,
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
return fixture;
|
|
590
|
+
}
|
|
283
591
|
/**
|
|
284
592
|
* Refresh the preview by nulling the spec, detecting changes,
|
|
285
593
|
* then restoring the spec after a short delay. The bridge's own
|
|
@@ -312,7 +620,7 @@ export class ComponentPreviewComponent {
|
|
|
312
620
|
} if (rf & 2) {
|
|
313
621
|
let _t;
|
|
314
622
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ReactComponentRef = _t.first);
|
|
315
|
-
} }, outputs: { AskAIToFix: "AskAIToFix" }, standalone: false, decls:
|
|
623
|
+
} }, outputs: { AskAIToFix: "AskAIToFix" }, standalone: false, decls: 14, vars: 6, consts: [["reactComponent", ""], [1, "component-preview"], [1, "preview-toolbar"], [1, "toolbar-left"], [1, "toolbar-center"], [1, "viewport-selector"], [1, "toolbar-right"], ["title", "Ask AI to fix this error", 1, "toolbar-btn", "ai-fix-btn"], [1, "running-indicator"], [1, "form-preview-bar"], [1, "preview-area"], [1, "empty-state"], [1, "empty-state", "run-state"], ["title", "Run component", 1, "toolbar-btn", "run-btn"], ["title", "Stop component", 1, "toolbar-btn", "stop-btn", 3, "click"], [1, "fa-solid", "fa-stop"], ["title", "Refresh component", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], ["title", "Run component", 1, "toolbar-btn", "run-btn", 3, "click"], [1, "fa-solid", "fa-play"], [1, "viewport-btn", 3, "active", "title"], [1, "viewport-btn", 3, "click", "title"], [1, "fa-solid", 3, "ngClass"], ["title", "Ask AI to fix this error", 1, "toolbar-btn", "ai-fix-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "fa-solid", "fa-circle", "running-dot"], [1, "form-preview-banner"], [1, "fa-solid", "fa-shield-halved"], [1, "form-preview-controls"], [1, "form-mode-pills"], [1, "form-mode-pill", 3, "click"], [1, "form-record-picker"], [3, "change", "value"], ["value", ""], [3, "value"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-eye", "fa-3x"], [1, "fa-solid", "fa-play-circle", "fa-3x"], [1, "run-component-btn", 3, "click"], [1, "preview-container"], [3, "componentEvent", "initialized", "openEntityRecord", "component", "componentProps"], [1, "form-event-log"], [1, "error-overlay"], [1, "form-event-log-header"], [1, "fa-solid", "fa-list"], [1, "spacer"], [1, "form-event-log-clear", 3, "click"], [1, "form-event-log-list"], [1, "form-event-log-row"], [1, "form-event-log-ts"], [1, "form-event-log-type"], [1, "form-event-log-payload"], [1, "error-overlay-content"], [1, "error-overlay-header"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-overlay-title"], [1, "error-overlay-message"], [1, "error-overlay-actions"], [1, "toolbar-btn", 3, "click"], [1, "toolbar-btn", "ai-fix-btn", 3, "click"]], template: function ComponentPreviewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
316
624
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3);
|
|
317
625
|
i0.ɵɵconditionalCreate(3, ComponentPreviewComponent_Conditional_3_Template, 2, 1);
|
|
318
626
|
i0.ɵɵelementEnd();
|
|
@@ -323,8 +631,9 @@ export class ComponentPreviewComponent {
|
|
|
323
631
|
i0.ɵɵconditionalCreate(7, ComponentPreviewComponent_Conditional_7_Template, 4, 0, "button", 7);
|
|
324
632
|
i0.ɵɵconditionalCreate(8, ComponentPreviewComponent_Conditional_8_Template, 3, 1, "span", 8);
|
|
325
633
|
i0.ɵɵelementEnd()();
|
|
326
|
-
i0.ɵɵ
|
|
327
|
-
i0.ɵɵ
|
|
634
|
+
i0.ɵɵconditionalCreate(9, ComponentPreviewComponent_Conditional_9_Template, 13, 7, "div", 9);
|
|
635
|
+
i0.ɵɵelementStart(10, "div", 10);
|
|
636
|
+
i0.ɵɵconditionalCreate(11, ComponentPreviewComponent_Conditional_11_Template, 6, 0, "div", 11)(12, ComponentPreviewComponent_Conditional_12_Template, 9, 2, "div", 12)(13, ComponentPreviewComponent_Conditional_13_Template, 5, 12);
|
|
328
637
|
i0.ɵɵelementEnd()();
|
|
329
638
|
} if (rf & 2) {
|
|
330
639
|
i0.ɵɵadvance(3);
|
|
@@ -335,18 +644,20 @@ export class ComponentPreviewComponent {
|
|
|
335
644
|
i0.ɵɵconditional(ctx.State.CurrentError ? 7 : -1);
|
|
336
645
|
i0.ɵɵadvance();
|
|
337
646
|
i0.ɵɵconditional(ctx.State.IsRunning && ctx.State.SelectedComponent ? 8 : -1);
|
|
647
|
+
i0.ɵɵadvance();
|
|
648
|
+
i0.ɵɵconditional(ctx.IsFormRolePreview && ctx.State.IsRunning ? 9 : -1);
|
|
338
649
|
i0.ɵɵadvance(2);
|
|
339
|
-
i0.ɵɵconditional(!ctx.State.SelectedComponent ?
|
|
340
|
-
} }, dependencies: [i2.NgClass, i3.MJReactComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n\n\n\n\n\n.preview-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n min-height: 42px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%], \n.preview-toolbar[_ngcontent-%COMP%] .toolbar-center[_ngcontent-%COMP%], \n.preview-toolbar[_ngcontent-%COMP%] .toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-center[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n justify-content: center;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-right[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.toolbar-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.toolbar-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.toolbar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.run-btn[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.run-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 60%, transparent);\n}\n\n.stop-btn[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.stop-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 60%, transparent);\n}\n\n.ai-fix-btn[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.ai-fix-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\n\n.running-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.running-indicator[_ngcontent-%COMP%] .running-dot[_ngcontent-%COMP%] {\n font-size: 7px;\n color: var(--mj-status-success);\n animation: _ngcontent-%COMP%_pulse-dot 1.5s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse-dot {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n}\n\n\n\n\n\n\n.viewport-selector[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.viewport-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 0.15s ease;\n}\n\n.viewport-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.viewport-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.viewport-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.viewport-btn.active[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.preview-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n justify-content: center;\n}\n\n.preview-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n margin: 0 auto;\n transition: max-width 0.3s ease;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.preview-container.mobile[_ngcontent-%COMP%], \n.preview-container.tablet[_ngcontent-%COMP%] {\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.preview-container.desktop[_ngcontent-%COMP%] {\n max-width: 100% !important;\n}\n\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n text-align: center;\n padding: 40px 24px;\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n color: var(--mj-border-default);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n max-width: 320px;\n line-height: 1.5;\n}\n\n.run-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.run-component-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 10px 24px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-component-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.run-component-btn[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n.run-component-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\n.error-overlay[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-top: 2px solid var(--mj-status-error);\n backdrop-filter: blur(4px);\n padding: 16px 20px;\n animation: _ngcontent-%COMP%_slide-up 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n.error-overlay-content[_ngcontent-%COMP%] {\n max-width: 600px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 16px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] .error-overlay-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-status-error);\n}\n\n.error-overlay-message[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.error-overlay-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}"] });
|
|
650
|
+
i0.ɵɵconditional(!ctx.State.SelectedComponent ? 11 : !ctx.State.IsRunning ? 12 : ctx.LocalComponentSpec ? 13 : -1);
|
|
651
|
+
} }, dependencies: [i2.NgClass, i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i4.MJReactComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n\n\n\n\n\n.preview-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n min-height: 42px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%], \n.preview-toolbar[_ngcontent-%COMP%] .toolbar-center[_ngcontent-%COMP%], \n.preview-toolbar[_ngcontent-%COMP%] .toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-center[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n justify-content: center;\n}\n\n.preview-toolbar[_ngcontent-%COMP%] .toolbar-right[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.toolbar-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.toolbar-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.toolbar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.run-btn[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.run-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 60%, transparent);\n}\n\n.stop-btn[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.stop-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 60%, transparent);\n}\n\n.ai-fix-btn[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.ai-fix-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\n\n.running-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.running-indicator[_ngcontent-%COMP%] .running-dot[_ngcontent-%COMP%] {\n font-size: 7px;\n color: var(--mj-status-success);\n animation: _ngcontent-%COMP%_pulse-dot 1.5s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse-dot {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n}\n\n\n\n\n\n\n.viewport-selector[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.viewport-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 0.15s ease;\n}\n\n.viewport-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.viewport-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.viewport-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.viewport-btn.active[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.preview-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n justify-content: center;\n}\n\n.preview-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n margin: 0 auto;\n transition: max-width 0.3s ease;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.preview-container.mobile[_ngcontent-%COMP%], \n.preview-container.tablet[_ngcontent-%COMP%] {\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.preview-container.desktop[_ngcontent-%COMP%] {\n max-width: 100% !important;\n}\n\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n text-align: center;\n padding: 40px 24px;\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n color: var(--mj-border-default);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n max-width: 320px;\n line-height: 1.5;\n}\n\n.run-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.run-component-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 10px 24px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-component-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.run-component-btn[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n.run-component-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\n.error-overlay[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-top: 2px solid var(--mj-status-error);\n backdrop-filter: blur(4px);\n padding: 16px 20px;\n animation: _ngcontent-%COMP%_slide-up 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n.error-overlay-content[_ngcontent-%COMP%] {\n max-width: 600px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 16px;\n}\n\n.error-overlay-header[_ngcontent-%COMP%] .error-overlay-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-status-error);\n}\n\n.error-overlay-message[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.error-overlay-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n\n\n.form-preview-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 12px;\n background: var(--mj-status-warning-bg);\n border-bottom: 1px solid var(--mj-status-warning-border);\n flex-wrap: wrap;\n}\n\n.form-preview-banner[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-warning-text);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.form-preview-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n flex-wrap: wrap;\n}\n\n.form-mode-pills[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.form-mode-pill[_ngcontent-%COMP%] {\n padding: 4px 12px;\n background: transparent;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s ease;\n}\n\n.form-mode-pill[_ngcontent-%COMP%]:last-child {\n border-right: none;\n}\n\n.form-mode-pill[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.form-mode-pill.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-weight: 600;\n}\n\n.form-record-picker[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-primary);\n}\n\n.form-record-picker[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.form-record-picker[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-family: inherit;\n}\n\n\n\n\n\n.form-event-log[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n left: 8px;\n right: 8px;\n max-height: 160px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n z-index: 10;\n}\n\n.form-event-log-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px 6px 0 0;\n}\n\n.form-event-log-header[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.form-event-log-clear[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-family: inherit;\n}\n\n.form-event-log-list[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 4px;\n overflow-y: auto;\n flex: 1;\n}\n\n.form-event-log-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 4px 6px;\n font-size: 11px;\n font-family: ui-monospace, monospace;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.form-event-log-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.form-event-log-ts[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.form-event-log-type[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.form-event-log-payload[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n\n.preview-area[_ngcontent-%COMP%] {\n position: relative;\n}"] });
|
|
341
652
|
}
|
|
342
653
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentPreviewComponent, [{
|
|
343
654
|
type: Component,
|
|
344
|
-
args: [{ standalone: false, selector: 'mj-component-preview', template: "<div class=\"component-preview\">\n <!-- Toolbar -->\n <div class=\"preview-toolbar\">\n <div class=\"toolbar-left\">\n @if (State.SelectedComponent) {\n @if (State.IsRunning) {\n <button class=\"toolbar-btn stop-btn\" (click)=\"StopComponent()\" title=\"Stop component\">\n <i class=\"fa-solid fa-stop\"></i>\n <span>Stop</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"RefreshComponent()\" title=\"Refresh component\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n <span>Refresh</span>\n </button>\n } @else {\n <button class=\"toolbar-btn run-btn\" (click)=\"RunSelectedComponent()\" title=\"Run component\">\n <i class=\"fa-solid fa-play\"></i>\n <span>Run</span>\n </button>\n }\n }\n </div>\n\n <div class=\"toolbar-center\">\n <!-- Viewport Size Selector (segmented control) -->\n @if (State.IsRunning) {\n <div class=\"viewport-selector\">\n @for (preset of ViewportPresets; track preset.Size) {\n <button\n class=\"viewport-btn\"\n [class.active]=\"ActiveViewport === preset.Size\"\n (click)=\"SetViewport(preset.Size)\"\n [title]=\"preset.Label\">\n <i class=\"fa-solid\" [ngClass]=\"preset.Icon\"></i>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"toolbar-right\">\n @if (State.CurrentError) {\n <button class=\"toolbar-btn ai-fix-btn\" (click)=\"SendErrorToAI()\" title=\"Ask AI to fix this error\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Ask AI to Fix</span>\n </button>\n }\n @if (State.IsRunning && State.SelectedComponent) {\n <span class=\"running-indicator\">\n <i class=\"fa-solid fa-circle running-dot\"></i>\n {{ GetComponentName() }}\n </span>\n }\n </div>\n </div>\n\n <!-- Preview Area -->\n <div class=\"preview-area\">\n @if (!State.SelectedComponent) {\n <!-- Empty State: No component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-eye fa-3x\"></i>\n <h3>Select a component to preview</h3>\n <p>Choose a component from the sidebar to see its live preview here.</p>\n </div>\n } @else if (!State.IsRunning) {\n <!-- Component selected but not running -->\n <div class=\"empty-state run-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>{{ GetComponentName() }}</h3>\n <p>{{ GetComponentDescription() || 'No description available' }}</p>\n <button class=\"run-component-btn\" (click)=\"RunSelectedComponent()\">\n <i class=\"fa-solid fa-play\"></i> Run Component\n </button>\n </div>\n } @else if (LocalComponentSpec) {\n <!-- Live Preview Container -->\n <div class=\"preview-container\"\n [style.max-width]=\"GetPreviewContainerMaxWidth()\"\n [class.mobile]=\"ActiveViewport === 'mobile'\"\n [class.tablet]=\"ActiveViewport === 'tablet'\"\n [class.desktop]=\"ActiveViewport === 'desktop'\">\n <mj-react-component\n #reactComponent\n [component]=\"LocalComponentSpec\"\n (componentEvent)=\"OnComponentEvent($event)\"\n (initialized)=\"OnReactInitialized()\"\n (openEntityRecord)=\"OnOpenEntityRecord($event)\">\n </mj-react-component>\n </div>\n\n <!-- Error Overlay (inline, does not replace the component) -->\n @if (State.CurrentError) {\n <div class=\"error-overlay\">\n <div class=\"error-overlay-content\">\n <div class=\"error-overlay-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span class=\"error-overlay-title\">{{ State.CurrentError.type }}</span>\n </div>\n <p class=\"error-overlay-message\">{{ State.CurrentError.message }}</p>\n <div class=\"error-overlay-actions\">\n <button class=\"toolbar-btn\" (click)=\"RefreshComponent()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry\n </button>\n <button class=\"toolbar-btn ai-fix-btn\" (click)=\"SendErrorToAI()\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Ask AI to Fix\n </button>\n </div>\n </div>\n </div>\n }\n }\n </div>\n</div>\n", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-preview {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n/* ============================================================\n TOOLBAR\n ============================================================ */\n\n.preview-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n min-height: 42px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.preview-toolbar .toolbar-left,\n.preview-toolbar .toolbar-center,\n.preview-toolbar .toolbar-right {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.preview-toolbar .toolbar-left {\n flex: 0 0 auto;\n}\n\n.preview-toolbar .toolbar-center {\n flex: 1 1 auto;\n justify-content: center;\n}\n\n.preview-toolbar .toolbar-right {\n flex: 0 0 auto;\n}\n\n.toolbar-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.toolbar-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.toolbar-btn i {\n font-size: 11px;\n}\n\n.run-btn {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.run-btn:hover {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 60%, transparent);\n}\n\n.stop-btn {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.stop-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 60%, transparent);\n}\n\n.ai-fix-btn {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.ai-fix-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\n\n.running-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.running-indicator .running-dot {\n font-size: 7px;\n color: var(--mj-status-success);\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-dot {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n}\n\n/* ============================================================\n VIEWPORT SELECTOR (segmented control)\n ============================================================ */\n\n.viewport-selector {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.viewport-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 0.15s ease;\n}\n\n.viewport-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.viewport-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.viewport-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.viewport-btn.active:hover {\n background: var(--mj-brand-primary);\n}\n\n/* ============================================================\n PREVIEW AREA\n ============================================================ */\n\n.preview-area {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n justify-content: center;\n}\n\n.preview-container {\n width: 100%;\n height: 100%;\n margin: 0 auto;\n transition: max-width 0.3s ease;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.preview-container.mobile,\n.preview-container.tablet {\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.preview-container.desktop {\n max-width: 100% !important;\n}\n\n/* ============================================================\n EMPTY STATES\n ============================================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n text-align: center;\n padding: 40px 24px;\n color: var(--mj-text-secondary);\n}\n\n.empty-state i {\n margin-bottom: 16px;\n color: var(--mj-border-default);\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n max-width: 320px;\n line-height: 1.5;\n}\n\n.run-state h3 {\n color: var(--mj-text-primary);\n}\n\n.run-component-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 10px 24px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-component-btn:hover {\n background: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.run-component-btn:active {\n transform: translateY(0);\n}\n\n.run-component-btn i {\n font-size: 13px;\n}\n\n/* ============================================================\n ERROR OVERLAY\n ============================================================ */\n\n.error-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-top: 2px solid var(--mj-status-error);\n backdrop-filter: blur(4px);\n padding: 16px 20px;\n animation: slide-up 0.2s ease-out;\n}\n\n@keyframes slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n.error-overlay-content {\n max-width: 600px;\n}\n\n.error-overlay-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.error-overlay-header i {\n color: var(--mj-status-error);\n font-size: 16px;\n}\n\n.error-overlay-header .error-overlay-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-status-error);\n}\n\n.error-overlay-message {\n margin: 0 0 12px 0;\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.error-overlay-actions {\n display: flex;\n gap: 8px;\n}\n"] }]
|
|
655
|
+
args: [{ standalone: false, selector: 'mj-component-preview', template: "<div class=\"component-preview\">\n <!-- Toolbar -->\n <div class=\"preview-toolbar\">\n <div class=\"toolbar-left\">\n @if (State.SelectedComponent) {\n @if (State.IsRunning) {\n <button class=\"toolbar-btn stop-btn\" (click)=\"StopComponent()\" title=\"Stop component\">\n <i class=\"fa-solid fa-stop\"></i>\n <span>Stop</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"RefreshComponent()\" title=\"Refresh component\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n <span>Refresh</span>\n </button>\n } @else {\n <button class=\"toolbar-btn run-btn\" (click)=\"RunSelectedComponent()\" title=\"Run component\">\n <i class=\"fa-solid fa-play\"></i>\n <span>Run</span>\n </button>\n }\n }\n </div>\n\n <div class=\"toolbar-center\">\n <!-- Viewport Size Selector (segmented control) -->\n @if (State.IsRunning) {\n <div class=\"viewport-selector\">\n @for (preset of ViewportPresets; track preset.Size) {\n <button\n class=\"viewport-btn\"\n [class.active]=\"ActiveViewport === preset.Size\"\n (click)=\"SetViewport(preset.Size)\"\n [title]=\"preset.Label\">\n <i class=\"fa-solid\" [ngClass]=\"preset.Icon\"></i>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"toolbar-right\">\n @if (State.CurrentError) {\n <button class=\"toolbar-btn ai-fix-btn\" (click)=\"SendErrorToAI()\" title=\"Ask AI to fix this error\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Ask AI to Fix</span>\n </button>\n }\n @if (State.IsRunning && State.SelectedComponent) {\n <span class=\"running-indicator\">\n <i class=\"fa-solid fa-circle running-dot\"></i>\n {{ GetComponentName() }}\n </span>\n }\n </div>\n </div>\n\n <!-- Form-role preview controls (banner + mode + real-record picker).\n Visible only for componentRole==='form' components, since they're\n the only ones that bind to a record. -->\n @if (IsFormRolePreview && State.IsRunning) {\n <div class=\"form-preview-bar\">\n <div class=\"form-preview-banner\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n PREVIEW \u2014 changes will not be saved\n </div>\n <div class=\"form-preview-controls\">\n <!-- Mode pills synced with the Form Builder tab -->\n <div class=\"form-mode-pills\">\n <button class=\"form-mode-pill\"\n [class.active]=\"FormPreviewMode === 'view'\"\n (click)=\"SetFormPreviewMode('view')\">View</button>\n <button class=\"form-mode-pill\"\n [class.active]=\"FormPreviewMode === 'edit'\"\n (click)=\"SetFormPreviewMode('edit')\">Edit</button>\n <button class=\"form-mode-pill\"\n [class.active]=\"FormPreviewMode === 'create'\"\n (click)=\"SetFormPreviewMode('create')\">Create</button>\n </div>\n\n <!-- Real-record picker; null = fixture data -->\n @if (FormPreviewMode !== 'create' && FormTargetEntity) {\n <div class=\"form-record-picker\">\n <label>Record</label>\n <select [value]=\"SelectedRecordID ?? ''\" (change)=\"OnPickRecord($event)\">\n <option value=\"\">\u2014 Fixture data \u2014</option>\n @for (r of RecentRecords; track r.ID) {\n <option [value]=\"r.ID\">{{ r.Display }}</option>\n }\n </select>\n @if (IsLoadingRecord) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Preview Area -->\n <div class=\"preview-area\">\n @if (!State.SelectedComponent) {\n <!-- Empty State: No component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-eye fa-3x\"></i>\n <h3>Select a component to preview</h3>\n <p>Choose a component from the sidebar to see its live preview here.</p>\n </div>\n } @else if (!State.IsRunning) {\n <!-- Component selected but not running -->\n <div class=\"empty-state run-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>{{ GetComponentName() }}</h3>\n <p>{{ GetComponentDescription() || 'No description available' }}</p>\n <button class=\"run-component-btn\" (click)=\"RunSelectedComponent()\">\n <i class=\"fa-solid fa-play\"></i> Run Component\n </button>\n </div>\n } @else if (LocalComponentSpec) {\n <!-- Live Preview Container -->\n <div class=\"preview-container\"\n [style.max-width]=\"GetPreviewContainerMaxWidth()\"\n [class.mobile]=\"ActiveViewport === 'mobile'\"\n [class.tablet]=\"ActiveViewport === 'tablet'\"\n [class.desktop]=\"ActiveViewport === 'desktop'\">\n <mj-react-component\n #reactComponent\n [component]=\"LocalComponentSpec\"\n [componentProps]=\"FixtureFormHostProps\"\n (componentEvent)=\"OnComponentEvent($event)\"\n (initialized)=\"OnReactInitialized()\"\n (openEntityRecord)=\"OnOpenEntityRecord($event)\">\n </mj-react-component>\n </div>\n\n <!-- Form-role sandboxed event log -->\n @if (IsFormRolePreview && EventLog.length > 0) {\n <div class=\"form-event-log\">\n <div class=\"form-event-log-header\">\n <i class=\"fa-solid fa-list\"></i>\n <span>Events (sandboxed)</span>\n <span class=\"spacer\"></span>\n <button class=\"form-event-log-clear\" (click)=\"ClearEventLog()\">Clear</button>\n </div>\n <ul class=\"form-event-log-list\">\n @for (e of EventLog; track $index) {\n <li class=\"form-event-log-row\">\n <span class=\"form-event-log-ts\">{{ e.Timestamp | date:'HH:mm:ss' }}</span>\n <span class=\"form-event-log-type\">{{ e.Type }}</span>\n <span class=\"form-event-log-payload\">{{ e.Payload }}</span>\n </li>\n }\n </ul>\n </div>\n }\n\n <!-- Error Overlay (inline, does not replace the component) -->\n @if (State.CurrentError) {\n <div class=\"error-overlay\">\n <div class=\"error-overlay-content\">\n <div class=\"error-overlay-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span class=\"error-overlay-title\">{{ State.CurrentError.type }}</span>\n </div>\n <p class=\"error-overlay-message\">{{ State.CurrentError.message }}</p>\n <div class=\"error-overlay-actions\">\n <button class=\"toolbar-btn\" (click)=\"RefreshComponent()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry\n </button>\n <button class=\"toolbar-btn ai-fix-btn\" (click)=\"SendErrorToAI()\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Ask AI to Fix\n </button>\n </div>\n </div>\n </div>\n }\n }\n </div>\n</div>\n", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-preview {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n/* ============================================================\n TOOLBAR\n ============================================================ */\n\n.preview-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n min-height: 42px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.preview-toolbar .toolbar-left,\n.preview-toolbar .toolbar-center,\n.preview-toolbar .toolbar-right {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.preview-toolbar .toolbar-left {\n flex: 0 0 auto;\n}\n\n.preview-toolbar .toolbar-center {\n flex: 1 1 auto;\n justify-content: center;\n}\n\n.preview-toolbar .toolbar-right {\n flex: 0 0 auto;\n}\n\n.toolbar-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.toolbar-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.toolbar-btn i {\n font-size: 11px;\n}\n\n.run-btn {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.run-btn:hover {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 60%, transparent);\n}\n\n.stop-btn {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.stop-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 60%, transparent);\n}\n\n.ai-fix-btn {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.ai-fix-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\n\n.running-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.running-indicator .running-dot {\n font-size: 7px;\n color: var(--mj-status-success);\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-dot {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n}\n\n/* ============================================================\n VIEWPORT SELECTOR (segmented control)\n ============================================================ */\n\n.viewport-selector {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.viewport-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 0.15s ease;\n}\n\n.viewport-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n}\n\n.viewport-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.viewport-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.viewport-btn.active:hover {\n background: var(--mj-brand-primary);\n}\n\n/* ============================================================\n PREVIEW AREA\n ============================================================ */\n\n.preview-area {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n justify-content: center;\n}\n\n.preview-container {\n width: 100%;\n height: 100%;\n margin: 0 auto;\n transition: max-width 0.3s ease;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.preview-container.mobile,\n.preview-container.tablet {\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.preview-container.desktop {\n max-width: 100% !important;\n}\n\n/* ============================================================\n EMPTY STATES\n ============================================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n text-align: center;\n padding: 40px 24px;\n color: var(--mj-text-secondary);\n}\n\n.empty-state i {\n margin-bottom: 16px;\n color: var(--mj-border-default);\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n max-width: 320px;\n line-height: 1.5;\n}\n\n.run-state h3 {\n color: var(--mj-text-primary);\n}\n\n.run-component-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 10px 24px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-component-btn:hover {\n background: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.run-component-btn:active {\n transform: translateY(0);\n}\n\n.run-component-btn i {\n font-size: 13px;\n}\n\n/* ============================================================\n ERROR OVERLAY\n ============================================================ */\n\n.error-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-top: 2px solid var(--mj-status-error);\n backdrop-filter: blur(4px);\n padding: 16px 20px;\n animation: slide-up 0.2s ease-out;\n}\n\n@keyframes slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n.error-overlay-content {\n max-width: 600px;\n}\n\n.error-overlay-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.error-overlay-header i {\n color: var(--mj-status-error);\n font-size: 16px;\n}\n\n.error-overlay-header .error-overlay-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-status-error);\n}\n\n.error-overlay-message {\n margin: 0 0 12px 0;\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.error-overlay-actions {\n display: flex;\n gap: 8px;\n}\n\n/* ============================================================\n FORM PREVIEW BAR (banner + mode pills + record picker)\n ============================================================ */\n.form-preview-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 12px;\n background: var(--mj-status-warning-bg);\n border-bottom: 1px solid var(--mj-status-warning-border);\n flex-wrap: wrap;\n}\n\n.form-preview-banner {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-warning-text);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.form-preview-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n flex-wrap: wrap;\n}\n\n.form-mode-pills {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.form-mode-pill {\n padding: 4px 12px;\n background: transparent;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s ease;\n}\n\n.form-mode-pill:last-child {\n border-right: none;\n}\n\n.form-mode-pill:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.form-mode-pill.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-weight: 600;\n}\n\n.form-record-picker {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-primary);\n}\n\n.form-record-picker label {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.form-record-picker select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n font-family: inherit;\n}\n\n/* ============================================================\n FORM EVENT LOG (sandboxed events strip)\n ============================================================ */\n.form-event-log {\n position: absolute;\n bottom: 8px;\n left: 8px;\n right: 8px;\n max-height: 160px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n z-index: 10;\n}\n\n.form-event-log-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px 6px 0 0;\n}\n\n.form-event-log-header .spacer {\n flex: 1;\n}\n\n.form-event-log-clear {\n padding: 2px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-family: inherit;\n}\n\n.form-event-log-list {\n list-style: none;\n margin: 0;\n padding: 4px;\n overflow-y: auto;\n flex: 1;\n}\n\n.form-event-log-row {\n display: flex;\n gap: 8px;\n padding: 4px 6px;\n font-size: 11px;\n font-family: ui-monospace, monospace;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.form-event-log-row:last-child {\n border-bottom: none;\n}\n\n.form-event-log-ts {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.form-event-log-type {\n color: var(--mj-brand-primary);\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.form-event-log-payload {\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n\n.preview-area {\n position: relative;\n}\n"] }]
|
|
345
656
|
}], () => [{ type: i1.ComponentStudioStateService }, { type: i0.ChangeDetectorRef }], { ReactComponentRef: [{
|
|
346
657
|
type: ViewChild,
|
|
347
658
|
args: ['reactComponent']
|
|
348
659
|
}], AskAIToFix: [{
|
|
349
660
|
type: Output
|
|
350
661
|
}] }); })();
|
|
351
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentPreviewComponent, { className: "ComponentPreviewComponent", filePath: "src/ComponentStudio/components/workspace/component-preview.component.ts", lineNumber:
|
|
662
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentPreviewComponent, { className: "ComponentPreviewComponent", filePath: "src/ComponentStudio/components/workspace/component-preview.component.ts", lineNumber: 54 }); })();
|
|
352
663
|
//# sourceMappingURL=component-preview.component.js.map
|