import { Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { isThisMonth } from 'date-fns'; import { WizardEvent, WizardEventType } from '../model/wizard.model'; @Injectable({ providedIn: 'root' }) export class WizardService { private wizardData:Subject = new Subject(); //用于存储当前显示pageid currentPageId:string; // 保存数据 private wizardPagesData = {}; //是否平铺 private pageFill = true; /** * 对象结构 * { * "activeIndex":-1, "stepMessages":[ { "id":"deliverytime", "title":"设置发货时间", "icon":"" },....] } */ private onlyProgressData = null; // 步骤条数据保持 private progressData: Subject = new Subject(); // 当前向导状态 private wizardState: Subject = new Subject(); // 修改向导步骤 changeActiveIndex: Subject = new Subject(); constructor() { this.progressData.subscribe(data => { this.onlyProgressData = data; }); } //存储页面是否平铺 updatePageFill(fill:boolean){ this.pageFill = fill; } getPageFill(){ return this.pageFill; } /** * 更新向导状态 * state: Finish,Cancel,Prev,Next */ updateWizardState(state: WizardEventType, curPageId: string, stepToPageId?:string) { let toPageId = ''; switch (state) { case WizardEventType.Prev: toPageId = this.getPrePageId(curPageId); break; case WizardEventType.Next: toPageId = this.getNextPageId(curPageId); break; case WizardEventType.StepChange: toPageId = stepToPageId ? stepToPageId: curPageId break; case WizardEventType.ChangeIndex: toPageId = stepToPageId !== '' ? stepToPageId: curPageId break default: toPageId = curPageId; } // 只有页面变化时候,才改变 if (!toPageId) { return; } this.currentPageId = toPageId; this.wizardState.next(new WizardEvent(state, curPageId, toPageId)); } /** * 获取向导状态变化 */ getWizardState() { return this.wizardState; } /** * 获取整个向导用的数据 * 场景:向导整体数据,在不同页之间通用 */ getWizardData(){ return this.wizardData; } /** * 设置向导用的数据 * 场景:向导整体数据,在不同页之间通用 */ setWizardData(data){ this.wizardData.next(data); } /** * 设置某页面数据 * @param pageid * @param data */ setPageData(data,pageid?: string) { let id = pageid? pageid : this.currentPageId; this.wizardPagesData[id] = data; } /** * 获取某页面数据 * @param pageid */ getPageData(pageid) { if (this.wizardPagesData.hasOwnProperty(pageid)) { return this.wizardPagesData[pageid]; } return {}; } // /** // * 场景:Wizard组件初始化步骤条数据 // * @param data // */ // initProgressData(data) { // this.progressData.next(data); // } /** * 目的:更新步骤条数据 * 场景:PageDetail组件,需要更新步骤数据,刷新步骤条界面 */ updateProgressData(data) { this.progressData.next(data); } /** * 目的:获取步骤条数据 * 场景:PageDetail组件,查看步骤条数据 */ getProgressData() { return this.progressData; } /**存储currentpageid */ updateCurrentPageId(id:string){ this.currentPageId = id ; } getCurrentPageId(){ return this.currentPageId; } /** * 获取上一页pageid * @param pageid */ getPrePageId(pageid?: string): string { let id:string; id = pageid?pageid:this.currentPageId; const pageIdIndex = this.getIndexByPageId(id); if (pageIdIndex <= 0) { return ''; } let prePage = this.onlyProgressData.stepMessages[pageIdIndex - 1]; return prePage['id']; } /** * 获取下一页 * @param pageid */ getNextPageId(pageid): string { const pagelen = this.onlyProgressData.stepMessages.length; const pageIdIndex = this.getIndexByPageId(pageid); if (pageIdIndex == pagelen - 1) { return ''; } let nextPage = this.onlyProgressData.stepMessages[pageIdIndex + 1]; return nextPage['id']; } /** * 是否是最后一页 * @param pageid */ isLastPage(pageid): boolean { const pagelen = this.onlyProgressData.length; let lastPage = this.onlyProgressData.stepMessages[pagelen - 1]; return lastPage['id'] == pageid; } /** * 是否是当前页 * @param pageid */ isCurrentPage(pageid): boolean { const activeIndex = this.onlyProgressData.activeIndex; if (activeIndex < 0) { return false; } let curPage = this.onlyProgressData.stepMessages[activeIndex]; return curPage['id'] == pageid; } /** * 是否是初始页 * @param pageid */ isFirstPage(pageid): boolean { if (this.onlyProgressData.activeIndex < 0) { return false; } return this.onlyProgressData.stepMessages[0]['id'] == pageid; } /** * 根据ID获取index * @param pageid */ getIndexByPageId(pageid): number { if(this.onlyProgressData&&this.onlyProgressData.hasOwnProperty('stepMessages')){ let pageIdIndex = this.onlyProgressData.stepMessages.findIndex(item => { if (item['id'] == pageid) { return true; } return false; }); return pageIdIndex; } } //20190211 服务内新增事件 /** * 下一步 */ nextStep() { this.updateWizardState(WizardEventType.Next, this.currentPageId); } /** * 上一步 */ prevStep() { this.updateWizardState(WizardEventType.Prev, this.currentPageId); } /** * 结束向导 */ finishWizard() { this.updateWizardState(WizardEventType.Finish, this.currentPageId); } /** * 取消向导 */ cancelWizard() { this.updateWizardState(WizardEventType.Cancel, this.currentPageId); } /** * 修改向导显示步骤 * @param num 索引 0开始 */ setActiveIndex(num:number){ let toPageId; if(this.onlyProgressData&&this.onlyProgressData.hasOwnProperty('stepMessages')){ let activeNum:number = (num>= 0 && num < this.onlyProgressData.stepMessages.length)? num: 0 toPageId = this.onlyProgressData.stepMessages[activeNum]['id']; } this.updateWizardState(WizardEventType.ChangeIndex, this.currentPageId, toPageId); this.changeActiveIndex.next(num); } }