Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
d76bdb0
fix(spp_gis): add MultiPolygon and GeometryCollection support to GIS …
jeremi Mar 6, 2026
d3783e9
feat(spp_program_geofence): add geofence-based eligibility manager
jeremi Mar 6, 2026
50066cc
chore: fix lint issues in operators.py and format test file
jeremi Mar 6, 2026
3647d29
fix(spp_program_geofence): fix spatial query operator and test compat…
jeremi Mar 6, 2026
8e1036a
fix: address code review findings from simplify pass
jeremi Mar 6, 2026
b31878e
feat(spp_program_geofence): add area type filter and geofence managem…
jeremi Mar 6, 2026
3e0e50f
fix(spp_gis): make MapTiler API key optional with OSM tile fallback
jeremi Mar 6, 2026
aaf03de
fix(spp_gis): fix map widget bugs, SQL parameterization, and OSM fall…
jeremi Mar 6, 2026
2b9d4b5
fix(spp_gis): treat default placeholder API key as unconfigured
jeremi Mar 6, 2026
64b4aea
fix(spp_gis): skip MapTiler raster style override when no API key
jeremi Mar 6, 2026
fdd4ab0
fix(spp_program_geofence): add GIS view for geofence model and fix me…
jeremi Mar 6, 2026
88dc6d2
fix(spp_gis): null draw control before destroying map on re-render
jeremi Mar 6, 2026
ff70475
feat: move geofences to Configuration tab and add to program wizard
jeremi Mar 6, 2026
d9476c6
fix: load existing geometry into MapboxDraw for interactive editing
jeremi Mar 6, 2026
6bdb806
fix(spp_gis): use dedicated geofence tag model instead of spp.vocabulary
jeremi Mar 6, 2026
a843165
fix: code review cleanup from /simplify
jeremi Mar 6, 2026
a102886
Review GIS operator buffer change
jeremi Mar 12, 2026
27368e9
fix: address gemini review feedback for draw handler and import const…
jeremi Mar 12, 2026
8e77302
fix(spp_mis_demo_v2): ensure HH debug GIS layer for MIS demo
jeremi Mar 12, 2026
ef0009c
feat(spp_api_v2_gis): add OGC Processes model, schemas, and registry
jeremi Mar 14, 2026
2c97062
feat(spp_api_v2_gis): add OGC Processes and Jobs routers
jeremi Mar 14, 2026
1670716
test(spp_api_v2_gis): add comprehensive tests for OGC Processes API
jeremi Mar 14, 2026
d8a44e8
fix: resolve test failures in OGC Processes tests
jeremi Mar 14, 2026
ae741c5
refactor: address code review findings for OGC Processes
jeremi Mar 14, 2026
6bd1c58
feat(spp_api_v2_gis): implement QGIS plugin team recommendations for …
jeremi Mar 14, 2026
d3fc51a
fix(spp_api_v2_gis): resolve async job ACL failure and simplify code
jeremi Mar 14, 2026
72ec1bb
feat: add queue-worker service to dev docker-compose
jeremi Mar 14, 2026
d0cb613
feat(spp_api_v2_gis): raise proximity reference points limit to 50k
jeremi Mar 14, 2026
c93ae18
chore(spp_api_v2_gis): add debug logging for variables filtering
jeremi Mar 14, 2026
0e738f2
fix(spp): restart queue-worker alongside Odoo on spp restart
jeremi Mar 14, 2026
ec7a563
fix(spp_api_v2_gis): use pre-rename module names on feature branch
jeremi Mar 16, 2026
82851d5
feat(spp_api_v2_gis): add OGC API Features Part 4 CRUD for geofences
jeremi Mar 16, 2026
138687d
refactor(spp_api_v2_gis): simplify geofence CRUD after review
jeremi Mar 16, 2026
3220f03
fix(spp_api_v2_gis): resolve geometry null and missing bbox for data …
jeremi Mar 16, 2026
17d8619
feat(spp_api_v2_gis): block geofence delete when referenced by programs
jeremi Mar 16, 2026
c57eb4c
feat(spp_gis_report): replace boolean disaggregation with dimension_ids
jeremi Mar 16, 2026
7d257d4
feat(spp_gis_report): implement disaggregation computation and flat G…
jeremi Mar 16, 2026
932472c
feat(spp_api_v2_gis): thread group_by through OGC spatial/proximity APIs
jeremi Mar 16, 2026
67ecf09
test: add Phase D tests for group_by/breakdown in OGC processes
jeremi Mar 16, 2026
a2b52ac
fix: lint fixes for line length and unused loop vars
jeremi Mar 16, 2026
0825698
fix: ruff-format auto-formatting
jeremi Mar 16, 2026
1a63ac5
fix(spp_mis_demo_v2): replace boolean disaggregation fields with dime…
jeremi Mar 16, 2026
26b0786
feat(spp): assign stable port per worktree for dev profile
jeremi Mar 16, 2026
85b28f8
fix(spp_metrics_services): handle empty Many2one and dynamic M2O labe…
jeremi Mar 16, 2026
4ddddf0
feat(spp_cel_domain): add CEL-to-SQL CASE WHEN compiler
jeremi Mar 16, 2026
7fae8ca
feat(spp_metrics_services): add to_sql_column() for SQL dimension com…
jeremi Mar 16, 2026
4cc948f
feat(spp_gis_report): SQL-based disaggregation with member expansion
jeremi Mar 16, 2026
67d4882
feat(spp_mis_demo_v2): enable member expansion on group-filtered GIS …
jeremi Mar 16, 2026
492166c
fix: address expert review feedback for SQL disaggregation
jeremi Mar 16, 2026
f76e65b
feat(spp_metrics_services): auto-expand groups to members in Breakdow…
jeremi Mar 16, 2026
70616d1
fix(spp_metrics_services): correct gender and age_group dimension config
jeremi Mar 16, 2026
9ddf27d
fix(spp_mis_demo_v2): replace broken disabled_members stat with pwd_m…
jeremi Mar 16, 2026
461c4ed
refactor(spp_mis_demo_v2): remove demographic stats superseded by gro…
jeremi Mar 16, 2026
0762e0f
feat(spp_api_v2_gis): add population_filter for program and CEL filte…
jeremi Mar 16, 2026
41385e8
fix(spp_mis_demo_v2): use dynamic area level for registrant assignment
jeremi Mar 16, 2026
16d5066
feat: add HDX-sourced Philippine geodata prep script and data files
jeremi Mar 16, 2026
f1c150f
feat(spp_demo_phl_luzon): add Luzon geodata module with population-we…
jeremi Mar 16, 2026
5fb1e26
style: apply ruff formatting fixes
jeremi Mar 16, 2026
5bdec66
feat(spp_demo_phl_luzon): add programmatic area loader with overlap h…
jeremi Mar 16, 2026
526ac2e
fix(spp_mis_demo_v2): flush computed fields before raw SQL area_level…
jeremi Mar 16, 2026
4321afb
feat(spp_mis_demo_v2): dispatch large volume generation to queue_job
jeremi Mar 16, 2026
f32343a
feat(spp_gis_report): include numeric ranges in legend labels
jeremi Mar 17, 2026
f979788
fix(spp_api_v2_gis): support individual-context CEL in population filter
jeremi Mar 17, 2026
c255975
fix(spp_mis_demo_v2): realistic age distribution and batch SQL for perf
jeremi Mar 17, 2026
339e870
feat(spp_mis_demo_v2): add volume generator mode for Luzon demo
jeremi Mar 17, 2026
fd6d231
fix(spp): handle comma-separated modules in install wait check
jeremi Mar 17, 2026
570eb6d
fix(spp_mis_demo_v2): run volume generation inline in CLI/shell context
jeremi Mar 17, 2026
a90eef2
fix(spp): increase timeout to 1800s for volume demo generation
jeremi Mar 17, 2026
930e1eb
perf(spp_mis_demo_v2): batch ORM creates for volume group generation
jeremi Mar 17, 2026
58ab32b
fix(spp_mis_demo_v2): cap birthdate to today for infants in batch create
jeremi Mar 17, 2026
adca509
feat(docker): add db_maxconn config and PostgreSQL query logging
jeremi Mar 20, 2026
63324f3
feat(spp_gis_report): add percentage fields to disaggregation GeoJSON
jeremi Mar 20, 2026
84baf16
feat(spp_api_v2_gis): include numeric ranges in QML threshold labels
jeremi Mar 20, 2026
aea6d65
feat(spp_mis_demo_v2): populate area metadata and improve demo distri…
jeremi Mar 20, 2026
6e5e9df
fix(spp_program_geofence): fix async import and wizard enhancements
jeremi Mar 20, 2026
882ef2d
revert(spp_gis_report): remove server-side _pct fields from GeoJSON
jeremi Mar 21, 2026
68ec91b
fix(spp_api_v2): declare OAuth2 client credentials in OpenAPI securit…
jeremi Apr 2, 2026
41b34e9
refactor(spp_api_v2_gis): remove non-OGC GIS endpoints duplicated by …
jeremi Apr 2, 2026
d783ca5
feat(spp_api_v2_gis): add OpenAPI schemas to all OGC endpoints
jeremi Apr 2, 2026
1e6bab8
docs(spp_api_v2_gis): add OpenAPI examples to OGC schema models
jeremi Apr 2, 2026
c268930
docs(spp_api_v2_gis): add OpenAPI examples to OGC and process schemas
jeremi Apr 2, 2026
18ef3dd
fix(spp_api_v2_gis): use FastAPI model refs instead of inline schemas
jeremi Apr 2, 2026
139149f
feat(spp_hazard): add CAP vocabulary fields and uuid to hazard incidents
jeremi Apr 6, 2026
04ad8e8
feat(spp_hazard): add alert ingestion business logic and GeoJSON methods
jeremi Apr 6, 2026
03b5308
feat(spp_api_v2_gis): add incidents OGC collection with CRUD and filters
jeremi Apr 6, 2026
b2824c2
chore: fix lint and formatting issues from ruff
jeremi Apr 6, 2026
ab22113
fix(spp_hazard): escape XML special characters in CAP vocabulary data
jeremi Apr 6, 2026
c2b6374
fix: handle ISO 8601 datetime parsing and update severity field refer…
jeremi Apr 6, 2026
43b0a48
fix: address code review findings across spp_hazard and spp_api_v2_gis
jeremi Apr 6, 2026
c88c575
docs(spp_api_v2_gis): improve OpenAPI schema types and examples
jeremi Apr 6, 2026
46c2c36
fix(spp_api_v2_gis): revert ExecuteRequest.inputs to dict type
jeremi Apr 23, 2026
24b700b
chore: add VITE_PROXY_TARGET env to prism service
jeremi Apr 24, 2026
16e1a6e
feat(spp_api_v2): add polymorphic_body helper for dict-typed request …
jeremi Apr 24, 2026
49a9222
feat(spp_api_v2): install polymorphic OpenAPI hook on api_v2 app
jeremi Apr 24, 2026
6658a52
test(spp_api_v2): assert every $ref in OpenAPI resolves
jeremi Apr 24, 2026
d5fabe0
fix(spp_api_v2_gis): restore typed oneOf documentation for ExecuteReq…
jeremi Apr 24, 2026
5e90bae
feat(spp_api_v2): document BundleEntry.resource as oneOf Individual|G…
jeremi Apr 24, 2026
f9d6a07
chore: add whool pyproject.toml stubs for new GIS modules
jeremi Jun 8, 2026
36286b2
Merge origin/19.0 into feature/program-geofence
jeremi Jun 8, 2026
a8f343a
fix(spp_program_geofence): correct queue_job channel and dedup source
jeremi Jun 8, 2026
fe22431
docs(spp_api_v2_gis): regenerate README from merged DESCRIPTION
jeremi Jun 8, 2026
60fbda2
fix: update stale spp_metrics_services refs to renamed spp_metric_ser…
jeremi Jun 8, 2026
2170b54
fix(spp_program_geofence): address review should-fixes
jeremi Jun 8, 2026
09bcc67
fix: update remaining stale rename refs surfaced by tests
jeremi Jun 8, 2026
44102c0
fix(spp_demo): revert leftover PHL geodata to upstream
jeremi Jun 8, 2026
428763d
Merge remote-tracking branch 'origin/19.0' into feature/program-geofence
jeremi Jun 10, 2026
fe711ce
fix(spp_registry): preserve explicitly-provided individual name
jeremi Jun 10, 2026
5c31d00
feat(spp_demo): use HDX/PSA areas as canonical PHL demo data
jeremi Jun 10, 2026
6a24455
test(spp_api_v2): expect preserved individual name in search tests
jeremi Jun 10, 2026
d5368e0
chore(spp_demo): apply prettier/eof to restored PHL HDX data files
jeremi Jun 10, 2026
3ec8b25
fix(spp_cel_domain): resolve gender labels without creating vocabular…
jeremi Jun 12, 2026
72bffe4
fix(spp_program_geofence): match base manager job idempotency and cha…
jeremi Jun 12, 2026
234c15a
refactor(spp_program_geofence): add named view anchors and align layo…
jeremi Jun 12, 2026
8ce6848
fix(spp_mis_demo_v2): skip chunk-loop commit under tests
jeremi Jun 12, 2026
b5a922a
fix(spp_api_v2_gis): restrict process job ACL to system group
jeremi Jun 12, 2026
15aaaea
chore: regenerate stale addon READMEs
jeremi Jun 12, 2026
5de4eeb
fix(spp_drims): complete severity CAP-vocabulary migration in inciden…
gonzalesedwin1123 Jun 22, 2026
399272a
fix(gis): resolve Semgrep/pylint security findings
gonzalesedwin1123 Jun 22, 2026
124beb3
chore(spp_demo_phl_luzon): declare programmatically-loaded data for o…
gonzalesedwin1123 Jun 22, 2026
c29020c
refactor(spp_gis): fix eslint warnings in GIS renderer/edit-map
gonzalesedwin1123 Jun 22, 2026
2553dbf
style: apply ruff/prettier/eol formatting to PR-touched files
gonzalesedwin1123 Jun 22, 2026
fd7e0a3
fix(spp_api_v2_gis): place sudo nosemgrep on preceding line in ogc_se…
gonzalesedwin1123 Jun 22, 2026
78e59cd
fix(spp_demo_phl_luzon): drop deprecated manifest description key
gonzalesedwin1123 Jun 22, 2026
c9344a6
style: apply ruff-format/prettier to remaining PR-touched files
gonzalesedwin1123 Jun 22, 2026
10d32ad
fix(gis,hazard): suppress odoo-sudo-without-context on system-context…
gonzalesedwin1123 Jun 22, 2026
e49225f
build: pin README-gen deps to keep addon READMEs reproducible
gonzalesedwin1123 Jun 22, 2026
0f5410e
fix: shorten nosemgrep justification comments under ruff E501 limit
gonzalesedwin1123 Jun 22, 2026
b47a2a7
Merge branch '19.0' into feature/program-geofence
gonzalesedwin1123 Jun 22, 2026
1cd2a9c
docs: align addon READMEs with CI's generator output
gonzalesedwin1123 Jun 22, 2026
a8251a4
test(spp_api_v2_gis): cover LayersService feature-count, feature-by-i…
gonzalesedwin1123 Jun 22, 2026
e0cb626
test(spp_gis_report): cover threshold calculators, constraint, and vi…
gonzalesedwin1123 Jun 22, 2026
8c4e7ae
test(spp_api_v2_gis): cover OGC Part 4 write endpoints over HTTP
gonzalesedwin1123 Jun 22, 2026
bf68e75
style: ruff-format the new GIS coverage tests
gonzalesedwin1123 Jun 22, 2026
88d40dc
test(spp_api_v2_gis): activate dormant data-layer tests in layers_ser…
gonzalesedwin1123 Jun 23, 2026
41bcc9f
test(spp_demo_phl_luzon): cover _load_shapes GeoJSON processing path
gonzalesedwin1123 Jun 23, 2026
47db39a
test(spp_api_v2_gis): cover spatial-query helpers and batch progress …
gonzalesedwin1123 Jun 23, 2026
819e07c
test(spp_cel_domain): cover CEL translator translation cache
gonzalesedwin1123 Jun 23, 2026
cad54cd
Merge branch '19.0' into feature/program-geofence
gonzalesedwin1123 Jun 23, 2026
b008e30
docs: realign addon READMEs to pinned generator after 19.0 merge
gonzalesedwin1123 Jun 23, 2026
d66c02a
docs: restore addon READMEs to 19.0's generated versions
gonzalesedwin1123 Jun 23, 2026
3c22e09
refactor(spp_gis): extract shared OSM raster fallback map style
gonzalesedwin1123 Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions .agents/skills/openspp-ui/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
---
name: openspp-ui
description:
OpenSPP UI design patterns for Odoo 19 views. Use when creating or modifying forms,
lists, kanban, dashboards, or search views in spp_* modules.
---

# OpenSPP UI Design

Enforce consistent UI for OpenSPP's social protection platform on Odoo 19.

## Design Personality

OpenSPP serves **government agencies and NGOs**. The UI must convey:

- **Trust** - Government-grade reliability, no flashy effects
- **Clarity** - Dense but organized, scannable information
- **Accessibility** - Works for field officers on varying devices
- **Efficiency** - Power users need speed, not hand-holding

## Before Creating a View

**Ask: What's the user's task?**

| Task Type | Layout | Key Features |
| --------------- | ---------------------- | ----------------------------------- |
| Data Entry | Multi-column, editable | Inline lists, minimal readonly |
| Review/Approval | Status prominent | Ribbons, history tab, readonly feel |
| Dashboard | KPI cards | Clickable stats, visual counts |
| Configuration | Grouped settings | Heavy help text, toggles |

## State & Color Vocabulary

Use consistently across all modules:

| State | List Decoration | Badge Class | Icon |
| --------- | -------------------- | ------------------- | ------------ |
| Draft | `decoration-muted` | `text-bg-secondary` | `fa-pencil` |
| Pending | `decoration-warning` | `text-bg-warning` | `fa-clock-o` |
| Approved | `decoration-success` | `text-bg-success` | `fa-check` |
| Rejected | `decoration-danger` | `text-bg-danger` | `fa-times` |
| Cancelled | `decoration-muted` | `text-bg-secondary` | `fa-ban` |

## Standard Form Structure

```xml
<form>
<header>
<button
name="action_submit"
string="Submit"
type="object"
class="btn-primary"
invisible="state != 'draft'"
/>
<field name="state" widget="statusbar" statusbar_visible="draft,pending,approved" />
</header>
<sheet>
<widget
name="web_ribbon"
title="Approved"
invisible="state != 'approved'"
bg_color="text-bg-success"
/>
<div class="oe_button_box" name="button_box" />
<div class="oe_title">
<h1>
<field name="name" placeholder="Name" />
</h1>
</div>
<group col="2">
<group name="left_section">...</group>
<group name="right_section">...</group>
</group>
<notebook>
<page name="details" string="Details">...</page>
</notebook>
</sheet>
<chatter />
</form>
```

**Key rules:**

- Header: only buttons + statusbar
- Sheet: ribbon → button_box → title → groups → notebook
- Always name your groups for extensibility

## Anti-Patterns

### Odoo 19 Gotchas

```xml
<!-- WRONG --> <xpath expr="//div[@class='oe_title']" ...>
<!-- RIGHT --> <xpath expr="//div[hasclass('oe_title')]" ...>

<!-- WRONG --> <group string="Group By"> <!-- in search view -->
<!-- RIGHT --> <group>
```

```python
# WRONG: Tuple syntax
partner.write({'child_ids': [(0, 0, {'name': 'New'})]})

# RIGHT: Command API
from odoo import Command
partner.write({'child_ids': [Command.create({'name': 'New'})]})
```

### OpenSPP Mistakes

- Editable fields in `<header>` → use tabs
- Positional XPath `//page[1]` → use named elements
- Forms without named groups → breaks inheritance

## Detailed Patterns

For comprehensive guidelines, see [UI Design Principles](docs/principles/ui-design.md):

- Multi-column layouts
- Extension points and XPath targets
- Widget selection guide
- Dashboard KPI patterns
- Search and list view patterns
7 changes: 7 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ repos:
- --if-source-changed
- --keep-source-digest
- --convert-fragments-to-markdown
# Pin doc-generation deps so README output is reproducible across Python
# versions/environments (CI runs Python 3.11). Without this, differing
# docutils/markdown-it-py versions render RST tables with different column
# widths, causing spurious README drift in CI.
additional_dependencies:
- "docutils==0.23"
- "markdown-it-py==4.2.0"
manual: true
- id: oca-gen-external-dependencies
manual: true
Expand Down
Loading
Loading