@spicainternational/ngx-sds-components 2.23.1 → 2.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import { SdsDurationFormatPipe } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';
3
3
  import * as i0 from "@angular/core";
4
- import * as i1 from "./duration-input-resolver.service";
4
+ import * as i1 from "./duration.service";
5
5
  import * as i2 from "devextreme-angular";
6
6
  import * as i3 from "devextreme-angular/ui/nested";
7
7
  import * as i4 from "@angular/common";
@@ -80,12 +80,10 @@ export class SdsDurationBoxComponent {
80
80
  if (this.value === null) {
81
81
  if (this.allowEmptyValue) {
82
82
  this.setValue(null);
83
- // this.isValueEmpty = true;
84
- // this.inputValue = this.emptyValueText;
85
83
  }
86
84
  else {
87
- this.setValue(0);
88
- this.inputValue = '0:00'; // TO-DO: resolve this scenario
85
+ this.setValue(this._durationInputResolver.getDefaultValue());
86
+ this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);
89
87
  }
90
88
  }
91
89
  else {
@@ -109,10 +107,17 @@ export class SdsDurationBoxComponent {
109
107
  this.setValue(null);
110
108
  }
111
109
  else if (resolvedValue === null && !this.allowEmptyValue) {
112
- this.setValue(resolvedValue);
110
+ this.setValue(this._durationInputResolver.getDefaultValue());
113
111
  }
114
112
  else {
115
- this.setValue(resolvedValue);
113
+ // make sure that the value is within the min/max period
114
+ if (this._durationInputResolver.isValueWithinLimits(resolvedValue, this.min, this.max)) {
115
+ this.setValue(resolvedValue);
116
+ }
117
+ else {
118
+ // use old value
119
+ this.setInputValueInternally(this.value);
120
+ }
116
121
  }
117
122
  }
118
123
  }
@@ -135,12 +140,12 @@ export class SdsDurationBoxComponent {
135
140
  }, 0);
136
141
  }
137
142
  }
138
- SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: i1.DurationInputResolverService }], target: i0.ɵɵFactoryTarget.Component });
139
- SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
143
+ SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: i1.DurationService }], target: i0.ɵɵFactoryTarget.Component });
144
+ SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton", max: "max", min: "min" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
140
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, decorators: [{
141
146
  type: Component,
142
- args: [{ selector: 'sds-duration-box', template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
143
- }], ctorParameters: function () { return [{ type: i1.DurationInputResolverService }]; }, propDecorators: { value: [{
147
+ args: [{ selector: 'sds-duration-box', template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
148
+ }], ctorParameters: function () { return [{ type: i1.DurationService }]; }, propDecorators: { value: [{
144
149
  type: Input
145
150
  }], valueChange: [{
146
151
  type: Output
@@ -156,5 +161,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
156
161
  type: Input
157
162
  }], showClearButton: [{
158
163
  type: Input
164
+ }], max: [{
165
+ type: Input
166
+ }], min: [{
167
+ type: Input
159
168
  }] } });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZHVyYXRpb24tYm94L2R1cmF0aW9uLWJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7O0FBUXJHLE1BQU0sT0FBTyx1QkFBdUI7SUF1RWhDLFlBQ1ksc0JBQW9EO1FBQXBELDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBOEI7UUF2RWhFOzs7OztXQUtHO1FBQ00sVUFBSyxHQUFrQixJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUUxRDs7Ozs7V0FLRztRQUNNLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBRXpDOzs7OztXQUtHO1FBQ00sbUJBQWMsR0FBVyxTQUFTLENBQUM7UUFVNUM7Ozs7O1dBS0c7UUFDTSxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRWpDOzs7OztXQUtHO1FBQ00sYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVuQzs7Ozs7V0FLRztRQUNNLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRW5DLGdCQUFXLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU5QyxlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBSzdCLGlCQUFZLEdBQUcsS0FBSyxD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QUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBb0I7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDOztvSEE5SlEsdUJBQXVCO3dHQUF2Qix1QkFBdUIsc1RDVHBDLGduREF1RGE7MkZEOUNBLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxrQkFBa0I7bUhBV25CLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQVFFLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUcsY0FBYztzQkFBdEIsS0FBSztnQkFRRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUUcsS0FBSztzQkFBYixLQUFLO2dCQVFHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2RzRHVyYXRpb25Gb3JtYXRQaXBlIH0gZnJvbSAnQHNwaWNhaW50ZXJuYXRpb25hbC9uZ3gtc2RzLWNvbXBvbmVudHMvc3JjL2xpYi9kdXJhdGlvbi1waXBlJztcbmltcG9ydCB7IER1cmF0aW9uSW5wdXRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuL2R1cmF0aW9uLWlucHV0LXJlc29sdmVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Nkcy1kdXJhdGlvbi1ib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kdXJhdGlvbi1ib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2R1cmF0aW9uLWJveC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZHNEdXJhdGlvbkJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBEdXJhdGlvbiBsZW5ndGggZXhwcmVzc2VkIGluIG1pbnV0ZXM7IHdoZW4gd2UgYWxsb3cgZW1wdHkgdmFsdWVzIHRoaXMgcHJvcGVydHkgY2FuIGJlIG51bGwuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7KG51bWJlciB8IG51bGwpfVxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VyIHRvIHNlbGVjdCBlbXB0eSB2YWx1ZS4gWW91IHNob3VsZCBwcm92aWRlIGVtcHR5VmFsdWVUZXh0IGluIHRoaXMgY2FzZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGFsbG93RW1wdHlWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiAnZW1wdHlWYWx1ZVRleHQnIC0gdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2hlbiB2YWx1ZSBpcyBjbGVhcmVkXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVtcHR5VmFsdWVUZXh0OiBzdHJpbmcgPSAnbm90IHNldCc7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcmUtZGVmaW5lZCBkdXJhdGlvbnMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiBkcm9wZG93biBmb3IgZWFzaWVyIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtudW1iZXJbXX1cbiAgICAgKiBAbWVtYmVyb2YgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBvcHRpb25zPzogbnVtYmVyW107XG4gICAgXG4gICAgLyoqXG4gICAgICogV2lkdGggb2YgY29tcG9uZW50XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTByZW0nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVJIGNvbXBvbmVudCByZXNwb25kcyB0byB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBkaXNwbGF5IHRoZSBDbGVhciBidXR0b24gaW4gdGhlIFVJIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNob3dDbGVhckJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGVsZW1lbnRVVUlEID0gJ3Nkcy1kYi0nICsgY3J5cHRvLnJhbmRvbVVVSUQoKTtcblxuICAgIHB1YmxpYyBpbnB1dFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgICBwdWJsaWMgc2hvd09wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBcbiAgICBwdWJsaWMgb3B0aW9uc0Ryb3Bkb3duQnV0dG9uO1xuICAgIHB1YmxpYyBjbGVhclZhbHVlQnV0dG9uO1xuXG4gICAgcHVibGljIGlzVmFsdWVFbXB0eSA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBpc1ZhbHVlU2V0SW50ZXJuYWxseSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2R1cmF0aW9uUGlwZTogU2RzRHVyYXRpb25Gb3JtYXRQaXBlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2R1cmF0aW9uSW5wdXRSZXNvbHZlcjogRHVyYXRpb25JbnB1dFJlc29sdmVyU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5fZHVyYXRpb25QaXBlID0gbmV3IFNkc0R1cmF0aW9uRm9ybWF0UGlwZSgpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5vcHRpb25zRHJvcGRvd25CdXR0b24gPSAge1xuICAgICAgICAgICAgaWNvbjogJ3NwaW5kb3duJyxcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXG4gICAgXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93T3B0aW9ucyA9ICF0aGlzLnNob3dPcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclZhbHVlQnV0dG9uID0gIHtcbiAgICAgICAgICAgIGljb246ICdjbGVhcicsXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdzZHMtZHVyYXRpb25ib3gtY2xlYXItYnV0dG9uJyB9LFxuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlPcHRpb24obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNWYWx1ZUVtcHR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5lbXB0eVZhbHVlVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKDApO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJzA6MDAnOyAvLyBUTy1ETzogcmVzb2x2ZSB0aGlzIHNjZW5hcmlvXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5fZHVyYXRpb25QaXBlLnRyYW5zZm9ybSh0aGlzLnZhbHVlLCB0aGlzLmVtcHR5VmFsdWVUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge31cblxuICAgIHB1YmxpYyBibG9ja05vbk51bWJlck9yU2VtaWNvbG9uKGU6IGFueSkge1xuICAgICAgICB0aGlzLmlzVmFsdWVTZXRJbnRlcm5hbGx5ID0gZmFsc2U7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcmVzb2x2ZUlucHV0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZVNldEludGVybmFsbHkpe1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kdXJhdGlvbklucHV0UmVzb2x2ZXIuaXNWYWxpZElucHV0KHRoaXMuaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGludmFsaWQgaW5wdXQuIHVzZSBvbGQgdmFsdWVcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0VmFsdWVJbnRlcm5hbGx5KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlID0gdGhpcy5fZHVyYXRpb25JbnB1dFJlc29sdmVyLnJlc29sdmUodGhpcy5pbnB1dFZhbHVlKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9PT0gbnVsbCAmJiB0aGlzLmFsbG93RW1wdHlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRWYWx1ZSA9PT0gbnVsbCAmJiAhdGhpcy5hbGxvd0VtcHR5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKHJlc29sdmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseU9wdGlvbih2YWx1ZTogbnVtYmVyIHwgbnVsbCl7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1ZhbHVlU2V0SW50ZXJuYWxseSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBudWxsKXtcbiAgICAgICAgdGhpcy5pc1ZhbHVlRW1wdHkgPSAodmFsdWUgPT09IG51bGwpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlSW50ZXJuYWxseSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJbnB1dFZhbHVlSW50ZXJuYWxseSh2YWx1ZTogbnVtYmVyIHwgbnVsbCl7XG4gICAgICAgIHRoaXMuaXNWYWx1ZVNldEludGVybmFsbHkgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuX2R1cmF0aW9uUGlwZS50cmFuc2Zvcm0odGhpcy52YWx1ZSwgdGhpcy5lbXB0eVZhbHVlVGV4dCk7XG4gICAgICAgIH0sIDApO1xuICAgIH1cbn1cbiIsIjxkeC10ZXh0LWJveFxuICAgICN0ZXh0Ym94XG4gICAgW2lkXT1cImVsZW1lbnRVVUlEXCJcbiAgICBjbGFzcz1cInNkcy1kdXJhdGlvbmJveFwiXG4gICAgWyh2YWx1ZSldPVwiaW5wdXRWYWx1ZVwiXG4gICAgKG9uS2V5RG93bik9XCJibG9ja05vbk51bWJlck9yU2VtaWNvbG9uKCRldmVudClcIlxuICAgIChvbkNoYW5nZSk9XCJyZXNvbHZlSW5wdXQoKVwiXG4gICAgW3dpZHRoXT1cIndpZHRoXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgID5cblxuICAgIDwhLS0gKG9uVmFsdWVDaGFuZ2VkKT1cInJlc29sdmVJbnB1dCgkZXZlbnQpXCIgLS0+XG5cbiAgICA8ZHhpLWJ1dHRvblxuICAgICAgICAqbmdJZj1cImFsbG93RW1wdHlWYWx1ZSAmJiBzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgICBuYW1lPVwiY2xlYXJWYWx1ZVwiXG4gICAgICAgIGxvY2F0aW9uPVwiYWZ0ZXJcIlxuICAgICAgICBbb3B0aW9uc109XCJjbGVhclZhbHVlQnV0dG9uXCJcbiAgICA+PC9keGktYnV0dG9uPlxuICAgIDxkeGktYnV0dG9uXG4gICAgICAgICpuZ0lmPVwib3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBuYW1lPVwib3B0aW9uc0Ryb3Bkb3duXCJcbiAgICAgICAgbG9jYXRpb249XCJhZnRlclwiXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNEcm9wZG93bkJ1dHRvblwiXG4gICAgPjwvZHhpLWJ1dHRvbj5cbjwvZHgtdGV4dC1ib3g+XG5cblxuPGR4LXBvcG92ZXJcbiAgICB0YXJnZXQ9XCIje3tlbGVtZW50VVVJRH19XCJcbiAgICBbKHZpc2libGUpXT1cInNob3dPcHRpb25zXCJcbiAgICBbbWluV2lkdGhdPVwid2lkdGhcIlxuICAgIFtoaWRlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgW3dyYXBwZXJBdHRyXT1cInsgY2xhc3M6ICdzZHMtZHVyYXRpb25ib3gtb3B0aW9ucy1wb3BvdmVyJyB9XCJcbiAgICA+XG5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldz5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gYm9yZGVyLTBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF0gPSBcImlzVmFsdWVFbXB0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5T3B0aW9uKG51bGwpXCJcbiAgICAgICAgICAgICAgICA+IHt7IGVtcHR5VmFsdWVUZXh0fX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGJvcmRlci0wXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXSA9IFwib3B0aW9uID09PSB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseU9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgICAgICA+IHt7b3B0aW9uIHwgc2RzRHVyYXRpb25Gb3JtYXR9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcG92ZXI+Il19
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZHVyYXRpb24tYm94L2R1cmF0aW9uLWJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7O0FBUXJHLE1BQU0sT0FBTyx1QkFBdUI7SUF1RmhDLFlBQ1ksc0JBQXVDO1FBQXZDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBaUI7UUF2Rm5EOzs7OztXQUtHO1FBQ00sVUFBSyxHQUFrQixJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUUxRDs7Ozs7V0FLRztRQUNNLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBRXpDOzs7OztXQUtHO1FBQ00sbUJBQWMsR0FBVyxTQUFTLENBQUM7UUFVNUM7Ozs7O1dBS0c7UUFDTSxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRWpDOzs7OztXQUtHO1FBQ00sYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVuQzs7Ozs7V0FLRztRQUNNLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBa0JuQyxnQkFBVyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFOUMsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUs3QixpQkFBWSxHQUFHLEtBQUss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QkFRRyxHQUFHO3NCQUFYLEtBQUs7Z0JBUUcsR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNkc0R1cmF0aW9uRm9ybWF0UGlwZSB9IGZyb20gJ0BzcGljYWludGVybmF0aW9uYWwvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZHVyYXRpb24tcGlwZSc7XHJcbmltcG9ydCB7IER1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vZHVyYXRpb24uc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc2RzLWR1cmF0aW9uLWJveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHVyYXRpb24tYm94LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2R1cmF0aW9uLWJveC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2RzRHVyYXRpb25Cb3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgICAvKipcclxuICAgICAqIER1cmF0aW9uIGxlbmd0aCBleHByZXNzZWQgaW4gbWludXRlczsgd2hlbiB3ZSBhbGxvdyBlbXB0eSB2YWx1ZXMgdGhpcyBwcm9wZXJ0eSBjYW4gYmUgbnVsbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7KG51bWJlciB8IG51bGwpfVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbG93IHVzZXIgdG8gc2VsZWN0IGVtcHR5IHZhbHVlLiBZb3Ugc2hvdWxkIHByb3ZpZGUgZW1wdHlWYWx1ZVRleHQgaW4gdGhpcyBjYXNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGFsbG93RW1wdHlWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAnZW1wdHlWYWx1ZVRleHQnIC0gdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2hlbiB2YWx1ZSBpcyBjbGVhcmVkXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBTZHNEdXJhdGlvbkJveENvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBlbXB0eVZhbHVlVGV4dDogc3RyaW5nID0gJ25vdCBzZXQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgb2YgcHJlLWRlZmluZWQgZHVyYXRpb25zIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gZHJvcGRvd24gZm9yIGVhc2llciBzZWxlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge251bWJlcltdfVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIG9wdGlvbnM/OiBudW1iZXJbXTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWR0aCBvZiBjb21wb25lbnRcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTByZW0nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVJIGNvbXBvbmVudCByZXNwb25kcyB0byB1c2VyIGludGVyYWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgQ2xlYXIgYnV0dG9uIGluIHRoZSBVSSBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2hvd0NsZWFyQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBhY2NlcHRlZCBieSB0aGUgZHVyYXRpb24gYm94LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAbWVtYmVyb2YgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgbWF4PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWUgYWNjZXB0ZWQgYnkgdGhlIGR1cmF0aW9uIGJveC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQG1lbWJlcm9mIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgICAgKi8gICAgXHJcbiAgICBASW5wdXQoKSBtaW4/OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGVsZW1lbnRVVUlEID0gJ3Nkcy1kYi0nICsgY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuXHJcbiAgICBwdWJsaWMgaW5wdXRWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgICBwdWJsaWMgc2hvd09wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIFxyXG4gICAgcHVibGljIG9wdGlvbnNEcm9wZG93bkJ1dHRvbjtcclxuICAgIHB1YmxpYyBjbGVhclZhbHVlQnV0dG9uO1xyXG5cclxuICAgIHB1YmxpYyBpc1ZhbHVlRW1wdHkgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGlzVmFsdWVTZXRJbnRlcm5hbGx5ID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kdXJhdGlvblBpcGU6IFNkc0R1cmF0aW9uRm9ybWF0UGlwZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9kdXJhdGlvbklucHV0UmVzb2x2ZXI6IER1cmF0aW9uU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2R1cmF0aW9uUGlwZSA9IG5ldyBTZHNEdXJhdGlvbkZvcm1hdFBpcGUoKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm9wdGlvbnNEcm9wZG93bkJ1dHRvbiA9ICB7XHJcbiAgICAgICAgICAgIGljb246ICdzcGluZG93bicsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICBcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93T3B0aW9ucyA9ICF0aGlzLnNob3dPcHRpb25zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNsZWFyVmFsdWVCdXR0b24gPSAge1xyXG4gICAgICAgICAgICBpY29uOiAnY2xlYXInLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogJ3Nkcy1kdXJhdGlvbmJveC1jbGVhci1idXR0b24nIH0sXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlPcHRpb24obnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsbG93RW1wdHlWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5fZHVyYXRpb25JbnB1dFJlc29sdmVyLmdldERlZmF1bHRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLl9kdXJhdGlvblBpcGUudHJhbnNmb3JtKHRoaXMudmFsdWUsIHRoaXMuZW1wdHlWYWx1ZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLl9kdXJhdGlvblBpcGUudHJhbnNmb3JtKHRoaXMudmFsdWUsIHRoaXMuZW1wdHlWYWx1ZVRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgICBwdWJsaWMgYmxvY2tOb25OdW1iZXJPclNlbWljb2xvbihlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmlzVmFsdWVTZXRJbnRlcm5hbGx5ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyByZXNvbHZlSW5wdXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVTZXRJbnRlcm5hbGx5KXtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kdXJhdGlvbklucHV0UmVzb2x2ZXIuaXNWYWxpZElucHV0KHRoaXMuaW5wdXRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgaW52YWxpZCBpbnB1dC4gdXNlIG9sZCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlSW50ZXJuYWxseSh0aGlzLnZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0aGlzLl9kdXJhdGlvbklucHV0UmVzb2x2ZXIucmVzb2x2ZSh0aGlzLmlucHV0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9PT0gbnVsbCAmJiB0aGlzLmFsbG93RW1wdHlWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVkVmFsdWUgPT09IG51bGwgJiYgIXRoaXMuYWxsb3dFbXB0eVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLl9kdXJhdGlvbklucHV0UmVzb2x2ZXIuZ2V0RGVmYXVsdFZhbHVlKCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGlzIHdpdGhpbiB0aGUgbWluL21heCBwZXJpb2RcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZHVyYXRpb25JbnB1dFJlc29sdmVyLmlzVmFsdWVXaXRoaW5MaW1pdHMocmVzb2x2ZWRWYWx1ZSBhcyBudW1iZXIsIHRoaXMubWluLCB0aGlzLm1heCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXNvbHZlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2Ugb2xkIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZUludGVybmFsbHkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseU9wdGlvbih2YWx1ZTogbnVtYmVyIHwgbnVsbCl7XHJcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNWYWx1ZVNldEludGVybmFsbHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBudWxsKXtcclxuICAgICAgICB0aGlzLmlzVmFsdWVFbXB0eSA9ICh2YWx1ZSA9PT0gbnVsbCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldElucHV0VmFsdWVJbnRlcm5hbGx5KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldElucHV0VmFsdWVJbnRlcm5hbGx5KHZhbHVlOiBudW1iZXIgfCBudWxsKXtcclxuICAgICAgICB0aGlzLmlzVmFsdWVTZXRJbnRlcm5hbGx5ID0gdHJ1ZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5fZHVyYXRpb25QaXBlLnRyYW5zZm9ybSh0aGlzLnZhbHVlLCB0aGlzLmVtcHR5VmFsdWVUZXh0KTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGR4LXRleHQtYm94XHJcbiAgICAjdGV4dGJveFxyXG4gICAgW2lkXT1cImVsZW1lbnRVVUlEXCJcclxuICAgIGNsYXNzPVwic2RzLWR1cmF0aW9uYm94XCJcclxuICAgIFsodmFsdWUpXT1cImlucHV0VmFsdWVcIlxyXG4gICAgKG9uS2V5RG93bik9XCJibG9ja05vbk51bWJlck9yU2VtaWNvbG9uKCRldmVudClcIlxyXG4gICAgKG9uQ2hhbmdlKT1cInJlc29sdmVJbnB1dCgpXCJcclxuICAgIFt3aWR0aF09XCJ3aWR0aFwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgPlxyXG5cclxuICAgIDwhLS0gKG9uVmFsdWVDaGFuZ2VkKT1cInJlc29sdmVJbnB1dCgkZXZlbnQpXCIgLS0+XHJcblxyXG4gICAgPGR4aS1idXR0b25cclxuICAgICAgICAqbmdJZj1cImFsbG93RW1wdHlWYWx1ZSAmJiBzaG93Q2xlYXJCdXR0b25cIlxyXG4gICAgICAgIG5hbWU9XCJjbGVhclZhbHVlXCJcclxuICAgICAgICBsb2NhdGlvbj1cImFmdGVyXCJcclxuICAgICAgICBbb3B0aW9uc109XCJjbGVhclZhbHVlQnV0dG9uXCJcclxuICAgID48L2R4aS1idXR0b24+XHJcbiAgICA8ZHhpLWJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwib3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgIG5hbWU9XCJvcHRpb25zRHJvcGRvd25cIlxyXG4gICAgICAgIGxvY2F0aW9uPVwiYWZ0ZXJcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNEcm9wZG93bkJ1dHRvblwiXHJcbiAgICA+PC9keGktYnV0dG9uPlxyXG48L2R4LXRleHQtYm94PlxyXG5cclxuXHJcbjxkeC1wb3BvdmVyXHJcbiAgICB0YXJnZXQ9XCIje3tlbGVtZW50VVVJRH19XCJcclxuICAgIFsodmlzaWJsZSldPVwic2hvd09wdGlvbnNcIlxyXG4gICAgW21pbldpZHRoXT1cIndpZHRoXCJcclxuICAgIFtoaWRlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXHJcbiAgICBbd3JhcHBlckF0dHJdPVwieyBjbGFzczogJ3Nkcy1kdXJhdGlvbmJveC1vcHRpb25zLXBvcG92ZXInIH1cIlxyXG4gICAgPlxyXG5cclxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cclxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXc+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBib3JkZXItMFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdID0gXCJpc1ZhbHVlRW1wdHlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5T3B0aW9uKG51bGwpXCJcclxuICAgICAgICAgICAgICAgID4ge3sgZW1wdHlWYWx1ZVRleHR9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGJvcmRlci0wXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdID0gXCJvcHRpb24gPT09IHZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlPcHRpb24ob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICA+IHt7b3B0aW9uIHwgc2RzRHVyYXRpb25Gb3JtYXR9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XHJcbiAgICA8L2Rpdj5cclxuPC9keC1wb3BvdmVyPiJdfQ==
@@ -40,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
40
40
  ]
41
41
  }]
42
42
  }] });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tYm94Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi1ib3gubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOERBQThELENBQUM7O0FBSXJHLE1BQU0sVUFBVSxHQUFHO0lBQ2YsdUJBQXVCO0NBQzFCLENBQUE7QUFtQkQsTUFBTSxPQUFPLG9CQUFvQjs7aUhBQXBCLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGlCQWY3Qix1QkFBdUIsYUFHdkIsWUFBWTtRQUVaLHFCQUFxQjtRQUVyQixlQUFlO1FBQ2YsZUFBZTtRQUNmLGtCQUFrQixhQWRsQix1QkFBdUI7a0hBb0JkLG9CQUFvQixZQWJ0QjtZQUNQLFlBQVk7WUFFWixxQkFBcUI7WUFFckIsZUFBZTtZQUNmLGVBQWU7WUFDZixrQkFBa0I7U0FDbkI7MkZBS1Usb0JBQW9CO2tCQWpCaEMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFFWixxQkFBcUI7d0JBRXJCLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxHQUFHLFVBQVU7cUJBQ2Q7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNkc0R1cmF0aW9uQm94Q29tcG9uZW50IH0gZnJvbSAnLi9kdXJhdGlvbi1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IER4UG9wb3Zlck1vZHVsZSwgRHhTY3JvbGxWaWV3TW9kdWxlLCBEeFRleHRCb3hNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IHsgU2RzRHVyYXRpb25QaXBlTW9kdWxlIH0gZnJvbSAnQHNwaWNhaW50ZXJuYXRpb25hbC9uZ3gtc2RzLWNvbXBvbmVudHMvc3JjL2xpYi9kdXJhdGlvbi1waXBlJztcblxuXG5cbmNvbnN0IGNvbXBvbmVudHMgPSBbXG4gICAgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcbl1cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcblxuICAgIFNkc0R1cmF0aW9uUGlwZU1vZHVsZSxcbiAgICBcbiAgICBEeFRleHRCb3hNb2R1bGUsXG4gICAgRHhQb3BvdmVyTW9kdWxlLFxuICAgIER4U2Nyb2xsVmlld01vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIC4uLmNvbXBvbmVudHNcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZHNEdXJhdGlvbkJveE1vZHVsZSB7IH1cbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tYm94Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi1ib3gubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOERBQThELENBQUM7O0FBSXJHLE1BQU0sVUFBVSxHQUFHO0lBQ2YsdUJBQXVCO0NBQzFCLENBQUE7QUFtQkQsTUFBTSxPQUFPLG9CQUFvQjs7aUhBQXBCLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGlCQWY3Qix1QkFBdUIsYUFHdkIsWUFBWTtRQUVaLHFCQUFxQjtRQUVyQixlQUFlO1FBQ2YsZUFBZTtRQUNmLGtCQUFrQixhQWRsQix1QkFBdUI7a0hBb0JkLG9CQUFvQixZQWJ0QjtZQUNQLFlBQVk7WUFFWixxQkFBcUI7WUFFckIsZUFBZTtZQUNmLGVBQWU7WUFDZixrQkFBa0I7U0FDbkI7MkZBS1Usb0JBQW9CO2tCQWpCaEMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFFWixxQkFBcUI7d0JBRXJCLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxHQUFHLFVBQVU7cUJBQ2Q7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTZHNEdXJhdGlvbkJveENvbXBvbmVudCB9IGZyb20gJy4vZHVyYXRpb24tYm94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IER4UG9wb3Zlck1vZHVsZSwgRHhTY3JvbGxWaWV3TW9kdWxlLCBEeFRleHRCb3hNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTZHNEdXJhdGlvblBpcGVNb2R1bGUgfSBmcm9tICdAc3BpY2FpbnRlcm5hdGlvbmFsL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLXBpcGUnO1xyXG5cclxuXHJcblxyXG5jb25zdCBjb21wb25lbnRzID0gW1xyXG4gICAgU2RzRHVyYXRpb25Cb3hDb21wb25lbnRcclxuXVxyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIFNkc0R1cmF0aW9uQm94Q29tcG9uZW50XHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcblxyXG4gICAgU2RzRHVyYXRpb25QaXBlTW9kdWxlLFxyXG4gICAgXHJcbiAgICBEeFRleHRCb3hNb2R1bGUsXHJcbiAgICBEeFBvcG92ZXJNb2R1bGUsXHJcbiAgICBEeFNjcm9sbFZpZXdNb2R1bGUsXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICAuLi5jb21wb25lbnRzXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2RzRHVyYXRpb25Cb3hNb2R1bGUgeyB9XHJcbiJdfQ==
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DurationService {
4
+ constructor() { }
5
+ resolve(input) {
6
+ if (!input || input.length === 0) {
7
+ return 0;
8
+ }
9
+ const inputSegments = input.split(':');
10
+ if (inputSegments.length > 2) {
11
+ //invalid input
12
+ return 0;
13
+ }
14
+ else if (inputSegments.length == 2) {
15
+ // we have hrs and minutes
16
+ const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');
17
+ const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');
18
+ const totalMins = (hrs * 60) + mins;
19
+ return totalMins;
20
+ }
21
+ else if (inputSegments.length == 1) {
22
+ // take last two digits as mins
23
+ const nonSeparated = inputSegments[0];
24
+ let totalMins = 0;
25
+ if (nonSeparated.length <= 2) {
26
+ totalMins = parseInt(nonSeparated);
27
+ }
28
+ else {
29
+ const lastIndex = nonSeparated.length - 2;
30
+ const part1 = nonSeparated.slice(0, lastIndex);
31
+ const part2 = nonSeparated.slice(lastIndex);
32
+ const hrs = parseInt(part1);
33
+ const mins = parseInt(part2);
34
+ totalMins = (hrs * 60) + mins;
35
+ }
36
+ return totalMins;
37
+ }
38
+ return 0;
39
+ }
40
+ isValidInput(input) {
41
+ const regexNumbersOnly = /^[+-]?\d+$/;
42
+ const regexColonSeparated = /^[+-]?\d+:\d+$/;
43
+ return regexNumbersOnly.test(input) || regexColonSeparated.test(input);
44
+ }
45
+ getDefaultValue(min, max) {
46
+ let defaultValue = 0;
47
+ // try keeping the 0 as default
48
+ // if it is outside the min/max then adjust
49
+ if (min) {
50
+ defaultValue = Math.max(defaultValue, min);
51
+ }
52
+ if (max) {
53
+ defaultValue = Math.min(defaultValue, max);
54
+ }
55
+ return defaultValue;
56
+ }
57
+ isValueWithinLimits(value, min, max) {
58
+ return !((min && value < min) || (max && value > max));
59
+ }
60
+ }
61
+ DurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
62
+ DurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, providedIn: 'root' });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, decorators: [{
64
+ type: Injectable,
65
+ args: [{
66
+ providedIn: 'root',
67
+ }]
68
+ }], ctorParameters: function () { return []; } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxlQUFlO0lBRXhCLGdCQUFlLENBQUM7SUFFVCxPQUFPLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUIsZUFBZTtZQUNmLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFDO1lBQ2pDLDBCQUEwQjtZQUMxQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRXBDLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO2FBQU0sSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNsQywrQkFBK0I7WUFDL0IsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUMxQixTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO2FBQ3JDO2lCQUFNO2dCQUNILE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDakM7WUFDRCxPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFhO1FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQUksZ0JBQWdCLENBQUM7UUFDOUMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSxlQUFlLENBQUMsR0FBWSxFQUFFLEdBQVk7UUFDN0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLCtCQUErQjtRQUMvQiwyQ0FBMkM7UUFDM0MsSUFBSSxHQUFHLEVBQUU7WUFDTCxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLEdBQUcsRUFBRTtZQUNMLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsR0FBWSxFQUFFLEdBQVk7UUFDaEUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUM7OzRHQTdEUSxlQUFlO2dIQUFmLGVBQWUsY0FGWixNQUFNOzJGQUVULGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHVyYXRpb25TZXJ2aWNlIHtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICAgIHB1YmxpYyByZXNvbHZlKGlucHV0OiBzdHJpbmcpOiBudW1iZXIgfCBudWxse1xyXG4gICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRTZWdtZW50cyA9IGlucHV0LnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgaWYgKGlucHV0U2VnbWVudHMubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAvL2ludmFsaWQgaW5wdXRcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFNlZ21lbnRzLmxlbmd0aCA9PSAyKXtcclxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBocnMgYW5kIG1pbnV0ZXNcclxuICAgICAgICAgICAgY29uc3QgaHJzID0gcGFyc2VJbnQoaW5wdXRTZWdtZW50c1swXSA/IGlucHV0U2VnbWVudHNbMF0gOiAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5zID0gcGFyc2VJbnQoaW5wdXRTZWdtZW50c1sxXSA/IGlucHV0U2VnbWVudHNbMV0gOiAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCB0b3RhbE1pbnMgPSAoaHJzICogNjApICsgbWlucztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0b3RhbE1pbnM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFNlZ21lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIC8vIHRha2UgbGFzdCB0d28gZGlnaXRzIGFzIG1pbnNcclxuICAgICAgICAgICAgY29uc3Qgbm9uU2VwYXJhdGVkID0gaW5wdXRTZWdtZW50c1swXTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0b3RhbE1pbnMgPSAwO1xyXG4gICAgICAgICAgICBpZiAobm9uU2VwYXJhdGVkLmxlbmd0aCA8PSAyKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbE1pbnMgPSBwYXJzZUludChub25TZXBhcmF0ZWQpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBub25TZXBhcmF0ZWQubGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQxID0gbm9uU2VwYXJhdGVkLnNsaWNlKDAsIGxhc3RJbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0MiA9IG5vblNlcGFyYXRlZC5zbGljZShsYXN0SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHJzID0gcGFyc2VJbnQocGFydDEpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWlucyA9IHBhcnNlSW50KHBhcnQyKTtcclxuICAgICAgICAgICAgICAgIHRvdGFsTWlucyA9IChocnMgKiA2MCkgKyBtaW5zOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0b3RhbE1pbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmFsaWRJbnB1dChpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcmVnZXhOdW1iZXJzT25seSA9IC9eWystXT9cXGQrJC87XHJcbiAgICAgICAgY29uc3QgcmVnZXhDb2xvblNlcGFyYXRlZCA9ICAvXlsrLV0/XFxkKzpcXGQrJC87XHJcbiAgICAgICAgcmV0dXJuIHJlZ2V4TnVtYmVyc09ubHkudGVzdChpbnB1dCkgfHwgcmVnZXhDb2xvblNlcGFyYXRlZC50ZXN0KGlucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gMDtcclxuICAgICAgICAvLyB0cnkga2VlcGluZyB0aGUgMCBhcyBkZWZhdWx0XHJcbiAgICAgICAgLy8gaWYgaXQgaXMgb3V0c2lkZSB0aGUgbWluL21heCB0aGVuIGFkanVzdFxyXG4gICAgICAgIGlmIChtaW4pIHtcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gTWF0aC5tYXgoZGVmYXVsdFZhbHVlLCBtaW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4KSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IE1hdGgubWluKGRlZmF1bHRWYWx1ZSwgbWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNWYWx1ZVdpdGhpbkxpbWl0cyh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhKChtaW4gJiYgdmFsdWUgPCBtaW4pIHx8IChtYXggJiYgdmFsdWUgPiBtYXgpKVxyXG4gICAgfSAgXHJcblxyXG59XHJcbiJdfQ==
@@ -9,7 +9,7 @@ import { DxTextBoxModule, DxPopoverModule, DxScrollViewModule } from 'devextreme
9
9
  import * as i3 from 'devextreme-angular/ui/nested';
10
10
  import * as i5 from 'devextreme-angular/core';
11
11
 
12
- class DurationInputResolverService {
12
+ class DurationService {
13
13
  constructor() { }
14
14
  resolve(input) {
15
15
  if (!input || input.length === 0) {
@@ -51,10 +51,25 @@ class DurationInputResolverService {
51
51
  const regexColonSeparated = /^[+-]?\d+:\d+$/;
52
52
  return regexNumbersOnly.test(input) || regexColonSeparated.test(input);
53
53
  }
54
+ getDefaultValue(min, max) {
55
+ let defaultValue = 0;
56
+ // try keeping the 0 as default
57
+ // if it is outside the min/max then adjust
58
+ if (min) {
59
+ defaultValue = Math.max(defaultValue, min);
60
+ }
61
+ if (max) {
62
+ defaultValue = Math.min(defaultValue, max);
63
+ }
64
+ return defaultValue;
65
+ }
66
+ isValueWithinLimits(value, min, max) {
67
+ return !((min && value < min) || (max && value > max));
68
+ }
54
69
  }
55
- DurationInputResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
56
- DurationInputResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, providedIn: 'root' });
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, decorators: [{
70
+ DurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ DurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, providedIn: 'root' });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, decorators: [{
58
73
  type: Injectable,
59
74
  args: [{
60
75
  providedIn: 'root',
@@ -134,12 +149,10 @@ class SdsDurationBoxComponent {
134
149
  if (this.value === null) {
135
150
  if (this.allowEmptyValue) {
136
151
  this.setValue(null);
137
- // this.isValueEmpty = true;
138
- // this.inputValue = this.emptyValueText;
139
152
  }
140
153
  else {
141
- this.setValue(0);
142
- this.inputValue = '0:00'; // TO-DO: resolve this scenario
154
+ this.setValue(this._durationInputResolver.getDefaultValue());
155
+ this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);
143
156
  }
144
157
  }
145
158
  else {
@@ -163,10 +176,17 @@ class SdsDurationBoxComponent {
163
176
  this.setValue(null);
164
177
  }
165
178
  else if (resolvedValue === null && !this.allowEmptyValue) {
166
- this.setValue(resolvedValue);
179
+ this.setValue(this._durationInputResolver.getDefaultValue());
167
180
  }
168
181
  else {
169
- this.setValue(resolvedValue);
182
+ // make sure that the value is within the min/max period
183
+ if (this._durationInputResolver.isValueWithinLimits(resolvedValue, this.min, this.max)) {
184
+ this.setValue(resolvedValue);
185
+ }
186
+ else {
187
+ // use old value
188
+ this.setInputValueInternally(this.value);
189
+ }
170
190
  }
171
191
  }
172
192
  }
@@ -189,12 +209,12 @@ class SdsDurationBoxComponent {
189
209
  }, 0);
190
210
  }
191
211
  }
192
- SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: DurationInputResolverService }], target: i0.ɵɵFactoryTarget.Component });
193
- SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
212
+ SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: DurationService }], target: i0.ɵɵFactoryTarget.Component });
213
+ SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton", max: "max", min: "min" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
194
214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, decorators: [{
195
215
  type: Component,
196
- args: [{ selector: 'sds-duration-box', template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
197
- }], ctorParameters: function () { return [{ type: DurationInputResolverService }]; }, propDecorators: { value: [{
216
+ args: [{ selector: 'sds-duration-box', template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
217
+ }], ctorParameters: function () { return [{ type: DurationService }]; }, propDecorators: { value: [{
198
218
  type: Input
199
219
  }], valueChange: [{
200
220
  type: Output
@@ -210,6 +230,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
210
230
  type: Input
211
231
  }], showClearButton: [{
212
232
  type: Input
233
+ }], max: [{
234
+ type: Input
235
+ }], min: [{
236
+ type: Input
213
237
  }] } });
214
238
 
215
239
  const components = [
@@ -1 +1 @@
1
- {"version":3,"file":"spicainternational-ngx-sds-components-src-lib-duration-box.mjs","sources":["../../../projects/ngx-sds-components/src/lib/duration-box/duration-input-resolver.service.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.html","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.module.ts","../../../projects/ngx-sds-components/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DurationInputResolverService {\n \n constructor() {}\n\n public resolve(input: string): number | null{\n if (!input || input.length === 0) {\n return 0;\n }\n\n const inputSegments = input.split(':');\n if (inputSegments.length > 2) {\n //invalid input\n return 0;\n } else if (inputSegments.length == 2){\n // we have hrs and minutes\n const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');\n const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');\n const totalMins = (hrs * 60) + mins;\n\n return totalMins;\n } else if (inputSegments.length == 1) {\n // take last two digits as mins\n const nonSeparated = inputSegments[0];\n\n let totalMins = 0;\n if (nonSeparated.length <= 2) {\n totalMins = parseInt(nonSeparated)\n } else {\n const lastIndex = nonSeparated.length - 2;\n const part1 = nonSeparated.slice(0, lastIndex);\n const part2 = nonSeparated.slice(lastIndex);\n const hrs = parseInt(part1);\n const mins = parseInt(part2);\n totalMins = (hrs * 60) + mins; \n }\n return totalMins;\n }\n return 0; \n }\n\n public isValidInput(input: string) {\n const regexNumbersOnly = /^[+-]?\\d+$/;\n const regexColonSeparated = /^[+-]?\\d+:\\d+$/;\n return regexNumbersOnly.test(input) || regexColonSeparated.test(input);\n }\n}\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { SdsDurationFormatPipe } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\nimport { DurationInputResolverService } from './duration-input-resolver.service';\n\n@Component({\n selector: 'sds-duration-box',\n templateUrl: './duration-box.component.html',\n styleUrls: ['./duration-box.component.scss'],\n})\nexport class SdsDurationBoxComponent implements OnInit, OnChanges {\n /**\n * Duration length expressed in minutes; when we allow empty values this property can be null.\n *\n * @type {(number | null)}\n * @memberof SdsDurationBoxComponent\n */\n @Input() value: number | null = null;\n @Output() valueChange = new EventEmitter<number | null>();\n\n /**\n * Allow user to select empty value. You should provide emptyValueText in this case.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() allowEmptyValue: boolean = true;\n\n /**\n * 'emptyValueText' - text to be displayed when value is cleared\n *\n * @type {string}\n * @memberof SdsDurationBoxComponent\n */\n @Input() emptyValueText: string = 'not set';\n\n /**\n * Array of pre-defined durations that will be displayed in dropdown for easier selection.\n *\n * @type {number[]}\n * @memberof SdsDurationBoxComponent\n */\n @Input() options?: number[];\n \n /**\n * Width of component\n *\n * @type {string}\n * @memberof SdsDurationBoxComponent\n */\n @Input() width: string = '10rem';\n\n /**\n * Specifies whether the UI component responds to user interaction.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() disabled: boolean = false;\n \n /**\n * Specifies whether to display the Clear button in the UI component.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() showClearButton: boolean = false;\n\n public elementUUID = 'sds-db-' + crypto.randomUUID();\n\n public inputValue: string = '';\n public showOptions: boolean = false;\n \n public optionsDropdownButton;\n public clearValueButton;\n\n public isValueEmpty = false;\n\n private isValueSetInternally = false;\n private _durationPipe: SdsDurationFormatPipe;\n\n constructor(\n private _durationInputResolver: DurationInputResolverService,\n ) {\n this._durationPipe = new SdsDurationFormatPipe();\n \n this.optionsDropdownButton = {\n icon: 'spindown',\n stylingMode: 'text',\n \n onClick: () => {\n this.showOptions = !this.showOptions;\n }\n }\n\n this.clearValueButton = {\n icon: 'clear',\n stylingMode: 'text',\n elementAttr: { class: 'sds-durationbox-clear-button' },\n onClick: () => {\n this.applyOption(null);\n }\n } \n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['value']) {\n if (this.value === null) {\n if (this.allowEmptyValue) {\n this.setValue(null);\n // this.isValueEmpty = true;\n // this.inputValue = this.emptyValueText;\n } else {\n this.setValue(0);\n \n this.inputValue = '0:00'; // TO-DO: resolve this scenario\n }\n\n } else {\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\n }\n }\n }\n\n ngOnInit(): void {}\n\n public blockNonNumberOrSemicolon(e: any) {\n this.isValueSetInternally = false;\n }\n\n\n public resolveInput() {\n if (!this.isValueSetInternally){\n if (!this._durationInputResolver.isValidInput(this.inputValue)) {\n // we have invalid input. use old value\n this.setInputValueInternally(this.value);\n } else {\n const resolvedValue = this._durationInputResolver.resolve(this.inputValue);\n \n if (resolvedValue === null && this.allowEmptyValue) {\n this.setValue(null);\n } else if (resolvedValue === null && !this.allowEmptyValue) {\n this.setValue(resolvedValue);\n } else {\n this.setValue(resolvedValue);\n }\n }\n }\n }\n\n public applyOption(value: number | null){\n this.showOptions = false;\n this.isValueSetInternally = false;\n this.setValue(value);\n }\n\n private setValue(value: number | null){\n this.isValueEmpty = (value === null);\n this.value = value;\n this.valueChange.emit(this.value);\n this.setInputValueInternally(value);\n }\n\n private setInputValueInternally(value: number | null){\n this.isValueSetInternally = true;\n setTimeout(() => {\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\n }, 0);\n }\n}\n","<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SdsDurationBoxComponent } from './duration-box.component';\nimport { DxPopoverModule, DxScrollViewModule, DxTextBoxModule } from 'devextreme-angular';\nimport { SdsDurationPipeModule } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\n\n\n\nconst components = [\n SdsDurationBoxComponent\n]\n\n@NgModule({\n declarations: [\n SdsDurationBoxComponent\n ],\n imports: [\n CommonModule,\n\n SdsDurationPipeModule,\n \n DxTextBoxModule,\n DxPopoverModule,\n DxScrollViewModule,\n ],\n exports: [\n ...components\n ]\n})\nexport class SdsDurationBoxModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DurationInputResolverService"],"mappings":"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"}
1
+ {"version":3,"file":"spicainternational-ngx-sds-components-src-lib-duration-box.mjs","sources":["../../../projects/ngx-sds-components/src/lib/duration-box/duration.service.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.html","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.module.ts","../../../projects/ngx-sds-components/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DurationService {\r\n \r\n constructor() {}\r\n\r\n public resolve(input: string): number | null{\r\n if (!input || input.length === 0) {\r\n return 0;\r\n }\r\n\r\n const inputSegments = input.split(':');\r\n if (inputSegments.length > 2) {\r\n //invalid input\r\n return 0;\r\n } else if (inputSegments.length == 2){\r\n // we have hrs and minutes\r\n const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');\r\n const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');\r\n const totalMins = (hrs * 60) + mins;\r\n\r\n return totalMins;\r\n } else if (inputSegments.length == 1) {\r\n // take last two digits as mins\r\n const nonSeparated = inputSegments[0];\r\n\r\n let totalMins = 0;\r\n if (nonSeparated.length <= 2) {\r\n totalMins = parseInt(nonSeparated)\r\n } else {\r\n const lastIndex = nonSeparated.length - 2;\r\n const part1 = nonSeparated.slice(0, lastIndex);\r\n const part2 = nonSeparated.slice(lastIndex);\r\n const hrs = parseInt(part1);\r\n const mins = parseInt(part2);\r\n totalMins = (hrs * 60) + mins; \r\n }\r\n return totalMins;\r\n }\r\n return 0; \r\n }\r\n\r\n public isValidInput(input: string) {\r\n const regexNumbersOnly = /^[+-]?\\d+$/;\r\n const regexColonSeparated = /^[+-]?\\d+:\\d+$/;\r\n return regexNumbersOnly.test(input) || regexColonSeparated.test(input);\r\n }\r\n\r\n public getDefaultValue(min?: number, max?: number): number {\r\n let defaultValue = 0;\r\n // try keeping the 0 as default\r\n // if it is outside the min/max then adjust\r\n if (min) {\r\n defaultValue = Math.max(defaultValue, min);\r\n }\r\n if (max) {\r\n defaultValue = Math.min(defaultValue, max);\r\n }\r\n return defaultValue;\r\n }\r\n\r\n public isValueWithinLimits(value: number, min?: number, max?: number): boolean {\r\n return !((min && value < min) || (max && value > max))\r\n } \r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { SdsDurationFormatPipe } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\r\nimport { DurationService } from './duration.service';\r\n\r\n@Component({\r\n selector: 'sds-duration-box',\r\n templateUrl: './duration-box.component.html',\r\n styleUrls: ['./duration-box.component.scss'],\r\n})\r\nexport class SdsDurationBoxComponent implements OnInit, OnChanges {\r\n /**\r\n * Duration length expressed in minutes; when we allow empty values this property can be null.\r\n *\r\n * @type {(number | null)}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() value: number | null = null;\r\n @Output() valueChange = new EventEmitter<number | null>();\r\n\r\n /**\r\n * Allow user to select empty value. You should provide emptyValueText in this case.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() allowEmptyValue: boolean = true;\r\n\r\n /**\r\n * 'emptyValueText' - text to be displayed when value is cleared\r\n *\r\n * @type {string}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() emptyValueText: string = 'not set';\r\n\r\n /**\r\n * Array of pre-defined durations that will be displayed in dropdown for easier selection.\r\n *\r\n * @type {number[]}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() options?: number[];\r\n \r\n /**\r\n * Width of component\r\n *\r\n * @type {string}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() width: string = '10rem';\r\n\r\n /**\r\n * Specifies whether the UI component responds to user interaction.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() disabled: boolean = false;\r\n \r\n /**\r\n * Specifies whether to display the Clear button in the UI component.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() showClearButton: boolean = false;\r\n\r\n /**\r\n * The maximum value accepted by the duration box.\r\n *\r\n * @type {number}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() max?: number;\r\n\r\n /**\r\n * The minimum value accepted by the duration box.\r\n *\r\n * @type {number}\r\n * @memberof SdsDurationBoxComponent\r\n */ \r\n @Input() min?: number;\r\n\r\n public elementUUID = 'sds-db-' + crypto.randomUUID();\r\n\r\n public inputValue: string = '';\r\n public showOptions: boolean = false;\r\n \r\n public optionsDropdownButton;\r\n public clearValueButton;\r\n\r\n public isValueEmpty = false;\r\n\r\n private isValueSetInternally = false;\r\n private _durationPipe: SdsDurationFormatPipe;\r\n\r\n constructor(\r\n private _durationInputResolver: DurationService,\r\n ) {\r\n this._durationPipe = new SdsDurationFormatPipe();\r\n \r\n this.optionsDropdownButton = {\r\n icon: 'spindown',\r\n stylingMode: 'text',\r\n \r\n onClick: () => {\r\n this.showOptions = !this.showOptions;\r\n }\r\n }\r\n\r\n this.clearValueButton = {\r\n icon: 'clear',\r\n stylingMode: 'text',\r\n elementAttr: { class: 'sds-durationbox-clear-button' },\r\n onClick: () => {\r\n this.applyOption(null);\r\n }\r\n } \r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value']) {\r\n if (this.value === null) {\r\n if (this.allowEmptyValue) {\r\n this.setValue(null);\r\n } else {\r\n this.setValue(this._durationInputResolver.getDefaultValue());\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }\r\n } else {\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n public blockNonNumberOrSemicolon(e: any) {\r\n this.isValueSetInternally = false;\r\n }\r\n\r\n\r\n public resolveInput() {\r\n if (!this.isValueSetInternally){\r\n if (!this._durationInputResolver.isValidInput(this.inputValue)) {\r\n // we have invalid input. use old value\r\n this.setInputValueInternally(this.value);\r\n } else {\r\n const resolvedValue = this._durationInputResolver.resolve(this.inputValue);\r\n \r\n if (resolvedValue === null && this.allowEmptyValue) {\r\n this.setValue(null);\r\n } else if (resolvedValue === null && !this.allowEmptyValue) {\r\n this.setValue(this._durationInputResolver.getDefaultValue());\r\n } else {\r\n\r\n // make sure that the value is within the min/max period\r\n if (this._durationInputResolver.isValueWithinLimits(resolvedValue as number, this.min, this.max)) {\r\n this.setValue(resolvedValue);\r\n } else {\r\n // use old value\r\n this.setInputValueInternally(this.value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public applyOption(value: number | null){\r\n this.showOptions = false;\r\n this.isValueSetInternally = false;\r\n this.setValue(value);\r\n }\r\n\r\n private setValue(value: number | null){\r\n this.isValueEmpty = (value === null);\r\n this.value = value;\r\n this.valueChange.emit(this.value);\r\n this.setInputValueInternally(value);\r\n }\r\n\r\n private setInputValueInternally(value: number | null){\r\n this.isValueSetInternally = true;\r\n setTimeout(() => {\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }, 0);\r\n }\r\n\r\n}\r\n","<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SdsDurationBoxComponent } from './duration-box.component';\r\nimport { DxPopoverModule, DxScrollViewModule, DxTextBoxModule } from 'devextreme-angular';\r\nimport { SdsDurationPipeModule } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\r\n\r\n\r\n\r\nconst components = [\r\n SdsDurationBoxComponent\r\n]\r\n\r\n@NgModule({\r\n declarations: [\r\n SdsDurationBoxComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n\r\n SdsDurationPipeModule,\r\n \r\n DxTextBoxModule,\r\n DxPopoverModule,\r\n DxScrollViewModule,\r\n ],\r\n exports: [\r\n ...components\r\n ]\r\n})\r\nexport class SdsDurationBoxModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DurationService"],"mappings":";;;;;;;;;;;MAKa,eAAe,CAAA;AAExB,IAAA,WAAA,GAAA,GAAgB;AAET,IAAA,OAAO,CAAC,KAAa,EAAA;QACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,CAAC,CAAC;AACZ,SAAA;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE1B,YAAA,OAAO,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAC;;YAEjC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC;AAEpC,YAAA,OAAO,SAAS,CAAC;AACpB,SAAA;AAAM,aAAA,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;;AAElC,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAEtC,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,YAAA,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;AAC1B,gBAAA,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;AACrC,aAAA;AAAM,iBAAA;AACH,gBAAA,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC5C,gBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5B,gBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC7B,SAAS,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC;AACjC,aAAA;AACD,YAAA,OAAO,SAAS,CAAC;AACpB,SAAA;AACD,QAAA,OAAO,CAAC,CAAC;KACZ;AAEM,IAAA,YAAY,CAAC,KAAa,EAAA;QAC7B,MAAM,gBAAgB,GAAG,YAAY,CAAC;QACtC,MAAM,mBAAmB,GAAI,gBAAgB,CAAC;AAC9C,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC1E;IAEM,eAAe,CAAC,GAAY,EAAE,GAAY,EAAA;QAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;;;AAGrB,QAAA,IAAI,GAAG,EAAE;YACL,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAC9C,SAAA;AACD,QAAA,IAAI,GAAG,EAAE;YACL,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAC9C,SAAA;AACD,QAAA,OAAO,YAAY,CAAC;KACvB;AAEM,IAAA,mBAAmB,CAAC,KAAa,EAAE,GAAY,EAAE,GAAY,EAAA;AAChE,QAAA,OAAO,EAAE,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,CAAA;KACzD;;4GA7DQ,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,eAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFZ,MAAM,EAAA,CAAA,CAAA;2FAET,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;iBACrB,CAAA;;;MCKY,uBAAuB,CAAA;AAuFhC,IAAA,WAAA,CACY,sBAAuC,EAAA;AAAvC,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAiB;AAvFnD;;;;;AAKG;AACM,QAAA,IAAK,CAAA,KAAA,GAAkB,IAAI,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAiB,CAAC;AAE1D;;;;;AAKG;AACM,QAAA,IAAe,CAAA,eAAA,GAAY,IAAI,CAAC;AAEzC;;;;;AAKG;AACM,QAAA,IAAc,CAAA,cAAA,GAAW,SAAS,CAAC;AAU5C;;;;;AAKG;AACM,QAAA,IAAK,CAAA,KAAA,GAAW,OAAO,CAAC;AAEjC;;;;;AAKG;AACM,QAAA,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;AAEnC;;;;;AAKG;AACM,QAAA,IAAe,CAAA,eAAA,GAAY,KAAK,CAAC;QAkBnC,IAAA,CAAA,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AAE9C,QAAA,IAAU,CAAA,UAAA,GAAW,EAAE,CAAC;AACxB,QAAA,IAAW,CAAA,WAAA,GAAY,KAAK,CAAC;AAK7B,QAAA,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;AAEpB,QAAA,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;AAMjC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAEjD,IAAI,CAAC,qBAAqB,GAAI;AAC1B,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,WAAW,EAAE,MAAM;YAEnB,OAAO,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;aACxC;SACJ,CAAA;QAED,IAAI,CAAC,gBAAgB,GAAI;AACrB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,WAAW,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE;YACtD,OAAO,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;aAC1B;SACJ,CAAA;KACJ;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;AAClB,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACrB,IAAI,IAAI,CAAC,eAAe,EAAE;AACtB,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvB,iBAAA;AAAM,qBAAA;oBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC,CAAC;AAC7D,oBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACnF,iBAAA;AACJ,aAAA;AAAM,iBAAA;AACJ,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AAClF,aAAA;AACJ,SAAA;KACJ;AAED,IAAA,QAAQ,MAAW;AAEZ,IAAA,yBAAyB,CAAC,CAAM,EAAA;AACnC,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;KACrC;IAGM,YAAY,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;;AAE5D,gBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,aAAA;AAAM,iBAAA;AACH,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAE3E,gBAAA,IAAI,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AAChD,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvB,iBAAA;qBAAM,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC,CAAC;AAChE,iBAAA;AAAM,qBAAA;;AAGH,oBAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,aAAuB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE;AAC9F,wBAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChC,qBAAA;AAAM,yBAAA;;AAEH,wBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,qBAAA;AACJ,iBAAA;AACJ,aAAA;AACJ,SAAA;KACJ;AAEM,IAAA,WAAW,CAAC,KAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACxB;AAEO,IAAA,QAAQ,CAAC,KAAoB,EAAA;QACjC,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;KACvC;AAEO,IAAA,uBAAuB,CAAC,KAAoB,EAAA;AAChD,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;SACnF,EAAE,CAAC,CAAC,CAAC;KACT;;oHAjLQ,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,8UCTpC,8tDAuDa,EAAA,MAAA,EAAA,CAAA,qVAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,2BAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,aAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,iCAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,QAAA,EAAA,OAAA,EAAA,eAAA,EAAA,cAAA,EAAA,SAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,gCAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,EAAA,CAAA,CAAA;2FD9CA,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBALnC,SAAS;+BACI,kBAAkB,EAAA,QAAA,EAAA,8tDAAA,EAAA,MAAA,EAAA,CAAA,qVAAA,CAAA,EAAA,CAAA;mGAWnB,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACI,WAAW,EAAA,CAAA;sBAApB,MAAM;gBAQE,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBAQG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAQG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAQG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAQG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAQG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBAQG,GAAG,EAAA,CAAA;sBAAX,KAAK;gBAQG,GAAG,EAAA,CAAA;sBAAX,KAAK;;;AEzEV,MAAM,UAAU,GAAG;IACf,uBAAuB;CAC1B,CAAA;MAmBY,oBAAoB,CAAA;;iHAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;kHAApB,oBAAoB,EAAA,YAAA,EAAA,CAf7B,uBAAuB,CAAA,EAAA,OAAA,EAAA,CAGvB,YAAY;QAEZ,qBAAqB;QAErB,eAAe;QACf,eAAe;QACf,kBAAkB,aAdlB,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAoBd,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EAbtB,OAAA,EAAA,CAAA;YACP,YAAY;YAEZ,qBAAqB;YAErB,eAAe;YACf,eAAe;YACf,kBAAkB;SACnB,CAAA,EAAA,CAAA,CAAA;2FAKU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAjBhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,uBAAuB;AACxB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBAEZ,qBAAqB;wBAErB,eAAe;wBACf,eAAe;wBACf,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;AACP,wBAAA,GAAG,UAAU;AACd,qBAAA;iBACF,CAAA;;;AC5BD;;AAEG;;;;"}
@@ -9,7 +9,7 @@ import { DxTextBoxModule, DxPopoverModule, DxScrollViewModule } from 'devextreme
9
9
  import * as i3 from 'devextreme-angular/ui/nested';
10
10
  import * as i5 from 'devextreme-angular/core';
11
11
 
12
- class DurationInputResolverService {
12
+ class DurationService {
13
13
  constructor() { }
14
14
  resolve(input) {
15
15
  if (!input || input.length === 0) {
@@ -51,10 +51,25 @@ class DurationInputResolverService {
51
51
  const regexColonSeparated = /^[+-]?\d+:\d+$/;
52
52
  return regexNumbersOnly.test(input) || regexColonSeparated.test(input);
53
53
  }
54
+ getDefaultValue(min, max) {
55
+ let defaultValue = 0;
56
+ // try keeping the 0 as default
57
+ // if it is outside the min/max then adjust
58
+ if (min) {
59
+ defaultValue = Math.max(defaultValue, min);
60
+ }
61
+ if (max) {
62
+ defaultValue = Math.min(defaultValue, max);
63
+ }
64
+ return defaultValue;
65
+ }
66
+ isValueWithinLimits(value, min, max) {
67
+ return !((min && value < min) || (max && value > max));
68
+ }
54
69
  }
55
- DurationInputResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
56
- DurationInputResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, providedIn: 'root' });
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, decorators: [{
70
+ DurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ DurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, providedIn: 'root' });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationService, decorators: [{
58
73
  type: Injectable,
59
74
  args: [{
60
75
  providedIn: 'root',
@@ -134,12 +149,10 @@ class SdsDurationBoxComponent {
134
149
  if (this.value === null) {
135
150
  if (this.allowEmptyValue) {
136
151
  this.setValue(null);
137
- // this.isValueEmpty = true;
138
- // this.inputValue = this.emptyValueText;
139
152
  }
140
153
  else {
141
- this.setValue(0);
142
- this.inputValue = '0:00'; // TO-DO: resolve this scenario
154
+ this.setValue(this._durationInputResolver.getDefaultValue());
155
+ this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);
143
156
  }
144
157
  }
145
158
  else {
@@ -163,10 +176,17 @@ class SdsDurationBoxComponent {
163
176
  this.setValue(null);
164
177
  }
165
178
  else if (resolvedValue === null && !this.allowEmptyValue) {
166
- this.setValue(resolvedValue);
179
+ this.setValue(this._durationInputResolver.getDefaultValue());
167
180
  }
168
181
  else {
169
- this.setValue(resolvedValue);
182
+ // make sure that the value is within the min/max period
183
+ if (this._durationInputResolver.isValueWithinLimits(resolvedValue, this.min, this.max)) {
184
+ this.setValue(resolvedValue);
185
+ }
186
+ else {
187
+ // use old value
188
+ this.setInputValueInternally(this.value);
189
+ }
170
190
  }
171
191
  }
172
192
  }
@@ -189,12 +209,12 @@ class SdsDurationBoxComponent {
189
209
  }, 0);
190
210
  }
191
211
  }
192
- SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: DurationInputResolverService }], target: i0.ɵɵFactoryTarget.Component });
193
- SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
212
+ SdsDurationBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, deps: [{ token: DurationService }], target: i0.ɵɵFactoryTarget.Component });
213
+ SdsDurationBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDurationBoxComponent, selector: "sds-duration-box", inputs: { value: "value", allowEmptyValue: "allowEmptyValue", emptyValueText: "emptyValueText", options: "options", width: "width", disabled: "disabled", showClearButton: "showClearButton", max: "max", min: "min" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"], components: [{ type: i2.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i3.DxiButtonComponent, selector: "dxi-button", inputs: ["location", "name", "options", "cssClass", "disabled", "hint", "icon", "onClick", "template", "text", "visible"] }, { type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "sdsDurationFormat": i6.SdsDurationFormatPipe } });
194
214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDurationBoxComponent, decorators: [{
195
215
  type: Component,
196
- args: [{ selector: 'sds-duration-box', template: "<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
197
- }], ctorParameters: function () { return [{ type: DurationInputResolverService }]; }, propDecorators: { value: [{
216
+ args: [{ selector: 'sds-duration-box', template: "<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>", styles: ["::ng-deep .sds-durationbox .sds-durationbox-clear-button .dx-icon{color:#999}::ng-deep .sds-durationbox-options-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-durationbox-options-popover .dropdown-item:focus{outline:none}::ng-deep .sds-durationbox-options-popover .dropdown-item.selected{background-color:#dee2e6}\n"] }]
217
+ }], ctorParameters: function () { return [{ type: DurationService }]; }, propDecorators: { value: [{
198
218
  type: Input
199
219
  }], valueChange: [{
200
220
  type: Output
@@ -210,6 +230,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
210
230
  type: Input
211
231
  }], showClearButton: [{
212
232
  type: Input
233
+ }], max: [{
234
+ type: Input
235
+ }], min: [{
236
+ type: Input
213
237
  }] } });
214
238
 
215
239
  const components = [
@@ -1 +1 @@
1
- {"version":3,"file":"spicainternational-ngx-sds-components-src-lib-duration-box.mjs","sources":["../../../projects/ngx-sds-components/src/lib/duration-box/duration-input-resolver.service.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.html","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.module.ts","../../../projects/ngx-sds-components/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DurationInputResolverService {\n \n constructor() {}\n\n public resolve(input: string): number | null{\n if (!input || input.length === 0) {\n return 0;\n }\n\n const inputSegments = input.split(':');\n if (inputSegments.length > 2) {\n //invalid input\n return 0;\n } else if (inputSegments.length == 2){\n // we have hrs and minutes\n const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');\n const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');\n const totalMins = (hrs * 60) + mins;\n\n return totalMins;\n } else if (inputSegments.length == 1) {\n // take last two digits as mins\n const nonSeparated = inputSegments[0];\n\n let totalMins = 0;\n if (nonSeparated.length <= 2) {\n totalMins = parseInt(nonSeparated)\n } else {\n const lastIndex = nonSeparated.length - 2;\n const part1 = nonSeparated.slice(0, lastIndex);\n const part2 = nonSeparated.slice(lastIndex);\n const hrs = parseInt(part1);\n const mins = parseInt(part2);\n totalMins = (hrs * 60) + mins; \n }\n return totalMins;\n }\n return 0; \n }\n\n public isValidInput(input: string) {\n const regexNumbersOnly = /^[+-]?\\d+$/;\n const regexColonSeparated = /^[+-]?\\d+:\\d+$/;\n return regexNumbersOnly.test(input) || regexColonSeparated.test(input);\n }\n}\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { SdsDurationFormatPipe } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\nimport { DurationInputResolverService } from './duration-input-resolver.service';\n\n@Component({\n selector: 'sds-duration-box',\n templateUrl: './duration-box.component.html',\n styleUrls: ['./duration-box.component.scss'],\n})\nexport class SdsDurationBoxComponent implements OnInit, OnChanges {\n /**\n * Duration length expressed in minutes; when we allow empty values this property can be null.\n *\n * @type {(number | null)}\n * @memberof SdsDurationBoxComponent\n */\n @Input() value: number | null = null;\n @Output() valueChange = new EventEmitter<number | null>();\n\n /**\n * Allow user to select empty value. You should provide emptyValueText in this case.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() allowEmptyValue: boolean = true;\n\n /**\n * 'emptyValueText' - text to be displayed when value is cleared\n *\n * @type {string}\n * @memberof SdsDurationBoxComponent\n */\n @Input() emptyValueText: string = 'not set';\n\n /**\n * Array of pre-defined durations that will be displayed in dropdown for easier selection.\n *\n * @type {number[]}\n * @memberof SdsDurationBoxComponent\n */\n @Input() options?: number[];\n \n /**\n * Width of component\n *\n * @type {string}\n * @memberof SdsDurationBoxComponent\n */\n @Input() width: string = '10rem';\n\n /**\n * Specifies whether the UI component responds to user interaction.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() disabled: boolean = false;\n \n /**\n * Specifies whether to display the Clear button in the UI component.\n *\n * @type {boolean}\n * @memberof SdsDurationBoxComponent\n */\n @Input() showClearButton: boolean = false;\n\n public elementUUID = 'sds-db-' + crypto.randomUUID();\n\n public inputValue: string = '';\n public showOptions: boolean = false;\n \n public optionsDropdownButton;\n public clearValueButton;\n\n public isValueEmpty = false;\n\n private isValueSetInternally = false;\n private _durationPipe: SdsDurationFormatPipe;\n\n constructor(\n private _durationInputResolver: DurationInputResolverService,\n ) {\n this._durationPipe = new SdsDurationFormatPipe();\n \n this.optionsDropdownButton = {\n icon: 'spindown',\n stylingMode: 'text',\n \n onClick: () => {\n this.showOptions = !this.showOptions;\n }\n }\n\n this.clearValueButton = {\n icon: 'clear',\n stylingMode: 'text',\n elementAttr: { class: 'sds-durationbox-clear-button' },\n onClick: () => {\n this.applyOption(null);\n }\n } \n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['value']) {\n if (this.value === null) {\n if (this.allowEmptyValue) {\n this.setValue(null);\n // this.isValueEmpty = true;\n // this.inputValue = this.emptyValueText;\n } else {\n this.setValue(0);\n \n this.inputValue = '0:00'; // TO-DO: resolve this scenario\n }\n\n } else {\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\n }\n }\n }\n\n ngOnInit(): void {}\n\n public blockNonNumberOrSemicolon(e: any) {\n this.isValueSetInternally = false;\n }\n\n\n public resolveInput() {\n if (!this.isValueSetInternally){\n if (!this._durationInputResolver.isValidInput(this.inputValue)) {\n // we have invalid input. use old value\n this.setInputValueInternally(this.value);\n } else {\n const resolvedValue = this._durationInputResolver.resolve(this.inputValue);\n \n if (resolvedValue === null && this.allowEmptyValue) {\n this.setValue(null);\n } else if (resolvedValue === null && !this.allowEmptyValue) {\n this.setValue(resolvedValue);\n } else {\n this.setValue(resolvedValue);\n }\n }\n }\n }\n\n public applyOption(value: number | null){\n this.showOptions = false;\n this.isValueSetInternally = false;\n this.setValue(value);\n }\n\n private setValue(value: number | null){\n this.isValueEmpty = (value === null);\n this.value = value;\n this.valueChange.emit(this.value);\n this.setInputValueInternally(value);\n }\n\n private setInputValueInternally(value: number | null){\n this.isValueSetInternally = true;\n setTimeout(() => {\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\n }, 0);\n }\n}\n","<dx-text-box\n #textbox\n [id]=\"elementUUID\"\n class=\"sds-durationbox\"\n [(value)]=\"inputValue\"\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\n (onChange)=\"resolveInput()\"\n [width]=\"width\"\n [disabled]=\"disabled\"\n >\n\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\n\n <dxi-button\n *ngIf=\"allowEmptyValue && showClearButton\"\n name=\"clearValue\"\n location=\"after\"\n [options]=\"clearValueButton\"\n ></dxi-button>\n <dxi-button\n *ngIf=\"options && options.length > 0\"\n name=\"optionsDropdown\"\n location=\"after\"\n [options]=\"optionsDropdownButton\"\n ></dxi-button>\n</dx-text-box>\n\n\n<dx-popover\n target=\"#{{elementUUID}}\"\n [(visible)]=\"showOptions\"\n [minWidth]=\"width\"\n [hideOnOutsideClick]=\"true\"\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\n >\n\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view>\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"isValueEmpty\"\n (click)=\"applyOption(null)\"\n > {{ emptyValueText}}\n </button>\n\n <div *ngFor=\"let option of options\">\n <button\n class=\"dropdown-item border-0\"\n [class.selected] = \"option === value\"\n (click)=\"applyOption(option)\"\n > {{option | sdsDurationFormat}}\n </button>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SdsDurationBoxComponent } from './duration-box.component';\nimport { DxPopoverModule, DxScrollViewModule, DxTextBoxModule } from 'devextreme-angular';\nimport { SdsDurationPipeModule } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\n\n\n\nconst components = [\n SdsDurationBoxComponent\n]\n\n@NgModule({\n declarations: [\n SdsDurationBoxComponent\n ],\n imports: [\n CommonModule,\n\n SdsDurationPipeModule,\n \n DxTextBoxModule,\n DxPopoverModule,\n DxScrollViewModule,\n ],\n exports: [\n ...components\n ]\n})\nexport class SdsDurationBoxModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DurationInputResolverService"],"mappings":"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"}
1
+ {"version":3,"file":"spicainternational-ngx-sds-components-src-lib-duration-box.mjs","sources":["../../../projects/ngx-sds-components/src/lib/duration-box/duration.service.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.ts","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.component.html","../../../projects/ngx-sds-components/src/lib/duration-box/duration-box.module.ts","../../../projects/ngx-sds-components/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DurationService {\r\n \r\n constructor() {}\r\n\r\n public resolve(input: string): number | null{\r\n if (!input || input.length === 0) {\r\n return 0;\r\n }\r\n\r\n const inputSegments = input.split(':');\r\n if (inputSegments.length > 2) {\r\n //invalid input\r\n return 0;\r\n } else if (inputSegments.length == 2){\r\n // we have hrs and minutes\r\n const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');\r\n const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');\r\n const totalMins = (hrs * 60) + mins;\r\n\r\n return totalMins;\r\n } else if (inputSegments.length == 1) {\r\n // take last two digits as mins\r\n const nonSeparated = inputSegments[0];\r\n\r\n let totalMins = 0;\r\n if (nonSeparated.length <= 2) {\r\n totalMins = parseInt(nonSeparated)\r\n } else {\r\n const lastIndex = nonSeparated.length - 2;\r\n const part1 = nonSeparated.slice(0, lastIndex);\r\n const part2 = nonSeparated.slice(lastIndex);\r\n const hrs = parseInt(part1);\r\n const mins = parseInt(part2);\r\n totalMins = (hrs * 60) + mins; \r\n }\r\n return totalMins;\r\n }\r\n return 0; \r\n }\r\n\r\n public isValidInput(input: string) {\r\n const regexNumbersOnly = /^[+-]?\\d+$/;\r\n const regexColonSeparated = /^[+-]?\\d+:\\d+$/;\r\n return regexNumbersOnly.test(input) || regexColonSeparated.test(input);\r\n }\r\n\r\n public getDefaultValue(min?: number, max?: number): number {\r\n let defaultValue = 0;\r\n // try keeping the 0 as default\r\n // if it is outside the min/max then adjust\r\n if (min) {\r\n defaultValue = Math.max(defaultValue, min);\r\n }\r\n if (max) {\r\n defaultValue = Math.min(defaultValue, max);\r\n }\r\n return defaultValue;\r\n }\r\n\r\n public isValueWithinLimits(value: number, min?: number, max?: number): boolean {\r\n return !((min && value < min) || (max && value > max))\r\n } \r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { SdsDurationFormatPipe } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\r\nimport { DurationService } from './duration.service';\r\n\r\n@Component({\r\n selector: 'sds-duration-box',\r\n templateUrl: './duration-box.component.html',\r\n styleUrls: ['./duration-box.component.scss'],\r\n})\r\nexport class SdsDurationBoxComponent implements OnInit, OnChanges {\r\n /**\r\n * Duration length expressed in minutes; when we allow empty values this property can be null.\r\n *\r\n * @type {(number | null)}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() value: number | null = null;\r\n @Output() valueChange = new EventEmitter<number | null>();\r\n\r\n /**\r\n * Allow user to select empty value. You should provide emptyValueText in this case.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() allowEmptyValue: boolean = true;\r\n\r\n /**\r\n * 'emptyValueText' - text to be displayed when value is cleared\r\n *\r\n * @type {string}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() emptyValueText: string = 'not set';\r\n\r\n /**\r\n * Array of pre-defined durations that will be displayed in dropdown for easier selection.\r\n *\r\n * @type {number[]}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() options?: number[];\r\n \r\n /**\r\n * Width of component\r\n *\r\n * @type {string}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() width: string = '10rem';\r\n\r\n /**\r\n * Specifies whether the UI component responds to user interaction.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() disabled: boolean = false;\r\n \r\n /**\r\n * Specifies whether to display the Clear button in the UI component.\r\n *\r\n * @type {boolean}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() showClearButton: boolean = false;\r\n\r\n /**\r\n * The maximum value accepted by the duration box.\r\n *\r\n * @type {number}\r\n * @memberof SdsDurationBoxComponent\r\n */\r\n @Input() max?: number;\r\n\r\n /**\r\n * The minimum value accepted by the duration box.\r\n *\r\n * @type {number}\r\n * @memberof SdsDurationBoxComponent\r\n */ \r\n @Input() min?: number;\r\n\r\n public elementUUID = 'sds-db-' + crypto.randomUUID();\r\n\r\n public inputValue: string = '';\r\n public showOptions: boolean = false;\r\n \r\n public optionsDropdownButton;\r\n public clearValueButton;\r\n\r\n public isValueEmpty = false;\r\n\r\n private isValueSetInternally = false;\r\n private _durationPipe: SdsDurationFormatPipe;\r\n\r\n constructor(\r\n private _durationInputResolver: DurationService,\r\n ) {\r\n this._durationPipe = new SdsDurationFormatPipe();\r\n \r\n this.optionsDropdownButton = {\r\n icon: 'spindown',\r\n stylingMode: 'text',\r\n \r\n onClick: () => {\r\n this.showOptions = !this.showOptions;\r\n }\r\n }\r\n\r\n this.clearValueButton = {\r\n icon: 'clear',\r\n stylingMode: 'text',\r\n elementAttr: { class: 'sds-durationbox-clear-button' },\r\n onClick: () => {\r\n this.applyOption(null);\r\n }\r\n } \r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value']) {\r\n if (this.value === null) {\r\n if (this.allowEmptyValue) {\r\n this.setValue(null);\r\n } else {\r\n this.setValue(this._durationInputResolver.getDefaultValue());\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }\r\n } else {\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n public blockNonNumberOrSemicolon(e: any) {\r\n this.isValueSetInternally = false;\r\n }\r\n\r\n\r\n public resolveInput() {\r\n if (!this.isValueSetInternally){\r\n if (!this._durationInputResolver.isValidInput(this.inputValue)) {\r\n // we have invalid input. use old value\r\n this.setInputValueInternally(this.value);\r\n } else {\r\n const resolvedValue = this._durationInputResolver.resolve(this.inputValue);\r\n \r\n if (resolvedValue === null && this.allowEmptyValue) {\r\n this.setValue(null);\r\n } else if (resolvedValue === null && !this.allowEmptyValue) {\r\n this.setValue(this._durationInputResolver.getDefaultValue());\r\n } else {\r\n\r\n // make sure that the value is within the min/max period\r\n if (this._durationInputResolver.isValueWithinLimits(resolvedValue as number, this.min, this.max)) {\r\n this.setValue(resolvedValue);\r\n } else {\r\n // use old value\r\n this.setInputValueInternally(this.value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public applyOption(value: number | null){\r\n this.showOptions = false;\r\n this.isValueSetInternally = false;\r\n this.setValue(value);\r\n }\r\n\r\n private setValue(value: number | null){\r\n this.isValueEmpty = (value === null);\r\n this.value = value;\r\n this.valueChange.emit(this.value);\r\n this.setInputValueInternally(value);\r\n }\r\n\r\n private setInputValueInternally(value: number | null){\r\n this.isValueSetInternally = true;\r\n setTimeout(() => {\r\n this.inputValue = this._durationPipe.transform(this.value, this.emptyValueText);\r\n }, 0);\r\n }\r\n\r\n}\r\n","<dx-text-box\r\n #textbox\r\n [id]=\"elementUUID\"\r\n class=\"sds-durationbox\"\r\n [(value)]=\"inputValue\"\r\n (onKeyDown)=\"blockNonNumberOrSemicolon($event)\"\r\n (onChange)=\"resolveInput()\"\r\n [width]=\"width\"\r\n [disabled]=\"disabled\"\r\n >\r\n\r\n <!-- (onValueChanged)=\"resolveInput($event)\" -->\r\n\r\n <dxi-button\r\n *ngIf=\"allowEmptyValue && showClearButton\"\r\n name=\"clearValue\"\r\n location=\"after\"\r\n [options]=\"clearValueButton\"\r\n ></dxi-button>\r\n <dxi-button\r\n *ngIf=\"options && options.length > 0\"\r\n name=\"optionsDropdown\"\r\n location=\"after\"\r\n [options]=\"optionsDropdownButton\"\r\n ></dxi-button>\r\n</dx-text-box>\r\n\r\n\r\n<dx-popover\r\n target=\"#{{elementUUID}}\"\r\n [(visible)]=\"showOptions\"\r\n [minWidth]=\"width\"\r\n [hideOnOutsideClick]=\"true\"\r\n [wrapperAttr]=\"{ class: 'sds-durationbox-options-popover' }\"\r\n >\r\n\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"isValueEmpty\"\r\n (click)=\"applyOption(null)\"\r\n > {{ emptyValueText}}\r\n </button>\r\n\r\n <div *ngFor=\"let option of options\">\r\n <button\r\n class=\"dropdown-item border-0\"\r\n [class.selected] = \"option === value\"\r\n (click)=\"applyOption(option)\"\r\n > {{option | sdsDurationFormat}}\r\n </button>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SdsDurationBoxComponent } from './duration-box.component';\r\nimport { DxPopoverModule, DxScrollViewModule, DxTextBoxModule } from 'devextreme-angular';\r\nimport { SdsDurationPipeModule } from '@spicainternational/ngx-sds-components/src/lib/duration-pipe';\r\n\r\n\r\n\r\nconst components = [\r\n SdsDurationBoxComponent\r\n]\r\n\r\n@NgModule({\r\n declarations: [\r\n SdsDurationBoxComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n\r\n SdsDurationPipeModule,\r\n \r\n DxTextBoxModule,\r\n DxPopoverModule,\r\n DxScrollViewModule,\r\n ],\r\n exports: [\r\n ...components\r\n ]\r\n})\r\nexport class SdsDurationBoxModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DurationService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spicainternational/ngx-sds-components",
3
- "version": "2.23.1",
3
+ "version": "2.23.2",
4
4
  "description": "Spica design system angular components.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": ">=10.0.0",
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { DurationInputResolverService } from './duration-input-resolver.service';
2
+ import { DurationService } from './duration.service';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class SdsDurationBoxComponent implements OnInit, OnChanges {
5
5
  private _durationInputResolver;
@@ -53,6 +53,20 @@ export declare class SdsDurationBoxComponent implements OnInit, OnChanges {
53
53
  * @memberof SdsDurationBoxComponent
54
54
  */
55
55
  showClearButton: boolean;
56
+ /**
57
+ * The maximum value accepted by the duration box.
58
+ *
59
+ * @type {number}
60
+ * @memberof SdsDurationBoxComponent
61
+ */
62
+ max?: number;
63
+ /**
64
+ * The minimum value accepted by the duration box.
65
+ *
66
+ * @type {number}
67
+ * @memberof SdsDurationBoxComponent
68
+ */
69
+ min?: number;
56
70
  elementUUID: string;
57
71
  inputValue: string;
58
72
  showOptions: boolean;
@@ -72,7 +86,7 @@ export declare class SdsDurationBoxComponent implements OnInit, OnChanges {
72
86
  isValueEmpty: boolean;
73
87
  private isValueSetInternally;
74
88
  private _durationPipe;
75
- constructor(_durationInputResolver: DurationInputResolverService);
89
+ constructor(_durationInputResolver: DurationService);
76
90
  ngOnChanges(changes: SimpleChanges): void;
77
91
  ngOnInit(): void;
78
92
  blockNonNumberOrSemicolon(e: any): void;
@@ -81,5 +95,5 @@ export declare class SdsDurationBoxComponent implements OnInit, OnChanges {
81
95
  private setValue;
82
96
  private setInputValueInternally;
83
97
  static ɵfac: i0.ɵɵFactoryDeclaration<SdsDurationBoxComponent, never>;
84
- static ɵcmp: i0.ɵɵComponentDeclaration<SdsDurationBoxComponent, "sds-duration-box", never, { "value": "value"; "allowEmptyValue": "allowEmptyValue"; "emptyValueText": "emptyValueText"; "options": "options"; "width": "width"; "disabled": "disabled"; "showClearButton": "showClearButton"; }, { "valueChange": "valueChange"; }, never, never>;
98
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdsDurationBoxComponent, "sds-duration-box", never, { "value": "value"; "allowEmptyValue": "allowEmptyValue"; "emptyValueText": "emptyValueText"; "options": "options"; "width": "width"; "disabled": "disabled"; "showClearButton": "showClearButton"; "max": "max"; "min": "min"; }, { "valueChange": "valueChange"; }, never, never>;
85
99
  }
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class DurationService {
3
+ constructor();
4
+ resolve(input: string): number | null;
5
+ isValidInput(input: string): boolean;
6
+ getDefaultValue(min?: number, max?: number): number;
7
+ isValueWithinLimits(value: number, min?: number, max?: number): boolean;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<DurationService, never>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<DurationService>;
10
+ }
@@ -1,54 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DurationInputResolverService {
4
- constructor() { }
5
- resolve(input) {
6
- if (!input || input.length === 0) {
7
- return 0;
8
- }
9
- const inputSegments = input.split(':');
10
- if (inputSegments.length > 2) {
11
- //invalid input
12
- return 0;
13
- }
14
- else if (inputSegments.length == 2) {
15
- // we have hrs and minutes
16
- const hrs = parseInt(inputSegments[0] ? inputSegments[0] : '0');
17
- const mins = parseInt(inputSegments[1] ? inputSegments[1] : '0');
18
- const totalMins = (hrs * 60) + mins;
19
- return totalMins;
20
- }
21
- else if (inputSegments.length == 1) {
22
- // take last two digits as mins
23
- const nonSeparated = inputSegments[0];
24
- let totalMins = 0;
25
- if (nonSeparated.length <= 2) {
26
- totalMins = parseInt(nonSeparated);
27
- }
28
- else {
29
- const lastIndex = nonSeparated.length - 2;
30
- const part1 = nonSeparated.slice(0, lastIndex);
31
- const part2 = nonSeparated.slice(lastIndex);
32
- const hrs = parseInt(part1);
33
- const mins = parseInt(part2);
34
- totalMins = (hrs * 60) + mins;
35
- }
36
- return totalMins;
37
- }
38
- return 0;
39
- }
40
- isValidInput(input) {
41
- const regexNumbersOnly = /^[+-]?\d+$/;
42
- const regexColonSeparated = /^[+-]?\d+:\d+$/;
43
- return regexNumbersOnly.test(input) || regexColonSeparated.test(input);
44
- }
45
- }
46
- DurationInputResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
47
- DurationInputResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, providedIn: 'root' });
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: DurationInputResolverService, decorators: [{
49
- type: Injectable,
50
- args: [{
51
- providedIn: 'root',
52
- }]
53
- }], ctorParameters: function () { return []; } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24taW5wdXQtcmVzb2x2ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZHMtY29tcG9uZW50cy9zcmMvbGliL2R1cmF0aW9uLWJveC9kdXJhdGlvbi1pbnB1dC1yZXNvbHZlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyw0QkFBNEI7SUFFckMsZ0JBQWUsQ0FBQztJQUVULE9BQU8sQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQixlQUFlO1lBQ2YsT0FBTyxDQUFDLENBQUM7U0FDWjthQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUM7WUFDakMsMEJBQTBCO1lBQzFCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFcEMsT0FBTyxTQUFTLENBQUM7U0FDcEI7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2xDLCtCQUErQjtZQUMvQixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQzFCLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7YUFDckM7aUJBQU07Z0JBQ0gsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNqQztZQUNELE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQWE7UUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBSSxnQkFBZ0IsQ0FBQztRQUM5QyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7eUhBNUNRLDRCQUE0Qjs2SEFBNUIsNEJBQTRCLGNBRnpCLE1BQU07MkZBRVQsNEJBQTRCO2tCQUh4QyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRHVyYXRpb25JbnB1dFJlc29sdmVyU2VydmljZSB7XG4gICAgXG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIHJlc29sdmUoaW5wdXQ6IHN0cmluZyk6IG51bWJlciB8IG51bGx7XG4gICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0U2VnbWVudHMgPSBpbnB1dC5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoaW5wdXRTZWdtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAvL2ludmFsaWQgaW5wdXRcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0U2VnbWVudHMubGVuZ3RoID09IDIpe1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBocnMgYW5kIG1pbnV0ZXNcbiAgICAgICAgICAgIGNvbnN0IGhycyA9IHBhcnNlSW50KGlucHV0U2VnbWVudHNbMF0gPyBpbnB1dFNlZ21lbnRzWzBdIDogJzAnKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnMgPSBwYXJzZUludChpbnB1dFNlZ21lbnRzWzFdID8gaW5wdXRTZWdtZW50c1sxXSA6ICcwJyk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbE1pbnMgPSAoaHJzICogNjApICsgbWlucztcblxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsTWlucztcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFNlZ21lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAvLyB0YWtlIGxhc3QgdHdvIGRpZ2l0cyBhcyBtaW5zXG4gICAgICAgICAgICBjb25zdCBub25TZXBhcmF0ZWQgPSBpbnB1dFNlZ21lbnRzWzBdO1xuXG4gICAgICAgICAgICBsZXQgdG90YWxNaW5zID0gMDtcbiAgICAgICAgICAgIGlmIChub25TZXBhcmF0ZWQubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgICAgICB0b3RhbE1pbnMgPSBwYXJzZUludChub25TZXBhcmF0ZWQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG5vblNlcGFyYXRlZC5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQxID0gbm9uU2VwYXJhdGVkLnNsaWNlKDAsIGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydDIgPSBub25TZXBhcmF0ZWQuc2xpY2UobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBocnMgPSBwYXJzZUludChwYXJ0MSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlucyA9IHBhcnNlSW50KHBhcnQyKTtcbiAgICAgICAgICAgICAgICB0b3RhbE1pbnMgPSAoaHJzICogNjApICsgbWluczsgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b3RhbE1pbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7ICAgICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZElucHV0KGlucHV0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVnZXhOdW1iZXJzT25seSA9IC9eWystXT9cXGQrJC87XG4gICAgICAgIGNvbnN0IHJlZ2V4Q29sb25TZXBhcmF0ZWQgPSAgL15bKy1dP1xcZCs6XFxkKyQvO1xuICAgICAgICByZXR1cm4gcmVnZXhOdW1iZXJzT25seS50ZXN0KGlucHV0KSB8fCByZWdleENvbG9uU2VwYXJhdGVkLnRlc3QoaW5wdXQpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,8 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- export declare class DurationInputResolverService {
3
- constructor();
4
- resolve(input: string): number | null;
5
- isValidInput(input: string): boolean;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<DurationInputResolverService, never>;
7
- static ɵprov: i0.ɵɵInjectableDeclaration<DurationInputResolverService>;
8
- }