Skip to content

Commit 7105fa5

Browse files
committed
补全
1 parent 33a4320 commit 7105fa5

8 files changed

Lines changed: 114 additions & 5 deletions

File tree

projects/daisyui/extension/option-list/component.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
<ul [class]="'menu' | mergeClass: attr().class" [attributes]="attr()" [excludes]="['class']">
6565
@for (option of options() | slice: 0 : maxListCount(); track $index) {
6666
<ng-container *ngTemplateOutlet="itemTemplate; context: { $implicit: option }"></ng-container>
67+
} @empty {
68+
<li></li>
6769
}
6870
</ul>
6971
</ng-template>

projects/daisyui/extension/option-list/component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export class OptionListFCC extends BaseControl {
106106
return deepEqual(a, b) ? 'menu-active' : '';
107107
};
108108
activateClasslist = (a: any[], b: any) => {
109-
return a.some((item) => deepEqual(item, b));
109+
return !!a?.some((item) => deepEqual(item, b));
110110
};
111111
}
112112

projects/daisyui/extension/picker-ref/component.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import {
1010
} from '@angular/core';
1111
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
1212
import {
13+
actions,
1314
AttributesDirective,
1415
BaseControl,
1516
PI_INPUT_OPTIONS_TOKEN,
1617
PI_VIEW_FIELD_TOKEN,
18+
PiResolvedViewFieldConfig,
1719
PiyingView,
1820
} from '@piying/view-angular';
1921

@@ -22,6 +24,7 @@ import { CdkConnectedOverlayConfig, CdkOverlayOrigin } from '@angular/cdk/overla
2224
import * as v from 'valibot';
2325
import { CdkConnectedOverlay, CustomMenuTrigger } from '@piying-lib/angular-core';
2426
import { MENU_TRIGGER, PARENT_OR_NEW_MENU_STACK_PROVIDER } from '@angular/cdk/menu';
27+
import { PickerRefService } from './picker-ref.service';
2528
/*
2629
* PickerRefFCC - 选择器引用组件
2730
*
@@ -57,6 +60,7 @@ import { MENU_TRIGGER, PARENT_OR_NEW_MENU_STACK_PROVIDER } from '@angular/cdk/me
5760
useExisting: CustomMenuTrigger,
5861
},
5962
PARENT_OR_NEW_MENU_STACK_PROVIDER,
63+
PickerRefService,
6064
],
6165
changeDetection: ChangeDetectionStrategy.OnPush,
6266
})
@@ -67,10 +71,10 @@ export class PickerRefFCC extends BaseControl {
6771
templateRef = viewChild.required('templateRef');
6872
readonly PiyingView = PiyingView;
6973
/** 触发器内容 */
70-
trigger = input<v.BaseSchema<any, any, any>>();
74+
trigger = input.required<v.BaseSchema<any, any, any>>();
7175
triggerModel = input<'click' | 'contextmenu'>('click');
7276
/** 弹窗内容 */
73-
content = input<v.BaseSchema<any, any, any>>();
77+
content = input.required<v.BaseSchema<any, any, any>>();
7478
/** 选择后是否自动关闭 */
7579
changeClose = input<boolean>(true);
7680
isOpen$ = signal(false);
@@ -80,17 +84,27 @@ export class PickerRefFCC extends BaseControl {
8084
parentPyOptions = inject(PI_INPUT_OPTIONS_TOKEN, { optional: true });
8185
#field$$ = inject(PI_VIEW_FIELD_TOKEN);
8286
menuTrigger = inject(CustomMenuTrigger);
83-
87+
#service = inject(PickerRefService);
8488
triggerInput$$ = computed(() => {
8589
return {
8690
model: this.value$,
87-
schema: this.trigger,
91+
schema: computed(() => {
92+
return v.pipe(
93+
this.trigger(),
94+
actions.hooks.merge({
95+
allFieldsResolved: (field) => {
96+
this.#service.triggerField$$ = signal(field);
97+
},
98+
}),
99+
);
100+
}),
88101
options: computed(() => ({
89102
...this.parentPyOptions!(),
90103
context: {
91104
...this.parentPyOptions!().context,
92105
pickerValue: this.value$,
93106
parentProps: this.#field$$().props,
107+
rootField$$: this.#field$$,
94108
},
95109
})),
96110
selectorless: true,
@@ -126,6 +140,10 @@ export class PickerRefFCC extends BaseControl {
126140
},
127141
};
128142
});
143+
144+
ngOnInit(): void {
145+
this.#service.rootField$$ = this.#field$$;
146+
}
129147
openRef(mode: string) {
130148
if (mode === this.triggerModel()) {
131149
this.isOpen$.set(true);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './component';
2+
export * from './picker-ref.service'
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Injectable, Signal, WritableSignal } from '@angular/core';
2+
import { PiResolvedViewFieldConfig } from '@piying/view-angular';
3+
4+
@Injectable()
5+
export class PickerRefService {
6+
rootField$$!: Signal<PiResolvedViewFieldConfig>;
7+
triggerField$$!: Signal<PiResolvedViewFieldConfig>;
8+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import * as v from 'valibot';
2+
import { actions, NFCSchema } from '@piying/view-angular-core';
3+
import { safeDefine } from '@@piying-define';
4+
import { PiResolvedViewFieldConfig } from '@piying/view-angular';
5+
import { filter } from 'rxjs';
6+
import { PickerRefService } from '@piying-lib/angular-daisyui/extension';
7+
export const TriggerButton = v.pipe(
8+
v.string(),
9+
safeDefine.setComponent('input', (actions) => {
10+
return [];
11+
}),
12+
);
13+
export const ContentButton = v.pipe(
14+
v.string(),
15+
safeDefine.setComponent('option-list', (actions) => {
16+
return [
17+
actions.inputs.patch({
18+
options: ['option-1', 'option-2', 'option-3'],
19+
}),
20+
actions.hooks.merge({
21+
allFieldsResolved: (field) => {
22+
let options = field.inputs()['options'] as string[];
23+
let service = field.injector.get(PickerRefService);
24+
let triggerField = service.triggerField$$();
25+
let allowCustom = true;
26+
triggerField.form
27+
.control!.valueChanges.pipe(filter((a) => typeof a === 'string'))
28+
.subscribe((value) => {
29+
field.inputs.update((data) => {
30+
return {
31+
...data,
32+
options: !value ? options : options.filter((item) => item.includes(value)),
33+
};
34+
});
35+
if (allowCustom) {
36+
let rootField$$ = service.rootField$$();
37+
rootField$$.form.control!.updateValue(value);
38+
}
39+
});
40+
},
41+
}),
42+
];
43+
}),
44+
actions.class.bottom('bg-white rounded-box shadow'),
45+
);
46+
47+
export default v.pipe(
48+
v.tuple([
49+
v.pipe(
50+
v.string(),
51+
safeDefine.setComponent('picker-ref', (actions) => {
52+
return [
53+
actions.inputs.patch({
54+
trigger: TriggerButton,
55+
content: ContentButton,
56+
overlayConfig: { positionStrategy: undefined },
57+
}),
58+
];
59+
}),
60+
actions.hooks.merge({
61+
allFieldsResolved: (field) => {
62+
field.form.control!.valueChanges.subscribe((item) => {
63+
console.log('值变更', item);
64+
});
65+
},
66+
}),
67+
),
68+
]),
69+
actions.wrappers.patch(['div']),
70+
actions.class.top('flex gap-4'),
71+
);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import define from './content';
2+
import content from './content?text';
3+
import title from './content?title';
4+
export const Autocomplete = {
5+
define: define,
6+
content: content,
7+
title: title,
8+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './changeClose';
22
export * from './base';
3+
export * from './autocomplete';

0 commit comments

Comments
 (0)