Skip to content

Commit dbe79c0

Browse files
committed
feat(onboarding): migrate to leaf view and add smart detection
- Replace OnboardingModal with OnboardingView (ItemView-based) - Add SettingsChangeDetector service for intelligent onboarding triggers - Implement settings check step with user confirmation - Enhance configuration safety with smart view merging - Update CSS to support both modal and leaf view layouts - Add "Open Task Genius Setup" command for manual access - Preserve all existing onboarding functionality - Improve UX by preventing unnecessary interruptions for configured users BREAKING CHANGE: Onboarding now opens as a leaf view instead of modal
1 parent ddb977c commit dbe79c0

File tree

10 files changed

+1427
-11451
lines changed

10 files changed

+1427
-11451
lines changed

src/components/onboarding/ConfigPreview.ts

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import { OnboardingConfig } from "../../utils/OnboardingConfigManager";
1+
import { OnboardingConfig, OnboardingConfigManager } from "../../utils/OnboardingConfigManager";
22
import { t } from "../../translations/helper";
33
import { setIcon } from "obsidian";
4+
import type TaskProgressBarPlugin from "../../index";
45

56
export class ConfigPreview {
7+
private configManager: OnboardingConfigManager;
8+
9+
constructor(configManager: OnboardingConfigManager) {
10+
this.configManager = configManager;
11+
}
12+
613
/**
714
* Render configuration preview
815
*/
@@ -145,6 +152,95 @@ export class ConfigPreview {
145152
config.settings.fileParsingConfig.enableWorkerProcessing ? t("Enabled") : t("Disabled")
146153
);
147154
}
155+
156+
// Show configuration change preview
157+
this.renderConfigurationChanges(containerEl, config);
158+
159+
// Customization note
160+
const note = containerEl.createDiv("customization-note");
161+
note.createEl("p", {
162+
text: t(
163+
"You can adjust any of these settings later in the plugin settings."
164+
),
165+
cls: "note-text",
166+
});
167+
}
168+
169+
/**
170+
* Render configuration changes preview
171+
*/
172+
private renderConfigurationChanges(containerEl: HTMLElement, config: OnboardingConfig) {
173+
try {
174+
const preview = this.configManager.getConfigurationPreview(config.mode);
175+
176+
// Show change summary section
177+
const changesSection = containerEl.createDiv("config-changes-summary");
178+
changesSection.createEl("h3", { text: t("Configuration Changes") });
179+
180+
// User custom views preserved
181+
if (preview.userCustomViewsPreserved.length > 0) {
182+
const preservedSection = changesSection.createDiv("preserved-views");
183+
const preservedHeader = preservedSection.createDiv("preserved-header");
184+
const preservedIcon = preservedHeader.createSpan("preserved-icon");
185+
setIcon(preservedIcon, "shield-check");
186+
preservedHeader.createSpan("preserved-text").setText(
187+
t("Your custom views will be preserved") + ` (${preview.userCustomViewsPreserved.length})`
188+
);
189+
190+
const preservedList = preservedSection.createEl("ul", { cls: "preserved-views-list" });
191+
preview.userCustomViewsPreserved.forEach(view => {
192+
const item = preservedList.createEl("li");
193+
const viewIcon = item.createSpan();
194+
setIcon(viewIcon, view.icon || "list");
195+
item.createSpan().setText(" " + view.name);
196+
});
197+
}
198+
199+
// Views to be added
200+
if (preview.viewsToAdd.length > 0) {
201+
const addedSection = changesSection.createDiv("added-views");
202+
const addedIcon = addedSection.createSpan("change-icon");
203+
setIcon(addedIcon, "plus-circle");
204+
addedSection.createSpan("change-text").setText(
205+
t("New views to be added") + ` (${preview.viewsToAdd.length})`
206+
);
207+
}
208+
209+
// Views to be updated
210+
if (preview.viewsToUpdate.length > 0) {
211+
const updatedSection = changesSection.createDiv("updated-views");
212+
const updatedIcon = updatedSection.createSpan("change-icon");
213+
setIcon(updatedIcon, "refresh-cw");
214+
updatedSection.createSpan("change-text").setText(
215+
t("Existing views to be updated") + ` (${preview.viewsToUpdate.length})`
216+
);
217+
}
218+
219+
// Settings changes
220+
if (preview.settingsChanges.length > 0) {
221+
const settingsChangesSection = changesSection.createDiv("settings-changes");
222+
const settingsIcon = settingsChangesSection.createSpan("change-icon");
223+
setIcon(settingsIcon, "settings");
224+
settingsChangesSection.createSpan("change-text").setText(t("Feature changes"));
225+
226+
const changesList = settingsChangesSection.createEl("ul", { cls: "settings-changes-list" });
227+
preview.settingsChanges.forEach(change => {
228+
const item = changesList.createEl("li");
229+
item.setText(change);
230+
});
231+
}
232+
233+
// Safety note
234+
const safetyNote = changesSection.createDiv("safety-note");
235+
const safetyIcon = safetyNote.createSpan("safety-icon");
236+
setIcon(safetyIcon, "info");
237+
safetyNote.createSpan("safety-text").setText(
238+
t("Only template settings will be applied. Your existing custom configurations will be preserved.")
239+
);
240+
241+
} catch (error) {
242+
console.warn("Could not generate configuration preview:", error);
243+
}
148244
}
149245

150246
/**

src/components/onboarding/OnboardingModal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class OnboardingModal extends Modal {
6565

6666
// Initialize components
6767
this.userLevelSelector = new UserLevelSelector(this.configManager);
68-
this.configPreview = new ConfigPreview();
68+
this.configPreview = new ConfigPreview(this.configManager);
6969
this.taskCreationGuide = new TaskCreationGuide(this.plugin);
7070
this.onboardingComplete = new OnboardingComplete();
7171

0 commit comments

Comments
 (0)