Complete wizard (1:1 features of original).
|
@ -5866,6 +5866,11 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"js-sha256": {
|
||||
"version": "0.9.0",
|
||||
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
|
||||
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
"@quasar/extras": "^1.0.0",
|
||||
"axios": "^0.21.1",
|
||||
"core-js": "^3.6.5",
|
||||
"js-sha256": "^0.9.0",
|
||||
"quasar": "^2.0.0",
|
||||
"three": "^0.132.2",
|
||||
"vanta": "^0.5.21",
|
||||
|
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 859 B After Width: | Height: | Size: 871 B |
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 10 KiB |
|
@ -88,7 +88,7 @@ module.exports = configure(function (ctx) {
|
|||
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
|
||||
framework: {
|
||||
config: {
|
||||
dark: 'auto'
|
||||
dark: "auto"
|
||||
},
|
||||
|
||||
// iconSet: 'material-icons', // Quasar icon set
|
||||
|
@ -103,7 +103,8 @@ module.exports = configure(function (ctx) {
|
|||
|
||||
// Quasar plugins
|
||||
plugins: [
|
||||
'Notify'
|
||||
"Notify",
|
||||
"Loading"
|
||||
]
|
||||
},
|
||||
|
||||
|
|
BIN
domain-server/resources/web/web-new/src/assets/hq1.jpg
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
domain-server/resources/web/web-new/src/assets/hub_world.zip
Normal file
|
@ -1,15 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360">
|
||||
<path
|
||||
d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" />
|
||||
<path fill="#050A14"
|
||||
d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" />
|
||||
<path fill="#00B4FF"
|
||||
d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" />
|
||||
<path fill="#00B4FF"
|
||||
d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" />
|
||||
<path fill="#050A14"
|
||||
d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" />
|
||||
<path fill="#00B4FF"
|
||||
d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" />
|
||||
<path fill="none" d="M-565.2 324H-252v15.8h-313.2z" />
|
||||
</svg>
|
Before Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 199 KiB |
|
@ -1,3 +1,11 @@
|
|||
// axios.ts
|
||||
//
|
||||
// Created by Kalila L. on Sep. 4th, 2021.
|
||||
// Copyright 2021 Vircadia contributors.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
||||
import { boot } from "quasar/wrappers";
|
||||
import axios, { AxiosInstance } from "axios";
|
||||
import Log from "../modules/utilities/log";
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
@submit="onSubmit"
|
||||
@reset="onReset"
|
||||
class="q-gutter-md"
|
||||
:autocomplete="AUTOCOMPLETE"
|
||||
>
|
||||
<q-input
|
||||
v-model="username"
|
||||
|
@ -66,7 +67,8 @@ export default {
|
|||
password: "",
|
||||
showPassword: false,
|
||||
// TODO: Needs to be stored somewhere central.
|
||||
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live"
|
||||
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
|
||||
AUTOCOMPLETE: false
|
||||
}),
|
||||
|
||||
methods: {
|
||||
|
|
|
@ -60,47 +60,48 @@ export default {
|
|||
"Authorization": `Bearer ${result.data.access_token}`
|
||||
}
|
||||
})
|
||||
.then(async (response) => {
|
||||
Log.info(Log.types.METAVERSE, `Successfully got Domain token for Metaverse linking.`);
|
||||
.catch((result) => {
|
||||
Log.error(Log.types.METAVERSE, "Failed to link server with Metaverse.");
|
||||
|
||||
var settingsToCommit = {
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: `Metaverse link attempt failed. ${result}`
|
||||
});
|
||||
})
|
||||
.then(async (response) => {
|
||||
Log.info(Log.types.METAVERSE, "Successfully got Domain token for Metaverse linking.");
|
||||
|
||||
const settingsToCommit = {
|
||||
"metaverse": {
|
||||
"access_token": response.data.data.token
|
||||
}
|
||||
};
|
||||
|
||||
var committed = await this.commitSettings(settingsToCommit);
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.METAVERSE, `Successfully committed Domain server access token for the Metaverse.`);
|
||||
Log.info(Log.types.METAVERSE, "Successfully committed Domain server access token for the Metaverse.");
|
||||
this.$q.notify({
|
||||
type: "positive",
|
||||
textColor: "white",
|
||||
icon: "cloud_done",
|
||||
message: `Successfully linked your server to the Metaverse.`
|
||||
message: "Successfully linked your server to the Metaverse."
|
||||
});
|
||||
|
||||
this.$emit("connectionResult", { "success": true });
|
||||
} else {
|
||||
Log.error(Log.types.METAVERSE, `Failed to link server with Metaverse: Could not commit token to settings.`);
|
||||
Log.error(Log.types.METAVERSE, "Failed to link server with Metaverse: Could not commit token to settings.");
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: `Metaverse link attempt failed because the settings were unable to be saved.`
|
||||
message: "Metaverse link attempt failed because the settings were unable to be saved."
|
||||
});
|
||||
|
||||
this.$emit("connectionResult", { "success": false });
|
||||
}
|
||||
})
|
||||
.catch((result) => {
|
||||
Log.error(Log.types.METAVERSE, `Failed to link server with Metaverse: ${result.responseJSON.error}`);
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: `Metaverse link attempt failed: ${result.responseJSON.error}`
|
||||
});
|
||||
});
|
||||
} else {
|
||||
this.$q.notify({
|
||||
|
@ -115,13 +116,13 @@ export default {
|
|||
// TODO: This needs to go somewhere universal.
|
||||
commitSettings (settingsToCommit) {
|
||||
// TODO: This and all other URL endpoints should be in centralized (in their respective module) constants files.
|
||||
return axios.post(`/settings.json`, JSON.stringify(settingsToCommit))
|
||||
.then((response) => {
|
||||
Log.info(Log.types.DOMAIN, `Successfully committed settings.`);
|
||||
return axios.post("/settings.json", JSON.stringify(settingsToCommit))
|
||||
.then(() => {
|
||||
Log.info(Log.types.DOMAIN, "Successfully committed settings.");
|
||||
return true;
|
||||
})
|
||||
.catch((response) => {
|
||||
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain.`);
|
||||
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain: ${response}`);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
<!--
|
||||
// index.template.html
|
||||
//
|
||||
// Created by Kalila L. on Sep. 4th, 2021.
|
||||
// Copyright 2021 Vircadia contributors.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
|
|
@ -148,6 +148,7 @@
|
|||
Start
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="mainWizardStep = FINAL_WIZARD_STEP"
|
||||
size="sm"
|
||||
flat
|
||||
>
|
||||
|
@ -173,30 +174,30 @@
|
|||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="$refs.stepper.next()"
|
||||
class="q-mb-md"
|
||||
size="md"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Skip
|
||||
</q-btn>
|
||||
<q-btn
|
||||
class="q-mb-md"
|
||||
size="sm"
|
||||
outline
|
||||
disabled
|
||||
text-color="white"
|
||||
icon-right="upload"
|
||||
>
|
||||
Import (coming soon)
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.next()"
|
||||
class="q-mb-md"
|
||||
size="sm"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Skip
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon-left="chevron_left"
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
|
@ -244,7 +245,7 @@
|
|||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon-left="chevron_left"
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
|
@ -264,8 +265,8 @@
|
|||
|
||||
<q-step
|
||||
:name="5"
|
||||
title="Security"
|
||||
caption="Optional"
|
||||
title="Access"
|
||||
caption="Recommended"
|
||||
:done="mainWizardStep > 5"
|
||||
>
|
||||
<q-card
|
||||
|
@ -275,6 +276,41 @@
|
|||
<div class="text-h6 text-weight-light text-center">Let's configure some security settings for your world.</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Who should be an <b>in-world admin</b> of your Domain?</div>
|
||||
<q-select
|
||||
label="Metaverse usernames (press enter)"
|
||||
filled
|
||||
v-model="administratorsListSecurityModel"
|
||||
use-input
|
||||
use-chips
|
||||
multiple
|
||||
hide-dropdown-icon
|
||||
input-debounce="0"
|
||||
new-value-mode="add-unique"
|
||||
/>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Who can <b>connect</b> to your Domain?</div>
|
||||
<q-option-group
|
||||
v-model="connectionSecurityModel"
|
||||
:options="connectionSecurityOptions"
|
||||
color="primary"
|
||||
type="checkbox"
|
||||
/>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Who can <b>rez</b> items in your Domain?</div>
|
||||
<q-option-group
|
||||
v-model="rezSecurityModel"
|
||||
:options="rezSecurityOptions"
|
||||
color="primary"
|
||||
type="checkbox"
|
||||
/>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="saveSecuritySettings"
|
||||
|
@ -290,13 +326,259 @@
|
|||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon-left="chevron_left"
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
</q-card-actions>
|
||||
</q-card>
|
||||
</q-step>
|
||||
|
||||
<q-step
|
||||
:name="6"
|
||||
title="Administrator"
|
||||
caption="Highly Recommended"
|
||||
:done="mainWizardStep > 6"
|
||||
>
|
||||
<q-card
|
||||
class="wizardCard"
|
||||
>
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Let's create a username and password for your Domain's administrator web panel.</div>
|
||||
<div class="text-h7 q-mt-sm text-weight-light text-center">Warning: Immediately after saving the credentials, you will be prompted to enter them into your browser to continue.</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<q-form
|
||||
@submit="onAdminStepSubmit"
|
||||
@reset="onAdminStepReset"
|
||||
class="q-gutter-md"
|
||||
>
|
||||
<q-input
|
||||
v-model="username"
|
||||
filled
|
||||
label="Username"
|
||||
hint="Enter your username."
|
||||
lazy-rules
|
||||
:rules="[ val => val && val.length > 0 || 'Please enter a username.']"
|
||||
/>
|
||||
|
||||
<q-input
|
||||
v-model="password"
|
||||
filled
|
||||
label="Password"
|
||||
:type="showPassword ? 'text' : 'password'"
|
||||
hint="Enter your password."
|
||||
lazy-rules
|
||||
:rules="[ val => val && val.length > 0 || 'Please enter a password.']"
|
||||
>
|
||||
<template v-slot:append>
|
||||
<q-icon
|
||||
:name="showPassword ? 'visibility' : 'visibility_off'"
|
||||
class="cursor-pointer"
|
||||
@click="showPassword = !showPassword"
|
||||
/>
|
||||
</template>
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="confirmPassword"
|
||||
filled
|
||||
label="Confirm Password"
|
||||
:type="showConfirmPassword ? 'text' : 'password'"
|
||||
hint="Enter your password again."
|
||||
lazy-rules
|
||||
:rules="[ val => val && val.length > 0 && val === password || 'Please ensure your passwords match.']"
|
||||
>
|
||||
<template v-slot:append>
|
||||
<q-icon
|
||||
:name="showConfirmPassword ? 'visibility' : 'visibility_off'"
|
||||
class="cursor-pointer"
|
||||
@click="showConfirmPassword = !showConfirmPassword"
|
||||
/>
|
||||
</template>
|
||||
</q-input>
|
||||
|
||||
<div align="right">
|
||||
<q-btn
|
||||
label="Clear"
|
||||
type="reset"
|
||||
size="md"
|
||||
class="q-mb-md q-mr-sm"
|
||||
flat
|
||||
/>
|
||||
<q-btn
|
||||
label="Save"
|
||||
type="submit"
|
||||
class="q-mb-md"
|
||||
size="md"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="key"
|
||||
/>
|
||||
</div>
|
||||
</q-form>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="$refs.stepper.next()"
|
||||
class="q-mb-md"
|
||||
size="sm"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Skip
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
</q-card-actions>
|
||||
</q-card>
|
||||
</q-step>
|
||||
|
||||
<q-step
|
||||
:name="7"
|
||||
title="Performance"
|
||||
caption=""
|
||||
:done="mainWizardStep > 7"
|
||||
>
|
||||
<q-card
|
||||
class="wizardCard"
|
||||
>
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Enable high performance mode?</div>
|
||||
<div class="text-h7 text-weight-light text-center">If you are hosting this Domain on your local computer and it is not very powerful, then consider leaving this off because the server will use more resources if it's busy, thereby slowing down your computer.
|
||||
If you are running this server on a powerful system (or a remote server) and intend to have a large audience, then turn this setting on.</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<q-toggle
|
||||
v-model="performanceMode"
|
||||
checked-icon="check"
|
||||
color="red"
|
||||
label="Performance Mode"
|
||||
unchecked-icon="clear"
|
||||
/>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="$refs.stepper.next()"
|
||||
class="q-mb-md"
|
||||
size="md"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Next
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
</q-card-actions>
|
||||
</q-card>
|
||||
</q-step>
|
||||
|
||||
<q-step
|
||||
:name="8"
|
||||
title="Done!"
|
||||
caption=""
|
||||
:done="mainWizardStep > 8"
|
||||
>
|
||||
<q-card
|
||||
class="wizardCard"
|
||||
>
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">👍</div>
|
||||
<div class="text-h6 text-weight-light text-center">All done! Let's get you on your way.</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="completeWizard"
|
||||
class="q-mb-md"
|
||||
size="md"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Complete
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
</q-card-actions>
|
||||
</q-card>
|
||||
</q-step>
|
||||
|
||||
<!-- <q-step
|
||||
:name="8"
|
||||
title="Starter Content"
|
||||
caption=""
|
||||
:done="mainWizardStep > 8"
|
||||
>
|
||||
<q-card
|
||||
class="wizardCard"
|
||||
>
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-weight-light text-center">Would you like a starter island in your Domain?</div>
|
||||
|
||||
<q-img
|
||||
src="../../assets/hq1.jpg"
|
||||
style="max-width: 400px; height: 200px;"
|
||||
fit="cover"
|
||||
></q-img>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<q-toggle
|
||||
v-model="starterContentToggle"
|
||||
checked-icon="check"
|
||||
color="red"
|
||||
label="Starter Content"
|
||||
unchecked-icon="clear"
|
||||
/>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-actions vertical align="right">
|
||||
<q-btn
|
||||
@click="$refs.stepper.next()"
|
||||
class="q-mb-md"
|
||||
size="md"
|
||||
outline
|
||||
text-color="white"
|
||||
icon-right="chevron_right"
|
||||
>
|
||||
Next
|
||||
</q-btn>
|
||||
<q-btn
|
||||
@click="$refs.stepper.previous()"
|
||||
size="sm"
|
||||
flat
|
||||
icon="chevron_left"
|
||||
>
|
||||
Back
|
||||
</q-btn>
|
||||
</q-card-actions>
|
||||
</q-card>
|
||||
</q-step> -->
|
||||
</q-stepper>
|
||||
</transition>
|
||||
</div>
|
||||
|
@ -305,9 +587,16 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
// FIXME: Needs to be done correctly. Also universally? Maybe window.axios?
|
||||
const axios = require("axios");
|
||||
const sha256 = require("js-sha256");
|
||||
|
||||
import { defineComponent, ref } from "vue";
|
||||
|
||||
// Components
|
||||
import ConnectMetaverse from "../../components/dialogs/ConnectMetaverse.vue";
|
||||
// Modules
|
||||
import Log from "../../modules/utilities/log";
|
||||
|
||||
export default defineComponent({
|
||||
name: "Index",
|
||||
|
@ -324,12 +613,56 @@ export default defineComponent({
|
|||
mainWizard: true,
|
||||
mainWizardStep: ref(1),
|
||||
// TODO: Needs to be based off of the actual state of the server's connection (using Vuex and retrieving settings on page load.)
|
||||
connectMetaverseSuccess: true,
|
||||
connectMetaverseSuccess: false,
|
||||
connectMetaverseDialog: false,
|
||||
// Security Step
|
||||
administratorsListSecurityModel: [],
|
||||
connectionSecurityModel: ref(["everyone"]),
|
||||
connectionSecurityOptions: [
|
||||
{
|
||||
label: "Friends",
|
||||
value: "friends"
|
||||
},
|
||||
{
|
||||
label: "Logged In",
|
||||
value: "logged-in"
|
||||
},
|
||||
{
|
||||
label: "Everyone (anonymous)",
|
||||
value: "everyone"
|
||||
}
|
||||
],
|
||||
rezSecurityModel: ref(["friends"]),
|
||||
rezSecurityOptions: [
|
||||
{
|
||||
label: "Friends",
|
||||
value: "friends"
|
||||
},
|
||||
{
|
||||
label: "Logged In",
|
||||
value: "logged-in"
|
||||
},
|
||||
{
|
||||
label: "Everyone (anonymous)",
|
||||
value: "everyone"
|
||||
}
|
||||
],
|
||||
// Administrator
|
||||
username: "",
|
||||
password: "",
|
||||
confirmPassword: "",
|
||||
showPassword: false,
|
||||
showConfirmPassword: false,
|
||||
// Performance
|
||||
performanceMode: true,
|
||||
// Starter Content
|
||||
starterContentToggle: true,
|
||||
// Consts
|
||||
WELCOME_TEXT_TIMEOUT: 4000,
|
||||
WELCOME_TEXT_TIMEOUT: 4500,
|
||||
MAIN_WIZARD_TRANSITION_TIME: 1000,
|
||||
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live"
|
||||
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
|
||||
FINAL_WIZARD_STEP: 8,
|
||||
COMPLETE_WIZARD_REDIRECT_DELAY: 4000
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -344,13 +677,303 @@ export default defineComponent({
|
|||
this.connectMetaverseDialog = true;
|
||||
},
|
||||
|
||||
onMetaverseConnectionAttempted () {
|
||||
this.connectMetaverseSuccess = true;
|
||||
onMetaverseConnectionAttempted (result) {
|
||||
this.connectMetaverseDialog = false;
|
||||
|
||||
if (result.success === true) {
|
||||
this.connectMetaverseSuccess = true;
|
||||
this.mainWizardStep++;
|
||||
}
|
||||
},
|
||||
|
||||
async saveSecuritySettings () {
|
||||
const friendsCanConnect = this.connectionSecurityModel.includes("friends");
|
||||
const friendsCanRez = this.rezSecurityModel.includes("friends");
|
||||
|
||||
const loggedInCanConnect = this.connectionSecurityModel.includes("logged-in");
|
||||
const loggedInCanRez = this.rezSecurityModel.includes("logged-in");
|
||||
|
||||
const everyoneCanConnect = this.connectionSecurityModel.includes("everyone");
|
||||
const everyoneCanRez = this.rezSecurityModel.includes("everyone");
|
||||
|
||||
// TODO: revisit methodology here, cloud domains don't need certain overrides for example.
|
||||
// However, local domain owners would.
|
||||
const localhostPermissions = true;
|
||||
|
||||
const administratorsPermissions = [];
|
||||
|
||||
this.administratorsListSecurityModel.forEach((adminUsername) => {
|
||||
administratorsPermissions.push({
|
||||
"id_can_adjust_locks": true,
|
||||
"id_can_connect": true,
|
||||
"id_can_connect_past_max_capacity": true,
|
||||
"id_can_get_and_set_private_user_data": true,
|
||||
"id_can_kick": true,
|
||||
"id_can_replace_content": true,
|
||||
"id_can_rez": true,
|
||||
"id_can_rez_avatar_entities": true,
|
||||
"id_can_rez_certified": true,
|
||||
"id_can_rez_tmp": true,
|
||||
"id_can_rez_tmp_certified": true,
|
||||
"id_can_write_to_asset_server": true,
|
||||
"permissions_id": adminUsername
|
||||
});
|
||||
});
|
||||
|
||||
const settingsToCommit = {
|
||||
"security": {
|
||||
"permissions": administratorsPermissions,
|
||||
"standard_permissions": [
|
||||
{
|
||||
"id_can_connect": everyoneCanConnect,
|
||||
"id_can_rez_avatar_entities": everyoneCanConnect,
|
||||
"id_can_rez": everyoneCanRez,
|
||||
"id_can_rez_certified": everyoneCanRez,
|
||||
"id_can_rez_tmp": everyoneCanRez,
|
||||
"id_can_rez_tmp_certified": everyoneCanRez,
|
||||
"permissions_id": "anonymous"
|
||||
},
|
||||
{
|
||||
"id_can_connect": friendsCanConnect,
|
||||
"id_can_rez_avatar_entities": friendsCanConnect,
|
||||
"id_can_rez": friendsCanRez,
|
||||
"id_can_rez_certified": friendsCanRez,
|
||||
"id_can_rez_tmp": friendsCanRez,
|
||||
"id_can_rez_tmp_certified": friendsCanRez,
|
||||
"permissions_id": "friends"
|
||||
},
|
||||
{
|
||||
"id_can_connect": loggedInCanConnect,
|
||||
"id_can_rez_avatar_entities": loggedInCanConnect,
|
||||
"id_can_rez": loggedInCanRez,
|
||||
"id_can_rez_certified": loggedInCanRez,
|
||||
"id_can_rez_tmp": loggedInCanRez,
|
||||
"id_can_rez_tmp_certified": loggedInCanRez,
|
||||
"permissions_id": "logged-in"
|
||||
},
|
||||
{
|
||||
"id_can_adjust_locks": localhostPermissions,
|
||||
"id_can_connect": localhostPermissions,
|
||||
"id_can_rez_avatar_entities": localhostPermissions,
|
||||
"id_can_connect_past_max_capacity": localhostPermissions,
|
||||
"id_can_kick": localhostPermissions,
|
||||
"id_can_replace_content": localhostPermissions,
|
||||
"id_can_rez": localhostPermissions,
|
||||
"id_can_rez_certified": localhostPermissions,
|
||||
"id_can_rez_tmp": localhostPermissions,
|
||||
"id_can_rez_tmp_certified": localhostPermissions,
|
||||
"id_can_write_to_asset_server": localhostPermissions,
|
||||
"permissions_id": "localhost"
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.METAVERSE, "Successfully saved Domain server security settings.");
|
||||
this.$q.notify({
|
||||
type: "positive",
|
||||
textColor: "white",
|
||||
icon: "cloud_done",
|
||||
message: "Successfully saved your security settings."
|
||||
});
|
||||
} else {
|
||||
Log.error(Log.types.METAVERSE, "Failed to save Domain server security settings.");
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: "Failed to save your security settings."
|
||||
});
|
||||
}
|
||||
|
||||
// We move forward anyway, the user can come back if it fails or if they want to change it.
|
||||
this.mainWizardStep++;
|
||||
},
|
||||
|
||||
saveSecuritySettings () {
|
||||
// TODO
|
||||
async onAdminStepSubmit () {
|
||||
const settingsToCommit = {
|
||||
"security": {
|
||||
"http_username": this.username,
|
||||
"http_password": sha256.hex(this.confirmPassword)
|
||||
}
|
||||
};
|
||||
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.METAVERSE, "Successfully saved Domain server administrator details.");
|
||||
this.$q.notify({
|
||||
type: "positive",
|
||||
textColor: "white",
|
||||
icon: "cloud_done",
|
||||
message: "Successfully saved your administrator credentials."
|
||||
});
|
||||
|
||||
this.mainWizardStep++;
|
||||
} else {
|
||||
Log.error(Log.types.METAVERSE, "Failed to save Domain server administrator details.");
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: "Failed to save your administrator credentials."
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onAdminStepReset () {
|
||||
this.username = "";
|
||||
this.password = "";
|
||||
this.confirmPassword = "";
|
||||
},
|
||||
|
||||
async completeWizard () {
|
||||
const settingsToCommit = {
|
||||
"wizard": {
|
||||
"steps_completed": "0",
|
||||
"completed_once": true
|
||||
}
|
||||
};
|
||||
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.METAVERSE, "Successfully saved wizard completion.");
|
||||
} else {
|
||||
Log.error(Log.types.METAVERSE, "Failed to save wizard completion.");
|
||||
}
|
||||
|
||||
this.redirectToSettings();
|
||||
},
|
||||
|
||||
redirectToSettings () {
|
||||
// Needs to go somewhere universal.
|
||||
const redirectURL = "/settings" + location.search;
|
||||
|
||||
this.firstTimeWizardDialog = false;
|
||||
|
||||
this.$q.loading.show({
|
||||
message: "Stand by..."
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
location.href = redirectURL;
|
||||
}, this.COMPLETE_WIZARD_REDIRECT_DELAY);
|
||||
},
|
||||
|
||||
// TODO: This needs to go somewhere universal.
|
||||
commitSettings (settingsToCommit) {
|
||||
// TODO: This and all other URL endpoints should be in centralized (in their respective module) constants files.
|
||||
return axios.post("/settings.json", JSON.stringify(settingsToCommit))
|
||||
.then(() => {
|
||||
Log.info(Log.types.DOMAIN, "Successfully committed settings.");
|
||||
return true;
|
||||
})
|
||||
.catch((response) => {
|
||||
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain: ${response}`);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Needs to be somewhere universal. NOT TESTED.
|
||||
// uploadContentChunk (file, offset, id) {
|
||||
// if (offset == undefined) {
|
||||
// offset = 0;
|
||||
// }
|
||||
// if (id == undefined) {
|
||||
// // Identify this upload session
|
||||
// id = Math.round(Math.random() * 2147483647);
|
||||
// }
|
||||
//
|
||||
// const fileSize = file.size;
|
||||
// const filename = file.name;
|
||||
//
|
||||
// const CHUNK_SIZE = 1048576; // 1 MiB
|
||||
//
|
||||
// const isFinal = Boolean(fileSize - offset <= CHUNK_SIZE);
|
||||
// const nextChunkSize = Math.min(fileSize - offset, CHUNK_SIZE);
|
||||
// const chunk = file.slice(offset, offset + nextChunkSize, file.type);
|
||||
// const chunkFormData = new FormData();
|
||||
//
|
||||
// let formItemName = "restore-file-chunk";
|
||||
// if (offset == 0) {
|
||||
// formItemName = isFinal ? "restore-file-chunk-only" : "restore-file-chunk-initial";
|
||||
// } else if (isFinal) {
|
||||
// formItemName = "restore-file-chunk-final";
|
||||
// }
|
||||
//
|
||||
// chunkFormData.append(formItemName, chunk, filename);
|
||||
// const axiosParams = {
|
||||
// url: "/content/upload",
|
||||
// method: "POST",
|
||||
// timeout: 30000, // 30 s
|
||||
// headers: { "X-Session-Id": id },
|
||||
// contentType: false,
|
||||
// data: chunkFormData
|
||||
// };
|
||||
//
|
||||
// axios.post(axiosParams)
|
||||
// .then(() => {
|
||||
// Log.info(Log.types.DOMAIN, "Successfully uploaded content chunk.");
|
||||
// if (!isFinal) {
|
||||
// this.uploadContentChunk(file, offset + CHUNK_SIZE, id);
|
||||
// }
|
||||
// })
|
||||
// .catch((response) => {
|
||||
// Log.error(Log.types.DOMAIN, `Failed to upload content chunk: ${response}`);
|
||||
// });
|
||||
// }
|
||||
},
|
||||
|
||||
watch: {
|
||||
async mainWizardStep () {
|
||||
const settingsToCommit = {
|
||||
"wizard": {
|
||||
"steps_completed": this.mainWizardStep.toString()
|
||||
}
|
||||
};
|
||||
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.DOMAIN, "Successfully committed steps completed to Domain server settings.");
|
||||
} else {
|
||||
Log.error(Log.types.DOMAIN, "Failed to commit steps completed to Domain server settings.");
|
||||
}
|
||||
},
|
||||
|
||||
async performanceMode () {
|
||||
const settingsToCommit = {
|
||||
"audio_threading": {
|
||||
"auto_threads": this.performanceMode
|
||||
},
|
||||
"avatar_mixer": {
|
||||
"auto_threads": this.performanceMode
|
||||
}
|
||||
};
|
||||
|
||||
const committed = await this.commitSettings(settingsToCommit);
|
||||
|
||||
if (committed === true) {
|
||||
Log.info(Log.types.DOMAIN, "Successfully saved performance mode setting.");
|
||||
this.$q.notify({
|
||||
type: "positive",
|
||||
textColor: "white",
|
||||
icon: "cloud_done",
|
||||
message: "Successfully saved performance mode setting."
|
||||
});
|
||||
} else {
|
||||
Log.error(Log.types.DOMAIN, "Failed to save performance mode setting.");
|
||||
this.$q.notify({
|
||||
type: "negative",
|
||||
textColor: "white",
|
||||
icon: "warning",
|
||||
message: "Failed to save performance mode setting."
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
||||
|
||||
import { route } from "quasar/wrappers";
|
||||
import {
|
||||
createMemoryHistory,
|
||||
|
|