@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21
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/package.json +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +367 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +15 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./blocks.schema.json",
|
|
3
|
+
"_warning": "AUTO-GENERATED by build-registry.mjs - DO NOT EDIT MANUALLY",
|
|
4
|
+
"_theme": "default",
|
|
5
|
+
"_totalBlocks": 16,
|
|
6
|
+
"available": [
|
|
7
|
+
{
|
|
8
|
+
"slug": "benefits",
|
|
9
|
+
"name": "Benefits Grid",
|
|
10
|
+
"description": "3-column grid showcasing benefits with optional colored top borders",
|
|
11
|
+
"category": "features",
|
|
12
|
+
"icon": "LayoutGrid",
|
|
13
|
+
"scope": [
|
|
14
|
+
"pages"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"slug": "cta-section",
|
|
19
|
+
"name": "CTA Section",
|
|
20
|
+
"description": "Call-to-action section with title, description, and action buttons",
|
|
21
|
+
"category": "cta",
|
|
22
|
+
"icon": "Megaphone",
|
|
23
|
+
"scope": [
|
|
24
|
+
"pages"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"slug": "faq-accordion",
|
|
29
|
+
"name": "FAQ Accordion",
|
|
30
|
+
"description": "A frequently asked questions section with expandable/collapsible accordion items",
|
|
31
|
+
"category": "faq",
|
|
32
|
+
"icon": "HelpCircle",
|
|
33
|
+
"scope": [
|
|
34
|
+
"pages"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"slug": "features-grid",
|
|
39
|
+
"name": "Features Grid",
|
|
40
|
+
"description": "Grid layout displaying multiple features with icons, titles, and descriptions",
|
|
41
|
+
"category": "content",
|
|
42
|
+
"icon": "Grid",
|
|
43
|
+
"scope": [
|
|
44
|
+
"pages"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"slug": "hero",
|
|
49
|
+
"name": "Hero Section",
|
|
50
|
+
"description": "Full-width hero section with title, subtitle, CTA button, and background image",
|
|
51
|
+
"category": "hero",
|
|
52
|
+
"icon": "Rocket",
|
|
53
|
+
"scope": [
|
|
54
|
+
"pages",
|
|
55
|
+
"posts"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"slug": "hero-with-form",
|
|
60
|
+
"name": "Hero With Form",
|
|
61
|
+
"description": "Full-width hero section with background image, title/subtitle on the left, and a lead capture form card on the right",
|
|
62
|
+
"category": "hero",
|
|
63
|
+
"icon": "FileText",
|
|
64
|
+
"scope": [
|
|
65
|
+
"pages"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"slug": "jumbotron",
|
|
70
|
+
"name": "Jumbotron",
|
|
71
|
+
"description": "A large, attention-grabbing hero block with optional fullscreen mode that takes 100% of the viewport height when enabled. Features centered content with support for 1-2 CTAs that automatically center based on count.",
|
|
72
|
+
"category": "hero",
|
|
73
|
+
"icon": "Maximize2",
|
|
74
|
+
"scope": [
|
|
75
|
+
"pages",
|
|
76
|
+
"posts"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"slug": "logo-cloud",
|
|
81
|
+
"name": "Logo Cloud",
|
|
82
|
+
"description": "A section displaying client/partner logos in a grid or row layout (",
|
|
83
|
+
"category": "content",
|
|
84
|
+
"icon": "Building2",
|
|
85
|
+
"scope": [
|
|
86
|
+
"pages"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"slug": "post-content",
|
|
91
|
+
"name": "Post Content",
|
|
92
|
+
"description": "A rich text content block designed for long-form blog posts with editorial styling similar to Medium. Features beautiful typography, proper spacing, and optional elements like drop caps, pull quotes, and images.",
|
|
93
|
+
"category": "content",
|
|
94
|
+
"icon": "FileText",
|
|
95
|
+
"scope": [
|
|
96
|
+
"posts"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"slug": "pricing-table",
|
|
101
|
+
"name": "Pricing Table",
|
|
102
|
+
"description": "A pricing comparison table showing different plans with features list, price, CTA button, and optional ",
|
|
103
|
+
"category": "pricing",
|
|
104
|
+
"icon": "DollarSign",
|
|
105
|
+
"scope": [
|
|
106
|
+
"pages"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"slug": "split-content",
|
|
111
|
+
"name": "Split Content",
|
|
112
|
+
"description": "A two-column section with image on one side and text content on the other, with option to reverse the order",
|
|
113
|
+
"category": "content",
|
|
114
|
+
"icon": "LayoutGrid",
|
|
115
|
+
"scope": [
|
|
116
|
+
"pages",
|
|
117
|
+
"posts"
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"slug": "stats-counter",
|
|
122
|
+
"name": "Stats Counter",
|
|
123
|
+
"description": "A section displaying key metrics/statistics with large numbers and labels (e.g., ",
|
|
124
|
+
"category": "stats",
|
|
125
|
+
"icon": "TrendingUp",
|
|
126
|
+
"scope": [
|
|
127
|
+
"pages",
|
|
128
|
+
"posts"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"slug": "testimonials",
|
|
133
|
+
"name": "Testimonials",
|
|
134
|
+
"description": "Display customer testimonials with quotes, authors, and avatars",
|
|
135
|
+
"category": "testimonials",
|
|
136
|
+
"icon": "Quote",
|
|
137
|
+
"scope": [
|
|
138
|
+
"pages"
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"slug": "text-content",
|
|
143
|
+
"name": "Text Content",
|
|
144
|
+
"description": "Rich text content block for paragraphs, lists, and formatted text",
|
|
145
|
+
"category": "content",
|
|
146
|
+
"icon": "FileText",
|
|
147
|
+
"scope": [
|
|
148
|
+
"pages"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"slug": "timeline",
|
|
153
|
+
"name": "Timeline",
|
|
154
|
+
"description": "A vertical or horizontal timeline showing chronological events, process steps, or history",
|
|
155
|
+
"category": "content",
|
|
156
|
+
"icon": "GitBranch",
|
|
157
|
+
"scope": [
|
|
158
|
+
"pages",
|
|
159
|
+
"posts"
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"slug": "video-hero",
|
|
164
|
+
"name": "Video Hero",
|
|
165
|
+
"description": "A hero section with embedded video (YouTube/Vimeo) either as background or inline, with title, subtitle, and optional CTA",
|
|
166
|
+
"category": "hero",
|
|
167
|
+
"icon": "Video",
|
|
168
|
+
"scope": [
|
|
169
|
+
"pages",
|
|
170
|
+
"posts"
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"categories": [
|
|
175
|
+
"content",
|
|
176
|
+
"cta",
|
|
177
|
+
"faq",
|
|
178
|
+
"features",
|
|
179
|
+
"hero",
|
|
180
|
+
"pricing",
|
|
181
|
+
"stats",
|
|
182
|
+
"testimonials"
|
|
183
|
+
],
|
|
184
|
+
"byCategory": {
|
|
185
|
+
"features": [
|
|
186
|
+
"benefits"
|
|
187
|
+
],
|
|
188
|
+
"cta": [
|
|
189
|
+
"cta-section"
|
|
190
|
+
],
|
|
191
|
+
"faq": [
|
|
192
|
+
"faq-accordion"
|
|
193
|
+
],
|
|
194
|
+
"content": [
|
|
195
|
+
"features-grid",
|
|
196
|
+
"logo-cloud",
|
|
197
|
+
"post-content",
|
|
198
|
+
"split-content",
|
|
199
|
+
"text-content",
|
|
200
|
+
"timeline"
|
|
201
|
+
],
|
|
202
|
+
"hero": [
|
|
203
|
+
"hero",
|
|
204
|
+
"hero-with-form",
|
|
205
|
+
"jumbotron",
|
|
206
|
+
"video-hero"
|
|
207
|
+
],
|
|
208
|
+
"pricing": [
|
|
209
|
+
"pricing-table"
|
|
210
|
+
],
|
|
211
|
+
"stats": [
|
|
212
|
+
"stats-counter"
|
|
213
|
+
],
|
|
214
|
+
"testimonials": [
|
|
215
|
+
"testimonials"
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./entities.schema.json",
|
|
3
|
+
"_warning": "AUTO-GENERATED by build-registry.mjs - DO NOT EDIT MANUALLY",
|
|
4
|
+
"_theme": "default",
|
|
5
|
+
"entities": {
|
|
6
|
+
"customers": {
|
|
7
|
+
"slug": "customers",
|
|
8
|
+
"singular": "customer",
|
|
9
|
+
"plural": "Customers",
|
|
10
|
+
"tableName": "customers",
|
|
11
|
+
"fields": [
|
|
12
|
+
"name",
|
|
13
|
+
"account",
|
|
14
|
+
"office",
|
|
15
|
+
"phone",
|
|
16
|
+
"salesRep",
|
|
17
|
+
"visitDays",
|
|
18
|
+
"contactDays"
|
|
19
|
+
],
|
|
20
|
+
"filters": [],
|
|
21
|
+
"source": "theme"
|
|
22
|
+
},
|
|
23
|
+
"pages": {
|
|
24
|
+
"slug": "pages",
|
|
25
|
+
"singular": "page",
|
|
26
|
+
"plural": "Pages",
|
|
27
|
+
"tableName": "pages",
|
|
28
|
+
"fields": [
|
|
29
|
+
"title",
|
|
30
|
+
"slug",
|
|
31
|
+
"status",
|
|
32
|
+
"locale"
|
|
33
|
+
],
|
|
34
|
+
"filters": [
|
|
35
|
+
"status"
|
|
36
|
+
],
|
|
37
|
+
"source": "theme"
|
|
38
|
+
},
|
|
39
|
+
"posts": {
|
|
40
|
+
"slug": "posts",
|
|
41
|
+
"singular": "post",
|
|
42
|
+
"plural": "Posts",
|
|
43
|
+
"tableName": "posts",
|
|
44
|
+
"fields": [
|
|
45
|
+
"title",
|
|
46
|
+
"slug",
|
|
47
|
+
"status",
|
|
48
|
+
"excerpt",
|
|
49
|
+
"featuredImage"
|
|
50
|
+
],
|
|
51
|
+
"filters": [
|
|
52
|
+
"status"
|
|
53
|
+
],
|
|
54
|
+
"source": "theme"
|
|
55
|
+
},
|
|
56
|
+
"tasks": {
|
|
57
|
+
"slug": "tasks",
|
|
58
|
+
"singular": "task",
|
|
59
|
+
"plural": "Tasks",
|
|
60
|
+
"tableName": "tasks",
|
|
61
|
+
"fields": [
|
|
62
|
+
"title",
|
|
63
|
+
"description",
|
|
64
|
+
"status",
|
|
65
|
+
"priority",
|
|
66
|
+
"tags",
|
|
67
|
+
"dueDate",
|
|
68
|
+
"estimatedHours",
|
|
69
|
+
"completed"
|
|
70
|
+
],
|
|
71
|
+
"filters": [
|
|
72
|
+
"status",
|
|
73
|
+
"priority"
|
|
74
|
+
],
|
|
75
|
+
"source": "theme"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./page-builder.schema.json",
|
|
3
|
+
"_comment": "Test data for existing pages (from sample data). API/routes handled by POMs.",
|
|
4
|
+
"_lastUpdated": "2025-12-27",
|
|
5
|
+
|
|
6
|
+
"existingPages": {
|
|
7
|
+
"aboutUs": {
|
|
8
|
+
"slug": "about-us",
|
|
9
|
+
"locale": "en",
|
|
10
|
+
"expectedBlocks": ["hero", "text-content", "features-grid", "cta-section", "testimonials", "cta-section", "benefits"]
|
|
11
|
+
},
|
|
12
|
+
"contact": {
|
|
13
|
+
"slug": "contact",
|
|
14
|
+
"locale": "en"
|
|
15
|
+
},
|
|
16
|
+
"services": {
|
|
17
|
+
"slug": "services",
|
|
18
|
+
"locale": "en"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categories POM
|
|
3
|
+
*
|
|
4
|
+
* Page Object Model for Post Categories management.
|
|
5
|
+
* Uses the generic Taxonomies UI component but intercepts the post-categories API.
|
|
6
|
+
*
|
|
7
|
+
* Architecture Note:
|
|
8
|
+
* - UI Path: /dashboard/taxonomies (generic taxonomy manager component)
|
|
9
|
+
* - UI Selectors: taxonomies-* / taxonomy-* (match React component data-cy)
|
|
10
|
+
* - API Path: /api/v1/post-categories (specific endpoint for post categories)
|
|
11
|
+
*
|
|
12
|
+
* This separation allows the UI to be reusable while the API is entity-specific.
|
|
13
|
+
*
|
|
14
|
+
* @version 3.0 - Uses centralized selectors from cySelector()
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { cySelector } from '../selectors'
|
|
18
|
+
import { ApiInterceptor } from '../helpers/ApiInterceptor'
|
|
19
|
+
|
|
20
|
+
export interface CategoryFormData {
|
|
21
|
+
name: string
|
|
22
|
+
slug?: string
|
|
23
|
+
description?: string
|
|
24
|
+
icon?: string
|
|
25
|
+
color?: string
|
|
26
|
+
parentId?: string
|
|
27
|
+
order?: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class CategoriesPOM {
|
|
31
|
+
// ============================================
|
|
32
|
+
// API INTERCEPTOR (for deterministic waits)
|
|
33
|
+
// ============================================
|
|
34
|
+
|
|
35
|
+
private static _api: ApiInterceptor | null = null
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get the API interceptor instance for post-categories
|
|
39
|
+
* Uses custom path since it's not a generic entity route
|
|
40
|
+
*/
|
|
41
|
+
static get api(): ApiInterceptor {
|
|
42
|
+
if (!this._api) {
|
|
43
|
+
this._api = new ApiInterceptor({
|
|
44
|
+
slug: 'categories',
|
|
45
|
+
customPath: '/api/v1/post-categories'
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
return this._api
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Setup API intercepts for CRUD operations
|
|
53
|
+
* Call this in beforeEach BEFORE navigation
|
|
54
|
+
*/
|
|
55
|
+
static setupApiIntercepts(): typeof CategoriesPOM {
|
|
56
|
+
this.api.setupCrudIntercepts()
|
|
57
|
+
return this
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ============================================
|
|
61
|
+
// SELECTORS - Categories List (using centralized cySelector)
|
|
62
|
+
// ============================================
|
|
63
|
+
|
|
64
|
+
static get listSelectors() {
|
|
65
|
+
return {
|
|
66
|
+
page: cySelector('taxonomies.list.container'),
|
|
67
|
+
table: 'table',
|
|
68
|
+
createBtn: cySelector('taxonomies.list.createButton'),
|
|
69
|
+
row: (id: string) => cySelector('taxonomies.list.row', { id }),
|
|
70
|
+
rowGeneric: 'table tbody tr',
|
|
71
|
+
editBtn: (id: string) => cySelector('taxonomies.list.editButton', { id }),
|
|
72
|
+
deleteBtn: (id: string) => cySelector('taxonomies.list.deleteButton', { id }),
|
|
73
|
+
confirmDelete: '[role="dialog"]',
|
|
74
|
+
confirmDeleteBtn: '[role="dialog"] button:contains("Delete"), button.bg-destructive',
|
|
75
|
+
cancelDeleteBtn: '[role="dialog"] button:contains("Cancel"),[role="dialog"] button[type="button"]:not(.bg-destructive)',
|
|
76
|
+
emptyState: 'h3:contains("No"), div:contains("No categories")',
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ============================================
|
|
81
|
+
// SELECTORS - Category Form (using centralized cySelector)
|
|
82
|
+
// ============================================
|
|
83
|
+
|
|
84
|
+
static get formSelectors() {
|
|
85
|
+
return {
|
|
86
|
+
dialog: cySelector('taxonomies.form.dialog'),
|
|
87
|
+
dialogFallback: '[role="dialog"]', // Fallback if data-cy not implemented
|
|
88
|
+
nameInput: cySelector('taxonomies.form.nameInput'),
|
|
89
|
+
slugInput: cySelector('taxonomies.form.slugInput'),
|
|
90
|
+
descriptionInput: cySelector('taxonomies.form.descriptionInput'),
|
|
91
|
+
iconInput: cySelector('taxonomies.form.iconInput'),
|
|
92
|
+
colorInput: cySelector('taxonomies.form.colorInput'),
|
|
93
|
+
parentSelect: cySelector('taxonomies.form.parentSelect'),
|
|
94
|
+
orderInput: cySelector('taxonomies.form.orderInput'),
|
|
95
|
+
saveButton: cySelector('taxonomies.form.saveButton'),
|
|
96
|
+
cancelButton: cySelector('taxonomies.form.cancelButton'),
|
|
97
|
+
cancelButtonFallback: '[role="dialog"] button:contains("Cancel")',
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ============================================
|
|
102
|
+
// SELECTORS - Confirm Delete Dialog (using centralized cySelector)
|
|
103
|
+
// ============================================
|
|
104
|
+
|
|
105
|
+
static get confirmDeleteSelectors() {
|
|
106
|
+
return {
|
|
107
|
+
dialog: cySelector('taxonomies.confirmDelete.dialog'),
|
|
108
|
+
confirmButton: cySelector('taxonomies.confirmDelete.confirmButton'),
|
|
109
|
+
cancelButton: cySelector('taxonomies.confirmDelete.cancelButton'),
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ============================================
|
|
114
|
+
// NAVIGATION
|
|
115
|
+
// ============================================
|
|
116
|
+
|
|
117
|
+
static visitCategoriesPage() {
|
|
118
|
+
cy.visit('/dashboard/taxonomies')
|
|
119
|
+
return this
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ============================================
|
|
123
|
+
// API-AWARE NAVIGATION
|
|
124
|
+
// ============================================
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Visit categories page with API intercepts and wait for data load
|
|
128
|
+
* Replaces: visitCategoriesPage() + waitForPageLoad() + cy.wait(...)
|
|
129
|
+
*/
|
|
130
|
+
static visitWithApiWait(): typeof CategoriesPOM {
|
|
131
|
+
this.setupApiIntercepts()
|
|
132
|
+
this.visitCategoriesPage()
|
|
133
|
+
this.waitForPageLoad()
|
|
134
|
+
this.api.waitForList()
|
|
135
|
+
return this
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ============================================
|
|
139
|
+
// API-AWARE CRUD WORKFLOWS
|
|
140
|
+
// ============================================
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Create category with deterministic API waits
|
|
144
|
+
* Replaces: createCategory() + cy.wait(2000)
|
|
145
|
+
*/
|
|
146
|
+
static createCategoryWithApiWait(data: CategoryFormData): typeof CategoriesPOM {
|
|
147
|
+
this.clickCreate()
|
|
148
|
+
this.waitForDialogOpen()
|
|
149
|
+
|
|
150
|
+
this.fillName(data.name)
|
|
151
|
+
if (data.slug) this.fillSlug(data.slug)
|
|
152
|
+
if (data.description) this.fillDescription(data.description)
|
|
153
|
+
if (data.icon) this.fillIcon(data.icon)
|
|
154
|
+
if (data.color) this.fillColor(data.color)
|
|
155
|
+
|
|
156
|
+
this.saveCategory()
|
|
157
|
+
this.api.waitForCreate()
|
|
158
|
+
this.api.waitForRefresh()
|
|
159
|
+
this.waitForDialogClose()
|
|
160
|
+
|
|
161
|
+
return this
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Delete category with deterministic API waits
|
|
166
|
+
*/
|
|
167
|
+
static deleteCategoryWithApiWait(id: string): typeof CategoriesPOM {
|
|
168
|
+
this.clickDelete(id)
|
|
169
|
+
this.confirmDelete()
|
|
170
|
+
this.api.waitForDelete()
|
|
171
|
+
this.api.waitForRefresh()
|
|
172
|
+
return this
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ============================================
|
|
176
|
+
// WAIT METHODS
|
|
177
|
+
// ============================================
|
|
178
|
+
|
|
179
|
+
static waitForPageLoad() {
|
|
180
|
+
cy.url().should('include', '/dashboard/taxonomies')
|
|
181
|
+
cy.get(this.listSelectors.page, { timeout: 15000 }).should('exist')
|
|
182
|
+
return this
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static waitForDialogOpen() {
|
|
186
|
+
cy.get(this.formSelectors.dialog, { timeout: 10000 }).should('be.visible')
|
|
187
|
+
return this
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static waitForDialogClose() {
|
|
191
|
+
cy.get(this.formSelectors.dialog, { timeout: 10000 }).should('not.exist')
|
|
192
|
+
return this
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ============================================
|
|
196
|
+
// LIST PAGE INTERACTIONS
|
|
197
|
+
// ============================================
|
|
198
|
+
|
|
199
|
+
static clickCreate() {
|
|
200
|
+
cy.get(this.listSelectors.createBtn).click()
|
|
201
|
+
return this
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
static clickEdit(id: string) {
|
|
205
|
+
cy.get(this.listSelectors.editBtn(id)).click()
|
|
206
|
+
return this
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static clickDelete(id: string) {
|
|
210
|
+
cy.get(this.listSelectors.deleteBtn(id)).click()
|
|
211
|
+
return this
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
static confirmDelete() {
|
|
215
|
+
cy.get(this.listSelectors.confirmDeleteBtn).click()
|
|
216
|
+
return this
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
static cancelDelete() {
|
|
220
|
+
cy.get(this.listSelectors.cancelDeleteBtn).click()
|
|
221
|
+
return this
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ============================================
|
|
225
|
+
// FORM INTERACTIONS
|
|
226
|
+
// ============================================
|
|
227
|
+
|
|
228
|
+
static fillName(name: string) {
|
|
229
|
+
cy.get(this.formSelectors.nameInput).clear().type(name)
|
|
230
|
+
return this
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
static fillSlug(slug: string) {
|
|
234
|
+
cy.get(this.formSelectors.slugInput).clear().type(slug)
|
|
235
|
+
return this
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
static fillDescription(description: string) {
|
|
239
|
+
cy.get(this.formSelectors.descriptionInput).clear().type(description)
|
|
240
|
+
return this
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
static fillIcon(icon: string) {
|
|
244
|
+
cy.get(this.formSelectors.iconInput).clear().type(icon)
|
|
245
|
+
return this
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static fillColor(color: string) {
|
|
249
|
+
cy.get(this.formSelectors.colorInput).clear().type(color)
|
|
250
|
+
return this
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
static saveCategory() {
|
|
254
|
+
cy.get(this.formSelectors.saveButton).click()
|
|
255
|
+
return this
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
static cancelForm() {
|
|
259
|
+
cy.get(this.formSelectors.cancelButton).click()
|
|
260
|
+
return this
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ============================================
|
|
264
|
+
// COMPLETE WORKFLOWS
|
|
265
|
+
// ============================================
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Create a new category with specified data
|
|
269
|
+
*/
|
|
270
|
+
static createCategory(data: CategoryFormData) {
|
|
271
|
+
this.clickCreate()
|
|
272
|
+
this.waitForDialogOpen()
|
|
273
|
+
|
|
274
|
+
this.fillName(data.name)
|
|
275
|
+
|
|
276
|
+
if (data.slug) {
|
|
277
|
+
this.fillSlug(data.slug)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (data.description) {
|
|
281
|
+
this.fillDescription(data.description)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (data.icon) {
|
|
285
|
+
this.fillIcon(data.icon)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (data.color) {
|
|
289
|
+
this.fillColor(data.color)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
this.saveCategory()
|
|
293
|
+
return this
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Edit an existing category
|
|
298
|
+
*/
|
|
299
|
+
static editCategory(id: string, data: Partial<CategoryFormData>) {
|
|
300
|
+
this.clickEdit(id)
|
|
301
|
+
this.waitForDialogOpen()
|
|
302
|
+
|
|
303
|
+
if (data.name) {
|
|
304
|
+
this.fillName(data.name)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (data.slug) {
|
|
308
|
+
this.fillSlug(data.slug)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (data.description) {
|
|
312
|
+
this.fillDescription(data.description)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (data.icon) {
|
|
316
|
+
this.fillIcon(data.icon)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (data.color) {
|
|
320
|
+
this.fillColor(data.color)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
this.saveCategory()
|
|
324
|
+
return this
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Delete a category
|
|
329
|
+
*/
|
|
330
|
+
static deleteCategory(id: string) {
|
|
331
|
+
this.clickDelete(id)
|
|
332
|
+
this.confirmDelete()
|
|
333
|
+
return this
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// ============================================
|
|
337
|
+
// ASSERTIONS
|
|
338
|
+
// ============================================
|
|
339
|
+
|
|
340
|
+
static assertPageVisible() {
|
|
341
|
+
cy.get(this.listSelectors.page).should('exist')
|
|
342
|
+
return this
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static assertCategoryInList(name: string) {
|
|
346
|
+
cy.contains(this.listSelectors.rowGeneric, name).should('be.visible')
|
|
347
|
+
return this
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
static assertCategoryNotInList(name: string) {
|
|
351
|
+
cy.contains(this.listSelectors.rowGeneric, name).should('not.exist')
|
|
352
|
+
return this
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
static assertEmptyList() {
|
|
356
|
+
cy.get(this.listSelectors.emptyState).should('be.visible')
|
|
357
|
+
return this
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
static assertDialogOpen() {
|
|
361
|
+
cy.get(this.formSelectors.dialog).should('be.visible')
|
|
362
|
+
return this
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
static assertDialogClosed() {
|
|
366
|
+
cy.get(this.formSelectors.dialog).should('not.exist')
|
|
367
|
+
return this
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static assertColorBadgeVisible(color: string) {
|
|
371
|
+
// Check for badge with the specified color (as background or border)
|
|
372
|
+
cy.get(this.listSelectors.table).find(`[style*="${color}"]`).should('exist')
|
|
373
|
+
return this
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
static assertSaveSuccess() {
|
|
377
|
+
cy.contains('saved', { matchCase: false }).should('be.visible')
|
|
378
|
+
return this
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export default CategoriesPOM
|