Skip to content

Commit 4ebb35b

Browse files
authored
feat: add error and info message box (#121)
* feat: add error/info message box Show error if template has not been chosen when click download Show error if there is no value for required configs when click download Show info after copying code to clipboard. * chore: correct messages and add reference
1 parent f8c5b09 commit 4ebb35b

File tree

5 files changed

+101
-10
lines changed

5 files changed

+101
-10
lines changed

src/components/CodeBlock.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import 'prismjs/components/prism-python'
2222
import 'prismjs/components/prism-markdown'
2323
import 'prismjs/themes/prism-tomorrow.css'
2424
import { computed, ref, toRefs } from 'vue'
25+
import { msg } from '../store.js'
2526
2627
export default {
2728
props: {
@@ -57,6 +58,9 @@ export default {
5758
const copyCode = async () => {
5859
try {
5960
await navigator.clipboard.writeText(code.value)
61+
msg.color = '#0000ff'
62+
msg.showMsg = true
63+
msg.content = 'Code has been copied to Clipboard.'
6064
} catch (e) {
6165
console.error(e)
6266
}

src/components/Message.vue

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<template>
2+
<Transition name="fade">
3+
<div class="msg-wrapper" v-if="msg.showMsg" @click="msg.showMsg = false">
4+
<div class="msg" :style="style">
5+
{{ message }}
6+
</div>
7+
</div>
8+
</Transition>
9+
</template>
10+
11+
<script>
12+
// referenced on
13+
// https://github.com/vuejs/vue-next/blob/master/packages/sfc-playground/src/Message.vue
14+
import { computed, toRefs } from 'vue'
15+
import { msg } from '../store.js'
16+
17+
export default {
18+
props: {
19+
message: {
20+
type: String,
21+
required: true
22+
},
23+
color: {
24+
type: String,
25+
required: true
26+
}
27+
},
28+
setup(props) {
29+
const { message, color } = toRefs(props)
30+
const style = computed(() => {
31+
return {
32+
borderColor: color.value,
33+
color: color.value,
34+
background: color.value + '33'
35+
}
36+
})
37+
38+
return { message, color, style, msg }
39+
}
40+
}
41+
</script>
42+
43+
<style scoped>
44+
.msg-wrapper {
45+
position: fixed;
46+
--msg-offset: 1.5rem;
47+
bottom: var(--msg-offset);
48+
right: var(--msg-offset);
49+
left: 0;
50+
padding-left: var(--msg-offset);
51+
width: inherit;
52+
}
53+
.msg {
54+
border-radius: 8px;
55+
border-width: 2px;
56+
border-style: solid;
57+
margin-right: var(--msg-offset);
58+
padding: 1rem 2rem;
59+
}
60+
.fade-enter-active,
61+
.fade-leave-active {
62+
transition: all 0.25s ease-out;
63+
}
64+
.fade-enter-from,
65+
.fade-leave-to {
66+
opacity: 0;
67+
transform: translate(0, 10px);
68+
}
69+
</style>

src/components/NavBar.vue

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
>
6464
<div class="msg-wrapper">
6565
<div class="msg">
66-
<h2>🎉 Your Training Script Generated! 🎉</h2>
66+
<h2>🎉 Your Training Script Has Been Generated! 🎉</h2>
6767
<p>
6868
Thanks for using Code-Generator! Feel free to reach out to us on
6969
<a
@@ -83,7 +83,7 @@
8383

8484
<script>
8585
import { version } from '../../package.json'
86-
import { store } from '../store'
86+
import { store, msg } from '../store'
8787
import { saveAs } from 'file-saver'
8888
import JSZip from 'jszip'
8989
import IconDiscord from './IconDiscord.vue'
@@ -101,13 +101,21 @@ export default {
101101
102102
const downloadProject = () => {
103103
if (store.code && Object.keys(store.code).length) {
104-
for (const filename in store.code) {
105-
zip.file(filename, store.code[filename])
104+
if (!store.config.output_dir) {
105+
msg.showMsg = true
106+
msg.content = `Output directory is required. Please input in Loggers tab.`
107+
} else {
108+
for (const filename in store.code) {
109+
zip.file(filename, store.code[filename])
110+
}
111+
zip.generateAsync({ type: 'blob' }).then((content) => {
112+
saveAs(content, `ignite-${store.config.template}.zip`)
113+
})
114+
showDownloadMsg.value = true
106115
}
107-
zip.generateAsync({ type: 'blob' }).then((content) => {
108-
saveAs(content, `ignite-${store.config.template}.zip`)
109-
})
110-
showDownloadMsg.value = true
116+
} else {
117+
msg.showMsg = true
118+
msg.content = 'Choose a template to download.'
111119
}
112120
}
113121
return { version, downloadProject, showDownloadMsg, currentCommit }

src/components/PaneLeft.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,20 @@
1515
<component :is="currentTabComponent"></component>
1616
</KeepAlive>
1717
</div>
18+
<Message :message="msg.content" :color="msg.color" />
1819
</template>
1920

2021
<script>
2122
import TabTemplates from './TabTemplates.vue'
2223
import TabTraining from './TabTraining.vue'
2324
import TabHandlers from './TabHandlers.vue'
2425
import TabLoggers from './TabLoggers.vue'
26+
import Message from './Message.vue'
2527
import { computed, ref } from 'vue'
28+
import { msg } from '../store.js'
2629
2730
export default {
28-
components: { TabTemplates, TabTraining, TabLoggers, TabHandlers },
31+
components: { TabTemplates, TabTraining, TabLoggers, TabHandlers, Message },
2932
setup() {
3033
const currentTab = ref('Templates')
3134
const tabs = ref(['Templates', 'Training', 'Handlers', 'Loggers'])
@@ -35,7 +38,7 @@ export default {
3538
return 'tab-' + currentTab.value.toLowerCase()
3639
})
3740
38-
return { currentTab, tabs, currentTabComponent }
41+
return { currentTab, tabs, currentTabComponent, msg }
3942
}
4043
}
4144
</script>

src/store.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ const files = {}
2727
// filename to store user input config during development
2828
export const __DEV_CONFIG_FILE__ = '__DEV_CONFIG__.json'
2929

30+
// to track message box
31+
export const msg = reactive({
32+
showMsg: false,
33+
content: '',
34+
color: '#ff0000'
35+
})
36+
3037
// main reactive object
3138
// store.code - the final rendered code to be included in archive
3239
// store.config - the internal config to track user input

0 commit comments

Comments
 (0)