#

base

索引 badge
keyboard_arrow_down 1 data1
keyboard_arrow_down 2 data2
keyboard_arrow_down 3 data3
// src/app/piying/page/component/extension/table/example/base/content.ts
import * as v from 'valibot';
import { actions, hideWhen, NFCSchema, setAlias } from '@piying/view-angular-core';
import { safeDefine } from '@@piying-define';
import {
  CheckboxService,
  SortService,
  TableExpandService,
  tableInputDefine,
  TableResourceService,
} from '@piying-lib/angular-daisyui/extension';
import { computed } from '@angular/core';
import { map, startWith } from 'rxjs';
export default v.pipe(
  v.tuple([
    v.pipe(
      v.object({
        table: v.pipe(
          NFCSchema,
          actions.providers.patch([CheckboxService, TableExpandService, SortService]),
          actions.hooks.merge({
            allFieldsResolved: (field) => {
              const sort = field.injector.get(SortService);
              sort.sortList.set(['title1', 'badge1']);
              sort.setInitValue({
                badge1: 1,
              });
              sort.value$$.subscribe((value) => {
                field.injector.get(TableResourceService).setParams('sort', value);
              });
              field.injector.get(CheckboxService).init();
              field.injector.get(TableExpandService).init({ _multiple: true });
            },
          }),
          safeDefine.setComponent('table', (actions) => {
            return [
              actions.inputs.patchAsync({
                define: (field) => {
                  const pageFiled = field.get(['..', 'page']);
                  return tableInputDefine({
                    expand: {
                      head: ' ',
                      body: v.pipe(
                        NFCSchema,
                        safeDefine.setComponent('table-expand-cell', (actions) => {
                          return [actions.wrappers.set(['td'])];
                        }),
                      ),
                    },
                    checkbox: {
                      head: v.pipe(
                        v.boolean(),
                        safeDefine.setComponent('checkbox', (actions) => {
                          return [actions.wrappers.set(['td', 'table-checkbox-all'])];
                        }),
                      ),
                      body: v.pipe(
                        v.boolean(),
                        safeDefine.setComponent('checkbox', (actions) => {
                          return [actions.wrappers.set(['td', 'table-checkbox-body'])];
                        }),
                      ),
                    },
                    index: {
                      head: '索引',
                      body: (node: any, index: number) => {
                        const { pageQueryParams } = pageFiled!.props();
                        return `${index + 1 + pageQueryParams.index * pageQueryParams.size}`;
                      },
                    },
                    '0': {
                      head: '测试',
                      body: (data: any) => {
                        return data.title1;
                      },
                    },
                    '1': {
                      head: 'badge',
                      body: v.pipe(
                        NFCSchema,
                        safeDefine.setComponent('badge', (actions) => {
                          return [
                            actions.wrappers.set(['td']),
                            actions.inputs.patchAsync({
                              content: ({ context }) => {
                                return computed(() => context.item$().badge1);
                              },
                            }),
                          ];
                        }),
                      ),
                    },
                    '2': {
                      head: v.pipe(
                        NFCSchema,
                        safeDefine.setComponent('button', (actions) => {
                          return [
                            actions.inputs.patch({ content: '1234' }),
                            actions.wrappers.set(['td', 'sort-header']),
                            actions.props.patch({
                              key: 'title1',
                            }),
                          ];
                        }),
                      ),
                    },
                    '3': {
                      head: v.pipe(
                        NFCSchema,
                        safeDefine.setComponent('button', (actions) => {
                          return [
                            actions.inputs.patch({ content: '666' }),
                            actions.wrappers.set(['td', 'sort-header']),
                            actions.props.patch({
                              key: 'badge1',
                            }),
                          ];
                        }),
                      ),
                    },
                    extra: {
                      body: v.pipe(
                        NFCSchema,
                        safeDefine.setComponent('button', (actions) => {
                          return [
                            actions.wrappers.set(['td']),
                            hideWhen({
                              listen(fn, field) {
                                const sm = field.injector.get(TableExpandService).selectionModel$$;
                                return sm.pipe(
                                  map((value) => {
                                    return !value.isSelected(field.context.item$());
                                  }),
                                  startWith(true),
                                );
                              },
                            }),
                          ];
                        }),
                      ),
                    },
                  })(() => {
                    return {
                      head: [{ columns: ['expand', 'checkbox', 'index', '1', '2', '3'] }],
                      body: [
                        {
                          define: v.pipe(v.tuple([]), safeDefine.setComponent('tr')),
                          columns: ['expand', 'checkbox', 'index', '1'],
                        },
                        {
                          define: v.pipe(v.tuple([]), safeDefine.setComponent('tr')),
                          columns: ['extra'],
                        },
                      ],
                    };
                  });
                },
                data: (field) => {
                  return field.injector.get(TableResourceService).list$$;
                },
              }),
            ];
          }),
        ),
        page: v.pipe(
          NFCSchema,
          safeDefine.setComponent('pagination', (actions) => {
            return [
              actions.inputs.patch({
                value: {
                  size: 2,
                  index: 0,
                },
              }),
              actions.inputs.patchAsync({
                count: (field) => {
                  return field.injector.get(TableResourceService).count$$;
                },
              }),
            ];
          }),
          actions.outputs.patchAsync({
            valueChange: (field) => {
              return (data) => {
                field.injector.get(TableResourceService).setParams('page', data);
              };
            },
          }),
        ),
      }),
      setAlias('table-page'),
      actions.wrappers.set([{ type: 'loading-wrapper' }]),
      actions.props.patchAsync({
        isLoading: (field) => field.injector.get(TableResourceService).isLoading$$,
      }),
      actions.providers.patch([TableResourceService]),
      actions.hooks.merge({
        allFieldsResolved: (field) => {
          field.injector.get(TableResourceService).setRequest(async (inputs, needUpdate) => {
            await new Promise<void>((res) => {
              setTimeout(() => {
                res();
              }, 1000);
            });
            return [
              3,
              [
                {
                  title1: '测试内容1',
                  badge1: 'data1',
                },
                {
                  title1: '测试内容2',
                  badge1: 'data2',
                },
                {
                  title1: '测试内容3',
                  badge1: 'data3',
                },
              ],
            ];
          });
        },
      }),
    ),
  ]),
  actions.wrappers.patch(['div']),
  actions.class.top('flex gap-4'),
);
content_copy
#

category

k1
k1v0
k1v1
k1v2
k1v3
k2
k2v0
k2v1
k2v2
k2v3
k3
k3v0
k3v1
k3v2
k3v3
k4
k4v0
k4v1
k4v2
k4v3
k5
k5v0
k5v1
k5v2
k5v3
k6
k6v0
k6v1
k6v2
k6v3
k7
k7v0
k7v1
k7v2
k7v3
k8
k8v0
k8v1
k8v2
k8v3
k9
k9v0
k9v1
k9v2
k9v3
k10
k10v0
k10v1
k10v2
k10v3
k11
k11v0
k11v1
k11v2
k11v3
k12
k12v0
k12v1
k12v2
k12v3
k13
k13v0
k13v1
k13v2
k13v3
k14
k14v0
k14v1
k14v2
k14v3
k15
k15v0
k15v1
k15v2
k15v3
k16
k16v0
k16v1
k16v2
k16v3
k17
k17v0
k17v1
k17v2
k17v3
k18
k18v0
k18v1
k18v2
k18v3
k19
k19v0
k19v1
k19v2
k19v3
k20
k20v0
k20v1
k20v2
k20v3
k21
k21v0
k21v1
k21v2
k21v3
k22
k22v0
k22v1
k22v2
k22v3
k23
k23v0
k23v1
k23v2
k23v3
k24
k24v0
k24v1
k24v2
k24v3
k25
k25v0
k25v1
k25v2
k25v3
k26
k26v0
k26v1
k26v2
k26v3
k27
k27v0
k27v1
k27v2
k27v3
k28
k28v0
k28v1
k28v2
k28v3
k29
k29v0
k29v1
k29v2
k29v3
k30
k30v0
k30v1
k30v2
k30v3
k31
k31v0
k31v1
k31v2
k31v3
k32
k32v0
k32v1
k32v2
k32v3
k33
k33v0
k33v1
k33v2
k33v3
k34
k34v0
k34v1
k34v2
k34v3
k35
k35v0
k35v1
k35v2
k35v3
k36
k36v0
k36v1
k36v2
k36v3
k37
k37v0
k37v1
k37v2
k37v3
k38
k38v0
k38v1
k38v2
k38v3
k39
k39v0
k39v1
k39v2
k39v3
k40
k40v0
k40v1
k40v2
k40v3
k41
k41v0
k41v1
k41v2
k41v3
k42
k42v0
k42v1
k42v2
k42v3
k43
k43v0
k43v1
k43v2
k43v3
k44
k44v0
k44v1
k44v2
k44v3
k45
k45v0
k45v1
k45v2
k45v3
k46
k46v0
k46v1
k46v2
k46v3
k47
k47v0
k47v1
k47v2
k47v3
k48
k48v0
k48v1
k48v2
k48v3
k49
k49v0
k49v1
k49v2
k49v3
k50
k50v0
k50v1
k50v2
k50v3
k51
k51v0
k51v1
k51v2
k51v3
k52
k52v0
k52v1
k52v2
k52v3
k53
k53v0
k53v1
k53v2
k53v3
k54
k54v0
k54v1
k54v2
k54v3
k55
k55v0
k55v1
k55v2
k55v3
k56
k56v0
k56v1
k56v2
k56v3
k57
k57v0
k57v1
k57v2
k57v3
k58
k58v0
k58v1
k58v2
k58v3
k59
k59v0
k59v1
k59v2
k59v3
k60
k60v0
k60v1
k60v2
k60v3
k61
k61v0
k61v1
k61v2
k61v3
k62
k62v0
k62v1
k62v2
k62v3
k63
k63v0
k63v1
k63v2
k63v3
k64
k64v0
k64v1
k64v2
k64v3
k65
k65v0
k65v1
k65v2
k65v3
k66
k66v0
k66v1
k66v2
k66v3
k67
k67v0
k67v1
k67v2
k67v3
k68
k68v0
k68v1
k68v2
k68v3
k69
k69v0
k69v1
k69v2
k69v3
k70
k70v0
k70v1
k70v2
k70v3
k71
k71v0
k71v1
k71v2
k71v3
k72
k72v0
k72v1
k72v2
k72v3
k73
k73v0
k73v1
k73v2
k73v3
k74
k74v0
k74v1
k74v2
k74v3
k75
k75v0
k75v1
k75v2
k75v3
k76
k76v0
k76v1
k76v2
k76v3
k77
k77v0
k77v1
k77v2
k77v3
k78
k78v0
k78v1
k78v2
k78v3
k79
k79v0
k79v1
k79v2
k79v3
k80
k80v0
k80v1
k80v2
k80v3
k81
k81v0
k81v1
k81v2
k81v3
k82
k82v0
k82v1
k82v2
k82v3
k83
k83v0
k83v1
k83v2
k83v3
k84
k84v0
k84v1
k84v2
k84v3
k85
k85v0
k85v1
k85v2
k85v3
k86
k86v0
k86v1
k86v2
k86v3
k87
k87v0
k87v1
k87v2
k87v3
k88
k88v0
k88v1
k88v2
k88v3
k89
k89v0
k89v1
k89v2
k89v3
k90
k90v0
k90v1
k90v2
k90v3
k91
k91v0
k91v1
k91v2
k91v3
k92
k92v0
k92v1
k92v2
k92v3
k93
k93v0
k93v1
k93v2
k93v3
k94
k94v0
k94v1
k94v2
k94v3
k95
k95v0
k95v1
k95v2
k95v3
k96
k96v0
k96v1
k96v2
k96v3
k97
k97v0
k97v1
k97v2
k97v3
k98
k98v0
k98v1
k98v2
k98v3
k99
k99v0
k99v1
k99v2
k99v3
// src/app/piying/page/component/extension/table/example/category/content.ts
import * as v from 'valibot';
import { hideWhen, NFCSchema } from '@piying/view-angular-core';
import { safeDefine } from '@@piying-define';
import { actions as DActions } from '@piying/view-angular';
import {
  ExpandRowDirective,
  TableExpandService,
  TableResourceService,
} from '@piying-lib/angular-daisyui/extension';
import { map, startWith } from 'rxjs';
import { range } from 'es-toolkit';
export default v.object({
  table: v.pipe(
    NFCSchema,
    safeDefine.setComponent('table', (actions) => {
      return [
        actions.inputs.patch({ type: 'category', pin: { rows: true } }),
        actions.inputs.patchAsync({
          define: (field) => {
            return {
              row: {
                head: [{ columns: ['0'] }],
                body: [
                  {
                    columns: ['0'],
                  },
                  {
                    columns: ['extra'],
                    define: v.pipe(
                      v.tuple([]),
                      safeDefine.setComponent('tr', (actions) => {
                        return [
                          DActions.directives.set([
                            {
                              type: ExpandRowDirective,
                            },
                          ]),
                          hideWhen({
                            listen(fn, field) {
                              const sm = field.injector.get(TableExpandService).selectionModel$$;
                              return sm.pipe(
                                map((value) => value.isSelected(field.context.item$())),
                                startWith(true),
                              );
                            },
                          }),
                        ];
                      }),
                    ),
                  },
                ],
              },
              columns: {
                '0': {
                  head: (data: any) => {
                    return data;
                  },
                  body: (node: any, index: number) => {
                    return node;
                  },
                },
                extra: {
                  head: (data: any) => {
                    return data;
                  },
                  body: (node: any, index: number) => {
                    return `extra-${node}`;
                  },
                },
              },
            };
          },
        }),
        actions.inputs.patchAsync({
          data: (field) => {
            return field.injector.get(TableResourceService).list$$;
          },
        }),
        actions.class.component('h-100'),
        actions.providers.patch([TableExpandService, TableResourceService]),
        actions.hooks.merge({
          allFieldsResolved: (field) => {
            field.injector.get(TableExpandService).init();
            field.injector.get(TableResourceService).setRequest(() => {
              const list = range(1, 100).map((index) => {
                return [`k${index}`, range(4).map((i) => `k${index}v${i}`)];
              });
              return [list.length, list];
            });
          },
        }),
      ];
    }),
  ),
});
content_copy
#

form

k1-title k2-title
k1-title k2-title
// src/app/piying/page/component/extension/table/example/form/content.ts
import * as v from 'valibot';
import { actions } from '@piying/view-angular-core';
import { safeDefine } from '@@piying-define';
import { computed } from '@angular/core';

export default v.pipe(
  v.tuple([
    v.pipe(
      v.object({
        table: v.pipe(
          v.array(
            v.object({
              k1: v.pipe(v.string(), v.title('k1-title'), actions.wrappers.set(['td'])),
              k2: v.pipe(v.number(), v.title('k2-title'), actions.wrappers.set(['td'])),
            }),
          ),
          safeDefine.setComponent('table-group', (actions) => {
            return [
              actions.inputs.patch({ zebra: true, range: [0, 2], disableAdd: false }),
              actions.class.component('rounded-box border border-base-content/5 bg-base-100'),
            ];
          }),
          actions.hooks.merge({
            allFieldsResolved: (field) => {
              setTimeout(() => {
                field.form.control!.updateValue([
                  { k1: '11', k2: 66 },
                  { k1: '22', k2: 77 },
                  { k1: '33', k2: 88 },
                  { k1: '44', k2: 99 },
                ]);
              }, 0);
            },
          }),
        ),
        page: safeDefine.nfcComponent('pagination', (actions) => {
          return [
            actions.class.top('mt-4 flex justify-end'),
            actions.inputs.patch({
              value: {
                size: 2,
                index: 0,
              },
            }),
            actions.inputs.patchAsync({
              count: (field) => {
                const tableField = field.get(['..', 'table'])!;
                return computed(() => {
                  return tableField.children!().length;
                });
              },
            }),
            actions.outputs.patchAsync({
              valueChange: (field) => {
                return (data) => {
                  const control = field.get(['..', 'table'])!;
                  const start = data.index * data.size;
                  control.inputs.update((inputs) => {
                    return {
                      ...inputs,
                      range: [start, start + data.size],
                    };
                  });
                };
              },
            }),
          ];
        }),
      }),
      actions.wrappers.patch(['div']),
    ),
    v.pipe(
      v.object({
        table: v.pipe(
          v.array(
            v.object({
              k1: v.pipe(v.string(), v.title('k1-title'), actions.wrappers.set(['td'])),
              k2: v.pipe(v.number(), v.title('k2-title'), actions.wrappers.set(['td'])),
            }),
          ),
          safeDefine.setComponent('table-group', (actions) => {
            return [
              actions.inputs.patch({ zebra: true }),
              actions.class.component('rounded-box border border-base-content/5 bg-base-100'),
            ];
          }),
          actions.hooks.merge({
            allFieldsResolved: (field) => {
              setTimeout(() => {
                field.form.control!.updateValue([
                  { k1: '11', k2: 66 },
                  { k1: '22', k2: 77 },
                  { k1: '33', k2: 88 },
                  { k1: '44', k2: 99 },
                ]);
              }, 0);
            },
          }),
        ),
      }),
      actions.wrappers.patch(['div']),
    ),
  ]),
  actions.wrappers.patch(['div']),
  actions.class.top('grid gap-4'),
);
content_copy