windmill-components 1.511.1 → 1.522.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/components/AppConnectInner.svelte.d.ts +1 -1
- package/package/components/ArgInput.svelte +42 -14
- package/package/components/ArgInput.svelte.d.ts +2 -10
- package/package/components/AssignableTagsInner.svelte +5 -0
- package/package/components/AuthSettings.svelte +4 -2
- package/package/components/AuthSettings.svelte.d.ts +1 -0
- package/package/components/DBManagerDrawer.svelte +154 -151
- package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
- package/package/components/DBTable.svelte +3 -3
- package/package/components/DBTable.svelte.d.ts +1 -0
- package/package/components/DBTableEditor.svelte +7 -7
- package/package/components/DBTableEditor.svelte.d.ts +1 -1
- package/package/components/DeployWorkspace.svelte +1 -1
- package/package/components/DisplayResult.svelte +34 -8
- package/package/components/DisplayResult.svelte.d.ts +4 -1
- package/package/components/DynSelect.svelte +58 -34
- package/package/components/DynSelect.svelte.d.ts +3 -11
- package/package/components/EditableSchemaForm.svelte +126 -6
- package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
- package/package/components/Editor.svelte +1 -1
- package/package/components/EditorBar.svelte +82 -4
- package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
- package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
- package/package/components/ExploreAssetButton.svelte +14 -4
- package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
- package/package/components/FlowJobResult.svelte +3 -3
- package/package/components/FlowJobResult.svelte.d.ts +1 -0
- package/package/components/FlowPreviewContent.svelte +9 -1
- package/package/components/FlowPreviewResult.svelte +4 -1
- package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
- package/package/components/FlowStatusViewerInner.svelte +21 -3
- package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -1
- package/package/components/FolderEditor.svelte +1 -1
- package/package/components/GitDiffPreview.svelte +14 -18
- package/package/components/GitDiffPreview.svelte.d.ts +2 -8
- package/package/components/GitHubAppIntegration.svelte +3 -1
- package/package/components/IdEditorInput.svelte +25 -22
- package/package/components/IdEditorInput.svelte.d.ts +11 -23
- package/package/components/InstanceSetting.svelte +7 -2
- package/package/components/InstanceSettings.svelte +1 -0
- package/package/components/JobLoader.svelte +48 -5
- package/package/components/JobLoader.svelte.d.ts +7 -2
- package/package/components/Login.svelte +8 -2
- package/package/components/MemoryFootprintViewer.svelte +1 -1
- package/package/components/ModulePreviewResultViewer.svelte +2 -2
- package/package/components/MoveDrawer.svelte.d.ts +2 -2
- package/package/components/NextcloudSetting.svelte +84 -0
- package/package/components/NextcloudSetting.svelte.d.ts +7 -0
- package/package/components/ObjectResourceInput.svelte +3 -2
- package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/ParqetCsvTableRenderer.svelte +1 -1
- package/package/components/ResourceEditor.svelte +1 -1
- package/package/components/ResourcePicker.svelte +8 -1
- package/package/components/ResourcePicker.svelte.d.ts +1 -0
- package/package/components/ResultStreamDisplay.svelte +5 -0
- package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
- package/package/components/RunForm.svelte +9 -1
- package/package/components/SchemaForm.svelte +2 -2
- package/package/components/SchemaForm.svelte.d.ts +2 -10
- package/package/components/ScriptBuilder.svelte +13 -8
- package/package/components/ScriptBuilder.svelte.d.ts +1 -1
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ScriptWrapper.svelte +1 -1
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/SimpleAgTable.svelte +2 -0
- package/package/components/SimpleAgTable.svelte.d.ts +2 -0
- package/package/components/SqlRepl.svelte +21 -7
- package/package/components/SqlRepl.svelte.d.ts +2 -2
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/WorkerTagSelect.svelte +70 -1
- package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
- package/package/components/apps/components/display/AppText.svelte +2 -2
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
- package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
- package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
- package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
- package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
- package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
- package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
- package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
- package/package/components/apps/components/display/dbtable/utils.js +52 -28
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
- package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/utils.js +7 -4
- package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
- package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
- package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
- package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
- package/package/components/apps/components/layout/AppStepper.svelte +1 -1
- package/package/components/apps/components/layout/AppTabs.svelte +1 -1
- package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
- package/package/components/apps/editor/GridViewer.svelte +1 -0
- package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
- package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
- package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
- package/package/components/assets/AssetsDropdownButton.svelte +1 -1
- package/package/components/assets/JobAssetsViewer.svelte +2 -2
- package/package/components/assets/lib.js +4 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
- package/package/components/common/button/Button.svelte +4 -3
- package/package/components/common/button/Button.svelte.d.ts +1 -0
- package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
- package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
- package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
- package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
- package/package/components/common/modal/Modal.svelte +2 -5
- package/package/components/common/tabs/TabsV2.svelte +2 -1
- package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
- package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
- package/package/components/copilot/chat/script/core.js +28 -29
- package/package/components/copilot/chat/shared.d.ts +1 -1
- package/package/components/copilot/chat/shared.js +8 -2
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/dbOps.d.ts +20 -8
- package/package/components/dbOps.js +85 -40
- package/package/components/details/DetailPageHeader.svelte +0 -2
- package/package/components/flows/content/FlowInput.svelte +5 -0
- package/package/components/flows/content/FlowModuleScript.svelte +0 -1
- package/package/components/flows/idUtils.js +2 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
- package/package/components/flows/map/InsertModuleButton.svelte +4 -1
- package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
- package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
- package/package/components/flows/propPicker/StepHistory.svelte +4 -1
- package/package/components/git_sync/DetectionFlow.svelte +202 -0
- package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
- package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
- package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
- package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
- package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
- package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
- package/package/components/git_sync/GitSyncSection.svelte +89 -0
- package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
- package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
- package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
- package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
- package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
- package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
- package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
- package/package/components/graph/FlowGraphV2.svelte +5 -1
- package/package/components/graph/graphBuilder.svelte.js +1 -1
- package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
- package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
- package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
- package/package/components/icons/AssetGenericIcon.svelte +3 -0
- package/package/components/icons/DucklakeIcon.svelte +18 -0
- package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
- package/package/components/instanceSettings.js +11 -3
- package/package/components/runs/JobPreview.svelte +2 -2
- package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +3 -2
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
- package/package/components/schema/PropertyEditor.svelte +0 -2
- package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
- package/package/components/schema/SchemaFormDND.svelte +2 -1
- package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
- package/package/components/scriptEditor/LogPanel.svelte +5 -3
- package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
- package/package/components/select/Select.svelte +7 -4
- package/package/components/select/Select.svelte.d.ts +5 -0
- package/package/components/select/SelectDropdown.svelte +2 -1
- package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
- package/package/components/sidebar/changelogs.js +5 -0
- package/package/components/table/AutoDataTable.svelte +6 -4
- package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
- package/package/components/table/DataTable.svelte +12 -10
- package/package/components/table/DataTable.svelte.d.ts +1 -0
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
- package/package/components/triggers/gcp/utils.js +1 -0
- package/package/components/triggers/http/utils.js +1 -1
- package/package/components/triggers/kafka/utils.js +1 -1
- package/package/components/triggers/mqtt/utils.js +1 -1
- package/package/components/triggers/nats/utils.js +1 -1
- package/package/components/triggers/postgres/utils.js +1 -1
- package/package/components/triggers/sqs/utils.js +1 -1
- package/package/components/triggers/utils.js +2 -1
- package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
- package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
- package/package/components/triggers/websocket/utils.js +1 -1
- package/package/components/workspaceSettings/AISettings.svelte +52 -36
- package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
- package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
- package/package/consts.js +2 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +7 -6
- package/package/gen/schemas.gen.js +7 -6
- package/package/gen/services.gen.d.ts +19 -1
- package/package/gen/services.gen.js +38 -0
- package/package/gen/types.gen.d.ts +78 -3
- package/package/git-sync.d.ts +36 -0
- package/package/git-sync.js +1 -0
- package/package/hub.d.ts +1 -0
- package/package/hubPaths.json +5 -2
- package/package/infer.js +3 -2
- package/package/script_helpers.d.ts +2 -2
- package/package/script_helpers.js +29 -11
- package/package/services/JobManager.d.ts +28 -0
- package/package/services/JobManager.js +114 -0
- package/package/stores.d.ts +1 -1
- package/package/utils.d.ts +18 -1
- package/package/utils.js +55 -2
- package/package.json +5 -4
- package/package/components/InitGitRepoPopover.svelte +0 -410
- package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
- package/package/components/PullGitRepoPopover.svelte +0 -355
- package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
- package/package/inferArgSig.d.ts +0 -42
- package/package/inferArgSig.js +0 -198
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { GitRepositorySettings as BackendGitRepositorySettings, GitSyncObjectType } from '../../gen';
|
|
2
|
+
import type { SettingsObject } from '../../git-sync';
|
|
3
|
+
export type GitSyncRepository = BackendGitRepositorySettings & {
|
|
4
|
+
settings: SettingsObject;
|
|
5
|
+
exclude_types_override: GitSyncObjectType[];
|
|
6
|
+
legacyImported?: boolean;
|
|
7
|
+
isUnsavedConnection?: boolean;
|
|
8
|
+
collapsed?: boolean;
|
|
9
|
+
detectionState?: 'idle' | 'loading' | 'no-wmill' | 'has-wmill' | 'error';
|
|
10
|
+
extractedSettings?: SettingsObject;
|
|
11
|
+
detectionError?: string;
|
|
12
|
+
detectionJobId?: string;
|
|
13
|
+
detectionJobStatus?: 'running' | 'success' | 'failure';
|
|
14
|
+
_trackedPath?: string;
|
|
15
|
+
};
|
|
16
|
+
export type GitSyncTestJob = {
|
|
17
|
+
jobId: string;
|
|
18
|
+
status: 'running' | 'success' | 'failure' | undefined;
|
|
19
|
+
};
|
|
20
|
+
export type GitSyncSettings = {
|
|
21
|
+
repositories: GitSyncRepository[];
|
|
22
|
+
};
|
|
23
|
+
export type ModalState = {
|
|
24
|
+
push: {
|
|
25
|
+
idx: number;
|
|
26
|
+
repo: GitSyncRepository;
|
|
27
|
+
open: boolean;
|
|
28
|
+
} | null;
|
|
29
|
+
pull: {
|
|
30
|
+
idx: number;
|
|
31
|
+
repo: GitSyncRepository;
|
|
32
|
+
open: boolean;
|
|
33
|
+
settingsOnly?: boolean;
|
|
34
|
+
} | null;
|
|
35
|
+
success: {
|
|
36
|
+
open: boolean;
|
|
37
|
+
savedWithoutInit?: boolean;
|
|
38
|
+
} | null;
|
|
39
|
+
};
|
|
40
|
+
export type ValidationState = {
|
|
41
|
+
isValid: boolean;
|
|
42
|
+
isDuplicate: boolean;
|
|
43
|
+
hasChanges: boolean;
|
|
44
|
+
};
|
|
45
|
+
export declare function createGitSyncContext(workspace: string): {
|
|
46
|
+
readonly repositories: GitSyncRepository[];
|
|
47
|
+
readonly loading: boolean;
|
|
48
|
+
readonly activeModals: ModalState;
|
|
49
|
+
readonly gitSyncTestJobs: GitSyncTestJob[];
|
|
50
|
+
readonly initialRepositories: GitSyncRepository[];
|
|
51
|
+
readonly legacyWorkspaceIncludePath: string[];
|
|
52
|
+
readonly legacyWorkspaceIncludeType: GitSyncObjectType[];
|
|
53
|
+
readonly validationStates: {
|
|
54
|
+
isValid: boolean;
|
|
55
|
+
isDuplicate: boolean;
|
|
56
|
+
hasChanges: boolean;
|
|
57
|
+
}[];
|
|
58
|
+
readonly hasAnyChanges: boolean;
|
|
59
|
+
readonly allRepositoriesValid: boolean;
|
|
60
|
+
readonly hasUnsavedConnections: boolean;
|
|
61
|
+
readonly hasWorkspaceLevelSettings: boolean;
|
|
62
|
+
addRepository: () => void;
|
|
63
|
+
removeRepository: (idx: number) => Promise<void>;
|
|
64
|
+
getRepository: (idx: number) => GitSyncRepository;
|
|
65
|
+
getValidation: (idx: number) => ValidationState;
|
|
66
|
+
revertRepository: (idx: number) => void;
|
|
67
|
+
runTestJob: (idx: number) => Promise<void>;
|
|
68
|
+
resetDetectionState: (idx: number) => void;
|
|
69
|
+
detectRepository: (idx: number) => Promise<void>;
|
|
70
|
+
migrateLegacyRepository: (repo: GitSyncRepository) => GitSyncRepository;
|
|
71
|
+
showPushModal: (idx: number) => void;
|
|
72
|
+
showPullModal: (idx: number, settingsOnly?: boolean) => void;
|
|
73
|
+
closePushModal: () => void;
|
|
74
|
+
closePullModal: () => void;
|
|
75
|
+
showSuccessModal: (savedWithoutInit?: boolean) => void;
|
|
76
|
+
closeSuccessModal: () => void;
|
|
77
|
+
loadSettings: () => Promise<void>;
|
|
78
|
+
saveRepository: (idx: number, savedWithoutInit?: boolean) => Promise<void>;
|
|
79
|
+
};
|
|
80
|
+
export type GitSyncContextType = ReturnType<typeof createGitSyncContext>;
|
|
81
|
+
export declare function setGitSyncContext(workspace: string): GitSyncContextType;
|
|
82
|
+
export declare function getGitSyncContext(): GitSyncContextType;
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
import { JobService, WorkspaceService } from '../../gen';
|
|
3
|
+
import { jobManager } from '../../services/JobManager';
|
|
4
|
+
import hubPaths from '../../hubPaths.json';
|
|
5
|
+
const GIT_SYNC_CONTEXT_KEY = Symbol('git-sync-context');
|
|
6
|
+
// Context implementation
|
|
7
|
+
export function createGitSyncContext(workspace) {
|
|
8
|
+
const repositories = $state([]);
|
|
9
|
+
const initialRepositories = $state([]);
|
|
10
|
+
const gitSyncTestJobs = $state([]);
|
|
11
|
+
let loading = $state(false);
|
|
12
|
+
const activeModals = $state({ push: null, pull: null, success: null });
|
|
13
|
+
// Legacy workspace-level settings state
|
|
14
|
+
const legacyWorkspaceIncludePath = $state([]);
|
|
15
|
+
const legacyWorkspaceIncludeType = $state([]);
|
|
16
|
+
// Derived state for legacy detection
|
|
17
|
+
const hasWorkspaceLevelSettings = $derived(legacyWorkspaceIncludePath.length > 0 || legacyWorkspaceIncludeType.length > 0);
|
|
18
|
+
// Watch for changes to git repository paths and reset detection state
|
|
19
|
+
$effect(() => {
|
|
20
|
+
repositories.forEach((repo) => {
|
|
21
|
+
if (repo.isUnsavedConnection) {
|
|
22
|
+
const currentPath = repo.git_repo_resource_path;
|
|
23
|
+
if (repo._trackedPath && repo._trackedPath !== currentPath && repo.detectionState && repo.detectionState !== 'idle') {
|
|
24
|
+
_resetRepoDetectionState(repo);
|
|
25
|
+
}
|
|
26
|
+
repo._trackedPath = currentPath;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
const getValidationStates = () => {
|
|
31
|
+
return repositories.map((repo, idx) => ({
|
|
32
|
+
isValid: validateRepository(repo, idx),
|
|
33
|
+
isDuplicate: checkDuplicate(repo, idx),
|
|
34
|
+
hasChanges: checkChanges(repo, idx)
|
|
35
|
+
}));
|
|
36
|
+
};
|
|
37
|
+
const getHasAnyChanges = () => {
|
|
38
|
+
const validationStates = getValidationStates();
|
|
39
|
+
// Check if any individual repositories have changes
|
|
40
|
+
const individualChanges = validationStates.some(v => v.hasChanges);
|
|
41
|
+
// Check if any legacy repos were imported
|
|
42
|
+
const anyLegacyImported = repositories.some(r => r.legacyImported);
|
|
43
|
+
// Check if the set of repositories has changed (added/removed repos)
|
|
44
|
+
const repositorySetChanged = (() => {
|
|
45
|
+
if (loading) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (!initialRepositories || initialRepositories.length === 0) {
|
|
49
|
+
return repositories.filter((_, i) => validationStates[i]?.isValid).length > 0;
|
|
50
|
+
}
|
|
51
|
+
const initialValidPaths = new Set(initialRepositories
|
|
52
|
+
.filter(r => r.git_repo_resource_path && r.git_repo_resource_path.trim() !== '')
|
|
53
|
+
.map(r => r.git_repo_resource_path));
|
|
54
|
+
const currentValidPaths = new Set(repositories
|
|
55
|
+
.filter((_, i) => validationStates[i]?.isValid)
|
|
56
|
+
.map(r => r.git_repo_resource_path));
|
|
57
|
+
// Check if sets are different (repos added or removed)
|
|
58
|
+
return initialValidPaths.size !== currentValidPaths.size ||
|
|
59
|
+
[...initialValidPaths].some(path => !currentValidPaths.has(path)) ||
|
|
60
|
+
[...currentValidPaths].some(path => !initialValidPaths.has(path));
|
|
61
|
+
})();
|
|
62
|
+
return individualChanges || anyLegacyImported || repositorySetChanged;
|
|
63
|
+
};
|
|
64
|
+
const getAllRepositoriesValid = () => getValidationStates().every(v => v.isValid);
|
|
65
|
+
const getHasUnsavedConnections = () => repositories.some(repo => repo.isUnsavedConnection);
|
|
66
|
+
function validateRepository(repo, idx) {
|
|
67
|
+
if (!repo.git_repo_resource_path)
|
|
68
|
+
return false;
|
|
69
|
+
return !checkDuplicate(repo, idx);
|
|
70
|
+
}
|
|
71
|
+
function checkDuplicate(repo, idx) {
|
|
72
|
+
if (!repo.git_repo_resource_path)
|
|
73
|
+
return false;
|
|
74
|
+
const firstIdx = repositories.findIndex(r => r.git_repo_resource_path === repo.git_repo_resource_path);
|
|
75
|
+
return firstIdx !== -1 && firstIdx < idx;
|
|
76
|
+
}
|
|
77
|
+
function checkChanges(repo, idx) {
|
|
78
|
+
const initial = initialRepositories[idx];
|
|
79
|
+
if (!initial)
|
|
80
|
+
return true;
|
|
81
|
+
// Legacy repositories always have "changes" because they need migration
|
|
82
|
+
if (repo.legacyImported)
|
|
83
|
+
return true;
|
|
84
|
+
return JSON.stringify(serializeRepository(repo)) !== JSON.stringify(serializeRepository(initial));
|
|
85
|
+
}
|
|
86
|
+
function serializeRepository(repo) {
|
|
87
|
+
return {
|
|
88
|
+
git_repo_resource_path: repo.git_repo_resource_path,
|
|
89
|
+
script_path: repo.script_path,
|
|
90
|
+
use_individual_branch: repo.use_individual_branch,
|
|
91
|
+
group_by_folder: repo.group_by_folder,
|
|
92
|
+
settings: repo.settings,
|
|
93
|
+
exclude_types_override: repo.exclude_types_override
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function addRepository() {
|
|
97
|
+
repositories.push({
|
|
98
|
+
git_repo_resource_path: '',
|
|
99
|
+
script_path: hubPaths.gitSync,
|
|
100
|
+
use_individual_branch: false,
|
|
101
|
+
group_by_folder: false,
|
|
102
|
+
settings: {
|
|
103
|
+
include_path: ['f/**'],
|
|
104
|
+
exclude_path: [],
|
|
105
|
+
extra_include_path: [],
|
|
106
|
+
include_type: ['script', 'flow', 'app', 'folder']
|
|
107
|
+
},
|
|
108
|
+
exclude_types_override: [],
|
|
109
|
+
legacyImported: false,
|
|
110
|
+
isUnsavedConnection: true,
|
|
111
|
+
collapsed: false
|
|
112
|
+
});
|
|
113
|
+
gitSyncTestJobs.push({
|
|
114
|
+
jobId: '',
|
|
115
|
+
status: undefined
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function removeRepository(idx) {
|
|
119
|
+
const repo = repositories[idx];
|
|
120
|
+
if (!repo)
|
|
121
|
+
return;
|
|
122
|
+
// Check if this repository exists in the initial (saved) state
|
|
123
|
+
const existsInInitialState = initialRepositories.some(initialRepo => initialRepo.git_repo_resource_path === repo.git_repo_resource_path);
|
|
124
|
+
// Only call backend API if repository exists in the saved state
|
|
125
|
+
if (existsInInitialState) {
|
|
126
|
+
await WorkspaceService.deleteGitSyncRepository({
|
|
127
|
+
workspace,
|
|
128
|
+
requestBody: {
|
|
129
|
+
git_repo_resource_path: `$res:${repo.git_repo_resource_path}`
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Update initial state to remove the deleted repository
|
|
133
|
+
const initialIdx = initialRepositories.findIndex(initialRepo => initialRepo.git_repo_resource_path === repo.git_repo_resource_path);
|
|
134
|
+
if (initialIdx !== -1) {
|
|
135
|
+
initialRepositories.splice(initialIdx, 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Remove from local state
|
|
139
|
+
repositories.splice(idx, 1);
|
|
140
|
+
gitSyncTestJobs.splice(idx, 1);
|
|
141
|
+
}
|
|
142
|
+
function getRepository(idx) {
|
|
143
|
+
return repositories[idx];
|
|
144
|
+
}
|
|
145
|
+
function showPushModal(idx) {
|
|
146
|
+
const repo = repositories[idx];
|
|
147
|
+
if (repo) {
|
|
148
|
+
activeModals.push = { idx, repo, open: true };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function showPullModal(idx, settingsOnly = false) {
|
|
152
|
+
const repo = repositories[idx];
|
|
153
|
+
if (repo) {
|
|
154
|
+
activeModals.pull = { idx, repo, open: true, settingsOnly };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function closeModal(type) {
|
|
158
|
+
if (activeModals[type]) {
|
|
159
|
+
activeModals[type].open = false;
|
|
160
|
+
}
|
|
161
|
+
setTimeout(() => {
|
|
162
|
+
activeModals[type] = null;
|
|
163
|
+
}, 200);
|
|
164
|
+
}
|
|
165
|
+
function closePushModal() {
|
|
166
|
+
closeModal('push');
|
|
167
|
+
}
|
|
168
|
+
function closePullModal() {
|
|
169
|
+
closeModal('pull');
|
|
170
|
+
}
|
|
171
|
+
function showSuccessModal(savedWithoutInit) {
|
|
172
|
+
activeModals.success = { open: true, savedWithoutInit };
|
|
173
|
+
}
|
|
174
|
+
function closeSuccessModal() {
|
|
175
|
+
closeModal('success');
|
|
176
|
+
}
|
|
177
|
+
function getValidation(idx) {
|
|
178
|
+
const states = getValidationStates();
|
|
179
|
+
return states[idx] || { isValid: false, isDuplicate: false, hasChanges: false };
|
|
180
|
+
}
|
|
181
|
+
async function detectRepository(idx) {
|
|
182
|
+
const repo = repositories[idx];
|
|
183
|
+
if (!repo || !repo.git_repo_resource_path) {
|
|
184
|
+
throw new Error('Repository not found or no resource path');
|
|
185
|
+
}
|
|
186
|
+
repo.detectionState = 'loading';
|
|
187
|
+
repo.detectionError = undefined;
|
|
188
|
+
repo.detectionJobId = undefined;
|
|
189
|
+
repo.detectionJobStatus = undefined;
|
|
190
|
+
try {
|
|
191
|
+
const jobId = await JobService.runScriptByPath({
|
|
192
|
+
workspace,
|
|
193
|
+
path: hubPaths.gitInitRepo,
|
|
194
|
+
requestBody: {
|
|
195
|
+
workspace_id: workspace,
|
|
196
|
+
repo_url_resource_path: repo.git_repo_resource_path,
|
|
197
|
+
dry_run: true,
|
|
198
|
+
pull: false,
|
|
199
|
+
only_wmill_yaml: true,
|
|
200
|
+
settings_json: JSON.stringify(repo.settings),
|
|
201
|
+
use_promotion_overrides: repo.use_individual_branch
|
|
202
|
+
},
|
|
203
|
+
skipPreprocessor: true
|
|
204
|
+
});
|
|
205
|
+
repo.detectionJobId = jobId;
|
|
206
|
+
repo.detectionJobStatus = 'running';
|
|
207
|
+
// Use JobManager for polling - result will be the actual job response
|
|
208
|
+
await jobManager.runWithProgress(() => Promise.resolve(jobId), {
|
|
209
|
+
workspace,
|
|
210
|
+
timeout: 30000,
|
|
211
|
+
timeoutMessage: 'Detection job timed out after 30s',
|
|
212
|
+
onProgress: (status) => {
|
|
213
|
+
repo.detectionJobStatus = status.status;
|
|
214
|
+
// Process successful detection result
|
|
215
|
+
if (status.status === 'success' && status.result) {
|
|
216
|
+
const response = status.result;
|
|
217
|
+
if (response.isInitialSetup) {
|
|
218
|
+
repo.detectionState = 'no-wmill';
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
repo.detectionState = 'has-wmill';
|
|
222
|
+
// Apply extracted settings from the git repository
|
|
223
|
+
if (response.local) {
|
|
224
|
+
repo.extractedSettings = response.local;
|
|
225
|
+
// Auto-apply the extracted settings
|
|
226
|
+
repo.settings = {
|
|
227
|
+
...response.local,
|
|
228
|
+
exclude_path: response.local.exclude_path || [],
|
|
229
|
+
extra_include_path: response.local.extra_include_path || []
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else if (status.status === 'failure') {
|
|
235
|
+
repo.detectionState = 'error';
|
|
236
|
+
repo.detectionError = status.error || 'Detection failed';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
repo.detectionState = 'error';
|
|
243
|
+
repo.detectionError = error?.message || error?.toString() || 'Failed to detect repository';
|
|
244
|
+
repo.detectionJobStatus = 'failure';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Settings management
|
|
248
|
+
async function loadSettings() {
|
|
249
|
+
loading = true;
|
|
250
|
+
try {
|
|
251
|
+
const settings = await WorkspaceService.getSettings({ workspace });
|
|
252
|
+
if (settings.git_sync !== undefined && settings.git_sync !== null) {
|
|
253
|
+
// Detect workspace-level legacy settings (outside repositories)
|
|
254
|
+
const workspaceLegacyIncludePath = settings.git_sync?.include_path ?? [];
|
|
255
|
+
const workspaceLegacyIncludeTypeRaw = settings.git_sync?.include_type ?? [];
|
|
256
|
+
const workspaceLegacyIncludeType = [...workspaceLegacyIncludeTypeRaw];
|
|
257
|
+
// Update legacy workspace state
|
|
258
|
+
legacyWorkspaceIncludePath.splice(0, legacyWorkspaceIncludePath.length, ...workspaceLegacyIncludePath);
|
|
259
|
+
legacyWorkspaceIncludeType.splice(0, legacyWorkspaceIncludeType.length, ...workspaceLegacyIncludeType);
|
|
260
|
+
if (settings.git_sync.repositories) {
|
|
261
|
+
repositories.splice(0, repositories.length, ...settings.git_sync.repositories.map(repo => {
|
|
262
|
+
// Check if this is a legacy repo (no nested settings object)
|
|
263
|
+
const isRepoLegacy = !repo.settings;
|
|
264
|
+
const repoExcludeTypesOverride = repo.exclude_types_override ?? [];
|
|
265
|
+
// Determine default types - use workspace legacy or fallback
|
|
266
|
+
const defaultTypes = workspaceLegacyIncludeType.length > 0
|
|
267
|
+
? [...workspaceLegacyIncludeType]
|
|
268
|
+
: ['script', 'flow', 'app', 'folder'];
|
|
269
|
+
let repoSettings;
|
|
270
|
+
if (isRepoLegacy) {
|
|
271
|
+
// Legacy repo: inherit from workspace-level settings and apply exclude_types_override
|
|
272
|
+
const inheritedIncludeType = repo.settings?.include_type ?? [...defaultTypes];
|
|
273
|
+
const effectiveIncludeType = repoExcludeTypesOverride.length > 0
|
|
274
|
+
? inheritedIncludeType.filter(type => !repoExcludeTypesOverride.includes(type))
|
|
275
|
+
: inheritedIncludeType;
|
|
276
|
+
repoSettings = {
|
|
277
|
+
include_path: repo.settings?.include_path ?? [...workspaceLegacyIncludePath],
|
|
278
|
+
exclude_path: repo.settings?.exclude_path ?? [],
|
|
279
|
+
extra_include_path: repo.settings?.extra_include_path ?? [],
|
|
280
|
+
include_type: effectiveIncludeType
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// New format: use repo's own settings
|
|
285
|
+
repoSettings = {
|
|
286
|
+
include_path: repo.settings?.include_path ?? ['f/**'],
|
|
287
|
+
exclude_path: repo.settings?.exclude_path ?? [],
|
|
288
|
+
extra_include_path: repo.settings?.extra_include_path ?? [],
|
|
289
|
+
include_type: repo.settings?.include_type ?? ['script', 'flow', 'app']
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
...repo,
|
|
294
|
+
git_repo_resource_path: repo.git_repo_resource_path.replace('$res:', ''),
|
|
295
|
+
settings: repoSettings,
|
|
296
|
+
exclude_types_override: repoExcludeTypesOverride,
|
|
297
|
+
// Mark legacy repos for UI handling
|
|
298
|
+
legacyImported: isRepoLegacy
|
|
299
|
+
};
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Store initial state for change tracking
|
|
304
|
+
initialRepositories.splice(0, initialRepositories.length, ...repositories.map(repo => ({ ...repo })));
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
loading = false;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Migration utility for legacy repositories
|
|
311
|
+
function migrateLegacyRepository(repo) {
|
|
312
|
+
if (!repo.legacyImported) {
|
|
313
|
+
return repo; // Already migrated or not legacy
|
|
314
|
+
}
|
|
315
|
+
// Create migrated repository - exclude_types_override should already be applied in settings.include_type
|
|
316
|
+
// from the loadSettings logic, so we just need to clear the override and mark as migrated
|
|
317
|
+
return {
|
|
318
|
+
...repo,
|
|
319
|
+
exclude_types_override: [], // Clear the override since it's now integrated into include_type
|
|
320
|
+
legacyImported: false // Mark as migrated
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
async function saveRepository(idx, savedWithoutInit = false) {
|
|
324
|
+
const repo = repositories[idx];
|
|
325
|
+
if (!repo || !validateRepository(repo, idx)) {
|
|
326
|
+
throw new Error('Cannot save invalid repository');
|
|
327
|
+
}
|
|
328
|
+
// Migrate legacy repository if needed
|
|
329
|
+
const repoToSave = repo.legacyImported ? migrateLegacyRepository(repo) : repo;
|
|
330
|
+
// Use the new individual repository API instead of saving all repositories
|
|
331
|
+
await WorkspaceService.editGitSyncRepository({
|
|
332
|
+
workspace,
|
|
333
|
+
requestBody: {
|
|
334
|
+
git_repo_resource_path: `$res:${repoToSave.git_repo_resource_path}`,
|
|
335
|
+
repository: {
|
|
336
|
+
git_repo_resource_path: `$res:${repoToSave.git_repo_resource_path}`,
|
|
337
|
+
script_path: repoToSave.script_path,
|
|
338
|
+
use_individual_branch: repoToSave.use_individual_branch,
|
|
339
|
+
group_by_folder: repoToSave.group_by_folder,
|
|
340
|
+
settings: repoToSave.settings,
|
|
341
|
+
exclude_types_override: repoToSave.exclude_types_override
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
// Update local state with migrated repository
|
|
346
|
+
repositories[idx] = repoToSave;
|
|
347
|
+
initialRepositories[idx] = { ...repoToSave };
|
|
348
|
+
// Update local state
|
|
349
|
+
if (repoToSave.isUnsavedConnection) {
|
|
350
|
+
repoToSave.isUnsavedConnection = false;
|
|
351
|
+
repoToSave.detectionState = undefined;
|
|
352
|
+
repoToSave.extractedSettings = undefined;
|
|
353
|
+
// Show success modal for new connections
|
|
354
|
+
showSuccessModal(savedWithoutInit);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Helper functions for original functionality
|
|
358
|
+
function revertRepository(idx) {
|
|
359
|
+
const initial = initialRepositories[idx];
|
|
360
|
+
if (initial) {
|
|
361
|
+
repositories[idx] = JSON.parse(JSON.stringify(initial));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Reset detection state for a repository
|
|
365
|
+
function resetDetectionState(idx) {
|
|
366
|
+
const repo = repositories[idx];
|
|
367
|
+
if (!repo || !repo.isUnsavedConnection)
|
|
368
|
+
return;
|
|
369
|
+
_resetRepoDetectionState(repo);
|
|
370
|
+
}
|
|
371
|
+
// Helper function to reset detection state on a repository object
|
|
372
|
+
function _resetRepoDetectionState(repo) {
|
|
373
|
+
repo.detectionState = 'idle';
|
|
374
|
+
repo.extractedSettings = undefined;
|
|
375
|
+
repo.detectionError = undefined;
|
|
376
|
+
repo.detectionJobId = undefined;
|
|
377
|
+
repo.detectionJobStatus = undefined;
|
|
378
|
+
}
|
|
379
|
+
async function runTestJob(idx) {
|
|
380
|
+
const repo = repositories[idx];
|
|
381
|
+
if (!repo?.git_repo_resource_path || !repo?.script_path) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
const jobId = await JobService.runScriptByPath({
|
|
386
|
+
workspace,
|
|
387
|
+
path: hubPaths.gitSyncTest,
|
|
388
|
+
requestBody: {
|
|
389
|
+
repo_url_resource_path: repo.git_repo_resource_path
|
|
390
|
+
},
|
|
391
|
+
skipPreprocessor: true
|
|
392
|
+
});
|
|
393
|
+
gitSyncTestJobs[idx] = {
|
|
394
|
+
jobId: jobId,
|
|
395
|
+
status: 'running'
|
|
396
|
+
};
|
|
397
|
+
// Use JobManager for polling
|
|
398
|
+
await jobManager.runWithProgress(() => Promise.resolve(jobId), {
|
|
399
|
+
workspace,
|
|
400
|
+
timeout: 5000,
|
|
401
|
+
timeoutMessage: 'Git sync test job timed out after 5s',
|
|
402
|
+
onProgress: (status) => {
|
|
403
|
+
gitSyncTestJobs[idx].status = status.status === 'success' ? 'success' :
|
|
404
|
+
status.status === 'failure' ? 'failure' : 'running';
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
// If we get here, the job completed successfully
|
|
408
|
+
gitSyncTestJobs[idx].status = 'success';
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
gitSyncTestJobs[idx].status = 'failure';
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Return context object
|
|
415
|
+
return {
|
|
416
|
+
// State (read-only access)
|
|
417
|
+
get repositories() { return repositories; },
|
|
418
|
+
get loading() { return loading; },
|
|
419
|
+
get activeModals() { return activeModals; },
|
|
420
|
+
get gitSyncTestJobs() { return gitSyncTestJobs; },
|
|
421
|
+
get initialRepositories() { return initialRepositories; },
|
|
422
|
+
get legacyWorkspaceIncludePath() { return legacyWorkspaceIncludePath; },
|
|
423
|
+
get legacyWorkspaceIncludeType() { return legacyWorkspaceIncludeType; },
|
|
424
|
+
// Computed states - use getter functions that compute on access
|
|
425
|
+
get validationStates() { return getValidationStates(); },
|
|
426
|
+
get hasAnyChanges() { return getHasAnyChanges(); },
|
|
427
|
+
get allRepositoriesValid() { return getAllRepositoriesValid(); },
|
|
428
|
+
get hasUnsavedConnections() { return getHasUnsavedConnections(); },
|
|
429
|
+
get hasWorkspaceLevelSettings() { return hasWorkspaceLevelSettings; },
|
|
430
|
+
// Methods
|
|
431
|
+
addRepository,
|
|
432
|
+
removeRepository,
|
|
433
|
+
getRepository,
|
|
434
|
+
getValidation,
|
|
435
|
+
revertRepository,
|
|
436
|
+
runTestJob,
|
|
437
|
+
resetDetectionState,
|
|
438
|
+
detectRepository,
|
|
439
|
+
migrateLegacyRepository,
|
|
440
|
+
showPushModal,
|
|
441
|
+
showPullModal,
|
|
442
|
+
closePushModal,
|
|
443
|
+
closePullModal,
|
|
444
|
+
showSuccessModal,
|
|
445
|
+
closeSuccessModal,
|
|
446
|
+
loadSettings,
|
|
447
|
+
saveRepository,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
export function setGitSyncContext(workspace) {
|
|
451
|
+
const context = createGitSyncContext(workspace);
|
|
452
|
+
setContext(GIT_SYNC_CONTEXT_KEY, context);
|
|
453
|
+
return context;
|
|
454
|
+
}
|
|
455
|
+
export function getGitSyncContext() {
|
|
456
|
+
const context = getContext(GIT_SYNC_CONTEXT_KEY);
|
|
457
|
+
if (!context) {
|
|
458
|
+
throw new Error('Git sync context not found. Make sure to call setGitSyncContext first.');
|
|
459
|
+
}
|
|
460
|
+
return context;
|
|
461
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script lang="ts">import { getGitSyncContext } from './GitSyncContext.svelte';
|
|
2
|
+
import PushWorkspaceModal from './PushWorkspaceModal.svelte';
|
|
3
|
+
import PullWorkspaceModal from './PullWorkspaceModal.svelte';
|
|
4
|
+
import GitSyncSuccessModal from './GitSyncSuccessModal.svelte';
|
|
5
|
+
import { sendUserToast } from '../../toast';
|
|
6
|
+
const gitSyncContext = getGitSyncContext();
|
|
7
|
+
function handlePushSuccess() {
|
|
8
|
+
const pushModal = gitSyncContext.activeModals.push;
|
|
9
|
+
if (!pushModal)
|
|
10
|
+
return;
|
|
11
|
+
const { idx, repo } = pushModal;
|
|
12
|
+
// If this was a repository initialization, auto-save the connection
|
|
13
|
+
if (repo.isUnsavedConnection && repo.detectionState === 'no-wmill') {
|
|
14
|
+
gitSyncContext.saveRepository(idx).then(() => {
|
|
15
|
+
sendUserToast('Repository initialized and connection saved successfully');
|
|
16
|
+
}).catch((error) => {
|
|
17
|
+
sendUserToast('Repository initialized but failed to save connection: ' + error.message, true);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
sendUserToast('Successfully pushed to git repository');
|
|
22
|
+
}
|
|
23
|
+
gitSyncContext.closePushModal();
|
|
24
|
+
}
|
|
25
|
+
function handlePullSuccess() {
|
|
26
|
+
sendUserToast('Successfully pulled from git repository');
|
|
27
|
+
gitSyncContext.closePullModal();
|
|
28
|
+
}
|
|
29
|
+
function handleFilterUpdate(idx, filters) {
|
|
30
|
+
// Update the repository settings in the context
|
|
31
|
+
const repo = gitSyncContext.getRepository(idx);
|
|
32
|
+
if (repo) {
|
|
33
|
+
repo.settings = filters;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function handleSettingsSaved() {
|
|
37
|
+
// Update initial state to reflect that current state has been saved externally
|
|
38
|
+
gitSyncContext.initialRepositories.splice(0, gitSyncContext.initialRepositories.length, ...gitSyncContext.repositories.map(repo => ({ ...repo })));
|
|
39
|
+
sendUserToast('Settings applied successfully');
|
|
40
|
+
}
|
|
41
|
+
async function handleSaveWithoutInit(idx) {
|
|
42
|
+
try {
|
|
43
|
+
await gitSyncContext.saveRepository(idx, true);
|
|
44
|
+
sendUserToast('Connection saved successfully without initializing repository');
|
|
45
|
+
gitSyncContext.closePushModal();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
sendUserToast('Failed to save connection: ' + error.message, true);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
|
+
<!-- Push Modal -->
|
|
54
|
+
{#if gitSyncContext.activeModals.push}
|
|
55
|
+
{@const { idx, repo } = gitSyncContext.activeModals.push}
|
|
56
|
+
{@const isNewConnection = repo.isUnsavedConnection && repo.detectionState === 'no-wmill'}
|
|
57
|
+
<PushWorkspaceModal
|
|
58
|
+
bind:open={gitSyncContext.activeModals.push.open}
|
|
59
|
+
gitRepoResourcePath={repo.git_repo_resource_path}
|
|
60
|
+
uiState={{
|
|
61
|
+
include_path: repo.settings.include_path,
|
|
62
|
+
exclude_path: repo.settings.exclude_path,
|
|
63
|
+
extra_include_path: repo.settings.extra_include_path,
|
|
64
|
+
include_type: repo.settings.include_type
|
|
65
|
+
}}
|
|
66
|
+
isNewConnection={isNewConnection}
|
|
67
|
+
onSuccess={handlePushSuccess}
|
|
68
|
+
onSaveWithoutInit={isNewConnection ? () => handleSaveWithoutInit(idx) : undefined}
|
|
69
|
+
/>
|
|
70
|
+
{/if}
|
|
71
|
+
|
|
72
|
+
<!-- Pull Modal -->
|
|
73
|
+
{#if gitSyncContext.activeModals.pull}
|
|
74
|
+
{@const { idx, repo, settingsOnly } = gitSyncContext.activeModals.pull}
|
|
75
|
+
<PullWorkspaceModal
|
|
76
|
+
bind:open={gitSyncContext.activeModals.pull.open}
|
|
77
|
+
gitRepoResourcePath={repo.git_repo_resource_path}
|
|
78
|
+
repoIndex={idx}
|
|
79
|
+
currentGitSyncSettings={gitSyncContext}
|
|
80
|
+
uiState={{
|
|
81
|
+
include_path: repo.settings.include_path,
|
|
82
|
+
exclude_path: repo.settings.exclude_path,
|
|
83
|
+
extra_include_path: repo.settings.extra_include_path,
|
|
84
|
+
include_type: repo.settings.include_type
|
|
85
|
+
}}
|
|
86
|
+
onFilterUpdate={(filters) => handleFilterUpdate(idx, filters)}
|
|
87
|
+
onSettingsSaved={handleSettingsSaved}
|
|
88
|
+
onSuccess={handlePullSuccess}
|
|
89
|
+
{settingsOnly}
|
|
90
|
+
/>
|
|
91
|
+
{/if}
|
|
92
|
+
|
|
93
|
+
<!-- Success Modal -->
|
|
94
|
+
{#if gitSyncContext.activeModals.success}
|
|
95
|
+
<GitSyncSuccessModal
|
|
96
|
+
bind:open={gitSyncContext.activeModals.success.open}
|
|
97
|
+
savedWithoutInit={gitSyncContext.activeModals.success.savedWithoutInit}
|
|
98
|
+
/>
|
|
99
|
+
{/if}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const GitSyncModalManager: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type GitSyncModalManager = InstanceType<typeof GitSyncModalManager>;
|
|
18
|
+
export default GitSyncModalManager;
|