UNPKG

naive-ui

Version:

A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast

265 lines 7.73 kB
import { Transition, computed, defineComponent, h, nextTick, provide, ref, toRef } from 'vue'; import { throttle } from 'lodash-es'; import { useConfig, useHljs, useTheme, useThemeClass } from "../../_mixins/index.mjs"; import { warn } from "../../_utils/index.mjs"; import { NScrollbar } from "../../_internal/index.mjs"; import { NCode } from "../../code/index.mjs"; import { logLight } from "../styles/index.mjs"; import NLogLoader from "./LogLoader.mjs"; import NLogLine from "./LogLine.mjs"; import { logInjectionKey } from "./context.mjs"; import style from "./styles/index.cssr.mjs"; export const logProps = Object.assign(Object.assign({}, useTheme.props), { loading: Boolean, trim: Boolean, log: String, fontSize: { type: Number, default: 14 }, lines: { type: Array, default: () => [] }, lineHeight: { type: Number, default: 1.25 }, language: String, rows: { type: Number, default: 15 }, offsetTop: { type: Number, default: 0 }, offsetBottom: { type: Number, default: 0 }, hljs: Object, onReachTop: Function, onReachBottom: Function, onRequireMore: Function }); export default defineComponent({ name: 'Log', props: logProps, setup(props) { const { mergedClsPrefixRef, inlineThemeDisabled } = useConfig(props); const silentRef = ref(false); const highlightRef = computed(() => { return props.language !== undefined; }); const styleHeightRef = computed(() => { return `calc(${Math.round(props.rows * props.lineHeight * props.fontSize)}px)`; }); const mergedLinesRef = computed(() => { const { log } = props; if (log) { return log.split('\n'); } return props.lines; }); const scrollbarRef = ref(null); const themeRef = useTheme('Log', '-log', style, logLight, props, mergedClsPrefixRef); function handleScroll(e) { const container = e.target; const content = container.firstElementChild; if (silentRef.value) { void nextTick(() => { silentRef.value = false; }); return; } const containerHeight = container.offsetHeight; const containerScrollTop = container.scrollTop; const contentHeight = content.offsetHeight; const scrollTop = containerScrollTop; const scrollBottom = contentHeight - containerScrollTop - containerHeight; if (scrollTop <= props.offsetTop) { const { onReachTop, onRequireMore } = props; if (onRequireMore) onRequireMore('top'); if (onReachTop) onReachTop(); } if (scrollBottom <= props.offsetBottom) { const { onReachBottom, onRequireMore } = props; if (onRequireMore) onRequireMore('bottom'); if (onReachBottom) onReachBottom(); } } const handleWheel = throttle(_handleWheel, 300); function _handleWheel(e) { if (silentRef.value) { void nextTick(() => { silentRef.value = false; }); return; } if (scrollbarRef.value) { const { containerRef, contentRef } = scrollbarRef.value; if (containerRef && contentRef) { const containerHeight = containerRef.offsetHeight; const containerScrollTop = containerRef.scrollTop; const contentHeight = contentRef.offsetHeight; const scrollTop = containerScrollTop; const scrollBottom = contentHeight - containerScrollTop - containerHeight; const deltaY = e.deltaY; if (scrollTop === 0 && deltaY < 0) { const { onRequireMore } = props; if (onRequireMore) onRequireMore('top'); } if (scrollBottom <= 0 && deltaY > 0) { const { onRequireMore } = props; if (onRequireMore) onRequireMore('bottom'); } } } } function scrollTo(options) { const { value: scrollbarInst } = scrollbarRef; if (!scrollbarInst) return; const { silent, top, position } = options; if (silent) { silentRef.value = true; } if (top !== undefined) { scrollbarInst.scrollTo({ left: 0, top }); } else if (position === 'bottom' || position === 'top') { scrollbarInst.scrollTo({ position }); } } // deprecated function scrollToTop(silent = false) { warn('log', '`scrollToTop` is deprecated, please use `scrollTo({ position: \'top\'})` instead.'); scrollTo({ position: 'top', silent }); } function scrollToBottom(silent = false) { warn('log', '`scrollToTop` is deprecated, please use `scrollTo({ position: \'bottom\'})` instead.'); scrollTo({ position: 'bottom', silent }); } provide(logInjectionKey, { languageRef: toRef(props, 'language'), mergedHljsRef: useHljs(props, highlightRef), trimRef: toRef(props, 'trim'), highlightRef }); const exportedMethods = { scrollTo }; const cssVarsRef = computed(() => { const { self: { loaderFontSize, loaderTextColor, loaderColor, loaderBorder, loadingColor }, common: { cubicBezierEaseInOut } } = themeRef.value; return { '--n-bezier': cubicBezierEaseInOut, '--n-loader-font-size': loaderFontSize, '--n-loader-border': loaderBorder, '--n-loader-color': loaderColor, '--n-loader-text-color': loaderTextColor, '--n-loading-color': loadingColor }; }); const themeClassHandle = inlineThemeDisabled ? useThemeClass('log', undefined, cssVarsRef, props) : undefined; return Object.assign(Object.assign({}, exportedMethods), { mergedClsPrefix: mergedClsPrefixRef, scrollbarRef, mergedTheme: themeRef, styleHeight: styleHeightRef, mergedLines: mergedLinesRef, scrollToTop, scrollToBottom, handleWheel, handleScroll, cssVars: inlineThemeDisabled ? undefined : cssVarsRef, themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass, onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender }); }, render() { const { mergedClsPrefix, mergedTheme, onRender } = this; onRender === null || onRender === void 0 ? void 0 : onRender(); return h('div', { class: [`${mergedClsPrefix}-log`, this.themeClass], style: [{ lineHeight: this.lineHeight, height: this.styleHeight }, this.cssVars], onWheelPassive: this.handleWheel }, [h(NScrollbar, { ref: "scrollbarRef", theme: mergedTheme.peers.Scrollbar, themeOverrides: mergedTheme.peerOverrides.Scrollbar, onScroll: this.handleScroll }, { default: () => h(NCode, { internalNoHighlight: true, internalFontSize: this.fontSize, theme: mergedTheme.peers.Code, themeOverrides: mergedTheme.peerOverrides.Code }, { default: () => this.mergedLines.map((line, index) => { return h(NLogLine, { key: index, line: line }); }) }) }), h(Transition, { name: "fade-in-scale-up-transition" }, { default: () => this.loading ? h(NLogLoader, { clsPrefix: mergedClsPrefix }) : null })]); } });