Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions admin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ In addition to the extensive customization options for each question, the Admin

***

### Intro
### Infos

![intro_common](https://github.com/What-the-Flutter/survey_sdk/assets/94079414/74f41791-2e8f-4919-89f5-5df952353d9b)
![info_common](https://github.com/What-the-Flutter/survey_sdk/assets/94079414/74f41791-2e8f-4919-89f5-5df952353d9b)

![intro_content](https://github.com/What-the-Flutter/survey_sdk/assets/94079414/12ccf3ec-e59d-4af1-be25-f8e2c4646a22)
![info_content](https://github.com/What-the-Flutter/survey_sdk/assets/94079414/12ccf3ec-e59d-4af1-be25-f8e2c4646a22)


This question contains only basic settings.
Expand Down
File renamed without changes
4 changes: 4 additions & 0 deletions admin/lib/presentation/app/localization/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
"divisions": "Divisions",
"download": "DOWNLOAD",
"email": "Email",
"emptyContent": "",
"emptyDataMessage": "Data has not been loaded",
"emptyQuestionMessage": "Data cannot be exported",
"emptySubtitle":"",
"end": "End",
"enterText": "Enter text",
"export": "EXPORT",
"exportFloatingWindowTitle": "Save generated json-file with all settings to use in your app",
Expand All @@ -31,6 +33,7 @@
"hint": "Hint",
"import": "IMPORT",
"inactive": "Inactive",
"info": "Info",
"input": "Input",
"inputHintText": "Enter answer here",
"inputType": "Input type",
Expand Down Expand Up @@ -63,6 +66,7 @@
"slider": "Slider",
"subtitle": "Subtitle",
"survey": "Survey",
"surveyCompleted": "Survey is completed",
"text": "Text",
"thickness": "Thickness",
"thirdOption":"ThirdOption",
Expand Down
20 changes: 16 additions & 4 deletions admin/lib/presentation/pages/builder/builder_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ class BuilderCubit extends Cubit<BuilderState> {
commonTheme: common.copyWith(input: data as InputQuestionData),
);

case QuestionTypes.intro:
case QuestionTypes.info:
surveyData = surveyData.copyWith(
commonTheme: common.copyWith(intro: data as IntroQuestionData),
commonTheme: common.copyWith(info: data as InfoQuestionData),
);
case QuestionTypes.slider:
surveyData = surveyData.copyWith(
Expand All @@ -74,7 +74,13 @@ class BuilderCubit extends Cubit<BuilderState> {

_updateIndex(questionList);

final surveyData = state.surveyData.copyWith(questions: questionList);
final endPage = state.surveyData.endPage
.copyWith(index: state.surveyData.endPage.index - 1);

final surveyData = state.surveyData.copyWith(
questions: questionList,
endPage: endPage,
);
_sessionStorageRepository.saveSurveyData(surveyData);
emit(state.copyWith(surveyData: surveyData));
if (state.surveyData.questions.isEmpty) {
Expand All @@ -93,7 +99,13 @@ class BuilderCubit extends Cubit<BuilderState> {
final questionList = List<QuestionData>.of(state.surveyData.questions)
..add(data);

final surveyData = state.surveyData.copyWith(questions: questionList);
final endPage = state.surveyData.endPage
.copyWith(index: state.surveyData.endPage.index + 1);

final surveyData = state.surveyData.copyWith(
questions: questionList,
endPage: endPage,
);
_sessionStorageRepository.saveSurveyData(surveyData);
emit(state.copyWith(surveyData: surveyData));
select(state.surveyData.questions.last);
Expand Down
10 changes: 6 additions & 4 deletions admin/lib/presentation/pages/builder/builder_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@ class _BuilderPageState extends State<BuilderPage> {

QuestionData? _editableQuestion(BuilderState state) {
if (state is EditQuestionBuilderState) {
return state.surveyData.questions.firstWhereOrNull(
(q) => q.index == state.selectedIndex,
);
return state.selectedIndex == state.surveyData.endPage.index
? state.surveyData.endPage
: state.surveyData.questions
.firstWhereOrNull((q) => q.index == state.selectedIndex);
} else if (state is PreviewQuestionBuilderState) {
return state.selectedQuestion;
} else {
Expand Down Expand Up @@ -123,7 +124,8 @@ class _BuilderPageState extends State<BuilderPage> {
onDelete: cubit.deleteQuestionData,
onSelect: cubit.select,
onAdd: cubit.addQuestionData,
questions: cubit.state.surveyData.questions,
questions: state.surveyData.questions,
endPage: state.surveyData.endPage,
onUpdate: cubit.updateQuestions,
selectedIndex: _selectedIndex(state),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NewQuestionPage extends StatefulWidget {
}

class _NewQuestionPageState extends State<NewQuestionPage> {
NewQuestionTabs _selectedTab = NewQuestionTabs.intro;
NewQuestionTabs _selectedTab = NewQuestionTabs.info;
String? _selectedOption;

final BuilderCubit _cubit = i.get<BuilderCubit>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:survey_admin/presentation/utils/utils.dart';
import 'package:survey_sdk/survey_sdk.dart';

enum NewQuestionTabs {
intro,
info,
choice,
slider,
customInput,
Expand All @@ -14,8 +14,8 @@ enum NewQuestionTabs {
extension NewQuestionTabsExt on NewQuestionTabs {
String name(BuildContext context) {
switch (this) {
case NewQuestionTabs.intro:
return context.localization.intro;
case NewQuestionTabs.info:
return context.localization.info;
case NewQuestionTabs.choice:
return context.localization.choice;
case NewQuestionTabs.slider:
Expand All @@ -27,8 +27,8 @@ extension NewQuestionTabsExt on NewQuestionTabs {

QuestionData get data {
switch (this) {
case NewQuestionTabs.intro:
return i.get<CommonData>().intro();
case NewQuestionTabs.info:
return i.get<CommonData>().info();
case NewQuestionTabs.choice:
return i.get<CommonData>().choice();
case NewQuestionTabs.slider:
Expand All @@ -40,7 +40,7 @@ extension NewQuestionTabsExt on NewQuestionTabs {

List<NewQuestionOptions> get options {
switch (this) {
case NewQuestionTabs.intro:
case NewQuestionTabs.info:
return [NewQuestionOptions.title];
case NewQuestionTabs.choice:
return [NewQuestionOptions.radioButton, NewQuestionOptions.checkBox];
Expand Down Expand Up @@ -85,7 +85,7 @@ extension NewQuestionOptionsExt on NewQuestionOptions {
String get asset {
switch (this) {
case NewQuestionOptions.title:
return AppAssets.introImage;
return AppAssets.infoImage;
case NewQuestionOptions.radioButton:
return AppAssets.radioButtonImage;
case NewQuestionOptions.slider:
Expand Down
27 changes: 21 additions & 6 deletions admin/lib/presentation/utils/common_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ class CommonData {
static const _secondIndex = 2;
static const _thirdIndex = 3;
static const _fourthIndex = 4;
static const _fivethIndex = 5;
static const _dividers = 10;

CommonTheme get commonTheme {
return CommonTheme(
slider: slider(),
intro: intro(),
info: info(),
input: input(),
choice: choice(),
);
Expand All @@ -25,26 +26,27 @@ class CommonData {
SurveyData get surveyData {
return SurveyData(
questions: [
intro(index: _firstIndex),
info(index: _firstIndex, title: context.localization.intro),
input(index: _secondIndex),
choice(index: _thirdIndex),
slider(index: _fourthIndex),
],
endPage: endPage(index: _fivethIndex),
commonTheme: commonTheme,
);
}

const CommonData(this.context);

IntroQuestionData intro({int index = 0}) {
return IntroQuestionData(
InfoQuestionData info({int index = 0, String? title}) {
return InfoQuestionData(
primaryButtonText: context.localization.next,
title: context.localization.intro,
title: title ?? context.localization.info,
index: index,
subtitle: context.localization.emptySubtitle,
isSkip: false,
content: context.localization.questionContent,
theme: const IntroQuestionTheme.common(),
theme: const InfoQuestionTheme.common(),
secondaryButtonText: context.localization.skip,
);
}
Expand Down Expand Up @@ -101,4 +103,17 @@ class CommonData {
primaryButtonText: context.localization.next,
);
}

InfoQuestionData endPage({int index = 0}) {
return InfoQuestionData(
primaryButtonText: context.localization.next,
title: context.localization.end,
index: index,
subtitle: context.localization.surveyCompleted,
isSkip: false,
content: context.localization.emptyContent,
theme: const InfoQuestionTheme.common(),
secondaryButtonText: context.localization.skip,
);
}
}
4 changes: 2 additions & 2 deletions admin/lib/presentation/utils/constants/app_assets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ abstract class AppAssets {
static const String arrowIcon = '${_iconsFolder}arrow_icon.svg';
static const String sliderIcon = '${_iconsFolder}slider_icon.svg';
static const String inputIcon = '${_iconsFolder}input_icon.svg';
static const String introIcon = '${_iconsFolder}intro_icon.svg';
static const String infoIcon = '${_iconsFolder}info_icon.svg';
static const String paddingVerticalIcon =
'${_iconsFolder}padding_vertical_icon.svg';
static const String paddingHorizontalIcon =
Expand All @@ -18,7 +18,7 @@ abstract class AppAssets {

/// Images.
static const String checkBoxImage = '${_imagesFolder}check_box_image.svg';
static const String introImage = '${_imagesFolder}intro_image.svg';
static const String infoImage = '${_imagesFolder}info_image.svg';
static const String multiLineInputImage =
'${_imagesFolder}multi_line_input_image.svg';
static const String radioButtonImage =
Expand Down
8 changes: 4 additions & 4 deletions admin/lib/presentation/widgets/builder_page/editor_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import 'dart:math';

import 'package:flutter/material.dart';
import 'package:survey_admin/presentation/widgets/customization_panel/choice/choice_customization_panel.dart';
import 'package:survey_admin/presentation/widgets/customization_panel/info/info_customization_panel.dart';
import 'package:survey_admin/presentation/widgets/customization_panel/input/input_customization_panel.dart';
import 'package:survey_admin/presentation/widgets/customization_panel/intro/intro_customization_panel.dart';
import 'package:survey_admin/presentation/widgets/customization_panel/slider/slider_customization_panel.dart';
import 'package:survey_sdk/survey_sdk.dart';

Expand Down Expand Up @@ -52,10 +52,10 @@ class EditorBar extends StatelessWidget {
onChange: onChange,
editable: questionData as InputQuestionData,
);
case QuestionTypes.intro:
return IntroCustomizationPanel(
case QuestionTypes.info:
return InfoCustomizationPanel(
onChange: onChange,
editable: questionData as IntroQuestionData,
editable: questionData as InfoQuestionData,
);
case QuestionTypes.slider:
return SliderCustomizationPanel(
Expand Down
41 changes: 38 additions & 3 deletions admin/lib/presentation/widgets/builder_page/question_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ class QuestionList extends StatefulWidget {
final ValueChanged<List<QuestionData>> onUpdate;
final int? selectedIndex;
final List<QuestionData> questions;
final InfoQuestionData endPage;
final bool isEditMode;

const QuestionList({
required this.onSelect,
required this.onAdd,
required this.questions,
required this.endPage,
required this.onUpdate,
required this.onDelete,
required this.selectedIndex,
Expand All @@ -38,10 +40,14 @@ class _QuestionListState extends State<QuestionList> {
}

void _updateQuestion(int oldIndex, int newIndex) {
final updatedIndex = newIndex >= widget.questions.length
? widget.questions.length - 1
: newIndex;

final itemOld = widget.questions.removeAt(oldIndex);

widget.questions.insert(
newIndex,
updatedIndex,
itemOld,
);

Expand Down Expand Up @@ -105,6 +111,13 @@ class _QuestionListState extends State<QuestionList> {
question: widget.questions[index],
onQuestionTap: widget.onSelect,
),
_EndPage(
key: ValueKey(widget.questions.length),
isSelected:
widget.questions.length == widget.selectedIndex,
endPage: widget.endPage,
onTap: widget.onSelect,
),
],
),
cardBuilder: (_, children) {
Expand Down Expand Up @@ -174,16 +187,16 @@ class _ListHeader extends StatelessWidget {
class _Question extends StatelessWidget {
final int index;
final bool isSelected;
final VoidCallback onDeleteButtonPressed;
final VoidCallback? onDeleteButtonPressed;
final ValueChanged<QuestionData> onQuestionTap;
final QuestionData question;

const _Question({
required this.index,
required this.isSelected,
required this.onDeleteButtonPressed,
required this.question,
required this.onQuestionTap,
this.onDeleteButtonPressed,
super.key,
});

Expand All @@ -209,3 +222,25 @@ class _Question extends StatelessWidget {
);
}
}

class _EndPage extends StatelessWidget {
final bool isSelected;
final ValueChanged<QuestionData> onTap;
final InfoQuestionData endPage;

const _EndPage({
required this.isSelected,
required this.endPage,
required this.onTap,
super.key,
});

@override
Widget build(BuildContext context) {
return QuestionListItem(
isSelected: isSelected,
questionData: endPage,
onTap: onTap,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class QuestionListItem extends StatelessWidget {

Widget _questionImage(QuestionData questionData) {
switch (questionData.type) {
case QuestionTypes.intro:
return const VectorImage(assetName: AppAssets.introIcon);
case QuestionTypes.info:
return const VectorImage(assetName: AppAssets.infoIcon);
case QuestionTypes.input:
return const VectorImage(assetName: AppAssets.inputIcon);
case QuestionTypes.slider:
Expand Down
Loading