diff --git a/CHANGELOG.md b/CHANGELOG.md index aa7b835..31785ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Не выпущено +- Frontend `0.3.1`: уточнена компоновка поиска, лаборатории и кабинета; + splitter сохраняет минимальную ширину панелей, а на средних экранах фильтры + открываются доступной боковой панелью. Исправлено отображение футера на + маршруте пользователей и browser fixture смены пароля. - Frontend `0.3.0` / Backend `0.13.1`: добавлен доступный splitter для изменения ширины результатов и документа. Язык поиска находится в фильтрах; состояния открытия, оглавление правовых заголовков, лаборатория и кабинет diff --git a/README.md b/README.md index 6afd602..b67f526 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2`, backend версии -`0.13.1` и frontend `0.3.0` с поисковым экраном и внутренней лабораторией. +`0.13.1` и frontend `0.3.1` с поисковым экраном и внутренней лабораторией. Авторизация хранится в SQLite; первый пользователь `admin` создаётся интерактивной CLI-командой. Поиск расширяет аббревиатуры организационно-правовых форм и поднимает @@ -20,7 +20,7 @@ SQLite; первый пользователь `admin` создаётся инт |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | | Backend | `0.13.1` | авторизация, поиск с фильтрами, ограниченный staging и статические ресурсы | -| Frontend | `0.3.0` | поиск по правовой базе, просмотр редакций, настраиваемая ширина панелей и внутренняя лаборатория | +| Frontend | `0.3.1` | поиск по правовой базе, просмотр редакций, настраиваемая ширина панелей и внутренняя лаборатория | | Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи | | RAG и база знаний | — | ещё не созданы | @@ -63,4 +63,4 @@ python3 -m unittest discover -s tools/telegram-bot -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.13.1 · Frontend v0.3.0 +Акылдаш · Telegram-бот v0.2.2 · Backend v0.13.1 · Frontend v0.3.1 diff --git a/backend/search/minjust_opensearch.py b/backend/search/minjust_opensearch.py index 614e3b2..4f06bc9 100644 --- a/backend/search/minjust_opensearch.py +++ b/backend/search/minjust_opensearch.py @@ -465,7 +465,7 @@ def main() -> int: else: documents, fragments = export_bulk(arguments.input, arguments.output, arguments.index, arguments.limit) destination = arguments.output - print(f"documents={documents} fragments={fragments} destination={destination}\nAkyldash · Backend v{APP_VERSION} · Frontend v0.3.0") + print(f"documents={documents} fragments={fragments} destination={destination}\nAkyldash · Backend v{APP_VERSION} · Frontend v0.3.1") return 0 diff --git a/backend/search/review.html b/backend/search/review.html index 5138c19..3423b00 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -49,13 +49,13 @@ .review__panel-hint { color: var(--muted); font-size: .875rem; } .review__results-list { display: grid; gap: .75rem; margin: 0; padding: 0; list-style: none; } .review__result { padding: 1rem 0; border: 0; border-block-end: 1px solid var(--line); border-radius: 0; background: var(--surface); transition-property: background-color, border-color; transition-duration: 150ms; transition-timing-function: cubic-bezier(.2, 0, 0, 1); } - .review__result--selected { background: var(--subtle); box-shadow: none; } + .review__result--selected { padding: 8px 10px; background: var(--subtle); box-shadow: none; } .review__result:first-child { border-block-start: 1px solid var(--line); } .review__result-title { display: flex; gap: .65rem; align-items: baseline; width: 100%; min-height: 44px; text-align: start; font-weight: 700; border: 0; padding: 0; background: none; color: var(--brand-dark); } .review__rank { flex: 0 0 auto; color: var(--brand); font-variant-numeric: tabular-nums; } - .review__meta { margin-block: .5rem; color: var(--muted); font-size: .875rem; } - .review__rating { display: grid; grid-template-columns: repeat(4, 1fr); gap: .4rem; margin-block: 1rem .75rem; padding: 0; border: 0; } - .review__rating legend { width: 100%; margin-block-end: .35rem; font-size: .875rem; font-weight: 700; color: var(--muted); grid-column: 1 / -1; } + .review__meta { margin-block: 4px; color: var(--muted); font-size: .875rem; } + .review__rating { display: grid; grid-template-columns: repeat(4, 1fr); gap: .35rem; margin-block: 8px 6px; padding: 0; border: 0; } + .review__rating legend { width: 100%; margin-block-end: 2px; font-size: .875rem; font-weight: 700; color: var(--muted); grid-column: 1 / -1; } .review__rating label { display: grid; place-items: center; min-width: 0; min-height: 44px; padding: .45rem .25rem; border: 1px solid var(--line); border-radius: 6px; color: var(--muted); text-align: center; font-size: .875rem; cursor: pointer; } .review__rating label:has(input:checked) { border-color: var(--brand); background: var(--brand); color: #fff; } .review__rating label:has(input:focus-visible) { outline: 3px solid var(--focus); outline-offset: 2px; } @@ -217,6 +217,7 @@ body.is-users-route > .review__header { display: block; width: 100%; padding-block-end: 0; } body.is-users-route > .review__header > .review__header-content { display: none; } body.is-users-route > .review__actions { display: none; } + body.is-users-route > .search__footer { display: none; } body.is-users-route > footer.review__header { display: block; margin-block-start: auto; } .review__users-page { width: min(1200px, 100%); flex: 1; margin-inline: auto; padding: 28px clamp(16px, 4vw, 48px); } .review__users-page[hidden] { display: none !important; } @@ -285,12 +286,11 @@ body:has(.search:not([hidden])) > .search__chrome { display: block; } .search__chrome { display: none; background: var(--surface); border-block-end: 1px solid var(--line); } .search[hidden] { display: none !important; } - .search__topbar { min-height: var(--search-header-height); display: grid; grid-template-columns: minmax(390px, 430px) minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 5px 26px; border-block-end: 1px solid var(--line); } + .search__topbar { min-height: var(--search-header-height); display: grid; grid-template-columns: 166px minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 5px 26px; border-block-end: 1px solid var(--line); } .search__brand { display: flex; min-width: 0; align-items: center; gap: 12px; color: var(--ink); text-decoration: none; white-space: nowrap; } .search__brand-mark { width: 44px; height: 44px; flex: none; color: var(--brand); } .search__brand-name { font: 700 26px/1.1 var(--serif); } - .search__brand-divider { width: 1px; height: 32px; background: var(--line); } - .search__brand-description { color: var(--muted); font-size: 14px; } + .search__brand-divider, .search__brand-description { display: none; } .search__query { display: grid; grid-template-columns: minmax(0, 1fr) 160px; gap: 12px; align-items: end; min-width: 0; padding: 0; border: 0; background: transparent; } .search__query label { display: grid; gap: 4px; color: var(--muted); font-size: 14px; font-weight: 500; } .search__query label > span { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } @@ -503,25 +503,29 @@ .review__nav-links .is-active { border-color: var(--brand); background: var(--subtle); color: var(--brand); } .review__nav-links [hidden], .search__account-actions [hidden] { display: none !important; } .review__nav-account > span { color: var(--muted); } - .review__header-content { width: min(100%, 1440px); } + .review__header-content { width: 100%; max-width: none; padding-inline: 24px; } body:has(#review:not([hidden])) { min-height: 100dvh; height: 100dvh; overflow: hidden; } body:has(#review:not([hidden])) > .review__header { padding: 0; } - body:has(#review:not([hidden])) > #review { width: min(100%, 1440px); min-height: 0; margin: 0 auto; padding-inline: clamp(16px, 3vw, 40px); display: flex; flex-direction: column; } - body:has(#review:not([hidden])) > .review__actions { width: min(100%, 1440px); min-height: 96px; box-sizing: border-box; margin: 0 auto; padding: 8px clamp(16px, 3vw, 40px) 0; } - body:has(#review:not([hidden])) > footer.review__header { width: 100%; margin-block-start: 12px; } - .review__header-content, .review__actions-inner { max-width: 1440px; } + body:has(#review:not([hidden])) > #review { width: 100%; max-width: none; min-height: 0; margin: 0; padding: 0; display: flex; flex-direction: column; } + body:has(#review:not([hidden])) > .review__actions { width: 100%; min-height: 96px; flex: 0 0 96px; box-sizing: border-box; margin: 0; padding: 0 24px; } + body:has(#review:not([hidden])) > footer.review__header { width: 100%; margin: 0; } + .review__header-content, .review__actions-inner { width: 100%; max-width: none; } body:has(#review:not([hidden])) .review__nav { height: 64px; min-height: 64px; padding-block: 0; } - body:has(#review:not([hidden])) .review__header-content { display: grid; grid-template-columns: auto minmax(0, 1fr); grid-template-rows: 32px 20px; column-gap: 24px; align-content: center; height: 64px; } - body:has(#review:not([hidden])) .review__header-top { grid-column: 1; grid-row: 1 / 3; align-self: center; padding: 0; } - body:has(#review:not([hidden])) .review__header-content h1 { grid-column: 2; grid-row: 1; max-width: none; margin: 0; font: 600 26px/32px var(--sans); } - body:has(#review:not([hidden])) .review__header-content p { grid-column: 2; grid-row: 2; max-width: none; margin: 0; font: 400 14px/20px var(--sans); white-space: nowrap; } - .review__search { gap: 12px; padding: 12px 0; border: 0; border-block-end: 1px solid var(--line); border-radius: 0; background: transparent; } - .review__workspace { min-height: 0; max-height: min(58dvh, 620px); flex: 1 1 0; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 0; align-items: stretch; overflow: hidden; border-block: 1px solid var(--line); background: var(--surface); } - .review__results, .review__document { min-height: 0; max-height: none; padding: 14px clamp(12px, 1.5vw, 22px); border: 0; border-radius: 0; background: var(--surface); } + body:has(#review:not([hidden])) .review__header-content { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; height: 64px; } + body:has(#review:not([hidden])) .review__heading-copy { min-width: 0; display: grid; grid-template-rows: 32px 20px; align-content: center; } + body:has(#review:not([hidden])) .review__header-top { grid-column: 2; grid-row: 1; align-self: center; padding: 0; } + body:has(#review:not([hidden])) .review__header-content h1 { max-width: none; margin: 0; font: 600 26px/32px var(--sans); } + body:has(#review:not([hidden])) .review__header-content p { max-width: none; margin: 0; font: 400 14px/20px var(--sans); white-space: nowrap; } + .review__search { gap: 12px; padding: 12px 24px; border: 0; border-block-end: 1px solid var(--line); border-radius: 0; background: transparent; } + #status.review__status { grid-column: 1 / -1; margin: 0; } + #status.review__status:empty { display: none; } + #status.review__status--success { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } + .review__workspace { min-height: 0; flex: 1 1 0; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 0; align-items: stretch; overflow: hidden; border-block: 1px solid var(--line); background: var(--surface); } + .review__results, .review__document { min-height: 0; max-height: none; padding: 14px 24px; border: 0; border-radius: 0; background: var(--surface); } .review__results { overflow: auto; border-inline-end: 1px solid var(--line); } .review__document { position: static; overflow: auto; overscroll-behavior: contain; } .review__document-meta { overflow-wrap: anywhere; } - .review__actions-inner { padding: 5px 0; border: 0; border-block-start: 1px solid var(--line); border-radius: 0; background: transparent; } + .review__actions-inner { padding: 5px 24px; border: 0; border-block-start: 1px solid var(--line); border-radius: 0; background: transparent; } body:has(#review:not([hidden])) > footer.review__header { height: 44px; min-height: 44px; } body:has(#review:not([hidden])) > footer.review__header .review__header-content { display: flex; align-items: center; height: 44px; padding-block: 0; } .search__subnav { flex-wrap: wrap; overflow: visible; white-space: normal; } @@ -530,22 +534,29 @@ .search__chips { flex: 1 1 8rem; } .search__filter-language { display: grid; gap: 5px; margin-block: 0 16px; color: var(--muted); font-size: .875rem; font-weight: 600; } .search__filter-language select { min-height: 42px; width: 100%; padding: 7px 10px; color: var(--ink); background: var(--surface); border: 1px solid var(--line); } - .search__layout { grid-template-columns: minmax(190px, clamp(190px, 18vw, 250px)) minmax(260px, 36fr) 12px minmax(320px, 64fr); } - .search__layout[data-filters-hidden="true"] { grid-template-columns: minmax(260px, 36fr) 12px minmax(320px, 64fr); } + .search__layout { grid-template-columns: minmax(264px, clamp(264px, calc(20vw + 8px), 288px)) minmax(360px, 38.1fr) 8px minmax(560px, 61.9fr); } + .search__layout[data-filters-hidden="true"] { grid-template-columns: minmax(360px, 38.1fr) 8px minmax(560px, 61.9fr); } + .search__filters { margin-inline-end: 8px; } .search__mobile-filters { display: inline-flex; } .search__layout[data-filters-hidden="true"] .search__filters { display: none; } - .search__splitter { z-index: 1; align-self: stretch; width: 12px; min-width: 12px; min-height: 100%; padding: 0; border: 0; border-radius: 0; background: linear-gradient(90deg, transparent 4px, var(--brand-dark) 4px 8px, transparent 8px); cursor: col-resize; touch-action: none; } - .search__splitter:hover, .search__splitter:focus-visible { background: linear-gradient(90deg, transparent 3px, var(--brand) 3px 9px, transparent 9px); } - body:has(#review:not([hidden])) > .review__header, body:has(#review:not([hidden])) > footer.review__header { width: min(calc(100% - 2 * clamp(16px, 3vw, 40px)), 1240px); max-width: 1240px; margin-inline: auto; padding-inline: 0; } - body:has(#review:not([hidden])) .review__nav, body:has(#review:not([hidden])) .review__header-content { width: 100%; max-width: none; padding-inline: 0; } + .search__splitter { position: relative; z-index: 1; align-self: stretch; justify-self: center; width: 12px; min-width: 12px; min-height: 100%; margin-inline: -2px; padding: 0; border: 0; border-radius: 0; background: linear-gradient(90deg, transparent 2px, var(--surface-muted) 2px 10px, transparent 10px); cursor: col-resize; touch-action: none; } + .search__splitter::before { position: absolute; inset-block: 0; inset-inline-start: 50%; width: 1px; background: var(--line); content: ''; transform: translateX(-50%); } + .search__splitter::after { position: absolute; inset-block-start: 50%; inset-inline-start: 50%; width: 3px; height: 40px; border-radius: 2px; background: var(--muted); content: ''; transform: translate(-50%, -50%); } + .search__splitter:hover::after, .search__splitter:focus-visible::after { background: var(--brand); } + body:has(#review:not([hidden])) > .review__header, body:has(#review:not([hidden])) > footer.review__header { width: 100%; max-width: none; margin: 0; padding-inline: 0; } + body:has(#review:not([hidden])) .review__nav, body:has(#review:not([hidden])) .review__header-content { width: 100%; max-width: none; padding-inline: 24px; } body:has(#review:not([hidden])) .review__header-content h1 { font: 600 26px/32px var(--sans); } body:has(#review:not([hidden])) .review__panel-heading h2 { font: 600 20px/26px var(--sans); } + body.is-users-route > .search__footer { display: none !important; } .search__pagination[hidden] { display: none; } .search__document-language[hidden] { display: none; } + .search__account-actions { display: grid; grid-template-columns: max-content max-content; justify-content: start; gap: 8px; } .search__account-actions a { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; padding: 8px 12px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface); color: var(--brand-dark); font-weight: 600; text-decoration: none; } .search__account-actions a:hover { border-color: var(--brand); background: var(--subtle); } + #search-logout { grid-column: 1 / -1; justify-self: start; min-height: 36px; margin-block-start: 2px; padding-inline: 0; border: 0; color: var(--muted); background: transparent; } #account-dialog dl { display: grid; grid-template-columns: minmax(7.5rem, max-content) minmax(0, 1fr); gap: 8px 16px; margin: 16px 0 24px; } + #account-dialog { width: min(560px, calc(100vw - 32px)); max-width: none; } #account-dialog > .review__page { padding: 16px; } #account-dialog dt { color: var(--muted); } #account-dialog dd { min-width: 0; margin: 0; overflow-wrap: anywhere; } @@ -556,17 +567,22 @@ #account-dialog .review__dialog-heading h2 { max-width: none; padding: 0; font: 600 20px/28px var(--sans); } #account-dialog .review__dialog-heading button { display: grid; place-items: center; flex: 0 0 44px; width: 44px; min-height: 44px; padding: 0; } #public-document-body img, #document-body img { max-width: 100%; height: auto; object-fit: contain; } - @media (min-width: 901px) and (max-width: 1175px) { - .search__layout { grid-template-columns: minmax(180px, 22%) minmax(260px, 36fr) 12px minmax(320px, 64fr); } - .search__layout[data-filters-hidden="true"] { grid-template-columns: minmax(260px, 36fr) 12px minmax(320px, 64fr); } - .search__layout:not([data-filters-hidden="true"]) .search__filters { display: flex; } + @media (min-width: 901px) and (max-width: 1191px) { + #search-layout { grid-template-columns: minmax(360px, 38.1fr) minmax(560px, 61.9fr); } + #search-layout .search__filters { display: none; } + #search-layout .search__filters.is-open { position: fixed; z-index: 21; inset: 16px auto 16px 16px; display: block; width: min(360px, calc(100vw - 32px)); overflow: auto; padding: 20px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: 0 12px 40px rgb(34 28 28 / .2); } + .search__filter-close { display: inline-flex; } + .search__filter-overlay.is-open { position: fixed; z-index: 20; inset: 0; display: block; background: rgb(56 38 42 / .42); } + .search__splitter { display: none; } } @media (max-width: 900px) { body:has(#review:not([hidden])) { min-height: 100svh; height: auto; overflow: visible; } body:has(#review:not([hidden])) > #review { flex: none; padding-inline: 16px; } - body:has(#review:not([hidden])) > .review__header, body:has(#review:not([hidden])) > footer.review__header { width: calc(100% - 32px); } - body:has(#review:not([hidden])) .review__nav, body:has(#review:not([hidden])) .review__header-content { padding-inline: 0; } - body:has(#review:not([hidden])) .review__header-content { display: block; height: auto; padding-block: 12px; } + body:has(#review:not([hidden])) .review__nav, body:has(#review:not([hidden])) .review__header-content { padding-inline: 16px; } + body:has(#review:not([hidden])) .review__header-content { display: flex; flex-direction: column; align-items: stretch; gap: 8px; height: auto; padding-block: 12px; } + body:has(#review:not([hidden])) .review__heading-copy { display: block; } + body:has(#review:not([hidden])) .review__header-top { align-self: flex-start; } + .review__search { padding-inline: 16px; } body:has(#review:not([hidden])) .review__header-top { padding-block: 0 8px; } body:has(#review:not([hidden])) .review__header-content h1, body:has(#review:not([hidden])) .review__header-content p { display: block; } body:has(#review:not([hidden])) .review__header-content p { white-space: normal; } @@ -575,7 +591,10 @@ .review__results, .review__document { max-height: none; overflow: visible; border-inline: 0; } .review__results { border-block-end: 1px solid var(--line); } .review__document { display: block; } - body:has(#review:not([hidden])) > .review__actions { padding-inline: 16px; } + .review__results, .review__document { padding-inline: 16px; } + body:has(#review:not([hidden])) > .review__actions { flex: 0 0 auto; padding-inline: 0; } + .review__actions-inner { padding-inline: 16px; } + body:has(#review:not([hidden])) > footer.review__header { height: auto; min-height: 44px; } .search__layout, .search__layout[data-filters-hidden="true"] { display: block; } .search__splitter { display: none; } .search__filter-language { margin-block-end: 16px; } @@ -597,8 +616,7 @@ Перейти к результатам
Акылдаш
-
-

Проверка качества поиска

Сопоставляйте запрос с текстом документов и сохраняйте оценку выдачи.

+

Проверка качества поиска

Сопоставляйте запрос с текстом документов и сохраняйте оценку выдачи.

@@ -617,8 +635,8 @@ +
-

Результаты поиска

Оцените каждый документ
  1. Начните с запросаВведите юридический вопрос выше, чтобы увидеть результаты.

Просмотр документа

Откройте результат
Выберите название в списке, чтобы прочитать документ.
@@ -633,7 +651,7 @@

Документ

Выберите документ в выдаче, чтобы открыть текст.

Содержание
-
Акылдаш Правовая база КыргызстанаFrontend v0.3.0 Backend v0.13.1
+
Акылдаш Правовая база КыргызстанаFrontend v0.3.1 Backend v0.13.1

Черновик появится после поиска.

Вход в Акылдаш

Введите учетные данные, выданные администратором.

Создайте новый пароль

Для продолжения замените временный пароль. Используйте не менее 12 символов.

@@ -651,7 +669,7 @@

Документ

Источники документов

Поиск выполняется по документам, подготовленным из правовых источников Кыргызской Республики. Для каждого результата доступная редакция и ссылка на официальный источник показываются в панели документа.

Официальный источник: Централизованный банк данных правовой информации Министерства юстиции Кыргызской Республики.

Короткое знакомство

-
Акылдаш · Frontend v0.3.0 · Backend v0.13.1 · Внутренняя лаборатория релевантности
+
Акылдаш · Frontend v0.3.1 · Backend v0.13.1 · Внутренняя лаборатория релевантности