{# Work — one screen, four tabs (043 §5, phase 3). The four tabs show live work, schedules, apps/artifacts, and classified activity. The tabs are panes in this one page, not four routes: work-now.js reveals the pane whose `data-pane` matches the active tab and hides the rest, so /work answers with the whole screen and the switch is client-side. Every word comes from webview/copy/en.py — no inline script on any 043 template (tests/unit/webview/test_no_new_inline_script.py): the words ride on the #work-now-copy / #worklog-copy data attributes and the modules read them off `dataset`. #} {% extends "shell.html" %} {% block body %}

{{ t('work.title') }}

{{ t('work.sub') }}

{# Now & next — running goals + background helpers, and what is queued. Drawn by work-now.js from /api/webgate/goals + /api/webgate/running. #}
{% if not read_only %}
{{ t('work.create.goal_label') }}

{% endif %}

{{ t('work.now.section_now') }}

{{ t('work.now.section_next') }}

{# On a clock — cron jobs, listed with Cancel. Drawn by work-now.js from /api/webgate/cron; Cancel posts to /api/webgate/cron/{id}/cancel. #} {# Apps — everything Rob built you can open, in three tiers by reach. Drawn by work-apps.js from /api/webgate/apps + /api/webgate/artifacts. #} {# Log — the classified activity stream, drawn by worklog.js. #}

{{ t('work.sources')|safe }}

{# The words the Log stream is read into (unchanged). data-classes is core.activity_class.CLIENT_CLASSES, server-rendered so the chips can never drift from the classifier. #} {# The words work-now.js renders itself. read_only rides here so the module draws no Stop / Pause / Cancel it cannot act on (the shell states the posture once, so the buttons are simply absent). #} {# The words work-apps.js renders (WS-P2). Its own copy node, since it is its own module; the tab switch is still work-now.js's (one Work subnav). #} {% endblock %}