Compare commits

..

2 Commits

Author SHA1 Message Date
ca281b70c9 chore(git): Merge branch 'development' into tsdoc
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 22s
2023-08-01 14:52:53 +02:00
e056ece223 fix: approve, history and submit pages grouped in review module
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 1m5s
Using compodoc instead of typedoc because of better angular support.
2023-08-01 14:50:04 +02:00
44 changed files with 3885 additions and 676 deletions

View File

@ -96,9 +96,8 @@ jobs:
- name: Release Typedoc - name: Release Typedoc
run: | run: |
cd client cd client
npm -g install cloudron-surfer npm run compodoc:build
npm run typedoc surfer put --token ${{ secrets.TSDOC_TOKEN }} --server tsdoc.datacontroller.io documentation/* /
surfer put --token ${{ secrets.TSDOC_TOKEN }} --server tsdoc.datacontroller.io ../tsdoc /
- name: Upload assets to release - name: Upload assets to release
run: | run: |

View File

@ -1,41 +1,3 @@
# [6.2.0](https://git.datacontroller.io/dc/dc/compare/v6.1.0...v6.2.0) (2023-08-24)
### Bug Fixes
* re-enabling full REPLACE uploads ([08e39c4](https://git.datacontroller.io/dc/dc/commit/08e39c4fca570406f9aad3d907cb04596421d074))
### Features
* support for European numeric formats ([e48e47b](https://git.datacontroller.io/dc/dc/commit/e48e47bc635452b59e107b235e597c26e748875e))
# [6.2.0](https://git.datacontroller.io/dc/dc/compare/v6.1.0...v6.2.0) (2023-08-24)
### Bug Fixes
* re-enabling full REPLACE uploads ([08e39c4](https://git.datacontroller.io/dc/dc/commit/08e39c4fca570406f9aad3d907cb04596421d074))
### Features
* support for European numeric formats ([e48e47b](https://git.datacontroller.io/dc/dc/commit/e48e47bc635452b59e107b235e597c26e748875e))
# [6.1.0](https://git.datacontroller.io/dc/dc/compare/v6.0.0...v6.1.0) (2023-07-25)
### Bug Fixes
* missing mf_existds dependency in bitemporal_dataloader ([5ce1701](https://git.datacontroller.io/dc/dc/commit/5ce1701657136f2cf792441412230513ff52e7e8))
* reducing audit data volumes. Closes [#4](https://git.datacontroller.io/dc/dc/issues/4) ([54fe701](https://git.datacontroller.io/dc/dc/commit/54fe7013b1a25be228eeb2aba3553f6219952de6))
* release script, excel upload duplicate primary keys, cypress fix ([2f79487](https://git.datacontroller.io/dc/dc/commit/2f79487aeaf6268b027a8fa52fcdaae2b449de3d))
### Features
* full format deletion, closes [#2](https://git.datacontroller.io/dc/dc/issues/2) ([8dc40bd](https://git.datacontroller.io/dc/dc/commit/8dc40bdd4e3a7ad5c1e6582b4130f24bc445eb77))
# Changelog # Changelog
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.

4161
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "dc-client", "name": "data_controller-client",
"description": "dc-client", "description": "DataController Client",
"angular-cli": {}, "angular-cli": {},
"scripts": { "scripts": {
"start": "node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng serve", "start": "node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng serve",
@ -29,7 +29,9 @@
"cy:run": "cypress run", "cy:run": "cypress run",
"audit:prod": "npm audit --omit=dev", "audit:prod": "npm audit --omit=dev",
"sasdocs": "sasjs doc && ./sasjs/utils/deploydocs.sh", "sasdocs": "sasjs doc && ./sasjs/utils/deploydocs.sh",
"typedoc": "typedoc --options typedoc.json && cd ../tsdoc" "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'"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
@ -69,6 +71,7 @@
"ngx-clipboard": "^16.0.0", "ngx-clipboard": "^16.0.0",
"ngx-json-viewer": "file:libraries/ngx-json-viewer-3.2.1.tgz", "ngx-json-viewer": "file:libraries/ngx-json-viewer-3.2.1.tgz",
"nodejs": "0.0.0", "nodejs": "0.0.0",
"numbro": "^2.1.1",
"os-browserify": "0.3.0", "os-browserify": "0.3.0",
"rxjs": "^7.8.0", "rxjs": "^7.8.0",
"save-svg-as-png": "^1.4.17", "save-svg-as-png": "^1.4.17",
@ -87,6 +90,8 @@
"@angular-eslint/template-parser": "16.0.3", "@angular-eslint/template-parser": "16.0.3",
"@angular/cli": "^16.1.0", "@angular/cli": "^16.1.0",
"@angular/compiler-cli": "^16.1.2", "@angular/compiler-cli": "^16.1.2",
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@compodoc/compodoc": "^1.1.21",
"@cypress/webpack-preprocessor": "^5.17.1", "@cypress/webpack-preprocessor": "^5.17.1",
"@types/core-js": "^2.5.5", "@types/core-js": "^2.5.5",
"@types/crypto-js": "^4.0.1", "@types/crypto-js": "^4.0.1",
@ -119,9 +124,10 @@
"rimraf": "3.0.2", "rimraf": "3.0.2",
"ts-loader": "^9.2.8", "ts-loader": "^9.2.8",
"ts-node": "^3.3.0", "ts-node": "^3.3.0",
"typedoc": "^0.23.24", "typedoc": "^0.24.8",
"typedoc-plugin-external-module-name": "^4.0.6",
"typescript": "~4.9.4", "typescript": "~4.9.4",
"wait-on": "^6.0.1", "wait-on": "^6.0.1",
"watch": "^1.0.2" "watch": "^1.0.2"
} }
} }

View File

@ -1,40 +0,0 @@
<div class="content-area">
<div class="card">
<div class="card-header d-flex flex-column justify-content-center">
<h3 class="text-center">
You succesfully edited table
<span class="color-blue font-weight-700">{{ libds }}</span>
</h3>
<p class="text-center">
<b>Please choose from the following actions</b>
</p>
<div class="row d-flex justify-content-center mt-20">
<button
class="btn btn-sm btn-outline text-center"
(click)="submittedTableScreen()"
>
Go to submitted table screen
</button>
<button
class="btn btn-sm btn-outline text-center"
(click)="viewerTableScreen()"
>
Go to base table screen
</button>
<button
id="approvalBtn"
class="btn btn-sm btn-success-outline text-center"
(click)="approveTableScreen()"
>
Go to approvals screen
</button>
<button
class="btn btn-sm btn-info-outline text-center"
(click)="goBack()"
>
Go back to editor
</button>
</div>
</div>
</div>
</div>

View File

@ -1,50 +0,0 @@
import { AfterViewInit, Component, OnInit } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
@Component({
selector: 'app-actions',
templateUrl: './actions.component.html',
styleUrls: ['./actions.component.scss'],
host: {
class: 'content-container'
}
})
export class ActionsComponent implements OnInit, AfterViewInit {
public dsid: any
public libds: string | undefined
constructor(
private route: ActivatedRoute,
private router: Router
) {}
public submittedTableScreen() {
this.router.navigateByUrl('/stage/' + this.dsid)
}
public approveTableScreen() {
this.router.navigateByUrl('/approve/approveDet/' + this.dsid)
}
public viewerTableScreen() {
this.router.navigateByUrl('/view/data/' + this.libds)
}
public goBack() {
this.router.navigateByUrl('/editor/' + this.libds)
}
async ngOnInit() {
this.dsid = this.route.snapshot.params['dsid']
this.libds = this.route.snapshot.params['libds']
}
ngAfterViewInit() {
setTimeout(() => {
let approvalBtn: any = window.document.getElementById('approvalBtn')
if (!!approvalBtn) {
approvalBtn.focus()
}
}, 700)
}
}

View File

@ -169,7 +169,7 @@
<clr-dropdown-menu *clrIfOpen clrPosition="bottom-left"> <clr-dropdown-menu *clrIfOpen clrPosition="bottom-left">
<a [routerLink]="['/view']" clrDropdownItem>VIEW</a> <a [routerLink]="['/view']" clrDropdownItem>VIEW</a>
<a [routerLink]="['/home']" clrDropdownItem>EDIT</a> <a [routerLink]="['/home']" clrDropdownItem>EDIT</a>
<a [routerLink]="['/submitted']" clrDropdownItem>REVIEW</a> <a [routerLink]="['/review/submitted']" clrDropdownItem>REVIEW</a>
</clr-dropdown-menu> </clr-dropdown-menu>
</clr-dropdown> </clr-dropdown>
</div> </div>
@ -192,7 +192,7 @@
>EDIT</a >EDIT</a
> >
<a <a
[routerLink]="['/submitted']" [routerLink]="['/review/submitted']"
[class.active]=" [class.active]="
router.url.includes('submitted') || router.url.includes('submitted') ||
router.url.includes('approve') || router.url.includes('approve') ||
@ -224,7 +224,7 @@
<ul class="nav"> <ul class="nav">
<li class="nav-item"> <li class="nav-item">
<a <a
[routerLink]="['/submitted']" [routerLink]="['/review/submitted']"
class="nav-link nav-text" class="nav-link nav-text"
routerLinkActive="active" routerLinkActive="active"
>SUBMIT</a >SUBMIT</a
@ -232,15 +232,16 @@
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a <a
[routerLink]="['/approve']" [routerLink]="['/review/approve']"
class="nav-link nav-text" class="nav-link nav-text"
[class.active]="router.url.includes('approve')"
routerLinkActive="active" routerLinkActive="active"
>APPROVE</a >APPROVE</a
> >
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a <a
[routerLink]="['/history']" [routerLink]="['/review/history']"
class="nav-link nav-text" class="nav-link nav-text"
routerLinkActive="active" routerLinkActive="active"
>HISTORY</a >HISTORY</a

View File

@ -1,5 +1,5 @@
declare module 'save-svg-as-png' declare module 'save-svg-as-png'
declare module 'numbro/dist/languages.min'
declare interface Navigator { declare interface Navigator {
msSaveBlob: (blob: any, defaultName?: string) => boolean msSaveBlob: (blob: any, defaultName?: string) => boolean
} }

View File

@ -12,29 +12,23 @@ import { NotFoundComponent } from './not-found/not-found.component'
import { SasStoreService } from './services/sas-store.service' import { SasStoreService } from './services/sas-store.service'
import { SharedModule } from './shared/shared.module' import { SharedModule } from './shared/shared.module'
// import { EditorComponent } from './editor/editor.component' // import { EditorComponent } from './editor/editor.component'
import { ActionsComponent } from './actions/actions.component'
import { AppSharedModule } from './app-shared.module' import { AppSharedModule } from './app-shared.module'
import { ApproveDetailsComponent } from './approve-details/approve-details.component'
import { ApproveComponent } from './approve/approve.component'
import { DeployComponent } from './deploy/deploy.component' import { DeployComponent } from './deploy/deploy.component'
import { AutomaticComponent } from './deploy/sections/automatic/automatic.component' import { AutomaticComponent } from './deploy/sections/automatic/automatic.component'
import { ManualComponent } from './deploy/sections/manual/manual.component' import { ManualComponent } from './deploy/sections/manual/manual.component'
import { SasjsConfiguratorComponent } from './deploy/sections/sasjs-configurator/sasjs-configurator.component' import { SasjsConfiguratorComponent } from './deploy/sections/sasjs-configurator/sasjs-configurator.component'
import { GroupComponent } from './group/group.component' import { GroupComponent } from './group/group.component'
import { HistoryComponent } from './history/history.component'
import { LicensingComponent } from './licensing/licensing.component' import { LicensingComponent } from './licensing/licensing.component'
import { LineageComponent } from './lineage/lineage.component' import { LineageComponent } from './lineage/lineage.component'
import { MetadataComponent } from './metadata/metadata.component' import { MetadataComponent } from './metadata/metadata.component'
import { PipesModule } from './pipes/pipes.module' import { PipesModule } from './pipes/pipes.module'
import { RoleComponent } from './role/role.component' import { RoleComponent } from './role/role.component'
import { ApproveRouteComponent } from './routes/approve-route/approve-route.component' import { ReviewRouteComponent } from './routes/review-route/review-route.component'
import { HistoryRouteComponent } from './routes/history-route/history-route.component'
import { LicensingGuard } from './routes/licensing.guard' import { LicensingGuard } from './routes/licensing.guard'
import { UsernavRouteComponent } from './routes/usernav-route/usernav-route.component' import { UsernavRouteComponent } from './routes/usernav-route/usernav-route.component'
import { AppService } from './services/app.service' import { AppService } from './services/app.service'
import { InfoModalComponent } from './shared/abort-modal/info-modal.component' import { InfoModalComponent } from './shared/abort-modal/info-modal.component'
import { RequestsModalComponent } from './shared/requests-modal/requests-modal.component' import { RequestsModalComponent } from './shared/requests-modal/requests-modal.component'
import { SubmitterComponent } from './submitter/submitter.component'
import { UserComponent } from './user/user.component' import { UserComponent } from './user/user.component'
import { HomeModule } from './home/home.module' import { HomeModule } from './home/home.module'
import { SystemComponent } from './system/system.component' import { SystemComponent } from './system/system.component'
@ -46,14 +40,9 @@ import { NgxJsonViewerModule } from 'ngx-json-viewer'
declarations: [ declarations: [
AppComponent, AppComponent,
NotFoundComponent, NotFoundComponent,
ApproveComponent,
ApproveDetailsComponent,
ActionsComponent,
HistoryComponent,
LineageComponent, LineageComponent,
SubmitterComponent, ReviewRouteComponent,
ApproveRouteComponent, ReviewRouteComponent,
HistoryRouteComponent,
MetadataComponent, MetadataComponent,
UsernavRouteComponent, UsernavRouteComponent,
UserComponent, UserComponent,
@ -84,7 +73,7 @@ import { NgxJsonViewerModule } from 'ngx-json-viewer'
DirectivesModule, DirectivesModule,
NgxJsonViewerModule NgxJsonViewerModule
], ],
providers: [AppService, SasStoreService, ApproveComponent, LicensingGuard], providers: [AppService, SasStoreService, LicensingGuard],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule {} export class AppModule {}

View File

@ -7,14 +7,9 @@ import { ModuleWithProviders } from '@angular/core'
import { Routes, RouterModule } from '@angular/router' import { Routes, RouterModule } from '@angular/router'
import { HomeComponent } from './home/home.component' import { HomeComponent } from './home/home.component'
import { ApproveComponent } from './approve/approve.component'
import { ApproveDetailsComponent } from './approve-details/approve-details.component'
import { ActionsComponent } from './actions/actions.component'
import { HistoryComponent } from './history/history.component'
import { NotFoundComponent } from './not-found/not-found.component' import { NotFoundComponent } from './not-found/not-found.component'
import { SubmitterComponent } from './submitter/submitter.component'
import { ApproveRouteComponent } from './routes/approve-route/approve-route.component' import { ReviewRouteComponent } from './routes/review-route/review-route.component'
import { DeployComponent } from './deploy/deploy.component' import { DeployComponent } from './deploy/deploy.component'
import { LicensingComponent } from './licensing/licensing.component' import { LicensingComponent } from './licensing/licensing.component'
import { LicensingGuard } from './routes/licensing.guard' import { LicensingGuard } from './routes/licensing.guard'
@ -22,6 +17,7 @@ import { StageModule } from './stage/stage.module'
import { EditorModule } from './editor/editor.module' import { EditorModule } from './editor/editor.module'
import { ViewerModule } from './viewer/viewer.module' import { ViewerModule } from './viewer/viewer.module'
import { SystemComponent } from './system/system.component' import { SystemComponent } from './system/system.component'
import { ReviewModule } from './review/review.module'
export const ROUTES: Routes = [ export const ROUTES: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' }, { path: '', redirectTo: 'home', pathMatch: 'full' },
@ -30,13 +26,14 @@ export const ROUTES: Routes = [
loadChildren: () => ViewerModule loadChildren: () => ViewerModule
}, },
{ {
path: 'approve', path: 'review',
component: ApproveRouteComponent, component: ReviewRouteComponent,
children: [ children: [
{ path: '', pathMatch: 'full', redirectTo: 'toapprove' }, { path: '', pathMatch: 'full', redirectTo: 'toapprove' },
{ path: 'toapprove', component: ApproveComponent }, {
{ path: 'approveDet/:tableId', component: ApproveDetailsComponent }, path: '',
{ path: 'submitted', component: SubmitterComponent } loadChildren: () => ReviewModule
}
] ]
}, },
{ {
@ -55,10 +52,6 @@ export const ROUTES: Routes = [
loadChildren: () => StageModule loadChildren: () => StageModule
}, },
{ path: 'system', component: SystemComponent }, { path: 'system', component: SystemComponent },
{ path: 'actions/:libds/:dsid', component: ActionsComponent },
{ path: 'history', component: HistoryComponent },
{ path: 'submitted', component: SubmitterComponent },
{ path: 'submitted/:tableId', component: SubmitterComponent },
{ path: 'deploy', component: DeployComponent }, { path: 'deploy', component: DeployComponent },
{ path: 'deploy/manualdeploy', component: DeployComponent }, { path: 'deploy/manualdeploy', component: DeployComponent },
{ path: '**', component: NotFoundComponent } { path: '**', component: NotFoundComponent }

View File

@ -385,6 +385,7 @@
[class.hidden]="hotTable.hidden" [class.hidden]="hotTable.hidden"
[licenseKey]="hotTable.licenseKey" [licenseKey]="hotTable.licenseKey"
> >
<!--[licenseKey]=""-->
</hot-table> </hot-table>
</div> </div>

View File

@ -63,8 +63,6 @@ import {
} from './utils/renderers.utils' } from './utils/renderers.utils'
import { isStringDecimal, isStringNumber } from './utils/types.utils' import { isStringDecimal, isStringNumber } from './utils/types.utils'
import { LicenceService } from '../services/licence.service' import { LicenceService } from '../services/licence.service'
import * as numbro from 'numbro'
import * as languages from 'numbro/dist/languages.min'
@Component({ @Component({
selector: 'app-editor', selector: 'app-editor',
@ -364,10 +362,6 @@ export class EditorComponent implements OnInit, AfterViewInit {
private cdf: ChangeDetectorRef, private cdf: ChangeDetectorRef,
private hotRegisterer: HotTableRegisterer private hotRegisterer: HotTableRegisterer
) { ) {
const lang = languages[window.navigator.language]
if (lang)
numbro.default.registerLanguage(languages[window.navigator.language])
this.hotRegisterer = new HotTableRegisterer() this.hotRegisterer = new HotTableRegisterer()
this.parseRestrictions() this.parseRestrictions()

View File

@ -1,13 +1,13 @@
import { ActivatedRoute } from '@angular/router' import { ActivatedRoute } from '@angular/router'
import { SasStoreService } from '../services/sas-store.service' import { SasStoreService } from '../../services/sas-store.service'
import { Component, AfterViewInit, OnDestroy } from '@angular/core' import { Component, AfterViewInit, OnDestroy } from '@angular/core'
import { Subscription } from 'rxjs' import { Subscription } from 'rxjs'
import { Router } from '@angular/router' import { Router } from '@angular/router'
import { EventService } from '../services/event.service' import { EventService } from '../../services/event.service'
import { import {
AuditorsPostdataSASResponse, AuditorsPostdataSASResponse,
Param Param
} from '../models/sas/auditors-postdata.model' } from '../../models/sas/auditors-postdata.model'
interface ChangesObj { interface ChangesObj {
ind: any ind: any
@ -89,7 +89,7 @@ export class ApproveDetailsComponent implements AfterViewInit, OnDestroy {
} }
public goToApprovalsList() { public goToApprovalsList() {
this.route.navigateByUrl('/approve') this.route.navigateByUrl('/review/approve')
} }
public getTable(tableId: any) { public getTable(tableId: any) {
@ -136,7 +136,7 @@ export class ApproveDetailsComponent implements AfterViewInit, OnDestroy {
await this.sasStoreService await this.sasStoreService
.rejecting(rejParams, 'BrowserParams', 'approvers/rejection') .rejecting(rejParams, 'BrowserParams', 'approvers/rejection')
.then((res: any) => { .then((res: any) => {
this.route.navigateByUrl('/history') this.route.navigateByUrl('/review/history')
}) })
.catch((err: any) => { .catch((err: any) => {
this.acceptLoading = false this.acceptLoading = false
@ -156,7 +156,7 @@ export class ApproveDetailsComponent implements AfterViewInit, OnDestroy {
await this.sasStoreService await this.sasStoreService
.approveTable(approveParams, 'SASControlTable', 'auditors/postdata') .approveTable(approveParams, 'SASControlTable', 'auditors/postdata')
.then((res: any) => { .then((res: any) => {
this.route.navigateByUrl('/history') this.route.navigateByUrl('/review/history')
}) })
.catch((err: any) => { .catch((err: any) => {
this.acceptLoading = false this.acceptLoading = false
@ -164,7 +164,7 @@ export class ApproveDetailsComponent implements AfterViewInit, OnDestroy {
} }
public goToSubmitList() { public goToSubmitList() {
this.route.navigateByUrl('/submitted') this.route.navigateByUrl('/review/submitted')
} }
public async callChangesInfo(tableId: any) { public async callChangesInfo(tableId: any) {

View File

@ -1,8 +1,8 @@
import { Component, OnInit, ChangeDetectorRef } from '@angular/core' import { Component, OnInit, ChangeDetectorRef } from '@angular/core'
import { SasStoreService } from '../services/sas-store.service' import { SasStoreService } from '../../services/sas-store.service'
import { Router } from '@angular/router' import { Router } from '@angular/router'
import { SasService } from '../services/sas.service' import { SasService } from '../../services/sas.service'
import { EventService } from '../services/event.service' import { EventService } from '../../services/event.service'
interface ApproveData { interface ApproveData {
tableId: string tableId: string
@ -45,7 +45,7 @@ export class ApproveComponent implements OnInit {
if (this.approveList !== undefined) { if (this.approveList !== undefined) {
this.tableId = this.approveList[ind].tableId this.tableId = this.approveList[ind].tableId
this.route.navigateByUrl( this.route.navigateByUrl(
'approve/approveDet/' + this.approveList[ind].tableId 'review/approveDet/' + this.approveList[ind].tableId
) )
} }
} }

View File

@ -1,11 +1,8 @@
import { Component, OnInit } from '@angular/core' import { Component, OnInit } from '@angular/core'
import { SasStoreService } from '../services/sas-store.service'
import { Router } from '@angular/router' import { Router } from '@angular/router'
import { SasService } from '../services/sas.service'
import { EventService } from '../services/event.service'
import { SASjsConfig } from '@sasjs/adapter' import { SASjsConfig } from '@sasjs/adapter'
import { LicenceService } from '../services/licence.service' import { LicenceService, SasStoreService, EventService, SasService } from 'src/app/services'
@Component({ @Component({
selector: 'app-history', selector: 'app-history',

View File

@ -0,0 +1,22 @@
import { CommonModule } from '@angular/common'
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
import { ApproveDetailsComponent } from './approve-details/approve-details.component'
import { ApproveComponent } from './approve/approve.component'
import { SubmitterComponent } from './submitter/submitter.component'
import { HistoryComponent } from './history/history.component'
const ROUTES: Routes = [
{ path: 'approve', component: ApproveComponent },
{ path: 'approveDet/:tableId', component: ApproveDetailsComponent },
{ path: 'submitted', component: SubmitterComponent },
{ path: 'submitted/:tableId', component: SubmitterComponent },
{ path: 'history', component: HistoryComponent },
]
@NgModule({
declarations: [],
imports: [CommonModule, RouterModule.forChild(ROUTES)],
exports: [RouterModule]
})
export class ReviewRoutingModule {}

View File

@ -0,0 +1,31 @@
import { CommonModule } from "@angular/common";
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ClarityModule } from "@clr/angular";
import { HotTableModule } from "@handsontable/angular";
import { DirectivesModule } from "../directives/directives.module";
import { SharedModule } from "../shared/shared.module";
import { ApproveDetailsComponent } from "./approve-details/approve-details.component";
import { ApproveComponent } from "./approve/approve.component";
import { ReviewRoutingModule } from "./review-routing.module";
import { SubmitterComponent } from "./submitter/submitter.component";
import { HistoryComponent } from "./history/history.component";
@NgModule({
declarations: [
ApproveComponent,
ApproveDetailsComponent,
SubmitterComponent,
HistoryComponent
],
imports: [
CommonModule,
FormsModule,
ReviewRoutingModule,
ClarityModule,
HotTableModule.forRoot(),
DirectivesModule,
SharedModule
]
})
export class ReviewModule {}

View File

@ -1,9 +1,7 @@
import { Component, AfterViewInit, OnInit } from '@angular/core' import { Component, AfterViewInit, OnInit } from '@angular/core'
import { Subscription } from 'rxjs' import { Subscription } from 'rxjs'
import { SasStoreService } from '../services/sas-store.service'
import { ActivatedRoute, Router } from '@angular/router' import { ActivatedRoute, Router } from '@angular/router'
import { SasService } from '../services/sas.service' import { SasStoreService, EventService, SasService } from '../../services'
import { EventService } from '../services/event.service'
interface SubmitterData { interface SubmitterData {
tableId: string tableId: string
@ -46,7 +44,7 @@ export class SubmitterComponent implements OnInit, AfterViewInit {
} }
public goToDetails(table_id: any) { public goToDetails(table_id: any) {
this.router.navigateByUrl('/submitted/' + table_id) this.router.navigateByUrl('/review/submitted/' + table_id)
} }
public getDetails(sub: any, index: any) { public getDetails(sub: any, index: any) {

View File

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core'
@Component({
selector: 'app-approve-route',
templateUrl: './approve-route.component.html',
styleUrls: ['./approve-route.component.scss'],
host: {
class: 'content-container'
}
})
export class ApproveRouteComponent implements OnInit {
constructor() {}
ngOnInit() {}
}

View File

@ -1 +0,0 @@
<router-outlet></router-outlet>

View File

@ -1,12 +0,0 @@
import { Component, OnInit } from '@angular/core'
@Component({
selector: 'app-history-route',
templateUrl: './history-route.component.html',
styleUrls: ['./history-route.component.scss']
})
export class HistoryRouteComponent implements OnInit {
constructor() {}
ngOnInit() {}
}

View File

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core'
@Component({
selector: 'app-review-route',
templateUrl: './review-route.component.html',
styleUrls: ['./review-route.component.scss'],
host: {
class: 'content-container'
}
})
export class ReviewRouteComponent implements OnInit {
constructor() {}
ngOnInit() {}
}

View File

@ -19,7 +19,6 @@ import { mergeColsRules } from './utils/mergeColsRules'
import { parseColType } from './utils/parseColType' import { parseColType } from './utils/parseColType'
import { dqValidate } from './validations/dq-validation' import { dqValidate } from './validations/dq-validation'
import { specialMissingNumericValidator } from './validations/hot-custom-validators' import { specialMissingNumericValidator } from './validations/hot-custom-validators'
import { applyNumericFormats } from './utils/applyNumericFormats'
export class DcValidator { export class DcValidator {
private rules: DcValidation[] = [] private rules: DcValidation[] = []
@ -42,7 +41,6 @@ export class DcValidator {
this.hotInstance = hotInstance this.hotInstance = hotInstance
this.rules = parseColType(sasparams.COLTYPE) this.rules = parseColType(sasparams.COLTYPE)
this.rules = mergeColsRules(cols, this.rules, $dataFormats) this.rules = mergeColsRules(cols, this.rules, $dataFormats)
this.rules = applyNumericFormats(this.rules)
this.dqrules = dqRules this.dqrules = dqRules
this.dqdata = dqData this.dqdata = dqData
this.primaryKeys = sasparams.PK.split(' ') this.primaryKeys = sasparams.PK.split(' ')

View File

@ -1,26 +0,0 @@
import { DcValidation } from '../models/dc-validation.model'
import * as languages from 'numbro/dist/languages.min'
/**
* Applying the numeric formats based on the browser locale/language
* So that correct decimal separators are applied.
* For example european format (thousand dot, decimal comma): 1.000,00
*
* @param rules Cell Validation rules to be updated
* Those rules are passed in the `columns` property Of handsontable settings.
*/
export const applyNumericFormats = (rules: DcValidation[]): DcValidation[] => {
const lang = languages[window.navigator.language]
if (!lang) return rules
for (let rule of rules) {
if (rule.type === 'numeric')
rule.numericFormat = {
pattern: '0,0',
culture: window.navigator.language // use this for EUR (German),
// more cultures available on http://numbrojs.com/languages.html
}
}
return rules
}

View File

@ -6,8 +6,7 @@ import { DcValidation } from '../models/dc-validation.model'
* Merging old validation params from sasparams with cols params * Merging old validation params from sasparams with cols params
* @param sasparams sasparams coming from SAS * @param sasparams sasparams coming from SAS
* @param cols cols coming from SAS * @param cols cols coming from SAS
* @param rules Cell Validation rules to be updated * @param rules rules to be updated
* Those rules are passed in the `columns` property Of handsontable settings.
* @returns * @returns
*/ */
export const mergeColsRules = ( export const mergeColsRules = (

View File

@ -55,14 +55,14 @@
<a <a
*ngIf="isMainRoute('approve')" *ngIf="isMainRoute('approve')"
clrVerticalNavLink clrVerticalNavLink
routerLink="/approve/submitted" routerLink="/review/approve/submitted"
routerLinkActive="active" routerLinkActive="active"
>Submitted</a >Submitted</a
> >
<a <a
*ngIf="isMainRoute('approve')" *ngIf="isMainRoute('approve')"
clrVerticalNavLink clrVerticalNavLink
routerLink="/approve/toapprove" routerLink="/review/approve/toapprove"
routerLinkActive="active" routerLinkActive="active"
>To Approve</a >To Approve</a
> >

View File

@ -47,7 +47,7 @@ export class StageComponent implements OnInit {
} }
public approveTableScreen() { public approveTableScreen() {
this.route.navigateByUrl('/approve/approveDet/' + this.table_id) this.route.navigateByUrl('/review/approveDet/' + this.table_id)
} }
public viewerTableScreen() { public viewerTableScreen() {

View File

@ -18,4 +18,4 @@ In any case, you must not make any such use of this software as to develop softw
UNLESS EXPRESSLY AGREED OTHERWISE, 4GL APPS PROVIDES THIS SOFTWARE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO LEGAL THEORY, SHALL 4GL APPS BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM USE OR INABILITY TO USE THIS SOFTWARE. UNLESS EXPRESSLY AGREED OTHERWISE, 4GL APPS PROVIDES THIS SOFTWARE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO LEGAL THEORY, SHALL 4GL APPS BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM USE OR INABILITY TO USE THIS SOFTWARE.
` `

1
client/tsconfig.doc.json Normal file
View File

@ -0,0 +1 @@
{"include":["src/**/*.ts"],"exclude":["src/**/*.spec.ts"]}

View File

@ -1,12 +0,0 @@
{
"out": "../tsdoc",
"tsconfig": "./tsconfig.app.json",
"entryPointStrategy": "expand",
"entryPoints": [
"./src"
],
"exclude": "**/*+(index|.spec|.e2e).ts",
"externalPattern": "**/node_modules/**",
"excludeExternals": true,
"excludePrivate": true
}

View File

@ -141,13 +141,6 @@ run;
%mp_lockanytable(UNLOCK,lib=&lib,ds=&ds,ctl_ds=&dclib..mpe_lockanytable) %mp_lockanytable(UNLOCK,lib=&lib,ds=&ds,ctl_ds=&dclib..mpe_lockanytable)
%end; %end;
%else %do;
/* is full replace so treat everything as a mod in diff screen */
data work.outds_mod work.outds_add work.outds_del;
set work.&staging_ds;
output work.outds_mod; /* _add and _del will be empty */
run;
%end;
%end; %end;
%else %if &loadtype=UPDATE %then %do; %else %if &loadtype=UPDATE %then %do;
%bitemporal_dataloader(bus_from=,bus_to= %bitemporal_dataloader(bus_from=,bus_to=

View File

@ -597,7 +597,6 @@ run;
%if &LOADTYPE=REPLACE %then %do; %if &LOADTYPE=REPLACE %then %do;
data work.outds_add; run; data work.outds_add; run;
data work.outds_mod; run; data work.outds_mod; run;
data work.outds_del; run;
%end; %end;
libname approve "&mpelocapprovals/&TABLE"; libname approve "&mpelocapprovals/&TABLE";
data; set &libds;stop;run; data; set &libds;stop;run;