dc f32027fe59
Build / Build-and-ng-test (pull_request) Successful in 3m50s
Lighthouse Checks / lighthouse (pull_request) Successful in 10m2s
Build / Build-and-test-development (pull_request) Failing after 34m37s
fix(mocks): read the control rows as they are stored, and say what is gated
Nine findings from review, all taken.

Row reads (getdata):
- approversForTable reads every column through field(): the security and group
  rows are seeded with UPPERCASE keys and an edited row comes back lower-cased,
  so a direct property read compared undefined with 'UNDEFINED' and found no
  grant - silently falling back to the admin group for every table.
- tx_to is handled by rowInForce(): epoch seconds, which is what Date.now()/1000
  assumes, with an ISO string accepted; a blank, absent or unparseable end date
  is open-ended rather than expired, so a rule or a grant that omits it is no
  longer dropped as NaN. The dqrules filter reads rule_active/base_lib/base_ds
  through field() for the same reason.

Rows and the text that describes them (getdata):
- the current-rows clause in FILTER_TEXT is now applied to the selection: the
  grid no longer shows expired rows while telling the user they were excluded.
- the primary-key sort resolves each key to the column's own casing, so a
  lowercase DDL sorts on real values instead of comparing undefined.

Settings (getdata, viewlibs):
- dcLibref falls back to 'DC_JSLIB' like dcAdminGroup already did: a deploy that
  has not run makedata has no settings.js, and viewlibs must still list the
  control library.

Wording that had gone stale:
- the parity README's Status paragraph now states the invariant (every scenario
  is gated; gated:false is advisory) instead of counts and a list of differences
  that were fixed, and the scenarios.json notes say what each scenario pins now.
- viewdata's comment states the contract rather than the behaviour it replaced,
  and the synthetic no-data row writes the same space for a blank character cell
  as the data rows do.

Tests: getdata-rules.test.js covers an uppercase-keyed APPROVE grant and an
open-ended rule (both fail on the previous code); viewdata.test.js covers the
numeric missing and the empty-table row.
2026-11-07 00:57:05 +00:00
2026-05-01 11:46:10 +01:00
2023-07-13 13:44:05 +02:00
2026-11-05 21:11:44 +00:00
2023-07-25 09:09:57 +01:00
2026-11-05 21:11:44 +00:00
2026-06-15 14:42:18 +02:00

Data Controller for SAS

Control your manual data modifications!

Alternatives to Data Controller include:

  • 💾 Developing / testing / deploying / scheduling overnight batch jobs to load files from shared drives
  • 🔒 Opening (and locking) datasets in Enterprise Guide or SAS® Table Viewer to perform direct updates
  • ❓ Asking a #DBA to run validated code after a change management process
  • 🌐 Building & maintaining your own custom web application
  • 🏃 Running #SAS or #SQL updates in production

Problems with the above include:

  • Legacy 'black box' solutions with little to no testing, documentation or support
  • End users requiring direct write access to critical data sources in production
  • Upload routines that must be manually modified when the data model changes
  • Breaches due to unnecessary parties having access to the data
  • Inability to trace who made a change, when, and why
  • Reliance on key individuals to perform updates
  • Building bespoke ETL for every new data source
  • High risk of manual error / data corruption

Data Controller for SAS® solves all these issues in a simple-to-install, user-friendly, secure, documented, battle-tested web application. Available on Viya, SAS 9 EBI, and SASjs Server.

An individual Viya deploy can be done in just 2 lines of #SAS code!

filename dc url "https://git.datacontroller.io/dc/dc/releases/download/latest/viya.sas";
%inc dc;

For a multi-user deploy, using a shared system account, please see deploy docs.

For further information:

For support, contact support@4gl.io or reach out on Matrix!

Development

Lighthouse CI

This project includes automated Lighthouse performance and accessibility checks that run on pull requests. The checks ensure:

  • Accessibility Score: Minimum 1.0 (100%) median score across all tested pages

The Lighthouse CI workflow:

  1. Sets up the development environment with SASjs server and mocked services
  2. Builds and serves the Angular frontend
  3. Installs Chrome and runs lhci autorun (Lighthouse CI) against key pages
  4. Uploads results as artifacts for review

To run Lighthouse checks locally:

cd client
npm install
npm run lighthouse

Configuration is in client/lighthouserc.js (URL list, desktop preset, Chrome flags, assertions).

S
Description
Capture, Review, Approve. This repo contains the source code (and release assets) for the Data Controller application.
https://datacontroller.io
Readme
45 MiB
1 Stars 5 Watchers 0 Forks
v7.22.0
Latest
2026-11-05 21:11:51 +00:00
Languages
TypeScript 46.1%
SAS 23.3%
JavaScript 19%
HTML 8.1%
SCSS 2.6%
Other 0.9%