File

C:/GoDev/src/TCSTK-Angular/projects/tibco-tcstk/tc-liveapps-lib/src/lib/components/live-apps-application-configuration/live-apps-application-configuration.component.ts

Description

Manages summary card configuration

Extends

LiveAppsComponent

Implements

OnChanges

Example

<tcla-live-apps-application-configuration></tcla-live-apps-application-configuration>

Metadata

selector tcla-live-apps-application-configuration
styleUrls ./live-apps-application-configuration.component.css
templateUrl ./live-apps-application-configuration.component.html

Index

Properties
Methods
Inputs
Outputs
HostListeners

Constructor

constructor(http: HttpClient, sanitizer: DomSanitizer, liveapps: LiveAppsService, caseCardConfigService: TcCaseCardConfigService, documentsService: TcDocumentService, dialog: MatDialog, location: Location)
Parameters :
Name Type Optional
http HttpClient No
sanitizer DomSanitizer No
liveapps LiveAppsService No
caseCardConfigService TcCaseCardConfigService No
documentsService TcDocumentService No
dialog MatDialog No
location Location No

Inputs

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)

Outputs

configChanged
Type : EventEmitter<CaseCardConfig>

~event configChanged : Configuration values changed ~payload CaseCardConfig : CaseCardConfig object when configuration is changed (so called can do a save with data)

HostListeners

window:resize
Arguments : '$event'
window:resize(event)
Inherited from LiveAppsComponent

Methods

ngOnChanges
ngOnChanges(changes: SimpleChanges)
Parameters :
Name Type Optional
changes SimpleChanges No
Returns : void
Public openDialog
openDialog(state: CaseTypeState, isCaseType: boolean)
Parameters :
Name Type Optional
state CaseTypeState No
isCaseType boolean No
Returns : void
Public uploadFile
uploadFile(file: File, state: CaseTypeState, isStateIcon: boolean)
Parameters :
Name Type Optional
file File No
state CaseTypeState No
isStateIcon boolean No
Returns : void
ngAfterViewInit
ngAfterViewInit()
Inherited from LiveAppsComponent
Returns : void
ngOnDestroy
ngOnDestroy()
Inherited from LiveAppsComponent
Returns : void
ngOnInit
ngOnInit()
Inherited from LiveAppsComponent
Returns : void
setupWidthObserver
setupWidthObserver()
Inherited from LiveAppsComponent
Returns : void

Properties

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
componentChildDivs
Type : LiveAppsComponent[]
Decorators :
@ViewChildren('componentChildDiv')
Inherited from LiveAppsComponent
componentDiv
Type : ElementRef
Decorators :
@ViewChild('componentDiv', {static: false})
Inherited from LiveAppsComponent
Protected containerChanges$
Type : Observable<TcComponent>
Inherited from LiveAppsComponent
Private observer
Inherited from LiveAppsComponent
Public resize
Default value : () => {...}
Inherited from LiveAppsComponent
Public widget
Type : TcComponent
Inherited from LiveAppsComponent
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;
}
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""