@vcmap/ui 5.0.0-rc.15 → 5.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/config/base.config.json +4 -0
- package/config/dev.config.json +5 -1
- package/config/www.config.json +5 -3
- package/dist/assets/{cesium.2e288a.js → cesium.430460.js} +0 -0
- package/dist/assets/cesium.js +1 -1
- package/dist/assets/{core.8014d3.js → core.5089ba.js} +5925 -4374
- package/dist/assets/core.js +1 -1
- package/dist/assets/{index.3f74fa92.js → index.854f8e2b.js} +1 -1
- package/dist/assets/{ol.31c3a5.js → ol.9be53a.js} +0 -0
- package/dist/assets/ol.js +1 -1
- package/dist/assets/ui.49010a.css +1 -0
- package/dist/assets/{ui.36f84f.js → ui.49010a.js} +3907 -3232
- package/dist/assets/ui.js +1 -1
- package/dist/assets/{vue.a39c10.js → vue.247c1c.js} +0 -0
- package/dist/assets/vue.js +2 -2
- package/dist/assets/{vuetify.378637.css → vuetify.735e58.css} +1 -1
- package/dist/assets/{vuetify.378637.js → vuetify.735e58.js} +1 -1
- package/dist/assets/vuetify.js +2 -2
- package/dist/index.html +1 -1
- package/index.html +77 -0
- package/index.js +4 -0
- package/package.json +4 -2
- package/plugins/@vcmap/create-link/fallbackCreateLink.vue +4 -1
- package/plugins/@vcmap/create-link/index.js +4 -1
- package/plugins/@vcmap/pluginExample/exampleActions.js +45 -0
- package/plugins/@vcmap/pluginExample/index.js +24 -1
- package/plugins/@vcmap/pluginExample/pluginExampleComponent.vue +70 -42
- package/plugins/@vcmap/search-nominatim/nominatim.js +1 -1
- package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +4 -2
- package/plugins/notifier/index.js +31 -0
- package/plugins/notifier/notifierTester.vue +88 -0
- package/plugins/package.json +1 -1
- package/plugins/test/allIconsComponent.vue +2 -2
- package/plugins/test/emptyComponent.vue +1 -1
- package/plugins/test/index.js +22 -0
- package/plugins/test/myCustomHeader.vue +9 -1
- package/plugins/test/testList.vue +287 -0
- package/plugins/test/windowManagerExample.vue +3 -0
- package/plugins/wizardExample/index.js +41 -0
- package/plugins/wizardExample/wizardExample.vue +77 -0
- package/src/application/VcsApp.vue +18 -8
- package/src/components/form-inputs-controls/VcsFormSection.vue +10 -10
- package/src/components/form-inputs-controls/VcsSelect.vue +33 -1
- package/src/components/form-inputs-controls/VcsTextField.vue +11 -3
- package/src/components/form-inputs-controls/VcsWizard.vue +133 -0
- package/src/components/imageElementInjector.vue +22 -0
- package/src/components/lists/VcsList.vue +466 -0
- package/src/components/lists/VcsTreeview.vue +1 -2
- package/src/components/lists/VcsTreeviewLeaf.vue +18 -50
- package/src/components/lists/VcsTreeviewSearchbar.vue +1 -23
- package/src/components/tables/VcsTable.vue +13 -1
- package/src/contentTree/LayerTree.vue +1 -1
- package/src/contentTree/contentTreeItem.js +13 -13
- package/src/contentTree/subContentTreeItem.js +1 -1
- package/src/contentTree/vcsObjectContentTreeItem.js +1 -1
- package/src/featureInfo/BalloonComponent.vue +10 -8
- package/src/featureInfo/balloonFeatureInfoView.js +14 -14
- package/src/featureInfo/balloonHelper.js +4 -0
- package/src/featureInfo/featureInfo.js +13 -0
- package/src/featureInfo/featureInfoInteraction.js +1 -1
- package/src/i18n/de.js +7 -0
- package/src/i18n/en.js +7 -0
- package/src/icons/+all.js +4 -0
- package/src/icons/WandIcon.vue +63 -0
- package/src/manager/window/WindowComponent.vue +9 -2
- package/src/manager/window/WindowComponentHeader.vue +33 -7
- package/src/manager/window/WindowManager.vue +1 -0
- package/src/manager/window/windowManager.js +11 -1
- package/src/navigation/overviewMap.js +10 -9
- package/src/notifier/notifier.js +121 -0
- package/src/notifier/notifierComponent.vue +84 -0
- package/src/styles/variables.scss +19 -3
- package/src/vcsUiApp.js +19 -1
- package/src/vuePlugins/vuetify.js +2 -0
- package/dist/assets/ui.36f84f.css +0 -1
package/plugins/package.json
CHANGED
@@ -27,14 +27,14 @@
|
|
27
27
|
|
28
28
|
export default {
|
29
29
|
name: 'AllIconsComponent',
|
30
|
-
components:
|
30
|
+
components: {
|
31
31
|
VSheet,
|
32
32
|
VList,
|
33
33
|
VListItem,
|
34
34
|
VListItemIcon,
|
35
35
|
VIcon,
|
36
36
|
VListItemTitle,
|
37
|
-
|
37
|
+
},
|
38
38
|
computed: {
|
39
39
|
icons() {
|
40
40
|
return Object.keys(Icons).map(n => `$${n}`);
|
package/plugins/test/index.js
CHANGED
@@ -7,6 +7,7 @@ import { toolboxData } from './toolbox-data.js';
|
|
7
7
|
import editor from './editor.vue';
|
8
8
|
import windowManagerExample from './windowManagerExample.vue';
|
9
9
|
import AllIconsComponent from './allIconsComponent.vue';
|
10
|
+
import TestList from './testList.vue';
|
10
11
|
|
11
12
|
let source;
|
12
13
|
|
@@ -97,11 +98,27 @@ export default async function () {
|
|
97
98
|
app.windowManager,
|
98
99
|
'@vcmap/test',
|
99
100
|
);
|
101
|
+
const { action: listAction, destroy: destroyList } = createToggleAction(
|
102
|
+
{
|
103
|
+
name: 'TestList',
|
104
|
+
},
|
105
|
+
{
|
106
|
+
id: 'testList',
|
107
|
+
state: {
|
108
|
+
headerTitle: 'Test List',
|
109
|
+
},
|
110
|
+
slot: WindowSlot.DYNAMIC_LEFT,
|
111
|
+
component: TestList,
|
112
|
+
},
|
113
|
+
app.windowManager,
|
114
|
+
'@vcmap/test',
|
115
|
+
);
|
100
116
|
this._destroyActions = [
|
101
117
|
destroyConfigEditorAction,
|
102
118
|
destroyWindowAction,
|
103
119
|
destroyIconAction,
|
104
120
|
destroryClipboardDialogAction,
|
121
|
+
destroyList,
|
105
122
|
];
|
106
123
|
const alertAction = {
|
107
124
|
name: 'VC Systems',
|
@@ -130,6 +147,11 @@ export default async function () {
|
|
130
147
|
'@vcmap/test',
|
131
148
|
ButtonLocation.TOOL,
|
132
149
|
);
|
150
|
+
app.navbarManager.add(
|
151
|
+
{ id: 'list', action: listAction },
|
152
|
+
'@vcmap/test',
|
153
|
+
ButtonLocation.TOOL,
|
154
|
+
);
|
133
155
|
app.navbarManager.add(
|
134
156
|
{
|
135
157
|
id: 'createLink',
|
@@ -1,6 +1,9 @@
|
|
1
1
|
<template>
|
2
2
|
<div>
|
3
|
-
|
3
|
+
<div>
|
4
|
+
Ha, this is a custom Header with a <span @click="clicked"> CLOSE thing. </span>
|
5
|
+
</div>
|
6
|
+
<div>And here is '<b>{{ sample }}</b>' passed through</div>
|
4
7
|
</div>
|
5
8
|
</template>
|
6
9
|
|
@@ -8,6 +11,11 @@
|
|
8
11
|
|
9
12
|
export default {
|
10
13
|
name: 'MyCustomHeader',
|
14
|
+
props: {
|
15
|
+
sample: {
|
16
|
+
type: String,
|
17
|
+
},
|
18
|
+
},
|
11
19
|
setup(props, { emit }) {
|
12
20
|
return {
|
13
21
|
clicked: () => {
|
@@ -0,0 +1,287 @@
|
|
1
|
+
<template>
|
2
|
+
<v-sheet>
|
3
|
+
<v-sheet class="pa-2">
|
4
|
+
<v-switch
|
5
|
+
v-model="selectable"
|
6
|
+
label="Selectable"
|
7
|
+
/>
|
8
|
+
<v-switch
|
9
|
+
:disabled="!selectable"
|
10
|
+
v-model="selectSingle"
|
11
|
+
label=" Single Select"
|
12
|
+
/>
|
13
|
+
<v-switch
|
14
|
+
v-model="searchable"
|
15
|
+
label="Searchable"
|
16
|
+
/>
|
17
|
+
<v-dialog
|
18
|
+
v-model="dialog"
|
19
|
+
width="400"
|
20
|
+
>
|
21
|
+
<template #activator="{ on }">
|
22
|
+
<vcs-button v-on="on">
|
23
|
+
Add An item
|
24
|
+
</vcs-button>
|
25
|
+
</template>
|
26
|
+
<v-card class="pa-2">
|
27
|
+
<v-form
|
28
|
+
@submit.prevent="add"
|
29
|
+
>
|
30
|
+
<vcs-text-field
|
31
|
+
v-model="newItem.name"
|
32
|
+
label="Name"
|
33
|
+
:rules="required"
|
34
|
+
/>
|
35
|
+
<vcs-text-field
|
36
|
+
v-model="newItem.title"
|
37
|
+
label="Title"
|
38
|
+
:rules="required"
|
39
|
+
/>
|
40
|
+
<v-switch label="visible" v-model="newItem.visible" />
|
41
|
+
<v-switch label="disabled" v-model="newItem.disabled" />
|
42
|
+
<v-switch label="random icon" v-model="newItem.icon" />
|
43
|
+
<v-switch label="console.log action" v-model="newItem.action" />
|
44
|
+
<v-switch label="console.log on clicked" v-model="newItem.clicked" />
|
45
|
+
<v-switch label="console.log selected state" v-model="newItem.selected" />
|
46
|
+
<vcs-button
|
47
|
+
type="submit"
|
48
|
+
>
|
49
|
+
Add
|
50
|
+
</vcs-button>
|
51
|
+
</v-form>
|
52
|
+
</v-card>
|
53
|
+
</v-dialog>
|
54
|
+
<v-divider class="ma-2" />
|
55
|
+
<v-switch
|
56
|
+
v-model="showTitle"
|
57
|
+
label="Show Title"
|
58
|
+
/>
|
59
|
+
<vcs-text-field v-model="title" placeholder="Title" />
|
60
|
+
<v-switch
|
61
|
+
v-model="titleActions"
|
62
|
+
label="Title Actions"
|
63
|
+
/>
|
64
|
+
<v-switch
|
65
|
+
v-model="titleIcon"
|
66
|
+
label="Title Icon"
|
67
|
+
/>
|
68
|
+
<v-divider class="ma-2" />
|
69
|
+
<template v-if="selectable">
|
70
|
+
<vcs-button
|
71
|
+
@click="selected = []"
|
72
|
+
>
|
73
|
+
Clear Selection
|
74
|
+
</vcs-button>
|
75
|
+
<v-switch v-model="showSelection" label="Show Selection" />
|
76
|
+
<ul v-if="showSelection">
|
77
|
+
<li
|
78
|
+
v-for="(i, index) in selected"
|
79
|
+
:key="`item-${index}`"
|
80
|
+
>
|
81
|
+
{{ i.title }}
|
82
|
+
</li>
|
83
|
+
</ul>
|
84
|
+
</template>
|
85
|
+
<v-divider class="ma-2" />
|
86
|
+
</v-sheet>
|
87
|
+
|
88
|
+
<vcs-list
|
89
|
+
:items="items"
|
90
|
+
:selectable="selectable"
|
91
|
+
:single-select="selectSingle"
|
92
|
+
:searchable="searchable"
|
93
|
+
:show-title="showTitle"
|
94
|
+
:icon="titleIconSrc"
|
95
|
+
:actions="titleActionsArray"
|
96
|
+
:title="title"
|
97
|
+
v-model="selected"
|
98
|
+
/>
|
99
|
+
</v-sheet>
|
100
|
+
</template>
|
101
|
+
|
102
|
+
<script>
|
103
|
+
import { VcsList, VcsButton, VcsTextField, Icons } from '@vcmap/ui';
|
104
|
+
import {
|
105
|
+
VSwitch,
|
106
|
+
VDivider,
|
107
|
+
VSheet,
|
108
|
+
VDialog,
|
109
|
+
VCard,
|
110
|
+
VForm,
|
111
|
+
} from 'vuetify/lib';
|
112
|
+
import { computed, ref } from 'vue';
|
113
|
+
|
114
|
+
function getRandomIcon() {
|
115
|
+
const keys = Object.keys(Icons);
|
116
|
+
const index = Math.floor(keys.length * Math.random());
|
117
|
+
return `$${keys[index]}`;
|
118
|
+
}
|
119
|
+
|
120
|
+
const defaultItems = [
|
121
|
+
{
|
122
|
+
name: 'foo',
|
123
|
+
title: 'Foo',
|
124
|
+
tooltip: 'this is the foo',
|
125
|
+
icon: 'mdi-pen',
|
126
|
+
},
|
127
|
+
{
|
128
|
+
name: 'bar',
|
129
|
+
title: 'Bar',
|
130
|
+
tooltip: 'just a bar',
|
131
|
+
actions: [
|
132
|
+
{
|
133
|
+
name: 'console.log',
|
134
|
+
callback() {
|
135
|
+
console.log('bar action');
|
136
|
+
},
|
137
|
+
},
|
138
|
+
],
|
139
|
+
},
|
140
|
+
{
|
141
|
+
name: 'bar',
|
142
|
+
title: 'Baz',
|
143
|
+
tooltip: 'special baz',
|
144
|
+
},
|
145
|
+
];
|
146
|
+
|
147
|
+
export default {
|
148
|
+
name: 'TestList',
|
149
|
+
components: {
|
150
|
+
VcsList,
|
151
|
+
VcsButton,
|
152
|
+
VcsTextField,
|
153
|
+
VSwitch,
|
154
|
+
VDivider,
|
155
|
+
VSheet,
|
156
|
+
VDialog,
|
157
|
+
VCard,
|
158
|
+
VForm,
|
159
|
+
},
|
160
|
+
setup() {
|
161
|
+
const selectable = ref(true);
|
162
|
+
const searchable = ref(true);
|
163
|
+
const selectSingle = ref(false);
|
164
|
+
const showSelection = ref(false);
|
165
|
+
const showTitle = ref(true);
|
166
|
+
const title = ref('Title');
|
167
|
+
const titleActionsArray = ref([]);
|
168
|
+
const titleIconSrc = ref(null);
|
169
|
+
const selected = ref([]);
|
170
|
+
const items = ref(defaultItems);
|
171
|
+
const newItem = ref({
|
172
|
+
name: 'foo',
|
173
|
+
title: 'foo',
|
174
|
+
disabled: false,
|
175
|
+
visible: true,
|
176
|
+
icon: false,
|
177
|
+
action: false,
|
178
|
+
clicked: false,
|
179
|
+
selected: false,
|
180
|
+
});
|
181
|
+
const dialog = ref(false);
|
182
|
+
|
183
|
+
return {
|
184
|
+
selectable,
|
185
|
+
searchable,
|
186
|
+
selectSingle,
|
187
|
+
selected,
|
188
|
+
showSelection,
|
189
|
+
showTitle,
|
190
|
+
title,
|
191
|
+
titleActionsArray,
|
192
|
+
titleIconSrc,
|
193
|
+
items,
|
194
|
+
newItem,
|
195
|
+
dialog,
|
196
|
+
required: [
|
197
|
+
v => !!v || 'Input may not be null',
|
198
|
+
v => v.length > 0 || 'Input must have a length',
|
199
|
+
],
|
200
|
+
add() {
|
201
|
+
const item = {
|
202
|
+
name: newItem.value.name,
|
203
|
+
title: newItem.value.title,
|
204
|
+
disabled: newItem.value.disabled,
|
205
|
+
visible: newItem.value.visible,
|
206
|
+
};
|
207
|
+
|
208
|
+
if (newItem.value.icon) {
|
209
|
+
item.icon = getRandomIcon();
|
210
|
+
}
|
211
|
+
|
212
|
+
if (newItem.value.action) {
|
213
|
+
item.actions = [
|
214
|
+
{
|
215
|
+
name: 'console.log',
|
216
|
+
callback() {
|
217
|
+
console.log('hi, i\'m: ', item.name);
|
218
|
+
},
|
219
|
+
},
|
220
|
+
];
|
221
|
+
}
|
222
|
+
|
223
|
+
if (newItem.value.clicked) {
|
224
|
+
item.clicked = () => {
|
225
|
+
console.log(`${item.name} just got clicked`);
|
226
|
+
};
|
227
|
+
}
|
228
|
+
|
229
|
+
if (newItem.value.selected) {
|
230
|
+
item.selectionChanged = (selected) => {
|
231
|
+
if (selected) {
|
232
|
+
console.log(`${item.name} is selected`);
|
233
|
+
} else {
|
234
|
+
console.log(`${item.name} is no longer selected`);
|
235
|
+
}
|
236
|
+
};
|
237
|
+
}
|
238
|
+
items.value.push(item);
|
239
|
+
newItem.value = {
|
240
|
+
name: 'foo',
|
241
|
+
title: 'foo',
|
242
|
+
disabled: false,
|
243
|
+
visible: true,
|
244
|
+
icon: false,
|
245
|
+
action: false,
|
246
|
+
clicked: false,
|
247
|
+
selected: false,
|
248
|
+
};
|
249
|
+
dialog.value = false;
|
250
|
+
},
|
251
|
+
titleActions: computed({
|
252
|
+
get() {
|
253
|
+
return titleActionsArray.value.length > 0;
|
254
|
+
},
|
255
|
+
set(value) {
|
256
|
+
if (value) {
|
257
|
+
titleActionsArray.value = [{
|
258
|
+
name: 'console.log foo',
|
259
|
+
callback() {
|
260
|
+
console.log('foo');
|
261
|
+
},
|
262
|
+
}];
|
263
|
+
} else {
|
264
|
+
titleActionsArray.value = [];
|
265
|
+
}
|
266
|
+
},
|
267
|
+
}),
|
268
|
+
titleIcon: computed({
|
269
|
+
get() {
|
270
|
+
return !!titleIconSrc.value;
|
271
|
+
},
|
272
|
+
set(value) {
|
273
|
+
if (value) {
|
274
|
+
titleIconSrc.value = getRandomIcon();
|
275
|
+
} else {
|
276
|
+
titleIconSrc.value = null;
|
277
|
+
}
|
278
|
+
},
|
279
|
+
}),
|
280
|
+
};
|
281
|
+
},
|
282
|
+
};
|
283
|
+
</script>
|
284
|
+
|
285
|
+
<style lang="scss" scoped>
|
286
|
+
|
287
|
+
</style>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { createToggleAction, ButtonLocation, WindowSlot } from '@vcmap/ui';
|
2
|
+
import WizardExample from './wizardExample.vue';
|
3
|
+
|
4
|
+
export default async () => {
|
5
|
+
return {
|
6
|
+
name: 'wizardExample',
|
7
|
+
onVcsAppMounted(app) {
|
8
|
+
const { action, destroy } = createToggleAction(
|
9
|
+
{
|
10
|
+
name: 'wizardExample',
|
11
|
+
icon: '$vcsLegend',
|
12
|
+
title: 'VCS Wizard Example',
|
13
|
+
},
|
14
|
+
{
|
15
|
+
id: 'wizard-example',
|
16
|
+
component: WizardExample,
|
17
|
+
slot: WindowSlot.DYNAMIC_LEFT,
|
18
|
+
state: {
|
19
|
+
headerTitle: 'VCS Wizard',
|
20
|
+
headerIcon: '$vcsWand',
|
21
|
+
styles: { width: '350px', height: 'auto' },
|
22
|
+
},
|
23
|
+
},
|
24
|
+
app.windowManager,
|
25
|
+
'wizardExample',
|
26
|
+
);
|
27
|
+
app.navbarManager.add(
|
28
|
+
{ id: 'wizard-example', action },
|
29
|
+
'wizardExample',
|
30
|
+
ButtonLocation.TOOL,
|
31
|
+
);
|
32
|
+
this._destroyAction = destroy;
|
33
|
+
},
|
34
|
+
destroy() {
|
35
|
+
if (this._destroyAction) {
|
36
|
+
this._destroyAction();
|
37
|
+
this._destroyAction = null;
|
38
|
+
}
|
39
|
+
},
|
40
|
+
};
|
41
|
+
};
|
@@ -0,0 +1,77 @@
|
|
1
|
+
<template>
|
2
|
+
<VcsWizard
|
3
|
+
v-model="step"
|
4
|
+
>
|
5
|
+
<v-stepper-step
|
6
|
+
step="1"
|
7
|
+
editable
|
8
|
+
:complete="step > 1"
|
9
|
+
>
|
10
|
+
This is the first step
|
11
|
+
</v-stepper-step>
|
12
|
+
<v-stepper-content
|
13
|
+
step="1"
|
14
|
+
>
|
15
|
+
<v-sheet>
|
16
|
+
This is the content of the first step.
|
17
|
+
</v-sheet>
|
18
|
+
<VcsButton
|
19
|
+
@click="increaseStep()"
|
20
|
+
class="my-2"
|
21
|
+
>
|
22
|
+
Next
|
23
|
+
</VcsButton>
|
24
|
+
</v-stepper-content>
|
25
|
+
<v-stepper-step
|
26
|
+
:rules="[() => false]"
|
27
|
+
step="2"
|
28
|
+
editable
|
29
|
+
>
|
30
|
+
This is the second step
|
31
|
+
</v-stepper-step>
|
32
|
+
<v-stepper-content
|
33
|
+
step="2"
|
34
|
+
>
|
35
|
+
<VcsSelect
|
36
|
+
:items="['this', 'is', 'a', 'test']"
|
37
|
+
label="Select"
|
38
|
+
class="my-2"
|
39
|
+
/>
|
40
|
+
<VcsButton
|
41
|
+
@click="decreaseStep()"
|
42
|
+
>
|
43
|
+
Back
|
44
|
+
</VcsButton>
|
45
|
+
</v-stepper-content>
|
46
|
+
</VcsWizard>
|
47
|
+
</template>
|
48
|
+
|
49
|
+
<script>
|
50
|
+
import { VcsWizard, VcsButton, VcsSelect } from '@vcmap/ui';
|
51
|
+
import { VStepperStep, VStepperContent, VSheet } from 'vuetify/lib';
|
52
|
+
import { ref } from 'vue';
|
53
|
+
|
54
|
+
export default {
|
55
|
+
name: 'WizardExample',
|
56
|
+
components: {
|
57
|
+
VcsWizard,
|
58
|
+
VStepperStep,
|
59
|
+
VStepperContent,
|
60
|
+
VSheet,
|
61
|
+
VcsButton,
|
62
|
+
VcsSelect,
|
63
|
+
},
|
64
|
+
setup() {
|
65
|
+
const step = ref(1);
|
66
|
+
return {
|
67
|
+
step,
|
68
|
+
increaseStep() { step.value += 1; },
|
69
|
+
decreaseStep() { step.value -= 1; },
|
70
|
+
};
|
71
|
+
},
|
72
|
+
};
|
73
|
+
</script>
|
74
|
+
|
75
|
+
<style scoped>
|
76
|
+
|
77
|
+
</style>
|
@@ -20,6 +20,7 @@
|
|
20
20
|
<MapNavigation />
|
21
21
|
<ToolboxManagerComponent />
|
22
22
|
<WindowManagerComponent />
|
23
|
+
<NotifierComponent />
|
23
24
|
</v-container>
|
24
25
|
<v-footer absolute v-if="$vuetify.breakpoint.smAndUp" min-height="22px">
|
25
26
|
<VcsAttributionsFooter :entries="attributionEntries" :attribution-action="attributionAction" />
|
@@ -73,6 +74,7 @@
|
|
73
74
|
} from 'vue';
|
74
75
|
import { getVcsAppById } from '@vcmap/core';
|
75
76
|
import { VContainer, VFooter } from 'vuetify/lib';
|
77
|
+
import { getLogger } from '@vcsuite/logger';
|
76
78
|
import WindowManagerComponent from '../manager/window/WindowManager.vue';
|
77
79
|
import ToolboxManagerComponent from '../manager/toolbox/ToolboxManager.vue';
|
78
80
|
import { ButtonLocation } from '../manager/navbarManager.js';
|
@@ -91,6 +93,7 @@
|
|
91
93
|
import VcsButton from '../components/buttons/VcsButton.vue';
|
92
94
|
import VcsAttributions from './VcsAttributions.vue';
|
93
95
|
import { getAttributions } from './attributionsHelper.js';
|
96
|
+
import NotifierComponent from '../notifier/notifierComponent.vue';
|
94
97
|
|
95
98
|
/**
|
96
99
|
* You should call this function in the component providing the vcsUiApp to your
|
@@ -101,17 +104,23 @@
|
|
101
104
|
* @returns {function():void}
|
102
105
|
*/
|
103
106
|
export function setupPluginMountedListeners(app) {
|
104
|
-
|
107
|
+
/**
|
108
|
+
* wrapped execution of onVcsAppMounted hook
|
109
|
+
* @param {VcsPlugin} plugin
|
110
|
+
*/
|
111
|
+
function onVcsAppMounted(plugin) {
|
105
112
|
if (plugin.onVcsAppMounted) {
|
106
|
-
|
113
|
+
try {
|
114
|
+
plugin.onVcsAppMounted(app);
|
115
|
+
} catch (e) {
|
116
|
+
getLogger('VcsUiApp').error(`Error in plugin ${plugin.name} onVcsAppMounted hook`, e);
|
117
|
+
}
|
107
118
|
}
|
108
|
-
}
|
119
|
+
}
|
109
120
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
}
|
114
|
-
});
|
121
|
+
[...app.plugins].forEach(onVcsAppMounted);
|
122
|
+
|
123
|
+
return app.plugins.added.addEventListener(onVcsAppMounted);
|
115
124
|
}
|
116
125
|
|
117
126
|
/**
|
@@ -405,6 +414,7 @@
|
|
405
414
|
ToolboxManagerComponent,
|
406
415
|
VContainer,
|
407
416
|
VFooter,
|
417
|
+
NotifierComponent,
|
408
418
|
},
|
409
419
|
props: {
|
410
420
|
appId: {
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<template>
|
2
2
|
<section class="vcs-form-section">
|
3
|
-
<slot name="
|
3
|
+
<slot name="header">
|
4
4
|
<article class="pa-2 accent">
|
5
5
|
<div class="form-section-header d-flex justify-space-between align-center">
|
6
|
-
<strong class="caption">{{ $t(
|
6
|
+
<strong class="caption">{{ $t(heading) }}</strong>
|
7
7
|
<VcsActionButtonList
|
8
8
|
:actions="actions"
|
9
9
|
small
|
@@ -37,13 +37,13 @@
|
|
37
37
|
/**
|
38
38
|
* @description
|
39
39
|
* Stylized form section with action buttons
|
40
|
-
* @vue-data {slot} [#
|
40
|
+
* @vue-data {slot} [#header] - slot to override form section header
|
41
41
|
* @vue-data {slot} [#default] - slot with the section content
|
42
42
|
* @vue-data {slot} [#help] - Slot to specify html based help. Gets precedence over helpText prop.
|
43
|
-
* @vue-prop {string}
|
44
|
-
* @vue-prop {Array<VcsAction>}
|
43
|
+
* @vue-prop {string} heading - Title of the section to be displayed, will be translated.
|
44
|
+
* @vue-prop {Array<VcsAction>} headerActions - Icons to be displayed on the right side
|
45
45
|
* @vue-prop {string} [helpText] - Optional help text. Must be plain string. Use 'help' slot for html based help texts. Help slot has precedence over helpText prop.
|
46
|
-
* @vue-computed {Array<VcsAction>} actions - Returns
|
46
|
+
* @vue-computed {Array<VcsAction>} actions - Returns header actions extended by a help action, if help prop is passed or help slot is used.
|
47
47
|
*/
|
48
48
|
export default {
|
49
49
|
name: 'VcsFormSection',
|
@@ -52,11 +52,11 @@
|
|
52
52
|
VAlert,
|
53
53
|
},
|
54
54
|
props: {
|
55
|
-
|
55
|
+
heading: {
|
56
56
|
type: String,
|
57
57
|
default: undefined,
|
58
58
|
},
|
59
|
-
|
59
|
+
headerActions: {
|
60
60
|
type: Array,
|
61
61
|
default: () => ([]),
|
62
62
|
},
|
@@ -78,9 +78,9 @@
|
|
78
78
|
*/
|
79
79
|
const actions = computed(() => {
|
80
80
|
if (props.helpText || (slots.help && slots.help().length > 0)) {
|
81
|
-
return [helpAction, ...props.
|
81
|
+
return [helpAction, ...props.headerActions];
|
82
82
|
}
|
83
|
-
return props.
|
83
|
+
return props.headerActions;
|
84
84
|
});
|
85
85
|
|
86
86
|
return {
|