Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
B
Byodv2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dio Maulana
Byodv2
Commits
ecb565e5
Commit
ecb565e5
authored
Oct 13, 2022
by
Dio Maulana
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
variant confirm fixed
parent
7c0c03be
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
528 additions
and
209 deletions
+528
-209
main.dart
lib/main.dart
+7
-5
confirm_order.dart
lib/ui/confirm_order/confirm_order.dart
+521
-204
No files found.
lib/main.dart
View file @
ecb565e5
...
@@ -67,11 +67,13 @@ void main() async {
...
@@ -67,11 +67,13 @@ void main() async {
prefs
=
value
;
prefs
=
value
;
configLoading
();
configLoading
();
for
(
int
d
=
0
;
d
<
Uri
.
base
.
pathSegments
.
length
;
d
++)
{
for
(
int
d
=
0
;
d
<
Uri
.
base
.
pathSegments
.
length
;
d
++)
{
stringPath
.
add
(
Uri
.
base
.
pathSegments
[
d
]);
if
(
Uri
.
base
.
pathSegments
[
0
]
!=
'byod-neo/'
)
{
if
(
d
==
Uri
.
base
.
pathSegments
.
length
-
1
)
{
stringPath
.
add
(
Uri
.
base
.
pathSegments
[
d
]);
routesToAccess
+=
Uri
.
base
.
pathSegments
[
d
];
if
(
d
==
Uri
.
base
.
pathSegments
.
length
-
1
)
{
}
else
{
routesToAccess
+=
Uri
.
base
.
pathSegments
[
d
];
routesToAccess
+=
'
${Uri.base.pathSegments[d]}
/'
;
}
else
{
routesToAccess
+=
'
${Uri.base.pathSegments[d]}
/'
;
}
}
}
}
}
loadAssetConfig
().
then
((
title
)
{
loadAssetConfig
().
then
((
title
)
{
...
...
lib/ui/confirm_order/confirm_order.dart
View file @
ecb565e5
...
@@ -41,8 +41,8 @@ class CoreConfirm extends StatelessWidget {
...
@@ -41,8 +41,8 @@ class CoreConfirm extends StatelessWidget {
return
BlocBuilder
<
OrdersBloc
,
List
<
Orders
>>(
return
BlocBuilder
<
OrdersBloc
,
List
<
Orders
>>(
builder:
(
context
,
listOrders
)
{
builder:
(
context
,
listOrders
)
{
int
totalHarga
=
0
;
int
totalHarga
=
0
;
//
List indexTidakAdaVariant = [];
List
indexTidakAdaVariant
=
[];
// List<String>
indexAdaVariant = [];
List
indexAdaVariant
=
[];
// if (listOrders.isNotEmpty) {
// if (listOrders.isNotEmpty) {
// int fixTotalHarga = 0;
// int fixTotalHarga = 0;
...
@@ -78,14 +78,15 @@ class CoreConfirm extends StatelessWidget {
...
@@ -78,14 +78,15 @@ class CoreConfirm extends StatelessWidget {
// totalItem += listOrders[i].totalItem;
// totalItem += listOrders[i].totalItem;
// check apakah ada order detail. kalau ada rekalkulasi total harga sesuai order detail
// check apakah ada order detail. kalau ada rekalkulasi total harga sesuai order detail
if
(
listOrders
[
i
].
orderDetail
.
isEmpty
)
{
if
(
listOrders
[
i
].
orderDetail
.
isEmpty
)
{
//
indexTidakAdaVariant.add(i);
indexTidakAdaVariant
.
add
(
i
);
totalHargaBukanOrderDetail
+=
totalHargaBukanOrderDetail
+=
(
listOrders
[
i
].
totalItem
*
listOrders
[
i
].
totalHarga
);
(
listOrders
[
i
].
totalItem
*
listOrders
[
i
].
totalHarga
);
// totalItemBukanOrderDetail += listOrders[i].totalItem;
// totalItemBukanOrderDetail += listOrders[i].totalItem;
}
else
{
}
else
{
for
(
int
kk
=
0
;
kk
<
listOrders
[
i
].
orderDetail
.
length
;
kk
++)
{
for
(
int
kk
=
0
;
kk
<
listOrders
[
i
].
orderDetail
.
length
;
kk
++)
{
// String indexWithVariant = '${i}|${kk}';
String
indexWithVariant
=
// indexAdaVariant.add(indexWithVariant);
'
$i
|
$kk
'
;
// index orderan|index order detail
indexAdaVariant
.
add
(
indexWithVariant
);
totalHargaOrderDetail
+=
totalHargaOrderDetail
+=
listOrders
[
i
].
orderDetail
[
kk
].
totalHarga
;
listOrders
[
i
].
orderDetail
[
kk
].
totalHarga
;
// totalItemOrderDetail +=
// totalItemOrderDetail +=
...
@@ -98,6 +99,7 @@ class CoreConfirm extends StatelessWidget {
...
@@ -98,6 +99,7 @@ class CoreConfirm extends StatelessWidget {
totalHarga
=
fixTotalHarga
+
totalHargaBukanOrderDetail
;
totalHarga
=
fixTotalHarga
+
totalHargaBukanOrderDetail
;
// totalItem = fixTotalItem + totalItemBukanOrderDetail;
// totalItem = fixTotalItem + totalItemBukanOrderDetail;
}
}
return
Container
(
return
Container
(
width:
widthScreen
,
width:
widthScreen
,
child:
Stack
(
child:
Stack
(
...
@@ -114,208 +116,365 @@ class CoreConfirm extends StatelessWidget {
...
@@ -114,208 +116,365 @@ class CoreConfirm extends StatelessWidget {
const
SizedBox
(
const
SizedBox
(
height:
24
,
height:
24
,
),
),
ListView
.
builder
(
for
(
var
i
in
indexAdaVariant
)
physics:
Container
(
const
NeverScrollableScrollPhysics
(),
// to disable scrolling
child:
listWithVariant
(
shrinkWrap:
true
,
listOrders
,
itemCount:
listOrders
.
length
,
i
,
itemBuilder:
(
context
,
i
)
{
context
,
List
<
String
>
variantCaption
=
[
''
];
indexAdaVariant
,
List
<
String
>
variantName
=
[
''
];
),
),
int
totalItem
;
for
(
int
j
in
indexTidakAdaVariant
)
if
(
listOrders
[
i
].
orderDetail
.
isNotEmpty
)
{
Column
(
for
(
int
y
=
0
;
children:
[
y
<
Container
(
listOrders
[
i
]
width:
double
.
infinity
,
.
orderDetail
[
i
]
padding:
const
EdgeInsets
.
symmetric
(
.
orderVariant
horizontal:
paddingLeftRight
,
.
length
;
vertical:
16
,
y
++)
{
),
int
indexCaption
=
variantCaption
.
indexWhere
(
color:
backgroundWhite
,
(
element
)
=>
child:
Row
(
element
==
crossAxisAlignment:
listOrders
[
i
]
CrossAxisAlignment
.
center
,
.
orderDetail
[
i
]
mainAxisAlignment:
MainAxisAlignment
.
start
,
.
orderVariant
[
y
]
children:
[
.
caption
);
(
listOrders
[
j
].
imageUrl
!=
''
)
if
(
indexCaption
==
-
1
)
{
?
Image
(
variantCaption
.
add
(
listOrders
[
i
]
width:
80
,
.
orderDetail
[
i
]
height:
80
,
.
orderVariant
[
y
]
fit:
BoxFit
.
fill
,
.
caption
);
image:
NetworkImage
(
variantName
.
add
(
listOrders
[
i
]
listOrders
[
j
].
imageUrl
),
.
orderDetail
[
i
]
)
.
orderVariant
[
y
]
:
const
Image
(
.
name
);
width:
80
,
}
else
{
height:
80
,
variantName
[
indexCaption
]
+=
fit:
BoxFit
.
fill
,
",
${listOrders[i].orderDetail[i].orderVariant[y].name}
"
;
image:
AssetImage
(
}
'assets/noimage.png'
),
}
int
totalItemOrderDetail
=
0
;
for
(
int
kk
=
0
;
kk
<
listOrders
[
i
].
orderDetail
.
length
;
kk
++)
{
totalItemOrderDetail
+=
listOrders
[
i
].
orderDetail
[
kk
].
totalItem
;
}
totalItem
=
totalItemOrderDetail
;
}
else
{
totalItem
=
listOrders
[
i
].
totalItem
;
}
return
Column
(
children:
[
Container
(
width:
double
.
infinity
,
padding:
const
EdgeInsets
.
symmetric
(
horizontal:
paddingLeftRight
,
vertical:
16
,
),
color:
backgroundWhite
,
child:
Row
(
crossAxisAlignment:
CrossAxisAlignment
.
center
,
mainAxisAlignment:
MainAxisAlignment
.
start
,
children:
[
(
listOrders
[
i
].
imageUrl
!=
''
)
?
Image
(
width:
80
,
height:
80
,
fit:
BoxFit
.
fill
,
image:
NetworkImage
(
listOrders
[
i
].
imageUrl
),
)
:
const
Image
(
width:
80
,
height:
80
,
fit:
BoxFit
.
fill
,
image:
AssetImage
(
'assets/noimage.png'
),
),
const
SizedBox
(
width:
12
,
),
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
defaultText
(
context
,
listOrders
[
i
].
namaMenu
,
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
menuNameListViewBill
(),
),
const
SizedBox
(
height:
6
,
),
defaultText
(
context
,
'
$totalItem
X Rp
${formatNumber().format(listOrders[i].satuanHarga)}
'
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
),
),
const
SizedBox
(
const
SizedBox
(
height:
6
,
width:
12
,
),
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
defaultText
(
context
,
listOrders
[
j
].
namaMenu
,
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
menuNameListViewBill
(),
),
const
SizedBox
(
height:
6
,
),
defaultText
(
context
,
'
${listOrders[j].totalItem}
X Rp
${formatNumber().format(listOrders[j].satuanHarga)}
'
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
),
(
listOrders
[
i
].
note
!=
''
)
),
?
defaultText
(
const
SizedBox
(
context
,
height:
6
,
"Catatan:
${listOrders[i].note}
"
,
),
maxLines:
2
,
(
listOrders
[
j
].
note
!=
''
)
overFlow:
?
defaultText
(
TextOverflow
.
ellipsis
,
context
,
style:
viewbillStyle
(
"Catatan:
${listOrders[j].note}
"
,
font:
12
,
maxLines:
2
,
fontWeight:
overFlow:
FontWeight
.
w300
,
TextOverflow
.
ellipsis
,
),
style:
viewbillStyle
(
)
font:
12
,
:
const
SizedBox
(),
fontWeight:
FontWeight
.
w300
,
// (listOrders[i]
),
// .orderDetail
)
// .isNotEmpty)
:
const
SizedBox
(),
// ? defaultText(
// (listOrders[i]
// context,
// .orderDetail
// 'Variant : ',
// .isNotEmpty)
// maxLines: 2,
// ? defaultText(
// overFlow:
// context,
// TextOverflow.ellipsis,
// 'Variant : ',
// style: viewbillStyle(
// maxLines: 2,
// font: 12,
// overFlow:
// fontWeight:
// TextOverflow.ellipsis,
// FontWeight.w300,
// style: viewbillStyle(
// ),
// font: 12,
// )
// fontWeight:
// : const SizedBox(),
// FontWeight.w300,
if
(
listOrders
[
i
]
// ),
.
orderDetail
// )
.
isNotEmpty
)
// : const SizedBox(),
for
(
int
a
=
0
;
// if (listOrders[i]
a
<
variantCaption
.
length
;
// .orderDetail
a
++)
// .isNotEmpty)
if
(
variantCaption
[
a
]
!=
''
)
// for (int a = 0;
// defaultText(
// a < variantCaption.length;
// context,
// a++)
// listOrders[i]
// if (variantCaption[a] != '')
// .orderDetail[0]
// // defaultText(
// .orderVariant[a]
// // context,
// .name,
// // listOrders[i]
// maxLines: 2,
// // .orderDetail[0]
// overFlow:
// // .orderVariant[a]
// TextOverflow.ellipsis,
// // .name,
// style: viewbillStyle(
// // maxLines: 2,
// font: 12,
// // overFlow:
// fontWeight:
// // TextOverflow.ellipsis,
// FontWeight.w300,
// // style: viewbillStyle(
// ),
// // font: 12,
// ),
// // fontWeight:
Row
(
// // FontWeight.w300,
children:
[
// // ),
defaultText
(
// // ),
context
,
// Row(
"
${variantCaption[a]}
: "
,
// children: [
maxLines:
2
,
// defaultText(
overFlow:
TextOverflow
// context,
.
ellipsis
,
// "${variantCaption[a]} : ",
style:
viewbillStyle
(
// maxLines: 2,
font:
12
,
// overFlow:
fontWeight:
// TextOverflow.ellipsis,
FontWeight
.
w300
,
// style: viewbillStyle(
),
// font: 12,
),
// fontWeight:
defaultText
(
// FontWeight.w300,
context
,
// ),
variantName
[
a
],
// ),
maxLines:
2
,
// defaultText(
overFlow:
TextOverflow
// context,
.
ellipsis
,
// variantName[a],
style:
viewbillStyle
(
// maxLines: 2,
font:
12
,
// overFlow:
fontWeight:
// TextOverflow.ellipsis,
FontWeight
.
w300
,
// style: viewbillStyle(
),
// font: 12,
),
// fontWeight:
],
// FontWeight.w300,
)
// ),
],
// ),
)
// ],
],
// )
),
],
)
],
),
),
const
SizedBox
(
),
height:
24
,
const
SizedBox
(
)
height:
24
,
],
)
);
],
},
),
),
// ListView.builder(
// physics:
// const NeverScrollableScrollPhysics(), // to disable scrolling
// shrinkWrap: true,
// itemCount: listOrders.length,
// itemBuilder: (context, i) {
// List<String> variantCaption = [];
// List<String> variantName = [];
// int totalItem;
// if (listOrders[i].orderDetail.isNotEmpty) {
// for (int y = 0;
// y <
// listOrders[i]
// .orderDetail[i]
// .orderVariant
// .length;
// y++) {
// int indexCaption = variantCaption.indexWhere(
// (element) =>
// element ==
// listOrders[i]
// .orderDetail[i]
// .orderVariant[y]
// .caption);
// if (indexCaption == -1) {
// variantCaption.add(listOrders[i]
// .orderDetail[i]
// .orderVariant[y]
// .caption);
// variantName.add(listOrders[i]
// .orderDetail[i]
// .orderVariant[y]
// .name);
// } else {
// variantName[indexCaption] +=
// ", ${listOrders[i].orderDetail[i].orderVariant[y].name}";
// }
// }
// int totalItemOrderDetail = 0;
// for (int kk = 0;
// kk < listOrders[i].orderDetail.length;
// kk++) {
// totalItemOrderDetail +=
// listOrders[i].orderDetail[kk].totalItem;
// }
// totalItem = totalItemOrderDetail;
// } else {
// totalItem = listOrders[i].totalItem;
// }
// return Column(
// children: [
// Container(
// width: double.infinity,
// padding: const EdgeInsets.symmetric(
// horizontal: paddingLeftRight,
// vertical: 16,
// ),
// color: backgroundWhite,
// child: Row(
// crossAxisAlignment:
// CrossAxisAlignment.center,
// mainAxisAlignment:
// MainAxisAlignment.start,
// children: [
// (listOrders[i].imageUrl != '')
// ? Image(
// width: 80,
// height: 80,
// fit: BoxFit.fill,
// image: NetworkImage(
// listOrders[i].imageUrl),
// )
// : const Image(
// width: 80,
// height: 80,
// fit: BoxFit.fill,
// image: AssetImage(
// 'assets/noimage.png'),
// ),
// const SizedBox(
// width: 12,
// ),
// Column(
// crossAxisAlignment:
// CrossAxisAlignment.start,
// mainAxisAlignment:
// MainAxisAlignment.center,
// children: [
// defaultText(
// context,
// listOrders[i].namaMenu,
// maxLines: 2,
// overFlow: TextOverflow.ellipsis,
// style: menuNameListViewBill(),
// ),
// const SizedBox(
// height: 6,
// ),
// defaultText(
// context,
// '$totalItem X Rp ${formatNumber().format(listOrders[i].satuanHarga)}',
// style: viewbillStyle(
// font: 12,
// fontWeight: FontWeight.w300,
// ),
// ),
// const SizedBox(
// height: 6,
// ),
// (listOrders[i].note != '')
// ? defaultText(
// context,
// "Catatan: ${listOrders[i].note}",
// maxLines: 2,
// overFlow:
// TextOverflow.ellipsis,
// style: viewbillStyle(
// font: 12,
// fontWeight:
// FontWeight.w300,
// ),
// )
// : const SizedBox(),
// // (listOrders[i]
// // .orderDetail
// // .isNotEmpty)
// // ? defaultText(
// // context,
// // 'Variant : ',
// // maxLines: 2,
// // overFlow:
// // TextOverflow.ellipsis,
// // style: viewbillStyle(
// // font: 12,
// // fontWeight:
// // FontWeight.w300,
// // ),
// // )
// // : const SizedBox(),
// if (listOrders[i]
// .orderDetail
// .isNotEmpty)
// for (int a = 0;
// a < variantCaption.length;
// a++)
// if (variantCaption[a] != '')
// // defaultText(
// // context,
// // listOrders[i]
// // .orderDetail[0]
// // .orderVariant[a]
// // .name,
// // maxLines: 2,
// // overFlow:
// // TextOverflow.ellipsis,
// // style: viewbillStyle(
// // font: 12,
// // fontWeight:
// // FontWeight.w300,
// // ),
// // ),
// Row(
// children: [
// defaultText(
// context,
// "${variantCaption[a]} : ",
// maxLines: 2,
// overFlow: TextOverflow
// .ellipsis,
// style: viewbillStyle(
// font: 12,
// fontWeight:
// FontWeight.w300,
// ),
// ),
// defaultText(
// context,
// variantName[a],
// maxLines: 2,
// overFlow: TextOverflow
// .ellipsis,
// style: viewbillStyle(
// font: 12,
// fontWeight:
// FontWeight.w300,
// ),
// ),
// ],
// )
// ],
// )
// ],
// ),
// ),
// const SizedBox(
// height: 24,
// )
// ],
// );
// },
// ),
const
AddMoreOrder
()
const
AddMoreOrder
()
],
],
),
),
...
@@ -363,6 +522,164 @@ class CoreConfirm extends StatelessWidget {
...
@@ -363,6 +522,164 @@ class CoreConfirm extends StatelessWidget {
},
},
);
);
}
}
Column
listWithVariant
(
List
<
Orders
>
listOrders
,
i
,
BuildContext
context
,
List
<
dynamic
>
indexAdaVariant
)
{
// dippecah lagi masing2 indexnya
int
indexOrder
=
int
.
parse
(
i
.
split
(
'|'
)[
0
]);
int
indexOrderDetail
=
int
.
parse
(
i
.
split
(
'|'
)[
1
]);
List
<
String
>
variantCaption
=
[];
List
<
String
>
variantName
=
[];
if
(
listOrders
[
indexOrder
].
orderDetail
.
isNotEmpty
)
{
for
(
int
y
=
0
;
y
<
listOrders
[
indexOrder
]
.
orderDetail
[
indexOrderDetail
]
.
orderVariant
.
length
;
y
++)
{
int
indexCaption
=
variantCaption
.
indexWhere
((
element
)
=>
element
==
listOrders
[
indexOrder
]
.
orderDetail
[
indexOrderDetail
]
.
orderVariant
[
y
]
.
caption
);
if
(
indexCaption
==
-
1
)
{
variantCaption
.
add
(
listOrders
[
indexOrder
]
.
orderDetail
[
indexOrderDetail
]
.
orderVariant
[
y
]
.
caption
);
variantName
.
add
(
listOrders
[
indexOrder
]
.
orderDetail
[
indexOrderDetail
]
.
orderVariant
[
y
]
.
name
);
}
else
{
variantName
[
indexCaption
]
+=
",
${listOrders[indexOrder].orderDetail[indexOrderDetail].orderVariant[y].name}
"
;
}
}
}
return
Column
(
children:
[
Container
(
width:
double
.
infinity
,
padding:
const
EdgeInsets
.
symmetric
(
horizontal:
paddingLeftRight
,
vertical:
16
,
),
color:
backgroundWhite
,
child:
Row
(
crossAxisAlignment:
CrossAxisAlignment
.
center
,
mainAxisAlignment:
MainAxisAlignment
.
start
,
children:
[
(
listOrders
[
indexOrder
].
imageUrl
!=
''
)
?
Image
(
width:
80
,
height:
80
,
fit:
BoxFit
.
fill
,
image:
NetworkImage
(
listOrders
[
indexOrder
].
imageUrl
),
)
:
const
Image
(
width:
80
,
height:
80
,
fit:
BoxFit
.
fill
,
image:
AssetImage
(
'assets/noimage.png'
),
),
const
SizedBox
(
width:
12
,
),
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
defaultText
(
context
,
listOrders
[
indexOrder
].
namaMenu
,
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
menuNameListViewBill
(),
),
const
SizedBox
(
height:
6
,
),
defaultText
(
context
,
'
${listOrders[indexOrder].orderDetail[indexOrderDetail].totalItem}
X Rp
${formatNumber().format(listOrders[indexOrder].satuanHarga)}
'
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
),
const
SizedBox
(
height:
6
,
),
(
listOrders
[
indexOrder
].
orderDetail
[
indexOrderDetail
].
note
!=
''
)
?
defaultText
(
context
,
"Catatan:
${listOrders[indexOrder].orderDetail[indexOrderDetail].note}
"
,
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
)
:
const
SizedBox
(),
for
(
int
a
=
0
;
a
<
variantCaption
.
length
;
a
++)
if
(
variantCaption
[
a
]
!=
''
)
// defaultText(
// context,
// listOrders[i]
// .orderDetail[0]
// .orderVariant[a]
// .name,
// maxLines: 2,
// overFlow:
// TextOverflow.ellipsis,
// style: viewbillStyle(
// font: 12,
// fontWeight:
// FontWeight.w300,
// ),
// ),
Row
(
children:
[
defaultText
(
context
,
"
${variantCaption[a]}
: "
,
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
),
defaultText
(
context
,
variantName
[
a
],
maxLines:
2
,
overFlow:
TextOverflow
.
ellipsis
,
style:
viewbillStyle
(
font:
12
,
fontWeight:
FontWeight
.
w300
,
),
),
],
)
],
)
],
),
),
const
SizedBox
(
height:
24
,
)
],
);
}
}
}
Future
<
dynamic
>
modalInputName
(
BuildContext
context
,
Future
<
dynamic
>
modalInputName
(
BuildContext
context
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment