function()

in source/html/js/app/statemachine.js [5:301]


    function(connections, regions_promise, model, settings_menu, _, machina, plugins, api_check, confirmation) {

        // This FSM tracks the state of configuration loading at tool startup
        var configurationStateMachine = new machina.Fsm({
            namespace: "configuration",
            initialState: "uninitialized",
            states: {
                uninitialized: {
                    "*": function() {
                        this.deferUntilTransition();
                        this.transition("get-saved-connection");
                    }
                },
                "get-saved-connection": {
                    _onEnter: function() {
                        var current_connection = connections.get_current();
                        if (null === current_connection) {
                            console.log("no connection history");
                            this.noSavedConnection();
                        } else {
                            console.log("testing last connection used");
                            // test current connection with api-ping
                            var endpoint = current_connection[0];
                            var api_key = current_connection[1];
                            var instance = this;
                            api_check.ping(endpoint, api_key).then(function(response) {
                                // test worked
                                console.log("still working");
                                console.log(response);
                                instance.connectionExists();
                            }).catch(function(error) {
                                console.log("not working");
                                instance.noSavedConnection();
                            });
                        }
                    },
                    "noSavedConnection": "get-connection-from-ui",
                    "connectionExists": "get-saved-regions"
                },
                "get-connection-from-ui": {
                    _onEnter: function() {
                        console.log("prompting for connection");
                        settings_menu.setConnectionAlert("One working endpoint connection is required");
                        settings_menu.showConnectionDialog();
                    },
                    _onExit: function() {
                        settings_menu.clearConnectionAlert();
                    },
                    "connectionChanged": "get-saved-regions",
                },
                "get-saved-regions": {
                    _onEnter: function() {
                        var instance = this;
                        regions_promise().then(function(regions) {
                            if (regions.get_selected().length > 0) {
                                console.log("using saved region selectons");
                                instance.regionsExist();
                            } else {
                                console.log("no previously selected regions");
                                instance.noSavedRegions();
                            }
                        }).catch(function(error) {
                            console.log(error);
                        });
                    },
                    "noSavedRegions": "get-regions-from-ui",
                    "regionsExist": "configuration-ready",
                },
                "get-regions-from-ui": {
                    _onEnter: function() {
                        // update and show the region selection dialog
                        settings_menu.showRegionSelectionDialog();
                    },
                    "regionsChanged": "configuration-ready",
                },
                "configuration-ready": {
                    _onEnter: function() {
                        this.handle("configurationReady");
                    }
                }
            },
            connectionChanged: function() {
                this.handle("connectionChanged");
            },
            connectionExists: function() {
                this.handle("connectionExists");
            },
            noSavedConnection: function() {
                this.handle("noSavedConnection");
            },
            noSavedRegions: function() {
                this.handle("noSavedRegions");
            },
            regionsRetrieved: function() {
                this.handle("regionsRetrieved");
            },
            regionsChanged: function() {
                this.handle("regionsChanged");
            },
            regionsExist: function() {
                this.handle("regionsExist");
            },
            start: function() {
                this.handle("start");
            }
        });

        // This FSM tracks the state of model data initial loading
        var modelDataStateMachine = new machina.Fsm({
            namespace: "model",
            initialState: "uninitialized",
            states: {
                uninitialized: {
                    "*": function() {
                        this.deferUntilTransition();
                        this.transition("get-saved-channels");
                    }
                },
                "get-saved-channels": {
                    // pull in settings from Dynamo, later
                    _onEnter: function() {
                        this.transition("get-saved-layouts");
                    }
                },
                "get-saved-layouts": {
                    // pull in settings from Dynamo, later
                    _onEnter: function() {
                        this.transition("get-associated-alarms");
                    }
                },
                "get-associated-alarms": {
                    // pull in settings from Dynamo, later
                    _onEnter: function() {
                        this.transition("get-model-data");
                    }
                },
                "get-model-data": {
                    _onEnter: function() {
                        var ref = this;
                        // load the overlays
                        require(Array.from(plugins.overlays).concat(plugins["default-overlay"]), function() {
                            // create a closed callback
                            var f = (function() {
                                return function() {
                                    ref.handle("modelDataReady");
                                };
                            })();
                            // tell the model module to map the services
                            model.map(f);
                        });
                    },
                    modelDataReady: "model-data-ready"
                },
                "model-data-ready": {
                    // done
                    _onEnter: function() {
                        this.handle("modelDataReady");
                    },
                    refreshModelData: "get-saved-channels"
                }
            },
            "start": function() {
                this.handle("start");
            },
            "modelDataReady": function() {
                this.handle("modelDataReady");
            }
        });

        var toolStateMachine = new machina.Fsm({
            namespace: "tool",
            initialState: "uninitialized",
            states: {
                uninitialized: {
                    "*": function() {
                        this.deferUntilTransition();
                        this.transition("disable-ui");
                    }
                },
                "disable-ui": {
                    _onEnter: function() {
                        this.transition("get-configuration");
                    }
                },
                "get-configuration": {
                    _child: configurationStateMachine,
                    configurationReady: "enable-ui"
                },
                "enable-ui": {
                    _onEnter: function() {
                        this.transition("get-model-data");
                    }
                },
                "get-model-data": {
                    _child: modelDataStateMachine,
                    modelDataReady: "update-visual-model"
                },
                "update-visual-model": {
                    _onEnter: function() {
                        this.handle("visualModelReady");
                    },
                    "visualModelReady": "visual-model-fresh"
                        // update tile view, select first tile
                        // update channel view (this happens with tile selection)

                },
                "visual-model-fresh": {
                    _onEnter: function() {
                        // initialize the next set of UI modules that depend on the model and global view
                        require([
                            "app/ui/alarms_menu",
                            "app/ui/alarm_indicators",
                            "app/ui/channels_menu",
                            "app/ui/diagram_menu",
                            "app/ui/dragdrop",
                            "app/ui/event_alert_indicators",
                            "app/ui/informational_overlays",
                            "app/ui/monitor_view",
                            "app/ui/nodes_menu",
                            "app/ui/search_view",
                            "app/ui/selected_item_view",
                            "app/ui/tile_view",
                            "app/ui/tools_menu",
                            "app/ui/information_compartment",
                            "app/ui/user_defined"
                        ]);
                        // show the tiles tab
                        $("#channel-tiles-tab").tab('show');
                    },
                    // start a timer and/or events to watch model data
                    refreshModelData: function() {
                        // model.reset();
                        // hold the input until after transitioning to the next state
                        this.deferUntilTransition();
                        this.transition("get-model-data");
                    },
                    "connectionChanged": function() {
                        // prompt for reload
                        confirmation.show("<p>Would you like to reload from the new endpoint?</p>", function() {
                            window.location.reload();
                        });
                    },
                    "regionsChanged": function() {
                        // prompt for reload
                        confirmation.show("<p>Would you like to reload for the changed regions?</p>", function() {
                            window.location.reload();
                        });
                    }
                },
                "visual-model-stale": {
                    // transitions here when model needs to update storage or reverse
                }
            },
            "start": function() {
                this.handle("start");
            },
            "refreshModelData": function() {
                this.handle("refreshModelData");
            },
            "visualModelReady": function() {
                this.handle("visualModelReady");
            },
            connectionChanged: function() {
                this.handle("connectionChanged");
            },
            connectionExists: function() {
                this.handle("connectionExists");
            },
            noSavedConnection: function() {
                this.handle("noSavedConnection");
            },
            regionsChanged: function() {
                this.handle("regionsChanged");
            },
            regionsExist: function() {
                this.handle("regionsExist");
            }
        });

        // development logging
        toolStateMachine.on("transition", function(data) {
            // log the state transitions of the FSMs
            console.log(data);
        });

        return {
            "getConfigurationStateMachine": function() {
                return configurationStateMachine;
            },
            "getModelDataStateMachine": function() {
                return modelDataStateMachine;
            },
            "getToolStateMachine": function() {
                return toolStateMachine;
            }
        };
    });