ngx-pluto
Version:
157 lines • 17.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ContentChildren, QueryList, ElementRef } from "@angular/core";
import { NpStep } from "./step";
/**
* @ignore
*/
export class NpStepperComponent {
/**
* @param {?} elemRef
*/
constructor(elemRef) {
this.elemRef = elemRef;
this._selectedIndex = 0;
}
/**
* @return {?}
*/
get selectedIndex() { return this._selectedIndex; }
/**
* @param {?} index
* @return {?}
*/
set selectedIndex(index) {
/** @type {?} */
let idx = +index;
if (idx < 0) {
this._selectedIndex = 0;
this.setStatus(idx);
return;
}
if (this.steps && this.steps.length > 0 && idx > this.steps.length - 1) {
this._selectedIndex = this.steps.length - 1;
this.setStatus(idx);
return;
}
this._selectedIndex = idx;
this.setStatus(idx);
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.selectedIndex = this._selectedIndex;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.adjustStepHeaderTitlePosition();
}
// Adjust first and last step header title position
/**
* @private
* @return {?}
*/
adjustStepHeaderTitlePosition() {
/** @type {?} */
let progressContainer = (/** @type {?} */ (this.elemRef.nativeElement.querySelector('.progress-container')));
/** @type {?} */
let headerIcon = (/** @type {?} */ (this.elemRef.nativeElement.querySelector('.progress-circle-template')));
/** @type {?} */
let headerCircle = (/** @type {?} */ (this.elemRef.nativeElement.querySelector('.progress-circle')));
/** @type {?} */
let headerTitleFirst = (/** @type {?} */ (this.elemRef.nativeElement.querySelector('.step-title-first')));
/** @type {?} */
let headerTitleLast = (/** @type {?} */ (this.elemRef.nativeElement.querySelector('.step-title-last')));
if (progressContainer && (headerIcon || headerCircle) && headerTitleFirst && headerTitleLast) {
/** @type {?} */
let progressContainerWidth = progressContainer.offsetWidth;
/** @type {?} */
let headerWidth = headerIcon ? headerIcon.offsetWidth : headerCircle.offsetWidth;
headerTitleFirst.style.marginLeft = '-' + Math.abs(progressContainerWidth - headerWidth) + 'px';
headerTitleLast.style.marginRight = '-' + Math.abs(progressContainerWidth - headerWidth) + 'px';
}
}
/**
* @return {?}
*/
next() {
this.selectedIndex = Math.min(this._selectedIndex + 1, this.steps.length - 1);
}
/**
* @return {?}
*/
previous() {
this.selectedIndex = Math.max(this._selectedIndex - 1, 0);
}
/**
* @return {?}
*/
reset() {
this.selectedIndex = 0;
}
/**
* @param {?} idx
* @return {?}
*/
setStatus(idx) {
if (this.steps) {
this.steps.toArray().forEach((/**
* @param {?} v
* @param {?} i
* @return {?}
*/
(v, i) => {
if (i < idx) {
v.status = 'finish';
}
if (i === idx) {
v.status = 'process';
}
if (i > idx) {
v.status = 'wait';
}
}));
}
}
}
NpStepperComponent.decorators = [
{ type: Component, args: [{
selector: `np-stepper`,
template: "<div class=\"np-stepper-wrapper\">\r\n <!-- Step header -->\r\n <div class=\"flex-wrap row-flex\" style=\"align-items: center;\">\r\n <ng-container *ngFor=\"let step of steps; let i = index; let isFirst = first; let isLast = last;\">\r\n <div class=\"flex-wrap col-flex\" style=\"align-items: center;\">\r\n <div class=\"progress-container flex-wrap row-flex\">\r\n <!-- \u7B2C\u4E00\u6B65\u4E0D\u663E\u793A\u5DE6\u4FA7\u8FDE\u63A5\u7EBF -->\r\n <span class=\"progress-line\" *ngIf=\"!isFirst\"\r\n [ngClass]=\"{'progress-line-unselected': selectedIndex < i}\"></span>\r\n\r\n <!-- \u6839\u636Estep\u72B6\u6001\u548C\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u5185\u5BB9\u663E\u793A -->\r\n\r\n <!-- wait\u7B49\u5F85\u4E2D -->\r\n <span *ngIf=\"step.status ==='wait'\" class=\"progress-circle\"\r\n [ngClass]=\"{'progress-circle-unselected': selectedIndex < i}\">\r\n </span>\r\n\r\n <!-- \u8FDB\u884C\u4E2D -->\r\n <ng-container *ngIf=\"step.status ==='process'\">\r\n <ng-container *ngIf=\"step.processContent\">\r\n <span class=\"progress-circle-template\" [ngClass]=\"{'progress-circle-unselected': selectedIndex < i}\">\r\n <ng-container *ngTemplateOutlet=\"step.processContent.template\"></ng-container>\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!step.processContent\">\r\n <span class=\"progress-circle\" [ngClass]=\"{'progress-circle-unselected': selectedIndex < i}\">\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- \u5DF2\u5B8C\u6210 -->\r\n <ng-container *ngIf=\"step.status ==='finish'\">\r\n <ng-container *ngIf=\"step.finishContent\">\r\n <span class=\"progress-circle-template\" [ngClass]=\"{'progress-circle-unselected': selectedIndex < i}\">\r\n <ng-container *ngTemplateOutlet=\"step.finishContent.template\"></ng-container>\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!step.finishContent\">\r\n <span class=\"progress-circle\" [ngClass]=\"{'progress-circle-unselected': selectedIndex < i}\">\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- \u6700\u540E\u4E00\u6B65\u4E0D\u663E\u793A\u53F3\u4FA7\u8FDE\u63A5\u7EBF -->\r\n <span class=\"progress-line\" *ngIf=\"!isLast\"\r\n [ngClass]=\"{'progress-line-unselected': selectedIndex < i}\"></span>\r\n </div>\r\n <div class=\"step-title\" *ngIf=\"!step.headerContent\"\r\n [ngClass]=\"{'step-title-first': isFirst, 'step-title-last': isLast, 'step-title-unselected': selectedIndex < i}\">\r\n {{ step.title }}\r\n </div>\r\n <div class=\"step-title\" *ngIf=\"step.headerContent\"\r\n [ngClass]=\"{'step-title-first': isFirst, 'step-title-last': isLast, 'step-title-unselected': selectedIndex < i}\">\r\n <ng-container *ngTemplateOutlet=\"step.headerContent.template\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Step content -->\r\n <ng-container *ngFor=\"let step of steps; let i = index; let isFirst = first; let isLast = last;\">\r\n <div class=\"flex-wrap row-flex\" *ngIf=\"step.content && selectedIndex === i\">\r\n <ng-container *ngTemplateOutlet=\"step.content\"></ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
styles: [".backdrop-transparent{opacity:0}.flex-wrap{display:flex}.wrap{flex-wrap:wrap}.col-flex{flex-direction:column}.row-flex{flex-direction:row}.middle-flex{justify-content:center;align-items:center}.space-between{justify-content:space-between;align-items:center}.align-center{align-items:center}.np-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.np-column{display:flex;flex-direction:column;flex-basis:100%;flex:1}.np-stepper-wrapper .progress-container{width:100%;min-width:100px;align-items:center;margin-bottom:5px}.np-stepper-wrapper .progress-container .progress-circle,.np-stepper-wrapper .progress-container .progress-circle-template{min-width:20px;min-height:20px;border-radius:50%;display:inline-block}.np-stepper-wrapper .progress-container .progress-circle img,.np-stepper-wrapper .progress-container .progress-circle-template img{width:40px;height:40px;display:block}.np-stepper-wrapper .progress-container .progress-line{width:auto;margin:auto;min-width:80px;height:3px}.np-stepper-wrapper .step-title-first,.np-stepper-wrapper .step-title-last{width:100%;max-width:100px;text-align:center}"]
}] }
];
/** @nocollapse */
NpStepperComponent.ctorParameters = () => [
{ type: ElementRef }
];
NpStepperComponent.propDecorators = {
steps: [{ type: ContentChildren, args: [NpStep,] }],
selectedIndex: [{ type: Input }]
};
if (false) {
/** @type {?} */
NpStepperComponent.prototype.steps;
/**
* @type {?}
* @private
*/
NpStepperComponent.prototype._selectedIndex;
/**
* @type {?}
* @private
*/
NpStepperComponent.prototype.elemRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9zdGVwcGVyL3N0ZXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQTJCLEtBQUssRUFBaUYsZUFBZSxFQUFFLFNBQVMsRUFBb0IsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRPLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7QUFZaEMsTUFBTSxPQUFPLGtCQUFrQjs7OztJQXlCN0IsWUFBb0IsT0FBbUI7UUFBbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQXJCL0IsbUJBQWMsR0FBRyxDQUFDLENBQUM7SUFxQmdCLENBQUM7Ozs7SUFwQjVDLElBQWEsYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Ozs7O0lBRTVELElBQUksYUFBYSxDQUFDLEtBQWE7O1lBQ3pCLEdBQUcsR0FBRyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMx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SEFBMkI7Z0JBRTNCLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN0Qzs7OztZQVptTSxVQUFVOzs7b0JBZ0IzTSxlQUFlLFNBQUMsTUFBTTs0QkFHdEIsS0FBSzs7OztJQUhOLG1DQUFrRDs7Ozs7SUFFbEQsNENBQTJCOzs7OztJQXFCZixxQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsIE9uSW5pdCwgZm9yd2FyZFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSG9zdExpc3RlbmVyLCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQWZ0ZXJDb250ZW50SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBOR19WQUxJREFUT1JTLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBWYWxpZGF0aW9uRXJyb3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTnBTdGVwIH0gZnJvbSBcIi4vc3RlcFwiO1xyXG5cclxuLyoqXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtc3RlcHBlcmAsXHJcbiAgdGVtcGxhdGVVcmw6ICdzdGVwcGVyLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydzdGVwcGVyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBTdGVwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOcFN0ZXApIHN0ZXBzOiBRdWVyeUxpc3Q8TnBTdGVwPjtcclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgQElucHV0KCkgZ2V0IHNlbGVjdGVkSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9XHJcblxyXG4gIHNldCBzZWxlY3RlZEluZGV4KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGxldCBpZHggPSAraW5kZXg7XHJcbiAgICBpZiAoaWR4IDwgMCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgdGhpcy5zZXRTdGF0dXMoaWR4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN0ZXBzICYmIHRoaXMuc3RlcHMubGVuZ3RoID4gMCAmJiBpZHggPiB0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IHRoaXMuc3RlcHMubGVuZ3RoIC0gMTtcclxuICAgICAgdGhpcy5zZXRTdGF0dXMoaWR4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBpZHg7XHJcbiAgICB0aGlzLnNldFN0YXR1cyhpZHgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtUmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5fc2VsZWN0ZWRJbmRleDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRqdXN0U3RlcEhlYWRlclRpdGxlUG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIEFkanVzdCBmaXJzdCBhbmQgbGFzdCBzdGVwIGhlYWRlciB0aXRsZSBwb3NpdGlvblxyXG4gIHByaXZhdGUgYWRqdXN0U3RlcEhlYWRlclRpdGxlUG9zaXRpb24oKSB7XHJcbiAgICBsZXQgcHJvZ3Jlc3NDb250YWluZXIgPSB0aGlzLmVsZW1SZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZ3Jlc3MtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBsZXQgaGVhZGVySWNvbiA9IHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9ncmVzcy1jaXJjbGUtdGVtcGxhdGUnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGxldCBoZWFkZXJDaXJjbGUgPSB0aGlzLmVsZW1SZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZ3Jlc3MtY2lyY2xlJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBsZXQgaGVhZGVyVGl0bGVGaXJzdCA9IHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLXRpdGxlLWZpcnN0JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBsZXQgaGVhZGVyVGl0bGVMYXN0ID0gdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0ZXAtdGl0bGUtbGFzdCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmIChwcm9ncmVzc0NvbnRhaW5lciAmJiAoaGVhZGVySWNvbiB8fCBoZWFkZXJDaXJjbGUpICYmIGhlYWRlclRpdGxlRmlyc3QgJiYgaGVhZGVyVGl0bGVMYXN0KSB7XHJcbiAgICAgIGxldCBwcm9ncmVzc0NvbnRhaW5lcldpZHRoID0gcHJvZ3Jlc3NDb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGxldCBoZWFkZXJXaWR0aCA9IGhlYWRlckljb24gPyBoZWFkZXJJY29uLm9mZnNldFdpZHRoIDogaGVhZGVyQ2lyY2xlLm9mZnNldFdpZHRoO1xyXG4gICAgICBoZWFkZXJUaXRsZUZpcnN0LnN0eWxlLm1hcmdpbkxlZnQgPSAnLScgKyBNYXRoLmFicyhwcm9ncmVzc0NvbnRhaW5lcldpZHRoIC0gaGVhZGVyV2lkdGgpICsgJ3B4JztcclxuICAgICAgaGVhZGVyVGl0bGVMYXN0LnN0eWxlLm1hcmdpblJpZ2h0ID0gJy0nICsgTWF0aC5hYnMocHJvZ3Jlc3NDb250YWluZXJXaWR0aCAtIGhlYWRlcldpZHRoKSArICdweCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZXh0KCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gTWF0aC5taW4odGhpcy5fc2VsZWN0ZWRJbmRleCArIDEsIHRoaXMuc3RlcHMubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICBwcmV2aW91cygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IE1hdGgubWF4KHRoaXMuX3NlbGVjdGVkSW5kZXggLSAxLCAwKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuICB9XHJcblxyXG4gIHNldFN0YXR1cyhpZHgpIHtcclxuICAgIGlmICh0aGlzLnN0ZXBzKSB7XHJcbiAgICAgIHRoaXMuc3RlcHMudG9BcnJheSgpLmZvckVhY2goKHYsIGkpID0+IHtcclxuICAgICAgICBpZiAoaSA8IGlkeCkge1xyXG4gICAgICAgICAgdi5zdGF0dXMgPSAnZmluaXNoJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGkgPT09IGlkeCkge1xyXG4gICAgICAgICAgdi5zdGF0dXMgPSAncHJvY2Vzcyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpID4gaWR4KSB7XHJcbiAgICAgICAgICB2LnN0YXR1cyA9ICd3YWl0JztcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIl19