Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1adc27f
dynamic form component init
erdemcaygor Oct 6, 2025
fe26f71
refactoring
erdemcaygor Oct 6, 2025
e8ced70
refactoring
erdemcaygor Oct 6, 2025
753350d
refactoring
erdemcaygor Oct 7, 2025
5ca3db5
refactoring
erdemcaygor Oct 8, 2025
d19134b
refactoring
erdemcaygor Oct 8, 2025
fb0dd44
refactoring
erdemcaygor Oct 8, 2025
bc3f38f
form field updated
erdemcaygor Oct 8, 2025
391c51e
dynamic form field validation logic updated
erdemcaygor Oct 8, 2025
ffa3b85
removed unnecessary form field control interface
erdemcaygor Oct 8, 2025
6715aae
refactoring
erdemcaygor Oct 8, 2025
b094d5a
dynamic form field validator func updated
erdemcaygor Oct 9, 2025
32f4047
localization added for error messages
erdemcaygor Oct 9, 2025
6ba1165
refactoring
erdemcaygor Oct 9, 2025
6e4179f
reset form function added
erdemcaygor Oct 9, 2025
d66c8d6
refactoring
erdemcaygor Oct 9, 2025
1963745
reset form function added
erdemcaygor Oct 10, 2025
a9486e9
dynamic form field host component added to custom form input
erdemcaygor Oct 13, 2025
fbd7aa5
refactoring
erdemcaygor Oct 13, 2025
3f2f25e
custom form field support added
erdemcaygor Oct 13, 2025
990f989
example
erdemcaygor Dec 2, 2025
b943365
Merge branch 'dev' into feat/#23891
erdemcaygor Dec 2, 2025
da26bfc
example
erdemcaygor Dec 2, 2025
fc2fcaf
example
erdemcaygor Dec 2, 2025
fc34eac
Merge branch 'dev' into feat/#23891
erdemcaygor Dec 9, 2025
77f16cb
dynamic options support added
erdemcaygor Dec 9, 2025
2db1b40
Merge branch 'rel-10.1' into feat/#23891
erdemcaygor Jan 5, 2026
3831000
log removed
erdemcaygor Jan 5, 2026
ec35e77
update: remove unused imports
sumeyyeKurtulus Jan 16, 2026
b4a44a4
new types added. A11y updates
erdemcaygor Jan 20, 2026
90b2be5
nested form support added
erdemcaygor Jan 20, 2026
b8d1170
refactor
erdemcaygor Jan 21, 2026
cb866e6
refactor
erdemcaygor Jan 21, 2026
b5d6a9c
unused imports removed
erdemcaygor Jan 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions npm/ng-packs/apps/dev-app/src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ export const appRoutes: Routes = [
pathMatch: 'full',
loadComponent: () => import('./home/home.component').then(m => m.HomeComponent),
},
{
path: 'dynamic-form',
loadComponent: () => import('./dynamic-form-page/dynamic-form-page.component').then(m => m.DynamicFormPageComponent),
},
{
path: 'account',
loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<div class="container mt-4">
<div class="row mb-4">
<div class="col-12">
<h1 class="display-4">Dynamic Form Showcase</h1>
<p class="lead text-muted">
Comprehensive example demonstrating all available field types with validation and conditional logic.
</p>
<hr>
</div>
</div>

<div class="row">
<div class="col-lg-10 mx-auto">
<div class="card shadow-sm">
<div class="card-header bg-primary text-white">
<h4 class="mb-0">
<i class="fas fa-wpforms me-2"></i>
User Registration Form
</h4>
<small>All 16 field types + Nested Forms (Group & Array) with full accessibility support</small>
</div>
<div class="card-body p-4">
@if (formFields.length) {
<abp-dynamic-form
[fields]="formFields"
[submitButtonText]="'Register'"
[showCancelButton]="true"
(onSubmit)="submit($event)"
(formCancel)="cancel()" />
} @else {
<div class="text-center py-5">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<p class="mt-3 text-muted">Loading form configuration...</p>
</div>
}
</div>
</div>

<!-- Field Types Reference Card -->
<div class="card shadow-sm mt-4">
<div class="card-header bg-info text-white">
<h5 class="mb-0">
<i class="fas fa-info-circle me-2"></i>
Available Field Types
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h6 class="text-primary">Text Inputs</h6>
<ul class="list-unstyled">
<li><i class="fas fa-check text-success"></i> Text</li>
<li><i class="fas fa-check text-success"></i> Email</li>
<li><i class="fas fa-check text-success"></i> Password</li>
<li><i class="fas fa-check text-success"></i> Tel</li>
<li><i class="fas fa-check text-success"></i> URL</li>
<li><i class="fas fa-check text-success"></i> Textarea</li>
</ul>
</div>
<div class="col-md-6">
<h6 class="text-primary">Special Inputs</h6>
<ul class="list-unstyled">
<li><i class="fas fa-check text-success"></i> Number</li>
<li><i class="fas fa-check text-success"></i> Date</li>
<li><i class="fas fa-check text-success"></i> DateTime-Local</li>
<li><i class="fas fa-check text-success"></i> Time</li>
<li><i class="fas fa-check text-success"></i> Range</li>
<li><i class="fas fa-check text-success"></i> Color</li>
</ul>
</div>
<div class="col-md-6">
<h6 class="text-primary">Selection</h6>
<ul class="list-unstyled">
<li><i class="fas fa-check text-success"></i> Select (Dropdown)</li>
<li><i class="fas fa-check text-success"></i> Radio</li>
<li><i class="fas fa-check text-success"></i> Checkbox</li>
</ul>
</div>
<div class="col-md-6">
<h6 class="text-primary">Files</h6>
<ul class="list-unstyled">
<li><i class="fas fa-check text-success"></i> File (Single/Multiple)</li>
</ul>
</div>
<div class="col-md-6">
<h6 class="text-primary">Nested Forms</h6>
<ul class="list-unstyled">
<li><i class="fas fa-check text-success"></i> Group (Nested Fields)</li>
<li><i class="fas fa-check text-success"></i> Array (Dynamic List)</li>
</ul>
</div>
</div>
<hr>
<div class="alert alert-info mb-0">
<i class="fas fa-lightbulb me-2"></i>
<strong>Features:</strong> Full validation support, conditional logic, nested forms (groups & arrays),
grid-based layout, ARIA accessibility, keyboard navigation, and screen reader support.
</div>
<hr>
<div class="alert alert-success mb-0">
<i class="fas fa-star me-2"></i>
<strong>New:</strong> Try the nested forms below! Add/remove phone numbers dynamically,
or fill in your work experience. The Address section shows a grouped form.
</div>
</div>
</div>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Component, inject, OnInit, ViewChild } from '@angular/core';
import { DynamicFormComponent, FormFieldConfig } from '@abp/ng.components/dynamic-form';
import { FormConfigService } from './form-config.service';

@Component({
selector: 'app-dynamic-form-page',
templateUrl: './dynamic-form-page.component.html',
imports: [DynamicFormComponent],
})
export class DynamicFormPageComponent implements OnInit {
@ViewChild(DynamicFormComponent, { static: false }) dynamicFormComponent: DynamicFormComponent;
protected readonly formConfigService = inject(FormConfigService);

formFields: FormFieldConfig[] = [];

ngOnInit() {
this.formConfigService.getFormConfig().subscribe(config => {
this.formFields = config;
});
}

submit(formData: any) {
console.log('✅ Form Submitted Successfully!', formData);
console.table(formData);

// Show success message
alert('✅ Form submitted successfully! Check the console for details.');

// Reset form after submission
this.dynamicFormComponent.resetForm();
}

cancel() {
console.log('❌ Form Cancelled');
alert('Form cancelled');
this.dynamicFormComponent.resetForm();
}
}
Loading
Loading