Skip to content

Commit b83d6d6

Browse files
jmaGarfield-fr
andcommitted
fix(editor): clear button on primeng components
* Fixes missing placeholder for grouped dropdown. * Fixes missing hidden fields in the label editor component. * Fixes display the autocomplete component on clear. * Fixes demo schema. * Fixes clear action on several select primeng components. * Fixes translations on essential fields. * Fixes translations on label component. Co-Authored-by: Johnny Mariéthoz <[email protected]> Co-Authored-by: Bertrand Zuchuat <[email protected]>
1 parent 7db4339 commit b83d6d6

File tree

10 files changed

+1836
-2893
lines changed

10 files changed

+1836
-2893
lines changed

package-lock.json

+1,725-2,822
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/ng-core-tester/src/app/record/editor/schema.json

+14-8
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,13 @@
935935
"selectWithPreferredOptions": {
936936
"title": "Select with preferred options",
937937
"type": "string",
938-
"enum": [],
938+
"enum": [
939+
"fre",
940+
"ita",
941+
"eng",
942+
"por",
943+
"jpn"
944+
],
939945
"widget": {
940946
"formlyConfig": {
941947
"props": {
@@ -977,12 +983,12 @@
977983
"title": "Select with group and sort",
978984
"type": "string",
979985
"enum": [
980-
"Epicea",
981-
"Baobab",
982-
"Foxglove",
983-
"Crocus",
984-
"Heather",
985-
"Daffodil"
986+
"epicea",
987+
"baobab",
988+
"foxglove",
989+
"crocus",
990+
"heather",
991+
"daffodil"
986992
],
987993
"widget": {
988994
"formlyConfig": {
@@ -995,7 +1001,7 @@
9951001
"items": [
9961002
{
9971003
"label": "Epicea",
998-
"value": "Epicea"
1004+
"value": "epicea"
9991005
},
10001006
{
10011007
"label": "Baobab",

projects/rero/ng-core/src/lib/prime-ng-core-module.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,26 @@ import { DialogModule } from 'primeng/dialog';
2929
import { DividerModule } from 'primeng/divider';
3030
import { DropdownModule } from "primeng/dropdown";
3131
import { DialogService, DynamicDialogModule } from 'primeng/dynamicdialog';
32+
import { FieldsetModule } from 'primeng/fieldset';
3233
import { InputGroupModule } from 'primeng/inputgroup';
3334
import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
3435
import { InputSwitchModule } from 'primeng/inputswitch';
3536
import { InputTextModule } from 'primeng/inputtext';
3637
import { InputTextareaModule } from 'primeng/inputtextarea';
3738
import { ListboxModule } from 'primeng/listbox';
39+
import { MenuModule } from 'primeng/menu';
3840
import { MessagesModule } from 'primeng/messages';
3941
import { PaginatorModule } from 'primeng/paginator';
4042
import { PanelModule } from 'primeng/panel';
4143
import { RadioButtonModule } from "primeng/radiobutton";
44+
import { RippleModule } from 'primeng/ripple';
4245
import { SplitButtonModule } from 'primeng/splitbutton';
4346
import { TabViewModule } from 'primeng/tabview';
4447
import { TagModule } from 'primeng/tag';
4548
import { TieredMenuModule } from 'primeng/tieredmenu';
4649
import { ToastModule } from 'primeng/toast';
4750
import { TooltipModule } from 'primeng/tooltip';
4851
import { TriStateCheckboxModule } from 'primeng/tristatecheckbox';
49-
import { FieldsetModule } from 'primeng/fieldset';
50-
import { MenuModule } from 'primeng/menu';
5152

5253

5354
@NgModule({
@@ -81,6 +82,7 @@ import { MenuModule } from 'primeng/menu';
8182
PaginatorModule,
8283
PanelModule,
8384
RadioButtonModule,
85+
RippleModule,
8486
SplitButtonModule,
8587
TabViewModule,
8688
TagModule,

projects/rero/ng-core/src/lib/record/editor/formly/primeng/multi-select/multi-select.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export interface FormlyMultiSelectFieldConfig extends FormlyFieldConfig<IMultiSe
8282
[tooltipPositionStyle]="props.tooltipPositionStyle"
8383
[tooltipStyleClass]="props.tooltipStyleClass"
8484
(onChange)="props.change && props.change(field, $event)"
85+
(onClear)="clearValidators()"
8586
>
8687
<ng-template let-items pTemplate="selectedItems">
8788
@for(option of items; track items; let last = $last) {
@@ -122,8 +123,8 @@ export class MultiSelectComponent extends FieldType<FormlyFieldConfig<IMultiSele
122123
styleClass: 'w-full mb-1',
123124
tooltipPosition: 'top',
124125
tooltipPositionStyle: 'absolute',
125-
variant: 'outlined'
126-
}
126+
variant: 'outlined',
127+
},
127128
};
128129

129130
ngOnInit(): void {
@@ -133,12 +134,17 @@ export class MultiSelectComponent extends FieldType<FormlyFieldConfig<IMultiSele
133134
}));
134135
}
135136

137+
// Clear all validators except required.
138+
clearValidators() {
139+
const errors = this.formControl.errors;
140+
this.formControl.setErrors(errors.required ? { required: true } : null);
141+
}
142+
136143
ngOnDestroy(): void {
137144
this.subscription.unsubscribe();
138145
}
139146
}
140147

141-
142148
@NgModule({
143149
declarations: [MultiSelectComponent],
144150
imports: [
@@ -157,6 +163,6 @@ export class MultiSelectComponent extends FieldType<FormlyFieldConfig<IMultiSele
157163
],
158164
}),
159165
],
160-
exports: [MultiSelectComponent]
166+
exports: [MultiSelectComponent],
161167
})
162-
export class NgCoreFormlyMultiSelectModule { }
168+
export class NgCoreFormlyMultiSelectModule {}

projects/rero/ng-core/src/lib/record/editor/formly/primeng/remote-autocomplete/remote-autocomplete.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,17 @@ export interface IRemoteAutoCompleteProps extends FormlyFieldProps {
4343
@Component({
4444
selector: 'ng-core-remote-autocomplete',
4545
template: `
46-
<div class="flex w-full">
46+
<div class="flex gap-1">
4747
@if (!field.formControl.value) {
4848
@if (props.filters?.options) {
49-
<div class="flex">
5049
<p-dropdown
5150
[options]="props.filters.options"
5251
[ngModel]="props.filters.selected"
5352
(onChange)="changeFilter($event)"
5453
/>
55-
</div>
5654
}
57-
<div class="flex w-full">
5855
<p-autoComplete
59-
class="w-full"
56+
class="flex-grow-1"
6057
styleClass="w-full"
6158
inputStyleClass="w-full"
6259
[scrollHeight]="props.scrollHeight"
@@ -83,7 +80,6 @@ export interface IRemoteAutoCompleteProps extends FormlyFieldProps {
8380
}
8481
</ng-template>
8582
</p-autoComplete>
86-
</div>
8783
} @else {
8884
<div class="flex gap-1 align-items-center">
8985
<span [innerHtml]="valueSelected()"></span>
@@ -169,7 +165,6 @@ export class RemoteAutocomplete extends FieldType<FormlyFieldConfig<IRemoteAutoC
169165
clear(): void {
170166
this.value = '';
171167
this.formControl.reset(null);
172-
this.onValueSelect.next(null);
173168
this.field.focus = true;
174169
}
175170
}

projects/rero/ng-core/src/lib/record/editor/formly/primeng/select/select.ts

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export interface IFormlySelectFieldConfig extends FormlyFieldConfig<ISelectProps
8484
[tooltipPositionStyle]="props.tooltipPositionStyle"
8585
[tooltipStyleClass]="props.tooltipStyleClass"
8686
(onChange)="props.change && props.change(field, $event)"
87+
(onClear)="clearValidators()"
8788
>
8889
<ng-template let-selected pTemplate="selectedItem">
8990
{{ selected.label | translate }}
@@ -151,6 +152,11 @@ export class SelectComponent extends FieldType<FormlyFieldConfig<ISelectProps>>
151152
ngOnDestroy(): void {
152153
this.subscription.unsubscribe();
153154
}
155+
156+
clearValidators() {
157+
const errors = this.formControl.errors;
158+
this.formControl.setErrors(errors.required? {required: true}: null);
159+
}
154160
}
155161

156162
@NgModule({

projects/rero/ng-core/src/lib/record/editor/formly/primeng/tree-select/tree-select.ts

+10-7
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core';
2323
import { TranslateLabelService } from '@rero/ng-core/src/lib/record/editor/formly/primeng/select';
2424
import { TreeNode } from 'primeng/api';
2525
import { TreeNodeSelectEvent } from 'primeng/tree';
26-
import { TreeSelectModule as PrimeNgTreeSelectModule } from 'primeng/treeselect';
26+
import { TreeSelectModule } from 'primeng/treeselect';
2727
import { Subscription } from 'rxjs';
2828

2929
// Doc https://primeng.org/treeselect
@@ -64,8 +64,9 @@ export interface FormlyTreeSelectFieldConfig extends FormlyFieldConfig<ITreeSele
6464
[placeholder]="props.placeholder | translate"
6565
[showClear]="!props.required"
6666
[variant]="props.variant"
67-
(onNodeSelect)="onNodeSelect($event)"
68-
(onNodeUnselect)="onNodeUnselect()"
67+
(onNodeSelect)="setFormValue($event)"
68+
(onNodeUnselect)="clearFormValue()"
69+
(onClear)="clearFormValue()"
6970
/>
7071
`,
7172
})
@@ -104,12 +105,14 @@ export class TreeSelectComponent extends FieldType<FormlyFieldConfig<ITreeSelect
104105
this.subscription.unsubscribe();
105106
}
106107

107-
onNodeSelect(event: TreeNodeSelectEvent): void {
108+
setFormValue(event: TreeNodeSelectEvent): void {
108109
this.formControl.setValue(event.node.data);
109110
}
110111

111-
onNodeUnselect(): void {
112-
this.formControl.reset();
112+
clearFormValue(): void {
113+
this.formControl.reset(null);
114+
const errors = this.formControl.errors;
115+
this.formControl.setErrors(errors.required? {required: true}: null);
113116
}
114117

115118
private findNodeByValue(node: TreeNode[], value: string, data?: TreeNode): any {
@@ -134,8 +137,8 @@ export class TreeSelectComponent extends FieldType<FormlyFieldConfig<ITreeSelect
134137
CommonModule,
135138
FormsModule,
136139
FormlySelectModule,
137-
PrimeNgTreeSelectModule,
138140
TranslateModule.forRoot(),
141+
TreeSelectModule,
139142
FormlyModule.forChild({
140143
types: [
141144
{

projects/rero/ng-core/src/lib/record/editor/widgets/add-field-editor/add-field-editor.component.html

+12-7
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,15 @@
2626
[disabled]="items.length < 1"
2727
/>
2828

29-
<p-listbox
30-
[options]="essentialsOptions"
31-
scrollHeight=""
32-
styleClass="mt-2"
33-
(onChange)="onAddField($event)"
34-
/>
35-
29+
@if(essentialsOptions?.length > 0) {
30+
<p-listbox
31+
[options]="essentialsOptions"
32+
scrollHeight=""
33+
styleClass="mt-2"
34+
(onChange)="onAddField($event)"
35+
>
36+
<ng-template let-item pTemplate="item">
37+
{{item.label|async}}
38+
</ng-template>
39+
</p-listbox>
40+
}

projects/rero/ng-core/src/lib/record/editor/widgets/add-field-editor/add-field-editor.component.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export class AddFieldEditorComponent implements OnInit, OnDestroy {
6969
this.essentialsOptions = fields
7070
.filter(f => this.isFieldEssential(f))
7171
.map((field: any) => {
72-
return { label: this.translateService.instant(field.props.untranslatedLabel), value: field }
72+
return { label: this.translateService.stream(field.props.untranslatedLabel), value: field }
7373
});
7474

7575
})

0 commit comments

Comments
 (0)