Merge branch 'main' into handonstable-14
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 1m32s

This commit is contained in:
allan 2024-05-31 11:39:14 +00:00
commit 7853f7cb6a
73 changed files with 2192 additions and 1446 deletions

View File

@ -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: |

View File

@ -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
View File

@ -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

View File

@ -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)

2162
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -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": {

View File

@ -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;
}
}

View File

@ -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',

View File

@ -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 {}

View File

@ -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 {}

View 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()
}
}

View File

@ -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

View File

@ -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;

View File

@ -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&#64;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

View File

@ -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 {

View File

@ -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,

View File

@ -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')
}
}

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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)="

View File

@ -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;

View File

@ -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>

View File

@ -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{

View File

@ -0,0 +1,9 @@
export interface AppSettings {
persistSelectedTheme: boolean
selectedTheme: AppThemes
}
export enum AppThemes {
light = 'light',
dark = 'dark'
}

View File

@ -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-"] {