123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*!
- * All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- * See https://github.com/Esri/calcite-components/blob/master/LICENSE.md for details.
- * v1.0.0-beta.82
- */
- import { Component, Element, Listen, Method, State, h } from "@stencil/core";
- import { CSS } from "./resources";
- import { createObserver } from "../../utils/observers";
- /**
- * @slot - A slot for adding `calcite-panel`s to the flow.
- */
- export class Flow {
- constructor() {
- this.panelCount = 0;
- this.flowDirection = null;
- this.panels = [];
- this.getFlowDirection = (oldPanelCount, newPanelCount) => {
- const allowRetreatingDirection = oldPanelCount > 1;
- const allowAdvancingDirection = oldPanelCount && newPanelCount > 1;
- if (!allowAdvancingDirection && !allowRetreatingDirection) {
- return null;
- }
- return newPanelCount < oldPanelCount ? "retreating" : "advancing";
- };
- this.updateFlowProps = () => {
- const { panels } = this;
- const newPanels = Array.from(this.el.querySelectorAll("calcite-panel"));
- const oldPanelCount = panels.length;
- const newPanelCount = newPanels.length;
- const activePanel = newPanels[newPanelCount - 1];
- const previousPanel = newPanels[newPanelCount - 2];
- if (newPanelCount && activePanel) {
- newPanels.forEach((panelNode) => {
- panelNode.showBackButton = newPanelCount > 1;
- panelNode.hidden = panelNode !== activePanel;
- });
- }
- if (previousPanel) {
- previousPanel.menuOpen = false;
- }
- this.panels = newPanels;
- if (oldPanelCount !== newPanelCount) {
- const flowDirection = this.getFlowDirection(oldPanelCount, newPanelCount);
- this.panelCount = newPanelCount;
- this.flowDirection = flowDirection;
- }
- };
- this.panelItemMutationObserver = createObserver("mutation", this.updateFlowProps);
- }
- // --------------------------------------------------------------------------
- //
- // Public Methods
- //
- // --------------------------------------------------------------------------
- /**
- * Removes the currently active `calcite-panel`.
- */
- async back() {
- const lastItem = this.el.querySelector("calcite-panel:last-child");
- if (!lastItem) {
- return;
- }
- const beforeBack = lastItem.beforeBack
- ? lastItem.beforeBack
- : () => Promise.resolve();
- return beforeBack.call(lastItem).then(() => {
- lastItem.remove();
- return lastItem;
- });
- }
- // --------------------------------------------------------------------------
- //
- // Lifecycle
- //
- // --------------------------------------------------------------------------
- connectedCallback() {
- var _a;
- (_a = this.panelItemMutationObserver) === null || _a === void 0 ? void 0 : _a.observe(this.el, { childList: true, subtree: true });
- this.updateFlowProps();
- }
- disconnectedCallback() {
- var _a;
- (_a = this.panelItemMutationObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
- }
- // --------------------------------------------------------------------------
- //
- // Private Methods
- //
- // --------------------------------------------------------------------------
- handleCalcitePanelBackClick() {
- this.back();
- }
- // --------------------------------------------------------------------------
- //
- // Render Methods
- //
- // --------------------------------------------------------------------------
- render() {
- const { flowDirection, panelCount } = this;
- const frameDirectionClasses = {
- [CSS.frame]: true,
- [CSS.frameAdvancing]: flowDirection === "advancing",
- [CSS.frameRetreating]: flowDirection === "retreating"
- };
- return (h("div", { class: frameDirectionClasses, key: panelCount },
- h("slot", null)));
- }
- static get is() { return "calcite-flow"; }
- static get encapsulation() { return "shadow"; }
- static get originalStyleUrls() { return {
- "$": ["flow.scss"]
- }; }
- static get styleUrls() { return {
- "$": ["flow.css"]
- }; }
- static get states() { return {
- "panelCount": {},
- "flowDirection": {},
- "panels": {}
- }; }
- static get methods() { return {
- "back": {
- "complexType": {
- "signature": "() => Promise<HTMLCalcitePanelElement>",
- "parameters": [],
- "references": {
- "Promise": {
- "location": "global"
- },
- "HTMLCalcitePanelElement": {
- "location": "global"
- }
- },
- "return": "Promise<HTMLCalcitePanelElement>"
- },
- "docs": {
- "text": "Removes the currently active `calcite-panel`.",
- "tags": []
- }
- }
- }; }
- static get elementRef() { return "el"; }
- static get listeners() { return [{
- "name": "calcitePanelBackClick",
- "method": "handleCalcitePanelBackClick",
- "target": undefined,
- "capture": false,
- "passive": false
- }]; }
- }
|