From fce4a19b426b4ff0ffcacedd7d136be9913b9f9d Mon Sep 17 00:00:00 2001 From: DarkSlein Date: Tue, 25 Mar 2025 14:13:38 +0300 Subject: [PATCH] Added date and room selection during reservation creation/edit --- assets/themes/rooms_menu.tres | 4 ++ scenes/board/board.gd | 16 +++-- scenes/board/rooms_menu.gd | 8 ++- scenes/board/rooms_menu.tscn | 14 +++-- scenes/common/calendar/calendar_edit.gd | 51 ++++++++++++++++ scenes/common/calendar/calendar_edit.tscn | 19 +++--- scenes/common/calendar/calendar_setting.gd | 11 +++- scenes/common/edit_field.gd | 23 ++++++-- scenes/common/edit_field.tscn | 8 ++- scenes/common/list_box/list_box_edit.gd | 62 ++++++++++++++++++++ scenes/common/list_box/list_box_edit.tscn | 17 ++++++ scenes/common/list_box/list_box_setting.tscn | 9 +++ scenes/common/time/time_edit.tscn | 7 +-- scenes/main/main.gd | 6 +- scenes/main/main_tablet.gd | 47 ++++++++------- scenes/main/main_tablet.tscn | 13 ++-- scenes/reservation/reservation_creation.tscn | 3 +- scenes/reservation/reservation_edit.tscn | 5 +- scenes/reservation/reservation_page.gd | 50 +++++++++++----- scenes/reservation/room_selection.gd | 39 ++++++++++++ scenes/reservation/room_selection.tscn | 15 +++++ src/domain/services/reservation.gd | 7 ++- src/infra/repos/abstract/reservation.gd | 2 +- src/infra/repos/backend/event_handler_ws.gd | 3 +- src/infra/repos/backend/reservation_http.gd | 4 +- src/infra/repos/backend/room_http.gd | 12 +++- src/infra/repos/local/reservation_local.gd | 2 +- 27 files changed, 367 insertions(+), 90 deletions(-) create mode 100644 assets/themes/rooms_menu.tres create mode 100644 scenes/common/list_box/list_box_edit.gd create mode 100644 scenes/common/list_box/list_box_edit.tscn create mode 100644 scenes/common/list_box/list_box_setting.tscn create mode 100644 scenes/reservation/room_selection.gd create mode 100644 scenes/reservation/room_selection.tscn diff --git a/assets/themes/rooms_menu.tres b/assets/themes/rooms_menu.tres new file mode 100644 index 0000000..d5a6497 --- /dev/null +++ b/assets/themes/rooms_menu.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://cdor0uw5aqxkq"] + +[resource] +default_font_size = 72 diff --git a/scenes/board/board.gd b/scenes/board/board.gd index d3661ab..b8aabcc 100644 --- a/scenes/board/board.gd +++ b/scenes/board/board.gd @@ -67,10 +67,13 @@ func _process_schedule(delta): _schedule_update_timer += delta func _ready(): + _remove_reservations() + _initialize() + +func _initialize(): _connect_signals() _remove_time_slots() - _fill_with_slots() await get_tree().create_timer(0.1, false).timeout @@ -203,10 +206,12 @@ func _input(event): if _main.get_current_page() == Main.Pages.Board: var time = _get_time_by_position(event.position) - if _time_is_before_current_time(time): + if _time_is_before_current_time(time) and _selected_date_is_current(): return var creation_page = _main.load_page(Main.Pages.ReservationCreation) + creation_page.clean() + creation_page.update() creation_page.set_start_time(time) func _get_time_by_position(position): @@ -229,6 +234,9 @@ func _clicked_on_timeline(pos: Vector2): pos.y < _timeline.size.y + timeline_position.y ) +func _selected_date_is_current(): + return _main.get_selected_date() == _main.get_current_date() + func _time_is_before_current_time(time): var current_time = Time.get_time_dict_from_system() var time_in_minutes = time.hours*60 + time.minutes @@ -245,7 +253,6 @@ func _on_room_button_pressed(): if _rooms_menu.visible: _rooms_menu.hide() else: - _rooms_menu.position = _date.position _rooms_menu.show() func _on_room_selected(idx, text): @@ -259,6 +266,7 @@ func _on_room_selected(idx, text): update() func _on_date_button_pressed(): + _main.start_date_selection() _main.load_page(Main.Pages.CalendarSetting) func _on_reservations_updated(reservations): @@ -267,5 +275,5 @@ func _on_reservations_updated(reservations): func update(): _block_board_click_for(0.25) - _ready() + _initialize() _update_schedule() diff --git a/scenes/board/rooms_menu.gd b/scenes/board/rooms_menu.gd index b14c7e1..e0d73b2 100644 --- a/scenes/board/rooms_menu.gd +++ b/scenes/board/rooms_menu.gd @@ -8,8 +8,9 @@ func _process(delta): _process_items_font_size() func _process_items_font_size(): - var font_size = _items.get_theme_default_font_size() - var new_font_size = get_viewport_rect().size.y/35 + 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 if font_size != new_font_size: _items.add_theme_font_size_override("font_size", new_font_size) @@ -28,6 +29,9 @@ func clear(): func select(idx): _items.select(idx) +func deselect_all(): + _items.deselect_all() + func _on_item_clicked(index, at_position, mouse_button_index): var text = _items.get_item_text(index) item_clicked.emit(index, text) diff --git a/scenes/board/rooms_menu.tscn b/scenes/board/rooms_menu.tscn index 0c39c93..1d213fd 100644 --- a/scenes/board/rooms_menu.tscn +++ b/scenes/board/rooms_menu.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=3 format=3 uid="uid://bt3h3m10qx1jr"] +[gd_scene load_steps=4 format=3 uid="uid://bt3h3m10qx1jr"] [ext_resource type="Script" path="res://scenes/board/rooms_menu.gd" id="1_5p83j"] -[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_yypwp"] +[ext_resource type="Theme" uid="uid://cdor0uw5aqxkq" path="res://assets/themes/rooms_menu.tres" id="2_xsikm"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_36vy7"] +bg_color = Color(0.137255, 0.137255, 0.137255, 0.658824) [node name="RoomsMenu" type="Control"] layout_mode = 3 @@ -10,9 +13,10 @@ script = ExtResource("1_5p83j") [node name="Items" type="ItemList" parent="."] layout_mode = 0 -offset_right = 500.0 -offset_bottom = 280.0 -theme = ExtResource("1_yypwp") +offset_right = 750.0 +offset_bottom = 420.0 +theme = ExtResource("2_xsikm") +theme_override_styles/panel = SubResource("StyleBoxFlat_36vy7") auto_height = true item_count = 4 item_0/text = "Маркетинг" diff --git a/scenes/common/calendar/calendar_edit.gd b/scenes/common/calendar/calendar_edit.gd index e07a0bf..e6d97dd 100644 --- a/scenes/common/calendar/calendar_edit.gd +++ b/scenes/common/calendar/calendar_edit.gd @@ -1 +1,52 @@ extends Control + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _edit := $Edit + +@export var editable : bool: + set(value): + editable = value + set_editable(value) + +var _date := "" +var _date_setting_page + +func _process(delta): + _process_font_size() + +func _process_font_size(): + var font_size = _edit.get_theme_default_font_size() + var new_font_size = get_viewport_rect().size.y/35 + if font_size != new_font_size: + _edit.add_theme_font_size_override("font_size", new_font_size) + +func _ready(): + initialize_signals() + +func initialize_signals(): + _edit.focus_entered.connect(_on_click) + +func _on_click(): + if _main.get_current_page() == Main.Pages.CalendarSetting: + return + + _date_setting_page = _main.load_page(Main.Pages.CalendarSetting) + _date_setting_page.date_selected.connect(self._on_date_is_set) + +func _on_date_is_set(date: Calendar.DateObj): + _date_setting_page.date_selected.disconnect(_on_date_is_set) + set_date("%02d.%02d.%04d" % [date.day, date.month, date.year]) + +func set_date(date: String): + _date = date + _edit.text = get_date() + +func get_date(): + return _date + +func set_editable(value): + _edit.editable = value + +func clean(): + _date = "" + _edit.text = "" diff --git a/scenes/common/calendar/calendar_edit.tscn b/scenes/common/calendar/calendar_edit.tscn index 205072f..233aebd 100644 --- a/scenes/common/calendar/calendar_edit.tscn +++ b/scenes/common/calendar/calendar_edit.tscn @@ -3,18 +3,21 @@ [ext_resource type="Script" path="res://scenes/common/calendar/calendar_edit.gd" id="1_jxhnl"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_e6eik"] -[node name="Calendar" type="Control"] -layout_mode = 3 -anchors_preset = 15 +[node name="Calendar" type="VBoxContainer"] +anchors_preset = 10 anchor_right = 1.0 -anchor_bottom = 1.0 +offset_bottom = 72.0 grow_horizontal = 2 -grow_vertical = 2 script = ExtResource("1_jxhnl") [node name="Button" type="Button" parent="."] -layout_mode = 0 -offset_right = 24.0 -offset_bottom = 31.0 +visible = false +layout_mode = 2 theme = ExtResource("2_e6eik") text = "Открыть календарь" + +[node name="Edit" type="LineEdit" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_e6eik") +virtual_keyboard_enabled = false diff --git a/scenes/common/calendar/calendar_setting.gd b/scenes/common/calendar/calendar_setting.gd index 3b9816d..03b998a 100644 --- a/scenes/common/calendar/calendar_setting.gd +++ b/scenes/common/calendar/calendar_setting.gd @@ -23,7 +23,7 @@ func _process(delta): _process_font_size(_next_month_button, 32) func _process_grid_size(): - for day_label in _days_grid.get_children(): + for day_label in _days_grid.get_children(): var font_size = day_label.label_settings.font_size var new_font_size = get_viewport_rect().size.y/32 if font_size != new_font_size: @@ -72,6 +72,13 @@ func update_calendar() -> void: var day_label = create_day_label(date_obj, today) _days_grid.add_child(day_label) + _cancel_selection() + +func _cancel_selection(): + for day_label in _days_grid.get_children(): + for selection in day_label.get_children(): + selection.queue_free() + func create_day_label(date_obj: Calendar.DateObj, today: Calendar.DateObj) -> CalendarLabel: var label = CalendarLabel.new(str(date_obj.day), true) @@ -118,7 +125,7 @@ func _on_next_month_pressed() -> void: update_calendar() func update(): - pass + _cancel_selection() class CalendarLabel: extends Label diff --git a/scenes/common/edit_field.gd b/scenes/common/edit_field.gd index 89c99a0..04fdf81 100644 --- a/scenes/common/edit_field.gd +++ b/scenes/common/edit_field.gd @@ -5,7 +5,8 @@ enum Type { Line, Text, Calendar, - Time + Time, + ListBox } @export var title : String: @@ -28,6 +29,7 @@ enum Type { @onready var _calendar = $Container/Value/Calendar @onready var _time = $Container/Value/Time @onready var _text = $Container/Value/Text +@onready var _list_box = $Container/Value/ListBox var _type @@ -62,12 +64,17 @@ func get_value(): Type.Text: return _text.text Type.Calendar: - return "" + return _calendar.get_date() Type.Time: return { "hours": _time.get_hours(), "minutes": _time.get_minutes() } + Type.ListBox: + return { + "id": _list_box.get_id(), + "title": _list_box.get_title() + } func set_value(value): match _type: @@ -76,9 +83,12 @@ func set_value(value): Type.Text: _text.text = value Type.Calendar: - pass + _calendar.set_date(value) Type.Time: _time.set_time(value.hours, value.minutes) + Type.ListBox: + _list_box.set_id(value.id) + _list_box.set_title(value.title) func set_editable(value): if _line == null: @@ -96,6 +106,7 @@ func set_type(type): _text.visible = false _calendar.visible = false _time.visible = false + _list_box.visible = false _type = type @@ -108,6 +119,8 @@ func set_type(type): _calendar.visible = true Type.Time: _time.visible = true + Type.ListBox: + _list_box.visible = true func clean(): match _type: @@ -116,6 +129,8 @@ func clean(): Type.Text: _text.text = "" Type.Calendar: - pass + _calendar.clean() Type.Time: _time.clean() + Type.ListBox: + _list_box.clean() diff --git a/scenes/common/edit_field.tscn b/scenes/common/edit_field.tscn index c80b5fb..c8fbacf 100644 --- a/scenes/common/edit_field.tscn +++ b/scenes/common/edit_field.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://d0fdiesiaajlq"] +[gd_scene load_steps=7 format=3 uid="uid://d0fdiesiaajlq"] [ext_resource type="Script" path="res://scenes/common/edit_field.gd" id="1_sdy7t"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_iq8f3"] [ext_resource type="Theme" uid="uid://bbboqrxd230bp" path="res://assets/themes/edit_label_font.tres" id="3_4sp4y"] [ext_resource type="PackedScene" uid="uid://drdv8adk1wi8f" path="res://scenes/common/calendar/calendar_edit.tscn" id="4_hlx5p"] [ext_resource type="PackedScene" uid="uid://bhd0xvnvoqslr" path="res://scenes/common/time/time_edit.tscn" id="5_d0drs"] +[ext_resource type="PackedScene" uid="uid://dn6skkh5c7f4s" path="res://scenes/common/list_box/list_box_edit.tscn" id="6_ovelt"] [node name="EditField" type="HBoxContainer"] anchors_preset = 10 @@ -66,3 +67,8 @@ layout_mode = 2 visible = false layout_mode = 2 size_flags_horizontal = 3 + +[node name="ListBox" parent="Container/Value" instance=ExtResource("6_ovelt")] +visible = false +layout_mode = 2 +editable = true diff --git a/scenes/common/list_box/list_box_edit.gd b/scenes/common/list_box/list_box_edit.gd new file mode 100644 index 0000000..0aa919c --- /dev/null +++ b/scenes/common/list_box/list_box_edit.gd @@ -0,0 +1,62 @@ +extends Control + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _edit := $Edit + +@export var editable : bool: + set(value): + editable = value + await ready + set_editable(value) + +var _title := "" +var _id := "" +var _room_setting_page + +func _process(delta): + _process_font_size() + +func _process_font_size(): + var font_size = _edit.get_theme_default_font_size() + var new_font_size = get_viewport_rect().size.y/35 + if font_size != new_font_size: + _edit.add_theme_font_size_override("font_size", new_font_size) + +func _ready(): + initialize_signals() + +func initialize_signals(): + _edit.focus_entered.connect(_on_click) + +func _on_click(): + if _main.get_current_page() == Main.Pages.RoomSelection: + return + + _room_setting_page = _main.load_page(Main.Pages.RoomSelection) + _room_setting_page.room_selected.connect(_on_room_is_set) + +func _on_room_is_set(title: String, id: String): + _room_setting_page.room_selected.disconnect(_on_room_is_set) + set_title(title) + set_id(id) + +func set_title(title: String): + _title = title + _edit.text = title + +func get_title() -> String: + return _title + +func set_id(id: String): + _id = id + +func get_id() -> String: + return _id + +func set_editable(value): + _edit.editable = value + +func clean(): + _title = "" + _id = "" + _edit.text = "" diff --git a/scenes/common/list_box/list_box_edit.tscn b/scenes/common/list_box/list_box_edit.tscn new file mode 100644 index 0000000..5745fb4 --- /dev/null +++ b/scenes/common/list_box/list_box_edit.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://dn6skkh5c7f4s"] + +[ext_resource type="Script" path="res://scenes/common/list_box/list_box_edit.gd" id="1_rb63m"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_ubgs8"] + +[node name="ListBoxEdit" type="VBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 72.0 +grow_horizontal = 2 +script = ExtResource("1_rb63m") + +[node name="Edit" type="LineEdit" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_ubgs8") +virtual_keyboard_enabled = false diff --git a/scenes/common/list_box/list_box_setting.tscn b/scenes/common/list_box/list_box_setting.tscn new file mode 100644 index 0000000..e4df976 --- /dev/null +++ b/scenes/common/list_box/list_box_setting.tscn @@ -0,0 +1,9 @@ +[gd_scene format=3 uid="uid://dveqs4kjvc2jv"] + +[node name="ListBox" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/scenes/common/time/time_edit.tscn b/scenes/common/time/time_edit.tscn index 42594ac..ec39e9f 100644 --- a/scenes/common/time/time_edit.tscn +++ b/scenes/common/time/time_edit.tscn @@ -14,7 +14,7 @@ script = ExtResource("1_2wxyg") [node name="TimeEdit" type="LineEdit" parent="."] visible = false layout_mode = 2 -text = "15:04 " +text = "10:34 " placeholder_text = "hh:mm (a/p)m" script = ExtResource("2_7d4ae") current_time = true @@ -24,8 +24,3 @@ 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"] diff --git a/scenes/main/main.gd b/scenes/main/main.gd index a837a19..b63c152 100644 --- a/scenes/main/main.gd +++ b/scenes/main/main.gd @@ -6,7 +6,8 @@ enum Pages { ReservationCreation, ReservationEdit, TimeSetting, - CalendarSetting + CalendarSetting, + RoomSelection } func get_current_page(): @@ -38,3 +39,6 @@ func get_selected_room() -> RoomEntity: func is_current_date_selected() -> bool: return true + +func start_date_selection() -> void: + pass diff --git a/scenes/main/main_tablet.gd b/scenes/main/main_tablet.gd index 0322407..4473514 100644 --- a/scenes/main/main_tablet.gd +++ b/scenes/main/main_tablet.gd @@ -32,7 +32,8 @@ enum Status { Pages.ReservationCreation: $Left/Pages/ReservationCreation, Pages.ReservationEdit: $Left/Pages/ReservationEdit, Pages.TimeSetting: $Left/Pages/TimeSetting, - Pages.CalendarSetting: $Left/Pages/CalendarSetting + Pages.CalendarSetting: $Left/Pages/CalendarSetting, + Pages.RoomSelection: $Left/Pages/RoomSelection } @onready var _time_status_indent := $Left/TimeStatusContainer/Indent @onready var _time_label := $Left/TimeStatusContainer/TimeLabel @@ -52,7 +53,7 @@ var _previous_page : Pages var _status : Status var _status_check_timer := 0.0 -var _selected_date := _get_current_date() +var _selected_date := get_current_date() func _ready(): initialize_signals() @@ -65,8 +66,6 @@ func initialize_signals(): _45_min_button.pressed.connect(_on_45_min_button_pressed) _1_hour_button.pressed.connect(_on_1_hour_button_pressed) - _pages[Pages.CalendarSetting].date_selected.connect(_on_date_selected) - func _process(delta): _process_time_status_indent() _process_status(delta) @@ -110,7 +109,7 @@ func _update_status(reservations=null): if reservations == null: var room = get_selected_room() reservations = await _reservation_repo.list_reservations({ - "date": _get_current_date(), + "date": get_current_date(), "room_id": room.id if room else '' }) @@ -230,6 +229,26 @@ func _create_default_reservation(minutes_of_reservation): load_page(Main.Pages.Board, true) +func get_selected_date() -> String: + return _selected_date + +func get_current_date() -> String: + var date = Time.get_date_dict_from_system() + return "%02d.%02d.%04d" % [date.day, date.month, date.year] + +func is_current_date_selected() -> bool: + return get_selected_date() == get_current_date() + +func get_selected_room() -> RoomEntity: + var room_repo = get_room_repo() + return room_repo.get_selected_room() + +func hide_keyboard(): + _keyboard.hide() + +func start_date_selection(): + _pages[Pages.CalendarSetting].date_selected.connect(_on_date_selected) + func _on_reservations_updated(reservations): _update_status() @@ -248,23 +267,7 @@ func _on_45_min_button_pressed(): func _on_1_hour_button_pressed(): _create_default_reservation(60) -func get_selected_date() -> String: - return _selected_date - -func _get_current_date() -> String: - var date = Time.get_date_dict_from_system() - return "%02d.%02d.%04d" % [date.day, date.month, date.year] - -func is_current_date_selected() -> bool: - return get_selected_date() == _get_current_date() - -func get_selected_room() -> RoomEntity: - var room_repo = get_room_repo() - return room_repo.get_selected_room() - -func hide_keyboard(): - _keyboard.hide() - 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() diff --git a/scenes/main/main_tablet.tscn b/scenes/main/main_tablet.tscn index 0423a0f..c8e7f8f 100644 --- a/scenes/main/main_tablet.tscn +++ b/scenes/main/main_tablet.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://bkrvh8vjpgqot"] +[gd_scene load_steps=19 format=3 uid="uid://bkrvh8vjpgqot"] [ext_resource type="Script" path="res://scenes/main/main_tablet.gd" id="1_fr6s5"] [ext_resource type="PackedScene" uid="uid://c431r28ef5edp" path="res://scenes/board/board.tscn" id="2_n47h4"] @@ -8,6 +8,7 @@ [ext_resource type="Theme" uid="uid://byopik87nb8vv" path="res://assets/themes/status_font.tres" id="5_atujq"] [ext_resource type="PackedScene" uid="uid://bc4tcq608v5rx" path="res://scenes/common/calendar/calendar_setting.tscn" id="6_c0c0t"] [ext_resource type="Theme" uid="uid://yn1nbokvmv6n" path="res://assets/themes/small.tres" id="6_nde4h"] +[ext_resource type="PackedScene" uid="uid://dik2e02vahb3g" path="res://scenes/reservation/room_selection.tscn" id="7_7j0ww"] [ext_resource type="Theme" uid="uid://b8tbd62jtmgdx" path="res://assets/themes/instant_button_font.tres" id="8_bmn8p"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="9_wpf8g"] [ext_resource type="Script" path="res://src/infra/repos/backend/reservation_http.gd" id="10_v7sup"] @@ -74,20 +75,24 @@ visible = false layout_mode = 2 size_flags_horizontal = 3 +[node name="RoomSelection" parent="Left/Pages" instance=ExtResource("7_7j0ww")] +visible = false +layout_mode = 2 + [node name="TimeStatusContainer" type="VBoxContainer" parent="Left"] layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 0 [node name="Indent" type="BoxContainer" parent="Left/TimeStatusContainer"] -custom_minimum_size = Vector2(0, 0.666667) +custom_minimum_size = Vector2(0, 195) layout_mode = 2 size_flags_vertical = 3 [node name="TimeLabel" type="Label" parent="Left/TimeStatusContainer"] layout_mode = 2 theme = ExtResource("5_atujq") -text = "12:42" +text = "12:15" horizontal_alignment = 1 [node name="StatusLabel" type="Label" parent="Left/TimeStatusContainer"] @@ -152,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 = 0 +theme_override_font_sizes/font_size = 16 text = " Забронировать " [node name="Repos" type="Node" parent="."] diff --git a/scenes/reservation/reservation_creation.tscn b/scenes/reservation/reservation_creation.tscn index a5a33fb..9246de7 100644 --- a/scenes/reservation/reservation_creation.tscn +++ b/scenes/reservation/reservation_creation.tscn @@ -74,7 +74,6 @@ layout_mode = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") [node name="DateField" parent="." instance=ExtResource("2_qfs8j")] -visible = false layout_mode = 2 title = "Дата" type = 2 @@ -104,7 +103,7 @@ editable = false [node name="RoomField" parent="." instance=ExtResource("2_qfs8j")] layout_mode = 2 title = "Комната" -editable = false +type = 4 [node name="Splitter4" type="Panel" parent="."] visible = false diff --git a/scenes/reservation/reservation_edit.tscn b/scenes/reservation/reservation_edit.tscn index d5ca768..3a752b4 100644 --- a/scenes/reservation/reservation_edit.tscn +++ b/scenes/reservation/reservation_edit.tscn @@ -68,7 +68,6 @@ layout_mode = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") [node name="DateField" parent="." instance=ExtResource("3_lh5s8")] -visible = false layout_mode = 2 title = "Дата" type = 2 @@ -85,7 +84,6 @@ title = "Конец" type = 3 [node name="Splitter3" type="Panel" parent="."] -visible = false custom_minimum_size = Vector2(0, 5) layout_mode = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") @@ -97,10 +95,9 @@ title = "Создатель" editable = false [node name="RoomField" parent="." instance=ExtResource("3_lh5s8")] -visible = false layout_mode = 2 title = "Комната" -editable = false +type = 4 [node name="Splitter4" type="Panel" parent="."] visible = false diff --git a/scenes/reservation/reservation_page.gd b/scenes/reservation/reservation_page.gd index bf3a91e..faace04 100644 --- a/scenes/reservation/reservation_page.gd +++ b/scenes/reservation/reservation_page.gd @@ -73,16 +73,28 @@ func _on_delete_button_pressed(): _delete_reservation() func _load_info(): - var repo = _main.get_reservation_repo() - var reservation_id = repo.get_selected_reservation_id() - var reservation = await repo.get_reservation(reservation_id) + 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) + + var room_repo = _main.get_room_repo() + 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) func _load_room(): - _room_field.set_value(_main.get_selected_room().title) + if _room_field.get_value().title == "": + var room = _main.get_selected_room() + _room_field.set_value({"title": room.title, "id": room.id}) + +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() @@ -95,16 +107,16 @@ func _create_reservation(): var dto = CreateReservationDTO.new() dto.title = _title_field.get_value() - dto.date = _main.get_selected_date() + dto.date = _date_field.get_value() dto.start_time = _start_time_field.get_value() dto.finish_time = _finish_time_field.get_value() dto.creator = _creator_field.get_value() - dto.room_id = _get_current_room_id() + dto.room_id = _room_field.get_value().id dto.description = _description_field.get_value() dto.color = randi_range(1, 3) - var repo = _main.get_reservation_repo() - repo.create_reservation(dto) + var reservation_repo = _main.get_reservation_repo() + reservation_repo.create_reservation(dto) dto.queue_free() @@ -121,14 +133,14 @@ func _update_reservation(): dto.start_time = _start_time_field.get_value() dto.finish_time = _finish_time_field.get_value() dto.creator = _creator_field.get_value() - dto.room_id = _get_current_room_id() + dto.room_id = _room_field.get_value().id dto.description = _description_field.get_value() dto.color = randi_range(1, 3) - var repo = _main.get_reservation_repo() - var reservation_id = repo.get_selected_reservation_id() - repo.change_reservation(reservation_id, dto) - repo.set_selected_reservation_id(null) + var reservation_repo = _main.get_reservation_repo() + var reservation_id = reservation_repo.get_selected_reservation_id() + reservation_repo.change_reservation(reservation_id, dto) + reservation_repo.set_selected_reservation_id(null) dto.queue_free() @@ -181,7 +193,10 @@ func _time_is_correct(): 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() - var is_busy = await service.is_time_busy(start_time_in_minutes, finish_time_in_minutes) + var selected_room_id = _room_field.get_value().id + var selected_date = _date_field.get_value() + var is_busy = await service.is_time_busy(start_time_in_minutes, finish_time_in_minutes, \ + selected_room_id, selected_date) if is_busy: print("The selected time slot is busy.") @@ -198,10 +213,13 @@ func update(): if type == Types.Edit: _load_info() - - _load_room() + else: + _load_room() + _load_date() func clean(): _title_field.clean() _start_time_field.clean() _finish_time_field.clean() + _date_field.clean() + _room_field.clean() diff --git a/scenes/reservation/room_selection.gd b/scenes/reservation/room_selection.gd new file mode 100644 index 0000000..fe7999e --- /dev/null +++ b/scenes/reservation/room_selection.gd @@ -0,0 +1,39 @@ +extends Control + +signal room_selected(title: String, id: String) + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _rooms_menu := $RoomsMenu + +var _rooms : Array[RoomEntity] = [] + +func _ready(): + _connect_signals() + + await get_tree().create_timer(0.1, false).timeout + _load_rooms() + +func _load_rooms(): + var room_repo = _main.get_room_repo() + if room_repo.get_selected_room(): + return + + _rooms_menu.clear() + + var rooms = await room_repo.list_rooms() + for room in rooms: + _rooms.append(room) + _rooms_menu.add_item(room.title) + + if len(rooms) < 0: + print('Not enough rooms') + +func _connect_signals(): + _rooms_menu.item_clicked.connect(_on_room_selected) + +func _on_room_selected(idx, text): + room_selected.emit(_rooms[idx].title, _rooms[idx].id) + _main.go_to_previous_page(true) + +func update(): + _rooms_menu.deselect_all() diff --git a/scenes/reservation/room_selection.tscn b/scenes/reservation/room_selection.tscn new file mode 100644 index 0000000..b99dcf7 --- /dev/null +++ b/scenes/reservation/room_selection.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=3 uid="uid://dik2e02vahb3g"] + +[ext_resource type="PackedScene" uid="uid://bt3h3m10qx1jr" path="res://scenes/board/rooms_menu.tscn" id="1_carpv"] +[ext_resource type="Script" path="res://scenes/reservation/room_selection.gd" id="1_wbxoa"] + +[node name="RoomSelection" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_wbxoa") + +[node name="RoomsMenu" parent="." instance=ExtResource("1_carpv")] diff --git a/src/domain/services/reservation.gd b/src/domain/services/reservation.gd index 18a9574..c4b369f 100644 --- a/src/domain/services/reservation.gd +++ b/src/domain/services/reservation.gd @@ -3,13 +3,14 @@ class_name ReservationService @onready var _main: Main = get_tree().get_current_scene() -func is_time_busy(new_start_time_minutes, new_finish_time_minutes): +func is_time_busy(new_start_time_minutes, new_finish_time_minutes, room_id=null, date=null): var selected_room = _main.get_selected_room() + var selected_date = _main.get_selected_date() var reservation_repo = _main.get_reservation_repo() var reservations = await reservation_repo.list_reservations({ - "date": _main.get_selected_date(), - "room_id": selected_room.id + "date": date if date != null else selected_date, + "room_id": room_id if room_id != null else selected_room.id }) var selected_reservation_id = reservation_repo.get_selected_reservation_id() diff --git a/src/infra/repos/abstract/reservation.gd b/src/infra/repos/abstract/reservation.gd index aaf2d2c..364190b 100644 --- a/src/infra/repos/abstract/reservation.gd +++ b/src/infra/repos/abstract/reservation.gd @@ -20,7 +20,7 @@ func change_reservation(reservation_id, dto: UpdateReservationDTO): func get_reservation(reservation_id): pass -func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: +func list_reservations(filters: Dictionary = {}) -> Array: return [] func set_selected_reservation_id(value): diff --git a/src/infra/repos/backend/event_handler_ws.gd b/src/infra/repos/backend/event_handler_ws.gd index c011161..2e5a032 100644 --- a/src/infra/repos/backend/event_handler_ws.gd +++ b/src/infra/repos/backend/event_handler_ws.gd @@ -1,7 +1,8 @@ +@tool class_name EventHandlerWS extends EventHandler -const BACKEND_URL = "http://192.168.0.147:5000/socket.io" +const BACKEND_URL = "http://89.223.87.146:5004/socket.io" var _room_id: String = "" var _jwt_token: String = "" var _client: SocketIOClient diff --git a/src/infra/repos/backend/reservation_http.gd b/src/infra/repos/backend/reservation_http.gd index 831e7f3..2e4d3d2 100644 --- a/src/infra/repos/backend/reservation_http.gd +++ b/src/infra/repos/backend/reservation_http.gd @@ -2,7 +2,7 @@ extends AbstractReservationRepo class_name ReservationRepoHTTP -const BASE_URL = "http://192.168.1.178:5000" +const BASE_URL = "http://89.223.87.146:5004" const RESERVATION_ENDPOINT = "/reservation/" const HEALTH_ENDPOINT = "/health/" @@ -48,7 +48,7 @@ func get_reservation(reservation_id: String) -> ReservationEntity: var result = await _http_client.request(RESERVATION_ENDPOINT + "%s" % reservation_id, HTTPClient.METHOD_GET) return _parse_reservation_entity(result) if result is Dictionary else null -func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: +func list_reservations(filters: Dictionary = {}) -> Array: var query = "?" for key in filters: query += "%s=%s&" % [key, filters[key]] diff --git a/src/infra/repos/backend/room_http.gd b/src/infra/repos/backend/room_http.gd index 17f59c8..07bcbf0 100644 --- a/src/infra/repos/backend/room_http.gd +++ b/src/infra/repos/backend/room_http.gd @@ -1,7 +1,8 @@ +@tool extends AbstractRoomRepo class_name RoomRepoHTTP -const BASE_URL = "http://192.168.1.178:5000" +const BASE_URL = "http://89.223.87.146:5004" signal rooms_loaded(rooms: Array[RoomEntity]) signal request_failed(error_message: String) @@ -23,6 +24,15 @@ func list_rooms() -> Array[RoomEntity]: emit_signal("request_failed", "Failed to load rooms") return [] +func get_room(id: String) -> RoomEntity: + var rooms = await list_rooms() + + for room in rooms: + if room.id == id: + return room + + return null + func _parse_room_list(data: Array) -> Array[RoomEntity]: var rooms: Array[RoomEntity] = [] for item in data: diff --git a/src/infra/repos/local/reservation_local.gd b/src/infra/repos/local/reservation_local.gd index 035060c..31f07e5 100644 --- a/src/infra/repos/local/reservation_local.gd +++ b/src/infra/repos/local/reservation_local.gd @@ -41,7 +41,7 @@ func change_reservation(reservation_id, dto: UpdateReservationDTO): func get_reservation(reservation_id): return _reservations[reservation_id] -func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: +func list_reservations(filters: Dictionary = {}) -> Array: var reservations = [] for key in _reservations: