Panels & Pf

The Task:

  • Approximately 1 year development time (including prototyping)
    • Create a solid UI for the new Panels design

    • Use the lessons that we've learned over the past (X) years while maintaining dialogs

    • Work towards a "standard" for React/TS development on Pro2-UI

    • Determine which systems no longer serve us

Lessons from Dialogs

  • Solid system that served its intended purpose
  • Features were added through the years
  • "harder to maintain"

"Harder to Maintain"

maintain = debug, update, extend (for our purposes)

  • Legacy code
  • huxley -> [~~~~ MAGIC ~~~~] -> rendered dialog 
  • Siloed knowledge

  • Who is setting state? Where? How?

"Easy to Maintain"?

maintain = debug, update, extend (for our purposes)

  • Low complexity
  • Predictability
  • A framework with lots of answers on the web and helpful debugging tools

  • Safety

  • Bonus: Nice DevEx

Principles to Consider

Principle of Least Astonishment

  • "the result of performing some operation should be obvious, consistent, and predictable, based upon the name of the operation and other clues"
  • "code should look like it was written by a single individual"

Pro2-View

  • has predictable architecture
  • Example: new API endpoint


There's a single way to do these things! (for the most part)

Software Transparency

  • doesn't have "murky corners or hidden depths"
  • able to form a simple mental model of its behavior 

Huxley --- [///////////~~MAGIC~~/////////] ---> Working Dialog

Huxley --- [/~MAGIC~/] ---> Working Dialog

(responsibilities go to components)

Architecture

2 main Panels

Design Panel (Home/Nav)

Customizations Panel (Detail)

Metadata

(the blueprint)

  • v1/metadata
  • originally defined in Huxley as "descriptors"

Descriptors contain info about laying out a panel but not the actual user data!

Data

User's Draft Data

  • v1/drafts
  • data fills in the inputs

Metadata: "create a row with a slider linking to theme.masthead.height"

Data: the user's value of `theme.masthead.height` is 86

Inputs

(building blocks of panels)

Metadata

(descriptors/specs)

onChangeAndConfirm(path, newValue)

Redux Store (Data)

Ractive Store

Principles

  • We've significantly reduced the opaque hux -> panel system (transparency!)
  • Every input is written in a similar fashion
    • ​test, storybook story, css module, fixtureData (consistency!)
  • Only able to adjust data from panels in a restricted fashion (consistency!)
  • To determine the data/metadata and why an input looks a certain way - check out react/redux devtools in the inspector (predictability!)

Retro

  • React: nice to use an established framework
    • documentation!

    • integrations with other open source tools

    • debugging tools - amazing to see values in the devtools window - I.e. what does the spec look like for this specific panel row

    • people have run into the same problems and have documented solutions

    • easier to reuse a lib someone already created vs having to create our own

Take aways post-panels

Retro

  • We did everything as Class Components
  • CSS Modules with 3rd party components is dangerous

  • Typescript is the best

  • Productivity sped up after we established a component pattern

  • A few old systems

  • Nice to have: Integration and/or screenshot tests

  • Nice to have: Single source of truth for validation values

Take aways post-panels

Further Reading:

  • Further Reading:
    • Getting Started with React posts on the Wiki
    • React docs

Questions?

Panels & Pf

By mattoconnell

Panels & Pf

  • 567