Skip to content

Commit 264efc1

Browse files
devel-padunglas
authored andcommitted
Bugs and features (#143)
* Add quasar generator. * Fix issues. * Add quasar test. * Fields by type. * Add initial dates as now for create form. * Painting code. * Again. * Fix linting errors. * Show displayed on 2 columns. * Linting issues. * Fix test. * Damn different styling. Fix test code styling.
1 parent 584f946 commit 264efc1

File tree

28 files changed

+474
-240
lines changed

28 files changed

+474
-240
lines changed

src/generators/QuasarGenerator.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import chalk from "chalk";
22
import BaseGenerator from "./BaseGenerator";
33
import handlebars from "handlebars";
44
import hbh_comparison from "handlebars-helpers/lib/comparison";
5+
import hbh_array from "handlebars-helpers/lib/array";
56

67
export default class extends BaseGenerator {
78
constructor(params) {
@@ -15,29 +16,35 @@ export default class extends BaseGenerator {
1516
"store/modules/foo/create/index.js",
1617
"store/modules/foo/create/mutation_types.js",
1718
"store/modules/foo/create/mutations.js",
19+
"store/modules/foo/create/state.js",
1820
"store/modules/foo/delete/actions.js",
1921
"store/modules/foo/delete/getters.js",
2022
"store/modules/foo/delete/index.js",
2123
"store/modules/foo/delete/mutation_types.js",
2224
"store/modules/foo/delete/mutations.js",
25+
"store/modules/foo/delete/state.js",
2326
"store/modules/foo/list/actions.js",
2427
"store/modules/foo/list/getters.js",
2528
"store/modules/foo/list/index.js",
2629
"store/modules/foo/list/mutation_types.js",
2730
"store/modules/foo/list/mutations.js",
31+
"store/modules/foo/list/state.js",
2832
"store/modules/foo/show/actions.js",
2933
"store/modules/foo/show/getters.js",
3034
"store/modules/foo/show/index.js",
3135
"store/modules/foo/show/mutation_types.js",
3236
"store/modules/foo/show/mutations.js",
37+
"store/modules/foo/show/state.js",
3338
"store/modules/foo/update/actions.js",
3439
"store/modules/foo/update/getters.js",
3540
"store/modules/foo/update/index.js",
3641
"store/modules/foo/update/mutation_types.js",
3742
"store/modules/foo/update/mutations.js",
43+
"store/modules/foo/update/state.js",
3844

3945
// components
4046
"components/foo/Create.vue",
47+
"components/foo/Filter.vue",
4148
"components/foo/Form.vue",
4249
"components/foo/List.vue",
4350
"components/foo/Update.vue",
@@ -54,6 +61,9 @@ export default class extends BaseGenerator {
5461
]);
5562

5663
handlebars.registerHelper("compare", hbh_comparison.compare);
64+
handlebars.registerHelper("ifEven", hbh_comparison.ifEven);
65+
handlebars.registerHelper("ifOdd", hbh_comparison.ifOdd);
66+
handlebars.registerHelper("forEach", hbh_array.forEach);
5767
}
5868

5969
help(resource) {
@@ -125,17 +135,34 @@ export const store = new Vuex.Store({
125135
}
126136

127137
generate(api, resource, dir) {
138+
return resource.getParameters().then(params => {
139+
params = params.map(param => ({
140+
...param,
141+
...this.getHtmlInputTypeFromField(param)
142+
}));
143+
this.generateFiles(api, resource, dir, params);
144+
});
145+
}
146+
147+
generateFiles(api, resource, dir, parameters) {
128148
const lc = resource.title.toLowerCase();
129149
const titleUcFirst =
130150
resource.title.charAt(0).toUpperCase() + resource.title.slice(1);
131151

152+
const formFields = this.buildFields(resource.writableFields);
153+
154+
const dateTypes = ["time", "date", "dateTime"];
155+
const containsDate = formFields.some(e => dateTypes.includes(e.type));
156+
132157
const context = {
133158
title: resource.title,
134159
name: resource.name,
135160
lc,
136161
uc: resource.title.toUpperCase(),
137162
fields: resource.readableFields,
138-
formFields: this.buildFields(resource.writableFields),
163+
parameters,
164+
formFields,
165+
containsDate,
139166
hydraPrefix: this.hydraPrefix,
140167
titleUcFirst
141168
};
@@ -171,29 +198,35 @@ export const store = new Vuex.Store({
171198
"store/modules/%s/create/index.js",
172199
"store/modules/%s/create/mutation_types.js",
173200
"store/modules/%s/create/mutations.js",
201+
"store/modules/%s/create/state.js",
174202
"store/modules/%s/delete/actions.js",
175203
"store/modules/%s/delete/getters.js",
176204
"store/modules/%s/delete/index.js",
177205
"store/modules/%s/delete/mutation_types.js",
178206
"store/modules/%s/delete/mutations.js",
207+
"store/modules/%s/delete/state.js",
179208
"store/modules/%s/list/actions.js",
180209
"store/modules/%s/list/getters.js",
181210
"store/modules/%s/list/index.js",
182211
"store/modules/%s/list/mutation_types.js",
183212
"store/modules/%s/list/mutations.js",
213+
"store/modules/%s/list/state.js",
184214
"store/modules/%s/show/actions.js",
185215
"store/modules/%s/show/getters.js",
186216
"store/modules/%s/show/index.js",
187217
"store/modules/%s/show/mutation_types.js",
188218
"store/modules/%s/show/mutations.js",
219+
"store/modules/%s/show/state.js",
189220
"store/modules/%s/update/actions.js",
190221
"store/modules/%s/update/getters.js",
191222
"store/modules/%s/update/index.js",
192223
"store/modules/%s/update/mutation_types.js",
193224
"store/modules/%s/update/mutations.js",
225+
"store/modules/%s/update/state.js",
194226

195227
// components
196228
"components/%s/Create.vue",
229+
"components/%s/Filter.vue",
197230
"components/%s/Form.vue",
198231
"components/%s/List.vue",
199232
"components/%s/Update.vue",
@@ -202,6 +235,12 @@ export const store = new Vuex.Store({
202235
// routes
203236
"router/%s.js"
204237
]) {
238+
if (
239+
pattern === "components/%s/Filter.vue" &&
240+
!context.parameters.length
241+
) {
242+
continue;
243+
}
205244
this.createFileFromPattern(pattern, dir, lc, context);
206245
}
207246

src/generators/QuasarGenerator.test.js

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,50 +25,57 @@ test("Generate a Quasar app", () => {
2525
id: "foo",
2626
title: "Foo",
2727
readableFields: fields,
28-
writableFields: fields
28+
writableFields: fields,
29+
getParameters: function getParameters() {
30+
return Promise.resolve([]);
31+
}
2932
});
3033
const api = new Api("http://example.com", {
3134
entrypoint: "http://example.com:8080",
3235
title: "My API",
3336
resources: [resource]
3437
});
35-
generator.generate(api, resource, tmpobj.name);
38+
generator.generate(api, resource, tmpobj.name).then(() => {
39+
expect(fs.existsSync(tmpobj.name + "/components/foo/Create.vue")).toBe(
40+
true
41+
);
42+
expect(fs.existsSync(tmpobj.name + "/components/foo/Form.vue")).toBe(true);
43+
expect(fs.existsSync(tmpobj.name + "/components/foo/List.vue")).toBe(true);
44+
expect(fs.existsSync(tmpobj.name + "/components/foo/Show.vue")).toBe(true);
45+
expect(fs.existsSync(tmpobj.name + "/components/foo/Update.vue")).toBe(
46+
true
47+
);
3648

37-
expect(fs.existsSync(tmpobj.name + "/components/foo/Create.vue")).toBe(true);
38-
expect(fs.existsSync(tmpobj.name + "/components/foo/Form.vue")).toBe(true);
39-
expect(fs.existsSync(tmpobj.name + "/components/foo/List.vue")).toBe(true);
40-
expect(fs.existsSync(tmpobj.name + "/components/foo/Show.vue")).toBe(true);
41-
expect(fs.existsSync(tmpobj.name + "/components/foo/Update.vue")).toBe(true);
49+
expect(fs.existsSync(tmpobj.name + "/config/entrypoint.js")).toBe(true);
4250

43-
expect(fs.existsSync(tmpobj.name + "/config/entrypoint.js")).toBe(true);
51+
expect(fs.existsSync(tmpobj.name + "/error/SubmissionError.js")).toBe(true);
4452

45-
expect(fs.existsSync(tmpobj.name + "/error/SubmissionError.js")).toBe(true);
53+
expect(fs.existsSync(tmpobj.name + "/router/foo.js")).toBe(true);
4654

47-
expect(fs.existsSync(tmpobj.name + "/router/foo.js")).toBe(true);
55+
expect(fs.existsSync(tmpobj.name + "/store/modules/foo/index.js")).toBe(
56+
true
57+
);
4858

49-
expect(fs.existsSync(tmpobj.name + "/store/modules/foo/index.js")).toBe(true);
50-
51-
["create", "delete", "list", "show", "update"].forEach(action => {
52-
expect(
53-
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/actions.js`)
54-
).toBe(true);
55-
expect(
56-
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/getters.js`)
57-
).toBe(true);
58-
expect(
59-
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/index.js`)
60-
).toBe(true);
61-
expect(
62-
fs.existsSync(
63-
`${tmpobj.name}/store/modules/foo/${action}/mutation_types.js`
64-
)
65-
).toBe(true);
66-
expect(
67-
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/mutations.js`)
68-
).toBe(true);
59+
["create", "delete", "list", "show", "update"].forEach(action => {
60+
expect(
61+
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/actions.js`)
62+
).toBe(true);
63+
expect(
64+
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/getters.js`)
65+
).toBe(true);
66+
expect(
67+
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/index.js`)
68+
).toBe(true);
69+
expect(
70+
fs.existsSync(
71+
`${tmpobj.name}/store/modules/foo/${action}/mutation_types.js`
72+
)
73+
).toBe(true);
74+
expect(
75+
fs.existsSync(`${tmpobj.name}/store/modules/foo/${action}/mutations.js`)
76+
).toBe(true);
77+
});
78+
expect(fs.existsSync(tmpobj.name + "/utils/fetch.js")).toBe(true);
79+
tmpobj.removeCallback();
6980
});
70-
71-
expect(fs.existsSync(tmpobj.name + "/utils/fetch.js")).toBe(true);
72-
73-
tmpobj.removeCallback();
7481
});

templates/quasar/components/foo/Create.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,20 @@
1818
<q-btn :label="$t('Reset')" color="primary" flat class="q-ml-sm" @click="resetForm" />
1919
</div>
2020
</q-toolbar>
21-
2221
<{{{titleUcFirst}}}Form ref="createForm" :values="item" :errors="violations" />
2322
</div>
2423
</template>
2524

2625
<script>
2726
import { createNamespacedHelpers } from 'vuex';
2827
import {{{titleUcFirst}}}Form from './Form';
28+
{{#if containsDate}}
2929
import { date } from 'quasar';
30+
{{/if}}
3031
const { mapGetters, mapActions } = createNamespacedHelpers('{{{lc}}}/create');
3132
3233
export default {
34+
name: '{{{titleUcFirst}}}Create',
3335
components: {
3436
{{{titleUcFirst}}}Form,
3537
},
@@ -92,7 +94,11 @@ export default {
9294
...mapActions(['create']),
9395
9496
onSendForm() {
95-
this.create(this.item);
97+
this.$refs.createForm.$children[0].validate().then(success => {
98+
if (success) {
99+
this.create(this.item);
100+
}
101+
});
96102
},
97103
98104
resetForm() {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<template>
2+
<div>
3+
{{#forEach parameters}}
4+
{{#ifOdd index}}
5+
<div class="row q-col-gutter-x-md">
6+
{{/ifOdd}}
7+
<q-input
8+
v-model="item.{{{variable}}}"
9+
filled
10+
type="{{{type}}}"
11+
:label="$t('{{{variable}}}')"
12+
class="col-12 col-md"
13+
/>
14+
{{#ifEven index}}
15+
</div>
16+
{{/ifEven}}
17+
{{#if isLast}}{{#ifOdd index}}
18+
<div class="col-12 col-md"></div>
19+
</div>
20+
{{/ifOdd}}{{/if}}
21+
{{/forEach}}
22+
</div>
23+
</template>
24+
25+
<script>
26+
export default {
27+
props: {
28+
values: {
29+
type: Object,
30+
required: true
31+
}
32+
},
33+
data() {
34+
return {};
35+
},
36+
computed: {
37+
// eslint-disable-next-line
38+
item() {
39+
return this.initialValues || this.values;
40+
}
41+
}
42+
};
43+
</script>

0 commit comments

Comments
 (0)