portlet-container.tsx 1.5 KB
Newer Older
1 2 3 4
import { ContainerPortletController } from '@ibiz-template/controller';
import { ContainerPortletModel } from '@ibiz-template/model';
import { useNamespace } from '@ibiz-template/vue-util';
import { defineComponent, VNode } from 'vue';
5
import './portlet-container.scss';
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

export const PortletContainer = defineComponent({
  name: 'PortletContainer',
  props: {
    modelData: {
      type: ContainerPortletModel,
      required: true,
    },
    controller: {
      type: ContainerPortletController,
      required: true,
    },
  },
  setup() {
    const ns = useNamespace('portlet-container');
    return { ns };
  },
  render() {
    const defaultSlots: VNode[] = this.$slots.default || [];
    const content = (
26 27 28 29
      <app-row
        class={this.ns.e('content')}
        layout={this.modelData.source.getPSLayout()}
      >
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
        {defaultSlots.map(slot => {
          if (!slot.componentOptions) {
            return slot;
          }
          const props = (slot.componentOptions.propsData || {}) as IData;
          return (
            <app-col
              layoutPos={props.modelData.source.getPSLayoutPos()}
              controller={props.controller.layoutController}
            >
              {slot}
            </app-col>
          );
        })}
      </app-row>
    );
    const classArr: string[] = [
      this.ns.b(),
      this.ns.m(this.modelData.modelClass),
    ];
    return (
51 52 53
      <portlet-layout controller={this.controller} class={classArr}>
        {content}
      </portlet-layout>
54 55 56
    );
  },
});