overlay-view-util.ts 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import { ViewNeuron } from '@ibiz-template/controller';
import {
  IDrawerOptions,
  IModal,
  IModalData,
  IModalOptions,
  IPopoverOptions,
  ViewMode,
} from '@ibiz-template/runtime';
import { CreateElement, VNode } from 'vue';

export function createOverlayView(
  close: (_res: IModalData) => void,
  props?: IParams | undefined,
): (_h: CreateElement) => VNode {
  return (h: CreateElement) =>
    h('ViewShell', {
18
      attrs: props,
19 20 21 22 23 24 25 26 27 28
      on: {
        neuronInit: (neuron: ViewNeuron) => {
          neuron.evt.on('closeView', (res: IModalData) => {
            close(res);
          });
        },
      },
    });
}

29
export async function openViewModal(
30 31 32 33 34 35 36 37 38 39
  props?: IParams | undefined,
  opts?: IModalOptions | undefined,
): Promise<IModalData> {
  const modal: IModal = { mode: ViewMode.MODAL };
  const overlay = ibiz.overlay.createModal(
    createOverlayView(res => overlay.dismiss(res), { ...props, modal }),
    undefined,
    opts,
  );
  overlay.present();
40 41
  const result: IModalData | undefined = await overlay.onWillDismiss();
  return result || { ok: false };
42 43
}

44
export async function openViewDrawer(
45 46 47 48 49 50 51 52 53 54
  props?: IParams | undefined,
  opts?: IDrawerOptions | undefined,
): Promise<IModalData> {
  const modal: IModal = { mode: ViewMode.DRAWER };
  const overlay = ibiz.overlay.createDrawer(
    createOverlayView(res => overlay.dismiss(res), { ...props, modal }),
    undefined,
    opts,
  );
  overlay.present();
55 56
  const result: IModalData | undefined = await overlay.onWillDismiss();
  return result || { ok: false };
57 58
}

59
export async function openViewPopover(
60 61 62 63 64 65 66 67 68 69 70
  event: MouseEvent,
  props?: IParams | undefined,
  opts?: IPopoverOptions | undefined,
): Promise<IModalData> {
  const modal: IModal = { mode: ViewMode.DRAWER };
  const overlay = ibiz.overlay.createPopover(
    createOverlayView(res => overlay.dismiss(res), { ...props, modal }),
    undefined,
    opts,
  );
  overlay.present(event.target as HTMLElement);
71 72
  const result: IModalData | undefined = await overlay.onWillDismiss();
  return result || { ok: false };
73 74 75 76 77 78 79 80 81 82 83 84 85 86
}

const PlacementMap: IData = {
  DRAWER_LEFT: 'left',
  DRAWER_RIGHT: 'right',
  DRAWER_TOP: 'top',
  DRAWER_BOTTOM: 'bottom',
};

export function getDrawerPlacement(
  openMode: string,
): IDrawerOptions['placement'] {
  return PlacementMap[openMode] || 'right';
}