slucero → credited minsharm → .
Steps to test
- Install a site locally with the following modules enabled:
- Patternkit
- Patternkit Example
- Layout Builder
- Enable cache header output →
- Configure the Basic Page content type to use layout builder with per-page overrides enabled
- Configure the default layout for Basic Page and add an instance of "[Patternkit] Example"
- Create 2 new Nodes of the Basic Page content type: Page 1, and Page 2
- Edit the layout for Page 2, override the layout saving a change to the content of the example pattern block
- As an administrator, navigate to the Patternkit settings page at
/admin/config/user-interface/patternkit
, enable the checkbox for "Entity cache tag invalidation" under "Advanced settings", and click the "Save configuration" button - In your local files, update the template file for the "[Patternkit] Example" pattern to trigger detection of a new update to the pattern being available
- Edit the file at
modules/patternkit_example/lib/patternkit/src/atoms/example/src/example.twig
in the Patternkit module directory - Add some visible markup, such as
<strong>UPDATED</strong>
, into the template so it will be clearly visible when the new template is used - Clear the Patternkit cache to discover the update:
drush pkcc
- As an administrator, edit the layout for Page 2, edit the example block, and confirm the button to "Update pattern" is available at the top of the pattern form
- Edit the file at
- As an anonymous user, view both pages confirming a successful cache response on each
- As an administrator, edit the layout for Page 2, edit the example block, click the "Update Pattern" button, and save the block. Expect to see the altered content from your template edits visible in the block preview and click "Save layout".
- As an anonymous user, view both pages expecting to see a cache miss for each
Results : Both pages show the previous content (before template changes), indicating that the cache is serving old content due to a cache hit.
- Results:
- Page 1: Shows a cache miss, displaying old content since Page 1 should not have been affected.
- Page 2: Shows the updated content and cache miss, confirming that the cache for Page 2 was correctly invalidated and updated.
- Ensure all pattern instances are up to date by running
drush pkbu
- Clear all caches with
drush cr
- As an anonymous user, view each page twice ensuring the second view returns a cache hit for each
- In your local files, update the template file for the "[Patternkit] Example" pattern to trigger detection of a new update to the pattern being available
- Edit the file at
modules/patternkit_example/lib/patternkit/src/atoms/example/src/example.twig
in the Patternkit module directory - Add some visible markup, such as
<strong>UPDATED AGAIN</strong>
, into the template so it will be clearly visible when the new template is used - Clear the Patternkit cache to discover the update:
drush pkcc
- As an administrator, edit the layout for Page 2, edit the example block, and confirm the button to "Update pattern" is available at the top of the pattern form (Do not click the button yet)
- Edit the file at
- As an anonymous user, view both pages confirming a successful cache response on each
- As an administrator, edit the layout for Page 2, edit the example block, click the "Update Pattern" button, and save the block. Expect to see the altered content from your template edits visible in the block preview and click "Save layout".
- As an anonymous user, view all both noting the page cache result
- Expect to see a cache hit on Page 1 with the content of the block showing the previous edits
- Expect to see a cache miss on Page 2 with the content of the block showing the latest edits
Results: Both pages return cache hit on second visit.
Results: Both pages return cache hit
- Results:
- Page 1: Shows the previous content (old template) with previous edits, confirming a cache hit.
- Page 2: Shows the latest content with new template changes, with cache miss
slucero → credited minsharm → .
I have retested the issue and result looks good to me.
Results:
- Selected themes and icon libraries loads and displays as expected in both the off-canvas tray and full-page view of the block edit form.
- Creation of content on new blocks saved and displayed as expected.
- Editing existing block properly prepopulate existing content into the form.
- Saving changes to existing blocks properly reflected on save.
- Media library integration supports adding and changing selected media.
minsharm → created an issue.
minsharm → created an issue.
minsharm → created an issue.
slucero → credited minsharm → .
Retested the issue and result looks good to me.
Result : Not getting the warning message anymore.
Retested the results of the recent changes in the Patternkit JSON Library Settings and result looks good to me.
Steps to Test :
Navigate to Patternkit JSON Library Settings (/admin/config/user-interface/patternkit/json)
Results :
- Theme selection is no longer available, and unsupported themes have been successfully removed.
- Several unsupported icon options have also been removed.
- WYSIWYG options now list CKEditor5 only if the CKEditor5 module is available.
Retested the issue and result looks good to me.
Results:
- Valid tokens with a provided context were replaced as expected
- An invalid token was removed only when "Replace empty token values" checkbox is checked
- Non-token text in square brackets was unaffected
My test content:
My content with a valid token: [node:title]<br/>
My content with an invalid token: [node:something]<br/>
My referenced text with square brackets: [non-token content]<br/>
Output
Case 1 : Check the "Replace empty token values" checkbox
My content with a valid token: Patternkit Page<br/>
My content with an invalid token: <br/>
My referenced text with square brackets: [non-token content]<br/>
Case 2 : Uncheck the "Replace empty token values" checkbox
My content with a valid token: Patternkit Page<br/>
My content with an invalid token: [node:something]<br/>
My referenced text with square brackets: [non-token content]<br/>
Retested the issue and result looks good to me. Marking it as Verified QA.
Steps to test
- Clear all caches
- View the cache_discovery database table
- Observe the presence of the following cid entries:
- patternkit.library_namespaces
- patternkit_pattern_defintiions:*
- Take the latest changes of this feature branch.
Results : These cache entries is stored in the cache_patternkit table instead.
Retested the issue and result looks good to me. Marking it as Verified QA.
1) Missing Modules:
a) Missing CKEditor 5 - Not getting any error anymore.
b) Missing CKEditor - As Patternkit no longer supports CKEditor 4, making this scenario not applicable.
2) Missing Configuration:
a) CKEditor4 Selected with CKEditor5 Format - Given that Patternkit no longer supports CKEditor 4, this scenario is also not applicable anymore.
b) CKEditor5 Selected with CKEditor4 Format: When we select "Basic HTML" with CKEditor (CKEditor 4) in the text format and editor settings, then the chosen format (Basic HTML) will no longer be visible in the Patternkit setting CKEditor toolbar dropdown. Therefore, this scenario is not applicable when Patternkit is configured to use CKEditor 5, but the selected format relies on CKEditor 4.
Retested the issue and I can confirm that the encountered error during the installation of the Patternkit module on a Drupal 9 website is as expected. The error message is as follows:
Problem 1
- Root composer.json requires drupal/patternkit dev-9.1.x -> satisfiable by drupal/patternkit[dev-9.1.x].
- drupal/patternkit dev-9.1.x requires drupal/core ^10 -> found drupal/core[10.0.0-alpha1, ..., 10.2.x-dev] but the package is fixed to 9.5.11 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
This behavior aligns with the expected outcome after the Patternkit minimum versions bumped to PHP 8.1 and Drupal 10.1. The module's dependencies now require Drupal core version 10, which is not satisfied by the current locked version (9.5.11) specified in the lock file.
Retested the issue and CKEditor 4 is not longer available for Patternkit configuration
Steps to test :
Install both Ckeditor 4 and ckeditor 5
Go to patternkit JSON Editor settings.
Results : CKEditor 4 is no longer an available option (regardless whether the drupal/ckeditor module is available).
Attaching screenshots.
Retested the issue and result looks good to me on both D9 as well as on D10.
Steps to reproduce
- Navigate to /admin/config/user-interface/patternkit/json
- Observe the presence of "Use the Shadow DOM" checkbox
Results: The JSON patternkit setting form no longer displays the shadow DOM checkbox
I have retested the issue and result looks good to me on both D9 as well as on D10.
Steps to reproduce
- Navigate to /admin/config/user-interface/patternkit
- Observe the presence of the mentioned cache checkboxes
Results: The settings form no longer displays the cache setting checkboxes
slucero → credited minsharm → .
I tried to reproduce the issue and getting the same warning message
Retested the issue with this new patch → and below are the results.
Steps to retest
- Install Drupal with the standard profile
- Enable the patternkit and patternkit_example modules
- Enable query logging in your database
- Clear all caches: drush cr
- Clear the query log for clarity (truncate if using a table, or empty the contents if logging to a file)
- Load any page in the browser
- Count the number of instances of the below query in the log:
SELECT *
FROM mysql.general_log
WHERE argument LIKE 'UPDATE "cache_discovery" SET "expire"=%' AND argument LIKE '%WHERE "cid" IN (\'patternkit.library_namespaces\')%';
Before Fix : Previously, with every value update in memory, the cache was being invalidated, resulting in an excessively high number of instances being logged.
Latest Results with this new patch
The logging has been successfully reduced from approximately 250 instances to 1. This is a significant improvement. After applying the latest patch, it's observed that regardless of how many nodes are viewed,the count is consistently one in the database.
Note : Tested on both D9 as well as on D10.
Attaching Sceenshots.
Retested the issue with this Patch File → and results looks good to me.
Steps to test
1) Go to any existing Drupal site with PK module already installed.
2) Go to content -> Add content. Select Basic Page as content type.
3) Give the title of the page to include a single quote character i.e. " ' " and click save.
4) Go to Layout Tab. (Layout Builder module should already be installed)
5) Click on Add block.
6) Add Patternkit example block.
Case 1 : Configure the pattern using the [node:title] token for the "Text" as well as "Formatted text" value, Content as Node from URL.
Results :
- Valid tokens with a provided context were replaced as expected
- 1) Observe the pattern is rendered replacing the [node:title] with the content's title.
- 2) Observe the single quote is rendered correctly for both the text and formatted text field.
Case 2 : Configure the pattern using the [node:title] token for the "Text" as well as "Formatted text" field, None as Node from URL.
Results :
An invalid token was removed. Observe pattern is rendered with blank "text" as well as "formatted text" field.
When a token is discovered, it is either replaced with the corresponding value or removed if no value can be identified. With the "Node from URL" selection set to "None", here we encounter the second scenario where the token has been identified, but no value is available for it and it is removed.
Validated the confirmed and denied access to the patternkit setting page with or without new permission.
Scenario 1:
- Create a admin user role with new 'Administer Patternkit' permission.
- Navigate to /admin/config/user-interface/patternkit or /admin/config/user-interface/patternkit/json
- Confirm access.
Results : Able to access the patternkit config pages.
Scenario 2:
- Create a content editor user role which will NOT have this new 'Administer Patternkit' permission.
- Navigate to /admin/config/user-interface/patternkit or /admin/config/user-interface/patternkit/json
- Confirm access.
Results: Content authors is NOT able to access Patternkit config pages which is expected behaviour. As they may not need access to Patternkit configuration and site administrators or site builders may not want content authors to change patternkit configuration.
Note : Both the above scenarios has been validated on both D9 as well as on D10
slucero → credited minsharm → .
slucero → credited minsharm → .
I had tested this on D9 as well as on D10.
Result looks good to me.
Steps for testing
Scenario 1
Create pattern content on Nodes with overridden layouts
Enable the patternkit_usage_tracking module
Run the usage scan Drush command: drush patternkit:usage:scan
As an administrator, view the usage reports at /admin/reports/pattern-usage.
Confirm expected results in listings (see details below).
Results :
After running a scan with the Drush command and existing patternkit content, an entry for each patternkit block on each page should be listed on the admin reports page at /admin/reports/pattern-usage
Each entry displays the following:
The page title
- A link to the page
- The name of the used pattern
- A path to the pattern within the layout
- The language of the revision containing the pattern entry
- The node ID of the node layout
- The revision ID of the node revision
Also, I have validated the values for each of the entry - Name of the pattern, format of layout path with different section index value, nested pattern, revision id, node id. All the values are accurate.
Scenario 2
Edit an existing page to add or remove blocks and expect this change to be reflected in the usage report without rescanning via the drush command.
Results : Changes in the existing page reflected in the usage report without rescanning.
Scenario 3
Create a new page and set block content on the layout. Expect the new results to be reflected in the usage report without rescanning via the drush command.
Results : Creation of Patternit block on new page also reflects in the report without rescanning.
Do we have any reporting tool available for Drupal now?
slucero → credited minsharm → .
slucero → credited minsharm → .
Thanks Stephen, I have retested the issue and result looks good to me.
Steps to Retest
- Install a Drupal site and enable the Patternkit and Patternkit Example modules
- Enable layout builder and node-specific overrides on a content type
- Rebuild all caches:
drush cr
- Create a test Node and customize the layout for the page
- Create Patternkit block content on the page using any patterns
- Save the layout
- Review the discovery cache table (
cache_discovery
) in the database for the following:- Before
- All pattern definitions are contained in a serialized string within the
patternkit.patterns
entry
- All pattern definitions are contained in a serialized string within the
- After
- Pattern definitions for each pattern on the site should be contained in separate cache entries like
patternkit_pattern_definitions:patternkit
- Pattern definitions for each pattern on the site should be contained in separate cache entries like
- Before
Attaching Screenshots
minsharm → created an issue.
Retested the issue and result looks good to me. Validated below scenarios on D9 as well as on D10.
Note : Before performing below scenarios, it is important to note that there are a total of 6 Patternkit blocks created on the website.
Scenario 1: Validate Bulk Pattern Update for All Patterns
In this scenario, the goal is to validate a bulk pattern update for all existing patterns. The following steps be followed:
1) Run the following command to update existing pattern content that can be altered and register them for an update:
drush sqlq "UPDATE pattern_revision AS revision SET revision.hash='ALTERED', revision.version='OLD'"
2) After executing this command, the next step is to run a Drush update command that should find content to update during scans. Use the following command:
drush patternkit:batch-update
Results:
- The bulk of patterns was updated successfully without encountering any errors during the process.
- After the update, it was observed that no updates are available for any of the nodes. In the debugger output, "update_available" was found to be set to "false" for all the nodes.
Scenario 2: Validate Bulk Pattern Update for All Patterns, Including Temporary (Draft) Versions of Layouts
In this scenario, the objective is to validate a bulk pattern update for all patterns, including temporary (draft) versions of layouts. The steps for this scenario are as follows:
1) Create Node 1 and Node 2.
2) Run the following SQL command to update existing pattern content that can be altered and register them for an update:
drush sqlq "UPDATE pattern_revision AS revision SET revision.hash='ALTERED', revision.version='OLD'"
3) Clear the cache.
4) Before running the batch command, navigate to the layout tab for Node 2. At this point, a temporary draft version of the layout is created.
5) In the layout tab for Node 2, add a new block that will not be available for update. This is expected because it was added after the pattern alteration command.
6) Run the batch-update command and clear the cache.
Results:
- A total of 7 blocks have been updated, including one temporary layout block for Node 2. Please note that the block added in step 4 is not updated since it was added after the pattern alteration command.
Check the JSON form for the Patternkit (PK) block for both nodes.
Results for JSON Form:
- All patterns, including temporary (draft) ones, have been updated for all nodes and none of the patterns are now outdated.
- The behavior is now consistent and the temporary layout blocks are being updated to match what is displayed in the logged message in the terminal.
- I am not seeing the "You have unsaved changes" message for all the nodes after using the new batch-update command, as long as I don't change anything in the PK Block or open the Layout tab for any of the nodes before using the batch-update command. In the above scenario, the popup will be displayed solely for node 2 because I had opened the Layout tab for node 2 prior to executing the batch update command.
Now, repeat the same process again to verify that the pattern added in step 4 above should be updated:
- Run the pattern alteration command.
- Run the batch update command.
Results:
- A total of 9 blocks have been updated.
- 6 were the blocks added initially.
- 1 was the block added in step 4 above.
- 2 were the blocks on temporary layouts for Node 2, as there are a total of 2 PK blocks present on Node 2's saved layout.
Retested the issue by adding "required": ["text"] to the schema file and applying the patch introduced in issues/3381549 🐛 JSON Editor theme assets do not load on Drupal 10.1 Fixed with merge_requests/76 for the below PK blocks on D9 as well as on D10 platform.
Result looks good to me.
- PK Example
- PK Example_Filtered
- PK example_filtered_multiple
- PK example_ref
Drupal 9
- Required asterisk displays in off-canvas tray
- Required asterisk displays in new tab.
Drupal 10
- Required asterisk displays in off-canvas tray
- Required asterisk displays in new tab.
- Not getting any error that we were getting earlier at the time of PK block addition in new tab
Verified the issue on both D9 and D10 environment and result looks good to me.
Steps:
View a page with patternkit content displayed
Observe existing cache entries for data in 'cache_discovery' database table:
'patternkit.library_namespaces'
'patternkit.patterns'
Clear caches with drush: "drush cr"
Retest Results : (After Fix)
Observe patternkit entries are recreated automatically and present in 'cache_discovery' database table
Retested the issue with this Patch File on D 9.5.8 as well as on D 10.1.0 and Patternkit Editor loads successfully in the new window now.
Steps to test :
Enable Patternkit, Patternkit Example and layout builder module.
Go to content -> Add content. Select Basic Page.
Give the title of the page and click save.
Go to Layout Tab.
Click on Add block.
Right click on Patternkit example block and click on "Open link in new tab"
Before Fix : Error message displays when attempting to add a new block/pattern in a new window or tab (outside of off-canvas tray).
After Fix (With Patch File) : Patternkit Editor loads successfully in the new window now.
Attaching screenshots.
Thanks for the thorough explanation and updating the instructions Stephen !!
I tried to reproduce as well re-verify the issue. Result looks good to me now.
Steps :
- Install Patternkit, Patternkit Example, and Layout Builder modules
- Configure a Node type to display with Layout Builder and per-node layout customizations
- Create and save a new test Node
- Edit the layout for the new Node, and create a new [Patternkit] Example block with test content
- Save the layout
- Move the Patternkit Example module folder to a new location in the Drupal installation, such as modules/contrib/patternkit_example/
- Run the following Drush command to remove cached asset values.
- drush sqlq "UPDATE pattern_revision AS revision SET revision.schema=NULL, revision.template=NULL, revision.hash=NULL WHERE revision.revision IN (SELECT revision FROM pattern_revision)"
- Rebuild all caches
- Attempt to view the test page
- Observe failed rendering for affected blocks
Recreation Results (Before Fix)
Getting this error : Unable to decode the schema for pattern @my/pattern/name: Syntax error
Retest Results (After Fix)
Tested the issue with merge_requests/82 and failed block has been loaded successfully
minsharm → created an issue.
Tested the flow with an event subscriber which has been added by Stephen within the patternkit_test submodule. This event subscriber tests during the update process to alter the "text" field value of the "@patternkit/atoms/example/src/example" pattern and append " (Altered)" to the existing value.
Steps to retest -
1) Add the following line to the site's settings.local.php file:
$settings['extension_discovery_scan_tests'] = TRUE;
2) Enable the module using the below command:
drush en -y patternkit_test
3) Add "[Patternkit] Example" block and run the below query to force it to show as having an update available.
UPDATE pattern_revision
SET hash = 'ALTERED', version = 'OLD'
WHERE revision IN (
SELECT revision
FROM pattern
);
3) Now update the above existing PK block using the "@patternkit/atoms/example/src/example" pattern.
Result : Updating the pattern has triggered the event and alter the content of the "Text" field.
Screenshots attached
I have retested the issue for both the below conditions on D9 and D10 website and we are good with the results.
Condition 1-> "None" is selected for WYSIWYG editor under JSON Pattern library settings.
Result -> Texts and formatted text fields are getting saved now even if do not click anywhere else outside there.
Condition 2-> "CKEditor 5" is selected for WYSIWYG editor under JSON Pattern library settings.
Result -> Text and formatted text are getting saved even if do not click anywhere else outside there.
slucero → credited minsharm → .
Retested the issue and content is being updated now in source view mode within the sidebar layout builder as well as in the new window on both D9 and D10.
Attaching Screenshots.
Steps to Retest:
- Install a fresh drupal 9.5/10 site
- Enable Patternkit, Patternkit Example and Layout Builder modules
- Go to /admin/config/user-interface/patternkit/json
- Set Wysiwyg editor to "CKEditor 5" and Basic HTML from CKEditor toolbar.
- Create a basic page content type and add PK [Example block] from layout builder.
- Add a ordered list content with CKEditor5
Results :
Numbered and bulleted list formatting are correct and visible now within the Layout Builder sidebar as well.
Retested the changes and it is working as expected now.
Steps:
1) Install the modules: Patternkit, Patternkit Example, Layout Builder
2) Enable cache header output by enabling http.response.debug_cacheability_headers as true in core.services.yml file
3) Enable Layout Builder with page-specific overrides on a content type
4) Create and save a new page (Page 1)
5) Edit the layout for this page and place a new "[Patternkit] Example" block
6) Save the layout and view the page
7) View the cache headers for page 1
Results : Expect to see a cache miss
8) In the original window, create and save a new page (Page 2)
9) Edit the layout for this page and place a new "[Patternkit] Example" block, saving the layout
10) View the cache headers for Page 2:
Results : Expect to see a cache miss
Block Editing
11) Edit the layout for Page 1
12) Edit the example block already on the page
13) Change some field content and submit the block form (Do not save the layout yet)
Results : At this point, the changed content should be visible on the layout preview screen.
view the published version of Page 1:
Results: Expect to see the unedited block content and a cache hit for the page
14) In the original tab, save the updated block layout.
Results :
Expect to see the changed content on the published view of Page 1
Expect to see a cache miss for the page.
15) View the published view of Page 2:
Results: Expect to see a cache hit for the page
Attaching Screenshots.
Hi,
I have tested the issue with this MR changes. After pulling the changes, the original issue has been resolved. I'm now able to see the CKEditor toolbar option.
But, I have observed below issues after pulling the changes.
1) Not getting the Media library setting to configure image/video, due to this not able to add the image for PK block.
2) When we are adding the PK block from admin/structure/block layout, getting the below error
Warning: Undefined array key "rows" in Drupal\ckeditor\CKEditorPluginManager::getEnabledButtons() (line 124 of modules/contrib/ckeditor/src/CKEditorPluginManager.php).
Drupal\ckeditor\CKEditorPluginManager::getEnabledButtons(Object) (Line: 71)
Drupal\ckeditor\CKEditorPluginManager->getEnabledPluginFiles(Object, 1) (Line: 325)
Drupal\ckeditor\Plugin\Editor\CKEditor->getJSSettings(Object) (Line: 167)
Drupal\patternkit\Plugin\PatternLibrary\PatternLibraryJSON->schemaEditor('{"$schema":"http:\/\/json-schema.org\/draft-04\/schema#","title":"Example with filtered content","properties":{"text":{"title":"Text","type":"string","options":{"grid_columns":4}},"formatted_text":{"title":"Formatted Text","description":"Only links, bold\/strong, and italic\/emphasis tags are allowed (assuming CKEditor is the wysiwyg plugin). You can use any attributes on these elements (including class, style, and other attributes), except ones prefixed with \"data-\". This field's schema uses the \"disallowedContent\" rule to instruct CKEditor to strip these attributes. However, there is no server-side process that strips them. See Patternkit's README for details.","type":"string","format":"html","options":{"wysiwyg":true,"allowedContent":"a b strong em i[*](*){*}","disallowedContent":"*[data-*]"}},"hidden":{"title":"hidden","type":"string"}},"type":"object","format":"grid","category":"atom"}', Object) (Line: 116)
Hi,
I have tested the issue with this MR changes. After pulling the changes, the original issue has been resolved. I'm now able to see the CKEditor toolbar option.
But, I have observed below issues after pulling the changes.
1) Not getting the Media library setting to configure image/video, due to this not able to add the image for PK block.
2) When we are adding the PK block from admin/structure/block layout, getting the below error
Warning: Undefined array key "rows" in Drupal\ckeditor\CKEditorPluginManager::getEnabledButtons() (line 124 of modules/contrib/ckeditor/src/CKEditorPluginManager.php).
Drupal\ckeditor\CKEditorPluginManager::getEnabledButtons(Object) (Line: 71)
Drupal\ckeditor\CKEditorPluginManager->getEnabledPluginFiles(Object, 1) (Line: 325)
Drupal\ckeditor\Plugin\Editor\CKEditor->getJSSettings(Object) (Line: 167)
Drupal\patternkit\Plugin\PatternLibrary\PatternLibraryJSON->schemaEditor('{"$schema":"http:\/\/json-schema.org\/draft-04\/schema#","title":"Example with filtered content","properties":{"text":{"title":"Text","type":"string","options":{"grid_columns":4}},"formatted_text":{"title":"Formatted Text","description":"Only links, bold\/strong, and italic\/emphasis tags are allowed (assuming CKEditor is the wysiwyg plugin). You can use any attributes on these elements (including class, style, and other attributes), except ones prefixed with \"data-\". This field's schema uses the \"disallowedContent\" rule to instruct CKEditor to strip these attributes. However, there is no server-side process that strips them. See Patternkit's README for details.","type":"string","format":"html","options":{"wysiwyg":true,"allowedContent":"a b strong em i[*](*){*}","disallowedContent":"*[data-*]"}},"hidden":{"title":"hidden","type":"string"}},"type":"object","format":"grid","category":"atom"}', Object) (Line: 116)