Compare commits
27 Commits
v7.2.4
...
fix/audit-
| Author | SHA1 | Date | |
|---|---|---|---|
| 95cc0b1c91 | |||
| 81b282f1f1 | |||
| 8c5b357dd2 | |||
| a13b2cbfd2 | |||
| 19617c2285 | |||
| f9794a973f | |||
| 65efe62d19 | |||
| 683ddcaf53 | |||
|
|
113e0bbc3c | ||
| 2af97e40bf | |||
|
|
83cbe3aece | ||
| ceac1ba614 | |||
|
|
765fdbdf9d | ||
|
|
43ae73c5f3 | ||
|
|
e57a0de8a9 | ||
|
|
3de491105b | ||
|
|
2fe690e962 | ||
|
|
b826d37086 | ||
|
|
bfbfd55fe7 | ||
|
|
15f38efd52 | ||
|
|
5d25681485 | ||
|
|
d26df376f8 | ||
| cff3fb3bad | |||
|
|
fb3c49aa8b | ||
|
|
af1657e226 | ||
|
|
d7c7302c12 | ||
| 26ce95f7c1 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
* text=auto eol=lf
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.15.1
|
||||
node-version: 24.5.0
|
||||
|
||||
- name: Install Google Chrome
|
||||
run: |
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.15.1
|
||||
node-version: 24.5.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
|
||||
@@ -7,7 +7,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.15.1]
|
||||
node-version: [24.5.0]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -98,4 +98,4 @@ jobs:
|
||||
with:
|
||||
name: Lighthouse results
|
||||
path: client/lighthouse-reports
|
||||
include-hidden-files: true
|
||||
include-hidden-files: true
|
||||
|
||||
@@ -13,12 +13,12 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.14.0
|
||||
node-version: 24.5.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
touch client/.npmrc
|
||||
echo '${{ secrets.NPMRC}}' > client/.npmrc
|
||||
touch client/.npmrc
|
||||
echo '${{ secrets.NPMRC}}' > client/.npmrc
|
||||
|
||||
- name: Install Chrome for Angular tests
|
||||
run: |
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
npm ci
|
||||
|
||||
- name: Check audit
|
||||
# Audit should fail and stop the CI if critical vulnerability found
|
||||
# Audit should fail and stop the CI if critical vulnerability found
|
||||
run: |
|
||||
npm audit --audit-level=critical --omit=dev
|
||||
cd ./sas
|
||||
@@ -68,12 +68,12 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.14.0
|
||||
node-version: 24.5.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
touch client/.npmrc
|
||||
echo '${{ secrets.NPMRC}}' > client/.npmrc
|
||||
touch client/.npmrc
|
||||
echo '${{ secrets.NPMRC}}' > client/.npmrc
|
||||
|
||||
- run: apt-get update
|
||||
- run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
|
||||
@@ -158,7 +158,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.14.0
|
||||
node-version: 24.5.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
|
||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,3 +1,15 @@
|
||||
## [7.2.5](https://git.datacontroller.io/dc/dc/compare/v7.2.4...v7.2.5) (2025-12-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* (build) rebuilt package-lock files ([bfbfd55](https://git.datacontroller.io/dc/dc/commit/bfbfd55fe7e2dff3ce707763a2c7939ff365318b))
|
||||
* (deps) bump @sasjs/cli and @sasjs/core ([d7c7302](https://git.datacontroller.io/dc/dc/commit/d7c7302c12ac60f355ab9b3b1b461fcf7d0719b8))
|
||||
* (deps) bumped @sasjs/core, @sasjs/cli, @sasjs/utils and @sasjs/adapter ([af1657e](https://git.datacontroller.io/dc/dc/commit/af1657e226a4efd22cc87401a3850c4a665c2680))
|
||||
* configurable audit table on restore check ([26ce95f](https://git.datacontroller.io/dc/dc/commit/26ce95f7c1d2260f81c240cd6b058db154d997e4)), closes [#193](https://git.datacontroller.io/dc/dc/issues/193)
|
||||
* improved testing ([fb3c49a](https://git.datacontroller.io/dc/dc/commit/fb3c49aa8bfdc6acf2ae3034b885010dcdce32a6))
|
||||
* output values to intended macro variables ([43ae73c](https://git.datacontroller.io/dc/dc/commit/43ae73c5f3ad919394201f54984b61bb2a52fcfe))
|
||||
|
||||
## [7.2.4](https://git.datacontroller.io/dc/dc/compare/v7.2.3...v7.2.4) (2025-10-14)
|
||||
|
||||
|
||||
|
||||
@@ -51,26 +51,22 @@
|
||||
"base64-arraybuffer",
|
||||
"@handsontable/formulajs"
|
||||
],
|
||||
"polyfills": [
|
||||
"src/polyfills.ts",
|
||||
"zone.js"
|
||||
],
|
||||
"polyfills": ["src/polyfills.ts", "zone.js"],
|
||||
"outputPath": "dist",
|
||||
"resourcesOutputPath": "images",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"assets": [
|
||||
"src/images"
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "src/images",
|
||||
"output": "images"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.scss"
|
||||
],
|
||||
"scripts": [
|
||||
"node_modules/marked/marked.min.js"
|
||||
],
|
||||
"webWorkerTsConfig": "tsconfig.worker.json"
|
||||
"styles": ["src/styles.scss"],
|
||||
"scripts": ["node_modules/marked/marked.min.js"],
|
||||
"webWorkerTsConfig": "tsconfig.worker.json",
|
||||
"main": "src/main.ts"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@@ -103,9 +99,7 @@
|
||||
}
|
||||
},
|
||||
"development": {
|
||||
"vendorChunk": true,
|
||||
"extractLicenses": false,
|
||||
"buildOptimizer": false,
|
||||
"sourceMap": true,
|
||||
"optimization": false,
|
||||
"namedChunks": true
|
||||
@@ -134,20 +128,11 @@
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"polyfills": [
|
||||
"src/polyfills.ts",
|
||||
"zone.js",
|
||||
"zone.js/testing"
|
||||
],
|
||||
"polyfills": ["src/polyfills.ts", "zone.js", "zone.js/testing"],
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets"
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.scss"
|
||||
],
|
||||
"assets": ["src/favicon.ico", "src/assets"],
|
||||
"styles": ["src/styles.scss"],
|
||||
"scripts": [],
|
||||
"karmaConfig": "karma.conf.js",
|
||||
"webWorkerTsConfig": "tsconfig.worker.json"
|
||||
@@ -156,10 +141,7 @@
|
||||
"lint": {
|
||||
"builder": "@angular-eslint/builder:lint",
|
||||
"options": {
|
||||
"lintFilePatterns": [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.html"
|
||||
]
|
||||
"lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ const check = (cwd) => {
|
||||
onlyAllow:
|
||||
'AFLv2.1;Apache 2.0;Apache-2.0;Apache*;Artistic-2.0;0BSD;BSD*;BSD-2-Clause;BSD-3-Clause;CC0-1.0;CC-BY-3.0;CC-BY-4.0;ISC;MIT;MPL-2.0;ODC-By-1.0;Python-2.0;Unlicense;',
|
||||
excludePackages:
|
||||
'@cds/city@1.1.0;@handsontable/angular-wrapper@16.0.1;handsontable@16.0.1;hyperformula@2.7.1;hyperformula@3.0.0;jackspeak@3.4.3;path-scurry@1.11.1;package-json-from-dist@1.0.1'
|
||||
'@cds/city@1.1.0;@handsontable/angular-wrapper@16.0.1;handsontable@^16.0.1;handsontable@16.2.0;hyperformula@2.7.1;hyperformula@3.0.0;hyperformula@3.1.0;jackspeak@3.4.3;path-scurry@1.11.1;package-json-from-dist@1.0.1'
|
||||
},
|
||||
(error, json) => {
|
||||
if (error) {
|
||||
|
||||
10977
client/package-lock.json
generated
10977
client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -32,26 +32,27 @@
|
||||
"compodoc:build": "compodoc -p tsconfig.doc.json --name 'Data Controller Client'",
|
||||
"compodoc:build-and-serve": "compodoc -p tsconfig.doc.json -s --name 'Data Controller Client'",
|
||||
"compodoc:serve": "compodoc -s --name 'Data Controller Client'",
|
||||
"lighthouse": "lhci autorun"
|
||||
"lighthouse": "lhci autorun",
|
||||
"ng": "ng"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^17.3.3",
|
||||
"@angular/cdk": "^17.3.3",
|
||||
"@angular/common": "^17.3.3",
|
||||
"@angular/compiler": "^17.3.3",
|
||||
"@angular/core": "^17.3.3",
|
||||
"@angular/forms": "^17.3.3",
|
||||
"@angular/platform-browser": "^17.3.3",
|
||||
"@angular/platform-browser-dynamic": "^17.3.3",
|
||||
"@angular/router": "^17.3.3",
|
||||
"@angular/animations": "^19.2.17",
|
||||
"@angular/cdk": "^19.2.19",
|
||||
"@angular/common": "^19.2.17",
|
||||
"@angular/compiler": "^19.2.17",
|
||||
"@angular/core": "^19.2.17",
|
||||
"@angular/forms": "^19.2.17",
|
||||
"@angular/platform-browser": "^19.2.17",
|
||||
"@angular/platform-browser-dynamic": "^19.2.17",
|
||||
"@angular/router": "^19.2.17",
|
||||
"@cds/core": "^6.15.1",
|
||||
"@clr/angular": "file:libraries/clr-angular-17.9.0.tgz",
|
||||
"@clr/icons": "^13.0.2",
|
||||
"@clr/ui": "file:libraries/clr-ui-17.9.0.tgz",
|
||||
"@handsontable/angular-wrapper": "16.0.1",
|
||||
"@sasjs/adapter": "^4.12.2",
|
||||
"@sasjs/utils": "^3.4.0",
|
||||
"@sasjs/adapter": "^4.16.0",
|
||||
"@sasjs/utils": "^3.5.3",
|
||||
"@sheet/crypto": "file:libraries/sheet-crypto.tgz",
|
||||
"@types/d3-graphviz": "^2.6.7",
|
||||
"@types/text-encoding": "0.0.35",
|
||||
@@ -68,7 +69,7 @@
|
||||
"jquery-datetimepicker": "^2.5.21",
|
||||
"jsrsasign": "^11.1.0",
|
||||
"marked": "^5.0.0",
|
||||
"moment": "^2.26.0",
|
||||
"moment": "^2.30.1",
|
||||
"ngx-clipboard": "^16.0.0",
|
||||
"ngx-json-viewer": "file:libraries/ngx-json-viewer-3.2.1.tgz",
|
||||
"nodejs": "0.0.0",
|
||||
@@ -82,17 +83,17 @@
|
||||
"vm": "^0.1.0",
|
||||
"webpack": "^5.91.0",
|
||||
"xlsx": "^0.18.5",
|
||||
"zone.js": "~0.14.4"
|
||||
"zone.js": "~0.15.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^17.3.3",
|
||||
"@angular-eslint/builder": "17.3.0",
|
||||
"@angular-eslint/eslint-plugin": "17.3.0",
|
||||
"@angular-eslint/eslint-plugin-template": "17.3.0",
|
||||
"@angular-eslint/schematics": "17.3.0",
|
||||
"@angular-eslint/template-parser": "17.3.0",
|
||||
"@angular/cli": "^17.3.3",
|
||||
"@angular/compiler-cli": "^17.3.3",
|
||||
"@angular-devkit/build-angular": "^19.2.19",
|
||||
"@angular-eslint/builder": "19.8.1",
|
||||
"@angular-eslint/eslint-plugin": "19.8.1",
|
||||
"@angular-eslint/eslint-plugin-template": "19.8.1",
|
||||
"@angular-eslint/schematics": "19.8.1",
|
||||
"@angular-eslint/template-parser": "19.8.1",
|
||||
"@angular/cli": "^19.2.19",
|
||||
"@angular/compiler-cli": "^19.2.17",
|
||||
"@babel/plugin-proposal-private-methods": "^7.18.6",
|
||||
"@compodoc/compodoc": "^1.1.21",
|
||||
"@cypress/webpack-preprocessor": "^5.17.1",
|
||||
@@ -128,7 +129,7 @@
|
||||
"rimraf": "3.0.2",
|
||||
"ts-loader": "^9.2.8",
|
||||
"ts-node": "^3.3.0",
|
||||
"typescript": "~5.4.4",
|
||||
"typescript": "~5.8.3",
|
||||
"wait-on": "^6.0.1",
|
||||
"watch": "^1.0.2"
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import { Location } from '@angular/common'
|
||||
import '@clr/icons'
|
||||
import '@clr/icons/shapes/all-shapes'
|
||||
import { globals } from './_globals'
|
||||
import * as moment from 'moment'
|
||||
import moment from 'moment'
|
||||
import { EventService } from './services/event.service'
|
||||
import { AppService } from './services/app.service'
|
||||
import { InfoModal } from './models/InfoModal'
|
||||
@@ -42,7 +42,8 @@ ClarityIcons.addIcons(
|
||||
selector: 'my-app',
|
||||
templateUrl: './app.component.html',
|
||||
styleUrls: ['./app.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class AppComponent {
|
||||
private dcAdapterSettings: DcAdapterSettings | undefined
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { HttpClientModule } from '@angular/common/http'
|
||||
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'
|
||||
import { NgModule } from '@angular/core'
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms'
|
||||
import { BrowserModule } from '@angular/platform-browser'
|
||||
@@ -36,12 +36,12 @@ import { AppSettingsService } from './services/app-settings.service'
|
||||
InfoModalComponent,
|
||||
ViyaApiExplorerComponent
|
||||
],
|
||||
bootstrap: [AppComponent],
|
||||
imports: [
|
||||
BrowserAnimationsModule,
|
||||
BrowserModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
HttpClientModule,
|
||||
ROUTING,
|
||||
SharedModule,
|
||||
ClarityModule,
|
||||
@@ -50,7 +50,12 @@ import { AppSettingsService } from './services/app-settings.service'
|
||||
DirectivesModule,
|
||||
NgxJsonViewerModule
|
||||
],
|
||||
providers: [AppService, SasStoreService, LicensingGuard, AppSettingsService],
|
||||
bootstrap: [AppComponent]
|
||||
providers: [
|
||||
AppService,
|
||||
SasStoreService,
|
||||
LicensingGuard,
|
||||
AppSettingsService,
|
||||
provideHttpClient(withInterceptorsFromDi())
|
||||
]
|
||||
})
|
||||
export class AppModule {}
|
||||
|
||||
@@ -14,7 +14,8 @@ import { DcAdapterSettings } from '../models/DcAdapterSettings'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class DeployComponent implements OnInit {
|
||||
public step: number = 0
|
||||
|
||||
@@ -29,7 +29,8 @@ import {
|
||||
selector: 'app-automatic-deploy',
|
||||
templateUrl: './automatic.component.html',
|
||||
styleUrls: ['./automatic.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class AutomaticComponent implements OnInit {
|
||||
@Input() sasJs!: SASjs
|
||||
|
||||
@@ -18,7 +18,8 @@ import { SasService } from 'src/app/services/sas.service'
|
||||
selector: 'app-manual-deploy',
|
||||
templateUrl: './manual.component.html',
|
||||
styleUrls: ['./manual.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ManualComponent implements OnInit {
|
||||
@Input() sasJs!: SASjs
|
||||
|
||||
@@ -20,7 +20,8 @@ import { SasjsService } from 'src/app/services/sasjs.service'
|
||||
selector: 'app-sasjs-configurator',
|
||||
templateUrl: './sasjs-configurator.component.html',
|
||||
styleUrls: ['./sasjs-configurator.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class SasjsConfiguratorComponent implements OnInit {
|
||||
@Input() sasJs!: SASjs
|
||||
|
||||
@@ -7,7 +7,8 @@ import {
|
||||
} from '@angular/core'
|
||||
|
||||
@Directive({
|
||||
selector: '[appDragNdrop]'
|
||||
selector: '[appDragNdrop]',
|
||||
standalone: false
|
||||
})
|
||||
export class DragNdropDirective {
|
||||
@HostBinding('class.fileover') fileOver: boolean = false
|
||||
|
||||
@@ -9,7 +9,8 @@ import {
|
||||
import { FileUploader } from '../models/FileUploader.class'
|
||||
|
||||
@Directive({
|
||||
selector: '[appFileDrop]'
|
||||
selector: '[appFileDrop]',
|
||||
standalone: false
|
||||
})
|
||||
export class FileDropDirective {
|
||||
@Input() uploader?: FileUploader
|
||||
|
||||
@@ -9,7 +9,8 @@ import {
|
||||
import { FileUploader } from '../models/FileUploader.class'
|
||||
|
||||
@Directive({
|
||||
selector: '[appFileSelect]'
|
||||
selector: '[appFileSelect]',
|
||||
standalone: false
|
||||
})
|
||||
export class FileSelectDirective {
|
||||
@Input() uploader?: FileUploader
|
||||
|
||||
@@ -6,7 +6,8 @@ import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'
|
||||
* Calling functions in html is bad for performance
|
||||
*/
|
||||
@Directive({
|
||||
selector: '[ngVar]'
|
||||
selector: '[ngVar]',
|
||||
standalone: false
|
||||
})
|
||||
export class NgVarDirective {
|
||||
@Input()
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Directive, HostListener } from '@angular/core'
|
||||
|
||||
@Directive({
|
||||
selector: '[appStealFocus]'
|
||||
selector: '[appStealFocus]',
|
||||
standalone: false
|
||||
})
|
||||
export class StealFocusDirective {
|
||||
constructor() {}
|
||||
|
||||
@@ -24,7 +24,8 @@ import { EditRecordModal } from '../../models/EditRecordModal'
|
||||
selector: 'app-edit-record',
|
||||
templateUrl: './edit-record.component.html',
|
||||
styleUrls: ['./edit-record.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class EditRecordComponent implements OnInit {
|
||||
@Input() currentRecord!: EditRecordModal
|
||||
|
||||
@@ -11,7 +11,8 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'
|
||||
selector: 'app-upload-stater',
|
||||
templateUrl: './upload-stater.component.html',
|
||||
styleUrls: ['./upload-stater.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class UploadStaterComponent implements OnInit {
|
||||
public statesList: string[] = [] //States appended to be displayed
|
||||
|
||||
@@ -70,7 +70,8 @@ import { ParseResult } from '../models/ParseResult.interface'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class EditorComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
@ViewChildren('uploadStater')
|
||||
|
||||
@@ -15,7 +15,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class GroupComponent implements OnInit {
|
||||
public groups: Array<any> | undefined
|
||||
|
||||
@@ -19,7 +19,8 @@ import { LicenceService } from '../services/licence.service'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class HomeComponent implements AfterContentInit {
|
||||
public treeNodeLibraries: Array<any> | null = null
|
||||
|
||||
@@ -15,7 +15,8 @@ enum LicenseActions {
|
||||
selector: 'app-licensing',
|
||||
templateUrl: './licensing.component.html',
|
||||
styleUrls: ['./licensing.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class LicensingComponent implements OnInit {
|
||||
public action: LicenseActions | null = null
|
||||
|
||||
@@ -19,7 +19,8 @@ const moment = require('moment')
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class LineageComponent {
|
||||
public switchFlag: boolean = false
|
||||
|
||||
@@ -51,7 +51,8 @@ class ValueFilter implements ClrDatagridStringFilterInterface<MetaData> {
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class MetadataComponent implements OnInit {
|
||||
metaDataList: Array<any> | undefined
|
||||
|
||||
@@ -48,7 +48,8 @@ enum FileLoadingState {
|
||||
selector: 'app-multi-dataset',
|
||||
templateUrl: './multi-dataset.component.html',
|
||||
styleUrls: ['./multi-dataset.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class MultiDatasetComponent implements OnInit, AfterViewInit {
|
||||
@HostBinding('class.content-container') contentContainerClass = true
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class NotFoundComponent implements OnInit {
|
||||
constructor() {}
|
||||
|
||||
@@ -2,7 +2,8 @@ import { Pipe, PipeTransform } from '@angular/core'
|
||||
import { bytesToSize } from '@sasjs/utils/utils/bytesToSize'
|
||||
|
||||
@Pipe({
|
||||
name: 'convertSize'
|
||||
name: 'convertSize',
|
||||
standalone: false
|
||||
})
|
||||
export class ConvertSizePipe implements PipeTransform {
|
||||
transform(bytes: string | number, ...args: string[]): string {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
import * as moment from 'moment'
|
||||
import moment from 'moment'
|
||||
@Pipe({
|
||||
name: 'dateTimeFormatter'
|
||||
name: 'dateTimeFormatter',
|
||||
standalone: false
|
||||
})
|
||||
export class DateTimeFormatterPipe implements PipeTransform {
|
||||
transform(value: Date | string, type: string): string {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
|
||||
@Pipe({
|
||||
name: 'linkinze'
|
||||
name: 'linkinze',
|
||||
standalone: false
|
||||
})
|
||||
export class LinkinzePipe implements PipeTransform {
|
||||
/**
|
||||
|
||||
@@ -2,7 +2,8 @@ import { Pipe, PipeTransform } from '@angular/core'
|
||||
import { HelperService } from '../services/helper.service'
|
||||
|
||||
@Pipe({
|
||||
name: 'sasToJsDate'
|
||||
name: 'sasToJsDate',
|
||||
standalone: false
|
||||
})
|
||||
export class sasToJsDatePipe implements PipeTransform {
|
||||
constructor(private helperService: HelperService) {}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
|
||||
@Pipe({
|
||||
name: 'pkSpaceSeparate'
|
||||
name: 'pkSpaceSeparate',
|
||||
standalone: false
|
||||
})
|
||||
export class PkSpaceSeparatePipe implements PipeTransform {
|
||||
transform(value: string): string {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
|
||||
@Pipe({
|
||||
name: 'prettyjson'
|
||||
name: 'prettyjson',
|
||||
standalone: false
|
||||
})
|
||||
export class PrettyjsonPipe implements PipeTransform {
|
||||
transform(rawJson: any): string {
|
||||
|
||||
@@ -2,7 +2,8 @@ import { Pipe, PipeTransform } from '@angular/core'
|
||||
import { HelperService } from '../services/helper.service'
|
||||
|
||||
@Pipe({
|
||||
name: 'secondsParser'
|
||||
name: 'secondsParser',
|
||||
standalone: false
|
||||
})
|
||||
export class SecondsParserPipe implements PipeTransform {
|
||||
constructor(private helperService: HelperService) {}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
|
||||
@Pipe({
|
||||
name: 'thousandSeparator'
|
||||
name: 'thousandSeparator',
|
||||
standalone: false
|
||||
})
|
||||
export class ThousandSeparatorPipe implements PipeTransform {
|
||||
transform(value: string | number, separator?: string): string {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core'
|
||||
|
||||
@Pipe({
|
||||
name: 'toNumber'
|
||||
name: 'toNumber',
|
||||
standalone: false
|
||||
})
|
||||
export class ToNumberPipe implements PipeTransform {
|
||||
transform(value: string | number): number {
|
||||
|
||||
@@ -29,7 +29,8 @@ registerLocaleData(localeEnGB)
|
||||
templateUrl: './query.component.html',
|
||||
styleUrls: ['./query.component.scss'],
|
||||
providers: [{ provide: LOCALE_ID, useValue: 'en-GB' }],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class QueryComponent
|
||||
implements AfterViewInit, AfterContentInit, OnDestroy
|
||||
|
||||
@@ -30,7 +30,8 @@ interface ChangesObj {
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ApproveDetailsComponent implements AfterViewInit, OnDestroy {
|
||||
private _detailsSub: Subscription | undefined
|
||||
|
||||
@@ -38,9 +38,7 @@ class SubmittedFilter implements ClrDatagridStringFilterInterface<ApproveData> {
|
||||
}
|
||||
}
|
||||
|
||||
class SubmitReasonFilter
|
||||
implements ClrDatagridStringFilterInterface<ApproveData>
|
||||
{
|
||||
class SubmitReasonFilter implements ClrDatagridStringFilterInterface<ApproveData> {
|
||||
accepts(data: ApproveData, search: string): boolean {
|
||||
return data.submitReason.toLowerCase().indexOf(search.toLowerCase()) >= 0
|
||||
}
|
||||
@@ -53,7 +51,8 @@ class SubmitReasonFilter
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ApproveComponent implements OnInit {
|
||||
public approveList: Array<ApproveData> | undefined
|
||||
|
||||
@@ -38,9 +38,7 @@ class SubmitterFilter implements ClrDatagridStringFilterInterface<HistoryData> {
|
||||
}
|
||||
}
|
||||
|
||||
class SubmitReasonFilter
|
||||
implements ClrDatagridStringFilterInterface<HistoryData>
|
||||
{
|
||||
class SubmitReasonFilter implements ClrDatagridStringFilterInterface<HistoryData> {
|
||||
accepts(data: HistoryData, search: string): boolean {
|
||||
return data.submittedReason.toLowerCase().indexOf(search.toLowerCase()) >= 0
|
||||
}
|
||||
@@ -65,7 +63,8 @@ class ReviewedFilter implements ClrDatagridStringFilterInterface<HistoryData> {
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class HistoryComponent implements OnInit {
|
||||
public history: Array<any> = []
|
||||
|
||||
@@ -17,17 +17,13 @@ interface SubmitterData {
|
||||
approver: string
|
||||
}
|
||||
|
||||
class SubmittedFilter
|
||||
implements ClrDatagridStringFilterInterface<SubmitterData>
|
||||
{
|
||||
class SubmittedFilter implements ClrDatagridStringFilterInterface<SubmitterData> {
|
||||
accepts(data: SubmitterData, search: string): boolean {
|
||||
return data.submitted.toLowerCase().indexOf(search.toLowerCase()) >= 0
|
||||
}
|
||||
}
|
||||
|
||||
class SubmitReasonFilter
|
||||
implements ClrDatagridStringFilterInterface<SubmitterData>
|
||||
{
|
||||
class SubmitReasonFilter implements ClrDatagridStringFilterInterface<SubmitterData> {
|
||||
accepts(data: SubmitterData, search: string): boolean {
|
||||
return data.submitReason.toLowerCase().indexOf(search.toLowerCase()) >= 0
|
||||
}
|
||||
@@ -40,7 +36,8 @@ class SubmitReasonFilter
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class SubmitterComponent implements OnInit, AfterViewInit {
|
||||
public remained: number = 0
|
||||
|
||||
@@ -13,7 +13,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class RoleComponent implements OnInit {
|
||||
public roles: Array<any> | undefined
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class HomeRouteComponent implements OnInit, OnDestroy {
|
||||
constructor() {}
|
||||
|
||||
@@ -5,7 +5,8 @@ import { Component, OnInit, OnDestroy } from '@angular/core'
|
||||
templateUrl: './multi-dataset-route.component.html',
|
||||
host: {
|
||||
class: 'content-container'
|
||||
}
|
||||
},
|
||||
standalone: false
|
||||
})
|
||||
export class MultiDatasetRouteComponent implements OnInit, OnDestroy {
|
||||
constructor() {}
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ReviewRouteComponent implements OnInit {
|
||||
constructor() {}
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class UsernavRouteComponent implements OnInit {
|
||||
constructor() {}
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ViewRouteComponent implements OnInit, OnDestroy {
|
||||
constructor() {}
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class XLMapRouteComponent implements OnInit, OnDestroy {
|
||||
constructor() {}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@angular/core'
|
||||
import cloneDeep from 'lodash-es/cloneDeep'
|
||||
import * as CryptoMD5 from 'crypto-js/md5'
|
||||
import CryptoMD5 from 'crypto-js/md5'
|
||||
import { SasService } from './sas.service'
|
||||
|
||||
const librariesToShow = 50
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'
|
||||
import { BehaviorSubject } from 'rxjs'
|
||||
import { LicenseKeyData } from '../models/LicenseKeyData'
|
||||
import { SasService } from './sas.service'
|
||||
import * as moment from 'moment'
|
||||
import moment from 'moment'
|
||||
import * as base64Converter from 'base64-arraybuffer'
|
||||
import * as encoding from 'text-encoding'
|
||||
import { Router } from '@angular/router'
|
||||
|
||||
@@ -17,7 +17,8 @@ import { AbortDetails, InfoModal } from '../../models/InfoModal'
|
||||
selector: 'app-info-modal',
|
||||
templateUrl: './info-modal.component.html',
|
||||
styleUrls: ['./info-modal.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class InfoModalComponent implements OnInit {
|
||||
@Output() onConfirmModalClick: EventEmitter<any> = new EventEmitter()
|
||||
|
||||
@@ -7,7 +7,8 @@ import { AlertsService } from './alerts.service'
|
||||
selector: 'app-alerts',
|
||||
templateUrl: './alerts.component.html',
|
||||
styleUrls: ['./alerts.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class AlertsComponent implements OnInit {
|
||||
public alerts: Array<Alert> = []
|
||||
|
||||
@@ -19,7 +19,8 @@ export type OnLoadingMoreEvent = {
|
||||
selector: 'app-autocomplete',
|
||||
templateUrl: './autocomplete.component.html',
|
||||
styleUrls: ['./autocomplete.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class AutocompleteComponent implements OnInit, AfterViewInit {
|
||||
@ViewChild('input') inputElement: any
|
||||
|
||||
@@ -4,7 +4,8 @@ import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'
|
||||
selector: 'contact-link',
|
||||
templateUrl: './contact-link.component.html',
|
||||
styleUrls: ['./contact-link.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ContactLinkComponent implements OnInit {
|
||||
@Input() classes: string = ''
|
||||
|
||||
@@ -15,7 +15,8 @@ import { Tab } from './models/dsmeta-groupped.model'
|
||||
selector: 'app-dataset-info',
|
||||
templateUrl: './dataset-info.component.html',
|
||||
styleUrls: ['./dataset-info.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class DatasetInfoComponent implements OnInit, OnChanges {
|
||||
@Input() open: boolean = false
|
||||
|
||||
@@ -22,7 +22,8 @@ import { TableClickEmitter } from './models/TableClickEmitter'
|
||||
selector: 'dc-tree',
|
||||
templateUrl: './dc-tree.component.html',
|
||||
styleUrls: ['./dc-tree.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class DcTreeComponent implements OnInit, AfterViewInit, OnChanges {
|
||||
// REFACTOR NOTICE
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import Handsontable from 'handsontable'
|
||||
import Core from 'handsontable/core'
|
||||
|
||||
export class CustomAutocompleteEditor extends Handsontable.editors
|
||||
.AutocompleteEditor {
|
||||
export class CustomAutocompleteEditor
|
||||
extends Handsontable.editors.AutocompleteEditor
|
||||
{
|
||||
constructor(instance: Core) {
|
||||
super(instance)
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ export interface DcColumnSettings {
|
||||
export interface DcValidation extends HotColumnSettings, DcColumnSettings {}
|
||||
|
||||
export interface DcValidationRuleUpdate
|
||||
extends Handsontable.ColumnSettings,
|
||||
DcColumnSettings {
|
||||
extends Handsontable.ColumnSettings, DcColumnSettings {
|
||||
data?: string
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Options } from './models/options.interface'
|
||||
selector: 'app-excel-password-modal',
|
||||
styleUrls: ['./excel-password-modal.component.scss'],
|
||||
templateUrl: './excel-password-modal.component.html',
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ExcelPasswordModalComponent {
|
||||
options$: Observable<Options> = this.excelPasswordModalService.optionsSubject$
|
||||
|
||||
@@ -7,7 +7,8 @@ import { Service } from '../service.interface'
|
||||
selector: 'app-loading-indicator',
|
||||
templateUrl: './loading-indicator.component.html',
|
||||
styleUrls: ['./loading-indicator.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class LoadingIndicatorComponent implements OnInit, OnDestroy {
|
||||
public loading: boolean = false
|
||||
|
||||
@@ -13,7 +13,8 @@ interface User {
|
||||
selector: 'app-login',
|
||||
templateUrl: './login.component.html',
|
||||
styleUrls: ['./login.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class LoginComponent implements OnInit, OnDestroy {
|
||||
private _subscription: Subscription = new Subscription()
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
ViewEncapsulation
|
||||
} from '@angular/core'
|
||||
import { SASjsRequest } from '@sasjs/adapter'
|
||||
import * as moment from 'moment'
|
||||
import moment from 'moment'
|
||||
import { HelperService } from 'src/app/services/helper.service'
|
||||
import { LoggerService } from '../../services/logger.service'
|
||||
import { SasService } from '../../services/sas.service'
|
||||
@@ -23,7 +23,8 @@ interface SASjsRequestExtended extends SASjsRequest {
|
||||
selector: 'app-requests-modal',
|
||||
templateUrl: './requests-modal.component.html',
|
||||
styleUrls: ['./requests-modal.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class RequestsModalComponent implements OnInit {
|
||||
private _opened: boolean = false
|
||||
|
||||
@@ -18,7 +18,8 @@ import { globals } from '../../_globals'
|
||||
selector: 'app-sidebar',
|
||||
templateUrl: './sidebar.component.html',
|
||||
styleUrls: ['./sidebar.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class SidebarComponent implements OnInit {
|
||||
@ViewChild('sidebarNav') sidebarNav!: ElementRef
|
||||
|
||||
@@ -15,7 +15,8 @@ import { OnLoadingMoreEvent } from '../autocomplete/autocomplete.component'
|
||||
selector: 'app-soft-select',
|
||||
templateUrl: './soft-select.component.html',
|
||||
styleUrls: ['./soft-select.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class SoftSelectComponent implements OnInit, OnChanges {
|
||||
@Input() inputId: string = ''
|
||||
|
||||
@@ -15,7 +15,8 @@ import { RequestWrapperResponse } from 'src/app/models/request-wrapper/RequestWr
|
||||
selector: 'app-terms',
|
||||
templateUrl: './terms.component.html',
|
||||
styleUrls: ['./terms.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class TermsComponent implements OnInit, AfterViewInit {
|
||||
@ViewChild('markdownCard') markdownCard!: ElementRef
|
||||
|
||||
@@ -12,7 +12,8 @@ import { globals } from 'src/app/_globals'
|
||||
selector: 'app-header-actions',
|
||||
templateUrl: './header-actions.component.html',
|
||||
styleUrls: ['./header-actions.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class HeaderActions implements OnInit, OnDestroy {
|
||||
public userName: string = 'Not logged in'
|
||||
|
||||
@@ -48,7 +48,8 @@ import { Viewbox } from './models/viewbox.model'
|
||||
selector: 'app-viewboxes',
|
||||
templateUrl: './viewboxes.component.html',
|
||||
styleUrls: ['./viewboxes.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ViewboxesComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
@ViewChildren('resizeBox') resizeBoxQuery!: QueryList<ElementRef> //make query list, handle multiple
|
||||
|
||||
@@ -24,7 +24,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class StageComponent implements OnInit, AfterViewInit {
|
||||
public table_id: any
|
||||
|
||||
@@ -18,7 +18,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class SystemComponent implements OnInit {
|
||||
appInfo: AppInfo = {
|
||||
|
||||
@@ -15,7 +15,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class UserComponent implements OnInit {
|
||||
public users: Array<any> | undefined
|
||||
|
||||
@@ -49,7 +49,8 @@ import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapper
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ViewerComponent
|
||||
implements AfterContentInit, AfterViewInit, OnDestroy
|
||||
|
||||
@@ -14,7 +14,8 @@ import { ViyaApis } from './models/viya-apis.models'
|
||||
host: {
|
||||
class: 'content-container'
|
||||
},
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class ViyaApiExplorerComponent implements OnInit {
|
||||
collections: ViyaApis = {}
|
||||
|
||||
@@ -62,7 +62,8 @@ enum Tabs {
|
||||
selector: 'app-xlmap',
|
||||
templateUrl: './xlmap.component.html',
|
||||
styleUrls: ['./xlmap.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
standalone: false
|
||||
})
|
||||
export class XLMapComponent implements AfterContentInit, AfterViewInit, OnInit {
|
||||
@HostBinding('class.content-container') contentContainerClass = true
|
||||
|
||||
559
package-lock.json
generated
559
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dcfrontend",
|
||||
"version": "7.2.4",
|
||||
"version": "7.2.5",
|
||||
"description": "Data Controller",
|
||||
"devDependencies": {
|
||||
"@saithodev/semantic-release-gitea": "^2.1.0",
|
||||
@@ -10,7 +10,7 @@
|
||||
"@semantic-release/npm": "11.0.0",
|
||||
"@semantic-release/release-notes-generator": "^11.0.4",
|
||||
"commit-and-tag-version": "^11.2.2",
|
||||
"prettier": "3.6.2"
|
||||
"prettier": "^3.7.4"
|
||||
},
|
||||
"scripts": {
|
||||
"install": "cd client && npm i && cd ../sas && npm i",
|
||||
@@ -32,6 +32,5 @@
|
||||
"//": [
|
||||
"Readme",
|
||||
"We must set private: true so that semantic-release/npm plugin will update the package.json version but not try to release it as NPM package"
|
||||
],
|
||||
"dependencies": {}
|
||||
]
|
||||
}
|
||||
|
||||
461
sas/package-lock.json
generated
461
sas/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@sasjs/cli": "^4.12.11",
|
||||
"@sasjs/core": "^4.59.5"
|
||||
"@sasjs/cli": "^4.12.15",
|
||||
"@sasjs/core": "^4.59.9"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,15 +39,35 @@
|
||||
%let &outresult=NO;
|
||||
%let &outreason=NOTFOUND;
|
||||
|
||||
/* check if there is actually a version to restore */
|
||||
%local libds;
|
||||
proc sql noprint;
|
||||
select upcase(cats(base_lib,'.',base_ds)) into: libds
|
||||
from &dc_libref..mpe_submit
|
||||
where TABLE_ID="&load_ref";
|
||||
|
||||
/**
|
||||
* check if there is actually a version to restore
|
||||
*/
|
||||
%local audtab;
|
||||
proc sql noprint;
|
||||
select coalescec(audit_libds,"&dc_libref..MPE_AUDIT") into: audtab
|
||||
from &dclib..MPE_TABLES
|
||||
where &dc_dttmtfmt. lt tx_to
|
||||
and libref="%scan(&libds,1,.)" and dsn="%scan(&libds,2,.)";
|
||||
%if "&audtab"="0" %then %do;
|
||||
%let &outresult=NO;
|
||||
%let &outreason= &libds has no audit table configured;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
%local chk;
|
||||
%let chk=0;
|
||||
proc sql noprint;
|
||||
select count(*) into: chk from &dc_libref..mpe_audit
|
||||
select count(*) into: chk from &audtab
|
||||
where load_ref="&load_ref";
|
||||
%if &chk=0 %then %do;
|
||||
%let allow_restore=NO;
|
||||
%let reason=No entry for &load_ref in MPE_AUDIT;
|
||||
%let &outresult=NO;
|
||||
%let &outreason=No entry for &load_ref in &audtab;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
@@ -64,24 +84,19 @@
|
||||
where groupname="&dc_admin_group";
|
||||
|
||||
%if &is_admin>0 %then %do;
|
||||
%let allow_restore=YES;
|
||||
%let reason=IS ADMIN;
|
||||
%let &outresult=YES;
|
||||
%let &outreason=IS ADMIN;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* check if user has basic access */
|
||||
%local libds;
|
||||
proc sql noprint;
|
||||
select cats(base_lib,'.',base_ds) into: libds
|
||||
from &mpelib..mpe_submit
|
||||
where TABLE_ID="&load_ref";
|
||||
%mpe_accesscheck(&libds,outds=work.access_check
|
||||
,user=&user
|
||||
,access_level=EDIT
|
||||
)
|
||||
%if %mf_nobs(access_check)=0 %then %do;
|
||||
%let allow_restore=NO;
|
||||
%let reason=No access in MPE_TABLES;
|
||||
%let &outresult=NO;
|
||||
%let &outreason=No access in MPE_TABLES;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
@@ -97,8 +112,8 @@
|
||||
and CLS_LIBREF="%upcase(&base_lib)"
|
||||
and CLS_TABLE="%upcase(&base_ds)";
|
||||
%if %mf_nobs(work.cls_rules)>0 %then %do;
|
||||
%let allow_restore=NO;
|
||||
%let reason=User has restrictions in MPE_COLUMN_LEVEL_SECURITY;
|
||||
%let &outresult=NO;
|
||||
%let &outreason=User has restrictions in MPE_COLUMN_LEVEL_SECURITY;
|
||||
data _null_;
|
||||
set work.cls_rules;
|
||||
putlog (_all_)(=);
|
||||
@@ -119,8 +134,8 @@
|
||||
and rls_table="&base_ds"
|
||||
and rls_active=1;
|
||||
%if %mf_nobs(work.rls_rules)>0 %then %do;
|
||||
%let allow_restore=NO;
|
||||
%let reason=User has restrictions in MPE_ROW_LEVEL_SECURITY;
|
||||
%let &outresult=NO;
|
||||
%let &outreason=User has restrictions in MPE_ROW_LEVEL_SECURITY;
|
||||
data _null_;
|
||||
set work.rls_rules;
|
||||
putlog (_all_)(=);
|
||||
@@ -129,7 +144,7 @@
|
||||
%return;
|
||||
%end;
|
||||
%else %do;
|
||||
%let allow_restore=YES;
|
||||
%let reason=CHECKS PASSED;
|
||||
%let &outresult=YES;
|
||||
%let &outreason=CHECKS PASSED;
|
||||
%end;
|
||||
%mend mpe_checkrestore;
|
||||
|
||||
@@ -35,14 +35,12 @@ run;
|
||||
%dc_getsettings()
|
||||
|
||||
%put checking it is restorable;
|
||||
%global allow_restore reason;
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mpe_checkrestore(&loadref,outresult=ALLOW_RESTORE,outreason=REASON)
|
||||
%mp_assertscope(COMPARE,
|
||||
desc=Checking macro variables against previous snapshot,
|
||||
ignorelist=ALLOW_RESTORE REASON
|
||||
MCLIB0_JADP1LEN MCLIB0_JADP2LEN MCLIB0_JADPNUM MCLIB0_JADVLEN
|
||||
MCLIB2_JADP1LEN MCLIB2_JADP2LEN MCLIB2_JADPNUM MCLIB2_JADVLEN
|
||||
MC0_JADP1LEN MC0_JADP2LEN MC0_JADP3LEN MC0_JADPNUM MC0_JADVLEN
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
},
|
||||
{
|
||||
"name": "viya",
|
||||
"serverUrl": "https://viya-f0g8ht62vq.engage.sas.com",
|
||||
"serverUrl": "",
|
||||
"serverType": "SASVIYA",
|
||||
"httpsAgentOptions": {
|
||||
"allowInsecureRequests": false
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
@brief testing getchangeinfo service
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mf_getuniquefileref.sas
|
||||
|
||||
|
||||
@@ -43,8 +43,8 @@ data _null_;
|
||||
cnt=find(_pgm,'/tests/');
|
||||
if cnt=0 then cnt=find(_pgm,'/services/');
|
||||
if cnt=0 then cnt=find(_pgm,'/jobs/');
|
||||
put cnt= apploc= _pgm=;
|
||||
apploc=substr(_pgm,1,cnt-1);
|
||||
put cnt= apploc= _pgm=;
|
||||
call symputx('apploc',apploc);
|
||||
end;
|
||||
run;
|
||||
|
||||
Reference in New Issue
Block a user