diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html
index b5da3a266f..401fd1454d 100644
--- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html
+++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html
@@ -22,7 +22,7 @@
/>
}
@case ('hidden') {
-
+
}
@case ('checkbox') {
}
@case ('date') {
@@ -122,7 +127,7 @@
}
@case ('dateTime') {
-
+
}
@case ('textarea') {
diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts
index d6e9dba268..401bd15c3d 100644
--- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts
+++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts
@@ -49,12 +49,14 @@ import { NgxValidateCoreModule } from '@ngx-validate/core';
import { ExtensibleFormPropService } from '../../services/extensible-form-prop.service';
import { CommonModule } from '@angular/common';
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
+import { ExtensibleFormMultiselectComponent } from '../multi-select/extensible-form-multiselect.component';
@Component({
selector: 'abp-extensible-form-prop',
templateUrl: './extensible-form-prop.component.html',
imports: [
ExtensibleDateTimePickerComponent,
+ ExtensibleFormMultiselectComponent,
NgbDatepickerModule,
NgbTimepickerModule,
ReactiveFormsModule,
diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts
new file mode 100644
index 0000000000..b46bf6d391
--- /dev/null
+++ b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts
@@ -0,0 +1,88 @@
+import { Component, ChangeDetectionStrategy, forwardRef, input } from '@angular/core';
+import { NG_VALUE_ACCESSOR, ControlValueAccessor, ReactiveFormsModule } from '@angular/forms';
+import { CommonModule } from '@angular/common';
+
+import { ABP, LocalizationModule } from '@abp/ng.core';
+import { BaseThemeSharedModule } from '@abp/ng.theme.shared';
+import { FormProp } from '@abp/ng.components/extensible';
+
+const EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR = {
+ provide: NG_VALUE_ACCESSOR,
+ useExisting: forwardRef(() => ExtensibleFormMultiselectComponent),
+ multi: true,
+};
+
+@Component({
+ selector: 'abp-extensible-form-multi-select',
+ template: `
+
+ @for (option of options(); track option.value) {
+
+
+
+ @if (prop().isExtra) {
+ {{ '::' + option.key | abpLocalization }}
+ } @else {
+ {{ option.key }}
+ }
+
+
+ }
+
+ `,
+ providers: [EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR],
+ imports: [BaseThemeSharedModule, LocalizationModule, CommonModule, ReactiveFormsModule],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class ExtensibleFormMultiselectComponent implements ControlValueAccessor {
+ prop = input.required();
+ options = input.required[]>();
+
+ selectedValues: any[] = [];
+ disabled = false;
+
+ setDisabledState(isDisabled: boolean): void {
+ this.disabled = isDisabled;
+ }
+
+ isChecked(value: any): boolean {
+ return this.selectedValues.includes(value);
+ }
+
+ onCheckboxChange(value: any, event: any): void {
+ const checked = event.target.checked;
+
+ if (checked) {
+ this.selectedValues.push(value);
+ } else {
+ this.selectedValues = this.selectedValues.filter(item => item !== value);
+ }
+
+ this.onChange(this.selectedValues);
+ this.onTouched();
+ }
+
+ writeValue(value: any[]): void {
+ if (Array.isArray(value)) {
+ this.selectedValues = value;
+ }
+ }
+
+ registerOnChange(fn: any): void {
+ this.onChange = fn;
+ }
+
+ registerOnTouched(fn: any): void {
+ this.onTouched = fn;
+ }
+
+ private onChange(fn: any): void {}
+
+ private onTouched(): any {}
+}
diff --git a/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts
index 99bc25b6f4..da87b49491 100644
--- a/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts
+++ b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts
@@ -20,6 +20,7 @@ import {
import { PropDataDirective } from './directives/prop-data.directive';
import { CreateInjectorPipe } from './pipes/create-injector.pipe';
import { DisabledDirective } from '@abp/ng.theme.shared';
+import {ExtensibleFormMultiselectComponent} from "./components/multi-select/extensible-form-multiselect.component";
const importWithExport = [
DisabledDirective,
@@ -31,6 +32,7 @@ const importWithExport = [
CreateInjectorPipe,
ExtensibleFormComponent,
ExtensibleTableComponent,
+ ExtensibleFormMultiselectComponent
];
@NgModule({
declarations: [],