@geode/opengeodeweb-front 10.20.0 → 10.20.1-rc.2

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.
@@ -39,11 +39,11 @@ async function saveRename() {
39
39
  </script>
40
40
 
41
41
  <template>
42
- <v-list v-if="savedPositions.length > 0" class="bg-transparent pa-2">
42
+ <v-list v-if="savedPositions.length > 0" class="bg-transparent pa-1">
43
43
  <v-list-item
44
44
  v-for="position in savedPositions"
45
45
  :key="position.id"
46
- class="rounded-lg mb-1"
46
+ class="rounded-lg mb-1 px-2"
47
47
  :active="editingId === position.id"
48
48
  active-color="primary"
49
49
  >
@@ -52,16 +52,16 @@ async function saveRename() {
52
52
  icon
53
53
  variant="tonal"
54
54
  color="success"
55
- size="small"
56
- class="mr-2"
55
+ size="x-small"
56
+ class="mr-1"
57
57
  @click="restorePosition(position.id)"
58
58
  >
59
- <v-icon size="20">mdi-play</v-icon>
59
+ <v-icon size="14">mdi-play</v-icon>
60
60
  <v-tooltip activator="parent" location="top">Restore</v-tooltip>
61
61
  </v-btn>
62
62
  </template>
63
63
 
64
- <v-list-item-title class="font-weight-bold">
64
+ <v-list-item-title class="font-weight-semibold text-caption">
65
65
  <v-text-field
66
66
  v-if="editingId === position.id"
67
67
  v-model="editingName"
@@ -69,6 +69,7 @@ async function saveRename() {
69
69
  variant="underlined"
70
70
  hide-details
71
71
  autofocus
72
+ class="text-caption"
72
73
  @keyup.enter="saveRename"
73
74
  @blur="saveRename"
74
75
  ></v-text-field>
@@ -76,39 +77,42 @@ async function saveRename() {
76
77
  </v-list-item-title>
77
78
 
78
79
  <template #append>
79
- <div class="d-flex g-1">
80
+ <div class="d-flex ga-1">
80
81
  <v-btn
81
82
  icon
82
83
  variant="text"
83
- size="small"
84
+ size="x-small"
84
85
  color="grey-darken-1"
85
86
  @click="startEditing(position)"
86
87
  >
87
- <v-icon size="18">mdi-pencil</v-icon>
88
+ <v-icon size="14">mdi-pencil</v-icon>
88
89
  <v-tooltip activator="parent" location="top">Rename</v-tooltip>
89
90
  </v-btn>
90
91
  <v-btn
91
92
  icon
92
93
  variant="text"
93
- size="small"
94
+ size="x-small"
94
95
  color="error"
95
96
  @click="deletePosition(position.id)"
96
97
  >
97
- <v-icon size="18">mdi-delete</v-icon>
98
+ <v-icon size="14">mdi-delete</v-icon>
98
99
  <v-tooltip activator="parent" location="top">Delete</v-tooltip>
99
100
  </v-btn>
100
101
  </div>
101
102
  </template>
102
103
  </v-list-item>
103
104
  </v-list>
104
- <div v-else class="text-center text-grey-lighten-1 py-8 italic">
105
- <v-icon size="48" class="mb-2 d-block mx-auto opacity-20">mdi-camera-off</v-icon>
105
+ <div v-else class="text-center text-grey-lighten-1 py-4 italic text-caption">
106
+ <v-icon size="32" class="mb-1 d-block mx-auto opacity-20">mdi-camera-off</v-icon>
106
107
  No saved positions yet.
107
108
  </div>
108
109
  </template>
109
110
 
110
111
  <style scoped>
111
112
  :deep(.v-list-item__prepend) {
112
- margin-inline-end: 12px !important;
113
+ margin-inline-end: 6px !important;
114
+ }
115
+ :deep(.v-list-item__append) {
116
+ margin-inline-start: 6px !important;
113
117
  }
114
118
  </style>
@@ -20,7 +20,7 @@ async function saveCurrentPosition() {
20
20
  </script>
21
21
 
22
22
  <template>
23
- <v-container class="pa-5 pb-2 bg-surface-variant-lighten-5">
23
+ <v-container class="pa-3 pb-1 bg-surface-variant-lighten-5">
24
24
  <v-row dense>
25
25
  <v-col cols="12">
26
26
  <v-text-field
@@ -30,7 +30,7 @@ async function saveCurrentPosition() {
30
30
  density="compact"
31
31
  variant="outlined"
32
32
  hide-details
33
- class="mb-3"
33
+ class="mb-2 text-caption"
34
34
  ></v-text-field>
35
35
  </v-col>
36
36
  <v-col cols="12" class="d-flex align-center">
@@ -38,9 +38,11 @@ async function saveCurrentPosition() {
38
38
  color="primary"
39
39
  variant="elevated"
40
40
  block
41
+ size="small"
41
42
  :disabled="!newPositionName"
42
43
  @click="saveCurrentPosition"
43
- height="40"
44
+ height="32"
45
+ class="text-caption font-weight-bold"
44
46
  >
45
47
  Save
46
48
  </v-btn>
@@ -7,7 +7,7 @@ const emit = defineEmits(["close"]);
7
7
 
8
8
  const { show_dialog, width } = defineProps({
9
9
  show_dialog: { type: Boolean, required: true },
10
- width: { type: Number, required: false, default: 450 },
10
+ width: { type: Number, required: false, default: 260 },
11
11
  });
12
12
  </script>
13
13
 
@@ -31,9 +31,24 @@ const { show_dialog, width } = defineProps({
31
31
 
32
32
  <v-divider></v-divider>
33
33
 
34
- <v-card-actions class="pa-4">
34
+ <v-card-actions class="pa-2">
35
35
  <v-spacer></v-spacer>
36
- <v-btn variant="text" color="grey-darken-1" @click="emit('close')">Close</v-btn>
36
+ <v-btn
37
+ variant="text"
38
+ size="small"
39
+ color="white"
40
+ class="text-caption text-none"
41
+ @click="emit('close')"
42
+ >Close</v-btn
43
+ >
37
44
  </v-card-actions>
38
45
  </GlassCard>
39
46
  </template>
47
+
48
+ <style scoped>
49
+ :deep(.v-card-title) {
50
+ font-size: 0.95rem !important;
51
+ font-weight: bold !important;
52
+ padding: 10px 14px 6px 14px !important;
53
+ }
54
+ </style>
@@ -7,7 +7,7 @@ import { newInstance as vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering
7
7
 
8
8
  const { panel, width } = defineProps({
9
9
  panel: { type: Boolean, default: false },
10
- width: { type: Number, default: 400 },
10
+ width: { type: Number, default: 260 },
11
11
  });
12
12
 
13
13
  const show = defineModel("show", { type: Boolean, default: false });
@@ -36,7 +36,7 @@ const orientations = [
36
36
  face: "front",
37
37
  vtkKey: "YPlus",
38
38
  rotation: 180,
39
- position: { top: "35%", left: "20%" },
39
+ position: { top: "35%", left: "22%" },
40
40
  },
41
41
  {
42
42
  label: "Y-",
@@ -44,7 +44,7 @@ const orientations = [
44
44
  face: "back",
45
45
  vtkKey: "YMinus",
46
46
  rotation: 0,
47
- position: { top: "65%", left: "80%" },
47
+ position: { top: "65%", left: "78%" },
48
48
  },
49
49
  {
50
50
  label: "X+",
@@ -52,7 +52,7 @@ const orientations = [
52
52
  face: "right",
53
53
  vtkKey: "XPlus",
54
54
  rotation: 90,
55
- position: { top: "35%", left: "80%" },
55
+ position: { top: "35%", left: "78%" },
56
56
  },
57
57
  {
58
58
  label: "X-",
@@ -60,7 +60,7 @@ const orientations = [
60
60
  face: "left",
61
61
  vtkKey: "XMinus",
62
62
  rotation: -90,
63
- position: { top: "65%", left: "20%" },
63
+ position: { top: "65%", left: "22%" },
64
64
  },
65
65
  ];
66
66
 
@@ -177,7 +177,7 @@ watch(hoveredFace, (newFace, oldFace) => {
177
177
  <div
178
178
  class="pa-0 overflow-hidden position-relative"
179
179
  style="
180
- height: 320px;
180
+ height: 220px;
181
181
  background: radial-gradient(circle at center, rgba(255, 255, 255, 0.05), transparent 70%);
182
182
  "
183
183
  >
@@ -200,7 +200,7 @@ watch(hoveredFace, (newFace, oldFace) => {
200
200
  class="position-absolute d-flex align-center justify-center"
201
201
  style="top: 50%; left: 50%; transform: translate(-50%, -50%)"
202
202
  >
203
- <div ref="cubeContainer" style="width: 100px; height: 100px; pointer-events: none" />
203
+ <div ref="cubeContainer" style="width: 70px; height: 70px; pointer-events: none" />
204
204
  </div>
205
205
 
206
206
  <v-btn
@@ -208,7 +208,7 @@ watch(hoveredFace, (newFace, oldFace) => {
208
208
  :key="orientation.value"
209
209
  icon
210
210
  variant="tonal"
211
- size="44"
211
+ size="32"
212
212
  class="satellite-node position-absolute"
213
213
  :style="orientation.position"
214
214
  @mouseenter="hoveredFace = orientation.face"
@@ -216,7 +216,9 @@ watch(hoveredFace, (newFace, oldFace) => {
216
216
  @click.stop="emit('select', orientation.value)"
217
217
  >
218
218
  <v-tooltip activator="parent" location="top">{{ orientation.value }} View</v-tooltip>
219
- <span class="text-caption font-weight-black">{{ orientation.label }}</span>
219
+ <span class="text-caption font-weight-black" style="font-size: 0.7rem !important">{{
220
+ orientation.label
221
+ }}</span>
220
222
  </v-btn>
221
223
  </div>
222
224
  </ToolPanel>
@@ -9,7 +9,7 @@ import { useViewerStore } from "@ogw_front/stores/viewer";
9
9
  const show = defineModel({ type: Boolean, default: false });
10
10
 
11
11
  const { width } = defineProps({
12
- width: { type: Number, default: 400 },
12
+ width: { type: Number, default: 260 },
13
13
  });
14
14
 
15
15
  const output_extensions =
@@ -77,55 +77,92 @@ watch(screenshot_type, (value) => {
77
77
  action-label="Screenshot"
78
78
  @action="takeScreenshot"
79
79
  >
80
- <v-container class="pa-5">
81
- <v-row justify="center">
80
+ <v-container class="pa-3 py-1">
81
+ <v-row justify="center" dense>
82
82
  <v-col cols="12" class="py-0 d-flex justify-center">
83
83
  <v-btn-toggle
84
84
  v-model="screenshot_type"
85
85
  mandatory
86
86
  color="primary"
87
87
  variant="outlined"
88
- class="mb-4"
89
- density="comfortable"
88
+ class="mb-2"
89
+ density="compact"
90
90
  >
91
- <v-btn value="file" prepend-icon="mdi-file-download-outline"> File </v-btn>
92
- <v-btn value="clipboard" prepend-icon="mdi-content-copy"> Clipboard </v-btn>
91
+ <v-btn
92
+ value="file"
93
+ prepend-icon="mdi-file-download-outline"
94
+ size="small"
95
+ class="text-caption text-none"
96
+ >
97
+ File
98
+ </v-btn>
99
+ <v-btn
100
+ value="clipboard"
101
+ prepend-icon="mdi-content-copy"
102
+ size="small"
103
+ class="text-caption text-none"
104
+ >
105
+ Clipboard
106
+ </v-btn>
93
107
  </v-btn-toggle>
94
108
  </v-col>
95
109
  </v-row>
96
110
 
97
- <v-row v-if="screenshot_type === 'file'">
98
- <v-col cols="8" class="py-0">
99
- <v-text-field v-model="filename" label="File name"></v-text-field>
111
+ <v-row dense v-if="screenshot_type === 'file'">
112
+ <v-col cols="12" class="py-1">
113
+ <v-text-field
114
+ v-model="filename"
115
+ label="File name"
116
+ variant="outlined"
117
+ density="compact"
118
+ hide-details
119
+ class="text-caption"
120
+ ></v-text-field>
100
121
  </v-col>
101
- <v-col cols="4" class="py-0">
122
+ <v-col cols="12" class="py-1">
102
123
  <v-select
103
124
  v-model="output_extension"
104
125
  :items="output_extensions"
105
126
  label="Extension"
127
+ variant="outlined"
128
+ density="compact"
129
+ hide-details
106
130
  required
131
+ class="text-caption"
107
132
  />
108
133
  </v-col>
109
134
  </v-row>
110
135
 
111
- <v-row>
112
- <v-col cols="12" class="py-0">
136
+ <v-row dense>
137
+ <v-col cols="12" class="py-1">
113
138
  <v-switch
114
139
  v-model="include_background"
115
140
  :disabled="screenshot_type === 'file' && output_extension !== 'png'"
116
141
  label="Include background"
142
+ density="compact"
143
+ hide-details
117
144
  inset
145
+ class="text-caption"
118
146
  ></v-switch>
119
147
  </v-col>
120
148
  </v-row>
121
149
  </v-container>
122
150
 
123
151
  <template #actions>
124
- <v-card-actions class="justify-center pb-6" style="gap: 12px">
125
- <v-btn variant="text" size="small" color="white" @click="show = false"> Cancel </v-btn>
152
+ <v-card-actions class="justify-center pb-3 pt-0" style="gap: 8px">
153
+ <v-btn
154
+ variant="text"
155
+ size="small"
156
+ color="white"
157
+ class="text-caption text-none"
158
+ @click="show = false"
159
+ >
160
+ Cancel
161
+ </v-btn>
126
162
  <v-btn
127
163
  variant="outlined"
128
164
  size="small"
165
+ class="text-caption text-none"
129
166
  :disabled="(screenshot_type === 'file' && !filename) || !output_extension"
130
167
  color="white"
131
168
  @click="takeScreenshot()"
@@ -3,7 +3,7 @@ import GlassCard from "@ogw_front/components/GlassCard";
3
3
 
4
4
  const { title, width, closeLabel, actionLabel } = defineProps({
5
5
  title: { type: String, default: "" },
6
- width: { type: Number, default: 400 },
6
+ width: { type: Number, default: 260 },
7
7
  closeLabel: { type: String, default: "Close" },
8
8
  actionLabel: { type: String, default: undefined },
9
9
  });
@@ -34,8 +34,14 @@ function close() {
34
34
 
35
35
  <template #actions>
36
36
  <slot name="actions">
37
- <v-card-actions class="justify-center pb-6" style="gap: 12px">
38
- <v-btn variant="text" size="small" color="white" @click="close">
37
+ <v-card-actions class="justify-center pb-3 pt-0" style="gap: 8px">
38
+ <v-btn
39
+ variant="text"
40
+ size="small"
41
+ color="white"
42
+ class="text-caption text-none"
43
+ @click="close"
44
+ >
39
45
  {{ closeLabel }}
40
46
  </v-btn>
41
47
  <v-btn
@@ -43,6 +49,7 @@ function close() {
43
49
  variant="outlined"
44
50
  size="small"
45
51
  color="white"
52
+ class="text-caption text-none"
46
53
  @click="emit('action')"
47
54
  >
48
55
  {{ actionLabel }}
@@ -59,4 +66,9 @@ function close() {
59
66
  top: 90px;
60
67
  right: 55px;
61
68
  }
69
+ :deep(.v-card-title) {
70
+ font-size: 0.9rem !important;
71
+ font-weight: bold !important;
72
+ padding: 8px 12px 4px 12px !important;
73
+ }
62
74
  </style>
@@ -203,7 +203,7 @@ const camera_options = computed(() => [
203
203
  <ZScaling
204
204
  v-model:show="showZScaling"
205
205
  v-model="zScale"
206
- :width="400"
206
+ :width="260"
207
207
  @apply="handleZScalingClose"
208
208
  />
209
209
  </template>
@@ -119,17 +119,68 @@ const colorModes = [
119
119
  const modelComponentTypeLabel = computed(() =>
120
120
  componentType.value ? `${componentType.value}s Options` : "",
121
121
  );
122
+
123
+ const modelComponentsColorMode = ref("constant");
124
+
125
+ const modelComponentsColor = computed({
126
+ get: () => {
127
+ if (selection.value.length > 0) {
128
+ return dataStyleStore.getModelComponentColor(modelId.value, selection.value[0]);
129
+ }
130
+ return { red: 255, green: 255, blue: 255 };
131
+ },
132
+ set: async (color) => {
133
+ if (selection.value.length > 0) {
134
+ await dataStyleStore.setModelComponentsColor(
135
+ modelId.value,
136
+ selection.value,
137
+ color,
138
+ modelComponentsColorMode.value,
139
+ );
140
+ hybridViewerStore.remoteRender();
141
+ }
142
+ },
143
+ });
144
+
145
+ watch(modelComponentsColorMode, async (colorMode) => {
146
+ if (colorMode === "random" && selection.value.length > 0) {
147
+ await dataStyleStore.setModelComponentsColor(
148
+ modelId.value,
149
+ selection.value,
150
+ undefined,
151
+ colorMode,
152
+ );
153
+ hybridViewerStore.remoteRender();
154
+ }
155
+ });
122
156
  </script>
123
157
 
124
158
  <template>
125
- <div class="model-style-card">
159
+ <v-sheet class="model-style-card" color="transparent">
126
160
  <OptionsSection title="Model Options">
127
161
  <VisibilitySwitch v-model="modelVisibility" />
128
162
  </OptionsSection>
129
163
 
164
+ <OptionsSection v-if="!componentType && !componentId" title="Components Options" class="mt-6">
165
+ <v-label class="text-caption mb-1 mt-2">Color Mode</v-label>
166
+ <v-select
167
+ v-model="modelComponentsColorMode"
168
+ :items="colorModes"
169
+ density="compact"
170
+ hide-details
171
+ class="mb-3"
172
+ variant="outlined"
173
+ />
174
+
175
+ <template v-if="modelComponentsColorMode === 'constant'">
176
+ <v-label class="text-caption mb-1">Color</v-label>
177
+ <ViewerOptionsColorPicker v-model="modelComponentsColor" />
178
+ </template>
179
+ </OptionsSection>
180
+
130
181
  <OptionsSection v-if="componentType" :title="modelComponentTypeLabel" class="mt-6">
131
182
  <VisibilitySwitch v-model="modelComponentTypeVisibility" />
132
- <div class="text-caption mb-1 mt-2">Color Mode</div>
183
+ <v-label class="text-caption mb-1 mt-2">Color Mode</v-label>
133
184
  <v-select
134
185
  v-model="modelComponentTypeColorMode"
135
186
  :items="colorModes"
@@ -140,14 +191,14 @@ const modelComponentTypeLabel = computed(() =>
140
191
  />
141
192
 
142
193
  <template v-if="modelComponentTypeColorMode === 'constant'">
143
- <div class="text-caption mb-1">Color</div>
194
+ <v-label class="text-caption mb-1">Color</v-label>
144
195
  <ViewerOptionsColorPicker v-model="modelComponentTypeColor" />
145
196
  </template>
146
197
  </OptionsSection>
147
198
 
148
199
  <OptionsSection v-if="componentId" title="Component Options" class="mt-6">
149
200
  <VisibilitySwitch v-model="componentVisibility" />
150
- <div class="text-caption mb-1 mt-2">Color Mode</div>
201
+ <v-label class="text-caption mb-1 mt-2">Color Mode</v-label>
151
202
  <v-select
152
203
  v-model="componentColorMode"
153
204
  :items="colorModes"
@@ -158,11 +209,11 @@ const modelComponentTypeLabel = computed(() =>
158
209
  />
159
210
 
160
211
  <template v-if="componentColorMode === 'constant'">
161
- <div class="text-caption mb-1">Color</div>
212
+ <v-label class="text-caption mb-1">Color</v-label>
162
213
  <ViewerOptionsColorPicker v-model="componentColor" />
163
214
  </template>
164
215
  </OptionsSection>
165
- </div>
216
+ </v-sheet>
166
217
  </template>
167
218
 
168
219
  <style scoped>
@@ -5,7 +5,7 @@ const zScale = defineModel({ type: Number, default: 1 });
5
5
  const show = defineModel("show", { type: Boolean, default: false });
6
6
 
7
7
  const { width } = defineProps({
8
- width: { type: Number, default: 400 },
8
+ width: { type: Number, default: 260 },
9
9
  });
10
10
 
11
11
  const emit = defineEmits(["apply"]);
@@ -24,23 +24,34 @@ function apply() {
24
24
  action-label="Apply"
25
25
  @action="apply"
26
26
  >
27
- <v-container class="pa-5">
28
- <v-row>
29
- <v-col cols="12" class="py-2">
30
- <v-slider v-model="zScale" :min="1" :max="10" :step="0.2" label="Z Scale" thumb-label />
27
+ <v-container class="pa-3 py-1">
28
+ <v-row dense>
29
+ <v-col cols="12" class="py-1">
30
+ <v-slider
31
+ v-model="zScale"
32
+ :min="1"
33
+ :max="10"
34
+ :step="0.2"
35
+ label="Z Scale"
36
+ density="compact"
37
+ hide-details
38
+ thumb-label
39
+ class="text-caption"
40
+ />
31
41
  </v-col>
32
42
  </v-row>
33
- <v-row>
34
- <v-col cols="12" class="py-2">
43
+ <v-row dense>
44
+ <v-col cols="12" class="py-1">
35
45
  <v-text-field
36
46
  v-model.number="zScale"
37
47
  type="number"
38
48
  label="Z Scale Value"
39
- outlined
40
- dense
49
+ variant="outlined"
50
+ density="compact"
41
51
  hide-details
42
52
  step="0.1"
43
53
  :min="1"
54
+ class="text-caption"
44
55
  />
45
56
  </v-col>
46
57
  </v-row>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geode/opengeodeweb-front",
3
- "version": "10.20.0",
3
+ "version": "10.20.1-rc.2",
4
4
  "description": "OpenSource Vue/Nuxt/Pinia/Vuetify framework for web applications",
5
5
  "homepage": "https://github.com/Geode-solutions/OpenGeodeWeb-Front",
6
6
  "bugs": {
@@ -34,8 +34,8 @@
34
34
  "build": ""
35
35
  },
36
36
  "dependencies": {
37
- "@geode/opengeodeweb-back": "latest",
38
- "@geode/opengeodeweb-viewer": "latest",
37
+ "@geode/opengeodeweb-back": "next",
38
+ "@geode/opengeodeweb-viewer": "next",
39
39
  "@google-cloud/run": "3.2.0",
40
40
  "@kitware/vtk.js": "33.3.0",
41
41
  "@mdi/font": "7.4.47",