diff --git a/CODEOWNERS b/CODEOWNERS index f0a1afd242..db2c8f7c4e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -17,3 +17,5 @@ source/content/guides/integrated-composer/ @pantheon-systems/lifecycle-ops source/content/guides/multisite/ @pantheon-systems/cms-platform # The cms-platform team is responsible for External Libraries on Pantheon source/content/external-libraries @pantheon-systems/cms-platform +# There is a team just for release note permissions +source/releasenotes/ @pantheon-systems/release-note-authors diff --git a/gatsby-config.js b/gatsby-config.js index 2de3befba8..dd84fbb00a 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -64,6 +64,13 @@ module.exports = { name: `data`, }, }, + { + resolve: `gatsby-source-filesystem`, + options: { + path: `${__dirname}/source/releasenotescategories`, + name: `releasenotescategories`, + }, + }, { // Converts Markdown into HTML resolve: `gatsby-transformer-remark`, // https://www.gatsbyjs.com/plugins/gatsby-transformer-remark/ @@ -97,6 +104,14 @@ module.exports = { name: `changelogs`, }, }, + + { + resolve: `gatsby-source-filesystem`, + options: { + path: `${__dirname}/source/releasenotes`, + name: `releasenotes`, + }, + }, { resolve: `gatsby-source-filesystem`, options: { diff --git a/gatsby-node.js b/gatsby-node.js index 288a567556..5cfcd56ef7 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -1,7 +1,7 @@ const path = require(`path`) const crypto = require("crypto") -const matter = require('gray-matter'); -var fs = require('fs-extra') +const matter = require("gray-matter") +var fs = require("fs-extra") /* For additional reference material, see @@ -11,11 +11,11 @@ The contents of this file define how the source content is converted into web pages. It is prime for refactoring. */ - /** This helper function determines what slug a piece of content will use */ const calculateSlug = (node, getNode) => { const fileName = getNode(node.parent).name // Sets the filename from GraphQL - if (node.frontmatter.permalink) { //If the "permalink" frontmatter value is present... + if (node.frontmatter.permalink) { + //If the "permalink" frontmatter value is present... return node.frontmatter.permalink // return it. .replace(":basename", fileName) // If permalink includes ":basename", prepend the filename to the slug .replace("docs", "") // If it includes "docs", remove it. Docs is added by the pathPrefix in gatsby-config.js @@ -27,18 +27,33 @@ const calculateSlug = (node, getNode) => { } // This section creates the changelog slug based on the YYYY-MM-DD-MONTH.md template - if (getNode(node.parent).absolutePath.includes("changelogs")) { // If the file is in the changelogs directory... - const split = fileName.split('-'); // split the file name where hyphenated... + if (getNode(node.parent).absolutePath.includes("changelogs")) { + // If the file is in the changelogs directory... + const split = fileName.split("-") // split the file name where hyphenated... return `changelog/${split[0]}/${split[1]}` // and return a slug of changelog/YYYY/MM } + // This section creates the releasenotes slug based on the YYYY-MM-DD-slug.md template + if (getNode(node.parent).absolutePath.includes("releasenotes")) { + // If the file is in the releasenotes directory... + // split the file name where hyphenated. + const split = fileName.split("-") + // set a const to remaining slug based on the keys from split that are not the date. + const remainingSlug = split.slice(3).join("-") + return `release-notes/${split[0]}/${split[1]}/${remainingSlug}` // and return a slug of releasenotes/YYYY/MM/slug + } return `${fileName}` // Otherwise, as long as there is a filename in GraphQL, use it as the slug. } - /* This helper function helps determine which template should be applied to a piece of content */ -const calculateTemplate = (node, defaultTemplate) => { // The functions accepts as arguments a GraphQL node and default template. - if (node.frontmatter && node.frontmatter.layout && node.frontmatter.layout !== null) { // If the node has the layout value in frontmatter... +const calculateTemplate = (node, defaultTemplate) => { + // The functions accepts as arguments a GraphQL node and default template. + if ( + node.frontmatter && + node.frontmatter.layout && + node.frontmatter.layout !== null + ) { + // If the node has the layout value in frontmatter... return node.frontmatter.layout // use that value. } @@ -48,42 +63,39 @@ const calculateTemplate = (node, defaultTemplate) => { // The functions accepts /* These helper functions are used to provide multi-page guide pages with the previous and next pages in the guide, to be used in the construction of the table of contents. */ -const calculatePrevious = (guide) => { // The function accepts as an argument the node of the guide page in question - if (!guide.previous) { // If the page doesn't have a value for the "previous" field in GraphQL - return null; // return nothing. +const calculatePrevious = (guide) => { + // The function accepts as an argument the node of the guide page in question + if (!guide.previous) { + // If the page doesn't have a value for the "previous" field in GraphQL + return null // return nothing. } // Also return nothing if the guide_directory value doesn't exist. - if (guide.node.fields.guide_directory !== guide.previous.fields.guide_directory) { - return null; + if ( + guide.node.fields.guide_directory !== guide.previous.fields.guide_directory + ) { + return null } // Otherwise, return the slug of the page identified as previous by GraphQL. How it determines which one is previous, unclear to me at this time. - return guide.previous.fields.slug; + return guide.previous.fields.slug } // Same as above. const calculateNext = (guide) => { if (!guide.next) { - return null; + return null } if (guide.node.fields.guide_directory !== guide.next.fields.guide_directory) { - return null; + return null } - return guide.next.fields.slug; + return guide.next.fields.slug } -const digest = str => - (str != null) ? - crypto - .createHash("md5") - .update(str) - .digest("hex") - : - crypto - .createHash("md5") - .update(" ") - .digest("hex") +const digest = (str) => + str != null + ? crypto.createHash("md5").update(str).digest("hex") + : crypto.createHash("md5").update(" ").digest("hex") exports.onCreateWebpackConfig = ({ actions }) => { actions.setWebpackConfig({ @@ -94,13 +106,12 @@ exports.onCreateWebpackConfig = ({ actions }) => { } exports.createSchemaCustomization = ({ actions, schema }) => { - actions.createFieldExtension({ name: `defaultFalse`, extend() { return { resolve(source, args, context, info) { - if (source[info.fieldName] == null ) { + if (source[info.fieldName] == null) { return false } return source[info.fieldName] @@ -127,10 +138,10 @@ exports.createPages = ({ graphql, actions }) => { { allDocs: allMdx( filter: { - fileAbsolutePath: { regex: "/content(?!/(partials|changelog|guides)/)/"} - frontmatter: { - draft: {ne: true} + fileAbsolutePath: { + regex: "/content(?!/(partials|changelog|guides|releasenotes)/)/" } + frontmatter: { draft: { ne: true } } } ) { edges { @@ -151,8 +162,8 @@ exports.createPages = ({ graphql, actions }) => { allGuides: allMdx( filter: { - fileAbsolutePath: { regex: "/guides/"} - frontmatter: { draft: {ne: true}} + fileAbsolutePath: { regex: "/guides/" } + frontmatter: { draft: { ne: true } } } sort: { fields: [fileAbsolutePath], order: ASC } ) { @@ -184,15 +195,45 @@ exports.createPages = ({ graphql, actions }) => { } } + allReleaseNotes: allMdx( + filter: { fileAbsolutePath: { regex: "/releasenotes/" } } + sort: { fields: [fileAbsolutePath], order: DESC } + ) { + edges { + previous { + fields { + slug + } + } + + node { + id + frontmatter { + title + categories + published_date + } + fields { + slug + } + } + + next { + fields { + slug + } + } + } + } + allChangelogs: allMdx( filter: { - fileAbsolutePath: { regex: "/changelogs/"} - frontmatter: { draft: {ne: true}} - }, + fileAbsolutePath: { regex: "/changelogs/" } + frontmatter: { draft: { ne: true } } + } sort: { fields: [fileAbsolutePath], order: DESC } ) { edges { - previous { fields { slug @@ -214,7 +255,6 @@ exports.createPages = ({ graphql, actions }) => { slug } } - } } @@ -234,7 +274,6 @@ exports.createPages = ({ graphql, actions }) => { } } } - dataJson { commands { description @@ -243,16 +282,20 @@ exports.createPages = ({ graphql, actions }) => { usage } } - + releasenotescategoriesJson { + categories { + slug + } + } } - `).then(result => { + `).then((result) => { if (result.errors) { throw result.errors } // Create doc pages. const docs = result.data.allDocs.edges - docs.forEach(doc => { + docs.forEach((doc) => { const template = calculateTemplate(doc.node, "doc") createPage({ path: doc.node.fields.slug, @@ -265,10 +308,10 @@ exports.createPages = ({ graphql, actions }) => { // Create guide pages. const guides = result.data.allGuides.edges - guides.forEach(guide => { + guides.forEach((guide) => { if (guide.node.fields.guide_directory !== null) { - const previous = calculatePrevious(guide); - const next = calculateNext(guide); + const previous = calculatePrevious(guide) + const next = calculateNext(guide) const template = calculateTemplate(guide.node, "guide") createPage({ path: guide.node.fields.slug, @@ -277,7 +320,7 @@ exports.createPages = ({ graphql, actions }) => { slug: guide.node.fields.slug, guide_directory: guide.node.fields.guide_directory, previous, - next + next, }, }) } else { @@ -294,8 +337,10 @@ exports.createPages = ({ graphql, actions }) => { // Create changelog pages. const changelogs = result.data.allChangelogs.edges - changelogs.forEach(changelog => { - const previous = changelog.previous ? changelog.previous.fields.slug || null : null + changelogs.forEach((changelog) => { + const previous = changelog.previous + ? changelog.previous.fields.slug || null + : null const next = changelog.next ? changelog.next.fields.slug || null : null const template = calculateTemplate(changelog.node, "changelog") createPage({ @@ -304,14 +349,41 @@ exports.createPages = ({ graphql, actions }) => { context: { slug: changelog.node.fields.slug, next: previous, - previous: next + previous: next, + }, + }) + }) + + // Create changelog pagination. + const postsPerPage = 6 + const numPages = Math.ceil(changelogs.length / postsPerPage) + Array.from({ length: numPages }).forEach((_, i) => { + const currentPage = i + 1 + const next = + currentPage === 1 + ? null + : currentPage === 2 + ? `/changelog/` + : `/changelog/page/${currentPage - 1}` + const previous = + currentPage < numPages ? `/changelog/page/${currentPage + 1}` : null + createPage({ + path: i === 0 ? `/changelog/` : `/changelog/page/${i + 1}`, + component: path.resolve("./src/templates/changelogs.js"), + context: { + limit: postsPerPage, + skip: i * postsPerPage, + numPages, + currentPage, + previous, + next, }, }) }) // Create Terminus Command pages const terminusCommands = result.data.dataJson.commands - terminusCommands.forEach(command => { + terminusCommands.forEach((command) => { const slugRegExp = /:/g const slug = command.name.replace(slugRegExp, "-") createPage({ @@ -319,35 +391,62 @@ exports.createPages = ({ graphql, actions }) => { component: path.resolve(`./src/templates/terminusCommand.js`), context: { slug: slug, - name: command.name - } + name: command.name, + }, }) }) - // Create changelog pagination. - const postsPerPage = 6 - const numPages = Math.ceil(changelogs.length / postsPerPage) - Array.from({ length: numPages }).forEach((_, i) => { - const currentPage = i + 1; - const next = currentPage === 1 ? null : (currentPage === 2 ? `/changelog/` : `/changelog/page/${currentPage - 1}`); - const previous = currentPage < numPages ? `/changelog/page/${currentPage + 1}` : null; + // Create release notes without pagination. At a later date, we may want to add pagination. + // And can reused the code above. + createPage({ + path: `/release-notes/`, + component: path.resolve("./src/templates/releaseNotesListing.js"), + }) + + // Create Terminus Command pages + const allReleaseNoteCategories = + result.data.releasenotescategoriesJson.categories + allReleaseNoteCategories.forEach((category) => { createPage({ - path: i === 0 ? `/changelog/` : `/changelog/page/${i + 1}`, - component: path.resolve("./src/templates/changelogs.js"), + path: `/release-notes/${category.slug}`, + component: path.resolve( + "./src/templates/releaseNotesListingByCategory.js" + ), context: { - limit: postsPerPage, - skip: i * postsPerPage, - numPages, - currentPage, - previous, - next + category: category.slug, + }, + }) + }) + + // terminusCommands.forEach(command => { + // const slugRegExp = /:/g + // const slug = command.name.replace(slugRegExp, "-") + // createPage({ + // path: `terminus/commands/${slug}`, + // component: path.resolve(`./src/templates/terminusCommand.js`), + // context: { + // slug: slug, + // name: command.name + // } + // }) + // }) + + // Create each release note page. + const releaseNotes = result.data.allReleaseNotes.edges + releaseNotes.forEach((releaseNote) => { + const template = calculateTemplate(releaseNote.node, "releaseNotePage") + createPage({ + path: releaseNote.node.fields.slug, + component: path.resolve(`./src/templates/${template}.js`), + context: { + slug: releaseNote.node.fields.slug, }, }) }) // Create contributor pages. const contributors = result.data.allContributorYaml.edges - contributors.forEach(contributor => { + contributors.forEach((contributor) => { createPage({ path: `contributors/${contributor.node.yamlId}`, component: path.resolve(`./src/templates/contributor.js`), @@ -359,7 +458,7 @@ exports.createPages = ({ graphql, actions }) => { // Create topics pages. const topics = result.data.allLandingsYaml.edges - topics.forEach(topic => { + topics.forEach((topic) => { createPage({ path: topic.node.path, component: path.resolve(`./src/templates/landing.js`), @@ -403,14 +502,14 @@ exports.onCreateNode = ({ node, getNode, actions }) => { // MDX content if (node.internal.type === `Mdx`) { - const sourceInstanceName = getNode(node.parent).sourceInstanceName; - if (sourceInstanceName === 'content') { - const editPath = `source/content/${getNode(node.parent).relativePath}`; - // Add editPath field + const sourceInstanceName = getNode(node.parent).sourceInstanceName + if (sourceInstanceName === "content") { + const editPath = `source/content/${getNode(node.parent).relativePath}` + // Add editPath field createNodeField({ name: `editPath`, node, - value: editPath + value: editPath, }) } @@ -419,11 +518,11 @@ exports.onCreateNode = ({ node, getNode, actions }) => { createNodeField({ name: `slug`, node, - value: slug + value: slug, }) if (slug.includes("guides/")) { - if (getNode(node.parent).relativeDirectory !== 'guides') { + if (getNode(node.parent).relativeDirectory !== "guides") { // Add guide_directory field createNodeField({ name: `guide_directory`, @@ -433,9 +532,15 @@ exports.onCreateNode = ({ node, getNode, actions }) => { } } - if (sourceInstanceName === 'changelogs') { - const content = matter(node.internal.content, { excerpt: true, excerpt_separator: '' } ); - const excerpt = content.excerpt || ""; + if ( + sourceInstanceName === "changelogs" || + sourceInstanceName === "releasenotes" + ) { + const content = matter(node.internal.content, { + excerpt: true, + excerpt_separator: "", + }) + const excerpt = content.excerpt || "" createNodeField({ name: `excerpt`, @@ -507,3 +612,6 @@ exports.onPreBootstrap = () => { fs.copySync(scriptsCopyFrom, scriptsCopyTo) } + +/* todo should there be an error thrown if a release note category is set that is not allowed */ +/* todo, infer published date from file name. And throw an error if there are files that don't follow the pattern. */ diff --git a/package-lock.json b/package-lock.json index a258818c67..b86ba77fb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,12 @@ "devDependencies": { "@octokit/rest": "^16.43.2", "date-fns": "^2.29.3", + "mark.js": "^8.11.1", "prettier": "^2.8.3", "react-date-range": "^1.4.0" + }, + "engines": { + "node": ">=18.0.0 <20.0.0" } }, "node_modules/@algolia/cache-browser-local-storage": { @@ -4126,9 +4130,9 @@ } }, "node_modules/@pantheon-systems/pds-toolkit-react": { - "version": "1.0.0-dev.58", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.58.tgz", - "integrity": "sha512-WW0L/s4ZmsP1QjlmpLf4nBk6+WDXnJHxtoNphHtD/mBvG8x9o7A7M5yZC9jivNQize1kZO73vEn/UNcxM4T7Hg==", + "version": "1.0.0-dev.73", + "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.73.tgz", + "integrity": "sha512-fHHJsATAUhxs0riomJ9K2LvrUgYqgsEw1YGk7nZ6ZxRQyb/ilpPgEDHLxT3o5UHjKrk0qhNarx01MR5xTRhlfw==", "dependencies": { "@floating-ui/react": "^0.24.3", "focus-trap-react": "^10.2.1", @@ -18789,6 +18793,12 @@ "node": ">=0.10.0" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "node_modules/markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", @@ -29356,9 +29366,9 @@ } }, "@pantheon-systems/pds-toolkit-react": { - "version": "1.0.0-dev.58", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.58.tgz", - "integrity": "sha512-WW0L/s4ZmsP1QjlmpLf4nBk6+WDXnJHxtoNphHtD/mBvG8x9o7A7M5yZC9jivNQize1kZO73vEn/UNcxM4T7Hg==", + "version": "1.0.0-dev.73", + "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.73.tgz", + "integrity": "sha512-fHHJsATAUhxs0riomJ9K2LvrUgYqgsEw1YGk7nZ6ZxRQyb/ilpPgEDHLxT3o5UHjKrk0qhNarx01MR5xTRhlfw==", "requires": { "@floating-ui/react": "^0.24.3", "focus-trap-react": "^10.2.1", @@ -40240,6 +40250,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", diff --git a/package.json b/package.json index 2c292e303a..fc4d46d703 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "devDependencies": { "@octokit/rest": "^16.43.2", "date-fns": "^2.29.3", + "mark.js": "^8.11.1", "prettier": "^2.8.3", "react-date-range": "^1.4.0" }, diff --git a/source/data/commands.json b/source/data/commands.json index c551ab2feb..a5e30d6af2 100644 --- a/source/data/commands.json +++ b/source/data/commands.json @@ -3,6 +3,7 @@ "name": "Terminus", "version": "3.3.0" }, + "commands": [ { "name": "aliases", @@ -16690,4 +16691,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md b/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md new file mode 100644 index 0000000000..f1b6e3f088 --- /dev/null +++ b/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md @@ -0,0 +1,8 @@ +--- +title: "Early Access: Customer Scheduled Jobs" +published_date: "2023-09-01" +categories: [new-feature, tools-apis] +--- +[The Terminus Scheduled Jobs Plugin](/customer-scheduled-cron-jobs) allows you to schedule and automate specific cron jobs according to site requirements without affecting performance. + +You can specify the desired frequency (e.g., daily, weekly, monthly, hourly), and the actions to be performed. The system then executes the scheduled jobs automatically based on the provided instructions. Helps with long running jobs by granting a total budget of 300 mins (in a 24 hr period) to run jobs. diff --git a/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md b/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md new file mode 100644 index 0000000000..35393f27de --- /dev/null +++ b/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md @@ -0,0 +1,8 @@ +--- +title: "Early Access: Streamlined User Offboarding" +published_date: "2023-09-01" +categories: [account-management, user-interface] +--- +Helps Workspace Admins more effectively manage user access by providing the ability to offboard users from multiple sites in a single click. + +For more information, see Pantheon’s documentation on [Workspace Offboarding](/workspace-offboarding). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other Pantheon customers & super-users. diff --git a/source/releasenotes/2023-09-01-front-end-sites-enhancements.md b/source/releasenotes/2023-09-01-front-end-sites-enhancements.md new file mode 100644 index 0000000000..aa3dbaff01 --- /dev/null +++ b/source/releasenotes/2023-09-01-front-end-sites-enhancements.md @@ -0,0 +1,17 @@ +--- +title: "Front-End Sites Enhancements" +published_date: "2023-09-01" +categories: [front-end-sites, user-interface] +--- +We released version 1.0.5 of the [WP Decoupled Preview plugin](https://wordpress.org/plugins/decoupled-preview/) which contains a bug fix specific to WordPress 6.3. WP Decoupled Preview enables content editors to see their changes in the context of a front-end framework (served through [Pantheon's Front-End Sites](/guides/decoupled/overview)) like Next.js. To try this functionality, request access to Front-End Sites and [follow our tutorial for spinning up our WordPress + Next.js starter](/guides/decoupled/wp-nextjs-frontend-starters). + +Can you tell we want more teams to sign up for Front-End Sites? If you don't yet have access, as of the last month you'll now see callouts in the site creation flow that lead to Front-End Sites Access: + +![Sign up page in the Pantheon dashboard for decoupled Early Access](../images/decoupled/ea-decoupled-signup.png) + +Thanks to efforts in the last month, once you spin up new codebases in Front-End Sites, you will also find: +- Newly improved readme files in your fresh projects. +- Health checks that fire early in the build process if your Front-End Site may be likely to fail due to missing variables for a back-end CMS +- A better navigation and search functionality for [the Decoupled Kit project documentation](https://decoupledkit.pantheon.io/docs). + +Want to chat more about these kinds of sites? Join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack Channel. diff --git a/source/releasenotes/2023-09-01-new-php-defaults.md b/source/releasenotes/2023-09-01-new-php-defaults.md new file mode 100644 index 0000000000..83a3e63906 --- /dev/null +++ b/source/releasenotes/2023-09-01-new-php-defaults.md @@ -0,0 +1,8 @@ +--- +title: New PHP Defaults +published_date: "2023-09-01" +categories: [infrastructure, wordpress, drupal, action-required] +--- +Pantheon has pushed an update to WordPress and Drupal 7 core upstreams which sets PHP 8.1 as the new default PHP version, rather than 7.4. + +Please test this core update thoroughly before deploying to the Live environment. If your site requires an older version of PHP, or if you'd like to upgrade to PHP 8.2, see [Pantheon’s documentation on how to manage PHP versions via the pantheon.yml configuration file](/guides/php/php-versions). diff --git a/source/releasenotes/2023-09-01-object-cache-pro.md b/source/releasenotes/2023-09-01-object-cache-pro.md new file mode 100644 index 0000000000..d7f761463f --- /dev/null +++ b/source/releasenotes/2023-09-01-object-cache-pro.md @@ -0,0 +1,8 @@ +--- +title: Object Cache Pro +published_date: "2023-09-01" +categories: [wordpress, performance, new-feature] +--- +WordPress sites can now leverage an upgraded object caching solution on Pantheon! Object Cache Pro is a highly optimized premium WordPress plugin that integrates with Redis for business class performance. [Find out more about our perspective Object Caching from Steve Persch, Director of Developer Experience](https://pantheon.io/blog/pantheon-includes-object-cache-pro-painless-improved-performance). + +See Pantheon’s documentation for instructions on [how to enable Object Cache Pro](/object-cache/wordpress). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other customers using Object Cache Pro. diff --git a/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md b/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md new file mode 100644 index 0000000000..a4c6261767 --- /dev/null +++ b/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md @@ -0,0 +1,8 @@ +--- +title: Pantheon Advanced Page Cache WordPress Plugin Updates +published_date: "2023-09-01" +categories: [wordpress, action-required, performance] +--- +We released an update for the [Pantheon Advanced Page Cache](https://wordpress.org/plugins/pantheon-advanced-page-cache/) WordPress plugin which adds a filter to allow disabling surrogate keys for posts' taxonomy terms. This can be especially helpful for posts with large numbers of taxonomies (such as WooCommerce products with a large number of global attributes). + +For more information, see [Pantheon documentation](/guides/wordpress-configurations/plugins#disable-surrogate-keys-for-taxonomy-terms). diff --git a/source/releasenotes/2023-09-01-php-security-updates.md b/source/releasenotes/2023-09-01-php-security-updates.md new file mode 100644 index 0000000000..9533b9e382 --- /dev/null +++ b/source/releasenotes/2023-09-01-php-security-updates.md @@ -0,0 +1,8 @@ +--- +title: PHP Security Updates +published_date: "2023-09-01" +categories: [infrastructure, security, action-required] +--- +Pantheon has deployed PHP versions [8.2.9](https://www.php.net/ChangeLog-8.php#8.2.9), [8.1.22](https://www.php.net/ChangeLog-8.php#8.1.22), and [8.0.30](https://www.php.net/ChangeLog-8.php#8.0.30) to customer sites running on the platform. These releases address vulnerabilities disclosed in [CVE-2023-3823](https://nvd.nist.gov/vuln/detail/CVE-2023-3823) and [CVE-2023-3824](https://nvd.nist.gov/vuln/detail/CVE-2023-3824). + +If you are using PHP 8.2, 8.1 or 8.0, there is nothing further that you need to do. If you are still on PHP 7.4 or earlier, though, you should schedule some time to upgrade to a supported version.While the vulnerabilities patched in these latest releases are not reported to affect PHP 7.4, the fact remains that there could be (and probably are) unpatched vulnerabilities in the end-of-life versions. Read more about it in Greg Anderson’s [blog post](https://pantheon.io/blog/php-829-security-release-demonstrates-pantheons-commitment-protecting-your-sites). diff --git a/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md b/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md new file mode 100644 index 0000000000..7f187e2bee --- /dev/null +++ b/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md @@ -0,0 +1,10 @@ +--- +title: "Solr Search for WordPress 2.5.0 Update" +published_date: "2023-09-01" +categories: [wordpress, action-required, performance] +--- +We released an update for the [Solr Search for WordPress plugin](https://wordpress.org/plugins/solr-power/) which disables auto-commit by default and allows cron to push solr commits regularly instead. + +This drastically improves the performance of large sites and avoids 503 errors related to hard committing on every update. This update is recommended for all WordPress sites currently running the plugin. + +You can still enable auto-commit by explicitly setting `SOLRPOWER_DISABLE_AUTOCOMMIT` to `false`. diff --git a/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md b/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md new file mode 100644 index 0000000000..bb525e6e07 --- /dev/null +++ b/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md @@ -0,0 +1,10 @@ +--- +title: WordPress Multisite Search and Replace +published_date: "2023-09-01" +categories: [wordpress, new-feature] +--- +WordPress Multisites can now run automated Search and Replace when cloning the database between environments or spinning up new environments. + +Subdomain Multisites can use a domain map to define the URLs between environments, or auto-convert to a subdirectory Multisite in non-live environments. + +For more information, see Pantheon’s documentation on [Search and Replace](/guides/multisite/search-replace/). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other Pantheon customers & super-users. diff --git a/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md b/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md new file mode 100644 index 0000000000..a82127adcf --- /dev/null +++ b/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md @@ -0,0 +1,10 @@ +--- +title: "Drupal Security Update: SA Core 2023-006" +published_date: "2023-09-20" +categories: [security] +--- + + +On September 20th, [Drupal core updates were released to address a critical vulnerability in the JSON:API module](https://status.pantheon.io/incidents/vj842n7k7w40). Those updates became immediately available within the Pantheon dashboard for one-click code updates. Additionally, [our engineers updated our CDN to mitigate potential attacks](https://status.pantheon.io/incidents/598zxv2v8l7p). + +If you have a Drupal site using JSON:API we suggest you update as soon as possible if you haven't done so already. And even if you aren't using JSON:API, it'll still feel good to apply an update, right? To better understand the nature of security updates, [come watch the Pantheon YouTube Livestream on October 25th](https://www.youtube.com/watch?v=WV2ZSeBOziU). diff --git a/source/releasenotes/2023-10-01-design-system-integration-docs.md b/source/releasenotes/2023-10-01-design-system-integration-docs.md new file mode 100644 index 0000000000..7402191829 --- /dev/null +++ b/source/releasenotes/2023-10-01-design-system-integration-docs.md @@ -0,0 +1,8 @@ +--- +title: "Design System Integration: Docs" +published_date: "2023-10-01" +categories: [user-interface, documentation] +--- +We're excited to announce that our documentation site has been seamlessly integrated with our brand-new design system. This enhancement brings a fresh and cohesive look to our documentation, providing a unified and visually appealing experience for our users. Explore the updated, improved, and more accessible [Docs site](/) today. + +![Docs Design System](../images/DocsDesignSystem.png) diff --git a/source/releasenotes/2023-10-01-drupal-security-update.md b/source/releasenotes/2023-10-01-drupal-security-update.md new file mode 100644 index 0000000000..c0bd845192 --- /dev/null +++ b/source/releasenotes/2023-10-01-drupal-security-update.md @@ -0,0 +1,8 @@ +--- +title: Drupal Security Update +published_date: "2023-10-01" +categories: [drupal, security, action-required] +--- +On September 20th, [Drupal core updates were released to address a critical vulnerability in the JSON:API module](https://status.pantheon.io/incidents/vj842n7k7w40). Those updates became immediately available within the Pantheon dashboard for one-click code updates. Additionally, [our engineers updated our CDN to mitigate potential attacks](https://status.pantheon.io/incidents/598zxv2v8l7p). + +If you have a Drupal site using JSON:API we suggest you update as soon as possible if you haven't done so already. And even if you aren't using JSON:API, it'll still feel good to apply an update, right? To better understand the nature of security updates, [come watch the Pantheon YouTube Livestream on October 25th](https://www.youtube.com/watch?v=WV2ZSeBOziU). diff --git a/source/releasenotes/2023-10-01-front-end-sites-settings.md b/source/releasenotes/2023-10-01-front-end-sites-settings.md new file mode 100644 index 0000000000..868863e46d --- /dev/null +++ b/source/releasenotes/2023-10-01-front-end-sites-settings.md @@ -0,0 +1,7 @@ +--- +title: "Front-End Sites Settings" +published_date: "2023-10-01" +categories: [front-end-sites, wordpress, user-interface] +--- +The Pantheon Front-End Sites Settings page is now available for users of the WordPress for Front-End project. It provides a simplified post install experience where users can copy environment variables for use in the Front-End Sites dashboard, and also test their preview endpoint. Instructions for creating a new WordPress project [can be found here](https://decoupledkit.pantheon.io/docs/backend-starters/decoupled-wordpress/creating-a-new-project). +Want to chat more about these kinds of sites? Join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack Channel. diff --git a/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md b/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md new file mode 100644 index 0000000000..ef5e30b54b --- /dev/null +++ b/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md @@ -0,0 +1,6 @@ +--- +title: "PHP 8.1 and 8.2 updated to their latest patch releases" +published_date: "2023-10-01" +categories: [infrastructure, security] +--- +PHP 8.2.11 and 8.1.24 were released on the platform. They contain the latest bug fixes and security releases for PHP. As a reminder, PHP 8.0 will reach End-of-Life on 26 November 2023. For the best performance and security, Pantheon recommends running PHP 8.1 and above. diff --git a/source/releasenotes/2023-10-01-php-memory-limits-updates.md b/source/releasenotes/2023-10-01-php-memory-limits-updates.md new file mode 100644 index 0000000000..659a5dab50 --- /dev/null +++ b/source/releasenotes/2023-10-01-php-memory-limits-updates.md @@ -0,0 +1,8 @@ +--- +title: PHP Memory Limits Updates +published_date: "2023-10-01" +categories: [infrastructure, performance] +--- +Sometimes you just need more memory to serve your site reliably. To learn more about why we doubled the memory for most site plans, [check out this blog](https://pantheon.io/blog/pantheon-increases-php-memory-limits-performance-and-elite-plans) by Rachel Whitton, Lead Technical Writer here at Pantheon. + +To take advantage of the increased memory limit, [contact our customer support team](/guides/support/contact-support/). Or drop by our [regular Zoom-based office hours](http://pantheon.io/developer-community/office-hours). diff --git a/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md b/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md new file mode 100644 index 0000000000..70f2640dc4 --- /dev/null +++ b/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md @@ -0,0 +1,6 @@ +--- +title: "WPML Improved Edge Caching Compatibility - Cache Hit Ratio Increased 24%" +published_date: "2023-10-01" +categories: [wordpress, performance, infrastructure] +--- +Global CDN now has improved compatibility with the WPML multilingual WordPress plugin. Page variations for each language can be cached at the edge. This update was rolled out automatically for all sites that use the WPML plugin and increased site cache hit ratio by 24% on average. diff --git a/source/releasenotes/2023-11-01-composer-logs-visibility.md b/source/releasenotes/2023-11-01-composer-logs-visibility.md new file mode 100644 index 0000000000..973c93073b --- /dev/null +++ b/source/releasenotes/2023-11-01-composer-logs-visibility.md @@ -0,0 +1,6 @@ +--- +title: Composer Logs Visibility +published_date: "2023-11-01" +categories: [new-feature, tools-apis] +--- +Visibility into composer logs has been a top customer request. Now, if you need to debug a composer build failure due to an error, install the Terminus Composer Logs plugin on your machine to view more details. Upstream Update logs are also available. Installation instructions and command usage can be found [here in the plugin's GitHub repository](https://github.com/pantheon-systems/terminus-composer-logs-plugin). diff --git a/source/releasenotes/2023-11-01-faster-backups.md b/source/releasenotes/2023-11-01-faster-backups.md new file mode 100644 index 0000000000..322a7fdc46 --- /dev/null +++ b/source/releasenotes/2023-11-01-faster-backups.md @@ -0,0 +1,6 @@ +--- +title: Faster Backups +published_date: "2023-11-01" +categories: [infrastructure, performance] +--- +The File System team at Pantheon achieved significant speed improvements in backup processes. The Valhalla export process was overhauled, allowing backups to be constructed from new objects, cutting down export times by 25-83%. This was accomplished by initiating object retrieval immediately after receiving MANIFEST metadata, omitting empty files, and promptly archiving received files. diff --git a/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md b/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md new file mode 100644 index 0000000000..2ba96b55fe --- /dev/null +++ b/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md @@ -0,0 +1,10 @@ +--- +title: "Front-End Sites Build Caching and Node.js Versions" +published_date: "2023-11-01" +categories: [front-end-sites, action-required, performance] +--- +Pantheon introduced a new build pipeline for Front End Sites to significantly improve build times. Beginning on November 13th, 2023, newly created sites are automatically using the new pipeline and cannot opt back to the old pipeline. Sites made prior to that date can opt-in to the new pipeline to take advantage of the new features. All pre-existing sites that do not opt-in will be switched over for new builds on or around January 15th. + +Additionally, we are adding support for Node 18 (for dynamic sites) and 20 (for both static and dynamic sites). To select a specific version, Pantheon is [moving away from using .nvmrc](/guides/decoupled/overview/manage-settings#nodejs-version) and will instead look to the [“engines” field](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#engines) in your project’s `package.json` file. + +To find out more about adopting the new pipeline, [check out our documentation](/guides/decoupled/overview/v1-pipeline), and read our [blog post](https://pantheon.io/blog/opt-now-faster-build-pipeline-front-end-sites?utm_medium=email&utm_source=newsletter&utm_content=front_end_sites_blog&utm_campaign=2023_11_PSU_ALL_US_Novemeber_Changelog_Newsletter) about how we’re already experiencing the benefits of this internally at Pantheon. diff --git a/source/releasenotes/2023-11-01-streamlined-user-offboarding.md b/source/releasenotes/2023-11-01-streamlined-user-offboarding.md new file mode 100644 index 0000000000..24cbc3ec79 --- /dev/null +++ b/source/releasenotes/2023-11-01-streamlined-user-offboarding.md @@ -0,0 +1,10 @@ +--- +title: Streamlined User Offboarding +published_date: "2023-11-01" +categories: [account-management, user-interface, new-feature] +--- +Administrators of large workspaces will now be able to easily remove access for offboarded users at scale. When a member of your team changes jobs, or for whatever reason you need to remove a person from your sites, you can now do so faster + +As you remove users from your workspace or site team, you will be prompted to remove access across all sites that a given user may be connected to, which can save multiple clicks and manual labor to ensure the right access levels are maintained. + +To learn more about how this new offboarding process works, take a look at our [documentation](/guides/account-mgmt/workspace-sites-teams/teams#remove-a-user). diff --git a/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md b/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md new file mode 100644 index 0000000000..78c158b62f --- /dev/null +++ b/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md @@ -0,0 +1,8 @@ +--- +title: VPAT issued for product accessibility +published_date: "2023-11-01" +categories: [infrastructure, user-interface] +--- +* As part of Pantheon’s commitment to accessibility, diversity, and inclusion, we are proud to announce that we have completed an external audit of our platform’s accessibility features and the results are available in our [WCAG 2.1 AA VPAT](https://drive.google.com/file/d/1SYnzTsVNOyK4-5eLRYnNQJArdVsM8JUD/view). +* Our teams have ongoing efforts to improve accessibility further and have outlined goals to improve our support of WCAG 2.1 AA criteria for the next two quarters. +* Our partners and customers who depend on WCAG compliant products can confidently continue to use the platform knowing that we hold accessibility to be an important function of the services we provide. diff --git a/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md b/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md new file mode 100644 index 0000000000..eba22d7482 --- /dev/null +++ b/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md @@ -0,0 +1,8 @@ +--- +title: "WordPress Native PHP Sessions 1.4 Update" +published_date: "2023-11-01" +categories: [wordpress, action-required, performance] +--- +The WordPress Native PHP Sessions plugin added primary keys to its custom tables in 1.2.2 for greater performance and redundancy, but did not upgrade existing sites. Now, version 1.4 includes an optional upgrade command for sites that installed the plugin prior to the 1.2.2 release. + +Our open source [WordPress Native PHP Sessions](https://wordpress.org/plugins/wp-native-php-sessions/) is available in the WordPress.org plugins repo. diff --git a/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md b/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md new file mode 100644 index 0000000000..2e3e86a491 --- /dev/null +++ b/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md @@ -0,0 +1,8 @@ +--- +title: "Delete Front-End Sites Multidevs Directly From Dashboard for Streamlined Management" +published_date: "2023-12-01" +categories: [front-end-sites, user-interface] +--- +We've enhanced your site management experience by enabling the ability to delete Multidevs directly from your Front-End Sites dashboard. This upgrade simplifies project organization, providing you with a seamless process to remove unnecessary Multidevs. + +This intuitive addition streamlines site management, offering a hassle-free solution to keep your projects organized and optimized. Find detailed instructions [here](/guides/decoupled/overview/fes-multidev#delete-a-multidev-environment). diff --git a/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md b/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md new file mode 100644 index 0000000000..7a914f3d6f --- /dev/null +++ b/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md @@ -0,0 +1,13 @@ +--- +title: "Elevated Experience With Front-End Sites Drupal Starter Kit" +published_date: "2023-12-01" +categories: [front-end-sites, user-interface, drupal] +--- +The Pantheon Drupal Starter Kit for Front-End Sites has undergone significant improvements. +* **Setup experience**: The setup process is now more user-friendly and guided for a seamless experience. +* **Health check script**: The newly introduced health check script alerts you to known configuration issues before a build fails. +* **Front-End Sites settings**: Effortlessly navigate through the Settings page, simplifying the testing of your preview endpoint, and allowing convenient copying of environment variables for use in the Front-End Sites Dashboard. + +Curious about creating a new Drupal project with these enhancements? Find detailed instructions [here](https://decoupledkit.pantheon.io/docs/backend-starters/decoupled-drupal/creating-a-new-project). + +For further insights and discussions on similar sites, join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack channel. diff --git a/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md b/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md new file mode 100644 index 0000000000..00cd4b5dc6 --- /dev/null +++ b/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md @@ -0,0 +1,6 @@ +--- +title: Optimized monitoring for high-volume directories +published_date: "2023-12-01" +categories: [new-feature, user-interface, performance] +--- +Introducing proactive alerts tailored for directories with substantial file counts, which could impact performance or accessibility. Stay informed with timely notifications delivered [directly to your dashboard](/guides/filesystem/large-files/#alerts) and via email when file counts reach 50,000 and 100,000. This feature empowers you to efficiently manage your file system and address potential issues promptly. diff --git a/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md b/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md new file mode 100644 index 0000000000..337de3a79e --- /dev/null +++ b/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md @@ -0,0 +1,12 @@ +--- +title: Upgraded Security Measures for Uninterrupted WebOps Experience +published_date: "2023-12-01" +categories: [infrastructure, security, performance] +--- +We're thrilled to announce an impactful upgrade to Pantheon's security infrastructure, reinforcing our commitment to safeguarding your websites. In response to the escalating sophistication of distributed denial-of-service (DDoS) attacks, we've implemented innovative solutions to fortify our defenses. Particularly, we've addressed a surge in Layer 7 attacks targeting content management systems, ensuring resilience even without our Advanced Global CDN's Web Application Firewall (WAF). + +**Key benefits:** +* **Advanced DDoS protection**: Our engineers have proactively countered Layer 7 attacks, mitigating risks posed by inauthentic traffic targeting web content management systems. +* **Rate limiting capabilities**: We've introduced rate limiting capabilities within our Global CDN, curbing abusive traffic effectively. This ensures a stable online presence, even during large-scale attacks, preventing wider stability issues. + +For more in-depth insights into the measures we've taken and the value they bring to your Pantheon experience, delve into the [full blog post](https://pantheon.io/blog/pantheon-improves-protection-malicious-traffic). Your website's security and stability are our top priorities, and this enhancement is another step in our ongoing commitment to delivering a robust WebOps platform. diff --git a/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md b/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md new file mode 100644 index 0000000000..1744d7d693 --- /dev/null +++ b/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md @@ -0,0 +1,6 @@ +--- +title: "WordPress 6.4.2 Now Available for Enhanced Security" +published_date: "2023-12-01" +categories: [wordpress, security, action-required] +--- +In response to a critical security vulnerability, [WordPress 6.4.2](https://wordpress.org/news/2023/12/wordpress-6-4-2-maintenance-security-release/) was released on December 6, 2023. To ensure the safety of your site, Pantheon strongly advises an immediate upgrade. Prioritize your site's security – upgrade now! diff --git a/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md b/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md new file mode 100644 index 0000000000..bf77105ae8 --- /dev/null +++ b/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md @@ -0,0 +1,17 @@ +--- +title: Drupal 7.99 release - bug fixes & feature enhancements +published_date: "2024-01-22" +categories: [drupal] +--- + +Pantheon has seamlessly integrated the Drupal 7.99 release, packed with bug fixes and exciting feature enhancements. + +

Highlights

+ +* **Menu link enhancement:** "Parent link" in new custom menu creation is now limited to the current menu, simplifying the process. Editing still allows access to links from other menus, enabling easy relocation. + +* **New Drupal 7 hook:** Introduced a new “**hook_field_schema_alter()**”, providing additional flexibility for schema alterations. + +* **Security improvement for failed logins:** Error messages after a failed login now include a password reset link without disclosing the username, enhancing security by preventing unintended disclosure to third-party services. + +Elevate your Drupal 7 experience by applying these updates directly from your Pantheon dashboard. If you would like to delve into specifics of this release, please explore on [drupal.org](https://www.drupal.org/project/drupal/releases/7.99). diff --git a/source/releasenotes/2024-01-23-wordpress-6-4-2-security-update.md b/source/releasenotes/2024-01-23-wordpress-6-4-2-security-update.md new file mode 100644 index 0000000000..7fea244830 --- /dev/null +++ b/source/releasenotes/2024-01-23-wordpress-6-4-2-security-update.md @@ -0,0 +1,14 @@ +--- +title: WordPress 6.4.2 security updates +published_date: "2024-01-23" +categories: [wordpress, security] +--- + +The latest version of WordPress, 6.4.2, became available on Pantheon as of December 6, 2023. + +

Highlights

+ +* **Security updates:** Addressed a Remote Code Execution vulnerability. While not directly exploitable in Core, its potential severity was recognized, especially when combined with certain plugins, particularly in multisite installations. +* **[7 bug fixes](https://core.trac.wordpress.org/query?status=closed&milestone=6.4.2&groupdesc=1&group=resolution&col=id&col=summary&col=status&col=milestone&col=owner&col=type&col=priority&col=keywords&order=priority) in Core:** Resolved an issue causing inconsistencies in stylesheet and theme directories. + +Upgrade to WordPress 6.4.2 right from your Pantheon dashboard or Terminus for added security. diff --git a/source/releasenotes/2024-01-24-wp-cli-v2-9-0-release-now-available-on-pantheon.md b/source/releasenotes/2024-01-24-wp-cli-v2-9-0-release-now-available-on-pantheon.md new file mode 100644 index 0000000000..90a3cfb121 --- /dev/null +++ b/source/releasenotes/2024-01-24-wp-cli-v2-9-0-release-now-available-on-pantheon.md @@ -0,0 +1,22 @@ +--- +title: WP-CLI v2.9.0 release now available on Pantheon +published_date: "2024-01-24" +categories: [wordpress] +--- + +We're thrilled to announce the availability of WP-CLI v2.9.0 on the Pantheon platform. + +WP-CLI is easily accessible for any WordPress site on Pantheon through our CLI, [Terminus](/terminus). Manage your WordPress installations efficiently with the power of WP-CLI at your fingertips. + +

Highlights

+ +* **Enhanced PHP 8.2 support:** +This release is dedicated to refining support for [PHP 8.2](/guides/php), the recommended version on Pantheon. +* **Optimized compatibility with WordPress 6.4:** +We've worked to guarantee seamless compatibility, providing you with the best performance and features available. +* **Introducing "wp config is-true" command:** +Our Pantheon engineers have introduced the new "wp config is-true" command. Specifically designed for shell scripting, this command improves WP-CLI functionality and is already integrated into some of our automation processes. +* **Bug fixes:** +Although primarily a compact release, WP-CLI v2.9.0 brings a significant impact with crucial bug fixes to enhance usability. + +For those who love diving into the details, we encourage you to explore the [detailed WP-CLI changelog](https://make.wordpress.org/cli/2023/10/25/wp-cli-v2-9-0-release-notes/#changelog). diff --git a/source/releasenotes/2024-01-25-pantheon-release-notes-a-new-year-a-new-chapter.md b/source/releasenotes/2024-01-25-pantheon-release-notes-a-new-year-a-new-chapter.md new file mode 100644 index 0000000000..4532e04bc7 --- /dev/null +++ b/source/releasenotes/2024-01-25-pantheon-release-notes-a-new-year-a-new-chapter.md @@ -0,0 +1,26 @@ +--- +title: Pantheon release notes - A new year, a new chapter +published_date: "2024-01-25" +categories: [documentation, user-interface] +--- + +As we embark on a new year, we're excited to unveil a transformation. This January marks the introduction of **Pantheon release notes**, a rebranding of our changelog. Our aim is to elevate your platform experience by providing even more valuable insights into product updates. + +

What's new?

+ +* **Enhanced visibility:** Discover our improved interface with added tags to each release note, indicating their category and whether action is required. This feature ensures quick insights at a glance, making your navigation smoother. +* **Filter functionality:** Explore the convenience of our newly integrated filter functionality, allowing you to tailor your release note view based on specific tags. This feature ensures you get information that's most relevant to you. + + +

What’s coming up?

+ +Get ready for a streamlined and more dynamic experience with Pantheon release notes. We're committed to keeping you in the loop every step of the way, ensuring you stay informed about the latest. + +* **Frequent updates:** Say goodbye to waiting for a monthly summary. We're shifting from the monthly retrospective model to publishing a release note for each significant update, providing you with real-time information. +* **Proactive communication:** This change supports more proactive communication. Now, any noteworthy change will be marked here, complementing other channels like blog posts and emails. + +

What lies ahead?

+ +This is just the beginning! Stay tuned for more enhancements down the road as we continue to refine and elevate your Pantheon experience. + +We appreciate your continued support and look forward to a year filled with collaborative success. diff --git a/source/releasenotes/create-release-notes-from-changelog-file.sh b/source/releasenotes/create-release-notes-from-changelog-file.sh new file mode 100644 index 0000000000..1b1417f7a4 --- /dev/null +++ b/source/releasenotes/create-release-notes-from-changelog-file.sh @@ -0,0 +1,14 @@ +#!/bin/bash +FILENAME=2023-11-01-November.md +DATE_PREFIX+=("${FILENAME:0:10}") +while IFS= read -r line; do + if [[ $line =~ "###" ]]; then + RELEASE_NOTE_FILENAME=("${line:4}") + RELEASE_NOTE_FILENAME="$(echo $DATE_PREFIX $RELEASE_NOTE_FILENAME| tr ' ' '-'| tr '.' '-'| tr '[:upper:]' '[:lower:]').md" + echo "---" >> ./releasenotes/$RELEASE_NOTE_FILENAME + echo "title: "${line:4} >> ./releasenotes/$RELEASE_NOTE_FILENAME + echo "published_date: "'"'$DATE_PREFIX'"' >> ./releasenotes/$RELEASE_NOTE_FILENAME + echo "categories: []" >> ./releasenotes/$RELEASE_NOTE_FILENAME + echo "---" >> ./releasenotes/$RELEASE_NOTE_FILENAME + fi +done <$FILENAME diff --git a/source/releasenotescategories/releaseNoteCategories.json b/source/releasenotescategories/releaseNoteCategories.json new file mode 100644 index 0000000000..dea313a426 --- /dev/null +++ b/source/releasenotescategories/releaseNoteCategories.json @@ -0,0 +1,112 @@ +{ + "categories": [ + { + "slug": "account-management", + "displayName": "Account management", + "color": "color-1", + "description": "Highlights updates related to account permissions, user roles, and any changes that impact how users manage and interact with their accounts" + }, + { + "slug": "action-required", + "displayName": "Action required", + "color": "color-3", + "description": "Requires customer to act in order to avoid disruption" + }, + { + "slug": "billing", + "displayName": "Billing & Finance", + "color": "color-1", + "description": "Covers finance and billing-related updates, allowing billing and finance managers to track changes affecting their financial aspects" + }, + { + "slug": "deprecated", + "displayName": "Deprecated", + "color": "color-4", + "description": "Reserved for updates indicating the phasing out or discontinuation of specific features or functionalities" + }, + { + "slug": "documentation", + "displayName": "Pantheon Docs", + "color": "color-4", + "description": "Reserved for updates that involve substantive changes, additions, or clarifications within Pantheon Docs — the centralized hub containing manuals and essential documentation for Pantheon users" + }, + { + "slug": "drupal", + "displayName": "Drupal", + "color": "color-9", + "description": "Tailored for updates specific to the Drupal content management system, helping Drupal users stay informed about platform changes that directly impact their workflows" + }, + { + "slug": "events", + "displayName": "Events", + "color": "color-4", + "description": "Highlights updates related to special events, promotions, or limited-time occurrences on the Pantheon platform, keeping users informed about time-sensitive opportunities" + }, + { + "slug": "front-end-sites", + "displayName": "Front-End Sites", + "color": "color-9", + "description": "Focuses on updates related to Front-End Site (FES) enhancements, ensuring that developers and designers stay informed about changes affecting how they use the product" + }, + { + "slug": "general", + "displayName": "General", + "color": "color-4", + "description": "Serves as a catch-all for updates that don't neatly fit into specific categories, offering a broad overview of general changes on the Pantheon platform" + }, + { + "slug": "infrastructure", + "displayName": "Infrastructure", + "color": "color-8", + "description": "Details changes related to the underlying technology and architecture of the Pantheon platform, providing insights into changes that may impact performance and reliability" + }, + { + "slug": "migration", + "displayName": "Migration", + "color": "color-6", + "description": "Reserved for updates related to migrations, ensuring users are informed about changes affecting the movement of data and content within the Pantheon platform" + }, + { + "slug": "new-feature", + "displayName": "New feature", + "color": "color-7", + "description": "Consolidates information about both new features and improvements, providing users with insights into enhancements that contribute to a better overall experience" + }, + { + "slug": "performance", + "displayName": "Performance", + "color": "color-6", + "description": "Highlights updates focused on optimizing the speed, efficiency, and overall performance of the Pantheon platform, giving users insights into improvements that enhance user experience" + }, + { + "slug": "policy", + "displayName": "Policy", + "color": "color-10", + "description": "Communicates updates related to platform policies, ensuring users are aware of any changes in rules or guidelines that may impact their usage" + }, + { + "slug": "security", + "displayName": "Security", + "color": "color-5", + "description": "Addresses security-related updates, emphasizing the importance of staying informed about changes aimed at maintaining a secure and protected environment for users" + }, + { + "slug": "tools-apis", + "displayName": "Tools & APIs", + "color": "color-2", + "description": "Keeps users informed about updates related to tools and APIs, helping developers understand changes that may impact their workflows and integrations" + }, + { + "slug": "user-interface", + "displayName": "User interface", + "color": "color-2", + "description": "Highlights updates related to changes in the user interface, ensuring that designers, marketers, and other users are aware of alterations to the visual and interactive elements of the platform" + }, + { + "slug": "wordpress", + "displayName": "WordPress", + "color": "color-9", + "description": "Tailored for updates specific to the WordPress content management system, helping WordPress users stay informed about platform changes that directly impact their workflows" + } + ] +} diff --git a/src/components/HeroCTA/index.js b/src/components/HeroCTA/index.js index ed111f2123..eb5e4b5943 100644 --- a/src/components/HeroCTA/index.js +++ b/src/components/HeroCTA/index.js @@ -29,7 +29,7 @@ function HeroCTA(props) {

{title}

-

{subTitle}

+

{subTitle}

{ + // Todo, more type checking. + if (!dateString) { + return null + } + + // Turn ReleaseNoteData.frontmatter.published_date into a date object. + // And then format it as Month Day, Year. + // https://stackoverflow.com/questions/3552461/how-to-format-a-javascript-date + const date = new Date(dateString) + const options = { year: "numeric", month: "long", day: "numeric" } + const formattedDate = date.toLocaleDateString(undefined, options) + + return ( +
+ {formattedDate} +
+ ) +} + +export default PublishedDate diff --git a/src/components/PublishedDate/style.css b/src/components/PublishedDate/style.css new file mode 100644 index 0000000000..57453c8ddd --- /dev/null +++ b/src/components/PublishedDate/style.css @@ -0,0 +1,4 @@ +.docs-published-date { + font-size: var(--pds-typography-size-m); + font-weight: var(--pds-typography-font-weight-semibold); +} diff --git a/src/components/ReleaseNoteCategories/index.js b/src/components/ReleaseNoteCategories/index.js new file mode 100644 index 0000000000..a202c2564e --- /dev/null +++ b/src/components/ReleaseNoteCategories/index.js @@ -0,0 +1,39 @@ +import React from "react" +import { Link } from "gatsby" +import { releaseNoteCategoryLoader } from "../../data/releaseNoteCategories.js" +import { Tag } from "@pantheon-systems/pds-toolkit-react" + +import "./style.css" + +const ReleaseNoteCategories = ({ categories, displayType, className }) => { + if (!categories) { + return null + } + + // If there is one category display the singular form. + const categoryHeading = categories.length === 1 ? "Category:" : "Categories:" + + // Change heading level based on displayType prop. + const HeadingLevel = displayType === "page" ? "h2" : "h3" + + // Put categories in alphabetical order. + const sortedCategories = categories.sort() + + return ( +
+ {categoryHeading} +
+ {sortedCategories.map((categorySlug, index) => ( + } + tagLabel={releaseNoteCategoryLoader(categorySlug).displayName} + tagColor={releaseNoteCategoryLoader(categorySlug).color} + /> + ))} +
+
+ ) +} + +export default ReleaseNoteCategories diff --git a/src/components/ReleaseNoteCategories/style.css b/src/components/ReleaseNoteCategories/style.css new file mode 100644 index 0000000000..9f031ecd3b --- /dev/null +++ b/src/components/ReleaseNoteCategories/style.css @@ -0,0 +1,4 @@ +.docs-release-notes-tags { + column-gap: var(--pds-spacing-s); + display: flex; +} diff --git a/src/components/ReleaseNoteTeaser/index.js b/src/components/ReleaseNoteTeaser/index.js new file mode 100644 index 0000000000..1b5af7ee96 --- /dev/null +++ b/src/components/ReleaseNoteTeaser/index.js @@ -0,0 +1,45 @@ +import React from "react" +import { Link } from "gatsby" +import ReleaseNoteCategories from "../ReleaseNoteCategories/index.js" +import MdxWrapper from "../mdxWrapper.js" +import PublishedDate from "../PublishedDate/index.js" + +import "./style.css" + +const ReleaseNoteTeaser = ({ ReleaseNoteData, className }) => { + if (!ReleaseNoteData) { + return null + } + + return ( + +
+
+ +

+ {ReleaseNoteData.frontmatter.title} +

+ + +
+ + +
+
+ ) +} + +export default ReleaseNoteTeaser diff --git a/src/components/ReleaseNoteTeaser/style.css b/src/components/ReleaseNoteTeaser/style.css new file mode 100644 index 0000000000..cda579f8b9 --- /dev/null +++ b/src/components/ReleaseNoteTeaser/style.css @@ -0,0 +1,27 @@ +.docs-release-note-teaser__header { + display: flex; + flex-direction: column; + row-gap: var(--pds-spacing-s); + margin-block-end: var(--pds-spacing-l); + justify-content: space-between; +} + +@media (min-width: 1025px) { + .docs-release-note-teaser__header { + display: flex; + column-gap: var(--pds-spacing-xl); + margin-block-end: var(--pds-spacing-l); + flex-direction: row; + } +} + +.docs-release-note-teaser__header { + .docs-release-notes-tags { + padding-block-start: var(--pds-spacing-4xs); + } +} + +.individual-changelog-link h2 { + padding: 0; + margin: 0; +} diff --git a/src/components/headerBody/index.js b/src/components/headerBody/index.js index f2fee429a1..9ab679ba34 100644 --- a/src/components/headerBody/index.js +++ b/src/components/headerBody/index.js @@ -44,7 +44,7 @@ const HeaderBody = ({ {subtitle &&

{subtitle}

} -

+

{description}

diff --git a/src/components/mdxWrapper.js b/src/components/mdxWrapper.js new file mode 100644 index 0000000000..fdef6ab4d5 --- /dev/null +++ b/src/components/mdxWrapper.js @@ -0,0 +1,50 @@ +import React from "react" +import { MDXRenderer } from "gatsby-plugin-mdx" +import { MDXProvider } from "@mdx-js/react" +import Callout from "../components/callout" +import Alert from "../components/alert" +import Accordion from "../components/accordion" +import ExternalLink from "../components/externalLink" +import Popover from "../components/popover" +import TabList from "../components/tabList" +import Tab from "../components/tab" +import Card from "../components/card" +import CardGroup from "../components/cardGroup" +import Enablement from "../components/enablement" +import Color from "../components/color.js" +import Download from "../components/download" + +import { + headline2, + headline3, + headline4, +} from "../components/releaseHeadlines" + +const shortcodes = { + Callout, + Alert, + Accordion, + ExternalLink, + Popover, + TabList, + Tab, + Card, + CardGroup, + Enablement, + Color, + Download, + h1: headline2, + h2: headline3, + h3: headline4, +} + + + +const MdxWrapper = ({ mdx }) => { + return ( + + {mdx} + + ) +} +export default MdxWrapper diff --git a/src/components/releaseNoteCategorySelector.js b/src/components/releaseNoteCategorySelector.js new file mode 100644 index 0000000000..0e848670cb --- /dev/null +++ b/src/components/releaseNoteCategorySelector.js @@ -0,0 +1,49 @@ +import React from "react" +import { activeReleaseNoteCategories } from "../data/releaseNoteCategories" +import { MenuButton } from "@pantheon-systems/pds-toolkit-react" +import { Link } from "gatsby" + +const ReleaseNoteCategorySelector = () => { + // Initialize the links array with the All Release Notes link and a separator. + const categoryMenuItems = [ + { + isLink: true, + linkContent: All release notes, + }, + { + isSeparator: true, + }, + ] + + // Function to create menu items for each valid category in use. + const createCategoryMenuItems = (categoryObjects) => { + categoryObjects.map((category) => { + categoryMenuItems.push({ + isLink: true, + linkContent: ( + + {category.displayName} + + ), + }) + }) + } + + // Get the active categories data. + const activeCategories = JSON.parse(activeReleaseNoteCategories()) + + // Create the menu items. + createCategoryMenuItems(activeCategories) + + return ( + <> + + + ) +} + +export default ReleaseNoteCategorySelector diff --git a/src/components/toc/index.js b/src/components/toc/index.js index 0e35956693..dd4796c34c 100644 --- a/src/components/toc/index.js +++ b/src/components/toc/index.js @@ -31,7 +31,7 @@ const TOC = ({ title }) => { return (