aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-01-21 20:20:42 -0300
committerSebastian <sebasjm@gmail.com>2023-01-21 20:20:42 -0300
commit59ce6e3d99edc8c0a503094ddb0ed48220109bcf (patch)
tree5c1e5a091f49a261978e9388c2a4535c766ffb16
parent88dbd80f8595ede7f2368d5fe447faca7dc6ce77 (diff)
bring documentation from old repo and fix Makefile to copy all content of dist folder
-rw-r--r--packages/merchant-backoffice-ui/DESIGN.md195
-rw-r--r--packages/merchant-backoffice-ui/Makefile3
-rw-r--r--packages/merchant-backoffice-ui/README.md64
3 files changed, 260 insertions, 2 deletions
diff --git a/packages/merchant-backoffice-ui/DESIGN.md b/packages/merchant-backoffice-ui/DESIGN.md
new file mode 100644
index 000000000..d6252ccdc
--- /dev/null
+++ b/packages/merchant-backoffice-ui/DESIGN.md
@@ -0,0 +1,195 @@
+# Page internal routing
+
+* The SPA is loaded from the BACKOFFICE_URL
+
+* The view to be rendered is decided by the URL fragment
+
+* Query parameters that may affect routing
+
+ - instance: use from the default instance to mimic another instance management
+
+* The user must provide BACKEND_URL or BACKOFFICE_URL will use as default
+
+* Token for querying the backend will be saved in localStorage under
+ backend-token-${name}
+
+# HTTP queries to the backend
+
+HTTP queries will have 4 states:
+
+* loading: request did not end yet. data and error are undefined
+
+* ok: data has information, http response status == 200
+
+* clientError: http response status is between 400 and 499
+
+ - notfound: http status 404
+
+ - unauthorized: http status 401
+
+* serverError: http response status is grater than 500
+
+There are categories of queries:
+
+ * sync: getting information for the page rendering
+
+ * async: performing an CRUD operation
+
+## Loading the page information (sync)
+
+In this scenario, a failed request will make the app flow to break.
+
+When receiving an not found error a generic not found page will be shown. If the
+BACKEND_URL points to a default instance it should send the user to create the
+instance.
+
+When receiving an unauthorized error, the user should be prompted with a login form.
+
+When receiving an another error (400 < http status < 600), the login form should
+be shown with an error message using the hint from the backend.
+
+On other unexpected error (like network error), the login form should be shown
+with an error message.
+
+## CRUD operation (async)
+
+In this scenario, a failed request does not break the flow but a message will be
+prompted.
+
+# Forms
+
+All the input components should be placed in the folder `src/components/from`.
+
+The core concepts are:
+
+ * <FormProvider<T> /> places instead of <form /> it should be mapped to an
+ object of type T
+
+ * <Input /> an others: defines UI, create <input /> DOM controls and access the
+ form with useField()
+
+To use it you will need a state somewhere with the object holding all the form
+information.
+
+```
+const [state, setState] = useState({ name: '', age: 11 })
+```
+
+Optionally an error object an be built with the error messages
+
+```
+const errors = {
+ field1: undefined,
+ field2: 'should be greater than 18',
+}
+```
+
+These 3 elements are used to setup the FormProvider
+
+```
+<FormProvider errors={errors} object={state} valueHandler={setState}>
+...inputs
+</FormProvider>
+```
+
+Inputs should handle UI rendering and use `useField(name)` to get:
+
+ * error: the field has been modified and the value is not correct
+ * required: the field need to be corrected
+ * value: the current value of the object
+ * initial: original value before change
+ * onChange: function to update the current field
+
+Also, every input must be ready to receive these properties
+
+ * name: property of the form object being manipulated
+ * label: how the name of the property will be shown in the UI
+ * placeholder: optional, inplace text when there is no value yet
+ * readonly: default to false, will prevent change the value
+ * help: optional, example text below the input text to help the user
+ * tooltip: optional, will add a (i) with a popup to describe the field
+
+
+# Custom Hooks
+
+All the general purpose hooks should be placed in folder `src/hooks` and tests
+under `tests/hooks`. Starts with the `use` word.
+
+# Contexts
+
+All the contexts should be placed in the folder `src/context` as a function.
+Should expose provider as a component `<XxxContextProvider />` and consumer as a
+hook function `useXxxContext()` (where XXX is the name)
+
+# Components
+
+Type of components:
+
+ * main entry point: src/index.tsx, mostly initialization
+
+ * routing: in the `src` folder, deciding who is going to take the work. That's
+ when the page is loading but also create navigation handlers
+
+ * pages: in the `paths` folder, setup page information (like querying the
+ backend for the list of things), handlers for CRUD events, delegated routing
+ to parent and UI to children.
+
+Some other guidelines:
+
+ * Hooks over classes are preferred
+
+ * Components that are ready to be reused on any place should be in
+ `src/components` folder
+
+ * Since one of the build targets is a single bundle with all the pages, we are
+ avoiding route based code splitting
+ https://github.com/preactjs/preact-cli#route-based-code-splitting
+
+
+# Testing
+
+Every components should have examples using storybook (xxx.stories.tsx). There
+is an automated test that check that every example can be rendered so we make
+sure that we do not add a regression.
+
+Every hook should have examples under `tests/hooks` with common usage trying to
+follow this structure:
+
+ * (Given) set some context of the initial condition
+
+ * (When) some action to be tested. May be the initialization of a hook or an
+ action associated with it
+
+ * (Then) a particular set of observable consequences should be expected
+
+# Accessibility
+
+Pages and components should be built with accessibility in mind.
+
+https://github.com/nickcolley/jest-axe
+https://orkhanhuseyn.medium.com/accessibility-testing-in-react-with-jest-axe-e08c2a3f3289
+http://accesibilidadweb.dlsi.ua.es/?menu=jaws
+https://webaim.org/projects/screenreadersurvey8/#intro
+https://www.gov.uk/service-manual/technology/testing-with-assistive-technologies#how-to-test
+https://es.reactjs.org/docs/accessibility.html
+
+# Internationalization
+
+Every non translated message should be written in English and wrapped into:
+
+ * i18n function from useTranslator() hook
+ * <Translate /> component
+
+Makefile has a i18n that will parse source files and update the po template.
+When *.po are updated, running the i18n target will create the strings.ts that
+the application will use in runtime.
+
+# Documentation Conventions
+
+* labels
+ * begin w/ a capital letter
+ * acronyms (e.g., "URL") are upper case
+* tooltips
+ * begin w/ a lower case letter
+ * do not end w/ punctuation (period)
+ * avoid leading article ("a", "an", "the")
diff --git a/packages/merchant-backoffice-ui/Makefile b/packages/merchant-backoffice-ui/Makefile
index 2dfee7999..3731e3490 100644
--- a/packages/merchant-backoffice-ui/Makefile
+++ b/packages/merchant-backoffice-ui/Makefile
@@ -11,6 +11,5 @@ spa_dir=$(prefix)/share/taler/merchant-backoffice
install:
pnpm install --frozen-lockfile --filter @gnu-taler/merchant-backoffice...
pnpm run build
- install -d $(spa_dir)
- install ./dist/* $(spa_dir)
+ (cd dist && find . -type f -exec install -D "{}" "$(spa_dir)/{}" \;)
diff --git a/packages/merchant-backoffice-ui/README.md b/packages/merchant-backoffice-ui/README.md
new file mode 100644
index 000000000..34bb98b67
--- /dev/null
+++ b/packages/merchant-backoffice-ui/README.md
@@ -0,0 +1,64 @@
+## Merchant Admin Frontend
+
+Merchant Admin Frontend is a Single Page Application (SPA) that connects with a running Merchant Backend and lets you manage instances, orders, products and tipping.
+
+## System requirements
+
+- Node: v16.15.0
+- pnpm: 7.14.2
+- make
+
+## Compiling from source
+
+Run `pnpm install --frozen-lockfile --filter @gnu-taler/merchant-backoffice...` to install all the nodejs dependencies.
+
+Then the command `pnpm build` create the distribution in the `dist` folder.
+
+By default the installation prefix will be `/usr/local/share/taler/merchant-backoffice/` but it can be overridden by `--prefix` in the configuration process:
+
+```shell
+./configure --prefix=/another/directory
+```
+
+To install run `make install`
+
+## Running develop
+
+To run a development server run:
+
+```shell
+./dev.mjs
+```
+
+This should start a watch process that will reload the server every time that a file is saved.
+
+The application need to connect to a merchant-backend properly configured to run.
+
+## Building for deploy
+
+To build and deploy the SPA in your local server run the install script:
+
+```shell
+make install
+```
+
+## Runtime dependencies
+
+* preact: Fast 3kB alternative to React with the same modern API
+
+* preact-router: URL component router for Preact
+
+* SWR: React Hooks library for data fetching (stale-while-revalidate)
+
+* Yup: schema builder for value parsing and validation (to be deprecated)
+
+* Date-fns: library for manipulating javascript date
+
+* qrcode-generator: simplest qr implementation based on JIS X 0510:1999
+
+* @gnu-taler/taler-util: types and tooling
+
+* history: manage the history stack, navigate, and persist state between sessions
+
+* jed: gettext like library for internationalization
+