@hostlink/nuxt-light 1.19.0 → 1.19.2
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/runtime/components/L/System/Setting/authentication.vue +4 -1
- package/dist/runtime/components/L/System/Setting/mail.vue +51 -55
- package/dist/runtime/components/l-app-main.vue +8 -7
- package/dist/runtime/components/l-app.vue +3 -2
- package/dist/runtime/components/l-date-picker.vue +5 -3
- package/dist/runtime/components/l-delete-btn.vue +8 -3
- package/dist/runtime/components/l-edit-btn.vue +1 -1
- package/dist/runtime/components/l-login.vue +34 -20
- package/dist/runtime/components/l-microsoft-button.vue +2 -1
- package/dist/runtime/components/l-user-userlog.vue +23 -7
- package/dist/runtime/formkit/Checkbox.vue +2 -2
- package/dist/runtime/formkit/DatePicker.vue +1 -1
- package/dist/runtime/formkit/Input.vue +5 -3
- package/dist/runtime/formkit/Select.vue +1 -1
- package/dist/runtime/formkit/Toggle.vue +5 -3
- package/dist/runtime/formkit/index.js +6 -0
- package/dist/runtime/pages/System/setting.vue +27 -3
- package/dist/runtime/pages/User/setting/open_id.vue +3 -1
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -8,6 +8,7 @@ export interface LSystemSettingAuthenticationProps {
|
|
|
8
8
|
authentication_google_client_id: string,
|
|
9
9
|
authentication_facebook_app_id: string,
|
|
10
10
|
authentication_microsoft_client_id: string,
|
|
11
|
+
authentication_microsoft_tenant_id: string
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
|
|
@@ -15,7 +16,8 @@ withDefaults(defineProps<LSystemSettingAuthenticationProps>(), {
|
|
|
15
16
|
authentication_password_based: "1",
|
|
16
17
|
authentication_google_client_id: "",
|
|
17
18
|
authentication_facebook_app_id: "",
|
|
18
|
-
authentication_microsoft_client_id: ""
|
|
19
|
+
authentication_microsoft_client_id: "",
|
|
20
|
+
authentication_microsoft_tenant_id: "",
|
|
19
21
|
})
|
|
20
22
|
|
|
21
23
|
const emits = defineEmits(["submit"])
|
|
@@ -50,5 +52,6 @@ const onSubmit = async (d: LSystemSettingAuthenticationProps) => {
|
|
|
50
52
|
<form-kit label="Facebook App ID" type="l-input" name="authentication_facebook_app_id" />
|
|
51
53
|
|
|
52
54
|
<form-kit label="Microsoft Client ID" type="l-input" name="authentication_microsoft_client_id" />
|
|
55
|
+
<form-kit label="Microsoft Tenant ID" type="l-input" name="authentication_microsoft_tenant_id" />
|
|
53
56
|
</form-kit>
|
|
54
57
|
</template>
|
|
@@ -3,7 +3,16 @@ import { q, m } from '#imports'
|
|
|
3
3
|
import { useQuasar } from 'quasar'
|
|
4
4
|
const $q = useQuasar()
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
const emits = defineEmits(["submit"])
|
|
8
|
+
|
|
9
|
+
const { authorizationUrl } = await q({
|
|
10
|
+
authorizationUrl: true
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
console.log(authorizationUrl);
|
|
14
|
+
|
|
15
|
+
withDefaults(defineProps<{
|
|
7
16
|
mail_driver: string,
|
|
8
17
|
mail_host: string
|
|
9
18
|
mail_port: string
|
|
@@ -14,70 +23,57 @@ const modelValue = defineModel<{
|
|
|
14
23
|
mail_from_name: string
|
|
15
24
|
mail_reply_to: string
|
|
16
25
|
mail_reply_to_name: string
|
|
17
|
-
}>()
|
|
26
|
+
}>(), {
|
|
27
|
+
mail_driver: "mail",
|
|
28
|
+
})
|
|
18
29
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const onSubmit = async (d) => {
|
|
24
|
-
let data = [];
|
|
25
|
-
Object.keys(d).forEach((key) => {
|
|
26
|
-
if (d[key] === undefined) {
|
|
27
|
-
d[key] = ""
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
data.push({
|
|
31
|
-
name: key,
|
|
32
|
-
value: d[key]
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
await m("updateAppConfigs", { data })
|
|
36
|
-
//update the props.data
|
|
37
|
-
Object.keys(d).forEach((key) => {
|
|
38
|
-
modelValue.value[key] = d[key]
|
|
39
|
-
})
|
|
40
|
-
$q.notify({ message: "Settings saved", color: "positive" })
|
|
30
|
+
const onLoginGmail = () => {
|
|
31
|
+
let state = encodeURIComponent(window.self.location.origin + window.self.location.pathname + "?mail_driver=gmail");
|
|
32
|
+
let url = "https://accounts.google.com/o/oauth2/v2/auth?scope=openid%20email%20profile%20https%3A%2F%2Fmail.google.com%2F&access_type=offline&state=" + state + "&response_type=code&redirect_uri=https%3A%2F%2Fraymond4.hostlink.com.hk%2Flight%2Fgmail_notification%2Fredirect.php&client_id=790028313082-8qqnoqvkqtqssufto11k6qe6pnievcpv.apps.googleusercontent.com&prompt=consent";
|
|
33
|
+
window.open(url, "_blank");
|
|
41
34
|
}
|
|
42
35
|
|
|
43
36
|
</script>
|
|
44
37
|
<template>
|
|
45
|
-
<FormKit type="l-form" :bordered="false" :value="{
|
|
46
|
-
|
|
47
|
-
mail_host: modelValue.mail_host,
|
|
48
|
-
mail_port: modelValue.mail_port,
|
|
49
|
-
mail_username: modelValue.mail_username,
|
|
50
|
-
mail_password: modelValue.mail_password,
|
|
51
|
-
mail_encryption: modelValue.mail_encryption,
|
|
52
|
-
mail_from: modelValue.mail_from,
|
|
53
|
-
mail_from_name: modelValue.mail_from_name,
|
|
54
|
-
mail_reply_to: modelValue.mail_reply_to,
|
|
55
|
-
mail_reply_to_name: modelValue.mail_reply_to_name,
|
|
56
|
-
}" @submit="onSubmit" #default="{ value }">
|
|
38
|
+
<FormKit type="l-form" :bordered="false" :value="$props" @submit="$emit('submit', $event)" #default="{ value }">
|
|
39
|
+
{{ authorizationUrl }}
|
|
57
40
|
|
|
58
41
|
<FormKit type="l-select" label="Mail Driver" name="mail_driver" :options="[{
|
|
59
42
|
label: 'Mail', value: 'mail'
|
|
60
43
|
}, {
|
|
61
44
|
label: 'SMTP', value: 'smtp'
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<FormKit type="l-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
label: 'Gmail', value: 'gmail'
|
|
48
|
+
}
|
|
49
|
+
]" validation="required"></FormKit>
|
|
50
|
+
|
|
51
|
+
<template v-if="value.mail_driver === 'gmail'">
|
|
52
|
+
<l-btn label="Login" @click="onLoginGmail"></l-btn>
|
|
53
|
+
</template>
|
|
54
|
+
|
|
55
|
+
<template v-else>
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
<FormKit type="l-input" label="From Address" name="mail_from" validation="email"></FormKit>
|
|
59
|
+
<FormKit type="l-input" label="From Name" name="mail_from_name"></FormKit>
|
|
60
|
+
<FormKit type="l-input" label="Reply To Address" name="mail_reply_to" validation="email">
|
|
61
|
+
</FormKit>
|
|
62
|
+
<FormKit type="l-input" label="Reply To Name" name="mail_reply_to_name"></FormKit>
|
|
63
|
+
|
|
64
|
+
<template v-if="value.mail_driver === 'smtp'">
|
|
65
|
+
<FormKit type="l-input" label="SMTP Host" name="mail_host"></FormKit>
|
|
66
|
+
<FormKit type="l-input" label="SMTP Port" name="mail_port"></FormKit>
|
|
67
|
+
<FormKit type="l-input" label="SMTP Username" name="mail_username"></FormKit>
|
|
68
|
+
<FormKit type="l-input" label="SMTP Password" name="mail_password"></FormKit>
|
|
69
|
+
|
|
70
|
+
<FormKit type="l-select" label="SMTP Encryption" name="mail_encryption" :options="[
|
|
71
|
+
{ label: 'None', value: '' },
|
|
72
|
+
{ label: 'SSL', value: 'ssl' },
|
|
73
|
+
{ label: 'TLS', value: 'tls' },
|
|
74
|
+
]"></FormKit>
|
|
75
|
+
</template>
|
|
76
|
+
|
|
81
77
|
</template>
|
|
82
78
|
|
|
83
79
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script setup>
|
|
1
|
+
<script setup lang="ts">
|
|
2
2
|
import { useRoute, useRouter } from 'vue-router';
|
|
3
3
|
import { useLight, q, m } from "#imports";
|
|
4
4
|
import { useQuasar } from 'quasar';
|
|
@@ -7,15 +7,12 @@ import { ref, computed, reactive, provide, watch, toRaw } from 'vue';
|
|
|
7
7
|
import { useRuntimeConfig } from 'nuxt/app';
|
|
8
8
|
import { api } from '#imports';
|
|
9
9
|
|
|
10
|
-
const { t } = useI18n();
|
|
11
|
-
|
|
12
10
|
const emits = defineEmits(["logout"]);
|
|
13
11
|
const $q = useQuasar();
|
|
14
12
|
$q.loading.show()
|
|
15
13
|
|
|
16
14
|
const config = useRuntimeConfig();
|
|
17
15
|
|
|
18
|
-
|
|
19
16
|
const appVersion = config.public.appVersion ?? '0.0.1';
|
|
20
17
|
|
|
21
18
|
const tt = await q({
|
|
@@ -113,10 +110,9 @@ if (my && my.roles.indexOf('Administrators') != -1) {
|
|
|
113
110
|
light.isAdmin = true;
|
|
114
111
|
}
|
|
115
112
|
|
|
116
|
-
const menuOverlayHeader = ref(false)
|
|
117
113
|
const layoutView = computed(() => {
|
|
118
114
|
let s = ''
|
|
119
|
-
s += menuOverlayHeader
|
|
115
|
+
s += style.menuOverlayHeader ? 'l' : 'h'
|
|
120
116
|
s += 'Hh LpR lFr'
|
|
121
117
|
return s
|
|
122
118
|
})
|
|
@@ -124,7 +120,8 @@ const layoutView = computed(() => {
|
|
|
124
120
|
const style = reactive({
|
|
125
121
|
miniState: my.styles?.miniState || false,
|
|
126
122
|
dense: my.styles?.dense || false,
|
|
127
|
-
footer: my.styles?.footer || false
|
|
123
|
+
footer: my.styles?.footer || false,
|
|
124
|
+
menuOverlayHeader: my.styles?.menuOverlayHeader || false
|
|
128
125
|
});
|
|
129
126
|
|
|
130
127
|
const isMouseOnDrawer = ref(false)
|
|
@@ -176,6 +173,10 @@ watch(() => light.theme, async () => {
|
|
|
176
173
|
$q.dark.set(light.isDarkMode());
|
|
177
174
|
})
|
|
178
175
|
|
|
176
|
+
watch(() => style.menuOverlayHeader, async (value) => {
|
|
177
|
+
await light.setStyle("menuOverlayHeader", value)
|
|
178
|
+
})
|
|
179
|
+
|
|
179
180
|
watch(() => style.miniState, async (value) => {
|
|
180
181
|
await m("updateMyStyle", {
|
|
181
182
|
name: "miniState",
|
|
@@ -23,9 +23,10 @@ try {
|
|
|
23
23
|
companyLogo: true,
|
|
24
24
|
logged: true,
|
|
25
25
|
twoFactorAuthentication: true,
|
|
26
|
-
googleClientId: true,
|
|
27
26
|
forgetPasswordEnabled: true,
|
|
27
|
+
googleClientId: true,
|
|
28
28
|
microsoftClientId: true,
|
|
29
|
+
microsoftTenantId: true,
|
|
29
30
|
passwordBasedEnabled: true,
|
|
30
31
|
facebookAppId: true,
|
|
31
32
|
}
|
|
@@ -78,7 +79,7 @@ if (app.value.facebookAppId) {
|
|
|
78
79
|
</q-page-container>
|
|
79
80
|
</q-layout>
|
|
80
81
|
|
|
81
|
-
<l-app-main v-else @logout="app.logged = false">
|
|
82
|
+
<l-app-main v-else @logout="app.logged = false" v-bind="app">
|
|
82
83
|
<template #header>
|
|
83
84
|
<slot name="header"></slot>
|
|
84
85
|
</template>
|
|
@@ -28,7 +28,8 @@ export interface LDatePickerProps {
|
|
|
28
28
|
stackLabel?: boolean
|
|
29
29
|
rules?: any[],
|
|
30
30
|
range?: boolean,
|
|
31
|
-
mask?: string
|
|
31
|
+
mask?: string,
|
|
32
|
+
disable?: boolean
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
const props = withDefaults(defineProps<LDatePickerProps>(), {
|
|
@@ -41,7 +42,8 @@ const props = withDefaults(defineProps<LDatePickerProps>(), {
|
|
|
41
42
|
square: undefined,
|
|
42
43
|
stackLabel: undefined,
|
|
43
44
|
mask: "YYYY-MM-DD",
|
|
44
|
-
range: false
|
|
45
|
+
range: false,
|
|
46
|
+
disable: false
|
|
45
47
|
})
|
|
46
48
|
|
|
47
49
|
|
|
@@ -59,7 +61,7 @@ const localValue = computed({
|
|
|
59
61
|
return modelValue.value
|
|
60
62
|
},
|
|
61
63
|
set: (value: string) => {
|
|
62
|
-
|
|
64
|
+
|
|
63
65
|
|
|
64
66
|
if (props.range) {
|
|
65
67
|
//try to split
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
|
|
3
3
|
import { useQuasar } from 'quasar';
|
|
4
|
+
import { useI18n } from 'vue-i18n';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const { t } = useI18n();
|
|
4
8
|
|
|
5
9
|
const props = defineProps(["to"]);
|
|
6
10
|
|
|
@@ -9,10 +13,11 @@ const emit = defineEmits(["submit"]);
|
|
|
9
13
|
const qua = useQuasar();
|
|
10
14
|
const onDelete = () => {
|
|
11
15
|
qua.dialog({
|
|
12
|
-
title: "Delete",
|
|
13
|
-
message: "Are you sure you want to delete this record?",
|
|
16
|
+
title: t("Delete"),
|
|
17
|
+
message: t("Are you sure you want to delete this record?"),
|
|
14
18
|
cancel: true,
|
|
15
|
-
persistent: true
|
|
19
|
+
persistent: true,
|
|
20
|
+
color: "negative",
|
|
16
21
|
}).onOk(async () => {
|
|
17
22
|
emit("submit");
|
|
18
23
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import { ref, reactive, onMounted } from 'vue'
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref, reactive, onMounted, resolveComponent } from 'vue'
|
|
3
3
|
import { useQuasar } from 'quasar';
|
|
4
|
-
import { api, useHead, m
|
|
4
|
+
import { api, useHead, m } from '#imports';
|
|
5
5
|
import { useI18n } from 'vue-i18n';
|
|
6
6
|
|
|
7
7
|
|
|
@@ -9,16 +9,19 @@ const { t } = useI18n();
|
|
|
9
9
|
|
|
10
10
|
const emits = defineEmits(["login"]);
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
export interface LLoginProps {
|
|
13
|
+
company: string,
|
|
14
|
+
companyLogo: string,
|
|
15
|
+
twoFactorAuthentication: boolean,
|
|
16
|
+
forgetPasswordEnabled: boolean,
|
|
17
|
+
passwordBasedEnabled: boolean,
|
|
18
|
+
googleClientId?: string,
|
|
19
|
+
microsoftClientId?: string,
|
|
20
|
+
microsoftTenantId?: string,
|
|
21
|
+
facebookAppId?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const props = defineProps<LLoginProps>();
|
|
22
25
|
|
|
23
26
|
useHead({
|
|
24
27
|
title: props.company
|
|
@@ -31,11 +34,12 @@ const data = reactive({
|
|
|
31
34
|
|
|
32
35
|
const $q = useQuasar()
|
|
33
36
|
|
|
34
|
-
const loginWithCode = (username, password) => {
|
|
37
|
+
const loginWithCode = (username: string, password: string) => {
|
|
35
38
|
$q.dialog({
|
|
36
39
|
title: t("Enter your code"),
|
|
37
40
|
message: t("Please enter your two factor authentication code (If you lost your authenticator, please contact your administrator)"),
|
|
38
41
|
prompt: {
|
|
42
|
+
model: "",
|
|
39
43
|
type: "text",
|
|
40
44
|
required: true
|
|
41
45
|
},
|
|
@@ -85,7 +89,7 @@ const submit = async () => {
|
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
|
|
88
|
-
const resetPassword = (username, code) => {
|
|
92
|
+
const resetPassword = (username: string, code: string) => {
|
|
89
93
|
$q.dialog({
|
|
90
94
|
title: t("Reset password"),
|
|
91
95
|
message: t("Please enter your new password"),
|
|
@@ -127,6 +131,7 @@ const forgetPassword = async () => {
|
|
|
127
131
|
title: t("Enter your code"),
|
|
128
132
|
message: t("Please enter the code sent to your email, your code will expire in 10 minutes"),
|
|
129
133
|
prompt: {
|
|
134
|
+
model: "",
|
|
130
135
|
type: "text",
|
|
131
136
|
required: true
|
|
132
137
|
},
|
|
@@ -155,8 +160,12 @@ const bioLogin = async () => {
|
|
|
155
160
|
try {
|
|
156
161
|
await api.auth.WebAuthn.login(localStorage.getItem("username"));
|
|
157
162
|
window.self.location.reload();
|
|
158
|
-
} catch (e) {
|
|
159
|
-
notify(
|
|
163
|
+
} catch (e: any) {
|
|
164
|
+
$q.notify({
|
|
165
|
+
message: e.message,
|
|
166
|
+
color: "negative",
|
|
167
|
+
icon: "sym_o_error",
|
|
168
|
+
});
|
|
160
169
|
}
|
|
161
170
|
|
|
162
171
|
}
|
|
@@ -164,8 +173,12 @@ const handleGoogleCredentialResponse = async (response) => {
|
|
|
164
173
|
try {
|
|
165
174
|
await api.auth.googleLogin(response.credential);
|
|
166
175
|
window.self.location.reload();
|
|
167
|
-
} catch (e) {
|
|
168
|
-
notify(
|
|
176
|
+
} catch (e: any) {
|
|
177
|
+
$q.notify({
|
|
178
|
+
message: e.message,
|
|
179
|
+
color: "negative",
|
|
180
|
+
icon: "sym_o_error",
|
|
181
|
+
});
|
|
169
182
|
}
|
|
170
183
|
}
|
|
171
184
|
|
|
@@ -282,7 +295,8 @@ const facebookLogin = (accessToken) => {
|
|
|
282
295
|
</q-card-actions>
|
|
283
296
|
|
|
284
297
|
<q-card-actions v-if="microsoftClientId">
|
|
285
|
-
<l-microsoft-button :client-id="microsoftClientId"
|
|
298
|
+
<l-microsoft-button :client-id="microsoftClientId" :tenant-id="microsoftTenantId"
|
|
299
|
+
@login="microsoftLogin"></l-microsoft-button>
|
|
286
300
|
</q-card-actions>
|
|
287
301
|
|
|
288
302
|
<q-card-actions v-if="facebookAppId">
|
|
@@ -8,6 +8,7 @@ const props = defineProps({
|
|
|
8
8
|
type: String,
|
|
9
9
|
required: true
|
|
10
10
|
},
|
|
11
|
+
tenantId: String
|
|
11
12
|
})
|
|
12
13
|
|
|
13
14
|
const emits = defineEmits(["login"]);
|
|
@@ -16,7 +17,7 @@ const onClick = async () => {
|
|
|
16
17
|
const myMSALObject = new PublicClientApplication({
|
|
17
18
|
auth: {
|
|
18
19
|
clientId: props.clientId,
|
|
19
|
-
authority: "https://login.microsoftonline.com/
|
|
20
|
+
authority: "https://login.microsoftonline.com/" + props.tenantId,
|
|
20
21
|
redirectUri: window.location.origin,
|
|
21
22
|
},
|
|
22
23
|
cache: {
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { model, q } from "#imports";
|
|
3
|
-
const props = defineProps(
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
id: String
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
const columns = model('UserLog').columns({
|
|
8
|
+
userlog_id: true,
|
|
9
|
+
login_dt: true,
|
|
10
|
+
last_access_time: true,
|
|
11
|
+
logout_dt: true,
|
|
12
|
+
result: true,
|
|
13
|
+
user_agent: true
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
const onRequestData = async (req) => {
|
|
20
|
+
req.loadObjects('UserLog', { user_id: props.id })
|
|
21
|
+
}
|
|
22
|
+
|
|
4
23
|
|
|
5
|
-
const columns = model('UserLog').columns(["userlog_id", "login_dt", "last_access_time", "logout_dt", "result", "user_agent"]);
|
|
6
24
|
</script>
|
|
7
25
|
<template>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}" />
|
|
12
|
-
</div>
|
|
26
|
+
|
|
27
|
+
<l-table row-key="userlog_id" sort-by="userlog_id:desc" :columns="columns" @request-data="onRequestData" />
|
|
28
|
+
|
|
13
29
|
</template>
|
|
@@ -15,8 +15,8 @@ const { error, errorMessage } = getErrorMessage(props.context.node);
|
|
|
15
15
|
</script>
|
|
16
16
|
<template>
|
|
17
17
|
|
|
18
|
-
<l-checkbox v-model="value" :
|
|
19
|
-
|
|
18
|
+
<l-checkbox v-model="value" :error="error" :error-message="errorMessage" :disable="context.disabled"
|
|
19
|
+
v-bind="context.attrs" :label="context.label">
|
|
20
20
|
<template v-for="(s, name) in $slots" v-slot:[name]="props" :key="name">
|
|
21
21
|
<slot :name="name" v-bind="props ?? {}"></slot>
|
|
22
22
|
</template>
|
|
@@ -16,7 +16,7 @@ const value = computed({
|
|
|
16
16
|
</script>
|
|
17
17
|
<template>
|
|
18
18
|
<l-date-picker v-model="value" :label="context.label" v-bind="context.attrs" :error="error" :type="context.inputType"
|
|
19
|
-
:error-message="errorMessage">
|
|
19
|
+
:error-message="errorMessage" :disable="context.disabled">
|
|
20
20
|
<template v-for="(s, name) in $slots" v-slot:[name]="props" :key="name">
|
|
21
21
|
<slot :name="name" v-bind="props ?? {}"></slot>
|
|
22
22
|
</template>
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
import { computed } from 'vue'
|
|
3
3
|
import { getErrorMessage } from 'formkit-quasar';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
5
|
const props = defineProps({
|
|
8
6
|
context: {
|
|
9
7
|
type: Object,
|
|
@@ -49,8 +47,12 @@ const onBlur = () => {
|
|
|
49
47
|
}
|
|
50
48
|
</script>
|
|
51
49
|
<template>
|
|
50
|
+
|
|
52
51
|
<l-input v-model="value" :label="context?.label" v-bind="context?.attrs" :error="error" :type="context?.inputType"
|
|
53
|
-
:error-message="errorMessage" @blur="onBlur"
|
|
52
|
+
:error-message="errorMessage" @blur="onBlur"
|
|
53
|
+
:disable="context.disabled"
|
|
54
|
+
|
|
55
|
+
>
|
|
54
56
|
|
|
55
57
|
<template v-for="(s, name) in $slots" v-slot:[name]="props" :key="name">
|
|
56
58
|
<slot :name="name" v-bind="props ?? {}"></slot>
|
|
@@ -33,7 +33,7 @@ if (required) { //no clearable
|
|
|
33
33
|
</script>
|
|
34
34
|
<template>
|
|
35
35
|
<l-select v-model="value" :label="context.label" v-bind="context.attrs" :error="error" :error-message="errorMessage"
|
|
36
|
-
:clearable="clearable" :required="required">
|
|
36
|
+
:clearable="clearable" :required="required" :disable="context.disabled">
|
|
37
37
|
<template v-for="(s, name) in $slots" v-slot:[name]="props" :key="name">
|
|
38
38
|
<slot :name="name" v-bind="props ?? {}"></slot>
|
|
39
39
|
</template>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script setup>
|
|
1
|
+
<script setup lang="ts">
|
|
2
2
|
import { computed } from 'vue'
|
|
3
3
|
|
|
4
4
|
const props = defineProps({
|
|
@@ -10,9 +10,11 @@ const value = computed({
|
|
|
10
10
|
set: (val) => props.context.node.input(val)
|
|
11
11
|
})
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
</script>
|
|
15
14
|
<template>
|
|
16
|
-
|
|
15
|
+
|
|
16
|
+
<q-toggle v-model="value" :label="context.label" :disable="context.disabled" :color="$light.color"
|
|
17
|
+
v-bind="context.attrs">
|
|
18
|
+
<slot></slot>
|
|
17
19
|
</q-toggle>
|
|
18
20
|
</template>
|
|
@@ -13,6 +13,7 @@ import FileVue from "./File.vue";
|
|
|
13
13
|
import InputXlsxVue from "./InputXlsx.vue";
|
|
14
14
|
import FileUploadVue from "./FileUpload.vue";
|
|
15
15
|
import EditorVue from "./Editor.vue";
|
|
16
|
+
import ToggleVue from "./Toggle.vue";
|
|
16
17
|
export const createLightPlugin = () => {
|
|
17
18
|
return (node) => {
|
|
18
19
|
let type = node.props.type + "";
|
|
@@ -98,6 +99,11 @@ export const createLightPlugin = () => {
|
|
|
98
99
|
],
|
|
99
100
|
features: [forms, disablesChildren]
|
|
100
101
|
});
|
|
102
|
+
case "l-toggle":
|
|
103
|
+
return node.define({
|
|
104
|
+
type: "input",
|
|
105
|
+
component: ToggleVue
|
|
106
|
+
});
|
|
101
107
|
}
|
|
102
108
|
};
|
|
103
109
|
};
|
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { ref } from 'vue'
|
|
3
|
-
import { q, m, useLight } from '#imports';
|
|
3
|
+
import { q, m, useLight, useRoute } from '#imports';
|
|
4
|
+
import { useQuasar } from 'quasar';
|
|
5
|
+
const route = useRoute()
|
|
6
|
+
const tab = ref('general')
|
|
7
|
+
const $q = useQuasar()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if (route.query.mail_driver == 'gmail' && route.query.refresh_token) {
|
|
11
|
+
|
|
12
|
+
//save the mail_driver
|
|
13
|
+
await m("updateAppConfigs", {
|
|
14
|
+
data: [
|
|
15
|
+
{ name: 'mail_driver', value: 'gmail' },
|
|
16
|
+
{ name: 'mail_google_refresh_token', value: route.query.refresh_token }
|
|
17
|
+
]
|
|
18
|
+
})
|
|
19
|
+
tab.value = 'mail'
|
|
20
|
+
|
|
21
|
+
//remove the query string
|
|
22
|
+
window.history.replaceState({}, document.title, window.location.pathname);
|
|
23
|
+
|
|
24
|
+
$q.notify({ message: "Gmail account added", color: "positive" })
|
|
25
|
+
}
|
|
4
26
|
|
|
5
27
|
const light = useLight()
|
|
6
28
|
|
|
@@ -12,7 +34,6 @@ const obj = app.config.reduce((acc, cur) => {
|
|
|
12
34
|
|
|
13
35
|
obj.revision = obj.revision ? obj.revision.split(',') : []
|
|
14
36
|
|
|
15
|
-
const tab = ref('general')
|
|
16
37
|
|
|
17
38
|
const onSubmit = async (d) => {
|
|
18
39
|
let data = [];
|
|
@@ -31,6 +52,9 @@ const onSubmit = async (d) => {
|
|
|
31
52
|
obj[key] = d[key]
|
|
32
53
|
})
|
|
33
54
|
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
34
58
|
</script>
|
|
35
59
|
<template>
|
|
36
60
|
<l-page>
|
|
@@ -50,7 +74,7 @@ const onSubmit = async (d) => {
|
|
|
50
74
|
</template>
|
|
51
75
|
<template #after>
|
|
52
76
|
<l-system-setting-general v-if="tab == 'general'" v-model="obj" />
|
|
53
|
-
<l-system-setting-mail v-if="tab == 'mail'" v-
|
|
77
|
+
<l-system-setting-mail v-if="tab == 'mail'" v-bind="obj" @submit="onSubmit" />
|
|
54
78
|
<l-system-setting-security v-if="tab == 'security'" v-model="obj" />
|
|
55
79
|
<l-system-setting-modules v-if="tab == 'Modules'" v-model="obj" />
|
|
56
80
|
<l-system-setting-developer v-if="tab == 'developer'" v-model="obj" />
|
|
@@ -11,6 +11,7 @@ let { app, my } = await q({
|
|
|
11
11
|
app: {
|
|
12
12
|
googleClientId: true,
|
|
13
13
|
microsoftClientId: true,
|
|
14
|
+
microsoftTenantId: true,
|
|
14
15
|
facebookAppId: true,
|
|
15
16
|
}, my: {
|
|
16
17
|
google: true,
|
|
@@ -201,7 +202,8 @@ const onUnlinkFacebook = async () => {
|
|
|
201
202
|
<template v-else>
|
|
202
203
|
<div>{{ $t('Click the button below to link your Microsoft account.') }}</div>
|
|
203
204
|
<div>
|
|
204
|
-
<l-microsoft-button :client-id="app.microsoftClientId"
|
|
205
|
+
<l-microsoft-button :client-id="app.microsoftClientId" :tenant-id="app.microsoftTenantId"
|
|
206
|
+
@login="onLinkMicrosoft" />
|
|
205
207
|
</div>
|
|
206
208
|
</template>
|
|
207
209
|
</template>
|