collection.ts
@@ -0,0 +1,195 @@
+import { CollectionConfig } from "payload/types";
+import slug from "../fields/slug";
+import activeLocales from "../fields/activeLocales";
+
+import IntroductionBlock from "../blocks/IntroductionBlock";
+import HighlightContentBoxBlock from "../blocks/HighlightContentBoxBlock";
+import ImageAndTextBlock from "../blocks/ImageAndTextBlock";
+import IconListBlock from "../blocks/IconListBlock";
+import { authorFieldAccessControl, commonAccessControl } from "../Common";
+import MediaGalleryBlock from "../blocks/MediaGalleryBlock";
+import backpopulate from "../plugins/backpopulated-relationship/hooks/backpopulate";
+import NewRichTextBlock from "../blocks/NewRichTextBlock";
+import { getPrice, Shop, getUpdatedProducts } from "../affiliates/amazon";
+import payload from "payload";
+
+const Products: CollectionConfig = {
+ slug: "products",
+ labels: {
+ singular: "Product Article",
+ plural: "Product Articles",
+ },
+ admin: {
+ useAsTitle: "title",
+ description: "Any products",
+ group: "📄 Articles",
+ },
+ access: commonAccessControl,
+ versions: {
+ maxPerDoc: 50,
+ drafts: {
+ autosave: false,
+ },
+ },
+ fields: [
+ {
+ name: "title",
+ label: "Title",
+ type: "text",
+ required: true,
+ localized: true,
+ },
+ activeLocales,
+ {
+ type: "tabs", // required
+ tabs: [
+ // required
+ {
+ label: "review", // required
+ description: "Fields for review",
+ fields: [
+ // required
+ {
+ name: "author",
+ type: "relationship",
+ relationTo: "authors",
+ access: authorFieldAccessControl,
+ },
+ slug(),
+ {
+ name: "updated_override", // required
+ type: "date", // required
+ label: "Updated (Override)",
+ admin: {
+ position: "sidebar",
+ date: {
+ pickerAppearance: "dayAndTime",
+ },
+ },
+ },
+ {
+ name: "published_override", // required
+ type: "date", // required
+ label: "Published (Override)",
+ admin: {
+ position: "sidebar",
+ date: {
+ pickerAppearance: "dayAndTime",
+ },
+ },
+ },
+ {
+ name: "featured_image",
+ label: "Featured Image",
+ type: "upload",
+ relationTo: "media",
+ },
+ {
+ name: "featured_image_caption",
+ label: "Caption for Featured Image",
+ type: "text",
+ },
+ {
+ name: "content",
+ label: "Content",
+ type: "blocks",
+ minRows: 0,
+ maxRows: 1000,
+ blocks: [
+ NewRichTextBlock,
+ IntroductionBlock,
+ HighlightContentBoxBlock,
+ ImageAndTextBlock,
+ IconListBlock,
+ MediaGalleryBlock,
+ ],
+ },
+ ],
+ },
+ {
+ name: "product",
+ label: "Product Information", // required
+ fields: [
+ // required
+ {
+ name: "alternatives",
+ label: "Alternative Products (if this one not available)",
+ type: "relationship",
+ relationTo: "products",
+ hasMany: true,
+ hooks: {
+ afterChange: [backpopulate],
+ },
+ },
+ {
+ name: "shops", // required
+ type: "array", // required
+ label: "Shops",
+ minRows: 0,
+ maxRows: 10,
+ labels: {
+ singular: "Shop",
+ plural: "Shops",
+ },
+ hooks: {
+ afterRead: [
+ async ({ data, siblingData, value, req, operation }) => {
+ console.log("Running with", operation);
+
+ console.log("siblingdata", siblingData);
+
+ },
+ ],
+ },
+ fields: [
+ // required
+ {
+ name: "shop",
+ type: "relationship",
+ relationTo: "shops",
+ hasMany: false,
+ hooks: {
+ afterChange: [backpopulate],
+ },
+ },
+ {
+ name: "link",
+ type: "text",
+ },
+ {
+ name: "link_affiliate",
+ type: "text",
+ },
+ {
+ name: "price",
+ type: "number",
+ admin: {
+ readOnly: true,
+ },
+ },
+ {
+ name: "available", // required
+ type: "checkbox", // required
+ label: "Available",
+ defaultValue: true,
+ admin: {
+ readOnly: true,
+ },
+ },
+ {
+ name: "last_checked",
+ type: "date",
+ admin: {
+ readOnly: true,
+ },
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+export default Products;