From 1b968f93823a352079473d1dfb98973b130e8879 Mon Sep 17 00:00:00 2001 From: igor04091968 Date: Sun, 26 Apr 2026 10:12:39 +0300 Subject: [PATCH] fix(webui): stabilize and localize timespiral --- aw-server/apply_webui_ru_patch.sh | 23 +++++++++++++++++++++++ aw-server/aw-ru-patch.js | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/aw-server/apply_webui_ru_patch.sh b/aw-server/apply_webui_ru_patch.sh index bb7775f..6ea909e 100755 --- a/aw-server/apply_webui_ru_patch.sh +++ b/aw-server/apply_webui_ru_patch.sh @@ -17,6 +17,8 @@ SERVICE_WORKER="$WEBUI_DIR/service-worker.js" TS=$(date +%Y%m%d%H%M%S) TRENDS_NEEDLE='this.activityStore.query_category_time_by_period(r)' TRENDS_REPLACEMENT='this.activityStore.ensure_loaded(r)' +TIMESPIRAL_NEEDLE='start:new Date("2022-08-08")' +TIMESPIRAL_REPLACEMENT='start:new Date(Date.now()-12*36e5)' [[ -f "$PATCH_JS_SRC" ]] || { echo "missing $PATCH_JS_SRC" >&2; exit 1; } [[ -f "$SW_CLEANUP_SRC" ]] || { echo "missing $SW_CLEANUP_SRC" >&2; exit 1; } @@ -53,4 +55,25 @@ else echo "Trends hotfix skipped: chunk not found" fi +timespiral_chunk="$(grep -Rsl "$TIMESPIRAL_NEEDLE" "$WEBUI_DIR/js"/*.js 2>/dev/null | head -n 1 || true)" +if [[ -n "$timespiral_chunk" ]]; then + cp "$timespiral_chunk" "$timespiral_chunk.bak.$TS" + python3 - "$timespiral_chunk" "$TIMESPIRAL_NEEDLE" "$TIMESPIRAL_REPLACEMENT" <<'PY' +from pathlib import Path +import sys + +path = Path(sys.argv[1]) +old = sys.argv[2] +new = sys.argv[3] +content = path.read_text() +if old in content: + path.write_text(content.replace(old, new, 1)) + print(f"Timespiral hotfix applied to {path}") +else: + print(f"Timespiral hotfix already present in {path}") +PY +else + echo "Timespiral hotfix skipped: chunk not found" +fi + echo "RU patch applied to $WEBUI_DIR" diff --git a/aw-server/aw-ru-patch.js b/aw-server/aw-ru-patch.js index 5d7d18b..0aa05ab 100755 --- a/aw-server/aw-ru-patch.js +++ b/aw-server/aw-ru-patch.js @@ -14,6 +14,7 @@ ["Search", "Поиск"], ["Buckets", "Бакеты"], ["Stopwatch", "Секундомер"], + ["Timespiral", "Временная спираль"], ["Categorization helper", "Помощник категоризации"], ["Categorization", "Категоризация"], ["Tools", "Инструменты"], @@ -147,6 +148,9 @@ ["30 days", "30 дней"], ["Time active:", "Активное время:"], ["This feature is still in early development.", "Эта функция пока находится на ранней стадии разработки."], + ["This is a work-in-progress experiment.", "Это экспериментальная функция, она ещё не доведена до готового состояния."], + ["Bucket: ", "Бакет: "], + ["Events: ", "События: "], ["This tool will help you create categories from your uncategorized time.", "Этот инструмент поможет создавать категории из некатегоризированного времени."], ["Note: These settings are meant for developers who (hopefully) know what they are doing, and as such, may break things unexpectedly.", "Примечание: эти настройки предназначены для разработчиков, которые понимают, что делают, и поэтому могут неожиданно что-нибудь сломать."], ["It works by fetching all uncategorized time for a recent timeperiod, and then finds the most common words (by time, not count) each of which may then either be ignored (if too broad/irrelevant), or used to create a new (sub)category, or to append the word to a pre-existing category rule. Words with less than 60s of time will not be shown.", "Инструмент получает некатегоризированное время за недавний период и ищет самые частые слова по длительности, а не по количеству. Их можно игнорировать, если они слишком общие, использовать для создания новой подкатегории или добавить в уже существующее правило. Слова с длительностью меньше 60 секунд не показываются."],