mirror of
https://github.com/wulkanowy/wulkanowy.git
synced 2025-01-31 22:52:44 +01:00
Merge branch 'release/0.14.1'
This commit is contained in:
commit
16e3a877af
@ -14,7 +14,7 @@ cache:
|
|||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- 0.14.0
|
- 0.14.1
|
||||||
|
|
||||||
android:
|
android:
|
||||||
licenses:
|
licenses:
|
||||||
|
12
README.en.md
12
README.en.md
@ -7,11 +7,11 @@
|
|||||||
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
|
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
|
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
Unofficial android VULCAN UONET+ register client for student and parent
|
Unofficial android VULCAN UONET+ register client for both students and their parents
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
* logging in using the email and password
|
* logging in using the email and password OR using token and pin
|
||||||
* functions from the register website:
|
* functions from the register website:
|
||||||
* grades
|
* grades
|
||||||
* grade statistics
|
* grade statistics
|
||||||
@ -24,7 +24,7 @@ Unofficial android VULCAN UONET+ register client for student and parent
|
|||||||
* homework
|
* homework
|
||||||
* notes
|
* notes
|
||||||
* lucky number
|
* lucky number
|
||||||
* calculation of the average
|
* calculation of the average independently of school's preferences
|
||||||
* notifications, e.g. about a new grade
|
* notifications, e.g. about a new grade
|
||||||
* dark and black (AMOLED) theme
|
* dark and black (AMOLED) theme
|
||||||
* offline mode
|
* offline mode
|
||||||
@ -32,16 +32,16 @@ Unofficial android VULCAN UONET+ register client for student and parent
|
|||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
You can download the current beta from the Google Play or Fdroid store
|
You can download the current beta version from the Google Play or the F-Droid store
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
alt="Get it on Google Play"
|
alt="Get it on Google Play"
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
alt="Get it on Fdroid"
|
alt="Get it on F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
|
||||||
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features prepared for the next release
|
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
|
||||||
|
|
||||||
## Built With
|
## Built With
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -11,7 +11,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
|||||||
|
|
||||||
## Funkcje
|
## Funkcje
|
||||||
|
|
||||||
* logowanie za pomocą e-maila i hasła
|
* logowanie za pomocą e-maila i hasła LUB tokena i pinu
|
||||||
* funkcje ze strony internetowej dziennika:
|
* funkcje ze strony internetowej dziennika:
|
||||||
* oceny
|
* oceny
|
||||||
* statystyki ocen
|
* statystyki ocen
|
||||||
@ -24,7 +24,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
|||||||
* zadania domowe
|
* zadania domowe
|
||||||
* uwagi
|
* uwagi
|
||||||
* szczęśliwy numerek
|
* szczęśliwy numerek
|
||||||
* obliczanie średniej
|
* obliczanie średniej niezależnie od preferencji szkoły
|
||||||
* powiadomienia np. o nowej ocenie
|
* powiadomienia np. o nowej ocenie
|
||||||
* ciemny i czarny (AMOLED) motyw
|
* ciemny i czarny (AMOLED) motyw
|
||||||
* tryb offilne
|
* tryb offilne
|
||||||
@ -32,13 +32,13 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
|||||||
|
|
||||||
## Pobierz
|
## Pobierz
|
||||||
|
|
||||||
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub Fdroid
|
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
alt="Pobierz z Google Play"
|
alt="Pobierz z Google Play"
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
alt="Pobierz z Fdroid"
|
alt="Pobierz z F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
|
||||||
|
|
||||||
@ -59,4 +59,4 @@ Wnieś swój wkład w projekt, tworząc PR lub wysyłając issue na GitHub.
|
|||||||
|
|
||||||
## Licencja
|
## Licencja
|
||||||
|
|
||||||
Ten projekt jest licencjonowany w ramach Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)
|
Ten projekt udostępniany jest na licencji Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)
|
||||||
|
@ -17,8 +17,8 @@ android {
|
|||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 49
|
versionCode 50
|
||||||
versionName "0.14.0"
|
versionName "0.14.1"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
@ -110,9 +110,9 @@ play {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
work_manager = "2.3.0-beta02"
|
work_manager = "2.3.0-rc01"
|
||||||
room = "2.2.3"
|
room = "2.2.3"
|
||||||
dagger = "2.25.3"
|
dagger = "2.25.4"
|
||||||
chucker = "2.0.4"
|
chucker = "2.0.4"
|
||||||
mockk = "1.9.2"
|
mockk = "1.9.2"
|
||||||
}
|
}
|
||||||
@ -122,14 +122,14 @@ configurations.all {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "io.github.wulkanowy:sdk:0.14.0"
|
implementation "io.github.wulkanowy:sdk:0.14.1"
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
implementation "androidx.core:core-ktx:1.2.0-rc01"
|
implementation "androidx.core:core-ktx:1.2.0-rc01"
|
||||||
implementation "androidx.activity:activity-ktx:1.1.0-rc03"
|
implementation "androidx.activity:activity-ktx:1.1.0-rc03"
|
||||||
implementation "androidx.appcompat:appcompat:1.1.0"
|
implementation "androidx.appcompat:appcompat:1.1.0"
|
||||||
implementation "androidx.appcompat:appcompat-resources:1.1.0"
|
implementation "androidx.appcompat:appcompat-resources:1.1.0"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.2.0-rc04"
|
implementation "androidx.fragment:fragment-ktx:1.2.0-rc05"
|
||||||
implementation "androidx.annotation:annotation:1.1.0"
|
implementation "androidx.annotation:annotation:1.1.0"
|
||||||
implementation "androidx.multidex:multidex:2.0.1"
|
implementation "androidx.multidex:multidex:2.0.1"
|
||||||
|
|
||||||
@ -173,8 +173,8 @@ dependencies {
|
|||||||
implementation "com.jakewharton.threetenabp:threetenabp:1.2.1"
|
implementation "com.jakewharton.threetenabp:threetenabp:1.2.1"
|
||||||
implementation "com.jakewharton.timber:timber:4.7.1"
|
implementation "com.jakewharton.timber:timber:4.7.1"
|
||||||
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
||||||
implementation "com.squareup.okhttp3:logging-interceptor:3.12.6"
|
implementation "com.squareup.okhttp3:logging-interceptor:3.12.7"
|
||||||
implementation "com.mikepenz:aboutlibraries:7.0.4"
|
implementation "com.mikepenz:aboutlibraries-core:7.1.0"
|
||||||
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
||||||
|
|
||||||
playImplementation "com.google.firebase:firebase-core:17.2.1"
|
playImplementation "com.google.firebase:firebase-core:17.2.1"
|
||||||
@ -185,7 +185,7 @@ dependencies {
|
|||||||
debugImplementation "fr.o80.chucker:library:$chucker"
|
debugImplementation "fr.o80.chucker:library:$chucker"
|
||||||
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
|
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
|
||||||
|
|
||||||
testImplementation "junit:junit:4.12"
|
testImplementation "junit:junit:4.13"
|
||||||
testImplementation "io.mockk:mockk:$mockk"
|
testImplementation "io.mockk:mockk:$mockk"
|
||||||
testImplementation "org.threeten:threetenbp:1.4.0"
|
testImplementation "org.threeten:threetenbp:1.4.0"
|
||||||
testImplementation "org.mockito:mockito-inline:3.2.4"
|
testImplementation "org.mockito:mockito-inline:3.2.4"
|
||||||
|
@ -38,6 +38,7 @@ class GradeDetailsHeader(
|
|||||||
gradeHeaderAverage.text = average
|
gradeHeaderAverage.text = average
|
||||||
gradeHeaderNumber.text = number
|
gradeHeaderNumber.text = number
|
||||||
gradeHeaderNote.visibility = if (newGrades > 0) VISIBLE else GONE
|
gradeHeaderNote.visibility = if (newGrades > 0) VISIBLE else GONE
|
||||||
|
if (newGrades > 0) gradeHeaderNote.text = newGrades.toString(10)
|
||||||
gradeHeaderContainer.isEnabled = isExpandable
|
gradeHeaderContainer.isEnabled = isExpandable
|
||||||
|
|
||||||
isViewExpandable = isExpandable
|
isViewExpandable = isExpandable
|
||||||
|
@ -47,6 +47,13 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
|
|||||||
|
|
||||||
override val isBarViewEmpty get() = gradeStatisticsChartPoints.isEmpty
|
override val isBarViewEmpty get() = gradeStatisticsChartPoints.isEmpty
|
||||||
|
|
||||||
|
override val currentType
|
||||||
|
get() = when (gradeStatisticsTypeSwitch.checkedRadioButtonId) {
|
||||||
|
R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER
|
||||||
|
R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL
|
||||||
|
else -> ViewType.POINTS
|
||||||
|
}
|
||||||
|
|
||||||
private lateinit var gradeColors: List<Pair<Int, Int>>
|
private lateinit var gradeColors: List<Pair<Int, Int>>
|
||||||
|
|
||||||
private val vulcanGradeColors = listOf(
|
private val vulcanGradeColors = listOf(
|
||||||
@ -272,13 +279,7 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
|
|||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, checkedId ->
|
gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, _ -> presenter.onTypeChange() }
|
||||||
presenter.onTypeChange(when (checkedId) {
|
|
||||||
R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER
|
|
||||||
R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL
|
|
||||||
else -> ViewType.POINTS
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
@ -94,7 +94,8 @@ class GradeStatisticsPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onTypeChange(type: ViewType) {
|
fun onTypeChange() {
|
||||||
|
val type = view?.let { it.currentType } ?: ViewType.POINTS
|
||||||
Timber.i("Select grade stats semester: $type")
|
Timber.i("Select grade stats semester: $type")
|
||||||
disposable.clear()
|
disposable.clear()
|
||||||
view?.run {
|
view?.run {
|
||||||
@ -214,7 +215,7 @@ class GradeStatisticsPresenter @Inject constructor(
|
|||||||
|
|
||||||
private fun showErrorViewOnError(message: String, error: Throwable) {
|
private fun showErrorViewOnError(message: String, error: Throwable) {
|
||||||
view?.run {
|
view?.run {
|
||||||
if (isBarViewEmpty || isPieViewEmpty) {
|
if ((isBarViewEmpty && currentType == ViewType.POINTS) || (isPieViewEmpty) && currentType != ViewType.POINTS) {
|
||||||
lastError = error
|
lastError = error
|
||||||
setErrorDetails(message)
|
setErrorDetails(message)
|
||||||
showErrorView(true)
|
showErrorView(true)
|
||||||
|
@ -10,6 +10,8 @@ interface GradeStatisticsView : BaseView {
|
|||||||
|
|
||||||
val isBarViewEmpty: Boolean
|
val isBarViewEmpty: Boolean
|
||||||
|
|
||||||
|
val currentType: ViewType
|
||||||
|
|
||||||
fun initView()
|
fun initView()
|
||||||
|
|
||||||
fun updateSubjects(data: ArrayList<String>)
|
fun updateSubjects(data: ArrayList<String>)
|
||||||
|
@ -5,6 +5,10 @@ import android.database.sqlite.SQLiteConstraintException
|
|||||||
import com.readystatesoftware.chuck.api.ChuckCollector
|
import com.readystatesoftware.chuck.api.ChuckCollector
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
import io.github.wulkanowy.sdk.exception.BadCredentialsException
|
import io.github.wulkanowy.sdk.exception.BadCredentialsException
|
||||||
|
import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException
|
||||||
|
import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException
|
||||||
|
import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException
|
||||||
|
import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException
|
||||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -15,12 +19,22 @@ class LoginErrorHandler @Inject constructor(
|
|||||||
|
|
||||||
var onBadCredentials: () -> Unit = {}
|
var onBadCredentials: () -> Unit = {}
|
||||||
|
|
||||||
|
var onInvalidToken: (String) -> Unit = {}
|
||||||
|
|
||||||
|
var onInvalidPin: (String) -> Unit = {}
|
||||||
|
|
||||||
|
var onInvalidSymbol: (String) -> Unit = {}
|
||||||
|
|
||||||
var onStudentDuplicate: (String) -> Unit = {}
|
var onStudentDuplicate: (String) -> Unit = {}
|
||||||
|
|
||||||
override fun proceed(error: Throwable) {
|
override fun proceed(error: Throwable) {
|
||||||
when (error) {
|
when (error) {
|
||||||
is BadCredentialsException -> onBadCredentials()
|
is BadCredentialsException -> onBadCredentials()
|
||||||
is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student))
|
is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student))
|
||||||
|
is TokenDeadException -> onInvalidToken(resources.getString(R.string.login_expired_token))
|
||||||
|
is InvalidTokenException -> onInvalidToken(resources.getString(R.string.login_invalid_token))
|
||||||
|
is InvalidPinException -> onInvalidPin(resources.getString(R.string.login_invalid_pin))
|
||||||
|
is InvalidSymbolException -> onInvalidSymbol(resources.getString(R.string.login_invalid_symbol))
|
||||||
else -> super.proceed(error)
|
else -> super.proceed(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,9 @@ import android.os.Bundle
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
|
import androidx.appcompat.widget.AppCompatEditText
|
||||||
import androidx.core.widget.doOnTextChanged
|
import androidx.core.widget.doOnTextChanged
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
@ -84,6 +86,9 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loginFormPin.setOnEditorDoneSignIn()
|
||||||
|
loginFormPass.setOnEditorDoneSignIn()
|
||||||
|
|
||||||
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
|
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
|
||||||
|
|
||||||
with(loginFormHost) {
|
with(loginFormHost) {
|
||||||
@ -92,6 +97,12 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun AppCompatEditText.setOnEditorDoneSignIn() {
|
||||||
|
setOnEditorActionListener { _, id, _ ->
|
||||||
|
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) loginFormSignIn.callOnClick() else false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun setDefaultCredentials(name: String, pass: String, symbol: String, token: String, pin: String) {
|
override fun setDefaultCredentials(name: String, pass: String, symbol: String, token: String, pin: String) {
|
||||||
loginFormName.setText(name)
|
loginFormName.setText(name)
|
||||||
loginFormPass.setText(pass)
|
loginFormPass.setText(pass)
|
||||||
@ -101,54 +112,75 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun setErrorNameRequired() {
|
override fun setErrorNameRequired() {
|
||||||
loginFormNameLayout.run {
|
with(loginFormNameLayout) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
error = getString(R.string.login_field_required)
|
error = getString(R.string.login_field_required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setErrorPassRequired(focus: Boolean) {
|
override fun setErrorPassRequired(focus: Boolean) {
|
||||||
loginFormPassLayout.run {
|
with(loginFormPassLayout) {
|
||||||
if (focus) requestFocus()
|
if (focus) requestFocus()
|
||||||
error = getString(R.string.login_field_required)
|
error = getString(R.string.login_field_required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setErrorPassInvalid(focus: Boolean) {
|
override fun setErrorPassInvalid(focus: Boolean) {
|
||||||
loginFormPassLayout.run {
|
with(loginFormPassLayout) {
|
||||||
if (focus) requestFocus()
|
if (focus) requestFocus()
|
||||||
error = getString(R.string.login_invalid_password)
|
error = getString(R.string.login_invalid_password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setErrorPassIncorrect() {
|
override fun setErrorPassIncorrect() {
|
||||||
loginFormPassLayout.run {
|
with(loginFormPassLayout) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
error = getString(R.string.login_incorrect_password)
|
error = getString(R.string.login_incorrect_password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setErrorPinRequired() {
|
override fun setErrorPinRequired() {
|
||||||
loginFormPinLayout.run {
|
with(loginFormPinLayout) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
error = getString(R.string.login_field_required)
|
error = getString(R.string.login_field_required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setErrorPinInvalid(message: String) {
|
||||||
|
with(loginFormPinLayout) {
|
||||||
|
requestFocus()
|
||||||
|
error = message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun setErrorSymbolRequired() {
|
override fun setErrorSymbolRequired() {
|
||||||
loginFormSymbolLayout.run {
|
with(loginFormSymbolLayout) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
error = getString(R.string.login_field_required)
|
error = getString(R.string.login_field_required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setErrorSymbolInvalid(message: String) {
|
||||||
|
with(loginFormSymbolLayout) {
|
||||||
|
requestFocus()
|
||||||
|
error = message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun setErrorTokenRequired() {
|
override fun setErrorTokenRequired() {
|
||||||
loginFormTokenLayout.run {
|
with(loginFormTokenLayout) {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
error = getString(R.string.login_field_required)
|
error = getString(R.string.login_field_required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setErrorTokenInvalid(message: String) {
|
||||||
|
with(loginFormTokenLayout) {
|
||||||
|
requestFocus()
|
||||||
|
error = message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun clearNameError() {
|
override fun clearNameError() {
|
||||||
loginFormNameLayout.error = null
|
loginFormNameLayout.error = null
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,45 @@ class LoginAdvancedPresenter @Inject constructor(
|
|||||||
view.run {
|
view.run {
|
||||||
initView()
|
initView()
|
||||||
showOnlyScrapperModeInputs()
|
showOnlyScrapperModeInputs()
|
||||||
loginErrorHandler.onBadCredentials = {
|
with(loginErrorHandler) {
|
||||||
|
onBadCredentials = ::onBadCredentials
|
||||||
|
onInvalidToken = ::onInvalidToken
|
||||||
|
onInvalidSymbol = ::onInvalidSymbol
|
||||||
|
onInvalidPin = ::onInvalidPin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onBadCredentials() {
|
||||||
|
view?.run {
|
||||||
setErrorPassIncorrect()
|
setErrorPassIncorrect()
|
||||||
showSoftKeyboard()
|
showSoftKeyboard()
|
||||||
Timber.i("Entered wrong username or password")
|
Timber.i("Entered wrong username or password")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun onInvalidToken(message: String) {
|
||||||
|
view?.run {
|
||||||
|
setErrorTokenInvalid(message)
|
||||||
|
showSoftKeyboard()
|
||||||
|
Timber.i("Entered invalid token")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onInvalidSymbol(message: String) {
|
||||||
|
view?.run {
|
||||||
|
setErrorSymbolInvalid(message)
|
||||||
|
showSoftKeyboard()
|
||||||
|
Timber.i("Entered invalid symbol")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onInvalidPin(message: String) {
|
||||||
|
view?.run {
|
||||||
|
setErrorPinInvalid(message)
|
||||||
|
showSoftKeyboard()
|
||||||
|
Timber.i("Entered invalid PIN")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onHostSelected() {
|
fun onHostSelected() {
|
||||||
|
@ -53,10 +53,16 @@ interface LoginAdvancedView : BaseView {
|
|||||||
|
|
||||||
fun setErrorPinRequired()
|
fun setErrorPinRequired()
|
||||||
|
|
||||||
|
fun setErrorPinInvalid(message: String)
|
||||||
|
|
||||||
fun setErrorSymbolRequired()
|
fun setErrorSymbolRequired()
|
||||||
|
|
||||||
|
fun setErrorSymbolInvalid(message: String)
|
||||||
|
|
||||||
fun setErrorTokenRequired()
|
fun setErrorTokenRequired()
|
||||||
|
|
||||||
|
fun setErrorTokenInvalid(message: String)
|
||||||
|
|
||||||
fun showOnlyHybridModeInputs()
|
fun showOnlyHybridModeInputs()
|
||||||
|
|
||||||
fun showOnlyScrapperModeInputs()
|
fun showOnlyScrapperModeInputs()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
Wersja 0.14.0
|
Wersja 0.14.1
|
||||||
|
|
||||||
- dodane zostały nowe opcje logowania, m.in. logowanie przez token
|
- naprawiliśmy logowanie użytkownikom, którzy mieli przypisanych do konta uczniów ze szkół z wyłączonymi dziennikami
|
||||||
- naprawione zostało wyświetlanie nauczyciela, kiedy zastępstwo zostanie usunięte z danej lekcji
|
- naprawiliśmy problemy z wysyłaniem wiadomości i odświeżaniem ocen spowodowanych ostatnią aktualizacją
|
||||||
- naprawiony został biały ekran w szczęśliwym numerku
|
- dodaliśmy informację o liczbie nieprzeczytanych ocen w nagłówku przedmiotu
|
||||||
|
- ulepszyliśmy informacje o błędach przy logowaniu w trybie mobilnym
|
||||||
|
|
||||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||||
|
5
app/src/main/res/drawable/background_header_note.xml
Normal file
5
app/src/main/res/drawable/background_header_note.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<solid android:color="?colorPrimary"/>
|
||||||
|
<corners android:radius="12dp"/>
|
||||||
|
</shape>
|
@ -188,8 +188,6 @@
|
|||||||
android:id="@+id/loginFormToken"
|
android:id="@+id/loginFormToken"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:imeActionLabel="@string/login_sign_in"
|
|
||||||
android:imeOptions="actionDone"
|
|
||||||
android:inputType="textCapCharacters"
|
android:inputType="textCapCharacters"
|
||||||
android:maxLines="1" />
|
android:maxLines="1" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
android:background="?selectableItemBackground"
|
android:background="?selectableItemBackground"
|
||||||
android:paddingLeft="16dp"
|
android:paddingLeft="16dp"
|
||||||
android:paddingTop="10dp"
|
android:paddingTop="10dp"
|
||||||
android:paddingRight="12dp"
|
android:paddingRight="14dp"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
tools:context=".ui.modules.grade.details.GradeDetailsHeader"
|
tools:context=".ui.modules.grade.details.GradeDetailsHeader"
|
||||||
android:paddingEnd="12dp"
|
android:paddingEnd="12dp"
|
||||||
@ -50,14 +50,19 @@
|
|||||||
android:textSize="12sp"
|
android:textSize="12sp"
|
||||||
tools:text="12 grades" />
|
tools:text="12 grades" />
|
||||||
|
|
||||||
<ImageView
|
<TextView
|
||||||
android:id="@+id/gradeHeaderNote"
|
android:id="@+id/gradeHeaderNote"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:minWidth="20dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
|
android:gravity="center"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="10dp"
|
||||||
app:srcCompat="@drawable/ic_all_round_mark"
|
android:background="@drawable/background_header_note"
|
||||||
app:tint="?colorPrimary"
|
android:textColor="?colorOnPrimary"
|
||||||
tools:ignore="contentDescription" />
|
android:textSize="14sp"
|
||||||
|
tools:text="255" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<string name="login_host_hint">Dziennik</string>
|
<string name="login_host_hint">Dziennik</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
<string name="login_type_api">Mobilne API</string>
|
<string name="login_type_api">Mobilne API</string>
|
||||||
<string name="login_type_scrapper">Scrapper</string>
|
<string name="login_type_scrapper">Scraper</string>
|
||||||
<string name="login_type_hybrid">Hybrydowe</string>
|
<string name="login_type_hybrid">Hybrydowe</string>
|
||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
@ -36,6 +36,10 @@
|
|||||||
<string name="login_sign_in">Zaloguj</string>
|
<string name="login_sign_in">Zaloguj</string>
|
||||||
<string name="login_invalid_password">To hasło jest za krótkie</string>
|
<string name="login_invalid_password">To hasło jest za krótkie</string>
|
||||||
<string name="login_incorrect_password">Dane logowania są niepoprawne</string>
|
<string name="login_incorrect_password">Dane logowania są niepoprawne</string>
|
||||||
|
<string name="login_invalid_pin">Nieprawidłowy PIN</string>
|
||||||
|
<string name="login_invalid_token">Nieprawidłowy token</string>
|
||||||
|
<string name="login_expired_token">Token stracił ważność</string>
|
||||||
|
<string name="login_invalid_symbol">Niepoprawny symbol</string>
|
||||||
<string name="login_incorrect_symbol">Nie znaleziono ucznia. Sprawdź symbol</string>
|
<string name="login_incorrect_symbol">Nie znaleziono ucznia. Sprawdź symbol</string>
|
||||||
<string name="login_field_required">To pole jest wymagane</string>
|
<string name="login_field_required">To pole jest wymagane</string>
|
||||||
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
|
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
|
||||||
@ -355,7 +359,7 @@
|
|||||||
|
|
||||||
<!--Errors-->
|
<!--Errors-->
|
||||||
<string name="error_no_internet">Brak połączenia z internetem</string>
|
<string name="error_no_internet">Brak połączenia z internetem</string>
|
||||||
<string name="error_timeout">Zbyt długie oczekiwanie na połączenie z dziennikiem</string>
|
<string name="error_timeout">Upłynął limit czasu na połączenie z dziennikiem</string>
|
||||||
<string name="error_login_failed">Logowanie nie powiodło się. Spróbuj ponownie lub zrestartuj aplikację</string>
|
<string name="error_login_failed">Logowanie nie powiodło się. Spróbuj ponownie lub zrestartuj aplikację</string>
|
||||||
<string name="error_service_unavailable">Dziennik jest niedostępny. Spróbuj ponownie później</string>
|
<string name="error_service_unavailable">Dziennik jest niedostępny. Spróbuj ponownie później</string>
|
||||||
<string name="error_unknown">Wystąpił nieoczekiwany błąd</string>
|
<string name="error_unknown">Wystąpił nieoczekiwany błąd</string>
|
||||||
|
@ -28,15 +28,26 @@
|
|||||||
<string name="login_nickname_hint">Электронная почта или имя пользователя</string>
|
<string name="login_nickname_hint">Электронная почта или имя пользователя</string>
|
||||||
<string name="login_password_hint">Пароль</string>
|
<string name="login_password_hint">Пароль</string>
|
||||||
<string name="login_host_hint">Дневник</string>
|
<string name="login_host_hint">Дневник</string>
|
||||||
|
<string name="login_type_api">Мобильный API</string>
|
||||||
|
<string name="login_type_scrapper">Scraper</string>
|
||||||
|
<string name="login_type_hybrid">Гибрид</string>
|
||||||
|
<string name="login_token_hint">Token</string>
|
||||||
|
<string name="login_pin_hint">PIN</string>
|
||||||
|
<string name="login_api_key_hint">клавиша API</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
<string name="login_sign_in">Войти</string>
|
<string name="login_sign_in">Войти</string>
|
||||||
<string name="login_invalid_password">Слишком короткий пароль</string>
|
<string name="login_invalid_password">Слишком короткий пароль</string>
|
||||||
<string name="login_incorrect_password">Указаны неверные данные</string>
|
<string name="login_incorrect_password">Указаны неверные данные</string>
|
||||||
|
<string name="login_invalid_pin">Недействительный PIN</string>
|
||||||
|
<string name="login_invalid_token">Недействительный token</string>
|
||||||
|
<string name="login_expired_token">Токен просрочен</string>
|
||||||
|
<string name="login_invalid_symbol">Недействительный symbol</string>
|
||||||
<string name="login_incorrect_symbol">Не удалось найти ученика. Пожалуйста, проверьте \"symbol\"</string>
|
<string name="login_incorrect_symbol">Не удалось найти ученика. Пожалуйста, проверьте \"symbol\"</string>
|
||||||
<string name="login_field_required">Это поле обязательно</string>
|
<string name="login_field_required">Это поле обязательно</string>
|
||||||
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
|
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
|
||||||
<string name="login_symbol_helper">Вы можете найти \"symbol\" в Uczeń -> Dostęp Mobilny -> Zarejestruj urządzenie mobilne</string>
|
<string name="login_symbol_helper">Вы можете найти \"symbol\" в Uczeń -> Dostęp Mobilny -> Zarejestruj urządzenie mobilne</string>
|
||||||
<string name="login_select_student">Выберите учеников для авторизации в приложении</string>
|
<string name="login_select_student">Выберите учеников для авторизации в приложении</string>
|
||||||
|
<string name="login_advanced">Другие варианты</string>
|
||||||
<string name="login_privacy_policy">Политика приватности</string>
|
<string name="login_privacy_policy">Политика приватности</string>
|
||||||
<string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string>
|
<string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string>
|
||||||
<string name="login_contact_email">Электронная почта</string>
|
<string name="login_contact_email">Электронная почта</string>
|
||||||
@ -261,6 +272,8 @@
|
|||||||
<string name="about_version">Версия приложения</string>
|
<string name="about_version">Версия приложения</string>
|
||||||
<string name="about_feedback">Сообщить о ошибке</string>
|
<string name="about_feedback">Сообщить о ошибке</string>
|
||||||
<string name="about_feedback_summary">Отправить сообщение о ошибке через электронную почту</string>
|
<string name="about_feedback_summary">Отправить сообщение о ошибке через электронную почту</string>
|
||||||
|
<string name="about_faq">FAQ</string>
|
||||||
|
<string name="about_faq_summary">Читайте часто задаваемые вопросы</string>
|
||||||
<string name="about_discord">Сервер Discord</string>
|
<string name="about_discord">Сервер Discord</string>
|
||||||
<string name="about_discord_summary">Присоединиться к сообществу приложения</string>
|
<string name="about_discord_summary">Присоединиться к сообществу приложения</string>
|
||||||
<string name="about_privacy">Политика приватности</string>
|
<string name="about_privacy">Политика приватности</string>
|
||||||
@ -277,6 +290,7 @@
|
|||||||
|
|
||||||
<!--Generic-->
|
<!--Generic-->
|
||||||
<string name="all_content">Содержание</string>
|
<string name="all_content">Содержание</string>
|
||||||
|
<string name="all_retry">Снова</string>
|
||||||
<string name="all_description">Описание</string>
|
<string name="all_description">Описание</string>
|
||||||
<string name="all_no_description">Нет описания</string>
|
<string name="all_no_description">Нет описания</string>
|
||||||
<string name="all_teacher">Учитель</string>
|
<string name="all_teacher">Учитель</string>
|
||||||
@ -349,5 +363,6 @@
|
|||||||
<string name="error_service_unavailable">Дневник недоступен. Попробуйте позже</string>
|
<string name="error_service_unavailable">Дневник недоступен. Попробуйте позже</string>
|
||||||
<string name="error_unknown">Произошла неожиданная ошибка</string>
|
<string name="error_unknown">Произошла неожиданная ошибка</string>
|
||||||
<string name="error_feature_disabled">Функция была выключена школой</string>
|
<string name="error_feature_disabled">Функция была выключена школой</string>
|
||||||
|
<string name="error_feature_not_available">Функция не доступна в этом режиме</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -83,7 +83,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="grade_average_mode_entries">
|
<string-array name="grade_average_mode_entries">
|
||||||
<item>Average grades from the 2nd semester</item>
|
<item>Average of grades only from the 2nd semester</item>
|
||||||
<item>Average of grades from the whole year</item>
|
<item>Average of grades from the whole year</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="grade_average_mode_values" translatable="false">
|
<string-array name="grade_average_mode_values" translatable="false">
|
||||||
|
@ -27,18 +27,22 @@
|
|||||||
<string name="login_password_hint">Password</string>
|
<string name="login_password_hint">Password</string>
|
||||||
<string name="login_host_hint">Register</string>
|
<string name="login_host_hint">Register</string>
|
||||||
<string name="login_type_api">Mobile API</string>
|
<string name="login_type_api">Mobile API</string>
|
||||||
<string name="login_type_scrapper">Scrapper</string>
|
<string name="login_type_scrapper">Scraper</string>
|
||||||
<string name="login_type_hybrid">Hybrid</string>
|
<string name="login_type_hybrid">Hybrid</string>
|
||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_api_key_hint">API key</string>
|
<string name="login_api_key_hint">API key</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
<string name="login_sign_in">Sign in</string>
|
<string name="login_sign_in">Sign in</string>
|
||||||
<string name="login_invalid_password">This password is too short</string>
|
<string name="login_invalid_password">Password too short</string>
|
||||||
<string name="login_incorrect_password">Login details are incorrect</string>
|
<string name="login_incorrect_password">Login details are incorrect</string>
|
||||||
|
<string name="login_invalid_pin">Invalid PIN</string>
|
||||||
|
<string name="login_invalid_token">Invalid token</string>
|
||||||
|
<string name="login_expired_token">Token expired</string>
|
||||||
|
<string name="login_invalid_symbol">Invalid symbol</string>
|
||||||
<string name="login_incorrect_symbol">Student not found. Check the symbol</string>
|
<string name="login_incorrect_symbol">Student not found. Check the symbol</string>
|
||||||
<string name="login_field_required">This field is required</string>
|
<string name="login_field_required">This field is required</string>
|
||||||
<string name="login_duplicate_student">The selected student is already logged in</string>
|
<string name="login_duplicate_student">Selected student is already logged in</string>
|
||||||
<string name="login_symbol_helper">The symbol can be found on the register page in Uczeń -> Dostęp Mobilny -> Zarejestruj urządzenie mobilne</string>
|
<string name="login_symbol_helper">The symbol can be found on the register page in Uczeń -> Dostęp Mobilny -> Zarejestruj urządzenie mobilne</string>
|
||||||
<string name="login_select_student">Select students to log in to the application</string>
|
<string name="login_select_student">Select students to log in to the application</string>
|
||||||
<string name="login_advanced">Other options</string>
|
<string name="login_advanced">Other options</string>
|
||||||
@ -206,7 +210,7 @@
|
|||||||
<!--Mobile devices-->
|
<!--Mobile devices-->
|
||||||
<string name="mobile_devices_title">Mobile devices</string>
|
<string name="mobile_devices_title">Mobile devices</string>
|
||||||
<string name="mobile_devices_no_items">No devices</string>
|
<string name="mobile_devices_no_items">No devices</string>
|
||||||
<string name="mobile_devices_unregister">Unregister</string>
|
<string name="mobile_devices_unregister">Deregister</string>
|
||||||
<string name="mobile_device_removed">Device removed</string>
|
<string name="mobile_device_removed">Device removed</string>
|
||||||
<string name="mobile_device_qr">QR code</string>
|
<string name="mobile_device_qr">QR code</string>
|
||||||
<string name="mobile_device_token">Token</string>
|
<string name="mobile_device_token">Token</string>
|
||||||
@ -305,7 +309,7 @@
|
|||||||
|
|
||||||
<string name="pref_services_header">Synchronization</string>
|
<string name="pref_services_header">Synchronization</string>
|
||||||
<string name="pref_services_switch">Automatic update</string>
|
<string name="pref_services_switch">Automatic update</string>
|
||||||
<string name="pref_services_suspended">Suspended on holiday</string>
|
<string name="pref_services_suspended">Suspended on holidays</string>
|
||||||
<string name="pref_services_interval">Updates interval</string>
|
<string name="pref_services_interval">Updates interval</string>
|
||||||
<string name="pref_services_wifi">Wi-Fi only</string>
|
<string name="pref_services_wifi">Wi-Fi only</string>
|
||||||
|
|
||||||
@ -336,10 +340,11 @@
|
|||||||
|
|
||||||
<!--Errors-->
|
<!--Errors-->
|
||||||
<string name="error_no_internet">No internet connection</string>
|
<string name="error_no_internet">No internet connection</string>
|
||||||
<string name="error_timeout">Too long waiting time for connection to the register</string>
|
<string name="error_timeout">Connection to the register timed out</string>
|
||||||
<string name="error_login_failed">Login is failed. Try again or restart the app</string>
|
<string name="error_login_failed">Login failed. Try again or restart the app</string>
|
||||||
<string name="error_service_unavailable">The log is not available. Try again later</string>
|
<string name="error_service_unavailable">The register is not available. Try again later</string>
|
||||||
<string name="error_unknown">An unexpected error occurred</string>
|
<string name="error_unknown">An unexpected error occurred</string>
|
||||||
<string name="error_feature_disabled">Feature disabled by your school</string>
|
<string name="error_feature_disabled">Feature disabled by your school</string>
|
||||||
<string name="error_feature_not_available">Feature not available in this mode</string>
|
<string name="error_feature_not_available">Feature not available in this mode</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -57,6 +57,7 @@ class AttendanceRemoteTest {
|
|||||||
subject = "Fizyka",
|
subject = "Fizyka",
|
||||||
name = "Obecność",
|
name = "Obecność",
|
||||||
date = date,
|
date = date,
|
||||||
|
timeId = 0,
|
||||||
number = 0,
|
number = 0,
|
||||||
deleted = false,
|
deleted = false,
|
||||||
excusable = false,
|
excusable = false,
|
||||||
@ -65,7 +66,8 @@ class AttendanceRemoteTest {
|
|||||||
lateness = false,
|
lateness = false,
|
||||||
presence = false,
|
presence = false,
|
||||||
categoryId = 1,
|
categoryId = 1,
|
||||||
absence = false
|
absence = false,
|
||||||
|
excuseStatus = null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user