diff --git a/src/app/beans/bean-sort/bean-sort.component.html b/src/app/beans/bean-sort/bean-sort.component.html index fdf44095..7042d7fa 100644 --- a/src/app/beans/bean-sort/bean-sort.component.html +++ b/src/app/beans/bean-sort/bean-sort.component.html @@ -68,6 +68,10 @@ {{"BEAN_SORT_WEIGHT" | translate}} + + + {{"BEAN_SORT_WEIGHT_REMAINING" | translate}} + {{"BEAN_SORT_AROMATICS" | translate}} diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index db8dc00e..936a7671 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -755,6 +755,16 @@

{{"SMART_SCALE_FIRST_DRIP_THRESHOLD" | translate}}

+ + +
+

{{"SMART_SCALE_ESPRESSO_WEIGHT_DOUBLING_JUST_ONE_CUP_TITLE" | translate}}

+

{{"SMART_SCALE_ESPRESSO_WEIGHT_DOUBLING_JUST_ONE_CUP_DESCRIPTION" | translate}}

+
+
+
+

{{"SMART_SCALE_COMMAND_DELAY" | translate}}

diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 75656079..76111621 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1470,5 +1470,8 @@ "EXPORT_CAUTION_IOS": "iOS: If you want to set up a new phone, the best and easiest way is using the iCloud Backup", "PAGE_SETTINGS_LANGUAGE_NORWEGIAN": "Norwegian", "VISUALIZER_SHOT_IMPORT_FAILED": "Visualizer shot import failed", - "PAGE_SETTINGS_LANGUAGE_PORTUGUESE": "Portuguese" + "PAGE_SETTINGS_LANGUAGE_PORTUGUESE": "Portuguese", + "SMART_SCALE_ESPRESSO_WEIGHT_DOUBLING_JUST_ONE_CUP_TITLE": "Weight doubling - 1 of 2 cups on scale", + "SMART_SCALE_ESPRESSO_WEIGHT_DOUBLING_JUST_ONE_CUP_DESCRIPTION": "If just one cups fits on your scale, you can enable this setting. This makes it possible that you can choose in the brew, to activate a checkbox, when you have two cups, but just one is on the scale. The weight will get when the settings is activated doubled, to behave like there would be two cups on the scale.", + "BEAN_SORT_WEIGHT_REMAINING": "Remaining weight" } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 9063d805..4a81e6b6 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -195,6 +195,7 @@ export class Settings implements ISettings { public bluetooth_scale_listening_threshold_active: boolean; public bluetooth_scale_ignore_weight_button_active: boolean; public bluetooth_scale_first_drip_threshold: number; + public bluetooth_scale_espresso_just_one_cup: boolean; public maximize_hide_value_cards_on_maximize_screen: boolean; @@ -512,6 +513,7 @@ export class Settings implements ISettings { this.bluetooth_scale_listening_threshold_active = false; this.bluetooth_scale_ignore_weight_button_active = false; this.bluetooth_scale_first_drip_threshold = 0.1; + this.bluetooth_scale_espresso_just_one_cup = false; this.maximize_hide_value_cards_on_maximize_screen = false; @@ -577,25 +579,25 @@ export class Settings implements ISettings { this.default_last_coffee_parameters = new DefaultBrewParameter(); Object.assign( this.default_last_coffee_parameters, - settingsObj.default_last_coffee_parameters + settingsObj.default_last_coffee_parameters, ); this.repeat_coffee_parameters = new RepeatBrewParameter(); Object.assign( this.repeat_coffee_parameters, - settingsObj.repeat_coffee_parameters + settingsObj.repeat_coffee_parameters, ); this.bean_manage_parameters = new BeanManageParameter(); Object.assign( this.bean_manage_parameters, - settingsObj.bean_manage_parameters + settingsObj.bean_manage_parameters, ); this.bean_visible_list_view_parameters = new BeanListViewParameter(); Object.assign( this.bean_visible_list_view_parameters, - settingsObj.bean_visible_list_view_parameters + settingsObj.bean_visible_list_view_parameters, ); } diff --git a/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.html b/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.html index 3436c700..52d68adb 100644 --- a/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.html +++ b/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.html @@ -1,4 +1,20 @@ @let shallProfileHidden = shallFlowProfileBeHidden(); + +@if(settings.bluetooth_scale_espresso_just_one_cup === true && brewComponent.choosenPreparation.style_type === PREPARATION_STYLE_TYPE.ESPRESSO) +{ + + + + +
+

{{"SMART_SCALE_ESPRESSO_WEIGHT_DOUBLING_JUST_ONE_CUP_TITLE" | translate}}

+
+
+
+
+
+} @@ -26,6 +42,11 @@ + + + + + diff --git a/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.ts b/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.ts index c3a0ef70..ed7f4cf6 100644 --- a/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.ts +++ b/src/components/brews/brew-brewing-graph/brew-brewing-graph.component.ts @@ -170,6 +170,8 @@ export class BrewBrewingGraphComponent implements OnInit { public graphIconColSize: number = 2; + public espressoJustOneCup: boolean = false; + constructor( private readonly platform: Platform, private readonly bleManager: CoffeeBluetoothDevicesService, @@ -2215,6 +2217,7 @@ export class BrewBrewingGraphComponent implements OnInit { this.deattachToFlowChange(); let didWeReceiveAnyFlow: boolean = false; + this.scaleFlowChangeSubscription = scale.flowChange.subscribe((_val) => { this.setActualSmartInformation(); didWeReceiveAnyFlow = true; @@ -2741,7 +2744,19 @@ export class BrewBrewingGraphComponent implements OnInit { } } + let oneEspressoCup: boolean = false; + if ( + this.espressoJustOneCup === true && + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { + oneEspressoCup = true; + } + this.scaleFlowSubscription = scale.flowChange.subscribe((_valChange) => { + if (oneEspressoCup === true) { + _valChange.actual = _valChange.actual * 2; + } let _val; if (this.ignoreScaleWeight === false) { _val = this.mutateWeightAndSeeAnomalys( diff --git a/src/enums/beans/beanSortAfter.ts b/src/enums/beans/beanSortAfter.ts index 3dcbabb5..c884fee2 100755 --- a/src/enums/beans/beanSortAfter.ts +++ b/src/enums/beans/beanSortAfter.ts @@ -14,4 +14,5 @@ export enum BEAN_SORT_AFTER { INFORMATION_REGION = 'SORT_INFORMATION_REGION', INFORMATION_VARIETY = 'SORT_INFORMATION_VARIETY', INFORMATION_PROCESSING = 'SORT_INFORMATION_PROCESSING', + WEIGHT_REMAINING = 'WEIGHT_REMAINING', } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index ac31d084..ed79ac93 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -185,6 +185,7 @@ export interface ISettings { bluetooth_scale_listening_threshold_active: boolean; bluetooth_scale_ignore_weight_button_active: boolean; bluetooth_scale_first_drip_threshold: number; + bluetooth_scale_espresso_just_one_cup: boolean; maximize_hide_value_cards_on_maximize_screen: boolean; diff --git a/src/services/beanSortFilterHelper/bean-sort-filter-helper.service.ts b/src/services/beanSortFilterHelper/bean-sort-filter-helper.service.ts index ae487cdc..aed40d51 100644 --- a/src/services/beanSortFilterHelper/bean-sort-filter-helper.service.ts +++ b/src/services/beanSortFilterHelper/bean-sort-filter-helper.service.ts @@ -9,6 +9,8 @@ import { BeanSortComponent } from '../../app/beans/bean-sort/bean-sort.component import { BeanFilterComponent } from '../../app/beans/bean-filter/bean-filter.component'; import { ModalController } from '@ionic/angular'; import { UIHelper } from '../uiHelper'; +import { Brew } from '../../classes/brew/brew'; +import { UIBeanHelper } from '../uiBeanHelper'; @Injectable({ providedIn: 'root', @@ -16,7 +18,8 @@ import { UIHelper } from '../uiHelper'; export class BeanSortFilterHelperService { constructor( private readonly modalCtrl: ModalController, - private readonly uiHelper: UIHelper + private readonly uiHelper: UIHelper, + private readonly uiBeanHelper: UIBeanHelper, ) {} public async showSort(_sort: IBeanPageSort) { @@ -68,11 +71,11 @@ export class BeanSortFilterHelperService { _beans: Array, _searchText: string, _sort: IBeanPageSort, - _filter: IBeanPageFilter + _filter: IBeanPageFilter, ) { let filterBeans: Array = this.manageFilterBeans( _type, - this.uiHelper.cloneData(_beans) + this.uiHelper.cloneData(_beans), ); filterBeans = this.manageFavourites(_filter, filterBeans); @@ -100,13 +103,13 @@ export class BeanSortFilterHelperService { private manageFilterBeans(_type: string, beansCopy: Bean[]): Bean[] { if (_type === 'open') { return beansCopy.filter( - (bean) => !bean.finished && bean.isFrozen() === false + (bean) => !bean.finished && bean.isFrozen() === false, ); } else if (_type === 'archive') { return beansCopy.filter((bean) => bean.finished); } else if (_type === 'frozen') { return beansCopy.filter( - (bean) => !bean.finished && bean.isFrozen() === true + (bean) => !bean.finished && bean.isFrozen() === true, ); } } @@ -237,6 +240,21 @@ export class BeanSortFilterHelperService { return 0; }); break; + case BEAN_SORT_AFTER.WEIGHT_REMAINING: + filterBeans = filterBeans.sort((a, b) => { + const remainingWeightA = + a?.weight - this.getUsedWeightCount(a.config.uuid); + const remainingWeightB = + b?.weight - this.getUsedWeightCount(b.config.uuid); + if (remainingWeightA < remainingWeightB) { + return -1; + } + if (remainingWeightA > remainingWeightB) { + return 1; + } + return 0; + }); + break; case BEAN_SORT_AFTER.AROMATICS: filterBeans = filterBeans.sort((a, b) => { const nameA = a.aromatics.toUpperCase(); @@ -325,6 +343,20 @@ export class BeanSortFilterHelperService { return filterBeans; } + public getUsedWeightCount(_uuid: string): number { + let usedWeightCount: number = 0; + const relatedBrews: Array = + this.uiBeanHelper.getAllBrewsForThisBean(_uuid); + for (const brew of relatedBrews) { + if (brew.bean_weight_in > 0) { + usedWeightCount += brew.bean_weight_in; + } else { + usedWeightCount += brew.grind_weight; + } + } + return usedWeightCount; + } + private manageRoastingDateEnd(filter: IBeanPageFilter, filterBeans: Bean[]) { if (filter.roastingDateEnd) { const roastingDateEnd = moment(filter.roastingDateEnd) @@ -344,7 +376,7 @@ export class BeanSortFilterHelperService { private manageRoastingDateStart( filter: IBeanPageFilter, - filterBeans: Bean[] + filterBeans: Bean[], ): Bean[] { if (filter.roastingDateStart) { const roastingStart = moment(filter.roastingDateStart) @@ -365,7 +397,7 @@ export class BeanSortFilterHelperService { private manageRoaster(filter: IBeanPageFilter, filterBeans: Bean[]) { if (filter.bean_roaster) { filterBeans = filterBeans.filter( - (e: Bean) => filter.bean_roaster.includes(e.roaster) === true + (e: Bean) => filter.bean_roaster.includes(e.roaster) === true, ); } return filterBeans; @@ -373,23 +405,23 @@ export class BeanSortFilterHelperService { private manageRoastRange( filterBeans: Bean[], - filter: IBeanPageFilter + filter: IBeanPageFilter, ): Bean[] { return filterBeans.filter( (e: Bean) => e.roast_range >= filter.roast_range.lower && - e.roast_range <= filter.roast_range.upper + e.roast_range <= filter.roast_range.upper, ); } private manageRoastingType( filter: IBeanPageFilter, - filterBeans: Bean[] + filterBeans: Bean[], ): Bean[] { if (filter.bean_roasting_type.length > 0) { return filterBeans.filter( (e: Bean) => - filter.bean_roasting_type.includes(e.bean_roasting_type) === true + filter.bean_roasting_type.includes(e.bean_roasting_type) === true, ); } return filterBeans; @@ -398,13 +430,13 @@ export class BeanSortFilterHelperService { private manageRating(filterBeans: Bean[], filter: IBeanPageFilter): Bean[] { return filterBeans.filter( (e: Bean) => - e.rating >= filter.rating.lower && e.rating <= filter.rating.upper + e.rating >= filter.rating.lower && e.rating <= filter.rating.upper, ); } private manageFavourites( filter: IBeanPageFilter, - filterBeans: Bean[] + filterBeans: Bean[], ): Bean[] { if (filter.favourite) { return filterBeans.filter((e) => e.favourite === true);