From 4b1607df7e6f83669c40c415ba194cfb49c504d9 Mon Sep 17 00:00:00 2001 From: matdave Date: Mon, 15 Sep 2025 15:52:49 -0500 Subject: [PATCH 1/2] feat: Render view options / Automatic cache clean --- _build/data/settings.php | 4 +++ _build/events/events.versionx.php | 1 + .../elements/plugins/versionx.plugin.php | 3 ++ .../versionx/lexicon/en/default.inc.php | 6 +++- core/components/versionx/src/DeltaManager.php | 28 +++++++++++++++++-- core/components/versionx/src/Fields/Field.php | 2 +- core/components/versionx/src/Fields/Image.php | 2 +- .../versionx/src/Types/Resource.php | 5 +++- 8 files changed, 44 insertions(+), 7 deletions(-) diff --git a/_build/data/settings.php b/_build/data/settings.php index f6b3c88..ec4542a 100644 --- a/_build/data/settings.php +++ b/_build/data/settings.php @@ -53,4 +53,8 @@ 'area' => 'Enable', 'value' => true, ], + 'renderer' => [ + 'area' => 'Appearance', + 'value' => 'Inline' + ] ]; \ No newline at end of file diff --git a/_build/events/events.versionx.php b/_build/events/events.versionx.php index f7040c5..92c10d1 100644 --- a/_build/events/events.versionx.php +++ b/_build/events/events.versionx.php @@ -19,6 +19,7 @@ 'OnPluginFormPrerender', 'FredOnFredResourceSave', + 'OnSiteRefresh', ]; foreach ($e as $ev) { diff --git a/core/components/versionx/elements/plugins/versionx.plugin.php b/core/components/versionx/elements/plugins/versionx.plugin.php index 34e32ba..f7b7e9f 100644 --- a/core/components/versionx/elements/plugins/versionx.plugin.php +++ b/core/components/versionx/elements/plugins/versionx.plugin.php @@ -163,6 +163,9 @@ } } + break; + case 'OnSiteRefresh': + $versionX->deltas()->cleanup(); break; } diff --git a/core/components/versionx/lexicon/en/default.inc.php b/core/components/versionx/lexicon/en/default.inc.php index 0af7b51..dbf6026 100644 --- a/core/components/versionx/lexicon/en/default.inc.php +++ b/core/components/versionx/lexicon/en/default.inc.php @@ -61,4 +61,8 @@ // Dashboard widgets $_lang['versionx.widget.resources'] = 'Recent Resource Changes'; $_lang['versionx.widget.resources.desc'] = '[VersionX] Shows a grid with the most recent resource changes for all users.'; -$_lang['versionx.widget.resources.update'] = 'Update Resource'; \ No newline at end of file +$_lang['versionx.widget.resources.update'] = 'Update Resource'; + +// Settings +$_lang['setting_versionx.renderer'] = 'Renderer'; +$_lang['setting_versionx.renderer_desc'] = 'The renderer to use for the Diff view, options are: "Inline", "SideBySide" and "Combined".'; \ No newline at end of file diff --git a/core/components/versionx/src/DeltaManager.php b/core/components/versionx/src/DeltaManager.php index 4c88913..726db24 100644 --- a/core/components/versionx/src/DeltaManager.php +++ b/core/components/versionx/src/DeltaManager.php @@ -43,17 +43,30 @@ function __construct(VersionX $versionX) * @param string $value * @return string */ - public static function calculateDiff(string $prevValue, string $value): string + public static function calculateDiff(string $prevValue, string $value, array $options = []): string { + $renderer = self::getRenderer($options); return DiffHelper::calculate( $prevValue, $value, - 'Inline', + $renderer, self::$diffOptions, self::$rendererOptions, ); } + private static function getRenderer(array $options): string + { + $valid = [ + 'Inline', 'Combined', 'SideBySide', // HTML + ]; + $renderer = $options['renderer'] ?? 'Inline'; + if (!in_array($renderer, $valid)) { + return 'Inline'; + } + return $renderer; + } + /** * @param int $objectId * @param Type $type @@ -84,6 +97,9 @@ public function createDelta(int $id, Type $type, bool $isSnapshot = false): ?\vx // Get current principal object $object = $this->modx->getObject($type->getClass(), ['id' => $id]); + $options = [ + 'renderer' => $this->modx->getOption('versionx.renderer', null, 'Inline'), + ]; if (!$type->beforeDeltaCreate($now, $object)) { return null; @@ -141,7 +157,7 @@ public function createDelta(int $id, Type $type, bool $isSnapshot = false): ?\vx } try { - $renderedDiff = $fieldTypeObj->render($prevValue, $value); + $renderedDiff = $fieldTypeObj->render($prevValue, $value, $options); } catch (\Error $e) { $this->modx->log(\modX::LOG_LEVEL_ERROR, '[VersionX] Fatal Error calculating diff: ' @@ -455,4 +471,10 @@ public function removeMilestone(int $deltaId): bool return false; } + + public function cleanup(): void + { + $this->modx->log(\xPDO::LOG_LEVEL_INFO, '[VersionX] Cleaning up cache...'); + $this->modx->cacheManager->clean(VersionX::CACHE_OPT); + } } \ No newline at end of file diff --git a/core/components/versionx/src/Fields/Field.php b/core/components/versionx/src/Fields/Field.php index ca0da4f..a0fc12a 100644 --- a/core/components/versionx/src/Fields/Field.php +++ b/core/components/versionx/src/Fields/Field.php @@ -66,6 +66,6 @@ public function getTpl(): string public function render(string $prevValue, string $newValue, array $options = []): string { - return DeltaManager::calculateDiff($prevValue, $newValue); + return DeltaManager::calculateDiff($prevValue, $newValue, $options); } } \ No newline at end of file diff --git a/core/components/versionx/src/Fields/Image.php b/core/components/versionx/src/Fields/Image.php index 1ec17c2..ab8da14 100644 --- a/core/components/versionx/src/Fields/Image.php +++ b/core/components/versionx/src/Fields/Image.php @@ -13,7 +13,7 @@ protected function parse() public function render(string $prevValue, string $newValue, array $options = []): string { - $diff = DeltaManager::calculateDiff($prevValue, $newValue); + $diff = DeltaManager::calculateDiff($prevValue, $newValue, $options); // todo: render before and after images into diff (process with media source) - templates/mgr/fields/image.tpl return $diff; } diff --git a/core/components/versionx/src/Types/Resource.php b/core/components/versionx/src/Types/Resource.php index f2b15cb..856207c 100644 --- a/core/components/versionx/src/Types/Resource.php +++ b/core/components/versionx/src/Types/Resource.php @@ -59,6 +59,9 @@ public function includeFieldsOnCreate(array $fields, array $prevFields, \xPDOObj // Grab the most recent TV value fields $prevFields = $this->versionX->deltas()->getClosestDeltaFields($this, $object, $tvNames); + $options = [ + 'renderer' => $this->modx->getOption('versionx.renderer', null, 'Inline'), + ]; // Loop through TVs matching previous delta fields by TV name /* @var \MODX\Revolution\modTemplateVar|\modTemplateVar $tv */ foreach ($tvs as $tv) { @@ -95,7 +98,7 @@ public function includeFieldsOnCreate(array $fields, array $prevFields, \xPDOObj 'field_type' => get_class($fieldObj), 'before' => $prevValue, 'after' => $tvValue, - 'diff' => $fieldObj->render($prevValue, $fieldObj->getValue()), + 'diff' => $fieldObj->render($prevValue, $fieldObj->getValue(), $options), ]); $fields[] = $field; From 1b806fb2ca04bc5a46c6699beeeba025503e462d Mon Sep 17 00:00:00 2001 From: matdave Date: Mon, 15 Sep 2025 16:09:40 -0500 Subject: [PATCH 2/2] feat: Set render view options on GetList processor --- .../versionx/processors/mgr/deltas/getlist.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/components/versionx/processors/mgr/deltas/getlist.class.php b/core/components/versionx/processors/mgr/deltas/getlist.class.php index 5bc4790..e97da93 100644 --- a/core/components/versionx/processors/mgr/deltas/getlist.class.php +++ b/core/components/versionx/processors/mgr/deltas/getlist.class.php @@ -132,6 +132,9 @@ public function prepareRow(xPDOObject $object): array return []; } + $options = [ + 'renderer' => $this->modx->getOption('versionx.renderer', null, 'Inline'), + ]; $row['diffs'] = ''; foreach($fields as $field) { // Attempt to get diff from cache @@ -146,7 +149,7 @@ public function prepareRow(xPDOObject $object): array // Otherwise calculate diff $fieldType = $this->type->getFieldClass($field->get('field')); $fieldTypeObj = new $fieldType($field->get('after')); - $renderedDiff = $fieldTypeObj->render($field->get('before'), $field->get('after')); + $renderedDiff = $fieldTypeObj->render($field->get('before'), $field->get('after'), $options); // Save in cache if ($renderedDiff) {