Added extend finish time feature

Added reservation for the past time error

Fixed layout
This commit is contained in:
Sviatoslav Tsariov Yurievich 2025-03-27 14:35:33 +03:00
parent 1307765102
commit 08bf2577d7
15 changed files with 157 additions and 42 deletions

View File

@ -98,7 +98,7 @@ body {
<script src="Talkpal.js"></script>
<script>
const GODOT_CONFIG = {"args":[],"canvasResizePolicy":2,"ensureCrossOriginIsolationHeaders":true,"executable":"Talkpal","experimentalVK":true,"fileSizes":{"Talkpal.pck":6408288,"Talkpal.wasm":43016933},"focusCanvas":true,"gdextensionLibs":[],"serviceWorker":"Talkpal.service.worker.js"};
const GODOT_CONFIG = {"args":[],"canvasResizePolicy":2,"ensureCrossOriginIsolationHeaders":true,"executable":"Talkpal","experimentalVK":true,"fileSizes":{"Talkpal.pck":6411152,"Talkpal.wasm":43016933},"focusCanvas":true,"gdextensionLibs":[],"serviceWorker":"Talkpal.service.worker.js"};
const GODOT_THREADS_ENABLED = false;
const engine = new Engine(GODOT_CONFIG);

View File

@ -107,6 +107,9 @@ const Features = {
if (!Features.isFetchAvailable()) {
missing.push('Fetch - Check web browser version');
}
if (!Features.isSecureContext()) {
missing.push('Secure Context - Check web server configuration (use HTTPS)');
}
if (supportsThreads) {
if (!Features.isCrossOriginIsolated()) {

Binary file not shown.

View File

@ -4,7 +4,7 @@
// Incrementing CACHE_VERSION will kick off the install event and force
// previously cached resources to be updated from the network.
/** @type {string} */
const CACHE_VERSION = '1742901707|150096318';
const CACHE_VERSION = '1743075308|11252545514';
/** @type {string} */
const CACHE_PREFIX = 'Talkpal-sw-cache-';
const CACHE_NAME = CACHE_PREFIX + CACHE_VERSION;

View File

@ -10,7 +10,7 @@ func _process(delta):
func _process_items_font_size():
var default_font_size = _items.get_theme_default_font_size()
var font_size = _items.get_theme_font_size("font_size")
var new_font_size = get_viewport_rect().size.y/30
var new_font_size = get_viewport_rect().size.y/25
if font_size != new_font_size:
_items.add_theme_font_size_override("font_size", new_font_size)

View File

@ -36,7 +36,7 @@ text = " "
[node name="FieldLabel" type="Label" parent="Container/FieldLabelControl"]
layout_mode = 2
theme = ExtResource("3_4sp4y")
theme_override_font_sizes/font_size = 16
theme_override_font_sizes/font_size = 15
[node name="Value" type="VBoxContainer" parent="Container"]
layout_mode = 2
@ -46,7 +46,7 @@ layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("2_iq8f3")
theme_override_font_sizes/font_size = 16
theme_override_font_sizes/font_size = 15
max_length = 32
selecting_enabled = false
@ -55,7 +55,7 @@ visible = false
layout_mode = 2
size_flags_horizontal = 3
theme = ExtResource("2_iq8f3")
theme_override_font_sizes/font_size = 16
theme_override_font_sizes/font_size = 15
wrap_mode = 1
scroll_fit_content_height = true

View File

@ -4,6 +4,13 @@ extends HBoxContainer
var _text : String
func _process(delta):
_process_error_label_font_size()
func _process_error_label_font_size():
var new_font_size = get_viewport_rect().size.y*(8.0/475.0) + 250.0/19.0
_error_label.add_theme_font_size_override("font_size", new_font_size)
func _ready():
set_message(String())

View File

@ -1,8 +1,10 @@
[gd_scene load_steps=2 format=3 uid="uid://e73v63ysty2e"]
[gd_scene load_steps=3 format=3 uid="uid://e73v63ysty2e"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_bo38g"]
[ext_resource type="Script" path="res://scenes/common/error_box.gd" id="1_lkwa6"]
[node name="ErrorBox" type="HBoxContainer"]
script = ExtResource("1_lkwa6")
[node name="Control" type="Control" parent="."]
custom_minimum_size = Vector2(25, 0)

View File

@ -14,7 +14,7 @@ script = ExtResource("1_2wxyg")
[node name="TimeEdit" type="LineEdit" parent="."]
visible = false
layout_mode = 2
text = "10:34 "
text = "11:27 "
placeholder_text = "hh:mm (a/p)m"
script = ExtResource("2_7d4ae")
current_time = true
@ -24,3 +24,8 @@ layout_mode = 2
size_flags_horizontal = 3
theme = ExtResource("3_bpvuo")
virtual_keyboard_enabled = false
[connection signal="mouse_entered" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_entered"]
[connection signal="mouse_exited" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_exited"]
[connection signal="visibility_changed" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_visibility_changed"]
[connection signal="draw" from="TimeEdit/ManualClock" to="TimeEdit/ManualClock" method="_on_draw"]

View File

@ -13,6 +13,9 @@ enum Pages {
func get_current_page():
pass
func get_previous_page():
pass
func load_page(value, with_update=true):
pass
@ -37,6 +40,9 @@ func get_selected_date() -> String:
func get_selected_room() -> RoomEntity:
return RoomEntity.new()
func get_current_date() -> String:
return ""
func is_current_date_selected() -> bool:
return true

View File

@ -42,6 +42,7 @@ enum Status {
@onready var _background := $Background
@onready var _create_reservation_button := $RightBottom/CreateReservationButton
@onready var _reserve_now_label := $Left/TimeStatusContainer/ReserveNowBox/ReserveNowLabel
@onready var _15_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_15min
@onready var _30_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_30min
@onready var _45_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_45min
@ -149,6 +150,9 @@ func _process_font_size(obj, k):
func get_current_page():
return _current_page
func get_previous_page():
return _previous_page
func load_page(value, with_update=true):
var previous_page = _current_page
@ -162,7 +166,8 @@ func load_page(value, with_update=true):
hide_keyboard()
_change_page_with_delay(previous_page)
_change_create_reservation_buttion_visibility(_current_page)
_change_create_reservation_button_visibility(_current_page)
_update_reserve_now_label_text()
return _pages[_current_page]
@ -171,7 +176,7 @@ func _change_page_with_delay(previous_page):
_pages[previous_page].visible = false
_pages[_current_page].visible = true
func _change_create_reservation_buttion_visibility(page: Pages):
func _change_create_reservation_button_visibility(page: Pages):
if page == Pages.Board:
_create_reservation_button.show()
else:
@ -199,7 +204,16 @@ func _set_time_status_indent(value):
func _get_time_status_indent():
return _time_status_indent.custom_minimum_size.y
func _create_default_reservation(minutes_of_reservation):
func _create_default_reservation(minutes_of_reservation: int):
if _current_page == Pages.ReservationCreation:
var start_time = _pages[_current_page].get_start_time()
_extend_finish_time_for(start_time, minutes_of_reservation)
return
elif _current_page == Pages.ReservationEdit:
var finish_time = _pages[_current_page].get_finish_time()
_extend_finish_time_for(finish_time, minutes_of_reservation)
return
if _status == Status.BUSY:
return
@ -229,6 +243,14 @@ func _create_default_reservation(minutes_of_reservation):
load_page(Main.Pages.Board, true)
func _extend_finish_time_for(time: Dictionary, minutes_of_reservation: int):
var time_in_minutes = time.hours * 60 + time.minutes
var new_time_in_minutes = time_in_minutes + minutes_of_reservation
var new_time_hours = floor(new_time_in_minutes/60)
var new_time_minutes = new_time_in_minutes - new_time_hours * 60
var new_time = {"hours": new_time_hours, "minutes": new_time_minutes}
_pages[_current_page].set_finish_time(new_time)
func get_selected_date() -> String:
return _selected_date
@ -271,3 +293,11 @@ func _on_date_selected(date: Calendar.DateObj):
_selected_date = "%02d.%02d.%04d" % [date.day, date.month, date.year]
_pages[Pages.CalendarSetting].date_selected.disconnect(_on_date_selected)
_pages[Pages.Board].update_date()
func _update_reserve_now_label_text():
if _current_page == Pages.ReservationCreation:
_reserve_now_label.text = "Забронировать на"
elif _current_page == Pages.ReservationEdit:
_reserve_now_label.text = "Продлить на"
else:
_reserve_now_label.text = "Забронировать сейчас на"

View File

@ -85,14 +85,14 @@ size_flags_horizontal = 10
size_flags_vertical = 0
[node name="Indent" type="BoxContainer" parent="Left/TimeStatusContainer"]
custom_minimum_size = Vector2(0, 195)
custom_minimum_size = Vector2(0, 177.333)
layout_mode = 2
size_flags_vertical = 3
[node name="TimeLabel" type="Label" parent="Left/TimeStatusContainer"]
layout_mode = 2
theme = ExtResource("5_atujq")
text = "12:15"
text = "14:35"
horizontal_alignment = 1
[node name="StatusLabel" type="Label" parent="Left/TimeStatusContainer"]
@ -157,7 +157,7 @@ grow_vertical = 0
[node name="CreateReservationButton" type="Button" parent="RightBottom"]
layout_mode = 2
theme = ExtResource("9_wpf8g")
theme_override_font_sizes/font_size = 16
theme_override_font_sizes/font_size = 15
text = " Забронировать "
[node name="Repos" type="Node" parent="."]

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=9 format=3 uid="uid://csfn8q6b5hj4y"]
[gd_scene load_steps=8 format=3 uid="uid://csfn8q6b5hj4y"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_j1bkw"]
[ext_resource type="Script" path="res://scenes/reservation/reservation_page.gd" id="1_prqr3"]
[ext_resource type="PackedScene" uid="uid://d0fdiesiaajlq" path="res://scenes/common/edit_field.tscn" id="2_qfs8j"]
[ext_resource type="PackedScene" uid="uid://e73v63ysty2e" path="res://scenes/common/error_box.tscn" id="4_ja64k"]
[ext_resource type="Script" path="res://scenes/common/error_box.gd" id="5_bbsyh"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dlqbv"]
bg_color = Color(0.6, 0.6, 0.6, 0)
@ -125,7 +124,6 @@ theme_override_styles/panel = SubResource("StyleBoxFlat_r7q2r")
[node name="ErrorBox" parent="." instance=ExtResource("4_ja64k")]
layout_mode = 2
script = ExtResource("5_bbsyh")
[node name="BottomBar" type="Control" parent="."]
custom_minimum_size = Vector2(1150, 0)

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=8 format=3 uid="uid://cu6e3hfdorwcg"]
[gd_scene load_steps=7 format=3 uid="uid://cu6e3hfdorwcg"]
[ext_resource type="Script" path="res://scenes/reservation/reservation_page.gd" id="1_81iob"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_57fpn"]
[ext_resource type="PackedScene" uid="uid://d0fdiesiaajlq" path="res://scenes/common/edit_field.tscn" id="3_lh5s8"]
[ext_resource type="PackedScene" uid="uid://e73v63ysty2e" path="res://scenes/common/error_box.tscn" id="4_vg752"]
[ext_resource type="Script" path="res://scenes/common/error_box.gd" id="5_xmu5c"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dlqbv"]
bg_color = Color(0.6, 0.6, 0.6, 0)
@ -119,7 +118,6 @@ theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8")
[node name="ErrorBox" parent="." instance=ExtResource("4_vg752")]
layout_mode = 2
script = ExtResource("5_xmu5c")
[node name="BottomBar" type="Control" parent="."]
custom_minimum_size = Vector2(1150, 0)

View File

@ -25,6 +25,8 @@ enum Types {
@onready var _room_field := $RoomField
@onready var _description_field := $DescriptionField
var _reservation : ReservationEntity = null
func _process(delta):
_process_fonts()
_process_separation()
@ -44,7 +46,7 @@ func _process_font_size(obj, k):
func _process_separation():
var separation = get_theme_constant("separation")
var new_separation = get_viewport_rect().size.y/28
var new_separation = get_viewport_rect().size.y*(1.0/19.0) - 715.0/19.0
if separation != new_separation:
add_theme_constant_override("separation", new_separation)
@ -75,17 +77,17 @@ func _on_delete_button_pressed():
func _load_info():
var reservation_repo = _main.get_reservation_repo()
var reservation_id = reservation_repo.get_selected_reservation_id()
var reservation = await reservation_repo.get_reservation(reservation_id)
_reservation = await reservation_repo.get_reservation(reservation_id)
var room_repo = _main.get_room_repo()
var room = await room_repo.get_room(reservation.room_id)
var room = await room_repo.get_room(_reservation.room_id)
var room_title = room.title if room != null else ""
_title_field.set_value(reservation.title)
_start_time_field.set_value(reservation.start_time)
_finish_time_field.set_value(reservation.finish_time)
_room_field.set_value({"title": room_title, "id": reservation.room_id})
_date_field.set_value(reservation.date)
_title_field.set_value(_reservation.title)
_start_time_field.set_value(_reservation.start_time)
_finish_time_field.set_value(_reservation.finish_time)
_date_field.set_value(_reservation.date)
_room_field.set_value({"title": room_title, "id": _reservation.room_id})
func _load_room():
if _room_field.get_value().title == "":
@ -96,11 +98,6 @@ func _load_date():
if _date_field.get_value() == "":
_date_field.set_value(_main.get_selected_date())
func _get_current_room_id():
var room_repo = _main.get_room_repo()
var room = room_repo.get_selected_room()
return room.id if room != null else null
func _create_reservation():
if not await _fields_are_correct():
return
@ -158,9 +155,7 @@ func _delete_reservation():
func _fields_are_correct():
var successful := true
#if len(_title_field.get_value()) < 1:
# print("The title is not entered.")
# _error_box.set_message("Не введено название встречи")
#if not _title_is_correct():
# successful = false
if not await _time_is_correct():
@ -168,18 +163,77 @@ func _fields_are_correct():
return successful
func _title_is_correct():
if len(_title_field.get_value()) < 1:
print("The title is not entered.")
_error_box.set_message("Не введено название встречи")
return false
return true
func _time_is_correct():
var start_time = _start_time_field.get_value()
var finish_time = _finish_time_field.get_value()
if _time_is_not_entered(start_time, finish_time):
return false
if _time_or_date_is_before_now(start_time):
return false
if _start_time_is_after_finish_time(start_time, finish_time):
return false
if await _selected_time_is_busy(start_time, finish_time):
return false
return true
func _time_is_not_entered(start_time: Dictionary, finish_time: Dictionary):
var time_is_not_entered = \
start_time["hours"] == 0 and start_time["minutes"] == 0 or \
finish_time["hours"] == 0 and finish_time["minutes"] == 0
if time_is_not_entered:
_error_box.set_message("Введите время начала и окончания встречи")
return false
return true
return false
func _time_or_date_is_before_now(start_time: Dictionary):
var time_is_before_now = _time_is_before_current_time(start_time)
var date_is_before_now = _date_is_before_current_date(_date_field.get_value())
if time_is_before_now or date_is_before_now:
_error_box.set_message("Нельзя зарезервировать на прошедшее время")
return true
return false
func _time_is_before_current_time(time) -> bool:
if _main.get_current_page() == Main.Pages.ReservationEdit and _reservation:
var selected_start_time = get_start_time()
if selected_start_time.hours == _reservation.start_time.hours and \
selected_start_time.minutes == _reservation.start_time.minutes:
return false
var current_time = Time.get_time_dict_from_system()
var time_in_minutes = time.hours*60 + time.minutes
var current_time_in_minutes = current_time.hour*60 + current_time.minute
return time_in_minutes < current_time_in_minutes
func _date_is_before_current_date(date: String) -> bool:
var current_date = _main.get_current_date()
return _date_to_number(date) < _date_to_number(current_date)
func _date_to_number(date_str: String) -> int:
var parts = date_str.split(".")
assert(parts.size() == 3, "Некорректная дата: " + date_str)
return int(parts[2] + parts[1].lpad(2, "0") + parts[0].lpad(2, "0"))
func _start_time_is_after_finish_time(start_time: Dictionary, finish_time: Dictionary):
var start_time_is_after_finish_time = \
start_time["hours"] > finish_time["hours"] or \
(start_time["hours"] == finish_time["hours"] and \
@ -188,8 +242,11 @@ func _time_is_correct():
if start_time_is_after_finish_time:
print("Start time should not be more than or equal to finish time.")
_error_box.set_message("Время начала не может быть больше времени окончания")
return false
return true
return false
func _selected_time_is_busy(start_time: Dictionary, finish_time: Dictionary):
var start_time_in_minutes = start_time.hours*60 + start_time.minutes
var finish_time_in_minutes = finish_time.hours*60 + finish_time.minutes
var service = _main.get_reservation_service()
@ -201,17 +258,26 @@ func _time_is_correct():
if is_busy:
print("The selected time slot is busy.")
_error_box.set_message("Выбранный временной интервал занят")
return false
return true
return true
return false
func set_start_time(value):
func get_start_time() -> Dictionary:
return _start_time_field.get_value()
func get_finish_time() -> Dictionary:
return _finish_time_field.get_value()
func set_start_time(value) -> void:
_start_time_field.set_value(value)
func set_finish_time(value) -> void:
_finish_time_field.set_value(value)
func update():
_ready()
if type == Types.Edit:
if type == Types.Edit and _main.get_previous_page() == Main.Pages.Board:
_load_info()
else:
_load_room()