From 274de29962035eeb04e569c05fd4a8da51f74c30 Mon Sep 17 00:00:00 2001 From: MwanPygmay Date: Thu, 5 Dec 2024 16:56:54 +0100 Subject: [PATCH] refactor question types --- src/schema/types/metadata.type.ts | 8 +- src/services/form.service.ts | 62 +++++++- src/utils/files/getColumns.ts | 17 +-- src/utils/files/getRows.ts | 23 +-- src/utils/files/getRowsFromMeta.ts | 33 ++--- src/utils/filter/getFormFilter.ts | 23 +-- src/utils/form/extractFields.ts | 21 +-- src/utils/form/getFieldType.ts | 136 +++++++++--------- src/utils/form/metadata.helper.ts | 51 +++---- src/utils/form/transformRecord.ts | 19 +-- src/utils/history/recordHistory.ts | 43 +++--- .../schema/introspection/getFieldType.ts | 55 +++---- .../resolvers/Meta/getMetaFieldResolver.ts | 13 +- src/utils/schema/resolvers/Meta/index.ts | 9 +- 14 files changed, 292 insertions(+), 221 deletions(-) diff --git a/src/schema/types/metadata.type.ts b/src/schema/types/metadata.type.ts index d77d96d65..5519e3ded 100644 --- a/src/schema/types/metadata.type.ts +++ b/src/schema/types/metadata.type.ts @@ -1,3 +1,4 @@ +import { questionType } from '@services/form.service'; import { Form, Resource } from '@models'; import { GraphQLObjectType, @@ -67,7 +68,12 @@ export const FieldMetaDataType = new GraphQLObjectType({ }); } if ( - ['radiogroup', 'dropdown', 'checkbox', 'tagbox'].includes(parent.type) + [ + questionType.RADIO_GROUP, + questionType.DROPDOWN, + questionType.CHECKBOX, + questionType.TAGBOX, + ].includes(parent.type) ) { if (parent._field?.choicesByUrl || parent._field?.choicesByGraphQL) { return getFullChoices(parent._field, context); diff --git a/src/services/form.service.ts b/src/services/form.service.ts index 0066e0adf..e81142972 100644 --- a/src/services/form.service.ts +++ b/src/services/form.service.ts @@ -1,5 +1,57 @@ import * as Survey from 'survey-knockout'; +/** types for the surveyjs question types */ +export enum questionType { + BOOLEAN = 'boolean', + CHECKBOX = 'checkbox', + COMMENT = 'comment', + EDITOR = 'editor', + EXPRESSION = 'expression', + DROPDOWN = 'dropdown', + FILE = 'file', + GEOSPATIAL = 'geospatial', + HTML = 'html', + MATRIX = 'matrix', + MATRIX_DROPDOWN = 'matrixdropdown', + MATRIX_DYNAMIC = 'matrixdynamic', + MULTIPLE_TEXT = 'multipletext', + OWNER = 'owner', + PANEL = 'panel', + PANEL_DYNAMIC = 'paneldynamic', + RADIO_GROUP = 'radiogroup', + RESOURCES = 'resources', + RESOURCE = 'resource', + SELECT = 'select', + TAGBOX = 'tagbox', + TEXT = 'text', + USERS = 'users', +} + +/** Input type for text questions */ +export enum inputType { + COLOR = 'color', + DATE = 'date', + DATETIME_LOCAL = 'datetime-local', + DATETIME = 'datetime', + DECIMAL = 'decimal', + EMAIL = 'email', + NUMBER = 'number', + NUMERIC = 'numeric', + TIME = 'time', + TEL = 'tel', + TEXT = 'text', + URL = 'url', +} + +/** Input type for text questions */ +export enum displayStyle { + DATE = 'date', + DECIMAL = 'decimal', + CURRENCY = 'currency', + PERCENT = 'percent', + NUMBER = 'number', +} + /** * Form service, for SurveyJS validation. */ @@ -32,7 +84,7 @@ export class FormService { title: 'Resource', questionJSON: { name: 'resource', - type: 'dropdown', + type: questionType.DROPDOWN, choicesOrder: 'asc', choices: [] as any[], }, @@ -57,7 +109,7 @@ export class FormService { title: 'Resources', questionJSON: { name: 'resources', - type: 'tagbox', + type: questionType.TAGBOX, choicesOrder: 'asc', choices: [] as any[], }, @@ -82,7 +134,7 @@ export class FormService { title: 'Owner', questionJSON: { name: 'owner', - type: 'tagbox', + type: questionType.TAGBOX, choicesOrder: 'asc', choices: [] as any[], }, @@ -107,7 +159,7 @@ export class FormService { title: 'Users', questionJSON: { name: 'users', - type: 'tagbox', + type: questionType.TAGBOX, choicesOrder: 'asc', choices: [] as any[], }, @@ -132,7 +184,7 @@ export class FormService { title: 'Geospatial', questionJSON: { name: 'geospatial', - type: 'text', + type: questionType.TEXT, }, onInit: () => {}, onCreated: () => {}, diff --git a/src/utils/files/getColumns.ts b/src/utils/files/getColumns.ts index 87851690d..b71baafa1 100644 --- a/src/utils/files/getColumns.ts +++ b/src/utils/files/getColumns.ts @@ -1,3 +1,4 @@ +import { questionType } from '@services/form.service'; import { getChoices } from '../proxy/getChoices'; /** Default record fields */ @@ -19,8 +20,8 @@ export const getColumns = async ( const columns = []; for (const field of fields) { switch (field.type) { - case 'checkbox': - case 'tagbox': { + case questionType.CHECKBOX: + case questionType.TAGBOX: { if (field.choices && Array.isArray(field.choices) && template) { for (const item of field.choices) { const name = `${field.name}.${item.value}`; @@ -66,7 +67,7 @@ export const getColumns = async ( } break; } - case 'multipletext': { + case questionType.MULTIPLE_TEXT: { for (const item of field.items) { const name = `${field.name}.${item.name}`; columns.push({ @@ -79,7 +80,7 @@ export const getColumns = async ( } break; } - case 'matrix': { + case questionType.MATRIX: { for (const row of field.rows) { const name = `${field.name}.${row.name}`; columns.push({ @@ -97,7 +98,7 @@ export const getColumns = async ( } break; } - case 'matrixdropdown': { + case questionType.MATRIX_DROPDOWN: { for (const row of field.rows) { for (const column of field.columns) { const name = `${field.name}.${row.name}.${column.name}`; @@ -113,7 +114,7 @@ export const getColumns = async ( } break; } - case 'matrixdynamic': { + case questionType.MATRIX_DYNAMIC: { for (const column of field.columns) { const name = `${field.name}.0.${column.name}`; columns.push({ @@ -123,8 +124,8 @@ export const getColumns = async ( } break; } - case 'dropdown': - case 'radiogroup': { + case questionType.DROPDOWN: + case questionType.RADIO_GROUP: { const name = `${field.name}`; if (field.choices && Array.isArray(field.choices) && template) { const options = field.choices.map((x) => x.value); diff --git a/src/utils/files/getRows.ts b/src/utils/files/getRows.ts index 50ea5f75e..0ff884204 100644 --- a/src/utils/files/getRows.ts +++ b/src/utils/files/getRows.ts @@ -1,3 +1,4 @@ +import { inputType, questionType } from '@services/form.service'; import get from 'lodash/get'; import set from 'lodash/set'; import { getText } from '../form/getDisplayText'; @@ -19,8 +20,8 @@ export const getRows = async ( const data = record.data; for (const column of columns) { switch (column.type) { - case 'checkbox': - case 'tagbox': { + case questionType.CHECKBOX: + case questionType.TAGBOX: { if (column.value) { const value = data[column.field]?.includes(column.value) ? 1 : 0; set(row, column.name, value); @@ -42,7 +43,7 @@ export const getRows = async ( } break; } - case 'dropdown': { + case questionType.DROPDOWN: { let value: any = get(data, column.field); const choices = column.meta.field.choices || []; if (choices.length > 0) { @@ -55,14 +56,14 @@ export const getRows = async ( set(row, column.name, Array.isArray(value) ? value.join(',') : value); break; } - case 'multipletext': - case 'matrix': - case 'matrixdropdown': { + case questionType.MULTIPLE_TEXT: + case questionType.MATRIX: + case questionType.MATRIX_DROPDOWN: { const value = get(data, column.name); set(row, column.name, value); break; } - case 'resources': { + case questionType.RESOURCES: { const value = get(data, column.field) || []; if (value.length > 0) { set( @@ -75,7 +76,7 @@ export const getRows = async ( } break; } - case 'date': { + case inputType.DATE: { const value = get(data, column.field); if (value) { const date = new Date(value); @@ -85,8 +86,8 @@ export const getRows = async ( } break; } - case 'datetime': - case 'datetime-local': { + case inputType.DATETIME: + case inputType.DATETIME_LOCAL: { const value = column.default ? get(record, column.field) : get(data, column.field); @@ -105,7 +106,7 @@ export const getRows = async ( } break; } - case 'time': { + case inputType.TIME: { const value = column.default ? get(record, column.field) : get(data, column.field); diff --git a/src/utils/files/getRowsFromMeta.ts b/src/utils/files/getRowsFromMeta.ts index f6381991c..81c946e75 100644 --- a/src/utils/files/getRowsFromMeta.ts +++ b/src/utils/files/getRowsFromMeta.ts @@ -3,6 +3,7 @@ import get from 'lodash/get'; import set from 'lodash/set'; import { getText } from '../form/getDisplayText'; import { Column } from './getColumnsFromMeta'; +import { inputType, questionType } from '@services/form.service'; /** * Set a row for multiselect type, handle specific behavior with ReferenceData @@ -51,7 +52,7 @@ export const getRowsFromMeta = ( const row = {}; for (const column of columns) { switch (column.type) { - case 'owner': { + case questionType.OWNER: { let value: any = get(record, column.field); const choices = column.meta.field.choices || []; if (choices.length > 0) { @@ -64,7 +65,7 @@ export const getRowsFromMeta = ( set(row, column.name, Array.isArray(value) ? value.join(',') : value); break; } - case 'users': { + case questionType.USERS: { let value: any = get(record, column.field); const choices = column.meta.field.choices || []; if (choices.length > 0) { @@ -77,12 +78,12 @@ export const getRowsFromMeta = ( set(row, column.name, Array.isArray(value) ? value.join(',') : value); break; } - case 'checkbox': - case 'tagbox': { + case questionType.CHECKBOX: + case questionType.TAGBOX: { setMultiselectRow(column, record, row); break; } - case 'dropdown': { + case questionType.DROPDOWN: { let value: any = get(record, column.field); // Only enter if not reference data if (!column.meta.field.graphQLFieldName) { @@ -98,22 +99,22 @@ export const getRowsFromMeta = ( set(row, column.name, Array.isArray(value) ? value.join(',') : value); break; } - case 'multipletext': { + case questionType.MULTIPLE_TEXT: { const value = get(record, column.name); set(row, column.name, value); break; } - case 'matrix': { + case questionType.MATRIX: { const value = get(record, column.name); set(row, column.name, value); break; } - case 'matrixdropdown': { + case questionType.MATRIX_DROPDOWN: { const value = get(record, column.name); set(row, column.name, value); break; } - case 'resources': { + case questionType.RESOURCES: { const value = get(record, column.field) || []; if ((column.subColumns || []).length > 0) { if (value && isArray(value)) { @@ -146,7 +147,7 @@ export const getRowsFromMeta = ( } break; } - case 'date': { + case inputType.DATE: { const value = get(record, column.field); if (value) { const date = new Date(value); @@ -156,8 +157,8 @@ export const getRowsFromMeta = ( } break; } - case 'datetime': - case 'datetime-local': { + case inputType.DATETIME: + case inputType.DATETIME_LOCAL: { const value = get(record, column.field); if (value) { const date = new Date(value); @@ -174,7 +175,7 @@ export const getRowsFromMeta = ( } break; } - case 'time': { + case inputType.TIME: { const value = get(record, column.field); if (value) { const date = new Date(value); @@ -184,14 +185,14 @@ export const getRowsFromMeta = ( } break; } - case 'file': { + case questionType.FILE: { const value = (get(record, `${column.field}`) || []).map( (x) => x.name ); set(row, column.name, value.join(',')); break; } - case 'radiogroup': { + case questionType.RADIO_GROUP: { if (isEmail) { const radioValue = get(record, column.field); const choices = column?.meta?.field?.choices || []; @@ -200,7 +201,7 @@ export const getRowsFromMeta = ( break; } } - case 'geospatial': { + case questionType.GEOSPATIAL: { if (isEmail) { const geoValue = get(record, `${column.field}.properties`); const lat = geoValue?.coordinates.lat; diff --git a/src/utils/filter/getFormFilter.ts b/src/utils/filter/getFormFilter.ts index 1d53b6712..d929e0cae 100644 --- a/src/utils/filter/getFormFilter.ts +++ b/src/utils/filter/getFormFilter.ts @@ -1,18 +1,19 @@ +import { inputType, questionType } from '@services/form.service'; import { filterOperator } from '../../types'; /** Authorized filter type names */ const AUTHORIZED_FILTER_TYPES = [ - 'text', - 'numeric', - 'color', - 'date', - 'datetime-local', - 'datetime', - 'time', - 'decimal', - 'dropdown', - 'tagbox', - 'boolean', + inputType.TEXT, + inputType.NUMERIC, + inputType.COLOR, + inputType.DATE, + inputType.DATETIME_LOCAL, + inputType.DATETIME, + inputType.TIME, + inputType.DECIMAL, + questionType.DROPDOWN, + questionType.TAGBOX, + questionType.BOOLEAN, ]; /** Default field names */ diff --git a/src/utils/form/extractFields.ts b/src/utils/form/extractFields.ts index ec6e0acdd..b38bda71a 100644 --- a/src/utils/form/extractFields.ts +++ b/src/utils/form/extractFields.ts @@ -1,3 +1,4 @@ +import { questionType } from '@services/form.service'; import { GraphQLError } from 'graphql/error'; import { getFieldType } from './getFieldType'; import i18next from 'i18next'; @@ -61,7 +62,7 @@ export const extractFields = async (object, fields, core): Promise => { } } // ** Multiple texts ** - if (field.type === 'multipletext') { + if (field.type === questionType.MULTIPLE_TEXT) { Object.assign(field, { items: element.items.map((x) => { return { @@ -72,7 +73,7 @@ export const extractFields = async (object, fields, core): Promise => { }); } // ** Dynamic matrix ** - if (field.type === 'matrixdropdown') { + if (field.type === questionType.MATRIX_DROPDOWN) { Object.assign(field, { rows: element.rows.map((x) => { return { @@ -96,7 +97,7 @@ export const extractFields = async (object, fields, core): Promise => { }); } // ** Single choice matrix ** - if (field.type === 'matrix') { + if (field.type === questionType.MATRIX) { Object.assign(field, { rows: element.rows.map((x) => { return { @@ -113,7 +114,7 @@ export const extractFields = async (object, fields, core): Promise => { }); } // ** Dynamic rows matrix ** - if (field.type === 'matrixdynamic') { + if (field.type === questionType.MATRIX_DYNAMIC) { Object.assign(field, { columns: element.columns.map((x) => { return { @@ -132,10 +133,10 @@ export const extractFields = async (object, fields, core): Promise => { } // ** Dropdown / Radio / Checkbox / Tagbox ** if ( - field.type === 'dropdown' || - field.type === 'radiogroup' || - field.type === 'checkbox' || - field.type === 'tagbox' + field.type === questionType.DROPDOWN || + field.type === questionType.RADIO_GROUP || + field.type === questionType.CHECKBOX || + field.type === questionType.TAGBOX ) { if (element.choicesByUrl) { Object.assign(field, { @@ -204,7 +205,7 @@ export const extractFields = async (object, fields, core): Promise => { } } // ** Owner ** - if (field.type === 'owner') { + if (field.type === questionType.OWNER) { Object.assign(field, { applications: element.applications }); } // ** Comments ** @@ -222,7 +223,7 @@ export const extractFields = async (object, fields, core): Promise => { }); } // ** Users ** - if (field.type === 'users') { + if (field.type === questionType.USERS) { Object.assign(field, { applications: element.applications }); } fields.push(field); diff --git a/src/utils/form/getFieldType.ts b/src/utils/form/getFieldType.ts index db5015164..f473162f9 100644 --- a/src/utils/form/getFieldType.ts +++ b/src/utils/form/getFieldType.ts @@ -1,3 +1,5 @@ +import { displayStyle, inputType, questionType } from '@services/form.service'; + /** * Gets the type of the field from the definition of the question. * @@ -13,80 +15,80 @@ export const getFieldType = async (question: { displayStyle?: string; }): Promise => { switch (question.type) { - case 'text': + case questionType.TEXT: switch (question.inputType) { - case 'text': - return 'text'; - case 'number': - return 'numeric'; - case 'color': - return 'color'; - case 'date': - return 'date'; - case 'datetime-local': - return 'datetime-local'; - case 'datetime': - return 'datetime'; - case 'time': - return 'time'; - case 'url': - return 'url'; - case 'tel': - return 'tel'; - case 'email': - return 'email'; + case inputType.TEXT: + return inputType.TEXT; + case inputType.NUMBER: + return inputType.NUMERIC; + case inputType.COLOR: + return inputType.COLOR; + case inputType.DATE: + return inputType.DATE; + case inputType.DATETIME_LOCAL: + return inputType.DATETIME_LOCAL; + case inputType.DATETIME: + return inputType.DATETIME; + case inputType.TIME: + return inputType.TIME; + case inputType.URL: + return inputType.URL; + case inputType.TEL: + return inputType.TEL; + case inputType.EMAIL: + return inputType.EMAIL; default: - return 'text'; + return inputType.TEXT; } - case 'file': - return 'file'; - case 'expression': + case questionType.FILE: + return questionType.FILE; + case questionType.EXPRESSION: switch (question.displayStyle) { - case 'date': - return 'date'; - case 'decimal': - return 'decimal'; - case 'currency': - return 'decimal'; - case 'percent': - return 'decimal'; - case 'number': - return 'numeric'; + case displayStyle.DATE: + return inputType.DATE; + case displayStyle.DECIMAL: + return inputType.DECIMAL; + case displayStyle.CURRENCY: + return inputType.DECIMAL; + case displayStyle.PERCENT: + return inputType.DECIMAL; + case displayStyle.NUMBER: + return inputType.NUMERIC; default: - return 'text'; + return questionType.TEXT; } - case 'checkbox': - return 'checkbox'; - case 'radiogroup': - return 'radiogroup'; - case 'dropdown': - return 'dropdown'; - case 'multipletext': - return 'multipletext'; - case 'matrix': - return 'matrix'; - case 'matrixdropdown': - return 'matrixdropdown'; - case 'matrixdynamic': - return 'matrixdynamic'; - case 'boolean': - return 'boolean'; - case 'resource': - return 'resource'; - case 'resources': - return 'resources'; - case 'tagbox': - return 'tagbox'; - case 'users': - return 'users'; - case 'owner': - return 'owner'; - case 'geospatial': - return 'geospatial'; - case 'editor': { - return 'editor'; + case questionType.CHECKBOX: + return questionType.CHECKBOX; + case questionType.RADIO_GROUP: + return questionType.RADIO_GROUP; + case questionType.DROPDOWN: + return questionType.DROPDOWN; + case questionType.MULTIPLE_TEXT: + return questionType.MULTIPLE_TEXT; + case questionType.MATRIX: + return questionType.MATRIX; + case questionType.MATRIX_DROPDOWN: + return questionType.MATRIX_DROPDOWN; + case questionType.MATRIX_DYNAMIC: + return questionType.MATRIX_DYNAMIC; + case questionType.BOOLEAN: + return questionType.BOOLEAN; + case questionType.RESOURCE: + return questionType.RESOURCE; + case questionType.RESOURCES: + return questionType.RESOURCES; + case questionType.TAGBOX: + return questionType.TAGBOX; + case questionType.USERS: + return questionType.USERS; + case questionType.OWNER: + return questionType.OWNER; + case questionType.GEOSPATIAL: + return questionType.GEOSPATIAL; + case questionType.EDITOR: { + return questionType.EDITOR; } default: - return 'text'; + return questionType.TEXT; } }; diff --git a/src/utils/form/metadata.helper.ts b/src/utils/form/metadata.helper.ts index 63d606a7f..d5f70b1c3 100644 --- a/src/utils/form/metadata.helper.ts +++ b/src/utils/form/metadata.helper.ts @@ -1,3 +1,4 @@ +import { inputType, questionType } from '@services/form.service'; import { Form, Resource, User, Role, ReferenceData } from '@models'; import mongoose from 'mongoose'; import { sortBy } from 'lodash'; @@ -258,84 +259,84 @@ export const getMetaData = async ( .map((form) => form.id), }; switch (field.type) { - case 'radiogroup': - case 'dropdown': { + case questionType.RADIO_GROUP: + case questionType.DROPDOWN: { fieldMeta.editor = 'select'; fieldMeta._field = field; break; } - case 'checkbox': - case 'tagbox': { + case questionType.CHECKBOX: + case questionType.TAGBOX: { fieldMeta.editor = 'select'; fieldMeta.multiSelect = true; fieldMeta._field = field; break; } - case 'time': { + case inputType.TIME: { fieldMeta.editor = 'time'; break; } - case 'date': { + case inputType.DATE: { fieldMeta.editor = 'date'; break; } - case 'datetime': - case 'datetime-local': { + case inputType.DATETIME: + case inputType.DATETIME_LOCAL: { fieldMeta.editor = 'datetime'; break; } - case 'email': - case 'url': - case 'comment': - case 'text': { + case inputType.EMAIL: + case inputType.URL: + case questionType.COMMENT: + case questionType.TEXT: { fieldMeta.editor = 'text'; break; } - case 'boolean': { + case questionType.BOOLEAN: { fieldMeta.editor = 'boolean'; break; } - case 'numeric': { + case inputType.NUMERIC: { fieldMeta.editor = 'numeric'; break; } - case 'multipletext': { + case questionType.MULTIPLE_TEXT: { fieldMeta.editor = 'datetime'; break; } - case 'matrix': - case 'matrixdropdown': - case 'matrixdynamic': - case 'multipletext': { + case questionType.MATRIX: + case questionType.MATRIX_DROPDOWN: + case questionType.MATRIX_DYNAMIC: + case questionType.MULTIPLE_TEXT: { fieldMeta.filterable = false; break; } - case 'resource': - case 'resources': { + case questionType.RESOURCE: + case questionType.RESOURCES: { fieldMeta.filterable = root; fieldMeta._field = field; break; } - case 'file': { + case questionType.FILE: { fieldMeta.filter = { defaultOperator: filterOperator.IS_NOT_NULL, operators: [filterOperator.IS_NULL, filterOperator.IS_NOT_NULL], }; break; } - case 'users': { + case questionType.USERS: { fieldMeta.editor = 'select'; fieldMeta.multiSelect = true; fieldMeta._field = field; break; } - case 'owner': { + case questionType.OWNER: { fieldMeta.editor = 'select'; fieldMeta.multiSelect = true; fieldMeta._field = field; break; } - case 'editor': { + case questionType.EDITOR: { fieldMeta.filter = { operators: [filterOperator.IS_NULL, filterOperator.IS_NOT_NULL], }; diff --git a/src/utils/form/transformRecord.ts b/src/utils/form/transformRecord.ts index 835af2f2e..b8a73eb3e 100644 --- a/src/utils/form/transformRecord.ts +++ b/src/utils/form/transformRecord.ts @@ -1,3 +1,4 @@ +import { inputType, questionType } from '@services/form.service'; import mongoose from 'mongoose'; import { getDateForMongo } from '../filter/getDateForMongo'; import { getTimeForMongo } from '../filter/getTimeForMongo'; @@ -12,14 +13,14 @@ import isNil from 'lodash/isNil'; */ export const formatValue = (field: any, value: any): any => { switch (field.type) { - case 'date': - case 'datetime': - case 'datetime-local': + case inputType.DATE: + case inputType.DATETIME: + case inputType.DATETIME_LOCAL: if (!isNil(value)) { return getDateForMongo(value).startDate; } break; - case 'text': + case inputType.TEXT: if (!isNil(value)) { if (Array.isArray(value)) { return value.toString(); @@ -28,22 +29,22 @@ export const formatValue = (field: any, value: any): any => { } } break; - case 'time': + case inputType.TIME: if (!isNil(value) && !(value instanceof Date)) { return getTimeForMongo(value); } break; - case 'time': + case inputType.TIME: if (!isNil(value) && !(value instanceof Date)) { return getTimeForMongo(value); } break; - case 'file': + case questionType.FILE: if (!isNil(value)) { return value.map((x) => ({ name: x.name, content: x.content })); } break; - case 'resource': + case questionType.RESOURCE: if (!isNil(value)) { //checks if the id is a valid mongo id return new mongoose.Types.ObjectId(value).toString() === value @@ -52,7 +53,7 @@ export const formatValue = (field: any, value: any): any => { } break; - case 'resources': + case questionType.RESOURCES: if (!isNil(value) && Array.isArray(value)) { //returns only valid ids from an array of ids return value.filter( diff --git a/src/utils/history/recordHistory.ts b/src/utils/history/recordHistory.ts index 8b43b19bb..1aa00fa5a 100644 --- a/src/utils/history/recordHistory.ts +++ b/src/utils/history/recordHistory.ts @@ -1,3 +1,4 @@ +import { inputType, questionType } from '@services/form.service'; import { Record, User, Role, ReferenceData } from '@models'; import { Change, @@ -451,7 +452,7 @@ export class RecordHistory { const field = this.fields.find((f) => f.name === change.field); if (!field) continue; switch (field.type) { - case 'boolean': + case questionType.BOOLEAN: if (change.old !== undefined) if (change.old) change.old = field.labelTrue ? field.labelTrue : change.old; @@ -464,19 +465,19 @@ export class RecordHistory { else change.new = field.labelFalse ? field.labelFalse : change.new; break; - case 'radiogroup': - case 'dropdown': - case 'tagbox': - case 'checkbox': + case questionType.RADIO_GROUP: + case questionType.DROPDOWN: + case questionType.TAGBOX: + case questionType.CHECKBOX: await formatSelectable(field, change); break; - case 'file': + case questionType.FILE: if (!isNil(change.old)) change.old = change.old.map((file: any) => file.name); if (!isNil(change.new)) change.new = change.new.map((file: any) => file.name); break; - case 'multipletext': + case questionType.MULTIPLE_TEXT: ['new', 'old'].forEach((state) => { if (change[state] !== undefined) { const keys = Object.keys(change[state]); @@ -490,7 +491,7 @@ export class RecordHistory { } }); break; - case 'matrix': + case questionType.MATRIX: ['new', 'old'].forEach((state) => { if (change[state] !== undefined) { for (const key in change[state]) { @@ -507,7 +508,7 @@ export class RecordHistory { } }); break; - case 'matrixdropdown': + case questionType.MATRIX_DROPDOWN: ['new', 'old'].forEach((state) => { if (change[state] !== undefined) { const keys = Object.keys(change[state]); @@ -518,11 +519,11 @@ export class RecordHistory { cols.forEach((col: string, i: number) => { let newVal = change[state][key][i]; switch (field.columns[i].cellType) { - case 'radiogroup': - case 'dropdown': + case questionType.RADIO_GROUP: + case questionType.DROPDOWN: newVal = getOptionFromChoices(newVal, field.choices); break; - case 'checkbox': + case questionType.CHECKBOX: newVal = newVal.map((item: string) => getOptionFromChoices(item, field.choices) ); @@ -536,7 +537,7 @@ export class RecordHistory { } }); break; - case 'matrixdynamic': + case questionType.MATRIX_DYNAMIC: ['new', 'old'].forEach((state) => { if (change[state] !== undefined) { const formatedState = []; @@ -565,45 +566,45 @@ export class RecordHistory { } }); break; - case 'resource': + case questionType.RESOURCE: if (change.old !== undefined) change.old = await getResourcesIncrementalID([change.old]); if (change.new !== undefined) change.new = await getResourcesIncrementalID([change.new]); break; // no break for the resources - case 'resources': + case questionType.RESOURCES: if (change.old !== undefined) change.old = await getResourcesIncrementalID(change.old); if (change.new !== undefined) change.new = await getResourcesIncrementalID(change.new); break; - case 'users': + case questionType.USERS: if (change.old !== undefined) change.old = await getUsersFromID(change.old); if (change.new !== undefined) change.new = await getUsersFromID(change.new); break; - case 'owner': + case questionType.OWNER: if (change.old !== undefined) change.old = await getOwner(change.old); if (change.new !== undefined) change.new = await getOwner(change.new); break; - case 'date': + case inputType.DATE: if (change.old !== undefined) change.old = new Date(change.old).toLocaleDateString(); if (change.new !== undefined) change.new = new Date(change.new).toLocaleDateString(); break; - case 'datetime': - case 'datetime-local': + case inputType.DATETIME: + case inputType.DATETIME_LOCAL: if (change.old !== undefined) change.old = new Date(change.old).toLocaleString(); if (change.new !== undefined) change.new = new Date(change.new).toLocaleString(); break; - case 'time': + case inputType.TIME: if (change.old !== undefined) change.old = new Date(change.old).toTimeString(); if (change.new !== undefined) diff --git a/src/utils/schema/introspection/getFieldType.ts b/src/utils/schema/introspection/getFieldType.ts index 430f58df1..8988ea4e8 100644 --- a/src/utils/schema/introspection/getFieldType.ts +++ b/src/utils/schema/introspection/getFieldType.ts @@ -1,3 +1,4 @@ +import { inputType, questionType } from '@services/form.service'; import { MULTISELECT_TYPES } from '@const/fieldTypes'; import { GraphQLBoolean, @@ -47,85 +48,85 @@ const getFieldType = ( return GraphQLID; } switch (field.type) { - case 'resource': { + case questionType.RESOURCE: { return GraphQLID; } - case 'resources': { + case questionType.RESOURCES: { return filter ? new GraphQLList(GraphQLID) : [GraphQLID]; } - case 'text': { + case questionType.TEXT: { return GraphQLString; } - case 'url': { + case inputType.URL: { return GraphQLString; } - case 'email': { + case inputType.EMAIL: { return GraphQLString; } - case 'tel': { + case inputType.TEL: { return GraphQLString; } - case 'dropdown': { + case questionType.DROPDOWN: { return GraphQLString; } - case 'radiogroup': { + case questionType.RADIO_GROUP: { return GraphQLString; } - case 'comment': { + case questionType.COMMENT: { return GraphQLString; } - case 'boolean': { + case questionType.BOOLEAN: { return GraphQLBoolean; } - case 'numeric': { + case inputType.NUMERIC: { return GraphQLFloat; } - case 'decimal': { + case inputType.DECIMAL: { return GraphQLFloat; } - case 'date': { + case inputType.DATE: { return GraphQLDate; } - case 'datetime': { + case inputType.DATETIME: { return GraphQLDateTime; } - case 'datetime-local': { + case inputType.DATETIME_LOCAL: { return GraphQLDateTime; } - case 'time': { + case inputType.TIME: { return GraphQLTime; } - case 'multipletext': { + case questionType.MULTIPLE_TEXT: { return GraphQLJSON; } - case 'matrix': { + case questionType.MATRIX: { return GraphQLJSON; } - case 'matrixdropdown': { + case questionType.MATRIX_DROPDOWN: { return GraphQLJSON; } - case 'matrixdynamic': { + case questionType.MATRIX_DYNAMIC: { return GraphQLJSON; } - case 'checkbox': { + case questionType.CHECKBOX: { return GraphQLJSON; } - case 'file': { + case questionType.FILE: { return GraphQLJSON; } - case 'tagbox': { + case questionType.TAGBOX: { return GraphQLJSON; } - case 'users': { + case questionType.USERS: { return GraphQLJSON; } - case 'owner': { + case questionType.OWNER: { return GraphQLJSON; } - case 'geospatial': { + case questionType.GEOSPATIAL: { return GraphQLJSON; } - case 'editor': { + case questionType.EDITOR: { return GraphQLString; } default: { diff --git a/src/utils/schema/resolvers/Meta/getMetaFieldResolver.ts b/src/utils/schema/resolvers/Meta/getMetaFieldResolver.ts index 94e3b19c5..0290fcdef 100644 --- a/src/utils/schema/resolvers/Meta/getMetaFieldResolver.ts +++ b/src/utils/schema/resolvers/Meta/getMetaFieldResolver.ts @@ -4,6 +4,7 @@ import getMetaOwnerResolver from './getMetaOwnerResolver'; import getMetaUsersResolver from './getMetaUsersResolver'; import getMetaRadioResolver from './getMetaRadiogroupResolver'; import getMetaTagboxResolver from './getMetaTagboxResolver'; +import { questionType } from '@services/form.service'; /** * Return GraphQL resolver of the field, based on its type. @@ -13,22 +14,22 @@ import getMetaTagboxResolver from './getMetaTagboxResolver'; */ const getMetaFieldResolver = (field: any) => { switch (field.type) { - case 'dropdown': { + case questionType.DROPDOWN: { return getMetaDropdownResolver(field); } - case 'radiogroup': { + case questionType.RADIO_GROUP: { return getMetaRadioResolver(field); } - case 'checkbox': { + case questionType.CHECKBOX: { return getMetaCheckboxResolver(field); } - case 'tagbox': { + case questionType.TAGBOX: { return getMetaTagboxResolver(field); } - case 'users': { + case questionType.USERS: { return getMetaUsersResolver(field); } - case 'owner': { + case questionType.OWNER: { return getMetaOwnerResolver(field); } default: { diff --git a/src/utils/schema/resolvers/Meta/index.ts b/src/utils/schema/resolvers/Meta/index.ts index e3121258e..83038b177 100644 --- a/src/utils/schema/resolvers/Meta/index.ts +++ b/src/utils/schema/resolvers/Meta/index.ts @@ -16,6 +16,7 @@ import getMetaFieldResolver from './getMetaFieldResolver'; import getMetaReferenceDataResolver from './getMetaReferenceDataResolver'; import { Types } from 'mongoose'; import { ReferenceData } from '@models'; +import { inputType, questionType } from '@services/form.service'; /** * Gets the resolvers for each field of the document for a given resource @@ -85,7 +86,7 @@ export const getMetaResolver = ( }, []); return { name: 'form', - type: 'dropdown', + type: questionType.DROPDOWN, choices, readOnly: true, permissions: { @@ -106,7 +107,7 @@ export const getMetaResolver = ( }, []); return { name: 'lastUpdateForm', - type: 'dropdown', + type: questionType.DROPDOWN, choices, readOnly: true, permissions: { @@ -121,7 +122,7 @@ export const getMetaResolver = ( case 'createdAt': { return { name: fieldName, - type: 'datetime', + type: inputType.DATETIME, readOnly: true, permissions: { canSee: true, @@ -132,7 +133,7 @@ export const getMetaResolver = ( case 'modifiedAt': { return { name: fieldName, - type: 'datetime', + type: inputType.DATETIME, readOnly: true, permissions: { canSee: true,