Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .github/pr-screenshots/admin-famous-apps.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions cloudflare_workers/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import { app as statistics } from '../../supabase/functions/_backend/public/stat
import { app as translation } from '../../supabase/functions/_backend/public/translation.ts'
import { app as webhooks } from '../../supabase/functions/_backend/public/webhooks/index.ts'
import { app as credit_usage_alerts } from '../../supabase/functions/_backend/triggers/credit_usage_alerts.ts'
import { app as cron_app_fame } from '../../supabase/functions/_backend/triggers/cron_app_fame.ts'
import { app as cron_clean_orphan_images } from '../../supabase/functions/_backend/triggers/cron_clean_orphan_images.ts'
import { app as cron_clear_versions } from '../../supabase/functions/_backend/triggers/cron_clear_versions.ts'
import { app as cron_email } from '../../supabase/functions/_backend/triggers/cron_email.ts'
Expand Down Expand Up @@ -168,6 +169,7 @@ appPrivate.route('/sso/verify-dns', sso_verify_dns)
const functionNameTriggers = 'triggers'
const appTriggers = createHono(functionNameTriggers, version)
appTriggers.route('/ok', ok)
appTriggers.route('/cron_app_fame', cron_app_fame)
appTriggers.route('/cron_email', cron_email)
appTriggers.route('/cron_clear_versions', cron_clear_versions)
appTriggers.route('/cron_clean_orphan_images', cron_clean_orphan_images)
Expand Down
23 changes: 23 additions & 0 deletions messages/en.context.json
Original file line number Diff line number Diff line change
Expand Up @@ -1445,6 +1445,29 @@
"failed-to-regenerate-api-key": "Used in Capgo web console areas: pages. Role: toast or status message. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"failed-to-update-policy": "Used in Capgo web console areas: pages/settings/organization. Role: toast or status message. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"failure-rate-bps": "Used in Capgo web console areas: pages/app. Role: UI label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps": "Used in platform admin dashboard. Role: tab and page title for AI-ranked famous Capgo apps. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-all-tiers": "Used in platform admin dashboard. Role: filter option to show every fame tier. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-category": "Used in platform admin dashboard. Role: table column for app category. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-checked-at": "Used in platform admin dashboard. Role: table column for when AI last scored the app. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-devices": "Used in platform admin dashboard. Role: table column showing device count for context only. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-devices-hint": "Used in platform admin dashboard. Role: helper text that ranking ignores device count. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-empty": "Used in platform admin dashboard. Role: empty-state message when no scored apps match filters. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-famous": "Used in platform admin dashboard. Role: stats card for the famous tier. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-iconic": "Used in platform admin dashboard. Role: stats card for the iconic tier. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-min-score": "Used in platform admin dashboard. Role: numeric filter for minimum fame score. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-notable": "Used in platform admin dashboard. Role: stats card for the notable tier. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-pending": "Used in platform admin dashboard. Role: stats card for apps waiting on AI scoring. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-pending-subtitle": "Used in platform admin dashboard. Role: helper text under the pending-AI stats card. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-score": "Used in platform admin dashboard. Role: table column for fame score. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-search": "Used in platform admin dashboard. Role: search field placeholder for apps or brands. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-subtitle": "Used in platform admin dashboard. Role: page description that ranking uses reputation not devices. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-summary": "Used in platform admin dashboard. Role: table column explaining why the app is famous. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier": "Used in platform admin dashboard. Role: table column and filter for fame tier. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier-famous": "Used in platform admin dashboard. Role: fame tier label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier-iconic": "Used in platform admin dashboard. Role: fame tier label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier-niche": "Used in platform admin dashboard. Role: fame tier label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier-notable": "Used in platform admin dashboard. Role: fame tier label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"famous-apps-tier-unknown": "Used in platform admin dashboard. Role: fame tier label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"fast-backward": "Used in Capgo web console areas: components. Role: UI label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"fast-forward": "Used in Capgo web console areas: components. Role: UI label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
"feel-magic-of-capgo": "Used in Capgo web console areas: components/dashboard, components/tables. Role: UI label. Translate for UI; keep Capgo product names, code, and placeholders unchanged.",
Expand Down
23 changes: 23 additions & 0 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1410,6 +1410,29 @@
"failed-to-get-user": "Failed to load the user",
"failed-to-regenerate-api-key": "Failed to regenerate API key",
"failed-to-update-policy": "Failed to update password policy",
"famous-apps": "Famous apps",
"famous-apps-subtitle": "Ranked by public reputation, not device count. Scores come from AI review of the app name, bundle ID, and store listings.",
"famous-apps-empty": "No scored apps match these filters yet. Scoring runs in the background every 15 minutes.",
"famous-apps-pending": "Waiting for AI",
"famous-apps-pending-subtitle": "Apps not scored yet",
"famous-apps-iconic": "Iconic",
"famous-apps-famous": "Famous",
"famous-apps-notable": "Notable",
"famous-apps-search": "Search apps or brands",
"famous-apps-min-score": "Minimum score",
"famous-apps-all-tiers": "All tiers",
"famous-apps-tier": "Tier",
"famous-apps-score": "Fame",
"famous-apps-category": "Category",
"famous-apps-summary": "Why",
"famous-apps-checked-at": "Scored",
"famous-apps-devices": "Devices",
"famous-apps-devices-hint": "Shown for context. Ranking ignores this number.",
"famous-apps-tier-unknown": "Unknown",
"famous-apps-tier-niche": "Niche",
"famous-apps-tier-notable": "Notable",
"famous-apps-tier-famous": "Famous",
"famous-apps-tier-iconic": "Iconic",
"fast-backward": "Fast Backward",
"fast-forward": "Fast Forward",
"feel-magic-of-capgo": "Feel the magic of:",
Expand Down
5 changes: 5 additions & 0 deletions src/components/DataTable.vue
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,11 @@ const isFilterModalOpen = ref(false)
const filterOpenButtonRef = ref<HTMLButtonElement | null>(null)
const filterModalTitleId = `${useId()}-filters-title`
const addTooltipId = `${useId()}-add-tooltip`
const searchInputId = `${useId()}-search`
const slots = useSlots()
const { t } = useI18n()
const searchVal = ref(props.search ?? '')
const searchAriaLabel = computed(() => props.searchPlaceholder || t('search'))
const pendingReset = ref(false)
const pendingAdd = ref(false)
// const sorts = ref<TableSort>({})
Expand Down Expand Up @@ -622,8 +624,11 @@ const paginationClass = computed(() => props.mobileFixedPagination
<slot name="toolbar-extras" />
</div>
<div class="min-w-0 w-full overflow-hidden sm:w-auto sm:max-w-[13rem] md:max-w-[14rem] lg:max-w-[16rem] xl:max-w-xs">
<label :for="searchInputId" class="sr-only">{{ searchAriaLabel }}</label>
<FormKit
:id="searchInputId"
v-model="searchVal" :placeholder="searchPlaceholder" :prefix-icon="IconSearch"
:attrs="{ 'aria-label': searchAriaLabel }"
:disabled="isLoading" enterkeyhint="send" :classes="{
outer: 'mb-0! w-full sm:w-52 md:w-56 lg:w-64 xl:w-80',
}"
Expand Down
5 changes: 5 additions & 0 deletions src/components/admin/AdminFilterBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import {
useAdminDashboardStore,
} from '~/stores/adminDashboard'

defineProps<{
hideDatePicker?: boolean
}>()

const { t } = useI18n()
const route = useRoute()
const router = useRouter()
Expand Down Expand Up @@ -165,6 +169,7 @@ watch(
<div class="mb-4">
<div class="flex items-center justify-end gap-2">
<DateRangePicker
v-if="!hideDatePicker"
v-model="rangeValue"
v-model:mode="rangeMode"
@apply="onApply"
Expand Down
2 changes: 2 additions & 0 deletions src/constants/adminTabs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import IconPuzzle from '~icons/heroicons/puzzle-piece'
import IconSignal from '~icons/heroicons/signal'
import IconUsers from '~icons/heroicons/user-group'
import IconBuild from '~icons/heroicons/wrench-screwdriver'
import IconSparkles from '~icons/lucide/sparkles'

export const adminTabs: Tab[] = [
{ label: 'builder', icon: IconBuild, key: '/builder' },
Expand All @@ -22,6 +23,7 @@ export const adminTabs: Tab[] = [
{ label: 'users', icon: IconUsers, key: '/users' },
{ label: 'frontend-onboarding', icon: IconChartBar, key: '/frontend-onboarding' },
{ label: 'admin-organizations', icon: IconBuildingOffice, key: '/organizations' },
{ label: 'famous-apps', icon: IconSparkles, key: '/famous-apps' },
{ label: 'revenue', icon: IconBanknotes, key: '/revenue' },
{ label: 'plans-analytics-title', icon: IconChartBar, key: '/plans' },
{ label: 'credits', icon: IconCurrencyDollar, key: '/credits' },
Expand Down
Loading
Loading