@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.
Files changed (220) hide show
  1. package/package.json +1 -1
  2. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  3. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  4. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  5. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  6. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  7. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  8. package/tests/cypress/e2e/_docs/README.md +215 -0
  9. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  11. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  13. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  14. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  15. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  19. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  20. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  21. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  22. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  23. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  24. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  25. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  26. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  27. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  28. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  29. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  30. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  31. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  32. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  33. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  34. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  36. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  38. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  40. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  42. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  43. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  44. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  45. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  46. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  47. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  48. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  49. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  50. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  51. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  52. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  53. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  54. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  55. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  56. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  57. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  58. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  59. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  60. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  61. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  62. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  63. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  64. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  65. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  66. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  67. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  68. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  69. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  70. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  71. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  72. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  78. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  79. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  83. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  85. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  87. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  89. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  95. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  96. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  97. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  99. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  100. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  101. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  102. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  103. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  105. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  106. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  107. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  109. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  110. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  112. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  114. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  118. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  120. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  122. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  126. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  128. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  130. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  132. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  136. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  138. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  140. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  142. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  144. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  146. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  148. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  149. package/tests/cypress/fixtures/blocks.json +218 -0
  150. package/tests/cypress/fixtures/entities.json +78 -0
  151. package/tests/cypress/fixtures/page-builder.json +21 -0
  152. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  153. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  154. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  155. package/tests/cypress/src/components/EntityForm.ts +375 -0
  156. package/tests/cypress/src/components/EntityList.ts +389 -0
  157. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  158. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  159. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  160. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  161. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  162. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  163. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  164. package/tests/cypress/src/components/index.ts +21 -0
  165. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  166. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  167. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  168. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  169. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  170. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  171. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  172. package/tests/cypress/src/controllers/index.js +25 -0
  173. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  174. package/tests/cypress/src/core/BasePOM.ts +86 -0
  175. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  176. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  177. package/tests/cypress/src/core/index.ts +14 -0
  178. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  179. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  180. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  181. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  182. package/tests/cypress/src/entities/index.ts +14 -0
  183. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  184. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  185. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  186. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  187. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  188. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  189. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  190. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  191. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  192. package/tests/cypress/src/features/index.ts +28 -0
  193. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  194. package/tests/cypress/src/index.ts +101 -0
  195. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  196. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  198. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  199. package/tests/cypress/src/pages/index.js +5 -0
  200. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  201. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  202. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  203. package/tests/cypress/src/pages/public/index.js +6 -0
  204. package/tests/cypress/src/selectors.ts +46 -0
  205. package/tests/cypress/src/session-helpers.ts +500 -0
  206. package/tests/cypress/support/doc-commands.ts +260 -0
  207. package/tests/cypress.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Generic Entity List POM
3
+ *
4
+ * Page Object Model for entity list pages in Default theme.
5
+ * Uses standardized data-cy selectors from entities.json.
6
+ *
7
+ * Convention: {slug}-{component}-{detail}
8
+ * Examples: tasks-table, customers-create-btn, tasks-row-{id}
9
+ *
10
+ * Usage:
11
+ * const tasksList = EntityList.for('tasks')
12
+ * const customersList = EntityList.for('customers')
13
+ */
14
+
15
+ // Import entity configs from theme
16
+ import entitiesConfig from '../../fixtures/entities.json'
17
+
18
+ export interface EntityConfig {
19
+ slug: string
20
+ singular: string
21
+ plural: string
22
+ tableName: string
23
+ fields: string[]
24
+ sections: string[]
25
+ filters: string[]
26
+ }
27
+
28
+ export class EntityList {
29
+ private config: EntityConfig
30
+ private slug: string
31
+
32
+ /**
33
+ * Create a new EntityList POM instance from entity config
34
+ */
35
+ constructor(entityKey: string) {
36
+ const config = entitiesConfig.entities[entityKey as keyof typeof entitiesConfig.entities]
37
+ if (!config) {
38
+ throw new Error(`Unknown entity: ${entityKey}. Available: ${Object.keys(entitiesConfig.entities).join(', ')}`)
39
+ }
40
+ this.config = config as EntityConfig
41
+ this.slug = config.slug
42
+ }
43
+
44
+ // ============================================
45
+ // STATIC FACTORY METHOD
46
+ // ============================================
47
+
48
+ /**
49
+ * Create an EntityList from entity key
50
+ */
51
+ static for(entityKey: string): EntityList {
52
+ return new EntityList(entityKey)
53
+ }
54
+
55
+ // ============================================
56
+ // DYNAMIC SELECTORS (from entities.json convention)
57
+ // ============================================
58
+
59
+ /**
60
+ * Get selectors for this entity following the standard convention
61
+ */
62
+ get selectors() {
63
+ const slug = this.slug
64
+ return {
65
+ // Page elements
66
+ page: `[data-cy="${slug}-page"]`,
67
+ pageTitle: '[data-cy="page-title"]',
68
+
69
+ // Table
70
+ table: `[data-cy="${slug}-table"]`,
71
+
72
+ // Create button
73
+ createButton: `[data-cy="${slug}-create-btn"]`,
74
+
75
+ // Search
76
+ search: `[data-cy="${slug}-search"]`,
77
+ searchInput: `[data-cy="${slug}-search-input"]`,
78
+
79
+ // Filters
80
+ filter: (fieldName: string) => `[data-cy="${slug}-filter-${fieldName}"]`,
81
+ filterTrigger: (fieldName: string) => `[data-cy="${slug}-filter-${fieldName}-trigger"]`,
82
+ filterOption: (fieldName: string, value: string) => `[data-cy="${slug}-filter-${fieldName}-option-${value}"]`,
83
+
84
+ // Rows
85
+ row: (id: string) => `[data-cy="${slug}-row-${id}"]`,
86
+ rowGeneric: `[data-cy^="${slug}-row-"]`,
87
+
88
+ // Row menu actions (EntityTable patterns)
89
+ menuTrigger: (id: string) => `[data-cy="${slug}-menu-${id}"]`,
90
+ menuEdit: (id: string) => `[data-cy="${slug}-menu-edit-${id}"]`,
91
+ menuDelete: (id: string) => `[data-cy="${slug}-menu-delete-${id}"]`,
92
+ menuView: (id: string) => `[data-cy="${slug}-menu-view-${id}"]`,
93
+
94
+ // Pagination
95
+ pagination: `[data-cy="${slug}-pagination"]`,
96
+ paginationPrev: `[data-cy="${slug}-pagination-prev"]`,
97
+ paginationNext: `[data-cy="${slug}-pagination-next"]`,
98
+
99
+ // Bulk actions
100
+ bulkActions: `[data-cy="${slug}-bulk-actions"]`,
101
+
102
+ // Empty state
103
+ emptyState: `[data-cy="${slug}-empty"]`,
104
+
105
+ // Dialogs
106
+ confirmDelete: `[data-cy="${slug}-confirm-delete"]`,
107
+ confirmDeleteBtn: `[data-cy="${slug}-confirm-delete-btn"]`,
108
+ cancelDeleteBtn: `[data-cy="${slug}-cancel-delete-btn"]`,
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Get the entity config
114
+ */
115
+ get entityConfig(): EntityConfig {
116
+ return this.config
117
+ }
118
+
119
+ // ============================================
120
+ // VALIDATION METHODS
121
+ // ============================================
122
+
123
+ /**
124
+ * Validate the list page is visible
125
+ */
126
+ validatePageVisible() {
127
+ cy.get(this.selectors.page).should('be.visible')
128
+ return this
129
+ }
130
+
131
+ /**
132
+ * Validate the table is visible
133
+ */
134
+ validateTableVisible() {
135
+ cy.get(this.selectors.table).should('be.visible')
136
+ return this
137
+ }
138
+
139
+ /**
140
+ * Validate the page title text
141
+ */
142
+ validatePageTitle(expectedTitle: string) {
143
+ cy.get(this.selectors.pageTitle).should('contain.text', expectedTitle)
144
+ return this
145
+ }
146
+
147
+ /**
148
+ * Validate the create button is visible
149
+ */
150
+ validateCreateButtonVisible() {
151
+ cy.get(this.selectors.createButton).should('be.visible')
152
+ return this
153
+ }
154
+
155
+ /**
156
+ * Validate the table has rows
157
+ */
158
+ validateTableHasRows() {
159
+ cy.get(this.selectors.table).find('tbody tr').should('have.length.at.least', 1)
160
+ return this
161
+ }
162
+
163
+ /**
164
+ * Validate the table is empty
165
+ */
166
+ validateTableEmpty() {
167
+ cy.get(this.selectors.table).find('tbody tr').should('have.length', 0)
168
+ return this
169
+ }
170
+
171
+ /**
172
+ * Validate list is visible (alias)
173
+ */
174
+ validateListVisible() {
175
+ return this.validatePageVisible()
176
+ }
177
+
178
+ // ============================================
179
+ // INTERACTION METHODS
180
+ // ============================================
181
+
182
+ /**
183
+ * Click the create button
184
+ */
185
+ clickCreate() {
186
+ cy.get(this.selectors.createButton).click()
187
+ return this
188
+ }
189
+
190
+ /**
191
+ * Click add button (alias for clickCreate)
192
+ */
193
+ clickAdd() {
194
+ return this.clickCreate()
195
+ }
196
+
197
+ /**
198
+ * Search for a term
199
+ */
200
+ search(term: string) {
201
+ cy.get(this.selectors.searchInput).clear().type(term)
202
+ return this
203
+ }
204
+
205
+ /**
206
+ * Clear the search input
207
+ */
208
+ clearSearch() {
209
+ cy.get(this.selectors.searchInput).clear()
210
+ return this
211
+ }
212
+
213
+ /**
214
+ * Select a filter option
215
+ */
216
+ selectFilter(fieldName: string, value: string) {
217
+ cy.get(this.selectors.filterTrigger(fieldName)).click()
218
+ cy.get(this.selectors.filterOption(fieldName, value)).click()
219
+ return this
220
+ }
221
+
222
+ /**
223
+ * Click on a table row by index (0-based)
224
+ */
225
+ clickRowByIndex(index: number) {
226
+ cy.get(this.selectors.table).find('tbody tr').eq(index).click()
227
+ return this
228
+ }
229
+
230
+ /**
231
+ * Click on a table row by text content
232
+ */
233
+ clickRowByText(text: string) {
234
+ cy.get(this.selectors.table).find('tbody tr').contains(text).click()
235
+ return this
236
+ }
237
+
238
+ /**
239
+ * Click on a specific row by ID
240
+ */
241
+ clickRowById(id: string) {
242
+ cy.get(this.selectors.row(id)).click()
243
+ return this
244
+ }
245
+
246
+ /**
247
+ * Open row menu (3 dots)
248
+ */
249
+ openRowMenu(id: string) {
250
+ cy.get(this.selectors.menuTrigger(id)).click()
251
+ return this
252
+ }
253
+
254
+ /**
255
+ * Click edit action in row menu
256
+ */
257
+ clickMenuEdit(id: string) {
258
+ cy.get(this.selectors.menuEdit(id)).click()
259
+ return this
260
+ }
261
+
262
+ /**
263
+ * Click delete action in row menu
264
+ */
265
+ clickMenuDelete(id: string) {
266
+ cy.get(this.selectors.menuDelete(id)).click()
267
+ return this
268
+ }
269
+
270
+ /**
271
+ * Click view action in row menu
272
+ */
273
+ clickMenuView(id: string) {
274
+ cy.get(this.selectors.menuView(id)).click()
275
+ return this
276
+ }
277
+
278
+ // ============================================
279
+ // PAGINATION METHODS
280
+ // ============================================
281
+
282
+ /**
283
+ * Go to next page
284
+ */
285
+ nextPage() {
286
+ cy.get(this.selectors.paginationNext).click()
287
+ return this
288
+ }
289
+
290
+ /**
291
+ * Go to previous page
292
+ */
293
+ previousPage() {
294
+ cy.get(this.selectors.paginationPrev).click()
295
+ return this
296
+ }
297
+
298
+ // ============================================
299
+ // BULK ACTIONS METHODS
300
+ // ============================================
301
+
302
+ /**
303
+ * Select all rows using the header checkbox
304
+ */
305
+ selectAll() {
306
+ cy.get(this.selectors.table).find('thead input[type="checkbox"]').check()
307
+ return this
308
+ }
309
+
310
+ /**
311
+ * Deselect all rows
312
+ */
313
+ deselectAll() {
314
+ cy.get(this.selectors.table).find('thead input[type="checkbox"]').uncheck()
315
+ return this
316
+ }
317
+
318
+ /**
319
+ * Select a row by index
320
+ */
321
+ selectRowByIndex(index: number) {
322
+ cy.get(this.selectors.table).find('tbody tr').eq(index).find('input[type="checkbox"]').check()
323
+ return this
324
+ }
325
+
326
+ /**
327
+ * Validate bulk actions panel is visible
328
+ */
329
+ validateBulkActionsVisible() {
330
+ cy.get(this.selectors.bulkActions).should('be.visible')
331
+ return this
332
+ }
333
+
334
+ // ============================================
335
+ // DELETE CONFIRMATION
336
+ // ============================================
337
+
338
+ /**
339
+ * Confirm deletion in dialog
340
+ */
341
+ confirmDelete() {
342
+ cy.get(this.selectors.confirmDeleteBtn).click()
343
+ return this
344
+ }
345
+
346
+ /**
347
+ * Cancel deletion in dialog
348
+ */
349
+ cancelDelete() {
350
+ cy.get(this.selectors.cancelDeleteBtn).click()
351
+ return this
352
+ }
353
+
354
+ // ============================================
355
+ // WAIT METHODS
356
+ // ============================================
357
+
358
+ /**
359
+ * Wait for the table to load
360
+ */
361
+ waitForTableLoad() {
362
+ cy.get(this.selectors.table).should('exist')
363
+ cy.get(this.selectors.page).find('[data-loading]').should('not.exist')
364
+ return this
365
+ }
366
+
367
+ /**
368
+ * Wait for page load
369
+ */
370
+ waitForPageLoad() {
371
+ cy.url().should('include', `/dashboard/${this.slug}`)
372
+ cy.get(this.selectors.page).should('be.visible')
373
+ return this
374
+ }
375
+
376
+ // ============================================
377
+ // NAVIGATION METHODS
378
+ // ============================================
379
+
380
+ /**
381
+ * Visit the entity list page
382
+ */
383
+ visit() {
384
+ cy.visit(`/dashboard/${this.slug}`)
385
+ return this
386
+ }
387
+ }
388
+
389
+ export default EntityList