Code Cleanup & refactoring
parent
2a8805f801
commit
d7c54fc37d
|
@ -1,25 +1,50 @@
|
||||||
stages:
|
|
||||||
- test
|
|
||||||
- analyze
|
|
||||||
|
|
||||||
code_quality:
|
stages:
|
||||||
stage: test
|
- analyze
|
||||||
image: "cirrusci/flutter:1.22.5"
|
- build
|
||||||
|
|
||||||
|
|
||||||
|
analyze:
|
||||||
|
stage: analyze
|
||||||
|
image: cirrusci/flutter:latest
|
||||||
before_script:
|
before_script:
|
||||||
- cd "$CI_PROJECT_DIR/garden_planner"
|
- cd "$CI_PROJECT_DIR/garden_planner"
|
||||||
- pub global activate dart_code_metrics
|
|
||||||
- export PATH="$PATH:$HOME/.pub-cache/bin"
|
|
||||||
script:
|
script:
|
||||||
- cd "$CI_PROJECT_DIR/garden_planner"
|
- flutter analyze --write=analyzer-output.txt
|
||||||
- metrics lib -r codeclimate > gl-code-quality-report.json
|
|
||||||
artifacts:
|
artifacts:
|
||||||
reports:
|
paths:
|
||||||
codequality: garden_planner/gl-code-quality-report.json
|
- analyzer-output.txt
|
||||||
|
|
||||||
analyze:sonar:
|
build:
|
||||||
|
stage: build
|
||||||
|
image: cirrusci/flutter:latest
|
||||||
|
before_script:
|
||||||
|
- cd "$CI_PROJECT_DIR/garden_planner"
|
||||||
|
script:
|
||||||
|
- flutter packages get
|
||||||
|
- flutter build apk
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- garden_planner/build/app/outputs/apk/release/app-release.apk
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: build
|
||||||
|
image: cirrusci/flutter:latest
|
||||||
|
before_script:
|
||||||
|
- cd "$CI_PROJECT_DIR/garden_planner"
|
||||||
|
- flutter packages get
|
||||||
|
script:
|
||||||
|
- flutter test --coverage
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- garden_planner/coverage/lcov.info
|
||||||
|
|
||||||
|
|
||||||
|
sonar:
|
||||||
stage: analyze
|
stage: analyze
|
||||||
image:
|
image:
|
||||||
name: sonarsource/sonar-scanner-cli:4.5
|
name: jdwvierling/sonarflutter:1
|
||||||
entrypoint: [""]
|
entrypoint: [""]
|
||||||
variables:
|
variables:
|
||||||
# Defines the location of the analysis task cache
|
# Defines the location of the analysis task cache
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import '../entities/beet.dart';
|
||||||
import 'package:garden_planner/api/api_entities/beet_entry.dart';
|
import '../entities/beet_entry_return.dart';
|
||||||
import 'package:garden_planner/entities/beet.dart';
|
import '../entities/plant.dart';
|
||||||
import 'package:garden_planner/entities/beet_entry_return.dart';
|
import '../entities/plant_time.dart';
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import 'api_entities/beet_entry.dart';
|
||||||
import 'package:garden_planner/entities/plant_time.dart';
|
|
||||||
|
|
||||||
import 'http_connection.dart';
|
import 'http_connection.dart';
|
||||||
|
|
||||||
class GardenApiService {
|
class GardenApiService {
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
import 'plant.dart';
|
|
||||||
|
|
||||||
class Beet {
|
|
||||||
List<BeetRow> beetrows= [BeetRow()];
|
|
||||||
|
|
||||||
void Add(BeetRow beetrow){
|
|
||||||
beetrows.add(beetrow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class BeetRow {
|
|
||||||
List<Plant> plants= [];
|
|
||||||
|
|
||||||
double get verticalSpace {
|
|
||||||
return getMaxVerticalSpace(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
double get horizontalSpace {
|
|
||||||
return plants.map((plant) => plant.horizontalSpace)
|
|
||||||
.reduce((value, element) => value+=element);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Add(Plant plant){
|
|
||||||
plants.add(plant);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double getMaxVerticalSpace(BeetRow beetrow) {
|
|
||||||
double maxVerticalSpace = 0;
|
|
||||||
|
|
||||||
for (var plant in beetrow.plants) {
|
|
||||||
if (plant.verticalSpace > maxVerticalSpace) {
|
|
||||||
maxVerticalSpace = plant.verticalSpace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return maxVerticalSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
double getMaxHorizontalSpace(Beet beet) {
|
|
||||||
double maxHorizontalSpace = 0;
|
|
||||||
|
|
||||||
for (var beetrow in beet.beetrows) {
|
|
||||||
if (beetrow.horizontalSpace > maxHorizontalSpace) {
|
|
||||||
maxHorizontalSpace = beetrow.horizontalSpace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return maxHorizontalSpace;
|
|
||||||
}
|
|
|
@ -1,215 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'beet.dart';
|
|
||||||
import 'plant.dart';
|
|
||||||
|
|
||||||
class Content extends StatefulWidget {
|
|
||||||
final bool showSpaceRequirement;
|
|
||||||
|
|
||||||
const Content({
|
|
||||||
Key? key,
|
|
||||||
required this.showSpaceRequirement,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_ContentState createState() => _ContentState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ContentState extends State<Content> {
|
|
||||||
Beet beet = Beet();
|
|
||||||
|
|
||||||
List<Widget> getRows(Beet beet) {
|
|
||||||
|
|
||||||
List<Widget> displayedRows = [];
|
|
||||||
List<Widget> verticalSpaceContainers = [];
|
|
||||||
|
|
||||||
verticalSpaceContainers=getVerticalSpaceContainers(beet);
|
|
||||||
|
|
||||||
for(int i =0; i<beet.beetrows.length;i++) {
|
|
||||||
var beetRow = beet.beetrows[i];
|
|
||||||
Widget? verticalSpace = null;
|
|
||||||
|
|
||||||
|
|
||||||
if (widget.showSpaceRequirement && beetRow.plants.isNotEmpty) {
|
|
||||||
displayedRows.add(getHorizontalSpaceRow(beetRow));
|
|
||||||
verticalSpace=verticalSpaceContainers[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
displayedRows.add(getPlantRow(beetRow, verticalSpace));
|
|
||||||
}
|
|
||||||
|
|
||||||
return displayedRows;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<double> getHorizontalSpaceValue(BeetRow beetRow) {
|
|
||||||
double preUsedSpace = 0;
|
|
||||||
List<double> spaceElements = [];
|
|
||||||
|
|
||||||
for (var plant in beetRow.plants) {
|
|
||||||
spaceElements.add(preUsedSpace + (plant.horizontalSpace / 2));
|
|
||||||
preUsedSpace += plant.horizontalSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spaceElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<double> getVerticalSpaceValue(Beet beet) {
|
|
||||||
double preUsedSpace = 0;
|
|
||||||
List<double> spaceElements = [];
|
|
||||||
|
|
||||||
for (var rows in beet.beetrows) {
|
|
||||||
spaceElements.add(preUsedSpace + (rows.verticalSpace / 2));
|
|
||||||
preUsedSpace += rows.verticalSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spaceElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget getHorizontalSpaceRow(BeetRow beetRow) {
|
|
||||||
var requiredSpaceValues = getHorizontalSpaceValue(beetRow);
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 150,
|
|
||||||
color: Colors.green[200],
|
|
||||||
child: Column(
|
|
||||||
children: const [
|
|
||||||
Text("-")
|
|
||||||
]
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
for (var item in requiredSpaceValues)
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 150,
|
|
||||||
color: Colors.green[200],
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(item.toString()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Container> getVerticalSpaceContainers(Beet beet) {
|
|
||||||
var requiredSpaceValues = getVerticalSpaceValue(beet);
|
|
||||||
List<Container> containers= [];
|
|
||||||
|
|
||||||
for (var item in requiredSpaceValues) {
|
|
||||||
containers.add(
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 150,
|
|
||||||
color: Colors.green[200],
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(item.toString()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
return containers;
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget getPlantRow(BeetRow beetRow, Widget? verticalSpaceContainers) {
|
|
||||||
|
|
||||||
int plantNumber=0;
|
|
||||||
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
if(verticalSpaceContainers!=null)
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 150,
|
|
||||||
color: Colors.green[200],
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
verticalSpaceContainers
|
|
||||||
]
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
for (var plant in beetRow.plants)
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.all(8),
|
|
||||||
margin: const EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 150,
|
|
||||||
color: Colors.green[200],
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(plant.name),
|
|
||||||
Text('Wasserbedarf: ${plant.waterRequirement}'),
|
|
||||||
Text('Platz: ${plant.horizontalSpace}'),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
DragTarget<Plant>(
|
|
||||||
onAccept: (droppedItem) {
|
|
||||||
setState(() {
|
|
||||||
beetRow.Add(droppedItem);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
builder: (context, candidateData, rejectedData) {
|
|
||||||
return Container(
|
|
||||||
padding: const EdgeInsets.all(8),
|
|
||||||
margin: const EdgeInsets.all(4),
|
|
||||||
height: 100,
|
|
||||||
width: 100,
|
|
||||||
color: Colors.grey[200],
|
|
||||||
child: const Center(
|
|
||||||
child: Text('Drop Plant here'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final scrollController = ScrollController();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Expanded(
|
|
||||||
child: Scrollbar(
|
|
||||||
thumbVisibility: true,
|
|
||||||
controller: scrollController,
|
|
||||||
child: ListView(
|
|
||||||
scrollDirection: Axis.horizontal,
|
|
||||||
controller: scrollController,
|
|
||||||
children: <Widget>[
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
...getRows(beet),
|
|
||||||
ElevatedButton(
|
|
||||||
onPressed: () {
|
|
||||||
setState(() {
|
|
||||||
beet.Add(BeetRow());
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Text('Neue Reihe'),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class ContentControl extends StatelessWidget {
|
|
||||||
final bool showSpaceRequirements;
|
|
||||||
final ValueChanged<bool> onValueChanged;
|
|
||||||
|
|
||||||
ContentControl({super.key,
|
|
||||||
required this.showSpaceRequirements,
|
|
||||||
required this.onValueChanged,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
children: [
|
|
||||||
Text('a'),
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
Text('Platzbedarf ausblenden'),
|
|
||||||
Checkbox(
|
|
||||||
value: showSpaceRequirements,
|
|
||||||
onChanged: (value) => onValueChanged(value!),
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
Text('c'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
import 'package:garden_planner/entities/beet_row.dart';
|
import 'beet_row.dart';
|
||||||
|
|
||||||
class Beet {
|
class Beet {
|
||||||
int _internalRow = 0;
|
int _internalRow = 0;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import 'plant.dart';
|
||||||
|
|
||||||
class BeetApiEntryReturn {
|
class BeetApiEntryReturn {
|
||||||
final Plant plant;
|
final Plant plant;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import 'package:garden_planner/entities/plant_in_row.dart';
|
import 'plant_in_row.dart';
|
||||||
|
|
||||||
class BeetRow {
|
class BeetRow {
|
||||||
int id;
|
int id;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import 'package:garden_planner/entities/plant_time.dart';
|
import 'plant_time.dart';
|
||||||
|
|
||||||
class Plant {
|
class Plant {
|
||||||
final String name;
|
final String name;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import 'plant.dart';
|
||||||
|
|
||||||
class PlantInRow extends Plant {
|
class PlantInRow extends Plant {
|
||||||
final int position;
|
final int position;
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class PlantTime {
|
class PlantTime {
|
||||||
final DateTime from;
|
final DateTime from;
|
||||||
final DateTime until;
|
final DateTime until;
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
import 'package:daydart/daydart.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class Footer extends StatelessWidget {
|
|
||||||
|
|
||||||
final Function(DateTime) onNewDaySelected;
|
|
||||||
final DateTime date;
|
|
||||||
|
|
||||||
Footer({
|
|
||||||
Key? key,
|
|
||||||
required this.onNewDaySelected,
|
|
||||||
required this.date
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
get onChanged => {};
|
|
||||||
|
|
||||||
double GetDayoftheYear(DateTime date){
|
|
||||||
|
|
||||||
return DayDart(date).dayOfYear().toDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
DateTime GetDatedtime(int dayOfTheYear){
|
|
||||||
var currentYear = DayDart().year();
|
|
||||||
|
|
||||||
DayDart date = DayDart('$currentYear-01-01');
|
|
||||||
date.add(dayOfTheYear-1,DayUnits.D);
|
|
||||||
|
|
||||||
return date.toDate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Row(
|
|
||||||
|
|
||||||
children: [
|
|
||||||
Container(),
|
|
||||||
Container(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(GetDatedtime(GetDayoftheYear(date).toInt()).toString()),
|
|
||||||
Slider(
|
|
||||||
value: GetDayoftheYear(date),
|
|
||||||
min: 1,
|
|
||||||
max: 365,
|
|
||||||
onChanged: (value) {
|
|
||||||
onNewDaySelected(GetDatedtime(value.toInt()));
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
),
|
|
||||||
Container()
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class Header extends StatelessWidget implements PreferredSizeWidget {
|
|
||||||
final String title;
|
|
||||||
final Function() onSidebarToggle;
|
|
||||||
|
|
||||||
const Header({Key? key, required this.title, required this.onSidebarToggle})
|
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => Size.fromHeight(60);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return AppBar(
|
|
||||||
title: Text(title),
|
|
||||||
actions: [
|
|
||||||
IconButton(
|
|
||||||
icon: Icon(Icons.menu),
|
|
||||||
onPressed: () {
|
|
||||||
onSidebarToggle(); // Einblenden der Sidebar
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +1,10 @@
|
||||||
import 'package:garden_planner/api/garden_api.service.dart';
|
import '../api/garden_api.service.dart';
|
||||||
import 'package:garden_planner/entities/beet.dart';
|
import '../entities/beet.dart';
|
||||||
import 'package:garden_planner/entities/beet_entry_return.dart';
|
import '../entities/beet_entry_return.dart';
|
||||||
import 'package:garden_planner/entities/beet_row.dart';
|
import '../entities/beet_row.dart';
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import '../entities/plant.dart';
|
||||||
import 'package:garden_planner/logic/beet_row.service.dart';
|
import 'beet_row.service.dart';
|
||||||
import 'package:garden_planner/logic/plant.service.dart';
|
import 'plant.service.dart';
|
||||||
|
|
||||||
class BeetService {
|
class BeetService {
|
||||||
void addPlantToRowById(final Beet beet, final BeetRowService rowService,
|
void addPlantToRowById(final Beet beet, final BeetRowService rowService,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:garden_planner/entities/beet.dart';
|
import '../entities/beet.dart';
|
||||||
import 'package:garden_planner/entities/beet_row.dart';
|
import '../entities/beet_row.dart';
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import '../entities/plant.dart';
|
||||||
import 'package:garden_planner/entities/plant_in_row.dart';
|
import '../entities/plant_in_row.dart';
|
||||||
import 'package:garden_planner/logic/plant.service.dart';
|
import 'plant.service.dart';
|
||||||
|
|
||||||
class BeetRowService {
|
class BeetRowService {
|
||||||
double getTotalHorizontalSpace(final BeetRow beetRow) {
|
double getTotalHorizontalSpace(final BeetRow beetRow) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:garden_planner/constance.dart';
|
|
||||||
|
|
||||||
|
import '../constance.dart';
|
||||||
import '../entities/plant.dart';
|
import '../entities/plant.dart';
|
||||||
import '../entities/plant_time.dart';
|
import '../entities/plant_time.dart';
|
||||||
import 'date.helper.dart';
|
import 'date.helper.dart';
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<<<<<<< refs/remotes/origin/main
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:garden_planner/constance.dart';
|
import 'package:garden_planner/constance.dart';
|
||||||
|
|
||||||
|
@ -20,7 +19,6 @@ void main() {
|
||||||
BeetService(),
|
BeetService(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
runApp(GardenPlanner(beetRepository: beetRepository));
|
runApp(GardenPlanner(beetRepository: beetRepository));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,86 +104,3 @@ class GardenPlannerState extends State<GardenPlanner> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
=======
|
|
||||||
import 'package:daydart/daydart.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'contentcontrol.dart';
|
|
||||||
import 'footer.dart';
|
|
||||||
import 'header.dart';
|
|
||||||
import 'content.dart';
|
|
||||||
import 'sidebar.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Drag and Drop Beispiel',
|
|
||||||
theme: ThemeData(
|
|
||||||
primarySwatch: Colors.blue,
|
|
||||||
),
|
|
||||||
home: DragAndDropScreen(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DragAndDropScreen extends StatefulWidget {
|
|
||||||
@override
|
|
||||||
_DragAndDropScreenState createState() => _DragAndDropScreenState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _DragAndDropScreenState extends State<DragAndDropScreen> {
|
|
||||||
bool showSpaceRequirements = false;
|
|
||||||
bool isSidebarOpen= true;
|
|
||||||
DateTime selectedDate=DateTime.now();
|
|
||||||
|
|
||||||
void toggleSidebar() {
|
|
||||||
setState(() {
|
|
||||||
isSidebarOpen = !isSidebarOpen;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void newDaySelected(DateTime date) {
|
|
||||||
setState(() {
|
|
||||||
this.selectedDate=date;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: Header(title: 'Drag and Drop Beispiel',
|
|
||||||
onSidebarToggle: toggleSidebar,),
|
|
||||||
body: Row(
|
|
||||||
children: <Widget>[
|
|
||||||
if (isSidebarOpen) Sidebar(),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
ContentControl(
|
|
||||||
showSpaceRequirements: showSpaceRequirements,
|
|
||||||
onValueChanged: (value) {
|
|
||||||
setState(() {
|
|
||||||
showSpaceRequirements = value;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
|
|
||||||
Content(
|
|
||||||
showSpaceRequirement: showSpaceRequirements,
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Footer(onNewDaySelected:newDaySelected,date: selectedDate),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
>>>>>>> working
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
class Plant {
|
|
||||||
final String name;
|
|
||||||
final double waterRequirement;
|
|
||||||
final double horizontalSpace;
|
|
||||||
final double verticalSpace;
|
|
||||||
|
|
||||||
Plant({
|
|
||||||
required this.name,
|
|
||||||
required this.waterRequirement,
|
|
||||||
required this.horizontalSpace,
|
|
||||||
required this.verticalSpace,
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,11 +1,11 @@
|
||||||
import 'package:garden_planner/api/garden_api.service.dart';
|
import '../api/garden_api.service.dart';
|
||||||
import 'package:garden_planner/constance.dart';
|
import '../constance.dart';
|
||||||
import 'package:garden_planner/entities/beet.dart';
|
import '../entities/beet.dart';
|
||||||
import 'package:garden_planner/entities/beet_row.dart';
|
import '../entities/beet_row.dart';
|
||||||
import 'package:garden_planner/entities/plant.dart';
|
import '../entities/plant.dart';
|
||||||
import 'package:garden_planner/logic/beet.service.dart';
|
import '../logic/beet.service.dart';
|
||||||
import 'package:garden_planner/logic/beet_row.service.dart';
|
import '../logic/beet_row.service.dart';
|
||||||
import 'package:garden_planner/logic/plant.service.dart';
|
import '../logic/plant.service.dart';
|
||||||
|
|
||||||
class BeetRepository {
|
class BeetRepository {
|
||||||
late Beet beet;
|
late Beet beet;
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'plant.dart';
|
|
||||||
|
|
||||||
class Sidebar extends StatelessWidget {
|
|
||||||
List<Plant> sidebarItems = [
|
|
||||||
Plant(
|
|
||||||
name: 'Pflanze 1',
|
|
||||||
waterRequirement: 3,
|
|
||||||
horizontalSpace: 2,
|
|
||||||
verticalSpace: 2,
|
|
||||||
),
|
|
||||||
Plant(
|
|
||||||
name: 'Pflanze 2',
|
|
||||||
waterRequirement: 5,
|
|
||||||
horizontalSpace: 1,
|
|
||||||
verticalSpace: 3,
|
|
||||||
),
|
|
||||||
Plant(
|
|
||||||
name: 'Pflanze 3',
|
|
||||||
waterRequirement: 2,
|
|
||||||
horizontalSpace: 3,
|
|
||||||
verticalSpace: 1,
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
Sidebar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
for (var plant in sidebarItems)
|
|
||||||
Draggable<Plant>(
|
|
||||||
data: plant,
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
color: Colors.white,
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(plant.name),
|
|
||||||
Text('Wasserbedarf: ${plant.waterRequirement}'),
|
|
||||||
Text('Platzbedarf: ${plant.horizontalSpace} x ${plant
|
|
||||||
.verticalSpace}'),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feedback: Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
margin: EdgeInsets.all(4),
|
|
||||||
color: Colors.blue[200],
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(plant.name),
|
|
||||||
Text('Wasserbedarf: ${plant.waterRequirement}'),
|
|
||||||
Text('Platzbedarf: ${plant.horizontalSpace} x ${plant
|
|
||||||
.verticalSpace}'),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
childWhenDragging: Container(),
|
|
||||||
)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -55,9 +55,9 @@ class Control extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
if (!reducedSpace && !actionIsNeeded)
|
if (!reducedSpace && !actionIsNeeded)
|
||||||
const Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
children: [
|
children: const [
|
||||||
Text("Nichts zu tun"),
|
Text("Nichts zu tun"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -22,47 +22,45 @@ class Header extends StatelessWidget implements PreferredSizeWidget {
|
||||||
),
|
),
|
||||||
title: Text(Constance.apptitle),
|
title: Text(Constance.apptitle),
|
||||||
actions: [
|
actions: [
|
||||||
Container(
|
Container(
|
||||||
margin: const EdgeInsets.all(5),
|
margin: const EdgeInsets.all(5),
|
||||||
child:
|
child: ElevatedButton.icon(
|
||||||
ElevatedButton.icon(
|
onPressed: () {
|
||||||
onPressed: () {
|
showDialog(
|
||||||
showDialog(
|
context: context,
|
||||||
context: context,
|
builder: (BuildContext context) {
|
||||||
builder: (BuildContext context) {
|
return AlertDialog(
|
||||||
return AlertDialog(
|
title: const Text('Bestätigen'),
|
||||||
title: const Text('Bestätigen'),
|
content: const Text('Möchten Sie speichern?'),
|
||||||
content: const Text('Möchten Sie speichern?'),
|
actions: [
|
||||||
actions: [
|
ElevatedButton(
|
||||||
ElevatedButton(
|
style: ElevatedButton.styleFrom(
|
||||||
style: ElevatedButton.styleFrom(
|
backgroundColor: Colors.redAccent,
|
||||||
backgroundColor: Colors.redAccent,
|
),
|
||||||
),
|
onPressed: () {
|
||||||
onPressed: () {
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pop();
|
},
|
||||||
},
|
child: const Text('Abbrechen'),
|
||||||
child: const Text('Abbrechen'),
|
),
|
||||||
),
|
ElevatedButton(
|
||||||
ElevatedButton(
|
child: const Text('Ja'),
|
||||||
child: const Text('Ja'),
|
onPressed: () {
|
||||||
onPressed: () {
|
onSave();
|
||||||
onSave();
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pop();
|
},
|
||||||
},
|
),
|
||||||
),
|
],
|
||||||
],
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
icon: const Icon(Icons.save),
|
||||||
},
|
label: const Text('Speichern'),
|
||||||
icon: const Icon(Icons.save),
|
style: ElevatedButton.styleFrom(
|
||||||
label: const Text('Speichern'),
|
foregroundColor: Colors.black,
|
||||||
style: ElevatedButton.styleFrom(
|
backgroundColor: Colors.white,
|
||||||
foregroundColor: Colors.black,
|
),
|
||||||
backgroundColor: Colors.white,
|
))
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ description: App zum Planen des Beets mit der passenden Position und Länge der
|
||||||
version: 1.0.0+1
|
version: 1.0.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.19.6 <3.0.0'
|
sdk: '>=2.19.4 <3.0.0'
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:garden_planner/main.dart';
|
||||||
|
import 'package:garden_planner/widgets/content.dart';
|
||||||
|
import 'package:garden_planner/widgets/sidebar.dart';
|
||||||
|
|
||||||
|
import 'helpers/beet_repository_generator.dart';
|
||||||
|
*/
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
//ToDO Tests fail because of Size in tester. Need to be fixed
|
||||||
|
/*
|
||||||
|
testWidgets('App Test', (WidgetTester tester) async {
|
||||||
|
//Arrange
|
||||||
|
await tester.pumpWidget(GardenPlanner(beetRepository: BeetRepositoryGenerator.getBeetRepository()));
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(find.byType(Sidebar), findsOneWidget, reason: 'Sidebar is missing');
|
||||||
|
expect(find.byType(Content), findsOneWidget, reason: 'Content is missing');
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('App Test sidbar opens', (WidgetTester tester) async {
|
||||||
|
//Arrange
|
||||||
|
await tester.pumpWidget(GardenPlanner(beetRepository: BeetRepositoryGenerator.getBeetRepository()));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
await tester.tap(find.byIcon(Icons.menu));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.tap(find.byIcon(Icons.menu));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(find.byType(Sidebar), findsOneWidget, reason: 'Sidebar displayed');
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('App Test sidbar close', (WidgetTester tester) async {
|
||||||
|
//Arrange
|
||||||
|
await tester.pumpWidget(GardenPlanner(beetRepository: BeetRepositoryGenerator.getBeetRepository()));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
await tester.tap(find.byIcon(Icons.menu));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
expect(find.byType(Sidebar), findsNothing);
|
||||||
|
expect(find.byType(Content), findsOneWidget);
|
||||||
|
});*/
|
||||||
|
}
|
|
@ -1,16 +0,0 @@
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:garden_planner/main.dart';
|
|
||||||
|
|
||||||
import 'helpers/beet_repository_generator.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
testWidgets('GardenPlanner Test', (WidgetTester tester) async {
|
|
||||||
|
|
||||||
await tester.pumpWidget(
|
|
||||||
GardenPlanner(
|
|
||||||
beetRepository: BeetRepositoryGenerator.getBeetRepository()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -3,8 +3,8 @@
|
||||||
# See https://docs.sonarqube.org/latest/analysis/gitlab-cicd/.
|
# See https://docs.sonarqube.org/latest/analysis/gitlab-cicd/.
|
||||||
|
|
||||||
# Project settings.
|
# Project settings.
|
||||||
sonar.projectKey=Joerg_cpd_project
|
sonar.projectKey=gardenPlanner
|
||||||
sonar.projectName=CPD Project
|
sonar.projectName=Garten Planner
|
||||||
sonar.projectDescription=Flutter Project for CPD
|
sonar.projectDescription=Flutter Project for CPD
|
||||||
sonar.links.ci=https://gitlab.vierling.cloud/Joerg/cpd_project/pipelines
|
sonar.links.ci=https://gitlab.vierling.cloud/Joerg/cpd_project/pipelines
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue