@geode/opengeodeweb-front 2.0.0-rc.15 → 2.0.0-rc.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/Branch-protection.yml +2 -2
- package/.github/workflows/CD.yml +2 -2
- package/.github/workflows/prepare_pr.yml +11 -0
- package/.prettierrc +4 -0
- package/README.md +1 -0
- package/assets/geode_objects.js +105 -105
- package/components/CrsSelector.vue +82 -61
- package/components/Errors/Banner.vue +27 -17
- package/components/Errors/Snackers.vue +29 -15
- package/components/ExtensionSelector.vue +45 -36
- package/components/FileSelector.vue +55 -42
- package/components/Header.vue +24 -8
- package/components/Launcher.vue +48 -35
- package/components/Loading.vue +5 -5
- package/components/ObjectSelector.vue +43 -36
- package/components/PackagesVersions.vue +36 -29
- package/components/RemoteRenderingView.client.vue +81 -67
- package/components/Step.vue +63 -41
- package/components/Stepper.vue +2 -3
- package/components/ViewToolbar.vue +20 -17
- package/components/Wrapper.vue +8 -9
- package/composables/api_fetch.js +44 -26
- package/nuxt.config.js +2 -2
- package/package.json +12 -11
- package/protocols/index.js +2 -2
- package/protocols/vtk.js +21 -15
- package/stores/cloud.js +22 -11
- package/stores/errors.js +6 -6
- package/stores/geode.js +14 -12
- package/stores/viewer.js +33 -33
- package/stores/websocket.js +43 -47
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-row class="justify-left">
|
|
3
|
-
<v-col
|
|
4
|
-
|
|
3
|
+
<v-col
|
|
4
|
+
v-for="file_extension in file_extensions"
|
|
5
|
+
:key="file_extension"
|
|
6
|
+
cols="2"
|
|
7
|
+
>
|
|
8
|
+
<v-card
|
|
9
|
+
class="card ma-2"
|
|
10
|
+
hover
|
|
11
|
+
elevation="5"
|
|
12
|
+
@click="set_output_extension(file_extension)"
|
|
13
|
+
>
|
|
5
14
|
<v-card-title align="center">
|
|
6
15
|
{{ file_extension }}
|
|
7
16
|
</v-card-title>
|
|
@@ -11,43 +20,43 @@
|
|
|
11
20
|
</template>
|
|
12
21
|
|
|
13
22
|
<script setup>
|
|
14
|
-
const stepper_tree = inject(
|
|
15
|
-
const { geode_object, route_prefix } = stepper_tree
|
|
16
|
-
|
|
17
|
-
const props = defineProps({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
})
|
|
21
|
-
const { variable_to_update, variable_to_increment } = props
|
|
22
|
-
|
|
23
|
-
const file_extensions = ref([])
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
const stepper_tree = inject("stepper_tree")
|
|
24
|
+
const { geode_object, route_prefix } = stepper_tree
|
|
25
|
+
|
|
26
|
+
const props = defineProps({
|
|
27
|
+
variable_to_update: { type: String, required: true },
|
|
28
|
+
variable_to_increment: { type: String, required: true },
|
|
29
|
+
})
|
|
30
|
+
const { variable_to_update, variable_to_increment } = props
|
|
31
|
+
|
|
32
|
+
const file_extensions = ref([])
|
|
33
|
+
|
|
34
|
+
async function get_output_file_extensions() {
|
|
35
|
+
const params = new FormData()
|
|
36
|
+
params.append("geode_object", geode_object)
|
|
37
|
+
await api_fetch(
|
|
38
|
+
`${route_prefix}/output_file_extensions`,
|
|
39
|
+
{ method: "POST", body: params },
|
|
40
|
+
{
|
|
41
|
+
response_function: (response) => {
|
|
42
|
+
file_extensions.value = response._data.output_file_extensions
|
|
43
|
+
},
|
|
33
44
|
},
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function set_output_extension (extension) {
|
|
39
|
-
stepper_tree[variable_to_update] = extension
|
|
40
|
-
stepper_tree[variable_to_increment]++
|
|
41
|
-
}
|
|
45
|
+
)
|
|
46
|
+
}
|
|
42
47
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
function set_output_extension(extension) {
|
|
49
|
+
stepper_tree[variable_to_update] = extension
|
|
50
|
+
stepper_tree[variable_to_increment]++
|
|
51
|
+
}
|
|
46
52
|
|
|
53
|
+
onMounted(() => {
|
|
54
|
+
get_output_file_extensions()
|
|
55
|
+
})
|
|
47
56
|
</script>
|
|
48
57
|
|
|
49
58
|
<style scoped>
|
|
50
|
-
.card {
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
</style>
|
|
59
|
+
.card {
|
|
60
|
+
border-radius: 15px;
|
|
61
|
+
}
|
|
62
|
+
</style>
|
|
@@ -1,46 +1,59 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-file-input
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
<v-file-input
|
|
3
|
+
v-model="files"
|
|
4
|
+
:multiple="multiple"
|
|
5
|
+
:label="label"
|
|
6
|
+
:accept="accept"
|
|
7
|
+
:rules="[(value) => !!value || 'The file is mandatory']"
|
|
8
|
+
color="primary"
|
|
9
|
+
chips
|
|
10
|
+
counter
|
|
11
|
+
show-size
|
|
12
|
+
@click:clear="stepper_tree.files = []"
|
|
13
|
+
/>
|
|
5
14
|
</template>
|
|
6
15
|
|
|
7
16
|
<script setup>
|
|
8
|
-
const stepper_tree = inject(
|
|
9
|
-
const { route_prefix } = stepper_tree
|
|
10
|
-
|
|
11
|
-
const props = defineProps({
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
})
|
|
17
|
-
const { multiple, label, variable_to_update, variable_to_increment } = props
|
|
18
|
-
|
|
19
|
-
const accept = ref(
|
|
20
|
-
const files = ref([])
|
|
21
|
-
|
|
22
|
-
watch(files, (value) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
function fill_extensions
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
17
|
+
const stepper_tree = inject("stepper_tree")
|
|
18
|
+
const { route_prefix } = stepper_tree
|
|
19
|
+
|
|
20
|
+
const props = defineProps({
|
|
21
|
+
multiple: { type: Boolean, required: true },
|
|
22
|
+
label: { type: String, required: true },
|
|
23
|
+
variable_to_update: { type: String, required: true },
|
|
24
|
+
variable_to_increment: { type: String, required: true },
|
|
25
|
+
})
|
|
26
|
+
const { multiple, label, variable_to_update, variable_to_increment } = props
|
|
27
|
+
|
|
28
|
+
const accept = ref("")
|
|
29
|
+
const files = ref([])
|
|
30
|
+
|
|
31
|
+
watch(files, (value) => {
|
|
32
|
+
stepper_tree[variable_to_update] = value
|
|
33
|
+
stepper_tree[variable_to_increment]++
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
function fill_extensions(response) {
|
|
37
|
+
const extensions = response._data.extensions
|
|
38
|
+
.map((extension) => "." + extension)
|
|
39
|
+
.join(",")
|
|
40
|
+
accept.value = extensions
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function get_allowed_files() {
|
|
44
|
+
const route = `${route_prefix}/allowed_files`
|
|
45
|
+
await api_fetch(
|
|
46
|
+
route,
|
|
47
|
+
{ method: "GET" },
|
|
48
|
+
{
|
|
49
|
+
response_function: (response) => {
|
|
50
|
+
fill_extensions(response)
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
onMounted(async () => {
|
|
57
|
+
await get_allowed_files()
|
|
58
|
+
})
|
|
59
|
+
</script>
|
package/components/Header.vue
CHANGED
|
@@ -6,13 +6,29 @@
|
|
|
6
6
|
<v-col>
|
|
7
7
|
<v-row class="justify-center">
|
|
8
8
|
<v-col v-for="(card, i) in cards_list" :key="i" cols="11" md="5">
|
|
9
|
-
<v-card
|
|
10
|
-
|
|
9
|
+
<v-card
|
|
10
|
+
class="card"
|
|
11
|
+
hover
|
|
12
|
+
elevation="5"
|
|
13
|
+
:href="card.href"
|
|
14
|
+
rounded
|
|
15
|
+
target="_blank"
|
|
16
|
+
>
|
|
17
|
+
<v-card-title
|
|
18
|
+
primary-title
|
|
19
|
+
class="justify-center text-h6"
|
|
20
|
+
align="center"
|
|
21
|
+
>
|
|
11
22
|
{{ card.title }}
|
|
12
23
|
</v-card-title>
|
|
13
24
|
<v-row class="justify-center pa-2">
|
|
14
25
|
<v-col cols="auto">
|
|
15
|
-
<v-icon
|
|
26
|
+
<v-icon
|
|
27
|
+
:icon="card.icon"
|
|
28
|
+
color="primary"
|
|
29
|
+
size="70"
|
|
30
|
+
class="justify-center"
|
|
31
|
+
/>
|
|
16
32
|
</v-col>
|
|
17
33
|
</v-row>
|
|
18
34
|
</v-card>
|
|
@@ -23,8 +39,8 @@
|
|
|
23
39
|
</template>
|
|
24
40
|
|
|
25
41
|
<script setup>
|
|
26
|
-
const props = defineProps({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
})
|
|
30
|
-
</script>
|
|
42
|
+
const props = defineProps({
|
|
43
|
+
tool_name: { type: String, required: true },
|
|
44
|
+
cards_list: { type: Object, required: true },
|
|
45
|
+
})
|
|
46
|
+
</script>
|
package/components/Launcher.vue
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-container justify="space-around">
|
|
3
3
|
<v-row align-content="center" align="center">
|
|
4
|
-
<v-col
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
<v-col
|
|
5
|
+
v-if="!is_captcha_validated"
|
|
6
|
+
cols="12"
|
|
7
|
+
align-self="center"
|
|
8
|
+
align="center"
|
|
9
|
+
>
|
|
10
|
+
<h4 class="pb-3">Please complete the recaptcha to launch the app</h4>
|
|
11
|
+
<vue-recaptcha
|
|
12
|
+
ref="recaptcha"
|
|
13
|
+
:sitekey="site_key"
|
|
14
|
+
:loadRecaptchaScript="true"
|
|
15
|
+
@expired="is_captcha_validated = false"
|
|
16
|
+
@verify="submit_recaptcha"
|
|
17
|
+
align-self="center"
|
|
18
|
+
/>
|
|
10
19
|
</v-col>
|
|
11
|
-
<v-col
|
|
20
|
+
<v-col
|
|
21
|
+
v-else-if="!cloud_store.is_running && cloud_store.is_connexion_launched"
|
|
22
|
+
>
|
|
12
23
|
<Loading />
|
|
13
24
|
</v-col>
|
|
14
25
|
</v-row>
|
|
@@ -16,39 +27,41 @@
|
|
|
16
27
|
</template>
|
|
17
28
|
|
|
18
29
|
<script setup>
|
|
19
|
-
import { VueRecaptcha } from "vue-recaptcha"
|
|
30
|
+
import { VueRecaptcha } from "vue-recaptcha"
|
|
20
31
|
|
|
21
|
-
const websocket_store = use_websocket_store()
|
|
22
|
-
const cloud_store = use_cloud_store()
|
|
23
|
-
const { is_captcha_validated } = storeToRefs(cloud_store)
|
|
32
|
+
const websocket_store = use_websocket_store()
|
|
33
|
+
const cloud_store = use_cloud_store()
|
|
34
|
+
const { is_captcha_validated } = storeToRefs(cloud_store)
|
|
24
35
|
|
|
25
|
-
const props = defineProps({
|
|
26
|
-
|
|
27
|
-
})
|
|
36
|
+
const props = defineProps({
|
|
37
|
+
site_key: { type: String, required: true },
|
|
38
|
+
})
|
|
28
39
|
|
|
29
|
-
watch(is_captcha_validated, async (value) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
40
|
+
watch(is_captcha_validated, async (value) => {
|
|
41
|
+
if (value === true && process.client) {
|
|
42
|
+
await cloud_store.create_connexion()
|
|
43
|
+
await websocket_store.ws_connect()
|
|
44
|
+
}
|
|
45
|
+
})
|
|
35
46
|
|
|
36
|
-
onMounted(() => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
onMounted(() => {
|
|
48
|
+
if (process.client) {
|
|
49
|
+
const config = useRuntimeConfig()
|
|
50
|
+
if (config.public.NODE_ENV !== "production") {
|
|
51
|
+
cloud_store.$patch({ is_captcha_validated: true })
|
|
52
|
+
}
|
|
41
53
|
}
|
|
42
|
-
}
|
|
43
|
-
})
|
|
54
|
+
})
|
|
44
55
|
|
|
45
|
-
async function submit_recaptcha
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
async function submit_recaptcha(token) {
|
|
57
|
+
try {
|
|
58
|
+
const response = await $fetch.raw(
|
|
59
|
+
`/.netlify/functions/recaptcha?token=${token}`,
|
|
60
|
+
)
|
|
61
|
+
cloud_store.$patch({ is_captcha_validated: response.status == 200 })
|
|
62
|
+
recaptcha.reset()
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error(error)
|
|
65
|
+
}
|
|
52
66
|
}
|
|
53
|
-
}
|
|
54
67
|
</script>
|
package/components/Loading.vue
CHANGED
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
Why do you have to wait?
|
|
10
10
|
</v-card-subtitle>
|
|
11
11
|
<v-card-text class="text-center">
|
|
12
|
-
We start our server only on demand... and this takes a few minutes
|
|
13
|
-
you can use our free app.
|
|
14
|
-
<br
|
|
12
|
+
We start our server only on demand... and this takes a few minutes
|
|
13
|
+
before you can use our free app.
|
|
14
|
+
<br />
|
|
15
15
|
This is aligned with our energy sobriety policy. So be patient
|
|
16
16
|
<v-icon color="primary" size="20">
|
|
17
17
|
mdi-emoticon-excited-outline
|
|
18
18
|
</v-icon>
|
|
19
|
-
<br
|
|
19
|
+
<br />
|
|
20
20
|
</v-card-text>
|
|
21
21
|
</v-card>
|
|
22
22
|
</v-col>
|
|
23
23
|
</v-row>
|
|
24
|
-
</template>
|
|
24
|
+
</template>
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
<v-row v-if="allowed_objects.length" class="justify-left">
|
|
3
3
|
<v-col v-for="object in allowed_objects" :key="object" cols="2" md="2">
|
|
4
4
|
<v-card v-ripple class="card ma-2" hover elevation="5" rounded>
|
|
5
|
-
<v-img
|
|
5
|
+
<v-img
|
|
6
|
+
:src="geode_objects[object].image"
|
|
7
|
+
cover
|
|
8
|
+
@click="set_geode_object(object)"
|
|
9
|
+
/>
|
|
6
10
|
<v-tooltip activator="parent" location="bottom">
|
|
7
11
|
{{ geode_objects[object].tooltip }}
|
|
8
12
|
</v-tooltip>
|
|
@@ -12,55 +16,58 @@
|
|
|
12
16
|
<v-row v-else class="pa-5">
|
|
13
17
|
<v-card class="card" variant="tonal" elevation="5" rounded>
|
|
14
18
|
<v-card-text>
|
|
15
|
-
This file format isn't supported! Please check the
|
|
16
|
-
|
|
17
|
-
supported file formats documentation</a
|
|
19
|
+
This file format isn't supported! Please check the
|
|
20
|
+
<a href="https://docs.geode-solutions.com/formats/" target="_blank">
|
|
21
|
+
supported file formats documentation</a
|
|
22
|
+
>
|
|
23
|
+
for more information
|
|
18
24
|
</v-card-text>
|
|
19
25
|
</v-card>
|
|
20
26
|
</v-row>
|
|
21
27
|
</template>
|
|
22
28
|
|
|
23
29
|
<script setup>
|
|
24
|
-
import geode_objects from
|
|
30
|
+
import geode_objects from "@/assets/geode_objects"
|
|
25
31
|
|
|
26
|
-
const stepper_tree = inject(
|
|
27
|
-
const { files, route_prefix } = stepper_tree
|
|
32
|
+
const stepper_tree = inject("stepper_tree")
|
|
33
|
+
const { files, route_prefix } = stepper_tree
|
|
28
34
|
|
|
29
|
-
const props = defineProps({
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
})
|
|
35
|
+
const props = defineProps({
|
|
36
|
+
variable_to_update: { type: String, required: true },
|
|
37
|
+
variable_to_increment: { type: String, required: true },
|
|
38
|
+
})
|
|
33
39
|
|
|
34
|
-
const { variable_to_update, variable_to_increment } = props
|
|
40
|
+
const { variable_to_update, variable_to_increment } = props
|
|
35
41
|
|
|
36
|
-
const allowed_objects = ref([])
|
|
42
|
+
const allowed_objects = ref([])
|
|
37
43
|
|
|
38
|
-
async function get_allowed_objects
|
|
44
|
+
async function get_allowed_objects() {
|
|
45
|
+
const params = new FormData()
|
|
46
|
+
params.append("filename", files[0].name)
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
function set_geode_object (geode_object) {
|
|
51
|
-
stepper_tree[variable_to_update] = geode_object
|
|
52
|
-
stepper_tree[variable_to_increment]++
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
onMounted(() => {
|
|
56
|
-
get_allowed_objects()
|
|
57
|
-
})
|
|
48
|
+
await api_fetch(
|
|
49
|
+
`${route_prefix}/allowed_objects`,
|
|
50
|
+
{ method: "POST", body: params },
|
|
51
|
+
{
|
|
52
|
+
response_function: (response) => {
|
|
53
|
+
allowed_objects.value = response._data.allowed_objects
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
58
|
|
|
59
|
+
function set_geode_object(geode_object) {
|
|
60
|
+
stepper_tree[variable_to_update] = geode_object
|
|
61
|
+
stepper_tree[variable_to_increment]++
|
|
62
|
+
}
|
|
59
63
|
|
|
64
|
+
onMounted(() => {
|
|
65
|
+
get_allowed_objects()
|
|
66
|
+
})
|
|
60
67
|
</script>
|
|
61
68
|
|
|
62
69
|
<style scoped>
|
|
63
|
-
.card {
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
</style>
|
|
70
|
+
.card {
|
|
71
|
+
border-radius: 15px;
|
|
72
|
+
}
|
|
73
|
+
</style>
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
<v-container>
|
|
3
3
|
This tool uses our Open-Source codes
|
|
4
4
|
<v-tooltip location="end">
|
|
5
|
-
<span
|
|
5
|
+
<span
|
|
6
|
+
v-for="package_version in packages_versions"
|
|
7
|
+
:key="package_version.package"
|
|
8
|
+
>
|
|
6
9
|
{{ package_version.package }} v{{ package_version.version }}
|
|
7
|
-
<br
|
|
10
|
+
<br />
|
|
8
11
|
</span>
|
|
9
12
|
<template #activator="{ props }">
|
|
10
13
|
<v-icon v-bind="props" color="primary" class="justify-right">
|
|
@@ -16,38 +19,42 @@
|
|
|
16
19
|
</template>
|
|
17
20
|
|
|
18
21
|
<script setup>
|
|
19
|
-
const props = defineProps({
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
const { route_prefix } = props
|
|
22
|
+
const props = defineProps({
|
|
23
|
+
route_prefix: { type: String, required: true },
|
|
24
|
+
})
|
|
25
|
+
const { route_prefix } = props
|
|
26
|
+
|
|
27
|
+
const cloud_store = use_cloud_store()
|
|
23
28
|
|
|
24
|
-
const
|
|
29
|
+
const packages_versions = ref([])
|
|
25
30
|
|
|
26
|
-
|
|
31
|
+
async function get_packages_versions() {
|
|
32
|
+
await api_fetch(
|
|
33
|
+
`${route_prefix}/versions`,
|
|
34
|
+
{ method: "GET" },
|
|
35
|
+
{
|
|
36
|
+
response_function: (response) => {
|
|
37
|
+
packages_versions.value = response._data.versions
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
)
|
|
41
|
+
}
|
|
27
42
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
packages_versions.value = response._data.versions
|
|
43
|
+
watch(cloud_store.is_running, (value) => {
|
|
44
|
+
if (value === true) {
|
|
45
|
+
get_packages_versions()
|
|
32
46
|
}
|
|
33
47
|
})
|
|
34
|
-
}
|
|
35
48
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
onMounted(() => {
|
|
43
|
-
if (cloud_store.is_running === true) {
|
|
44
|
-
get_packages_versions()
|
|
45
|
-
}
|
|
46
|
-
})
|
|
49
|
+
onMounted(() => {
|
|
50
|
+
if (cloud_store.is_running === true) {
|
|
51
|
+
get_packages_versions()
|
|
52
|
+
}
|
|
53
|
+
})
|
|
47
54
|
|
|
48
|
-
onActivated(() => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
})
|
|
55
|
+
onActivated(() => {
|
|
56
|
+
if (cloud_store.is_running === true) {
|
|
57
|
+
get_packages_versions()
|
|
58
|
+
}
|
|
59
|
+
})
|
|
53
60
|
</script>
|