C:/GoDev/src/TCSTK-Angular/projects/tibco-tcstk/tc-liveapps-lib/src/lib/components/live-apps-application-configuration/live-apps-application-configuration.component.ts
Manages summary card configuration
<tcla-live-apps-application-configuration></tcla-live-apps-application-configuration>
selector | tcla-live-apps-application-configuration |
styleUrls | ./live-apps-application-configuration.component.css |
templateUrl | ./live-apps-application-configuration.component.html |
Properties |
|
Methods |
Inputs |
Outputs |
HostListeners |
constructor(http: HttpClient, sanitizer: DomSanitizer, liveapps: LiveAppsService, caseCardConfigService: TcCaseCardConfigService, documentsService: TcDocumentService, dialog: MatDialog, location: Location)
|
||||||||||||||||||||||||
Parameters :
|
appId | |
Type : string
|
|
The LA Application Id |
appTypeLabel | |
Type : string
|
|
The label shown above the case type in the configuration widget |
folderId | |
Type : string
|
|
The organisation folder to store/retrieve documents |
sandboxId | |
Type : number
|
|
sandboxId - this comes from claims resolver |
uiAppId | |
Type : string
|
|
The Application ID of the UI (should ideally be unique as it is shared state key) |
window:resize |
Arguments : '$event'
|
window:resize(event)
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:45
|
ngOnChanges | ||||||
ngOnChanges(changes: SimpleChanges)
|
||||||
Parameters :
Returns :
void
|
Public openDialog | |||||||||
openDialog(state: CaseTypeState, isCaseType: boolean)
|
|||||||||
Parameters :
Returns :
void
|
Public uploadFile | ||||||||||||
uploadFile(file: File, state: CaseTypeState, isStateIcon: boolean)
|
||||||||||||
Parameters :
Returns :
void
|
ngAfterViewInit |
ngAfterViewInit()
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:91
|
Returns :
void
|
ngOnDestroy |
ngOnDestroy()
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:99
|
Returns :
void
|
ngOnInit |
ngOnInit()
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:104
|
Returns :
void
|
setupWidthObserver |
setupWidthObserver()
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:70
|
Returns :
void
|
Public caseCardConfig |
Type : CaseCardConfig
|
Public caseCardConfigService |
Type : TcCaseCardConfigService
|
caseSummaryComponent |
Type : QueryList<LiveAppsCaseSummaryComponent>
|
Decorators :
@ViewChildren(LiveAppsCaseSummaryComponent)
|
Public caseTypeColor |
Type : string
|
Public caseTypeIcon |
Type : string
|
Public DEFAULT_CASE_STATE_COLOR |
Default value : DEFAULT_STATE_COLOR
|
Public DEFAULT_CASE_STATE_ICON |
Type : string
|
Default value : 'assets/icons/ic-generic-state.svg'
|
Public DEFAULT_CASE_TYPE_COLOR |
Default value : DEFAULT_TYPE_COLOR
|
Public DEFAULT_CASE_TYPE_ICON |
Type : string
|
Default value : 'assets/icons/ic-generic-casetype.svg'
|
Public DEFAULT_COLOR_PALETTE |
Default value : DEFAULT_COLORS
|
Public dialog |
Type : MatDialog
|
Public errorMessage |
Type : string
|
Public getConfigForCaseType |
Default value : () => {...}
|
Public getConfigForState |
Default value : () => {...}
|
Public handleCaseTypeColorToggleChange |
Default value : () => {...}
|
Public refresh |
Default value : () => {...}
|
Public selectedCaseTypeConfig |
Type : IconMap
|
Public selectedStateConfig |
Type : IconMap
|
Public selectState |
Default value : () => {...}
|
Public setCaseTypeFill |
Default value : () => {...}
|
Public setFill |
Default value : () => {...}
|
Public setNewCaseTypeIcon |
Default value : () => {...}
|
Public setNewStateIcon |
Default value : () => {...}
|
stateIconComponents |
Type : QueryList<LiveAppsStateIconComponent>
|
Decorators :
@ViewChildren('iconcomp')
|
Public updateIconMap |
Default value : () => {...}
|
Protected _destroyed$ |
Default value : new Subject()
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:39
|
componentChildDivs |
Type : LiveAppsComponent[]
|
Decorators :
@ViewChildren('componentChildDiv')
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:36
|
componentDiv |
Type : ElementRef
|
Decorators :
@ViewChild('componentDiv', {static: false})
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:35
|
Protected containerChanges$ |
Type : Observable<TcComponent>
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:40
|
Private observer |
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:42
|
Public resize |
Default value : () => {...}
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:56
|
Public widget |
Type : TcComponent
|
Inherited from
LiveAppsComponent
|
Defined in
LiveAppsComponent:41
|
import {
Component,
EventEmitter,
Inject,
Input,
OnChanges,
Output,
QueryList, SimpleChanges,
ViewChildren
} from '@angular/core';
import {LiveAppsService} from '../../services/live-apps.service';
import {CaseTypeState, IconMap} from '../../models/liveappsdata';
import { take, takeUntil} from 'rxjs/operators';
import {HttpClient} from '@angular/common/http';
import {DomSanitizer} from '@angular/platform-browser';
import {LiveAppsStateIconComponent} from '../live-apps-state-icon/live-apps-state-icon.component';
import {LiveAppsCaseSummaryComponent} from '../live-apps-case-summary/live-apps-case-summary.component';
import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material/dialog';
import { Location } from '@angular/common';
import {LiveAppsComponent} from '../live-apps-component/live-apps-component.component';
import {CaseCardConfig} from '../../models/tc-case-card-config';
import {DEFAULT_COLORS, DEFAULT_STATE_COLOR, DEFAULT_TYPE_COLOR, TcCaseCardConfigService} from '../../services/tc-case-card-config.service';
import {TcDocumentService} from '../../services/tc-document.service';
/**
* Manages summary card configuration
*
*@example <tcla-live-apps-application-configuration></tcla-live-apps-application-configuration>
*/
@Component({
selector: 'tcla-live-apps-application-configuration',
templateUrl: './live-apps-application-configuration.component.html',
styleUrls: ['./live-apps-application-configuration.component.css']
})
export class LiveAppsApplicationConfigurationComponent extends LiveAppsComponent implements OnChanges {
// The ViewChild declarations give access to components marked on the template so that I can call public functions like refresh
@ViewChildren('iconcomp') stateIconComponents: QueryList<LiveAppsStateIconComponent>;
@ViewChildren(LiveAppsCaseSummaryComponent) caseSummaryComponent: QueryList<LiveAppsCaseSummaryComponent>;
/**
* The LA Application Id
*/
@Input() appId: string;
/**
* The label shown above the case type in the configuration widget
*/
@Input() appTypeLabel: string;
/**
* sandboxId - this comes from claims resolver
*/
@Input() sandboxId: number;
/**
* The Application ID of the UI (should ideally be unique as it is shared state key)
*/
@Input() uiAppId: string;
/**
* The organisation folder to store/retrieve documents
*/
@Input() folderId: string;
/**
* ~event configChanged : Configuration values changed
* ~payload CaseCardConfig : CaseCardConfig object when configuration is changed (so called can do a save with data)
*/
@Output() configChanged: EventEmitter<CaseCardConfig> = new EventEmitter<CaseCardConfig>();
public errorMessage: string;
public caseCardConfig: CaseCardConfig;
public selectedStateConfig: IconMap;
public selectedCaseTypeConfig: IconMap;
public caseTypeIcon: string;
public caseTypeColor: string;
// prepareExternalUrl will add the base href
public DEFAULT_CASE_TYPE_ICON = 'assets/icons/ic-generic-casetype.svg';
public DEFAULT_CASE_TYPE_COLOR = DEFAULT_TYPE_COLOR;
public DEFAULT_CASE_STATE_ICON = 'assets/icons/ic-generic-state.svg';
public DEFAULT_CASE_STATE_COLOR = DEFAULT_STATE_COLOR;
public DEFAULT_COLOR_PALETTE = DEFAULT_COLORS;
public getConfigForState = (state: CaseTypeState): IconMap => {
let reqIconMap: IconMap;
if (this.caseCardConfig.cardConfig && this.caseCardConfig.cardConfig.stateMap) {
this.caseCardConfig.cardConfig.stateMap.forEach((stateMap) => {
if (stateMap.state === state.value) {
reqIconMap = stateMap;
}
});
}
return reqIconMap ? reqIconMap : new IconMap(false, state.value, this.DEFAULT_CASE_STATE_COLOR, this.DEFAULT_CASE_STATE_ICON);
}
public getConfigForCaseType = (caseTypeId: string): IconMap => {
let reqIconMap: IconMap;
if (this.caseCardConfig.cardConfig && this.caseCardConfig.cardConfig.stateMap) {
this.caseCardConfig.cardConfig.stateMap.forEach((stateMap) => {
if (stateMap.isCaseType) {
reqIconMap = stateMap;
}
});
}
return reqIconMap ? reqIconMap : new IconMap(true, caseTypeId, this.DEFAULT_CASE_TYPE_COLOR, this.DEFAULT_CASE_TYPE_ICON);
}
public updateIconMap = (stateConfig: IconMap) => {
let foundMap: IconMap;
if (this.caseCardConfig.cardConfig && this.caseCardConfig.cardConfig.stateMap) {
this.caseCardConfig.cardConfig.stateMap.forEach(function(stateMap) {
if (stateMap.state === stateConfig.state) {
foundMap = stateConfig;
stateMap.state = stateConfig.state;
stateMap.icon = stateConfig.icon;
stateMap.fill = stateConfig.fill;
}
});
if (foundMap) {
foundMap = stateConfig;
} else {
this.caseCardConfig.cardConfig.stateMap.push(stateConfig);
}
} else {
this.caseCardConfig.cardConfig.stateMap = [];
this.caseCardConfig.cardConfig.stateMap.push(stateConfig);
}
this.configChanged.emit(this.caseCardConfig);
}
public handleCaseTypeColorToggleChange = (changes) => {
this.caseCardConfig.cardConfig.useCaseTypeColor = changes.checked ? changes.checked : false;
// if (changes.checked) {
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
// comp.restylePreview(this.selectedStateConfig.icon, this.caseTypeColor);
comp.togglePreviewUseCaseTypeColor(changes.checked);
});
// }
this.configChanged.emit(this.caseCardConfig);
}
public setFill = (fill, stateConfig: IconMap) => {
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
comp.restylePreview(stateConfig.icon, fill);
});
this.stateIconComponents.find(function(comp) {
return comp.id === stateConfig.state;
}).refillSVG(fill);
this.configChanged.emit(this.caseCardConfig);
}
public setCaseTypeFill = (fill, stateConfig: IconMap) => {
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
comp.restylePreviewCaseType(stateConfig.icon, fill);
});
this.stateIconComponents.find(function(comp) {
return (comp.id === stateConfig.state && stateConfig.isCaseType);
}).refillSVG(fill);
this.configChanged.emit(this.caseCardConfig);
}
public selectState = (state: CaseTypeState) => {
this.selectedStateConfig = this.getConfigForState(state);
if (!this.caseCardConfig.cardConfig.useCaseTypeColor) {
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
comp.restylePreview(this.selectedStateConfig.icon, this.selectedStateConfig.fill);
});
}
}
/*public saveConfig = () => {
this.caseCardConfigService.updateCaseCardConfig(this.sandboxId, this.appId, this.uiAppId, this.caseCardConfig)
.pipe(
take(1),
takeUntil(this._destroyed$),
map(caseCardConfig => {
this.caseCardConfig = caseCardConfig;
})
).subscribe(null, error => { console.log('Unable to update case card config: ' + error.errorMsg); }
);
}*/
public openDialog(state: CaseTypeState, isCaseType: boolean): void {
if (!isCaseType) {
this.selectState(state);
} else {
state = new CaseTypeState().deserialize({ value: this.appTypeLabel });
}
const dialogRef = this.dialog.open(LiveAppsStateIconUploadDialogComponent, {
width: '500px',
data: { state: state, isCaseType: isCaseType }
});
dialogRef.componentInstance.fileevent.subscribe(($e) => {
this.uploadFile($e.file, $e.state, $e.isCaseType);
})
dialogRef.afterClosed().subscribe(result => {
});
}
public setNewStateIcon = (url) => {
this.selectedStateConfig.icon = url;
this.stateIconComponents.find((comp: LiveAppsStateIconComponent) => {
return (comp.id === this.selectedStateConfig.state);
}).refresh(this.selectedStateConfig.icon, this.selectedStateConfig.fill);
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
comp.restylePreview(this.selectedStateConfig.icon, this.selectedStateConfig.fill);
});
this.updateIconMap(this.selectedStateConfig);
}
public setNewCaseTypeIcon = (url) => {
this.caseTypeIcon = url;
this.stateIconComponents.find((comp: LiveAppsStateIconComponent) => {
return (comp.id === this.appTypeLabel);
}).refresh(this.caseTypeIcon, this.caseTypeColor);
this.caseSummaryComponent.forEach((comp: LiveAppsCaseSummaryComponent) => {
comp.restylePreviewCaseType(this.caseTypeIcon, this.caseTypeColor);
});
this.updateIconMap(new IconMap(true, this.appTypeLabel, this.caseTypeColor, this.caseTypeIcon));
}
public uploadFile(file: File, state: CaseTypeState, isStateIcon: boolean) {
if (file) {
const url = 'webresource/v1/orgFolders/' + this.folderId + '/' + this.appId + '.' + file.name;
const dlUrl = 'webresource/orgFolders/' + this.folderId + '/' + this.appId + '.' + file.name;
this.liveapps.clearFromIconSVGTextCache(url);
this.documentsService.uploadDocument('orgFolders', this.folderId, this.sandboxId,
file, (this.appId + '.' + file.name), '')
.subscribe(
val => {
if (!isStateIcon) {
this.setNewStateIcon(dlUrl);
} else {
this.setNewCaseTypeIcon(dlUrl);
}
},
error => { console.log('error'); this.errorMessage = 'Error uploading state icon: ' + error.errorMsg; });
}
}
public refresh = () => {
// need states & cardConfig
this.selectedCaseTypeConfig = null;
this.caseCardConfigService.getCaseCardConfig(this.sandboxId, this.appId, this.uiAppId, this.appTypeLabel, this.DEFAULT_CASE_TYPE_COLOR, this.DEFAULT_CASE_TYPE_ICON, this.DEFAULT_CASE_STATE_COLOR, this.DEFAULT_CASE_STATE_ICON).pipe(
take(1),
takeUntil(this._destroyed$)
).subscribe(
caseCardConfig => {
this.caseCardConfig = caseCardConfig;
// set default selected to first state for this case type (0 is case type)
this.selectedStateConfig = this.caseCardConfig.cardConfig.stateMap[1];
const caseTypeRec = this.caseCardConfig.cardConfig.stateMap.find(function(stateMap) {
return stateMap.isCaseType;
});
this.caseTypeIcon = caseTypeRec.icon;
this.caseTypeColor = caseTypeRec.fill;
this.selectedCaseTypeConfig = this.getConfigForCaseType(this.appTypeLabel);
}, error => { this.errorMessage = 'Error retrieving case card config: ' + error.error.errorMsg; });
}
constructor(protected http: HttpClient, protected sanitizer: DomSanitizer,
protected liveapps: LiveAppsService, public caseCardConfigService: TcCaseCardConfigService, protected documentsService: TcDocumentService, public dialog: MatDialog, protected location: Location) {
super();
}
ngOnChanges(changes: SimpleChanges) {
if (changes.appId && (changes.appId.currentValue !== changes.appId.previousValue)) {
this.refresh();
}
}
}
@Component({
selector: 'tcla-live-apps-state-icon-upload-dialog',
templateUrl: 'upload-file-dialog/app-live-apps-state-icon-upload-dialog.html',
styleUrls: [ 'upload-file-dialog/app-live-apps-state-icon-upload-dialog.css']
})
export class LiveAppsStateIconUploadDialogComponent {
@Output() fileevent = new EventEmitter<any>();
public fileToUpload: File = undefined;
public description: string = undefined;
public fileText: string;
constructor(
public dialogRef: MatDialogRef<LiveAppsStateIconUploadDialogComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {}
public uploadFile = () => {
if (this.fileToUpload) {
this.fileevent.emit({ file: this.fileToUpload, state: this.data.state, isCaseType: this.data.isCaseType } );
this.dialogRef.close();
}
}
setFileDescription(description: string) {
this.description = description;
}
attachFile(files: FileList) {
this.fileToUpload = files.item(0);
/*const myReader: FileReader = new FileReader();
myReader.readAsText(this.fileToUpload);
this.fileText = myReader.result.toString();*/
}
onNoClick(): void {
this.dialogRef.close();
}
}
<div *ngIf="appId" class="tcs-case-card-customization" fxLayout="column">
<div fxLayout="row" fxLayoutAlign="space-around stretch" fxFlex>
<div fxLayout="column" fxLayoutAlign="start center" fxFlex>
<div fxLayout="column" fxLayoutAlign="start center">
<div class="tcs-case-card-customization-section-text">Preview</div>
</div>
<div class="tcs-case-card-customization-preview" fxLayout="column" fxLayoutAlign="start center" fxFlex>
<div *ngIf="selectedStateConfig && caseTypeColor && caseTypeIcon" style="border-radius: 3px; margin: 5px;" fxLayout="column" fxLayoutAlign="space-around center">
<tcla-live-apps-case-summary style="margin: 5px;" [displayType]="'card'" [typeBar]="true" [configMode]="true" [configModeColor]="selectedStateConfig.fill" [configModeIcon]="selectedStateConfig.icon" [configModeCaseTypeColor]="caseTypeColor" [configModeCaseTypeIcon]="caseTypeIcon" [configModeAppTypeLabel]="appTypeLabel" [configModeUseCaseTypeColor]="caseCardConfig.cardConfig.useCaseTypeColor"></tcla-live-apps-case-summary>
<tcla-live-apps-case-summary style="margin: 5px;" [displayType]="'miniCard'" [typeBar]="true" [configMode]="true" [configModeColor]="selectedStateConfig.fill" [configModeIcon]="selectedStateConfig.icon" [configModeCaseTypeColor]="caseTypeColor" [configModeCaseTypeIcon]="caseTypeIcon" [configModeAppTypeLabel]="appTypeLabel" [configModeUseCaseTypeColor]="caseCardConfig.cardConfig.useCaseTypeColor"></tcla-live-apps-case-summary>
</div>
</div>
</div>
<div class="tcs-case-card-customization-divider"></div>
<div fxLayout="column" fxLayoutAlign="start center" fxFlex>
<div fxLayout="column" fxLayoutAlign="start center">
<div class="tcs-case-card-customization-section-text">Configure Icons</div>
</div>
<div fxFlex>
<div fxFlex class="tcs-case-states-list" *ngIf="caseCardConfig && caseCardConfig.cardConfig && caseCardConfig.states" fxLayout="column" fxLayoutAlign="start center">
<div class="tcs-case-states-list-inner">
<div class="case-type-color-toggle">
<div fxLayout="row" fxLayoutAlign="space-between center">
<mat-slide-toggle
class="use-case-type-color"
[labelPosition]="'before'"
[checked]="caseCardConfig.cardConfig.useCaseTypeColor"
(change)="handleCaseTypeColorToggleChange($event)">
Use Case Type Color for color bar
</mat-slide-toggle>
</div>
</div>
<div class="tcs-case-states-list-row">
<div fxLayout="row" fxLayoutAlign="space-between center">
<div fxLayoutAlign="start center" style="min-width: 170px;">Case Type Icon</div>
<tcla-live-apps-state-icon style="margin-left: 10px; margin-right: 10px; min-width: 14px;" #iconcomp [id]="appTypeLabel" [iconPath]="selectedCaseTypeConfig.icon" [color]="selectedCaseTypeConfig.fill"
[appId]="appId" [(colorPicker)]="selectedCaseTypeConfig.fill" (colorPickerChange)="setCaseTypeFill($event, selectedCaseTypeConfig)" [cpPresetColors]="DEFAULT_COLOR_PALETTE" [cpPositionOffset]="'-40%'"
matTooltip="Click to change color" matTooltipShowDelay="1000" matTooltipPosition="below">
</tcla-live-apps-state-icon>
<mat-icon (click)="openDialog(null, true)" class="tcs-icon tcs-icon-active tcs-config-button tcs-document-upload-button" svgIcon="tcs-document-upload"
matTooltip="Click to upload new icon" matTooltipShowDelay="1000" matTooltipPosition="below">
</mat-icon>
<mat-icon class="tcs-icon tcs-icon-active tcs-config-button-placeholder"></mat-icon>
</div>
</div>
<div class="tcs-case-states-icon-divider"></div>
<!-- case state icons -->
<div *ngFor="let state of caseCardConfig.states" class="tcs-case-states-list-row" (click)="selectState(state)">
<div *ngIf="getConfigForState(state); let stateConfig;">
<div fxLayout="row" fxLayoutAlign="space-between center">
<div fxLayoutAlign="start center" style="min-width: 170px;">{{state.label | ellipsis: 25}}</div>
<tcla-live-apps-state-icon style="margin-left: 10px; margin-right: 10px; min-width: 14px;" #iconcomp [id]="state.value" [iconPath]="stateConfig.icon" [color]="stateConfig.fill"
[appId]="appId" [(colorPicker)]="stateConfig.fill" (colorPickerChange)="setFill($event, stateConfig)" [cpPresetColors]="DEFAULT_COLOR_PALETTE" [cpPositionOffset]="'-40%'"
matTooltip="Click to change color" matTooltipShowDelay="1000" matTooltipPosition="below">
</tcla-live-apps-state-icon>
<mat-icon (click)="openDialog(state, false)" class="tcs-icon tcs-icon-active tcs-config-button tcs-document-upload-button" svgIcon="tcs-document-upload"
matTooltip="Click to upload new icon" matTooltipShowDelay="1000" matTooltipPosition="below">
</mat-icon>
<mat-icon class="tcs-icon tcs-icon-active tcs-config-button-placeholder"></mat-icon>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--div class="tcs-case-card-customization-footer" fxLayout="column" fxLayoutAlign="end stretch">
<div class="tcs-case-card-customization-action-buttons" fxLayout="row" fxLayoutAlign="center center">
<button class="tcs-save-app-config-button" mat-button (click)="saveConfig()" type="submit">Save Configuration</button>
</div>
</div-->
</div>
./live-apps-application-configuration.component.css
.tcs-case-card-customization {
min-width: 775px;
min-height: 370px;
/* border-radius: 3px; */
/* box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.33);*/
background-color: #ffffff;
}
.tcs-case-card-customization * {
font-family: Source Sans Pro;
font-size: 12px;
font-weight: normal;
font-style: normal;
font-stretch: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: #000000;
}
.case-type-color-toggle {
margin-bottom: 10px;
margin-top: 10px;
}
.tcs-case-card-customization-header {
height: 40px;
border-radius: 3px 3px 0px 0px;
box-shadow: 0 1px 2px 0 #dedede;
padding-left: 20px;
padding-right: 20px;
}
.tcs-case-card-customization .tcs-case-card-customization-header-text {
font-family: Source Sans Pro;
font-size: 18px;
font-weight: 600;
font-style: normal;
font-stretch: normal;
line-height: 1.5;
letter-spacing: 0.3px;
text-align: left;
color: black;
margin-left: 10px;
}
.tcs-case-card-customization-action-buttons {
margin-top: 10px;
margin-bottom: 10px;
}
.tcs-case-card-customization-divider {
padding: 0px;
margin-top: 4px;
margin-bottom: 0px;
margin-left:5px;
margin-right: 5px;
border-left-color: #f4f4f4;
border-left-width: 1.1px;
border-left-style: solid;
}
.tcs-case-card-customization .tcs-case-card-customization-section-text {
font-family: Source Sans Pro;
font-size: 18px;
font-weight: 600;
font-style: normal;
font-stretch: normal;
line-height: normal;
letter-spacing: normal;
color: black;
}
.tcs-case-states-list {
margin: 5px;
}
.tcs-case-states-list-inner {
overflow-y: auto;
}
.tcs-case-card-customization-preview {
/*margin: 20px;*/
}
.tcs-case-card-customization-preview app-live-apps-case-summary {
overflow-y: auto;
}
.tcs-case-states-list-row {
border-radius: 3px;
padding: 3px;
margin-left: 15px;
margin-right: 15px;
}
.tcs-case-states-list-row:hover {
transition: background-color 0.5s;
background-color: #EEF0F7;
}
.tcs-icon-active.tcs-config-button {
display: none;
}
.tcs-icon-active.tcs-config-button-placeholder {
display: inline-block;
width: 24px;
}
.tcs-case-states-list-row:hover .tcs-icon-active.tcs-config-button {
display: inline-block;
}
.tcs-case-states-list-row:hover .tcs-icon-active.tcs-config-button-placeholder {
display: none;
}
.tcs-case-states-icon-divider {
padding: 0px;
margin-top: 2px;
margin-bottom: 4px;
margin-left:10px;
margin-right: 15px;
border-bottom-color: #f4f4f4;
border-bottom-width: 1.1px;
border-bottom-style: solid;
}
.tcs-save-app-config-button {
height: 35px;
}