strapi-plugin-magic-mark 3.0.1 → 3.0.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/README.md +1 -1
- package/dist/_chunks/{App-C5UU0yUr.js → App-B6x0aSMN.js} +97 -55
- package/dist/_chunks/{App-Dt-v39BQ.mjs → App-BCliVBSB.mjs} +98 -56
- package/dist/_chunks/UpgradePage-Bm0SkuCi.js +353 -0
- package/dist/_chunks/UpgradePage-GoocQ4av.mjs +351 -0
- package/dist/_chunks/de-Cs9dd3Mr.js +138 -0
- package/dist/_chunks/de-DOVki5VS.mjs +138 -0
- package/dist/_chunks/en-CE3r46Y2.js +138 -0
- package/dist/_chunks/en-Cf5-O03L.mjs +138 -0
- package/dist/_chunks/es-Ba6JcPIm.mjs +138 -0
- package/dist/_chunks/es-D4AOyJYJ.js +138 -0
- package/dist/_chunks/fr-CWSfoA8i.js +138 -0
- package/dist/_chunks/fr-CrMBXR3c.mjs +138 -0
- package/dist/_chunks/{index-B-Cc7QNW.mjs → index-B_EiWnCU.mjs} +13 -4
- package/dist/_chunks/index-D5-84IjV.js +3365 -0
- package/dist/_chunks/{index-B11QBtag.js → index-DA7Jswi4.js} +12 -3
- package/dist/_chunks/index-DdTUt6EH.mjs +3361 -0
- package/dist/_chunks/pt-BXxZ1Zym.mjs +138 -0
- package/dist/_chunks/pt-DW_6r_mP.js +138 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/QueryBuilder.d.ts +12 -1
- package/dist/admin/src/components/RelationFieldSelector.d.ts +24 -0
- package/dist/admin/src/components/SimpleAdvancedFilterModal.d.ts +2 -0
- package/dist/admin/src/components/UpgradePrompt.d.ts +22 -0
- package/dist/admin/src/hooks/useFeatureGate.d.ts +88 -0
- package/dist/admin/src/hooks/useRelationSchema.d.ts +27 -0
- package/dist/admin/src/pages/UpgradePage.d.ts +6 -0
- package/dist/admin/src/utils/queryGenerator.d.ts +4 -0
- package/dist/admin/src/utils/queryToStructure.d.ts +8 -1
- package/dist/admin/src/utils/theme.d.ts +95 -0
- package/dist/server/index.js +212 -9
- package/dist/server/index.mjs +212 -9
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/license.d.ts +4 -0
- package/dist/server/src/index.d.ts +24 -1
- package/dist/server/src/services/index.d.ts +23 -1
- package/dist/server/src/services/license-guard.d.ts +48 -2
- package/package.json +1 -1
- package/dist/_chunks/de-Bag-366k.mjs +0 -49
- package/dist/_chunks/de-Dic_hhjg.js +0 -49
- package/dist/_chunks/en-C5BvHqNo.js +0 -54
- package/dist/_chunks/en-zokEerzt.mjs +0 -54
- package/dist/_chunks/es-BlSQpU1z.js +0 -54
- package/dist/_chunks/es-Br1ucP3h.mjs +0 -54
- package/dist/_chunks/fr-BHciYPYG.js +0 -54
- package/dist/_chunks/fr-Dzo3kt_q.mjs +0 -54
- package/dist/_chunks/index-BAmZV8aX.mjs +0 -2020
- package/dist/_chunks/index-RuDV4dTy.js +0 -2024
- package/dist/_chunks/pt-DQoGyzyD.mjs +0 -54
- package/dist/_chunks/pt-Dawo5aUA.js +0 -54
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const title = "🔖 MagicMark";
|
|
2
|
+
const subtitle = "Salvar visualizações filtradas para acesso rápido";
|
|
3
|
+
const loading = "Carregando marcadores...";
|
|
4
|
+
const pt = {
|
|
5
|
+
"plugin.name": "MagicMark",
|
|
6
|
+
title,
|
|
7
|
+
subtitle,
|
|
8
|
+
loading,
|
|
9
|
+
"empty.title": "Ainda não há marcadores",
|
|
10
|
+
"empty.description": 'Navegue para qualquer visualização do Content Manager, aplique filtros e clique em "Salvar Marcador" para criar atalhos de acesso rápido',
|
|
11
|
+
"stats.pinned": "Fixados",
|
|
12
|
+
"stats.total": "Total",
|
|
13
|
+
"stats.shared": "Compartilhados comigo",
|
|
14
|
+
"stats.limit": "Limite de marcadores",
|
|
15
|
+
"stats.limitReached": "Limite atingido - Atualizar",
|
|
16
|
+
"button.create": "+ Salvar marcador",
|
|
17
|
+
"button.save": "Salvar marcador",
|
|
18
|
+
"button.cancel": "Cancelar",
|
|
19
|
+
"button.update": "Atualizar",
|
|
20
|
+
"button.edit": "Editar",
|
|
21
|
+
"button.delete": "Excluir",
|
|
22
|
+
"button.pin": "Fixar",
|
|
23
|
+
"button.unpin": "Desfixar",
|
|
24
|
+
"confirm.delete": "Tem certeza de que deseja excluir este marcador?",
|
|
25
|
+
"modal.create": "Salvar como marcador",
|
|
26
|
+
"modal.edit": "Editar marcador",
|
|
27
|
+
"form.emoji": "Escolher ícone",
|
|
28
|
+
"form.selectEmoji": "Clique para selecionar",
|
|
29
|
+
"form.name": "Nome do marcador",
|
|
30
|
+
"form.namePlaceholder": "ex., Artigos publicados",
|
|
31
|
+
"form.path": "Caminho do Content Manager",
|
|
32
|
+
"form.pathHelp": "Capturado automaticamente do Content Manager",
|
|
33
|
+
"form.query": "Filtros e ordenação",
|
|
34
|
+
"form.queryHelp": "Estes filtros serão restaurados quando você clicar neste marcador",
|
|
35
|
+
"form.filterPreview": "Filtros e configurações capturados",
|
|
36
|
+
"form.description": "Descrição (Opcional)",
|
|
37
|
+
"form.descriptionPlaceholder": "Adicionar uma descrição...",
|
|
38
|
+
"form.sharing": "Opções de compartilhamento",
|
|
39
|
+
"form.publicAccess": "Público (Todos os usuários admin podem ver este marcador)",
|
|
40
|
+
"form.shareWithRoles": "Compartilhar com papéis específicos:",
|
|
41
|
+
"form.shareWithUsers": "Compartilhar com usuários específicos:",
|
|
42
|
+
"form.selected": "{count} selecionados",
|
|
43
|
+
"form.loadingRoles": "Carregando papéis...",
|
|
44
|
+
"form.loadingUsers": "Carregando usuários...",
|
|
45
|
+
"form.noRoles": "Nenhum papel disponível",
|
|
46
|
+
"form.noUsers": "Nenhum outro usuário disponível",
|
|
47
|
+
"form.roleDisabled": "Seleção de papéis desabilitada quando o marcador é público",
|
|
48
|
+
"form.userDisabled": "Seleção de usuários desabilitada quando o marcador é público",
|
|
49
|
+
"form.customRole": "(Personalizado)",
|
|
50
|
+
"form.roleUsers": "({count} usuário)",
|
|
51
|
+
"form.roleUsersPlural": "({count} usuários)",
|
|
52
|
+
"error.nameRequired": "Nome é obrigatório",
|
|
53
|
+
"error.pathRequired": "Caminho é obrigatório",
|
|
54
|
+
"error.save": "Falha ao salvar o marcador",
|
|
55
|
+
"table.emoji": "Emoji",
|
|
56
|
+
"table.name": "Nome",
|
|
57
|
+
"table.filters": "Filtros",
|
|
58
|
+
"table.description": "Descrição",
|
|
59
|
+
"table.status": "Status",
|
|
60
|
+
"table.actions": "Ações",
|
|
61
|
+
"bookmark.myBookmark": "Meu marcador",
|
|
62
|
+
"bookmark.sharedBy": "Compartilhado por {name}",
|
|
63
|
+
"bookmark.public": "Público",
|
|
64
|
+
"bookmark.roles": "Papéis: {list}",
|
|
65
|
+
"bookmark.users": "Usuários: {list}",
|
|
66
|
+
"bookmark.unknown": "Desconhecido",
|
|
67
|
+
"shared.title": "🤝 Compartilhados com você",
|
|
68
|
+
"shared.count": "{count} marcador foi compartilhado com você",
|
|
69
|
+
"shared.countPlural": "{count} marcadores foram compartilhados com você",
|
|
70
|
+
"shared.byCreator": "{count} marcador",
|
|
71
|
+
"shared.byCreatorPlural": "{count} marcadores",
|
|
72
|
+
"allBookmarks.title": "🔖 Todos os marcadores disponíveis",
|
|
73
|
+
"search.placeholder": "Pesquisar por nome, descrição...",
|
|
74
|
+
"filter.all": "Mostrar todos",
|
|
75
|
+
"filter.pinned": "Apenas fixados",
|
|
76
|
+
"filter.unpinned": "Apenas não fixados",
|
|
77
|
+
"filter.placeholder": "Filtro",
|
|
78
|
+
"entries.placeholder": "Entradas",
|
|
79
|
+
"entries.10": "10 entradas",
|
|
80
|
+
"entries.25": "25 entradas",
|
|
81
|
+
"entries.50": "50 entradas",
|
|
82
|
+
"entries.100": "100 entradas",
|
|
83
|
+
"upgrade.premiumFeature": "Recurso Premium",
|
|
84
|
+
"upgrade.advancedFeature": "Recurso Avançado",
|
|
85
|
+
"upgrade.description": "{feature} é um recurso {tier}. Atualize para desbloquear este e mais.",
|
|
86
|
+
"upgrade.button": "Atualizar",
|
|
87
|
+
"upgrade.unlockTitle": "Desbloquear {feature}",
|
|
88
|
+
"upgrade.upgradeNow": "Atualizar agora",
|
|
89
|
+
"upgrade.tierFeature": "Recurso {tier}",
|
|
90
|
+
"upgrade.locked": "{feature} está bloqueado",
|
|
91
|
+
"upgrade.upgradeTo": "Atualizar para {tier}",
|
|
92
|
+
"upgradePage.title": "Escolha seu plano",
|
|
93
|
+
"upgradePage.subtitle": "Desbloqueie recursos poderosos de marcadores para sua aplicação Strapi",
|
|
94
|
+
"upgradePage.mostPopular": "MAIS POPULAR",
|
|
95
|
+
"upgradePage.loading": "Carregando informações de licença...",
|
|
96
|
+
"upgradePage.currentPlan": "PLANO ATUAL",
|
|
97
|
+
"upgradePage.downgrade": "Rebaixar",
|
|
98
|
+
"upgradePage.bookmarks": "Marcadores:",
|
|
99
|
+
"upgradePage.support": "Suporte:",
|
|
100
|
+
"upgradePage.free.name": "GRATUITO",
|
|
101
|
+
"upgradePage.free.description": "Perfeito para projetos pequenos e testes",
|
|
102
|
+
"upgradePage.premium.name": "PREMIUM",
|
|
103
|
+
"upgradePage.premium.description": "Recursos aprimorados para equipes em crescimento",
|
|
104
|
+
"upgradePage.advanced.name": "AVANÇADO",
|
|
105
|
+
"upgradePage.advanced.description": "Recursos máximos para usuários avançados",
|
|
106
|
+
"upgradePage.forever": "para sempre",
|
|
107
|
+
"upgradePage.perMonth": "/mês",
|
|
108
|
+
"upgradePage.features.bookmarks10": "10 marcadores",
|
|
109
|
+
"upgradePage.features.bookmarks50": "50 marcadores",
|
|
110
|
+
"upgradePage.features.bookmarksUnlimited": "Marcadores ilimitados",
|
|
111
|
+
"upgradePage.features.advancedFilters": "Filtros avançados",
|
|
112
|
+
"upgradePage.features.roleSharing": "Compartilhamento por papéis",
|
|
113
|
+
"upgradePage.features.dragDrop": "Arrastar e soltar",
|
|
114
|
+
"upgradePage.features.quickAccess": "Acesso rápido",
|
|
115
|
+
"upgradePage.features.queryHistory": "Histórico de consultas",
|
|
116
|
+
"upgradePage.features.export": "Exportar marcadores",
|
|
117
|
+
"upgradePage.features.analytics": "Análises",
|
|
118
|
+
"upgradePage.features.analyticsDashboard": "Painel de análises",
|
|
119
|
+
"upgradePage.features.bulkOperations": "Operações em massa",
|
|
120
|
+
"upgradePage.features.customIntegrations": "Integrações personalizadas",
|
|
121
|
+
"upgradePage.features.prioritySupport": "Suporte prioritário",
|
|
122
|
+
"upgradePage.features.priorityPhoneSupport": "Suporte prioritário + telefônico",
|
|
123
|
+
"upgradePage.support.community": "Comunidade",
|
|
124
|
+
"upgradePage.support.priority": "Prioritário",
|
|
125
|
+
"upgradePage.support.priorityPhone": "Prioritário + Telefone",
|
|
126
|
+
"upgradePage.limits.unlimited": "Ilimitado",
|
|
127
|
+
"ViewsWidget.actions.create": "Salvar marcador",
|
|
128
|
+
"ViewsWidget.actions.showList": "Magicmark",
|
|
129
|
+
"Admin.MainMenu.PluginName": "MagicMark",
|
|
130
|
+
"settings.title": "MagicMark",
|
|
131
|
+
"settings.license": "Licença"
|
|
132
|
+
};
|
|
133
|
+
export {
|
|
134
|
+
pt as default,
|
|
135
|
+
loading,
|
|
136
|
+
subtitle,
|
|
137
|
+
title
|
|
138
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const title = "🔖 MagicMark";
|
|
4
|
+
const subtitle = "Salvar visualizações filtradas para acesso rápido";
|
|
5
|
+
const loading = "Carregando marcadores...";
|
|
6
|
+
const pt = {
|
|
7
|
+
"plugin.name": "MagicMark",
|
|
8
|
+
title,
|
|
9
|
+
subtitle,
|
|
10
|
+
loading,
|
|
11
|
+
"empty.title": "Ainda não há marcadores",
|
|
12
|
+
"empty.description": 'Navegue para qualquer visualização do Content Manager, aplique filtros e clique em "Salvar Marcador" para criar atalhos de acesso rápido',
|
|
13
|
+
"stats.pinned": "Fixados",
|
|
14
|
+
"stats.total": "Total",
|
|
15
|
+
"stats.shared": "Compartilhados comigo",
|
|
16
|
+
"stats.limit": "Limite de marcadores",
|
|
17
|
+
"stats.limitReached": "Limite atingido - Atualizar",
|
|
18
|
+
"button.create": "+ Salvar marcador",
|
|
19
|
+
"button.save": "Salvar marcador",
|
|
20
|
+
"button.cancel": "Cancelar",
|
|
21
|
+
"button.update": "Atualizar",
|
|
22
|
+
"button.edit": "Editar",
|
|
23
|
+
"button.delete": "Excluir",
|
|
24
|
+
"button.pin": "Fixar",
|
|
25
|
+
"button.unpin": "Desfixar",
|
|
26
|
+
"confirm.delete": "Tem certeza de que deseja excluir este marcador?",
|
|
27
|
+
"modal.create": "Salvar como marcador",
|
|
28
|
+
"modal.edit": "Editar marcador",
|
|
29
|
+
"form.emoji": "Escolher ícone",
|
|
30
|
+
"form.selectEmoji": "Clique para selecionar",
|
|
31
|
+
"form.name": "Nome do marcador",
|
|
32
|
+
"form.namePlaceholder": "ex., Artigos publicados",
|
|
33
|
+
"form.path": "Caminho do Content Manager",
|
|
34
|
+
"form.pathHelp": "Capturado automaticamente do Content Manager",
|
|
35
|
+
"form.query": "Filtros e ordenação",
|
|
36
|
+
"form.queryHelp": "Estes filtros serão restaurados quando você clicar neste marcador",
|
|
37
|
+
"form.filterPreview": "Filtros e configurações capturados",
|
|
38
|
+
"form.description": "Descrição (Opcional)",
|
|
39
|
+
"form.descriptionPlaceholder": "Adicionar uma descrição...",
|
|
40
|
+
"form.sharing": "Opções de compartilhamento",
|
|
41
|
+
"form.publicAccess": "Público (Todos os usuários admin podem ver este marcador)",
|
|
42
|
+
"form.shareWithRoles": "Compartilhar com papéis específicos:",
|
|
43
|
+
"form.shareWithUsers": "Compartilhar com usuários específicos:",
|
|
44
|
+
"form.selected": "{count} selecionados",
|
|
45
|
+
"form.loadingRoles": "Carregando papéis...",
|
|
46
|
+
"form.loadingUsers": "Carregando usuários...",
|
|
47
|
+
"form.noRoles": "Nenhum papel disponível",
|
|
48
|
+
"form.noUsers": "Nenhum outro usuário disponível",
|
|
49
|
+
"form.roleDisabled": "Seleção de papéis desabilitada quando o marcador é público",
|
|
50
|
+
"form.userDisabled": "Seleção de usuários desabilitada quando o marcador é público",
|
|
51
|
+
"form.customRole": "(Personalizado)",
|
|
52
|
+
"form.roleUsers": "({count} usuário)",
|
|
53
|
+
"form.roleUsersPlural": "({count} usuários)",
|
|
54
|
+
"error.nameRequired": "Nome é obrigatório",
|
|
55
|
+
"error.pathRequired": "Caminho é obrigatório",
|
|
56
|
+
"error.save": "Falha ao salvar o marcador",
|
|
57
|
+
"table.emoji": "Emoji",
|
|
58
|
+
"table.name": "Nome",
|
|
59
|
+
"table.filters": "Filtros",
|
|
60
|
+
"table.description": "Descrição",
|
|
61
|
+
"table.status": "Status",
|
|
62
|
+
"table.actions": "Ações",
|
|
63
|
+
"bookmark.myBookmark": "Meu marcador",
|
|
64
|
+
"bookmark.sharedBy": "Compartilhado por {name}",
|
|
65
|
+
"bookmark.public": "Público",
|
|
66
|
+
"bookmark.roles": "Papéis: {list}",
|
|
67
|
+
"bookmark.users": "Usuários: {list}",
|
|
68
|
+
"bookmark.unknown": "Desconhecido",
|
|
69
|
+
"shared.title": "🤝 Compartilhados com você",
|
|
70
|
+
"shared.count": "{count} marcador foi compartilhado com você",
|
|
71
|
+
"shared.countPlural": "{count} marcadores foram compartilhados com você",
|
|
72
|
+
"shared.byCreator": "{count} marcador",
|
|
73
|
+
"shared.byCreatorPlural": "{count} marcadores",
|
|
74
|
+
"allBookmarks.title": "🔖 Todos os marcadores disponíveis",
|
|
75
|
+
"search.placeholder": "Pesquisar por nome, descrição...",
|
|
76
|
+
"filter.all": "Mostrar todos",
|
|
77
|
+
"filter.pinned": "Apenas fixados",
|
|
78
|
+
"filter.unpinned": "Apenas não fixados",
|
|
79
|
+
"filter.placeholder": "Filtro",
|
|
80
|
+
"entries.placeholder": "Entradas",
|
|
81
|
+
"entries.10": "10 entradas",
|
|
82
|
+
"entries.25": "25 entradas",
|
|
83
|
+
"entries.50": "50 entradas",
|
|
84
|
+
"entries.100": "100 entradas",
|
|
85
|
+
"upgrade.premiumFeature": "Recurso Premium",
|
|
86
|
+
"upgrade.advancedFeature": "Recurso Avançado",
|
|
87
|
+
"upgrade.description": "{feature} é um recurso {tier}. Atualize para desbloquear este e mais.",
|
|
88
|
+
"upgrade.button": "Atualizar",
|
|
89
|
+
"upgrade.unlockTitle": "Desbloquear {feature}",
|
|
90
|
+
"upgrade.upgradeNow": "Atualizar agora",
|
|
91
|
+
"upgrade.tierFeature": "Recurso {tier}",
|
|
92
|
+
"upgrade.locked": "{feature} está bloqueado",
|
|
93
|
+
"upgrade.upgradeTo": "Atualizar para {tier}",
|
|
94
|
+
"upgradePage.title": "Escolha seu plano",
|
|
95
|
+
"upgradePage.subtitle": "Desbloqueie recursos poderosos de marcadores para sua aplicação Strapi",
|
|
96
|
+
"upgradePage.mostPopular": "MAIS POPULAR",
|
|
97
|
+
"upgradePage.loading": "Carregando informações de licença...",
|
|
98
|
+
"upgradePage.currentPlan": "PLANO ATUAL",
|
|
99
|
+
"upgradePage.downgrade": "Rebaixar",
|
|
100
|
+
"upgradePage.bookmarks": "Marcadores:",
|
|
101
|
+
"upgradePage.support": "Suporte:",
|
|
102
|
+
"upgradePage.free.name": "GRATUITO",
|
|
103
|
+
"upgradePage.free.description": "Perfeito para projetos pequenos e testes",
|
|
104
|
+
"upgradePage.premium.name": "PREMIUM",
|
|
105
|
+
"upgradePage.premium.description": "Recursos aprimorados para equipes em crescimento",
|
|
106
|
+
"upgradePage.advanced.name": "AVANÇADO",
|
|
107
|
+
"upgradePage.advanced.description": "Recursos máximos para usuários avançados",
|
|
108
|
+
"upgradePage.forever": "para sempre",
|
|
109
|
+
"upgradePage.perMonth": "/mês",
|
|
110
|
+
"upgradePage.features.bookmarks10": "10 marcadores",
|
|
111
|
+
"upgradePage.features.bookmarks50": "50 marcadores",
|
|
112
|
+
"upgradePage.features.bookmarksUnlimited": "Marcadores ilimitados",
|
|
113
|
+
"upgradePage.features.advancedFilters": "Filtros avançados",
|
|
114
|
+
"upgradePage.features.roleSharing": "Compartilhamento por papéis",
|
|
115
|
+
"upgradePage.features.dragDrop": "Arrastar e soltar",
|
|
116
|
+
"upgradePage.features.quickAccess": "Acesso rápido",
|
|
117
|
+
"upgradePage.features.queryHistory": "Histórico de consultas",
|
|
118
|
+
"upgradePage.features.export": "Exportar marcadores",
|
|
119
|
+
"upgradePage.features.analytics": "Análises",
|
|
120
|
+
"upgradePage.features.analyticsDashboard": "Painel de análises",
|
|
121
|
+
"upgradePage.features.bulkOperations": "Operações em massa",
|
|
122
|
+
"upgradePage.features.customIntegrations": "Integrações personalizadas",
|
|
123
|
+
"upgradePage.features.prioritySupport": "Suporte prioritário",
|
|
124
|
+
"upgradePage.features.priorityPhoneSupport": "Suporte prioritário + telefônico",
|
|
125
|
+
"upgradePage.support.community": "Comunidade",
|
|
126
|
+
"upgradePage.support.priority": "Prioritário",
|
|
127
|
+
"upgradePage.support.priorityPhone": "Prioritário + Telefone",
|
|
128
|
+
"upgradePage.limits.unlimited": "Ilimitado",
|
|
129
|
+
"ViewsWidget.actions.create": "Salvar marcador",
|
|
130
|
+
"ViewsWidget.actions.showList": "Magicmark",
|
|
131
|
+
"Admin.MainMenu.PluginName": "MagicMark",
|
|
132
|
+
"settings.title": "MagicMark",
|
|
133
|
+
"settings.license": "Licença"
|
|
134
|
+
};
|
|
135
|
+
exports.default = pt;
|
|
136
|
+
exports.loading = loading;
|
|
137
|
+
exports.subtitle = subtitle;
|
|
138
|
+
exports.title = title;
|
package/dist/admin/index.js
CHANGED
package/dist/admin/index.mjs
CHANGED
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
interface Condition {
|
|
3
3
|
id: string;
|
|
4
4
|
field: string;
|
|
5
|
+
/** Field path for deep filtering (e.g., ['user', 'role', 'name']) */
|
|
6
|
+
fieldPath?: string[];
|
|
5
7
|
operator: string;
|
|
6
8
|
value: string;
|
|
7
9
|
}
|
|
@@ -11,13 +13,22 @@ interface ConditionGroup {
|
|
|
11
13
|
conditions: (Condition | ConditionGroup)[];
|
|
12
14
|
isGroup?: boolean;
|
|
13
15
|
}
|
|
16
|
+
interface RelationInfo {
|
|
17
|
+
name: string;
|
|
18
|
+
target?: string;
|
|
19
|
+
}
|
|
14
20
|
interface QueryBuilderProps {
|
|
15
21
|
availableFields: Array<{
|
|
16
22
|
name: string;
|
|
17
23
|
type: string;
|
|
18
24
|
}>;
|
|
25
|
+
/** Relations with their target UIDs for deep filtering */
|
|
26
|
+
availableRelations?: RelationInfo[];
|
|
19
27
|
onQueryChange: (query: ConditionGroup) => void;
|
|
20
|
-
initialStructure?: ConditionGroup;
|
|
28
|
+
initialStructure?: ConditionGroup | null;
|
|
29
|
+
isPremium?: boolean;
|
|
30
|
+
/** Enable deep relation filtering (requires Premium) */
|
|
31
|
+
enableDeepFiltering?: boolean;
|
|
21
32
|
}
|
|
22
33
|
declare const QueryBuilder: React.FC<QueryBuilderProps>;
|
|
23
34
|
export default QueryBuilder;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Field {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
isRelation?: boolean;
|
|
6
|
+
target?: string;
|
|
7
|
+
}
|
|
8
|
+
interface Props {
|
|
9
|
+
availableFields: Field[];
|
|
10
|
+
availableRelations: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
target?: string;
|
|
13
|
+
}>;
|
|
14
|
+
fieldPath: string[];
|
|
15
|
+
onChange: (fieldPath: string[]) => void;
|
|
16
|
+
maxDepth?: number;
|
|
17
|
+
showBreadcrumb?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Horizontal cascading field selector for relation filtering
|
|
21
|
+
* Layout: [Field] > [Nested] > [Nested] in one row
|
|
22
|
+
*/
|
|
23
|
+
declare const RelationFieldSelector: React.FC<Props>;
|
|
24
|
+
export default RelationFieldSelector;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface UpgradePromptProps {
|
|
3
|
+
feature: string;
|
|
4
|
+
tier?: 'premium' | 'advanced';
|
|
5
|
+
variant?: 'inline' | 'banner' | 'modal';
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
showIcon?: boolean;
|
|
9
|
+
onUpgradeClick?: () => void;
|
|
10
|
+
}
|
|
11
|
+
declare const UpgradePrompt: React.FC<UpgradePromptProps>;
|
|
12
|
+
/**
|
|
13
|
+
* Higher-order component to wrap features with paywall
|
|
14
|
+
*/
|
|
15
|
+
export declare const withFeatureGate: <P extends object>(WrappedComponent: React.ComponentType<P>, feature: string, tier?: 'premium' | 'advanced') => (props: P & {
|
|
16
|
+
canUse?: boolean;
|
|
17
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
/**
|
|
19
|
+
* Feature lock overlay for disabling UI elements
|
|
20
|
+
*/
|
|
21
|
+
export declare const FeatureLockOverlay: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
|
|
22
|
+
export default UpgradePrompt;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature definitions for MagicMark
|
|
3
|
+
* Maps feature keys to their required tier
|
|
4
|
+
*/
|
|
5
|
+
export declare const FEATURES: {
|
|
6
|
+
readonly basicBookmarks: {
|
|
7
|
+
readonly tier: "free";
|
|
8
|
+
readonly limit: 10;
|
|
9
|
+
};
|
|
10
|
+
readonly basicFilters: {
|
|
11
|
+
readonly tier: "free";
|
|
12
|
+
};
|
|
13
|
+
readonly extendedBookmarks: {
|
|
14
|
+
readonly tier: "premium";
|
|
15
|
+
readonly limit: 50;
|
|
16
|
+
};
|
|
17
|
+
readonly queryHistory: {
|
|
18
|
+
readonly tier: "premium";
|
|
19
|
+
};
|
|
20
|
+
readonly exportBookmarks: {
|
|
21
|
+
readonly tier: "premium";
|
|
22
|
+
};
|
|
23
|
+
readonly sharedBookmarks: {
|
|
24
|
+
readonly tier: "premium";
|
|
25
|
+
};
|
|
26
|
+
readonly unlimitedBookmarks: {
|
|
27
|
+
readonly tier: "advanced";
|
|
28
|
+
readonly limit: -1;
|
|
29
|
+
};
|
|
30
|
+
readonly advancedFilters: {
|
|
31
|
+
readonly tier: "advanced";
|
|
32
|
+
};
|
|
33
|
+
readonly subGroups: {
|
|
34
|
+
readonly tier: "advanced";
|
|
35
|
+
};
|
|
36
|
+
readonly bulkOperations: {
|
|
37
|
+
readonly tier: "advanced";
|
|
38
|
+
};
|
|
39
|
+
readonly analytics: {
|
|
40
|
+
readonly tier: "advanced";
|
|
41
|
+
};
|
|
42
|
+
readonly customIntegrations: {
|
|
43
|
+
readonly tier: "advanced";
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export type FeatureKey = keyof typeof FEATURES;
|
|
47
|
+
interface LicenseLimits {
|
|
48
|
+
maxBookmarks: number;
|
|
49
|
+
currentBookmarks: number;
|
|
50
|
+
canCreate: boolean;
|
|
51
|
+
tier: 'free' | 'premium' | 'advanced';
|
|
52
|
+
features: {
|
|
53
|
+
queryHistory: boolean;
|
|
54
|
+
export: boolean;
|
|
55
|
+
analytics: boolean;
|
|
56
|
+
bulkOperations: boolean;
|
|
57
|
+
customIntegrations: boolean;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
interface UseFeatureGateResult {
|
|
61
|
+
canUse: boolean;
|
|
62
|
+
tier: string;
|
|
63
|
+
requiredTier: string;
|
|
64
|
+
isLoading: boolean;
|
|
65
|
+
showUpgrade: () => void;
|
|
66
|
+
limits: LicenseLimits | null;
|
|
67
|
+
isPremium: boolean;
|
|
68
|
+
isAdvanced: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Hook to check if a feature is available based on license
|
|
72
|
+
* @param feature - Feature key to check
|
|
73
|
+
* @returns Object with canUse boolean and upgrade function
|
|
74
|
+
*/
|
|
75
|
+
export declare const useFeatureGate: (feature: FeatureKey) => UseFeatureGateResult;
|
|
76
|
+
/**
|
|
77
|
+
* Simplified hook to get all license info
|
|
78
|
+
*/
|
|
79
|
+
export declare const useLicenseInfo: () => {
|
|
80
|
+
isLoading: boolean;
|
|
81
|
+
limits: LicenseLimits;
|
|
82
|
+
tier: "free" | "premium" | "advanced";
|
|
83
|
+
isFree: boolean;
|
|
84
|
+
isPremium: boolean;
|
|
85
|
+
isAdvanced: boolean;
|
|
86
|
+
canUseFeature: (feature: FeatureKey) => boolean;
|
|
87
|
+
};
|
|
88
|
+
export default useFeatureGate;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface SchemaAttribute {
|
|
2
|
+
type: string;
|
|
3
|
+
relation?: string;
|
|
4
|
+
target?: string;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
interface RelationField {
|
|
9
|
+
name: string;
|
|
10
|
+
type: string;
|
|
11
|
+
isRelation: boolean;
|
|
12
|
+
target?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Hook to fetch and cache relation schemas from the content-type-builder API
|
|
16
|
+
* Used for deep filtering on relation fields (e.g., user.email, user.role.name)
|
|
17
|
+
*/
|
|
18
|
+
export declare const useRelationSchema: () => {
|
|
19
|
+
fetchSchema: (uid: string) => Promise<Record<string, SchemaAttribute> | null>;
|
|
20
|
+
getFilterableFields: (uid: string) => Promise<RelationField[]>;
|
|
21
|
+
getRelationFields: (relationTarget: string) => Promise<RelationField[]>;
|
|
22
|
+
clearCache: () => void;
|
|
23
|
+
getCachedSchema: (uid: string) => Record<string, SchemaAttribute> | null;
|
|
24
|
+
loading: Record<string, boolean>;
|
|
25
|
+
errors: Record<string, string>;
|
|
26
|
+
};
|
|
27
|
+
export default useRelationSchema;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generates correct Strapi v5 filter query strings from QueryBuilder structure
|
|
3
3
|
* Based on: https://docs.strapi.io/cms/api/document-service/filters
|
|
4
|
+
* Supports deep relation filtering (e.g., user.role.name)
|
|
4
5
|
*/
|
|
5
6
|
export interface Condition {
|
|
6
7
|
id: string;
|
|
7
8
|
field: string;
|
|
9
|
+
/** Field path for deep filtering (e.g., ['user', 'role', 'name']) */
|
|
10
|
+
fieldPath?: string[];
|
|
8
11
|
operator: string;
|
|
9
12
|
value: string;
|
|
10
13
|
}
|
|
@@ -16,6 +19,7 @@ export interface ConditionGroup {
|
|
|
16
19
|
}
|
|
17
20
|
/**
|
|
18
21
|
* Convert QueryBuilder structure to Strapi filter object
|
|
22
|
+
* Supports deep relation filtering via fieldPath
|
|
19
23
|
*/
|
|
20
24
|
export declare const structureToFilters: (group: ConditionGroup) => any;
|
|
21
25
|
/**
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Converts URL query string back into QueryBuilder structure
|
|
3
|
+
* Supports deep relation filtering (e.g., filters[user][email][$contains]=admin)
|
|
3
4
|
*/
|
|
4
5
|
export interface Condition {
|
|
5
6
|
id: string;
|
|
6
7
|
field: string;
|
|
8
|
+
/** Field path for deep filtering (e.g., ['user', 'email']) */
|
|
9
|
+
fieldPath?: string[];
|
|
7
10
|
operator: string;
|
|
8
11
|
value: string;
|
|
9
12
|
}
|
|
@@ -15,6 +18,10 @@ export interface ConditionGroup {
|
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* Parse URL query parameters into QueryBuilder structure
|
|
18
|
-
* Supports
|
|
21
|
+
* Supports:
|
|
22
|
+
* - Simple filters: filters[$and][0][field][$eq]=value
|
|
23
|
+
* - Deep filters: filters[$and][0][user][email][$contains]=admin
|
|
24
|
+
* - Very deep filters: filters[$and][0][user][role][name][$eq]=Admin
|
|
25
|
+
* - Nested groups: filters[$and][1][$or][0][field][$eq]=value
|
|
19
26
|
*/
|
|
20
27
|
export declare const parseQueryToStructure: (queryString: string) => ConditionGroup;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dark Mode Compatible Theme
|
|
3
|
+
* Uses CSS variables from Strapi Design System
|
|
4
|
+
*/
|
|
5
|
+
export declare const theme: {
|
|
6
|
+
readonly colors: {
|
|
7
|
+
readonly primary: {
|
|
8
|
+
readonly 50: "var(--colors-primary100, #F0F9FF)";
|
|
9
|
+
readonly 100: "var(--colors-primary200, #E0F2FE)";
|
|
10
|
+
readonly 500: "var(--colors-primary600, #0EA5E9)";
|
|
11
|
+
readonly 600: "var(--colors-primary700, #0284C7)";
|
|
12
|
+
readonly 700: "var(--colors-primary700, #0369A1)";
|
|
13
|
+
};
|
|
14
|
+
readonly secondary: {
|
|
15
|
+
readonly 50: "var(--colors-secondary100, #F3E8FF)";
|
|
16
|
+
readonly 100: "var(--colors-secondary200, #E9D5FF)";
|
|
17
|
+
readonly 500: "var(--colors-secondary600, #A855F7)";
|
|
18
|
+
readonly 600: "var(--colors-secondary700, #9333EA)";
|
|
19
|
+
};
|
|
20
|
+
readonly success: {
|
|
21
|
+
readonly 50: "var(--colors-success100, #DCFCE7)";
|
|
22
|
+
readonly 100: "var(--colors-success100, #DCFCE7)";
|
|
23
|
+
readonly 500: "var(--colors-success600, #22C55E)";
|
|
24
|
+
readonly 600: "var(--colors-success700, #16A34A)";
|
|
25
|
+
readonly 700: "var(--colors-success700, #15803D)";
|
|
26
|
+
};
|
|
27
|
+
readonly warning: {
|
|
28
|
+
readonly 50: "var(--colors-warning100, #FEF3C7)";
|
|
29
|
+
readonly 100: "var(--colors-warning100, #FEF3C7)";
|
|
30
|
+
readonly 500: "var(--colors-warning600, #F59E0B)";
|
|
31
|
+
readonly 600: "var(--colors-warning700, #D97706)";
|
|
32
|
+
};
|
|
33
|
+
readonly danger: {
|
|
34
|
+
readonly 50: "var(--colors-danger100, #FEE2E2)";
|
|
35
|
+
readonly 100: "var(--colors-danger100, #FEE2E2)";
|
|
36
|
+
readonly 500: "var(--colors-danger600, #EF4444)";
|
|
37
|
+
readonly 600: "var(--colors-danger700, #DC2626)";
|
|
38
|
+
};
|
|
39
|
+
readonly neutral: {
|
|
40
|
+
readonly 0: "var(--colors-neutral0, #FFFFFF)";
|
|
41
|
+
readonly 50: "var(--colors-neutral100, #F9FAFB)";
|
|
42
|
+
readonly 100: "var(--colors-neutral150, #F3F4F6)";
|
|
43
|
+
readonly 200: "var(--colors-neutral200, #E5E7EB)";
|
|
44
|
+
readonly 400: "var(--colors-neutral400, #9CA3AF)";
|
|
45
|
+
readonly 500: "var(--colors-neutral500, #6B7280)";
|
|
46
|
+
readonly 600: "var(--colors-neutral600, #4B5563)";
|
|
47
|
+
readonly 700: "var(--colors-neutral700, #374151)";
|
|
48
|
+
readonly 800: "var(--colors-neutral800, #1F2937)";
|
|
49
|
+
readonly 900: "var(--colors-neutral900, #111827)";
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
readonly backgrounds: {
|
|
53
|
+
readonly primary: "var(--colors-neutral0, #FFFFFF)";
|
|
54
|
+
readonly secondary: "var(--colors-neutral100, #F9FAFB)";
|
|
55
|
+
readonly tertiary: "var(--colors-neutral150, #F3F4F6)";
|
|
56
|
+
readonly input: "var(--colors-neutral0, #FFFFFF)";
|
|
57
|
+
};
|
|
58
|
+
readonly text: {
|
|
59
|
+
readonly primary: "var(--colors-neutral800, #1F2937)";
|
|
60
|
+
readonly secondary: "var(--colors-neutral600, #4B5563)";
|
|
61
|
+
readonly muted: "var(--colors-neutral500, #6B7280)";
|
|
62
|
+
readonly inverse: "var(--colors-neutral0, #FFFFFF)";
|
|
63
|
+
};
|
|
64
|
+
readonly borders: {
|
|
65
|
+
readonly default: "var(--colors-neutral200, #E5E7EB)";
|
|
66
|
+
readonly strong: "var(--colors-neutral300, #D1D5DB)";
|
|
67
|
+
};
|
|
68
|
+
readonly shadows: {
|
|
69
|
+
readonly sm: "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)";
|
|
70
|
+
readonly md: "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)";
|
|
71
|
+
readonly lg: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)";
|
|
72
|
+
readonly xl: "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)";
|
|
73
|
+
};
|
|
74
|
+
readonly transitions: {
|
|
75
|
+
readonly fast: "150ms cubic-bezier(0.4, 0, 0.2, 1)";
|
|
76
|
+
readonly normal: "300ms cubic-bezier(0.4, 0, 0.2, 1)";
|
|
77
|
+
readonly slow: "500ms cubic-bezier(0.4, 0, 0.2, 1)";
|
|
78
|
+
};
|
|
79
|
+
readonly spacing: {
|
|
80
|
+
readonly xs: "4px";
|
|
81
|
+
readonly sm: "8px";
|
|
82
|
+
readonly md: "16px";
|
|
83
|
+
readonly lg: "24px";
|
|
84
|
+
readonly xl: "32px";
|
|
85
|
+
readonly '2xl': "48px";
|
|
86
|
+
};
|
|
87
|
+
readonly borderRadius: {
|
|
88
|
+
readonly sm: "4px";
|
|
89
|
+
readonly md: "8px";
|
|
90
|
+
readonly lg: "12px";
|
|
91
|
+
readonly xl: "16px";
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export type Theme = typeof theme;
|
|
95
|
+
export default theme;
|