@raketa-cloud/admin 1.8.6 → 1.8.8

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 (120) hide show
  1. package/dist/application.css +0 -4
  2. package/package.json +1 -1
  3. package/src/HonoAdapter.js +9 -22
  4. package/src/index.js +0 -3
  5. package/src/routeCategoriesModule.js +1 -1
  6. package/src/routeCollection.js +15 -8
  7. package/src/routeNestedCollection.js +1 -1
  8. package/src/routeNestedMember.js +1 -1
  9. package/src/routeResource.js +19 -21
  10. package/src/routeStandard.js +6 -6
  11. package/src/tests/HonoAdapter.coverage.test.js +15 -25
  12. package/src/tests/routeCategoriesModule.test.js +2 -2
  13. package/src/tests/routeResource.test.js +12 -37
  14. package/src/tests/routeStandard.test.js +13 -13
  15. package/src/views/_shared/_date_fields_input.ejs +13 -0
  16. package/src/views/{page_revisions → resource_revisions}/general/_form.ejs +1 -0
  17. package/src/views/{pages → resources}/_form.ejs +1 -0
  18. package/src/views/{pages → resources}/history/index.ejs +1 -1
  19. package/src/views/{articles → resources}/index.ejs +6 -0
  20. package/src/views/{pages → resources}/show.ejs +7 -7
  21. package/src/views/{articles → resources}/translations/create_form.ejs +2 -2
  22. package/src/routeArticlesModule.js +0 -15
  23. package/src/routeEventsModule.js +0 -15
  24. package/src/routePagesModule.js +0 -15
  25. package/src/tests/routeArticlesModule.test.js +0 -43
  26. package/src/tests/routeEventsModule.test.js +0 -43
  27. package/src/tests/routePagesModule.test.js +0 -43
  28. package/src/views/article_revisions/_nav.ejs +0 -53
  29. package/src/views/article_revisions/general/_form.ejs +0 -18
  30. package/src/views/article_revisions/tags/edit_form.ejs +0 -16
  31. package/src/views/articles/_form.ejs +0 -45
  32. package/src/views/articles/_shared/history_table.ejs +0 -74
  33. package/src/views/articles/deletes/create_form.ejs +0 -68
  34. package/src/views/articles/history/index.ejs +0 -80
  35. package/src/views/articles/show.ejs +0 -222
  36. package/src/views/articles/urls/create_form.ejs +0 -36
  37. package/src/views/event_revisions/codes/_form.ejs +0 -14
  38. package/src/views/event_revisions/codes/edit_form.ejs +0 -16
  39. package/src/views/event_revisions/general/_form.ejs +0 -20
  40. package/src/views/event_revisions/general/edit_form.ejs +0 -16
  41. package/src/views/event_revisions/locks/_form.ejs +0 -11
  42. package/src/views/event_revisions/locks/create_form.ejs +0 -27
  43. package/src/views/event_revisions/meta/_form.ejs +0 -16
  44. package/src/views/event_revisions/meta/edit_form.ejs +0 -16
  45. package/src/views/event_revisions/publishes/_form.ejs +0 -77
  46. package/src/views/event_revisions/publishes/create_form.ejs +0 -9
  47. package/src/views/event_revisions/tags/_form.ejs +0 -13
  48. package/src/views/event_revisions/tags/edit_form.ejs +0 -16
  49. package/src/views/event_revisions/visuals/_form.ejs +0 -13
  50. package/src/views/event_revisions/visuals/edit_form.ejs +0 -16
  51. package/src/views/events/_form.ejs +0 -47
  52. package/src/views/events/_shared/_addons.ejs +0 -0
  53. package/src/views/events/_shared/_export_button.ejs +0 -9
  54. package/src/views/events/_shared/_history_toolbar.ejs +0 -24
  55. package/src/views/events/_shared/_revision_operator.ejs +0 -8
  56. package/src/views/events/_shared/_revision_toolbar.ejs +0 -68
  57. package/src/views/events/_shared/_title.ejs +0 -14
  58. package/src/views/events/_shared/_toolbar.ejs +0 -45
  59. package/src/views/events/_shared/history_table.ejs +0 -74
  60. package/src/views/events/create_form.ejs +0 -9
  61. package/src/views/events/deletes/create_form.ejs +0 -68
  62. package/src/views/events/history/index.ejs +0 -80
  63. package/src/views/events/index.ejs +0 -190
  64. package/src/views/events/show.ejs +0 -222
  65. package/src/views/events/translations/_translation_toolbar.ejs +0 -18
  66. package/src/views/events/translations/create_form.ejs +0 -75
  67. package/src/views/events/translations/index.ejs +0 -39
  68. package/src/views/events/urls/create_form.ejs +0 -36
  69. package/src/views/page_revisions/_nav.ejs +0 -53
  70. package/src/views/page_revisions/codes/_form.ejs +0 -14
  71. package/src/views/page_revisions/codes/edit_form.ejs +0 -16
  72. package/src/views/page_revisions/general/edit_form.ejs +0 -16
  73. package/src/views/page_revisions/locks/_form.ejs +0 -11
  74. package/src/views/page_revisions/locks/create_form.ejs +0 -27
  75. package/src/views/page_revisions/meta/_form.ejs +0 -16
  76. package/src/views/page_revisions/meta/edit_form.ejs +0 -16
  77. package/src/views/page_revisions/publishes/_form.ejs +0 -76
  78. package/src/views/page_revisions/publishes/create_form.ejs +0 -9
  79. package/src/views/page_revisions/tags/_form.ejs +0 -13
  80. package/src/views/page_revisions/visuals/_form.ejs +0 -13
  81. package/src/views/page_revisions/visuals/edit_form.ejs +0 -16
  82. package/src/views/pages/_shared/_addons.ejs +0 -0
  83. package/src/views/pages/_shared/_export_button.ejs +0 -9
  84. package/src/views/pages/_shared/_history_toolbar.ejs +0 -24
  85. package/src/views/pages/_shared/_revision_operator.ejs +0 -8
  86. package/src/views/pages/_shared/_revision_toolbar.ejs +0 -68
  87. package/src/views/pages/_shared/_title.ejs +0 -14
  88. package/src/views/pages/_shared/_toolbar.ejs +0 -45
  89. package/src/views/pages/create_form.ejs +0 -9
  90. package/src/views/pages/index.ejs +0 -185
  91. package/src/views/pages/translations/_translation_toolbar.ejs +0 -18
  92. package/src/views/pages/translations/create_form.ejs +0 -75
  93. package/src/views/pages/translations/index.ejs +0 -39
  94. /package/src/views/{event_revisions → resource_revisions}/_nav.ejs +0 -0
  95. /package/src/views/{article_revisions → resource_revisions}/codes/_form.ejs +0 -0
  96. /package/src/views/{article_revisions → resource_revisions}/codes/edit_form.ejs +0 -0
  97. /package/src/views/{article_revisions → resource_revisions}/general/edit_form.ejs +0 -0
  98. /package/src/views/{article_revisions → resource_revisions}/locks/_form.ejs +0 -0
  99. /package/src/views/{article_revisions → resource_revisions}/locks/create_form.ejs +0 -0
  100. /package/src/views/{article_revisions → resource_revisions}/meta/_form.ejs +0 -0
  101. /package/src/views/{article_revisions → resource_revisions}/meta/edit_form.ejs +0 -0
  102. /package/src/views/{article_revisions → resource_revisions}/publishes/_form.ejs +0 -0
  103. /package/src/views/{article_revisions → resource_revisions}/publishes/create_form.ejs +0 -0
  104. /package/src/views/{article_revisions → resource_revisions}/tags/_form.ejs +0 -0
  105. /package/src/views/{page_revisions → resource_revisions}/tags/edit_form.ejs +0 -0
  106. /package/src/views/{article_revisions → resource_revisions}/visuals/_form.ejs +0 -0
  107. /package/src/views/{article_revisions → resource_revisions}/visuals/edit_form.ejs +0 -0
  108. /package/src/views/{articles → resources}/_shared/_addons.ejs +0 -0
  109. /package/src/views/{articles → resources}/_shared/_export_button.ejs +0 -0
  110. /package/src/views/{articles → resources}/_shared/_history_toolbar.ejs +0 -0
  111. /package/src/views/{articles → resources}/_shared/_revision_operator.ejs +0 -0
  112. /package/src/views/{articles → resources}/_shared/_revision_toolbar.ejs +0 -0
  113. /package/src/views/{articles → resources}/_shared/_title.ejs +0 -0
  114. /package/src/views/{articles → resources}/_shared/_toolbar.ejs +0 -0
  115. /package/src/views/{pages → resources}/_shared/history_table.ejs +0 -0
  116. /package/src/views/{articles → resources}/create_form.ejs +0 -0
  117. /package/src/views/{pages → resources}/deletes/create_form.ejs +0 -0
  118. /package/src/views/{articles → resources}/translations/_translation_toolbar.ejs +0 -0
  119. /package/src/views/{articles → resources}/translations/index.ejs +0 -0
  120. /package/src/views/{pages → resources}/urls/create_form.ejs +0 -0
@@ -1665,10 +1665,6 @@ select {
1665
1665
  margin-bottom: 2rem;
1666
1666
  }
1667
1667
 
1668
- .-mt-4 {
1669
- margin-top: -1rem;
1670
- }
1671
-
1672
1668
  .mb-0 {
1673
1669
  margin-bottom: 0px;
1674
1670
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "1.8.6",
3
+ "version": "1.8.8",
4
4
  "main": "src/index.js",
5
5
  "files": [
6
6
  "src/",
@@ -65,13 +65,11 @@ function putIn(result, key, value) {
65
65
  const sanitizePath = (filePath) =>
66
66
  path.normalize(path.join("/", ...filePath.split("/")));
67
67
 
68
- // Find template path with fallbacks
69
- function getPartialPath(partialPath, views, viewsFallback) {
68
+ // Find template path, preferring an app override over the package template
69
+ function getPartialPath(partialPath, views) {
70
70
  const paths = [
71
71
  sanitizePath(`${process.cwd()}/src/views/${views}/${partialPath}`),
72
72
  sanitizePath(`${currentPath}/views/${views}/${partialPath}`),
73
- viewsFallback &&
74
- sanitizePath(`${currentPath}/views/${viewsFallback}/${partialPath}`),
75
73
  ].filter(Boolean);
76
74
 
77
75
  // Return first existing path
@@ -137,11 +135,8 @@ export default class HonoAdapter {
137
135
  this.globalAfterFilters.push({ pattern, filter });
138
136
  }
139
137
 
140
- getActionPath(views, viewsFallback, action) {
141
- const packagePath = viewsFallback
142
- ? `${currentPath}/views/${viewsFallback}/${action}.ejs`
143
- : `${currentPath}/views/${views}/${action}.ejs`;
144
-
138
+ getActionPath(views, action) {
139
+ const packagePath = `${currentPath}/views/${views}/${action}.ejs`;
145
140
  const appPath = `${process.cwd()}/src/views/${views}/${action}.ejs`;
146
141
 
147
142
  return existsSync(appPath) ? appPath : packagePath;
@@ -172,9 +167,9 @@ export default class HonoAdapter {
172
167
  });
173
168
  }
174
169
 
175
- renderPartial(assigns, views, viewsFallback) {
170
+ renderPartial(assigns, views) {
176
171
  return function render(relativePath, localAssigns) {
177
- const partialPath = getPartialPath(relativePath, views, viewsFallback);
172
+ const partialPath = getPartialPath(relativePath, views);
178
173
 
179
174
  try {
180
175
  // Synchronously read the partial file as ejs does not support async/await
@@ -198,18 +193,11 @@ export default class HonoAdapter {
198
193
  };
199
194
  }
200
195
 
201
- async renderAction(
202
- { views, viewsFallback, action, assigns },
203
- viewHelpersConfig = {}
204
- ) {
196
+ async renderAction({ views, action, assigns }, viewHelpersConfig = {}) {
205
197
  // Pick the parent here in the views so we can reuse stuff...
206
- const fullTemplatePath = this.getActionPath(views, viewsFallback, action);
198
+ const fullTemplatePath = this.getActionPath(views, action);
207
199
  const renderAssigns = { ...this.getHelpers(viewHelpersConfig), ...assigns };
208
- const renderPartialHelper = this.renderPartial(
209
- renderAssigns,
210
- views,
211
- viewsFallback
212
- );
200
+ const renderPartialHelper = this.renderPartial(renderAssigns, views);
213
201
 
214
202
  try {
215
203
  // Synchronously read the full template file
@@ -399,7 +387,6 @@ export default class HonoAdapter {
399
387
  const rendered = this.renderAction(
400
388
  {
401
389
  views,
402
- viewsFallback: resourceConfig.viewsFallback,
403
390
  action,
404
391
  assigns: fullAssigns,
405
392
  },
package/src/index.js CHANGED
@@ -5,9 +5,6 @@ export { default as routeMember } from "./routeMember";
5
5
  export { default as routeNestedMember } from "./routeNestedMember";
6
6
  export { default as setGlobalContext } from "./setGlobalContext";
7
7
  export { default as routeResource } from "./routeResource";
8
- export { default as routePagesModule } from "./routePagesModule";
9
- export { default as routeArticlesModule } from "./routeArticlesModule";
10
- export { default as routeEventsModule } from "./routeEventsModule";
11
8
  export { default as routeSettings } from "./routeSettings";
12
9
  export { default as setupCloud } from "./setupCloud";
13
10
  export { default as routeStandard } from "./routeStandard";
@@ -9,7 +9,7 @@ function routeCategoriesModule(adapter, categoryType, categoryTypePlural) {
9
9
 
10
10
  routeCollection(adapter, categoryTypePlural, CategoriesHandler, {
11
11
  ...resourceConfig,
12
- viewsFallback: "categories",
12
+ views: "categories",
13
13
  });
14
14
  }
15
15
 
@@ -1,18 +1,25 @@
1
1
  const routeCollection = (adapter, resource, handler, resourceConfig = {}) => {
2
+ const views = resourceConfig.views ?? resource;
3
+
2
4
  // Create route definitions
3
5
  const routes = [
4
- ["GET", `/${resource}`, "index", handler.index],
5
- ["GET", `/${resource}/new`, "create_form", handler.create_form],
6
- ["GET", `/${resource}/:id`, "show", handler.show],
7
- ["GET", `/${resource}/:id/edit`, "edit_form", handler.edit_form],
8
- ["POST", `/${resource}`, "create_form", handler.create],
9
- ["POST", `/${resource}/:id`, "edit_form", handler.update],
10
- ["DELETE", `/${resource}/:id`, "destroy", handler.destroy]
6
+ ["GET", `/${resource}`, "index", handler.index],
7
+ ["GET", `/${resource}/new`, "create_form", handler.create_form],
8
+ ["GET", `/${resource}/:id`, "show", handler.show],
9
+ ["GET", `/${resource}/:id/edit`, "edit_form", handler.edit_form],
10
+ ["POST", `/${resource}`, "create_form", handler.create],
11
+ ["POST", `/${resource}/:id`, "edit_form", handler.update],
12
+ ["DELETE", `/${resource}/:id`, "destroy", handler.destroy],
11
13
  ];
12
14
 
13
15
  // Map routes to full configuration
14
16
  const mapping = routes.map(([verb, path, action, fn]) => [
15
- verb, path, resource, resource, action, fn
17
+ verb,
18
+ path,
19
+ resource,
20
+ views,
21
+ action,
22
+ fn,
16
23
  ]);
17
24
 
18
25
  adapter.routeCollection(mapping, resourceConfig);
@@ -1,5 +1,5 @@
1
1
  const routeNestedCollection = (adapter, parent, resource, handler, resourceConfig = {}) => {
2
- const views = `${parent}/${resource}`;
2
+ const views = resourceConfig.views ?? `${parent}/${resource}`;
3
3
 
4
4
  // Define routes exactly as they were in the original implementation
5
5
  // to maintain compatibility with the tests
@@ -1,5 +1,5 @@
1
1
  const routeNestedMember = (adapter, parent, resource, handler, resourceConfig = {}) => {
2
- const views = `${parent}/${resource}`;
2
+ const views = resourceConfig.views ?? `${parent}/${resource}`;
3
3
  const basePath = `/${parent}/:parent_id/${resource}`;
4
4
 
5
5
  // Create route definitions
@@ -27,13 +27,11 @@ function routeResource(
27
27
  adapter,
28
28
  resourceType,
29
29
  resourceTypePlural,
30
- { dateFields = [], viewsType, viewsTypePlural } = {},
30
+ { dateFields = [] } = {},
31
31
  ) {
32
32
  const baseResource = resourceTypePlural;
33
33
  const revisionsBaseResource = `${resourceType}_revisions`;
34
34
  const changesBaseResource = `${resourceType}_changes`;
35
- const viewsRevisions = `${viewsType}_revisions`;
36
- const viewsChanges = `${viewsType}_changes`;
37
35
 
38
36
  const resourceConfig = {
39
37
  resourceType,
@@ -46,7 +44,7 @@ function routeResource(
46
44
  "GET",
47
45
  `/${baseResource}/exports`,
48
46
  "exports",
49
- `${viewsTypePlural}/exports`,
47
+ "resources/exports",
50
48
  "index",
51
49
  ExportsHandler.index,
52
50
  ],
@@ -55,7 +53,7 @@ function routeResource(
55
53
 
56
54
  routeCollection(adapter, baseResource, ResourcesHandler, {
57
55
  ...resourceConfig,
58
- viewsFallback: viewsTypePlural,
56
+ views: "resources",
59
57
  });
60
58
 
61
59
  routeNestedCollection(
@@ -63,12 +61,12 @@ function routeResource(
63
61
  baseResource,
64
62
  "translations",
65
63
  TranslationsHandler,
66
- { ...resourceConfig, viewsFallback: `${viewsTypePlural}/translations` },
64
+ { ...resourceConfig, views: "resources/translations" },
67
65
  );
68
66
 
69
67
  routeNestedCollection(adapter, baseResource, "history", HistoryHandler, {
70
68
  ...resourceConfig,
71
- viewsFallback: `${viewsTypePlural}/history`,
69
+ views: "resources/history",
72
70
  });
73
71
 
74
72
  routeNestedCollection(
@@ -78,38 +76,38 @@ function routeResource(
78
76
  ResourceRevisionsHandler,
79
77
  {
80
78
  ...resourceConfig,
81
- viewsFallback: `${viewsTypePlural}/${viewsRevisions}`,
79
+ views: "resource_revisions",
82
80
  },
83
81
  );
84
82
 
85
83
  routeNestedMember(adapter, revisionsBaseResource, "general", GeneralHandler, {
86
84
  ...resourceConfig,
87
- viewsFallback: `${viewsRevisions}/general`,
85
+ views: "resource_revisions/general",
88
86
  });
89
87
 
90
88
  routeNestedMember(adapter, revisionsBaseResource, "visuals", VisualHandler, {
91
89
  ...resourceConfig,
92
- viewsFallback: `${viewsRevisions}/visuals`,
90
+ views: "resource_revisions/visuals",
93
91
  });
94
92
 
95
93
  routeNestedMember(adapter, revisionsBaseResource, "codes", CodeHandler, {
96
94
  ...resourceConfig,
97
- viewsFallback: `${viewsRevisions}/codes`,
95
+ views: "resource_revisions/codes",
98
96
  });
99
97
 
100
98
  routeNestedMember(adapter, revisionsBaseResource, "meta", MetaHandler, {
101
99
  ...resourceConfig,
102
- viewsFallback: `${viewsRevisions}/meta`,
100
+ views: "resource_revisions/meta",
103
101
  });
104
102
 
105
103
  routeNestedMember(adapter, revisionsBaseResource, "tags", TagHandler, {
106
104
  ...resourceConfig,
107
- viewsFallback: `${viewsRevisions}/tags`,
105
+ views: "resource_revisions/tags",
108
106
  });
109
107
 
110
108
  routeNestedCollection(adapter, revisionsBaseResource, "locks", LocksHandler, {
111
109
  ...resourceConfig,
112
- viewsFallback: `${viewsRevisions}/locks`,
110
+ views: "resource_revisions/locks",
113
111
  });
114
112
 
115
113
  routeNestedCollection(
@@ -119,23 +117,23 @@ function routeResource(
119
117
  UnlocksHandler,
120
118
  {
121
119
  ...resourceConfig,
122
- viewsFallback: `${viewsRevisions}/unlocks`,
120
+ views: "resource_revisions/unlocks",
123
121
  },
124
122
  );
125
123
 
126
124
  routeNestedCollection(adapter, baseResource, "clones", ClonesHandler, {
127
125
  ...resourceConfig,
128
- viewsFallback: `${viewsTypePlural}/clones`,
126
+ views: "resources/clones",
129
127
  });
130
128
 
131
129
  routeNestedCollection(adapter, baseResource, "urls", URLsHandler, {
132
130
  ...resourceConfig,
133
- viewsFallback: `${viewsTypePlural}/urls`,
131
+ views: "resources/urls",
134
132
  });
135
133
 
136
134
  routeNestedCollection(adapter, baseResource, "deletes", DeletesHandler, {
137
135
  ...resourceConfig,
138
- viewsFallback: `${viewsTypePlural}/deletes`,
136
+ views: "resources/deletes",
139
137
  });
140
138
 
141
139
  routeNestedCollection(
@@ -145,7 +143,7 @@ function routeResource(
145
143
  RevertsHandler,
146
144
  {
147
145
  ...resourceConfig,
148
- viewsFallback: `${viewsChanges}/reverts`,
146
+ views: "resource_changes/reverts",
149
147
  },
150
148
  );
151
149
 
@@ -156,7 +154,7 @@ function routeResource(
156
154
  PublishesHandler,
157
155
  {
158
156
  ...resourceConfig,
159
- viewsFallback: `${viewsRevisions}/publishes`,
157
+ views: "resource_revisions/publishes",
160
158
  },
161
159
  );
162
160
 
@@ -167,7 +165,7 @@ function routeResource(
167
165
  CancelSchedulesHandler,
168
166
  {
169
167
  ...resourceConfig,
170
- viewsFallback: `${viewsRevisions}/cancel_schedules`,
168
+ views: "resource_revisions/cancel_schedules",
171
169
  },
172
170
  );
173
171
 
@@ -2,10 +2,8 @@ import DashboardsHandler from "./handlers/DashboardsHandler";
2
2
  import RedirectsHandler from "./handlers/RedirectsHandler";
3
3
  import TagsAPIHandler from "./handlers/TagsAPIHandler";
4
4
  import TagsHandler from "./handlers/TagsHandler";
5
- import routeArticlesModule from "./routeArticlesModule";
6
5
  import routeCollection from "./routeCollection";
7
- import routeEventsModule from "./routeEventsModule";
8
- import routePagesModule from "./routePagesModule";
6
+ import routeResource from "./routeResource";
9
7
  import routeSettings from "./routeSettings";
10
8
 
11
9
  function routeStandard(adapter) {
@@ -29,9 +27,11 @@ function routeStandard(adapter) {
29
27
  routeCollection(adapter, "tags", TagsHandler);
30
28
  routeCollection(adapter, "api/tags", TagsAPIHandler);
31
29
  routeSettings(adapter);
32
- routePagesModule(adapter);
33
- routeArticlesModule(adapter);
34
- routeEventsModule(adapter);
30
+ routeResource(adapter, "page", "pages", { dateFields: [] });
31
+ routeResource(adapter, "article", "articles", { dateFields: ["publish_at"] });
32
+ routeResource(adapter, "event", "events", {
33
+ dateFields: ["publish_at", "starts_at", "ends_at"],
34
+ });
35
35
  }
36
36
 
37
37
  export default routeStandard;
@@ -86,25 +86,17 @@ describe("HonoAdapter.getActionPath", () => {
86
86
  test("returns app path when it exists", () => {
87
87
  existsSync.mockReturnValue(true);
88
88
 
89
- const result = adapter.getActionPath("pages", "pages", "index");
89
+ const result = adapter.getActionPath("resources", "index");
90
90
 
91
- expect(result).toBe(`${process.cwd()}/src/views/pages/index.ejs`);
91
+ expect(result).toBe(`${process.cwd()}/src/views/resources/index.ejs`);
92
92
  });
93
93
 
94
- test("returns package path with viewsFallback when app missing", () => {
94
+ test("returns package path when app missing", () => {
95
95
  existsSync.mockReturnValue(false);
96
96
 
97
- const result = adapter.getActionPath("pages", "fallback", "index");
97
+ const result = adapter.getActionPath("resources", "index");
98
98
 
99
- expect(result).toContain("/views/fallback/index.ejs");
100
- });
101
-
102
- test("returns package path with views when no fallback", () => {
103
- existsSync.mockReturnValue(false);
104
-
105
- const result = adapter.getActionPath("pages", null, "index");
106
-
107
- expect(result).toContain("/views/pages/index.ejs");
99
+ expect(result).toContain("/views/resources/index.ejs");
108
100
  });
109
101
  });
110
102
 
@@ -140,7 +132,7 @@ describe("HonoAdapter.renderPartial", () => {
140
132
  readFileSync.mockReturnValue("<%= foo %>");
141
133
  ejs.render.mockReturnValue("rendered");
142
134
 
143
- const render = adapter.renderPartial({ foo: "bar" }, "pages", null);
135
+ const render = adapter.renderPartial({ foo: "bar" }, "resources");
144
136
  const result = render("_partial.ejs", { extra: 1 });
145
137
 
146
138
  expect(result).toBe("rendered");
@@ -159,7 +151,7 @@ describe("HonoAdapter.renderPartial", () => {
159
151
  throw err;
160
152
  });
161
153
 
162
- const render = adapter.renderPartial({}, "pages", null);
154
+ const render = adapter.renderPartial({}, "resources");
163
155
  const result = render("_partial.ejs", {});
164
156
 
165
157
  expect(result).toContain("Error rendering");
@@ -170,7 +162,7 @@ describe("HonoAdapter.renderPartial", () => {
170
162
  test("throws when partial cannot be located", () => {
171
163
  existsSync.mockReturnValue(false);
172
164
 
173
- const render = adapter.renderPartial({}, "pages", "fallback");
165
+ const render = adapter.renderPartial({}, "resources");
174
166
 
175
167
  expect(() => render("_missing.ejs", {})).toThrow(/Template not found/);
176
168
  });
@@ -195,8 +187,7 @@ describe("HonoAdapter.renderAction", () => {
195
187
  ejs.renderFile.mockResolvedValue("<html>...</html>");
196
188
 
197
189
  const result = await adapter.renderAction({
198
- views: "pages",
199
- viewsFallback: null,
190
+ views: "resources",
200
191
  action: "index",
201
192
  assigns: { title: "Hi" },
202
193
  });
@@ -215,8 +206,7 @@ describe("HonoAdapter.renderAction", () => {
215
206
  });
216
207
 
217
208
  const result = await adapter.renderAction({
218
- views: "pages",
219
- viewsFallback: null,
209
+ views: "resources",
220
210
  action: "index",
221
211
  assigns: {},
222
212
  });
@@ -395,8 +385,8 @@ describe("HonoAdapter.createAction", () => {
395
385
  const handler = jest.fn().mockResolvedValue({ assigns: { title: "Hi" } });
396
386
 
397
387
  await adapter.createAction(
398
- ["GET", "/pages", "pages", "pages", "index", handler],
399
- { viewsFallback: "pages" }
388
+ ["GET", "/pages", "pages", "resources", "index", handler],
389
+ {}
400
390
  );
401
391
 
402
392
  const registered = getRegisteredHandler(adapter, "/en/pages");
@@ -631,10 +621,10 @@ describe("HonoAdapter.routeCollection (instance)", () => {
631
621
  ["POST", "/a", "a", "a", "create", handler],
632
622
  ];
633
623
 
634
- adapter.routeCollection(mapping, { viewsFallback: "a" });
624
+ adapter.routeCollection(mapping, { views: "a" });
635
625
 
636
626
  expect(createSpy).toHaveBeenCalledTimes(2);
637
- expect(createSpy).toHaveBeenCalledWith(mapping[0], { viewsFallback: "a" });
638
- expect(createSpy).toHaveBeenCalledWith(mapping[1], { viewsFallback: "a" });
627
+ expect(createSpy).toHaveBeenCalledWith(mapping[0], { views: "a" });
628
+ expect(createSpy).toHaveBeenCalledWith(mapping[1], { views: "a" });
639
629
  });
640
630
  });
@@ -9,7 +9,7 @@ describe("routeCategoriesModule", () => {
9
9
  routeCollection.mockClear();
10
10
  });
11
11
 
12
- test("registers categories collection with categoryType + plural + viewsFallback", () => {
12
+ test("registers categories collection with categoryType + plural + views", () => {
13
13
  const adapter = {};
14
14
 
15
15
  routeCategoriesModule(adapter, "tag", "tags");
@@ -17,7 +17,7 @@ describe("routeCategoriesModule", () => {
17
17
  expect(routeCollection).toHaveBeenCalledWith(adapter, "tags", CategoriesHandler, {
18
18
  categoryType: "tag",
19
19
  categoryTypePlural: "tags",
20
- viewsFallback: "categories",
20
+ views: "categories",
21
21
  });
22
22
  });
23
23
  });
@@ -13,8 +13,6 @@ describe("routeResource", () => {
13
13
  const adapter = makeAdapter();
14
14
 
15
15
  routeResource(adapter, "article", "articles", {
16
- viewsType: "article",
17
- viewsTypePlural: "articles",
18
16
  dateFields: ["publish_at"],
19
17
  });
20
18
 
@@ -25,7 +23,7 @@ describe("routeResource", () => {
25
23
  "GET",
26
24
  "/articles/exports",
27
25
  "exports",
28
- "articles/exports",
26
+ "resources/exports",
29
27
  "index",
30
28
  expect.any(Function),
31
29
  ],
@@ -41,8 +39,6 @@ describe("routeResource", () => {
41
39
  const adapter = makeAdapter();
42
40
 
43
41
  routeResource(adapter, "event", "events", {
44
- viewsType: "event",
45
- viewsTypePlural: "events",
46
42
  dateFields: ["publish_at", "starts_at", "ends_at"],
47
43
  });
48
44
 
@@ -64,10 +60,7 @@ describe("routeResource", () => {
64
60
  test("registers ResourcesHandler collection at base resource", () => {
65
61
  const adapter = makeAdapter();
66
62
 
67
- routeResource(adapter, "page", "pages", {
68
- viewsType: "page",
69
- viewsTypePlural: "pages",
70
- });
63
+ routeResource(adapter, "page", "pages");
71
64
 
72
65
  const baseCollection = adapter.routeCollection.mock.calls.find(
73
66
  ([mapping]) => mapping.some(([, path]) => path === "/pages")
@@ -75,17 +68,14 @@ describe("routeResource", () => {
75
68
 
76
69
  expect(baseCollection).toBeDefined();
77
70
  expect(baseCollection[1]).toMatchObject({
78
- viewsFallback: "pages",
71
+ views: "resources",
79
72
  });
80
73
  });
81
74
 
82
75
  test("registers api collection for resources", () => {
83
76
  const adapter = makeAdapter();
84
77
 
85
- routeResource(adapter, "page", "pages", {
86
- viewsType: "page",
87
- viewsTypePlural: "pages",
88
- });
78
+ routeResource(adapter, "page", "pages");
89
79
 
90
80
  const apiCollection = adapter.routeCollection.mock.calls.find(
91
81
  ([mapping]) => mapping.some(([, path]) => path === "/api/pages")
@@ -97,10 +87,7 @@ describe("routeResource", () => {
97
87
  test("registers nested collections for revisions, translations, history, locks, unlocks, clones, urls, deletes, publishes, cancel_schedules, reverts", () => {
98
88
  const adapter = makeAdapter();
99
89
 
100
- routeResource(adapter, "article", "articles", {
101
- viewsType: "article",
102
- viewsTypePlural: "articles",
103
- });
90
+ routeResource(adapter, "article", "articles");
104
91
 
105
92
  const nestedPaths = adapter.routeNestedCollection.mock.calls.flatMap(
106
93
  ([mapping]) => mapping.map(([, path]) => path)
@@ -126,10 +113,7 @@ describe("routeResource", () => {
126
113
  test("registers nested members for general, visuals, codes, meta, tags", () => {
127
114
  const adapter = makeAdapter();
128
115
 
129
- routeResource(adapter, "article", "articles", {
130
- viewsType: "article",
131
- viewsTypePlural: "articles",
132
- });
116
+ routeResource(adapter, "article", "articles");
133
117
 
134
118
  const nestedMemberPaths = adapter.routeNestedMember.mock.calls.flatMap(
135
119
  ([mapping]) => mapping.map(([, path]) => path)
@@ -149,10 +133,7 @@ describe("routeResource", () => {
149
133
  test("registers api widgets and change endpoints", () => {
150
134
  const adapter = makeAdapter();
151
135
 
152
- routeResource(adapter, "page", "pages", {
153
- viewsType: "page",
154
- viewsTypePlural: "pages",
155
- });
136
+ routeResource(adapter, "page", "pages");
156
137
 
157
138
  const nestedMemberPaths = adapter.routeNestedMember.mock.calls.flatMap(
158
139
  ([mapping]) => mapping.map(([, path]) => path)
@@ -169,34 +150,28 @@ describe("routeResource", () => {
169
150
  test("uses default empty dateFields when not provided", () => {
170
151
  const adapter = makeAdapter();
171
152
 
172
- routeResource(adapter, "page", "pages", {
173
- viewsType: "page",
174
- viewsTypePlural: "pages",
175
- });
153
+ routeResource(adapter, "page", "pages");
176
154
 
177
155
  const firstCall = adapter.routeCollection.mock.calls[0];
178
156
  expect(firstCall[1].dateFields).toEqual([]);
179
157
  });
180
158
 
181
- test("propagates viewsFallback with viewsTypePlural for collection helpers", () => {
159
+ test("propagates shared resources views for migrated collection helpers", () => {
182
160
  const adapter = makeAdapter();
183
161
 
184
- routeResource(adapter, "event", "events", {
185
- viewsType: "event",
186
- viewsTypePlural: "events",
187
- });
162
+ routeResource(adapter, "event", "events");
188
163
 
189
164
  const baseCollection = adapter.routeCollection.mock.calls.find(
190
165
  ([mapping]) => mapping.some(([, path]) => path === "/events")
191
166
  );
192
167
 
193
- expect(baseCollection[1].viewsFallback).toBe("events");
168
+ expect(baseCollection[1].views).toBe("resources");
194
169
 
195
170
  const translationsCall = adapter.routeNestedCollection.mock.calls.find(
196
171
  ([mapping]) =>
197
172
  mapping.some(([, path]) => path === "/events/:parent_id/translations")
198
173
  );
199
174
 
200
- expect(translationsCall[1].viewsFallback).toBe("events/translations");
175
+ expect(translationsCall[1].views).toBe("resources/translations");
201
176
  });
202
177
  });
@@ -1,9 +1,7 @@
1
1
  import routeStandard from "../routeStandard";
2
2
  import routeCollection from "../routeCollection";
3
3
  import routeSettings from "../routeSettings";
4
- import routePagesModule from "../routePagesModule";
5
- import routeArticlesModule from "../routeArticlesModule";
6
- import routeEventsModule from "../routeEventsModule";
4
+ import routeResource from "../routeResource";
7
5
 
8
6
  import DashboardsHandler from "../handlers/DashboardsHandler";
9
7
  import RedirectsHandler from "../handlers/RedirectsHandler";
@@ -12,17 +10,13 @@ import TagsAPIHandler from "../handlers/TagsAPIHandler";
12
10
 
13
11
  jest.mock("../routeCollection", () => jest.fn());
14
12
  jest.mock("../routeSettings", () => jest.fn());
15
- jest.mock("../routePagesModule", () => jest.fn());
16
- jest.mock("../routeArticlesModule", () => jest.fn());
17
- jest.mock("../routeEventsModule", () => jest.fn());
13
+ jest.mock("../routeResource", () => jest.fn());
18
14
 
19
15
  describe("routeStandard", () => {
20
16
  beforeEach(() => {
21
17
  routeCollection.mockClear();
22
18
  routeSettings.mockClear();
23
- routePagesModule.mockClear();
24
- routeArticlesModule.mockClear();
25
- routeEventsModule.mockClear();
19
+ routeResource.mockClear();
26
20
  });
27
21
 
28
22
  test("registers dashboard mapping via adapter.routeCollection", () => {
@@ -57,14 +51,20 @@ describe("routeStandard", () => {
57
51
  expect(routeCollection).toHaveBeenCalledWith(adapter, "api/tags", TagsAPIHandler);
58
52
  });
59
53
 
60
- test("delegates to module-specific route registrars", () => {
54
+ test("delegates to routeSettings and registers page/article/event resources", () => {
61
55
  const adapter = { routeCollection: jest.fn() };
62
56
 
63
57
  routeStandard(adapter);
64
58
 
65
59
  expect(routeSettings).toHaveBeenCalledWith(adapter);
66
- expect(routePagesModule).toHaveBeenCalledWith(adapter);
67
- expect(routeArticlesModule).toHaveBeenCalledWith(adapter);
68
- expect(routeEventsModule).toHaveBeenCalledWith(adapter);
60
+ expect(routeResource).toHaveBeenCalledWith(adapter, "page", "pages", {
61
+ dateFields: [],
62
+ });
63
+ expect(routeResource).toHaveBeenCalledWith(adapter, "article", "articles", {
64
+ dateFields: ["publish_at"],
65
+ });
66
+ expect(routeResource).toHaveBeenCalledWith(adapter, "event", "events", {
67
+ dateFields: ["publish_at", "starts_at", "ends_at"],
68
+ });
69
69
  });
70
70
  });
@@ -0,0 +1,13 @@
1
+ <%
2
+ const dateFieldMeta = {
3
+ publish_at: { type: "date", label: `${Inflector.capitalize(_context.resourceConfig.resourceType)} post date` },
4
+ starts_at: { type: "datetime-local", label: "Starts at (UTC)" },
5
+ ends_at: { type: "datetime-local", label: "Ends at (UTC)" },
6
+ };
7
+ %>
8
+ <% (_context.resourceConfig.dateFields || []).forEach((name) => { %>
9
+ <% const meta = dateFieldMeta[name]; %>
10
+ <% if (meta) { %>
11
+ <%- f.field(`resource.settings.${name}`, { required: true, type: meta.type, label: meta.label }) %>
12
+ <% } %>
13
+ <% }) %>