Skip to content

Commit 101e4ba

Browse files
authored
Merge pull request #11 from oslabs-beta/emma/add-features
feat: Misc features
2 parents 3e85a92 + 22357dc commit 101e4ba

File tree

9 files changed

+259
-26445
lines changed

9 files changed

+259
-26445
lines changed

package-lock.json

Lines changed: 157 additions & 26385 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Canvas.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
>
4141

4242
<div class="component-title">
43-
<p>{{ componentData.componentName }}</p>
43+
<p>{{ componentData.componentName }}<span v-if="isElementPlus(componentData.htmlList)"> (Element+)</span></p>
4444
</div>
4545
<q-icon v-if="componentData.componentName === this.activeComponent"
4646
size="25px"
@@ -72,7 +72,7 @@
7272
{'background-color': componentData.color}]"
7373
>
7474
<p class="innerHtmlText" style="font-size: 3em">{{element.note !== '' ? element.note : element.text}}</p>
75-
</div>sss
75+
</div>
7676
<div v-if="element.text === 'footer'" class="htmlFooter"></div>
7777
<div v-if="element.text === 'form'"
7878
class="htmlGeneral"
@@ -536,6 +536,10 @@ export default {
536536
// this.initialPosition.x = this.activeComponentData.x;
537537
// this.initialPosition.y = this.activeComponentData.y;
538538
// },
539+
isElementPlus(htmlList) {
540+
console.log(htmlList);
541+
return htmlList.find(({ text }) => text[0] === 'e');
542+
},
539543
//color change function
540544
updateColors(data) {
541545
let payload = {
@@ -643,6 +647,7 @@ export default {
643647
644648
// renders modal with Update Children and Layer in it
645649
handleAddNotes() {
650+
console.log(this.activeComponentData);
646651
if (this.wasDragged === false && this.activeComponent !== '') {
647652
this.openNoteModal();
648653
}

src/components/composables/useCreateComponent.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import * as ElementPlus from '../../../node_modules/element-plus/es/components' // importing all components from Element Plus with install wrappers
1+
// import * as ElementPlus from '../../../node_modules/element-plus/es/components' // importing all components from Element Plus with install wrappers
22

33
export function useCreateComponent(importObj) {
4-
54
const createComponent = (importObj) => {
65
let imported = false; //alter this logic once ready to import components
76
if (importObj.hasOwnProperty('componentName')) {
@@ -29,10 +28,12 @@ export function useCreateComponent(importObj) {
2928
return false;
3029
}
3130
// boilerplate properties for each component upon creation
31+
console.log(importObj.parent);
32+
console.log({ y: importObj?.parent?.y })
3233
const component = {
33-
x: 0,
34-
y: 0,
35-
z: 0,
34+
x: importObj?.parent?.x ?? 0,
35+
y: importObj?.parent?.y ?? 0,
36+
z: importObj?.parent?.z ?? 0,
3637
htmlList: this.selectedElementList,
3738
noteList: [],
3839
children: [],
@@ -68,7 +69,7 @@ export function useCreateComponent(importObj) {
6869
createComponent(importObj)
6970

7071
// console logging all components from Element Plus to determine shape of data and investigate structure of components
71-
console.log(ElementPlus)
72+
// console.log(ElementPlus)
7273
// components all within giant object
7374
}
7475

src/components/composables/useExportComponent.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ export function useExportComponent() {
99
*
1010
*/
1111

12-
const showExportComponentDialog = () => {
13-
ipcRenderer
14-
.invoke("exportComponent", {
12+
const exportComponent = () => {
13+
ipcRenderer.invoke("exportComponent", {
1514
title: "Choose location to save folder in",
1615
message: "Choose location to save folder in",
1716
nameFieldLabel: "Component Name",
@@ -356,5 +355,5 @@ z-index: ${html.z};
356355
this.componentMap[this.activeComponent].children
357356
);
358357
}
359-
showExportComponentDialog();
358+
exportComponent();
360359
}

src/components/left-sidebar/ComponentTab/CreateMenu.vue

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,34 @@ Description:
88
<template>
99
<div class="create-component-div drawer-menu">
1010

11-
<q-expansion-item group="accordion" label="Create Component" >
12-
<ImportLibraryButton></ImportLibraryButton>
11+
<form class="create-component-form" v-on:submit.prevent="createComponent">
12+
<!-- will render if creating new component -->
13+
<q-input
14+
v-if="activeComponent === ''"
15+
v-on:keyup.delete.stop
16+
v-model="componentNameInputValue"
17+
label="Set component name *"
18+
color="white"
19+
dark
20+
dense
21+
outlined
22+
item-aligned
23+
padding="5px"
24+
class="input-add"
25+
no-error-icon
26+
reactive-rules
27+
:rules="[ val => val.length != 0 || 'Please set a component name', val => !Object.keys(this.componentMap).includes(val) || 'A component/route with this name already exists' ]"
28+
></q-input>
29+
</form>
30+
31+
<ParentMultiselect
32+
@addparent="parent = $event"
33+
v-if="activeComponent === ''"></ParentMultiselect>
34+
35+
<!-- <q-expansion-item group="accordion" label="Create Component" > -->
1336
<LibComponents></LibComponents>
1437
<div class="searchinput">
15-
<q-input v-if ="this.$store.state.displaylibComponent" outlined v-model="input" placeholder="Please input" label="Search Component"
38+
<q-input v-if ="this.$store.state.displaylibComponent" outlined v-model="input" placeholder="Please input" label="Search Element+ Components"
1639

1740
color="white"
1841
dark
@@ -35,33 +58,8 @@ Description:
3558

3659
</q-tooltip>
3760
</q-item>
38-
39-
40-
4161
</q-list>
4262

43-
<form class="create-component-form" v-on:submit.prevent="createComponent">
44-
<!-- will render if creating new component -->
45-
<q-input
46-
v-if="activeComponent === ''"
47-
v-on:keyup.delete.stop
48-
v-model="componentNameInputValue"
49-
label="Set component name *"
50-
color="white"
51-
dark
52-
dense
53-
outlined
54-
item-aligned
55-
padding="5px"
56-
class="input-add"
57-
no-error-icon
58-
reactive-rules
59-
:rules="[ val => val.length != 0 || 'Please set a component name', val => !Object.keys(this.componentMap).includes(val) || 'A component/route with this name already exists' ]"
60-
></q-input>
61-
</form>
62-
63-
<ParentMultiselect v-if="activeComponent === ''"></ParentMultiselect>
64-
6563
<div class="subsection">Elements/Components</div>
6664
<div class="icon-container">
6765
<Icons
@@ -89,7 +87,7 @@ Description:
8987
:disabled="!componentNameInputValue.trim() || Object.keys(this.componentMap).includes(componentNameInputValue.trim())"
9088
/>
9189

92-
</q-expansion-item>
90+
<!-- </q-expansion-item> -->
9391
</div>
9492
</template>
9593

@@ -108,6 +106,7 @@ export default {
108106
data(){
109107
return {
110108
input:'',
109+
parent: '',
111110
libArray:[
112111
{
113112
name:'alert',
@@ -200,7 +199,7 @@ export default {
200199
"userActions",
201200
"userState",
202201
"userProps",
203-
202+
"routes",
204203
]),
205204
componentNameInputValue: {
206205
get() {
@@ -245,11 +244,13 @@ pickComponent(componentName){
245244
this.addLibComponents(payload);
246245
247246
}
248-
249247
,
250-
251248
createComponent() {
252-
useCreateComponent.bind(this)({}) //invokes composable
249+
// need to find a dynamic solution to pull current route, here set to HomeView
250+
// Parses array of components off routes, then finds parent element name (id), then passes parent into useCreateComponent, where x, y and z are pulled off the parent object
251+
const parent = JSON.parse(
252+
JSON.stringify(this.routes.HomeView)).find((ele) => ele.componentName === this.parent);
253+
useCreateComponent.bind(this)({ parent }) //invokes composable
253254
},
254255
},
255256
watch: {
@@ -275,7 +276,6 @@ pickComponent(componentName){
275276
justify-content: flex-start;
276277
align-items: stretch;
277278
padding: -20px;
278-
margin-right: 10px;
279279
}
280280
.subsection {
281281
border-top: 1px solid rgba(245, 245, 245, 0.3);

src/components/left-sidebar/ComponentTab/LibComponents.vue

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
<template>
22

3-
<div class=""
4-
5-
v-if = "this.$store.state.displaylibComponent">
6-
7-
8-
9-
<q-btn-dropdown class="selectLib" color="pink" label="Select Library Component" dropdown-icon="change_history">
3+
<div class="">
4+
<q-btn-dropdown class="selectLib" color="pink" label="Select Element+ Component" dropdown-icon="change_history">
105
<q-list class="dropButton">
116

127
<q-item clickable v-close-popup @click="pickComponent('e-alert')">

src/components/left-sidebar/ComponentTab/ParentMultiselect.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export default {
4444
// 'routes'
4545
]),
4646
options() {
47+
console.log(this.routes);
4748
return this.routes[this.activeRoute].map(
4849
(component) => component.componentName
4950
);
@@ -53,6 +54,7 @@ export default {
5354
...mapActions(["parentSelected", "setActiveComponent"]),
5455
selectParent(value) {
5556
this.parentSelected(value);
57+
this.$emit("addparent", value);
5658
},
5759
// when multiselect is opened activeComponent is deselected to allow for parentSelected action
5860
resetActiveComponent() {

src/components/left-sidebar/ComponentTab/UpdateMenu.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ Description:
110110
</q-expansion-item>
111111

112112
</q-list>
113+
<q-btn
114+
id="create-component-btn"
115+
class="sidebar-btn"
116+
color="secondary"
117+
label="Create Component"
118+
@click="resetActiveComponent"
119+
/>
113120
<q-btn
114121
id="exportButton"
115122
class="sidebar-btn"
@@ -175,6 +182,7 @@ export default {
175182
"componentMap",
176183
"exportAsTypescript",
177184
'attributeModalOpen',
185+
178186
]),
179187
180188
activeRouteDisplay() {
@@ -418,7 +426,7 @@ p {
418426
margin-bottom: 30px;
419427
}
420428
421-
#exportButton {
429+
#exportButton, #create-component-btn {
422430
background-color: $secondary;
423431
color: $menutext;
424432
width: 100%;

src/components/nav-buttons/ExportMenu.vue

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { mapState } from "vuex";
2323
const { fs, ipcRenderer } = window;
2424
2525
import writeNested from "../../mixins/writeNested";
26+
import { result } from "lodash";
2627
2728
2829
export default {
@@ -104,6 +105,32 @@ export default {
104105
* @description: creates component code <template>, <script>, <style>
105106
* invokes writeTemplate, writeScript, writeStyle
106107
*/
108+
109+
writeRenderUnitTestString(componentName, htmlList) {
110+
111+
const imports = `import { mount } from '@vue/test-utils'
112+
import ${componentName} from '../../src/components/${componentName}.vue'
113+
`
114+
115+
const results = [imports];
116+
117+
for (const el of htmlList) {
118+
const test = `
119+
test('renders ${componentName}', () => {
120+
const wrapper = mount(${componentName})
121+
122+
// customize your tests here; for more info please visit: https://github.com/vuejs/test-utils/
123+
})`
124+
results.push(test);
125+
}
126+
127+
return results.reduce((acc, ele) => acc += ele, '');
128+
},
129+
130+
createComponentTestCode(componentLocation, componentName, componentMap) {
131+
fs.writeFileSync(componentLocation, this.writeRenderUnitTestString(componentName, componentMap[componentName].htmlList))
132+
},
133+
107134
createComponentCode(componentLocation, componentName, children, routes) {
108135
if (componentName === "App") {
109136
fs.writeFileSync(
@@ -206,11 +233,11 @@ export default {
206233
let outputStr = ``;
207234
// eslint-disable-next-line no-unused-vars
208235
for (let el of htmlArr) {
209-
if (!el.text) {
210-
outputStr += ` <${el}/>\n`;
211-
} else {
212-
outputStr += ` `;
213-
outputStr += htmlElementMap[el.text][0]
236+
if (!el.text) {
237+
outputStr += ` <${el}/>\n`;
238+
} else {
239+
outputStr += ` `;
240+
outputStr += htmlElementMap[el.text][0];
214241
//if conditional to check class
215242
if (el.class !== "") {
216243
outputStr += " " + "class = " + `"${el.class}"`;
@@ -491,6 +518,7 @@ export default {
491518
</style >`
492519
} else return `\n\n<style scoped>\n${styleString}</style >`;
493520
},
521+
// create Firebase config for OAuth
494522
createFirebaseConfigFile(location) {
495523
if(this.$store.state.exportOauth ==='on'){
496524
let str = `import { initializeApp } from 'firebase/app';`;
@@ -644,7 +672,6 @@ export default {
644672
fs.writeFileSync(path.join(location, "src", "main.js"), str);
645673
}
646674
},
647-
// create babel file
648675
createViteConfig(location) {
649676
let str = `import { fileURLToPath, URL } from 'url';\n\n`;
650677
str += `import { defineConfig } from 'vite';\n`;
@@ -807,6 +834,8 @@ export default {
807834
fs.mkdirSync(path.join(data, "src", "views"));
808835
fs.mkdirSync(path.join(data, "src", "router"));
809836
fs.mkdirSync(path.join(data, "src", "store"));
837+
fs.mkdirSync(path.join(data, "test-templates"));
838+
fs.mkdirSync(path.join(data, "test-templates", "components"));
810839
}
811840
// creating basic boilerplate for vue app
812841
this.createIndexFile(data);
@@ -849,6 +878,9 @@ export default {
849878
componentName,
850879
this.componentMap
851880
);
881+
this.createComponentTestCode(path.join(data, "test-templates", "components", componentName + '.spec.js'),
882+
componentName,
883+
this.componentMap)
852884
}
853885
// if componentName is App
854886
} else {

0 commit comments

Comments
 (0)