APP_NEW/lib/Class/Question/question_decoder.dart
2025-03-11 21:17:14 +08:00

186 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:lamiter/Class/Question/dtq.dart';
import 'package:lamiter/Class/Question/iq.dart';
import 'package:lamiter/Class/Question/question.dart';
import 'package:lamiter/Class/Question/scq.dart';
import 'package:lamiter/Class/Question/sdq.dart';
import 'package:lamiter/Class/Question/tfq.dart';
import 'package:lamiter/Provider/Form/form_provider.dart';
class QuestionDecoder<T extends FormProvider> {
TextInputType _getSDQKeybaordType(int id) {
/*
TextInputType.text = 0
TextInputType.multiline = 1
TextInputType.name = 2
TextInputType.number = 3
TextInputType.emailAddress = 4
*/
switch (id) {
case 0:
return TextInputType.text;
case 1:
return TextInputType.multiline;
case 2:
return TextInputType.name;
case 3:
return TextInputType.number;
case 4:
return TextInputType.emailAddress;
case 5:
return const TextInputType.numberWithOptions(decimal: true);
default:
return TextInputType.text;
}
}
TextCapitalization _getSDQTextCapitalization(int id) {
/*
TextCapitalization.none = 0
TextCapitalization.words = 1
TextCapitalization.sentences = 2
*/
switch (id) {
case 0:
return TextCapitalization.none;
case 1:
return TextCapitalization.words;
case 2:
return TextCapitalization.sentences;
default:
return TextCapitalization.none;
}
}
SDQValidator _getSDQValidator(int id) {
switch (id) {
case 0:
return SDQValidator.none;
case 1:
return SDQValidator.nonNull;
case 2:
return SDQValidator.email;
case 3:
return SDQValidator.phoneNumber;
case 4:
return SDQValidator.positiveNumber;
default:
return SDQValidator.none;
}
}
IQLayoutShape _getIQLayoutShape(int id) {
switch (id) {
case 0:
return IQLayoutShape.circle;
case 1:
return IQLayoutShape.rectangle;
default:
return IQLayoutShape.circle;
}
}
List<Question> decode(List<dynamic> response) {
List<Question> form = [];
for (final questionJson in response) {
final layoutJson = questionJson['layoutAttributes'];
switch (questionJson['layoutType']) {
case 'sdq':
form.add(
SDQ<T>(
id: questionJson['_id'],
required: questionJson['required'] ?? false,
validator: _getSDQValidator(questionJson['validator'] ?? 0),
attributes: SDQLayoutAttributes(
title: layoutJson['title'],
required: questionJson['required'] ?? false,
hintText: layoutJson['hintText'],
keyboardType:
_getSDQKeybaordType(layoutJson['keyboardType'] ?? 0),
textCapitalization: _getSDQTextCapitalization(
layoutJson['textCapitalization'] ?? 0),
maxLines: layoutJson['maxLines'] ?? 1,
obscureText: layoutJson['obscureText'] ?? false,
),
),
);
break;
case 'tfq':
form.add(
TFQ<T>(
id: questionJson['_id'],
required: questionJson['required'] ?? false,
attributes: TFQLayoutAttributes(
title: layoutJson['title'],
required: questionJson['required'] ?? false,
trueIcon: layoutJson['trueIcon'] != null
? IconData(
layoutJson['trueIcon'],
fontFamily: 'MaterialIcons',
)
: null,
falseIcon: layoutJson['falseIcon'] != null
? IconData(
layoutJson['falseIcon'],
fontFamily: 'MaterialIcons',
)
: null,
),
),
);
break;
case 'dtq':
form.add(
DTQ<T>(
id: questionJson['_id'],
required: questionJson['required'] ?? false,
attributes: DTQLayoutAttributes(
title: layoutJson['title'],
required: questionJson['required'] ?? false,
hintText: layoutJson['hintText'],
),
),
);
break;
case 'iq':
form.add(
IQ<T>(
id: questionJson['_id'],
required: questionJson['required'] ?? false,
attributes: IQLayoutAttributes(
title: layoutJson['title'],
required: questionJson['required'] ?? false,
sizeWidthFactor: layoutJson['sizeWidthFactor'],
shape: _getIQLayoutShape(layoutJson['shape'] ?? 0),
),
),
);
break;
case 'scq':
form.add(
SCQ<T>(
id: questionJson['_id'],
required: questionJson['required'] ?? false,
attributes: SCQLayoutAttributes(
title: layoutJson['title'],
required: questionJson['required'] ?? false,
options: (layoutJson['options'] as List<dynamic>?)
?.map((option) => option as String)
.toList() ??
[],
scores: (layoutJson['scores'] as List<dynamic>?)
?.map((score) => score as int)
.toList() ??
[],
),
),
);
break;
default:
break;
}
}
return form;
}
}