mirror of
				https://github.com/yuzu-emu/liftinstall.git
				synced 2025-11-04 10:44:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			369 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			369 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!doctype html>
 | 
						|
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
 | 
						|
<head>
 | 
						|
    <meta charset="UTF-8">
 | 
						|
    <meta name="viewport"
 | 
						|
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 | 
						|
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 | 
						|
    <title id="window-title">... Installer</title>
 | 
						|
 | 
						|
    <link rel="icon" href="/favicon.ico" />
 | 
						|
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
 | 
						|
 | 
						|
    <link rel="stylesheet" href="/css/bulma.min.css" type="text/css">
 | 
						|
    <link rel="stylesheet" href="/css/main.css" type="text/css">
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
    <div id="app">
 | 
						|
        <!-- Main content -->
 | 
						|
        <section class="section">
 | 
						|
            <div class="container">
 | 
						|
                <div class="columns">
 | 
						|
                    <div class="column is-one-third" v-if="!is_launcher">
 | 
						|
                        <h1 class="title">
 | 
						|
                            Welcome to the {{ attrs.name }} installer!
 | 
						|
                        </h1>
 | 
						|
                        <h2 class="subtitle">
 | 
						|
                            We will have you up and running in just a few moments.
 | 
						|
                        </h2>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-if="has_error">
 | 
						|
                        <h4 class="subtitle">An error occurred:</h4>
 | 
						|
 | 
						|
                        <code>{{ error }}</code>
 | 
						|
 | 
						|
 | 
						|
                        <a class="button is-primary is-pulled-right" v-on:click="back_to_packages">Back</a>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else-if="is_downloading_config">
 | 
						|
                        <h4 class="subtitle">Downloading config...</h4>
 | 
						|
 | 
						|
                        <div v-html="progress_message"></div>
 | 
						|
                        <progress class="progress is-info is-medium" v-bind:value="progress" max="100">
 | 
						|
                            {{ progress }}%
 | 
						|
                        </progress>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else-if="modify_install">
 | 
						|
                        <h4 class="subtitle">Choose an option:</h4>
 | 
						|
 | 
						|
                        <div class="field is-grouped">
 | 
						|
                            <p class="control">
 | 
						|
                                <a class="button is-link" v-on:click="install">
 | 
						|
                                    Update
 | 
						|
                                </a>
 | 
						|
                            </p>
 | 
						|
                            <p class="control">
 | 
						|
                                <a class="button" v-on:click="modify_packages">
 | 
						|
                                    Modify
 | 
						|
                                </a>
 | 
						|
                            </p>
 | 
						|
                            <p class="control">
 | 
						|
                                <a class="button is-danger" v-on:click="prepare_uninstall">
 | 
						|
                                    Uninstall
 | 
						|
                                </a>
 | 
						|
                            </p>
 | 
						|
                        </div>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else-if="select_packages">
 | 
						|
                        <h4 class="subtitle">Select your preferred settings:</h4>
 | 
						|
 | 
						|
                        <!-- Build options -->
 | 
						|
                        <div class="tile is-ancestor">
 | 
						|
                            <div class="tile is-parent" v-for="package in config.packages" :index="package.name">
 | 
						|
                                <div class="tile is-child">
 | 
						|
                                    <div class="box">
 | 
						|
                                        <label class="checkbox">
 | 
						|
                                            <input type="checkbox" v-model="package.default" />
 | 
						|
                                            {{ package.name }}
 | 
						|
                                            <span v-if="package.installed"><i>(installed)</i></span>
 | 
						|
                                        </label>
 | 
						|
                                        <p>
 | 
						|
                                            {{ package.description }}
 | 
						|
                                        </p>
 | 
						|
                                    </div>
 | 
						|
                                </div>
 | 
						|
                            </div>
 | 
						|
                        </div>
 | 
						|
 | 
						|
                        <div class="subtitle is-6" v-if="show_install_location">Install Location</div>
 | 
						|
                        <div class="field has-addons" v-if="show_install_location">
 | 
						|
                            <div class="control is-expanded">
 | 
						|
                                <input class="input" type="text" v-model="install_location"
 | 
						|
                                       placeholder="Enter a install path here">
 | 
						|
                            </div>
 | 
						|
                            <div class="control">
 | 
						|
                                <a class="button is-info" v-on:click="select_file">
 | 
						|
                                    Select
 | 
						|
                                </a>
 | 
						|
                            </div>
 | 
						|
                        </div>
 | 
						|
 | 
						|
                        <a class="button is-primary is-pulled-right" v-on:click="install">Install!</a>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else-if="is_installing">
 | 
						|
                        <h4 class="subtitle" v-if="is_launcher">Checking for updates...</h4>
 | 
						|
                        <h4 class="subtitle" v-else>Installing...</h4>
 | 
						|
                        <div v-html="config.installing_message"></div>
 | 
						|
                        <br />
 | 
						|
 | 
						|
                        <div v-html="progress_message"></div>
 | 
						|
                        <progress class="progress is-info is-medium" v-bind:value="progress" max="100">
 | 
						|
                            {{ progress }}%
 | 
						|
                        </progress>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else-if="is_finished">
 | 
						|
                        <h4 class="subtitle">Thanks for installing {{ attrs.name }}!</h4>
 | 
						|
 | 
						|
                        <a class="button is-primary is-pulled-right" v-on:click="exit">Exit</a>
 | 
						|
                    </div>
 | 
						|
 | 
						|
                    <div class="column" v-else>
 | 
						|
                        <h4 class="subtitle">Oh no!</h4>
 | 
						|
                        <div>A error occurred during installation. Please retry!</div>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
            </div>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <div class="modal is-active" v-if="confirm_uninstall">
 | 
						|
            <div class="modal-background"></div>
 | 
						|
            <div class="modal-card">
 | 
						|
                <header class="modal-card-head">
 | 
						|
                    <p class="modal-card-title">Are you sure you want to uninstall {{ attrs.name }}?</p>
 | 
						|
                </header>
 | 
						|
                <footer class="modal-card-foot">
 | 
						|
                    <button class="button is-danger" v-on:click="uninstall">Yes</button>
 | 
						|
                    <button class="button" v-on:click="cancel_uninstall">No</button>
 | 
						|
                </footer>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <script src="/api/attrs"></script>
 | 
						|
    <script src="/js/helpers.js"></script>
 | 
						|
    <script src="/js/vue.min.js"></script>
 | 
						|
    <script>
 | 
						|
        // Overwrite loggers with the logging backend
 | 
						|
        window.onerror = function(msg, url, line) {
 | 
						|
            window.external.invoke(JSON.stringify({
 | 
						|
                Log: {
 | 
						|
                    kind: "error",
 | 
						|
                    msg: msg + " @ " + url + ":" + line
 | 
						|
                }
 | 
						|
            }));
 | 
						|
        };
 | 
						|
 | 
						|
        // Borrowed from http://tobyho.com/2012/07/27/taking-over-console-log/
 | 
						|
        function intercept(method){
 | 
						|
            console[method] = function(){
 | 
						|
                var message = Array.prototype.slice.apply(arguments).join(' ');
 | 
						|
                window.external.invoke(JSON.stringify({
 | 
						|
                    Log: {
 | 
						|
                        kind: method,
 | 
						|
                        msg: message
 | 
						|
                    }
 | 
						|
                }));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        var methods = ['log', 'warn', 'error'];
 | 
						|
        for (var i = 0; i < methods.length; i++) {
 | 
						|
            intercept(methods[i]);
 | 
						|
        }
 | 
						|
 | 
						|
        document.getElementById("window-title").innerText = base_attributes.name + " Installer";
 | 
						|
 | 
						|
        function selectFileCallback(name) {
 | 
						|
            app.install_location = name;
 | 
						|
        }
 | 
						|
 | 
						|
        var app = new Vue({
 | 
						|
            el: '#app',
 | 
						|
            data: {
 | 
						|
                attrs: base_attributes,
 | 
						|
                config : {},
 | 
						|
                install_location : "",
 | 
						|
                // If the initial modify menu should be shown
 | 
						|
                modify_install : false,
 | 
						|
                // If the package selection screen should be shown
 | 
						|
                select_packages : true,
 | 
						|
                // If an installation operation is happening
 | 
						|
                is_installing : false,
 | 
						|
                // If an installation has completed successfully
 | 
						|
                is_finished : false,
 | 
						|
                // If the application should act as an launcher, rather than as an installer
 | 
						|
                is_launcher : false,
 | 
						|
                launcher_path : undefined,
 | 
						|
                // If a confirmation prompt should be shown
 | 
						|
                confirm_uninstall : false,
 | 
						|
                // If the downloading config page should be shown
 | 
						|
                is_downloading_config : false,
 | 
						|
                progress : 0,
 | 
						|
                progress_message : "",
 | 
						|
                has_error : false,
 | 
						|
                // If the option to pick an install location should be provided
 | 
						|
                show_install_location : true,
 | 
						|
                error : "",
 | 
						|
                metadata : {
 | 
						|
                    database : [],
 | 
						|
                    install_path : "",
 | 
						|
                    preexisting_install : false
 | 
						|
                }
 | 
						|
            },
 | 
						|
            methods: {
 | 
						|
                "download_config": function() {
 | 
						|
                    app.is_downloading_config = true;
 | 
						|
 | 
						|
                    ajax("/api/config", function(e) {
 | 
						|
                        app.download_install_status();
 | 
						|
                        app.config = e;
 | 
						|
                    });
 | 
						|
                },
 | 
						|
                "download_install_status": function() {
 | 
						|
                    ajax("/api/installation-status", function(e) {
 | 
						|
                        app.is_downloading_config = false;
 | 
						|
                        app.metadata = e;
 | 
						|
                        if (e.preexisting_install) {
 | 
						|
                            app.modify_install = true;
 | 
						|
                            app.select_packages = false;
 | 
						|
                            app.show_install_location = false;
 | 
						|
                            app.install_location = e.install_path;
 | 
						|
 | 
						|
                            // Copy over installed packages
 | 
						|
                            for (var x = 0; x < app.config.packages.length; x++) {
 | 
						|
                                app.config.packages[x].default = false;
 | 
						|
                                app.config.packages[x].installed = false;
 | 
						|
                            }
 | 
						|
 | 
						|
                            for (var i = 0; i < app.metadata.database.length; i++) {
 | 
						|
                                // Find this config package
 | 
						|
                                for (var x = 0; x < app.config.packages.length; x++) {
 | 
						|
                                    if (app.config.packages[x].name === app.metadata.database[i].name) {
 | 
						|
                                        app.config.packages[x].default = true;
 | 
						|
                                        app.config.packages[x].installed = true;
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
 | 
						|
                            if (e.is_launcher) {
 | 
						|
                                document.getElementById("window-title").innerText = config.name + " Updater";
 | 
						|
 | 
						|
                                app.is_launcher = true;
 | 
						|
                                app.install();
 | 
						|
                            }
 | 
						|
                        } else {
 | 
						|
                            for (var x = 0; x < app.config.packages.length; x++) {
 | 
						|
                                app.config.packages[x].installed = false;
 | 
						|
                            }
 | 
						|
 | 
						|
                            ajax("/api/default-path", function(e) {
 | 
						|
                                if (e.path != null) {
 | 
						|
                                    app.install_location = e.path;
 | 
						|
                                }
 | 
						|
                            });
 | 
						|
                        }
 | 
						|
                    });
 | 
						|
                },
 | 
						|
                "select_file": function() {
 | 
						|
                    window.external.invoke(JSON.stringify({
 | 
						|
                        SelectInstallDir: {
 | 
						|
                            callback_name: "selectFileCallback"
 | 
						|
                        }
 | 
						|
                    }));
 | 
						|
                },
 | 
						|
                "install": function() {
 | 
						|
                    this.is_installing = true;
 | 
						|
                    this.modify_install = false;
 | 
						|
                    this.select_packages = false;
 | 
						|
 | 
						|
                    var results = {};
 | 
						|
 | 
						|
                    for (var package_index = 0; package_index < this.config.packages.length; package_index++) {
 | 
						|
                        var current_package = this.config.packages[package_index];
 | 
						|
                        if (current_package.default != null) {
 | 
						|
                            results[current_package.name] = current_package.default;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    results["path"] = this.install_location;
 | 
						|
 | 
						|
                    stream_ajax("/api/start-install", function(line) {
 | 
						|
                        if (line.hasOwnProperty("Status")) {
 | 
						|
                            app.progress_message = line.Status[0];
 | 
						|
                            app.progress = line.Status[1] * 100;
 | 
						|
                        }
 | 
						|
 | 
						|
                        if (line.hasOwnProperty("Error")) {
 | 
						|
                            app.is_installing = false;
 | 
						|
                            app.has_error = true;
 | 
						|
                            app.error = line.Error;
 | 
						|
 | 
						|
                            // Exit anyway - don't want to disturb the user
 | 
						|
                            if (app.is_launcher) {
 | 
						|
                                app.exit();
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }, function(e) {
 | 
						|
                        app.is_installing = false;
 | 
						|
                        if (app.is_launcher) {
 | 
						|
                            app.exit();
 | 
						|
                        } else {
 | 
						|
                            app.is_finished = true;
 | 
						|
                        }
 | 
						|
                    }, undefined, results);
 | 
						|
                },
 | 
						|
                "back_to_packages": function() {
 | 
						|
                    app.select_packages = true;
 | 
						|
                    app.has_error = false;
 | 
						|
                    app.is_installing = false;
 | 
						|
                    app.is_finished = false;
 | 
						|
                },
 | 
						|
                "prepare_uninstall": function() {
 | 
						|
                    app.confirm_uninstall = true;
 | 
						|
                },
 | 
						|
                "cancel_uninstall": function() {
 | 
						|
                    app.confirm_uninstall = false;
 | 
						|
                },
 | 
						|
                "modify_packages": function() {
 | 
						|
                    app.select_packages = true;
 | 
						|
                    app.modify_install = false;
 | 
						|
                },
 | 
						|
                "uninstall": function() {
 | 
						|
                    app.is_installing = true;
 | 
						|
                    app.confirm_uninstall = false;
 | 
						|
                    app.modify_install = false;
 | 
						|
                    app.select_packages = false;
 | 
						|
 | 
						|
                    stream_ajax("/api/uninstall", function(line) {
 | 
						|
                        if (line.hasOwnProperty("Status")) {
 | 
						|
                            app.progress_message = line.Status[0];
 | 
						|
                            app.progress = line.Status[1] * 100;
 | 
						|
                        }
 | 
						|
 | 
						|
                        if (line.hasOwnProperty("Error")) {
 | 
						|
                            app.is_installing = false;
 | 
						|
                            app.has_error = true;
 | 
						|
                            app.error = line.Error;
 | 
						|
                        }
 | 
						|
                    }, function(e) {
 | 
						|
                        app.is_installing = false;
 | 
						|
                        app.is_finished = true;
 | 
						|
                    }, undefined, {});
 | 
						|
                },
 | 
						|
                "exit": function() {
 | 
						|
                    ajax("/api/exit", function() {});
 | 
						|
                }
 | 
						|
            }
 | 
						|
        });
 | 
						|
 | 
						|
        app.download_config();
 | 
						|
    </script>
 | 
						|
</body>
 | 
						|
</html>
 |