@geode/opengeodeweb-front 8.2.0-rc.1 → 9.0.0-rc.1

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.
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <v-banner
3
- v-if="server_error"
3
+ v-if="feedback_store.server_error"
4
4
  elevation="2"
5
- style="background-color: grey; z-index: 100"
5
+ style="background-color: grey; z-index: 9999"
6
6
  position="fixed"
7
7
  >
8
8
  <v-row>
@@ -33,7 +33,7 @@
33
33
  size="20"
34
34
  color="grey"
35
35
  class=".align-center"
36
- @click="errors_store.delete_server_error()"
36
+ @click="feedback_store.delete_server_error()"
37
37
  >
38
38
  <v-icon icon="mdi-close" size="20" color="white" />
39
39
  </v-btn>
@@ -43,8 +43,7 @@
43
43
  </template>
44
44
 
45
45
  <script setup>
46
- const errors_store = use_errors_store()
47
- const { server_error } = storeToRefs(errors_store)
46
+ const feedback_store = use_feedback_store()
48
47
 
49
48
  function reload() {
50
49
  window.location.reload()
@@ -1,21 +1,21 @@
1
1
  <template>
2
2
  <v-snackbar
3
- v-for="(error, index) in errors"
4
- :key="index"
3
+ v-for="(feedback, index) in feedback_store.feedbacks"
4
+ :key="feedback"
5
5
  v-model="show"
6
6
  :style="{ 'margin-bottom': calc_margin(index) }"
7
- color="error"
7
+ :color="feedback.type"
8
8
  location="bottom right"
9
9
  transition="slide-x-reverse-transition"
10
- max-width="30%"
10
+ max-width="200px"
11
11
  height="20px"
12
12
  >
13
13
  <v-row dense class="flex-nowrap">
14
14
  <v-col cols="auto">
15
- <v-tooltip location="left">
15
+ <v-tooltip v-if="feedback.type === 'error'" location="left">
16
16
  <span>
17
- error: {{ error.code }} {{ error.name }}<br />
18
- ressource: {{ error.route }}
17
+ error: {{ feedback.code }} {{ feedback.name }}<br />
18
+ ressource: {{ feedback.route }}
19
19
  <br />
20
20
  </span>
21
21
  <template #activator="{ props }">
@@ -24,16 +24,21 @@
24
24
  </v-icon>
25
25
  </template>
26
26
  </v-tooltip>
27
+ <v-tooltip v-else-if="feedback.type === 'success'" location="left">
28
+ <v-icon color="white" class="justify-right">
29
+ mdi-check-circle-outline
30
+ </v-icon>
31
+ </v-tooltip>
27
32
  </v-col>
28
33
  <v-col cols="9" class="text-no-wrap overflow-hidden">
29
34
  <v-tooltip location="top">
30
35
  <span>
31
- {{ error.description }}
36
+ {{ feedback.description }}
32
37
  <br />
33
38
  </span>
34
39
  <template #activator="{ props }">
35
40
  <div v-bind="props">
36
- {{ error.description }}
41
+ {{ feedback.description }}
37
42
  </div>
38
43
  </template>
39
44
  </v-tooltip>
@@ -44,8 +49,8 @@
44
49
  icon
45
50
  variant="flat"
46
51
  size="20"
47
- color="error"
48
- @click="errors_store.delete_error(index)"
52
+ :color="feedback.type"
53
+ @click="feedback_store.delete_feedback(index)"
49
54
  >
50
55
  <v-icon icon="mdi-close" size="20" color="white" />
51
56
  </v-btn>
@@ -55,9 +60,7 @@
55
60
  </template>
56
61
 
57
62
  <script setup>
58
- const errors_store = use_errors_store()
59
- const { errors } = storeToRefs(errors_store)
60
-
63
+ const feedback_store = use_feedback_store()
61
64
  const show = true
62
65
 
63
66
  function calc_margin(index) {
@@ -4,7 +4,7 @@ export function api_fetch(
4
4
  { schema, params },
5
5
  { request_error_function, response_function, response_error_function } = {},
6
6
  ) {
7
- const errors_store = use_errors_store()
7
+ const feedback_store = use_feedback_store()
8
8
  const geode_store = use_geode_store()
9
9
 
10
10
  const body = params || {}
@@ -12,7 +12,8 @@ export function api_fetch(
12
12
  const { valid, error } = validate_schema(schema, body)
13
13
 
14
14
  if (!valid) {
15
- errors_store.add_error({
15
+ feedback_store.add_feedback({
16
+ type: "error",
16
17
  code: 400,
17
18
  route: schema.$id,
18
19
  name: "Bad request",
@@ -39,7 +40,8 @@ export function api_fetch(
39
40
  ...request_options,
40
41
  onRequestError({ error }) {
41
42
  geode_store.stop_request()
42
- errors_store.add_error({
43
+ feedback_store.add_feedback({
44
+ type: "error",
43
45
  code: error.code,
44
46
  route: schema.$id,
45
47
  name: error.message,
@@ -59,7 +61,8 @@ export function api_fetch(
59
61
  },
60
62
  onResponseError({ response }) {
61
63
  geode_store.stop_request()
62
- errors_store.add_error({
64
+ feedback_store.add_feedback({
65
+ type: "error",
63
66
  code: response.status,
64
67
  route: schema.$id,
65
68
  name: response._data.name,
@@ -2,7 +2,7 @@ export async function upload_file(
2
2
  { route, file },
3
3
  { request_error_function, response_function, response_error_function } = {},
4
4
  ) {
5
- const errors_store = use_errors_store()
5
+ const feedback_store = use_feedback_store()
6
6
  const geode_store = use_geode_store()
7
7
  if (!(file instanceof File)) {
8
8
  throw new Error("file must be a instance of File")
@@ -22,7 +22,8 @@ export async function upload_file(
22
22
  ...request_options,
23
23
  onRequestError({ error }) {
24
24
  geode_store.stop_request()
25
- errors_store.add_error({
25
+ feedback_store.add_feedback({
26
+ type: "error",
26
27
  code: error.code,
27
28
  route: route,
28
29
  name: error.message,
@@ -42,7 +43,8 @@ export async function upload_file(
42
43
  },
43
44
  onResponseError({ response }) {
44
45
  geode_store.stop_request()
45
- errors_store.add_error({
46
+ feedback_store.add_feedback({
47
+ type: "error",
46
48
  code: response.status,
47
49
  route: route,
48
50
  name: response._data.name,
@@ -2,13 +2,14 @@ export function viewer_call(
2
2
  { schema, params = {} },
3
3
  { request_error_function, response_function, response_error_function } = {},
4
4
  ) {
5
- const errors_store = use_errors_store()
5
+ const feedback_store = use_feedback_store()
6
6
  const viewer_store = use_viewer_store()
7
7
 
8
8
  const { valid, error } = validate_schema(schema, params)
9
9
 
10
10
  if (!valid) {
11
- errors_store.add_error({
11
+ feedback_store.add_feedback({
12
+ type: "error",
12
13
  code: 400,
13
14
  route: schema.route,
14
15
  name: "Bad request",
@@ -41,7 +42,8 @@ export function viewer_call(
41
42
  },
42
43
  )
43
44
  .catch((error) => {
44
- errors_store.add_error({
45
+ feedback_store.add_feedback({
46
+ type: "error",
45
47
  code: error.code,
46
48
  route: schema.route,
47
49
  name: error.message,
package/package.json CHANGED
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "description": "OpenSource Vue/Vuetify framework for web applications",
37
37
  "type": "module",
38
- "version": "8.2.0-rc.1",
38
+ "version": "9.0.0-rc.1",
39
39
  "main": "./nuxt.config.js",
40
40
  "dependencies": {
41
41
  "@geode/opengeodeweb-back": "4.3.0",
@@ -0,0 +1,17 @@
1
+ export const use_feedback_store = defineStore("feedback", {
2
+ state: () => ({
3
+ feedbacks: [],
4
+ server_error: false,
5
+ }),
6
+ actions: {
7
+ add_feedback(feedback) {
8
+ this.feedbacks.push(feedback)
9
+ },
10
+ delete_feedback(feedback_index) {
11
+ this.feedbacks.splice(feedback_index, 1)
12
+ },
13
+ delete_server_error() {
14
+ this.server_error = false
15
+ },
16
+ },
17
+ })
package/stores/geode.js CHANGED
@@ -24,7 +24,7 @@ export const use_geode_store = defineStore("geode", {
24
24
  setInterval(() => this.do_ping(), 10 * 1000)
25
25
  },
26
26
  async do_ping() {
27
- const errors_store = use_errors_store()
27
+ const feedback_store = use_feedback_store()
28
28
  const { data } = await useFetch(`${this.base_url}/ping`, {
29
29
  method: "POST",
30
30
  })
@@ -32,7 +32,7 @@ export const use_geode_store = defineStore("geode", {
32
32
  this.is_running = true
33
33
  return
34
34
  } else {
35
- errors_store.$patch({ server_error: true })
35
+ feedback_store.$patch({ server_error: true })
36
36
  return
37
37
  }
38
38
  },
package/stores/infra.js CHANGED
@@ -63,7 +63,7 @@ export const use_infra_store = defineStore("infra", {
63
63
  async create_backend() {
64
64
  const geode_store = use_geode_store()
65
65
  const viewer_store = use_viewer_store()
66
- const errors_store = use_errors_store()
66
+ const feedback_store = use_feedback_store()
67
67
 
68
68
  if (isElectron()) {
69
69
  await window.electronAPI.run_back(geode_store.PORT)
@@ -87,7 +87,7 @@ export const use_infra_store = defineStore("infra", {
87
87
  geode_store.$patch({ is_running: true })
88
88
  return geode_store.ping_task()
89
89
  } else {
90
- errors_store.server_error = true
90
+ feedback_store.server_error = true
91
91
  }
92
92
  }
93
93
  },
@@ -6,41 +6,41 @@ import { createVuetify } from "vuetify"
6
6
  import * as components from "vuetify/components"
7
7
  import * as directives from "vuetify/directives"
8
8
 
9
- import ErrorsBanner from "@/components/Errors/Banner.vue"
9
+ import FeedBackErrorBanner from "@/components/FeedBack/ErrorBanner.vue"
10
10
 
11
11
  const vuetify = createVuetify({
12
12
  components,
13
13
  directives,
14
14
  })
15
15
 
16
- describe("ErrorsBanner.vue", async () => {
16
+ describe("FeedBackErrorBanner.vue", async () => {
17
17
  test(`Test reload`, async () => {
18
- const wrapper = mount(ErrorsBanner, {
18
+ const wrapper = mount(FeedBackErrorBanner, {
19
19
  global: {
20
20
  plugins: [vuetify],
21
21
  },
22
22
  })
23
23
  const reload_spy = vi.spyOn(wrapper.vm, "reload")
24
- const errors_store = use_errors_store()
25
- await errors_store.$patch({ server_error: true })
26
- expect(errors_store.server_error).toBe(true)
24
+ const feedback_store = use_feedback_store()
25
+ await feedback_store.$patch({ server_error: true })
26
+ expect(feedback_store.server_error).toBe(true)
27
27
  const v_btn = wrapper.findAll(".v-btn")
28
28
  await v_btn[0].trigger("click")
29
29
 
30
30
  expect(reload_spy).toHaveBeenCalledTimes(1)
31
31
  }),
32
32
  test(`Test delete error`, async () => {
33
- const wrapper = mount(ErrorsBanner, {
33
+ const wrapper = mount(FeedBackErrorBanner, {
34
34
  global: {
35
35
  plugins: [vuetify],
36
36
  },
37
37
  })
38
38
 
39
- const errors_store = use_errors_store()
40
- await errors_store.$patch({ server_error: true })
41
- expect(errors_store.server_error).toBe(true)
39
+ const feedback_store = use_feedback_store()
40
+ await feedback_store.$patch({ server_error: true })
41
+ expect(feedback_store.server_error).toBe(true)
42
42
  const v_btn = wrapper.findAll(".v-btn")
43
43
  await v_btn[1].trigger("click")
44
- expect(errors_store.server_error).toBe(false)
44
+ expect(feedback_store.server_error).toBe(false)
45
45
  })
46
46
  })
@@ -6,41 +6,45 @@ import { createVuetify } from "vuetify"
6
6
  import * as components from "vuetify/components"
7
7
  import * as directives from "vuetify/directives"
8
8
 
9
- import ErrorsSnackers from "@/components/Errors/Snackers.vue"
9
+ import FeedBackSnackers from "@/components/FeedBack/Snackers.vue"
10
10
 
11
11
  const vuetify = createVuetify({
12
12
  components,
13
13
  directives,
14
14
  })
15
15
 
16
- describe("ErrorsSnackers.vue", async () => {
16
+ describe("FeedBackSnackers.vue", async () => {
17
17
  test(`Test delete error`, async () => {
18
18
  const wrapper = mount(
19
19
  {
20
- template: "<v-layout><ErrorsSnackers/></v-layout>",
20
+ template: "<v-layout><FeedBackSnackers/></v-layout>",
21
21
  },
22
22
  {
23
23
  props: {},
24
24
  global: {
25
25
  components: {
26
- ErrorsSnackers,
26
+ FeedBackSnackers,
27
27
  },
28
28
  plugins: [vuetify],
29
29
  },
30
30
  },
31
31
  )
32
32
 
33
- const errors_store = use_errors_store()
33
+ console.log("wrapper", wrapper)
34
+
35
+ const feedback_store = use_feedback_store()
34
36
  const error = {
37
+ type: "error",
35
38
  code: 404,
36
39
  route: "/test",
37
40
  name: "Test message",
38
41
  description: "Test desription",
39
42
  }
40
- await errors_store.add_error(error)
41
- expect(errors_store.errors.length).toBe(1)
43
+ await feedback_store.add_feedback(error)
44
+ expect(feedback_store.feedbacks.length).toBe(1)
42
45
  const v_btn = await wrapper.findComponent(components.VBtn)
46
+ console.log("v_btn", v_btn)
43
47
  await v_btn.trigger("click")
44
- expect(errors_store.errors.length).toBe(0)
48
+ expect(feedback_store.feedbacks.length).toBe(0)
45
49
  })
46
50
  })
@@ -2,7 +2,7 @@ import { describe, expect, test, beforeEach } from "vitest"
2
2
  import { registerEndpoint } from "@nuxt/test-utils/runtime"
3
3
 
4
4
  describe("api_fetch.js", () => {
5
- const errors_store = use_errors_store()
5
+ const feedback_store = use_feedback_store()
6
6
 
7
7
  const schema = {
8
8
  $id: "/test",
@@ -19,7 +19,7 @@ describe("api_fetch.js", () => {
19
19
  var params
20
20
 
21
21
  beforeEach(async () => {
22
- await errors_store.$patch({ errors: [] })
22
+ await feedback_store.$patch({ feedbacks: [] })
23
23
  })
24
24
 
25
25
  test("Ajv wrong params", async () => {
@@ -35,8 +35,8 @@ describe("api_fetch.js", () => {
35
35
  "/test: data must have required property 'test'",
36
36
  )
37
37
  }
38
- expect(errors_store.errors.length).toBe(1)
39
- expect(errors_store.errors[0].code).toBe(400)
38
+ expect(feedback_store.feedbacks.length).toBe(1)
39
+ expect(feedback_store.feedbacks[0].code).toBe(400)
40
40
  })
41
41
 
42
42
  test("onResponse", async () => {
@@ -55,7 +55,7 @@ describe("api_fetch.js", () => {
55
55
  },
56
56
  },
57
57
  )
58
- expect(errors_store.errors.length).toBe(0)
58
+ expect(feedback_store.feedbacks.length).toBe(0)
59
59
  expect(response_value).toBe("toto")
60
60
  }
61
61
  })
@@ -83,7 +83,7 @@ describe("api_fetch.js", () => {
83
83
  },
84
84
  },
85
85
  )
86
- expect(errors_store.errors.length).toBe(1)
86
+ expect(feedback_store.feedbacks.length).toBe(1)
87
87
  expect(response_error_value).toBe("error")
88
88
  })
89
89
  })
@@ -5,9 +5,9 @@ import schemas from "@geode/opengeodeweb-back/schemas.json"
5
5
  const schema = schemas.opengeodeweb_back.upload_file
6
6
 
7
7
  describe("upload_file.js", () => {
8
- const errors_store = use_errors_store()
8
+ const feedback_store = use_feedback_store()
9
9
  beforeEach(async () => {
10
- await errors_store.$patch({ errors: [] })
10
+ await feedback_store.$patch({ errors: [] })
11
11
  })
12
12
 
13
13
  test("Throw error", async () => {
@@ -33,7 +33,7 @@ describe("upload_file.js", () => {
33
33
  },
34
34
  },
35
35
  )
36
- expect(errors_store.errors.length).toBe(0)
36
+ expect(feedback_store.feedbacks.length).toBe(0)
37
37
  expect(response_value).toBe("ok")
38
38
  })
39
39
  })
@@ -0,0 +1,37 @@
1
+ import { setActivePinia, createPinia } from "pinia"
2
+ import { use_feedback_store } from "@/stores/feedback"
3
+ import { describe, it, expect, beforeEach } from "vitest"
4
+
5
+ describe("Feedback store", () => {
6
+ beforeEach(() => {
7
+ setActivePinia(createPinia())
8
+ })
9
+
10
+ it("add_feedback", () => {
11
+ const feedback_store = use_feedback_store()
12
+ expect(feedback_store.feedbacks.length).toBe(0)
13
+ feedback_store.add_feedback({
14
+ type: "error",
15
+ code: 500,
16
+ route: "/test",
17
+ name: "test message",
18
+ description: "test description",
19
+ })
20
+ expect(feedback_store.feedbacks.length).toBe(1)
21
+ })
22
+
23
+ it("delete_feedback", () => {
24
+ const feedback_store = use_feedback_store()
25
+ expect(feedback_store.feedbacks.length).toBe(0)
26
+ feedback_store.delete_feedback(0)
27
+ expect(feedback_store.feedbacks.length).toBe(0)
28
+ })
29
+
30
+ it("delete_server_error", () => {
31
+ const feedback_store = use_feedback_store()
32
+ feedback_store.$patch({ server_error: true })
33
+ expect(feedback_store.server_error).toBe(true)
34
+ feedback_store.delete_server_error()
35
+ expect(feedback_store.server_error).toBe(false)
36
+ })
37
+ })
@@ -28,11 +28,11 @@ describe("Geode Store", () => {
28
28
 
29
29
  test("do_ping", async () => {
30
30
  const geode_store = use_geode_store()
31
- const errors_store = use_errors_store()
31
+ const feedback_store = use_feedback_store()
32
32
  await geode_store.do_ping()
33
33
 
34
34
  expect(geode_store.is_running).toBe(false)
35
- expect(errors_store.server_error).toBe(true)
35
+ expect(feedback_store.server_error).toBe(true)
36
36
 
37
37
  registerEndpoint("/ping", {
38
38
  method: "POST",
package/stores/errors.js DELETED
@@ -1,17 +0,0 @@
1
- export const use_errors_store = defineStore("errors", {
2
- state: () => ({
3
- errors: [],
4
- server_error: false,
5
- }),
6
- actions: {
7
- add_error(error_object) {
8
- this.errors.push(error_object)
9
- },
10
- delete_error(error_index) {
11
- this.errors.splice(error_index, 1)
12
- },
13
- delete_server_error() {
14
- this.server_error = false
15
- },
16
- },
17
- })
@@ -1,36 +0,0 @@
1
- import { setActivePinia, createPinia } from "pinia"
2
- import { use_errors_store } from "@/stores/errors"
3
- import { describe, it, expect, beforeEach } from "vitest"
4
-
5
- describe("Errors Store", () => {
6
- beforeEach(() => {
7
- setActivePinia(createPinia())
8
- })
9
-
10
- it("add_error", () => {
11
- const errors_store = use_errors_store()
12
- expect(errors_store.errors.length).toBe(0)
13
- errors_store.add_error({
14
- code: 500,
15
- route: "/test",
16
- name: "test message",
17
- description: "test description",
18
- })
19
- expect(errors_store.errors.length).toBe(1)
20
- })
21
-
22
- it("delete_error", () => {
23
- const errors_store = use_errors_store()
24
- expect(errors_store.errors.length).toBe(0)
25
- errors_store.delete_error(0)
26
- expect(errors_store.errors.length).toBe(0)
27
- })
28
-
29
- it("delete_server_error", () => {
30
- const errors_store = use_errors_store()
31
- errors_store.$patch({ server_error: true })
32
- expect(errors_store.server_error).toBe(true)
33
- errors_store.delete_server_error()
34
- expect(errors_store.server_error).toBe(false)
35
- })
36
- })