Added minimal functionality for Robot teaching

- Added minimal HMI
- Added possibility to open and close all chamber doors
This commit is contained in:
2026-01-17 09:20:39 +01:00
parent 9f058db2a3
commit 2d11c43579
2274 changed files with 912690 additions and 162 deletions

View File

@@ -0,0 +1,215 @@
/**
* Popup
*/
.TcHmi_Controls_Helpers_Popup {
display: flex;
flex-direction: column;
box-sizing: border-box;
overflow: hidden;
position: absolute;
}
.TcHmi_Controls_Helpers_Popup-content
.TcHmi_Controls_System_TcHmiControl:not(.TcHmi_Controls_System_TcHmiControl .TcHmi_Controls_System_TcHmiControl) {
position: relative;
}
.TcHmi_Controls_Helpers_Popup-header-container {
position: relative;
display: grid;
grid-template-columns: auto min-content;
margin-top: 0px;
min-height: 26px;
padding: 5px 10px;
}
.TcHmi_Controls_Helpers_Popup-header-container > h1 {
margin: 0;
white-space: nowrap;
overflow: hidden;
}
.TcHmi_Controls_Helpers_Popup-content {
position: relative;
flex-grow: 1;
flex-shrink: 1;
overflow: auto;
padding: 10px;
}
.TcHmi_Controls_Helpers_Popup-label-block {
display: block;
white-space: pre;
margin-bottom: 2px;
}
.TcHmi_Controls_Helpers_Popup-label-block:not(:first-child) {
margin-top: 10px;
}
.TcHmi_Controls_Helpers_Popup-footer {
position: relative;
display: flex;
justify-content: flex-end;
}
.TcHmi_Controls_Helpers_Popup-footer:not(:empty) {
padding-left: 10px;
padding-right: 10px;
padding-bottom: 10px;
}
.TcHmi_Controls_Helpers_Popup-footer .TcHmi_Controls_System_TcHmiControl {
position: relative;
}
.TcHmi_Controls_Helpers_Popup-footer .TcHmi_Controls_System_TcHmiControl:not(:first-child) {
margin-left: 5px;
}
/**
* TextAndButtonsPrompt
*/
.TcHmi_Controls_Helpers_Popup-TextAndButtonsPrompt .TcHmi_Controls_Helpers_Popup-content {
white-space: pre;
}
/**
* FilterPrompt
*/
.TcHmi_Controls_Helpers_FilterPrompt-popup .TcHmi_Controls_Helpers_Popup-content {
display: flex;
flex-direction: column;
}
.TcHmi_Controls_Helpers_FilterPrompt-popup
.TcHmi_Controls_Helpers_Popup-footer
.TcHmi_Controls_Beckhoff_TcHmiButton.align-left {
margin-right: auto;
}
.TcHmi_Controls_Helpers_FilterPrompt-popup .TcHmi_Controls_Helpers_Popup-content .TcHmi_Controls_Beckhoff_TcHmiButton {
position: relative;
display: inline-block;
margin-right: 5px;
}
.TcHmi_Controls_Helpers_FilterPrompt-popup .TcHmi_Controls_Helpers_FilterPrompt-template-remove-button {
margin-right: 15px;
}
.TcHmi_Controls_Helpers_FilterPrompt-popup table {
border-collapse: collapse;
}
.TcHmi_Controls_Helpers_FilterPrompt-table-header {
display: block;
overflow: hidden;
flex-shrink: 0;
position: relative;
}
.TcHmi_Controls_Helpers_FilterPrompt-table-header th {
height: 30px;
padding: 0;
box-sizing: border-box;
}
.TcHmi_Controls_Helpers_FilterPrompt-table-header .TcHmi_Controls_Helpers_FilterPrompt-scroll-placeholder {
width: 200px;
position: absolute;
}
.TcHmi_Controls_Helpers_FilterPrompt-table {
overflow: auto;
display: block;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-column {
display: flex;
padding: 0;
}
.TcHmi_Controls_Helpers_FilterPrompt-selection-column {
min-width: 30px;
max-width: 30px;
}
.TcHmi_Controls_Helpers_FilterPrompt-logic-column {
min-width: 60px;
max-width: 60px;
}
.TcHmi_Controls_Helpers_FilterPrompt-path-column {
min-width: 120px;
max-width: 120px;
}
.TcHmi_Controls_Helpers_FilterPrompt-comparator-column {
min-width: 160px;
max-width: 160px;
}
.TcHmi_Controls_Helpers_FilterPrompt-value-column {
min-width: 250px;
max-width: 250px;
}
.TcHmi_Controls_Helpers_FilterPrompt-table td {
position: relative;
white-space: nowrap;
border-right: 1px solid;
border-bottom: 1px solid;
padding: 0;
height: 30px;
overflow: hidden;
cursor: default;
box-sizing: border-box;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker {
width: 5px;
height: 30px;
border-left: 1px solid;
float: left;
box-sizing: border-box;
margin-left: 4px;
margin-right: -3px;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker:last-child {
margin-right: 1px;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker.first {
border-top: 1px solid;
height: 28px;
margin-top: 2px;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker.last {
border-bottom: 1px solid;
height: 28px;
margin-bottom: 2px;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Beckhoff_TcHmiCombobox,
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Beckhoff_TcHmiTextbox,
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Beckhoff_TcHmiCheckbox,
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Beckhoff_TcHmiDateTimeInput {
top: 0;
right: 0;
bottom: 0;
left: 0;
height: 30px; /* Fix for IE who refuses to properly size absolutely positioned elements in table cells */
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Beckhoff_TcHmiButton {
margin: 0;
position: absolute;
top: 0;
right: 0;
}

View File

@@ -0,0 +1,999 @@
// Compatibility file for non-module typescript compiles without adjustments.
// Use the following line for modern code (needs adjustments to tsconfig.json#configOptions/paths)
// import { TcHmiControl } from "Beckhoff.TwinCAT.HMI.Framework/index.esm.js";
// ***************************************************************************
export declare abstract class Popup<T> {
#private;
protected readonly __parentControl?: (TcHmi.Controls.System.TcHmiControl | null) | undefined;
protected __name: string;
protected __element: HTMLDivElement;
protected __elementHeaderContainer: HTMLDivElement;
protected __elementHeader: HTMLHeadingElement;
protected __elementClose: HTMLAnchorElement;
protected __elementContent: HTMLDivElement;
protected __elementFooter: HTMLDivElement;
/** Controls in this array will be destroyed automatically when the popup is destroyed */
protected __childControls: TcHmi.Controls.System.TcHmiControl[];
/** Destroyers in this array will be called automatically when the popup is destroyed */
protected __destroyers: TcHmi.DestroyFunction[];
protected __destroyOnHide: TcHmi.DestroyFunction[];
protected __prompt: {
answer: (value: T | PromiseLike<T>) => void;
error: (reason?: Error) => void;
} | null;
protected __isShowing: boolean;
protected __onShowManager: Callback.Collection<() => void>;
onShow: Readonly<{
add: (callback: () => void) => () => void;
remove: (callback: () => void) => void;
}>;
protected __onHideManager: Callback.Collection<() => void>;
onHide: Readonly<{
add: (callback: () => void) => () => void;
remove: (callback: () => void) => void;
}>;
protected __onBoundsChangeManager: Callback.Collection<(data: {
bounds: TcHmi.UiProvider.PopupProvider.Bounds | null;
}) => void>;
onBoundsChange: Readonly<{
add: (callback: (data: {
bounds: TcHmi.UiProvider.PopupProvider.Bounds | null;
}) => void) => () => void;
remove: (callback: (data: {
bounds: TcHmi.UiProvider.PopupProvider.Bounds | null;
}) => void) => void;
}>;
protected __backgroundAction: Popup.BackgroundAction<string>;
protected __closeButton: Popup.CloseButton<string>;
protected __backgroundMode: Popup.BackgroundMode;
protected __positioningMode: Popup.PositioningMode;
protected __bounds: Popup.Bounds | null;
protected __movable: boolean;
protected __justAbove: TcHmi.TopMostLayer.IOptionsEx['justAbove'];
protected readonly __className = "TcHmi_Controls_Helpers_Popup";
protected __localizationSymbols: Map<string, {
symbol: TcHmi.Symbol<string>;
destroyWatch: TcHmi.DestroyFunction;
}>;
private static readonly __passiveEventOptions;
protected __documentMouseMoveDestroyer: TcHmi.DestroyFunction | null;
protected __documentMouseUpDestroyer: TcHmi.DestroyFunction | null;
protected __documentTouchMoveDestroyer: TcHmi.DestroyFunction | null;
protected __documentTouchEndDestroyer: TcHmi.DestroyFunction | null;
protected __documentTouchCancelDestroyer: TcHmi.DestroyFunction | null;
/** Prevents mouse event while touch interaction is in progress. */
protected __touchLock: boolean;
protected __touchLockTimeoutId: number;
/** Store active touches by their IDs. */
protected __activeTouches: Map<number, {
useForDragging: false;
} | {
useForDragging: true;
offsetLeft: number;
offsetTop: number;
}>;
protected __movingInfo: {
moving: boolean;
/** Offset from the interaction coordinates to element left side */
startLeftOffset: number;
/** Offset from the interaction coordinates to element top side */
startTopOffset: number;
/** A popup should be movable partly outside the screen but 50px should be always visible. */
minLeft: number;
/** A popup should be movable partly outside the screen but not at the top. */
minTop: number;
/** A popup should be movable partly outside the screen but 50px should be always visible. */
maxLeft: number;
/** A popup should be movable partly outside the screen but 50px should be always visible. */
maxTop: number;
};
protected __activePointerInteraction: boolean;
protected __animationFrameId: number;
protected __storage: TcHmi.LocalStorage<{
bounds: Popup.Bounds;
}, {
bounds: Popup.Bounds | null;
}> | undefined;
protected __storageSettings: TcHmi.UiProvider.PopupProvider.StorageSettings | undefined;
private __resizeObserver;
/**
* Creates a new Popup instance.
* @param __parentControl The control which owns the popup.
*/
constructor(__parentControl?: (TcHmi.Controls.System.TcHmiControl | null) | undefined);
/**
* Keeps popup visible after when the window or the popup is resized. If the popup shrinks it could disappear
* beyond the left edge of the window. If the window shrinks, the popup could disappear beyond the right or
* bottom edge.
*/
private __handleResize;
/**
* Shows the popup.
*/
show(): void;
/**
* Hides the popup.
*/
hide(): void;
/**
* Shows the popup and waits for the user to answer the prompt. A Promise is returned that will be resolved with the value the user provides.
*/
prompt(): Promise<T>;
/**
* Aborts a prompted popup and performs the given action to answer the prompt. If no action is specified, the promise is rejected.
* @param action The action to perform to answer the prompt.
*/
abort(action?: Popup.PromptAction<string>): void;
/**
* Destroys the popup and all its controls.
* @param force If true, child controls will be removed from the parent control before destruction, to ensure destruction in case of keepAlive === true.
*/
destroy(force?: boolean): void;
/**
* Gets a value indicating if the popup is currently shown to the user.
*/
isShowing(): boolean;
/**
* Gets a value indicating if the popup has a prompt that is still pending to be answered by the user.
* If that is the case, calling prompt() againg will result in an error. If the popup is not currently
* showing, you can call show() to display the popup again and wait for the user to answer the prompt.
*/
hasActivePrompt(): boolean;
/**
* Gets the root element of the popup.
*/
getElement(): HTMLDivElement;
/**
* Resets the size and position of the Popup and clears that data from localStorage.
*/
resetBounds(): void;
/**
* Sets what happens when the user clicks the background while the popup is showing, or when the prompt is
* aborted via API call. Default is { close: true }.
* @param action The action to perform. If the popup should be closed, further action can be specified.
*/
setBackgroundAction(action: Popup.BackgroundAction<string>): void;
/**
* Sets the background mode of the TopMostLayer used for displaying the popup.
* @param mode
*/
setBackgroundMode(mode: Popup.BackgroundMode): void;
/**
* Sets the positioning mode of the popup in the TopMostLayer.
* @param mode
*/
setPositioningMode(mode: Popup.PositioningMode): void;
/**
* Sets the bounds of the popup. Does only have any effect if PositioningMode.Floating is used.
* @param bounds
*/
setBounds(bounds: Popup.Bounds | null): void;
/**
* Process the given Popup.Bounds.
* @param bounds
*/
protected __processBounds(bounds: Popup.Bounds | null): void;
/**
* Sets the movable option.
* Does only have an effect when setPositioningMode is also set:
* `popup.setPositioningMode(TcHmi.UiProvider.PopupProvider.PositioningMode.Floating)`
*/
setMovable(movable: boolean): void;
/**
* Sets the local storage settings and initializes the storage.
*/
setStorageSettings(settings: TcHmi.UiProvider.PopupProvider.StorageSettings): void;
/**
* Sets if the close button should be used or not.
* @param button Defines whether to show the button and if yes, what action should be taken to answer the prompt
*/
setCloseButton(button: Popup.CloseButton<string>): void;
/**
* Sets if the close button should be used or not.
* @param show Defines whether to show the button
*/
setCloseButton(show: boolean): void;
/**
* Gets the close button configuration.
*/
getCloseButton(): _Popup.CloseButton<string>;
/**
* Performs the close action. Must be implemented by inheriting classes.
*/
protected abstract __performPromptAction(toPerform: Popup.PromptAction<string>): void;
/**
* Display the popup just above the given reference element.
* @param reference The popup will be as close as possible in the TopMostLayer stack to this element.
* @param conflictResolution If there are multiple elements that want to be just above the reference, you can
* specify in which direction conflicts should be resolved. Defaults to Up.
*/
setJustAbove(reference: Element, conflictResolution?: TcHmi.TopMostLayer.ConflictResolution): void;
/**
* Reset the justAbove handling.
* @param reference Pass null to reset the justAbove handling.
*/
setJustAbove(reference: null): void;
/**
* Returns whether the popup is currently being interacted with by mouse, touch or keyboard.
*/
hasActiveUserInteraction(): boolean;
/**
* Handles the onPressed event of the close button.
*/
protected __onCloseClick(_event: MouseEvent): void;
/**
* Handles the popup mousedown event.
*/
protected __onPopupMouseDown(event: MouseEvent): void;
/**
* Handles the document mouseup event.
*/
protected __onDocumentMouseUp(_event: MouseEvent): void;
/**
* Handles the document mousemove event.
*/
protected __onDocumentMouseMove(event: MouseEvent): void;
/**
* Handles the popup touchstart event.
*/
protected __onPopupTouchStart(event: TouchEvent): void;
/**
* Handles the document touch end and cancel events.
*/
protected __onDocumentTouchEndOrCancel(event: TouchEvent): void;
/**
* Handles the document touchmove event.
*/
protected __onDocumentTouchMove(event: TouchEvent): void;
/**
* AnimationFrame handler for drawing
*/
protected __updatePosition(): void;
/**
* Write potentially localized texts to a DOM Elements textContent property.
* @param name A name for the localized text.
* @param text The text to apply.
* @param element The element to apply the text to.
*/
protected __applyTextToElement(name: string, text: TcHmi.Localizable | null | undefined, element: Element): void;
/**
* Write potentially localized texts to a DOM Element using the given setter function.
* @param name A name for the localized text.
* @param text The text to apply.
* @param setter The setter that writes the text to the DOM.
*/
protected __applyTextToElement(name: string, text: TcHmi.Localizable | null | undefined, setter: (text: string) => void): void;
/**
* Write potentially localized texts to a control property
* @param name A name for the localized text.
* @param text The text to apply.
* @param control The control to write to.
* @param property The property name to write to.
*/
protected __applyTextToControl(name: string, text: TcHmi.Localizable | null | undefined, control: TcHmiControl.Control, property: string): void;
/**
* Watch the given symbol and call the onChange callback every time it changes with the resolved and formatted symbol value.
* @param name The name for this symbol. Must be unique across all inheritance layers and further calls for the same localization must use the same name.
* @param localization The localization to watch.
* @param onChange The callback that is called with the localized and formatted text as a parameter.
*/
protected __watchLocalization(name: string, localization: TcHmi.FormattedLocalizable, onChange: (localizedText: string) => void): void;
/**
* Destroys the localization watch with the given name, if it exists.
* @param name The name that was used with __watchLoclalization to start watching the symbol.
*/
protected __unwatchLocalization(name: string): void;
}
export declare namespace Popup {
enum PositioningMode {
Centered = 1,
Floating = 2
}
enum BackgroundMode {
None = 1,
Dimmed = 2
}
type BackgroundAction<A extends string> = {
close: false;
} | {
close: true;
action?: A;
};
type CloseButton<A extends string> = {
show: false;
} | {
show: true;
action?: A;
};
type PromptAction<A extends string> = {
action?: A;
};
interface Bounds {
width?: number | null;
widthUnit?: 'px' | '%';
height?: number | null;
heightUnit?: 'px' | '%';
left?: number | null;
leftUnit?: 'px' | '%';
top?: number | null;
topUnit?: 'px' | '%';
bottom?: number | null;
bottomUnit?: 'px' | '%';
right?: number | null;
rightUnit?: 'px' | '%';
}
}
import _Popup = Popup;
declare global {
namespace TcHmi.Controls.Helpers {
let Popup: typeof _Popup;
type Popup<T> = _Popup<T>;
namespace Popup {
type PositioningMode = _Popup.PositioningMode;
type BackgroundMode = _Popup.BackgroundMode;
type BackgroundAction<A extends string> = _Popup.BackgroundAction<A>;
type CloseButton<A extends string> = _Popup.CloseButton<A>;
type PromptAction<A extends string> = _Popup.PromptAction<A>;
type Bounds = _Popup.Bounds;
}
}
}
export declare abstract class ButtonsPrompt<T> extends Popup<T> {
protected __buttons: Map<string, {
value: T;
button: TcHmiButton;
}>;
protected __onButtonPressedManager: Callback.Collection<(name: string, value: T) => void>;
onButtonPressed: Readonly<{
add: (callback: (name: string, value: T) => void) => () => void;
remove: (callback: (name: string, value: T) => void) => void;
}>;
protected __backgroundAction: ButtonsPrompt.BackgroundAction<T>;
protected __closeButton: ButtonsPrompt.CloseButton<T>;
/**
* Creates a new ButtonsPrompt instance.
* @param buttons A collection of attributes to generate buttons from and the value that should be used in the prompt answer for each button.
* @param parentControl The control which owns the popup.
*/
constructor(buttons: TcHmi.Dictionary<{
value: T;
attributes: TcHmi.Dictionary<any>;
keepPopupOpen?: boolean;
}>, parentControl?: TcHmiControl.Control | null);
/**
* Aborts a prompted popup and performs the given action to answer the prompt. If no action is specified, the promise is rejected.
* @param action The action to perform to answer the prompt.
*/
abort(action?: ButtonsPrompt.PromptAction<T>): void;
/**
* Creates a handler for the pressed event of a button.
* @param value The value that should be used to answer the prompt when the button is clicked.
*/
protected __createPressedHandler(value: T, name: string, closePopup: boolean): () => void;
/**
* Returns the created buttons.
*/
getButtons(): Map<string, {
value: T;
button: TcHmiButton;
}>;
/**
* Sets what happens when the user clicks the background while the popup is showing, or when the prompt is
* aborted via API call.
* @param action The action to perform. If the popup should be closed, you can specify the name of a button to
* get the prompt to be answered as if this button was clicked, or directly specify a result to answer the
* prompt with.
*/
setBackgroundAction(action: ButtonsPrompt.BackgroundAction<T>): void;
/**
* Sets if the close button should be used or not.
* @param button Defines whether to show the button and if yes, what action should be taken to answer the prompt.
*/
setCloseButton(button: ButtonsPrompt.CloseButton<T>): void;
/**
* Sets if the close button should be used or not.
* @param show Defines whether to show the button.
*/
setCloseButton(show: boolean): void;
/**
* Performs the background action.
*/
protected __performPromptAction(toPerform: ButtonsPrompt.PromptAction<T>): void;
/**
* DEPRECATED
* Please use setTexts
* @param texts A collection of localization symbol expressions.
* @deprecated Please use setTexts
*/
setLocalizations(texts: Partial<ButtonsPrompt.LocalizableTexts>): void;
/**
* Sets texts which can either be localizable or static.
*/
setTexts(texts: Partial<ButtonsPrompt.LocalizableTexts>): void;
}
export declare namespace ButtonsPrompt {
interface LocalizableTexts {
headerText: TcHmi.Localizable;
buttons: TcHmi.Dictionary<{
text?: TcHmi.Localizable;
tooltip?: TcHmi.Localizable;
}>;
}
type BackgroundAction<R = any> = Popup.BackgroundAction<string> | {
close: true;
result: R;
};
type CloseButton<R = any> = Popup.CloseButton<string> | {
show: true;
result: R;
};
type PromptAction<R = any> = Popup.PromptAction<string> | {
result: R;
};
}
import _ButtonsPrompt = ButtonsPrompt;
declare global {
namespace TcHmi.Controls.Helpers {
let ButtonsPrompt: typeof _ButtonsPrompt;
type ButtonsPrompt<T> = _ButtonsPrompt<T>;
namespace ButtonsPrompt {
type LocalizableTexts = _ButtonsPrompt.LocalizableTexts;
type BackgroundAction<R = any> = _ButtonsPrompt.BackgroundAction<R>;
type CloseButton<R = any> = _ButtonsPrompt.CloseButton<R>;
}
}
}
export declare class HtmlAndButtonsPrompt<T> extends ButtonsPrompt<T> {
protected __elementContentContent: HTMLElement | null;
/**
* Creates a new TextAndButtonsPrompt instance.
* @param buttons A collection of attributes to generate buttons from and the value that should be used in the prompt answer for each button.
* @param parentControl The control which owns the popup.
*/
constructor(buttons: TcHmi.Dictionary<{
value: T;
attributes: TcHmi.Dictionary<any>;
}>, parentControl?: TcHmi.Controls.System.TcHmiControl | null);
/**
* Destroys the popup and all its controls.
* @param force If true, child controls will be removed from the parent control before destruction, to ensure destruction in case of keepAlive === true.
*/
destroy(force?: boolean): void;
/**
* Sets the content element.
* @param element
*/
setContentElement(element: HTMLElement): void;
}
declare const _HtmlAndButtonsPrompt: typeof HtmlAndButtonsPrompt;
type tHtmlAndButtonsPrompt<T> = HtmlAndButtonsPrompt<T>;
declare global {
namespace TcHmi.Controls.Helpers {
let HtmlAndButtonsPrompt: typeof _HtmlAndButtonsPrompt;
type HtmlAndButtonsPrompt<T> = tHtmlAndButtonsPrompt<T>;
}
}
export {};
export declare class TextAndButtonsPrompt<T> extends ButtonsPrompt<T> {
/**
* Creates a new TextAndButtonsPrompt instance.
* @param buttons A collection of attributes to generate buttons from and the value that should be used in the prompt answer for each button.
* @param parentControl The control which owns the popup.
*/
constructor(buttons: TcHmi.Dictionary<{
value: T;
attributes: TcHmi.Dictionary<any>;
}>, parentControl?: TcHmi.Controls.System.TcHmiControl | null);
/**
* DEPRECATED
* Please use setTexts
* @param texts A collection of localization symbol expressions.
* @deprecated Please use setTexts
*/
setLocalizations(texts: Partial<TextAndButtonsPrompt.LocalizableTexts>): void;
/**
* Sets texts which can either be localizable or static.
*/
setTexts(texts: Partial<TextAndButtonsPrompt.LocalizableTexts>): void;
}
export declare namespace TextAndButtonsPrompt {
interface LocalizableTexts extends ButtonsPrompt.LocalizableTexts {
contentText: TcHmi.Localizable;
}
}
import _TextAndButtonsPrompt = TextAndButtonsPrompt;
declare global {
namespace TcHmi.Controls.Helpers {
let TextAndButtonsPrompt: typeof _TextAndButtonsPrompt;
type TextAndButtonsPrompt<T> = _TextAndButtonsPrompt<T>;
namespace TextAndButtonsPrompt {
type LocalizableTexts = _TextAndButtonsPrompt.LocalizableTexts;
}
}
}
export declare abstract class OkCancelPrompt<T, T2 = void> extends Popup<{
isOk: true;
value: T;
} | {
isOk: false;
value?: T2;
}> {
protected __okButton: TcHmiButton;
protected __cancelButton: TcHmiButton;
protected __backgroundAction: Popup.BackgroundAction<OkCancelPrompt.AvailableActions>;
protected __closeButton: Popup.CloseButton<OkCancelPrompt.AvailableActions>;
/**
* Creates a new OkCancelPrompt instance.
* @param localizations A collection of localization symbol expressions to localize texts in the control.
* @param parentControl The control which owns the popup.
*/
constructor(parentControl?: TcHmi.Controls.System.TcHmiControl | null);
/**
* Aborts a prompted popup and performs the given action to answer the prompt. If no action is specified, the promise is rejected.
* @param action The action to perform to answer the prompt.
*/
abort(action?: Popup.PromptAction<OkCancelPrompt.AvailableActions>): void;
/**
* Handler for the onPressed event of the OK button.
*/
protected __onOkPressed(): void;
/**
* Handler for the onPressed event of the cancel button.
*/
protected __onCancelPressed(): void;
/**
* Performs the action for the OK button, i.e. calling prompt.answer(). Must be implemented by inheriting class.
* Please check validity in this method and don't rely on the OK buttons isEnabled state, as this method might be called on background click or other events too.
*/
protected abstract __ok(): void;
/**
* Performs the action for the Cancel button.
*/
protected __cancel(): void;
/**
* Sets what happens when the user clicks the background while the popup is showing, or when the prompt is
* aborted via API call.
* @param action The action to perform. If the popup should be closed, you can specify ok or cancel to perform
* the associated action.
*/
setBackgroundAction(action: Popup.BackgroundAction<OkCancelPrompt.AvailableActions>): void;
/**
* Performs the background action.
*/
protected __performBackgroundAction(): void;
/**
* Sets if the close button should be used or not.
* @param button Defines whether to show the button and if yes, what action should be taken to answer the prompt.
*/
setCloseButton(button: Popup.CloseButton<OkCancelPrompt.AvailableActions>): void;
/**
* Sets if the close button should be used or not.
* @param show Defines whether to show the button.
*/
setCloseButton(show: boolean): void;
/**
* Performs the given action.
*/
protected __performPromptAction(toPerform: Popup.PromptAction<OkCancelPrompt.AvailableActions>): void;
/**
* DEPRECATED
* Please use setTexts
* @param texts A collection of localization symbol expressions.
* @deprecated Please use setTexts
*/
setLocalizations(texts: Partial<OkCancelPrompt.LocalizableTexts>): void;
/**
* Sets texts which can either be localizable or static.
*/
setTexts(texts: Partial<OkCancelPrompt.LocalizableTexts>): void;
}
export declare namespace OkCancelPrompt {
interface LocalizableTexts {
buttonTextOk: TcHmi.Localizable;
buttonTooltipOk: TcHmi.Localizable;
buttonTextCancel: TcHmi.Localizable;
buttonTooltipCancel: TcHmi.Localizable;
}
type AvailableActions = 'ok' | 'cancel';
}
import _OkCancelPrompt = OkCancelPrompt;
declare global {
namespace TcHmi.Controls.Helpers {
let OkCancelPrompt: typeof _OkCancelPrompt;
type OkCancelPrompt<T, T2 = void> = _OkCancelPrompt<T, T2>;
namespace OkCancelPrompt {
type LocalizableTexts = _OkCancelPrompt.LocalizableTexts;
type AvailableActions = _OkCancelPrompt.AvailableActions;
}
}
}
export declare class InputPrompt extends OkCancelPrompt<string> {
protected __input: TcHmiInput;
protected __forbiddenValues: Set<string>;
protected __validationPatterns: {
pattern: RegExp;
expectedTestResult: boolean;
}[];
protected __elementLabel: HTMLElement;
/**
* Creates a new InputPrompt instance.
* @param parentControl The control which owns the popup.
*/
constructor(parentControl?: TcHmi.Controls.System.TcHmiControl | null);
/**
* Handler for the onTextChanged event of the input.
*/
protected __onTextChanged(): void;
/**
* Handler for the keydown event of the popup element.
*/
protected __onKeydown(event: KeyboardEvent): void;
/**
* Checks if the text of the input is valid and sets the isEnabled state of the button and the invalid class of the input accordingly.
*/
protected __validate(): void;
/**
* Validates the given text.
* @param text The text to validate.
*/
protected __isValid(text: string): boolean;
/**
* Performs the action for the OK button, i.e. calling prompt.answer().
*/
protected __ok(): void;
/**
* Shows the popup and waits for the user to answer the prompt. A Promise is returned that will be resolved with the value the user provides.
* @param forbiddenValues Values that cannot be entered (i.e. because another item with this name already exists).
* @param defaultValue The default to fill the input with.
*/
prompt(forbiddenValues?: Iterable<string> | null, defaultValue?: string): Promise<{
isOk: true;
value: string;
} | {
isOk: false;
value?: void | undefined;
}>;
/**
* Shows the popup and waits for the user to answer the prompt. A Promise is returned that will be resolved with the value the user provides.
*/
show(): void;
setValidationPatterns(patterns: {
pattern: RegExp;
expectedTestResult: boolean;
}[]): void;
getValidationPatterns(): {
pattern: RegExp;
expectedTestResult: boolean;
}[];
/**
* DEPRECATED
* Please use setTexts
* @param texts A collection of localization symbol expressions.
* @deprecated Please use setTexts
*/
setLocalizations(texts: Partial<InputPrompt.LocalizableTexts>): void;
/**
* Sets texts which can either be localizable or static.
*/
setTexts(texts: Partial<InputPrompt.LocalizableTexts>): void;
}
export declare namespace InputPrompt {
interface LocalizableTexts extends OkCancelPrompt.LocalizableTexts {
labelText: TcHmi.Localizable;
headerText: TcHmi.Localizable;
}
}
import _InputPrompt = InputPrompt;
declare global {
namespace TcHmi.Controls.Helpers {
let InputPrompt: typeof _InputPrompt;
type InputPrompt = _InputPrompt;
namespace InputPrompt {
type LocalizableTexts = _InputPrompt.LocalizableTexts;
}
}
}
export declare class FilterPrompt extends Popup<TcHmi.Filter> {
protected __okButton: TcHmiButton;
protected __cancelButton: TcHmiButton;
protected __resetButton: TcHmiButton;
protected __removeButton: TcHmiButton;
protected __groupButton: TcHmiButton;
protected __ungroupButton: TcHmiButton;
protected __elementMenuBar: HTMLElement;
protected __elementFilterTableHeader: HTMLElement;
/** The element used to save the space for the group brackets */
protected __elementIndentationHeader: HTMLElement;
protected __elementFilterTable: HTMLElement;
protected __elementFilterTableBody: HTMLElement;
protected __filter: TcHmi.Filter;
protected __currentFilter: TcHmi.Filter;
protected __originalFilter: TcHmi.Filter;
protected __schemaInfo: FilterPrompt.SchemaInfo;
protected __localizableEnums: FilterPrompt.PathInfo[];
protected __domainPaths: Map<string, _FilterPrompt.PathInfo>;
protected __rows: FilterPrompt.RowData[];
protected __selectedRows: FilterPrompt.SelectedRow[];
protected __updateRequired: boolean;
protected __groupInfo: {
parent: FilterPrompt.FilterNesting;
toGroup: (TcHmi.Comparison | TcHmi.Filter)[];
} | null;
protected __ungroupInfo: {
parent: FilterPrompt.FilterNesting;
toUngroup: FilterPrompt.FilterNesting;
} | null;
protected __onScroll(_event: Event): void;
protected __onLocaleChangedDestroyer: TcHmi.DestroyFunction | null;
protected __onLocaleChanged(): void;
protected __localizeRequestId: number | null;
protected __localization: TcHmi.Locale.PackageLocalization;
protected __localizedElements: Map<HTMLElement, {
key: string;
parameters?: any[];
}>;
protected __localizationReader: TcHmi.Locale.LocalizationReader | undefined;
protected __listDomainsSubscriptionId: number | null;
protected __backgroundAction: Popup.BackgroundAction<OkCancelPrompt.AvailableActions>;
protected __closeButton: Popup.CloseButton<OkCancelPrompt.AvailableActions>;
/**
* Creates a new OkCancelPrompt instance.
* @param localizations A collection of localization symbol expressions to localize texts in the control.
* @param parentControl The control which owns the popup.
*/
constructor(schema: TcHmi.JsonSchema | null, originalFilter: TcHmi.Filter, parentControl?: TcHmi.Controls.System.TcHmiControl | null);
/**
* Destroys the popup and all its controls.
* @param force If true, child controls will be removed from the parent control before destruction, to ensure destruction in case of keepAlive === true.
*/
destroy(force?: boolean): void;
/**
* Aborts a prompted popup and performs the given action to answer the prompt. If no action is specified, the promise is rejected.
* @param action The action to perform to answer the prompt.
*/
abort(action?: Popup.PromptAction<OkCancelPrompt.AvailableActions>): void;
/**
* Handler for the onPressed event of the OK button.
*/
protected __onOkPressed(): void;
/**
* Handler for the onPressed event of the cancel button.
*/
protected __onCancelPressed(): void;
/**
* Performs the action for the OK button, i.e. calling prompt.answer().
*/
protected __ok(): void;
/**
* Performs the action for the Cancel button.
*/
protected __cancel(): void;
/**
* Performs the action for the Reset button.
*/
protected __reset(): void;
/**
* Returns the original filter.
*/
getOriginalFilter(): TcHmi.Filter;
/**
* Sets what happens when the user clicks the background while the popup is showing, or when the prompt is
* aborted via API call.
* @param action The action to perform. If the popup should be closed, you can specify ok or cancel to perform
* the associated action.
*/
setBackgroundAction(action: Popup.BackgroundAction<OkCancelPrompt.AvailableActions>): void;
/**
* Sets if the close button should be used or not.
* @param button Defines whether to show the button and if yes, what action should be taken to answer the prompt.
*/
setCloseButton(button: Popup.CloseButton<OkCancelPrompt.AvailableActions>): void;
/**
* Sets if the close button should be used or not.
* @param show Defines whether to show the button.
*/
setCloseButton(show: boolean): void;
/**
* Performs the given action.
*/
protected __performPromptAction(toPerform: Popup.PromptAction<OkCancelPrompt.AvailableActions>): void;
/**
* Updates the filter configuration.
* @param filter The current filter configuration.
* @param resetable Whether the reset button should be enabled or disabled.
*/
update(filter: TcHmi.Filter, _resetable: boolean): void;
/**
* Update the visual representation of the filter
*/
protected __update(): void;
/**
* Shows the popup.
*/
show(): void;
/**
* Hides the popup and clears the content of the table if necessary.
*/
hide(): void;
/**
* Clears the content of the table.
*/
protected __clear(): void;
/**
* Creates a new row for the filter configuration table.
* @param indentation The indentation levels and whether this row marks the beginnig, end or middle of an indentation.
* @param comparison The comparison to configure in this row.
* @param logic The logic to configure in this row.
*/
protected __createRow(indentation: FilterPrompt.GroupingLevel[], parent: FilterPrompt.FilterNesting, comparison: TcHmi.Comparison, logic?: TcHmi.LogicOperator): HTMLTableRowElement;
/**
* Updates the controls for comparator and value after path has been changed or row has been created.
* @param row An object containing the filter objects, table cell elements and controls
*/
protected __updateControls(row: FilterPrompt.RowData): void;
/**
* Gets the pathInfo for a given path.
* @param path The path to get info for.
*/
protected __getPathInfo(path?: string): _FilterPrompt.PathInfo | null;
/**
* Adds the given row to the __selectedRows collection and enables/disables remove, group and ungroup buttons accordingly.
* @param row The row to select
*/
protected __selectRow(row: FilterPrompt.SelectedRow): void;
/**
* Removes the given row from the __selectedRows collection and enables/disables remove, group and ungroup buttons accordingly.
* @param row The row to deselect
*/
protected __deselectRow(row: FilterPrompt.SelectedRow): void;
/**
* Adds a new row below the lowest selected row or at the end of the table.
*/
protected __add(): void;
/**
* Removes the selected rows.
*/
protected __remove(): void;
/**
* Groups the selected rows if possible.
*/
protected __group(): void;
/**
* Ungroups the selected rows if possible.
*/
protected __ungroup(ungroupInfo: {
parent: FilterPrompt.FilterNesting;
toUngroup: FilterPrompt.FilterNesting;
}, rows: FilterPrompt.SelectedRow[]): void;
/**
* Enables/disables remove, group and ungroup buttons according to currently selected rows.
*/
protected __processSelection(): void;
/**
* Resizes indentation header to match the table content.
*/
protected __resizeIndentationHeader(): void;
/**
* Generates a string consisting of the parentControlId, the name of the popup and a guid to be used as a control id.
*/
protected __newControlId(): string;
/**
* Clones a nesting object while leaving references to filters intact
* @param nesting The object to clone
*/
protected __cloneNesting(nesting: FilterPrompt.FilterNesting): FilterPrompt.FilterNesting;
/**
* Parses a JsonSchema into an object detailing which paths are available with which comparators and values.
* @param schema The JsonSchema to parse.
*/
protected __parseSchema(schema: TcHmi.JsonSchema | null): {
schemaInfo: FilterPrompt.SchemaInfo;
localizationInfo: FilterPrompt.PathInfo[];
domainPaths: string[];
};
/**
* Localizes enum labels and updates comboboxes using them.
*/
protected __localizeEnumLabels(): void;
/**
* Subscribes to ListDomains and updates the schemaInfo, if paths containing "domain" exist in the schemaInfo.
*/
protected __subscribeListDomains(): void;
}
export declare namespace FilterPrompt {
interface SchemaInfo {
availablePaths: Map<string, PathInfo>;
freePath: PathInfo | null;
availableLogic: string[];
}
interface PathInfo {
comparators: string[];
values: any[];
labels: Map<string | number, string>;
localizedLabels: Map<string | number, string>;
allowFreeValue: boolean;
valueIsDate: boolean;
valueType: 'string' | 'number' | 'integer' | 'boolean' | 'any';
nullable: boolean;
isSuggestion: boolean;
}
interface RowData {
row: HTMLTableRowElement;
logicOperator?: TcHmi.LogicOperator;
comparison: TcHmi.Comparison;
parent: FilterNesting;
selection: {
control: TcHmiCheckbox;
destroyer: TcHmi.DestroyFunction;
};
logic?: {
control: TcHmiCombobox<TcHmi.LogicOperator['logic']>;
destroyer: TcHmi.DestroyFunction;
};
path: {
control: TcHmiCombobox | TcHmiTextbox | null;
destroyer: TcHmi.DestroyFunction | null;
};
comparator: {
cell: HTMLTableCellElement;
control: TcHmiCombobox<string, TcHmiCombobox_ListItemGeneric<string>[]> | null;
destroyer: TcHmi.DestroyFunction | null;
};
value: {
cell: HTMLTableCellElement;
control: TcHmiCombobox | TcHmiTextbox | TcHmiDateTimeInput | null;
destroyer: TcHmi.DestroyFunction | null;
};
}
interface SelectedRow {
rowElement: HTMLTableRowElement;
comparison: TcHmi.Comparison;
parent: FilterNesting;
}
interface FilterNesting {
filter: TcHmi.Filter;
parent: FilterNesting | null;
}
interface GroupingLevel {
opens: boolean;
closes: boolean;
}
}
import _FilterPrompt = FilterPrompt;
declare global {
namespace TcHmi.Controls.Helpers {
let FilterPrompt: typeof _FilterPrompt;
type FilterPrompt = _FilterPrompt;
namespace FilterPrompt {
type SchemaInfo = _FilterPrompt.SchemaInfo;
type PathInfo = _FilterPrompt.PathInfo;
type RowData = _FilterPrompt.RowData;
type SelectedRow = _FilterPrompt.SelectedRow;
type FilterNesting = _FilterPrompt.FilterNesting;
type GroupingLevel = _FilterPrompt.GroupingLevel;
}
}
}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 0.5,8.5 L 8.5,8.5 L 8.5,0.5 L 11.5,0.5 L 11.5,8.5 L 19.5,8.5 L 19.5,11.5 L 11.5,11.5 L 11.5,19.5 L 8.5,19.5 L 8.5,11.5 L 0.5,11.5 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 468 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#FFFFFF" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 0.5,8.5 L 8.5,8.5 L 8.5,0.5 L 11.5,0.5 L 11.5,8.5 L 19.5,8.5 L 19.5,11.5 L 11.5,11.5 L 11.5,19.5 L 8.5,19.5 L 8.5,11.5 L 0.5,11.5 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 464 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1.05" fill="none" transform="translate(5, 5)">
<line x1="0.5" y1="0.5" x2="15.5" y2="15.5" />
<line x1="0.5" y1="15.5" x2="15.5" y2="0.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 382 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#ffffff" stroke-width="1.05" fill="none" transform="translate(5, 5)">
<line x1="0.5" y1="0.5" x2="15.5" y2="15.5" />
<line x1="0.5" y1="15.5" x2="15.5" y2="0.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 383 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 6,1.5 L 1.5,1.5 L 1.5,18.5 L 6,18.5" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#FFFFFF" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 6,1.5 L 1.5,1.5 L 1.5,18.5 L 6,18.5" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<rect x="0.5" y="8.5" width="19" height="3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#FFFFFF" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<rect x="0.5" y="8.5" width="19" height="3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 5.5,1.5 L 1.5,1.5 L 1.5,10.5" />
<path d="M 2,18.5 L 6,18.5" />
<line x1="-1" y1="21" x2="8.5" y2="-1" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#FFFFFF" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 5.5,1.5 L 1.5,1.5 L 1.5,10.5" />
<path d="M 2,18.5 L 6,18.5" />
<line x1="-1" y1="21" x2="8.5" y2="-1" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@@ -0,0 +1,121 @@
.TcHmi_Controls_Helpers_Popup {
--tchmi-background: var(--tchmi-background-color-1);
--tchmi-text-color: var(--tchmi-foreground-color-1);
--tchmi-header-background: var(--tchmi-background-color-1);
--tchmi-header-text-color: var(--tchmi-foreground-color-1);
--tchmi-background-invalid: var(--tchmi-invalid-color);
--tchmi-popup-filter-border: var(--tchmi-foreground-color-2);
--tchmi-popup-filter-table-header-background: var(--tchmi-highlight-color-1);
--tchmi-popup-filter-table-header-color: var(--tchmi-foreground-color-1);
--tchmi-popup-filter-table-cell-background: var(--tchmi-background-color-3);
--tchmi-popup-filter-table-cell-color: var(--tchmi-foreground-color-1);
--tchmi-popup-filter-table-indentation: var(--tchmi-foreground-color-2);
background: var(--tchmi-background);
box-shadow: var(--tchmi-popup-shadow);
font-size: 12px;
}
.TcHmi_Controls_Helpers_Popup-header-container {
background: var(--tchmi-header-background);
}
.TcHmi_Controls_Helpers_Popup-header-container > h1 {
font-size: 18px;
font-weight: normal;
color: var(--tchmi-header-text-color);
}
.TcHmi_Controls_Helpers_Popup-header-container > h1:not(:empty) {
margin-right: 10px;
}
.TcHmi_Controls_Helpers_Popup-header-container > a {
width: 26px;
height: 26px;
background-image: url('Images/close.svg');
}
.TcHmi_Controls_Helpers_Popup-header-container > a:active:hover {
background-image: url('Images/close-active.svg');
}
.TcHmi_Controls_Helpers_Popup-content {
color: var(--tchmi-text-color);
}
.TcHmi_Controls_Helpers_Popup div.with-validation.invalid .TcHmi_Controls_Beckhoff_TcHmiInput-template-input {
box-shadow: var(--tchmi-background-invalid);
}
.TcHmi_Controls_Helpers_Popup-content h2 {
font-size: 16px;
font-weight: normal;
margin-bottom: 0;
}
/**
* FilterPrompt
*/
.TcHmi_Controls_Helpers_FilterPrompt-table-header tr {
border-bottom: 1px solid var(--tchmi-popup-filter-border);
}
.TcHmi_Controls_Helpers_FilterPrompt-table-header th {
background: var(--tchmi-popup-filter-table-header-background);
color: var(--tchmi-popup-filter-table-header-color);
border-right: 1px solid var(--tchmi-popup-filter-border);
border-top: 0px;
border-left: 0px;
border-bottom: 0px;
font-weight: normal;
}
.TcHmi_Controls_Helpers_FilterPrompt-table td {
background: var(--tchmi-popup-filter-table-cell-background);
color: var(--tchmi-popup-filter-table-cell-color);
border-color: var(--tchmi-popup-filter-border);
}
.tchmi-event-grid-table-header .tchmi-event-grid-selection-column {
border-right: none;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-column {
border-bottom: none;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker {
border-color: var(--tchmi-popup-filter-table-indentation);
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-add-button {
background-image: url('Images/add.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-add-button.down {
background-image: url('Images/add-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-remove-button {
background-image: url('Images/remove.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-remove-button.down {
background-image: url('Images/remove-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-group-button {
background-image: url('Images/group.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-group-button.down {
background-image: url('Images/group-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-ungroup-button {
background-image: url('Images/ungroup.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-ungroup-button.down {
background-image: url('Images/ungroup-active.svg');
}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 0.5,8.5 L 8.5,8.5 L 8.5,0.5 L 11.5,0.5 L 11.5,8.5 L 19.5,8.5 L 19.5,11.5 L 11.5,11.5 L 11.5,19.5 L 8.5,19.5 L 8.5,11.5 L 0.5,11.5 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 468 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 0.5,8.5 L 8.5,8.5 L 8.5,0.5 L 11.5,0.5 L 11.5,8.5 L 19.5,8.5 L 19.5,11.5 L 11.5,11.5 L 11.5,19.5 L 8.5,19.5 L 8.5,11.5 L 0.5,11.5 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 464 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1.05" fill="none" transform="translate(5, 5)">
<line x1="0.5" y1="0.5" x2="15.5" y2="15.5" />
<line x1="0.5" y1="15.5" x2="15.5" y2="0.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 382 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4794DA" stroke-width="1.05" fill="none" transform="translate(5, 5)">
<line x1="0.5" y1="0.5" x2="15.5" y2="15.5" />
<line x1="0.5" y1="15.5" x2="15.5" y2="0.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 383 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 6,1.5 L 1.5,1.5 L 1.5,18.5 L 6,18.5" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 6,1.5 L 1.5,1.5 L 1.5,18.5 L 6,18.5" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<rect x="0.5" y="8.5" width="19" height="3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<rect x="0.5" y="8.5" width="19" height="3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#000000" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 5.5,1.5 L 1.5,1.5 L 1.5,10.5" />
<path d="M 2,18.5 L 6,18.5" />
<line x1="-1" y1="21" x2="8.5" y2="-1" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="#4C6374" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(5.000000, 5.000000)">
<path d="M 5.5,1.5 L 1.5,1.5 L 1.5,10.5" />
<path d="M 2,18.5 L 6,18.5" />
<line x1="-1" y1="21" x2="8.5" y2="-1" />
<path d="M 20,3.5 L 8.5, 3.5 L 8.5,8.5 L 20,8.5" />
<path d="M 20,11.5 L 8.5, 11.5 L 8.5,16.5 L 20,16.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@@ -0,0 +1,121 @@
.TcHmi_Controls_Helpers_Popup {
--tchmi-background: var(--tchmi-background-color-4);
--tchmi-text-color: var(--tchmi-foreground-color-1);
--tchmi-header-background: var(--tchmi-background-color-4);
--tchmi-header-text-color: var(--tchmi-foreground-color-1);
--tchmi-background-invalid: var(--tchmi-invalid-color);
--tchmi-popup-filter-border: var(--tchmi-background-color-3);
--tchmi-popup-filter-table-header-background: var(--tchmi-highlight-color-1);
--tchmi-popup-filter-table-header-color: var(--tchmi-foreground-color-2);
--tchmi-popup-filter-table-cell-background: var(--tchmi-background-color-4);
--tchmi-popup-filter-table-cell-color: var(--tchmi-foreground-color-1);
--tchmi-popup-filter-table-indentation: var(--tchmi-foreground-color-1);
background: var(--tchmi-background);
box-shadow: var(--tchmi-popup-shadow);
font-size: 12px;
}
.TcHmi_Controls_Helpers_Popup-header-container {
background: var(--tchmi-header-background);
}
.TcHmi_Controls_Helpers_Popup-header-container > h1 {
font-size: 18px;
font-weight: normal;
color: var(--tchmi-header-text-color);
}
.TcHmi_Controls_Helpers_Popup-header-container > h1:not(:empty) {
margin-right: 10px;
}
.TcHmi_Controls_Helpers_Popup-header-container > a {
width: 26px;
height: 26px;
background-image: url('Images/close.svg');
}
.TcHmi_Controls_Helpers_Popup-header-container > a:active:hover {
background-image: url('Images/close-active.svg');
}
.TcHmi_Controls_Helpers_Popup-content {
color: var(--tchmi-text-color);
}
.TcHmi_Controls_Helpers_Popup div.with-validation.invalid .TcHmi_Controls_Beckhoff_TcHmiInput-input {
background: var(--tchmi-background-invalid);
}
.TcHmi_Controls_Helpers_Popup-content h2 {
font-size: 16px;
font-weight: normal;
margin-bottom: 0;
}
/**
* FilterPrompt
*/
.TcHmi_Controls_Helpers_FilterPrompt-table-header tr {
border-bottom: 1px solid var(--tchmi-popup-filter-border);
}
.TcHmi_Controls_Helpers_FilterPrompt-table-header th {
background: var(--tchmi-popup-filter-table-header-background);
color: var(--tchmi-popup-filter-table-header-color);
border-right: 1px solid var(--tchmi-popup-filter-border);
border-top: 0px;
border-left: 0px;
border-bottom: 0px;
font-weight: normal;
}
.TcHmi_Controls_Helpers_FilterPrompt-table td {
background: var(--tchmi-popup-filter-table-cell-background);
color: var(--tchmi-popup-filter-table-cell-color);
border-color: var(--tchmi-popup-filter-border);
}
.tchmi-event-grid-table-header .tchmi-event-grid-selection-column {
border-right: none;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-column {
border-bottom: none;
}
.TcHmi_Controls_Helpers_FilterPrompt-table .TcHmi_Controls_Helpers_FilterPrompt-indentation-marker {
border-color: var(--tchmi-popup-filter-table-indentation);
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-add-button {
background-image: url('Images/add.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-add-button.down {
background-image: url('Images/add-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-remove-button {
background-image: url('Images/remove.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-remove-button.down {
background-image: url('Images/remove-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-group-button {
background-image: url('Images/group.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-group-button.down {
background-image: url('Images/group-active.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-ungroup-button {
background-image: url('Images/ungroup.svg');
}
.TcHmi_Controls_Beckhoff_TcHmiButton.TcHmi_Controls_Helpers_FilterPrompt-ungroup-button.down {
background-image: url('Images/ungroup-active.svg');
}