117 lines
5.6 KiB
Markdown
117 lines
5.6 KiB
Markdown
# Opportunities Extension 1.0.1
|
|
|
|
Browser extension that adds the "Opportunities Extension" shortcut to the permitted Oracle Fusion pages, retrieves opportunities, and displays them in a filterable table.
|
|
|
|
## Development Structure
|
|
|
|
- `src/content/`: page integration, modal shell, theme and content composition.
|
|
- `src/background/`: synchronous message registration and background composition.
|
|
- `src/features/`: opportunities, products, consumption, AI summaries, preferences and debug.
|
|
- `src/auth/`: credential-specific selection, reuse and session recovery.
|
|
- `src/services/`: Fusion/SPA operations and background HTTP/JSON transport.
|
|
- `src/platform/`: narrow browser messaging, cookies, tabs and storage adapters.
|
|
- `src/shared/messages.js`: names of the existing cross-context messages.
|
|
- `scripts/build.mjs`: generates browser-specific packages.
|
|
- `tests/`: isolated synthetic regression tests and a visual fixture.
|
|
- `docs/`: architecture/contracts and incremental refactoring record.
|
|
- `dist/chromium/`: output for Google Chrome and Microsoft Edge.
|
|
- `dist/firefox/`: output for Firefox.
|
|
|
|
## Build
|
|
|
|
Use Node.js:
|
|
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
The build recreates `dist/chromium` and `dist/firefox` from the same source.
|
|
|
|
Do not edit files under `dist` directly. Both targets use Manifest V3, with a
|
|
Chromium service worker and Firefox background scripts. The build composes classic
|
|
factory modules from `scripts/sources.cjs` into one isolated IIFE per execution
|
|
context. It serializes `src/content/styles/redwood.css` followed by the scoped
|
|
`src/features/debug/styles.css` at build time. There is no
|
|
runtime module loader, browser-side eval, ES-module requirement or new dependency.
|
|
|
|
## Tests and Maintenance
|
|
|
|
Product HTTP requests appear in Debug Requests (Ctrl+D) as soon as they start.
|
|
Each entry identifies the opportunity and page offset, stays `running` while
|
|
waiting for headers or the response body, and updates with HTTP status, response,
|
|
duration or error. Cache hits do not create HTTP entries. Product diagnostics
|
|
mask authorization and sensitive response headers before messaging the source
|
|
tab/frame; this change adds no timeout, retry or authentication behavior.
|
|
|
|
Debug tabs group Authentication, Opportunities, Products, AI and Consumption
|
|
requests; unknown request types appear under Other. Only categories with entries
|
|
are shown. All preserves the complete timeline. Every tab sorts by request start
|
|
time, retaining original request IDs and showing start times in collapsed rows.
|
|
Counts and running states update without changing the selected category or
|
|
collapsing expanded details. Use arrow keys, Home and End to navigate the tabs.
|
|
|
|
```bash
|
|
npm test
|
|
npm run check
|
|
```
|
|
|
|
Tests use built-in Node.js modules and synthetic credentials, without real Fusion
|
|
requests. The characterization suite verifies manifests, source/output equality,
|
|
fiscal dates, payloads, preferences, pagination, cache/progress and both browser API
|
|
styles. Architecture tests enforce source inclusion, explicit factory dependencies,
|
|
isolated state and unchanged CSS. These complement consumption, session recovery
|
|
and AI suites. `check` also fails if generated packages are stale.
|
|
There is no separate lint configuration or runtime dependency installation.
|
|
|
|
See [architecture and contracts](docs/architecture.md) and the
|
|
[incremental refactoring record](docs/refactoring.md) for execution boundaries,
|
|
authentication, storage, known risks and verification limits.
|
|
Mock-based tests do not replace testing the installed extension in each browser.
|
|
|
|
Without npm, run `node scripts/build.mjs`, `node scripts/test.cjs` and
|
|
`node scripts/build.mjs --check`. Development checks were run with Node 24.19.0.
|
|
|
|
For a local UI smoke test, run `node scripts/preview.mjs` and open the loopback URL
|
|
printed by the command. The fixture uses synthetic opportunities, tokens, products,
|
|
AI text and consumption; unexpected requests fail closed. It does not authenticate
|
|
against Fusion or read real extension storage. `/consumption-trend.html` provides
|
|
a focused chart fixture. Stop the server with Ctrl+C when finished.
|
|
|
|
## Release 1.0.0
|
|
|
|
- Paginated opportunity retrieval with filters for reference, customer, owner, status, stage, and text search.
|
|
- Column sorting, links to opportunities and accounts, opportunity number copying, and stage indicators.
|
|
- Opportunity type view preferences persisted in the browser.
|
|
- Background product retrieval with configurable caching, progress tracking, and expandable product details.
|
|
- Cloud consumption account-plan lookup from each opportunity, displayed in a tabbed detail modal.
|
|
- Light and dark themes based on Oracle Redwood.
|
|
- Separate outputs for Chromium/Edge and Firefox.
|
|
|
|
## Release 1.0.1
|
|
|
|
- Retries the consumer token service when it returns HTTP 200 with an HTML fallback.
|
|
- Opens the SPA session page in an inactive temporary tab and closes it as soon as valid JSON is received.
|
|
- Limits the recovery flow to five attempts and records the session bootstrap details in debug mode.
|
|
|
|
## Loading in Development Mode
|
|
|
|
### Chrome or Microsoft Edge
|
|
|
|
1. Open `chrome://extensions` or `edge://extensions`.
|
|
2. Enable Developer mode.
|
|
3. Click **Load unpacked**.
|
|
4. Select the `dist/chromium` folder.
|
|
|
|
### Firefox
|
|
|
|
1. Open `about:debugging#/runtime/this-firefox`.
|
|
2. Click **Load Temporary Add-on**.
|
|
3. Select the `dist/firefox/manifest.json` file.
|
|
|
|
## Supported Pages
|
|
|
|
- `https://eeho.fa.us2.oraclecloud.com/hcmUI/faces/FuseWelcome`
|
|
- `https://eeho.fa.us2.oraclecloud.com/fscmUI/faces/FuseWelcome`
|
|
|
|
When it finds the `#yourapps_groupNode_sales` group, the extension adds the tile before the `.flat-grid-cell.flat-grid-cell-addicon` item. Clicking the tile opens the opportunities interface.
|