@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
233 lines (232 loc) • 16.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, Output, EventEmitter } from '@angular/core';
export class Progress {
constructor() {
this.baseClass = true;
/**
* Set to `true` to make the progress linear. This allows the user to access any of the steps at any time (like tabs).
*/
this.linear = false;
/**
* Set to `true` to allow the user to edit a step after completed.
*/
this.editable = false;
/**
* Emits an event when a index is selected
*/
this.selected = new EventEmitter();
/**
* Emits an event when the steps change.
*/
this.stepsChange = new EventEmitter();
}
/**
* Sets the steps for the `Progress` component.
* @return {?}
*/
get steps() {
return this._steps;
}
/**
* @param {?} value
* @return {?}
*/
set steps(value) {
this._steps = value;
this.stepsChange.emit(this._steps);
}
/**
* @param {?} newIndex
* @return {?}
*/
select(newIndex) {
this._steps.forEach((/**
* @param {?} step
* @param {?} index
* @return {?}
*/
(step, index) => {
if (index === newIndex) {
step.current = true;
}
else if (step.current) {
delete step.current;
}
}));
this.selected.emit(newIndex);
this.steps = this._steps;
}
/**
* Step is completed.
* @param {?} step
* @return {?}
*/
isComplete(step) {
return step.state === 'complete';
}
/**
* Step is editable.
* @param {?} step
* @return {?}
*/
isEditable(step) {
return step.state === 'complete' && this.editable;
}
/**
* Step is unclickable.
* @param {?} step
* @param {?} index
* @return {?}
*/
isUnclickable(step, index) {
if (step.state === 'complete' && !this.editable) {
return true;
}
if (step.state === 'incomplete' && !this.linear && index !== this.getNextUncompletedStepIndex()) {
return true;
}
return false;
}
/**
* Returns the index of the next uncompleted step.
* @return {?}
*/
getNextUncompletedStepIndex() {
for (const [index, step] of this.steps.entries()) {
if (step.state === 'incomplete') {
return index;
}
}
return -1;
}
/**
* Returns the current step.
* @return {?}
*/
currentStep() {
for (const [_, step] of this.steps.entries()) {
if (step.current) {
return step;
}
}
return null;
}
/**
* Returns the next step.
* @return {?}
*/
nextStep() {
/** @type {?} */
let currentIndex = -1;
for (const [index, step] of this.steps.entries()) {
if (step.current) {
currentIndex = index;
}
if (currentIndex >= 0 && currentIndex + 1 === index) {
return step;
}
}
return null;
}
/**
* Returns the current step index.
* @return {?}
*/
getCurrentStepIndex() {
for (const [index, step] of this.steps.entries()) {
if (step.current) {
return index;
}
}
return -1;
}
}
Progress.decorators = [
{ type: Component, args: [{
selector: 'suka-progress',
template: `
<div class="mobile-progress">
<div class="mobile-progress__label">
<h3 class="mobile-progress__label__current-step">{{currentStep().label}}</h3>
<p class="mobile-progress__label__next-step" *ngIf="getCurrentStepIndex() + 1 < steps.length">Próximo paso: {{nextStep().label}}</p>
<p class="mobile-progress__label__next-step" *ngIf="getCurrentStepIndex() + 1 >= steps.length">Último paso</p>
</div>
<div
class="mobile-progress__status"
[ngClass]="[
'radial-progress-' + (getCurrentStepIndex() + 1) * 100 / steps.length
]"
>
<div class="mobile-progress__status-overlay">
{{getCurrentStepIndex() + 1}} de {{steps.length}}
</div>
</div>
</div>
<div class="progress__wrapper">
<ul class="progress-bar">
<li
*ngFor="let step of steps; let i = index"
class="progress-bar__step"
[ngClass]="{
'progress-bar__step--complete': isComplete(step),
'progress-bar__step--editable': isEditable(step),
'progress-bar__step--error': step.state === 'error',
'progress-bar__step--current': step.current,
'progress-bar__step--unclickable': isUnclickable(step, i)
}"
>
<div class="step" role="button" (click)="select(i)">
<div class="step__indicator">
<ng-container *ngIf="step.state !== 'complete' || step.current">{{ i + 1 }}</ng-container>
<suka-icon icon="check" *ngIf="isComplete(step) && !isEditable(step) && !step.current"></suka-icon>
<suka-icon icon="edit-2" *ngIf="isEditable(step) && !step.current"></suka-icon>
</div>
<span class="step__label"> {{ step.label }}</span>
</div>
</li>
</ul>
</div>
`
}] }
];
Progress.propDecorators = {
baseClass: [{ type: HostBinding, args: ['class.progress',] }],
linear: [{ type: Input }],
editable: [{ type: Input }],
selected: [{ type: Output }],
stepsChange: [{ type: Output }],
steps: [{ type: Input }]
};
if (false) {
/**
* @type {?}
* @private
*/
Progress.prototype._steps;
/** @type {?} */
Progress.prototype.baseClass;
/**
* Set to `true` to make the progress linear. This allows the user to access any of the steps at any time (like tabs).
* @type {?}
*/
Progress.prototype.linear;
/**
* Set to `true` to allow the user to edit a step after completed.
* @type {?}
*/
Progress.prototype.editable;
/**
* Emits an event when a index is selected
* @type {?}
*/
Progress.prototype.selected;
/**
* Emits an event when the steps change.
* @type {?}
*/
Progress.prototype.stepsChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL3Byb2dyZXNzL3Byb2dyZXNzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFrRDVGLE1BQU0sT0FBTyxRQUFRO0lBL0NyQjtRQWtEaUMsY0FBUyxHQUFHLElBQUksQ0FBQzs7OztRQUt2QyxXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2YsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUtoQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUs5QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFnSDdDLENBQUM7Ozs7O0lBNUdDLElBQWEsS0FBSztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBRUQsTUFBTSxDQUFDLFFBQVE7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Ozs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNyQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNyQjtRQUNILENBQUMsRUFBQyxDQUFDO1FBRUgs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dEJpbmRpbmcsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByb2dyZXNzU3RlcCB9IGZyb20gJy4vcHJvZ3Jlc3Mtc3RlcC5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLXByb2dyZXNzJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzX19sYWJlbFwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NfX2xhYmVsX19jdXJyZW50LXN0ZXBcIj57e2N1cnJlbnRTdGVwKCkubGFiZWx9fTwvaDM+XG4gICAgICAgIDxwIGNsYXNzPVwibW9iaWxlLXByb2dyZXNzX19sYWJlbF9fbmV4dC1zdGVwXCIgKm5nSWY9XCJnZXRDdXJyZW50U3RlcEluZGV4KCkgKyAxIDwgc3RlcHMubGVuZ3RoXCI+UHLDs3hpbW8gcGFzbzoge3tuZXh0U3RlcCgpLmxhYmVsfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwibW9iaWxlLXByb2dyZXNzX19sYWJlbF9fbmV4dC1zdGVwXCIgKm5nSWY9XCJnZXRDdXJyZW50U3RlcEluZGV4KCkgKyAxID49IHN0ZXBzLmxlbmd0aFwiPsOabHRpbW8gcGFzbzwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibW9iaWxlLXByb2dyZXNzX19zdGF0dXNcIlxuICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgJ3JhZGlhbC1wcm9ncmVzcy0nICsgKGdldEN1cnJlbnRTdGVwSW5kZXgoKSArIDEpICogMTAwIC8gc3RlcHMubGVuZ3RoXG4gICAgICAgIF1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzX19zdGF0dXMtb3ZlcmxheVwiPlxuICAgICAgICAgIHt7Z2V0Q3VycmVudFN0ZXBJbmRleCgpICsgMX19IGRlIHt7c3RlcHMubGVuZ3RofX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NfX3dyYXBwZXJcIj5cbiAgICAgIDx1bCBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICA8bGlcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJwcm9ncmVzcy1iYXJfX3N0ZXBcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdwcm9ncmVzcy1iYXJfX3N0ZXAtLWNvbXBsZXRlJzogaXNDb21wbGV0ZShzdGVwKSxcbiAgICAgICAgICAgICdwcm9ncmVzcy1iYXJfX3N0ZXAtLWVkaXRhYmxlJzogaXNFZGl0YWJsZShzdGVwKSxcbiAgICAgICAgICAgICdwcm9ncmVzcy1iYXJfX3N0ZXAtLWVycm9yJzogc3RlcC5zdGF0ZSA9PT0gJ2Vycm9yJyxcbiAgICAgICAgICAgICdwcm9ncmVzcy1iYXJfX3N0ZXAtLWN1cnJlbnQnOiBzdGVwLmN1cnJlbnQsXG4gICAgICAgICAgICAncHJvZ3Jlc3MtYmFyX19zdGVwLS11bmNsaWNrYWJsZSc6IGlzVW5jbGlja2FibGUoc3RlcCwgaSlcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3QoaSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwX19pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0ZXAuc3RhdGUgIT09ICdjb21wbGV0ZScgfHwgc3RlcC5jdXJyZW50XCI+e3sgaSArIDEgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPHN1a2EtaWNvbiBpY29uPVwiY2hlY2tcIiAqbmdJZj1cImlzQ29tcGxldGUoc3RlcCkgJiYgIWlzRWRpdGFibGUoc3RlcCkgJiYgIXN0ZXAuY3VycmVudFwiPjwvc3VrYS1pY29uPlxuICAgICAgICAgICAgICA8c3VrYS1pY29uIGljb249XCJlZGl0LTJcIiAqbmdJZj1cImlzRWRpdGFibGUoc3RlcCkgJiYgIXN0ZXAuY3VycmVudFwiPjwvc3VrYS1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ZXBfX2xhYmVsXCI+IHt7IHN0ZXAubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIFByb2dyZXNzIHtcbiAgcHJpdmF0ZSBfc3RlcHM6IEFycmF5PFByb2dyZXNzU3RlcD47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5wcm9ncmVzcycpIGJhc2VDbGFzcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gbWFrZSB0aGUgcHJvZ3Jlc3MgbGluZWFyLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBhY2Nlc3MgYW55IG9mIHRoZSBzdGVwcyBhdCBhbnkgdGltZSAobGlrZSB0YWJzKS5cbiAgICovXG4gIEBJbnB1dCgpIGxpbmVhciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVkaXQgYSBzdGVwIGFmdGVyIGNvbXBsZXRlZC5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRhYmxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBpbmRleCBpcyBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBzdGVwcyBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgc3RlcHNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGVwcyBmb3IgdGhlIGBQcm9ncmVzc2AgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgZ2V0IHN0ZXBzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGVwcztcbiAgfVxuICBzZXQgc3RlcHModmFsdWUpIHtcbiAgICB0aGlzLl9zdGVwcyA9IHZhbHVlO1xuXG4gICAgdGhpcy5zdGVwc0NoYW5nZS5lbWl0KHRoaXMuX3N0ZXBzKTtcbiAgfVxuXG4gIHNlbGVjdChuZXdJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IG5ld0luZGV4KSB7XG4gICAgICAgIHN0ZXAuY3VycmVudCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHN0ZXAuY3VycmVudCkge1xuICAgICAgICBkZWxldGUgc3RlcC5jdXJyZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KG5ld0luZGV4KTtcblxuICAgIHRoaXMuc3RlcHMgPSB0aGlzLl9zdGVwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIGlzQ29tcGxldGUoc3RlcDogUHJvZ3Jlc3NTdGVwKSB7XG4gICAgcmV0dXJuIHN0ZXAuc3RhdGUgPT09ICdjb21wbGV0ZSc7XG4gIH1cblxuICAvKipcbiAgICogU3RlcCBpcyBlZGl0YWJsZS5cbiAgICovXG4gIGlzRWRpdGFibGUoc3RlcDogUHJvZ3Jlc3NTdGVwKSB7XG4gICAgcmV0dXJuIHN0ZXAuc3RhdGUgPT09ICdjb21wbGV0ZScgJiYgdGhpcy5lZGl0YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIGlzIHVuY2xpY2thYmxlLlxuICAgKi9cbiAgaXNVbmNsaWNrYWJsZShzdGVwOiBQcm9ncmVzc1N0ZXAsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoc3RlcC5zdGF0ZSA9PT0gJ2NvbXBsZXRlJyAmJiAhdGhpcy5lZGl0YWJsZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGVwLnN0YXRlID09PSAnaW5jb21wbGV0ZScgJiYgIXRoaXMubGluZWFyICYmIGluZGV4ICE9PSB0aGlzLmdldE5leHRVbmNvbXBsZXRlZFN0ZXBJbmRleCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgdW5jb21wbGV0ZWQgc3RlcC5cbiAgICovXG4gIGdldE5leHRVbmNvbXBsZXRlZFN0ZXBJbmRleCgpOiBudW1iZXIge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGVwXSBvZiB0aGlzLnN0ZXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0ZXAuc3RhdGUgPT09ICdpbmNvbXBsZXRlJykge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGVwLlxuICAgKi9cbiAgY3VycmVudFN0ZXAoKSB7XG4gICAgZm9yIChjb25zdCBbXywgc3RlcF0gb2YgdGhpcy5zdGVwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChzdGVwLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmV4dCBzdGVwLlxuICAgKi9cbiAgbmV4dFN0ZXAoKSB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IC0xO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0ZXBdIG9mIHRoaXMuc3RlcHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc3RlcC5jdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwICYmIGN1cnJlbnRJbmRleCArIDEgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RlcCBpbmRleC5cbiAgICovXG4gIGdldEN1cnJlbnRTdGVwSW5kZXgoKSB7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0ZXBdIG9mIHRoaXMuc3RlcHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc3RlcC5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiJdfQ==