Skip to content

Commit b30f9a8

Browse files
committed
feat(pdf): preview
1 parent 85724d8 commit b30f9a8

File tree

15 files changed

+189
-19
lines changed

15 files changed

+189
-19
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<AsideText
3+
class="wb-aside-button"
4+
:text="t('editor.aside.pdf.preview')"
5+
:shortcuts="store.state.shortcuts.previewPDF[0]"
6+
@click.prevent="onPreviewPDF"
7+
>
8+
</AsideText>
9+
</template>
10+
11+
<script setup lang="ts">
12+
import { useI18n } from 'vue-i18n'
13+
import { useStore } from 'vuex'
14+
15+
const store = useStore()
16+
const { t } = useI18n()
17+
18+
const onPreviewPDF = async () => {
19+
store.commit('absolute/switchPdfPreview', true)
20+
}
21+
</script>

src/components/editor/aside/project/AsideBarProject.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<AsideSaveProject v-if="name !== useEnv().projectEmpty()" />
2525
<AsideLine v-if="name !== useEnv().projectEmpty()" />
2626
<AsideConfigurationPDF v-if="name !== useEnv().projectEmpty()" />
27+
<AsidePreviewPDF v-if="name !== useEnv().projectEmpty()" />
2728
<AsideGeneratePDF v-if="name !== useEnv().projectEmpty()" />
2829
<AsideLine v-if="name !== useEnv().projectEmpty()" />
2930
<AsideAddonLogger v-if="name !== useEnv().projectEmpty()" />
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<template>
2+
<HeroIcon class="wb-text" @click.prevent="onClick">
3+
<svg
4+
xmlns="http://www.w3.org/2000/svg"
5+
class="h-6 w-6"
6+
viewBox="0 0 20 20"
7+
fill="currentColor"
8+
>
9+
<path
10+
fill-rule="evenodd"
11+
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
12+
clip-rule="evenodd"
13+
/>
14+
</svg>
15+
</HeroIcon>
16+
<div ref="preview" class="w-1/2 h-1/2 p-2"></div>
17+
</template>
18+
19+
<script setup lang="ts">
20+
import { usePDF } from '@/use/pdf'
21+
import { ref, onMounted } from 'vue'
22+
import { useStore } from 'vuex'
23+
24+
const preview = ref<HTMLElement | null>(null)
25+
const store = useStore()
26+
27+
onMounted(() => {
28+
usePDF().external(store).onPreviewPDF(preview.value)
29+
})
30+
31+
const onClick = () => {
32+
store.commit('absolute/switchPdfPreview', false)
33+
}
34+
</script>
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
<template>
2-
<EditorCommands v-if="store.state.absolute.commands" />
3-
<EditorShortcutsSwitcher v-if="store.state.absolute.shortcuts.switcher" />
4-
<ProviderLoad v-if="store.state.absolute.load" />
5-
<ProviderLogger v-if="store.state.absolute.logger" />
6-
<ProviderPDF v-if="store.state.absolute.pdf.configuration" />
2+
<EditorCommands v-if="absolute.commands" />
3+
<EditorShortcutsSwitcher v-if="absolute.shortcuts.switcher" />
4+
<ProviderLoad v-if="absolute.load" />
5+
<ProviderLogger v-if="absolute.logger" />
6+
<ProviderPDFConfiguration v-if="absolute.pdf.configuration" />
7+
<ProviderPDFPreview v-if="absolute.pdf.preview" />
78
</template>
89

910
<script setup lang="ts">
11+
import { computed } from 'vue'
1012
import { useStore } from 'vuex'
1113
1214
const store = useStore()
15+
16+
const absolute = computed(() => store.state.absolute)
1317
</script>

src/components/provider/ProviderPDF.vue renamed to src/components/provider/pdf/ProviderPDFConfiguration.vue

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div
3-
id="logger-absolute"
3+
id="pdf-absolute"
44
class="
55
absolute
66
top-1/2
@@ -21,12 +21,3 @@
2121
<PDFConfiguration />
2222
</div>
2323
</template>
24-
25-
<script setup lang="ts">
26-
import { useStore } from 'vuex'
27-
import { computed } from 'vue'
28-
29-
const store = useStore()
30-
31-
const logger = computed(() => store.state.logger.content)
32-
</script>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<div
3+
id="pdf-absolute"
4+
class="
5+
absolute
6+
top-1/2
7+
left-1/2
8+
transform
9+
-translate-x-1/2 -translate-y-1/2
10+
overflow-y-auto
11+
duration-700
12+
bg-white
13+
dark:bg-gray-800
14+
transition
15+
flex flex-col
16+
z-preview
17+
"
18+
>
19+
<PDFPreview />
20+
</div>
21+
</template>

src/lang/br/editor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export default {
9898
},
9999
pdf: {
100100
title: 'Gerar PDF',
101+
preview: 'Simular PDF',
101102
configuration: 'Configurar PDF',
102103
},
103104
commands: {

src/lang/en/editor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export default {
9898
},
9999
pdf: {
100100
title: 'Generate PDF',
101+
preview: 'Preview PDF',
101102
configuration: 'Configure PDF',
102103
},
103104
commands: {

src/store/module/absolute.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export default {
1616
logger: false,
1717
pdf: {
1818
configuration: false,
19+
preview: false,
1920
},
2021
} as AbsoluteState),
2122
mutations: {
@@ -40,6 +41,9 @@ export default {
4041
switchPdfConfiguration(state: any, b: boolean) {
4142
state.pdf.configuration = b
4243
},
44+
switchPdfPreview(state: any, b: boolean) {
45+
state.pdf.preview = b
46+
},
4347
},
4448
actions: {},
4549
getters: {},

src/store/module/shortcuts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default {
1313
generatePDF: useDefines().shortcuts('generatePDF'),
1414
switcherRawText: useDefines().shortcuts('switcherRawText'),
1515
logger: useDefines().shortcuts('logger'),
16+
previewPDF: useDefines().shortcuts('previewPDF'),
1617
configurationPDF: useDefines().shortcuts('configurationPDF'),
1718
} as ShortcutsState),
1819
mutations: {},

src/types/shortcuts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export interface ShortcutsState {
44
newProject: Array<string>
55
newChapter: Array<string>
66
deleteChapter: Array<string>
7+
previewPDF: Array<string>
78
generatePDF: Array<string>
89
logger: Array<string>
910
}

src/use/defines.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export const useDefines: Callback<any> = () => {
99
newChapter: ['CTRL + Q', 'ctrl > q'],
1010
deleteChapter: ['CTRL + D', 'ctrl > d'],
1111
configurationPDF: ['CTRL + Shift + G', 'ctrl > shift > g'],
12-
generatePDF: ['CTRL + G', 'ctrl > g'],
12+
previewPDF: ['CTRL + G', 'ctrl > g'],
13+
generatePDF: ['CTRL + Shift + G', 'ctrl > shift > g'],
1314
switcherRawText: ['CTRL + H', 'ctrl > h'],
1415
logger: ['CTRL + L', 'ctrl > l'],
1516
}[k]

src/use/keyboard.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const useKeyboard: Callback<any> = () => {
1818
generatePDF()
1919
switcherRawText()
2020
logger()
21+
previewPDF()
2122
configurationPDF()
2223
}
2324

@@ -96,6 +97,17 @@ export const useKeyboard: Callback<any> = () => {
9697
})
9798
}
9899

100+
const previewPDF = () => {
101+
keyboard.bind(store.state.shortcuts.previewPDF[1], (e: Event) => {
102+
useUtils().prevent(e)
103+
104+
store.commit(
105+
'absolute/switchPdfPreview',
106+
!store.state.absolute.pdf.preview
107+
)
108+
})
109+
}
110+
99111
const configurationPDF = () => {
100112
keyboard.bind(store.state.shortcuts.configurationPDF[1], (e: Event) => {
101113
useUtils().prevent(e)

src/use/pdf.ts

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,22 +322,98 @@ export const usePDF: Callback<any> = () => {
322322
})
323323
}
324324

325+
const preview: Callback<any> = (
326+
store: Store<any>,
327+
input: HTMLElement
328+
): void => {
329+
const generator = pdfMake.createPdf({
330+
pageSize: generate().base(store).pageSize,
331+
pageOrientation: generate().base(store).pageOrientation,
332+
pageMargins: {
333+
left: generate().base(store).pageMargins[0],
334+
top: generate().base(store).pageMargins[1],
335+
right: generate().base(store).pageMargins[2],
336+
bottom: generate().base(store).pageMargins[3],
337+
},
338+
info: {
339+
title: store.state.project.name,
340+
author: 'TODO',
341+
subject: store.state.project.version,
342+
keywords: '',
343+
},
344+
content: generate().content(store),
345+
styles: {
346+
'heading-three': generate().styles(store).headingThree(),
347+
'heading-two': generate().styles(store).headingTwo(),
348+
'heading-one': generate().styles(store).headingOne(),
349+
paragraph: generate().styles(store).paragraph(),
350+
},
351+
pageBreakBefore: function (
352+
currentNode: any,
353+
followingNodesOnPage: any,
354+
nodesOnNextPage: any,
355+
previousNodesOnPage: any
356+
) {
357+
//check if signature part is completely on the last page, add pagebreak if not
358+
if (
359+
currentNode.id === 'signature' &&
360+
(currentNode.pageNumbers.length != 1 ||
361+
currentNode.pageNumbers[0] != currentNode.pages)
362+
) {
363+
return true
364+
}
365+
//check if last paragraph is entirely on a single page, add pagebreak if not
366+
else if (
367+
currentNode.id === 'closingParagraph' &&
368+
currentNode.pageNumbers.length != 1
369+
) {
370+
return true
371+
}
372+
return false
373+
},
374+
})
375+
376+
generator.getDataUrl((dataUrl: any) => {
377+
const iframe = document.createElement('iframe')
378+
iframe.src = dataUrl
379+
iframe.style.width = '400px'
380+
iframe.style.height = '500px'
381+
382+
let child = input.lastElementChild
383+
while (child) {
384+
input.removeChild(child)
385+
child = input.lastElementChild
386+
}
387+
388+
input.appendChild(iframe)
389+
390+
store.commit('absolute/load', false)
391+
})
392+
}
393+
325394
const external = (store: Store<any>) => {
326395
const onGeneratePDF = async () => {
327396
if (useEnv().isEmptyProject(store.state.project.name)) return
328397

329398
store.commit('absolute/load', true)
330399

331-
await nextTick
332400
usePDF()
333401
.create(store)
334402
.then(() => {
335403
store.commit('absolute/load', false)
336404
})
337405
}
338406

339-
return { onGeneratePDF }
407+
const onPreviewPDF = async (input: HTMLElement) => {
408+
if (useEnv().isEmptyProject(store.state.project.name)) return
409+
410+
store.commit('absolute/load', true)
411+
412+
usePDF().preview(store, input)
413+
}
414+
415+
return { onGeneratePDF, onPreviewPDF }
340416
}
341417

342-
return { init, create, external }
418+
return { init, create, external, preview }
343419
}

tailwind.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ module.exports = {
6262
}),
6363
zIndex: theme => ({
6464
"max": "9999",
65+
"preview": "200",
6566
"aside": "100",
6667
"aside-open": "100"
6768
})

0 commit comments

Comments
 (0)