Skip to content

Automated changes from task - #12

Open
coderflow-demo-server[bot] wants to merge 5 commits into
mainfrom
documentation
Open

coderflow-demo-server[bot] wants to merge 5 commits into
mainfrom
documentation

Conversation

@coderflow-demo-server

Copy link
Copy Markdown
Contributor

Co-Authored-By: CoderFlow ai@coderflow.ai
Learn more: https://coderflow.ai

ProfoundGary and others added 5 commits July 20, 2026 17:11
…ness

Rebuild the bdmedical Genie skin for the BD prospect. The folder had been
copied from Skyline and renamed but never re-skinned: start.html was still
titled "Genie - Skyline Skin" and loaded all five images from
genie skins/skyline/, and bdmedical.css was Skyline's orange/black stylesheet
verbatim.

Brand values come from the CSS custom properties published by www.bd.com
(clientlib-base) rather than a third-party colour site, which still quotes BD's
pre-rebrand palette: navy #060A3D, boosted blue #044ED7, boosted orange
#FF6E00, teal #39BEAB, plus BD's published FS Albert Pro fallback chain. BD's
two official logo SVGs are included; FS Albert Pro is licensed and is not
redistributed.

htdocs/profoundui/userdata/genie skins/bdmedical/
- start.html: BD navy masthead with the white BD lockup, product name, tagline
  and a live "Signed in as" slot, over an orange/blue accent rule; BD footer.
  Paths repointed at bdmedical/ with a ?v=1 cache-buster. The required
  div#5250 and the css/script ordering rules are preserved.
- bdmedical.css: full rewrite on BD tokens - brand typography, gradients,
  shadows, transitions, pill CTAs, focus rings, a pui-bd-animation spinner and
  a responsive breakpoint. All 5250 attribute classes A20-A3E are retained and
  remapped to BD hues while keeping their semantic distinctions, so
  colour-coded applications read the same as before.
- bd-brandkit.js (new): the behaviour, as a reusable module with no skin name,
  field ids or wording baked in. Loaded between genie.js and custom.js so it
  can be relocated to /profoundui/userdata/js/shared/ and shared across skins.
  Rebuilds the sign-on screen, sizing the card from the live field bounding box
  so the normal and 128-character-password layouts both work without a second
  set of coordinates; rebuilds the function-key buttons as a flex-wrapped pill
  bar from pui.genie.afterInit, since Genie's own buttons are absolutely
  positioned and cannot be given spacing in CSS.
- custom.js: reduced to a thin per-skin config layer.
- adjusted columns custom.js: regenerated to match, ids shifted one column
  left. Without this, enabling adjustColumns would silently revert the sign-on
  screen to Skyline branding.
- bd-logo.svg, bd-logo-white.svg: BD's official marks.
- README.md: deploy steps, palette reference and the reasoning behind the
  non-obvious decisions.

config.js is left untouched - it is Genie Administrator-managed. It still
carries Skyline's hiColor (#DD5700); changing that to #044ED7 is a Genie
Administrator change, not a source edit.

Three defects found and fixed while rendering the skin:
- "#5250" is an invalid CSS selector (an id selector cannot start with a
  digit), so those rules were being discarded silently, dropping
  white-space: nowrap from 5250 fields. Now [id="5250"].
- The card's own ".bd-signon-card div" reset outranked its bare child class
  selectors, collapsing the heading padding. Child rules now carry the parent
  class so they win on specificity, rather than using !important.
- Subfile columns collided because the stock skin only monospaced INPUT
  fields and left output fields on the proportional body font, while Genie
  lays fields out on a fixed ~8px character grid. The 5250 area now uses the
  same 13px monospace the stock skin already used for inputs; chrome keeps the
  BD brand font.

Sign-on layout is computed rather than inherited from the stock skin's fixed
pixel offsets: the card is centred in the 5250 container and the form is laid
out inside it. .insideDiv also gets auto margins - it is 675px inside a 775px
.middleDiv and as a plain block sat flush left, pushing every screen 50px left
of the page centre. And BDGenie.sizeButtonToLabel clears the inline width Genie
writes onto each button it creates, which combined with the skin's padding and
border-box sizing was clipping "Sign in" to "Sign"; CSS cannot fix that because
an inline style wins.

The rebuilt function-key bar anchors below the lowest still-visible field
(BDGenie.contentBottom) rather than at the row the original prompts occupied.
Function-key prompts routinely share a row with real text - the IBM i Main Menu
puts F23=Set initial menu on row 24 next to the IBM copyright line - and the
bar is taller than the rows it replaces, so anchored at the old top its second
row of pills landed on that text. BDGenie.reserveRoomFor then grows .middleDiv
if the bar extends past it, so it cannot collide with the page footer either;
applyDisplaySizing resets that height on every screen.

Add a dynamic "Actions" menu to the masthead, built from the current screen's
function keys. The hamburger button and panel are static chrome in start.html;
bd-brandkit.js fills the panel per screen and hides the toggle on screens with
no function keys. Each row shows the key badge and its description, parsed out
of the "Fnn=Text" prompt, and clicking one calls pressKey - the same path the
green screen uses. Click-outside and Escape dismiss it, Up/Down move between
items, and the keyboard handler is registered in the capture phase so Escape
and the arrows reach the menu rather than Genie's 5250 key handling - but only
while the menu is open, so ordinary typing is unaffected.

rebuildFkeyBar is split into collectFunctionKeys (scan and de-duplicate) plus
renderFkeyBar and renderFkeyMenu, so both affordances read the same data.
buildFkeyBar and buildFkeyMenu are independent switches; custom.js turns the
bar off, so function keys are surfaced through the menu alone rather than
duplicating the same list in two places.

The menu lives in its own strip (.bd-screenbar) directly above the terminal,
width-matched to .insideDiv (675px) rather than the wider .middleDiv that wraps
it, so the button's right edge lines up exactly with the right edge of the
screen and the panel opens over the content. In the masthead it was correct but
far away - the header runs to 1400px against a 675px terminal. The strip
reserves a min-height so the terminal does not shift vertically between screens
with and without function keys, and the toggle is restyled for the light page
background now that it no longer sits on the navy masthead.

.bd-header gets z-index 100 and .bd-screenbar z-index 60. 5250 fields carry
z-index 10-40 in the root stacking context (.insideDiv is position:relative
with z-index auto, which does not create one), so without those the menu panel
painted underneath the terminal text. Below the terminal's own fixed width the
page scrolls sideways, so at that breakpoint the panel anchors left rather than
right to stay on screen.

Self-host JetBrains Mono for the terminal (fonts/JetBrainsMono-latin.woff2,
31 KB variable 100-800 latin subset, SIL OFL 1.1 with the licence alongside
it). The skin previously relied on a system monospace stack, which lands on
whatever each workstation happens to have - frequently Courier New - so the
look varied per machine. Chosen for a tall x-height and unambiguous 0/O and
1/l/I; the old system stack remains as a fallback.

Three properties were measured rather than assumed, and the harness now
asserts them on every screen: the advance is exactly 0.6em (7.8px at 13px,
which the browser rounds to Genie's 8px cell, so 80 columns measure exactly
640px), weight 700 has the same advance as 400, and no sequence ligates.
13px is the ceiling for this face: 8 / 0.6 = 13.33px.

liga/clig/calt are disabled on the terminal and on inputs. JetBrains Mono is a
coding face and the IBM i command line is literally "===>". Measured, this
subset does not ligate that sequence even with features on, so the suppression
is insurance against a future font swap rather than a fix.

start.html's cache-buster is at ?v=6.

tools/genie-skin-preview/
Offline harness that serves a skin with a stand-in genie.js drawing synthetic
5250 screens from real Genie field ids, runs the skin's customize() and
pui.genie.afterInit, then screenshots and probes the DOM. Covers the standard,
128-character-password and column-adjusted sign-on screens, an application
screen with function keys, the IBM i Main Menu, and a narrow viewport. It also
drives the Actions menu with real clicks and key presses, asserting the item
list, the toggle's offset from the terminal's own rectangle, that the panel is
topmost via elementFromPoint, that Escape restores focus, and that clicking a
row fires pressKey with that row's key. It also measures the terminal font:
that it resolves, its advance, that 80 columns fit the grid, and that "===>"
and ". . . ." occupy their exact cell counts. All six
screens pass with no page errors, console errors or failed requests. It is a stand-in, not Profound UI,
so it verifies the skin's own markup and layout, not a live Genie session.

The mock reproduces Genie's inline button widths, without which the harness
sized buttons to their labels and missed the clipping seen on the real server.
It also probes card-centre against page-centre, flags any button whose
scrollWidth exceeds its clientWidth, and intersects the function-key bar
against every visible 5250 field - so all three reported defects now fail the
harness rather than reaching a browser.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Excludes __pycache__/ and *.pyc. A compiled bytecode file from local
py_compile runs had been picked up into the index alongside the tool
sources; it has been unstaged and is now ignored.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Generate a technical reference document for every source member in
cfdemo/qrpglesrc, written to docs/docs:

- CUSTR (module/service program, embedded SQL data service)
- custr_pr (/COPY member: cust_rec template + prototypes)
- WRKCUSTR / WRKCUST1R (5250 list and detail)
- WRKCUSTRO / WRKCUST1RO (Profound UI Rich Display list and detail)
- WRKCUSTEO / WRKCUST1EO (Profound UI EJS screen-mode list and detail)
- HELLOR (Hello World example)

Each document covers invocation, control options and parameters, ILE
structure (activation group and binding), dependency tree and Mermaid
diagrams, full object list, DB2 for i schema and access paths, display
file / Rich Display / EJS screen layout, program flow and key routines,
indicators, error handling, security, interfaces, codermake build rules,
related programs and testing scenarios.

Also add docs/docs/README.md as an index with an application-level
diagram and the cross-cutting notes (fixed CUSTR export signature,
unhandled %date conversion on zero dates, subfile field truncation vs
full-width filtering, unimplemented edit mode, EJS assets not deployed
by codermake).

Screen layouts, field positions, indicator effects and the RPGOA/EJS
wiring were verified against the running application in an interactive
session.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Add a BOM / inventory / shop-floor demo dataset for the AdelWiggins Group
customer demo, under a new awdemo/ directory, and deploy it to library AWDEMO.

The schema is a faithful clone of the existing sample library BOMSAMPLE --
same 8 tables, 9 indexes, primary and foreign keys, and column headings, with
SQL long names pinned via FOR COLUMN / FOR SYSTEM NAME so the short system
names match. All 8 record format level identifiers are identical to
BOMSAMPLE's, so anything written against BOMSAMPLE runs here without a level
check.

The content is AdelWiggins' own aerospace product families taken from
adelwiggins.com: clamshell/threaded/rigid tube couplings, ferrules and
bulkhead fittings, 200/6000/Preece quick disconnects and valves, dielectric
fuel and hydraulic isolators, freeze-protection heaters, Adel clamps and
Wiggins mining fast-fuelling products -- 155 items, 91 BOMs, 468 component
lines, 356 inventory balances and 260 shop orders across five locations.

- awdemo/Rules.mk               codermake targets for the tables and indexes
- awdemo/sql/*.table.sql        DDL, one file per table
- awdemo/sql/*.index.sql        DDL, one file per index
- awdemo/sql/data/*.sql         generated INSERT statements, library-agnostic
- awdemo/tools/gen-awdemo-data.py   deterministic generator (fixed RNG seed)
- awdemo/tools/load-awdemo-data.py  loads the data into a chosen library
- awdemo/README.md              dataset contents, build and promotion steps

Manufactured-item standard costs are rolled up from their own structures so a
cost roll-up in the demo reconciles. The data deliberately seeds situations to
demo against: three-level explosions, five rev-A/rev-B supersessions, 85
below-reorder-point balances, 21 late released orders, inactive items and
suppliers with history, and second-source suppliers.

The dataset is deployed in AWDEMO. Promoting it turned up one gotcha now
documented in the README: SQL only journals a new table if the library already
holds a journal named QSQJRN, and AWDEMO had been made with plain CRTLIB, so
every CREATE TABLE returned SQL7905 at severity 20. Unjournaled tables would
have broken any SQLRPGLE program built later, since codermake compiles with
COMMIT(*CHG). AWDEMO/QSQJRN was created to match BOMSAMPLE before the rebuild.

Follow-up date review and fixes, applied to AWDEMO and the task library:

- Orders now come off a steady release rate (~7.7/working day over 260 working
  days) with status derived from each order's own lifecycle, replacing a fixed
  per-status quota that spread closed orders over a year but crammed every open
  order into the last seven weeks (4-13 orders/month, then 103). Volume scaled
  260 -> 2,112 so the open-order count is consistent with the release rate and
  lead times. Orders per month now sits in a 154-177 band.
- The date anchor defaults to the run date instead of a hardcoded constant, so
  the dataset no longer decays (at +60 days every open order had gone late and
  the backlog was empty). --as-of / $AWDEMO_AS_OF reproduces an old snapshot;
  the seed stays fixed so content is deterministic per anchor.
- Lead times are counted in working days: no order raised, due or completed at
  a weekend, and stock movement dates snapped off weekends too (was 32%).
- Discontinued parts appear only in long-closed history, never with a live
  order on the floor.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants