@oneclick.dev/cms-core-modules 0.0.100 → 0.0.102
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/Acquisition-Br1Pfny3.js +1 -0
- package/dist/{Acquisition-D_Qx7XRY.mjs → Acquisition-CPlZzUBo.mjs} +40 -40
- package/dist/Audience-BfkrmBuQ.js +1 -0
- package/dist/{Audience-BdlrWkY-.mjs → Audience-DTblSAiL.mjs} +89 -89
- package/dist/Content-BHr_rPVY.js +1 -0
- package/dist/{Content-DW6xvbUo.mjs → Content-CYOZKvWK.mjs} +56 -56
- package/dist/Overview-BrCwozey.js +1 -0
- package/dist/{Overview-gJSvftdE.mjs → Overview-kaMhsIUq.mjs} +21 -21
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CL5kbDII.mjs +2782 -0
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-DcyyNvf6.js +349 -0
- package/dist/SendPush-COns44j7.js +1 -0
- package/dist/SendPush-CPIOjVX4.mjs +184 -0
- package/dist/SeoHealth-09sEOu3G.js +1 -0
- package/dist/SeoHealth-BzcWd_w7.mjs +615 -0
- package/dist/{agenda-DMT75Qfo.mjs → agenda-CCOjPiwP.mjs} +1 -1
- package/dist/{agenda-DxD4RMsy.js → agenda-CNPQfaIQ.js} +1 -1
- package/dist/cms-core-modules.css +1 -1
- package/dist/{index-BbqRTXuU.js → index-BOnqrBfY.js} +1 -1
- package/dist/{index-D4GsbUId.mjs → index-Bj0qaL1N.mjs} +1 -1
- package/dist/index-CJQQBRLY.js +1 -0
- package/dist/{index-D7JBu6iT.mjs → index-CZn2nDLv.mjs} +6 -6
- package/dist/index-CsVeM3PA.mjs +24 -0
- package/dist/index-DjWuIBxh.js +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.mjs +102 -81
- package/dist/{orders-BRfXlWgV.mjs → orders-BJV5vRQr.mjs} +1 -1
- package/dist/{orders-CrCz1WTR.js → orders-C1C5IEIP.js} +1 -1
- package/dist/src/googleAnalytics/components/seo-health/SeoClicksChart.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoImpressionsChart.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoKeywordsTab.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoKpiCards.vue.d.ts +10 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoMappingTab.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoPagesTab.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/SeoRankingDistribution.vue.d.ts +5 -0
- package/dist/src/googleAnalytics/components/seo-health/utils.d.ts +6 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/push-notifications/components/PreviewAndroid.vue.d.ts +28 -0
- package/dist/src/push-notifications/components/PreviewIPhone.vue.d.ts +28 -0
- package/dist/src/push-notifications/components/PushPreview.vue.d.ts +28 -0
- package/dist/src/push-notifications/config.d.ts +13 -0
- package/dist/src/push-notifications/index.d.ts +25 -0
- package/dist/src/push-notifications/index.vue.d.ts +22 -0
- package/dist/src/push-notifications/metadata.d.ts +2 -0
- package/dist/src/push-notifications/pages/SendPush.vue.d.ts +14 -0
- package/dist/src/push-notifications/permissions.d.ts +5 -0
- package/dist/src/push-notifications/routes.d.ts +5 -0
- package/dist/src/push-notifications/tools.d.ts +1 -0
- package/dist/src/push-notifications/types.d.ts +0 -0
- package/package.json +2 -2
- package/src/push-notifications/tools.ts +24 -0
- package/dist/Acquisition-_-cq972V.js +0 -1
- package/dist/Audience-QnFQs93n.js +0 -1
- package/dist/Content-C-4Cdniz.js +0 -1
- package/dist/Overview-Da0XexiT.js +0 -1
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-COfCOMsz.js +0 -349
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CYXkhhdp.mjs +0 -2383
- package/dist/SeoHealth-Bc5chnaa.mjs +0 -523
- package/dist/SeoHealth-BkpJ1F2Y.js +0 -1
- package/dist/index-DwHYfZl_.js +0 -1
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
import { defineComponent as w, resolveComponent as M, openBlock as a, createElementBlock as m, createVNode as n, withCtx as v, createElementVNode as e, unref as s, createTextVNode as x, toDisplayString as d, normalizeClass as b, computed as T, createBlock as k, normalizeStyle as z, createCommentVNode as $, Fragment as R, renderList as B, ref as _, watch as te, onMounted as se } from "vue";
|
|
2
|
+
import { useModule as oe, useModuleRoute as ne, useModuleBreadcrumbs as re } from "@oneclick.dev/cms-kit";
|
|
3
|
+
import { MousePointerClick as K, Eye as E, TrendingUp as le, Hash as ae, RefreshCw as ie, AlertTriangle as de, Loader2 as ue, Search as ce, FileText as me, ArrowUpRight as xe } from "lucide-vue-next";
|
|
4
|
+
import "./index-CMk3uhUt.mjs";
|
|
5
|
+
import { componentToString as V, ChartTooltipContent as X } from "@oneclick.dev/cms-kit/charts";
|
|
6
|
+
import { S as j, C as U, A as G, z as J } from "./index-_2lRVt_k.mjs";
|
|
7
|
+
import { C as Q, a as W } from "./index-p5Uqu8c2.mjs";
|
|
8
|
+
function S(t) {
|
|
9
|
+
return t >= 1e6 ? `${(t / 1e6).toFixed(1)}M` : t >= 1e3 ? `${(t / 1e3).toFixed(1)}K` : Math.round(t).toString();
|
|
10
|
+
}
|
|
11
|
+
function I(t) {
|
|
12
|
+
return `${(t * 100).toFixed(1)}%`;
|
|
13
|
+
}
|
|
14
|
+
function q(t) {
|
|
15
|
+
return t.toFixed(1);
|
|
16
|
+
}
|
|
17
|
+
function pe(t) {
|
|
18
|
+
return t <= 3 ? "text-emerald-600 dark:text-emerald-400" : t <= 10 ? "text-blue-600 dark:text-blue-400" : t <= 20 ? "text-amber-600 dark:text-amber-400" : "text-red-600 dark:text-red-400";
|
|
19
|
+
}
|
|
20
|
+
function O(t) {
|
|
21
|
+
return t <= 3 ? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400" : t <= 10 ? "bg-blue-500/10 text-blue-600 dark:text-blue-400" : t <= 20 ? "bg-amber-500/10 text-amber-600 dark:text-amber-400" : "bg-red-500/10 text-red-600 dark:text-red-400";
|
|
22
|
+
}
|
|
23
|
+
function Y(t) {
|
|
24
|
+
try {
|
|
25
|
+
return new URL(t).pathname;
|
|
26
|
+
} catch {
|
|
27
|
+
return t;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const fe = { class: "grid grid-cols-2 @3xl:grid-cols-4 gap-4" }, ge = { class: "flex items-center flex-wrap gap-2 text-xs text-muted-foreground" }, ve = { class: "text-2xl font-bold tabular-nums" }, ye = { class: "flex items-center flex-wrap gap-2 text-xs text-muted-foreground" }, he = { class: "text-2xl font-bold tabular-nums" }, _e = { class: "flex items-center flex-wrap gap-2 text-xs text-muted-foreground" }, ke = { class: "text-2xl font-bold tabular-nums" }, be = { class: "flex items-center flex-wrap gap-2 text-xs text-muted-foreground" }, $e = /* @__PURE__ */ w({
|
|
31
|
+
__name: "SeoKpiCards",
|
|
32
|
+
props: {
|
|
33
|
+
totals: {}
|
|
34
|
+
},
|
|
35
|
+
setup(t) {
|
|
36
|
+
return (p, c) => {
|
|
37
|
+
const r = M("Card");
|
|
38
|
+
return a(), m("div", fe, [
|
|
39
|
+
n(r, { class: "p-4 space-y-1" }, {
|
|
40
|
+
default: v(() => [
|
|
41
|
+
e("div", ge, [
|
|
42
|
+
n(s(K), { class: "size-3.5 shrink-0" }),
|
|
43
|
+
c[0] || (c[0] = x(" Total Clicks ", -1))
|
|
44
|
+
]),
|
|
45
|
+
e("p", ve, d(s(S)(t.totals.clicks)), 1)
|
|
46
|
+
]),
|
|
47
|
+
_: 1
|
|
48
|
+
}),
|
|
49
|
+
n(r, { class: "p-4 space-y-1" }, {
|
|
50
|
+
default: v(() => [
|
|
51
|
+
e("div", ye, [
|
|
52
|
+
n(s(E), { class: "size-3.5 shrink-0" }),
|
|
53
|
+
c[1] || (c[1] = x(" Total Impressions ", -1))
|
|
54
|
+
]),
|
|
55
|
+
e("p", he, d(s(S)(t.totals.impressions)), 1)
|
|
56
|
+
]),
|
|
57
|
+
_: 1
|
|
58
|
+
}),
|
|
59
|
+
n(r, { class: "p-4 space-y-1" }, {
|
|
60
|
+
default: v(() => [
|
|
61
|
+
e("div", _e, [
|
|
62
|
+
n(s(le), { class: "size-3.5 shrink-0" }),
|
|
63
|
+
c[2] || (c[2] = x(" Average CTR ", -1))
|
|
64
|
+
]),
|
|
65
|
+
e("p", ke, d(s(I)(t.totals.ctr)), 1)
|
|
66
|
+
]),
|
|
67
|
+
_: 1
|
|
68
|
+
}),
|
|
69
|
+
n(r, { class: "p-4 space-y-1" }, {
|
|
70
|
+
default: v(() => [
|
|
71
|
+
e("div", be, [
|
|
72
|
+
n(s(ae), { class: "size-3.5 shrink-0" }),
|
|
73
|
+
c[3] || (c[3] = x(" Avg Position ", -1))
|
|
74
|
+
]),
|
|
75
|
+
e("p", {
|
|
76
|
+
class: b(["text-2xl font-bold tabular-nums", s(pe)(t.totals.avgPosition)])
|
|
77
|
+
}, d(s(q)(t.totals.avgPosition)), 3)
|
|
78
|
+
]),
|
|
79
|
+
_: 1
|
|
80
|
+
})
|
|
81
|
+
]);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}), we = { class: "flex items-center gap-4" }, Ce = { class: "flex items-center gap-2" }, Te = { class: "text-xs" }, Se = { class: "flex items-center gap-2" }, Pe = { class: "text-xs" }, De = { class: "flex items-center gap-2" }, ze = { class: "text-xs" }, Me = { class: "flex items-center gap-2" }, Re = { class: "text-xs" }, Fe = {
|
|
85
|
+
key: 0,
|
|
86
|
+
class: "flex h-3 rounded-full overflow-hidden mt-3"
|
|
87
|
+
}, Le = /* @__PURE__ */ w({
|
|
88
|
+
__name: "SeoRankingDistribution",
|
|
89
|
+
props: {
|
|
90
|
+
keywords: {}
|
|
91
|
+
},
|
|
92
|
+
setup(t) {
|
|
93
|
+
const p = t, c = T(() => p.keywords.filter((l) => l.position <= 3).length), r = T(() => p.keywords.filter((l) => l.position <= 10).length), f = T(() => p.keywords.filter((l) => l.position <= 20).length);
|
|
94
|
+
return (l, o) => {
|
|
95
|
+
const u = M("Card");
|
|
96
|
+
return a(), k(u, { class: "p-4" }, {
|
|
97
|
+
default: v(() => [
|
|
98
|
+
o[8] || (o[8] = e("h3", { class: "text-sm font-medium mb-3" }, "Keyword Ranking Distribution", -1)),
|
|
99
|
+
e("div", we, [
|
|
100
|
+
e("div", Ce, [
|
|
101
|
+
o[1] || (o[1] = e("span", { class: "inline-block w-3 h-3 rounded-full bg-emerald-500" }, null, -1)),
|
|
102
|
+
e("span", Te, [
|
|
103
|
+
o[0] || (o[0] = x("Top 3: ", -1)),
|
|
104
|
+
e("strong", null, d(c.value), 1)
|
|
105
|
+
])
|
|
106
|
+
]),
|
|
107
|
+
e("div", Se, [
|
|
108
|
+
o[3] || (o[3] = e("span", { class: "inline-block w-3 h-3 rounded-full bg-blue-500" }, null, -1)),
|
|
109
|
+
e("span", Pe, [
|
|
110
|
+
o[2] || (o[2] = x("Top 10: ", -1)),
|
|
111
|
+
e("strong", null, d(r.value), 1)
|
|
112
|
+
])
|
|
113
|
+
]),
|
|
114
|
+
e("div", De, [
|
|
115
|
+
o[5] || (o[5] = e("span", { class: "inline-block w-3 h-3 rounded-full bg-amber-500" }, null, -1)),
|
|
116
|
+
e("span", ze, [
|
|
117
|
+
o[4] || (o[4] = x("Top 20: ", -1)),
|
|
118
|
+
e("strong", null, d(f.value), 1)
|
|
119
|
+
])
|
|
120
|
+
]),
|
|
121
|
+
e("div", Me, [
|
|
122
|
+
o[7] || (o[7] = e("span", { class: "inline-block w-3 h-3 rounded-full bg-red-500" }, null, -1)),
|
|
123
|
+
e("span", Re, [
|
|
124
|
+
o[6] || (o[6] = x("20+: ", -1)),
|
|
125
|
+
e("strong", null, d(t.keywords.length - f.value), 1)
|
|
126
|
+
])
|
|
127
|
+
])
|
|
128
|
+
]),
|
|
129
|
+
t.keywords.length > 0 ? (a(), m("div", Fe, [
|
|
130
|
+
e("div", {
|
|
131
|
+
class: "bg-emerald-500 transition-all",
|
|
132
|
+
style: z({ width: `${c.value / t.keywords.length * 100}%` })
|
|
133
|
+
}, null, 4),
|
|
134
|
+
e("div", {
|
|
135
|
+
class: "bg-blue-500 transition-all",
|
|
136
|
+
style: z({ width: `${(r.value - c.value) / t.keywords.length * 100}%` })
|
|
137
|
+
}, null, 4),
|
|
138
|
+
e("div", {
|
|
139
|
+
class: "bg-amber-500 transition-all",
|
|
140
|
+
style: z({ width: `${(f.value - r.value) / t.keywords.length * 100}%` })
|
|
141
|
+
}, null, 4),
|
|
142
|
+
e("div", {
|
|
143
|
+
class: "bg-red-500 transition-all",
|
|
144
|
+
style: z({ width: `${(t.keywords.length - f.value) / t.keywords.length * 100}%` })
|
|
145
|
+
}, null, 4)
|
|
146
|
+
])) : $("", !0)
|
|
147
|
+
]),
|
|
148
|
+
_: 1
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}), Ae = {
|
|
153
|
+
key: 0,
|
|
154
|
+
class: "h-48"
|
|
155
|
+
}, Ne = {
|
|
156
|
+
key: 1,
|
|
157
|
+
class: "text-xs text-muted-foreground text-center py-10"
|
|
158
|
+
}, Ue = /* @__PURE__ */ w({
|
|
159
|
+
__name: "SeoClicksChart",
|
|
160
|
+
props: {
|
|
161
|
+
trends: {}
|
|
162
|
+
},
|
|
163
|
+
setup(t) {
|
|
164
|
+
const p = t, c = (o, u) => u, r = (o) => o.clicks || 0, f = (o) => {
|
|
165
|
+
const u = p.trends[Math.round(o)];
|
|
166
|
+
if (!u) return "";
|
|
167
|
+
const g = new Date(u.date);
|
|
168
|
+
return `${g.getDate()}/${g.getMonth() + 1}`;
|
|
169
|
+
}, l = (o) => {
|
|
170
|
+
const u = p.trends[Math.round(Number(o))];
|
|
171
|
+
return u ? new Date(u.date).toLocaleDateString(void 0, { weekday: "short", month: "short", day: "numeric" }) : "";
|
|
172
|
+
};
|
|
173
|
+
return (o, u) => {
|
|
174
|
+
const g = M("Card");
|
|
175
|
+
return a(), k(g, { class: "p-4" }, {
|
|
176
|
+
default: v(() => [
|
|
177
|
+
u[0] || (u[0] = e("h3", { class: "text-sm font-medium mb-3" }, "Clicks Over Time", -1)),
|
|
178
|
+
t.trends.length > 1 ? (a(), m("div", Ae, [
|
|
179
|
+
n(s(j), {
|
|
180
|
+
data: t.trends,
|
|
181
|
+
height: 180
|
|
182
|
+
}, {
|
|
183
|
+
default: v(() => [
|
|
184
|
+
n(s(Q), {
|
|
185
|
+
x: c,
|
|
186
|
+
y: r,
|
|
187
|
+
color: "#3b82f6",
|
|
188
|
+
opacity: 0.1,
|
|
189
|
+
curveType: "monotoneX"
|
|
190
|
+
}),
|
|
191
|
+
n(s(W), {
|
|
192
|
+
x: c,
|
|
193
|
+
y: r,
|
|
194
|
+
color: "#3b82f6",
|
|
195
|
+
curveType: "monotoneX"
|
|
196
|
+
}),
|
|
197
|
+
n(s(U), {
|
|
198
|
+
type: "x",
|
|
199
|
+
tickFormat: f,
|
|
200
|
+
numTicks: 5,
|
|
201
|
+
gridLine: !1
|
|
202
|
+
}),
|
|
203
|
+
n(s(U), {
|
|
204
|
+
type: "y",
|
|
205
|
+
gridLine: !0,
|
|
206
|
+
numTicks: 4
|
|
207
|
+
}),
|
|
208
|
+
n(s(G), {
|
|
209
|
+
template: (P) => s(V)(s(X), { namePayload: [{ name: "Clicks", value: P.clicks, color: "#3b82f6" }], labelFormatter: l })
|
|
210
|
+
}, null, 8, ["template"]),
|
|
211
|
+
n(s(J))
|
|
212
|
+
]),
|
|
213
|
+
_: 1
|
|
214
|
+
}, 8, ["data"])
|
|
215
|
+
])) : (a(), m("p", Ne, "Not enough data for chart"))
|
|
216
|
+
]),
|
|
217
|
+
_: 1
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}), Be = {
|
|
222
|
+
key: 0,
|
|
223
|
+
class: "h-48"
|
|
224
|
+
}, Ke = {
|
|
225
|
+
key: 1,
|
|
226
|
+
class: "text-xs text-muted-foreground text-center py-10"
|
|
227
|
+
}, qe = /* @__PURE__ */ w({
|
|
228
|
+
__name: "SeoImpressionsChart",
|
|
229
|
+
props: {
|
|
230
|
+
trends: {}
|
|
231
|
+
},
|
|
232
|
+
setup(t) {
|
|
233
|
+
const p = t, c = (o, u) => u, r = (o) => o.impressions || 0, f = (o) => {
|
|
234
|
+
const u = p.trends[Math.round(o)];
|
|
235
|
+
if (!u) return "";
|
|
236
|
+
const g = new Date(u.date);
|
|
237
|
+
return `${g.getDate()}/${g.getMonth() + 1}`;
|
|
238
|
+
}, l = (o) => {
|
|
239
|
+
const u = p.trends[Math.round(Number(o))];
|
|
240
|
+
return u ? new Date(u.date).toLocaleDateString(void 0, { weekday: "short", month: "short", day: "numeric" }) : "";
|
|
241
|
+
};
|
|
242
|
+
return (o, u) => {
|
|
243
|
+
const g = M("Card");
|
|
244
|
+
return a(), k(g, { class: "p-4" }, {
|
|
245
|
+
default: v(() => [
|
|
246
|
+
u[0] || (u[0] = e("h3", { class: "text-sm font-medium mb-3" }, "Impressions Over Time", -1)),
|
|
247
|
+
t.trends.length > 1 ? (a(), m("div", Be, [
|
|
248
|
+
n(s(j), {
|
|
249
|
+
data: t.trends,
|
|
250
|
+
height: 180
|
|
251
|
+
}, {
|
|
252
|
+
default: v(() => [
|
|
253
|
+
n(s(Q), {
|
|
254
|
+
x: c,
|
|
255
|
+
y: r,
|
|
256
|
+
color: "#8b5cf6",
|
|
257
|
+
opacity: 0.1,
|
|
258
|
+
curveType: "monotoneX"
|
|
259
|
+
}),
|
|
260
|
+
n(s(W), {
|
|
261
|
+
x: c,
|
|
262
|
+
y: r,
|
|
263
|
+
color: "#8b5cf6",
|
|
264
|
+
curveType: "monotoneX"
|
|
265
|
+
}),
|
|
266
|
+
n(s(U), {
|
|
267
|
+
type: "x",
|
|
268
|
+
tickFormat: f,
|
|
269
|
+
numTicks: 5,
|
|
270
|
+
gridLine: !1
|
|
271
|
+
}),
|
|
272
|
+
n(s(U), {
|
|
273
|
+
type: "y",
|
|
274
|
+
gridLine: !0,
|
|
275
|
+
numTicks: 4
|
|
276
|
+
}),
|
|
277
|
+
n(s(G), {
|
|
278
|
+
template: (P) => s(V)(s(X), { namePayload: [{ name: "Impressions", value: P.impressions, color: "#8b5cf6" }], labelFormatter: l })
|
|
279
|
+
}, null, 8, ["template"]),
|
|
280
|
+
n(s(J))
|
|
281
|
+
]),
|
|
282
|
+
_: 1
|
|
283
|
+
}, 8, ["data"])
|
|
284
|
+
])) : (a(), m("p", Ke, "Not enough data for chart"))
|
|
285
|
+
]),
|
|
286
|
+
_: 1
|
|
287
|
+
});
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}), Ee = { class: "divide-y" }, Ie = {
|
|
291
|
+
key: 0,
|
|
292
|
+
class: "p-8 text-center text-sm text-muted-foreground"
|
|
293
|
+
}, Oe = { class: "flex items-start @sm:items-center gap-3" }, He = { class: "text-xs font-medium text-muted-foreground w-6 text-right shrink-0 mt-0.5 @sm:mt-0" }, Ve = { class: "flex-1 min-w-0" }, Xe = { class: "flex flex-col @sm:flex-row @sm:items-center gap-2 @sm:gap-3" }, je = { class: "flex-1 min-w-0" }, Ge = { class: "text-sm font-medium truncate" }, Je = { class: "h-1.5 rounded-full bg-muted overflow-hidden mt-1.5 max-w-xs" }, Qe = { class: "flex items-center gap-3 @sm:gap-4 text-xs text-muted-foreground @sm:shrink-0 flex-wrap" }, We = { class: "flex items-center gap-1" }, Ye = { class: "flex items-center gap-1" }, Ze = /* @__PURE__ */ w({
|
|
294
|
+
__name: "SeoKeywordsTab",
|
|
295
|
+
props: {
|
|
296
|
+
keywords: {}
|
|
297
|
+
},
|
|
298
|
+
setup(t) {
|
|
299
|
+
const p = t, c = T(() => Math.max(...p.keywords.map((r) => r.clicks), 1));
|
|
300
|
+
return (r, f) => (a(), m("div", Ee, [
|
|
301
|
+
t.keywords.length === 0 ? (a(), m("div", Ie, " No keyword data found for this period. ")) : $("", !0),
|
|
302
|
+
(a(!0), m(R, null, B(t.keywords, (l, o) => (a(), m("div", {
|
|
303
|
+
key: o,
|
|
304
|
+
class: "px-4 py-3 hover:bg-muted/30 transition-colors"
|
|
305
|
+
}, [
|
|
306
|
+
e("div", Oe, [
|
|
307
|
+
e("span", He, d(o + 1) + ".", 1),
|
|
308
|
+
e("div", Ve, [
|
|
309
|
+
e("div", Xe, [
|
|
310
|
+
e("div", je, [
|
|
311
|
+
e("p", Ge, d(l.query), 1),
|
|
312
|
+
e("div", Je, [
|
|
313
|
+
e("div", {
|
|
314
|
+
class: "h-full rounded-full bg-blue-500/70",
|
|
315
|
+
style: z({ width: `${l.clicks / c.value * 100}%` })
|
|
316
|
+
}, null, 4)
|
|
317
|
+
])
|
|
318
|
+
]),
|
|
319
|
+
e("div", Qe, [
|
|
320
|
+
e("span", We, [
|
|
321
|
+
n(s(K), { class: "size-3" }),
|
|
322
|
+
x(" " + d(s(S)(l.clicks)), 1)
|
|
323
|
+
]),
|
|
324
|
+
e("span", Ye, [
|
|
325
|
+
n(s(E), { class: "size-3" }),
|
|
326
|
+
x(" " + d(s(S)(l.impressions)), 1)
|
|
327
|
+
]),
|
|
328
|
+
e("span", null, d(s(I)(l.ctr)), 1),
|
|
329
|
+
e("span", {
|
|
330
|
+
class: b(["inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium", s(O)(l.position)])
|
|
331
|
+
}, " #" + d(s(q)(l.position)), 3)
|
|
332
|
+
])
|
|
333
|
+
])
|
|
334
|
+
])
|
|
335
|
+
])
|
|
336
|
+
]))), 128))
|
|
337
|
+
]));
|
|
338
|
+
}
|
|
339
|
+
}), et = { class: "divide-y" }, tt = {
|
|
340
|
+
key: 0,
|
|
341
|
+
class: "p-8 text-center text-sm text-muted-foreground"
|
|
342
|
+
}, st = { class: "flex items-start @sm:items-center gap-3" }, ot = { class: "text-xs font-medium text-muted-foreground w-6 text-right shrink-0 mt-0.5 @sm:mt-0" }, nt = { class: "flex-1 min-w-0" }, rt = { class: "flex flex-col @sm:flex-row @sm:items-center gap-2 @sm:gap-3" }, lt = { class: "flex-1 min-w-0" }, at = ["title"], it = { class: "h-1.5 rounded-full bg-muted overflow-hidden mt-1.5 max-w-xs" }, dt = { class: "flex items-center gap-3 @sm:gap-4 text-xs text-muted-foreground @sm:shrink-0 flex-wrap" }, ut = { class: "flex items-center gap-1" }, ct = { class: "flex items-center gap-1" }, mt = /* @__PURE__ */ w({
|
|
343
|
+
__name: "SeoPagesTab",
|
|
344
|
+
props: {
|
|
345
|
+
pages: {}
|
|
346
|
+
},
|
|
347
|
+
setup(t) {
|
|
348
|
+
const p = t, c = T(() => Math.max(...p.pages.map((r) => r.clicks), 1));
|
|
349
|
+
return (r, f) => (a(), m("div", et, [
|
|
350
|
+
t.pages.length === 0 ? (a(), m("div", tt, " No page data found for this period. ")) : $("", !0),
|
|
351
|
+
(a(!0), m(R, null, B(t.pages, (l, o) => (a(), m("div", {
|
|
352
|
+
key: o,
|
|
353
|
+
class: "px-4 py-3 hover:bg-muted/30 transition-colors"
|
|
354
|
+
}, [
|
|
355
|
+
e("div", st, [
|
|
356
|
+
e("span", ot, d(o + 1) + ".", 1),
|
|
357
|
+
e("div", nt, [
|
|
358
|
+
e("div", rt, [
|
|
359
|
+
e("div", lt, [
|
|
360
|
+
e("p", {
|
|
361
|
+
class: "text-sm font-medium truncate",
|
|
362
|
+
title: l.page
|
|
363
|
+
}, d(s(Y)(l.page)), 9, at),
|
|
364
|
+
e("div", it, [
|
|
365
|
+
e("div", {
|
|
366
|
+
class: "h-full rounded-full bg-violet-500/70",
|
|
367
|
+
style: z({ width: `${l.clicks / c.value * 100}%` })
|
|
368
|
+
}, null, 4)
|
|
369
|
+
])
|
|
370
|
+
]),
|
|
371
|
+
e("div", dt, [
|
|
372
|
+
e("span", ut, [
|
|
373
|
+
n(s(K), { class: "size-3" }),
|
|
374
|
+
x(" " + d(s(S)(l.clicks)), 1)
|
|
375
|
+
]),
|
|
376
|
+
e("span", ct, [
|
|
377
|
+
n(s(E), { class: "size-3" }),
|
|
378
|
+
x(" " + d(s(S)(l.impressions)), 1)
|
|
379
|
+
]),
|
|
380
|
+
e("span", null, d(s(I)(l.ctr)), 1),
|
|
381
|
+
e("span", {
|
|
382
|
+
class: b(["inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium", s(O)(l.position)])
|
|
383
|
+
}, " #" + d(s(q)(l.position)), 3)
|
|
384
|
+
])
|
|
385
|
+
])
|
|
386
|
+
])
|
|
387
|
+
])
|
|
388
|
+
]))), 128))
|
|
389
|
+
]));
|
|
390
|
+
}
|
|
391
|
+
}), xt = { class: "divide-y" }, pt = {
|
|
392
|
+
key: 0,
|
|
393
|
+
class: "p-8 text-center text-sm text-muted-foreground"
|
|
394
|
+
}, ft = { class: "flex items-start gap-3" }, gt = { class: "text-xs font-medium text-muted-foreground w-6 text-right shrink-0 mt-0.5" }, vt = { class: "flex-1 min-w-0" }, yt = { class: "flex flex-col @sm:flex-row @sm:items-center gap-2 @sm:gap-3" }, ht = { class: "flex-1 min-w-0 space-y-0.5" }, _t = { class: "text-sm font-medium" }, kt = ["title"], bt = { class: "flex items-center gap-3 @sm:gap-4 text-xs text-muted-foreground @sm:shrink-0 flex-wrap" }, $t = { class: "flex items-center gap-1" }, wt = /* @__PURE__ */ w({
|
|
395
|
+
__name: "SeoMappingTab",
|
|
396
|
+
props: {
|
|
397
|
+
queryPages: {}
|
|
398
|
+
},
|
|
399
|
+
setup(t) {
|
|
400
|
+
return (p, c) => (a(), m("div", xt, [
|
|
401
|
+
t.queryPages.length === 0 ? (a(), m("div", pt, " No query-page data found for this period. ")) : $("", !0),
|
|
402
|
+
(a(!0), m(R, null, B(t.queryPages, (r, f) => (a(), m("div", {
|
|
403
|
+
key: f,
|
|
404
|
+
class: "px-4 py-3 hover:bg-muted/30 transition-colors"
|
|
405
|
+
}, [
|
|
406
|
+
e("div", ft, [
|
|
407
|
+
e("span", gt, d(f + 1) + ".", 1),
|
|
408
|
+
e("div", vt, [
|
|
409
|
+
e("div", yt, [
|
|
410
|
+
e("div", ht, [
|
|
411
|
+
e("p", _t, d(r.query), 1),
|
|
412
|
+
e("p", {
|
|
413
|
+
class: "text-xs text-muted-foreground truncate",
|
|
414
|
+
title: r.page
|
|
415
|
+
}, "→ " + d(s(Y)(r.page)), 9, kt)
|
|
416
|
+
]),
|
|
417
|
+
e("div", bt, [
|
|
418
|
+
e("span", $t, [
|
|
419
|
+
n(s(K), { class: "size-3" }),
|
|
420
|
+
x(" " + d(s(S)(r.clicks)), 1)
|
|
421
|
+
]),
|
|
422
|
+
e("span", {
|
|
423
|
+
class: b(["inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium", s(O)(r.position)])
|
|
424
|
+
}, " #" + d(s(q)(r.position)), 3)
|
|
425
|
+
])
|
|
426
|
+
])
|
|
427
|
+
])
|
|
428
|
+
])
|
|
429
|
+
]))), 128))
|
|
430
|
+
]));
|
|
431
|
+
}
|
|
432
|
+
}), Ct = { class: "flex flex-col gap-6 w-full max-w-7xl mx-auto py-8" }, Tt = { class: "flex justify-between gap-4 flex-col @lg:flex-row @lg:items-center" }, St = {
|
|
433
|
+
key: 0,
|
|
434
|
+
class: "flex items-center gap-2"
|
|
435
|
+
}, Pt = { class: "flex items-center border rounded-lg overflow-hidden" }, Dt = ["onClick"], zt = { class: "text-sm text-destructive font-medium" }, Mt = {
|
|
436
|
+
key: 3,
|
|
437
|
+
class: "flex items-center justify-center py-20"
|
|
438
|
+
}, Rt = { class: "grid grid-cols-1 @3xl:grid-cols-2 gap-4" }, Ft = { class: "border-b" }, Lt = { class: "flex" }, Ot = /* @__PURE__ */ w({
|
|
439
|
+
__name: "SeoHealth",
|
|
440
|
+
setup(t) {
|
|
441
|
+
const { config: p } = oe(), { moduleId: c } = ne();
|
|
442
|
+
re(() => [{ label: "SEO Health" }]);
|
|
443
|
+
const r = _(!0), f = _(null), l = _("30"), o = _([]), u = _({
|
|
444
|
+
clicks: 0,
|
|
445
|
+
impressions: 0,
|
|
446
|
+
ctr: 0,
|
|
447
|
+
avgPosition: 0
|
|
448
|
+
}), g = _([]), P = _([]), H = _([]), F = T(() => !!(p.serviceAccount && p.propertyId && p.siteUrl)), Z = T(() => !!p.siteUrl);
|
|
449
|
+
function L(C) {
|
|
450
|
+
return `/api/v1/modules/${c}${C}`;
|
|
451
|
+
}
|
|
452
|
+
const ee = [
|
|
453
|
+
{ label: "7d", value: "7" },
|
|
454
|
+
{ label: "14d", value: "14" },
|
|
455
|
+
{ label: "30d", value: "30" },
|
|
456
|
+
{ label: "90d", value: "90" }
|
|
457
|
+
];
|
|
458
|
+
async function A() {
|
|
459
|
+
if (!F.value) return;
|
|
460
|
+
r.value = !0, f.value = null;
|
|
461
|
+
const C = `${l.value}daysAgo`;
|
|
462
|
+
try {
|
|
463
|
+
const [i, N, D, h] = await Promise.all([
|
|
464
|
+
$fetch(L(`/seo/trends?startDate=${C}&endDate=today`)),
|
|
465
|
+
$fetch(L(`/seo/keywords?startDate=${C}&endDate=today&limit=50`)),
|
|
466
|
+
$fetch(L(`/seo/pages?startDate=${C}&endDate=today&limit=30`)),
|
|
467
|
+
$fetch(L(`/seo/query-pages?startDate=${C}&endDate=today`))
|
|
468
|
+
]);
|
|
469
|
+
o.value = i.rows || [], u.value = i.totals || { clicks: 0, impressions: 0, ctr: 0, avgPosition: 0 }, g.value = N.rows || [], P.value = D.rows || [], H.value = h.rows || [];
|
|
470
|
+
} catch (i) {
|
|
471
|
+
f.value = i?.data?.statusMessage || i?.message || "Failed to load SEO data";
|
|
472
|
+
} finally {
|
|
473
|
+
r.value = !1;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
te(l, () => A()), se(() => {
|
|
477
|
+
F.value ? A() : r.value = !1;
|
|
478
|
+
});
|
|
479
|
+
const y = _("keywords");
|
|
480
|
+
return (C, i) => {
|
|
481
|
+
const N = M("Button"), D = M("Card");
|
|
482
|
+
return a(), m("div", Ct, [
|
|
483
|
+
e("div", Tt, [
|
|
484
|
+
i[3] || (i[3] = e("div", null, [
|
|
485
|
+
e("h1", { class: "text-2xl font-semibold" }, "SEO Health"),
|
|
486
|
+
e("p", { class: "text-muted-foreground text-sm mt-1" }, "Search Console performance & keyword rankings")
|
|
487
|
+
], -1)),
|
|
488
|
+
F.value ? (a(), m("div", St, [
|
|
489
|
+
e("div", Pt, [
|
|
490
|
+
(a(), m(R, null, B(ee, (h) => e("button", {
|
|
491
|
+
key: h.value,
|
|
492
|
+
class: b(["px-3 py-1.5 text-xs font-medium transition-colors", l.value === h.value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground hover:bg-muted"]),
|
|
493
|
+
onClick: (At) => l.value = h.value
|
|
494
|
+
}, d(h.label), 11, Dt)), 64))
|
|
495
|
+
]),
|
|
496
|
+
n(N, {
|
|
497
|
+
variant: "outline",
|
|
498
|
+
size: "icon",
|
|
499
|
+
onClick: A,
|
|
500
|
+
disabled: r.value
|
|
501
|
+
}, {
|
|
502
|
+
default: v(() => [
|
|
503
|
+
n(s(ie), {
|
|
504
|
+
class: b(["size-4", { "animate-spin": r.value }])
|
|
505
|
+
}, null, 8, ["class"])
|
|
506
|
+
]),
|
|
507
|
+
_: 1
|
|
508
|
+
}, 8, ["disabled"])
|
|
509
|
+
])) : $("", !0)
|
|
510
|
+
]),
|
|
511
|
+
Z.value ? F.value ? f.value ? (a(), k(D, {
|
|
512
|
+
key: 2,
|
|
513
|
+
class: "p-6 border-destructive/50 bg-destructive/5"
|
|
514
|
+
}, {
|
|
515
|
+
default: v(() => [
|
|
516
|
+
e("p", zt, d(f.value), 1),
|
|
517
|
+
n(N, {
|
|
518
|
+
variant: "outline",
|
|
519
|
+
size: "sm",
|
|
520
|
+
class: "mt-3",
|
|
521
|
+
onClick: A
|
|
522
|
+
}, {
|
|
523
|
+
default: v(() => [...i[7] || (i[7] = [
|
|
524
|
+
x("Retry", -1)
|
|
525
|
+
])]),
|
|
526
|
+
_: 1
|
|
527
|
+
})
|
|
528
|
+
]),
|
|
529
|
+
_: 1
|
|
530
|
+
})) : r.value ? (a(), m("div", Mt, [
|
|
531
|
+
n(s(ue), { class: "size-8 animate-spin text-muted-foreground" })
|
|
532
|
+
])) : (a(), m(R, { key: 4 }, [
|
|
533
|
+
n($e, { totals: u.value }, null, 8, ["totals"]),
|
|
534
|
+
n(Le, { keywords: g.value }, null, 8, ["keywords"]),
|
|
535
|
+
e("div", Rt, [
|
|
536
|
+
n(Ue, { trends: o.value }, null, 8, ["trends"]),
|
|
537
|
+
n(qe, { trends: o.value }, null, 8, ["trends"])
|
|
538
|
+
]),
|
|
539
|
+
n(D, { class: "overflow-hidden" }, {
|
|
540
|
+
default: v(() => [
|
|
541
|
+
e("div", Ft, [
|
|
542
|
+
e("div", Lt, [
|
|
543
|
+
e("button", {
|
|
544
|
+
class: b(["px-4 py-2.5 text-sm font-medium transition-colors border-b-2", y.value === "keywords" ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"]),
|
|
545
|
+
onClick: i[0] || (i[0] = (h) => y.value = "keywords")
|
|
546
|
+
}, [
|
|
547
|
+
n(s(ce), { class: "size-3.5 inline mr-1.5" }),
|
|
548
|
+
i[8] || (i[8] = x(" Keywords ", -1))
|
|
549
|
+
], 2),
|
|
550
|
+
e("button", {
|
|
551
|
+
class: b(["px-4 py-2.5 text-sm font-medium transition-colors border-b-2", y.value === "pages" ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"]),
|
|
552
|
+
onClick: i[1] || (i[1] = (h) => y.value = "pages")
|
|
553
|
+
}, [
|
|
554
|
+
n(s(me), { class: "size-3.5 inline mr-1.5" }),
|
|
555
|
+
i[9] || (i[9] = x(" Pages ", -1))
|
|
556
|
+
], 2),
|
|
557
|
+
e("button", {
|
|
558
|
+
class: b(["px-4 py-2.5 text-sm font-medium transition-colors border-b-2", y.value === "mapping" ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"]),
|
|
559
|
+
onClick: i[2] || (i[2] = (h) => y.value = "mapping")
|
|
560
|
+
}, [
|
|
561
|
+
n(s(xe), { class: "size-3.5 inline mr-1.5" }),
|
|
562
|
+
i[10] || (i[10] = x(" Keyword → Page ", -1))
|
|
563
|
+
], 2)
|
|
564
|
+
])
|
|
565
|
+
]),
|
|
566
|
+
y.value === "keywords" ? (a(), k(Ze, {
|
|
567
|
+
key: 0,
|
|
568
|
+
keywords: g.value
|
|
569
|
+
}, null, 8, ["keywords"])) : $("", !0),
|
|
570
|
+
y.value === "pages" ? (a(), k(mt, {
|
|
571
|
+
key: 1,
|
|
572
|
+
pages: P.value
|
|
573
|
+
}, null, 8, ["pages"])) : $("", !0),
|
|
574
|
+
y.value === "mapping" ? (a(), k(wt, {
|
|
575
|
+
key: 2,
|
|
576
|
+
queryPages: H.value
|
|
577
|
+
}, null, 8, ["queryPages"])) : $("", !0)
|
|
578
|
+
]),
|
|
579
|
+
_: 1
|
|
580
|
+
})
|
|
581
|
+
], 64)) : (a(), k(D, {
|
|
582
|
+
key: 1,
|
|
583
|
+
class: "p-8 text-center"
|
|
584
|
+
}, {
|
|
585
|
+
default: v(() => [...i[6] || (i[6] = [
|
|
586
|
+
e("p", { class: "text-lg font-medium" }, "Setup required", -1),
|
|
587
|
+
e("p", { class: "text-sm text-muted-foreground mt-1" }, "Configure your service account, property ID, and site URL in module settings.", -1)
|
|
588
|
+
])]),
|
|
589
|
+
_: 1
|
|
590
|
+
})) : (a(), k(D, {
|
|
591
|
+
key: 0,
|
|
592
|
+
class: "p-8 text-center space-y-3"
|
|
593
|
+
}, {
|
|
594
|
+
default: v(() => [
|
|
595
|
+
n(s(de), { class: "size-10 text-amber-500 mx-auto" }),
|
|
596
|
+
i[4] || (i[4] = e("p", { class: "text-lg font-medium" }, "Search Console not configured", -1)),
|
|
597
|
+
i[5] || (i[5] = e("p", { class: "text-sm text-muted-foreground max-w-md mx-auto" }, [
|
|
598
|
+
x(" Add your "),
|
|
599
|
+
e("strong", null, "Search Console Site URL"),
|
|
600
|
+
x(" in the module settings to enable SEO data. Use the exact format from Google Search Console (e.g. "),
|
|
601
|
+
e("code", null, "https://example.com"),
|
|
602
|
+
x(" or "),
|
|
603
|
+
e("code", null, "sc-domain:example.com"),
|
|
604
|
+
x("). ")
|
|
605
|
+
], -1))
|
|
606
|
+
]),
|
|
607
|
+
_: 1
|
|
608
|
+
}))
|
|
609
|
+
]);
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
export {
|
|
614
|
+
Ot as default
|
|
615
|
+
};
|
|
@@ -3,7 +3,7 @@ import { c as ue, b as de } from "./DateFormatter-2B0R-DY4.mjs";
|
|
|
3
3
|
import { X as we, Search as Ee, Clock as ge, Users as he, ChevronLeft as ve, ChevronRight as ce, Asterisk as Ie, CalendarDays as Be } from "lucide-vue-next";
|
|
4
4
|
import { _ as Le } from "./EditLayout.vue_vue_type_script_setup_true_lang-DXa-Xxue.mjs";
|
|
5
5
|
import { useModule as Se, useModuleRoute as $e, useFirebaseIntegration as Te, useModulePermissions as Ue } from "@oneclick.dev/cms-kit";
|
|
6
|
-
import { _ as je, F as Pe } from "./ReservationDetailDialog.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
import { _ as je, F as Pe } from "./ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CL5kbDII.mjs";
|
|
7
7
|
import { _ as Re } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
8
8
|
import { _ as be } from "./NewReservationDialog.vue_vue_type_script_setup_true_lang-Bc946oSc.mjs";
|
|
9
9
|
const Ne = { class: "mb-6" }, Oe = { class: "flex items-end gap-px h-24 bg-muted/30 rounded-lg p-2 overflow-visible" }, Fe = ["onClick"], Ae = { class: "absolute -top-8 left-1/2 -translate-x-1/2 bg-popover border shadow-md rounded px-2 py-1 text-xs whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10" }, Ve = { class: "font-medium" }, We = { class: "text-muted-foreground" }, He = { class: "w-full flex-1 flex items-end justify-center" }, Qe = {
|