@kalisio/kdk 2.1.8 → 2.2.0

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.
Files changed (248) hide show
  1. package/.travis.test.sh +42 -10
  2. package/README.md +2 -2
  3. package/core/api/application.js +6 -1
  4. package/core/api/authentication.js +17 -1
  5. package/core/api/db.js +7 -2
  6. package/core/api/hooks/hooks.authentication.js +4 -2
  7. package/core/api/hooks/hooks.authorisations.js +12 -2
  8. package/core/api/hooks/hooks.model.js +5 -5
  9. package/core/api/hooks/hooks.organisations.js +0 -4
  10. package/core/api/services/account/account.hooks.js +10 -6
  11. package/core/api/services/account/account.service.js +1 -1
  12. package/{map/api/services/geocoder/geocoder.hooks.js → core/api/services/import-export/import-export.hooks.js} +7 -5
  13. package/core/api/services/import-export/import-export.service.js +11 -0
  14. package/core/api/services/index.js +13 -1
  15. package/core/api/services/users/users.hooks.js +2 -3
  16. package/core/client/api.js +16 -14
  17. package/core/client/capabilities.js +6 -2
  18. package/core/client/components/KContent.vue +11 -1
  19. package/core/client/components/KDialog.vue +17 -15
  20. package/core/client/components/KSponsor.vue +1 -1
  21. package/core/client/components/KTextArea.vue +5 -1
  22. package/core/client/components/app/KAbout.vue +1 -2
  23. package/core/client/components/app/KWelcome.vue +3 -5
  24. package/core/client/components/chart/KTimeSeriesChart.vue +24 -37
  25. package/core/client/components/collection/KColumn.vue +20 -17
  26. package/core/client/components/editor/KModalEditor.vue +0 -2
  27. package/core/client/components/form/KChipsField.vue +12 -2
  28. package/core/client/components/form/KColorField.vue +12 -2
  29. package/core/client/components/form/KColorScaleField.vue +12 -2
  30. package/core/client/components/form/KDateTimeRangeField.vue +12 -2
  31. package/core/client/components/form/KDatetimeField.vue +12 -2
  32. package/core/client/components/form/KEmailField.vue +12 -2
  33. package/core/client/components/form/KFileField.vue +12 -2
  34. package/core/client/components/form/KForm.vue +43 -9
  35. package/core/client/components/form/KIconField.vue +12 -2
  36. package/core/client/components/form/KItemField.vue +25 -4
  37. package/core/client/components/form/KNumberField.vue +12 -2
  38. package/core/client/components/form/KOptionsField.vue +12 -2
  39. package/core/client/components/form/KPasswordField.vue +12 -2
  40. package/core/client/components/form/KPhoneField.vue +13 -3
  41. package/core/client/components/form/KPropertyItemField.vue +12 -2
  42. package/core/client/components/form/KResolutionField.vue +126 -0
  43. package/core/client/components/form/KRoleField.vue +12 -2
  44. package/core/client/components/form/KSelectField.vue +14 -4
  45. package/core/client/components/form/KTextField.vue +12 -2
  46. package/core/client/components/form/KTextareaField.vue +13 -3
  47. package/core/client/components/form/KToggleField.vue +12 -2
  48. package/core/client/components/form/KTokenField.vue +12 -2
  49. package/core/client/components/form/KUnitField.vue +12 -2
  50. package/core/client/components/form/KUrlField.vue +12 -2
  51. package/core/client/components/input/KIconChooser.vue +10 -12
  52. package/core/client/components/input/KPalette.vue +2 -1
  53. package/core/client/components/layout/KPage.vue +5 -4
  54. package/core/client/components/layout/KWindow.vue +10 -10
  55. package/core/client/components/media/KColorScale.vue +26 -20
  56. package/core/client/components/media/KImageViewer.vue +57 -33
  57. package/core/client/components/media/KShape.vue +14 -103
  58. package/core/client/components/screen/KRegisterScreen.vue +0 -1
  59. package/core/client/components/screen/KScreenFooter.vue +0 -18
  60. package/core/client/components/team/KAddMember.vue +14 -11
  61. package/core/client/components/team/KGroupsActivity.vue +14 -0
  62. package/core/client/components/team/KMembersActivity.vue +12 -0
  63. package/core/client/components/team/KTagsActivity.vue +14 -0
  64. package/core/client/components/time/KDateTime.vue +23 -7
  65. package/core/client/components/time/KTimeControl.vue +142 -0
  66. package/core/client/components/tool/KExportTool.vue +57 -0
  67. package/core/client/composables/collection.js +0 -1
  68. package/core/client/composables/pwa.js +0 -1
  69. package/core/client/composables/schema.js +1 -1
  70. package/core/client/composables/session.js +30 -6
  71. package/core/client/exporter.js +141 -0
  72. package/core/client/i18n/core_en.json +93 -24
  73. package/core/client/i18n/core_fr.json +94 -24
  74. package/core/client/index.js +3 -0
  75. package/core/client/layout.js +34 -14
  76. package/core/client/local-storage.js +8 -6
  77. package/core/client/mixins/index.js +0 -1
  78. package/core/client/mixins/mixin.base-field.js +24 -2
  79. package/core/client/mixins/mixin.object-proxy.js +0 -1
  80. package/core/client/readers/reader.csv.js +1 -1
  81. package/core/client/search.js +2 -1
  82. package/core/client/services/index.js +2 -1
  83. package/core/client/services/local-settings.service.js +4 -4
  84. package/core/client/theme.js +3 -3
  85. package/core/client/time.js +4 -0
  86. package/core/client/units.js +149 -4
  87. package/core/client/utils/index.js +13 -6
  88. package/core/client/utils/utils.account.js +1 -1
  89. package/core/client/utils/utils.colors.js +43 -0
  90. package/core/client/utils/utils.platform.js +0 -1
  91. package/core/client/utils/utils.pwa.js +14 -14
  92. package/core/client/utils/utils.session.js +1 -1
  93. package/core/client/utils/utils.shapes.js +270 -0
  94. package/core/client/utils/utils.time.js +37 -0
  95. package/core/common/permissions.js +3 -0
  96. package/core/common/schemas/settings.update.json +50 -29
  97. package/extras/css/core.variables.scss +3 -1
  98. package/extras/tours/map/navigation-bar.js +17 -15
  99. package/extras/tours/map/timeline.js +33 -33
  100. package/map/api/config/categories.cjs +4 -1
  101. package/map/api/hooks/hooks.catalog.js +39 -0
  102. package/map/api/hooks/hooks.features.js +23 -3
  103. package/map/api/hooks/hooks.query.js +31 -10
  104. package/map/api/models/projects.model.mongodb.js +8 -0
  105. package/map/api/services/catalog/catalog.hooks.js +5 -3
  106. package/map/api/services/features/features.hooks.js +18 -6
  107. package/map/api/services/index.js +22 -6
  108. package/map/api/services/projects/projects.hooks.js +118 -0
  109. package/map/client/capture.js +16 -0
  110. package/map/client/cesium/utils/index.js +3 -0
  111. package/map/client/cesium/utils/utils.events.js +30 -0
  112. package/map/client/cesium/utils/utils.popup.js +17 -0
  113. package/map/client/cesium/{utils.js → utils/utils.style.js} +53 -49
  114. package/map/client/components/KCapture.vue +50 -0
  115. package/map/client/components/KCaptureTextArea.vue +53 -0
  116. package/map/client/components/KCompass.vue +2 -2
  117. package/map/client/components/KFeaturesChart.vue +1 -1
  118. package/map/client/components/KFeaturesFilter.vue +2 -2
  119. package/map/client/components/KLayerStyleForm.vue +256 -430
  120. package/map/client/components/KLevelSlider.vue +1 -1
  121. package/map/client/components/KNorth.vue +31 -0
  122. package/map/client/components/KProjectMenu.vue +88 -0
  123. package/map/client/components/KTimezoneMap.vue +36 -23
  124. package/map/client/components/catalog/KAddLayer.vue +3 -4
  125. package/map/client/components/catalog/KConnectLayer.vue +16 -4
  126. package/map/client/components/catalog/KCreateLayer.vue +1 -2
  127. package/map/client/components/catalog/KCreateProject.vue +100 -0
  128. package/map/client/components/catalog/KCreateView.vue +25 -2
  129. package/map/client/components/catalog/KLayersPanel.vue +24 -27
  130. package/map/client/components/catalog/KLayersSelector.vue +1 -1
  131. package/map/client/components/catalog/KProjectEditor.vue +91 -0
  132. package/map/client/components/catalog/KProjectManager.vue +60 -0
  133. package/map/client/components/catalog/KProjectSelector.vue +38 -0
  134. package/map/client/components/catalog/KProjectsPanel.vue +153 -0
  135. package/map/client/components/catalog/KSelectLayers.vue +96 -0
  136. package/map/client/components/catalog/KSelectViews.vue +96 -0
  137. package/map/client/components/catalog/KViewsPanel.vue +66 -30
  138. package/map/client/components/form/KDirectionField.vue +24 -5
  139. package/map/client/components/form/KLayerCategoryField.vue +12 -2
  140. package/map/client/components/form/KLocationField.vue +20 -5
  141. package/map/client/components/form/KOwsLayerField.vue +12 -2
  142. package/map/client/components/form/KOwsServiceField.vue +12 -2
  143. package/map/client/components/form/KSelectLayersField.vue +159 -0
  144. package/map/client/components/form/KSelectViewsField.vue +121 -0
  145. package/map/client/components/form/KTimezoneField.vue +24 -17
  146. package/map/client/components/legend/KColorScaleLegend.vue +1 -1
  147. package/map/client/components/legend/KLayerLegend.vue +61 -0
  148. package/map/client/components/legend/KLegend.vue +45 -44
  149. package/map/client/components/legend/KLegendRenderer.vue +5 -3
  150. package/map/client/components/legend/KSymbolsLegend.vue +12 -10
  151. package/map/client/components/legend/KVariablesLegend.vue +78 -0
  152. package/map/client/components/location/KGeocodersFilter.vue +2 -4
  153. package/map/client/components/location/KLocationMap.vue +48 -17
  154. package/map/client/components/location/KLocationSearch.vue +13 -3
  155. package/map/client/components/tools/KSearchTool.vue +17 -12
  156. package/map/client/components/widget/KElevationProfile.vue +16 -19
  157. package/map/client/components/widget/KMapillaryViewer.vue +21 -22
  158. package/map/client/components/widget/KTimeSeries.vue +35 -23
  159. package/map/client/composables/activity.js +15 -2
  160. package/map/client/composables/catalog.js +66 -0
  161. package/map/client/composables/highlight.js +56 -20
  162. package/map/client/composables/index.js +2 -0
  163. package/map/client/composables/location.js +25 -18
  164. package/map/client/composables/project.js +122 -0
  165. package/map/client/geolocation.js +1 -1
  166. package/map/client/globe.js +2 -0
  167. package/map/client/i18n/map_en.json +123 -76
  168. package/map/client/i18n/map_fr.json +124 -72
  169. package/map/client/index.js +3 -0
  170. package/map/client/init.js +17 -0
  171. package/map/client/leaflet/GSMaPLayer.js +16 -17
  172. package/map/client/leaflet/ShapeMarker.js +40 -0
  173. package/map/client/leaflet/TiledFeatureLayer.js +1 -1
  174. package/map/client/leaflet/TiledMeshLayer.js +11 -15
  175. package/map/client/leaflet/TiledWindLayer.js +6 -10
  176. package/map/client/leaflet/utils/index.js +4 -0
  177. package/map/client/leaflet/utils/utils.events.js +41 -0
  178. package/map/client/leaflet/utils/utils.popup.js +21 -0
  179. package/map/client/leaflet/utils/utils.style.js +191 -0
  180. package/map/client/leaflet/utils/utils.tiles.js +87 -0
  181. package/map/client/map.js +2 -0
  182. package/map/client/mixins/globe/mixin.base-globe.js +29 -21
  183. package/map/client/mixins/globe/mixin.geojson-layers.js +132 -69
  184. package/map/client/mixins/globe/mixin.popup.js +2 -1
  185. package/map/client/mixins/globe/mixin.style.js +6 -4
  186. package/map/client/mixins/globe/mixin.tooltip.js +8 -3
  187. package/map/client/mixins/map/mixin.base-map.js +13 -11
  188. package/map/client/mixins/map/mixin.edit-layers.js +15 -15
  189. package/map/client/mixins/map/mixin.forecast-layers.js +3 -1
  190. package/map/client/mixins/map/mixin.geojson-layers.js +56 -20
  191. package/map/client/mixins/map/mixin.georaster-layers.js +4 -11
  192. package/map/client/mixins/map/mixin.heatmap-layers.js +1 -1
  193. package/map/client/mixins/map/mixin.popup.js +2 -1
  194. package/map/client/mixins/map/mixin.style.js +4 -67
  195. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +2 -1
  196. package/map/client/mixins/map/mixin.tiled-wind-layers.js +4 -2
  197. package/map/client/mixins/map/mixin.tooltip.js +2 -1
  198. package/map/client/mixins/mixin.activity.js +66 -191
  199. package/map/client/mixins/mixin.catalog-panel.js +6 -6
  200. package/map/client/mixins/mixin.context.js +13 -10
  201. package/map/client/mixins/mixin.feature-service.js +29 -300
  202. package/map/client/mixins/mixin.weacast.js +11 -17
  203. package/map/client/pixi-utils.js +1 -1
  204. package/map/client/planets.js +58 -0
  205. package/map/client/utils/index.js +6 -0
  206. package/map/client/utils/utils.capture.js +176 -0
  207. package/map/client/utils/utils.catalog.js +149 -0
  208. package/map/client/utils/utils.features.js +364 -0
  209. package/map/client/utils/utils.js +0 -151
  210. package/map/client/utils/utils.layers.js +174 -0
  211. package/map/client/utils/utils.location.js +91 -23
  212. package/map/client/utils/utils.project.js +8 -0
  213. package/map/client/utils/utils.schema.js +0 -1
  214. package/map/client/utils/utils.style.js +297 -0
  215. package/map/client/utils.all.js +2 -2
  216. package/map/client/utils.globe.js +1 -1
  217. package/map/client/utils.map.js +1 -1
  218. package/map/common/permissions.js +2 -0
  219. package/map/common/schemas/capture.create.json +132 -0
  220. package/map/common/schemas/projects.create.json +52 -0
  221. package/map/common/schemas/projects.update.json +52 -0
  222. package/package.json +6 -5
  223. package/test/api/core/account.test.js +20 -0
  224. package/test/api/core/config/default.cjs +16 -3
  225. package/test/api/core/import-export.test.js +86 -0
  226. package/test/api/core/test-log-2023-12-19.log +7 -0
  227. package/test/api/core/test-log-2024-01-04.log +14 -0
  228. package/test/api/map/catalog.test.js +164 -0
  229. package/test/api/map/index.test.js +25 -61
  230. package/test/api/map/test-log-2023-11-24.log +121 -0
  231. package/test/api/map/test-log-2023-12-12.log +29 -0
  232. package/test/api/map/test-log-2023-12-13.log +5 -0
  233. package/test/api/map/test-log-2024-01-04.log +2 -0
  234. package/test/api/map/test-log-2024-01-11.log +1 -0
  235. package/test/api/map/test-log-2024-01-25.log +19 -0
  236. package/test/client/core/layout.js +25 -5
  237. package/test/client/core/utils.js +7 -0
  238. package/test/client/map/catalog.js +78 -1
  239. package/test/client/map/time.js +2 -1
  240. package/core/client/components/screen/KEndpointScreen.vue +0 -80
  241. package/core/client/mixins/mixin.account.js +0 -61
  242. package/extras/icons/kdk.png +0 -0
  243. package/map/api/services/geocoder/geocoder.service.js +0 -79
  244. package/map/client/components/KCaptureToolbar.vue +0 -155
  245. package/map/client/components/KColorLegend.vue +0 -349
  246. package/map/client/components/KTimeline.vue +0 -293
  247. package/map/client/components/KUrlLegend.vue +0 -122
  248. package/map/client/leaflet/utils.js +0 -246
@@ -30,8 +30,18 @@
30
30
  </q-option-group>
31
31
  </template>
32
32
  <!-- Helper -->
33
- <template v-if="helper" v-slot:hint>
34
- <span v-html="helper"></span>
33
+ <template v-if="hasHelper" v-slot:append>
34
+ <k-action
35
+ :id="properties.name + '-helper'"
36
+ :label="helperLabel"
37
+ :icon="helperIcon"
38
+ :tooltip="helperTooltip"
39
+ :url="helperUrl"
40
+ :dialog="helperDialog"
41
+ :context="helperContext"
42
+ @dialog-confirmed="onHelperDialogConfirmed"
43
+ color="primary"
44
+ />
35
45
  </template>
36
46
  </q-field>
37
47
  </template>
@@ -26,8 +26,18 @@
26
26
  />
27
27
  </template>
28
28
  <!-- Helper -->
29
- <template v-if="helper" v-slot:hint>
30
- <span v-html="helper"></span>
29
+ <template v-if="hasHelper" v-slot:append>
30
+ <k-action
31
+ :id="properties.name + '-helper'"
32
+ :label="helperLabel"
33
+ :icon="helperIcon"
34
+ :tooltip="helperTooltip"
35
+ :url="helperUrl"
36
+ :dialog="helperDialog"
37
+ :context="helperContext"
38
+ @dialog-confirmed="onHelperDialogConfirmed"
39
+ color="primary"
40
+ />
31
41
  </template>
32
42
  </q-input>
33
43
  </template>
@@ -16,9 +16,19 @@
16
16
  @blur="onChanged"
17
17
  @update:model-value="onChanged"
18
18
  >
19
- <!-- Helper -->
20
- <template v-if="helper" v-slot:hint>
21
- <span v-html="helper"></span>
19
+ <!-- Helper -->
20
+ <template v-if="hasHelper" v-slot:append>
21
+ <k-action
22
+ :id="properties.name + '-helper'"
23
+ :label="helperLabel"
24
+ :icon="helperIcon"
25
+ :tooltip="helperTooltip"
26
+ :url="helperUrl"
27
+ :dialog="helperDialog"
28
+ :context="helperContext"
29
+ @dialog-confirmed="onHelperDialogConfirmed"
30
+ color="primary"
31
+ />
22
32
  </template>
23
33
  </q-input>
24
34
  </template>
@@ -49,8 +49,18 @@
49
49
  </q-item>
50
50
  </template>
51
51
  <!-- Helper -->
52
- <template v-if="helper" v-slot:hint>
53
- <span v-html="helper"></span>
52
+ <template v-if="hasHelper" v-slot:append>
53
+ <k-action
54
+ :id="properties.name + '-helper'"
55
+ :label="helperLabel"
56
+ :icon="helperIcon"
57
+ :tooltip="helperTooltip"
58
+ :url="helperUrl"
59
+ :dialog="helperDialog"
60
+ :context="helperContext"
61
+ @dialog-confirmed="onHelperDialogConfirmed"
62
+ color="primary"
63
+ />
54
64
  </template>
55
65
  </q-select>
56
66
  </template>
@@ -0,0 +1,126 @@
1
+ <template>
2
+ <div :class="labelClass">
3
+ <q-select
4
+ v-model="resolution"
5
+ :options="getResolutions()"
6
+ style="min-width: 30%"
7
+ dense
8
+ :label="label"
9
+ :borderless="borderless"
10
+ :disable="disabled"
11
+ >
12
+ <template v-slot:option="scope">
13
+ <q-item v-bind="scope.itemProps">
14
+ <q-item-section>
15
+ <q-item-label v-html="scope.opt.label" />
16
+ </q-item-section>
17
+ <q-item-section side>
18
+ <q-item-label caption>{{ scope.opt.description }}</q-item-label>
19
+ </q-item-section>
20
+ </q-item>
21
+ </template>
22
+ </q-select>
23
+ <q-input
24
+ v-model.number="width"
25
+ type="number"
26
+ min="256" max="4000"
27
+ mask="(#)###"
28
+ dense
29
+ :borderless="borderless"
30
+ input-class="text-center"
31
+ style="max-width: 54px"
32
+ :readonly="readonly"
33
+ :disable="disabled"
34
+ @update:model-value='updateModel()'
35
+ />
36
+ <span>x</span>
37
+ <q-input
38
+ v-model.number="height"
39
+ type="number"
40
+ min="256" max="4000"
41
+ mask="(#)###"
42
+ dense
43
+ :borderless="borderless"
44
+ input-class="text-center"
45
+ style="max-width: 54px"
46
+ :readonly="readonly"
47
+ :disable="disabled"
48
+ @update:model-value='updateModel()'
49
+ />
50
+ </div>
51
+ </template>
52
+
53
+ <script>
54
+ import _ from 'lodash'
55
+ import { baseField } from '../../mixins'
56
+ import { i18n } from '../../i18n.js'
57
+
58
+ export default {
59
+ mixins: [baseField],
60
+ data () {
61
+ return {
62
+ width: 1280,
63
+ height: 720,
64
+ resolution: undefined
65
+ }
66
+ },
67
+ watch: {
68
+ resolution: {
69
+ immediate: true,
70
+ handler (value) {
71
+ if (!value) this.resolution = this.getResolutions()[1]
72
+ else {
73
+ const size = _.split(this.resolution.value, 'x')
74
+ this.width = size[0]
75
+ this.height = size[1]
76
+ }
77
+ this.updateModel()
78
+ }
79
+ },
80
+ width: {
81
+ handler (value) {
82
+ if (value < 256) this.width = 256
83
+ if (value > 4000) this.width = 4000
84
+ this.updateModel()
85
+ }
86
+ },
87
+ height: {
88
+ handler (value) {
89
+ if (value < 256) this.height = 256
90
+ if (value > 4000) this.height = 4000
91
+ this.updateModel()
92
+ }
93
+ }
94
+ },
95
+ computed: {
96
+ labelClass () {
97
+ const classObject = {}
98
+ classObject['row items-center no-wrap q-gutter-x-xs q-pb-md items-start'] = true
99
+ if (this.properties.center) classObject['justify-center'] = true
100
+ return classObject
101
+ },
102
+ borderless () {
103
+ return this.properties.borderless ? this.properties.borderless : false
104
+ },
105
+ readonly () {
106
+ return this.resolution.readonly
107
+ }
108
+ },
109
+ methods: {
110
+ getResolutions () {
111
+ return [
112
+ { label: i18n.t('KResolutionField.SD_LABEL'), description: i18n.t('KResolutionField.SD_DESCRIPTION'), value: '640x480', readonly: true },
113
+ { label: i18n.t('KResolutionField.HD_LABEL'), description: i18n.t('KResolutionField.HD_DESCRIPTION'), value: '1280x720', readonly: true },
114
+ { label: i18n.t('KResolutionField.FHD_LABEL'), description: i18n.t('KResolutionField.FHD_DESCRIPTION'), value: '1920x1080', readonly: true },
115
+ { label: i18n.t('KResolutionField.QHD_LABEL'), description: i18n.t('KResolutionField.QHD_DESCRIPTION'), value: '2560x1440', readonly: true },
116
+ { label: i18n.t('KResolutionField.2K_LABEL'), description: i18n.t('KResolutionField.2K_DESCRIPTION'), value: '2048x1080', readonly: true },
117
+ { label: i18n.t('KResolutionField.4K_LABEL'), description: i18n.t('KResolutionField.4K_DESCRIPTION'), value: '3840x2160', readonly: true },
118
+ { label: i18n.t('KResolutionField.PERSONALISED_LABEL'), value: '1280x721', readonly: false }
119
+ ]
120
+ },
121
+ updateModel () {
122
+ this.model = { width: this.width, height: this.height }
123
+ }
124
+ }
125
+ }
126
+ </script>
@@ -24,8 +24,18 @@
24
24
  />
25
25
  </template>
26
26
  <!-- Helper -->
27
- <template v-if="helper" v-slot:hint>
28
- <span v-html="helper"></span>
27
+ <template v-if="hasHelper" v-slot:append>
28
+ <k-action
29
+ :id="properties.name + '-helper'"
30
+ :label="helperLabel"
31
+ :icon="helperIcon"
32
+ :tooltip="helperTooltip"
33
+ :url="helperUrl"
34
+ :dialog="helperDialog"
35
+ :context="helperContext"
36
+ @dialog-confirmed="onHelperDialogConfirmed"
37
+ color="primary"
38
+ />
29
39
  </template>
30
40
  </q-field>
31
41
  </template>
@@ -27,7 +27,7 @@
27
27
  @blur="onChanged"
28
28
  @update:model-value="onChanged"
29
29
  >
30
- <!-- pptions display -->
30
+ <!-- options display -->
31
31
  <template v-slot:option="scope">
32
32
  <q-item
33
33
  v-bind="scope.itemProps"
@@ -44,9 +44,19 @@
44
44
  {{ scope.opt.label }}
45
45
  </span>
46
46
  </template>
47
- <!-- helper -->
48
- <template v-if="helper" v-slot:hint>
49
- <span v-html="helper"></span>
47
+ <!-- Helper -->
48
+ <template v-if="hasHelper" v-slot:append>
49
+ <k-action
50
+ :id="properties.name + '-helper'"
51
+ :label="helperLabel"
52
+ :icon="helperIcon"
53
+ :tooltip="helperTooltip"
54
+ :url="helperUrl"
55
+ :dialog="helperDialog"
56
+ :context="helperContext"
57
+ @dialog-confirmed="onHelperDialogConfirmed"
58
+ color="primary"
59
+ />
50
60
  </template>
51
61
  </q-select>
52
62
  </template>
@@ -18,8 +18,18 @@
18
18
  @update:model-value='onChanged'
19
19
  >
20
20
  <!-- Helper -->
21
- <template v-if="helper" v-slot:hint>
22
- <span v-html="helper"></span>
21
+ <template v-if="hasHelper" v-slot:append>
22
+ <k-action
23
+ :id="properties.name + '-helper'"
24
+ :label="helperLabel"
25
+ :icon="helperIcon"
26
+ :tooltip="helperTooltip"
27
+ :url="helperUrl"
28
+ :dialog="helperDialog"
29
+ :context="helperContext"
30
+ @dialog-confirmed="onHelperDialogConfirmed"
31
+ color="primary"
32
+ />
23
33
  </template>
24
34
  </q-input>
25
35
  </template>
@@ -22,8 +22,18 @@
22
22
  </div>
23
23
  </template>
24
24
  <!-- Helper -->
25
- <template v-if="helper" v-slot:hint>
26
- <span v-html="helper"></span>
25
+ <template v-if="hasHelper" v-slot:append>
26
+ <k-action
27
+ :id="properties.name + '-helper'"
28
+ :label="helperLabel"
29
+ :icon="helperIcon"
30
+ :tooltip="helperTooltip"
31
+ :url="helperUrl"
32
+ :dialog="helperDialog"
33
+ :context="helperContext"
34
+ @dialog-confirmed="onHelperDialogConfirmed"
35
+ color="primary"
36
+ />
27
37
  </template>
28
38
  </q-field>
29
39
  </template>
@@ -75,7 +85,7 @@ export default {
75
85
  computed: {
76
86
  editorToolbar () {
77
87
  let configuration
78
- _.forEach(this.toolbar || this.defaultToolbar, (value, key) => {
88
+ _.forEach(this.properties.toolbar || this.toolbar || this.defaultToolbar, (value, key) => {
79
89
  if (_.get(this.$q.screen, key)) {
80
90
  configuration = value
81
91
  return false
@@ -22,8 +22,18 @@
22
22
  />
23
23
  </template>
24
24
  <!-- Helper -->
25
- <template v-if="helper" v-slot:hint>
26
- <span v-html="helper"></span>
25
+ <template v-if="hasHelper" v-slot:append>
26
+ <k-action
27
+ :id="properties.name + '-helper'"
28
+ :label="helperLabel"
29
+ :icon="helperIcon"
30
+ :tooltip="helperTooltip"
31
+ :url="helperUrl"
32
+ :dialog="helperDialog"
33
+ :context="helperContext"
34
+ @dialog-confirmed="onHelperDialogConfirmed"
35
+ color="primary"
36
+ />
27
37
  </template>
28
38
  </q-field>
29
39
  </template>
@@ -21,8 +21,18 @@
21
21
  @keyup="onKeyUp($event, i - 1)"
22
22
  >
23
23
  <!-- Helper -->
24
- <template v-if="helper" v-slot:hint>
25
- <span v-html="helper"></span>
24
+ <template v-if="hasHelper" v-slot:append>
25
+ <k-action
26
+ :id="properties.name + '-helper'"
27
+ :label="helperLabel"
28
+ :icon="helperIcon"
29
+ :tooltip="helperTooltip"
30
+ :url="helperUrl"
31
+ :dialog="helperDialog"
32
+ :context="helperContext"
33
+ @dialog-confirmed="onHelperDialogConfirmed"
34
+ color="primary"
35
+ />
26
36
  </template>
27
37
  </q-input>
28
38
  </div>
@@ -30,8 +30,18 @@
30
30
  </q-item>
31
31
  </template>
32
32
  <!-- Helper -->
33
- <template v-if="helper" v-slot:hint>
34
- <span v-html="helper"></span>
33
+ <template v-if="hasHelper" v-slot:append>
34
+ <k-action
35
+ :id="properties.name + '-helper'"
36
+ :label="helperLabel"
37
+ :icon="helperIcon"
38
+ :tooltip="helperTooltip"
39
+ :url="helperUrl"
40
+ :dialog="helperDialog"
41
+ :context="helperContext"
42
+ @dialog-confirmed="onHelperDialogConfirmed"
43
+ color="primary"
44
+ />
35
45
  </template>
36
46
  </q-select>
37
47
  </template>
@@ -17,8 +17,18 @@
17
17
  bottom-slots
18
18
  >
19
19
  <!-- Helper -->
20
- <template v-if="helper" v-slot:hint>
21
- <span v-html="helper"></span>
20
+ <template v-if="hasHelper" v-slot:append>
21
+ <k-action
22
+ :id="properties.name + '-helper'"
23
+ :label="helperLabel"
24
+ :icon="helperIcon"
25
+ :tooltip="helperTooltip"
26
+ :url="helperUrl"
27
+ :dialog="helperDialog"
28
+ :context="helperContext"
29
+ @dialog-confirmed="onHelperDialogConfirmed"
30
+ color="primary"
31
+ />
22
32
  </template>
23
33
  </q-input>
24
34
  </template>
@@ -18,18 +18,9 @@
18
18
  dense />
19
19
  </div>
20
20
  <div id="icons" class="row justify-start items-center q-gutter-sm">
21
- <template v-for="icon in iconsPage">
22
- <q-icon :id="getIconId(icon.name)" v-if="icon.name === selectedIcon.name" :key="icon.name"
23
- style="border-bottom: 0.25rem solid" :color="selectedIcon.color" :name="icon.name" size="2rem" @click="onIconSelected(icon)">
24
- <q-tooltip>
25
- {{icon.title}}
26
- </q-tooltip>
27
- </q-icon>
28
- <q-icon :id="getIconId(icon.name)" v-if="icon.name !== selectedIcon.name" :key="icon.name"
29
- color="grey-7" :name="icon.name" size="2rem" @click="onIconSelected(icon)">
30
- <q-tooltip>
31
- {{icon.title}}
32
- </q-tooltip>
21
+ <template v-for="icon in iconsPage" :key="icon.name">
22
+ <q-icon :id="getIconId(icon.name)" :color="getIconColor(icon.name)" :name="icon.name" size="2rem" @click="onIconSelected(icon)">
23
+ <q-tooltip>{{icon.title}}</q-tooltip>
33
24
  </q-icon>
34
25
  </template>
35
26
  </div>
@@ -106,6 +97,13 @@ export default {
106
97
  getIconId (name) {
107
98
  return _.kebabCase(name)
108
99
  },
100
+ getIconColor (name) {
101
+ let color = 'grey-7'
102
+ if (name === this.selectedIcon.name) {
103
+ color = this.selectedIcon.color === 'white' ? 'black' : this.selectedIcon.color
104
+ }
105
+ return color
106
+ },
109
107
  getIconsForCategory (category) {
110
108
  const categoryIcons = this.categoryInfos[this.selectedCategory.value].icons
111
109
  const icons = []
@@ -1,11 +1,12 @@
1
1
  <template>
2
- <div class="row justify-start q-gutter-sm full-width">
2
+ <div class="row justify-center q-gutter-xs full-width">
3
3
  <template v-for="(color, index) in colors" :key="index">
4
4
  <q-btn
5
5
  :id="'style-color-' + color"
6
6
  :round="shape === 'round'"
7
7
  :icon="modelValue === color ? 'las la-check' : ''"
8
8
  :color="color"
9
+ :text-color="color === 'white' ? 'black' : 'white'"
9
10
  small
10
11
  @click="$emit('update:modelValue', color)" />
11
12
  </template>
@@ -18,7 +18,7 @@
18
18
  Managed stickies
19
19
  Be careful of the order
20
20
  -->
21
- <!-- bottom -->
21
+ <!-- bottom pane -->
22
22
  <q-page-sticky position="bottom" class="k-sticky">
23
23
  <div id="bottom-pane" v-show="hasBottomPaneComponents" class="column items-center">
24
24
  <KOpener id="bottom-opener" v-if="bottomPane.opener" v-model="isBottomPaneOpened" position="bottom" />
@@ -34,7 +34,7 @@
34
34
  </div>
35
35
  </div>
36
36
  </q-page-sticky>
37
- <!-- right -->
37
+ <!-- right pane -->
38
38
  <q-page-sticky position="right" class="k-sticky">
39
39
  <div id="right-pane" v-show="hasRightPaneComponents" class="row items-center">
40
40
  <KOpener id="right-opener" v-if="rightPane.opener" v-model="isRightPaneOpened" position="right" />
@@ -51,7 +51,7 @@
51
51
  </div>
52
52
  </div>
53
53
  </q-page-sticky>
54
- <!-- top -->
54
+ <!-- top pane -->
55
55
  <q-page-sticky position="top" class="k-sticky">
56
56
  <div id="top-pane" v-show="hasTopPaneComponents" class="column items-center">
57
57
  <div>
@@ -113,7 +113,7 @@
113
113
  :style="`max-width: ${bottomWindowSize[0]}px; max-height: ${bottomWindowSize[1]};px`"
114
114
  />
115
115
  </q-page-sticky>
116
- <!-- left -->
116
+ <!-- left pane -->
117
117
  <q-page-sticky position="left" class="k-sticky">
118
118
  <div id="left-pane" v-show="hasLeftPaneComponents" class="row items-center">
119
119
  <div>
@@ -309,6 +309,7 @@ body {
309
309
  background-color: #FFFFFF;
310
310
  border: solid 1px lightgrey;
311
311
  border-radius: 3px;
312
+ position: relative;
312
313
  }
313
314
  .k-pane:hover, .k-left-pane:hover {
314
315
  border: solid 1px $primary;
@@ -37,13 +37,13 @@
37
37
  dense
38
38
  direction="horizontal"
39
39
  action-renderer="button"
40
- :content="controls"
40
+ :content="headerControls"
41
41
  class="q-pr-xs"
42
42
  />
43
43
  <KPanel
44
44
  v-else
45
45
  id="window-controls"
46
- :content="controls"
46
+ :content="headerControls"
47
47
  />
48
48
  </div>
49
49
  <!--
@@ -75,7 +75,7 @@
75
75
  <q-resize-observer @resize="onFooterResized" />
76
76
  <!-- window grip -->
77
77
  <q-icon
78
- v-if="currentWindow.state !== 'maximized'"
78
+ v-if="currentWindow.controls.resize && currentWindow.state !== 'maximized'"
79
79
  class="k-window-grip"
80
80
  name="las la-slash"
81
81
  size="10px"
@@ -161,7 +161,7 @@ const menu = computed(() => {
161
161
  id: `${props.placement}-window-menu`,
162
162
  component: 'menu/KMenu',
163
163
  icon: 'las la-cube',
164
- size: 'sm',
164
+ dense: true,
165
165
  tooltip: 'Widgets',
166
166
  actionRenderer: 'item',
167
167
  content: widgetMenuItems
@@ -169,14 +169,14 @@ const menu = computed(() => {
169
169
  }
170
170
  return menu
171
171
  })
172
- const controls = computed(() => {
172
+ const headerControls = computed(() => {
173
173
  return [{
174
174
  id: `pin-${props.placement}-window`,
175
175
  icon: pinIcons[props.placement],
176
176
  size: 'sm',
177
177
  tooltip: 'KWindow.PIN_ACTION',
178
178
  class: 'k-window-control',
179
- visible: currentWindow.state === 'floating',
179
+ visible: currentWindow.controls.pin && currentWindow.state === 'floating',
180
180
  handler: () => Layout.setWindowState(props.placement, 'pinned')
181
181
  }, {
182
182
  id: `unpin-${props.placement}-window`,
@@ -184,27 +184,28 @@ const controls = computed(() => {
184
184
  size: 'sm',
185
185
  tooltip: 'KWindow.RESTORE_ACTION',
186
186
  class: 'k-window-control',
187
- visible: currentWindow.state === 'pinned' && restoreGeometry,
187
+ visible: currentWindow.controls.unpin && currentWindow.state === 'pinned' && restoreGeometry,
188
188
  handler: () => Layout.setWindowState(props.placement, 'floating')
189
189
  }, {
190
190
  id: `unpin-${props.placement}-window`,
191
191
  icon: 'las la-expand',
192
192
  size: 'sm',
193
193
  tooltip: 'KWindow.MAXIMIZE_ACTION',
194
- visible: currentWindow.state !== 'maximized',
194
+ visible: currentWindow.controls.maximize && currentWindow.state !== 'maximized',
195
195
  handler: () => Layout.setWindowState(props.placement, 'maximized')
196
196
  }, {
197
197
  id: `restore-${props.placement}-window`,
198
198
  icon: 'las la-compress',
199
199
  size: 'sm',
200
200
  tooltip: 'KWindow.RESTORE_ACTION',
201
- visible: currentWindow.state === 'maximized',
201
+ visible: currentWindow.controls.restore && currentWindow.state === 'maximized',
202
202
  handler: () => Layout.setWindowState(props.placement, backupState)
203
203
  }, {
204
204
  id: `close-${props.placement}-window`,
205
205
  icon: 'las la-times',
206
206
  size: 'sm',
207
207
  tooltip: 'KWindow.CLOSE_ACTION',
208
+ visible: currentWindow.controls.close,
208
209
  handler: () => Layout.setWindowVisible(props.placement, false)
209
210
  }]
210
211
  })
@@ -288,7 +289,6 @@ function refresh (newState, oldState) {
288
289
  logger.warn(`[KDK] invalid window state ${currentWindow.state}`)
289
290
  }
290
291
  }
291
-
292
292
  function setPinnedGeometry () {
293
293
  const sizeRatio = currentWindow.sizePolicy.pinned[$q.screen.name]
294
294
  const w = $q.screen.width * sizeRatio[0] / 100