@hostlink/nuxt-light 1.8.0 → 1.8.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.
package/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "light",
3
3
  "configKey": "light",
4
- "version": "1.8.0"
4
+ "version": "1.8.1"
5
5
  }
@@ -3,6 +3,17 @@ import { Dialog, Notify } from "quasar"
3
3
  import { computed, ref, reactive } from "vue";
4
4
  import { q, m } from "#imports";
5
5
 
6
+ import * as Diff2Html from 'diff2html';
7
+ import 'diff2html/bundles/css/diff2html.min.css';
8
+
9
+ /* const diffs = '--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n';
10
+ const html = Diff2Html.html(diffs, {
11
+ drawFileList: true,
12
+ matching: 'lines',
13
+ outputFormat: 'side-by-side',
14
+ });
15
+ */
16
+
6
17
  const props = defineProps({
7
18
  modelId: {
8
19
  type: String,
@@ -25,7 +36,8 @@ const { revisionsByModel } = await q({
25
36
  revisionBy: true,
26
37
  createdTime: true,
27
38
  content: true,
28
- delta: true
39
+ delta: true,
40
+ diff: true
29
41
  }
30
42
  })
31
43
 
@@ -102,28 +114,50 @@ const getFilteredContent = computed(() => {
102
114
  } else {
103
115
  return selectedRevision.value.content;
104
116
  }
105
-
106
117
  })
118
+
119
+ const outputFormat = ref('side-by-side');
120
+ const getDiffHtml = (diffs) => {
121
+ if (!diffs) {
122
+ return '';
123
+ }
124
+ return Diff2Html.html(diffs, {
125
+ drawFileList: false,
126
+ matching: 'lines',
127
+ outputFormat: outputFormat.value,
128
+ highlight: true
129
+ });
130
+ }
131
+
132
+
107
133
  </script>
134
+
108
135
  <template>
109
136
  <div>
110
137
 
111
-
138
+ <div v-html="html"></div>
112
139
  <q-dialog v-model="showDialog" full-height full-width>
113
140
  <q-card>
114
141
  <q-toolbar>
115
142
  <l-btn label="Restore" icon="sym_o_restore" permission="revision.restore" @click="onRestore"
116
143
  :disabled="!isAllowRestore" />
117
144
 
118
- <q-checkbox label="Show delta only" v-model="showOnlyDelta" :color="$light.color"></q-checkbox>
145
+ <q-checkbox label="Show changed only" v-model="showOnlyDelta" :color="$light.color"></q-checkbox>
146
+
147
+ <q-btn-toggle class="q-mx-md" v-model="outputFormat" :toggle-color="$light.color" :options="[
148
+ { label: 'side-by-side', value: 'side-by-side' }, { label: 'line-by-line', value: 'line-by-line' }
149
+ ]" />
119
150
  <q-space />
120
151
  <q-btn flat round dense icon="close" @click="showDialog = false" />
121
152
  </q-toolbar>
122
153
 
123
154
 
124
155
  <div class="q-pa-md">
125
- <div class="text-h4 q-mb-md">
126
- Revision
156
+
157
+ <div class="text-h6 q-mb-md">
158
+ Revision by: {{ selectedRevision.revisionBy }} <br>
159
+ Created at: {{ selectedRevision.createdTime }}
160
+
127
161
  </div>
128
162
 
129
163
  <q-markup-table dense separator="cell" flat bordered>
@@ -135,23 +169,34 @@ const getFilteredContent = computed(() => {
135
169
  </th>
136
170
  <th>Field</th>
137
171
  <th>Value</th>
138
- <th>Delta</th>
172
+ <th>Changed</th>
139
173
  </tr>
140
174
  </thead>
141
175
  <tbody>
142
- <tr v-for="(value, key) in getFilteredContent" :key="key">
143
-
144
- <td><q-checkbox v-model="restore_fields" :val="key" :color="$light.color"></q-checkbox>
145
- </td>
146
- <td :class="{ 'bg-yellow-3': selectedRevision.delta[key] != undefined }">
147
- {{ key }}</td>
148
- <td>
149
- <pre>{{ value }}</pre>
150
- </td>
151
- <td>
152
- <pre>{{ selectedRevision.delta[key] }}</pre>
153
- </td>
154
- </tr>
176
+ <template v-for="(value, key) in getFilteredContent" :key="key">
177
+
178
+ <tr>
179
+
180
+ <td><q-checkbox v-model="restore_fields" :val="key"
181
+ :color="$light.color"></q-checkbox>
182
+ </td>
183
+ <td :class="{ 'bg-yellow-3': selectedRevision.delta[key] != undefined }">{{ key }}
184
+ </td>
185
+ <td>
186
+ <pre>{{ value }}</pre>
187
+ </td>
188
+ <td>
189
+ <pre>{{ selectedRevision.delta[key] }}</pre>
190
+ </td>
191
+
192
+ </tr>
193
+
194
+ <tr v-if="getDiffHtml(selectedRevision.diff[key])">
195
+ <td colspan="4">
196
+ <div v-html="getDiffHtml(selectedRevision.diff[key])"></div>
197
+ </td>
198
+ </tr>
199
+ </template>
155
200
  </tbody>
156
201
 
157
202
 
@@ -0,0 +1,36 @@
1
+ <script setup>
2
+ import { computed } from 'vue';
3
+ import { format } from "quasar"
4
+ const { humanStorageSize } = format
5
+ const props = defineProps({
6
+ storage: {
7
+ type: Object,
8
+ required: true
9
+ },
10
+ })
11
+
12
+
13
+ const usagePercent = computed(() => {
14
+ return Math.round((props.storage.totalSpace - props.storage.freeSpace) / props.storage.totalSpace)
15
+ })
16
+
17
+ const progressColor = computed(() => {
18
+ if (usagePercent.value > 0.95) {
19
+ return "negative"
20
+ }
21
+ if (usagePercent.value > 0.9) {
22
+ return "warning"
23
+ }
24
+ return "primary"
25
+ })
26
+
27
+ </script>
28
+ <template>
29
+ <q-card>
30
+ <q-card-section>
31
+ {{ $t("Storage") }}
32
+ <q-linear-progress rounded size="20px" :value="usagePercent" :color="progressColor" class="q-mt-sm" />
33
+ {{ $t('storage_usage', [humanStorageSize(storage.freeSpace), humanStorageSize(storage.totalSpace)]) }}
34
+ </q-card-section>
35
+ </q-card>
36
+ </template>
@@ -3,29 +3,56 @@ import { useRoute, useRouter } from 'vue-router';
3
3
  import { useLight, q, m } from "#imports";
4
4
  import { useQuasar, Loading, Dialog } from 'quasar';
5
5
  import { useI18n } from 'vue-i18n';
6
- import { ref, computed, reactive, provide, watch, toRaw, inject } from 'vue';
6
+ import { ref, computed, reactive, provide, watch, toRaw } from 'vue';
7
7
  import { useRuntimeConfig } from 'nuxt/app';
8
8
 
9
9
  Loading.show()
10
- //download system value
11
- /* import { download } from './../lib/SystemValue'
12
- await download();
13
- */
10
+
14
11
  const config = useRuntimeConfig();
15
12
 
16
13
  const appVersion = config.public.appVersion ?? '0.0.1';
17
14
 
18
15
  const quasar = useQuasar();
19
16
  const tt = await q({
20
- system: ["devMode", "time"],
21
- app: ["menus", "viewAsMode", "languages",
22
- "copyrightYear",
23
- "copyrightName",
24
- "hasFavorite",
25
- { i18nMessages: ["name", "value"] }],
26
- my: ['username', 'first_name', 'last_name', 'roles', "styles", "language", "permissions", "default_page", { myFavorites: ["my_favorite_id", "label", "path", "icon"] }],
17
+ system: {
18
+ devMode: true,
19
+ time: true,
20
+ storage: {
21
+ freeSpace: true,
22
+ usageSpace: true,
23
+ totalSpace: true,
24
+ }
25
+ },
26
+ app: {
27
+ menus: true,
28
+ viewAsMode: true,
29
+ languages: true,
30
+ copyrightName: true,
31
+ copyrightYear: true,
32
+ hasFavorite: true,
33
+ i18nMessages: {
34
+ name: true,
35
+ value: true
36
+ }
37
+ }, my: {
38
+ username: true,
39
+ first_name: true,
40
+ last_name: true,
41
+ roles: true,
42
+ styles: true,
43
+ language: true,
44
+ permissions: true,
45
+ default_page: true,
46
+ myFavorites: {
47
+ my_favorite_id: true,
48
+ label: true,
49
+ path: true,
50
+ icon: true
51
+ }
52
+ }
27
53
  })
28
54
 
55
+
29
56
  let app = tt.app
30
57
  let my = reactive(tt.my)
31
58
 
@@ -54,13 +81,6 @@ i18n.locale = my.language || 'en';
54
81
 
55
82
  let system = tt.system;
56
83
 
57
- if (light.isGranted("system.storage")) {
58
- let s = await q("system", ["diskFreeSpace", "diskUsageSpace", "diskTotalSpace", "diskFreeSpacePercent"]);
59
- //merge system value
60
- system = { ...system, ...s };
61
-
62
- }
63
-
64
84
  // message
65
85
  let messages = i18n.messages.value[i18n.locale];
66
86
  for (let t of app.i18nMessages) {
@@ -168,35 +188,17 @@ const exitViewAs = async () => {
168
188
  }
169
189
 
170
190
  const storageColor = computed(() => {
171
- if (system) {
172
- if (system.diskFreeSpacePercent < 0.05) {
191
+ if (system.storage) {
192
+ const percent = system.storage.freeSpace / system.storage.totalSpace;
193
+ if (percent < 0.05) {
173
194
  return "negative"
174
195
  }
175
- if (system.diskFreeSpacePercent < 0.1) {
196
+ if (percent < 0.1) {
176
197
  return "warning"
177
198
  }
178
199
  }
179
200
  })
180
201
 
181
- const storageProgressColor = computed(() => {
182
- if (system) {
183
- if (system.diskFreeSpacePercent < 0.05) {
184
- return "negative"
185
- }
186
- if (system.diskFreeSpacePercent < 0.1) {
187
- return "warning"
188
- }
189
- }
190
- return "primary"
191
- })
192
-
193
- const storageUsagePercent = computed(() => {
194
- if (system) {
195
- return 1 - system.diskFreeSpacePercent;
196
- }
197
- return 0;
198
- })
199
-
200
202
  const containerClass = computed(() => {
201
203
  return (light.theme == 'dark') ? {} : { 'bg-grey-2': true }
202
204
  })
@@ -223,8 +225,6 @@ const onToggleFav = async () => {
223
225
 
224
226
  //reload my.myFavorites
225
227
  light.reloadMyFavorites();
226
-
227
-
228
228
  return;
229
229
  }
230
230
 
@@ -320,24 +320,13 @@ if (route.fullPath == "/" && my.default_page) {
320
320
  </q-item>
321
321
  </q-list>
322
322
  </q-menu>
323
-
324
-
325
323
  </q-btn>
326
324
 
327
- <q-btn icon="sym_o_storage" flat round dense class="q-mr-sm" v-if="system" :color="storageColor">
325
+ <q-btn icon="sym_o_storage" flat round dense class="q-mr-sm" v-if="system.storage"
326
+ :color="storageColor">
328
327
  <q-menu>
329
- <q-card style="width:250px">
330
- <q-card-section>
331
- {{ $t("Storage") }}
332
- <q-linear-progress rounded size="20px" :value="storageUsagePercent"
333
- :color="storageProgressColor" class="q-mt-sm" />
334
- {{ $t('storage_usage', [system.diskFreeSpace, system.diskTotalSpace]) }}
335
- </q-card-section>
336
-
337
- </q-card>
328
+ <l-storage :storage="system.storage" style="width:250px" />
338
329
  </q-menu>
339
-
340
-
341
330
  </q-btn>
342
331
 
343
332
  <div class="q-mx-sm" v-if="$q.screen.gt.xs">
@@ -422,7 +411,8 @@ if (route.fullPath == "/" && my.default_page) {
422
411
  </q-scroll-area>
423
412
  </q-drawer>
424
413
 
425
- <q-page-container :class="containerClass" :style="containerStyle"> <!-- Error message -->
414
+ <q-page-container :class="containerClass" :style="containerStyle"> <!-- Error message -->
415
+ <slot name="header"></slot>
426
416
  <q-banner dense inline-actions class="bg-grey-4 q-ma-md" v-for=" error in errors " rounded>
427
417
  {{ error }}
428
418
 
@@ -448,9 +438,8 @@ if (route.fullPath == "/" && my.default_page) {
448
438
  <q-item>
449
439
  <q-item-section>
450
440
  {{ light.getCompany() }} {{ appVersion }} - Copyright {{ app.copyrightYear }} {{ app.copyrightName
451
- }}.
452
- Build {{
453
- light.getVersion() }}
441
+ }}. Build
442
+ {{ light.getVersion() }}
454
443
  </q-item-section>
455
444
  </q-item>
456
445
  </q-footer>
@@ -48,7 +48,13 @@ provide('color', color)
48
48
  </q-layout>
49
49
 
50
50
  <l-app-main v-else>
51
+
52
+ <template #header>
53
+ <slot name="header"></slot>
54
+ </template>
55
+
51
56
  <slot></slot>
57
+
58
+
52
59
  </l-app-main>
53
60
  </template>
54
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostlink/nuxt-light",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "HostLink Nuxt Light Framework",
5
5
  "repository": "@hostlink/nuxt-light",
6
6
  "license": "MIT",
@@ -40,6 +40,7 @@
40
40
  "@nuxt/module-builder": "^0.5.2",
41
41
  "@quasar/extras": "^1.16.6",
42
42
  "axios": "^1.5.0",
43
+ "diff2html": "^3.4.47",
43
44
  "formkit-quasar": "^0.0.15",
44
45
  "json-to-graphql-query": "^2.2.5",
45
46
  "quasar": "^2.12.5",