@antelopejs/dms-saas 0.1.6 → 0.1.8
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/README.md +3 -1
- package/frontend-vue/app/components/Register.vue +2 -2
- package/frontend-vue/app/components/WorkspaceSwitcherWidget.vue +261 -202
- package/frontend-vue/app/custom-pages/auth/no-workspace.vue +2 -2
- package/frontend-vue/app/middleware/workspace-suspended.global.ts +3 -0
- package/frontend-vue/app/plugins/footer-links.ts +3 -3
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -30,7 +30,9 @@ This package lives in `packages/dms-saas` of the `AntelopeJS/dms-saas`
|
|
|
30
30
|
workspace. From that directory run `pnpm install`,
|
|
31
31
|
`pnpm --dir frontend-vue install`, `pnpm build`, `pnpm typecheck`, and
|
|
32
32
|
`pnpm test:frontend`. The frontend check generates a temporary workspace, then
|
|
33
|
-
builds client, SSR, and email bundles and runs Vue typechecking.
|
|
33
|
+
builds client, SSR, and email bundles and runs Vue typechecking. To run the
|
|
34
|
+
playground frontend during backend development, use `pnpm frontend:dev`; this
|
|
35
|
+
dispatches through the core CLI as `ajs dms dev`.
|
|
34
36
|
|
|
35
37
|
## Completing a registration that entered without a workspace
|
|
36
38
|
|
|
@@ -138,7 +138,7 @@ const isRegistrationClosed =
|
|
|
138
138
|
<i18n-t keypath="saas.register.legal_acceptance" tag="span">
|
|
139
139
|
<template #terms_and_conditions>
|
|
140
140
|
<DmsLink
|
|
141
|
-
to="/
|
|
141
|
+
to="/terms-and-conditions"
|
|
142
142
|
target="_blank"
|
|
143
143
|
class="underline"
|
|
144
144
|
>
|
|
@@ -147,7 +147,7 @@ const isRegistrationClosed =
|
|
|
147
147
|
</template>
|
|
148
148
|
<template #privacy_policy>
|
|
149
149
|
<DmsLink
|
|
150
|
-
to="/
|
|
150
|
+
to="/privacy-policy"
|
|
151
151
|
target="_blank"
|
|
152
152
|
class="underline"
|
|
153
153
|
>
|
|
@@ -1,247 +1,306 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed, onMounted, ref, watch } from
|
|
2
|
+
import { computed, onMounted, ref, watch } from 'vue'
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
|
|
6
|
-
}>()
|
|
5
|
+
collapsed?: boolean
|
|
6
|
+
}>()
|
|
7
7
|
|
|
8
8
|
interface DmsSaasPublicRuntimeConfig {
|
|
9
|
-
|
|
9
|
+
admissionMode?: 'open' | 'invitation-only'
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
const toast = useToast()
|
|
13
|
-
const { t } = useI18n()
|
|
14
|
-
const { resolveApiError } = useApiErrorMessage()
|
|
12
|
+
const toast = useToast()
|
|
13
|
+
const { t } = useI18n()
|
|
14
|
+
const { resolveApiError } = useApiErrorMessage()
|
|
15
15
|
|
|
16
16
|
// Platform owners are not tenant members by default, so an owner can legitimately
|
|
17
17
|
// have no workspace at all — the switcher must still offer them a way in.
|
|
18
|
-
const isOwner = useIsOwner()
|
|
19
|
-
const config = useDmsRuntimeConfig()
|
|
18
|
+
const isOwner = useIsOwner()
|
|
19
|
+
const config = useDmsRuntimeConfig()
|
|
20
20
|
const canCreateWorkspace = computed(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
const SEARCH_THRESHOLD = 6
|
|
28
|
-
const HOME_ROUTE =
|
|
29
|
-
|
|
30
|
-
const { workspaces, refresh } = useMyWorkspaces()
|
|
31
|
-
const isLoading = ref(true)
|
|
32
|
-
const isOpen = ref(false)
|
|
33
|
-
const isCreateOpen = ref(false)
|
|
34
|
-
const searchQuery = ref(
|
|
35
|
-
const switchingId = ref<string | null>(null)
|
|
21
|
+
() =>
|
|
22
|
+
isOwner.value ||
|
|
23
|
+
(config.public.dmsSaas as DmsSaasPublicRuntimeConfig | undefined)
|
|
24
|
+
?.admissionMode !== 'invitation-only',
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
const SEARCH_THRESHOLD = 6
|
|
28
|
+
const HOME_ROUTE = '/'
|
|
29
|
+
|
|
30
|
+
const { workspaces, refresh } = useMyWorkspaces()
|
|
31
|
+
const isLoading = ref(true)
|
|
32
|
+
const isOpen = ref(false)
|
|
33
|
+
const isCreateOpen = ref(false)
|
|
34
|
+
const searchQuery = ref('')
|
|
35
|
+
const switchingId = ref<string | null>(null)
|
|
36
36
|
|
|
37
37
|
const current = computed<MyWorkspace | undefined>(
|
|
38
|
-
|
|
39
|
-
)
|
|
38
|
+
() => workspaces.value.find((w) => w.isCurrent) ?? workspaces.value[0],
|
|
39
|
+
)
|
|
40
40
|
|
|
41
|
-
const showSearch = computed(() => workspaces.value.length >= SEARCH_THRESHOLD)
|
|
41
|
+
const showSearch = computed(() => workspaces.value.length >= SEARCH_THRESHOLD)
|
|
42
42
|
|
|
43
|
-
const isVisible = computed(() => !!current.value || isOwner.value)
|
|
43
|
+
const isVisible = computed(() => !!current.value || isOwner.value)
|
|
44
44
|
|
|
45
45
|
const triggerLabel = computed(
|
|
46
|
-
|
|
47
|
-
)
|
|
46
|
+
() => current.value?.name ?? t('saas.workspaces.none'),
|
|
47
|
+
)
|
|
48
48
|
|
|
49
49
|
const triggerCaption = computed(
|
|
50
|
-
|
|
51
|
-
)
|
|
50
|
+
() => current.value?.planName ?? t('saas.workspaces.current_label'),
|
|
51
|
+
)
|
|
52
52
|
|
|
53
53
|
const filtered = computed<MyWorkspace[]>(() => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
})
|
|
54
|
+
const needle = searchQuery.value.trim().toLowerCase()
|
|
55
|
+
if (!needle) return workspaces.value
|
|
56
|
+
return workspaces.value.filter((w) => w.name.toLowerCase().includes(needle))
|
|
57
|
+
})
|
|
58
58
|
|
|
59
59
|
watch(isOpen, (open) => {
|
|
60
|
-
|
|
61
|
-
})
|
|
60
|
+
if (!open) searchQuery.value = ''
|
|
61
|
+
})
|
|
62
62
|
|
|
63
63
|
const popoverPlacement = computed(() =>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
)
|
|
64
|
+
props.collapsed
|
|
65
|
+
? { side: 'right' as const, align: 'start' as const, sideOffset: 12 }
|
|
66
|
+
: { side: 'bottom' as const, align: 'start' as const, sideOffset: 6 },
|
|
67
|
+
)
|
|
68
68
|
|
|
69
69
|
function initialOf(name: string): string {
|
|
70
|
-
|
|
70
|
+
return (name.trim()[0] ?? '?').toUpperCase()
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
async function load(): Promise<void> {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
74
|
+
try {
|
|
75
|
+
await refresh()
|
|
76
|
+
} catch {
|
|
77
|
+
// Errors are swallowed on purpose: useMyWorkspaces already decides what the
|
|
78
|
+
// list becomes, and the sidebar is no place for an error card.
|
|
79
|
+
} finally {
|
|
80
|
+
isLoading.value = false
|
|
81
|
+
}
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
async function selectWorkspace(workspace: MyWorkspace): Promise<void> {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
if (workspace.isCurrent || switchingId.value) return
|
|
86
|
+
switchingId.value = workspace._id
|
|
87
|
+
try {
|
|
88
|
+
// Reloads the page on success, so the switching state never resets.
|
|
89
|
+
await useTenantSwitch(workspace._id)
|
|
90
|
+
} catch (error) {
|
|
91
|
+
switchingId.value = null
|
|
92
|
+
toast.add({
|
|
93
|
+
title: resolveApiError(error, 'saas.workspaces.switch_error'),
|
|
94
|
+
color: 'error',
|
|
95
|
+
icon: 'i-ph-warning-circle',
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
function openCreateModal(): void {
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
isOpen.value = false
|
|
102
|
+
isCreateOpen.value = true
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
async function onWorkspaceCreated(tenantId: string): Promise<void> {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
106
|
+
isCreateOpen.value = false
|
|
107
|
+
try {
|
|
108
|
+
// Lands on the DMS homepage rather than reloading the settings screen the
|
|
109
|
+
// creation was started from — that screen belongs to the previous tenant.
|
|
110
|
+
await useTenantSwitch(tenantId, HOME_ROUTE)
|
|
111
|
+
} catch (error) {
|
|
112
|
+
toast.add({
|
|
113
|
+
title: resolveApiError(error, 'saas.workspaces.switch_error'),
|
|
114
|
+
color: 'error',
|
|
115
|
+
icon: 'i-ph-warning-circle',
|
|
116
|
+
})
|
|
117
|
+
load()
|
|
118
|
+
}
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
onMounted(load)
|
|
121
|
+
onMounted(load)
|
|
122
122
|
</script>
|
|
123
123
|
|
|
124
124
|
<template>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
125
|
+
<USkeleton
|
|
126
|
+
v-if="isLoading"
|
|
127
|
+
:class="
|
|
128
|
+
collapsed ? 'mx-auto size-9 rounded-md' : 'h-[46px] w-full rounded-md'
|
|
129
|
+
"
|
|
130
|
+
/>
|
|
131
|
+
<UPopover
|
|
132
|
+
v-else-if="isVisible"
|
|
133
|
+
v-model:open="isOpen"
|
|
134
|
+
:content="popoverPlacement"
|
|
135
|
+
:ui="{
|
|
136
|
+
content: 'rounded-none border-0 bg-transparent p-0 shadow-none ring-0',
|
|
137
|
+
}"
|
|
138
|
+
>
|
|
139
|
+
<UTooltip
|
|
140
|
+
:text="triggerLabel"
|
|
141
|
+
:disabled="!collapsed"
|
|
142
|
+
:content="{ side: 'right' }"
|
|
143
|
+
>
|
|
144
|
+
<button
|
|
145
|
+
type="button"
|
|
146
|
+
class="border-default bg-elevated text-highlighted hover:border-accented flex items-center gap-2.5 rounded-md border text-left transition-colors duration-150"
|
|
147
|
+
:class="
|
|
148
|
+
collapsed ? 'size-9 justify-center p-1' : 'w-full px-2.5 py-[9px]'
|
|
149
|
+
"
|
|
150
|
+
:aria-label="$t('saas.workspaces.switcher_title')"
|
|
151
|
+
>
|
|
152
|
+
<span
|
|
153
|
+
class="from-primary-500 to-primary-600 bg-linear-to-br inline-flex size-[26px] shrink-0 items-center justify-center rounded-md text-[13px] font-bold text-white"
|
|
154
|
+
>
|
|
155
|
+
<template v-if="current">{{ initialOf(current.name) }}</template>
|
|
156
|
+
<svg
|
|
157
|
+
v-if="!current"
|
|
158
|
+
class="size-4"
|
|
159
|
+
viewBox="0 0 24 24"
|
|
160
|
+
fill="none"
|
|
161
|
+
stroke="currentColor"
|
|
162
|
+
stroke-width="1.8"
|
|
163
|
+
stroke-linecap="round"
|
|
164
|
+
stroke-linejoin="round"
|
|
165
|
+
aria-hidden="true"
|
|
166
|
+
>
|
|
167
|
+
<path
|
|
168
|
+
d="M3 21h18M5 21V5l7-3 7 3v16M9 9h.01M15 9h.01M9 13h.01M15 13h.01M9 17h.01M15 17h.01"
|
|
169
|
+
/>
|
|
170
|
+
</svg>
|
|
171
|
+
</span>
|
|
172
|
+
<template v-if="!collapsed">
|
|
173
|
+
<span class="flex min-w-0 flex-1 flex-col leading-[1.25]">
|
|
174
|
+
<span
|
|
175
|
+
class="text-primary font-mono text-[10px] uppercase tracking-[0.08em]"
|
|
176
|
+
>
|
|
177
|
+
{{ triggerCaption }}
|
|
178
|
+
</span>
|
|
179
|
+
<span
|
|
180
|
+
class="text-highlighted overflow-hidden text-ellipsis whitespace-nowrap text-[13.5px] font-semibold tracking-[-0.01em]"
|
|
181
|
+
>
|
|
182
|
+
{{ triggerLabel }}
|
|
183
|
+
</span>
|
|
184
|
+
</span>
|
|
185
|
+
<span
|
|
186
|
+
class="text-dimmed ml-auto inline-flex size-4 shrink-0"
|
|
187
|
+
aria-hidden="true"
|
|
188
|
+
>
|
|
189
|
+
<svg
|
|
190
|
+
class="h-full w-full"
|
|
191
|
+
viewBox="0 0 24 24"
|
|
192
|
+
fill="none"
|
|
193
|
+
stroke="currentColor"
|
|
194
|
+
stroke-width="1.8"
|
|
195
|
+
stroke-linecap="round"
|
|
196
|
+
stroke-linejoin="round"
|
|
197
|
+
>
|
|
198
|
+
<path d="m7 15 5 5 5-5" />
|
|
199
|
+
<path d="m7 9 5-5 5 5" />
|
|
200
|
+
</svg>
|
|
201
|
+
</span>
|
|
202
|
+
</template>
|
|
203
|
+
</button>
|
|
204
|
+
</UTooltip>
|
|
205
|
+
|
|
206
|
+
<template #content>
|
|
207
|
+
<div
|
|
208
|
+
class="border-accented bg-elevated flex w-56 flex-col gap-0.5 rounded-lg border p-[5px] shadow-lg"
|
|
209
|
+
>
|
|
210
|
+
<p class="text-dimmed m-0 px-[9px] pb-[3px] pt-[5px] text-[10.5px]">
|
|
211
|
+
{{ $t('saas.workspaces.switcher_title') }}
|
|
212
|
+
</p>
|
|
213
|
+
<input
|
|
214
|
+
v-if="showSearch"
|
|
215
|
+
v-model="searchQuery"
|
|
216
|
+
class="border-accented bg-default text-highlighted w-full rounded-md border px-2 py-1.5 text-xs"
|
|
217
|
+
type="search"
|
|
218
|
+
:placeholder="$t('saas.workspaces.select')"
|
|
219
|
+
/>
|
|
220
|
+
<ul
|
|
221
|
+
v-if="filtered.length"
|
|
222
|
+
class="m-0 max-h-64 list-none overflow-y-auto p-0"
|
|
223
|
+
>
|
|
224
|
+
<li v-for="workspace in filtered" :key="workspace._id">
|
|
225
|
+
<button
|
|
226
|
+
type="button"
|
|
227
|
+
class="hover:bg-accented hover:text-highlighted flex w-full items-center gap-[9px] rounded-md border-0 px-[9px] py-2 text-left text-[13px]"
|
|
228
|
+
:class="[
|
|
229
|
+
workspace.isCurrent
|
|
230
|
+
? 'bg-primary/12 text-highlighted'
|
|
231
|
+
: 'text-muted bg-transparent',
|
|
232
|
+
{ 'cursor-default': workspace.isCurrent || !!switchingId },
|
|
233
|
+
]"
|
|
234
|
+
@click="selectWorkspace(workspace)"
|
|
235
|
+
>
|
|
236
|
+
<span
|
|
237
|
+
class="from-primary-500 to-primary-600 bg-linear-to-br inline-flex size-[22px] shrink-0 items-center justify-center rounded-[5px] text-[11px] font-bold text-white"
|
|
238
|
+
>
|
|
239
|
+
{{ initialOf(workspace.name) }}
|
|
240
|
+
</span>
|
|
241
|
+
<span
|
|
242
|
+
class="min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap"
|
|
243
|
+
:class="{ 'text-highlighted': workspace.isCurrent }"
|
|
244
|
+
>
|
|
245
|
+
{{ workspace.name }}
|
|
246
|
+
</span>
|
|
247
|
+
<span
|
|
248
|
+
v-if="workspace.planName"
|
|
249
|
+
class="text-primary shrink-0 whitespace-nowrap font-mono text-[9.5px] uppercase tracking-[0.08em]"
|
|
250
|
+
>
|
|
251
|
+
{{ workspace.planName }}
|
|
252
|
+
</span>
|
|
253
|
+
<span
|
|
254
|
+
v-if="switchingId === workspace._id"
|
|
255
|
+
class="border-(--ui-text-dimmed) border-t-primary size-3.5 shrink-0 animate-spin rounded-full border-2 [animation-duration:700ms]"
|
|
256
|
+
aria-hidden="true"
|
|
257
|
+
/>
|
|
258
|
+
<span
|
|
259
|
+
v-else-if="workspace.isCurrent"
|
|
260
|
+
class="text-primary inline-flex size-4 shrink-0"
|
|
261
|
+
aria-hidden="true"
|
|
262
|
+
>
|
|
263
|
+
<svg
|
|
264
|
+
class="h-full w-full"
|
|
265
|
+
viewBox="0 0 24 24"
|
|
266
|
+
fill="none"
|
|
267
|
+
stroke="currentColor"
|
|
268
|
+
stroke-width="1.8"
|
|
269
|
+
stroke-linecap="round"
|
|
270
|
+
stroke-linejoin="round"
|
|
271
|
+
>
|
|
272
|
+
<path d="m4 12 5 5L20 6" />
|
|
273
|
+
</svg>
|
|
274
|
+
</span>
|
|
275
|
+
</button>
|
|
276
|
+
</li>
|
|
277
|
+
</ul>
|
|
278
|
+
<p
|
|
279
|
+
v-else-if="workspaces.length"
|
|
280
|
+
class="text-dimmed m-0 px-[9px] py-2 text-[13px]"
|
|
281
|
+
>
|
|
282
|
+
{{ $t('saas.workspaces.no_results') }}
|
|
283
|
+
</p>
|
|
284
|
+
<div v-if="workspaces.length" class="bg-border mx-0.5 my-1 h-px" />
|
|
285
|
+
<button
|
|
286
|
+
v-if="canCreateWorkspace"
|
|
287
|
+
type="button"
|
|
288
|
+
class="text-primary w-full justify-start border-0 bg-transparent px-[9px] py-2 text-left text-[13px]"
|
|
289
|
+
@click="openCreateModal"
|
|
290
|
+
>
|
|
291
|
+
+ {{ $t('saas.workspaces.create.button') }}
|
|
292
|
+
</button>
|
|
293
|
+
</div>
|
|
294
|
+
</template>
|
|
295
|
+
</UPopover>
|
|
296
|
+
|
|
297
|
+
<UModal
|
|
298
|
+
v-model:open="isCreateOpen"
|
|
299
|
+
:title="$t('saas.workspaces.create.title')"
|
|
300
|
+
:description="$t('saas.workspaces.create.self_serve.description')"
|
|
301
|
+
>
|
|
302
|
+
<template #body>
|
|
303
|
+
<DmsSaasWorkspaceCreateModal :on-success-callback="onWorkspaceCreated" />
|
|
304
|
+
</template>
|
|
305
|
+
</UModal>
|
|
247
306
|
</template>
|
|
@@ -448,7 +448,7 @@ onMounted(async () => {
|
|
|
448
448
|
<i18n-t keypath="saas.register.legal_acceptance" tag="span">
|
|
449
449
|
<template #terms_and_conditions>
|
|
450
450
|
<DmsLink
|
|
451
|
-
to="/
|
|
451
|
+
to="/terms-and-conditions"
|
|
452
452
|
target="_blank"
|
|
453
453
|
class="text-primary underline"
|
|
454
454
|
>
|
|
@@ -457,7 +457,7 @@ onMounted(async () => {
|
|
|
457
457
|
</template>
|
|
458
458
|
<template #privacy_policy>
|
|
459
459
|
<DmsLink
|
|
460
|
-
to="/
|
|
460
|
+
to="/privacy-policy"
|
|
461
461
|
target="_blank"
|
|
462
462
|
class="text-primary underline"
|
|
463
463
|
>
|
|
@@ -6,9 +6,9 @@ const TERMS_OF_USE_LABEL = "saas.legal.terms_of_use";
|
|
|
6
6
|
const TERMS_AND_CONDITIONS_LABEL = "saas.legal.terms_and_conditions";
|
|
7
7
|
const PRIVACY_POLICY_LABEL = "saas.legal.privacy_policy";
|
|
8
8
|
|
|
9
|
-
const TERMS_OF_USE_ROUTE = "/
|
|
10
|
-
const TERMS_AND_CONDITIONS_ROUTE = "/
|
|
11
|
-
const PRIVACY_POLICY_ROUTE = "/
|
|
9
|
+
const TERMS_OF_USE_ROUTE = "/terms-of-use";
|
|
10
|
+
const TERMS_AND_CONDITIONS_ROUTE = "/terms-and-conditions";
|
|
11
|
+
const PRIVACY_POLICY_ROUTE = "/privacy-policy";
|
|
12
12
|
|
|
13
13
|
const ORDER_TERMS_OF_USE = 100;
|
|
14
14
|
const ORDER_TERMS_AND_CONDITIONS = 200;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antelopejs/dms-saas",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"zod": "^3.24.4"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@antelopejs/core": "
|
|
45
|
+
"@antelopejs/core": "1.8.0",
|
|
46
46
|
"@antelopejs/dms": ">=0.3.5 <1.0.0",
|
|
47
|
-
"@antelopejs/dms-frontend": "
|
|
47
|
+
"@antelopejs/dms-frontend": "0.2.0",
|
|
48
48
|
"@antelopejs/file-storage-local": "0.1.4",
|
|
49
49
|
"@antelopejs/mongodb": "1.3.0",
|
|
50
50
|
"@antelopejs/tooling-configs": ">=0.0.6 <1.0.0",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"build": "pnpm --filter @antelopejs/interface-dms-saas build && rimraf dist && tsc -p tsconfig.build.json",
|
|
75
|
-
"test:frontend": "ajs
|
|
75
|
+
"test:frontend": "ajs dms verify-source --layer node_modules/@antelopejs/dms/frontend-vue --module frontend-vue",
|
|
76
76
|
"frontend:dev": "cd playground && pnpm frontend:dev",
|
|
77
77
|
"dev": "ajs project run -w -p playground",
|
|
78
78
|
"stripe:webhooks": "stripe listen --forward-to localhost:5010/api/saas/webhooks/stripe",
|