Skip to content

Commit 274de29

Browse files
committed
refactor question types
1 parent 1d8e2b1 commit 274de29

File tree

14 files changed

+292
-221
lines changed

14 files changed

+292
-221
lines changed

src/schema/types/metadata.type.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { questionType } from '@services/form.service';
12
import { Form, Resource } from '@models';
23
import {
34
GraphQLObjectType,
@@ -67,7 +68,12 @@ export const FieldMetaDataType = new GraphQLObjectType({
6768
});
6869
}
6970
if (
70-
['radiogroup', 'dropdown', 'checkbox', 'tagbox'].includes(parent.type)
71+
[
72+
questionType.RADIO_GROUP,
73+
questionType.DROPDOWN,
74+
questionType.CHECKBOX,
75+
questionType.TAGBOX,
76+
].includes(parent.type)
7177
) {
7278
if (parent._field?.choicesByUrl || parent._field?.choicesByGraphQL) {
7379
return getFullChoices(parent._field, context);

src/services/form.service.ts

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,57 @@
11
import * as Survey from 'survey-knockout';
22

3+
/** types for the surveyjs question types */
4+
export enum questionType {
5+
BOOLEAN = 'boolean',
6+
CHECKBOX = 'checkbox',
7+
COMMENT = 'comment',
8+
EDITOR = 'editor',
9+
EXPRESSION = 'expression',
10+
DROPDOWN = 'dropdown',
11+
FILE = 'file',
12+
GEOSPATIAL = 'geospatial',
13+
HTML = 'html',
14+
MATRIX = 'matrix',
15+
MATRIX_DROPDOWN = 'matrixdropdown',
16+
MATRIX_DYNAMIC = 'matrixdynamic',
17+
MULTIPLE_TEXT = 'multipletext',
18+
OWNER = 'owner',
19+
PANEL = 'panel',
20+
PANEL_DYNAMIC = 'paneldynamic',
21+
RADIO_GROUP = 'radiogroup',
22+
RESOURCES = 'resources',
23+
RESOURCE = 'resource',
24+
SELECT = 'select',
25+
TAGBOX = 'tagbox',
26+
TEXT = 'text',
27+
USERS = 'users',
28+
}
29+
30+
/** Input type for text questions */
31+
export enum inputType {
32+
COLOR = 'color',
33+
DATE = 'date',
34+
DATETIME_LOCAL = 'datetime-local',
35+
DATETIME = 'datetime',
36+
DECIMAL = 'decimal',
37+
EMAIL = 'email',
38+
NUMBER = 'number',
39+
NUMERIC = 'numeric',
40+
TIME = 'time',
41+
TEL = 'tel',
42+
TEXT = 'text',
43+
URL = 'url',
44+
}
45+
46+
/** Input type for text questions */
47+
export enum displayStyle {
48+
DATE = 'date',
49+
DECIMAL = 'decimal',
50+
CURRENCY = 'currency',
51+
PERCENT = 'percent',
52+
NUMBER = 'number',
53+
}
54+
355
/**
456
* Form service, for SurveyJS validation.
557
*/
@@ -32,7 +84,7 @@ export class FormService {
3284
title: 'Resource',
3385
questionJSON: {
3486
name: 'resource',
35-
type: 'dropdown',
87+
type: questionType.DROPDOWN,
3688
choicesOrder: 'asc',
3789
choices: [] as any[],
3890
},
@@ -57,7 +109,7 @@ export class FormService {
57109
title: 'Resources',
58110
questionJSON: {
59111
name: 'resources',
60-
type: 'tagbox',
112+
type: questionType.TAGBOX,
61113
choicesOrder: 'asc',
62114
choices: [] as any[],
63115
},
@@ -82,7 +134,7 @@ export class FormService {
82134
title: 'Owner',
83135
questionJSON: {
84136
name: 'owner',
85-
type: 'tagbox',
137+
type: questionType.TAGBOX,
86138
choicesOrder: 'asc',
87139
choices: [] as any[],
88140
},
@@ -107,7 +159,7 @@ export class FormService {
107159
title: 'Users',
108160
questionJSON: {
109161
name: 'users',
110-
type: 'tagbox',
162+
type: questionType.TAGBOX,
111163
choicesOrder: 'asc',
112164
choices: [] as any[],
113165
},
@@ -132,7 +184,7 @@ export class FormService {
132184
title: 'Geospatial',
133185
questionJSON: {
134186
name: 'geospatial',
135-
type: 'text',
187+
type: questionType.TEXT,
136188
},
137189
onInit: () => {},
138190
onCreated: () => {},

src/utils/files/getColumns.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { questionType } from '@services/form.service';
12
import { getChoices } from '../proxy/getChoices';
23

34
/** Default record fields */
@@ -19,8 +20,8 @@ export const getColumns = async (
1920
const columns = [];
2021
for (const field of fields) {
2122
switch (field.type) {
22-
case 'checkbox':
23-
case 'tagbox': {
23+
case questionType.CHECKBOX:
24+
case questionType.TAGBOX: {
2425
if (field.choices && Array.isArray(field.choices) && template) {
2526
for (const item of field.choices) {
2627
const name = `${field.name}.${item.value}`;
@@ -66,7 +67,7 @@ export const getColumns = async (
6667
}
6768
break;
6869
}
69-
case 'multipletext': {
70+
case questionType.MULTIPLE_TEXT: {
7071
for (const item of field.items) {
7172
const name = `${field.name}.${item.name}`;
7273
columns.push({
@@ -79,7 +80,7 @@ export const getColumns = async (
7980
}
8081
break;
8182
}
82-
case 'matrix': {
83+
case questionType.MATRIX: {
8384
for (const row of field.rows) {
8485
const name = `${field.name}.${row.name}`;
8586
columns.push({
@@ -97,7 +98,7 @@ export const getColumns = async (
9798
}
9899
break;
99100
}
100-
case 'matrixdropdown': {
101+
case questionType.MATRIX_DROPDOWN: {
101102
for (const row of field.rows) {
102103
for (const column of field.columns) {
103104
const name = `${field.name}.${row.name}.${column.name}`;
@@ -113,7 +114,7 @@ export const getColumns = async (
113114
}
114115
break;
115116
}
116-
case 'matrixdynamic': {
117+
case questionType.MATRIX_DYNAMIC: {
117118
for (const column of field.columns) {
118119
const name = `${field.name}.0.${column.name}`;
119120
columns.push({
@@ -123,8 +124,8 @@ export const getColumns = async (
123124
}
124125
break;
125126
}
126-
case 'dropdown':
127-
case 'radiogroup': {
127+
case questionType.DROPDOWN:
128+
case questionType.RADIO_GROUP: {
128129
const name = `${field.name}`;
129130
if (field.choices && Array.isArray(field.choices) && template) {
130131
const options = field.choices.map((x) => x.value);

src/utils/files/getRows.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { inputType, questionType } from '@services/form.service';
12
import get from 'lodash/get';
23
import set from 'lodash/set';
34
import { getText } from '../form/getDisplayText';
@@ -19,8 +20,8 @@ export const getRows = async (
1920
const data = record.data;
2021
for (const column of columns) {
2122
switch (column.type) {
22-
case 'checkbox':
23-
case 'tagbox': {
23+
case questionType.CHECKBOX:
24+
case questionType.TAGBOX: {
2425
if (column.value) {
2526
const value = data[column.field]?.includes(column.value) ? 1 : 0;
2627
set(row, column.name, value);
@@ -42,7 +43,7 @@ export const getRows = async (
4243
}
4344
break;
4445
}
45-
case 'dropdown': {
46+
case questionType.DROPDOWN: {
4647
let value: any = get(data, column.field);
4748
const choices = column.meta.field.choices || [];
4849
if (choices.length > 0) {
@@ -55,14 +56,14 @@ export const getRows = async (
5556
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
5657
break;
5758
}
58-
case 'multipletext':
59-
case 'matrix':
60-
case 'matrixdropdown': {
59+
case questionType.MULTIPLE_TEXT:
60+
case questionType.MATRIX:
61+
case questionType.MATRIX_DROPDOWN: {
6162
const value = get(data, column.name);
6263
set(row, column.name, value);
6364
break;
6465
}
65-
case 'resources': {
66+
case questionType.RESOURCES: {
6667
const value = get(data, column.field) || [];
6768
if (value.length > 0) {
6869
set(
@@ -75,7 +76,7 @@ export const getRows = async (
7576
}
7677
break;
7778
}
78-
case 'date': {
79+
case inputType.DATE: {
7980
const value = get(data, column.field);
8081
if (value) {
8182
const date = new Date(value);
@@ -85,8 +86,8 @@ export const getRows = async (
8586
}
8687
break;
8788
}
88-
case 'datetime':
89-
case 'datetime-local': {
89+
case inputType.DATETIME:
90+
case inputType.DATETIME_LOCAL: {
9091
const value = column.default
9192
? get(record, column.field)
9293
: get(data, column.field);
@@ -105,7 +106,7 @@ export const getRows = async (
105106
}
106107
break;
107108
}
108-
case 'time': {
109+
case inputType.TIME: {
109110
const value = column.default
110111
? get(record, column.field)
111112
: get(data, column.field);

src/utils/files/getRowsFromMeta.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import get from 'lodash/get';
33
import set from 'lodash/set';
44
import { getText } from '../form/getDisplayText';
55
import { Column } from './getColumnsFromMeta';
6+
import { inputType, questionType } from '@services/form.service';
67

78
/**
89
* Set a row for multiselect type, handle specific behavior with ReferenceData
@@ -51,7 +52,7 @@ export const getRowsFromMeta = (
5152
const row = {};
5253
for (const column of columns) {
5354
switch (column.type) {
54-
case 'owner': {
55+
case questionType.OWNER: {
5556
let value: any = get(record, column.field);
5657
const choices = column.meta.field.choices || [];
5758
if (choices.length > 0) {
@@ -64,7 +65,7 @@ export const getRowsFromMeta = (
6465
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
6566
break;
6667
}
67-
case 'users': {
68+
case questionType.USERS: {
6869
let value: any = get(record, column.field);
6970
const choices = column.meta.field.choices || [];
7071
if (choices.length > 0) {
@@ -77,12 +78,12 @@ export const getRowsFromMeta = (
7778
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
7879
break;
7980
}
80-
case 'checkbox':
81-
case 'tagbox': {
81+
case questionType.CHECKBOX:
82+
case questionType.TAGBOX: {
8283
setMultiselectRow(column, record, row);
8384
break;
8485
}
85-
case 'dropdown': {
86+
case questionType.DROPDOWN: {
8687
let value: any = get(record, column.field);
8788
// Only enter if not reference data
8889
if (!column.meta.field.graphQLFieldName) {
@@ -98,22 +99,22 @@ export const getRowsFromMeta = (
9899
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
99100
break;
100101
}
101-
case 'multipletext': {
102+
case questionType.MULTIPLE_TEXT: {
102103
const value = get(record, column.name);
103104
set(row, column.name, value);
104105
break;
105106
}
106-
case 'matrix': {
107+
case questionType.MATRIX: {
107108
const value = get(record, column.name);
108109
set(row, column.name, value);
109110
break;
110111
}
111-
case 'matrixdropdown': {
112+
case questionType.MATRIX_DROPDOWN: {
112113
const value = get(record, column.name);
113114
set(row, column.name, value);
114115
break;
115116
}
116-
case 'resources': {
117+
case questionType.RESOURCES: {
117118
const value = get(record, column.field) || [];
118119
if ((column.subColumns || []).length > 0) {
119120
if (value && isArray(value)) {
@@ -146,7 +147,7 @@ export const getRowsFromMeta = (
146147
}
147148
break;
148149
}
149-
case 'date': {
150+
case inputType.DATE: {
150151
const value = get(record, column.field);
151152
if (value) {
152153
const date = new Date(value);
@@ -156,8 +157,8 @@ export const getRowsFromMeta = (
156157
}
157158
break;
158159
}
159-
case 'datetime':
160-
case 'datetime-local': {
160+
case inputType.DATETIME:
161+
case inputType.DATETIME_LOCAL: {
161162
const value = get(record, column.field);
162163
if (value) {
163164
const date = new Date(value);
@@ -174,7 +175,7 @@ export const getRowsFromMeta = (
174175
}
175176
break;
176177
}
177-
case 'time': {
178+
case inputType.TIME: {
178179
const value = get(record, column.field);
179180
if (value) {
180181
const date = new Date(value);
@@ -184,14 +185,14 @@ export const getRowsFromMeta = (
184185
}
185186
break;
186187
}
187-
case 'file': {
188+
case questionType.FILE: {
188189
const value = (get(record, `${column.field}`) || []).map(
189190
(x) => x.name
190191
);
191192
set(row, column.name, value.join(','));
192193
break;
193194
}
194-
case 'radiogroup': {
195+
case questionType.RADIO_GROUP: {
195196
if (isEmail) {
196197
const radioValue = get(record, column.field);
197198
const choices = column?.meta?.field?.choices || [];
@@ -200,7 +201,7 @@ export const getRowsFromMeta = (
200201
break;
201202
}
202203
}
203-
case 'geospatial': {
204+
case questionType.GEOSPATIAL: {
204205
if (isEmail) {
205206
const geoValue = get(record, `${column.field}.properties`);
206207
const lat = geoValue?.coordinates.lat;

0 commit comments

Comments
 (0)