@hostlink/nuxt-light 1.22.3 → 1.23.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.
- package/dist/module.json +1 -1
- package/dist/module.mjs +15 -0
- package/dist/runtime/components/L/CustomField/Add.vue +94 -0
- package/dist/runtime/components/L/CustomField/List.vue +35 -0
- package/dist/runtime/components/L/System/Setting/developer.vue +20 -3
- package/dist/runtime/components/L/ValidationInput.vue +105 -0
- package/dist/runtime/components/l-date-picker.vue +4 -0
- package/dist/runtime/components/l-input.vue +1 -1
- package/dist/runtime/components/l-table.vue +1 -1
- package/dist/runtime/components/l-time-picker.vue +4 -0
- package/dist/runtime/formkit/DatePicker.vue +4 -0
- package/dist/runtime/formkit/Input.vue +4 -0
- package/dist/runtime/formkit/Repeater.vue +35 -38
- package/dist/runtime/formkit/TimePicker.vue +4 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/light.d.ts +6 -1123
- package/dist/runtime/model/CustomField.d.ts +26 -0
- package/dist/runtime/model/CustomField.js +25 -0
- package/dist/runtime/pages/CustomField/[custom_field_id]/edit.vue +64 -0
- package/dist/runtime/pages/CustomField/index.vue +43 -0
- package/dist/runtime/pages/Role/add2.vue +68 -0
- package/dist/runtime/pages/System/database/table.vue +2 -2
- package/dist/runtime/pages/System/setting.vue +3 -0
- package/dist/runtime/plugin.js +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
name: string;
|
|
3
|
+
fields: {
|
|
4
|
+
name: {
|
|
5
|
+
label: string;
|
|
6
|
+
sortable: boolean;
|
|
7
|
+
searchable: boolean;
|
|
8
|
+
};
|
|
9
|
+
model: {
|
|
10
|
+
label: string;
|
|
11
|
+
sortable: boolean;
|
|
12
|
+
searchable: boolean;
|
|
13
|
+
};
|
|
14
|
+
type: {
|
|
15
|
+
label: string;
|
|
16
|
+
sortable: boolean;
|
|
17
|
+
searchable: boolean;
|
|
18
|
+
};
|
|
19
|
+
validation: {
|
|
20
|
+
label: string;
|
|
21
|
+
sortable: boolean;
|
|
22
|
+
searchable: boolean;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export default _default;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "CustomField",
|
|
3
|
+
fields: {
|
|
4
|
+
name: {
|
|
5
|
+
label: "Name",
|
|
6
|
+
sortable: true,
|
|
7
|
+
searchable: true
|
|
8
|
+
},
|
|
9
|
+
model: {
|
|
10
|
+
label: "Model",
|
|
11
|
+
sortable: true,
|
|
12
|
+
searchable: true
|
|
13
|
+
},
|
|
14
|
+
type: {
|
|
15
|
+
label: "Type",
|
|
16
|
+
sortable: true,
|
|
17
|
+
searchable: true
|
|
18
|
+
},
|
|
19
|
+
validation: {
|
|
20
|
+
label: "Validation",
|
|
21
|
+
sortable: true,
|
|
22
|
+
searchable: true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { getObject, q } from "#imports"
|
|
3
|
+
import { ref } from "vue"
|
|
4
|
+
|
|
5
|
+
const obj = await getObject(["name", "model", "validation", "type", "label", "options", "default_value", "placeholder", "order", "help"]);
|
|
6
|
+
const types = [
|
|
7
|
+
{ label: 'Text', value: 'text' },
|
|
8
|
+
{ label: 'Textarea', value: 'textarea' },
|
|
9
|
+
{ label: 'Select', value: 'select' },
|
|
10
|
+
{ label: 'Date', value: 'date' },
|
|
11
|
+
{ label: 'Time', value: 'time' }
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
const { app } = await q({
|
|
15
|
+
app: {
|
|
16
|
+
customFieldModels: true
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
const up = (v) => {
|
|
20
|
+
console.log(v)
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
const v = ref("required")
|
|
24
|
+
</script>
|
|
25
|
+
<template>
|
|
26
|
+
<l-page>
|
|
27
|
+
|
|
28
|
+
<form-kit type="l-form" :value="obj" #default="{ value, node }">
|
|
29
|
+
<form-kit type="l-input" name="name" label="Name" validation="required" />
|
|
30
|
+
|
|
31
|
+
<form-kit type="l-select" name="model" label="Model" :options="app.customFieldModels"
|
|
32
|
+
validation="required" />
|
|
33
|
+
|
|
34
|
+
<form-kit type="l-select" name="type" label="Type" :options="types" validation="required" />
|
|
35
|
+
|
|
36
|
+
<form-kit type="hidden" name="validation" />
|
|
37
|
+
<l-validation-input v-model="value.validation" @update:model-value="node.at('validation').input($event)"
|
|
38
|
+
:type="value.type" />
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
<form-kit type="l-input" name="label" label="Label" validation="required" />
|
|
42
|
+
<form-kit type="hidden" name="options" />
|
|
43
|
+
<template v-if="value.type === 'select'">
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<q-select label="Options" v-model="value.options" @update:model-value="node.at('options').input($event)"
|
|
47
|
+
use-input use-chips multiple hide-dropdown-icon input-debounce="0" new-value-mode="add-unique"
|
|
48
|
+
stack-label outlined placeholder="Press enter to add new option" :color="$light.color" />
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<form-kit type="l-input" name="default_value" label="Default Value" />
|
|
52
|
+
|
|
53
|
+
<form-kit type="l-input" name="placeholder" label="Placeholder" />
|
|
54
|
+
|
|
55
|
+
<form-kit type="l-input" input-type="number" name="order" label="Order" number />
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
<form-kit type="l-input" name="help" label="Help" />
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
</form-kit>
|
|
63
|
+
</l-page>
|
|
64
|
+
</template>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { model, q } from '#imports'
|
|
3
|
+
import { resolveComponent } from 'vue';
|
|
4
|
+
|
|
5
|
+
const onRequest = async (request) => {
|
|
6
|
+
request.loadObjects("CustomField")
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const { app } = await q({
|
|
11
|
+
app: {
|
|
12
|
+
customFieldModels: true
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const columns = model("CustomField").columns({
|
|
17
|
+
name: true,
|
|
18
|
+
model: true,
|
|
19
|
+
type: true,
|
|
20
|
+
validation: true,
|
|
21
|
+
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const addComponent = await resolveComponent('l-custom-field-add')
|
|
25
|
+
|
|
26
|
+
</script>
|
|
27
|
+
<template>
|
|
28
|
+
|
|
29
|
+
<l-page>
|
|
30
|
+
<p>
|
|
31
|
+
Customize your Models with your own fields. Make sure to use the below added fields on the address formats
|
|
32
|
+
on Customization settings page.
|
|
33
|
+
</p>
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
<l-table row-key="custom_field_id" @request-data="onRequest" :columns="columns" :add-component="addComponent" :add-component-props="{
|
|
37
|
+
models: app.customFieldModels
|
|
38
|
+
}" :actions="['edit', 'delete']">
|
|
39
|
+
</l-table>
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
</l-page>
|
|
43
|
+
</template>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { m, api } from '#imports'
|
|
3
|
+
import { collect } from 'collect.js';
|
|
4
|
+
const { app } = await api.query({
|
|
5
|
+
app: {
|
|
6
|
+
permissions: true,
|
|
7
|
+
}
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
//remove *
|
|
11
|
+
app.permissions = app.permissions.filter(permission => permission != '*');
|
|
12
|
+
|
|
13
|
+
//app.permisssions is array of string like ['config.view', 'config.edit', 'config.delete','customer.view', 'customer.edit', 'customer.delete']
|
|
14
|
+
|
|
15
|
+
//group it by first part of string
|
|
16
|
+
const g = collect(app.permissions).groupBy(permission => permission.split('.')[0]).all()
|
|
17
|
+
|
|
18
|
+
//map g to [{ module: 'config', permissions: ['config.view', 'config.edit', 'config.delete'] }, { module: 'customer', permissions: ['customer.view', 'customer.edit', 'customer.delete'] }]
|
|
19
|
+
|
|
20
|
+
const x = Object.keys(g).map(module => {
|
|
21
|
+
return {
|
|
22
|
+
module,
|
|
23
|
+
permissions: collect(g[module]).map(permission => {
|
|
24
|
+
return {
|
|
25
|
+
label: permission,
|
|
26
|
+
value: permission
|
|
27
|
+
}
|
|
28
|
+
}).all()
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
const onSubmit = () => {
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
</script>
|
|
37
|
+
<template>
|
|
38
|
+
<l-page>
|
|
39
|
+
|
|
40
|
+
<form-kit type="l-form" @submit="onSubmit" :value="{
|
|
41
|
+
permissions: []
|
|
42
|
+
}" #default="{ value }">
|
|
43
|
+
<form-kit type="l-input" name="name" label="Name" validation="required" />
|
|
44
|
+
<q-separator />
|
|
45
|
+
|
|
46
|
+
<l-row>
|
|
47
|
+
<l-col md="3" v-for="module in x" :key="module.module">
|
|
48
|
+
|
|
49
|
+
<q-list>
|
|
50
|
+
<q-item dense>
|
|
51
|
+
<q-item-section>
|
|
52
|
+
<q-item-label>
|
|
53
|
+
{{ module.module }}
|
|
54
|
+
</q-item-label>
|
|
55
|
+
</q-item-section>
|
|
56
|
+
</q-item>
|
|
57
|
+
<q-separator />
|
|
58
|
+
<q-option-group dense :options="module.permissions" type="checkbox"
|
|
59
|
+
v-model="value.permissions" />
|
|
60
|
+
</q-list>
|
|
61
|
+
|
|
62
|
+
</l-col>
|
|
63
|
+
</l-row>
|
|
64
|
+
|
|
65
|
+
</form-kit>
|
|
66
|
+
|
|
67
|
+
</l-page>
|
|
68
|
+
</template>
|
|
@@ -16,7 +16,7 @@ const { data, refresh } = await useAsyncData('database', async () => {
|
|
|
16
16
|
return system.database;
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
const SYSTEM_TABLES = ["Config", "EventLog", "MailLog", "Permission", "Role", "SystemValue", "Translate", "User", "UserLog", "UserRole", "MyFavorite"];
|
|
19
|
+
const SYSTEM_TABLES = ["Config", "EventLog", "MailLog", "Permission", "Role", "SystemValue", "Translate", "User", "UserLog", "UserRole", "MyFavorite", "CustomField"];
|
|
20
20
|
|
|
21
21
|
const custom_tables = computed(() => {
|
|
22
22
|
return data.value.tableStatus.filter(table => !SYSTEM_TABLES.includes(table.Name))
|
|
@@ -203,7 +203,7 @@ const truncatTable = async () => {
|
|
|
203
203
|
</script>
|
|
204
204
|
<template>
|
|
205
205
|
<l-page title="Database">
|
|
206
|
-
|
|
206
|
+
|
|
207
207
|
<l-card>
|
|
208
208
|
<l-list>
|
|
209
209
|
<l-item label="Version">{{ data.version }}</l-item>
|
|
@@ -79,6 +79,9 @@ const onSubmit = async (d) => {
|
|
|
79
79
|
<l-system-setting-developer v-if="tab == 'developer'" v-model="obj" />
|
|
80
80
|
<l-system-setting-forget-password v-if="tab == 'forget-password'" v-model="obj" />
|
|
81
81
|
<l-system-setting-authentication v-if="tab == 'authentication'" v-bind="obj" @submit="onSubmit" />
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
82
85
|
</template>
|
|
83
86
|
</q-splitter>
|
|
84
87
|
</l-card>
|
package/dist/runtime/plugin.js
CHANGED
|
@@ -17,9 +17,11 @@ import TypeUserLog from "./types/UserLog.js";
|
|
|
17
17
|
import TypeSystemValue from "./types/SystemValue.js";
|
|
18
18
|
import TypeMailLog from "./types/MailLog.js";
|
|
19
19
|
import TypeEventLog from "./types/EventLog.js";
|
|
20
|
+
import TypeCustomerField from "./model/CustomField.js";
|
|
20
21
|
import { zhTW } from "@formkit/i18n";
|
|
21
22
|
export default defineNuxtPlugin((nuxtApp) => {
|
|
22
23
|
api.axios.defaults.baseURL = getApiBase();
|
|
24
|
+
api.models.create(TypeCustomerField.name, TypeCustomerField.fields);
|
|
23
25
|
api.models.create("User", TypeUser);
|
|
24
26
|
api.models.create("UserLog", TypeUserLog);
|
|
25
27
|
api.models.create("SystemValue", TypeSystemValue);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hostlink/nuxt-light",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "HostLink Nuxt Light Framework",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@azure/msal-browser": "^3.26.1",
|
|
36
|
-
"@formkit/drag-and-drop": "^0.
|
|
36
|
+
"@formkit/drag-and-drop": "^0.2.6",
|
|
37
37
|
"@hostlink/light": "^2.5.2",
|
|
38
38
|
"@nuxt/kit": "^3.7.4",
|
|
39
39
|
"@nuxt/module-builder": "^0.8.3",
|