fix ui composer
This commit is contained in:
1 parent
a26ae28189
commit
33930e972c
8 files changed
+73
-16
No files matched your search
@@ -53,6 +53,35 @@ def assert_reply_input_is_visible(page):
|
||||
assert metrics["visibleHeight"] >= min(64, metrics["inputHeight"] * 0.6)
|
||||
|
||||
|
||||
def assert_compact_composer_controls(page):
|
||||
metrics = page.evaluate(
|
||||
"""() => {
|
||||
const input = document.querySelector('form[data-ticket-composer] textarea').getBoundingClientRect();
|
||||
const jump = document.querySelector('[data-scroll-to-submit]').getBoundingClientRect();
|
||||
const pickers = [...document.querySelectorAll('.media-picker-button')].map(node => node.getBoundingClientRect());
|
||||
return {
|
||||
inputBottom: input.bottom,
|
||||
jumpBottom: jump.bottom,
|
||||
pickerTopDifference: Math.abs(pickers[0].top - pickers[1].top),
|
||||
pickersOverlap: !(pickers[0].right <= pickers[1].left || pickers[1].right <= pickers[0].left),
|
||||
};
|
||||
}"""
|
||||
)
|
||||
assert abs(metrics["inputBottom"] - metrics["jumpBottom"]) <= 8
|
||||
assert metrics["pickerTopDifference"] <= 2
|
||||
assert not metrics["pickersOverlap"]
|
||||
|
||||
|
||||
def assert_textarea_grows_with_content(page):
|
||||
reply = page.locator('form[data-ticket-composer] textarea')
|
||||
reply.fill("پاسخ کوتاه")
|
||||
compact_height = reply.bounding_box()["height"]
|
||||
reply.fill("خط اول\nخط دوم\nخط سوم\nخط چهارم\nخط پنجم\nخط ششم\nخط هفتم")
|
||||
grown_height = reply.bounding_box()["height"]
|
||||
assert compact_height <= 52
|
||||
assert compact_height < grown_height <= 145
|
||||
|
||||
|
||||
def test_magic_link_mobile_viewport_keeps_composer_messages_and_credit_visible(live_server, browser_page):
|
||||
branding = SiteBranding.load()
|
||||
branding.developer_credit_text = "امضای مقدس توسعهدهنده E2E"
|
||||
@@ -78,15 +107,17 @@ def test_magic_link_mobile_viewport_keeps_composer_messages_and_credit_visible(l
|
||||
conversation.expect_latest_message_above_composer()
|
||||
|
||||
conversation.open_composer()
|
||||
assert_compact_composer_controls(page)
|
||||
page.set_viewport_size({"width": 390, "height": 430})
|
||||
expect(page.locator('form[data-ticket-composer] textarea')).to_be_focused()
|
||||
expect(page.locator("[data-composer-shell]")).to_have_attribute("data-keyboard-open", "true")
|
||||
page.locator('form[data-ticket-composer] textarea').fill("متن پاسخ باید هنگام تایپ دیده شود")
|
||||
assert_textarea_grows_with_content(page)
|
||||
assert_reply_input_is_visible(page)
|
||||
expect(page.locator("[data-composer-close]")).to_be_hidden()
|
||||
expect(credit).to_be_visible()
|
||||
assert_workspace_fits_visual_viewport(page)
|
||||
|
||||
page.locator("[data-composer-close]").click()
|
||||
page.set_viewport_size({"width": 390, "height": 844})
|
||||
expect(page.locator("[data-composer-shell].is-collapsed")).to_be_visible()
|
||||
expect(credit).to_be_visible()
|
||||
assert_workspace_fits_visual_viewport(page)
|
||||
@@ -116,7 +147,8 @@ def test_staff_ticket_mobile_viewport_survives_open_close_and_rotation(live_serv
|
||||
page.set_viewport_size({"width": 844, "height": 390})
|
||||
assert_workspace_fits_visual_viewport(page)
|
||||
expect(page.locator("[data-composer-shell]")).to_have_attribute("data-keyboard-open", "true")
|
||||
page.locator('form[data-ticket-composer] textarea').fill("پاسخ کارشناس هنگام باز بودن کیبورد")
|
||||
assert_compact_composer_controls(page)
|
||||
assert_textarea_grows_with_content(page)
|
||||
assert_reply_input_is_visible(page)
|
||||
expect(page.locator("[data-composer-close]")).to_be_visible()
|
||||
|
||||
|
||||
@@ -198,11 +198,12 @@ def test_dispatch_report_presents_delivery_and_engagement_professionally(live_se
|
||||
conversation.expect_latest_message_above_composer()
|
||||
launch.click()
|
||||
close_composer = page.get_by_role("button", name="بستن", exact=True)
|
||||
expect(close_composer).to_be_visible()
|
||||
close_box = close_composer.bounding_box()
|
||||
assert close_box is not None
|
||||
assert close_box["x"] >= 0 and close_box["x"] + close_box["width"] <= 390
|
||||
assert close_box["y"] >= 0 and close_box["y"] + close_box["height"] <= 844
|
||||
expect(close_composer).to_be_hidden()
|
||||
expect(page.locator('form[data-ticket-composer] textarea')).to_be_focused()
|
||||
page.set_viewport_size({"width":390,"height":430})
|
||||
expect(page.locator("[data-composer-shell]")).to_have_attribute("data-keyboard-open","true")
|
||||
page.set_viewport_size({"width":390,"height":844})
|
||||
expect(page.locator("[data-composer-shell].is-collapsed")).to_be_visible()
|
||||
conversation.expect_latest_message_above_composer()
|
||||
dismiss_context.click()
|
||||
expect(page.locator(".ticket-dispatch-context")).to_have_count(0)
|
||||
@@ -452,6 +452,7 @@ def test_ticket_workspace_uses_mobile_viewport_and_keyboard_safe_layout_contract
|
||||
ui_script=Path("static/js/ui.js").read_text(encoding="utf-8")
|
||||
conversation_script=Path("static/js/conversation.js").read_text(encoding="utf-8")
|
||||
magic_template=Path("templates/tickets/customer_detail.html").read_text(encoding="utf-8")
|
||||
staff_template=Path("templates/tickets/staff_detail.html").read_text(encoding="utf-8")
|
||||
assert "interactive-widget=resizes-content" in base
|
||||
for feature in ("100svh","--visual-viewport-height","overscroll-behavior:none","display-mode:standalone"):
|
||||
assert feature in source_css
|
||||
@@ -463,6 +464,16 @@ def test_ticket_workspace_uses_mobile_viewport_and_keyboard_safe_layout_contract
|
||||
assert "focus({preventScroll:true})" in conversation_script
|
||||
for feature in ("is-keyboard-active","ensureInputVisible","stableViewportHeight-height>120","data-keyboard-open"):
|
||||
assert feature in conversation_script or feature in source_css
|
||||
assert "input.setAttribute('rows','1')" in conversation_script
|
||||
assert "Math.min(Math.max(contentHeight,48),maxHeight)" in conversation_script
|
||||
assert "keyboardClosed" in conversation_script and "setComposerOpen(false,false)" in conversation_script
|
||||
assert "لطفاً توضیحات خود را کامل، دقیق و یکجا بنویسید" not in magic_template
|
||||
for template in (magic_template,staff_template):
|
||||
assert 'class="composer-input-row"' in template
|
||||
assert template.count('class="media-picker-icon"')==2
|
||||
assert 'data-toggle-recorder' in template and 'data-gallery-input' in template and 'data-document-input' in template
|
||||
for feature in (".composer-input-row","grid-template-columns:repeat(2,minmax(0,1fr))",".ticket-workspace .composer-close{display:none!important}"):
|
||||
assert feature in source_css
|
||||
assert '<footer class="ticket-detail-credit">{{ developer_credit }}</footer>' in magic_template
|
||||
|
||||
def test_frontend_runtime_libraries_are_local_and_versioned():
|
||||
|
||||
Reference in new issue
Block a user