logo

Sheets Multi

Univer Sheet supports multiple instances, allowing you to manage multiple tables in one unified view.

TypeScriptReactVue
Loading...
import { createUniver, defaultTheme, LocaleType, merge } from '@univerjs/presets'
import { UniverSheetsCorePreset } from '@univerjs/presets/preset-sheets-core'
import sheetsCoreEnUS from '@univerjs/presets/preset-sheets-core/locales/en-US'
import { useEffect } from 'react'
import { Mosaic, MosaicWindow } from 'react-mosaic-component'
import 'react-mosaic-component/react-mosaic-component.css'
import './style.css'
import '@univerjs/presets/lib/styles/preset-sheets-core.css'

type ViewId = 'a' | 'b' | 'c'

const TITLE_MAP: Record<ViewId, string> = {
  a: 'Sheet 1',
  b: 'Sheet 2',
  c: 'Sheet 3',
}

function factory(id: string) {
  return function createUniverOnContainer() {
    const { univerAPI } = createUniver({
      locale: LocaleType.EN_US,
      locales: {
        [LocaleType.EN_US]: merge(
          {},
          sheetsCoreEnUS,
        ),
      },
      theme: defaultTheme,
      presets: [
        UniverSheetsCorePreset({
          container: id,
        }),
      ],
    })

    univerAPI.createUniverSheet({})
  }
}

export default function App() {
  useEffect(() => {
    factory('app-a')()
    factory('app-b')()
    factory('app-c')()
  }, [])

  return (
    <div id="app">
      <Mosaic
        renderTile={(id, path) => (
          <MosaicWindow
            path={path}
            title={TITLE_MAP[id]}
            toolbarControls={<div />}
          >
            <div id={`app-${id}`} style={{ height: '100%' }}>
              {TITLE_MAP[id]}
            </div>
          </MosaicWindow>
        )}
        initialValue={{
          direction: 'row',
          first: 'a',
          second: {
            direction: 'column',
            first: 'b',
            second: 'c',
          },
        }}
      />
    </div>
  )
}