@hostlink/nuxt-light 0.0.14 → 0.0.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/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "light",
3
3
  "configKey": "light",
4
- "version": "0.0.14"
4
+ "version": "0.0.16"
5
5
  }
@@ -37,8 +37,6 @@ if (user.value && user.value.roles.indexOf('Administrators') != -1) {
37
37
  showViewAs = true;
38
38
  }
39
39
 
40
- //const menus = (await queryContent("/menus").findOne()).menus;
41
- const menus = [];
42
40
 
43
41
  const menuOverlayHeader = ref(false)
44
42
  const layoutView = computed(() => {
@@ -178,7 +176,6 @@ const errors = computed(() => {
178
176
  <!-- drawer content -->
179
177
  <q-scroll-area class="fit">
180
178
  <l-menu v-for="menu in app.menus" :value="menu" v-if="isAdmin" :dense="style.dense" />
181
- <l-menu v-for="menu in menus" :value="menu" />
182
179
  </q-scroll-area>
183
180
  </q-drawer>
184
181
 
@@ -1,6 +1,6 @@
1
1
  <script setup>
2
2
 
3
- defineProps(["value","dense"])
3
+ defineProps(["value", "dense"])
4
4
 
5
5
  </script>
6
6
 
@@ -19,9 +19,9 @@ defineProps(["value","dense"])
19
19
  </style>
20
20
 
21
21
  <template>
22
- <q-expansion-item v-if="value.menus" :label="value.label" :icon="value.icon" :dense="dense">
22
+ <q-expansion-item v-if="value.children?.length > 0" :label="value.label" :icon="value.icon" :dense="dense">
23
23
  <q-list class="q-pl-md">
24
- <l-menu :value="menu" v-for="menu in value.menus" :dense="dense"></l-menu>
24
+ <l-menu :value="menu" v-for="menu in value.children" :dense="dense"></l-menu>
25
25
  </q-list>
26
26
  </q-expansion-item>
27
27
  <q-list v-else class="menu-list" :dense="dense">
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { getObject } from "../../light"
2
+ import { getObject } from "../../../light"
3
3
  const obj = await getObject(["eventlog_id", "class", "id", "action", "created_time", "username"]);
4
4
  </script>
5
5
  <template>
@@ -12,8 +12,6 @@ const obj = await getObject(["eventlog_id", "class", "id", "action", "created_ti
12
12
  <l-item label="Action">{{ obj.action }}</l-item>
13
13
  <l-item label="Created time">{{ obj.created_time }}</l-item>
14
14
  <l-item label="Username">{{ obj.username }}</l-item>
15
-
16
-
17
15
  </l-list>
18
16
  </l-card>
19
17
  </l-page>
@@ -0,0 +1,251 @@
1
+ <script setup>
2
+ import { reactive, ref, computed } from 'vue';
3
+ import { m, q } from "../../../light";
4
+ import { useQuasar } from 'quasar';
5
+
6
+
7
+ const quasar = useQuasar();
8
+ const menus = ref(await q("appMenus", []));
9
+
10
+ const selected = ref(null);
11
+ const tree1 = ref(null)
12
+
13
+ const getUUID = () => {
14
+ //iso v4
15
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
16
+ let r = Math.random() * 16 | 0,
17
+ v = c == 'x' ? r : (r & 0x3 | 0x8);
18
+ return v.toString(16);
19
+ }).toUpperCase();
20
+
21
+ }
22
+
23
+ const onReload = async () => {
24
+ menus.value = await q("appMenus", []);
25
+ }
26
+
27
+ const onAdd = () => {
28
+
29
+ quasar.dialog({
30
+ title: 'Add Menu',
31
+ message: 'Enter menu label',
32
+ prompt: {
33
+ model: '',
34
+ },
35
+ cancel: true,
36
+ persistent: true,
37
+ }).onOk((data) => {
38
+ if (data === '') return;
39
+
40
+ menus.value.push({
41
+ label: data,
42
+ uuid: getUUID(),
43
+ children: [],
44
+ });
45
+
46
+ });
47
+ }
48
+ const onAddChild = (node) => {
49
+
50
+ quasar.dialog({
51
+ title: 'Add Child Menu',
52
+ message: 'Enter menu label',
53
+ prompt: {
54
+ model: '',
55
+ },
56
+ cancel: true,
57
+ persistent: true,
58
+ }).onOk((data) => {
59
+ if (data === '') return;
60
+
61
+ node.children.push({
62
+ label: data,
63
+ uuid: getUUID(),
64
+ parent: node.uuid,
65
+ children: [],
66
+ });
67
+ tree1.value.setExpanded(selected.value, true)
68
+
69
+ });
70
+ }
71
+ const onRemove = (node) => {
72
+ const parent = node.parent;
73
+ if (parent) {
74
+ const parentNode = tree1.value.getNodeByKey(parent);
75
+ parentNode.children = parentNode.children.filter((item) => item.uuid !== node.uuid);
76
+ selected.value = parent;
77
+
78
+ } else {
79
+ menus.value = menus.value.filter((item) => item.uuid !== node.uuid);
80
+
81
+ selected.value = null;
82
+ }
83
+ }
84
+
85
+ const splitterModel = ref(50)
86
+
87
+ const selectedNode = computed(() => {
88
+ return tree1.value.getNodeByKey(selected.value);
89
+ });
90
+
91
+ const onSave = () => {
92
+
93
+ //confirm
94
+ quasar.dialog({
95
+ title: 'Save Menu',
96
+ message: 'Are you sure to save menu?',
97
+ cancel: true,
98
+ persistent: true,
99
+ }).onOk(async () => {
100
+ if (await m("updateAppMenus", {
101
+ data: menus.value
102
+ })) {
103
+ quasar.notify({
104
+ message: 'Menu saved',
105
+ color: 'positive',
106
+ icon: 'check',
107
+ position: 'top',
108
+ timeout: 1000,
109
+ });
110
+ }
111
+
112
+ });
113
+ }
114
+
115
+ const showMove = ref(false)
116
+ const onMove = () => {
117
+ showMove.value = true;
118
+ }
119
+ const moveTarget = ref(null)
120
+
121
+ const onMoveConfirm = () => {
122
+
123
+ const selectedNode = tree1.value.getNodeByKey(selected.value);
124
+
125
+ //clone selected node
126
+ const newNode = JSON.parse(JSON.stringify(selectedNode));
127
+
128
+ onRemove(selectedNode);
129
+
130
+ //add to target
131
+ newNode.parent = moveTarget.value;
132
+ let targetNode = tree1.value.getNodeByKey(moveTarget.value);
133
+ targetNode.children = targetNode.children || [];
134
+ targetNode.children.push(newNode);
135
+
136
+ tree1.value.setExpanded(moveTarget.value, true)
137
+
138
+ showMove.value = false;
139
+
140
+ }
141
+ const onMoveToRoot = () => {
142
+ const selectedNode = tree1.value.getNodeByKey(selected.value);
143
+
144
+ //clone selected node
145
+ const newNode = JSON.parse(JSON.stringify(selectedNode));
146
+ newNode.parent = null;
147
+ onRemove(selectedNode);
148
+
149
+ //add to target
150
+
151
+ menus.value.push(newNode);
152
+
153
+ showMove.value = false;
154
+ }
155
+
156
+ const getParentNode = (node) => {
157
+ if (!node.parent) return menus.value;
158
+ return tree1.value.getNodeByKey(node.parent);
159
+ }
160
+
161
+ const onMoveUp = (node) => {
162
+ const parent = getParentNode(node);
163
+ const index = parent.children.findIndex((item) => item.uuid === node.uuid);
164
+ if (index > 0) {
165
+ const temp = parent.children[index - 1];
166
+ parent.children[index - 1] = node;
167
+ parent.children[index] = temp;
168
+ }
169
+ }
170
+
171
+ const onMoveDown = (node) => {
172
+ const parent = getParentNode(node);
173
+ const index = parent.children.findIndex((item) => item.uuid === node.uuid);
174
+ if (index < parent.children.length - 1) {
175
+ const temp = parent.children[index + 1];
176
+ parent.children[index + 1] = node;
177
+ parent.children[index] = temp;
178
+ }
179
+ }
180
+ </script>
181
+
182
+ <template>
183
+ <l-page>
184
+ <q-dialog v-model="showMove">
185
+ <l-card>
186
+ <q-card-section>
187
+ <q-tree :nodes="menus" selected-color="primary" default-expand-all v-model:selected="moveTarget"
188
+ node-key="uuid" ref="tree2" />
189
+ </q-card-section>
190
+
191
+ <q-card-actions align="right">
192
+ <q-btn flat label="Cancel" color="primary" v-close-popup />
193
+ <q-btn flat label="Move" color="primary" @click="onMoveConfirm" />
194
+ <q-btn flat label="Move to root" color="primary" @click="onMoveToRoot" />
195
+ </q-card-actions>
196
+ </l-card>
197
+ </q-dialog>
198
+
199
+ <l-card>
200
+ <q-splitter v-model="splitterModel" style="height:680px">
201
+ <template #before>
202
+ <q-card-section>
203
+ <q-btn outline rounded color="primary" @click="onAdd" label="Add" icon="sym_o_add" />
204
+ <q-btn outline rounded color="primary" @click="onReload" label="Reload" icon="sym_o_refresh" />
205
+
206
+ <q-btn outline rounded color="primary" @click="onSave" label="Save" icon="sym_o_save" />
207
+ </q-card-section>
208
+
209
+ <q-tree :nodes="menus" selected-color="primary" default-expand-all v-model:selected="selected"
210
+ node-key="uuid" ref="tree1" />
211
+ </template>
212
+
213
+ <template #after v-if="selected">
214
+
215
+ <q-card-section>
216
+ <q-btn outline rounded color="primary" @click="onRemove(selectedNode)" label="Remove"
217
+ icon="sym_o_remove" />
218
+ <q-btn outline rounded color="primary" @click="onAddChild(selectedNode)" label="Add Child"
219
+ icon="sym_o_add" />
220
+
221
+ <q-btn outline rounded color="primary" @click="onMove(selectedNode)" label="Move"
222
+ icon="sym_o_move" />
223
+
224
+ <q-btn outline rounded color="primary" @click="onMoveUp(selectedNode)" label="Up"
225
+ icon="sym_o_arrow_upward" />
226
+
227
+ <q-btn outline rounded color="primary" @click="onMoveDown(selectedNode)" label="Up"
228
+ icon="sym_o_arrow_downward" />
229
+ </q-card-section>
230
+
231
+
232
+ <q-card-section>
233
+ <q-form>
234
+ <l-input label="Label" v-model="selectedNode.label" />
235
+ <l-input label="To" v-model="selectedNode.to" />
236
+ <l-input label="Icon" v-model="selectedNode.icon" />
237
+ <l-input label="Permission" v-model="selectedNode.permission" />
238
+ <l-input label="UUID" v-model="selectedNode.uuid" readonly />
239
+
240
+ </q-form>
241
+ </q-card-section>
242
+ </template>
243
+
244
+ </q-splitter>
245
+
246
+
247
+
248
+ </l-card>
249
+
250
+ </l-page>
251
+ </template>
@@ -78,6 +78,11 @@ function System_view_as() {
78
78
  /* webpackChunkName: "System-view_as" */ './pages/System/view_as.vue'
79
79
  )
80
80
  }
81
+ function System_menu_index() {
82
+ return import(
83
+ /* webpackChunkName: "System-menu-index" */ './pages/System/menu/index.vue'
84
+ )
85
+ }
81
86
  function User_add() {
82
87
  return import(/* webpackChunkName: "User-add" */ './pages/User/add.vue')
83
88
  }
@@ -213,6 +218,11 @@ export default [
213
218
  path: '/System/view_as',
214
219
  component: System_view_as,
215
220
  },
221
+ {
222
+ name: 'System-menu',
223
+ path: '/System/menu',
224
+ component: System_menu_index,
225
+ },
216
226
  {
217
227
  name: 'User-add',
218
228
  path: '/User/add',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostlink/nuxt-light",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "description": "HostLink Nuxt Light Framework",
5
5
  "repository": "@hostlink/nuxt-light",
6
6
  "license": "MIT",