Added extend finish time feature
Added reservation for the past time error Fixed layout
This commit is contained in:
parent
1307765102
commit
08bf2577d7
@ -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);
|
||||
|
||||
|
@ -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.
@ -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;
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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())
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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"]
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 = "Забронировать сейчас на"
|
||||
|
@ -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="."]
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user