@hostlink/nuxt-light 1.45.4 → 1.46.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 (38) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/l-fav-menu.vue +11 -2
  3. package/dist/runtime/components/l-list.vue +1 -0
  4. package/dist/runtime/components/l-table.d.vue.ts +4 -2
  5. package/dist/runtime/components/l-table.vue +35 -15
  6. package/dist/runtime/components/l-table.vue.d.ts +4 -2
  7. package/dist/runtime/composables/defineLightModel.d.ts +3 -1
  8. package/dist/runtime/composables/getGQLFields.d.ts +1 -1
  9. package/dist/runtime/composables/getModelField.d.ts +1 -1
  10. package/dist/runtime/composables/getObject.js +5 -1
  11. package/dist/runtime/composables/list.d.ts +1 -1
  12. package/dist/runtime/composables/model.js +8 -18
  13. package/dist/runtime/models/EventLog.d.ts +38 -0
  14. package/dist/runtime/models/EventLog.js +37 -0
  15. package/dist/runtime/models/MailLog.d.ts +34 -0
  16. package/dist/runtime/models/MailLog.js +33 -0
  17. package/dist/runtime/models/SystemValue.d.ts +14 -0
  18. package/dist/runtime/models/SystemValue.js +13 -0
  19. package/dist/runtime/models/User.d.ts +72 -0
  20. package/dist/runtime/models/User.js +90 -0
  21. package/dist/runtime/models/UserLog.d.ts +51 -0
  22. package/dist/runtime/models/UserLog.js +56 -0
  23. package/dist/runtime/pages/User/_user_id/edit.vue +1 -1
  24. package/dist/runtime/pages/User/index.vue +1 -1
  25. package/dist/runtime/plugin.js +12 -12
  26. package/package.json +2 -2
  27. package/dist/runtime/types/EventLog.d.ts +0 -35
  28. package/dist/runtime/types/EventLog.js +0 -34
  29. package/dist/runtime/types/MailLog.d.ts +0 -31
  30. package/dist/runtime/types/MailLog.js +0 -30
  31. package/dist/runtime/types/SystemValue.d.ts +0 -11
  32. package/dist/runtime/types/SystemValue.js +0 -10
  33. package/dist/runtime/types/User.d.ts +0 -60
  34. package/dist/runtime/types/User.js +0 -76
  35. package/dist/runtime/types/UserLog.d.ts +0 -48
  36. package/dist/runtime/types/UserLog.js +0 -53
  37. /package/dist/runtime/{model → models}/CustomField.d.ts +0 -0
  38. /package/dist/runtime/{model → models}/CustomField.js +0 -0
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "light",
3
3
  "configKey": "light",
4
- "version": "1.45.4",
4
+ "version": "1.46.0",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "3.6.1"
@@ -1,8 +1,16 @@
1
1
  <script setup>
2
- import { computed } from "vue";
2
+ import { computed, ref, watch } from "vue";
3
3
  import { useLight } from "#imports";
4
4
  const light = useLight();
5
5
  const props = defineProps(["value", "dense"]);
6
+ const favMenuExpanded = ref(
7
+ typeof window !== "undefined" ? JSON.parse(localStorage.getItem("fav-menu-expanded") || "false") : false
8
+ );
9
+ watch(favMenuExpanded, (newValue) => {
10
+ if (typeof window !== "undefined") {
11
+ localStorage.setItem("fav-menu-expanded", JSON.stringify(newValue));
12
+ }
13
+ });
6
14
  const color1 = computed(() => {
7
15
  return light.getColorValue();
8
16
  });
@@ -18,7 +26,8 @@ const color2 = computed(() => {
18
26
  </style>
19
27
 
20
28
  <template>
21
- <q-expansion-item :label="$t('My favorite')" :dense="dense" icon="sym_o_favorite">
29
+ <q-expansion-item :label="$t('My favorite')" :dense="dense" icon="sym_o_favorite"
30
+ v-model="favMenuExpanded">
22
31
  <q-list class="q-pl-md menu-list" :dense="dense">
23
32
  <q-item v-ripple :to="item.path" v-for="item in value">
24
33
  <q-item-section avatar>
@@ -10,6 +10,7 @@ const props = defineProps({
10
10
  tag: { type: null, required: false }
11
11
  });
12
12
  function getTo(field) {
13
+ console.log(field);
13
14
  const raw = field.getRaw();
14
15
  if (raw.to) {
15
16
  if (raw.to instanceof Function) {
@@ -5,6 +5,7 @@ export interface LTableColumn extends QTableColumn {
5
5
  searchType?: string;
6
6
  searchOptions?: Array<any> | Function;
7
7
  searchMultiple?: boolean;
8
+ searchIndex?: string;
8
9
  gqlField?: string | Array<string> | Object;
9
10
  backgroundColor?: string | Function;
10
11
  searchMethod?: string;
@@ -21,6 +22,7 @@ export type LTableProps = QTableProps & {
21
22
  addComponent?: Dialog;
22
23
  addComponentProps?: any;
23
24
  rows?: Array<any>;
25
+ name?: string;
24
26
  };
25
27
  export interface LTableRequest {
26
28
  sort: string;
@@ -58,11 +60,11 @@ export interface LTableRequest {
58
60
  }) => void;
59
61
  }
60
62
  declare function requestServerInteraction(): void;
61
- declare var __VLS_91: any, __VLS_94: string, __VLS_95: any, __VLS_117: any, __VLS_184: string, __VLS_185: any;
63
+ declare var __VLS_91: any, __VLS_94: string, __VLS_95: any, __VLS_117: any, __VLS_204: string, __VLS_205: any;
62
64
  type __VLS_Slots = {} & {
63
65
  [K in NonNullable<typeof __VLS_94>]?: (props: typeof __VLS_95) => any;
64
66
  } & {
65
- [K in NonNullable<typeof __VLS_184>]?: (props: typeof __VLS_185) => any;
67
+ [K in NonNullable<typeof __VLS_204>]?: (props: typeof __VLS_205) => any;
66
68
  } & {
67
69
  actions?: (props: typeof __VLS_91) => any;
68
70
  } & {
@@ -7,6 +7,7 @@ import model from "../composables/model";
7
7
  import { toQuery } from "@hostlink/light";
8
8
  import { list } from "#imports";
9
9
  import { useI18n } from "vue-i18n";
10
+ import { useStorage } from "@vueuse/core";
10
11
  const $q = useQuasar();
11
12
  const { t } = useI18n();
12
13
  const errors = ref([]);
@@ -75,7 +76,7 @@ const props = defineProps({
75
76
  sortBy: null,
76
77
  descending: true,
77
78
  page: 1,
78
- rowsPerPage: 10
79
+ rowsPerPage: 20
79
80
  };
80
81
  } },
81
82
  rowsPerPageOptions: { type: null, required: false, default: () => [5, 10, 20, 50, 100, 0] },
@@ -100,7 +101,8 @@ const props = defineProps({
100
101
  searchable: { type: Boolean, required: false, default: false },
101
102
  onRequestData: { type: Function, required: false },
102
103
  addComponent: { type: Object, required: false },
103
- addComponentProps: { type: null, required: false }
104
+ addComponentProps: { type: null, required: false },
105
+ name: { type: String, required: false }
104
106
  });
105
107
  const isServerSide = props.rows == void 0;
106
108
  const light = useLight();
@@ -299,21 +301,22 @@ const getFilterValue = () => {
299
301
  props.columns?.forEach((col) => {
300
302
  if (col.searchable) {
301
303
  if (filters[col.name] !== null && filters[col.name] !== "" && filters[col.name] !== void 0) {
304
+ const k = col.searchIndex ?? col.name;
302
305
  if (col.searchType == "number") {
303
- f[col.name] = filters[col.name];
306
+ f[k] = filters[col.name];
304
307
  } else if (col.searchType == "date") {
305
- if (filters[col.name].from) {
306
- f[col.name] = {
308
+ if (filters[k].from) {
309
+ f[k] = {
307
310
  between: [filters[col.name].from, filters[col.name].to]
308
311
  };
309
312
  }
310
313
  } else if (col.searchType == "select") {
311
- f[col.name] = filters[col.name];
314
+ f[k] = filters[col.name];
312
315
  } else {
313
316
  if (col.searchMethod == "equals") {
314
- f[col.name] = filters[col.name];
317
+ f[k] = filters[col.name];
315
318
  } else {
316
- f[col.name] = {
319
+ f[k] = {
317
320
  contains: filters[col.name]
318
321
  };
319
322
  }
@@ -454,11 +457,19 @@ const searchSelectFilter = (val, update, name) => {
454
457
  });
455
458
  }
456
459
  };
460
+ const showTopRight = computed(() => {
461
+ return props.searchable || props.name && (props.columns && props.columns.length > 0);
462
+ });
463
+ const hidableColumns = computed(() => {
464
+ return props.columns?.filter((c) => !c.required) || [];
465
+ });
466
+ const visibleColumns = props.name ? useStorage(`l-table-visible-columns-${props.name}`, hidableColumns.value.map((c) => c.name)) : ref(hidableColumns.value.map((c) => c.name));
457
467
  </script>
458
468
 
459
469
  <template>
460
470
  <q-table v-bind="attrs" :loading="loading" :rows="rows" ref="table" @request="onLocalRequest" :columns="columns"
461
- v-model:pagination="pagination" :filter="filter" v-model:selected="localSelected" :color="$light.color">
471
+ v-model:pagination="pagination" :filter="filter" v-model:selected="localSelected" :color="$light.color"
472
+ :visible-columns="visibleColumns">
462
473
 
463
474
  <template #header="props">
464
475
  <q-tr :props="props">
@@ -544,17 +555,26 @@ const searchSelectFilter = (val, update, name) => {
544
555
  </template>
545
556
 
546
557
 
547
- <template #top-right="props" v-if="searchable">
548
- <q-input v-if="searchable" outlined dense debounce="300" v-model="filter" :placeholder="$t('Search')"
549
- :color="$light.color">
558
+ <template #top-right="props" v-if="showTopRight">
559
+ <q-input outlined dense debounce="300" v-model="filter" :placeholder="$t('Search')" :color="$light.color"
560
+ v-if="searchable">
550
561
  <template v-slot:append>
551
562
  <q-icon name="search" />
552
563
  </template>
553
564
  </q-input>
554
565
 
555
-
556
-
557
-
566
+ <q-icon name="sym_o_view_column" size="sm" class="cursor-pointer" :color="$light.color">
567
+ <q-popup-proxy>
568
+ <q-card>
569
+ <q-card-section>
570
+ <div v-for="column in hidableColumns" :key="column.name" class="q-mb-xs">
571
+ <q-checkbox v-model="visibleColumns" :val="column.name" :label="column.label"
572
+ :color="$light.color" dense />
573
+ </div>
574
+ </q-card-section>
575
+ </q-card>
576
+ </q-popup-proxy>
577
+ </q-icon>
558
578
  </template>
559
579
 
560
580
 
@@ -5,6 +5,7 @@ export interface LTableColumn extends QTableColumn {
5
5
  searchType?: string;
6
6
  searchOptions?: Array<any> | Function;
7
7
  searchMultiple?: boolean;
8
+ searchIndex?: string;
8
9
  gqlField?: string | Array<string> | Object;
9
10
  backgroundColor?: string | Function;
10
11
  searchMethod?: string;
@@ -21,6 +22,7 @@ export type LTableProps = QTableProps & {
21
22
  addComponent?: Dialog;
22
23
  addComponentProps?: any;
23
24
  rows?: Array<any>;
25
+ name?: string;
24
26
  };
25
27
  export interface LTableRequest {
26
28
  sort: string;
@@ -58,11 +60,11 @@ export interface LTableRequest {
58
60
  }) => void;
59
61
  }
60
62
  declare function requestServerInteraction(): void;
61
- declare var __VLS_91: any, __VLS_94: string, __VLS_95: any, __VLS_117: any, __VLS_184: string, __VLS_185: any;
63
+ declare var __VLS_91: any, __VLS_94: string, __VLS_95: any, __VLS_117: any, __VLS_204: string, __VLS_205: any;
62
64
  type __VLS_Slots = {} & {
63
65
  [K in NonNullable<typeof __VLS_94>]?: (props: typeof __VLS_95) => any;
64
66
  } & {
65
- [K in NonNullable<typeof __VLS_184>]?: (props: typeof __VLS_185) => any;
67
+ [K in NonNullable<typeof __VLS_204>]?: (props: typeof __VLS_205) => any;
66
68
  } & {
67
69
  actions?: (props: typeof __VLS_91) => any;
68
70
  } & {
@@ -1,8 +1,9 @@
1
1
  import type { Component } from "vue";
2
+ import { type Field } from "@hostlink/light";
2
3
  export interface LightModelGqlField {
3
4
  [key: string]: string | LightModelGqlField | boolean;
4
5
  }
5
- export interface LightModelField {
6
+ export interface LightModelField extends Field {
6
7
  label: string;
7
8
  sortable?: boolean;
8
9
  searchable?: boolean;
@@ -17,6 +18,7 @@ export interface LightModelField {
17
18
  format?: (value: any) => any;
18
19
  style?: any;
19
20
  align?: "left" | "center" | "right";
21
+ searchOptions?: Record<string, any>[];
20
22
  }
21
23
  export interface LightModelFields {
22
24
  [key: string]: LightModelField;
@@ -1,2 +1,2 @@
1
- declare const _default: (name: string, fields: string[]) => any[];
1
+ declare const _default: (name: string, fields: string[]) => Record<string, any>;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: (name: string, field: string) => import("@hostlink/light").ModelField | null;
1
+ declare const _default: (name: string, field: string) => import("@hostlink/light").Field | null;
2
2
  export default _default;
@@ -19,7 +19,11 @@ export default async function(fields = []) {
19
19
  if (typeof field == "string") {
20
20
  const f = getModelField(module, field);
21
21
  if (f) {
22
- return f.getGQLField();
22
+ if (f.gqlField) {
23
+ return f.gqlField;
24
+ } else {
25
+ return field;
26
+ }
23
27
  }
24
28
  }
25
29
  return field;
@@ -1,3 +1,3 @@
1
1
  import { default as api } from "./api.js";
2
- declare const _default: (name: string, fields: Object) => ReturnType<typeof api.list>;
2
+ declare const _default: (name: string, fields: Record<string, any>) => ReturnType<typeof api.list>;
3
3
  export default _default;
@@ -1,26 +1,16 @@
1
1
  import { default as api } from "./api.js";
2
2
  export default (name) => {
3
- const m = api.model(name);
3
+ const m = api.models.get(name);
4
4
  return Object.assign(m, {
5
5
  columns(fields) {
6
6
  let columns = [];
7
- if (Array.isArray(fields)) {
8
- for (let f of fields) {
9
- const field = m.field(f);
10
- if (!field) continue;
11
- const option = field.getRaw();
12
- option.name = field.getName();
13
- columns.push(option);
14
- }
15
- } else {
16
- for (let f in fields) {
17
- if (!fields[f]) continue;
18
- const field = m.field(f);
19
- if (!field) continue;
20
- const option = field.getRaw();
21
- option.name = field.getName();
22
- columns.push(option);
23
- }
7
+ const fs = Array.isArray(fields) ? fields : Object.keys(fields);
8
+ for (let f of fs) {
9
+ const field = m.field(f);
10
+ if (!field) continue;
11
+ const option = field;
12
+ option.name = field.name ?? f;
13
+ columns.push(option);
24
14
  }
25
15
  return columns;
26
16
  }
@@ -0,0 +1,38 @@
1
+ declare const _default: {
2
+ name: string;
3
+ fields: {
4
+ eventlog_id: {
5
+ label: string;
6
+ sortable: boolean;
7
+ searchable: boolean;
8
+ autoWidth: boolean;
9
+ };
10
+ class: {
11
+ label: string;
12
+ sortable: boolean;
13
+ searchable: boolean;
14
+ };
15
+ id: {
16
+ label: string;
17
+ sortable: boolean;
18
+ searchable: boolean;
19
+ };
20
+ action: {
21
+ label: string;
22
+ sortable: boolean;
23
+ searchable: boolean;
24
+ };
25
+ created_time: {
26
+ label: string;
27
+ sortable: boolean;
28
+ searchable: boolean;
29
+ searchType: string;
30
+ };
31
+ username: {
32
+ label: string;
33
+ sortable: boolean;
34
+ searchable: boolean;
35
+ };
36
+ };
37
+ };
38
+ export default _default;
@@ -0,0 +1,37 @@
1
+ export default {
2
+ name: "EventLog",
3
+ fields: {
4
+ eventlog_id: {
5
+ label: "EventLog ID",
6
+ sortable: true,
7
+ searchable: true,
8
+ autoWidth: true
9
+ },
10
+ class: {
11
+ label: "Class",
12
+ sortable: true,
13
+ searchable: true
14
+ },
15
+ id: {
16
+ label: "ID",
17
+ sortable: true,
18
+ searchable: true
19
+ },
20
+ action: {
21
+ label: "Action",
22
+ sortable: true,
23
+ searchable: true
24
+ },
25
+ created_time: {
26
+ label: "Created time",
27
+ sortable: true,
28
+ searchable: true,
29
+ searchType: "date"
30
+ },
31
+ username: {
32
+ label: "Username",
33
+ sortable: true,
34
+ searchable: true
35
+ }
36
+ }
37
+ };
@@ -0,0 +1,34 @@
1
+ declare const _default: {
2
+ name: string;
3
+ fields: {
4
+ maillog_id: {
5
+ label: string;
6
+ sortable: boolean;
7
+ searchable: boolean;
8
+ searchType: string;
9
+ autoWidth: boolean;
10
+ };
11
+ from: {
12
+ label: string;
13
+ sortable: boolean;
14
+ searchable: boolean;
15
+ };
16
+ to: {
17
+ label: string;
18
+ sortable: boolean;
19
+ searchable: boolean;
20
+ };
21
+ subject: {
22
+ label: string;
23
+ sortable: boolean;
24
+ searchable: boolean;
25
+ };
26
+ created_time: {
27
+ label: string;
28
+ sortable: boolean;
29
+ searchable: boolean;
30
+ searchType: string;
31
+ };
32
+ };
33
+ };
34
+ export default _default;
@@ -0,0 +1,33 @@
1
+ export default {
2
+ name: "MailLog",
3
+ fields: {
4
+ maillog_id: {
5
+ label: "ID",
6
+ sortable: true,
7
+ searchable: true,
8
+ searchType: "number",
9
+ autoWidth: true
10
+ },
11
+ from: {
12
+ label: "From",
13
+ sortable: true,
14
+ searchable: true
15
+ },
16
+ to: {
17
+ label: "To",
18
+ sortable: true,
19
+ searchable: true
20
+ },
21
+ subject: {
22
+ label: "Subject",
23
+ sortable: true,
24
+ searchable: true
25
+ },
26
+ created_time: {
27
+ label: "Created time",
28
+ sortable: true,
29
+ searchable: true,
30
+ searchType: "date"
31
+ }
32
+ }
33
+ };
@@ -0,0 +1,14 @@
1
+ declare const _default: {
2
+ name: string;
3
+ fields: {
4
+ name: {
5
+ label: string;
6
+ sortable: boolean;
7
+ searchable: boolean;
8
+ };
9
+ value: {
10
+ label: string;
11
+ };
12
+ };
13
+ };
14
+ export default _default;
@@ -0,0 +1,13 @@
1
+ export default {
2
+ name: "SystemValue",
3
+ fields: {
4
+ name: {
5
+ label: "Name",
6
+ sortable: true,
7
+ searchable: true
8
+ },
9
+ value: {
10
+ label: "Value"
11
+ }
12
+ }
13
+ };
@@ -0,0 +1,72 @@
1
+ declare const _default: {
2
+ name: string;
3
+ fields: {
4
+ Name: {
5
+ label: string;
6
+ gql: {
7
+ first_name: boolean;
8
+ last_name: boolean;
9
+ };
10
+ format: (row: any) => string;
11
+ };
12
+ username: {
13
+ label: string;
14
+ sortable: boolean;
15
+ searchable: boolean;
16
+ required: boolean;
17
+ };
18
+ first_name: {
19
+ label: string;
20
+ sortable: boolean;
21
+ searchable: boolean;
22
+ };
23
+ last_name: {
24
+ label: string;
25
+ sortable: boolean;
26
+ searchable: boolean;
27
+ };
28
+ email: {
29
+ label: string;
30
+ sortable: boolean;
31
+ searchable: boolean;
32
+ };
33
+ phone: {
34
+ label: string;
35
+ sortable: boolean;
36
+ searchable: boolean;
37
+ };
38
+ join_date: {
39
+ label: string;
40
+ sortable: boolean;
41
+ searchable: boolean;
42
+ searchType: string;
43
+ };
44
+ roles: {
45
+ label: string;
46
+ format: (value: any) => any;
47
+ };
48
+ status: {
49
+ label: string;
50
+ searchable: boolean;
51
+ searchType: string;
52
+ searchOptions: {
53
+ label: string;
54
+ value: number;
55
+ }[];
56
+ format: (value: any) => string;
57
+ };
58
+ has2FA: {
59
+ label: string;
60
+ searchType: string;
61
+ format: (value: any) => "" | "✔️";
62
+ };
63
+ _test2: {
64
+ label: string;
65
+ component: any;
66
+ componentProps: (a: any) => {
67
+ test: any;
68
+ };
69
+ };
70
+ };
71
+ };
72
+ export default _default;
@@ -0,0 +1,90 @@
1
+ import MyTest from "../components/MyTest.vue";
2
+ export default {
3
+ name: "User",
4
+ fields: {
5
+ Name: {
6
+ label: "Name",
7
+ gql: {
8
+ first_name: true,
9
+ last_name: true
10
+ },
11
+ format: (row) => {
12
+ return row.first_name + " " + row.last_name;
13
+ }
14
+ },
15
+ username: {
16
+ label: "Username",
17
+ sortable: true,
18
+ searchable: true,
19
+ required: true
20
+ //cellClass: (row: any) => (row.username == "admin" ? "text-danger" : ""),
21
+ /* backgroundColor: (row: any) => {
22
+
23
+
24
+ if (row.username == "admin") {
25
+ return "red";
26
+ } else {
27
+ return "white";
28
+ }
29
+ } */
30
+ },
31
+ first_name: {
32
+ label: "First name",
33
+ sortable: true,
34
+ searchable: true
35
+ },
36
+ last_name: {
37
+ label: "Last name",
38
+ sortable: true,
39
+ searchable: true
40
+ },
41
+ email: {
42
+ label: "Email",
43
+ sortable: true,
44
+ searchable: true
45
+ },
46
+ phone: {
47
+ label: "Phone",
48
+ sortable: true,
49
+ searchable: true
50
+ },
51
+ join_date: {
52
+ label: "Join date",
53
+ sortable: true,
54
+ searchable: true,
55
+ searchType: "date"
56
+ },
57
+ roles: {
58
+ label: "Roles",
59
+ format: (value) => value.join(", ")
60
+ },
61
+ status: {
62
+ label: "Status",
63
+ searchable: true,
64
+ searchType: "select",
65
+ searchOptions: [
66
+ { label: "Active", value: 0 },
67
+ { label: "Inactive", value: 1 }
68
+ ],
69
+ format: (value) => {
70
+ return ["Active", "Inactive"][value];
71
+ }
72
+ },
73
+ has2FA: {
74
+ label: "2FA",
75
+ searchType: "select",
76
+ format: (value) => {
77
+ return value ? "\u2714\uFE0F" : "";
78
+ }
79
+ },
80
+ _test2: {
81
+ label: "Test",
82
+ component: MyTest,
83
+ componentProps: (a) => {
84
+ return {
85
+ test: a.username
86
+ };
87
+ }
88
+ }
89
+ }
90
+ };
@@ -0,0 +1,51 @@
1
+ declare const _default: {
2
+ name: string;
3
+ fields: {
4
+ userlog_id: {
5
+ label: string;
6
+ sortable: boolean;
7
+ searchable: boolean;
8
+ autoWidth: boolean;
9
+ };
10
+ username: {
11
+ label: string;
12
+ sortable: boolean;
13
+ searchable: boolean;
14
+ };
15
+ login_dt: {
16
+ label: string;
17
+ sortable: boolean;
18
+ searchable: boolean;
19
+ searchType: string;
20
+ };
21
+ logout_dt: {
22
+ label: string;
23
+ sortable: boolean;
24
+ searchable: boolean;
25
+ };
26
+ result: {
27
+ label: string;
28
+ sortable: boolean;
29
+ searchable: boolean;
30
+ searchType: string;
31
+ searchOptions: {
32
+ label: string;
33
+ value: string;
34
+ }[];
35
+ autoWidth: boolean;
36
+ };
37
+ user_agent: {
38
+ label: string;
39
+ sortable: boolean;
40
+ searchable: boolean;
41
+ whiteSpace: string;
42
+ };
43
+ last_access_time: {
44
+ label: string;
45
+ sortable: boolean;
46
+ searchable: boolean;
47
+ searchType: string;
48
+ };
49
+ };
50
+ };
51
+ export default _default;
@@ -0,0 +1,56 @@
1
+ export default {
2
+ name: "UserLog",
3
+ fields: {
4
+ userlog_id: {
5
+ label: "ID",
6
+ sortable: true,
7
+ searchable: true,
8
+ autoWidth: true
9
+ },
10
+ username: {
11
+ label: "User",
12
+ sortable: true,
13
+ searchable: true
14
+ },
15
+ login_dt: {
16
+ label: "Login time",
17
+ sortable: true,
18
+ searchable: true,
19
+ searchType: "date"
20
+ },
21
+ logout_dt: {
22
+ label: "Logout time",
23
+ sortable: true,
24
+ searchable: true
25
+ },
26
+ result: {
27
+ label: "Result",
28
+ sortable: true,
29
+ searchable: true,
30
+ searchType: "select",
31
+ searchOptions: [
32
+ {
33
+ label: "SUCCESS",
34
+ value: "SUCCESS"
35
+ },
36
+ {
37
+ label: "FAIL",
38
+ value: "FAIL"
39
+ }
40
+ ],
41
+ autoWidth: true
42
+ },
43
+ user_agent: {
44
+ label: "User agent",
45
+ sortable: true,
46
+ searchable: true,
47
+ whiteSpace: "pre-line"
48
+ },
49
+ last_access_time: {
50
+ label: "Last access time",
51
+ sortable: true,
52
+ searchable: true,
53
+ searchType: "date"
54
+ }
55
+ }
56
+ };
@@ -34,7 +34,7 @@ const languages = tt.app.languages.map((lang) => {
34
34
  <template>
35
35
  <l-page>
36
36
  <FormKit type="l-form" :value="obj" gutter="none">
37
- <l-row>
37
+ <l-row class="col col-12">
38
38
  <l-col md="6">
39
39
  <FormKit type="l-input" label="Username" name="username" validation="required" />
40
40
  <FormKit type="l-input" label="First name" name="first_name" validation="required" />
@@ -22,7 +22,7 @@ const columns = model("User").columns({
22
22
  <l-tabs route>
23
23
  <l-tab label="Active" name="active">
24
24
  <l-table ref="table" row-key="user_id" @request-data="onRequest" :columns="columns"
25
- :actions="['view', 'edit', 'delete']"></l-table>
25
+ :actions="['view', 'edit', 'delete']" name="user-index-active"></l-table>
26
26
  </l-tab>
27
27
  <l-tab label="Inactive" name="inactive">
28
28
  <l-table row-key="user_id" @request-data="onRequest" :columns="columns"
@@ -14,12 +14,12 @@ import { createLightPlugin } from "./formkit/index.js";
14
14
  import { plugin, defaultConfig } from "@formkit/vue";
15
15
  import getApiBase from "./composables/getApiBase.js";
16
16
  import useLight from "./composables/useLight.js";
17
- import TypeUser from "./types/User.js";
18
- import TypeUserLog from "./types/UserLog.js";
19
- import TypeSystemValue from "./types/SystemValue.js";
20
- import TypeMailLog from "./types/MailLog.js";
21
- import TypeEventLog from "./types/EventLog.js";
22
- import TypeCustomerField from "./model/CustomField.js";
17
+ import TypeUser from "./models/User.js";
18
+ import TypeUserLog from "./models/UserLog.js";
19
+ import TypeSystemValue from "./models/SystemValue.js";
20
+ import TypeMailLog from "./models/MailLog.js";
21
+ import TypeEventLog from "./models/EventLog.js";
22
+ import TypeCustomerField from "./models/CustomField.js";
23
23
  import { zhTW } from "@formkit/i18n";
24
24
  export default defineNuxtPlugin((nuxtApp) => {
25
25
  addRouteMiddleware("auth", async (to, from) => {
@@ -44,12 +44,12 @@ export default defineNuxtPlugin((nuxtApp) => {
44
44
  }
45
45
  }, { global: true });
46
46
  api.axios.defaults.baseURL = getApiBase();
47
- api.models.create(TypeCustomerField.name, TypeCustomerField.fields);
48
- api.models.create("User", TypeUser);
49
- api.models.create("UserLog", TypeUserLog);
50
- api.models.create("SystemValue", TypeSystemValue);
51
- api.models.create("MailLog", TypeMailLog);
52
- api.models.create("EventLog", TypeEventLog);
47
+ api.models.create("CustomField", TypeCustomerField.fields);
48
+ api.models.create("User", TypeUser.fields);
49
+ api.models.create("UserLog", TypeUserLog.fields);
50
+ api.models.create("SystemValue", TypeSystemValue.fields);
51
+ api.models.create("MailLog", TypeMailLog.fields);
52
+ api.models.create("EventLog", TypeEventLog.fields);
53
53
  api.model("MailLog").setDataPath("app.listMailLog");
54
54
  api.model("EventLog").setDataPath("app.listEventLog");
55
55
  api.model("User").setDataPath("app.listUser");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostlink/nuxt-light",
3
- "version": "1.45.4",
3
+ "version": "1.46.0",
4
4
  "description": "HostLink Nuxt Light Framework",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "@azure/msal-browser": "^3.26.1",
34
34
  "@formkit/drag-and-drop": "^0.5.3",
35
- "@hostlink/light": "^2.11.2",
35
+ "@hostlink/light": "^2.13.2",
36
36
  "@nuxt/module-builder": "^1.0.1",
37
37
  "@quasar/extras": "^1.17.0",
38
38
  "@quasar/quasar-ui-qmarkdown": "^2.0.5",
@@ -1,35 +0,0 @@
1
- declare const _default: {
2
- eventlog_id: {
3
- label: string;
4
- sortable: boolean;
5
- searchable: boolean;
6
- autoWidth: boolean;
7
- };
8
- class: {
9
- label: string;
10
- sortable: boolean;
11
- searchable: boolean;
12
- };
13
- id: {
14
- label: string;
15
- sortable: boolean;
16
- searchable: boolean;
17
- };
18
- action: {
19
- label: string;
20
- sortable: boolean;
21
- searchable: boolean;
22
- };
23
- created_time: {
24
- label: string;
25
- sortable: boolean;
26
- searchable: boolean;
27
- searchType: string;
28
- };
29
- username: {
30
- label: string;
31
- sortable: boolean;
32
- searchable: boolean;
33
- };
34
- };
35
- export default _default;
@@ -1,34 +0,0 @@
1
- export default {
2
- eventlog_id: {
3
- label: "EventLog ID",
4
- sortable: true,
5
- searchable: true,
6
- autoWidth: true
7
- },
8
- class: {
9
- label: "Class",
10
- sortable: true,
11
- searchable: true
12
- },
13
- id: {
14
- label: "ID",
15
- sortable: true,
16
- searchable: true
17
- },
18
- action: {
19
- label: "Action",
20
- sortable: true,
21
- searchable: true
22
- },
23
- created_time: {
24
- label: "Created time",
25
- sortable: true,
26
- searchable: true,
27
- searchType: "date"
28
- },
29
- username: {
30
- label: "Username",
31
- sortable: true,
32
- searchable: true
33
- }
34
- };
@@ -1,31 +0,0 @@
1
- declare const _default: {
2
- maillog_id: {
3
- label: string;
4
- sortable: boolean;
5
- searchable: boolean;
6
- searchType: string;
7
- autoWidth: boolean;
8
- };
9
- from: {
10
- label: string;
11
- sortable: boolean;
12
- searchable: boolean;
13
- };
14
- to: {
15
- label: string;
16
- sortable: boolean;
17
- searchable: boolean;
18
- };
19
- subject: {
20
- label: string;
21
- sortable: boolean;
22
- searchable: boolean;
23
- };
24
- created_time: {
25
- label: string;
26
- sortable: boolean;
27
- searchable: boolean;
28
- searchType: string;
29
- };
30
- };
31
- export default _default;
@@ -1,30 +0,0 @@
1
- export default {
2
- maillog_id: {
3
- label: "ID",
4
- sortable: true,
5
- searchable: true,
6
- searchType: "number",
7
- autoWidth: true
8
- },
9
- from: {
10
- label: "From",
11
- sortable: true,
12
- searchable: true
13
- },
14
- to: {
15
- label: "To",
16
- sortable: true,
17
- searchable: true
18
- },
19
- subject: {
20
- label: "Subject",
21
- sortable: true,
22
- searchable: true
23
- },
24
- created_time: {
25
- label: "Created time",
26
- sortable: true,
27
- searchable: true,
28
- searchType: "date"
29
- }
30
- };
@@ -1,11 +0,0 @@
1
- declare const _default: {
2
- name: {
3
- label: string;
4
- sortable: boolean;
5
- searchable: boolean;
6
- };
7
- value: {
8
- label: string;
9
- };
10
- };
11
- export default _default;
@@ -1,10 +0,0 @@
1
- export default {
2
- name: {
3
- label: "Name",
4
- sortable: true,
5
- searchable: true
6
- },
7
- value: {
8
- label: "Value"
9
- }
10
- };
@@ -1,60 +0,0 @@
1
- declare const _default: {
2
- username: {
3
- label: string;
4
- sortable: boolean;
5
- searchable: boolean;
6
- };
7
- first_name: {
8
- label: string;
9
- sortable: boolean;
10
- searchable: boolean;
11
- };
12
- last_name: {
13
- label: string;
14
- sortable: boolean;
15
- searchable: boolean;
16
- };
17
- email: {
18
- label: string;
19
- sortable: boolean;
20
- searchable: boolean;
21
- };
22
- phone: {
23
- label: string;
24
- sortable: boolean;
25
- searchable: boolean;
26
- };
27
- join_date: {
28
- label: string;
29
- sortable: boolean;
30
- searchable: boolean;
31
- searchType: string;
32
- };
33
- roles: {
34
- label: string;
35
- format: (value: any) => any;
36
- };
37
- status: {
38
- label: string;
39
- searchable: boolean;
40
- searchType: string;
41
- searchOptions: {
42
- label: string;
43
- value: number;
44
- }[];
45
- format: (value: any) => string;
46
- };
47
- has2FA: {
48
- label: string;
49
- searchType: string;
50
- format: (value: any) => "" | "✔️";
51
- };
52
- _test: {
53
- label: string;
54
- component: any;
55
- componentProps: (a: any) => {
56
- test: any;
57
- };
58
- };
59
- };
60
- export default _default;
@@ -1,76 +0,0 @@
1
- import MyTest from "../components/MyTest.vue";
2
- export default {
3
- username: {
4
- label: "Username",
5
- sortable: true,
6
- searchable: true
7
- //cellClass: (row: any) => (row.username == "admin" ? "text-danger" : ""),
8
- /* backgroundColor: (row: any) => {
9
-
10
-
11
- if (row.username == "admin") {
12
- return "red";
13
- } else {
14
- return "white";
15
- }
16
- } */
17
- },
18
- first_name: {
19
- label: "First name",
20
- sortable: true,
21
- searchable: true
22
- },
23
- last_name: {
24
- label: "Last name",
25
- sortable: true,
26
- searchable: true
27
- },
28
- email: {
29
- label: "Email",
30
- sortable: true,
31
- searchable: true
32
- },
33
- phone: {
34
- label: "Phone",
35
- sortable: true,
36
- searchable: true
37
- },
38
- join_date: {
39
- label: "Join date",
40
- sortable: true,
41
- searchable: true,
42
- searchType: "date"
43
- },
44
- roles: {
45
- label: "Roles",
46
- format: (value) => value.join(", ")
47
- },
48
- status: {
49
- label: "Status",
50
- searchable: true,
51
- searchType: "select",
52
- searchOptions: [
53
- { label: "Active", value: 0 },
54
- { label: "Inactive", value: 1 }
55
- ],
56
- format: (value) => {
57
- return ["Active", "Inactive"][value];
58
- }
59
- },
60
- has2FA: {
61
- label: "2FA",
62
- searchType: "select",
63
- format: (value) => {
64
- return value ? "\u2714\uFE0F" : "";
65
- }
66
- },
67
- _test: {
68
- label: "Test",
69
- component: MyTest,
70
- componentProps: (a) => {
71
- return {
72
- test: a.username
73
- };
74
- }
75
- }
76
- };
@@ -1,48 +0,0 @@
1
- declare const _default: {
2
- userlog_id: {
3
- label: string;
4
- sortable: boolean;
5
- searchable: boolean;
6
- autoWidth: boolean;
7
- };
8
- username: {
9
- label: string;
10
- sortable: boolean;
11
- searchable: boolean;
12
- };
13
- login_dt: {
14
- label: string;
15
- sortable: boolean;
16
- searchable: boolean;
17
- searchType: string;
18
- };
19
- logout_dt: {
20
- label: string;
21
- sortable: boolean;
22
- searchable: boolean;
23
- };
24
- result: {
25
- label: string;
26
- sortable: boolean;
27
- searchable: boolean;
28
- searchType: string;
29
- searchOptions: {
30
- label: string;
31
- value: string;
32
- }[];
33
- autoWidth: boolean;
34
- };
35
- user_agent: {
36
- label: string;
37
- sortable: boolean;
38
- searchable: boolean;
39
- whiteSpace: string;
40
- };
41
- last_access_time: {
42
- label: string;
43
- sortable: boolean;
44
- searchable: boolean;
45
- searchType: string;
46
- };
47
- };
48
- export default _default;
@@ -1,53 +0,0 @@
1
- export default {
2
- userlog_id: {
3
- label: "ID",
4
- sortable: true,
5
- searchable: true,
6
- autoWidth: true
7
- },
8
- username: {
9
- label: "User",
10
- sortable: true,
11
- searchable: true
12
- },
13
- login_dt: {
14
- label: "Login time",
15
- sortable: true,
16
- searchable: true,
17
- searchType: "date"
18
- },
19
- logout_dt: {
20
- label: "Logout time",
21
- sortable: true,
22
- searchable: true
23
- },
24
- result: {
25
- label: "Result",
26
- sortable: true,
27
- searchable: true,
28
- searchType: "select",
29
- searchOptions: [
30
- {
31
- label: "SUCCESS",
32
- value: "SUCCESS"
33
- },
34
- {
35
- label: "FAIL",
36
- value: "FAIL"
37
- }
38
- ],
39
- autoWidth: true
40
- },
41
- user_agent: {
42
- label: "User agent",
43
- sortable: true,
44
- searchable: true,
45
- whiteSpace: "pre-line"
46
- },
47
- last_access_time: {
48
- label: "Last access time",
49
- sortable: true,
50
- searchable: true,
51
- searchType: "date"
52
- }
53
- };
File without changes
File without changes