Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63dea99371 |
@@ -24,9 +24,9 @@ Button info as follows:
|
|||||||
|
|
||||||
## Licence Key Screen
|
## Licence Key Screen
|
||||||
|
|
||||||
The licence key screen is where you apply or update your Data Controller licence key. Three improvements have been made to make this easier:
|
The licence key screen accepts a Data Controller licence key and activation 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.
|
* **Combined-key paste** - paste a multi-field licence key (prefixed `DCKEY1:`) into either the licence key field or the dedicated combined-key input, and both the licence key and activation key are populated automatically. The key format can be toggled between combined and legacy two-field input.
|
||||||
* **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.
|
* **Live key preview** - as soon as both fields are populated, the key is decrypted speculatively and its details (valid until, number of users, feature flags, etc.) are displayed before you click Apply, so you can verify the key is correct.
|
||||||
* **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.
|
* **Protocol mismatch guard** - if you paste a key generated for a different protocol than the page is currently using (http vs https), the Apply button is blocked and a warning is shown. A key generated for an insecure connection carries the same text in both fields; a key generated for a secure connection carries two different values, so the mismatch can be detected before any decrypt attempt.
|
||||||
|
|
||||||
|
|||||||
+8
-2
@@ -41,7 +41,13 @@ It can happen that a CAS table is configured in Data Controller but not loaded i
|
|||||||
|
|
||||||
### REPLACE Load Type
|
### REPLACE Load Type
|
||||||
|
|
||||||
The REPLACE load type (which replaces all rows in the target table with the staged data) is now fully 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.
|
The REPLACE load type is fully supported on CAS tables. When a REPLACE load is applied to a CAS target, Data Controller:
|
||||||
|
|
||||||
|
1. Casts any fixed-length character variables in the staging table to varchar (matching the target table structure), since fixed char variables cannot be appended to CAS varchar columns.
|
||||||
|
2. Truncates the target CAS table in-place using `proc cas; table.deleteRows` (CAS tables do not support SQL deletes).
|
||||||
|
3. Appends the staged data via a data step with `sessref=dcsession`.
|
||||||
|
|
||||||
|
The truncate is deliberately the last step before the append, to minimise the time in which the target table is empty. See [MPE_TABLES](/dcc-tables/#loadtype) for general REPLACE documentation.
|
||||||
|
|
||||||
## Unloading
|
## Unloading
|
||||||
|
|
||||||
@@ -61,4 +67,4 @@ Processing of data in Data Controller is performed in SPRE with SAS datasets - a
|
|||||||
|
|
||||||
## Temporary Table Cleanup
|
## Temporary Table Cleanup
|
||||||
|
|
||||||
If a CAS load fails partway through, any temporary tables created during the process are cleaned up automatically - no manual intervention is required.
|
Temporary `casuser` tables created during loading (eg the REPLACE cast-and-append step above) are cleaned up correctly, including in error conditions. If a load is aborted before completion, any temp tables created mid-process are dropped before the lock is released.
|
||||||
|
|||||||
@@ -50,15 +50,15 @@ New rows can be added using the right click context menu, or the 'Add Row' butto
|
|||||||
|
|
||||||
#### Native Date and Time Pickers
|
#### Native Date and Time Pickers
|
||||||
|
|
||||||
Date, time, and datetime columns now 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.
|
Date, time, and datetime columns use native browser pickers in the editor, providing a familiar, locale-aware editing experience. Date columns use an `<input type="date">` picker, time columns use `<input type="time">` (24-hour), and datetime columns use `<input type="datetime-local">`. The pickers are backed by Handsontable 17 Intl cell types for consistent formatting.
|
||||||
|
|
||||||
#### Paste Validation Overlay
|
#### 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.
|
When you paste data into the editor (or autofill cells by dragging), a validation overlay appears before the changes are applied. This lets you review the pending changes and cancel or confirm them. All pasted and autofilled cells are validated against the configured [validation rules](/dcc-validations/). For large pastes, a progress banner shows the validation status.
|
||||||
|
|
||||||
#### Row Status Indicators
|
#### 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.
|
The row-header status cells are colour-coded to show whether each row is modified, added, deleted, or unchanged. The "modified" symbol is `±` for clearer visual feedback.
|
||||||
|
|
||||||
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.
|
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.
|
If you are also an approver you can approve this change yourself.
|
||||||
@@ -77,7 +77,7 @@ This page shows a list of the changes you have submitted (that are not yet appro
|
|||||||
### Approvals
|
### Approvals
|
||||||
This shows the list of changes that have been submitted to you (or your groups) for approval.
|
This shows the list of changes that have been submitted to you (or your groups) for approval.
|
||||||
|
|
||||||
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.
|
When you open a submitted change for review, the staged data is displayed alongside the current values so you can see exactly what will change. A **Formatted / Unformatted** toggle on the staging page lets you switch between viewing the data with SAS formats applied (eg `DATE9.` dates, `DOLLAR8.` currency) or as raw underlying values. This is useful when you need to verify the actual value being submitted rather than its display representation.
|
||||||
|
|
||||||
### History
|
### History
|
||||||
View the list of changes to each table, who made the change, when, etc.
|
View the list of changes to each table, who made the change, when, etc.
|
||||||
|
|||||||
+27
-22
@@ -35,8 +35,8 @@ Check back frequently as we 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. |
|
|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`. |
|
|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. |
|
|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.|
|
|HARDFORMULA|`= PRICE * VOLUME`|Evaluates a live, spreadsheet-style formula in the editor using [HyperFormula](https://hyperformula.handsontable.com/). The column is rendered read-only and the computed value (not the formula text) is submitted on save. 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.|
|
|SOFTFORMULA|`= if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE )`|Same as HARDFORMULA but the cell remains editable - the user can override the computed value. 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.|
|
|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.|
|
|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.|
|
|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.|
|
||||||
@@ -47,44 +47,49 @@ Check back frequently as we keep growing this list of checks.
|
|||||||
|
|
||||||
## Formula Rules
|
## 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.
|
HARDFORMULA and SOFTFORMULA bring live, spreadsheet-style formula evaluation to the Data Editor using the [HyperFormula](https://hyperformula.handsontable.com/) engine (the same library that powers formula calculation in Handsontable). When a column has either rule, the editor evaluates the formula in real time and displays the computed value in each cell.
|
||||||
|
|
||||||
### Writing a formula
|
### How formulas are written
|
||||||
|
|
||||||
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:
|
Formulas are written using column names rather than cell references, so end users do not need to know the grid layout:
|
||||||
|
|
||||||
```
|
|ITEM|PRICE|VOLUME|REVENUE|
|
||||||
= PRICE * VOLUME
|
|---|---|---|---|
|
||||||
```
|
|PAPER|4.20|100|`= PRICE * VOLUME`|
|
||||||
|
|PEN|61.02|1,971|`= 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.
|
At runtime the editor translates each column name to the correct cell reference for the current row (eg `PRICE` becomes `B1` in the first row, `B2` in the second, and so on).
|
||||||
|
|
||||||
!!! note
|
!!! 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 named variable **must have a leading and trailing blank** so it does not clash with function names (eg `MATCH()`). Variables inside single or double quoted strings are left untouched - eg `= "hello " & ITEM & " world"` resolves `ITEM` but not the word `ITEM` inside the string literal.
|
||||||
|
|
||||||
### HARDFORMULA vs SOFTFORMULA
|
### HARDFORMULA vs SOFTFORMULA
|
||||||
|
|
||||||
* **HARDFORMULA** - the column is read-only. The formula result is always shown and submitted. The user cannot change it.
|
* **HARDFORMULA** - the column is read-only. The formula is always evaluated and the computed value is displayed and submitted. The user cannot override 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.
|
* **SOFTFORMULA** - the cell starts with the computed value but remains editable. The user can type a different value, which is then submitted instead of the formula result.
|
||||||
|
|
||||||
### Editor behaviour
|
### Formula-aware behaviour across the editor
|
||||||
|
|
||||||
* When you paste a formula into the grid, column names are automatically translated so the formula works in its new position.
|
Live formulas are evaluated for any character column, not just those with explicit HARDFORMULA / SOFTFORMULA rules. Several editor behaviours have been extended to be formula-aware:
|
||||||
* A cell that has been 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
|
* When you paste a formula, column names are automatically translated to the correct cell references.
|
||||||
|
* A cell overwritten by a formula is flagged so you can revert it; cell revert has been generalised to any overwritten value, not just formulas.
|
||||||
|
* The primary key and numeric columns resolve a live formula to its computed value (not the raw formula text) when submitted.
|
||||||
|
* Formula-looking values pasted from Excel are auto-escaped so they are treated as data, not evaluated as formulas, unless you explicitly choose "Apply as formula".
|
||||||
|
* A dedicated `DC.ROW_STATUS` column is driven live by formulas, and has been hardened against collisions with real columns of that name.
|
||||||
|
|
||||||
Formulas can reference three special values that are resolved at runtime:
|
### Special formula literals
|
||||||
|
|
||||||
* `DC.ROW_STATUS` - the current state of the row: `M` (Modified), `A` (Added), `D` (Deleted), or `U` (Unchanged).
|
The following literals are available for use in formula rules:
|
||||||
* `DC.USER_NAME` - the logged-in user id.
|
|
||||||
* `DC.ORIG_VALUE` - the original cell value before the current edit.
|
* `DC.ROW_STATUS` - replaced at runtime with the cell reference (eg `A1`). Values are `M` (Modified), `A` (Added), `D` (Deleted), or `U` (Unchanged).
|
||||||
|
* `DC.USER_NAME` - replaced at runtime with the logged-in user id.
|
||||||
|
* `DC.ORIG_VALUE` - replaced at runtime with the original cell value before the current edit.
|
||||||
|
|
||||||
Example - show the current user id if the row has been changed, otherwise keep the original value:
|
Example - show the current user id if the row has been changed, otherwise keep the original value:
|
||||||
|
|
||||||
```
|
```
|
||||||
= if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE )
|
RULE_VALUE = if( DC.ROW_STATUS != 'U', DC.USER_NAME, DC.ORIG_VALUE )
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -131,14 +131,14 @@ Now the services are deployed (including the service which creates the staging a
|
|||||||
* Compute Context - the context configured in Step 1
|
* Compute Context - the context configured in Step 1
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
The first-launch configuration screen has been improved. The **Groups** dropdown now shows your own groups first, the **Contexts** dropdown groups contexts by their batch user, and a new **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.
|
The first-launch configuration tab has been overhauled. The **Groups** dropdown starts with the logged-in user's own groups, the **Contexts** dropdown is grouped by batch user id (contexts without batch ids appear last), and a new **Verify** button calls the startup service to confirm it is running before switching to the regular flow. If the getAdminGroup response is missing items, an abort modal is shown instead of failing silently.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
The login page has been improved with better input contrast and validation. Submitting empty fields no longer produces an infinite spinner.
|
The login page has been improved with better input contrast and validation. Submitting empty fields no longer produces an infinite spinner.
|
||||||
|
|
||||||
### Deploy Checks
|
### Deploy Checks
|
||||||
|
|
||||||
The deploy process now 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.
|
The deploy flow now includes Viya deploy checks and startup diagnostics to catch configuration issues early. A chunked deploy script is used for reliability on larger Viya installations. During deploy, the compute context is auto-fixed and `ComputeContextDetails` is extended with Viya response fields.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
A debug comment is added to the compute context during deploy. This is permanent - it is not removed by subsequent deploys.
|
A debug comment is added to the compute context during deploy. This is permanent - it is not removed by subsequent deploys.
|
||||||
|
|||||||
+3
-3
@@ -42,10 +42,10 @@ More logic available in [`va-messaging.service.ts'](https://git.datacontroller.i
|
|||||||
|
|
||||||
When running in `embed=va` mode, the editor provides two filter modes, controlled by the **Auto-apply** checkbox:
|
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.
|
* **Live (default)** - each VA row selection is applied automatically after a short debounce, so the editor updates as you interact with the report.
|
||||||
* **Confirm** - filter changes are held until you click the **Apply** button. This is useful when editing, where an automatic reload would discard unsaved changes.
|
* **Confirm** - VA filter changes are staged but not applied until you click the **Apply** button. This is useful in edit mode, 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.
|
In both modes a status indicator shows whether a VA filter change is pending, loading, or idle. In edit mode, a pending filter stays staged until the user leaves edit mode, so unsaved edits are never lost.
|
||||||
|
|
||||||
## Configuration in VA
|
## Configuration in VA
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user