Ignore fields with false value in DiffViewer (#4712)

* Convert false to undefined

* Remove comments

* Make it consistent

* Formatting

* Apply at downstream
This commit is contained in:
pyranota
2024-11-15 19:24:57 +01:00
committed by GitHub
parent 8734df138c
commit e3d10def5f
6 changed files with 97 additions and 42 deletions
@@ -8,6 +8,7 @@
cleanValueProperties,
orderedJsonStringify,
orderedYamlStringify,
replaceFalseWithUndefined,
type Value
} from '$lib/utils'
import type { Script } from '$lib/gen'
@@ -54,8 +55,9 @@
diffViewer.closeDrawer()
}
function prepareDiff(data: Value) {
const metadata = structuredClone(cleanValueProperties(data))
const metadata = structuredClone(cleanValueProperties(replaceFalseWithUndefined(data)))
const content = metadata['content']
if (metadata['content'] !== undefined) {
metadata['content'] = 'check content diff'
+17 -13
View File
@@ -25,6 +25,7 @@
encodeState,
formatCron,
orderedJsonStringify,
replaceFalseWithUndefined,
sleep,
type Value
} from '$lib/utils'
@@ -294,12 +295,21 @@
// We need it for diff
await syncWithDeployed()
// Handle through confirmation modal
confirmCallback = async () => {
if (
deployedValue &&
$flowStore &&
orderedJsonStringify(deployedValue) ===
orderedJsonStringify(replaceFalseWithUndefined({ ...$flowStore, path: $pathStore }))
) {
await saveFlow(deploymentMsg)
} else {
// Handle through confirmation modal
confirmCallback = async () => {
await saveFlow(deploymentMsg)
}
// Open confirmation modal
open = true
}
// Open confirmation modal
open = true
}
}
async function syncWithDeployed() {
@@ -308,18 +318,12 @@
path: initialPath,
withStarredInfo: true
})
deployedValue = {
deployedValue = replaceFalseWithUndefined({
...flow,
starred: undefined,
id: undefined,
edited_at: undefined,
edited_by: undefined,
workspace_id: undefined,
archived: undefined,
same_worker: undefined,
visible_to_runner_only: undefined,
ws_error_handler_muted: undefined
}
workspace_id: undefined
})
deployedBy = flow.edited_by
}
@@ -18,6 +18,7 @@
encodeState,
formatCron,
orderedJsonStringify,
replaceFalseWithUndefined,
type Value
} from '$lib/utils'
import Path from './Path.svelte'
@@ -278,17 +279,28 @@
// Fetch entire script, since we need it to show Diff
await syncWithDeployed()
// Handle through confirmation modal
confirmCallback = async () => {
open = false
if (actual_parent_hash) {
await editScript(stay, actual_parent_hash, deployMsg)
} else {
sendUserToast('Could not fetch latest version of the script', true)
if (
deployedValue &&
script &&
orderedJsonStringify({ ...deployedValue, hash: undefined }) ===
orderedJsonStringify(
replaceFalseWithUndefined({ ...script, hash: undefined, parent_hash: undefined })
)
) {
await editScript(stay, actual_parent_hash, deployMsg)
} else {
// Handle through confirmation modal
confirmCallback = async () => {
open = false
if (actual_parent_hash) {
await editScript(stay, actual_parent_hash, deployMsg)
} else {
sendUserToast('Could not fetch latest version of the script', true)
}
}
// Open confirmation modal
open = true
}
// Open confirmation modal
open = true
}
}
@@ -299,20 +311,16 @@
withStarredInfo: true
})
deployedValue = {
deployedValue = replaceFalseWithUndefined({
...latestScript,
starred: undefined,
workspace_id: undefined,
archived: undefined,
created_at: undefined,
created_by: undefined,
deleted: undefined,
extra_perms: undefined,
is_template: undefined,
lock: undefined,
lock_error_logs: undefined,
parent_hashes: undefined
}
})
deployedBy = latestScript.created_by
}
@@ -691,8 +699,11 @@
</Label>
<Label label="Path">
<svelte:fragment slot="header">
<Tooltip documentationLink="https://www.windmill.dev/docs/core_concepts/roles_and_permissions#path">
The unique identifier of the script in the workspace that defines permissions
<Tooltip
documentationLink="https://www.windmill.dev/docs/core_concepts/roles_and_permissions#path"
>
The unique identifier of the script in the workspace that defines
permissions
</Tooltip>
</svelte:fragment>
<Path
@@ -41,7 +41,8 @@
copyToClipboard,
truncateRev,
orderedJsonStringify,
type Value
type Value,
replaceFalseWithUndefined
} from '../../../utils'
import type {
AppInput,
@@ -422,13 +423,27 @@
// We need it to show diff
// Handle through confirmation modal
await syncWithDeployed()
confirmCallback = async () => {
open = false
if (
deployedValue &&
savedApp &&
$app &&
orderedJsonStringify(deployedValue) ===
orderedJsonStringify(replaceFalseWithUndefined({
summary: $summary,
value: $app,
path: newPath || savedApp.draft?.path || savedApp.path,
policy
}))
) {
await updateApp(npath)
} else {
confirmCallback = async () => {
open = false
await updateApp(npath)
}
// Open confirmation modal
open = true
}
// Open confirmation modal
open = true
}
}
@@ -442,15 +457,14 @@
deployedBy = deployedApp.created_by
// Strip off extra information
deployedValue = {
deployedValue = replaceFalseWithUndefined({
...deployedApp,
starred: undefined,
id: undefined,
created_at: undefined,
created_by: undefined,
versions: undefined,
extra_perms: undefined //
}
extra_perms: undefined
})
}
async function updateApp(npath: string) {
+24
View File
@@ -799,6 +799,30 @@ export type Value = {
[key: string]: any
}
export function replaceFalseWithUndefined(obj: any) {
return replaceFalseWithUndefinedRec(structuredClone(obj))
}
function replaceFalseWithUndefinedRec(obj: any) {
// Check if the input is an object and not null
if (obj !== null && typeof obj === 'object') {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
// If the value is false, replace it with undefined
if (obj[key] === false) {
// delete obj[key];
obj[key] = undefined;
} else {
// If the value is an object, call the function recursively
replaceFalseWithUndefinedRec(obj[key]);
}
}
}
}
return obj
}
export function cleanValueProperties(obj: Value) {
if (typeof obj !== 'object') {
return obj
@@ -129,7 +129,7 @@
...structuredClone(flowWithDraft.draft),
path: flowWithDraft.draft.path ?? flowWithDraft.path // backward compatibility for old drafts missing path
}
: undefined
: undefined
} as Flow & {
draft?: Flow
}