feat:add page margin

pr675
Hufe921 4 years ago
parent bad379c7aa
commit f540261500

@ -248,7 +248,12 @@
</ul> </ul>
</div> </div>
</div> </div>
<i class="fullscreen"></i> <div class="paper-margin">
<i></i>
</div>
<div class="fullscreen">
<i></i>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -0,0 +1 @@
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect stroke="#3D4757" x="2.5" y="1.5" width="11" height="13" rx="1"/><path fill="#3D4757" fill-rule="nonzero" d="M3 4h10v1H3zm0 7h10v1H3z"/><path fill="#3D4757" fill-rule="nonzero" d="M5 14V2h1v12zm5 0V2h1v12z"/></g></svg>

After

Width:  |  Height:  |  Size: 321 B

@ -3,6 +3,7 @@ import { EditorMode, PageMode } from '../../dataset/enum/Editor'
import { RowFlex } from '../../dataset/enum/Row' import { RowFlex } from '../../dataset/enum/Row'
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw' import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
import { IEditorResult } from '../../interface/Editor' import { IEditorResult } from '../../interface/Editor'
import { IMargin } from '../../interface/Margin'
import { IWatermark } from '../../interface/Watermark' import { IWatermark } from '../../interface/Watermark'
import { CommandAdapt } from './CommandAdapt' import { CommandAdapt } from './CommandAdapt'
@ -68,6 +69,8 @@ export class Command {
private static pageScaleMinus: CommandAdapt['pageScaleMinus'] private static pageScaleMinus: CommandAdapt['pageScaleMinus']
private static pageScaleAdd: CommandAdapt['pageScaleAdd'] private static pageScaleAdd: CommandAdapt['pageScaleAdd']
private static paperSize: CommandAdapt['paperSize'] private static paperSize: CommandAdapt['paperSize']
private static getPaperMargin: CommandAdapt['getPaperMargin']
private static setPaperMargin: CommandAdapt['setPaperMargin']
private static insertElementList: CommandAdapt['insertElementList'] private static insertElementList: CommandAdapt['insertElementList']
private static removeControl: CommandAdapt['removeControl'] private static removeControl: CommandAdapt['removeControl']
@ -132,6 +135,8 @@ export class Command {
Command.pageScaleMinus = adapt.pageScaleMinus.bind(adapt) Command.pageScaleMinus = adapt.pageScaleMinus.bind(adapt)
Command.pageScaleAdd = adapt.pageScaleAdd.bind(adapt) Command.pageScaleAdd = adapt.pageScaleAdd.bind(adapt)
Command.paperSize = adapt.paperSize.bind(adapt) Command.paperSize = adapt.paperSize.bind(adapt)
Command.getPaperMargin = adapt.getPaperMargin.bind(adapt)
Command.setPaperMargin = adapt.setPaperMargin.bind(adapt)
Command.insertElementList = adapt.insertElementList.bind(adapt) Command.insertElementList = adapt.insertElementList.bind(adapt)
Command.removeControl = adapt.removeControl.bind(adapt) Command.removeControl = adapt.removeControl.bind(adapt)
} }
@ -360,7 +365,7 @@ export class Command {
return Command.getWordCount() return Command.getWordCount()
} }
// 页面模式、页面缩放、纸张大小 // 页面模式、页面缩放、纸张大小、页边距
public executePageMode(payload: PageMode) { public executePageMode(payload: PageMode) {
return Command.pageMode(payload) return Command.pageMode(payload)
} }
@ -381,6 +386,14 @@ export class Command {
return Command.paperSize(width, height) return Command.paperSize(width, height)
} }
public getPaperMargin() {
return Command.getPaperMargin()
}
public executeSetPaperMargin(payload: IMargin) {
return Command.setPaperMargin(payload)
}
// 通用 // 通用
public executeInsertElementList(payload: IElement[]) { public executeInsertElementList(payload: IElement[]) {
return Command.insertElementList(payload) return Command.insertElementList(payload)

@ -9,6 +9,7 @@ import { RowFlex } from '../../dataset/enum/Row'
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw' import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
import { IEditorOption, IEditorResult } from '../../interface/Editor' import { IEditorOption, IEditorResult } from '../../interface/Editor'
import { IElement, IElementStyle } from '../../interface/Element' import { IElement, IElementStyle } from '../../interface/Element'
import { IMargin } from '../../interface/Margin'
import { IColgroup } from '../../interface/table/Colgroup' import { IColgroup } from '../../interface/table/Colgroup'
import { ITd } from '../../interface/table/Td' import { ITd } from '../../interface/table/Td'
import { ITr } from '../../interface/table/Tr' import { ITr } from '../../interface/table/Tr'
@ -1407,6 +1408,14 @@ export class CommandAdapt {
this.draw.setPaperSize(width, height) this.draw.setPaperSize(width, height)
} }
public getPaperMargin(): number[] {
return this.draw.getOriginalMargins()
}
public setPaperMargin(payload: IMargin) {
return this.draw.setPaperMargin(payload)
}
public insertElementList(payload: IElement[]) { public insertElementList(payload: IElement[]) {
if (!payload.length) return if (!payload.length) return
const isReadonly = this.draw.isReadonly() const isReadonly = this.draw.isReadonly()

@ -45,6 +45,7 @@ import { formatElementList } from '../../utils/element'
import { WorkerManager } from '../worker/WorkerManager' import { WorkerManager } from '../worker/WorkerManager'
import { Previewer } from './particle/previewer/Previewer' import { Previewer } from './particle/previewer/Previewer'
import { DateParticle } from './particle/date/DateParticle' import { DateParticle } from './particle/date/DateParticle'
import { IMargin } from '../../interface/Margin'
export class Draw { export class Draw {
@ -202,8 +203,12 @@ export class Draw {
return width - margins[1] - margins[3] return width - margins[1] - margins[3]
} }
public getMargins(): number[] { public getMargins(): IMargin {
return this.options.margins.map(m => m * this.options.scale) return <IMargin>this.options.margins.map(m => m * this.options.scale)
}
public getOriginalMargins(): number[] {
return this.options.margins
} }
public getPageGap(): number { public getPageGap(): number {
@ -489,6 +494,14 @@ export class Draw {
}) })
} }
public setPaperMargin(payload: IMargin) {
this.options.margins = payload
this.render({
isSubmitHistory: false,
isSetCursor: false
})
}
public getValue(): IEditorResult { public getValue(): IEditorResult {
// 配置 // 配置
const { width, height, margins, watermark } = this.options const { width, height, margins, watermark } = this.options

@ -3,6 +3,7 @@ import { EditorMode, PageMode } from '../dataset/enum/Editor'
import { ICheckboxOption } from './Checkbox' import { ICheckboxOption } from './Checkbox'
import { IControlOption } from './Control' import { IControlOption } from './Control'
import { IHeader } from './Header' import { IHeader } from './Header'
import { IMargin } from './Margin'
import { IWatermark } from './Watermark' import { IWatermark } from './Watermark'
export interface IEditorOption { export interface IEditorOption {
@ -32,7 +33,7 @@ export interface IEditorOption {
resizerSize?: number; resizerSize?: number;
marginIndicatorSize?: number; marginIndicatorSize?: number;
marginIndicatorColor?: string, marginIndicatorColor?: string,
margins?: [top: number, right: number, bottom: number, left: number], margins?: IMargin,
pageMode?: PageMode; pageMode?: PageMode;
tdPadding?: number; tdPadding?: number;
defaultTdHeight?: number; defaultTdHeight?: number;
@ -48,7 +49,7 @@ export interface IEditorResult {
version: string; version: string;
width: number; width: number;
height: number; height: number;
margins: [top: number, right: number, bottom: number, left: number]; margins: IMargin;
watermark?: IWatermark; watermark?: IWatermark;
data: IElement[]; data: IElement[];
} }

@ -0,0 +1 @@
export type IMargin = [top: number, right: number, bottom: number, left: number]

@ -694,6 +694,56 @@ window.onload = function () {
li.classList.add('active') li.classList.add('active')
} }
// 页面边距
const paperMarginDom = document.querySelector<HTMLDivElement>('.paper-margin')!
paperMarginDom.onclick = function () {
const [topMargin, rightMargin, bottomMargin, leftMargin] = instance.command.getPaperMargin()
new Dialog({
title: '页边距',
data: [{
type: 'text',
label: '上边距',
name: 'top',
value: `${topMargin}`,
placeholder: '请输入上边距'
}, {
type: 'text',
label: '下边距',
name: 'bottom',
value: `${bottomMargin}`,
placeholder: '请输入下边距'
}, {
type: 'text',
label: '左边距',
name: 'left',
value: `${leftMargin}`,
placeholder: '请输入左边距'
}, {
type: 'text',
label: '右边距',
name: 'right',
value: `${rightMargin}`,
placeholder: '请输入右边距'
}],
onConfirm: (payload) => {
const top = payload.find(p => p.name === 'top')?.value
if (!top) return
const bottom = payload.find(p => p.name === 'bottom')?.value
if (!bottom) return
const left = payload.find(p => p.name === 'left')?.value
if (!left) return
const right = payload.find(p => p.name === 'right')?.value
if (!right) return
instance.command.executeSetPaperMargin([
Number(top),
Number(right),
Number(bottom),
Number(left)
])
}
})
}
// 全屏 // 全屏
const fullscreenDom = document.querySelector<HTMLDivElement>('.fullscreen')! const fullscreenDom = document.querySelector<HTMLDivElement>('.fullscreen')!
fullscreenDom.onclick = toggleFullscreen fullscreenDom.onclick = toggleFullscreen

@ -636,7 +636,6 @@ ul {
} }
.footer>div:last-child { .footer>div:last-child {
width: 120px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -674,14 +673,18 @@ ul {
user-select: none; user-select: none;
} }
.footer .fullscreen { .footer .fullscreen i {
background-image: url('./assets/images/request-fullscreen.svg'); background-image: url('./assets/images/request-fullscreen.svg');
} }
.footer .fullscreen.exist { .footer .fullscreen.exist i {
background-image: url('./assets/images/exit-fullscreen.svg'); background-image: url('./assets/images/exit-fullscreen.svg');
} }
.footer .paper-margin i {
background-image: url('./assets/images/paper-margin.svg');
}
.footer .editor-mode { .footer .editor-mode {
cursor: pointer; cursor: pointer;
user-select: none; user-select: none;
@ -689,7 +692,6 @@ ul {
.footer .paper-size { .footer .paper-size {
position: relative; position: relative;
margin-right: 3px;
} }
.footer .paper-size i { .footer .paper-size i {

Loading…
Cancel
Save