From 1d0cfd66812b23738afde078ab97821030bddff8 Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 17:15:35 +0000 Subject: [PATCH 1/7] docs: document v7.13.0 features - Live formulas (HARDFORMULA/SOFTFORMULA) in dcc-validations with operator-friendly explanations - MPE_VALIDATIONS table doc: add HARDFORMULA/SOFTFORMULA to RULE_TYPE values - Roadmap: mark Frontend Formulae and Regex Rules as delivered - SAS VA Embed: document Live vs Confirm filter modes - ViewBoxes: document edge/corner drag resizing - Licensing: combined-key paste, key preview, protocol warning - CAS Tables: REPLACE load type support and temp table cleanup - Editor: native date/time pickers, paste-validation overlay, row status indicators - Stage page: Formatted/Unformatted toggle on the approvals screen - Viya deploy: configurator improvements, deploy checks, login page UX - Index page: add live formulas and VA embed to features list --- docs/admin-services.md | 7 +++++ docs/cas-tables.md | 4 +++ docs/dc-userguide.md | 14 +++++++++- docs/dcc-validations.md | 47 +++++++++++++++++++++++++++++++++- docs/deploy-viya.md | 17 +++++++++++- docs/embed-va.md | 9 +++++++ docs/index.md | 3 ++- docs/roadmap.md | 4 +-- docs/tables/mpe_validations.md | 2 +- docs/viewboxes.md | 2 +- 10 files changed, 101 insertions(+), 8 deletions(-) diff --git a/docs/admin-services.md b/docs/admin-services.md index 8c2fe6e..d911658 100644 --- a/docs/admin-services.md +++ b/docs/admin-services.md @@ -22,4 +22,11 @@ Button info as follows: |Update Licence Key| Link to the screen for providing a new Data Controller licence key| |Export DC Library DDL|COMING SOON!!
Exports the data controller control library in DB specific DDL (eg SAS, PGSQL, TSQL) and allows an optional schema name to be included| +## Licence Key Screen + +The licence key screen is where you apply or update your Data Controller licence key. The following features are available: + +* **Paste both keys at once** - if you have received a combined key, simply paste it into the licence key field and both the licence key and activation key fields are filled in automatically. You can toggle between the combined-key input and the traditional two-field layout. +* **Preview before applying** - as soon as both fields are populated, the key details (expiry date, number of users, active features) are displayed so you can confirm the key is correct before clicking Apply. +* **Protocol warning** - if you paste a key that was generated for a different connection type than the one you are using (http vs https), a warning is shown and the Apply button is blocked, preventing a key that will not work from being saved. diff --git a/docs/cas-tables.md b/docs/cas-tables.md index ed413f0..8ac6361 100644 --- a/docs/cas-tables.md +++ b/docs/cas-tables.md @@ -39,6 +39,10 @@ Note that since the CAS connection is using a shared account, the CASUSER librar It can happen that a CAS table is configured in Data Controller but not loaded into memory. In this case, when a user selects the table, it will be automatically loaded. +### REPLACE Load Type + +The REPLACE load type (which replaces all rows in the target table with the staged data) is supported on CAS tables. This works the same way as it does for regular SAS datasets - see [MPE_TABLES](/dcc-tables/#loadtype) for general REPLACE documentation. + ## Unloading After an approval, the in-memory version of the CAS Table will be updated. To apply this to the underlying file on disk, the following code must be executed (eg in a POST APPROVE HOOK): diff --git a/docs/dc-userguide.md b/docs/dc-userguide.md index 86b6c96..404438a 100644 --- a/docs/dc-userguide.md +++ b/docs/dc-userguide.md @@ -48,6 +48,18 @@ After this, remaining columns are shown. Dates / datetime fields have appropria New rows can be added using the right click context menu, or the 'Add Row' button. The data can also be sorted by clicking on the column headers. +#### Native Date and Time Pickers + +Date, time, and datetime columns use native browser pickers when editing a cell. This provides a familiar calendar and time selector, and respects your browser's locale settings for date and time formats. + +#### Paste Validation Overlay + +When you paste data into the editor (or drag to autofill cells), a confirmation overlay appears so you can review the changes before they are applied. All pasted values are checked against your configured [validation rules](/dcc-validations/). For large pastes, a progress indicator shows how many cells have been validated. + +#### Row Status Indicators + +Each row's header cell is colour-coded to show its current status - modified, added, deleted, or unchanged. The "modified" indicator uses a `±` symbol so you can quickly spot which rows have changed. + When ready to submit, hit the SUBMIT button and enter a reason for the change. The owners of the data are now alerted (so long as their email addresses are in metadata) with a link to the approve screen. If you are also an approver you can approve this change yourself. @@ -60,7 +72,7 @@ Data Controller supports special missing numerics, ie - a single letter or under The Data Controller only permits BiTemporal data uploads at a single point in time - so for convenience, when viewing data in the edit screen, only the most recent records are displayed. To edit earlier records, either use file upload, or apply a filter. ### Submitted -This page shows a list of the changes you have submitted (that are not yet approved). +This page shows a list of the changes you have submitted (that are not yet approved). When you open a submitted change for review, you can toggle between viewing the data with SAS formats applied (eg formatted dates and currency) or as raw underlying values. This is useful when you need to verify the exact value being submitted rather than its display representation. ### Approvals This shows the list of changes that have been submitted to you (or your groups) for approval. diff --git a/docs/dcc-validations.md b/docs/dcc-validations.md index a478cca..401e8ec 100644 --- a/docs/dcc-validations.md +++ b/docs/dcc-validations.md @@ -23,7 +23,7 @@ It is possible to configure a number of other rules by updating the MPE_VALIDATI ## Configurable Checks -Check back frequently as we plan to keep growing this list of checks. +Check back frequently as we keep growing this list of checks. |Rule Type|Example Value |Description| |---|---|---| @@ -35,6 +35,8 @@ Check back frequently as we plan to keep growing this list of checks. |HIDDEN|(defaultval) |Hides the column from the editor grid while still submitting its data. The defaultval is used when rows are added. | |ROUND|2 |Rounds numeric input on paste/edit. Positive digits round to number of decimal places (eg 2 rounds to 0.01) Negative digits round to the nearest ten/hundred etc. Half-away-from-zero rounding is applied so `-0.5 → -1` and `2.5 → 3`. | |NUMBER_FORMAT|`{"style":"currency","currency":"GBP"}` |Display-only [`Intl.NumberFormat` renderer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat). RULE_VALUE is the JSON options object passed straight to `Intl.NumberFormat`. Does not change the stored value. | +|HARDFORMULA|`= PRICE * VOLUME`|The cell displays a value computed from a formula, using other columns in the same row. The column is read-only - the user cannot override the result. See [Formula Rules](#formula-rules) below.| +|SOFTFORMULA|`= if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE )`|Like HARDFORMULA, but the user can override the computed value and type their own. See [Formula Rules](#formula-rules) below.| |HARDREGEX|`^[A-Z]{3}$`|The cell value **must** match the regex pattern, otherwise submission is blocked and the cell is highlighted red. See [Regex Rules](#regex-rules) below.| |SOFTREGEX|`^[A-Z]{3}$`|A cell value that does not match the regex pattern is highlighted yellow as a warning, but submission is **not** blocked. See [Regex Rules](#regex-rules) below.| |HARDSELECT|sashelp.class.name|A distinct list of values (max 1000) are taken from this library.member.column reference, and the value **must** be in this list. This list may be supplemented by entries in the MPE_SELECTBOX table.| @@ -43,6 +45,49 @@ Check back frequently as we plan to keep growing this list of checks. |[SOFTSELECT_HOOK](/dynamic-cell-dropdown)|/physical/path/program.sas|A SAS service (STP or Viya Job) or a path to a SAS program on the filesystem. User-provided values may (or may not) be in this list. Cannot be used alongside a HARDSELECT_HOOK.| +## Formula Rules + +HARDFORMULA and SOFTFORMULA let you configure a column so that its value is automatically calculated from other columns in the same row - just like a spreadsheet formula. When a user opens the editor, the formula is evaluated live and the result is shown in each cell. + +### Writing a formula + +Formulas use column names, not cell references, so there is no need to know the grid layout. For example, if you have PRICE and VOLUME columns, a REVENUE column formula would be: + +``` += PRICE * VOLUME +``` + +Each row calculates its own result - the PRICE in row 1 is multiplied by the VOLUME in row 1, the PRICE in row 2 by the VOLUME in row 2, and so on. + +!!! note + Each column name in the formula must be surrounded by spaces (eg ` PRICE ` not `PRICE`) so it is recognised as a column reference rather than part of a function name. Text inside quotes is left as-is. + +### HARDFORMULA vs SOFTFORMULA + +* **HARDFORMULA** - the column is read-only. The formula result is always shown and submitted. The user cannot change it. +* **SOFTFORMULA** - the cell shows the formula result but the user can type a different value if needed. If they do, their value is submitted instead. + +### Editor behaviour + +* When you paste a formula into the grid, column names are automatically translated so the formula works in its new position. +* A cell that is overwritten by a formula is flagged so you can revert it. +* Formula-looking values pasted from Excel are treated as plain data (not evaluated), unless you explicitly choose "Apply as formula". + +### Special values + +Formulas can reference three special values that are resolved at runtime: + +* `DC.ROW_STATUS` - the current state of the row: `M` (Modified), `A` (Added), `D` (Deleted), or `U` (Unchanged). +* `DC.USER_NAME` - the logged-in user id. +* `DC.ORIG_VALUE` - the original cell value before the current edit. + +Example - show the current user id if the row is changed, otherwise keep the original value: + +``` += if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE ) +``` + + ## Regex Rules HARDREGEX and SOFTREGEX validate cell values against a SAS (Perl-style) regular expression provided in `RULE_VALUE` - the same syntax accepted by [PRXPARSE](https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lefunctionsref/p0s9ilagexmjl8n1u7e1t1jfnzlk.htm). diff --git a/docs/deploy-viya.md b/docs/deploy-viya.md index da854d5..d3b0a30 100644 --- a/docs/deploy-viya.md +++ b/docs/deploy-viya.md @@ -130,6 +130,19 @@ Now the services are deployed (including the service which creates the staging a * Admin Group - the members of this group will have full access to Data Controller * Compute Context - the context configured in Step 1 +!!! note + On the first-launch configuration screen, the **Groups** dropdown shows your own groups first, the **Contexts** dropdown groups contexts by their batch user, and a **Verify** button lets you confirm the startup service is running before continuing. If no admin groups are found, a clear message is shown instead of the screen hanging silently. + +!!! note + The login page provides input contrast and validation. Submitting empty fields does not produce an infinite spinner. + +### Deploy Checks + +The deploy process runs additional checks during installation to catch configuration issues early. For larger Viya environments, the deploy script is chunked for reliability. The compute context is also automatically corrected during deploy if needed. + +!!! note + A debug comment is added to the compute context during deploy. This is permanent - it is not removed by subsequent deploys. + ### Optimisation @@ -174,4 +187,6 @@ To update DC, just deploy it as a fresh instance, then move the new config acros It is possible to embed a Data Controller table within SAS Visual Analytics by simply pasting the URL. -To make the portlet more visually appealing, the Data Controller title bar can be removed by adding `?embed=true` to the URL. When opening in a new window, the title bar will be gone. \ No newline at end of file +To make the portlet more visually appealing, the Data Controller title bar can be removed by adding `?embed=true` to the URL. When opening in a new window, the title bar will be gone. + +For a deeper VA integration - where report row selections drive filters and column visibility in the Data Controller editor - append `?embed=va` instead. See the [SAS Visual Analytics Embed](/embed-va/) page for details on filter modes, configuration, and debugging. \ No newline at end of file diff --git a/docs/embed-va.md b/docs/embed-va.md index f992e42..ab0cd4f 100644 --- a/docs/embed-va.md +++ b/docs/embed-va.md @@ -38,6 +38,15 @@ If VA sends an empty / unmatched message the editor falls back to the unfiltered More logic available in [`va-messaging.service.ts'](https://git.datacontroller.io/dc/dc/src/branch/main/client/src/app/services/va-messaging.service.ts). +## Filter Modes + +When running in `embed=va` mode, the editor provides two filter modes, controlled by the **Auto-apply** checkbox: + +* **Live (default)** - the editor updates automatically as you select rows in the VA report, so the data you see always matches your current selection. +* **Confirm** - filter changes are held until you click the **Apply** button. This is useful when editing, where an automatic reload would discard unsaved changes. + +A status indicator shows whether a filter change is pending, loading, or idle. In edit mode, a pending filter is held until you leave edit mode, so your unsaved edits are never lost. + ## Configuration in VA In the VA Report Designer, add a **Data-Driven Content** object and set the URL to the editor route shown above. Be sure that any report level filters have their corresponding parameters added to the DDC object itself. diff --git a/docs/index.md b/docs/index.md index 4041c7d..f3f595a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,7 +31,7 @@ Data Controller is regularly updated with new features. If you see something th * [Excel uploads](/excel) - drag & drop directly into SAS. All versions of excel supported. * Data Lineage - at both table and column level, export as image or CSV -* Data Validation Rules - both automatic and user defined +* Data Validation Rules - both automatic and user defined, including [live formulas](/dcc-validations/#formula-rules) * Data Dictionary - map data definitions and ownership * Data Catalog - including primary key extraction * DDL generator - in SAS, TSQL and PGSQL flavours @@ -42,6 +42,7 @@ Data Controller is regularly updated with new features. If you see something th * [Row Level Security](/row-level-security) * Excel [formula support](excel) * Dynamic [cell dropdown](/dynamic-cell-dropdown) +* [SAS Visual Analytics embed](/embed-va/) - drive the editor from VA report selections * Works on ALL flavours of SAS (Base, EBI, Viya) diff --git a/docs/roadmap.md b/docs/roadmap.md index b1ec2c1..2630c75 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -28,8 +28,8 @@ The following features are currently requested: The following additional features are necessary: -* Frontend Formulae -* Regex Rules +* ~~Frontend Formulae~~ - **Delivered** in v7.13.0. See [Formula Rules](/dcc-validations/#formula-rules). +* Regex Rules - **Delivered**. See [Regex Rules](/dcc-validations/#regex-rules). The above rules will apply only at frontend, and will be configurable in the MPE_VALIDATIONS table. The values will appear as part of the [editors/getdata](https://code.datacontroller.io/getdata_8sas_source.html) service response in the `dqrules` object. diff --git a/docs/tables/mpe_validations.md b/docs/tables/mpe_validations.md index 32f4395..4430641 100644 --- a/docs/tables/mpe_validations.md +++ b/docs/tables/mpe_validations.md @@ -20,6 +20,6 @@ A detailed breakdown is available in the [validations](/dcc-validations/) sectio - 🔑 `BASE_LIB char(8)`: SAS Libref (8 chars) - 🔑 `BASE_DS char(32)`: The library member name - 🔑 `BASE_COL char(32)`: The column name - - 🔑 `RULE_TYPE char(32)`: The name of the rule to apply. Valid values include `CASE`, `NOTNULL`, `MINVAL`, `MAXVAL`, `READONLY`, `HIDDEN`, `ROUND`, `NUMBER_FORMAT`, `HARDREGEX`, `SOFTREGEX`, `HARDSELECT`, `SOFTSELECT`, `HARDSELECT_HOOK` and `SOFTSELECT_HOOK`. + - 🔑 `RULE_TYPE char(32)`: The name of the rule to apply. Valid values include `CASE`, `NOTNULL`, `MINVAL`, `MAXVAL`, `READONLY`, `HIDDEN`, `ROUND`, `NUMBER_FORMAT`, `HARDFORMULA`, `SOFTFORMULA`, `HARDREGEX`, `SOFTREGEX`, `HARDSELECT`, `SOFTSELECT`, `HARDSELECT_HOOK` and `SOFTSELECT_HOOK`. - `RULE_VALUE char(128)`: The value of the rule. - `RULE_ACTIVE num`: Set to 1 for an active rule, or 0 to disable the rule. diff --git a/docs/viewboxes.md b/docs/viewboxes.md index 962e808..3d9c055 100644 --- a/docs/viewboxes.md +++ b/docs/viewboxes.md @@ -12,7 +12,7 @@ Often when editing (or examining) raw data, it is helpful to see it alongside re Each individual viewbox has the following features: * Choose the columns to display (and which order) -* Resize individual boxes (or reset to original) +* Resize individual boxes by dragging any of the four edges or corners (or reset to original) * Full filtering capability (complex clauses) * Minimise / Restore all, or individually * Reposition - manually, or snap to grid From 6fa1b4f6baa65d61d2c88a3850874a3921703a38 Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 19:13:13 +0000 Subject: [PATCH 2/7] docs(viya): remove low-value login page note --- docs/deploy-viya.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/deploy-viya.md b/docs/deploy-viya.md index d3b0a30..6130e5b 100644 --- a/docs/deploy-viya.md +++ b/docs/deploy-viya.md @@ -133,9 +133,6 @@ Now the services are deployed (including the service which creates the staging a !!! note On the first-launch configuration screen, the **Groups** dropdown shows your own groups first, the **Contexts** dropdown groups contexts by their batch user, and a **Verify** button lets you confirm the startup service is running before continuing. If no admin groups are found, a clear message is shown instead of the screen hanging silently. -!!! note - The login page provides input contrast and validation. Submitting empty fields does not produce an infinite spinner. - ### Deploy Checks The deploy process runs additional checks during installation to catch configuration issues early. For larger Viya environments, the deploy script is chunked for reliability. The compute context is also automatically corrected during deploy if needed. From 9666ca3300c5e4a2b801c543057cc31e3bffe774 Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 19:32:49 +0000 Subject: [PATCH 3/7] docs: remove non-DC and low-value sections from v7.13.0 docs bundle - deploy-viya: remove first-launch note, Deploy Checks section - admin-services: remove Licence Key Screen section - cas-tables: remove REPLACE Load Type subsection --- docs/admin-services.md | 8 -------- docs/cas-tables.md | 4 ---- docs/deploy-viya.md | 11 ----------- 3 files changed, 23 deletions(-) diff --git a/docs/admin-services.md b/docs/admin-services.md index d911658..8f78fb2 100644 --- a/docs/admin-services.md +++ b/docs/admin-services.md @@ -22,11 +22,3 @@ Button info as follows: |Update Licence Key| Link to the screen for providing a new Data Controller licence key| |Export DC Library DDL|COMING SOON!!
Exports the data controller control library in DB specific DDL (eg SAS, PGSQL, TSQL) and allows an optional schema name to be included| -## Licence Key Screen - -The licence key screen is where you apply or update your Data Controller licence key. The following features are available: - -* **Paste both keys at once** - if you have received a combined key, simply paste it into the licence key field and both the licence key and activation key fields are filled in automatically. You can toggle between the combined-key input and the traditional two-field layout. -* **Preview before applying** - as soon as both fields are populated, the key details (expiry date, number of users, active features) are displayed so you can confirm the key is correct before clicking Apply. -* **Protocol warning** - if you paste a key that was generated for a different connection type than the one you are using (http vs https), a warning is shown and the Apply button is blocked, preventing a key that will not work from being saved. - diff --git a/docs/cas-tables.md b/docs/cas-tables.md index 8ac6361..ed413f0 100644 --- a/docs/cas-tables.md +++ b/docs/cas-tables.md @@ -39,10 +39,6 @@ Note that since the CAS connection is using a shared account, the CASUSER librar It can happen that a CAS table is configured in Data Controller but not loaded into memory. In this case, when a user selects the table, it will be automatically loaded. -### REPLACE Load Type - -The REPLACE load type (which replaces all rows in the target table with the staged data) is supported on CAS tables. This works the same way as it does for regular SAS datasets - see [MPE_TABLES](/dcc-tables/#loadtype) for general REPLACE documentation. - ## Unloading After an approval, the in-memory version of the CAS Table will be updated. To apply this to the underlying file on disk, the following code must be executed (eg in a POST APPROVE HOOK): diff --git a/docs/deploy-viya.md b/docs/deploy-viya.md index 6130e5b..7cdedfc 100644 --- a/docs/deploy-viya.md +++ b/docs/deploy-viya.md @@ -130,17 +130,6 @@ Now the services are deployed (including the service which creates the staging a * Admin Group - the members of this group will have full access to Data Controller * Compute Context - the context configured in Step 1 -!!! note - On the first-launch configuration screen, the **Groups** dropdown shows your own groups first, the **Contexts** dropdown groups contexts by their batch user, and a **Verify** button lets you confirm the startup service is running before continuing. If no admin groups are found, a clear message is shown instead of the screen hanging silently. - -### Deploy Checks - -The deploy process runs additional checks during installation to catch configuration issues early. For larger Viya environments, the deploy script is chunked for reliability. The compute context is also automatically corrected during deploy if needed. - -!!! note - A debug comment is added to the compute context during deploy. This is permanent - it is not removed by subsequent deploys. - - ### Optimisation At this point, every DC request will read the `services/public/settings.sas` file to get the DC library (and other) settings. To avoid these API calls (which will speed up the app) we can simply move this code to the autoexec. Steps as follows: From 57e8a6e97544cb282abea9e8604b35d25fbec60f Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 19:50:31 +0000 Subject: [PATCH 4/7] docs: improve formula examples, fix roadmap structure, add trailing newline - dcc-validations: add MATCH() example showing why spaces matter around column names; document that new rows are 'A' from creation - roadmap: move delivered Frontend Formulae and Regex Rules to Delivered Features section; reword 'necessary' heading - deploy-viya: add trailing newline --- docs/dcc-validations.md | 4 ++-- docs/deploy-viya.md | 2 +- docs/roadmap.md | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/dcc-validations.md b/docs/dcc-validations.md index 401e8ec..9f7977d 100644 --- a/docs/dcc-validations.md +++ b/docs/dcc-validations.md @@ -60,7 +60,7 @@ Formulas use column names, not cell references, so there is no need to know the Each row calculates its own result - the PRICE in row 1 is multiplied by the VOLUME in row 1, the PRICE in row 2 by the VOLUME in row 2, and so on. !!! note - Each column name in the formula must be surrounded by spaces (eg ` PRICE ` not `PRICE`) so it is recognised as a column reference rather than part of a function name. Text inside quotes is left as-is. + Each column name in the formula must be surrounded by spaces (eg ` PRICE ` not `PRICE`) so it is recognised as a column reference rather than part of a function name. For example, `=MATCH( PRICE )` resolves the column reference, but `=MATCH(PRICE)` does not - PRICE is left unrecognised and the formula will error rather than using the column's value. Text inside quotes is left as-is. ### HARDFORMULA vs SOFTFORMULA @@ -77,7 +77,7 @@ Each row calculates its own result - the PRICE in row 1 is multiplied by the VOL Formulas can reference three special values that are resolved at runtime: -* `DC.ROW_STATUS` - the current state of the row: `M` (Modified), `A` (Added), `D` (Deleted), or `U` (Unchanged). +* `DC.ROW_STATUS` - the current state of the row: `M` (Modified), `A` (Added), `D` (Deleted), or `U` (Unchanged). A newly-added row is `A` from the moment it is created - there is no transient state before that. * `DC.USER_NAME` - the logged-in user id. * `DC.ORIG_VALUE` - the original cell value before the current edit. diff --git a/docs/deploy-viya.md b/docs/deploy-viya.md index 7cdedfc..27af1aa 100644 --- a/docs/deploy-viya.md +++ b/docs/deploy-viya.md @@ -175,4 +175,4 @@ It is possible to embed a Data Controller table within SAS Visual Analytics by s To make the portlet more visually appealing, the Data Controller title bar can be removed by adding `?embed=true` to the URL. When opening in a new window, the title bar will be gone. -For a deeper VA integration - where report row selections drive filters and column visibility in the Data Controller editor - append `?embed=va` instead. See the [SAS Visual Analytics Embed](/embed-va/) page for details on filter modes, configuration, and debugging. \ No newline at end of file +For a deeper VA integration - where report row selections drive filters and column visibility in the Data Controller editor - append `?embed=va` instead. See the [SAS Visual Analytics Embed](/embed-va/) page for details on filter modes, configuration, and debugging. diff --git a/docs/roadmap.md b/docs/roadmap.md index 2630c75..590cf7f 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -26,12 +26,7 @@ The following features are currently requested: ### Additional Validations -The following additional features are necessary: - -* ~~Frontend Formulae~~ - **Delivered** in v7.13.0. See [Formula Rules](/dcc-validations/#formula-rules). -* Regex Rules - **Delivered**. See [Regex Rules](/dcc-validations/#regex-rules). - -The above rules will apply only at frontend, and will be configurable in the MPE_VALIDATIONS table. The values will appear as part of the [editors/getdata](https://code.datacontroller.io/getdata_8sas_source.html) service response in the `dqrules` object. +The following additional features are under consideration: **Frontend Formulae** @@ -236,4 +231,12 @@ It is now possible to restore any change by heading to the particular staged dat This will submit a NEW change (which must first be approved) that will revert the table to state it was in just prior to the selected upload. -Note that Data Controller can only track (and revert) changes that are made using the Data Controller tool itself! It does not / cannot track changes made externally to a table, by other tools. \ No newline at end of file +Note that Data Controller can only track (and revert) changes that are made using the Data Controller tool itself! It does not / cannot track changes made externally to a table, by other tools. + +### Frontend Formulae + +Delivered in v7.13.0. Formula columns (HARDFORMULA / SOFTFORMULA) are computed live in the editor using HyperFormula, with variable-name references resolved to row-relative cell references. See [Formula Rules](/dcc-validations/#formula-rules). + +### Regex Rules + +Delivered. HARDREGEX (blocking) and SOFTREGEX (warning) rules validate cell values against a Perl-style regular expression. See [Regex Rules](/dcc-validations/#regex-rules). \ No newline at end of file From d342e512412b8bd271133cd5f20531105f37c41c Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 19:53:03 +0000 Subject: [PATCH 5/7] docs(roadmap): fix wrong 'under consideration' heading - features are delivered --- docs/roadmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 590cf7f..3451be2 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -26,7 +26,7 @@ The following features are currently requested: ### Additional Validations -The following additional features are under consideration: +The design approach for these (now delivered) features is described below: **Frontend Formulae** From 6f176b35e12987e073093c7616bec7b0afbf6e0b Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 20:07:09 +0000 Subject: [PATCH 6/7] docs(roadmap): use headings instead of bold text for design subsections --- docs/roadmap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 3451be2..76e4c19 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -28,7 +28,7 @@ The following features are currently requested: The design approach for these (now delivered) features is described below: -**Frontend Formulae** +#### Frontend Formulae The plan here will be to introduce [hyperformula](https://hyperformula.handsontable.com/guide/demo.html) into HandsOnTable. It will allow a library of ~400 functions and advanced excel-like behaviour. It integrates natively [as a plugin with HandsOnTable](https://handsontable.com/docs/javascript-data-grid/formula-calculation/#available-functions). @@ -77,7 +77,7 @@ Which would translate to the following formula, after the page is loaded: =if(A1!='U',"sasdemo","sasinstaller") ``` -**Regex Rules** +#### Regex Rules There are two types of rule we can apply in the form of regular expressions: From 6d9d29b786854318f86df17686a2b5b0f80d255e Mon Sep 17 00:00:00 2001 From: dc-bot Date: Thu, 3 Sep 2026 20:10:54 +0000 Subject: [PATCH 7/7] docs(roadmap): remove duplicated delivered validation features from Requested section --- docs/roadmap.md | 62 ------------------------------------------------- 1 file changed, 62 deletions(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 76e4c19..6c50ae6 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -20,71 +20,9 @@ When features are requested, we will describe the work to be performed in the se The following features are currently requested: -* Additional Validations * Ability to set 'number of approvals' to zero, enabling instant updates (4 days) * Ability to make automated submissions using an API -### Additional Validations - -The design approach for these (now delivered) features is described below: - -#### Frontend Formulae - -The plan here will be to introduce [hyperformula](https://hyperformula.handsontable.com/guide/demo.html) into HandsOnTable. It will allow a library of ~400 functions and advanced excel-like behaviour. It integrates natively [as a plugin with HandsOnTable](https://handsontable.com/docs/javascript-data-grid/formula-calculation/#available-functions). - -The initial challenge will be that HyperFormula requires cell references to operate, eg: - -|ITEM|PRICE|VOLUME|REVENUE| -|---|---|---|---| -|PAPER|4.20|100|`= B1 * C1`| -|PEN|61.02|1,971|`= B2 * C2`| - -Whereas end users cannot know these references ahead of time. Therefore the references will be made using variable names, eg: - - -|ITEM|PRICE|VOLUME|REVENUE| -|---|---|---|---| -|PAPER|4.20|100|`= PRICE * VOLUME`| -|PEN|61.02|1,971|`= PRICE * VOLUME`| - - -The frontend can then perform replacement of the variables for each Formula cell. For instance, replacing ` PRICE ` with ` B1 ` and ` VOLUME ` with ` C1 ` in the first row (and with ` B2 ` and ` C2 ` in the second row respectively). - -To avoid clashes with names that match function names (eg, `MATCH()`) each named variable **must have a leading and trailing blank**, and we should be sure to ignore variables inside of single or double quoted strings - eg ` ITEM & " string ITEM "` (would resolve to `A1 & "string ITEM "`). - -There would be two types applied: - -* `HARDFORMULA` -> Column is readonly -* `SOFTFORMULA` -> Column can be changed by the user - -To enable conditional logic (eg, show the current user id if row is changed), we also need a new column in the EDIT grid, to show the edit status (Modified, Added, Deleted, Unchanged). This should be the first column, and should NOT be submitted to backend. We could display these values as icons, rather than letters. - -These properties can be accessed using the following literals: - -* DC.ROW_STATUS - replaced at runtime with the cell reference, eg A1 or A2. Values would be M, A, D, or U. -* DC.USER_NAME - replaced at runtime with the logged-in user id -* DC.ORIG_VALUE - replaced at runtime with the original cell value - -An example of a rule value that intends to show the current user id if the row is changed: - -``` -RULE_VALUE= if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE ) -``` - -Which would translate to the following formula, after the page is loaded: - -``` -=if(A1!='U',"sasdemo","sasinstaller") -``` - -#### Regex Rules - -There are two types of rule we can apply in the form of regular expressions: - -* `HARDREGEX` -> If the value fails the rule, the data cannot be submitted (turns red) -* `SOFTREGEX` -> If the value fails the rule we change the cell colour to yellow (as a warning), but can still submit - - ### Set Approvals to Zero The following changes are necessary to implement this feature: