Branding MDLF + wip test
@ -32,7 +32,7 @@ apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
compileSdkVersion 34
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
@ -49,8 +49,8 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "be.unov.mymuseum.fortsaintheribert"
|
||||
minSdkVersion 20
|
||||
applicationId "be.unov.myinfomate.mdlf" // Update for mdlf and other clients -- "be.unov.mymuseum.fortsaintheribert"
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="be.unov.myvisit.mymuseum_visitapp">
|
||||
package="be.unov.myinfomate.mdlf">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="be.unov.myvisit.mymuseum_visitapp">
|
||||
package="be.unov.myinfomate.mdlf">
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
@ -17,8 +17,9 @@
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
||||
<uses-feature android:name="android.hardware.camera" />-->
|
||||
<!-- android:label="Fort Saint Héribert" -->
|
||||
<application
|
||||
android:label="Fort Saint Héribert"
|
||||
android:label="Musée de la fraise"
|
||||
android:name="${applicationName}"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:icon="@mipmap/launcher_icon">
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package be.unov.myvisit.mymuseum_visitapp
|
||||
package be.unov.myinfomate.mdlf
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 35 KiB |
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="be.unov.myvisit.mymuseum_visitapp">
|
||||
package="be.unov.myinfomate.mdlf">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
ext.kotlin_version = '1.9.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 167 KiB |
BIN
assets/icon/icon_fort.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 793 KiB After Width: | Height: | Size: 600 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 736 B |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 27 KiB |
@ -11,14 +11,14 @@ class BuilderImageSlider extends StatelessWidget {
|
||||
{Key? key,
|
||||
required this.appContext,
|
||||
required this.currentIndex,
|
||||
required this.imagesDTO,
|
||||
required this.contentsDTO,
|
||||
required this.size,
|
||||
required this.i}
|
||||
) : super(key: key);
|
||||
|
||||
final AppContext appContext;
|
||||
final int currentIndex;
|
||||
final List<ImageDTO?> imagesDTO;
|
||||
final List<ContentDTO?> contentsDTO;
|
||||
final Size size;
|
||||
final ResourceModel i;
|
||||
|
||||
@ -28,7 +28,7 @@ class BuilderImageSlider extends StatelessWidget {
|
||||
builder: (BuildContext context) {*/
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
showImagePopup(imagesDTO[currentIndex-1]!, i, appContext, context, size);
|
||||
showImagePopup(contentsDTO[currentIndex-1]!, i, appContext, context, size);
|
||||
},
|
||||
child: Container(
|
||||
//color: Colors.red,
|
||||
|
||||
149
lib/Components/Carousel/carousel_controller.dart
Normal file
@ -0,0 +1,149 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'carousel_options.dart';
|
||||
import 'carousel_state.dart';
|
||||
import 'utils.dart';
|
||||
|
||||
abstract class CarouselController {
|
||||
bool get ready;
|
||||
|
||||
Future<Null> get onReady;
|
||||
|
||||
Future<void> nextPage({Duration? duration, Curve? curve});
|
||||
|
||||
Future<void> previousPage({Duration? duration, Curve? curve});
|
||||
|
||||
void jumpToPage(int page);
|
||||
|
||||
Future<void> animateToPage(int page, {Duration? duration, Curve? curve});
|
||||
|
||||
void startAutoPlay();
|
||||
|
||||
void stopAutoPlay();
|
||||
|
||||
factory CarouselController() => CarouselControllerImpl();
|
||||
}
|
||||
|
||||
class CarouselControllerImpl implements CarouselController {
|
||||
final Completer<Null> _readyCompleter = Completer<Null>();
|
||||
|
||||
CarouselState? _state;
|
||||
|
||||
set state(CarouselState? state) {
|
||||
_state = state;
|
||||
if (!_readyCompleter.isCompleted) {
|
||||
_readyCompleter.complete();
|
||||
}
|
||||
}
|
||||
|
||||
void _setModeController() =>
|
||||
_state!.changeMode(CarouselPageChangedReason.controller);
|
||||
|
||||
@override
|
||||
bool get ready => _state != null;
|
||||
|
||||
@override
|
||||
Future<Null> get onReady => _readyCompleter.future;
|
||||
|
||||
/// Animates the controlled [CarouselSlider] to the next page.
|
||||
///
|
||||
/// The animation lasts for the given duration and follows the given curve.
|
||||
/// The returned [Future] resolves when the animation completes.
|
||||
Future<void> nextPage(
|
||||
{Duration? duration = const Duration(milliseconds: 300),
|
||||
Curve? curve = Curves.linear}) async {
|
||||
final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate;
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResetTimer();
|
||||
}
|
||||
_setModeController();
|
||||
await _state!.pageController!.nextPage(duration: duration!, curve: curve!);
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResumeTimer();
|
||||
}
|
||||
}
|
||||
|
||||
/// Animates the controlled [CarouselSlider] to the previous page.
|
||||
///
|
||||
/// The animation lasts for the given duration and follows the given curve.
|
||||
/// The returned [Future] resolves when the animation completes.
|
||||
Future<void> previousPage(
|
||||
{Duration? duration = const Duration(milliseconds: 300),
|
||||
Curve? curve = Curves.linear}) async {
|
||||
final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate;
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResetTimer();
|
||||
}
|
||||
_setModeController();
|
||||
await _state!.pageController!
|
||||
.previousPage(duration: duration!, curve: curve!);
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResumeTimer();
|
||||
}
|
||||
}
|
||||
|
||||
/// Changes which page is displayed in the controlled [CarouselSlider].
|
||||
///
|
||||
/// Jumps the page position from its current value to the given value,
|
||||
/// without animation, and without checking if the new value is in range.
|
||||
void jumpToPage(int page) {
|
||||
final index = getRealIndex(_state!.pageController!.page!.toInt(),
|
||||
_state!.realPage - _state!.initialPage, _state!.itemCount);
|
||||
|
||||
_setModeController();
|
||||
final int pageToJump = _state!.pageController!.page!.toInt() + page - index;
|
||||
return _state!.pageController!.jumpToPage(pageToJump);
|
||||
}
|
||||
|
||||
/// Animates the controlled [CarouselSlider] from the current page to the given page.
|
||||
///
|
||||
/// The animation lasts for the given duration and follows the given curve.
|
||||
/// The returned [Future] resolves when the animation completes.
|
||||
Future<void> animateToPage(int page,
|
||||
{Duration? duration = const Duration(milliseconds: 300),
|
||||
Curve? curve = Curves.linear}) async {
|
||||
final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate;
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResetTimer();
|
||||
}
|
||||
final index = getRealIndex(_state!.pageController!.page!.toInt(),
|
||||
_state!.realPage - _state!.initialPage, _state!.itemCount);
|
||||
int smallestMovement = page - index;
|
||||
if (_state!.options.enableInfiniteScroll &&
|
||||
_state!.itemCount != null &&
|
||||
_state!.options.animateToClosest) {
|
||||
if ((page - index).abs() > (page + _state!.itemCount! - index).abs()) {
|
||||
smallestMovement = page + _state!.itemCount! - index;
|
||||
} else if ((page - index).abs() >
|
||||
(page - _state!.itemCount! - index).abs()) {
|
||||
smallestMovement = page - _state!.itemCount! - index;
|
||||
}
|
||||
}
|
||||
_setModeController();
|
||||
await _state!.pageController!.animateToPage(
|
||||
_state!.pageController!.page!.toInt() + smallestMovement,
|
||||
duration: duration!,
|
||||
curve: curve!);
|
||||
if (isNeedResetTimer) {
|
||||
_state!.onResumeTimer();
|
||||
}
|
||||
}
|
||||
|
||||
/// Starts the controlled [CarouselSlider] autoplay.
|
||||
///
|
||||
/// The carousel will only autoPlay if the [autoPlay] parameter
|
||||
/// in [CarouselOptions] is true.
|
||||
void startAutoPlay() {
|
||||
_state!.onResumeTimer();
|
||||
}
|
||||
|
||||
/// Stops the controlled [CarouselSlider] from autoplaying.
|
||||
///
|
||||
/// This is a more on-demand way of doing this. Use the [autoPlay]
|
||||
/// parameter in [CarouselOptions] to specify the autoPlay behaviour of the carousel.
|
||||
void stopAutoPlay() {
|
||||
_state!.onResetTimer();
|
||||
}
|
||||
}
|
||||
223
lib/Components/Carousel/carousel_options.dart
Normal file
@ -0,0 +1,223 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum CarouselPageChangedReason { timed, manual, controller }
|
||||
|
||||
enum CenterPageEnlargeStrategy { scale, height, zoom }
|
||||
|
||||
class CarouselOptions {
|
||||
/// Set carousel height and overrides any existing [aspectRatio].
|
||||
final double? height;
|
||||
|
||||
/// Aspect ratio is used if no height have been declared.
|
||||
///
|
||||
/// Defaults to 16:9 aspect ratio.
|
||||
final double aspectRatio;
|
||||
|
||||
/// The fraction of the viewport that each page should occupy.
|
||||
///
|
||||
/// Defaults to 0.8, which means each page fills 80% of the carousel.
|
||||
final double viewportFraction;
|
||||
|
||||
/// The initial page to show when first creating the [CarouselSlider].
|
||||
///
|
||||
/// Defaults to 0.
|
||||
final int initialPage;
|
||||
|
||||
///Determines if carousel should loop infinitely or be limited to item length.
|
||||
///
|
||||
///Defaults to true, i.e. infinite loop.
|
||||
final bool enableInfiniteScroll;
|
||||
|
||||
///Determines if carousel should loop to the closest occurence of requested page.
|
||||
///
|
||||
///Defaults to true.
|
||||
final bool animateToClosest;
|
||||
|
||||
/// Reverse the order of items if set to true.
|
||||
///
|
||||
/// Defaults to false.
|
||||
final bool reverse;
|
||||
|
||||
/// Enables auto play, sliding one page at a time.
|
||||
///
|
||||
/// Use [autoPlayInterval] to determent the frequency of slides.
|
||||
/// Defaults to false.
|
||||
final bool autoPlay;
|
||||
|
||||
/// Sets Duration to determent the frequency of slides when
|
||||
///
|
||||
/// [autoPlay] is set to true.
|
||||
/// Defaults to 4 seconds.
|
||||
final Duration autoPlayInterval;
|
||||
|
||||
/// The animation duration between two transitioning pages while in auto playback.
|
||||
///
|
||||
/// Defaults to 800 ms.
|
||||
final Duration autoPlayAnimationDuration;
|
||||
|
||||
/// Determines the animation curve physics.
|
||||
///
|
||||
/// Defaults to [Curves.fastOutSlowIn].
|
||||
final Curve autoPlayCurve;
|
||||
|
||||
/// Determines if current page should be larger than the side images,
|
||||
/// creating a feeling of depth in the carousel.
|
||||
///
|
||||
/// Defaults to false.
|
||||
final bool? enlargeCenterPage;
|
||||
|
||||
/// The axis along which the page view scrolls.
|
||||
///
|
||||
/// Defaults to [Axis.horizontal].
|
||||
final Axis scrollDirection;
|
||||
|
||||
/// Called whenever the page in the center of the viewport changes.
|
||||
final Function(int index, CarouselPageChangedReason reason)? onPageChanged;
|
||||
|
||||
/// Called whenever the carousel is scrolled
|
||||
final ValueChanged<double?>? onScrolled;
|
||||
|
||||
/// How the carousel should respond to user input.
|
||||
///
|
||||
/// For example, determines how the items continues to animate after the
|
||||
/// user stops dragging the page view.
|
||||
///
|
||||
/// The physics are modified to snap to page boundaries using
|
||||
/// [PageScrollPhysics] prior to being used.
|
||||
///
|
||||
/// Defaults to matching platform conventions.
|
||||
final ScrollPhysics? scrollPhysics;
|
||||
|
||||
/// Set to false to disable page snapping, useful for custom scroll behavior.
|
||||
///
|
||||
/// Default to `true`.
|
||||
final bool pageSnapping;
|
||||
|
||||
/// If `true`, the auto play function will be paused when user is interacting with
|
||||
/// the carousel, and will be resumed when user finish interacting.
|
||||
/// Default to `true`.
|
||||
final bool pauseAutoPlayOnTouch;
|
||||
|
||||
/// If `true`, the auto play function will be paused when user is calling
|
||||
/// pageController's `nextPage` or `previousPage` or `animateToPage` method.
|
||||
/// And after the animation complete, the auto play will be resumed.
|
||||
/// Default to `true`.
|
||||
final bool pauseAutoPlayOnManualNavigate;
|
||||
|
||||
/// If `enableInfiniteScroll` is `false`, and `autoPlay` is `true`, this option
|
||||
/// decide the carousel should go to the first item when it reach the last item or not.
|
||||
/// If set to `true`, the auto play will be paused when it reach the last item.
|
||||
/// If set to `false`, the auto play function will animate to the first item when it was
|
||||
/// in the last item.
|
||||
final bool pauseAutoPlayInFiniteScroll;
|
||||
|
||||
/// Pass a `PageStoragekey` if you want to keep the pageview's position when it was recreated.
|
||||
final PageStorageKey? pageViewKey;
|
||||
|
||||
/// Use [enlargeStrategy] to determine which method to enlarge the center page.
|
||||
final CenterPageEnlargeStrategy enlargeStrategy;
|
||||
|
||||
/// How much the pages next to the center page will be scaled down.
|
||||
/// If `enlargeCenterPage` is false, this property has no effect.
|
||||
final double enlargeFactor;
|
||||
|
||||
/// Whether or not to disable the `Center` widget for each slide.
|
||||
final bool disableCenter;
|
||||
|
||||
/// Whether to add padding to both ends of the list.
|
||||
/// If this is set to true and [viewportFraction] < 1.0, padding will be added such that the first and last child slivers will be in the center of the viewport when scrolled all the way to the start or end, respectively.
|
||||
/// If [viewportFraction] >= 1.0, this property has no effect.
|
||||
/// This property defaults to true and must not be null.
|
||||
final bool padEnds;
|
||||
|
||||
/// Exposed clipBehavior of PageView
|
||||
final Clip clipBehavior;
|
||||
|
||||
CarouselOptions({
|
||||
this.height,
|
||||
this.aspectRatio = 16 / 9,
|
||||
this.viewportFraction = 0.8,
|
||||
this.initialPage = 0,
|
||||
this.enableInfiniteScroll = true,
|
||||
this.animateToClosest = true,
|
||||
this.reverse = false,
|
||||
this.autoPlay = false,
|
||||
this.autoPlayInterval = const Duration(seconds: 4),
|
||||
this.autoPlayAnimationDuration = const Duration(milliseconds: 800),
|
||||
this.autoPlayCurve = Curves.fastOutSlowIn,
|
||||
this.enlargeCenterPage = false,
|
||||
this.onPageChanged,
|
||||
this.onScrolled,
|
||||
this.scrollPhysics,
|
||||
this.pageSnapping = true,
|
||||
this.scrollDirection = Axis.horizontal,
|
||||
this.pauseAutoPlayOnTouch = true,
|
||||
this.pauseAutoPlayOnManualNavigate = true,
|
||||
this.pauseAutoPlayInFiniteScroll = false,
|
||||
this.pageViewKey,
|
||||
this.enlargeStrategy = CenterPageEnlargeStrategy.scale,
|
||||
this.enlargeFactor = 0.3,
|
||||
this.disableCenter = false,
|
||||
this.padEnds = true,
|
||||
this.clipBehavior = Clip.hardEdge,
|
||||
});
|
||||
|
||||
///Generate new [CarouselOptions] based on old ones.
|
||||
|
||||
CarouselOptions copyWith(
|
||||
{double? height,
|
||||
double? aspectRatio,
|
||||
double? viewportFraction,
|
||||
int? initialPage,
|
||||
bool? enableInfiniteScroll,
|
||||
bool? reverse,
|
||||
bool? autoPlay,
|
||||
Duration? autoPlayInterval,
|
||||
Duration? autoPlayAnimationDuration,
|
||||
Curve? autoPlayCurve,
|
||||
bool? enlargeCenterPage,
|
||||
Function(int index, CarouselPageChangedReason reason)? onPageChanged,
|
||||
ValueChanged<double?>? onScrolled,
|
||||
ScrollPhysics? scrollPhysics,
|
||||
bool? pageSnapping,
|
||||
Axis? scrollDirection,
|
||||
bool? pauseAutoPlayOnTouch,
|
||||
bool? pauseAutoPlayOnManualNavigate,
|
||||
bool? pauseAutoPlayInFiniteScroll,
|
||||
PageStorageKey? pageViewKey,
|
||||
CenterPageEnlargeStrategy? enlargeStrategy,
|
||||
double? enlargeFactor,
|
||||
bool? disableCenter,
|
||||
Clip? clipBehavior,
|
||||
bool? padEnds}) =>
|
||||
CarouselOptions(
|
||||
height: height ?? this.height,
|
||||
aspectRatio: aspectRatio ?? this.aspectRatio,
|
||||
viewportFraction: viewportFraction ?? this.viewportFraction,
|
||||
initialPage: initialPage ?? this.initialPage,
|
||||
enableInfiniteScroll: enableInfiniteScroll ?? this.enableInfiniteScroll,
|
||||
reverse: reverse ?? this.reverse,
|
||||
autoPlay: autoPlay ?? this.autoPlay,
|
||||
autoPlayInterval: autoPlayInterval ?? this.autoPlayInterval,
|
||||
autoPlayAnimationDuration:
|
||||
autoPlayAnimationDuration ?? this.autoPlayAnimationDuration,
|
||||
autoPlayCurve: autoPlayCurve ?? this.autoPlayCurve,
|
||||
enlargeCenterPage: enlargeCenterPage ?? this.enlargeCenterPage,
|
||||
onPageChanged: onPageChanged ?? this.onPageChanged,
|
||||
onScrolled: onScrolled ?? this.onScrolled,
|
||||
scrollPhysics: scrollPhysics ?? this.scrollPhysics,
|
||||
pageSnapping: pageSnapping ?? this.pageSnapping,
|
||||
scrollDirection: scrollDirection ?? this.scrollDirection,
|
||||
pauseAutoPlayOnTouch: pauseAutoPlayOnTouch ?? this.pauseAutoPlayOnTouch,
|
||||
pauseAutoPlayOnManualNavigate:
|
||||
pauseAutoPlayOnManualNavigate ?? this.pauseAutoPlayOnManualNavigate,
|
||||
pauseAutoPlayInFiniteScroll:
|
||||
pauseAutoPlayInFiniteScroll ?? this.pauseAutoPlayInFiniteScroll,
|
||||
pageViewKey: pageViewKey ?? this.pageViewKey,
|
||||
enlargeStrategy: enlargeStrategy ?? this.enlargeStrategy,
|
||||
enlargeFactor: enlargeFactor ?? this.enlargeFactor,
|
||||
disableCenter: disableCenter ?? this.disableCenter,
|
||||
clipBehavior: clipBehavior ?? this.clipBehavior,
|
||||
padEnds: padEnds ?? this.padEnds,
|
||||
);
|
||||
}
|
||||
396
lib/Components/Carousel/carousel_slider.dart
Normal file
@ -0,0 +1,396 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'carousel_controller.dart' as cs;
|
||||
import 'carousel_options.dart';
|
||||
import 'carousel_state.dart';
|
||||
import 'utils.dart';
|
||||
|
||||
export 'carousel_controller.dart';
|
||||
export 'carousel_options.dart';
|
||||
|
||||
typedef Widget ExtendedIndexedWidgetBuilder(
|
||||
BuildContext context, int index, int realIndex);
|
||||
|
||||
class CarouselSlider extends StatefulWidget {
|
||||
/// [CarouselOptions] to create a [CarouselState] with
|
||||
final CarouselOptions options;
|
||||
|
||||
final bool? disableGesture;
|
||||
|
||||
/// The widgets to be shown in the carousel of default constructor
|
||||
final List<Widget>? items;
|
||||
|
||||
/// The widget item builder that will be used to build item on demand
|
||||
/// The third argument is the PageView's real index, can be used to cooperate
|
||||
/// with Hero.
|
||||
final ExtendedIndexedWidgetBuilder? itemBuilder;
|
||||
|
||||
/// A [MapController], used to control the map.
|
||||
final cs.CarouselControllerImpl _carouselController;
|
||||
|
||||
final int? itemCount;
|
||||
|
||||
CarouselSlider(
|
||||
{required this.items,
|
||||
required this.options,
|
||||
this.disableGesture,
|
||||
cs.CarouselController? carouselController,
|
||||
Key? key})
|
||||
: itemBuilder = null,
|
||||
itemCount = items != null ? items.length : 0,
|
||||
_carouselController = carouselController != null
|
||||
? carouselController as cs.CarouselControllerImpl
|
||||
: cs.CarouselController() as cs.CarouselControllerImpl,
|
||||
super(key: key);
|
||||
|
||||
/// The on demand item builder constructor
|
||||
CarouselSlider.builder(
|
||||
{required this.itemCount,
|
||||
required this.itemBuilder,
|
||||
required this.options,
|
||||
this.disableGesture,
|
||||
cs.CarouselController? carouselController,
|
||||
Key? key})
|
||||
: items = null,
|
||||
_carouselController = carouselController != null
|
||||
? carouselController as cs.CarouselControllerImpl
|
||||
: cs.CarouselController() as cs.CarouselControllerImpl,
|
||||
super(key: key);
|
||||
|
||||
@override
|
||||
CarouselSliderState createState() => CarouselSliderState(_carouselController);
|
||||
}
|
||||
|
||||
class CarouselSliderState extends State<CarouselSlider>
|
||||
with TickerProviderStateMixin {
|
||||
final cs.CarouselControllerImpl carouselController;
|
||||
Timer? timer;
|
||||
|
||||
CarouselOptions get options => widget.options;
|
||||
|
||||
CarouselState? carouselState;
|
||||
|
||||
PageController? pageController;
|
||||
|
||||
/// mode is related to why the page is being changed
|
||||
CarouselPageChangedReason mode = CarouselPageChangedReason.controller;
|
||||
|
||||
CarouselSliderState(this.carouselController);
|
||||
|
||||
void changeMode(CarouselPageChangedReason _mode) {
|
||||
mode = _mode;
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(CarouselSlider oldWidget) {
|
||||
carouselState!.options = options;
|
||||
carouselState!.itemCount = widget.itemCount;
|
||||
|
||||
// pageController needs to be re-initialized to respond to state changes
|
||||
pageController = PageController(
|
||||
viewportFraction: options.viewportFraction,
|
||||
initialPage: carouselState!.realPage,
|
||||
);
|
||||
carouselState!.pageController = pageController;
|
||||
|
||||
// handle autoplay when state changes
|
||||
handleAutoPlay();
|
||||
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
carouselState =
|
||||
CarouselState(this.options, clearTimer, resumeTimer, this.changeMode);
|
||||
|
||||
carouselState!.itemCount = widget.itemCount;
|
||||
carouselController.state = carouselState;
|
||||
carouselState!.initialPage = widget.options.initialPage;
|
||||
carouselState!.realPage = options.enableInfiniteScroll
|
||||
? carouselState!.realPage + carouselState!.initialPage
|
||||
: carouselState!.initialPage;
|
||||
handleAutoPlay();
|
||||
|
||||
pageController = PageController(
|
||||
viewportFraction: options.viewportFraction,
|
||||
initialPage: carouselState!.realPage,
|
||||
);
|
||||
|
||||
carouselState!.pageController = pageController;
|
||||
}
|
||||
|
||||
Timer? getTimer() {
|
||||
return widget.options.autoPlay
|
||||
? Timer.periodic(widget.options.autoPlayInterval, (_) {
|
||||
if (!mounted) {
|
||||
clearTimer();
|
||||
return;
|
||||
}
|
||||
|
||||
final route = ModalRoute.of(context);
|
||||
if (route?.isCurrent == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
CarouselPageChangedReason previousReason = mode;
|
||||
changeMode(CarouselPageChangedReason.timed);
|
||||
int nextPage = carouselState!.pageController!.page!.round() + 1;
|
||||
int itemCount = widget.itemCount ?? widget.items!.length;
|
||||
|
||||
if (nextPage >= itemCount &&
|
||||
widget.options.enableInfiniteScroll == false) {
|
||||
if (widget.options.pauseAutoPlayInFiniteScroll) {
|
||||
clearTimer();
|
||||
return;
|
||||
}
|
||||
nextPage = 0;
|
||||
}
|
||||
|
||||
carouselState!.pageController!
|
||||
.animateToPage(nextPage,
|
||||
duration: widget.options.autoPlayAnimationDuration,
|
||||
curve: widget.options.autoPlayCurve)
|
||||
.then((_) => changeMode(previousReason));
|
||||
})
|
||||
: null;
|
||||
}
|
||||
|
||||
void clearTimer() {
|
||||
if (timer != null) {
|
||||
timer?.cancel();
|
||||
timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
void resumeTimer() {
|
||||
if (timer == null) {
|
||||
timer = getTimer();
|
||||
}
|
||||
}
|
||||
|
||||
void handleAutoPlay() {
|
||||
bool autoPlayEnabled = widget.options.autoPlay;
|
||||
|
||||
if (autoPlayEnabled && timer != null) return;
|
||||
|
||||
clearTimer();
|
||||
if (autoPlayEnabled) {
|
||||
resumeTimer();
|
||||
}
|
||||
}
|
||||
|
||||
Widget getGestureWrapper(Widget child) {
|
||||
Widget wrapper;
|
||||
if (widget.options.height != null) {
|
||||
wrapper = Container(height: widget.options.height, child: child);
|
||||
} else {
|
||||
wrapper =
|
||||
AspectRatio(aspectRatio: widget.options.aspectRatio, child: child);
|
||||
}
|
||||
|
||||
if (true == widget.disableGesture) {
|
||||
return NotificationListener(
|
||||
onNotification: (Notification notification) {
|
||||
if (widget.options.onScrolled != null &&
|
||||
notification is ScrollUpdateNotification) {
|
||||
widget.options.onScrolled!(carouselState!.pageController!.page);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
child: wrapper,
|
||||
);
|
||||
}
|
||||
|
||||
return RawGestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
gestures: {
|
||||
_MultipleGestureRecognizer:
|
||||
GestureRecognizerFactoryWithHandlers<_MultipleGestureRecognizer>(
|
||||
() => _MultipleGestureRecognizer(),
|
||||
(_MultipleGestureRecognizer instance) {
|
||||
instance.onStart = (_) {
|
||||
onStart();
|
||||
};
|
||||
instance.onDown = (_) {
|
||||
onPanDown();
|
||||
};
|
||||
instance.onEnd = (_) {
|
||||
onPanUp();
|
||||
};
|
||||
instance.onCancel = () {
|
||||
onPanUp();
|
||||
};
|
||||
}),
|
||||
},
|
||||
child: NotificationListener(
|
||||
onNotification: (Notification notification) {
|
||||
if (widget.options.onScrolled != null &&
|
||||
notification is ScrollUpdateNotification) {
|
||||
widget.options.onScrolled!(carouselState!.pageController!.page);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
child: wrapper,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget getCenterWrapper(Widget child) {
|
||||
if (widget.options.disableCenter) {
|
||||
return Container(
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
return Center(child: child);
|
||||
}
|
||||
|
||||
Widget getEnlargeWrapper(Widget? child,
|
||||
{double? width,
|
||||
double? height,
|
||||
double? scale,
|
||||
required double itemOffset}) {
|
||||
if (widget.options.enlargeStrategy == CenterPageEnlargeStrategy.height) {
|
||||
return SizedBox(child: child, width: width, height: height);
|
||||
}
|
||||
if (widget.options.enlargeStrategy == CenterPageEnlargeStrategy.zoom) {
|
||||
late Alignment alignment;
|
||||
final bool horizontal = options.scrollDirection == Axis.horizontal;
|
||||
if (itemOffset > 0) {
|
||||
alignment = horizontal ? Alignment.centerRight : Alignment.bottomCenter;
|
||||
} else {
|
||||
alignment = horizontal ? Alignment.centerLeft : Alignment.topCenter;
|
||||
}
|
||||
return Transform.scale(child: child, scale: scale!, alignment: alignment);
|
||||
}
|
||||
return Transform.scale(
|
||||
scale: scale!,
|
||||
child: Container(child: child, width: width, height: height));
|
||||
}
|
||||
|
||||
void onStart() {
|
||||
changeMode(CarouselPageChangedReason.manual);
|
||||
}
|
||||
|
||||
void onPanDown() {
|
||||
if (widget.options.pauseAutoPlayOnTouch) {
|
||||
clearTimer();
|
||||
}
|
||||
|
||||
changeMode(CarouselPageChangedReason.manual);
|
||||
}
|
||||
|
||||
void onPanUp() {
|
||||
if (widget.options.pauseAutoPlayOnTouch) {
|
||||
resumeTimer();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
clearTimer();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return getGestureWrapper(PageView.builder(
|
||||
padEnds: widget.options.padEnds,
|
||||
scrollBehavior: ScrollConfiguration.of(context).copyWith(
|
||||
scrollbars: false,
|
||||
overscroll: false,
|
||||
dragDevices: {
|
||||
PointerDeviceKind.touch,
|
||||
PointerDeviceKind.mouse,
|
||||
},
|
||||
),
|
||||
clipBehavior: widget.options.clipBehavior,
|
||||
physics: widget.options.scrollPhysics,
|
||||
scrollDirection: widget.options.scrollDirection,
|
||||
pageSnapping: widget.options.pageSnapping,
|
||||
controller: carouselState!.pageController,
|
||||
reverse: widget.options.reverse,
|
||||
itemCount: widget.options.enableInfiniteScroll ? null : widget.itemCount,
|
||||
key: widget.options.pageViewKey,
|
||||
onPageChanged: (int index) {
|
||||
int currentPage = getRealIndex(index + carouselState!.initialPage,
|
||||
carouselState!.realPage, widget.itemCount);
|
||||
if (widget.options.onPageChanged != null) {
|
||||
widget.options.onPageChanged!(currentPage, mode);
|
||||
}
|
||||
},
|
||||
itemBuilder: (BuildContext context, int idx) {
|
||||
final int index = getRealIndex(idx + carouselState!.initialPage,
|
||||
carouselState!.realPage, widget.itemCount);
|
||||
|
||||
return AnimatedBuilder(
|
||||
animation: carouselState!.pageController!,
|
||||
child: (widget.items != null)
|
||||
? (widget.items!.length > 0 ? widget.items![index] : Container())
|
||||
: widget.itemBuilder!(context, index, idx),
|
||||
builder: (BuildContext context, child) {
|
||||
double distortionValue = 1.0;
|
||||
// if `enlargeCenterPage` is true, we must calculate the carousel item's height
|
||||
// to display the visual effect
|
||||
double itemOffset = 0;
|
||||
if (widget.options.enlargeCenterPage != null &&
|
||||
widget.options.enlargeCenterPage == true) {
|
||||
// pageController.page can only be accessed after the first build,
|
||||
// so in the first build we calculate the itemoffset manually
|
||||
var position = carouselState?.pageController?.position;
|
||||
if (position != null &&
|
||||
position.hasPixels &&
|
||||
position.hasContentDimensions) {
|
||||
var _page = carouselState?.pageController?.page;
|
||||
if (_page != null) {
|
||||
itemOffset = _page - idx;
|
||||
}
|
||||
} else {
|
||||
BuildContext storageContext = carouselState!
|
||||
.pageController!.position.context.storageContext;
|
||||
final double? previousSavedPosition =
|
||||
PageStorage.of(storageContext)?.readState(storageContext)
|
||||
as double?;
|
||||
if (previousSavedPosition != null) {
|
||||
itemOffset = previousSavedPosition - idx.toDouble();
|
||||
} else {
|
||||
itemOffset =
|
||||
carouselState!.realPage.toDouble() - idx.toDouble();
|
||||
}
|
||||
}
|
||||
|
||||
final double enlargeFactor =
|
||||
options.enlargeFactor.clamp(0.0, 1.0);
|
||||
final num distortionRatio =
|
||||
(1 - (itemOffset.abs() * enlargeFactor)).clamp(0.0, 1.0);
|
||||
distortionValue =
|
||||
Curves.easeOut.transform(distortionRatio as double);
|
||||
}
|
||||
|
||||
final double height = widget.options.height ??
|
||||
MediaQuery.of(context).size.width *
|
||||
(1 / widget.options.aspectRatio);
|
||||
|
||||
if (widget.options.scrollDirection == Axis.horizontal) {
|
||||
return getCenterWrapper(getEnlargeWrapper(child,
|
||||
height: distortionValue * height,
|
||||
scale: distortionValue,
|
||||
itemOffset: itemOffset));
|
||||
} else {
|
||||
return getCenterWrapper(getEnlargeWrapper(child,
|
||||
width: distortionValue * MediaQuery.of(context).size.width,
|
||||
scale: distortionValue,
|
||||
itemOffset: itemOffset));
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
class _MultipleGestureRecognizer extends PanGestureRecognizer {}
|
||||
43
lib/Components/Carousel/carousel_state.dart
Normal file
@ -0,0 +1,43 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'carousel_options.dart';
|
||||
|
||||
class CarouselState {
|
||||
/// The [CarouselOptions] to create this state
|
||||
CarouselOptions options;
|
||||
|
||||
/// [pageController] is created using the properties passed to the constructor
|
||||
/// and can be used to control the [PageView] it is passed to.
|
||||
PageController? pageController;
|
||||
|
||||
/// The actual index of the [PageView].
|
||||
///
|
||||
/// This value can be ignored unless you know the carousel will be scrolled
|
||||
/// backwards more then 10000 pages.
|
||||
/// Defaults to 10000 to simulate infinite backwards scrolling.
|
||||
int realPage = 10000;
|
||||
|
||||
/// The initial index of the [PageView] on [CarouselSlider] init.
|
||||
///
|
||||
int initialPage = 0;
|
||||
|
||||
/// The widgets count that should be shown at carousel
|
||||
int? itemCount;
|
||||
|
||||
/// Will be called when using pageController to go to next page or
|
||||
/// previous page. It will clear the autoPlay timer.
|
||||
/// Internal use only
|
||||
Function onResetTimer;
|
||||
|
||||
/// Will be called when using pageController to go to next page or
|
||||
/// previous page. It will restart the autoPlay timer.
|
||||
/// Internal use only
|
||||
Function onResumeTimer;
|
||||
|
||||
/// The callback to set the Reason Carousel changed
|
||||
Function(CarouselPageChangedReason) changeMode;
|
||||
|
||||
CarouselState(
|
||||
this.options, this.onResetTimer, this.onResumeTimer, this.changeMode);
|
||||
}
|
||||
23
lib/Components/Carousel/utils.dart
Normal file
@ -0,0 +1,23 @@
|
||||
/// Converts an index of a set size to the corresponding index of a collection of another size
|
||||
/// as if they were circular.
|
||||
///
|
||||
/// Takes a [position] from collection Foo, a [base] from where Foo's index originated
|
||||
/// and the [length] of a second collection Baa, for which the correlating index is sought.
|
||||
///
|
||||
/// For example; We have a Carousel of 10000(simulating infinity) but only 6 images.
|
||||
/// We need to repeat the images to give the illusion of a never ending stream.
|
||||
/// By calling _getRealIndex with position and base we get an offset.
|
||||
/// This offset modulo our length, 6, will return a number between 0 and 5, which represent the image
|
||||
/// to be placed in the given position.
|
||||
int getRealIndex(int position, int base, int? length) {
|
||||
final int offset = position - base;
|
||||
return remainder(offset, length);
|
||||
}
|
||||
|
||||
/// Returns the remainder of the modulo operation [input] % [source], and adjust it for
|
||||
/// negative values.
|
||||
int remainder(int input, int? source) {
|
||||
if (source == 0) return 0;
|
||||
final int result = input % source!;
|
||||
return result < 0 ? source + result : result;
|
||||
}
|
||||
@ -5,6 +5,7 @@ import 'package:mymuseum_visitapp/Components/LanguageSelection.dart';
|
||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||
import 'package:mymuseum_visitapp/Screens/Home/home.dart';
|
||||
import 'package:mymuseum_visitapp/app_context.dart';
|
||||
import 'package:mymuseum_visitapp/constants.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class CustomAppBar extends StatefulWidget implements PreferredSizeWidget {
|
||||
@ -30,6 +31,7 @@ class _CustomAppBarState extends State<CustomAppBar> {
|
||||
|
||||
//final notchInset = MediaQuery.of(context).padding;
|
||||
return AppBar(
|
||||
shadowColor: kMainColor1,
|
||||
title:
|
||||
InkWell(
|
||||
onLongPress: () {
|
||||
@ -43,11 +45,11 @@ class _CustomAppBarState extends State<CustomAppBar> {
|
||||
), context: context
|
||||
);
|
||||
},
|
||||
child: HtmlWidget(widget.title),
|
||||
child: HtmlWidget(widget.title, textStyle: TextStyle(color: Colors.white),),
|
||||
),
|
||||
centerTitle: true,
|
||||
leading: widget.isHomeButton ? IconButton(
|
||||
icon: const Icon(Icons.home),
|
||||
icon: const Icon(Icons.home, color: Colors.white),
|
||||
onPressed: () {
|
||||
// Set new State
|
||||
setState(() {
|
||||
@ -95,9 +97,8 @@ class _CustomAppBarState extends State<CustomAppBar> {
|
||||
Color(0xFF7633B8),
|
||||
Color(0xFF6528B6),
|
||||
Color(0xFF6025B6)*/
|
||||
Color(0xFF306bac),
|
||||
Color(0xFF308aae),
|
||||
Color(0xFF309cb0),
|
||||
kMainColor1,
|
||||
kMainColor2,
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@ -41,7 +41,7 @@ class _LoadingState extends State<Loading> with TickerProviderStateMixin {
|
||||
return Center(
|
||||
child: RotationTransition(
|
||||
turns: Tween(begin: 0.0, end: 3.0).animate(_controller),
|
||||
child: Icon(Icons.museum_outlined, color: kBlue2, size: size.height*0.05),
|
||||
child: Icon(Icons.museum_outlined, color: kMainColor2, size: size.height*0.05),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -23,17 +23,16 @@ class _ScannerBoutonState extends State<ScannerBouton> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
return InkWell(
|
||||
onTap: _onItemTapped,
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: kMainColor1,
|
||||
),
|
||||
height: 85.0,
|
||||
width: 85.0,
|
||||
child: FittedBox(
|
||||
child: FloatingActionButton(
|
||||
heroTag: "scanner",
|
||||
onPressed: _onItemTapped,
|
||||
tooltip: 'Scanner',
|
||||
backgroundColor: kBlue1,
|
||||
child: const Icon(Icons.qr_code_scanner),
|
||||
),
|
||||
child: const Icon(Icons.qr_code_scanner, color: Colors.white, size: 40),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ class _ScannerDialogState extends State<ScannerDialog> {
|
||||
height: 45,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
margin: const EdgeInsets.all(8),
|
||||
@ -85,7 +85,7 @@ class _ScannerDialogState extends State<ScannerDialog> {
|
||||
height: 45,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
margin: const EdgeInsets.all(8),
|
||||
@ -120,7 +120,7 @@ class _ScannerDialogState extends State<ScannerDialog> {
|
||||
key: qrKey,
|
||||
onQRViewCreated: _onQRViewCreated,
|
||||
overlay: QrScannerOverlayShape(
|
||||
borderColor: kBlue1,
|
||||
borderColor: kMainColor1,
|
||||
borderRadius: 10,
|
||||
borderLength: 25,
|
||||
borderWidth: 5,
|
||||
@ -140,30 +140,52 @@ class _ScannerDialogState extends State<ScannerDialog> {
|
||||
controller.scannedDataStream.listen((scanData) {
|
||||
setState(() {
|
||||
result = scanData;
|
||||
|
||||
var code = result == null ? "" : result!.code.toString();
|
||||
if(result!.format == BarcodeFormat.qrcode) {
|
||||
controller.pauseCamera();
|
||||
|
||||
RegExp regExp = RegExp(r'^(?:https:\/\/web\.myinfomate\.be\/([^\/]+)\/([^\/]+)\/([^\/]+)|([^\/]+))$');
|
||||
var match = regExp.firstMatch(code);
|
||||
String? instanceId;
|
||||
String? configurationId;
|
||||
String? sectionId;
|
||||
|
||||
if (match != null) {
|
||||
instanceId = match.group(1);
|
||||
configurationId = match.group(2);
|
||||
sectionId = match.group(3) ?? match.group(4);
|
||||
|
||||
print('InstanceId: $instanceId');
|
||||
print('ConfigurationId: $configurationId');
|
||||
print('SectionId: $sectionId');
|
||||
} else {
|
||||
print('L\'URL ne correspond pas au format attendu.');
|
||||
}
|
||||
|
||||
|
||||
//print("QR CODE FOUND");
|
||||
/*ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('QR CODE FOUND - ${code.toString()}')),
|
||||
);*/
|
||||
|
||||
VisitAppContext visitAppContext = widget.appContext!.getContext();
|
||||
if(!visitAppContext.sectionIds!.contains(code)) {
|
||||
|
||||
if(!visitAppContext.sectionIds!.contains(sectionId) || sectionId == null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(TranslationHelper.getFromLocale('invalidQRCode', widget.appContext!.getContext())), backgroundColor: kBlue2),
|
||||
SnackBar(content: Text(TranslationHelper.getFromLocale('invalidQRCode', widget.appContext!.getContext())), backgroundColor: kMainColor2),
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
|
||||
} else {
|
||||
SectionDTO section = visitAppContext.currentSections!.firstWhere((cs) => cs!.id == code)!;
|
||||
SectionDTO section = visitAppContext.currentSections!.firstWhere((cs) => cs!.id == sectionId)!;
|
||||
switch(section.type) {
|
||||
case SectionType.Article:
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
return ArticlePage(visitAppContextIn: visitAppContext, articleId: code);
|
||||
return ArticlePage(visitAppContextIn: visitAppContext, articleId: section.id!);
|
||||
},
|
||||
),
|
||||
);
|
||||
@ -173,7 +195,7 @@ class _ScannerDialogState extends State<ScannerDialog> {
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
return QuizzPage(visitAppContextIn: visitAppContext, sectionId: code);
|
||||
return QuizzPage(visitAppContextIn: visitAppContext, sectionId: section.id!);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
@ -10,7 +10,7 @@ import 'package:mymuseum_visitapp/app_context.dart';
|
||||
import 'package:mymuseum_visitapp/constants.dart';
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
|
||||
void showImagePopup(ImageDTO imageDTO, ResourceModel resourceModel, AppContext appContext, BuildContext context, Size size) {
|
||||
void showImagePopup(ContentDTO contentDTO, ResourceModel resourceModel, AppContext appContext, BuildContext context, Size size) {
|
||||
showDialog(
|
||||
builder: (BuildContext context) => AlertDialog(
|
||||
shape: const RoundedRectangleBorder(
|
||||
@ -19,11 +19,11 @@ void showImagePopup(ImageDTO imageDTO, ResourceModel resourceModel, AppContext a
|
||||
content: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
if(TranslationHelper.get(imageDTO.title, appContext.getContext()).isNotEmpty)
|
||||
if(TranslationHelper.get(contentDTO.title, appContext.getContext()).isNotEmpty)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 8.0, left:8.0, right: 8.0),
|
||||
child: HtmlWidget(
|
||||
TranslationHelper.get(imageDTO.title, appContext.getContext()),
|
||||
TranslationHelper.get(contentDTO.title, appContext.getContext()),
|
||||
textStyle: const TextStyle(fontSize: kArticleContentSize, fontWeight: FontWeight.w400)),
|
||||
),
|
||||
SizedBox(
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import 'dart:convert';
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/ShowImagePopup.dart';
|
||||
@ -11,9 +11,9 @@ import 'package:provider/provider.dart';
|
||||
|
||||
class SliderImagesWidget extends StatefulWidget {
|
||||
final List<ResourceModel?> resources;
|
||||
final List<ImageDTO?> imagesDTO;
|
||||
final List<ContentDTO?> contentsDTO;
|
||||
final double height;
|
||||
SliderImagesWidget({required this.resources, required this.height, required this.imagesDTO});
|
||||
SliderImagesWidget({required this.resources, required this.height, required this.contentsDTO});
|
||||
|
||||
@override
|
||||
_SliderImagesWidget createState() => _SliderImagesWidget();
|
||||
@ -21,12 +21,12 @@ class SliderImagesWidget extends StatefulWidget {
|
||||
|
||||
class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
List<ResourceModel?> resourcesInWidget = [];
|
||||
late CarouselController? sliderController;
|
||||
late cs.CarouselController? sliderController;
|
||||
final ValueNotifier<int> currentIndex = ValueNotifier<int>(1);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
sliderController = CarouselController();
|
||||
sliderController = cs.CarouselController();
|
||||
resourcesInWidget = widget.resources;
|
||||
super.initState();
|
||||
}
|
||||
@ -52,10 +52,10 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
if(resourcesInWidget.isNotEmpty)
|
||||
CarouselSlider(
|
||||
cs.CarouselSlider(
|
||||
carouselController: sliderController,
|
||||
options: CarouselOptions(
|
||||
onPageChanged: (int index, CarouselPageChangedReason reason) {
|
||||
options: cs.CarouselOptions(
|
||||
onPageChanged: (int index, cs.CarouselPageChangedReason reason) {
|
||||
//setState(() {
|
||||
//print("SET STATE");
|
||||
currentIndex.value = index + 1;
|
||||
@ -73,7 +73,7 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
padding: const EdgeInsets.only(top: 5.0),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
showImagePopup(widget.imagesDTO[currentIndex.value-1]!, i!, appContext, context, size);
|
||||
showImagePopup(widget.contentsDTO[currentIndex.value-1]!, i!, appContext, context, size);
|
||||
},
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
@ -88,7 +88,7 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
}
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
value: loadingProgress.expectedTotalBytes != null
|
||||
? loadingProgress.cumulativeBytesLoaded /
|
||||
loadingProgress.expectedTotalBytes!
|
||||
@ -126,7 +126,7 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
child: const Icon(
|
||||
Icons.chevron_right,
|
||||
size: 45,
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
),
|
||||
)
|
||||
),
|
||||
@ -143,7 +143,7 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
child: const Icon(
|
||||
Icons.chevron_left,
|
||||
size: 45,
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
),
|
||||
)
|
||||
),
|
||||
@ -159,7 +159,7 @@ class _SliderImagesWidget extends State<SliderImagesWidget> {
|
||||
builder: (context, value, _) {
|
||||
return Text(
|
||||
currentIndex.value.toString()+'/'+resourcesInWidget.length.toString(),
|
||||
style: const TextStyle(fontSize: kArticleContentSize, fontWeight: FontWeight.w500, color: kBlue2),
|
||||
style: const TextStyle(fontSize: kArticleContentSize, fontWeight: FontWeight.w500, color: kMainColor2),
|
||||
);
|
||||
},
|
||||
)
|
||||
|
||||
110
lib/Components/loading_common.dart
Normal file
@ -0,0 +1,110 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||
import 'package:mymuseum_visitapp/app_context.dart';
|
||||
import 'package:mymuseum_visitapp/constants.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class LoadingCommon extends StatefulWidget {
|
||||
const LoadingCommon({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<LoadingCommon> createState() => _LoadingCommonState();
|
||||
}
|
||||
|
||||
class _LoadingCommonState extends State<LoadingCommon> with TickerProviderStateMixin {
|
||||
AnimationController? _controller;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_controller = AnimationController(
|
||||
duration: const Duration(milliseconds: 5000),
|
||||
vsync: this,
|
||||
)..repeat();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller!.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final appContext = Provider.of<AppContext>(context);
|
||||
VisitAppContext visitAppContext = appContext.getContext();
|
||||
|
||||
Size size = MediaQuery.of(context).size;
|
||||
_controller!.forward(from: 0.0);
|
||||
_controller!.addListener(() {
|
||||
if (_controller!.isCompleted) {
|
||||
_controller!.reverse();
|
||||
}
|
||||
if(_controller!.isDismissed){
|
||||
_controller!.forward();
|
||||
}
|
||||
});
|
||||
|
||||
var primaryColor = visitAppContext.configuration != null ? visitAppContext.configuration!.primaryColor != null ? new Color(int.parse(visitAppContext.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)) : kMainColor1 : kMainColor1;
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
height: size.height * 0.1,
|
||||
child: RotationTransition(
|
||||
turns: Tween(begin: 0.0, end: 3.0).animate(_controller!),
|
||||
child: visitAppContext.configuration != null && visitAppContext.configuration!.loaderImageUrl != null ?
|
||||
//Image.network(tabletAppContext.configuration!.loaderImageUrl!)
|
||||
// TODO Replace by CustomCacheResource..
|
||||
FutureBuilder<File?>(
|
||||
future: _checkIfLocalResourceExists(visitAppContext, visitAppContext.configuration!.loaderImageId!),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
// Loader ou indicateur de chargement pendant la vérification
|
||||
return const CircularProgressIndicator();
|
||||
} else if (snapshot.hasError || snapshot.data == null) {
|
||||
// Si la ressource locale n'existe pas ou s'il y a une erreur
|
||||
print("not a local loader succck");
|
||||
return CachedNetworkImage(
|
||||
imageUrl: visitAppContext.configuration!.loaderImageUrl!,
|
||||
progressIndicatorBuilder: (context, url, downloadProgress) => CircularProgressIndicator(value: downloadProgress.progress, color: primaryColor),
|
||||
errorWidget: (context, url, error) => const Icon(Icons.error),
|
||||
);
|
||||
} else {
|
||||
print("Its a local loaaader yeah");
|
||||
return Image.file(
|
||||
snapshot.data!,
|
||||
);
|
||||
}
|
||||
},
|
||||
)
|
||||
: Icon(Icons.museum_outlined, color: kMainColor2, size: size.height*0.1),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<File?> _checkIfLocalResourceExists(VisitAppContext visitAppContext, String resourceId) async {
|
||||
try {
|
||||
Directory? appDocumentsDirectory = Platform.isIOS ? await getApplicationDocumentsDirectory() : await getDownloadsDirectory();
|
||||
String localPath = appDocumentsDirectory!.path;
|
||||
Directory configurationDirectory = Directory('$localPath/${visitAppContext.configuration!.id}');
|
||||
List<FileSystemEntity> fileList = configurationDirectory.listSync();
|
||||
|
||||
if(fileList.any((fileL) => fileL.uri.pathSegments.last.contains(resourceId))) {
|
||||
File file = File(fileList.firstWhere((fileL) => fileL.uri.pathSegments.last.contains(resourceId)).path);
|
||||
return file;
|
||||
}
|
||||
} catch(e) {
|
||||
print("ERROR _checkIfLocalResourceExists CachedCustomResource");
|
||||
print(e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@ -12,6 +12,14 @@ class TranslationHelper {
|
||||
}
|
||||
}
|
||||
|
||||
static String getWithResource(List<TranslationAndResourceDTO>? translationAndResourceDTO, VisitAppContext visitAppContext) {
|
||||
try {
|
||||
return translationAndResourceDTO!.where((element) => element.language == visitAppContext.language).first.value!;
|
||||
} catch (_) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
static String getFromLocale(String valueToGet, VisitAppContext visitAppContext) {
|
||||
try {
|
||||
return translations.where((element) => element.language == visitAppContext.language).first.data![valueToGet]!;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:manager_api/api.dart';
|
||||
|
||||
class ResponseSubDTO {
|
||||
List<TranslationDTO>? label;
|
||||
List<TranslationAndResourceDTO>? label;
|
||||
bool? isGood;
|
||||
int? order;
|
||||
|
||||
@ -25,14 +25,14 @@ class ResponseSubDTO {
|
||||
}
|
||||
|
||||
class QuestionSubDTO {
|
||||
List<TranslationDTO>? label;
|
||||
List<TranslationAndResourceDTO>? label;
|
||||
List<ResponseSubDTO>? responsesSubDTO;
|
||||
int? chosen;
|
||||
String? resourceId;
|
||||
String? source_;
|
||||
String? resourceUrl;
|
||||
int? order;
|
||||
|
||||
QuestionSubDTO({this.label, this.responsesSubDTO, this.chosen, this.resourceId, this.source_, this.order});
|
||||
QuestionSubDTO({this.label, this.responsesSubDTO, this.chosen, this.resourceId, this.resourceUrl, this.order});
|
||||
|
||||
List<QuestionSubDTO> fromJSON(List<QuestionDTO> questionsDTO) {
|
||||
List<QuestionSubDTO> questionSubDTO = <QuestionSubDTO>[];
|
||||
@ -42,8 +42,8 @@ class QuestionSubDTO {
|
||||
chosen: null,
|
||||
label: questionDTO.label,
|
||||
responsesSubDTO: ResponseSubDTO().fromJSON(questionDTO.responses!),
|
||||
resourceId: questionDTO.resourceId,
|
||||
source_: questionDTO.source_,
|
||||
resourceId: questionDTO.imageBackgroundResourceId,
|
||||
resourceUrl: questionDTO.imageBackgroundResourceUrl,
|
||||
order: questionDTO.order,
|
||||
));
|
||||
}
|
||||
|
||||
@ -7,7 +7,9 @@ import 'package:mymuseum_visitapp/Models/resourceModel.dart';
|
||||
class VisitAppContext with ChangeNotifier{
|
||||
String? id = "";
|
||||
String? language = "";
|
||||
String? instanceId = "63514fd67ed8c735aaa4b8f1"; // Fort de Saint-Héribert instance id : 633ee379d9405f32f166f047 // 63514fd67ed8c735aaa4b8f1 Mymuseum test
|
||||
String? instanceId = "63514fd67ed8c735aaa4b8f2"; // 63514fd67ed8c735aaa4b8f2 MyInfoMate test instance -- Fort de Saint-Héribert Mymuseum instance id : 633ee379d9405f32f166f047 // 63514fd67ed8c735aaa4b8f1 Mymuseum test
|
||||
|
||||
|
||||
List<ConfigurationDTO>? configurations;
|
||||
ConfigurationDTO? configuration;
|
||||
List<String?>? sectionIds; // Use to valid QR code found
|
||||
|
||||
@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/CustomAppBar.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Components/SliderImages.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||
@ -115,7 +115,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
return const Loading();
|
||||
return const LoadingCommon();
|
||||
}
|
||||
}
|
||||
),
|
||||
@ -124,7 +124,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
builder: (context, AsyncSnapshot<dynamic> snapshot) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(right: 0, top: 0), //size.height*0.1
|
||||
child: audioResourceModel != null ? AudioPlayerFloatingContainer(audioBytes: audiobytes, isAuto: articleDTO!.isReadAudioAuto!) : null,
|
||||
child: audioResourceModel != null && audioResourceModel!.source != null ? AudioPlayerFloatingContainer(file: null, audioBytes: null, resourceURl: audioResourceModel!.source!, isAuto: articleDTO!.isReadAudioAuto!) : null,
|
||||
);
|
||||
}
|
||||
),
|
||||
@ -142,7 +142,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
width: 0.5,
|
||||
),
|
||||
color: Colors.white,
|
||||
@ -153,7 +153,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: SliderImagesWidget(
|
||||
resources: resourcesModel,
|
||||
height: size.height * 0.29,
|
||||
imagesDTO: articleDTO!.images!,
|
||||
contentsDTO: articleDTO!.contents!,
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -167,7 +167,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
width: 0.5,
|
||||
),
|
||||
color: Colors.white,
|
||||
@ -178,7 +178,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: SliderImagesWidget(
|
||||
resources: resourcesModel,
|
||||
height: size.height * 0.29,
|
||||
imagesDTO: articleDTO!.images!,
|
||||
contentsDTO: articleDTO!.contents!,
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -198,7 +198,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
width: 0.5,
|
||||
),
|
||||
color: Colors.white,
|
||||
@ -231,7 +231,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
width: 0.5,
|
||||
),
|
||||
color: Colors.white,
|
||||
@ -328,9 +328,12 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
ResourceDTO? resourceDTO = await client.resourceApi!.resourceGetDetail(audioIdArticle.first.value!);
|
||||
// ONLINE
|
||||
ResourceModel? resourceAudioOnline = await ApiService.downloadAudio(client, audioIdArticle.first.value!);
|
||||
if(resourceAudioOnline != null) {
|
||||
resourceAudioOnline.source = resourceDTO!.url;
|
||||
audioResourceModel = resourceAudioOnline;
|
||||
Uint8List base64String = base64Decode(resourceAudioOnline.data!);
|
||||
audiobytes = base64String;
|
||||
@ -341,8 +344,8 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
}
|
||||
}
|
||||
|
||||
if(articleDTO!.images!.isNotEmpty && !isAudio) {
|
||||
for (var image in articleDTO!.images!) {
|
||||
if(articleDTO!.contents!.isNotEmpty && !isAudio) {
|
||||
for (var image in articleDTO!.contents!) {
|
||||
if(image.resourceId != null) {
|
||||
if(isConfigOffline)
|
||||
{
|
||||
@ -360,7 +363,7 @@ class _ArticlePageState extends State<ArticlePage> {
|
||||
// Not needed as it's in display logic
|
||||
//ResourceModel? resourceImageOnline = await ApiService.downloadImage(client, image);
|
||||
//if(resourceImageOnline != null) {
|
||||
resourcesModel.add(ResourceModel(id: image.resourceId, source: image.source_, type: ResourceType.Image));
|
||||
resourcesModel.add(ResourceModel(id: image.resourceId, source: image.resourceUrl, type: ResourceType.Image));
|
||||
/*} else {
|
||||
print("EMPTY resourcesModel online - audio");
|
||||
}*/
|
||||
|
||||
@ -1,19 +1,21 @@
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
//import 'package:audioplayers/audioplayers.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||
import 'package:mymuseum_visitapp/app_context.dart';
|
||||
import 'package:mymuseum_visitapp/constants.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:just_audio_cache/just_audio_cache.dart';
|
||||
|
||||
|
||||
class AudioPlayerFloatingContainer extends StatefulWidget {
|
||||
const AudioPlayerFloatingContainer({Key? key, required this.audioBytes, required this.isAuto}) : super(key: key);
|
||||
const AudioPlayerFloatingContainer({Key? key, required this.file, required this.audioBytes, required this.resourceURl, required this.isAuto}) : super(key: key);
|
||||
|
||||
final Uint8List audioBytes;
|
||||
final File? file;
|
||||
final Uint8List? audioBytes;
|
||||
final String resourceURl;
|
||||
final bool isAuto;
|
||||
|
||||
@override
|
||||
@ -22,7 +24,7 @@ class AudioPlayerFloatingContainer extends StatefulWidget {
|
||||
|
||||
class _AudioPlayerFloatingContainerState extends State<AudioPlayerFloatingContainer> {
|
||||
AudioPlayer player = AudioPlayer();
|
||||
late Uint8List audiobytes;
|
||||
Uint8List? audiobytes = null;
|
||||
bool isplaying = false;
|
||||
bool audioplayed = false;
|
||||
int currentpos = 0;
|
||||
@ -32,20 +34,27 @@ class _AudioPlayerFloatingContainerState extends State<AudioPlayerFloatingContai
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
//print("IN INITSTATE AUDDDIOOOO");
|
||||
Future.delayed(Duration.zero, () async {
|
||||
if(widget.audioBytes != null) {
|
||||
audiobytes = widget.audioBytes!;
|
||||
}
|
||||
|
||||
if(widget.file != null) {
|
||||
audiobytes = await fileToUint8List(widget.file!);
|
||||
}
|
||||
|
||||
audiobytes = widget.audioBytes;
|
||||
player.durationStream.listen((Duration? d) { //get the duration of audio
|
||||
maxduration = d!.inSeconds;
|
||||
if(d != null) {
|
||||
maxduration = d.inSeconds;
|
||||
durationAudio = d;
|
||||
print("YOULOUUU duration");
|
||||
print(d);
|
||||
}
|
||||
});
|
||||
|
||||
//player.bufferedPositionStream
|
||||
|
||||
player.positionStream.listen((event) {
|
||||
if(event != null && durationAudio != null) {
|
||||
if(durationAudio != null) {
|
||||
|
||||
currentpos = event.inMilliseconds; //get the current position of playing audio
|
||||
|
||||
@ -99,9 +108,17 @@ class _AudioPlayerFloatingContainerState extends State<AudioPlayerFloatingContai
|
||||
});
|
||||
});*/
|
||||
|
||||
if(audiobytes != null) {
|
||||
print("GOT AUDIOBYYYTES - LOCALLY SOSO");
|
||||
await player.setAudioSource(LoadedSource(audiobytes!));
|
||||
} else {
|
||||
print("GET SOUND BY URL");
|
||||
await player.dynamicSet(url: widget.resourceURl);
|
||||
}
|
||||
|
||||
if(widget.isAuto) {
|
||||
//player.play(BytesSource(audiobytes));
|
||||
await player.setAudioSource(LoadedSource(audiobytes));
|
||||
//
|
||||
player.play();
|
||||
setState(() {
|
||||
isplaying = true;
|
||||
@ -119,18 +136,22 @@ class _AudioPlayerFloatingContainerState extends State<AudioPlayerFloatingContai
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<Uint8List> fileToUint8List(File file) async {
|
||||
List<int> bytes = await file.readAsBytes();
|
||||
return Uint8List.fromList(bytes);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final appContext = Provider.of<AppContext>(context);
|
||||
|
||||
VisitAppContext visitAppContext = appContext.getContext();
|
||||
|
||||
return FloatingActionButton(
|
||||
backgroundColor: kBlue1.withOpacity(0.7),
|
||||
backgroundColor: kMainColor1,
|
||||
onPressed: () async {
|
||||
print("TODO");
|
||||
if(!isplaying && !audioplayed){
|
||||
//player.play(BytesSource(audiobytes));
|
||||
await player.setAudioSource(LoadedSource(audiobytes));
|
||||
//await player.setUrl(widget.resourceURl);
|
||||
player.play();
|
||||
setState(() {
|
||||
isplaying = true;
|
||||
|
||||
@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/LanguageSelection.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||
import 'package:mymuseum_visitapp/Screens/Visit/visit.dart';
|
||||
@ -66,7 +66,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
SnackBar(
|
||||
content: Text(TranslationHelper.getFromLocale(
|
||||
"languageNotSupported", appContext.getContext())),
|
||||
backgroundColor: kBlue2),
|
||||
backgroundColor: kMainColor2),
|
||||
);
|
||||
} else {
|
||||
// Update context
|
||||
@ -88,7 +88,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
SnackBar(
|
||||
content: Text(TranslationHelper.getFromLocale(
|
||||
"visitDownloadWarning", appContext.getContext())),
|
||||
backgroundColor: kBlue2),
|
||||
backgroundColor: kMainColor2),
|
||||
);
|
||||
} else {
|
||||
// Online mode
|
||||
@ -98,7 +98,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
SnackBar(
|
||||
content: Text(TranslationHelper.getFromLocale(
|
||||
"languageNotSupported", appContext.getContext())),
|
||||
backgroundColor: kBlue2),
|
||||
backgroundColor: kMainColor2),
|
||||
);
|
||||
} else {
|
||||
visitAppContext.configuration = configurations[index];
|
||||
@ -161,7 +161,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
return Center(
|
||||
child:
|
||||
CircularProgressIndicator(
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
value: loadingProgress
|
||||
.expectedTotalBytes !=
|
||||
null
|
||||
@ -184,7 +184,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
height: size.height * 0.15,
|
||||
child: const Loading()));
|
||||
child: const LoadingCommon()));
|
||||
}
|
||||
}),
|
||||
),
|
||||
@ -220,7 +220,7 @@ class _ConfigurationsListState extends State<ConfigurationsList> {
|
||||
height: 45,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
margin: const EdgeInsets.all(8),
|
||||
@ -361,12 +361,12 @@ boxDecoration(ConfigurationDTO configuration, bool isSelected) {
|
||||
shape: BoxShape.rectangle,
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
border: Border.all(
|
||||
color: kBlue0.withOpacity(0.35),
|
||||
color: kMainColor0.withOpacity(0.35),
|
||||
width: 0.2,
|
||||
),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: kBlue0.withOpacity(0.35),
|
||||
color: kBackgroundGrey.withOpacity(0.35),
|
||||
//spreadRadius: 0.15,
|
||||
blurRadius: 27,
|
||||
offset: const Offset(0, 15), // changes position of shadow
|
||||
|
||||
@ -6,7 +6,7 @@ import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/CustomAppBar.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/modelsHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/networkCheck.dart';
|
||||
@ -78,7 +78,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
|
||||
return Center(
|
||||
child: Container(
|
||||
height: size.height * 0.15,
|
||||
child: Loading()
|
||||
child: LoadingCommon()
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -126,7 +126,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
|
||||
|
||||
if(!isOnline) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(TranslationHelper.getFromLocale("noInternet", appContext.getContext())), backgroundColor: kBlue2),
|
||||
SnackBar(content: Text(TranslationHelper.getFromLocale("noInternet", appContext.getContext())), backgroundColor: kMainColor2),
|
||||
);
|
||||
|
||||
// GET ALL SECTIONIDS FOR ALL CONFIGURATION (OFFLINE)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs;
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||
@ -23,7 +23,7 @@ class QuestionsListWidget extends StatefulWidget {
|
||||
|
||||
class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
List<QuestionSubDTO> _questionsSubDTO = <QuestionSubDTO>[];
|
||||
CarouselController? sliderController;
|
||||
cs.CarouselController? sliderController;
|
||||
int currentIndex = 1;
|
||||
|
||||
bool kIsWeb = false;
|
||||
@ -31,7 +31,7 @@ class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
sliderController = CarouselController();
|
||||
sliderController = cs.CarouselController();
|
||||
_questionsSubDTO = widget.questionsSubDTO!;
|
||||
}
|
||||
|
||||
@ -69,10 +69,10 @@ class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
if(_questionsSubDTO.isNotEmpty)
|
||||
CarouselSlider(
|
||||
cs.CarouselSlider(
|
||||
carouselController: sliderController,
|
||||
options: CarouselOptions(
|
||||
onPageChanged: (int index, CarouselPageChangedReason reason) {
|
||||
options: cs.CarouselOptions(
|
||||
onPageChanged: (int index, cs.CarouselPageChangedReason reason) {
|
||||
setState(() {
|
||||
currentIndex = index + 1;
|
||||
});
|
||||
@ -95,11 +95,11 @@ class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
//color: Colors.orange, //kBackgroundLight
|
||||
shape: BoxShape.rectangle,
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
image: i.source_ != null ? DecorationImage(
|
||||
image: i.resourceUrl != null ? DecorationImage(
|
||||
fit: BoxFit.cover,
|
||||
opacity: 0.35,
|
||||
image: NetworkImage(
|
||||
i.source_!,
|
||||
i.resourceUrl!,
|
||||
),
|
||||
): null,
|
||||
boxShadow: const [
|
||||
@ -143,7 +143,7 @@ class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(2.5),
|
||||
child: HtmlWidget(
|
||||
TranslationHelper.get(i.label, appContext.getContext() as VisitAppContext),
|
||||
TranslationHelper.getWithResource(i.label, appContext.getContext() as VisitAppContext),
|
||||
//textAlign: TextAlign.center,
|
||||
customStylesBuilder: (element) {
|
||||
return {'text-align': 'center'};
|
||||
@ -211,14 +211,14 @@ class _QuestionsListWidget extends State<QuestionsListWidget> {
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
child: HtmlWidget(
|
||||
TranslationHelper.get(i.responsesSubDTO![index].label, appContext.getContext() as VisitAppContext),
|
||||
TranslationHelper.getWithResource(i.responsesSubDTO![index].label, appContext.getContext() as VisitAppContext),
|
||||
//textAlign: TextAlign.center,
|
||||
customStylesBuilder: (element) {
|
||||
return {'text-align': 'center'};
|
||||
},
|
||||
textStyle: TextStyle(fontSize: kDescriptionSize, color: i.chosen == index ? Colors.white : Colors.black)),
|
||||
decoration: BoxDecoration(
|
||||
color: !widget.isShowResponse ? i.chosen == index ? kTestSecondColor : kBackgroundLight : i.responsesSubDTO![index].isGood! ? kGreen : i.chosen == index ? kTextRed : kBackgroundLight,
|
||||
color: !widget.isShowResponse ? i.chosen == index ? kMainColor1 : kBackgroundLight : i.responsesSubDTO![index].isGood! ? kGreen : i.chosen == index ? kTextRed : kBackgroundLight,
|
||||
shape: BoxShape.rectangle,
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
boxShadow: const [
|
||||
|
||||
@ -2,12 +2,13 @@ import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs;
|
||||
//import 'package:confetti/confetti.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/CustomAppBar.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Components/rounded_button.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||
@ -105,7 +106,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
}
|
||||
}
|
||||
log("goodResponses =" + goodResponses.toString());
|
||||
QuizzDTOBadLevel levelToShow = QuizzDTOBadLevel();
|
||||
LevelDTO levelToShow = LevelDTO();
|
||||
var test = goodResponses/quizzDTO!.questions!.length;
|
||||
|
||||
if((0 == test || test < 0.25) && quizzDTO!.badLevel != null) {
|
||||
@ -139,7 +140,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
kMainColor,
|
||||
kSecondColor,
|
||||
kConfigurationColor,
|
||||
kTestSecondColor
|
||||
kMainColor1
|
||||
//Colors.pink,
|
||||
//Colors.orange,
|
||||
//Colors.purple
|
||||
@ -151,8 +152,8 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
if (orientation == Orientation.portrait)
|
||||
Column(
|
||||
children: [
|
||||
if (!showResponses && levelToShow.source_ != null)
|
||||
resultImage(size, levelToShow, orientation),
|
||||
if (!showResponses && levelToShow.label!.firstWhere((label) => label.language == visitAppContext!.language).resourceUrl != null) // TODO SUPPORT OTHER THAN IMAGES
|
||||
resultImage(visitAppContext!, size, levelToShow, orientation),
|
||||
if(!showResponses)
|
||||
// TEXT BOX WITH MAIN SCORE
|
||||
Text('$goodResponses/${quizzDTO!.questions!.length}', textAlign: TextAlign.center, style: TextStyle(fontSize: kIsWeb ? (showResponses ? 60 : 100) : 75, color: kBackgroundSecondGrey)),
|
||||
@ -167,8 +168,8 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
if(!showResponses)
|
||||
// TEXT BOX WITH MAIN SCORE
|
||||
Text('$goodResponses/${quizzDTO!.questions!.length}', textAlign: TextAlign.center, style: TextStyle(fontSize: kIsWeb ? (showResponses ? 60 : 100) : 75, color: kBackgroundSecondGrey)),
|
||||
if (!showResponses && levelToShow.source_ != null)
|
||||
resultImage(size, levelToShow, orientation),
|
||||
if (!showResponses && levelToShow.label!.firstWhere((label) => label.language == visitAppContext!.language).resourceUrl != null)
|
||||
resultImage(visitAppContext!, size, levelToShow, orientation),
|
||||
],
|
||||
),
|
||||
|
||||
@ -216,7 +217,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
return const Loading();
|
||||
return const LoadingCommon();
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -284,8 +285,8 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
if(isConfigOffline)
|
||||
{
|
||||
// OFFLINE
|
||||
if(question.resourceId != null) {
|
||||
List<Map<String, dynamic>> ressourceQuizz = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, question.resourceId!);
|
||||
if(question.imageBackgroundResourceId != null) {
|
||||
List<Map<String, dynamic>> ressourceQuizz = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, question.imageBackgroundResourceId!);
|
||||
if(ressourceQuizz.isNotEmpty) {
|
||||
resourcesModel.add(DatabaseHelper.instance.getResourceFromDB(ressourceQuizz.first));
|
||||
} else {
|
||||
@ -296,8 +297,8 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
else
|
||||
{
|
||||
// ONLINE
|
||||
if(question.resourceId != null) {
|
||||
resourcesModel.add(ResourceModel(id: question.resourceId, source: question.source_, type: ResourceType.Image));
|
||||
if(question.imageBackgroundResourceId != null) {
|
||||
resourcesModel.add(ResourceModel(id: question.imageBackgroundResourceId, source: question.imageBackgroundResourceUrl, type: ResourceType.Image));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -317,7 +318,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
}
|
||||
}
|
||||
|
||||
resultImage(Size size, QuizzDTOBadLevel levelToShow, Orientation orientation) {
|
||||
resultImage(VisitAppContext visitAppContext, Size size, LevelDTO levelToShow, Orientation orientation) {
|
||||
return Container(
|
||||
//height: size.height * 0.2,
|
||||
//width: size.width * 0.25,
|
||||
@ -327,11 +328,11 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
image: levelToShow.source_ != null ? DecorationImage(
|
||||
image: levelToShow.label!.where((label) => label.language == visitAppContext.language).isNotEmpty ? DecorationImage(
|
||||
fit: BoxFit.contain,
|
||||
opacity: 0.85,
|
||||
image: NetworkImage(
|
||||
levelToShow.source_!,
|
||||
levelToShow.label!.firstWhere((label) => label.language == visitAppContext.language).resourceUrl!,
|
||||
),
|
||||
): null,
|
||||
borderRadius: const BorderRadius.all( Radius.circular(50.0)),
|
||||
@ -346,7 +347,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
color: const Color(0xff7c94b6),
|
||||
image: DecorationImage(
|
||||
image: NetworkImage(
|
||||
levelToShow.source_!,
|
||||
levelToShow.label!.firstWhere((label) => label.language == visitAppContext.language).resourceUrl!, // TODO REDUNDANCY here??
|
||||
),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
@ -360,7 +361,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
);
|
||||
}
|
||||
|
||||
resultText(Size size, QuizzDTOBadLevel levelToShow, AppContext appContext) {
|
||||
resultText(Size size, LevelDTO levelToShow, AppContext appContext) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 10),
|
||||
child: Container(
|
||||
@ -385,7 +386,7 @@ class _QuizzPageState extends State<QuizzPage> {
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(15.0),
|
||||
child: Text(TranslationHelper.get(levelToShow.label, appContext.getContext() as VisitAppContext), textAlign: TextAlign.center, style: TextStyle(fontSize: kIsWeb ? kDescriptionSize : kDescriptionSize)),
|
||||
child: Text(TranslationHelper.getWithResource(levelToShow.label, appContext.getContext() as VisitAppContext), textAlign: TextAlign.center, style: TextStyle(fontSize: kIsWeb ? kDescriptionSize : kDescriptionSize)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@ -80,7 +80,7 @@ class _BeaconArticleFoundState extends State<BeaconArticleFound> {
|
||||
}
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
value: loadingProgress.expectedTotalBytes != null
|
||||
? loadingProgress.cumulativeBytesLoaded /
|
||||
loadingProgress.expectedTotalBytes!
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:diacritic/diacritic.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Components/SearchBox.dart';
|
||||
import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
|
||||
@ -139,7 +139,7 @@ class _BodyState extends State<Body> {
|
||||
return Center(
|
||||
child: Container(
|
||||
height: size.height * 0.15,
|
||||
child: Loading()
|
||||
child: LoadingCommon()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@ import 'dart:convert';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||
import 'package:manager_api/api.dart';
|
||||
import 'package:mymuseum_visitapp/Components/Loading.dart';
|
||||
import 'package:mymuseum_visitapp/Components/loading_common.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||
import 'package:mymuseum_visitapp/Models/articleRead.dart';
|
||||
@ -55,14 +55,14 @@ class SectionCard extends StatelessWidget {
|
||||
height: 136,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(22),
|
||||
color: itemIndex.isEven ? kBlue0 : kBlue1,
|
||||
color: itemIndex.isEven ? kMainColor0 : kMainColor1,
|
||||
),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(right: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: visitAppContext.readSections.any((element) => element.id == sectionDTO.id) ? kBackgroundGrey : Colors.white,
|
||||
border: Border.all(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
width: 0.2,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(22),
|
||||
@ -102,7 +102,7 @@ class SectionCard extends StatelessWidget {
|
||||
}
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: kBlue1,
|
||||
color: kMainColor1,
|
||||
value: loadingProgress.expectedTotalBytes != null
|
||||
? loadingProgress.cumulativeBytesLoaded /
|
||||
loadingProgress.expectedTotalBytes!
|
||||
@ -118,7 +118,7 @@ class SectionCard extends StatelessWidget {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
height: size.height * 0.15,
|
||||
child: const Loading()
|
||||
child: const LoadingCommon()
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -155,7 +155,7 @@ class SectionCard extends StatelessWidget {
|
||||
vertical: kDefaultPadding / 4, // 5 top and bottom
|
||||
),
|
||||
decoration: const BoxDecoration(
|
||||
color: kBlue2,
|
||||
color: kMainColor2,
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(22),
|
||||
topRight: Radius.circular(22),
|
||||
|
||||
@ -502,7 +502,7 @@ class _VisitPageState extends State<VisitPage> with WidgetsBindingObserver {
|
||||
}
|
||||
},
|
||||
tooltip: 'Beacon',
|
||||
backgroundColor: visitAppContext.isScanningBeacons ? kBlue1 : Colors.grey,
|
||||
backgroundColor: visitAppContext.isScanningBeacons ? kMainColor1 : Colors.grey,
|
||||
child: const Icon(Icons.my_location),
|
||||
),
|
||||
),
|
||||
|
||||
@ -21,7 +21,7 @@ class ApiService {
|
||||
if(configurations.isNotEmpty) {
|
||||
for(var configuration in configurations) {
|
||||
if(configuration.imageId != null) {
|
||||
await downloadAndPushLocalImage(client, ImageDTO(source_: configuration.imageSource, resourceId: configuration.imageId));
|
||||
await downloadAndPushLocalImage(client, ContentDTO(resourceUrl: configuration.imageSource, resourceId: configuration.imageId));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -71,17 +71,17 @@ class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
static Future<bool> downloadAndPushLocalImage(Client client, ImageDTO imageDTO) async {
|
||||
static Future<bool> downloadAndPushLocalImage(Client client, ContentDTO contentDTO) async {
|
||||
try {
|
||||
|
||||
// Test if already here or not..
|
||||
List<Map<String, dynamic>> resourceTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, imageDTO.resourceId!);
|
||||
List<Map<String, dynamic>> resourceTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, contentDTO.resourceId!);
|
||||
if(resourceTest.isNotEmpty) {
|
||||
return true;
|
||||
} else {
|
||||
bool isOnline = await hasNetwork();
|
||||
if(isOnline) {
|
||||
ResourceModel? resourceModel = await downloadImage(client, imageDTO);
|
||||
ResourceModel? resourceModel = await downloadImage(client, contentDTO);
|
||||
if(resourceModel != null) {
|
||||
await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap());
|
||||
}
|
||||
@ -97,16 +97,16 @@ class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
static Future<ResourceModel?> downloadImage(Client client, ImageDTO imageDTO) async {
|
||||
var source = imageDTO.source_;
|
||||
static Future<ResourceModel?> downloadImage(Client client, ContentDTO contentDTO) async {
|
||||
var source = contentDTO.resourceUrl;
|
||||
//print("SOURCE getAndDownloadImage");
|
||||
if(imageDTO.source_ != null) {
|
||||
if(imageDTO.source_!.contains("localhost:5000")){
|
||||
if(contentDTO.resourceUrl != null) {
|
||||
if(contentDTO.resourceUrl!.contains("localhost:5000")){
|
||||
print("Contains localhost:5000");
|
||||
source = imageDTO.source_!.replaceAll("http://localhost:5000", client.apiApi!.basePath);
|
||||
source = contentDTO.resourceUrl!.replaceAll("http://localhost:5000", client.apiApi!.basePath);
|
||||
}
|
||||
} else {
|
||||
source = "https://api.mymuseum.be/api/Resource/"+imageDTO.resourceId!; // TODO UPDATE ROUTE
|
||||
source = "https://api.mymuseum.be/api/Resource/"+contentDTO.resourceId!; // TODO UPDATE ROUTE
|
||||
}
|
||||
|
||||
HttpClient client2 = HttpClient();
|
||||
@ -117,7 +117,7 @@ class ApiService {
|
||||
await for(dynamic d in response) { _downloadData.addAll(d); }
|
||||
//print("AFTER");
|
||||
final base64Str = base64.encode(_downloadData);
|
||||
ResourceModel resourceModel = ResourceModel(id: imageDTO.resourceId, source: imageDTO.source_, data: base64Str, type: ResourceType.Image);
|
||||
ResourceModel resourceModel = ResourceModel(id: contentDTO.resourceId, source: contentDTO.resourceUrl, data: base64Str, type: ResourceType.Image);
|
||||
return resourceModel;
|
||||
}
|
||||
|
||||
@ -149,7 +149,7 @@ class ApiService {
|
||||
}
|
||||
|
||||
static Future<ResourceModel?> downloadAudio(Client client, String audioId) async {
|
||||
var url = "https://api.mymuseum.be/api/Resource/"+audioId; // TO TEST TODO UPDATE ROUTE
|
||||
var url = "https://api.myinfomate.be/api/Resource/"+audioId; // TO TEST TODO UPDATE ROUTE
|
||||
HttpClient client2 = HttpClient();
|
||||
var _downloadData = <int>[];
|
||||
final HttpClientRequest request = await client2.getUrl(Uri.parse(url));
|
||||
@ -181,7 +181,7 @@ class ApiService {
|
||||
try {
|
||||
bool isOnline = await hasNetwork();
|
||||
if(isOnline) {
|
||||
ExportConfigurationDTO? exportConfiguration = await client.configurationApi!.configurationExport(configurationId, language: language);
|
||||
ExportConfigurationDTO? exportConfiguration = await client.configurationApi!.configurationExport(configurationId, language);
|
||||
|
||||
return exportConfiguration;
|
||||
} else {
|
||||
|
||||
@ -56,7 +56,7 @@ class DownloadConfiguration {
|
||||
|
||||
var imageData = exportConfigurationDTO.resources!.where((element) => element.id == configuration.imageId);
|
||||
if(imageData.isNotEmpty) {
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: configuration.imageSource, data: imageData.first.data, type: imageData.first.type);
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: configuration.imageSource, /*data: imageData.first.data,*/ type: imageData.first.type);
|
||||
try {
|
||||
await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap());
|
||||
} catch (e) {
|
||||
@ -88,7 +88,8 @@ class DownloadConfiguration {
|
||||
usedImageOrAudioIds.add(section.imageId!);
|
||||
var imageData = exportConfigurationDTO.resources!.where((element) => element.id == section.imageId);
|
||||
if(imageData.isNotEmpty) {
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: section.imageSource, data: imageData.first.data, type: imageData.first.type);
|
||||
// TODO get all resources from API + store it in download directory of the app
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: section.imageSource, /*data: imageData.first.data,*/ type: imageData.first.type);
|
||||
try {
|
||||
await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap());
|
||||
} catch (e) {
|
||||
@ -101,11 +102,12 @@ class DownloadConfiguration {
|
||||
ArticleDTO? articleDTO = ArticleDTO.fromJson(jsonDecode(section.data!));
|
||||
|
||||
if(articleDTO != null) {
|
||||
for(var image in articleDTO.images!) {
|
||||
for(var image in articleDTO.contents!) {
|
||||
usedImageOrAudioIds.add(image.resourceId!);
|
||||
var imageData = exportConfigurationDTO.resources!.where((element) => element.id == image.resourceId);
|
||||
if(imageData.isNotEmpty) {
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: image.source_, data: imageData.first.data, type: imageData.first.type);
|
||||
// TODO get all resources from API + store it in download directory of the app
|
||||
ResourceModel resourceModel = ResourceModel(id: imageData.first.id, source: image.resourceUrl, /*data: imageData.first.data,*/ type: imageData.first.type);
|
||||
try {
|
||||
await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap());
|
||||
} catch (e) {
|
||||
@ -146,7 +148,8 @@ class DownloadConfiguration {
|
||||
Future<List<ResourceModel>> importAudio(VisitAppContext visitAppContext, ExportConfigurationDTO exportConfigurationDTO, String audioId, List<ResourceModel> audiosNotWorking) async {
|
||||
var audioData = exportConfigurationDTO.resources!.where((element) => element.id == audioId);
|
||||
if(audioData.isNotEmpty) {
|
||||
ResourceModel resourceModel = ResourceModel(id: audioData.first.id, source: "", data: audioData.first.data, type: audioData.first.type);
|
||||
// TODO get all resources from API + store it in download directory of the app
|
||||
ResourceModel resourceModel = ResourceModel(id: audioData.first.id, source: "", /*data: audioData.first.data,*/ type: audioData.first.type);
|
||||
try {
|
||||
await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap());
|
||||
return audiosNotWorking;
|
||||
|
||||
@ -5,7 +5,7 @@ info:
|
||||
description: API Manager Service
|
||||
version: Version Alpha
|
||||
servers:
|
||||
- url: https://api.mymuseum.be
|
||||
- url: https://api.myinfomate.be
|
||||
paths:
|
||||
/api/Configuration:
|
||||
get:
|
||||
@ -112,6 +112,39 @@ paths:
|
||||
type: string
|
||||
security:
|
||||
- bearer: []
|
||||
/api/Configuration/byPin:
|
||||
get:
|
||||
tags:
|
||||
- Configuration
|
||||
operationId: Configuration_GetConfigurationsByPinCode
|
||||
parameters:
|
||||
- name: pinCode
|
||||
in: query
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
x-position: 1
|
||||
responses:
|
||||
'200':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/ConfigurationDTO'
|
||||
'404':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: string
|
||||
'500':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: string
|
||||
/api/Configuration/{id}:
|
||||
get:
|
||||
tags:
|
||||
@ -670,6 +703,37 @@ paths:
|
||||
type: string
|
||||
security:
|
||||
- bearer: []
|
||||
/api/Instance/byPin:
|
||||
get:
|
||||
tags:
|
||||
- Instance
|
||||
operationId: Instance_GetInstanceByPinCode
|
||||
parameters:
|
||||
- name: pinCode
|
||||
in: query
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
x-position: 1
|
||||
responses:
|
||||
'200':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/InstanceDTO'
|
||||
'404':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: string
|
||||
'500':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: string
|
||||
/api/Resource:
|
||||
get:
|
||||
tags:
|
||||
@ -1399,6 +1463,48 @@ paths:
|
||||
$ref: '#/components/schemas/ArticleDTO'
|
||||
security:
|
||||
- bearer: []
|
||||
/api/Section/PdfDTO:
|
||||
get:
|
||||
tags:
|
||||
- Section
|
||||
operationId: Section_GetPdfDTO
|
||||
responses:
|
||||
'200':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PdfDTO'
|
||||
security:
|
||||
- bearer: []
|
||||
/api/Section/PuzzleDTO:
|
||||
get:
|
||||
tags:
|
||||
- Section
|
||||
operationId: Section_GetPuzzleDTO
|
||||
responses:
|
||||
'200':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PuzzleDTO'
|
||||
security:
|
||||
- bearer: []
|
||||
/api/Section/AgendaDTO:
|
||||
get:
|
||||
tags:
|
||||
- Section
|
||||
operationId: Section_GetAgendaDTO
|
||||
responses:
|
||||
'200':
|
||||
description: ''
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/AgendaDTO'
|
||||
security:
|
||||
- bearer: []
|
||||
/api/User:
|
||||
get:
|
||||
tags:
|
||||
@ -1699,6 +1805,28 @@ components:
|
||||
nullable: true
|
||||
items:
|
||||
type: string
|
||||
loaderImageId:
|
||||
type: string
|
||||
nullable: true
|
||||
loaderImageUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
weatherCity:
|
||||
type: string
|
||||
nullable: true
|
||||
weatherUpdatedDate:
|
||||
type: string
|
||||
format: date-time
|
||||
nullable: true
|
||||
weatherResult:
|
||||
type: string
|
||||
nullable: true
|
||||
isWeather:
|
||||
type: boolean
|
||||
isDate:
|
||||
type: boolean
|
||||
isHour:
|
||||
type: boolean
|
||||
TranslationDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1770,6 +1898,7 @@ components:
|
||||
order:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
instanceId:
|
||||
type: string
|
||||
nullable: true
|
||||
@ -1799,6 +1928,9 @@ components:
|
||||
4 = Menu
|
||||
5 = Quizz
|
||||
6 = Article
|
||||
7 = PDF
|
||||
8 = Puzzle
|
||||
9 = Agenda
|
||||
x-enumNames:
|
||||
- Map
|
||||
- Slider
|
||||
@ -1807,6 +1939,9 @@ components:
|
||||
- Menu
|
||||
- Quizz
|
||||
- Article
|
||||
- PDF
|
||||
- Puzzle
|
||||
- Agenda
|
||||
enum:
|
||||
- 0
|
||||
- 1
|
||||
@ -1815,6 +1950,9 @@ components:
|
||||
- 4
|
||||
- 5
|
||||
- 6
|
||||
- 7
|
||||
- 8
|
||||
- 9
|
||||
ResourceDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1827,7 +1965,7 @@ components:
|
||||
label:
|
||||
type: string
|
||||
nullable: true
|
||||
data:
|
||||
url:
|
||||
type: string
|
||||
nullable: true
|
||||
dateCreation:
|
||||
@ -1844,18 +1982,27 @@ components:
|
||||
2 = ImageUrl
|
||||
3 = VideoUrl
|
||||
4 = Audio
|
||||
5 = PDF
|
||||
6 = JSON
|
||||
7 = JSONUrl
|
||||
x-enumNames:
|
||||
- Image
|
||||
- Video
|
||||
- ImageUrl
|
||||
- VideoUrl
|
||||
- Audio
|
||||
- PDF
|
||||
- JSON
|
||||
- JSONUrl
|
||||
enum:
|
||||
- 0
|
||||
- 1
|
||||
- 2
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- 6
|
||||
- 7
|
||||
DeviceDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1923,6 +2070,10 @@ components:
|
||||
dateCreation:
|
||||
type: string
|
||||
format: date-time
|
||||
pinCode:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
InstanceDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1936,6 +2087,10 @@ components:
|
||||
dateCreation:
|
||||
type: string
|
||||
format: date-time
|
||||
pinCode:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
MapDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1944,7 +2099,17 @@ components:
|
||||
type: integer
|
||||
format: int32
|
||||
mapType:
|
||||
$ref: '#/components/schemas/MapTypeApp'
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/MapTypeApp'
|
||||
mapTypeMapbox:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/MapTypeMapBox'
|
||||
mapProvider:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/MapProvider'
|
||||
points:
|
||||
type: array
|
||||
nullable: true
|
||||
@ -1956,6 +2121,11 @@ components:
|
||||
iconSource:
|
||||
type: string
|
||||
nullable: true
|
||||
categories:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/CategorieDTO'
|
||||
MapTypeApp:
|
||||
type: integer
|
||||
description: |-
|
||||
@ -1976,6 +2146,43 @@ components:
|
||||
- 2
|
||||
- 3
|
||||
- 4
|
||||
MapTypeMapBox:
|
||||
type: integer
|
||||
description: |-
|
||||
0 = standard
|
||||
1 = streets
|
||||
2 = outdoors
|
||||
3 = light
|
||||
4 = dark
|
||||
5 = satellite
|
||||
6 = satellite_streets
|
||||
x-enumNames:
|
||||
- standard
|
||||
- streets
|
||||
- outdoors
|
||||
- light
|
||||
- dark
|
||||
- satellite
|
||||
- satellite_streets
|
||||
enum:
|
||||
- 0
|
||||
- 1
|
||||
- 2
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- 6
|
||||
MapProvider:
|
||||
type: integer
|
||||
description: |-
|
||||
0 = Google
|
||||
1 = MapBox
|
||||
x-enumNames:
|
||||
- Google
|
||||
- MapBox
|
||||
enum:
|
||||
- 0
|
||||
- 1
|
||||
GeoPointDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -1983,6 +2190,7 @@ components:
|
||||
id:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
title:
|
||||
type: array
|
||||
nullable: true
|
||||
@ -1993,37 +2201,68 @@ components:
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
images:
|
||||
contents:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/ImageGeoPoint'
|
||||
$ref: '#/components/schemas/ContentGeoPoint'
|
||||
categorie:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/CategorieDTO'
|
||||
latitude:
|
||||
type: string
|
||||
nullable: true
|
||||
longitude:
|
||||
type: string
|
||||
nullable: true
|
||||
ImageGeoPoint:
|
||||
ContentGeoPoint:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
imageResourceId:
|
||||
resourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
imageSource:
|
||||
resourceType:
|
||||
$ref: '#/components/schemas/ResourceType'
|
||||
resourceUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
resourceName:
|
||||
type: string
|
||||
nullable: true
|
||||
CategorieDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
label:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
icon:
|
||||
type: string
|
||||
nullable: true
|
||||
iconResourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
iconUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
order:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
SliderDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
images:
|
||||
contents:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/ImageDTO'
|
||||
ImageDTO:
|
||||
$ref: '#/components/schemas/ContentDTO'
|
||||
ContentDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
@ -2040,12 +2279,14 @@ components:
|
||||
resourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
source:
|
||||
resourceUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
order:
|
||||
type: integer
|
||||
format: int32
|
||||
resourceType:
|
||||
$ref: '#/components/schemas/ResourceType'
|
||||
VideoDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -2110,21 +2351,45 @@ components:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
responses:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/ResponseDTO'
|
||||
resourceId:
|
||||
imageBackgroundResourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
source:
|
||||
imageBackgroundResourceType:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/ResourceType'
|
||||
imageBackgroundResourceUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
order:
|
||||
type: integer
|
||||
format: int32
|
||||
TranslationAndResourceDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
language:
|
||||
type: string
|
||||
nullable: true
|
||||
value:
|
||||
type: string
|
||||
nullable: true
|
||||
resourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
resourceType:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/ResourceType'
|
||||
resourceUrl:
|
||||
type: string
|
||||
nullable: true
|
||||
ResponseDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -2133,7 +2398,7 @@ components:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
isGood:
|
||||
type: boolean
|
||||
order:
|
||||
@ -2147,13 +2412,7 @@ components:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
resourceId:
|
||||
type: string
|
||||
nullable: true
|
||||
source:
|
||||
type: string
|
||||
nullable: true
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
ArticleDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -2172,11 +2431,70 @@ components:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
isReadAudioAuto:
|
||||
type: boolean
|
||||
images:
|
||||
contents:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/ImageDTO'
|
||||
$ref: '#/components/schemas/ContentDTO'
|
||||
PdfDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
pdfs:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/PDFFileDTO'
|
||||
PDFFileDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
pdfFilesAndTitles:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
order:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
PuzzleDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
messageDebut:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
messageFin:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationAndResourceDTO'
|
||||
image:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/ContentDTO'
|
||||
rows:
|
||||
type: integer
|
||||
format: int32
|
||||
cols:
|
||||
type: integer
|
||||
format: int32
|
||||
AgendaDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
resourceIds:
|
||||
type: array
|
||||
nullable: true
|
||||
items:
|
||||
$ref: '#/components/schemas/TranslationDTO'
|
||||
mapProvider:
|
||||
nullable: true
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/MapProvider'
|
||||
User:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
@ -2246,6 +2564,10 @@ components:
|
||||
instanceId:
|
||||
type: string
|
||||
nullable: true
|
||||
pinCode:
|
||||
type: integer
|
||||
format: int32
|
||||
nullable: true
|
||||
LoginDTO:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
|
||||
@ -6,7 +6,7 @@ import 'Models/visitContext.dart';
|
||||
|
||||
class AppContext with ChangeNotifier {
|
||||
VisitAppContext _visitContext;
|
||||
Client clientAPI = Client("https://api.mymuseum.be"); // Replace by https://api.mymuseum.be //http://192.168.31.140:8089
|
||||
Client clientAPI = Client("https://api.myinfomate.be"); // Replace by https://api.mymuseum.be //http://192.168.31.140:8089
|
||||
|
||||
AppContext(this._visitContext);
|
||||
|
||||
|
||||
@ -25,15 +25,14 @@ const kDefaultPadding = 20.0;
|
||||
|
||||
const kMainGrey = Color(0xFF424242);
|
||||
const kSecondGrey = Color(0xFF555457);
|
||||
const kTestSecondColor = Color(0xFF2F4858);
|
||||
const kSecondRed = Color(0xFF622727);
|
||||
const kTextRed = Color(0xFFba0505);
|
||||
const kBackgroundGrey = Color(0xFFb5b7b9);
|
||||
const kBackgroundSecondGrey = Color(0xFF5b5b63);
|
||||
|
||||
const kBlue0 = Color(0xFF306bac);
|
||||
const kBlue1 = Color(0xFF308aae);
|
||||
const kBlue2 = Color(0xFF309cb0);
|
||||
const kMainColor0 = Color(0xFFe52122); // const kBlue0 = Color(0xFF306bac);
|
||||
const kMainColor1 = Color(0xFFed7082); // const kBlue1 = Color(0xFF308aae);
|
||||
const kMainColor2 = Color(0xFFed7082); // const kBlue2 = Color(0xFF309cb0);
|
||||
|
||||
const kBackgroundLight = Color(0xfff3f3f3);
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ void main() async {
|
||||
List<SectionRead> articleReadTest = List<SectionRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
|
||||
localContext.readSections = articleReadTest;
|
||||
} else {
|
||||
localContext = VisitAppContext(language: "FR", id: "UserId_Init", instanceId: "63514fd67ed8c735aaa4b8f1", isAdmin: false, isAllLanguages: false); // 633ee379d9405f32f166f047 Fort Saint-Héribert - MyMuseum instance 63514fd67ed8c735aaa4b8f1
|
||||
localContext = VisitAppContext(language: "FR", id: "UserId_Init", instanceId: "63514fd67ed8c735aaa4b8f2", isAdmin: false, isAllLanguages: false); // 63514fd67ed8c735aaa4b8f2 MyInfoMate test instance -- 633ee379d9405f32f166f047 MyMuseum Fort Saint-Héribert - MyMuseum instance 63514fd67ed8c735aaa4b8f1
|
||||
DatabaseHelper.instance.insert(DatabaseTableType.main, localContext.toMap());
|
||||
|
||||
List<SectionRead> articleReadTest = List<SectionRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
|
||||
@ -86,7 +86,7 @@ class _MyAppState extends State<MyApp> {
|
||||
create: (_) => AppContext(widget.visitAppContext),
|
||||
child: MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
title: 'Fort Saint Héribert',
|
||||
title: 'Musée de la fraise', //'Fort Saint Héribert'
|
||||
initialRoute: widget.initialRoute,
|
||||
localizationsDelegates: const [
|
||||
AppLocalizations.delegate,
|
||||
@ -102,7 +102,7 @@ class _MyAppState extends State<MyApp> {
|
||||
primarySwatch: Colors.blue,
|
||||
scaffoldBackgroundColor: kBackgroundColor,
|
||||
//fontFamily: "Vollkorn",
|
||||
textTheme: const TextTheme(bodyText1: TextStyle(color: kTestSecondColor)),
|
||||
textTheme: TextTheme(bodyLarge: TextStyle(color: widget.visitAppContext.configuration != null ? widget.visitAppContext.configuration!.primaryColor != null ? Color(int.parse(widget.visitAppContext.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kMainColor1 : kMainColor1)),
|
||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||
),
|
||||
routes: {
|
||||
|
||||
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10)
|
||||
project(runner LANGUAGES CXX)
|
||||
|
||||
set(BINARY_NAME "mymuseum_visitapp")
|
||||
set(APPLICATION_ID "be.unov.myvisit.mymuseum_visitapp")
|
||||
set(APPLICATION_ID "be.unov.myinfomate.mdlf")
|
||||
|
||||
cmake_policy(SET CMP0063 NEW)
|
||||
|
||||
|
||||
@ -2,10 +2,14 @@
|
||||
.travis.yml
|
||||
README.md
|
||||
analysis_options.yaml
|
||||
doc/AgendaDTO.md
|
||||
doc/ArticleDTO.md
|
||||
doc/AuthenticationApi.md
|
||||
doc/CategorieDTO.md
|
||||
doc/ConfigurationApi.md
|
||||
doc/ConfigurationDTO.md
|
||||
doc/ContentDTO.md
|
||||
doc/ContentGeoPoint.md
|
||||
doc/DeviceApi.md
|
||||
doc/DeviceDTO.md
|
||||
doc/DeviceDetailDTO.md
|
||||
@ -13,17 +17,25 @@ doc/DeviceDetailDTOAllOf.md
|
||||
doc/ExportConfigurationDTO.md
|
||||
doc/ExportConfigurationDTOAllOf.md
|
||||
doc/GeoPointDTO.md
|
||||
doc/ImageDTO.md
|
||||
doc/ImageGeoPoint.md
|
||||
doc/GeoPointDTOCategorie.md
|
||||
doc/Instance.md
|
||||
doc/InstanceApi.md
|
||||
doc/InstanceDTO.md
|
||||
doc/LevelDTO.md
|
||||
doc/LoginDTO.md
|
||||
doc/MapDTO.md
|
||||
doc/MapDTOMapProvider.md
|
||||
doc/MapDTOMapType.md
|
||||
doc/MapDTOMapTypeMapbox.md
|
||||
doc/MapProvider.md
|
||||
doc/MapTypeApp.md
|
||||
doc/MapTypeMapBox.md
|
||||
doc/MenuDTO.md
|
||||
doc/PDFFileDTO.md
|
||||
doc/PdfDTO.md
|
||||
doc/PlayerMessageDTO.md
|
||||
doc/PuzzleDTO.md
|
||||
doc/PuzzleDTOImage.md
|
||||
doc/QuestionDTO.md
|
||||
doc/QuizzDTO.md
|
||||
doc/QuizzDTOBadLevel.md
|
||||
@ -36,11 +48,13 @@ doc/SectionDTO.md
|
||||
doc/SectionType.md
|
||||
doc/SliderDTO.md
|
||||
doc/TokenDTO.md
|
||||
doc/TranslationAndResourceDTO.md
|
||||
doc/TranslationDTO.md
|
||||
doc/User.md
|
||||
doc/UserApi.md
|
||||
doc/UserDetailDTO.md
|
||||
doc/VideoDTO.md
|
||||
doc/WeatherDTO.md
|
||||
doc/WebDTO.md
|
||||
git_push.sh
|
||||
lib/api.dart
|
||||
@ -59,24 +73,36 @@ lib/auth/authentication.dart
|
||||
lib/auth/http_basic_auth.dart
|
||||
lib/auth/http_bearer_auth.dart
|
||||
lib/auth/oauth.dart
|
||||
lib/model/agenda_dto.dart
|
||||
lib/model/article_dto.dart
|
||||
lib/model/categorie_dto.dart
|
||||
lib/model/configuration_dto.dart
|
||||
lib/model/content_dto.dart
|
||||
lib/model/content_geo_point.dart
|
||||
lib/model/device_detail_dto.dart
|
||||
lib/model/device_detail_dto_all_of.dart
|
||||
lib/model/device_dto.dart
|
||||
lib/model/export_configuration_dto.dart
|
||||
lib/model/export_configuration_dto_all_of.dart
|
||||
lib/model/geo_point_dto.dart
|
||||
lib/model/image_dto.dart
|
||||
lib/model/image_geo_point.dart
|
||||
lib/model/geo_point_dto_categorie.dart
|
||||
lib/model/instance.dart
|
||||
lib/model/instance_dto.dart
|
||||
lib/model/level_dto.dart
|
||||
lib/model/login_dto.dart
|
||||
lib/model/map_dto.dart
|
||||
lib/model/map_dto_map_provider.dart
|
||||
lib/model/map_dto_map_type.dart
|
||||
lib/model/map_dto_map_type_mapbox.dart
|
||||
lib/model/map_provider.dart
|
||||
lib/model/map_type_app.dart
|
||||
lib/model/map_type_map_box.dart
|
||||
lib/model/menu_dto.dart
|
||||
lib/model/pdf_dto.dart
|
||||
lib/model/pdf_file_dto.dart
|
||||
lib/model/player_message_dto.dart
|
||||
lib/model/puzzle_dto.dart
|
||||
lib/model/puzzle_dto_image.dart
|
||||
lib/model/question_dto.dart
|
||||
lib/model/quizz_dto.dart
|
||||
lib/model/quizz_dto_bad_level.dart
|
||||
@ -87,9 +113,13 @@ lib/model/section_dto.dart
|
||||
lib/model/section_type.dart
|
||||
lib/model/slider_dto.dart
|
||||
lib/model/token_dto.dart
|
||||
lib/model/translation_and_resource_dto.dart
|
||||
lib/model/translation_dto.dart
|
||||
lib/model/user.dart
|
||||
lib/model/user_detail_dto.dart
|
||||
lib/model/video_dto.dart
|
||||
lib/model/weather_dto.dart
|
||||
lib/model/web_dto.dart
|
||||
pubspec.yaml
|
||||
test/pdf_file_dto_test.dart
|
||||
test/weather_dto_test.dart
|
||||
|
||||
@ -60,7 +60,7 @@ try {
|
||||
|
||||
## Documentation for API Endpoints
|
||||
|
||||
All URIs are relative to *https://api.mymuseum.be*
|
||||
All URIs are relative to *https://api.myinfomate.be*
|
||||
|
||||
Class | Method | HTTP request | Description
|
||||
------------ | ------------- | ------------- | -------------
|
||||
@ -70,6 +70,7 @@ Class | Method | HTTP request | Description
|
||||
*ConfigurationApi* | [**configurationDelete**](doc\/ConfigurationApi.md#configurationdelete) | **DELETE** /api/Configuration/{id} |
|
||||
*ConfigurationApi* | [**configurationExport**](doc\/ConfigurationApi.md#configurationexport) | **GET** /api/Configuration/{id}/export |
|
||||
*ConfigurationApi* | [**configurationGet**](doc\/ConfigurationApi.md#configurationget) | **GET** /api/Configuration |
|
||||
*ConfigurationApi* | [**configurationGetConfigurationsByPinCode**](doc\/ConfigurationApi.md#configurationgetconfigurationsbypincode) | **GET** /api/Configuration/byPin |
|
||||
*ConfigurationApi* | [**configurationGetDetail**](doc\/ConfigurationApi.md#configurationgetdetail) | **GET** /api/Configuration/{id} |
|
||||
*ConfigurationApi* | [**configurationImport**](doc\/ConfigurationApi.md#configurationimport) | **POST** /api/Configuration/import |
|
||||
*ConfigurationApi* | [**configurationUpdate**](doc\/ConfigurationApi.md#configurationupdate) | **PUT** /api/Configuration |
|
||||
@ -83,6 +84,7 @@ Class | Method | HTTP request | Description
|
||||
*InstanceApi* | [**instanceDeleteInstance**](doc\/InstanceApi.md#instancedeleteinstance) | **DELETE** /api/Instance/{id} |
|
||||
*InstanceApi* | [**instanceGet**](doc\/InstanceApi.md#instanceget) | **GET** /api/Instance |
|
||||
*InstanceApi* | [**instanceGetDetail**](doc\/InstanceApi.md#instancegetdetail) | **GET** /api/Instance/{id} |
|
||||
*InstanceApi* | [**instanceGetInstanceByPinCode**](doc\/InstanceApi.md#instancegetinstancebypincode) | **GET** /api/Instance/byPin |
|
||||
*InstanceApi* | [**instanceUpdateinstance**](doc\/InstanceApi.md#instanceupdateinstance) | **PUT** /api/Instance |
|
||||
*ResourceApi* | [**resourceCreate**](doc\/ResourceApi.md#resourcecreate) | **POST** /api/Resource |
|
||||
*ResourceApi* | [**resourceDelete**](doc\/ResourceApi.md#resourcedelete) | **DELETE** /api/Resource/{id} |
|
||||
@ -95,6 +97,7 @@ Class | Method | HTTP request | Description
|
||||
*SectionApi* | [**sectionDelete**](doc\/SectionApi.md#sectiondelete) | **DELETE** /api/Section/{id} |
|
||||
*SectionApi* | [**sectionDeleteAllForConfiguration**](doc\/SectionApi.md#sectiondeleteallforconfiguration) | **DELETE** /api/Section/configuration/{id} |
|
||||
*SectionApi* | [**sectionGet**](doc\/SectionApi.md#sectionget) | **GET** /api/Section |
|
||||
*SectionApi* | [**sectionGetAgendaDTO**](doc\/SectionApi.md#sectiongetagendadto) | **GET** /api/Section/AgendaDTO |
|
||||
*SectionApi* | [**sectionGetAllBeaconsForInstance**](doc\/SectionApi.md#sectiongetallbeaconsforinstance) | **GET** /api/Section/beacons/{instanceId} |
|
||||
*SectionApi* | [**sectionGetAllSectionSubSections**](doc\/SectionApi.md#sectiongetallsectionsubsections) | **GET** /api/Section/{id}/subsections |
|
||||
*SectionApi* | [**sectionGetArticleDTO**](doc\/SectionApi.md#sectiongetarticledto) | **GET** /api/Section/ArticleDTO |
|
||||
@ -102,9 +105,12 @@ Class | Method | HTTP request | Description
|
||||
*SectionApi* | [**sectionGetFromConfiguration**](doc\/SectionApi.md#sectiongetfromconfiguration) | **GET** /api/Section/configuration/{id} |
|
||||
*SectionApi* | [**sectionGetMapDTO**](doc\/SectionApi.md#sectiongetmapdto) | **GET** /api/Section/MapDTO |
|
||||
*SectionApi* | [**sectionGetMenuDTO**](doc\/SectionApi.md#sectiongetmenudto) | **GET** /api/Section/MenuDTO |
|
||||
*SectionApi* | [**sectionGetPdfDTO**](doc\/SectionApi.md#sectiongetpdfdto) | **GET** /api/Section/PdfDTO |
|
||||
*SectionApi* | [**sectionGetPuzzleDTO**](doc\/SectionApi.md#sectiongetpuzzledto) | **GET** /api/Section/PuzzleDTO |
|
||||
*SectionApi* | [**sectionGetQuizzDTO**](doc\/SectionApi.md#sectiongetquizzdto) | **GET** /api/Section/QuizzDTO |
|
||||
*SectionApi* | [**sectionGetSliderDTO**](doc\/SectionApi.md#sectiongetsliderdto) | **GET** /api/Section/SliderDTO |
|
||||
*SectionApi* | [**sectionGetVideoDTO**](doc\/SectionApi.md#sectiongetvideodto) | **GET** /api/Section/VideoDTO |
|
||||
*SectionApi* | [**sectionGetWeatherDTO**](doc\/SectionApi.md#sectiongetweatherdto) | **GET** /api/Section/WeatherDTO |
|
||||
*SectionApi* | [**sectionGetWebDTO**](doc\/SectionApi.md#sectiongetwebdto) | **GET** /api/Section/WebDTO |
|
||||
*SectionApi* | [**sectionPlayerMessageDTO**](doc\/SectionApi.md#sectionplayermessagedto) | **GET** /api/Section/PlayerMessageDTO |
|
||||
*SectionApi* | [**sectionUpdate**](doc\/SectionApi.md#sectionupdate) | **PUT** /api/Section |
|
||||
@ -118,24 +124,36 @@ Class | Method | HTTP request | Description
|
||||
|
||||
## Documentation For Models
|
||||
|
||||
- [AgendaDTO](doc\/AgendaDTO.md)
|
||||
- [ArticleDTO](doc\/ArticleDTO.md)
|
||||
- [CategorieDTO](doc\/CategorieDTO.md)
|
||||
- [ConfigurationDTO](doc\/ConfigurationDTO.md)
|
||||
- [ContentDTO](doc\/ContentDTO.md)
|
||||
- [ContentGeoPoint](doc\/ContentGeoPoint.md)
|
||||
- [DeviceDTO](doc\/DeviceDTO.md)
|
||||
- [DeviceDetailDTO](doc\/DeviceDetailDTO.md)
|
||||
- [DeviceDetailDTOAllOf](doc\/DeviceDetailDTOAllOf.md)
|
||||
- [ExportConfigurationDTO](doc\/ExportConfigurationDTO.md)
|
||||
- [ExportConfigurationDTOAllOf](doc\/ExportConfigurationDTOAllOf.md)
|
||||
- [GeoPointDTO](doc\/GeoPointDTO.md)
|
||||
- [ImageDTO](doc\/ImageDTO.md)
|
||||
- [ImageGeoPoint](doc\/ImageGeoPoint.md)
|
||||
- [GeoPointDTOCategorie](doc\/GeoPointDTOCategorie.md)
|
||||
- [Instance](doc\/Instance.md)
|
||||
- [InstanceDTO](doc\/InstanceDTO.md)
|
||||
- [LevelDTO](doc\/LevelDTO.md)
|
||||
- [LoginDTO](doc\/LoginDTO.md)
|
||||
- [MapDTO](doc\/MapDTO.md)
|
||||
- [MapDTOMapProvider](doc\/MapDTOMapProvider.md)
|
||||
- [MapDTOMapType](doc\/MapDTOMapType.md)
|
||||
- [MapDTOMapTypeMapbox](doc\/MapDTOMapTypeMapbox.md)
|
||||
- [MapProvider](doc\/MapProvider.md)
|
||||
- [MapTypeApp](doc\/MapTypeApp.md)
|
||||
- [MapTypeMapBox](doc\/MapTypeMapBox.md)
|
||||
- [MenuDTO](doc\/MenuDTO.md)
|
||||
- [PDFFileDTO](doc\/PDFFileDTO.md)
|
||||
- [PdfDTO](doc\/PdfDTO.md)
|
||||
- [PlayerMessageDTO](doc\/PlayerMessageDTO.md)
|
||||
- [PuzzleDTO](doc\/PuzzleDTO.md)
|
||||
- [PuzzleDTOImage](doc\/PuzzleDTOImage.md)
|
||||
- [QuestionDTO](doc\/QuestionDTO.md)
|
||||
- [QuizzDTO](doc\/QuizzDTO.md)
|
||||
- [QuizzDTOBadLevel](doc\/QuizzDTOBadLevel.md)
|
||||
@ -146,17 +164,20 @@ Class | Method | HTTP request | Description
|
||||
- [SectionType](doc\/SectionType.md)
|
||||
- [SliderDTO](doc\/SliderDTO.md)
|
||||
- [TokenDTO](doc\/TokenDTO.md)
|
||||
- [TranslationAndResourceDTO](doc\/TranslationAndResourceDTO.md)
|
||||
- [TranslationDTO](doc\/TranslationDTO.md)
|
||||
- [User](doc\/User.md)
|
||||
- [UserDetailDTO](doc\/UserDetailDTO.md)
|
||||
- [VideoDTO](doc\/VideoDTO.md)
|
||||
- [WeatherDTO](doc\/WeatherDTO.md)
|
||||
- [WebDTO](doc\/WebDTO.md)
|
||||
|
||||
|
||||
## Documentation For Authorization
|
||||
|
||||
|
||||
## bearer
|
||||
Authentication schemes defined for the API:
|
||||
### bearer
|
||||
|
||||
- **Type**: OAuth
|
||||
- **Flow**: password
|
||||
|
||||
16
manager_api/doc/AgendaDTO.md
Normal file
@ -0,0 +1,16 @@
|
||||
# manager_api.model.AgendaDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**resourceIds** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**mapProvider** | [**MapDTOMapProvider**](MapDTOMapProvider.md) | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ Name | Type | Description | Notes
|
||||
**isContentTop** | **bool** | | [optional]
|
||||
**audioIds** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**isReadAudioAuto** | **bool** | | [optional]
|
||||
**images** | [**List<ImageDTO>**](ImageDTO.md) | | [optional] [default to const []]
|
||||
**contents** | [**List<ContentDTO>**](ContentDTO.md) | | [optional] [default to const []]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
All URIs are relative to *https://api.mymuseum.be*
|
||||
All URIs are relative to *https://api.myinfomate.be*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
|
||||
20
manager_api/doc/CategorieDTO.md
Normal file
@ -0,0 +1,20 @@
|
||||
# manager_api.model.CategorieDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**id** | **int** | | [optional]
|
||||
**label** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**icon** | **String** | | [optional]
|
||||
**iconResourceId** | **String** | | [optional]
|
||||
**iconUrl** | **String** | | [optional]
|
||||
**order** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
All URIs are relative to *https://api.mymuseum.be*
|
||||
All URIs are relative to *https://api.myinfomate.be*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
@ -13,6 +13,7 @@ Method | HTTP request | Description
|
||||
[**configurationDelete**](ConfigurationApi.md#configurationdelete) | **DELETE** /api/Configuration/{id} |
|
||||
[**configurationExport**](ConfigurationApi.md#configurationexport) | **GET** /api/Configuration/{id}/export |
|
||||
[**configurationGet**](ConfigurationApi.md#configurationget) | **GET** /api/Configuration |
|
||||
[**configurationGetConfigurationsByPinCode**](ConfigurationApi.md#configurationgetconfigurationsbypincode) | **GET** /api/Configuration/byPin |
|
||||
[**configurationGetDetail**](ConfigurationApi.md#configurationgetdetail) | **GET** /api/Configuration/{id} |
|
||||
[**configurationImport**](ConfigurationApi.md#configurationimport) | **POST** /api/Configuration/import |
|
||||
[**configurationUpdate**](ConfigurationApi.md#configurationupdate) | **PUT** /api/Configuration |
|
||||
@ -192,6 +193,49 @@ Name | Type | Description | Notes
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **configurationGetConfigurationsByPinCode**
|
||||
> List<ConfigurationDTO> configurationGetConfigurationsByPinCode(pinCode)
|
||||
|
||||
|
||||
|
||||
### Example
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
// TODO Configure OAuth2 access token for authorization: bearer
|
||||
//defaultApiClient.getAuthentication<OAuth>('bearer').accessToken = 'YOUR_ACCESS_TOKEN';
|
||||
|
||||
final api_instance = ConfigurationApi();
|
||||
final pinCode = 56; // int |
|
||||
|
||||
try {
|
||||
final result = api_instance.configurationGetConfigurationsByPinCode(pinCode);
|
||||
print(result);
|
||||
} catch (e) {
|
||||
print('Exception when calling ConfigurationApi->configurationGetConfigurationsByPinCode: $e\n');
|
||||
}
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**pinCode** | **int**| | [optional]
|
||||
|
||||
### Return type
|
||||
|
||||
[**List<ConfigurationDTO>**](ConfigurationDTO.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
[bearer](../README.md#bearer)
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: application/json
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **configurationGetDetail**
|
||||
> ConfigurationDTO configurationGetDetail(id)
|
||||
|
||||
|
||||
@ -22,6 +22,17 @@ Name | Type | Description | Notes
|
||||
**isOffline** | **bool** | | [optional]
|
||||
**instanceId** | **String** | | [optional]
|
||||
**sectionIds** | **List<String>** | | [optional] [default to const []]
|
||||
**loaderImageId** | **String** | | [optional]
|
||||
**loaderImageUrl** | **String** | | [optional]
|
||||
**weatherCity** | **String** | | [optional]
|
||||
**weatherUpdatedDate** | [**DateTime**](DateTime.md) | | [optional]
|
||||
**weatherResult** | **String** | | [optional]
|
||||
**isWeather** | **bool** | | [optional]
|
||||
**isDate** | **bool** | | [optional]
|
||||
**isHour** | **bool** | | [optional]
|
||||
**isSectionImageBackground** | **bool** | | [optional]
|
||||
**roundedValue** | **int** | | [optional]
|
||||
**screenPercentageSectionsMainPage** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
20
manager_api/doc/ContentDTO.md
Normal file
@ -0,0 +1,20 @@
|
||||
# manager_api.model.ContentDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**title** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**description** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**resourceId** | **String** | | [optional]
|
||||
**resourceUrl** | **String** | | [optional]
|
||||
**order** | **int** | | [optional]
|
||||
**resourceType** | [**ResourceType**](ResourceType.md) | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
18
manager_api/doc/ContentGeoPoint.md
Normal file
@ -0,0 +1,18 @@
|
||||
# manager_api.model.ContentGeoPoint
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**resourceId** | **String** | | [optional]
|
||||
**resourceType** | [**ResourceType**](ResourceType.md) | | [optional]
|
||||
**resourceUrl** | **String** | | [optional]
|
||||
**resourceName** | **String** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
All URIs are relative to *https://api.mymuseum.be*
|
||||
All URIs are relative to *https://api.myinfomate.be*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
|
||||
@ -22,6 +22,17 @@ Name | Type | Description | Notes
|
||||
**isOffline** | **bool** | | [optional]
|
||||
**instanceId** | **String** | | [optional]
|
||||
**sectionIds** | **List<String>** | | [optional] [default to const []]
|
||||
**loaderImageId** | **String** | | [optional]
|
||||
**loaderImageUrl** | **String** | | [optional]
|
||||
**weatherCity** | **String** | | [optional]
|
||||
**weatherUpdatedDate** | [**DateTime**](DateTime.md) | | [optional]
|
||||
**weatherResult** | **String** | | [optional]
|
||||
**isWeather** | **bool** | | [optional]
|
||||
**isDate** | **bool** | | [optional]
|
||||
**isHour** | **bool** | | [optional]
|
||||
**isSectionImageBackground** | **bool** | | [optional]
|
||||
**roundedValue** | **int** | | [optional]
|
||||
**screenPercentageSectionsMainPage** | **int** | | [optional]
|
||||
**sections** | [**List<SectionDTO>**](SectionDTO.md) | | [optional] [default to const []]
|
||||
**resources** | [**List<ResourceDTO>**](ResourceDTO.md) | | [optional] [default to const []]
|
||||
|
||||
|
||||
@ -11,9 +11,18 @@ Name | Type | Description | Notes
|
||||
**id** | **int** | | [optional]
|
||||
**title** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**description** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**images** | [**List<ImageGeoPoint>**](ImageGeoPoint.md) | | [optional] [default to const []]
|
||||
**contents** | [**List<ContentGeoPoint>**](ContentGeoPoint.md) | | [optional] [default to const []]
|
||||
**categorie** | [**GeoPointDTOCategorie**](GeoPointDTOCategorie.md) | | [optional]
|
||||
**categorieId** | **int** | | [optional]
|
||||
**latitude** | **String** | | [optional]
|
||||
**longitude** | **String** | | [optional]
|
||||
**imageResourceId** | **String** | | [optional]
|
||||
**imageUrl** | **String** | | [optional]
|
||||
**schedules** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**prices** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**phone** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**email** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**site** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
20
manager_api/doc/GeoPointDTOCategorie.md
Normal file
@ -0,0 +1,20 @@
|
||||
# manager_api.model.GeoPointDTOCategorie
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**id** | **int** | | [optional]
|
||||
**label** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**icon** | **String** | | [optional]
|
||||
**iconResourceId** | **String** | | [optional]
|
||||
**iconUrl** | **String** | | [optional]
|
||||
**order** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ Name | Type | Description | Notes
|
||||
**id** | **String** | | [optional]
|
||||
**name** | **String** | | [optional]
|
||||
**dateCreation** | [**DateTime**](DateTime.md) | | [optional]
|
||||
**pinCode** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
All URIs are relative to *https://api.mymuseum.be*
|
||||
All URIs are relative to *https://api.myinfomate.be*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
@ -13,6 +13,7 @@ Method | HTTP request | Description
|
||||
[**instanceDeleteInstance**](InstanceApi.md#instancedeleteinstance) | **DELETE** /api/Instance/{id} |
|
||||
[**instanceGet**](InstanceApi.md#instanceget) | **GET** /api/Instance |
|
||||
[**instanceGetDetail**](InstanceApi.md#instancegetdetail) | **GET** /api/Instance/{id} |
|
||||
[**instanceGetInstanceByPinCode**](InstanceApi.md#instancegetinstancebypincode) | **GET** /api/Instance/byPin |
|
||||
[**instanceUpdateinstance**](InstanceApi.md#instanceupdateinstance) | **PUT** /api/Instance |
|
||||
|
||||
|
||||
@ -184,6 +185,49 @@ Name | Type | Description | Notes
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **instanceGetInstanceByPinCode**
|
||||
> InstanceDTO instanceGetInstanceByPinCode(pinCode)
|
||||
|
||||
|
||||
|
||||
### Example
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
// TODO Configure OAuth2 access token for authorization: bearer
|
||||
//defaultApiClient.getAuthentication<OAuth>('bearer').accessToken = 'YOUR_ACCESS_TOKEN';
|
||||
|
||||
final api_instance = InstanceApi();
|
||||
final pinCode = 56; // int |
|
||||
|
||||
try {
|
||||
final result = api_instance.instanceGetInstanceByPinCode(pinCode);
|
||||
print(result);
|
||||
} catch (e) {
|
||||
print('Exception when calling InstanceApi->instanceGetInstanceByPinCode: $e\n');
|
||||
}
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**pinCode** | **int**| | [optional]
|
||||
|
||||
### Return type
|
||||
|
||||
[**InstanceDTO**](InstanceDTO.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
[bearer](../README.md#bearer)
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: application/json
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **instanceUpdateinstance**
|
||||
> InstanceDTO instanceUpdateinstance(instance)
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ Name | Type | Description | Notes
|
||||
**id** | **String** | | [optional]
|
||||
**name** | **String** | | [optional]
|
||||
**dateCreation** | [**DateTime**](DateTime.md) | | [optional]
|
||||
**pinCode** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -8,9 +8,7 @@ import 'package:manager_api/api.dart';
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**label** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**resourceId** | **String** | | [optional]
|
||||
**source_** | **String** | | [optional]
|
||||
**label** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -9,10 +9,15 @@ import 'package:manager_api/api.dart';
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**zoom** | **int** | | [optional]
|
||||
**mapType** | [**MapTypeApp**](MapTypeApp.md) | | [optional]
|
||||
**mapType** | [**MapDTOMapType**](MapDTOMapType.md) | | [optional]
|
||||
**mapTypeMapbox** | [**MapDTOMapTypeMapbox**](MapDTOMapTypeMapbox.md) | | [optional]
|
||||
**mapProvider** | [**MapDTOMapProvider**](MapDTOMapProvider.md) | | [optional]
|
||||
**points** | [**List<GeoPointDTO>**](GeoPointDTO.md) | | [optional] [default to const []]
|
||||
**iconResourceId** | **String** | | [optional]
|
||||
**iconSource** | **String** | | [optional]
|
||||
**categories** | [**List<CategorieDTO>**](CategorieDTO.md) | | [optional] [default to const []]
|
||||
**latitude** | **String** | | [optional]
|
||||
**longitude** | **String** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
14
manager_api/doc/MapDTOMapProvider.md
Normal file
@ -0,0 +1,14 @@
|
||||
# manager_api.model.MapDTOMapProvider
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
14
manager_api/doc/MapDTOMapType.md
Normal file
@ -0,0 +1,14 @@
|
||||
# manager_api.model.MapDTOMapType
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
14
manager_api/doc/MapDTOMapTypeMapbox.md
Normal file
@ -0,0 +1,14 @@
|
||||
# manager_api.model.MapDTOMapTypeMapbox
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
14
manager_api/doc/MapProvider.md
Normal file
@ -0,0 +1,14 @@
|
||||
# manager_api.model.MapProvider
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
14
manager_api/doc/MapTypeMapBox.md
Normal file
@ -0,0 +1,14 @@
|
||||
# manager_api.model.MapTypeMapBox
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
16
manager_api/doc/PDFFileDTO.md
Normal file
@ -0,0 +1,16 @@
|
||||
# manager_api.model.PDFFileDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**pdfFilesAndTitles** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
**order** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
15
manager_api/doc/PdfDTO.md
Normal file
@ -0,0 +1,15 @@
|
||||
# manager_api.model.PdfDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**pdfs** | [**List<PDFFileDTO>**](PDFFileDTO.md) | | [optional] [default to const []]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
19
manager_api/doc/PuzzleDTO.md
Normal file
@ -0,0 +1,19 @@
|
||||
# manager_api.model.PuzzleDTO
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**messageDebut** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
**messageFin** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
**image** | [**PuzzleDTOImage**](PuzzleDTOImage.md) | | [optional]
|
||||
**rows** | **int** | | [optional]
|
||||
**cols** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
20
manager_api/doc/PuzzleDTOImage.md
Normal file
@ -0,0 +1,20 @@
|
||||
# manager_api.model.PuzzleDTOImage
|
||||
|
||||
## Load the model package
|
||||
```dart
|
||||
import 'package:manager_api/api.dart';
|
||||
```
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**title** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**description** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**resourceId** | **String** | | [optional]
|
||||
**resourceUrl** | **String** | | [optional]
|
||||
**order** | **int** | | [optional]
|
||||
**resourceType** | [**ResourceType**](ResourceType.md) | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||
@ -8,10 +8,11 @@ import 'package:manager_api/api.dart';
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**label** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**label** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
**responses** | [**List<ResponseDTO>**](ResponseDTO.md) | | [optional] [default to const []]
|
||||
**resourceId** | **String** | | [optional]
|
||||
**source_** | **String** | | [optional]
|
||||
**imageBackgroundResourceId** | **String** | | [optional]
|
||||
**imageBackgroundResourceType** | [**ResourceType**](ResourceType.md) | | [optional]
|
||||
**imageBackgroundResourceUrl** | **String** | | [optional]
|
||||
**order** | **int** | | [optional]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
@ -8,9 +8,7 @@ import 'package:manager_api/api.dart';
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**label** | [**List<TranslationDTO>**](TranslationDTO.md) | | [optional] [default to const []]
|
||||
**resourceId** | **String** | | [optional]
|
||||
**source_** | **String** | | [optional]
|
||||
**label** | [**List<TranslationAndResourceDTO>**](TranslationAndResourceDTO.md) | | [optional] [default to const []]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
||||