@praxisui/page-builder 0.0.1
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/LICENSE +7 -0
- package/README.md +102 -0
- package/fesm2022/praxisui-page-builder-connection-graph.component-C6x--6--.mjs +1129 -0
- package/fesm2022/praxisui-page-builder-connection-graph.component-C6x--6--.mjs.map +1 -0
- package/fesm2022/praxisui-page-builder.mjs +620 -0
- package/fesm2022/praxisui-page-builder.mjs.map +1 -0
- package/index.d.ts +134 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"praxisui-page-builder.mjs","sources":["../../../projects/praxis-page-builder/src/lib/shim.ts","../../../projects/praxis-page-builder/src/lib/editor/confirm-dialog.component.ts","../../../projects/praxis-page-builder/src/lib/editor/tile-toolbar.component.ts","../../../projects/praxis-page-builder/src/lib/editor/floating-toolbar.component.ts","../../../projects/praxis-page-builder/src/lib/editor/component-palette-dialog.component.ts","../../../projects/praxis-page-builder/src/lib/editor/connection-builder.component.ts","../../../projects/praxis-page-builder/src/lib/editor/connection-builder.component.html","../../../projects/praxis-page-builder/src/public-api.ts","../../../projects/praxis-page-builder/src/praxisui-page-builder.ts"],"sourcesContent":["export const PLACEHOLDER = 1;\n\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Inject } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nexport interface ConfirmDialogData {\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n icon?: string;\n}\n\n@Component({\n selector: 'praxis-confirm-dialog',\n standalone: true,\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule, PraxisIconDirective],\n template: `\n <h2 mat-dialog-title>\n <mat-icon aria-hidden=\"true\" style=\"vertical-align: middle; margin-right: 8px;\" [praxisIcon]=\"data.icon || 'warning'\"></mat-icon>\n {{ data.title || 'Confirmar ação' }}\n </h2>\n <div mat-dialog-content>\n <p>{{ data.message || 'Tem certeza que deseja prosseguir?' }}</p>\n </div>\n <div mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>{{ data.cancelLabel || 'Cancelar' }}</button>\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"true\">{{ data.confirmLabel || 'Excluir' }}</button>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmDialogComponent {\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData,\n public ref: MatDialogRef<ConfirmDialogComponent, boolean>,\n ) {}\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisIconDirective } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-tile-toolbar',\n standalone: true,\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, PraxisIconDirective],\n template: `\n <div class=\"pdx-tile-toolbar\" [class.always-visible]=\"selected\" role=\"toolbar\" aria-label=\"Ações do widget\">\n <button\n mat-mini-fab\n (click)=\"settings.emit()\"\n [matTooltip]=\"'Configurar widget'\"\n aria-label=\"Configurar widget\"\n >\n <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n </button>\n <button\n mat-mini-fab\n color=\"primary\"\n class=\"pdx-drag-handle\"\n [matTooltip]=\"'Arrastar tile'\"\n aria-label=\"Arrastar tile\"\n >\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"remove.emit()\"\n [matTooltip]=\"'Excluir widget'\"\n aria-label=\"Excluir widget\"\n >\n <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n </button>\n </div>\n `,\n styles: [\n `\n :host { position: absolute; inset: 0; pointer-events: none; }\n .pdx-tile-toolbar {\n position: absolute;\n right: 6px;\n top: -18px; /* half outside to keep clear of tile content, but close enough to not lose hover */\n display: flex;\n gap: 6px;\n z-index: 5;\n opacity: 0;\n transition: opacity 120ms ease-in-out;\n pointer-events: auto; /* enabled when visible via parent rule */\n background: color-mix(in oklab, var(--md-sys-color-surface) 92%, transparent);\n backdrop-filter: blur(4px);\n border-radius: 999px;\n padding: 4px;\n box-shadow: var(--mat-elevation-level3, 0 4px 8px rgba(0,0,0,0.2));\n }\n .pdx-tile-toolbar.always-visible { opacity: 1; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TileToolbarComponent {\n @Input() selected = false;\n @Input() widgetType: string | null = null;\n @Output() remove = new EventEmitter<void>();\n @Output() settings = new EventEmitter<void>();\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisIconDirective } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-floating-toolbar',\n standalone: true,\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, PraxisIconDirective],\n template: `\n <div class=\"pdx-floating-toolbar\" *ngIf=\"visible\">\n <button mat-fab color=\"primary\" class=\"pdx-fab\" [matTooltip]=\"'Ações rápidas'\">\n <mat-icon [praxisIcon]=\"'build'\"></mat-icon>\n </button>\n <div class=\"pdx-actions\">\n <button mat-mini-fab color=\"primary\" (click)=\"add.emit()\" [matTooltip]=\"'Inserir componente'\" aria-label=\"Inserir componente\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"connections.emit()\" [matTooltip]=\"'Visualizar conexões (Diagrama)'\" aria-label=\"Visualizar conexões (Diagrama)\">\n <mat-icon [praxisIcon]=\"'device_hub'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"connectionsVisual.emit()\" [matTooltip]=\"'Editor Visual (beta)'\" aria-label=\"Editor Visual (beta)\">\n <mat-icon [praxisIcon]=\"'schema'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"connectionsEdit.emit()\" [matTooltip]=\"'Editar conexões (Builder)'\" aria-label=\"Editar conexões (Builder)\">\n <mat-icon [praxisIcon]=\"'tune'\"></mat-icon>\n </button>\n <button mat-mini-fab color=\"accent\" (click)=\"save.emit()\" [matTooltip]=\"'Salvar página'\" aria-label=\"Salvar página\">\n <mat-icon [praxisIcon]=\"'save'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"undo.emit()\" [disabled]=\"!canUndo\" [matTooltip]=\"'Desfazer'\" aria-label=\"Desfazer\">\n <mat-icon [praxisIcon]=\"'undo'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"redo.emit()\" [disabled]=\"!canRedo\" [matTooltip]=\"'Refazer'\" aria-label=\"Refazer\">\n <mat-icon [praxisIcon]=\"'redo'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"settings.emit()\" [matTooltip]=\"'Configurações da página'\" aria-label=\"Configurações da página\">\n <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n </button>\n <button mat-mini-fab (click)=\"preview.emit()\" [matTooltip]=\"'Pré-visualizar'\" aria-label=\"Pré-visualizar\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n </button>\n </div>\n </div>\n `,\n styles: [\n `\n :host { position: absolute; inset: 0; pointer-events: none; }\n .pdx-floating-toolbar { position: absolute; right: 16px; bottom: 16px; display: flex; gap: 8px; align-items: center; pointer-events: auto; }\n .pdx-actions { display: flex; gap: 8px; }\n .pdx-fab { box-shadow: var(--mat-elevation-transition), var(--mat-elevation-level6, 0 6px 12px rgba(0,0,0,0.24)); }\n @media (max-width: 720px) {\n .pdx-actions { gap: 6px; }\n .pdx-floating-toolbar { right: 12px; bottom: 12px; }\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FloatingToolbarComponent {\n @Input() visible = false;\n @Input() canUndo = false;\n @Input() canRedo = false;\n\n @Output() add = new EventEmitter<void>();\n @Output() undo = new EventEmitter<void>();\n @Output() redo = new EventEmitter<void>();\n @Output() settings = new EventEmitter<void>();\n @Output() preview = new EventEmitter<void>();\n @Output() connections = new EventEmitter<void>();\n @Output() connectionsEdit = new EventEmitter<void>();\n @Output() connectionsVisual = new EventEmitter<void>();\n @Output() save = new EventEmitter<void>();\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Inject, OnInit, computed, effect, signal } from '@angular/core';\nimport { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormsModule } from '@angular/forms';\nimport { ComponentMetadataRegistry } from '@praxisui/core';\nimport { ComponentDocMeta } from '@praxisui/core';\n\nexport interface ComponentPaletteData {\n title?: string;\n allowedWidgetIds?: string[];\n allowedWidgetTags?: string[];\n predicate?: (m: ComponentDocMeta) => boolean;\n}\n\n@Component({\n selector: 'praxis-component-palette-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, PraxisIconDirective],\n template: `\n <h2 mat-dialog-title>\n <div class=\"dlg-title\">\n <mat-icon class=\"dlg-icon\" [praxisIcon]=\"'widgets'\"></mat-icon>\n <div class=\"dlg-texts\">\n <div class=\"dlg-head\">{{ data?.title || 'Inserir componente' }}</div>\n <div class=\"dlg-sub\">Escolha um componente para adicionar à página · {{ filtered().length }} disponíveis</div>\n </div>\n </div>\n </h2>\n <div mat-dialog-content class=\"pdx-palette-content\">\n <div class=\"pdx-grid\" [ngClass]=\"density()\" *ngIf=\"filtered().length; else emptyState\">\n <div\n *ngFor=\"let m of filtered(); trackBy: trackById\"\n class=\"pdx-card mat-elevation-z2\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Adicionar ' + (m.friendlyName || m.id)\"\n (click)=\"select(m.id)\"\n (keydown.enter)=\"select(m.id)\"\n (keydown.space)=\"select(m.id)\"\n >\n <div class=\"pdx-card-icon\">\n <mat-icon [praxisIcon]=\"m.icon || 'widgets'\"></mat-icon>\n </div>\n <div class=\"pdx-card-body\">\n <div class=\"pdx-card-title\">{{ m.friendlyName || m.id }}</div>\n <div class=\"pdx-card-desc\">{{ m.description || m.selector }}</div>\n </div>\n </div>\n </div>\n\n <ng-template #emptyState>\n <div class=\"pdx-empty\">\n <mat-icon [praxisIcon]=\"'sentiment_dissatisfied'\"></mat-icon>\n <div>Nenhum componente disponível</div>\n </div>\n </ng-template>\n </div>\n <div mat-dialog-actions align=\"end\">\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancelar</button>\n </div>\n `,\n styles: [\n `\n :host { display: block; }\n h2[mat-dialog-title] {\n margin: 0;\n padding: 12px 24px 10px 24px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.12));\n }\n .dlg-title { display: flex; align-items: center; gap: 10px; }\n .dlg-icon { color: var(--md-sys-color-primary, #3f51b5); }\n .dlg-head { font-size: 18px; font-weight: 600; line-height: 1.2; }\n .dlg-sub { font-size: 12px; opacity: 0.85; color: var(--md-sys-color-on-surface-variant, rgba(0,0,0,0.62)); }\n .pdx-palette-content { min-width: 480px; max-width: 920px; padding-top: 8px; }\n .pdx-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; }\n .pdx-grid.dense { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }\n .pdx-grid.roomy { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }\n .pdx-card {\n position: relative;\n display: grid;\n grid-template-columns: 44px 1fr;\n grid-template-rows: auto auto;\n gap: 10px;\n padding: 14px;\n border: 1px solid transparent;\n border-radius: 14px;\n cursor: pointer;\n outline: none;\n min-height: 92px;\n background: \n linear-gradient(var(--md-sys-color-surface), var(--md-sys-color-surface)) padding-box,\n linear-gradient(135deg,\n color-mix(in oklab, var(--md-sys-color-primary, #3f51b5) 55%, transparent),\n color-mix(in oklab, var(--md-sys-color-secondary, #ff4081) 45%, transparent)\n ) border-box;\n transition: box-shadow .2s ease, background .25s ease, transform .06s ease;\n }\n .pdx-grid.dense .pdx-card { padding: 10px; border-radius: 12px; min-height: 84px; }\n .pdx-grid.roomy .pdx-card { padding: 16px; border-radius: 16px; min-height: 100px; }\n .pdx-card:focus, .pdx-card:hover {\n box-shadow: var(--mat-elevation-transition), var(--mat-elevation-level6, 0 6px 12px rgba(0,0,0,0.22));\n background:\n linear-gradient(var(--md-sys-color-surface), var(--md-sys-color-surface)) padding-box,\n linear-gradient(135deg,\n color-mix(in oklab, var(--md-sys-color-primary) 70%, transparent),\n color-mix(in oklab, var(--md-sys-color-secondary) 55%, transparent)\n ) border-box;\n }\n .pdx-card:active { transform: translateY(1px); }\n .pdx-card-icon { grid-row: span 2; display: flex; align-items: center; justify-content: center; color: color-mix(in oklab, var(--md-sys-color-primary) 70%, #666); }\n .pdx-card-title { font-weight: 600; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .pdx-card-desc { color: rgba(0,0,0,0.7); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; }\n .pdx-empty { padding: 24px; display: grid; place-items: center; color: rgba(0,0,0,0.6); gap: 8px; }\n @media (max-width: 600px) { .pdx-palette-content { min-width: 320px; } .pdx-grid { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); } }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComponentPaletteDialogComponent implements OnInit {\n query = '';\n private all = signal<ComponentDocMeta[]>([]);\n filtered = computed(() => this.applyFilters());\n density = computed(() => {\n const n = this.filtered().length;\n if (n <= 4) return 'roomy';\n if (n > 12) return 'dense';\n return 'normal';\n });\n\n constructor(\n private dialogRef: MatDialogRef<ComponentPaletteDialogComponent, string>,\n private registry: ComponentMetadataRegistry,\n @Inject(MAT_DIALOG_DATA) public data?: ComponentPaletteData,\n ) {}\n\n ngOnInit(): void {\n this.all.set(this.registry.getAll());\n }\n\n select(id: string): void {\n this.dialogRef.close(id);\n }\n\n trackById = (_: number, m: ComponentDocMeta) => m.id;\n\n getPreview(m: ComponentDocMeta): string {\n return (m.description || m.selector || m.friendlyName || m.id || '').toString();\n }\n\n // Create effect in injection context (field initializer is allowed)\n private _adjustSizeEffect = effect(() => {\n const n = this.filtered().length;\n let width = '720px';\n if (n <= 4) width = '560px';\n else if (n <= 8) width = '680px';\n const container: any = (this.dialogRef as any)._containerInstance;\n if (container && container._config) {\n container._config.width = width;\n }\n });\n\n private applyFilters(): ComponentDocMeta[] {\n const list = (this.all() || []);\n const q = (this.query || '').toLowerCase();\n const allowIds = new Set((this.data?.allowedWidgetIds || []).map((s) => s.toLowerCase()));\n const allowTags = new Set((this.data?.allowedWidgetTags || []).map((s) => s.toLowerCase()));\n return list.filter((m) => {\n if (q) {\n const hay = `${m.id} ${m.friendlyName || ''} ${m.description || ''} ${m.selector || ''}`.toLowerCase();\n if (!hay.includes(q)) return false;\n }\n if (allowIds.size > 0 && !allowIds.has((m.id || '').toLowerCase())) return false;\n if (allowTags.size > 0 && !m.tags?.some(t => allowTags.has(t.toLowerCase()))) return false;\n if (typeof this.data?.predicate === 'function' && !this.data.predicate(m)) return false;\n return true;\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { ComponentMetadataRegistry } from '@praxisui/core';\nimport { GridPageDefinition, GridWidgetInstance } from '@praxisui/core';\nimport { WidgetConnection } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-connection-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatButtonModule, MatIconModule, MatListModule, MatDialogModule, MatAutocompleteModule, MatMenuModule, MatTabsModule, MatTooltipModule, MatProgressBarModule, MatCheckboxModule, MatSnackBarModule, ScrollingModule, PraxisIconDirective],\n templateUrl: './connection-builder.component.html',\n styleUrls: ['./connection-builder.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConnectionBuilderComponent implements OnInit, OnChanges {\n @Input() page?: GridPageDefinition | string;\n @Input() widgets?: GridWidgetInstance[];\n @Output() pageChange = new EventEmitter<GridPageDefinition>();\n\n // State\n private originalSnapshot = '';\n showOnlyIssues = false;\n showFriendly = true;\n filterText = '';\n groupBy: 'none' | 'from' | 'to' | 'event' = 'none';\n sortBy: 'from' | 'to' = 'from';\n // Move braces-containing placeholder into TS (AGENTS.md policy)\n mapPlaceholder = 'payload | payload.id | ${payload.id}';\n\n // Signals\n connections = signal<WidgetConnection[]>([]);\n selectedIndex = signal<number>(-1);\n\n // Derived lists\n readonly filteredConnections = computed(() => this.applyFilters(this.connections()));\n readonly groupedConnections = computed(() => this.applyGrouping(this.filteredConnections()));\n\n constructor(private dialog: MatDialog, private registry: ComponentMetadataRegistry, private snack: MatSnackBar) {}\n\n ngOnInit(): void {\n const p = this.parsePage(this.page);\n const ws = this.widgets || p?.widgets || [];\n this.widgets = ws;\n const conns = [...(p?.connections || [])];\n this.connections.set(conns);\n this.originalSnapshot = JSON.stringify(conns);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['page'] || changes['widgets']) {\n const p = this.parsePage(this.page);\n this.widgets = this.widgets || p?.widgets || [];\n const next = [...(p?.connections || [])];\n this.connections.set(next);\n this.originalSnapshot = JSON.stringify(next);\n }\n }\n\n // UI helpers\n isExpanded(i: number): boolean { return i === this.selectedIndex(); }\n toggleExpanded(i: number, ev?: Event): void { if (ev) ev.stopPropagation(); this.selectedIndex.set(this.selectedIndex() === i ? -1 : i); }\n setSortBy(v: 'from' | 'to'): void { this.sortBy = v; this.connections.set(this.sortList([...this.connections()])); }\n onGroupByChange(): void {}\n toggleShowOnlyIssues(): void { this.showOnlyIssues = !this.showOnlyIssues; }\n toggleFriendly(): void { this.showFriendly = !this.showFriendly; }\n trackByIndex = (i: number) => i;\n\n // Labels\n fromLabel(c: WidgetConnection): string { return `${c.from.widget}.${c.from.output}`; }\n toLabel(c: WidgetConnection): string { return `${c.to.widget}.${c.to.input}`; }\n fromFriendly(c: WidgetConnection): string { return `${this.widgetFriendlyNameForKey(c.from.widget)}.${c.from.output}`; }\n toFriendly(c: WidgetConnection): string { return `${this.widgetFriendlyNameForKey(c.to.widget)}.${c.to.input}`; }\n outputDescription(c: WidgetConnection): string { return this.registry.get(this.widgetTypeByKey(c.from.widget))?.outputs?.find(o => o.name === c.from.output)?.description || ''; }\n inputDescription(c: WidgetConnection): string { return this.registry.get(this.widgetTypeByKey(c.to.widget))?.inputs?.find(i => i.name === c.to.input)?.description || ''; }\n widgetFriendlyNameForKey(key: string): string { const id = this.widgetTypeByKey(key); return this.registry.get(id)?.friendlyName || id; }\n componentIconForKey(key: string): string { const id = this.widgetTypeByKey(key); return this.registry.get(id)?.icon || 'widgets'; }\n private widgetTypeByKey(key: string): string { return this.widgets?.find(w => w.key === key)?.definition?.id || key; }\n\n private applyFilters(list: WidgetConnection[]): WidgetConnection[] {\n const q = (this.filterText || '').toLowerCase();\n const arr = list.filter((c) => {\n if (this.showOnlyIssues && this.connectionStatus(c) === 'ok') return false;\n if (!q) return true;\n const hay = `${c.from.widget}.${c.from.output} ${c.to.widget}.${c.to.input} ${c.map || ''}`.toLowerCase();\n return hay.includes(q);\n });\n return this.sortList(arr);\n }\n\n private applyGrouping(list: WidgetConnection[]): Array<{ label: string; list: WidgetConnection[] }>\n {\n switch (this.groupBy) {\n case 'from': return this.groupByKey(list, c => `${c.from.widget}.${c.from.output}`);\n case 'to': return this.groupByKey(list, c => `${c.to.widget}.${c.to.input}`);\n case 'event': return this.groupByKey(list, c => `${c.from.output}`);\n default: return [{ label: 'Todas', list }];\n }\n }\n\n private groupByKey(list: WidgetConnection[], keyFn: (c: WidgetConnection) => string): Array<{ label: string; list: WidgetConnection[] }>\n {\n const map = new Map<string, WidgetConnection[]>();\n for (const c of list) { const k = keyFn(c); const arr = map.get(k) || []; arr.push(c); map.set(k, arr); }\n return Array.from(map.entries()).map(([k, v]) => ({ label: k, list: v }));\n }\n\n private sortList(list: WidgetConnection[]): WidgetConnection[] {\n return [...list].sort((a, b) => {\n if (this.sortBy === 'from') return this.fromLabel(a).localeCompare(this.fromLabel(b));\n return this.toLabel(a).localeCompare(this.toLabel(b));\n });\n }\n\n // Editing\n createNew(): void {\n const fromKey = this.widgets?.[0]?.key || '';\n const toKey = this.widgets?.[1]?.key || '';\n const conn: WidgetConnection = { from: { widget: fromKey, output: 'submit' }, to: { widget: toKey, input: 'context' } } as any;\n this.connections.set([conn, ...this.connections()]);\n }\n startEdit(index: number, _c: WidgetConnection): void { this.selectedIndex.set(index); }\n startEditByConn(c: WidgetConnection): void { const i = this.connections().indexOf(c); if (i >= 0) this.startEdit(i, c); }\n duplicateConnection(index: number): void { const next = [...this.connections()]; const c = next[index]; if (!c) return; next.splice(index + 1, 0, { ...c }); this.connections.set(next); }\n removeConnection(index: number): void { const next = [...this.connections()]; if (index < 0 || index >= next.length) return; next.splice(index, 1); this.connections.set(next); }\n\n // Validation\n connectionStatus(c: WidgetConnection): 'ok' | 'warn' | 'err' {\n if (!c.from?.widget || !c.from?.output || !c.to?.widget || !c.to?.input) return 'err';\n const wFrom = this.widgetTypeByKey(c.from.widget);\n const wTo = this.widgetTypeByKey(c.to.widget);\n const outOk = !!this.registry.get(wFrom)?.outputs?.some(o => o.name === c.from.output);\n const inOk = !!this.registry.get(wTo)?.inputs?.some(i => i.name === c.to.input);\n if (!outOk || !inOk) return 'warn';\n return 'ok';\n }\n\n // Persist/apply\n onSave(): void {\n const p = this.parsePage(this.page) || ({} as GridPageDefinition);\n const next: GridPageDefinition = { ...(p as any), connections: this.connections() };\n this.page = next;\n this.pageChange.emit(next);\n this.snack.open('Conexões salvas', undefined, { duration: 1000 });\n this.originalSnapshot = JSON.stringify(this.connections());\n }\n\n // Diagram helpers\n openDiagramFor(_c: WidgetConnection): void {\n import('./connection-graph/connection-graph.component').then(m => {\n this.dialog.open((m as any).ConnectionGraphComponent as any, { width: '95vw', height: '80vh', maxWidth: '100vw', panelClass: 'praxis-conn-graph-dialog' });\n });\n }\n openDiagramFullscreen(): void {\n import('./connection-graph/connection-graph.component').then(m => {\n this.dialog.open((m as any).ConnectionGraphComponent as any, { width: '95vw', height: '95vh', maxWidth: '100vw', panelClass: 'praxis-conn-graph-dialog', autoFocus: false, restoreFocus: false });\n });\n }\n\n private parsePage(input?: GridPageDefinition | string | null): GridPageDefinition | undefined {\n if (!input) return undefined;\n if (typeof input === 'string') { try { return JSON.parse(input) as GridPageDefinition; } catch { return undefined; } }\n return input;\n }\n}\n","<div class=\"pdx-conn-root\" role=\"region\" aria-label=\"Construtor de Conexões\">\n <div class=\"pdx-conn-head\">\n <span class=\"pdx-conn-title\">Conexões</span>\n <span class=\"pdx-conn-count\" aria-label=\"Conexões filtradas e total\">{{ filteredConnections().length }} / {{ connections().length }}</span>\n <mat-form-field appearance=\"outline\" class=\"pdx-conn-search\">\n <mat-label>Buscar</mat-label>\n <input matInput [(ngModel)]=\"filterText\" placeholder=\"Origem, Destino, Input, Map...\" />\n <button mat-icon-button matSuffix *ngIf=\"filterText\" (click)=\"filterText='';\" aria-label=\"Limpar busca\"><mat-icon [praxisIcon]=\"'close'\"></mat-icon></button>\n </mat-form-field>\n <span class=\"pdx-spacer\"></span>\n <button mat-button (click)=\"toggleShowOnlyIssues()\" [color]=\"showOnlyIssues ? 'primary': undefined\" aria-label=\"Somente avisos/erros\"><mat-icon [praxisIcon]=\"'report_problem'\"></mat-icon> Issues</button>\n <mat-form-field appearance=\"outline\" style=\"width: 160px;\">\n <mat-label>Ordenar por</mat-label>\n <mat-select [(ngModel)]=\"sortBy\" (ngModelChange)=\"setSortBy($event)\">\n <mat-option value=\"from\">Origem</mat-option>\n <mat-option value=\"to\">Destino</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"width: 170px;\">\n <mat-label>Agrupar por</mat-label>\n <mat-select [(ngModel)]=\"groupBy\" (ngModelChange)=\"onGroupByChange()\">\n <mat-option value=\"none\">Nenhum</mat-option>\n <mat-option value=\"from\">Origem</mat-option>\n <mat-option value=\"to\">Destino</mat-option>\n <mat-option value=\"event\">Evento</mat-option>\n </mat-select>\n </mat-form-field>\n <button mat-icon-button [color]=\"showFriendly ? 'primary' : undefined\" (click)=\"toggleFriendly()\" aria-label=\"Alternar nome amigável/técnico\"><mat-icon [praxisIcon]=\"'translate'\"></mat-icon></button>\n <button mat-stroked-button (click)=\"createNew()\" aria-label=\"Nova conexão\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon> Nova Conexão</button>\n <button mat-flat-button color=\"accent\" class=\"pdx-diagram-cta\" (click)=\"openDiagramFullscreen()\" aria-label=\"Abrir diagrama em tela cheia\" matTooltip=\"Visualizar conexões em grafo\"><mat-icon [praxisIcon]=\"'schema'\"></mat-icon><span>Diagrama</span></button>\n </div>\n\n <div class=\"pdx-conn-grid\">\n <!-- Left: read-only list -->\n <div class=\"pdx-conn-list\" role=\"list\" aria-label=\"Lista de conexões\" cdkScrollable>\n <mat-list *ngIf=\"filteredConnections().length; else noConns\">\n <ng-container *ngIf=\"groupBy!=='none'; else flatList\">\n <div class=\"group-block\" *ngFor=\"let g of groupedConnections(); let gi = index\">\n <div class=\"group-header\">\n <span class=\"group-title\">{{ g.label }}</span>\n <span class=\"group-count\">{{ g.list.length }}</span>\n </div>\n <mat-divider></mat-divider>\n <div class=\"group-list\">\n <ng-container *ngFor=\"let c of g.list; let i = index\">\n <mat-list-item role=\"listitem\" (click)=\"startEdit(i, c)\" [class.selected]=\"selectedIndex()===i\">\n <div class=\"card-head\" matListItemTitle [matTooltip]=\"showFriendly ? (c.from.widget + '.' + c.from.output + ' → ' + (c.to.widget + '.' + c.to.input)) : ''\">\n <mat-icon class=\"comp-icon from\" [matTooltip]=\"widgetFriendlyNameForKey(c.from.widget)\">{{ componentIconForKey(c.from.widget) }}</mat-icon>\n <span class=\"pdx-badge from\" aria-hidden=\"true\"></span>\n <span class=\"from\">{{ showFriendly ? fromFriendly(c) : fromLabel(c) }}</span>\n <span class=\"arrow\">→</span>\n <mat-icon class=\"comp-icon to\" [matTooltip]=\"widgetFriendlyNameForKey(c.to.widget)\">{{ componentIconForKey(c.to.widget) }}</mat-icon>\n <span class=\"pdx-badge to\" aria-hidden=\"true\"></span>\n <span class=\"to\">{{ showFriendly ? toFriendly(c) : toLabel(c) }}</span>\n <span class=\"spacer\"></span>\n <span class=\"status-pill\" [class.ok]=\"connectionStatus(c)==='ok'\" [class.warn]=\"connectionStatus(c)==='warn'\" [class.err]=\"connectionStatus(c)==='err'\">\n <mat-icon *ngIf=\"connectionStatus(c)==='ok'\">check_circle</mat-icon>\n <mat-icon *ngIf=\"connectionStatus(c)==='warn'\">warning</mat-icon>\n <mat-icon *ngIf=\"connectionStatus(c)==='err'\">error</mat-icon>\n </span>\n <button mat-icon-button class=\"expand-btn\" [attr.aria-expanded]=\"isExpanded(i)\" (click)=\"toggleExpanded(i, $event)\" [matTooltip]=\"isExpanded(i) ? 'Recolher detalhes' : 'Expandir detalhes'\">\n <mat-icon>{{ isExpanded(i) ? 'expand_less' : 'expand_more' }}</mat-icon>\n </button>\n </div>\n <div class=\"meta\" *ngIf=\"showFriendly\" matListItemLine>\n <span class=\"hint\">{{ outputDescription(c) }}</span>\n <span class=\"sep\" *ngIf=\"outputDescription(c) && inputDescription(c)\">•</span>\n <span class=\"hint\">{{ inputDescription(c) }}</span>\n </div>\n <div class=\"map-chip\" *ngIf=\"c.map\" [matTooltip]=\"c.map || ''\" matListItemLine (click)=\"startEditByConn(c)\" title=\"Clique para editar Map\">\n <span class=\"pdx-badge map\" aria-hidden=\"true\"></span>\n <mat-icon class=\"map-icon\" inline>bolt</mat-icon>\n <span class=\"mono\">{{ c.map }}</span>\n </div>\n <div class=\"card-actions\" matListItemLine (click)=\"$event.stopPropagation()\">\n <span class=\"action-group\">\n <button mat-icon-button (click)=\"startEdit(i, c)\" matTooltip=\"Editar\"><mat-icon>settings</mat-icon></button>\n <button mat-icon-button (click)=\"duplicateConnection(i)\" matTooltip=\"Duplicar\"><mat-icon>content_copy</mat-icon></button>\n </span>\n <span class=\"action-group\">\n <button mat-stroked-button color=\"primary\" (click)=\"openDiagramFor(c)\" matTooltip=\"Ver relação no diagrama\"><mat-icon>schema</mat-icon><span>Diagrama</span></button>\n </span>\n <span class=\"spacer\"></span>\n <span class=\"action-group\">\n <button mat-icon-button color=\"warn\" (click)=\"removeConnection(i)\" matTooltip=\"Remover\"><mat-icon>delete</mat-icon></button>\n </span>\n </div>\n <div class=\"card-details\" matListItemLine [class.expanded]=\"isExpanded(i)\" [style.maxHeight]=\"isExpanded(i) ? '240px' : '0px'\" [style.opacity]=\"isExpanded(i) ? 1 : 0\" [style.pointerEvents]=\"isExpanded(i) ? 'auto' : 'none'\">\n <div class=\"stepper\">\n <div class=\"step from-step\">\n <div class=\"dot from\"></div>\n <div class=\"content\">\n <div class=\"label\">De</div>\n <div class=\"value\">{{ showFriendly ? fromFriendly(c) : fromLabel(c) }}</div>\n </div>\n </div>\n <div class=\"step to-step\">\n <div class=\"dot to\"></div>\n <div class=\"content\">\n <div class=\"label\">Para</div>\n <div class=\"value\">{{ showFriendly ? toFriendly(c) : toLabel(c) }}</div>\n </div>\n </div>\n <div class=\"step map-step\" *ngIf=\"c.map\">\n <div class=\"dot map\"></div>\n <div class=\"content\">\n <div class=\"label\">Map</div>\n <div class=\"value mono\">{{ c.map }}</div>\n </div>\n </div>\n </div>\n </div>\n </mat-list-item>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-template #flatList>\n <ng-container *ngFor=\"let c of filteredConnections(); let i = index\">\n <mat-list-item role=\"listitem\" (click)=\"startEdit(i, c)\" [class.selected]=\"selectedIndex()===i\">\n <div class=\"card-head\" matListItemTitle [matTooltip]=\"showFriendly ? (c.from.widget + '.' + c.from.output + ' → ' + (c.to.widget + '.' + c.to.input)) : ''\">\n <mat-icon class=\"comp-icon from\" [matTooltip]=\"widgetFriendlyNameForKey(c.from.widget)\">{{ componentIconForKey(c.from.widget) }}</mat-icon>\n <span class=\"pdx-badge from\" aria-hidden=\"true\"></span>\n <span class=\"from\">{{ showFriendly ? fromFriendly(c) : fromLabel(c) }}</span>\n <span class=\"arrow\">→</span>\n <mat-icon class=\"comp-icon to\" [matTooltip]=\"widgetFriendlyNameForKey(c.to.widget)\">{{ componentIconForKey(c.to.widget) }}</mat-icon>\n <span class=\"pdx-badge to\" aria-hidden=\"true\"></span>\n <span class=\"to\">{{ showFriendly ? toFriendly(c) : toLabel(c) }}</span>\n <span class=\"spacer\"></span>\n <span class=\"status-pill\" [class.ok]=\"connectionStatus(c)==='ok'\" [class.warn]=\"connectionStatus(c)==='warn'\" [class.err]=\"connectionStatus(c)==='err'\">\n <mat-icon *ngIf=\"connectionStatus(c)==='ok'\">check_circle</mat-icon>\n <mat-icon *ngIf=\"connectionStatus(c)==='warn'\">warning</mat-icon>\n <mat-icon *ngIf=\"connectionStatus(c)==='err'\">error</mat-icon>\n </span>\n <button mat-icon-button class=\"expand-btn\" [attr.aria-expanded]=\"isExpanded(i)\" (click)=\"toggleExpanded(i, $event)\" [matTooltip]=\"isExpanded(i) ? 'Recolher detalhes' : 'Expandir detalhes'\">\n <mat-icon>{{ isExpanded(i) ? 'expand_less' : 'expand_more' }}</mat-icon>\n </button>\n </div>\n <div class=\"meta\" *ngIf=\"showFriendly\" matListItemLine>\n <span class=\"hint\">{{ outputDescription(c) }}</span>\n <span class=\"sep\" *ngIf=\"outputDescription(c) && inputDescription(c)\">•</span>\n <span class=\"hint\">{{ inputDescription(c) }}</span>\n </div>\n <div class=\"map-chip\" *ngIf=\"c.map\" [matTooltip]=\"c.map || ''\" matListItemLine (click)=\"startEditByConn(c)\" title=\"Clique para editar Map\">\n <span class=\"pdx-badge map\" aria-hidden=\"true\"></span>\n <mat-icon class=\"map-icon\" inline>bolt</mat-icon>\n <span class=\"mono\">{{ c.map }}</span>\n </div>\n <div class=\"card-actions\" matListItemLine (click)=\"$event.stopPropagation()\">\n <span class=\"action-group\">\n <button mat-icon-button (click)=\"startEdit(i, c)\" matTooltip=\"Editar\"><mat-icon>settings</mat-icon></button>\n <button mat-icon-button (click)=\"duplicateConnection(i)\" matTooltip=\"Duplicar\"><mat-icon>content_copy</mat-icon></button>\n </span>\n <span class=\"action-group\">\n <button mat-stroked-button color=\"primary\" (click)=\"openDiagramFor(c)\" matTooltip=\"Ver relação no diagrama\"><mat-icon>schema</mat-icon><span>Diagrama</span></button>\n </span>\n <span class=\"spacer\"></span>\n <span class=\"action-group\">\n <button mat-icon-button color=\"warn\" (click)=\"removeConnection(i)\" matTooltip=\"Remover\"><mat-icon>delete</mat-icon></button>\n </span>\n </div>\n <div class=\"card-details\" matListItemLine [class.expanded]=\"isExpanded(i)\" [style.maxHeight]=\"isExpanded(i) ? '240px' : '0px'\" [style.opacity]=\"isExpanded(i) ? 1 : 0\" [style.pointerEvents]=\"isExpanded(i) ? 'auto' : 'none'\">\n <div class=\"stepper\">\n <div class=\"step from-step\">\n <div class=\"dot from\"></div>\n <div class=\"content\">\n <div class=\"label\">De</div>\n <div class=\"value\">{{ showFriendly ? fromFriendly(c) : fromLabel(c) }}</div>\n </div>\n </div>\n <div class=\"step to-step\">\n <div class=\"dot to\"></div>\n <div class=\"content\">\n <div class=\"label\">Para</div>\n <div class=\"value\">{{ showFriendly ? toFriendly(c) : toLabel(c) }}</div>\n </div>\n </div>\n <div class=\"step map-step\" *ngIf=\"c.map\">\n <div class=\"dot map\"></div>\n <div class=\"content\">\n <div class=\"label\">Map</div>\n <div class=\"value mono\">{{ c.map }}</div>\n </div>\n </div>\n </div>\n </div>\n </mat-list-item>\n </ng-container>\n </ng-template>\n </mat-list>\n <ng-template #noConns>\n <div class=\"pdx-empty-list\" role=\"status\" aria-live=\"polite\">\n <mat-icon>link_off</mat-icon>\n <div>Nenhuma conexão definida. Use “Nova Conexão”.</div>\n </div>\n </ng-template>\n </div>\n\n <!-- Right: editor form -->\n <div class=\"pdx-conn-editor\" role=\"form\" aria-label=\"Editor de conexão\">\n <ng-container *ngIf=\"selectedIndex() >= 0; else emptyEditor\">\n <div class=\"form-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Origem (widget.key)</mat-label>\n <input matInput [(ngModel)]=\"connections()[selectedIndex()].from.widget\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Evento (output)</mat-label>\n <input matInput [(ngModel)]=\"connections()[selectedIndex()].from.output\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Destino (widget.key)</mat-label>\n <input matInput [(ngModel)]=\"connections()[selectedIndex()].to.widget\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Input</mat-label>\n <input matInput [(ngModel)]=\"connections()[selectedIndex()].to.input\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full-span\">\n <mat-label>Map (opcional)</mat-label>\n <input matInput [(ngModel)]=\"connections()[selectedIndex()].map\" [placeholder]=\"mapPlaceholder\" />\n </mat-form-field>\n <div class=\"full-span\">\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\"><mat-icon [praxisIcon]=\"'save'\"></mat-icon>Salvar</button>\n </div>\n </div>\n </ng-container>\n <ng-template #emptyEditor>\n <div class=\"pdx-empty-editor\">Selecione uma conexão para editar.</div>\n </ng-template>\n </div>\n </div>\n</div>\n","/*\n * Public API Surface of @praxisui/page-builder\n */\n\n// Temporary minimal export for build isolation\nexport * from './lib/shim';\nexport * from './lib/editor/confirm-dialog.component';\nexport * from './lib/editor/tile-toolbar.component';\nexport * from './lib/editor/floating-toolbar.component';\nexport * from './lib/editor/component-palette-dialog.component';\nexport * from './lib/editor/connection-builder.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i5","i10","i11","i13"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { MatDialogRef, MatDialog } from '@angular/material/dialog';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
|
|
4
|
+
import { ComponentDocMeta, ComponentMetadataRegistry, GridPageDefinition, GridWidgetInstance, WidgetConnection } from '@praxisui/core';
|
|
5
|
+
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
6
|
+
|
|
7
|
+
declare const PLACEHOLDER = 1;
|
|
8
|
+
|
|
9
|
+
interface ConfirmDialogData {
|
|
10
|
+
title?: string;
|
|
11
|
+
message?: string;
|
|
12
|
+
confirmLabel?: string;
|
|
13
|
+
cancelLabel?: string;
|
|
14
|
+
icon?: string;
|
|
15
|
+
}
|
|
16
|
+
declare class ConfirmDialogComponent {
|
|
17
|
+
data: ConfirmDialogData;
|
|
18
|
+
ref: MatDialogRef<ConfirmDialogComponent, boolean>;
|
|
19
|
+
constructor(data: ConfirmDialogData, ref: MatDialogRef<ConfirmDialogComponent, boolean>);
|
|
20
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmDialogComponent, never>;
|
|
21
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmDialogComponent, "praxis-confirm-dialog", never, {}, {}, never, never, true, never>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare class TileToolbarComponent {
|
|
25
|
+
selected: boolean;
|
|
26
|
+
widgetType: string | null;
|
|
27
|
+
remove: EventEmitter<void>;
|
|
28
|
+
settings: EventEmitter<void>;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TileToolbarComponent, never>;
|
|
30
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TileToolbarComponent, "praxis-tile-toolbar", never, { "selected": { "alias": "selected"; "required": false; }; "widgetType": { "alias": "widgetType"; "required": false; }; }, { "remove": "remove"; "settings": "settings"; }, never, never, true, never>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
declare class FloatingToolbarComponent {
|
|
34
|
+
visible: boolean;
|
|
35
|
+
canUndo: boolean;
|
|
36
|
+
canRedo: boolean;
|
|
37
|
+
add: EventEmitter<void>;
|
|
38
|
+
undo: EventEmitter<void>;
|
|
39
|
+
redo: EventEmitter<void>;
|
|
40
|
+
settings: EventEmitter<void>;
|
|
41
|
+
preview: EventEmitter<void>;
|
|
42
|
+
connections: EventEmitter<void>;
|
|
43
|
+
connectionsEdit: EventEmitter<void>;
|
|
44
|
+
connectionsVisual: EventEmitter<void>;
|
|
45
|
+
save: EventEmitter<void>;
|
|
46
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FloatingToolbarComponent, never>;
|
|
47
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FloatingToolbarComponent, "praxis-floating-toolbar", never, { "visible": { "alias": "visible"; "required": false; }; "canUndo": { "alias": "canUndo"; "required": false; }; "canRedo": { "alias": "canRedo"; "required": false; }; }, { "add": "add"; "undo": "undo"; "redo": "redo"; "settings": "settings"; "preview": "preview"; "connections": "connections"; "connectionsEdit": "connectionsEdit"; "connectionsVisual": "connectionsVisual"; "save": "save"; }, never, never, true, never>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface ComponentPaletteData {
|
|
51
|
+
title?: string;
|
|
52
|
+
allowedWidgetIds?: string[];
|
|
53
|
+
allowedWidgetTags?: string[];
|
|
54
|
+
predicate?: (m: ComponentDocMeta) => boolean;
|
|
55
|
+
}
|
|
56
|
+
declare class ComponentPaletteDialogComponent implements OnInit {
|
|
57
|
+
private dialogRef;
|
|
58
|
+
private registry;
|
|
59
|
+
data?: ComponentPaletteData | undefined;
|
|
60
|
+
query: string;
|
|
61
|
+
private all;
|
|
62
|
+
filtered: i0.Signal<ComponentDocMeta[]>;
|
|
63
|
+
density: i0.Signal<"roomy" | "dense" | "normal">;
|
|
64
|
+
constructor(dialogRef: MatDialogRef<ComponentPaletteDialogComponent, string>, registry: ComponentMetadataRegistry, data?: ComponentPaletteData | undefined);
|
|
65
|
+
ngOnInit(): void;
|
|
66
|
+
select(id: string): void;
|
|
67
|
+
trackById: (_: number, m: ComponentDocMeta) => string;
|
|
68
|
+
getPreview(m: ComponentDocMeta): string;
|
|
69
|
+
private _adjustSizeEffect;
|
|
70
|
+
private applyFilters;
|
|
71
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ComponentPaletteDialogComponent, never>;
|
|
72
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ComponentPaletteDialogComponent, "praxis-component-palette-dialog", never, {}, {}, never, never, true, never>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
declare class ConnectionBuilderComponent implements OnInit, OnChanges {
|
|
76
|
+
private dialog;
|
|
77
|
+
private registry;
|
|
78
|
+
private snack;
|
|
79
|
+
page?: GridPageDefinition | string;
|
|
80
|
+
widgets?: GridWidgetInstance[];
|
|
81
|
+
pageChange: EventEmitter<GridPageDefinition>;
|
|
82
|
+
private originalSnapshot;
|
|
83
|
+
showOnlyIssues: boolean;
|
|
84
|
+
showFriendly: boolean;
|
|
85
|
+
filterText: string;
|
|
86
|
+
groupBy: 'none' | 'from' | 'to' | 'event';
|
|
87
|
+
sortBy: 'from' | 'to';
|
|
88
|
+
mapPlaceholder: string;
|
|
89
|
+
connections: i0.WritableSignal<WidgetConnection[]>;
|
|
90
|
+
selectedIndex: i0.WritableSignal<number>;
|
|
91
|
+
readonly filteredConnections: i0.Signal<WidgetConnection[]>;
|
|
92
|
+
readonly groupedConnections: i0.Signal<{
|
|
93
|
+
label: string;
|
|
94
|
+
list: WidgetConnection[];
|
|
95
|
+
}[]>;
|
|
96
|
+
constructor(dialog: MatDialog, registry: ComponentMetadataRegistry, snack: MatSnackBar);
|
|
97
|
+
ngOnInit(): void;
|
|
98
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
99
|
+
isExpanded(i: number): boolean;
|
|
100
|
+
toggleExpanded(i: number, ev?: Event): void;
|
|
101
|
+
setSortBy(v: 'from' | 'to'): void;
|
|
102
|
+
onGroupByChange(): void;
|
|
103
|
+
toggleShowOnlyIssues(): void;
|
|
104
|
+
toggleFriendly(): void;
|
|
105
|
+
trackByIndex: (i: number) => number;
|
|
106
|
+
fromLabel(c: WidgetConnection): string;
|
|
107
|
+
toLabel(c: WidgetConnection): string;
|
|
108
|
+
fromFriendly(c: WidgetConnection): string;
|
|
109
|
+
toFriendly(c: WidgetConnection): string;
|
|
110
|
+
outputDescription(c: WidgetConnection): string;
|
|
111
|
+
inputDescription(c: WidgetConnection): string;
|
|
112
|
+
widgetFriendlyNameForKey(key: string): string;
|
|
113
|
+
componentIconForKey(key: string): string;
|
|
114
|
+
private widgetTypeByKey;
|
|
115
|
+
private applyFilters;
|
|
116
|
+
private applyGrouping;
|
|
117
|
+
private groupByKey;
|
|
118
|
+
private sortList;
|
|
119
|
+
createNew(): void;
|
|
120
|
+
startEdit(index: number, _c: WidgetConnection): void;
|
|
121
|
+
startEditByConn(c: WidgetConnection): void;
|
|
122
|
+
duplicateConnection(index: number): void;
|
|
123
|
+
removeConnection(index: number): void;
|
|
124
|
+
connectionStatus(c: WidgetConnection): 'ok' | 'warn' | 'err';
|
|
125
|
+
onSave(): void;
|
|
126
|
+
openDiagramFor(_c: WidgetConnection): void;
|
|
127
|
+
openDiagramFullscreen(): void;
|
|
128
|
+
private parsePage;
|
|
129
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionBuilderComponent, never>;
|
|
130
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ConnectionBuilderComponent, "praxis-connection-builder", never, { "page": { "alias": "page"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionBuilderComponent, FloatingToolbarComponent, PLACEHOLDER, TileToolbarComponent };
|
|
134
|
+
export type { ComponentPaletteData, ConfirmDialogData };
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@praxisui/page-builder",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^20.0.0",
|
|
6
|
+
"@angular/core": "^20.0.0",
|
|
7
|
+
"@angular/forms": "^20.0.0",
|
|
8
|
+
"@angular/cdk": "^20.0.0",
|
|
9
|
+
"@angular/material": "^20.0.0",
|
|
10
|
+
"angular-gridster2": "^20.2.2",
|
|
11
|
+
"@praxisui/core": "*",
|
|
12
|
+
"@praxisui/settings-panel": "*"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"tslib": "^2.3.0"
|
|
16
|
+
},
|
|
17
|
+
"license": "Apache-2.0",
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/codexrodrigues/praxis"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/codexrodrigues/praxis#readme",
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/codexrodrigues/praxis/issues"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"module": "fesm2022/praxisui-page-builder.mjs",
|
|
31
|
+
"typings": "index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
"./package.json": {
|
|
34
|
+
"default": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./index.d.ts",
|
|
38
|
+
"default": "./fesm2022/praxisui-page-builder.mjs"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|