@hostlink/nuxt-light 1.13.6 → 1.14.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 (68) hide show
  1. package/dist/module.json +5 -1
  2. package/dist/runtime/components/l-app-main.vue +14 -11
  3. package/dist/runtime/components/l-bar.vue +21 -0
  4. package/dist/runtime/components/l-btn.vue +2 -2
  5. package/dist/runtime/components/l-card.vue +1 -1
  6. package/dist/runtime/components/l-checkbox.vue +1 -1
  7. package/dist/runtime/components/l-customizer.vue +21 -7
  8. package/dist/runtime/components/l-dialog-database-field-add.vue +61 -0
  9. package/dist/runtime/components/l-editor.vue +1 -1
  10. package/dist/runtime/components/l-form.vue +21 -5
  11. package/dist/runtime/components/l-input.vue +1 -1
  12. package/dist/runtime/components/l-item.vue +1 -1
  13. package/dist/runtime/components/l-list.vue +1 -1
  14. package/dist/runtime/components/l-login.vue +54 -72
  15. package/dist/runtime/components/l-page.vue +16 -2
  16. package/dist/runtime/components/l-select.vue +1 -1
  17. package/dist/runtime/components/l-table.vue +2 -1
  18. package/dist/runtime/components/l-tabs.vue +1 -1
  19. package/dist/runtime/formkit/Form.vue +22 -9
  20. package/dist/runtime/index.d.ts +3 -3
  21. package/dist/runtime/{index.mjs → index.js} +2 -2
  22. package/dist/runtime/lib/{SystemValue.mjs → SystemValue.js} +2 -2
  23. package/dist/runtime/lib/defineLightModel.d.ts +1 -1
  24. package/dist/runtime/lib/{defineLightModel.mjs → defineLightModel.js} +1 -1
  25. package/dist/runtime/lib/{f.mjs → f.js} +1 -1
  26. package/dist/runtime/lib/{getApiUrl.mjs → getApiUrl.js} +1 -1
  27. package/dist/runtime/lib/{getCurrentUser.mjs → getCurrentUser.js} +1 -1
  28. package/dist/runtime/lib/{getGQLFields.mjs → getGQLFields.js} +1 -1
  29. package/dist/runtime/lib/{getID.mjs → getID.js} +1 -1
  30. package/dist/runtime/lib/{getModelColumns.mjs → getModelColumns.js} +1 -1
  31. package/dist/runtime/lib/{getModelField.mjs → getModelField.js} +1 -1
  32. package/dist/runtime/lib/{getModelFields.mjs → getModelFields.js} +1 -1
  33. package/dist/runtime/lib/{getObject.mjs → getObject.js} +2 -2
  34. package/dist/runtime/lib/index.d.ts +23 -23
  35. package/dist/runtime/lib/index.js +35 -0
  36. package/dist/runtime/lib/{list.mjs → list.js} +1 -1
  37. package/dist/runtime/lib/{listObject.mjs → listObject.js} +1 -1
  38. package/dist/runtime/lib/{loadObject.mjs → loadObject.js} +1 -1
  39. package/dist/runtime/lib/{m.mjs → m.js} +1 -1
  40. package/dist/runtime/lib/model.d.ts +2 -2
  41. package/dist/runtime/lib/{model.mjs → model.js} +1 -1
  42. package/dist/runtime/lib/{q.mjs → q.js} +2 -2
  43. package/dist/runtime/lib/{sv.mjs → sv.js} +1 -1
  44. package/dist/runtime/pages/System/database/table.vue +125 -6
  45. package/dist/runtime/pages/System/view_as.vue +12 -8
  46. package/dist/runtime/pages/User/_user_id/edit.vue +3 -3
  47. package/dist/runtime/pages/User/index.vue +2 -0
  48. package/dist/runtime/pages/User/profile.vue +4 -12
  49. package/dist/runtime/pages/User/setting/open_id.vue +6 -10
  50. package/dist/runtime/pages/User/setting.vue +1 -1
  51. package/dist/runtime/plugin.d.ts +2 -2
  52. package/dist/runtime/{plugin.mjs → plugin.js} +8 -8
  53. package/dist/types.d.mts +1 -16
  54. package/dist/types.d.ts +1 -16
  55. package/package.json +59 -60
  56. package/dist/runtime/lib/index.mjs +0 -35
  57. /package/dist/runtime/formkit/{index.mjs → index.js} +0 -0
  58. /package/dist/runtime/lib/{GQLFieldBuilder.mjs → GQLFieldBuilder.js} +0 -0
  59. /package/dist/runtime/lib/{api.mjs → api.js} +0 -0
  60. /package/dist/runtime/lib/{isGranted.mjs → isGranted.js} +0 -0
  61. /package/dist/runtime/lib/{t.mjs → t.js} +0 -0
  62. /package/dist/runtime/lib/{tc2sc.mjs → tc2sc.js} +0 -0
  63. /package/dist/runtime/lib/{toJson.mjs → toJson.js} +0 -0
  64. /package/dist/runtime/types/{EventLog.mjs → EventLog.js} +0 -0
  65. /package/dist/runtime/types/{MailLog.mjs → MailLog.js} +0 -0
  66. /package/dist/runtime/types/{SystemValue.mjs → SystemValue.js} +0 -0
  67. /package/dist/runtime/types/{User.mjs → User.js} +0 -0
  68. /package/dist/runtime/types/{UserLog.mjs → UserLog.js} +0 -0
@@ -23,10 +23,16 @@ let bordered = true;
23
23
  if (props.context.bordered !== undefined) {
24
24
  bordered = props.context.bordered;
25
25
  }
26
- const loading = ref(false);
26
+
27
+ let redirect = true;
28
+ if (props.context.attrs.onSubmitted) {
29
+ redirect = false;
30
+ }
31
+
32
+
27
33
  if (!props.context.onSubmit) {
28
34
  props.context.node.props.onSubmit = async function () {
29
- loading.value = true;
35
+
30
36
  const [module, id_name] = route.name.split("-");
31
37
 
32
38
 
@@ -46,8 +52,9 @@ if (!props.context.onSubmit) {
46
52
  color: "positive",
47
53
  icon: "sym_o_check"
48
54
  });
49
- router.go(-1);
50
- return;
55
+ if (redirect) {
56
+ router.go(-1);
57
+ }
51
58
  }
52
59
  } else {
53
60
  if (await model(module).add(v)) {
@@ -56,10 +63,16 @@ if (!props.context.onSubmit) {
56
63
  color: "positive",
57
64
  icon: "sym_o_check"
58
65
  });
59
- router.go(-1);
60
- return;
66
+
67
+ if (redirect) {
68
+ router.go(-1);
69
+ }
61
70
  }
62
71
  }
72
+ //emit submitted event
73
+ if (props.context.attrs.onSubmitted) {
74
+ props.context.attrs.onSubmitted(v);
75
+ }
63
76
  } catch (e) {
64
77
  quasar.dialog({
65
78
  title: "Error",
@@ -67,7 +80,7 @@ if (!props.context.onSubmit) {
67
80
  ok: "OK"
68
81
  });
69
82
  }
70
- loading.value = false;
83
+
71
84
  }
72
85
 
73
86
  }
@@ -84,8 +97,8 @@ if (!props.context.onSubmit) {
84
97
  </q-card-section>
85
98
 
86
99
  <q-card-actions align="right">
87
- <l-btn icon="sym_o_check" label="Submit" @click="onSubmit" :disabled="!context.state.dirty"
88
- :loading="loading"></l-btn>
100
+ <l-btn icon="sym_o_check" :label="context.submitLabel ?? 'Submit'" @click="onSubmit"
101
+ :disabled="!context.state.dirty" :loading="context.state.loading"></l-btn>
89
102
  </q-card-actions>
90
103
  </l-card>
91
104
  </form>
@@ -33,7 +33,7 @@ declare const app: {
33
33
  getCompany: () => string;
34
34
  setCompanyLogo: (logo: string) => void;
35
35
  getCompanyLogo: () => string;
36
- getVersion: () => any;
36
+ getVersion: () => string;
37
37
  addError: (error: String) => void;
38
38
  getErrors: () => String[];
39
39
  removeError: (error: String) => void;
@@ -82,7 +82,7 @@ export declare const useLight: (options?: {
82
82
  getCompany: () => string;
83
83
  setCompanyLogo: (logo: string) => void;
84
84
  getCompanyLogo: () => string;
85
- getVersion: () => any;
85
+ getVersion: () => string;
86
86
  addError: (error: String) => void;
87
87
  getErrors: () => String[];
88
88
  removeError: (error: String) => void;
@@ -98,4 +98,4 @@ export declare const useLight: (options?: {
98
98
  isGranted: (right?: string) => boolean;
99
99
  setPermissions: (permissions: Array<string>) => void;
100
100
  };
101
- export * from "./lib";
101
+ export * from "./lib.js";
@@ -1,6 +1,6 @@
1
1
  import packageJson from "../../package.json";
2
2
  import { watch, reactive, toRaw } from "vue";
3
- import { m, q } from "./lib/index.mjs";
3
+ import { m, q } from "./lib/index.js";
4
4
  const errors = [];
5
5
  let styles = {};
6
6
  const COLOR_CODE = {
@@ -207,4 +207,4 @@ export const useLight = (options = {}) => {
207
207
  }
208
208
  return app;
209
209
  };
210
- export * from "./lib/index.mjs";
210
+ export * from "./lib/index.js";
@@ -1,5 +1,5 @@
1
- import sv from "./sv.mjs";
2
- import { cache } from "./sv.mjs";
1
+ import sv from "./sv.js";
2
+ import { cache } from "./sv.js";
3
3
  export const loadSV = (name) => {
4
4
  return () => sv(name);
5
5
  };
@@ -19,5 +19,5 @@ export interface LightModel {
19
19
  name: string;
20
20
  fields: LightModelFields;
21
21
  }
22
- declare const _default: (model: LightModel) => any;
22
+ declare const _default: (model: LightModel) => import("#app").Plugin<Record<string, unknown>> & import("#app").ObjectPlugin<Record<string, unknown>>;
23
23
  export default _default;
@@ -1,5 +1,5 @@
1
1
  import { defineNuxtPlugin } from "#app";
2
- import { default as api } from "./api.mjs";
2
+ import { default as api } from "./api.js";
3
3
  export default (model) => {
4
4
  return defineNuxtPlugin(() => {
5
5
  api.models.create(model.name, model.fields);
@@ -1,5 +1,5 @@
1
1
  import { jsonToGraphQLQuery } from "json-to-graphql-query";
2
- import toJson from "./toJson.mjs";
2
+ import toJson from "./toJson.js";
3
3
  export default function(operation, args, fields = []) {
4
4
  if (arguments.length === 2) {
5
5
  fields = args;
@@ -1,4 +1,4 @@
1
- import { getApiBase } from "./index.mjs";
1
+ import { getApiBase } from "./index.js";
2
2
  export default function getApiUrl(url, params) {
3
3
  const urlParams = new URLSearchParams(params).toString();
4
4
  return getApiBase() + `${url}?${urlParams}`;
@@ -1,4 +1,4 @@
1
- import q from "./q.mjs";
1
+ import q from "./q.js";
2
2
  export default async () => {
3
3
  try {
4
4
  return await q("my", ["username", "first_name", "last_name", "roles"]);
@@ -1,4 +1,4 @@
1
- import { api } from "./index.mjs";
1
+ import { api } from "./index.js";
2
2
  export default (name, fields) => {
3
3
  return api.model(name).gqlFields(fields);
4
4
  };
@@ -1,4 +1,4 @@
1
- import { useLight } from "../index.mjs";
1
+ import { useLight } from "../index.js";
2
2
  export default () => {
3
3
  return useLight().getID();
4
4
  };
@@ -1,4 +1,4 @@
1
- import { default as getModelField } from "./getModelField.mjs";
1
+ import { default as getModelField } from "./getModelField.js";
2
2
  export default (model, names) => {
3
3
  let columns = [];
4
4
  for (let name of names) {
@@ -1,4 +1,4 @@
1
- import { default as api } from "./api.mjs";
1
+ import { default as api } from "./api.js";
2
2
  export default (name, field) => {
3
3
  return api.model(name).field(field);
4
4
  };
@@ -1,4 +1,4 @@
1
- import { default as getModelField } from "./getModelField.mjs";
1
+ import { default as getModelField } from "./getModelField.js";
2
2
  export default (model, names) => {
3
3
  let fields = [];
4
4
  for (let name of names) {
@@ -1,6 +1,6 @@
1
1
  import { useRoute } from "vue-router";
2
- import loadObject from "./loadObject.mjs";
3
- import { default as getModelField } from "./getModelField.mjs";
2
+ import loadObject from "./loadObject.js";
3
+ import { default as getModelField } from "./getModelField.js";
4
4
  export default async function(fields = []) {
5
5
  let route = useRoute();
6
6
  if (!route.name) {
@@ -1,25 +1,25 @@
1
- export { default as api } from "./api";
2
- export { default as f } from "./f";
3
- export { default as getApiUrl } from "./getApiUrl";
4
- export { default as getCurrentUser } from "./getCurrentUser";
5
- export { default as getObject } from "./getObject";
6
- export { default as list } from "./list";
7
- export { default as m } from "./m";
8
- export { default as q } from "./q";
9
- export { default as t } from "./t";
10
- export { default as listObject } from "./listObject";
11
- export { default as loadObject } from "./loadObject";
12
- export { default as isGranted } from "./isGranted";
13
- export { default as GQLFieldBuilder } from "./GQLFieldBuilder";
14
- export { default as getModelField } from "./getModelField";
15
- export { default as getModelFields } from "./getModelFields";
16
- export { default as getModelColumns } from "./getModelColumns";
17
- export { default as sv } from "./sv";
18
- export { default as model } from "./model";
19
- export { default as defineLightModel } from "./defineLightModel";
20
- export { type LightModelField, type LightModel } from "./defineLightModel";
1
+ export { default as api } from "./api.js";
2
+ export { default as f } from "./f.js";
3
+ export { default as getApiUrl } from "./getApiUrl.js";
4
+ export { default as getCurrentUser } from "./getCurrentUser.js";
5
+ export { default as getObject } from "./getObject.js";
6
+ export { default as list } from "./list.js";
7
+ export { default as m } from "./m.js";
8
+ export { default as q } from "./q.js";
9
+ export { default as t } from "./t.js";
10
+ export { default as listObject } from "./listObject.js";
11
+ export { default as loadObject } from "./loadObject.js";
12
+ export { default as isGranted } from "./isGranted.js";
13
+ export { default as GQLFieldBuilder } from "./GQLFieldBuilder.js";
14
+ export { default as getModelField } from "./getModelField.js";
15
+ export { default as getModelFields } from "./getModelFields.js";
16
+ export { default as getModelColumns } from "./getModelColumns.js";
17
+ export { default as sv } from "./sv.js";
18
+ export { default as model } from "./model.js";
19
+ export { default as defineLightModel } from "./defineLightModel.js";
20
+ export { type LightModelField, type LightModel } from "./defineLightModel.js";
21
21
  export declare const notify: (message: string, color?: string) => void;
22
- export { default as getID } from "./getID";
23
- export { default as id } from "./getID";
22
+ export { default as getID } from "./getID.js";
23
+ export { default as id } from "./getID.js";
24
24
  export declare const getApiBase: () => {};
25
- export { default as getGQLFields } from "./getGQLFields";
25
+ export { default as getGQLFields } from "./getGQLFields.js";
@@ -0,0 +1,35 @@
1
+ import { useRuntimeConfig } from "nuxt/app";
2
+ import { Notify } from "quasar";
3
+ export { default as api } from "./api.js";
4
+ export { default as f } from "./f.js";
5
+ export { default as getApiUrl } from "./getApiUrl.js";
6
+ export { default as getCurrentUser } from "./getCurrentUser.js";
7
+ export { default as getObject } from "./getObject.js";
8
+ export { default as list } from "./list.js";
9
+ export { default as m } from "./m.js";
10
+ export { default as q } from "./q.js";
11
+ export { default as t } from "./t.js";
12
+ export { default as listObject } from "./listObject.js";
13
+ export { default as loadObject } from "./loadObject.js";
14
+ export { default as isGranted } from "./isGranted.js";
15
+ export { default as GQLFieldBuilder } from "./GQLFieldBuilder.js";
16
+ export { default as getModelField } from "./getModelField.js";
17
+ export { default as getModelFields } from "./getModelFields.js";
18
+ export { default as getModelColumns } from "./getModelColumns.js";
19
+ export { default as sv } from "./sv.js";
20
+ export { default as model } from "./model.js";
21
+ export { default as defineLightModel } from "./defineLightModel.js";
22
+ export const notify = function(message, color = "positive") {
23
+ Notify.create({
24
+ message,
25
+ color,
26
+ position: "top"
27
+ });
28
+ };
29
+ export { default as getID } from "./getID.js";
30
+ export { default as id } from "./getID.js";
31
+ export const getApiBase = () => {
32
+ const config = useRuntimeConfig();
33
+ return config?.public?.apiBase ?? "/api/";
34
+ };
35
+ export { default as getGQLFields } from "./getGQLFields.js";
@@ -1,5 +1,5 @@
1
1
  import { toQuery } from "@hostlink/light";
2
- import { default as api } from "./api.mjs";
2
+ import { default as api } from "./api.js";
3
3
  export default async function list(name, props = null, fields = []) {
4
4
  let q = {};
5
5
  if (props) {
@@ -1,4 +1,4 @@
1
- import list from "./list.mjs";
1
+ import list from "./list.js";
2
2
  export default async function listObject(name, filters = {}, sort, offset, limit, fields = []) {
3
3
  const resp = await list(name, {
4
4
  filters,
@@ -1,4 +1,4 @@
1
- import list from "./list.mjs";
1
+ import list from "./list.js";
2
2
  export default async function(module, filters, fields = []) {
3
3
  let { data } = await list(module, {
4
4
  filters
@@ -1,4 +1,4 @@
1
- import { default as api } from "./api.mjs";
1
+ import { default as api } from "./api.js";
2
2
  export default function(operation, args, fields = []) {
3
3
  return api.mutation(operation, args, fields);
4
4
  }
@@ -1,5 +1,5 @@
1
- import { default as api } from "./api";
2
- import type { LTableColumn } from "../components/l-table.vue";
1
+ import { default as api } from "./api.js";
2
+ import type { LTableColumn } from "../components/l-table.vue.js";
3
3
  interface LModel extends ReturnType<typeof api.model> {
4
4
  columns(fields: string[]): Array<LTableColumn>;
5
5
  }
@@ -1,4 +1,4 @@
1
- import { default as api } from "./api.mjs";
1
+ import { default as api } from "./api.js";
2
2
  export default (name) => {
3
3
  const m = api.model(name);
4
4
  return Object.assign(m, {
@@ -1,7 +1,7 @@
1
- import f from "./f.mjs";
1
+ import f from "./f.js";
2
2
  import { jsonToGraphQLQuery } from "json-to-graphql-query";
3
3
  import { toQuery } from "@hostlink/light";
4
- import { api } from "./index.mjs";
4
+ import { api } from "./index.js";
5
5
  export default async function(operation, args = null, fields = []) {
6
6
  let query;
7
7
  if (operation instanceof Object) {
@@ -1,4 +1,4 @@
1
- import { default as api } from "./api.mjs";
1
+ import { default as api } from "./api.js";
2
2
  export const cache = {};
3
3
  export default (name) => {
4
4
  if (cache[name]) {
@@ -1,24 +1,143 @@
1
1
  <script setup>
2
- import { api } from '#imports';
2
+ import { api, m } from '#imports';
3
+ import { useQuasar } from 'quasar';
4
+ import { resolveComponent, ref, reactive } from 'vue';
5
+
6
+ const $q = useQuasar();
3
7
 
4
8
  const { system: { database } } = await api.query({
5
9
  system: {
6
10
  database: {
7
- table: true
11
+ table: true,
12
+ version: true
8
13
  }
9
14
  }
10
15
  })
11
16
 
17
+ const tables = ref(database.table);
18
+
19
+ const refresh = async () => {
20
+ const { system: { database } } = await api.query({
21
+ system: {
22
+ database: {
23
+ table: true,
24
+ version: true
25
+ }
26
+ }
27
+ })
28
+ tables.value = database.table;
29
+ }
30
+
31
+
32
+ const field_add = resolveComponent('l-dialog-database-field-add');
33
+ const add = async (table) => {
34
+ $q.dialog({
35
+ component: field_add
36
+ }).onOk(async (data) => {
37
+ //data.name
38
+ //data.type
39
+ try {
40
+ const addDatabaseField = await m("addDatabaseField", {
41
+ table,
42
+ field: data.name,
43
+ type: data.type,
44
+ length: data.length,
45
+ default: data.default,
46
+ nullable: data.nullable,
47
+ autoincrement: data.autoincrement
48
+ })
49
+ $q.notify({
50
+ type: 'positive',
51
+ message: addDatabaseField
52
+ })
53
+
54
+ refresh();
55
+
56
+ } catch (e) {
57
+ $q.notify({
58
+ type: 'negative',
59
+ message: e.message
60
+ })
61
+ }
62
+ })
63
+
64
+ }
65
+
66
+ const selected = reactive({});
67
+
68
+ for (let table of database.table) {
69
+ selected[table.name] = [];
70
+ }
71
+
72
+
73
+ const removeField = async (table) => {
74
+ //confirmation
75
+
76
+ $q.dialog({
77
+ title: 'Remove field',
78
+ message: 'Are you sure you want to remove the selected fields?',
79
+ ok: 'Yes',
80
+ cancel: 'No'
81
+ }).onOk(async () => {
12
82
 
83
+
84
+ //map selected fields
85
+
86
+ const fields = selected[table].map(field => field.Field)
87
+
88
+ try {
89
+ const removeDatabaseFields = await m("removeDatabaseFields", {
90
+ table,
91
+ fields: fields
92
+ })
93
+ $q.notify({
94
+ type: 'positive',
95
+ message: removeDatabaseFields
96
+ })
97
+
98
+ selected[table] = [];
99
+
100
+ refresh();
101
+ } catch (e) {
102
+ $q.notify({
103
+ type: 'negative',
104
+ message: e.message
105
+ })
106
+ }
107
+ })
108
+
109
+
110
+
111
+
112
+
113
+
114
+ }
13
115
  </script>
14
116
  <template>
15
- <l-page>
117
+ <l-page gutter="sm">
118
+ <l-card>
119
+ <l-list>
120
+ <l-item label="Version">{{ database.version }}</l-item>
121
+ </l-list>
122
+ </l-card>
123
+
16
124
  <q-card flat bordered>
17
125
  <q-list class="rounded-borders" separator bordered>
18
- <q-expansion-item :label="table.name" v-for="table in database.table" dense>
126
+ <q-expansion-item :label="table.name" v-for="table in tables" dense>
127
+ <q-toolbar>
128
+ <q-btn icon="sym_o_add" @click="add(table.name)" round flat size="sm">
129
+ <q-tooltip>Add field</q-tooltip>
130
+ </q-btn>
131
+ <q-btn icon="sym_o_delete" @click="removeField(table.name)" round flat size="sm"
132
+ :disable="selected[table.name].length == 0">
133
+ <q-tooltip>Remove field</q-tooltip>
134
+ </q-btn>
135
+ </q-toolbar>
19
136
  <div class="q-ma-sm">
20
- <q-table separator="cell" dense :rows="table.columns" :rows-per-page-options="[0]"
21
- hide-pagination flat bordered></q-table>
137
+ <q-table row-key="Field" separator="cell" dense :rows="table.columns"
138
+ :rows-per-page-options="[0]" hide-pagination flat bordered selection="multiple"
139
+ v-model:selected="selected[table.name]">
140
+ </q-table>
22
141
  </div>
23
142
 
24
143
  </q-expansion-item>
@@ -2,9 +2,10 @@
2
2
  import { list, m } from '#imports'
3
3
  import { useRouter } from "vue-router"
4
4
  import { ref, computed } from "vue"
5
- import { Dialog } from 'quasar'
5
+ import { useQuasar } from 'quasar'
6
+ const $q = useQuasar()
6
7
 
7
- let { data: users } = await list("User", null, ["user_id", "username", "name", "roles"]);
8
+ let { data: users } = await list("User", null, ["user_id", "username", "name", "roles", "email"]);
8
9
 
9
10
  let columns = [
10
11
  {
@@ -19,6 +20,12 @@ let columns = [
19
20
  field: "name",
20
21
  align: "left",
21
22
  }, {
23
+ name: "email",
24
+ label: "Email",
25
+ align: "left",
26
+ field: "email"
27
+ },
28
+ {
22
29
  name: "roles",
23
30
  label: "Roles",
24
31
  align: "left",
@@ -30,17 +37,14 @@ let columns = [
30
37
  }
31
38
  ]
32
39
 
33
- const router = useRouter();
34
40
  const onCickView = async (id) => {
35
41
  try {
36
42
  if (await m("viewAs", { user_id: id })) {
37
-
38
43
  //redirect to last path
39
44
  window.location.reload();
40
-
41
45
  }
42
46
  } catch (e) {
43
- Dialog.create({
47
+ $q.dialog({
44
48
  title: "Error",
45
49
  message: e.message,
46
50
  color: "negative",
@@ -62,11 +66,11 @@ const filtered = computed(() => {
62
66
  </script>
63
67
  <template>
64
68
  <l-page class="q-gutter-md">
65
- <q-banner >
69
+ <q-banner>
66
70
  Use this page to view the system as another user. This is useful for testing permissions.
67
71
  </q-banner>
68
72
 
69
- <q-table flat :columns="columns" :rows="filtered" :rows-per-page-options="[0]" dense>
73
+ <q-table flat :columns="columns" :rows="filtered" :rows-per-page-options="[0]" dense bordered="">
70
74
  <template v-slot:top-right>
71
75
  <q-input outlined dense debounce="300" v-model="filter" placeholder="Search" clearable>
72
76
  <template v-slot:append>
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { reactive } from 'vue'
2
+ import { reactive, ref } from 'vue'
3
3
  import { getObject, q } from '#imports'
4
4
  const obj = reactive(await getObject(["username", "first_name", "last_name", "email", "phone",
5
5
  "addr1", "addr2", "addr3", "join_date", "expiry_date", "status", "language", "default_page"
@@ -20,7 +20,6 @@ const languages = tt.app.languages.map((lang) => {
20
20
  value: lang.value,
21
21
  };
22
22
  })
23
-
24
23
  </script>
25
24
 
26
25
  <template>
@@ -45,7 +44,8 @@ const languages = tt.app.languages.map((lang) => {
45
44
  <FormKit type="l-date-picker" label="Join date" name="join_date" validation="required" />
46
45
  <FormKit type="l-date-picker" label="Expiry date" name="expiry_date" />
47
46
  <FormKit type="l-select" label="Status" name="status" :options="options" validation="required" />
48
- <FormKit type="l-select" label="Language" name="language" :options="languages" validation="required" />
47
+ <FormKit type="l-select" label="Language" name="language" :options="languages"
48
+ validation="required" />
49
49
  <FormKit type="l-input" label="Default page" name="default_page" />
50
50
  </l-col>
51
51
  </l-row>
@@ -16,6 +16,8 @@ const columns = model("User").columns({
16
16
  has2FA: true,
17
17
  })
18
18
 
19
+ console.log(columns);
20
+
19
21
  const status = ref("0");
20
22
 
21
23
  </script>
@@ -82,22 +82,14 @@ eventLogCols.forEach(col => {
82
82
  </l-col>
83
83
 
84
84
  <l-col md="8">
85
-
86
85
  <l-tabs>
87
- <l-tab label="User Log">
88
- <l-table :rows="my.userLog.data" :columns="userlogColumns" searchable
89
- :rows-per-page-options="[0]">
90
- </l-table>
86
+ <l-tab label="User Log" name="user_log">
87
+ <l-table :rows="my.userLog.data" searchable :columns="userlogColumns" hide-pagination />
91
88
  </l-tab>
92
- <l-tab label="Event Log">
93
- <l-table :rows="my.eventLog.data" :columns="eventLogCols" searchable
94
- :rows-per-page-options="[0]">
95
- </l-table>
89
+ <l-tab label="Event Log" name="event_log">
90
+ <l-table :rows="my.eventLog.data" :columns="eventLogCols" searchable hide-pagination />
96
91
  </l-tab>
97
-
98
92
  </l-tabs>
99
-
100
-
101
93
  </l-col>
102
94
  </l-row>
103
95
 
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { reactive, onMounted, nextTick } from "vue"
3
3
  import { useQuasar } from "quasar";
4
- import { q, m } from '#imports'
4
+ import { q, m, api } from '#imports'
5
5
  const quasar = useQuasar();
6
6
  let { app, my } = await q({ app: ['googleClientId'], my: ["gmail"] })
7
7
 
@@ -79,16 +79,12 @@ const unlink = async () => {
79
79
 
80
80
  <template v-if="app.googleClientId">
81
81
  <q-card-section v-if="my.gmail">
82
- You have already linked your Google account.<br />
83
-
84
- Your gmail is {{ my.gmail }}
85
-
86
-
87
-
88
- <div>
89
- <l-btn label="Unlink" @click="unlink" icon="sym_o_delete"></l-btn>
90
- </div>
82
+ <p>
83
+ You have already linked your Google account.<br />
91
84
 
85
+ Your gmail is {{ my.gmail }}
86
+ </p>
87
+ <l-btn label="Unlink" @click="unlink" icon="sym_o_delete"></l-btn>
92
88
  </q-card-section>
93
89
 
94
90
  <q-card-section v-else>