Clarify and filter graphical orders
This commit is contained in:
@@ -85,10 +85,12 @@ var orders_advance_button: Button
|
|||||||
var orders_advance_option: OptionButton
|
var orders_advance_option: OptionButton
|
||||||
var orders_submit_final_button: Button
|
var orders_submit_final_button: Button
|
||||||
var orders_status: Label
|
var orders_status: Label
|
||||||
|
var order_search_timer: Timer
|
||||||
var staged_order_codes: Array[String] = []
|
var staged_order_codes: Array[String] = []
|
||||||
var order_names := {}
|
var order_names := {}
|
||||||
var final_orders_mode := false
|
var final_orders_mode := false
|
||||||
var active_order_codes: Array = []
|
var active_order_codes: Array = []
|
||||||
|
var current_order_location := ""
|
||||||
var known_order_result_count := -1
|
var known_order_result_count := -1
|
||||||
var experience_mode := "management"
|
var experience_mode := "management"
|
||||||
var pending_choices: Array = []
|
var pending_choices: Array = []
|
||||||
@@ -500,7 +502,13 @@ func _build_order_search_tab() -> void:
|
|||||||
orders_search.placeholder_text = "Search tests, medications, treatments, and procedures"
|
orders_search.placeholder_text = "Search tests, medications, treatments, and procedures"
|
||||||
orders_search.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
orders_search.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||||
orders_search.text_submitted.connect(func(_value): _request_order_search())
|
orders_search.text_submitted.connect(func(_value): _request_order_search())
|
||||||
|
orders_search.text_changed.connect(_queue_live_order_search)
|
||||||
row.add_child(orders_search)
|
row.add_child(orders_search)
|
||||||
|
order_search_timer = Timer.new()
|
||||||
|
order_search_timer.one_shot = true
|
||||||
|
order_search_timer.wait_time = 0.35
|
||||||
|
order_search_timer.timeout.connect(_request_order_search)
|
||||||
|
add_child(order_search_timer)
|
||||||
var search_button := Button.new()
|
var search_button := Button.new()
|
||||||
search_button.text = "Search"
|
search_button.text = "Search"
|
||||||
search_button.pressed.connect(_request_order_search)
|
search_button.pressed.connect(_request_order_search)
|
||||||
@@ -572,11 +580,24 @@ func _request_order_search() -> void:
|
|||||||
order_search_requested.emit(query)
|
order_search_requested.emit(query)
|
||||||
|
|
||||||
|
|
||||||
|
func _queue_live_order_search(query: String) -> void:
|
||||||
|
order_search_timer.stop()
|
||||||
|
if query.strip_edges().length() < 2:
|
||||||
|
_clear_dynamic_children(orders_search_results)
|
||||||
|
orders_status.text = ""
|
||||||
|
return
|
||||||
|
order_search_timer.start()
|
||||||
|
|
||||||
|
|
||||||
func render_order_search(rows: Array) -> void:
|
func render_order_search(rows: Array) -> void:
|
||||||
_clear_dynamic_children(orders_search_results)
|
_clear_dynamic_children(orders_search_results)
|
||||||
orders_status.text = "" if not rows.is_empty() else "No matching orders found."
|
var available_count := 0
|
||||||
for raw_order in rows:
|
for raw_order in rows:
|
||||||
var order: Dictionary = raw_order
|
var order: Dictionary = raw_order
|
||||||
|
var locations: Array = order.get("availableLocations", [])
|
||||||
|
if not locations.is_empty() and current_order_location not in locations:
|
||||||
|
continue
|
||||||
|
available_count += 1
|
||||||
var code := str(order.get("code", ""))
|
var code := str(order.get("code", ""))
|
||||||
order_names[code] = str(order.get("canonicalName", code.capitalize()))
|
order_names[code] = str(order.get("canonicalName", code.capitalize()))
|
||||||
var button := Button.new()
|
var button := Button.new()
|
||||||
@@ -585,6 +606,7 @@ func render_order_search(rows: Array) -> void:
|
|||||||
button.disabled = code in staged_order_codes or code in active_order_codes
|
button.disabled = code in staged_order_codes or code in active_order_codes
|
||||||
button.pressed.connect(_stage_order.bind(code))
|
button.pressed.connect(_stage_order.bind(code))
|
||||||
orders_search_results.add_child(button)
|
orders_search_results.add_child(button)
|
||||||
|
orders_status.text = "" if available_count > 0 else "No matching orders are available at this location."
|
||||||
|
|
||||||
|
|
||||||
func _stage_order(code: String) -> void:
|
func _stage_order(code: String) -> void:
|
||||||
@@ -624,6 +646,7 @@ func _confirm_staged_orders() -> void:
|
|||||||
func configure_orders(attempt: Dictionary) -> void:
|
func configure_orders(attempt: Dictionary) -> void:
|
||||||
if orders_window == null:
|
if orders_window == null:
|
||||||
return
|
return
|
||||||
|
current_order_location = str(attempt.get("location", ""))
|
||||||
active_order_codes = attempt.get("activeOrderCodes", []).duplicate()
|
active_order_codes = attempt.get("activeOrderCodes", []).duplicate()
|
||||||
for code in attempt.get("activeOrderCodes", []):
|
for code in attempt.get("activeOrderCodes", []):
|
||||||
staged_order_codes.erase(str(code))
|
staged_order_codes.erase(str(code))
|
||||||
@@ -644,6 +667,22 @@ func configure_orders(attempt: Dictionary) -> void:
|
|||||||
" Deadline: %s" % deadline if not deadline.is_empty() else ""]
|
" Deadline: %s" % deadline if not deadline.is_empty() else ""]
|
||||||
open_computer()
|
open_computer()
|
||||||
open_orders()
|
open_orders()
|
||||||
|
elif orders_status.text.begins_with("Submitting") or orders_status.text.begins_with("Cancelling") \
|
||||||
|
or orders_status.text.begins_with("Obtaining"):
|
||||||
|
orders_status.text = ""
|
||||||
|
|
||||||
|
|
||||||
|
func show_order_action_complete(action: String) -> void:
|
||||||
|
match action:
|
||||||
|
"orders":
|
||||||
|
orders_tabs.current_tab = 1
|
||||||
|
orders_status.text = "Orders confirmed. Use Obtain Results for pending tests."
|
||||||
|
"cancel_order":
|
||||||
|
orders_tabs.current_tab = 1
|
||||||
|
orders_status.text = "Order cancelled."
|
||||||
|
"advance":
|
||||||
|
orders_tabs.current_tab = 2
|
||||||
|
orders_status.text = "The chart has been updated with all results now available."
|
||||||
|
|
||||||
|
|
||||||
func _render_active_orders(rows: Array) -> void:
|
func _render_active_orders(rows: Array) -> void:
|
||||||
|
|||||||
@@ -102,6 +102,8 @@ func _on_attempt_changed() -> void:
|
|||||||
if completed_action in ["orders", "cancel_order", "advance", "enter_final_orders"] \
|
if completed_action in ["orders", "cancel_order", "advance", "enter_final_orders"] \
|
||||||
and active_scene != null and current_view == "doctor_office":
|
and active_scene != null and current_view == "doctor_office":
|
||||||
_refresh_case_workspace(CCSService.attempt)
|
_refresh_case_workspace(CCSService.attempt)
|
||||||
|
if completed_action != "enter_final_orders":
|
||||||
|
active_scene.show_order_action_complete(completed_action)
|
||||||
return
|
return
|
||||||
_render_state()
|
_render_state()
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,15 @@ func _run() -> void:
|
|||||||
_assert(screen.active_scene.vitals_launcher.icon.get_width() >= 58 and screen.active_scene.medical_history_launcher.icon.get_width() >= 58, "desktop shortcuts should use high-resolution vector imports")
|
_assert(screen.active_scene.vitals_launcher.icon.get_width() >= 58 and screen.active_scene.medical_history_launcher.icon.get_width() >= 58, "desktop shortcuts should use high-resolution vector imports")
|
||||||
screen.active_scene.orders_launcher.pressed.emit()
|
screen.active_scene.orders_launcher.pressed.emit()
|
||||||
_assert(screen.active_scene.orders_window.visible and screen.active_scene.orders_tabs.get_tab_count() == 3, "Orders should open a three-tab clinical workspace")
|
_assert(screen.active_scene.orders_window.visible and screen.active_scene.orders_tabs.get_tab_count() == 3, "Orders should open a three-tab clinical workspace")
|
||||||
screen.active_scene.render_order_search([{"code": "cbc", "canonicalName": "Complete blood count", "category": "laboratory"}])
|
screen.active_scene._queue_live_order_search("bl")
|
||||||
|
_assert(not screen.active_scene.order_search_timer.is_stopped(), "order typing should schedule a debounced live search")
|
||||||
|
screen.active_scene.order_search_timer.stop()
|
||||||
|
screen.active_scene.current_order_location = "office"
|
||||||
|
screen.active_scene.render_order_search([
|
||||||
|
{"code": "cbc", "canonicalName": "Complete blood count", "category": "laboratory", "availableLocations": []},
|
||||||
|
{"code": "venous_blood_gas", "canonicalName": "Venous blood gas", "category": "laboratory", "availableLocations": ["emergency_department", "icu"]}
|
||||||
|
])
|
||||||
|
_assert(screen.active_scene.orders_search_results.get_child_count() == 1, "order search should hide catalog entries unavailable at the current location")
|
||||||
(screen.active_scene.orders_search_results.get_child(0) as Button).pressed.emit()
|
(screen.active_scene.orders_search_results.get_child(0) as Button).pressed.emit()
|
||||||
_assert(screen.active_scene.staged_order_codes == ["cbc"] and not screen.active_scene.orders_confirm_button.disabled, "catalog results should stage for confirmation")
|
_assert(screen.active_scene.staged_order_codes == ["cbc"] and not screen.active_scene.orders_confirm_button.disabled, "catalog results should stage for confirmation")
|
||||||
screen.active_scene.configure_orders({
|
screen.active_scene.configure_orders({
|
||||||
@@ -109,6 +117,10 @@ func _run() -> void:
|
|||||||
})
|
})
|
||||||
_assert(screen.active_scene.staged_order_codes.is_empty(), "confirmed active orders should leave the staged list")
|
_assert(screen.active_scene.staged_order_codes.is_empty(), "confirmed active orders should leave the staged list")
|
||||||
_assert(screen.active_scene.orders_results.text.contains("Hemoglobin 10.4"), "returned results should render in the Orders results tab")
|
_assert(screen.active_scene.orders_results.text.contains("Hemoglobin 10.4"), "returned results should render in the Orders results tab")
|
||||||
|
screen.active_scene.show_order_action_complete("orders")
|
||||||
|
_assert(screen.active_scene.orders_tabs.current_tab == 1 and screen.active_scene.orders_status.text.begins_with("Orders confirmed"), "successful submission should explain completion and open Active Orders")
|
||||||
|
screen.active_scene.show_order_action_complete("advance")
|
||||||
|
_assert(screen.active_scene.orders_tabs.current_tab == 2, "obtaining results should open the Results tab")
|
||||||
screen.active_scene.close_orders()
|
screen.active_scene.close_orders()
|
||||||
screen.active_scene.configure_orders({"state": "final_orders", "activeOrderCodes": [], "activeOrders": [], "chart": [], "finalOrdersDeadlineUtc": "2026-08-14T12:00:00Z"})
|
screen.active_scene.configure_orders({"state": "final_orders", "activeOrderCodes": [], "activeOrders": [], "chart": [], "finalOrdersDeadlineUtc": "2026-08-14T12:00:00Z"})
|
||||||
_assert(screen.active_scene.is_computer_open() and screen.active_scene.orders_window.visible, "final orders should automatically open the Orders app")
|
_assert(screen.active_scene.is_computer_open() and screen.active_scene.orders_window.visible, "final orders should automatically open the Orders app")
|
||||||
|
|||||||
Reference in New Issue
Block a user