Merge branch 'main' into handonstable-14
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 1m32s
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 1m32s
This commit is contained in:
commit
7853f7cb6a
@ -8,9 +8,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
node-version: 20.14.0
|
||||
|
||||
- name: Install Google Chrome
|
||||
run: |
|
||||
@ -31,11 +31,9 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
cd client
|
||||
npm ci
|
||||
# Decrypt and Install sheet
|
||||
echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
|
||||
npm i ./libraries/sheet-crypto.tgz
|
||||
# End
|
||||
npm ci
|
||||
|
||||
- name: Licence checker
|
||||
run: |
|
||||
|
@ -11,9 +11,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
node-version: 20.14.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
@ -36,11 +36,9 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
cd client
|
||||
npm ci
|
||||
# Decrypt and Install sheet
|
||||
echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
|
||||
npm i ./libraries/sheet-crypto.tgz
|
||||
# End
|
||||
npm ci
|
||||
|
||||
- name: Check audit
|
||||
# Audit should fail and stop the CI if critical vulnerability found
|
||||
@ -68,9 +66,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
node-version: 20.14.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
@ -94,11 +92,9 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
cd client
|
||||
npm ci
|
||||
# Decrypt and Install sheet
|
||||
echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
|
||||
npm i ./libraries/sheet-crypto.tgz
|
||||
# End
|
||||
npm ci
|
||||
|
||||
# Install pm2 and prepare SASJS server
|
||||
- run: npm i -g pm2
|
||||
@ -160,9 +156,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
node-version: 20.14.0
|
||||
|
||||
- name: Write .npmrc file
|
||||
run: |
|
||||
@ -188,11 +184,9 @@ jobs:
|
||||
description: We want to prevent creating empty release if frontend fails
|
||||
run: |
|
||||
cd client
|
||||
npm ci
|
||||
# Decrypt and Install sheet
|
||||
echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
|
||||
npm i ./libraries/sheet-crypto.tgz
|
||||
# End
|
||||
npm ci
|
||||
npm i webpack
|
||||
npm run build
|
||||
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -13,6 +13,7 @@ client/cypress/videos
|
||||
client/documentation
|
||||
client/**/sheet-crypto.tgz
|
||||
client/.nx
|
||||
client/libraries/sheet-crypto.tgz
|
||||
cypress.env.json
|
||||
sasjsbuild
|
||||
sasjsresults
|
||||
|
17
CHANGELOG.md
17
CHANGELOG.md
@ -1,3 +1,20 @@
|
||||
# [6.9.0](https://git.datacontroller.io/dc/dc/compare/v6.8.5...v6.9.0) (2024-05-31)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* added colors.scss file, start of a refactor ([110ad9a](https://git.datacontroller.io/dc/dc/commit/110ad9a6e9ed39bd5591ae65c2d0005ba47ca758))
|
||||
* added stealFocus directive ([9a79f37](https://git.datacontroller.io/dc/dc/commit/9a79f37bf143a1e05df7407358e2687c678e3e68))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* added app settings service to handle theme persistance, fix: optimised dark mode contrast ([35844e0](https://git.datacontroller.io/dc/dc/commit/35844e0cf1a639553269f2ab0f8666a56ab5cc47))
|
||||
* **dark mode:** clarity optimizations ([afa7e38](https://git.datacontroller.io/dc/dc/commit/afa7e380aa3bdabd380c038522b9d73d9a8a3b91))
|
||||
* **dark mode:** lineage and metadata ([27907ed](https://git.datacontroller.io/dc/dc/commit/27907ed00fe81f4c752ffe99d2fb029d5c884f0a))
|
||||
* **dark mode:** refactoring clarity to enable dark mode, added toggle button ([5564aea](https://git.datacontroller.io/dc/dc/commit/5564aea9c25f8e81ff85afa8352325b9992e4043))
|
||||
* **dark mode:** removing custom css rules so clarity can handle dark/light modes. Handsontable css for dark mode ([2c0afd0](https://git.datacontroller.io/dc/dc/commit/2c0afd02684cdf3bda374731b0359665e00ed95d))
|
||||
|
||||
## [6.8.5](https://git.datacontroller.io/dc/dc/compare/v6.8.4...v6.8.5) (2024-05-23)
|
||||
|
||||
|
||||
|
Binary file not shown.
2162
client/package-lock.json
generated
2162
client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -53,6 +53,7 @@
|
||||
"@sasjs/utils": "^3.4.0",
|
||||
"@sheet/crypto": "file:libraries/sheet-crypto.tgz",
|
||||
"@types/d3-graphviz": "^2.6.7",
|
||||
"@sheet/crypto": "file:libraries/sheet-crypto.tgz",
|
||||
"@types/text-encoding": "0.0.35",
|
||||
"base64-arraybuffer": "^0.2.0",
|
||||
"buffer": "^5.4.3",
|
||||
@ -79,6 +80,7 @@
|
||||
"text-encoding": "^0.7.0",
|
||||
"tslib": "^2.3.0",
|
||||
"vm": "^0.1.0",
|
||||
"webpack": "^5.91.0",
|
||||
"zone.js": "~0.14.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@ -1,3 +1,5 @@
|
||||
@import '../colors.scss';
|
||||
|
||||
// Copyright (c) 2016 VMware, Inc. All Rights Reserved.
|
||||
// This software is released under MIT license.
|
||||
// The full license information can be found in LICENSE in the root directory of this project.
|
||||
@ -6,7 +8,7 @@ app-requests-modal {
|
||||
}
|
||||
|
||||
header.app-header {
|
||||
background: #314351 !important;
|
||||
background: $headerBackground !important;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@ -42,7 +44,7 @@ header.app-header {
|
||||
align-items: center;
|
||||
padding: 30px;
|
||||
z-index: 110;
|
||||
background: #314351;
|
||||
background: $headerBackground;
|
||||
|
||||
.expired-notice {
|
||||
color: #e0e0e0;
|
||||
@ -106,15 +108,6 @@ header {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.btn.btn-success {
|
||||
border-color: #62a420;
|
||||
background-color: #16a57a!important;
|
||||
color: #fff;
|
||||
}
|
||||
.btn.btn-success:hover {
|
||||
background-color: #2add39;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.toggle-switch input[type=checkbox]:checked+label:before {
|
||||
border-color: #61717D;
|
||||
@ -142,59 +135,44 @@ header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.navBarResp {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
background: #495A67;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.main-container .sub-nav.clr-nav-level-1 .nav .nav-link, .main-container .sub-nav.clr-nav-level-2 .nav .nav-link, .main-container .subnav.clr-nav-level-1 .nav .nav-link, .main-container .subnav.clr-nav-level-2 .nav .nav-link {
|
||||
padding: 0 .5rem 0 1rem;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
border-radius: .125rem 0 0 .125rem;
|
||||
color: #95c84b;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.card-block, .card-footer {
|
||||
padding: 10px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.main-container[_ngcontent-c0] .content-container[_ngcontent-c0] .content-area[_ngcontent-c0] {
|
||||
padding: 0rem 0rem 0rem 0rem;
|
||||
}
|
||||
|
||||
}
|
||||
::ng-deep {
|
||||
.htInvalid {
|
||||
background: black!important;
|
||||
}
|
||||
background: black!important;
|
||||
}
|
||||
|
||||
@media screen and (max-width:480px) {
|
||||
h2 {
|
||||
font-size: .7rem!important;
|
||||
|
||||
h2 {
|
||||
font-size: .7rem!important;
|
||||
}
|
||||
h3 {
|
||||
font-size: .7rem;
|
||||
}
|
||||
}
|
||||
h3 {
|
||||
font-size: .7rem;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
padding: 0rem 1rem 0rem 1rem;
|
||||
}
|
||||
|
||||
.btn-primary .btn, .btn.btn-primary {
|
||||
border-color: #314351;
|
||||
background-color: #314351;
|
||||
color: #fff;
|
||||
body[cds-theme="light"] {
|
||||
.btn-primary .btn, .btn.btn-primary {
|
||||
border-color: $headerBackground;
|
||||
background-color: $headerBackground;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
body[cds-theme="dark"] {
|
||||
.btn-primary .btn, .btn.btn-primary {
|
||||
border-color: #5e7382;
|
||||
background-color: #5e7382;
|
||||
color: #fff;
|
||||
|
||||
clr-icon, cds-icon {
|
||||
color: #fff
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
@ -215,36 +193,32 @@ header {
|
||||
font-weight: 500;
|
||||
height: 1.5rem;
|
||||
padding: 0 .5rem;
|
||||
border-color: #314351;
|
||||
background-color: transparent;
|
||||
color: #314351;
|
||||
}
|
||||
|
||||
.btn.btn-outline {
|
||||
border-color: #314351;
|
||||
background-color: transparent;
|
||||
color: #314351;
|
||||
}
|
||||
|
||||
.btn.btn-outline:hover {
|
||||
border-color: #314351;
|
||||
border-color: $headerBackground;
|
||||
background-color: #495A67;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn.btn-success-outline:hover {
|
||||
background-color: #5ea71f;
|
||||
color: #fff7f7;
|
||||
border-color: #9a9696;
|
||||
}
|
||||
// .btn.btn-success-outline {
|
||||
// border-color: #266900;
|
||||
// background-color: transparent;
|
||||
// color: #318700;
|
||||
// }
|
||||
// .wtSpreader {
|
||||
|
||||
// }
|
||||
body[cds-theme="dark"] {
|
||||
.btn.btn-icon.btn-dimmed {
|
||||
color: #7295ae;
|
||||
}
|
||||
}
|
||||
|
||||
body[cds-theme="light"] {
|
||||
.btn.btn-icon.btn-dimmed {
|
||||
color: $headerBackground;
|
||||
}
|
||||
|
||||
.btn.btn-outline {
|
||||
border-color: $headerBackground;
|
||||
background-color: transparent;
|
||||
color: $headerBackground;
|
||||
}
|
||||
}
|
||||
|
||||
.htMobileEditorContainer .inputs textarea {
|
||||
font-size: 13pt;
|
||||
@ -277,65 +251,68 @@ header {
|
||||
width: 350px;
|
||||
}
|
||||
|
||||
.handsontable {
|
||||
background-color: #ffffff;
|
||||
// border: 1px solid #ccc;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.handsontable th {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
/* Left and right */
|
||||
.ht_clone_left th {
|
||||
border-right: 1px solid #ccc;
|
||||
border-left: 1px solid #ccc;
|
||||
}
|
||||
|
||||
/* Column headers */
|
||||
.ht_clone_top th {
|
||||
border-top: 1px solid #ccc;
|
||||
border-right: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
|
||||
body[cds-theme="light"] {
|
||||
.wtBorder {
|
||||
background-color: #495A67!important;
|
||||
}
|
||||
|
||||
.ht_master tr:nth-of-type(odd) > td {
|
||||
filter: brightness(0.95);
|
||||
}
|
||||
}
|
||||
|
||||
.ht_clone_top_left_corner th {
|
||||
border-right: 1px solid #ccc;
|
||||
}
|
||||
$darkBorderColor: #697c85;
|
||||
|
||||
.ht_master tr:nth-of-type(odd) > td {
|
||||
background-color: #f3f3f3;
|
||||
border: 1px solid rgb(197, 197, 197);
|
||||
border-bottom: 1px solid rgb(236, 235, 235);
|
||||
// padding: 1px 1px;
|
||||
}
|
||||
body[cds-theme="dark"] {
|
||||
.ht_master tr:nth-of-type(odd) > td {
|
||||
filter: brightness(1.2);
|
||||
}
|
||||
|
||||
.ht_master tr:nth-of-type(even) > td {
|
||||
background-color: white;
|
||||
border: 1px solid rgb(197, 197, 197);
|
||||
border-bottom: 1px solid rgb(236, 235, 235);
|
||||
// padding: 1px 1px;
|
||||
}
|
||||
.ht_master:not(.emptyColumns) ~ .handsontable tbody tr th, .ht_master:not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child {
|
||||
background-color: #2d4048;
|
||||
border-color: $darkBorderColor;
|
||||
}
|
||||
|
||||
.wtBorder {
|
||||
background-color: #495A67!important;
|
||||
.handsontable td {
|
||||
// border-right: 1px solid #697c85;
|
||||
// border-bottom: 1px solid #697c85;
|
||||
border-color: $darkBorderColor;
|
||||
}
|
||||
|
||||
.handsontable tr:first-child th, .handsontable tr:first-child td {
|
||||
border-color: $darkBorderColor;
|
||||
}
|
||||
|
||||
.handsontable .handsontable.ht_clone_top .wtHider {
|
||||
border-color: $darkBorderColor;
|
||||
}
|
||||
|
||||
.handsontable .changeType {
|
||||
background-color: #3c5662;
|
||||
border-color: $darkBorderColor;
|
||||
}
|
||||
|
||||
.handsontableInput {
|
||||
background-color: #708b98;
|
||||
}
|
||||
}
|
||||
|
||||
.handsontable .handsontable.ht_clone_top .wtHider {
|
||||
padding: 0 0 0px 0!important;
|
||||
margin: 0px;
|
||||
border-bottom: 3px solid #d6d3d3;
|
||||
}
|
||||
|
||||
.content-container {
|
||||
background: #F5F6FF;
|
||||
}
|
||||
|
||||
.card {
|
||||
box-shadow: 0 0.125rem 0 0 #d7d7d7;
|
||||
border-radius: .0rem;
|
||||
border: 1px solid transparent;
|
||||
// min-height: calc(100vh - 150px);
|
||||
body[cds-theme="light"] {
|
||||
.content-container {
|
||||
// background: red;
|
||||
background: #F5F6FF;
|
||||
}
|
||||
}
|
||||
|
||||
.datagrid-compact, .datagrid-history{
|
||||
@ -343,8 +320,6 @@ header {
|
||||
border-collapse: separate;
|
||||
border: 1px solid transparent;
|
||||
border-radius: .125rem;
|
||||
background-color: #fff;
|
||||
color: #565656;
|
||||
margin: 0;
|
||||
margin-top: 1rem;
|
||||
max-width: 100%;
|
||||
@ -366,8 +341,8 @@ header {
|
||||
}
|
||||
.datagrid-footer {
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
top: 2px;
|
||||
right: 30px;
|
||||
top: 1px;
|
||||
}
|
||||
.datagrid .datagrid-head {
|
||||
background-color: #fff;
|
||||
@ -387,7 +362,6 @@ header {
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
background: #f5f6ff;
|
||||
padding: .5rem 0;
|
||||
border: 1px solid #ccc;
|
||||
box-shadow: 0 1px 0.125rem hsla(0,0%,45%,.25);
|
||||
@ -402,8 +376,6 @@ header {
|
||||
border-collapse: separate;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0px;
|
||||
background-color: #fff;
|
||||
color: #565656;
|
||||
margin: 0;
|
||||
margin-top: 1rem;
|
||||
max-width: 100%;
|
||||
@ -414,7 +386,6 @@ header {
|
||||
font-size: .45833rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: .03em;
|
||||
background-color: #fff;
|
||||
vertical-align: bottom;
|
||||
border-bottom: 1px solid #ccc;
|
||||
text-transform: uppercase;
|
||||
@ -437,4 +408,34 @@ header {
|
||||
max-width: 400px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.navBarResp {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
background: #495A67;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.main-container .sub-nav.clr-nav-level-1 .nav .nav-link, .main-container .sub-nav.clr-nav-level-2 .nav .nav-link, .main-container .subnav.clr-nav-level-1 .nav .nav-link, .main-container .subnav.clr-nav-level-2 .nav .nav-link {
|
||||
padding: 0 .5rem 0 1rem;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
border-radius: .125rem 0 0 .125rem;
|
||||
color: #95c84b;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.card-block, .card-footer {
|
||||
padding: 10px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.main-container[_ngcontent-c0] .content-container[_ngcontent-c0] .content-area[_ngcontent-c0] {
|
||||
padding: 0rem 0rem 0rem 0rem;
|
||||
}
|
||||
|
||||
}
|
@ -13,6 +13,15 @@ import { InfoModal } from './models/InfoModal'
|
||||
import { DcAdapterSettings } from './models/DcAdapterSettings'
|
||||
import { AppStoreService } from './services/app-store.service'
|
||||
import { LicenceService } from './services/licence.service'
|
||||
import '@cds/core/icon/register.js'
|
||||
import {
|
||||
ClarityIcons,
|
||||
exclamationTriangleIcon,
|
||||
moonIcon,
|
||||
sunIcon
|
||||
} from '@cds/core/icon'
|
||||
|
||||
ClarityIcons.addIcons(moonIcon, sunIcon, exclamationTriangleIcon)
|
||||
|
||||
@Component({
|
||||
selector: 'my-app',
|
||||
|
@ -20,10 +20,10 @@ import { UsernavRouteComponent } from './routes/usernav-route/usernav-route.comp
|
||||
import { AppService } from './services/app.service'
|
||||
import { InfoModalComponent } from './shared/abort-modal/info-modal.component'
|
||||
import { RequestsModalComponent } from './shared/requests-modal/requests-modal.component'
|
||||
import { HomeModule } from './home/home.module'
|
||||
import { DirectivesModule } from './directives/directives.module'
|
||||
import { ViyaApiExplorerComponent } from './viya-api-explorer/viya-api-explorer.component'
|
||||
import { NgxJsonViewerModule } from 'ngx-json-viewer'
|
||||
import { AppSettingsService } from './services/app-settings.service'
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
@ -50,7 +50,7 @@ import { NgxJsonViewerModule } from 'ngx-json-viewer'
|
||||
DirectivesModule,
|
||||
NgxJsonViewerModule
|
||||
],
|
||||
providers: [AppService, SasStoreService, LicensingGuard],
|
||||
providers: [AppService, SasStoreService, LicensingGuard, AppSettingsService],
|
||||
bootstrap: [AppComponent]
|
||||
})
|
||||
export class AppModule {}
|
||||
|
@ -4,20 +4,23 @@ import { NgVarDirective } from './ng-var.directive'
|
||||
import { DragNdropDirective } from './drag-ndrop.directive'
|
||||
import { FileDropDirective } from './file-drop.directive'
|
||||
import { FileSelectDirective } from './file-select.directive'
|
||||
import { StealFocusDirective } from './steal-focus.directive'
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
NgVarDirective,
|
||||
DragNdropDirective,
|
||||
FileDropDirective,
|
||||
FileSelectDirective
|
||||
FileSelectDirective,
|
||||
StealFocusDirective
|
||||
],
|
||||
imports: [CommonModule],
|
||||
exports: [
|
||||
NgVarDirective,
|
||||
DragNdropDirective,
|
||||
FileDropDirective,
|
||||
FileSelectDirective
|
||||
FileSelectDirective,
|
||||
StealFocusDirective
|
||||
]
|
||||
})
|
||||
export class DirectivesModule {}
|
||||
|
17
client/src/app/directives/steal-focus.directive.ts
Normal file
17
client/src/app/directives/steal-focus.directive.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { Directive, HostListener } from '@angular/core'
|
||||
|
||||
@Directive({
|
||||
selector: '[appStealFocus]'
|
||||
})
|
||||
export class StealFocusDirective {
|
||||
constructor() {}
|
||||
|
||||
/**
|
||||
* For some reason newest version of Clarity v17.0.1 is stealing focus when
|
||||
* clicking on the input inside of the clr-tree-view
|
||||
* This is workaround
|
||||
*/
|
||||
@HostListener('click', ['$event']) onClick(event: any) {
|
||||
event.target.focus()
|
||||
}
|
||||
}
|
@ -277,7 +277,7 @@
|
||||
<div>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline focusable"
|
||||
class="btn btn-outline focusable mr-5i"
|
||||
(click)="currentRecord!.noLinkOption = false; closeRecordEdit()"
|
||||
>
|
||||
Cancel
|
||||
|
@ -38,7 +38,6 @@
|
||||
app-soft-select {
|
||||
display: block;
|
||||
width: 224px;
|
||||
background: #fff;
|
||||
border: 1px solid #999;
|
||||
color: #000;
|
||||
padding: calc(.25rem + 2px) .5rem;
|
||||
@ -49,7 +48,6 @@
|
||||
input {
|
||||
width: 100%;
|
||||
border: 0;
|
||||
background-color: #fff;
|
||||
|
||||
&:focus {
|
||||
background: none;
|
||||
@ -132,7 +130,6 @@
|
||||
|
||||
clr-input-container {
|
||||
width: 224px;
|
||||
background: #fff;
|
||||
border: 1px solid #999;
|
||||
color: #000;
|
||||
padding: calc(.25rem + 2px) .5rem;
|
||||
|
@ -165,11 +165,14 @@
|
||||
class="card-header clr-row buttonBar headerBar clr-flex-md-row clr-justify-content-center clr-justify-content-lg-end"
|
||||
>
|
||||
<div *ngIf="tableTrue" class="clr-col-12 clr-col-lg-4 backBtn">
|
||||
<span class="btn btn-sm" [routerLink]="['/home']">
|
||||
<clr-icon shape="caret" dir="left" size="20"></clr-icon>Back to
|
||||
table selection
|
||||
<span class="btn btn-sm btn-icon btn-dimmed" [routerLink]="['/home']">
|
||||
<clr-icon shape="caret" dir="left" size="20"></clr-icon>
|
||||
Back to table selection
|
||||
</span>
|
||||
<span (click)="viewboxManager()" class="btn btn-sm viewbox-open">
|
||||
<span
|
||||
(click)="viewboxManager()"
|
||||
class="btn btn-sm btn-icon btn-dimmed viewbox-open"
|
||||
>
|
||||
<clr-icon shape="view-cards" size="20"></clr-icon>
|
||||
Viewboxes
|
||||
</span>
|
||||
@ -235,7 +238,7 @@
|
||||
<ng-container *ngIf="hotTable.readOnly && !uploadPreview">
|
||||
<button
|
||||
type="button"
|
||||
class="btnView btn btn-sm btn-icon btn-block"
|
||||
class="btnView btn btn-sm btn-icon btn-block btn-dimmed"
|
||||
(click)="openQb()"
|
||||
>
|
||||
<clr-icon shape="filter"></clr-icon>
|
||||
@ -362,8 +365,8 @@
|
||||
<ng-container *ngIf="!getdataError">
|
||||
<span class="spinner"> Loading... </span>
|
||||
|
||||
<div>
|
||||
<h3>Loading table</h3>
|
||||
<div class="mt-10">
|
||||
<p cds-text="section">Loading table</p>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
@ -372,8 +375,8 @@
|
||||
<clr-icon shape="error-standard" class="error-icon"></clr-icon>
|
||||
</span>
|
||||
|
||||
<div>
|
||||
<h3>Loading table error</h3>
|
||||
<div class="mt-10">
|
||||
<p cds-text="section">Loading table error</p>
|
||||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
@ -398,6 +401,7 @@
|
||||
hotId="hotInstance"
|
||||
id="hotTable"
|
||||
class="edit-hot"
|
||||
className="htDark"
|
||||
[class.hidden]="hotTable.hidden"
|
||||
[licenseKey]="hotTable.licenseKey"
|
||||
>
|
||||
@ -486,11 +490,15 @@
|
||||
support@datacontroller.io</span
|
||||
>
|
||||
<div *ngIf="tableTrue" class="clr-offset-md-2 clr-col-md-8">
|
||||
<div class="form-group">
|
||||
<label for="formFields_8">Message</label>
|
||||
<div class="text-area-full-width">
|
||||
<label for="formFields_8" class="mb-5 d-block"
|
||||
>Message</label
|
||||
>
|
||||
<textarea
|
||||
clrTextarea
|
||||
[(ngModel)]="message"
|
||||
[disabled]="!validationDone"
|
||||
tabindex="0"
|
||||
[value]="
|
||||
!validationDone
|
||||
? 'Please wait while we validate ' +
|
||||
@ -498,10 +506,9 @@
|
||||
' cells.'
|
||||
: ''
|
||||
"
|
||||
class="w-100"
|
||||
class="submit-reason"
|
||||
type="text"
|
||||
id="formFields_8"
|
||||
rows="5"
|
||||
></textarea>
|
||||
</div>
|
||||
<!-- TODO:approvers list -->
|
||||
@ -520,6 +527,7 @@
|
||||
[disabled]="!validationDone"
|
||||
type="submit"
|
||||
class="btn btn-sm btn-success-outline m-0"
|
||||
tabindex="0"
|
||||
(click)="saveTable(hotTable.data)"
|
||||
>
|
||||
Submit
|
||||
@ -528,6 +536,7 @@
|
||||
id="cancelSubmitBtn"
|
||||
type="button"
|
||||
class="btn btn-sm btn-outline"
|
||||
tabindex="0"
|
||||
(click)="cancelSubmit(); submit = false; validationDone = 0"
|
||||
>
|
||||
Cancel
|
||||
|
@ -21,12 +21,12 @@ hot-table {
|
||||
|
||||
.handsontable tbody th.ht__highlight, .handsontable thead th.ht__highlight {
|
||||
&.primaryKeyHeaderStyle {
|
||||
background: #306b00b0;
|
||||
background-color: #306b00b0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.primaryKeyHeaderStyle {
|
||||
background: #306b006e;
|
||||
background-color: #306b006e !important;
|
||||
}
|
||||
|
||||
th.readonlyCell {
|
||||
@ -41,6 +41,12 @@ hot-table {
|
||||
}
|
||||
}
|
||||
|
||||
.submit-reason {
|
||||
min-height: 120px;
|
||||
max-height: 120px;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
.infoBar {
|
||||
margin-top:14px;
|
||||
background: #495967;
|
||||
@ -80,8 +86,7 @@ hot-table {
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
background: #ffffff;
|
||||
background: #f5f6fe;
|
||||
background: var(--clr-vertical-nav-bg-color);
|
||||
}
|
||||
|
||||
.error-icon {
|
||||
|
@ -2766,6 +2766,7 @@ export class EditorComponent implements OnInit, AfterViewInit {
|
||||
})
|
||||
|
||||
hot.setCellMeta(row, column, 'renderer', spinnerRenderer)
|
||||
|
||||
this.currentEditRecordLoadings.push(column)
|
||||
hot.render()
|
||||
|
||||
@ -3257,6 +3258,9 @@ export class EditorComponent implements OnInit, AfterViewInit {
|
||||
if (col === 0) {
|
||||
th.classList.add('firstColumnHeaderStyle')
|
||||
}
|
||||
|
||||
// Dark mode
|
||||
th.classList.add('darkTH')
|
||||
},
|
||||
afterGetCellMeta: (
|
||||
row: number,
|
||||
|
@ -11,9 +11,11 @@ export const errorRenderer = (
|
||||
value: any,
|
||||
cellProperties: any
|
||||
) => {
|
||||
addDarkClass(td)
|
||||
|
||||
td.innerHTML = `${
|
||||
value ? value.toString() : ''
|
||||
} <clr-icon shape="exclamation-circle" status="warning"></clr-icon>`
|
||||
} <cds-icon shape="exclamation-triangle" status="warning"></cds-icon>`
|
||||
|
||||
return td
|
||||
}
|
||||
@ -31,6 +33,8 @@ export const noSpinnerRenderer = (
|
||||
value: any,
|
||||
cellProperties: any
|
||||
) => {
|
||||
addDarkClass(td)
|
||||
|
||||
td.innerHTML = value ? value : ''
|
||||
|
||||
return td
|
||||
@ -50,9 +54,20 @@ export const spinnerRenderer = (
|
||||
value: any,
|
||||
cellProperties: any
|
||||
) => {
|
||||
addDarkClass(td)
|
||||
|
||||
td.innerHTML = `${
|
||||
value ? value.toString() : ''
|
||||
} <span class="spinner spinner-sm vertical-align-middle"></span>`
|
||||
|
||||
return td
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a htDark class to a TD element if not existing
|
||||
*/
|
||||
const addDarkClass = (td: any) => {
|
||||
if (!td.classList.contains('htDark')) {
|
||||
td.classList.add('htDark')
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
<clr-tree-node *ngIf="groups" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchLibTreeInput
|
||||
placeholder="Filter by Groups"
|
||||
@ -27,7 +28,7 @@
|
||||
<clr-tree-node
|
||||
(click)="groupOnClick(group)"
|
||||
*ngIf="!group['hidden']"
|
||||
[class.table-active]="group.GROUPURI === groupUri"
|
||||
[class.active]="group.GROUPURI === groupUri"
|
||||
>
|
||||
<p class="m-0 cursor-pointer list-padding">
|
||||
<clr-icon shape="users"></clr-icon>
|
||||
|
@ -1,26 +1,63 @@
|
||||
@import '../../colors.scss';
|
||||
|
||||
::ng-deep body[cds-theme="dark"] {
|
||||
.group-info {
|
||||
background-color: $headerBackground;
|
||||
border-color: $headerBackground;
|
||||
}
|
||||
|
||||
.group-data {
|
||||
background-color: $headerBackground;
|
||||
border-color: $headerBackground;
|
||||
}
|
||||
|
||||
.member-table tbody{
|
||||
tr:hover{
|
||||
background-color: #29404b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep body[cds-theme="light"] {
|
||||
.group-info{
|
||||
background-color: #f9f9f9;
|
||||
border-color: #a7a7a7;
|
||||
box-shadow: 0px 2px 5px #dad7d7;
|
||||
}
|
||||
|
||||
.group-data {
|
||||
background-color: #f9f9f9;
|
||||
border-color: #a7a7a7;
|
||||
box-shadow: 0px 2px 5px #dad7d7;
|
||||
}
|
||||
|
||||
.member-table tbody{
|
||||
tr:hover{
|
||||
background-color: #e6e6e6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-height{
|
||||
height: 100%;
|
||||
}
|
||||
.group-info-text{
|
||||
display: inline;
|
||||
display: inline;
|
||||
font-size: 20px;
|
||||
}
|
||||
.group-info{
|
||||
background-color: #f9f9f9;
|
||||
border: 1px solid #a7a7a7;
|
||||
border: 1px solid;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0px 2px 5px #dad7d7;
|
||||
}
|
||||
.group-info td{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.group-data{
|
||||
background-color: #f9f9f9;
|
||||
border: 1px solid #a7a7a7;
|
||||
border: 1px solid;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0px 2px 5px #dad7d7;
|
||||
}
|
||||
|
||||
.group-data{
|
||||
min-height: auto;
|
||||
h3, h5{
|
||||
@ -28,15 +65,11 @@
|
||||
}
|
||||
|
||||
.member-table{
|
||||
background-color: #f9f9f9;
|
||||
width: 100%;
|
||||
}
|
||||
.member-table thead{
|
||||
background-color: #dadada;
|
||||
}
|
||||
|
||||
.member-table tbody{
|
||||
tr:hover{
|
||||
background-color: #e6e6e6;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
clrInput
|
||||
appStealFocus
|
||||
#searchLibTreeInput
|
||||
placeholder="Libraries"
|
||||
name="input"
|
||||
@ -46,6 +47,7 @@
|
||||
<clr-tree-node *ngIf="library['tables']" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchTreeInput
|
||||
placeholder="Tables"
|
||||
@ -85,7 +87,7 @@
|
||||
(click)="!tableLocked ? onTableClick(libTable, library) : ''"
|
||||
class="clr-treenode-link"
|
||||
[class.dc-locked-control]="tableLocked"
|
||||
[class.table-active]="libTabActive(library.LIBRARYREF, libTable)"
|
||||
[class.active]="libTabActive(library.LIBRARYREF, libTable)"
|
||||
>
|
||||
<ng-container [ngSwitch]="libTable.includes('-FC')">
|
||||
<clr-icon *ngSwitchCase="true" shape="bolt"></clr-icon>
|
||||
@ -126,12 +128,20 @@
|
||||
size="60"
|
||||
class="is-info icon-dc-fill"
|
||||
></clr-icon>
|
||||
<h3 *ngIf="treeNodeLibraries?.length! > 0" class="text-center color-gray">
|
||||
<p
|
||||
*ngIf="treeNodeLibraries?.length! > 0"
|
||||
class="text-center color-gray mt-10"
|
||||
cds-text="section"
|
||||
>
|
||||
Please select a table
|
||||
</h3>
|
||||
<h3 *ngIf="treeNodeLibraries?.length! < 1" class="text-center color-gray">
|
||||
</p>
|
||||
<p
|
||||
*ngIf="treeNodeLibraries?.length! < 1"
|
||||
class="text-center color-gray mt-10"
|
||||
cds-text="section"
|
||||
>
|
||||
No Editable Tables Configured
|
||||
</h3>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -3,6 +3,7 @@
|
||||
<clr-tree-node *ngIf="libraryList" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchLibTreeInput
|
||||
placeholder="Libraries"
|
||||
@ -42,6 +43,7 @@
|
||||
<clr-tree-node *ngIf="library['tables']" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchTreeInput
|
||||
placeholder="Tables"
|
||||
@ -85,6 +87,7 @@
|
||||
<clr-tree-node *ngIf="libTable['columns']" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchTreeInput
|
||||
placeholder="Columns"
|
||||
@ -138,7 +141,9 @@
|
||||
size="60"
|
||||
class="is-info icon-dc-fill"
|
||||
></clr-icon>
|
||||
<h3 class="text-center color-gray">Please select a column or table</h3>
|
||||
<p class="text-center color-gray mt-10" cds-text="section">
|
||||
Please select a column or table
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<ng-container *ngIf="column || table">
|
||||
@ -180,13 +185,13 @@
|
||||
<button
|
||||
(click)="limitDotDepth = true"
|
||||
type="button"
|
||||
class="btn btn-outline"
|
||||
class="btn btn-outline mr-5"
|
||||
>
|
||||
Limit depth
|
||||
</button>
|
||||
|
||||
<!-- <button class="btn btn-outline" (click)='showSvg()'> Open in New Tab </button> -->
|
||||
<div class="btn-group d-block">
|
||||
<div class="btn-group direction d-block">
|
||||
<div
|
||||
class="radio btn"
|
||||
(click)="
|
||||
|
@ -1,6 +1,8 @@
|
||||
@import '../../colors.scss';
|
||||
|
||||
.toggle-switch input[type=checkbox]:checked+label:before {
|
||||
border-color: #314351;
|
||||
background-color: #314351!important;
|
||||
border-color: $headerBackground;
|
||||
background-color: $headerBackground !important;
|
||||
transition: .15s ease-in;
|
||||
transition-property: border-color,background-color;
|
||||
}
|
||||
@ -41,6 +43,10 @@ clr-tree-node button {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn-group.direction {
|
||||
margin-left: var(--cds-global-space-6);
|
||||
}
|
||||
|
||||
.graph-render-spinner {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
@ -22,6 +22,7 @@
|
||||
<clr-tree-node *ngIf="metaDataList" class="search-node">
|
||||
<div class="tree-search-wrapper">
|
||||
<input
|
||||
appStealFocus
|
||||
clrInput
|
||||
#searchLibTreeInput
|
||||
placeholder="search SAS Types"
|
||||
@ -72,7 +73,9 @@
|
||||
size="60"
|
||||
class="is-info icon-dc-fill"
|
||||
></clr-icon>
|
||||
<h3 class="text-center color-gray">Please select a type</h3>
|
||||
<p class="text-center color-gray mt-10" cds-text="section">
|
||||
Please select a type
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="loadingSpinner" *ngIf="loading">
|
||||
@ -123,12 +126,18 @@
|
||||
[class.object-header]="!entry.count"
|
||||
class="full-width"
|
||||
>
|
||||
<clr-icon
|
||||
*ngIf="!entry.count"
|
||||
shape="rack-server"
|
||||
></clr-icon>
|
||||
<clr-icon *ngIf="entry.count" shape="block"></clr-icon>
|
||||
{{ entry.display }}
|
||||
<div>
|
||||
<clr-icon
|
||||
*ngIf="!entry.count"
|
||||
shape="rack-server"
|
||||
></clr-icon>
|
||||
<clr-icon
|
||||
*ngIf="entry.count"
|
||||
shape="block"
|
||||
></clr-icon>
|
||||
{{ entry.display }}
|
||||
</div>
|
||||
|
||||
<p class="float-right object-uri" *ngIf="!entry.count">
|
||||
{{ entry.URI }}
|
||||
</p>
|
||||
@ -163,9 +172,15 @@
|
||||
[clrExpandable]="true"
|
||||
>
|
||||
<div [class.object-header]="!entry.count" class="full-width">
|
||||
<clr-icon *ngIf="!entry.count" shape="rack-server"></clr-icon>
|
||||
<clr-icon *ngIf="entry.count" shape="block"></clr-icon>
|
||||
{{ entry.display }}
|
||||
<div>
|
||||
<clr-icon
|
||||
*ngIf="!entry.count"
|
||||
shape="rack-server"
|
||||
></clr-icon>
|
||||
<clr-icon *ngIf="entry.count" shape="block"></clr-icon>
|
||||
{{ entry.display }}
|
||||
</div>
|
||||
|
||||
<p class="float-right object-uri" *ngIf="!entry.count">
|
||||
{{ entry.URI }}
|
||||
</p>
|
||||
|
@ -1,14 +1,27 @@
|
||||
::ng-deep body[cds-theme="dark"] {
|
||||
.object-header:hover {
|
||||
background-color: #405560;
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep body[cds-theme="light"] {
|
||||
.objects-col {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.object-header:hover {
|
||||
background-color: #d8e3e9;
|
||||
}
|
||||
}
|
||||
|
||||
.objects-col{
|
||||
height: 75vh;
|
||||
overflow: scroll;
|
||||
border: 1px solid #cccccc;
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.cols-head {
|
||||
background: #fafafa;
|
||||
border: 1px solid #cccccc;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
@ -40,11 +53,13 @@
|
||||
margin-top: 5px;
|
||||
}
|
||||
.object-header{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding-left: 3px;
|
||||
padding-right: 3px;
|
||||
}
|
||||
.object-header:hover{
|
||||
background-color: #d8e3e9;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.datagrid-host{
|
||||
|
9
client/src/app/models/AppSettings.ts
Normal file
9
client/src/app/models/AppSettings.ts
Normal file
@ -0,0 +1,9 @@
|
||||
export interface AppSettings {
|
||||
persistSelectedTheme: boolean
|
||||
selectedTheme: AppThemes
|
||||
}
|
||||
|
||||
export enum AppThemes {
|
||||
light = 'light',
|
||||
dark = 'dark'
|
||||
}
|
@ -1,3 +1,25 @@
|
||||
::ng-deep {
|
||||
body[cds-theme="dark"] {
|
||||
.clause-logic {
|
||||
background: #192a30;
|
||||
}
|
||||
|
||||
.clause-query {
|
||||
background: #263e48;
|
||||
}
|
||||
}
|
||||
|
||||
body[cds-theme="light"] {
|
||||
.clause-logic {
|
||||
background: #e9e9e9;
|
||||
}
|
||||
|
||||
.clause-query {
|
||||
background: #fbf8f8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
|
||||
@ -9,13 +31,12 @@
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
background: #e9e9e9;
|
||||
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.clause-query {
|
||||
padding: 30px 0px 20px 20px;
|
||||
background: #fbf8f8;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
@ -220,8 +241,11 @@
|
||||
vertical-align: middle;
|
||||
margin: 0;
|
||||
}
|
||||
:not(pre) > code[class*="language-"], pre[class*="language-"] {
|
||||
background-color: #fbf8f8;
|
||||
|
||||
::ng-deep body[cds-theme="dark"] {
|
||||
.line-numbers {
|
||||
border-color: #989797 !important;
|
||||
}
|
||||
}
|
||||
|
||||
pre[class*="language-"] {
|
||||
|