PluginProbe
Gutenberg / trunk
Gutenberg vtrunk
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
gutenberg / build / routes / post-list / route.js

route.js in Gutenberg trunk, at build/routes/post-list/route.js

360 lines 11.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var __create = Object.create;
2 var __defProp = Object.defineProperty;
3 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4 var __getOwnPropNames = Object.getOwnPropertyNames;
5 var __getProtoOf = Object.getPrototypeOf;
6 var __hasOwnProp = Object.prototype.hasOwnProperty;
7 var __commonJS = (cb, mod) => function __require() {
8 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9 };
10 var __copyProps = (to, from, except, desc) => {
11 if (from && typeof from === "object" || typeof from === "function") {
12 for (let key of __getOwnPropNames(from))
13 if (!__hasOwnProp.call(to, key) && key !== except)
14 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15 }
16 return to;
17 };
18 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19 // If the importer is in node compatibility mode or this is not an ESM
20 // file that has been converted to a CommonJS file using a Babel-
21 // compatible transform (i.e. "__esModule" has not been set), then set
22 // "default" to the CommonJS "module.exports" for node compatibility.
23 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24 mod
25 ));
26
27 // package-external:@wordpress/data
28 var require_data = __commonJS({
29 "package-external:@wordpress/data"(exports, module) {
30 module.exports = window.wp.data;
31 }
32 });
33
34 // package-external:@wordpress/core-data
35 var require_core_data = __commonJS({
36 "package-external:@wordpress/core-data"(exports, module) {
37 module.exports = window.wp.coreData;
38 }
39 });
40
41 // package-external:@wordpress/element
42 var require_element = __commonJS({
43 "package-external:@wordpress/element"(exports, module) {
44 module.exports = window.wp.element;
45 }
46 });
47
48 // package-external:@wordpress/preferences
49 var require_preferences = __commonJS({
50 "package-external:@wordpress/preferences"(exports, module) {
51 module.exports = window.wp.preferences;
52 }
53 });
54
55 // package-external:@wordpress/private-apis
56 var require_private_apis = __commonJS({
57 "package-external:@wordpress/private-apis"(exports, module) {
58 module.exports = window.wp.privateApis;
59 }
60 });
61
62 // routes/post-list/route.ts
63 var import_data5 = __toESM(require_data());
64 var import_core_data3 = __toESM(require_core_data());
65 import { notFound } from "@wordpress/route";
66
67 // packages/views/build-module/use-view.mjs
68 var import_element = __toESM(require_element(), 1);
69 var import_data = __toESM(require_data(), 1);
70 var import_preferences = __toESM(require_preferences(), 1);
71
72 // packages/views/build-module/preference-keys.mjs
73 function generatePreferenceKey(kind, name, slug) {
74 return `dataviews-${kind}-${name}-${slug}`;
75 }
76
77 // packages/views/build-module/resolve-view.mjs
78 var QUERY_PARAMS = ["page", "search"];
79 function isPlainObject(value) {
80 return typeof value === "object" && value !== null && !Array.isArray(value);
81 }
82 function withoutQueryParams(layer) {
83 const result = isPlainObject(layer) ? { ...layer } : {};
84 for (const key of QUERY_PARAMS) {
85 delete result[key];
86 }
87 return result;
88 }
89 function mergeLayer(lower, upper) {
90 const result = { ...lower };
91 for (const key of Object.keys(upper)) {
92 const value = upper[key];
93 const current = result[key];
94 result[key] = isPlainObject(current) && isPlainObject(value) ? mergeLayer(current, value) : value;
95 }
96 return result;
97 }
98 function getLockedFilters(overrides) {
99 return (overrides?.filters ?? []).filter((filter) => filter.isLocked);
100 }
101 function applyLockedFilters(view, overrides) {
102 const locked = getLockedFilters(overrides);
103 if (locked.length === 0) {
104 return view;
105 }
106 const rest = (view.filters ?? []).filter(
107 (filter) => !locked.some((f) => f.field === filter.field)
108 );
109 return { ...view, filters: [...locked, ...rest] };
110 }
111 function getApplicablePersistedView(persistedView, defaultLayouts) {
112 if (!persistedView || persistedView.type === void 0 || !defaultLayouts || defaultLayouts[persistedView.type]) {
113 return persistedView;
114 }
115 const { type, ...rest } = persistedView;
116 return Object.keys(rest).length > 0 ? rest : void 0;
117 }
118 function resolveBaseView(layers, effectiveType) {
119 const { defaultView, defaultLayouts, activeViewOverrides } = layers;
120 const layoutDefaults = defaultLayouts?.[effectiveType];
121 return applyLockedFilters(
122 [layoutDefaults, activeViewOverrides].reduce(
123 (lower, upper) => mergeLayer(lower, withoutQueryParams(upper)),
124 withoutQueryParams(defaultView)
125 ),
126 activeViewOverrides
127 );
128 }
129 function resolveView(args) {
130 const { defaultView, defaultLayouts, activeViewOverrides, page, search } = args;
131 const persistedView = getApplicablePersistedView(
132 args.persistedView,
133 defaultLayouts
134 );
135 const effectiveType = persistedView?.type ?? activeViewOverrides?.type ?? defaultView?.type;
136 const baseView = resolveBaseView(args, effectiveType);
137 const view = {
138 ...applyLockedFilters(
139 mergeLayer(baseView, withoutQueryParams(persistedView)),
140 activeViewOverrides
141 ),
142 page: Number(page ?? 1),
143 search: search ?? ""
144 };
145 return view;
146 }
147
148 // packages/views/build-module/load-view.mjs
149 var import_data2 = __toESM(require_data(), 1);
150 var import_preferences2 = __toESM(require_preferences(), 1);
151 async function loadView(config) {
152 const {
153 kind,
154 name,
155 slug,
156 defaultView,
157 defaultLayouts,
158 activeViewOverrides,
159 queryParams
160 } = config;
161 const preferenceKey = generatePreferenceKey(kind, name, slug);
162 const persistedView = (0, import_data2.select)(
163 import_preferences2.store
164 ).get("core/views", preferenceKey);
165 return resolveView({
166 defaultView,
167 defaultLayouts,
168 activeViewOverrides,
169 persistedView,
170 page: queryParams?.page,
171 search: queryParams?.search
172 });
173 }
174
175 // packages/views/build-module/use-view-config.mjs
176 var import_data3 = __toESM(require_data(), 1);
177 var import_core_data = __toESM(require_core_data(), 1);
178
179 // packages/views/build-module/lock-unlock.mjs
180 var import_private_apis = __toESM(require_private_apis(), 1);
181 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
182 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
183 "@wordpress/views"
184 );
185
186 // routes/post-list/view-utils.ts
187 var import_data4 = __toESM(require_data());
188 var import_core_data2 = __toESM(require_core_data());
189
190 // routes/lock-unlock/index.ts
191 var import_private_apis2 = __toESM(require_private_apis());
192 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
193 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
194 "@wordpress/routes"
195 );
196
197 // routes/post-list/view-utils.ts
198 async function loadPostTypeViewConfig(postType) {
199 const config = await unlock2((0, import_data4.resolveSelect)(import_core_data2.store)).getViewConfig(
200 "postType",
201 postType
202 );
203 return {
204 default_view: config?.default_view,
205 default_layouts: config?.default_layouts,
206 view_list: config?.view_list
207 };
208 }
209 function getActiveViewOverrides(viewList, slug) {
210 return viewList?.find((v) => v.slug === slug)?.view ?? {};
211 }
212 async function ensureView(type, slug, search) {
213 const {
214 default_view: defaultView,
215 default_layouts: defaultLayouts,
216 view_list: viewList
217 } = await loadPostTypeViewConfig(type);
218 if (!defaultView) {
219 throw new Error(
220 `Missing view configuration for the ${type} post type.`
221 );
222 }
223 return loadView({
224 kind: "postType",
225 name: type,
226 slug: "default-new",
227 defaultView,
228 defaultLayouts,
229 activeViewOverrides: getActiveViewOverrides(viewList, slug ?? "all"),
230 queryParams: search
231 });
232 }
233 function viewToQuery(view, postType) {
234 const result = { _embed: "author,wp:featuredmedia" };
235 if (void 0 !== view.perPage) {
236 result.per_page = view.perPage;
237 }
238 if (void 0 !== view.page) {
239 result.page = view.page;
240 }
241 if (![void 0, ""].includes(view.search)) {
242 result.search = view.search;
243 }
244 if (void 0 !== view.sort?.field) {
245 let sortField = view.sort.field;
246 if (sortField === "attached_to") {
247 sortField = "parent";
248 }
249 result.orderby = sortField;
250 }
251 if (void 0 !== view.sort?.direction) {
252 result.order = view.sort.direction;
253 }
254 if (view.showLevels) {
255 result.orderby_hierarchy = true;
256 }
257 const status = view.filters?.find(
258 (filter) => filter.field === "status"
259 );
260 if (status) {
261 result.status = status.value;
262 } else if (postType === "attachment") {
263 result.status = "inherit";
264 } else {
265 result.status = "draft,future,pending,private,publish";
266 }
267 const author = view.filters?.find(
268 (filter) => filter.field === "author"
269 );
270 if (author && author.operator === "is") {
271 result.author = author.value;
272 } else if (author && author.operator === "isNot") {
273 result.author_exclude = author.value;
274 }
275 const commentStatus = view.filters?.find(
276 (filter) => filter.field === "comment_status"
277 );
278 if (commentStatus && commentStatus.operator === "is") {
279 result.comment_status = commentStatus.value;
280 } else if (commentStatus && commentStatus.operator === "isNot") {
281 result.comment_status_exclude = commentStatus.value;
282 }
283 const mediaType = view.filters?.find(
284 (filter) => filter.field === "media_type"
285 );
286 if (mediaType) {
287 result.media_type = mediaType.value;
288 }
289 const date = view.filters?.find((filter) => filter.field === "date");
290 if (date && date.value) {
291 if (date.operator === "before") {
292 result.before = date.value;
293 } else if (date.operator === "after") {
294 result.after = date.value;
295 }
296 }
297 if (postType === "attachment") {
298 result._embed = "wp:attached-to";
299 }
300 return result;
301 }
302
303 // routes/post-list/route.ts
304 var route = {
305 beforeLoad: async ({ params }) => {
306 try {
307 const postType = await (0, import_data5.resolveSelect)(import_core_data3.store).getPostType(
308 params.type
309 );
310 if (!postType) {
311 throw notFound();
312 }
313 } catch {
314 throw notFound();
315 }
316 },
317 title: async ({ params }) => {
318 const postType = await (0, import_data5.resolveSelect)(import_core_data3.store).getPostType(
319 params.type
320 );
321 return postType?.labels?.name || params.type;
322 },
323 async canvas(context) {
324 const { params, search } = context;
325 const view = await ensureView(params.type, params.slug, {
326 page: search.page,
327 search: search.search
328 });
329 if (view.type !== "list") {
330 return void 0;
331 }
332 if (search.postIds && search.postIds.length > 0) {
333 const postId = search.postIds[0].toString();
334 return {
335 postType: params.type,
336 postId,
337 isPreview: true
338 };
339 }
340 const query = viewToQuery(view, params.type);
341 const posts = await (0, import_data5.resolveSelect)(import_core_data3.store).getEntityRecords(
342 "postType",
343 params.type,
344 { ...query, per_page: 1 }
345 );
346 if (posts && posts.length > 0) {
347 const postId = posts[0].id.toString();
348 return {
349 postType: params.type,
350 postId,
351 isPreview: true
352 };
353 }
354 return void 0;
355 }
356 };
357 export {
358 route
359 };
360