@codingame/monaco-vscode-walkthrough-service-override 20.4.1 → 21.0.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.json +10 -10
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.js +28 -39
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.d.ts +1 -11
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.js +49 -441
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedAccessibleView.js +3 -3
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.js +7 -7
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedDetailsRenderer.js +23 -1
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.js +37 -37
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons.js +2 -2
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput.js +1 -1
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService._contribution.js +4 -4
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.d.ts +1 -3
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.js +5 -18
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css +0 -456
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.js +3 -10
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.d.ts +0 -1
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.js +157 -300
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile.js +3 -3
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker.js +5 -5
- package/vscode/src/vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker_small.js +4 -4
- package/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough.js +3 -3
- package/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThrough.contribution.js +3 -3
- package/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.js +6 -5
- package/vscode/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils.js +1 -1
|
@@ -15,7 +15,6 @@ import { onUnexpectedError } from '@codingame/monaco-vscode-api/vscode/vs/base/c
|
|
|
15
15
|
import { KeyCode } from '@codingame/monaco-vscode-api/vscode/vs/base/common/keyCodes';
|
|
16
16
|
import { splitRecentLabel } from '@codingame/monaco-vscode-api/vscode/vs/base/common/labels';
|
|
17
17
|
import { DisposableStore, toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
18
|
-
import { parseLinkedText } from '@codingame/monaco-vscode-api/vscode/vs/base/common/linkedText';
|
|
19
18
|
import { parse } from '@codingame/monaco-vscode-api/vscode/vs/base/common/marshalling';
|
|
20
19
|
import { matchesScheme, Schemas } from '@codingame/monaco-vscode-api/vscode/vs/base/common/network';
|
|
21
20
|
import { OS } from '@codingame/monaco-vscode-api/vscode/vs/base/common/platform';
|
|
@@ -55,7 +54,7 @@ import { isRecentFolder, isRecentWorkspace } from '@codingame/monaco-vscode-158b
|
|
|
55
54
|
import { IWorkspacesService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspaces/common/workspaces.service';
|
|
56
55
|
import { OpenRecentAction } from '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common/vscode/vs/workbench/browser/actions/windowActions';
|
|
57
56
|
import { OpenFolderViaWorkspaceAction, OpenFileFolderAction, OpenFolderAction } from '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common/vscode/vs/workbench/browser/actions/workspaceActions';
|
|
58
|
-
import { EditorPane } from '@codingame/monaco-vscode-
|
|
57
|
+
import { EditorPane } from '@codingame/monaco-vscode-5e2c24a1-3217-55e8-bc90-521eaf7df5a6-common/vscode/vs/workbench/browser/parts/editor/editorPane';
|
|
59
58
|
import { WorkbenchStateContext } from '@codingame/monaco-vscode-api/vscode/vs/workbench/common/contextkeys';
|
|
60
59
|
import { IWebviewService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/webview/browser/webview.service';
|
|
61
60
|
import './gettingStartedColors.js';
|
|
@@ -65,7 +64,7 @@ import { GettingStartedInput } from './gettingStartedInput.js';
|
|
|
65
64
|
import { hiddenEntriesConfigurationKey, parseDescription } from './gettingStartedService.js';
|
|
66
65
|
import { IWalkthroughsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.service';
|
|
67
66
|
import { restoreWalkthroughsConfigurationKey } from './startupPage.js';
|
|
68
|
-
import { startEntries
|
|
67
|
+
import { startEntries } from '../common/gettingStartedContent.js';
|
|
69
68
|
import { GroupDirection, GroupsOrder } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/editor/common/editorGroupsService';
|
|
70
69
|
import { IEditorGroupsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/editor/common/editorGroupsService.service';
|
|
71
70
|
import { IExtensionService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensions.service';
|
|
@@ -76,7 +75,6 @@ import { AccessibilityVerbositySettingId } from '@codingame/monaco-vscode-api/vs
|
|
|
76
75
|
import { AccessibleViewAction } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/accessibility/browser/accessibleViewActions';
|
|
77
76
|
import { KeybindingLabel } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/keybindingLabel/keybindingLabel';
|
|
78
77
|
import { ScrollbarVisibility } from '@codingame/monaco-vscode-api/vscode/vs/base/common/scrollable';
|
|
79
|
-
import { startupExpContext, StartupExperimentGroup } from '@codingame/monaco-vscode-f6f55824-df83-5ffc-ac26-50fd4df4fe0e-common/vscode/vs/workbench/services/coreExperimentation/common/coreExperimentationService';
|
|
80
78
|
|
|
81
79
|
var GettingStartedPage_1;
|
|
82
80
|
registerCss(gettingStarted);
|
|
@@ -126,14 +124,13 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
126
124
|
this.detailsPageDisposables = ( new DisposableStore());
|
|
127
125
|
this.mediaDisposables = ( new DisposableStore());
|
|
128
126
|
this.buildSlideThrottle = ( new Throttler());
|
|
129
|
-
this.hasScrolledToFirstCategory = false;
|
|
130
127
|
this.showFeaturedWalkthrough = true;
|
|
131
128
|
this.currentMediaComponent = undefined;
|
|
132
129
|
this.currentMediaType = undefined;
|
|
133
130
|
this.container = $('.gettingStartedContainer', {
|
|
134
131
|
role: 'document',
|
|
135
132
|
tabindex: 0,
|
|
136
|
-
'aria-label': ( localize(
|
|
133
|
+
'aria-label': ( localize(12528, "Overview of how to get up to speed with your editor."))
|
|
137
134
|
});
|
|
138
135
|
this.stepMediaComponent = $('.getting-started-media');
|
|
139
136
|
this.stepMediaComponent.id = generateUuid();
|
|
@@ -183,8 +180,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
183
180
|
this.container.querySelectorAll(`[x-category-description-for="${category.id}"]`).forEach(step => step.innerText = ourCategory.description);
|
|
184
181
|
}));
|
|
185
182
|
this._register(this.gettingStartedService.onDidProgressStep(step => {
|
|
186
|
-
const category =
|
|
187
|
-
this.gettingStartedCategories.find(c => c.id === step.category);
|
|
183
|
+
const category = this.gettingStartedCategories.find(c => c.id === step.category);
|
|
188
184
|
if (!category) {
|
|
189
185
|
throw Error('Could not find category with ID: ' + step.category);
|
|
190
186
|
}
|
|
@@ -210,14 +206,14 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
210
206
|
badgeelement.parentElement?.setAttribute('aria-checked', 'true');
|
|
211
207
|
badgeelement.classList.remove(...ThemeIcon.asClassNameArray(gettingStartedUncheckedCodicon));
|
|
212
208
|
badgeelement.classList.add('complete', ...ThemeIcon.asClassNameArray(gettingStartedCheckedCodicon));
|
|
213
|
-
badgeelement.setAttribute('aria-label', ( localize(
|
|
209
|
+
badgeelement.setAttribute('aria-label', ( localize(12529, "Checkbox for Step {0}: Completed", step.title)));
|
|
214
210
|
}
|
|
215
211
|
else {
|
|
216
212
|
badgeelement.setAttribute('aria-checked', 'false');
|
|
217
213
|
badgeelement.parentElement?.setAttribute('aria-checked', 'false');
|
|
218
214
|
badgeelement.classList.remove('complete', ...ThemeIcon.asClassNameArray(gettingStartedCheckedCodicon));
|
|
219
215
|
badgeelement.classList.add(...ThemeIcon.asClassNameArray(gettingStartedUncheckedCodicon));
|
|
220
|
-
badgeelement.setAttribute('aria-label', ( localize(
|
|
216
|
+
badgeelement.setAttribute('aria-label', ( localize(12530, "Checkbox for Step {0}: Not completed", step.title)));
|
|
221
217
|
}
|
|
222
218
|
});
|
|
223
219
|
}
|
|
@@ -419,7 +415,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
419
415
|
label: x.title,
|
|
420
416
|
detail: x.description,
|
|
421
417
|
description: x.source,
|
|
422
|
-
}))), { canPickMany: false, matchOnDescription: true, matchOnDetail: true, title: ( localize(
|
|
418
|
+
}))), { canPickMany: false, matchOnDescription: true, matchOnDetail: true, title: ( localize(12531, "Open Walkthrough...")) });
|
|
423
419
|
if (selection) {
|
|
424
420
|
this.runDispatchCommand('selectCategory', selection.id);
|
|
425
421
|
}
|
|
@@ -600,7 +596,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
600
596
|
const themeType = this.themeService.getColorTheme().type;
|
|
601
597
|
const videoPath = media.path[themeType];
|
|
602
598
|
const videoPoster = media.poster ? media.poster[themeType] : undefined;
|
|
603
|
-
const altText = media.altText ? media.altText : ( localize(
|
|
599
|
+
const altText = media.altText ? media.altText : ( localize(12532, "Video for {0}", stepToExpand.title));
|
|
604
600
|
const rawHTML = await this.detailsRenderer.renderVideo(videoPath, videoPoster, altText);
|
|
605
601
|
this.webview.setHtml(rawHTML);
|
|
606
602
|
let isDisposed = false;
|
|
@@ -628,8 +624,8 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
628
624
|
provideScreenReaderUpdate() {
|
|
629
625
|
if (this.configurationService.getValue(AccessibilityVerbositySettingId.Walkthrough)) {
|
|
630
626
|
const kbLabel = this.keybindingService.lookupKeybinding(AccessibleViewAction.id)?.getAriaLabel();
|
|
631
|
-
return kbLabel ? ( localize(
|
|
632
|
-
|
|
627
|
+
return kbLabel ? ( localize(12533, "Inspect this in the accessible view ({0}).\n", kbLabel)) : ( localize(
|
|
628
|
+
12534,
|
|
633
629
|
"Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding.\n"
|
|
634
630
|
));
|
|
635
631
|
}
|
|
@@ -689,7 +685,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
689
685
|
this.categoriesPageScrollbar.dispose();
|
|
690
686
|
}
|
|
691
687
|
this.categoriesSlide = $('.gettingStartedSlideCategories.gettingStartedSlide');
|
|
692
|
-
const prevButton = $('button.prev-button.button-link', { 'x-dispatch': 'scrollPrev' }, $('span.scroll-button.codicon.codicon-chevron-left'), $('span.moreText', {}, ( localize(
|
|
688
|
+
const prevButton = $('button.prev-button.button-link', { 'x-dispatch': 'scrollPrev' }, $('span.scroll-button.codicon.codicon-chevron-left'), $('span.moreText', {}, ( localize(12535, "Go Back"))));
|
|
693
689
|
this.stepsSlide = $('.gettingStartedSlideDetails.gettingStartedSlide', {}, prevButton);
|
|
694
690
|
this.stepsContent = $('.gettingStartedDetailsContent', {});
|
|
695
691
|
this.detailsPageScrollbar = this._register(( new DomScrollableElement(
|
|
@@ -713,11 +709,11 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
713
709
|
icon: Codicon.check,
|
|
714
710
|
actionClassName: 'getting-started-checkbox',
|
|
715
711
|
isChecked: this.configurationService.getValue(configurationKey) === 'welcomePage',
|
|
716
|
-
title: ( localize(
|
|
712
|
+
title: ( localize(12536, "When checked, this page will be shown on startup.")),
|
|
717
713
|
...defaultToggleStyles
|
|
718
714
|
}));
|
|
719
715
|
showOnStartupCheckbox.domNode.id = 'showOnStartup';
|
|
720
|
-
const showOnStartupLabel = $('label.caption', { for: 'showOnStartup' }, ( localize(
|
|
716
|
+
const showOnStartupLabel = $('label.caption', { for: 'showOnStartup' }, ( localize(12537, "Show welcome page on startup")));
|
|
721
717
|
const onShowOnStartupChanged = () => {
|
|
722
718
|
if (showOnStartupCheckbox.checked) {
|
|
723
719
|
this.telemetryService.publicLog2('gettingStarted.ActionExecuted', { command: 'showOnStartupChecked', argument: undefined, walkthroughId: this.currentWalkthrough?.id });
|
|
@@ -736,7 +732,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
736
732
|
showOnStartupCheckbox.checked = !showOnStartupCheckbox.checked;
|
|
737
733
|
onShowOnStartupChanged();
|
|
738
734
|
}));
|
|
739
|
-
const header = $('.header', {}, $('h1.product-name.caption', {}, this.productService.nameLong), $('p.subtitle.description', {}, ( localize(
|
|
735
|
+
const header = $('.header', {}, $('h1.product-name.caption', {}, this.productService.nameLong), $('p.subtitle.description', {}, ( localize(12538, "Editing evolved"))));
|
|
740
736
|
const leftColumn = $('.categories-column.categories-column-left', {});
|
|
741
737
|
const rightColumn = $('.categories-column.categories-column-right', {});
|
|
742
738
|
const startList = this.buildStartList();
|
|
@@ -773,57 +769,38 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
773
769
|
this.updateCategoryProgress();
|
|
774
770
|
this.registerDispatchListeners();
|
|
775
771
|
if (this.editorInput.selectedCategory) {
|
|
776
|
-
const showNewExperience = this.editorInput.selectedCategory === NEW_WELCOME_EXPERIENCE;
|
|
777
772
|
this.currentWalkthrough = this.gettingStartedCategories.find(category => category.id === this.editorInput.selectedCategory);
|
|
778
773
|
if (!this.currentWalkthrough) {
|
|
779
774
|
this.gettingStartedCategories = this.gettingStartedService.getWalkthroughs();
|
|
780
|
-
this.currentWalkthrough =
|
|
775
|
+
this.currentWalkthrough = this.gettingStartedCategories.find(category => category.id === this.editorInput.selectedCategory);
|
|
781
776
|
if (this.currentWalkthrough) {
|
|
782
|
-
|
|
783
|
-
this.buildNewCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
784
|
-
}
|
|
785
|
-
else {
|
|
786
|
-
this.buildCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
787
|
-
}
|
|
777
|
+
this.buildCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
788
778
|
this.setSlide('details');
|
|
789
779
|
return;
|
|
790
780
|
}
|
|
791
781
|
}
|
|
792
782
|
else {
|
|
793
|
-
|
|
794
|
-
this.buildNewCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
795
|
-
}
|
|
796
|
-
else {
|
|
797
|
-
this.buildCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
798
|
-
}
|
|
783
|
+
this.buildCategorySlide(this.editorInput.selectedCategory, this.editorInput.selectedStep);
|
|
799
784
|
this.setSlide('details');
|
|
800
785
|
return;
|
|
801
786
|
}
|
|
802
787
|
}
|
|
803
|
-
const someStepsComplete = ( this.gettingStartedCategories.some(category => category.steps.find(s => s.done)));
|
|
804
788
|
if (this.editorInput.showTelemetryNotice && this.productService.openToWelcomeMainPage) {
|
|
805
789
|
const telemetryNotice = $('p.telemetry-notice');
|
|
806
790
|
this.buildTelemetryFooter(telemetryNotice);
|
|
807
791
|
footer.appendChild(telemetryNotice);
|
|
808
792
|
}
|
|
809
|
-
else if (!this.productService.openToWelcomeMainPage &&
|
|
793
|
+
else if (!this.productService.openToWelcomeMainPage && this.showFeaturedWalkthrough && this.storageService.isNew(StorageScope.APPLICATION)) {
|
|
810
794
|
const firstSessionDateString = this.storageService.get(firstSessionDateStorageKey, StorageScope.APPLICATION) || ( new Date()).toUTCString();
|
|
811
795
|
const daysSinceFirstSession = ((+( new Date())) - (+( new Date(firstSessionDateString)))) / 1000 / 60 / 60 / 24;
|
|
812
796
|
const fistContentBehaviour = daysSinceFirstSession < 1 ? 'openToFirstCategory' : 'index';
|
|
813
|
-
|
|
814
|
-
if (fistContentBehaviour === 'openToFirstCategory' && ((!startupExpValue || startupExpValue === '' || startupExpValue === StartupExperimentGroup.Control))) {
|
|
797
|
+
if (fistContentBehaviour === 'openToFirstCategory') {
|
|
815
798
|
const first = this.gettingStartedCategories.filter(c => !c.when || this.contextService.contextMatchesRules(c.when))[0];
|
|
816
799
|
if (first) {
|
|
817
|
-
this.hasScrolledToFirstCategory = true;
|
|
818
800
|
this.currentWalkthrough = first;
|
|
819
801
|
this.editorInput.selectedCategory = this.currentWalkthrough?.id;
|
|
820
802
|
this.editorInput.walkthroughPageTitle = this.currentWalkthrough.walkthroughPageTitle;
|
|
821
|
-
|
|
822
|
-
this.buildNewCategorySlide(this.editorInput.selectedCategory, undefined);
|
|
823
|
-
}
|
|
824
|
-
else {
|
|
825
|
-
this.buildCategorySlide(this.editorInput.selectedCategory, undefined);
|
|
826
|
-
}
|
|
803
|
+
this.buildCategorySlide(this.editorInput.selectedCategory, undefined);
|
|
827
804
|
this.setSlide('details', true );
|
|
828
805
|
return;
|
|
829
806
|
}
|
|
@@ -848,7 +825,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
848
825
|
const link = $('button.button-link');
|
|
849
826
|
link.innerText = name;
|
|
850
827
|
link.title = fullPath;
|
|
851
|
-
link.setAttribute('aria-label', ( localize(
|
|
828
|
+
link.setAttribute('aria-label', ( localize(12539, "Open folder {0} with path {1}", name, parentPath)));
|
|
852
829
|
link.addEventListener('click', e => {
|
|
853
830
|
this.telemetryService.publicLog2('gettingStarted.ActionExecuted', { command: 'openRecent', argument: undefined, walkthroughId: this.currentWalkthrough?.id });
|
|
854
831
|
this.hostService.openWindow([windowOpenable], {
|
|
@@ -871,18 +848,18 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
871
848
|
this.recentlyOpenedList.dispose();
|
|
872
849
|
}
|
|
873
850
|
const recentlyOpenedList = this.recentlyOpenedList = ( new GettingStartedIndexList({
|
|
874
|
-
title: ( localize(
|
|
851
|
+
title: ( localize(12540, "Recent")),
|
|
875
852
|
klass: 'recently-opened',
|
|
876
853
|
limit: 5,
|
|
877
|
-
empty: $('.empty-recent', {}, ( localize(
|
|
854
|
+
empty: $('.empty-recent', {}, ( localize(12541, "You have no recent folders,")), $('button.button-link', { 'x-dispatch': 'openFolder' }, ( localize(12542, "open a folder"))), ( localize(12543, "to start."))),
|
|
878
855
|
more: $('.more', {}, $('button.button-link', {
|
|
879
856
|
'x-dispatch': 'showMoreRecents',
|
|
880
857
|
title: ( localize(
|
|
881
|
-
|
|
858
|
+
12544,
|
|
882
859
|
"Show All Recent Folders {0}",
|
|
883
860
|
this.getKeybindingLabel(OpenRecentAction.ID)
|
|
884
861
|
))
|
|
885
|
-
}, ( localize(
|
|
862
|
+
}, ( localize(12545, "More...")))),
|
|
886
863
|
renderElement: renderRecent,
|
|
887
864
|
contextService: this.contextService
|
|
888
865
|
}));
|
|
@@ -910,7 +887,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
910
887
|
this.startList.dispose();
|
|
911
888
|
}
|
|
912
889
|
const startList = this.startList = ( new GettingStartedIndexList({
|
|
913
|
-
title: ( localize(
|
|
890
|
+
title: ( localize(12546, "Start")),
|
|
914
891
|
klass: 'start-container',
|
|
915
892
|
limit: 10,
|
|
916
893
|
renderElement: renderStartEntry,
|
|
@@ -926,10 +903,10 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
926
903
|
const renderNewBadge = (category.newItems || category.newEntry) && !category.isFeatured;
|
|
927
904
|
const newBadge = $('.new-badge', {});
|
|
928
905
|
if (category.newEntry) {
|
|
929
|
-
reset(newBadge, $('.new-category', {}, ( localize(
|
|
906
|
+
reset(newBadge, $('.new-category', {}, ( localize(12547, "New"))));
|
|
930
907
|
}
|
|
931
908
|
else if (category.newItems) {
|
|
932
|
-
reset(newBadge, $('.new-items', {}, ( localize(
|
|
909
|
+
reset(newBadge, $('.new-items', {}, ( localize(12548, "Updated"))));
|
|
933
910
|
}
|
|
934
911
|
const featuredBadge = $('.featured-badge', {});
|
|
935
912
|
const descriptionContent = $('.description-content', {});
|
|
@@ -945,9 +922,9 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
945
922
|
}, featuredBadge, $('.main-content', {}, this.iconWidgetFor(category), titleContent, renderNewBadge ? newBadge : $('.no-badge'), $('a.codicon.codicon-close.hide-category-button', {
|
|
946
923
|
'tabindex': 0,
|
|
947
924
|
'x-dispatch': 'hideCategory:' + category.id,
|
|
948
|
-
'title': ( localize(
|
|
925
|
+
'title': ( localize(12549, "Hide")),
|
|
949
926
|
'role': 'button',
|
|
950
|
-
'aria-label': ( localize(
|
|
927
|
+
'aria-label': ( localize(12550, "Hide")),
|
|
951
928
|
})), descriptionContent, $('.category-progress', { 'x-data-category-id': category.id, }, $('.progress-bar-outer', { 'role': 'progressbar' }, $('.progress-bar-inner'))));
|
|
952
929
|
};
|
|
953
930
|
if (this.gettingStartedList) {
|
|
@@ -973,10 +950,10 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
973
950
|
return rank;
|
|
974
951
|
};
|
|
975
952
|
const gettingStartedList = this.gettingStartedList = ( new GettingStartedIndexList({
|
|
976
|
-
title: ( localize(
|
|
953
|
+
title: ( localize(12551, "Walkthroughs")),
|
|
977
954
|
klass: 'getting-started',
|
|
978
955
|
limit: 5,
|
|
979
|
-
footer: $('span.button-link.see-all-walkthroughs', { 'x-dispatch': 'seeAllWalkthroughs', 'tabindex': 0 }, ( localize(
|
|
956
|
+
footer: $('span.button-link.see-all-walkthroughs', { 'x-dispatch': 'seeAllWalkthroughs', 'tabindex': 0 }, ( localize(12545, "More..."))),
|
|
980
957
|
renderElement: renderGetttingStaredWalkthrough,
|
|
981
958
|
rankElement: rankWalkthrough,
|
|
982
959
|
contextService: this.contextService,
|
|
@@ -1009,7 +986,6 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1009
986
|
this.container.classList.toggle('height-constrained', size.height <= 600);
|
|
1010
987
|
this.container.classList.toggle('width-constrained', size.width <= 400);
|
|
1011
988
|
this.container.classList.toggle('width-semi-constrained', size.width <= 950);
|
|
1012
|
-
this.container.classList.toggle('new-layout-width-constrained', size.width <= 800);
|
|
1013
989
|
this.categoriesPageScrollbar?.scanDomNode();
|
|
1014
990
|
this.detailsPageScrollbar?.scanDomNode();
|
|
1015
991
|
this.detailsScrollbar?.scanDomNode();
|
|
@@ -1017,8 +993,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1017
993
|
updateCategoryProgress() {
|
|
1018
994
|
this.window.document.querySelectorAll('.category-progress').forEach(element => {
|
|
1019
995
|
const categoryID = element.getAttribute('x-data-category-id');
|
|
1020
|
-
const category =
|
|
1021
|
-
this.gettingStartedCategories.find(c => c.id === categoryID);
|
|
996
|
+
const category = this.gettingStartedCategories.find(c => c.id === categoryID);
|
|
1022
997
|
if (!category) {
|
|
1023
998
|
throw Error('Could not find category with ID ' + categoryID);
|
|
1024
999
|
}
|
|
@@ -1031,10 +1006,10 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1031
1006
|
bar.style.width = `${progress}%`;
|
|
1032
1007
|
element.parentElement.classList.toggle('no-progress', stats.stepsComplete === 0);
|
|
1033
1008
|
if (stats.stepsTotal === stats.stepsComplete) {
|
|
1034
|
-
bar.title = ( localize(
|
|
1009
|
+
bar.title = ( localize(12552, "All {0} steps complete!", stats.stepsComplete));
|
|
1035
1010
|
}
|
|
1036
1011
|
else {
|
|
1037
|
-
bar.title = ( localize(
|
|
1012
|
+
bar.title = ( localize(12553, "{0} of {1} steps complete", stats.stepsComplete, stats.stepsTotal));
|
|
1038
1013
|
}
|
|
1039
1014
|
});
|
|
1040
1015
|
}
|
|
@@ -1042,8 +1017,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1042
1017
|
if (!( this.gettingStartedCategories.some(c => c.id === categoryID))) {
|
|
1043
1018
|
this.gettingStartedCategories = this.gettingStartedService.getWalkthroughs();
|
|
1044
1019
|
}
|
|
1045
|
-
const ourCategory =
|
|
1046
|
-
this.gettingStartedCategories.find(c => c.id === categoryID);
|
|
1020
|
+
const ourCategory = this.gettingStartedCategories.find(c => c.id === categoryID);
|
|
1047
1021
|
if (!ourCategory) {
|
|
1048
1022
|
throw Error('Could not find category with ID: ' + categoryID);
|
|
1049
1023
|
}
|
|
@@ -1158,7 +1132,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1158
1132
|
if (isCommand) {
|
|
1159
1133
|
const keybinding = this.getKeyBinding(command);
|
|
1160
1134
|
if (keybinding) {
|
|
1161
|
-
const shortcutMessage = $('span.shortcut-message', {}, ( localize(
|
|
1135
|
+
const shortcutMessage = $('span.shortcut-message', {}, ( localize(12554, 'Tip: Use keyboard shortcut ')));
|
|
1162
1136
|
container.appendChild(shortcutMessage);
|
|
1163
1137
|
const label = ( new KeybindingLabel(shortcutMessage, OS, { ...defaultKeybindingLabelStyles }));
|
|
1164
1138
|
label.set(keybinding);
|
|
@@ -1195,367 +1169,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1195
1169
|
this.stepDisposables.clear();
|
|
1196
1170
|
super.clearInput();
|
|
1197
1171
|
}
|
|
1198
|
-
selectStepByIndex(newIndex, steps, direction) {
|
|
1199
|
-
this.telemetryService.publicLog2('gettingStarted.ActionExecuted', { command: 'selectTask', argument: steps[newIndex].id, walkthroughId: this.currentWalkthrough?.id });
|
|
1200
|
-
const currentIndex = steps.findIndex(step => step.id === this.editorInput.selectedStep);
|
|
1201
|
-
this.selectSlide(steps[newIndex].id);
|
|
1202
|
-
const footer = this.stepsContent.querySelector('.getting-started-footer');
|
|
1203
|
-
if (footer && newIndex !== 0) {
|
|
1204
|
-
footer.style.display = 'none';
|
|
1205
|
-
}
|
|
1206
|
-
else if (footer) {
|
|
1207
|
-
footer.style.display = 'block';
|
|
1208
|
-
}
|
|
1209
|
-
this.updateNavButtons(newIndex, steps);
|
|
1210
|
-
const dots = this.stepsContent.querySelectorAll('.step-dot');
|
|
1211
|
-
dots.forEach((dot, index) => {
|
|
1212
|
-
if (index === newIndex) {
|
|
1213
|
-
dot.classList.add('active');
|
|
1214
|
-
}
|
|
1215
|
-
else {
|
|
1216
|
-
dot.classList.remove('active');
|
|
1217
|
-
}
|
|
1218
|
-
});
|
|
1219
|
-
if (currentIndex === newIndex) {
|
|
1220
|
-
return;
|
|
1221
|
-
}
|
|
1222
|
-
const slidesContainer = this.stepsContent.querySelector('.step-slides-container');
|
|
1223
|
-
if (slidesContainer) {
|
|
1224
|
-
const slides = slidesContainer.querySelectorAll('.step-slide');
|
|
1225
|
-
slides.forEach((slide, index) => {
|
|
1226
|
-
const slideElement = slide;
|
|
1227
|
-
if (index === currentIndex) {
|
|
1228
|
-
slideElement.style.display = 'block';
|
|
1229
|
-
slideElement.style.transform = 'translateX(0)';
|
|
1230
|
-
}
|
|
1231
|
-
else if (index === newIndex) {
|
|
1232
|
-
slideElement.style.display = 'block';
|
|
1233
|
-
slideElement.style.transform = `translateX(${direction < 0 ? '-100%' : '100%'})`;
|
|
1234
|
-
}
|
|
1235
|
-
else {
|
|
1236
|
-
slideElement.style.display = 'none';
|
|
1237
|
-
}
|
|
1238
|
-
});
|
|
1239
|
-
slidesContainer.getBoundingClientRect();
|
|
1240
|
-
setTimeout(() => {
|
|
1241
|
-
slides.forEach((slide, index) => {
|
|
1242
|
-
const slideElement = slide;
|
|
1243
|
-
if (index === currentIndex) {
|
|
1244
|
-
slideElement.style.transform = `translateX(${direction > 0 ? '-100%' : '100%'})`;
|
|
1245
|
-
setTimeout(() => {
|
|
1246
|
-
slideElement.style.display = 'none';
|
|
1247
|
-
}, SLIDE_TRANSITION_TIME_MS);
|
|
1248
|
-
}
|
|
1249
|
-
else if (index === newIndex) {
|
|
1250
|
-
slideElement.style.transform = 'translateX(0)';
|
|
1251
|
-
}
|
|
1252
|
-
});
|
|
1253
|
-
}, 20);
|
|
1254
|
-
}
|
|
1255
|
-
}
|
|
1256
|
-
updateNavButtons(newIndex, steps) {
|
|
1257
|
-
const prevButton = this.stepsContent.querySelector('.button-link.navigation.back');
|
|
1258
|
-
if (newIndex === 0) {
|
|
1259
|
-
if (prevButton) {
|
|
1260
|
-
prevButton.classList.add('inactive');
|
|
1261
|
-
prevButton.setAttribute('aria-hidden', 'true');
|
|
1262
|
-
prevButton.setAttribute('tabindex', '-1');
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
else {
|
|
1266
|
-
if (prevButton) {
|
|
1267
|
-
prevButton.classList.remove('inactive');
|
|
1268
|
-
prevButton.removeAttribute('aria-hidden');
|
|
1269
|
-
prevButton.removeAttribute('tabindex');
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
if (this.nextButton) {
|
|
1273
|
-
const isLastSlide = newIndex === steps.length - 1;
|
|
1274
|
-
const textNode = this.nextButton.firstChild;
|
|
1275
|
-
if (textNode && textNode.nodeType === Node.TEXT_NODE) {
|
|
1276
|
-
textNode.textContent = isLastSlide
|
|
1277
|
-
? ( localize(12337, "Start coding"))
|
|
1278
|
-
: ( localize(12338, "Next"));
|
|
1279
|
-
}
|
|
1280
|
-
this.nextButton.setAttribute('aria-label', isLastSlide
|
|
1281
|
-
? ( localize(12339, "Start coding"))
|
|
1282
|
-
: ( localize(12340, "Next")));
|
|
1283
|
-
}
|
|
1284
|
-
}
|
|
1285
|
-
buildNewCategorySlide(categoryID, selectedStep) {
|
|
1286
|
-
this.container.classList.add('newSlide');
|
|
1287
|
-
if (this.detailsScrollbar) {
|
|
1288
|
-
this.detailsScrollbar.dispose();
|
|
1289
|
-
}
|
|
1290
|
-
this.detailsPageDisposables.clear();
|
|
1291
|
-
this.mediaDisposables.clear();
|
|
1292
|
-
const category = this.gettingStartedService.getWalkthrough(categoryID);
|
|
1293
|
-
if (!category) {
|
|
1294
|
-
throw Error('could not find category with ID ' + categoryID);
|
|
1295
|
-
}
|
|
1296
|
-
const steps = category.steps.filter(step => this.contextService.contextMatchesRules(step.when));
|
|
1297
|
-
const groupedSteps = ( new Map());
|
|
1298
|
-
steps.forEach(step => {
|
|
1299
|
-
const prefixMatch = step.id.match(/^([^.]+)\./);
|
|
1300
|
-
const prefix = prefixMatch ? prefixMatch[1] : step.id;
|
|
1301
|
-
if (!( groupedSteps.has(prefix))) {
|
|
1302
|
-
groupedSteps.set(prefix, []);
|
|
1303
|
-
}
|
|
1304
|
-
groupedSteps.get(prefix)?.push(step);
|
|
1305
|
-
});
|
|
1306
|
-
const slidesContainer = $('.step-slides-container');
|
|
1307
|
-
const navigationContainer = $('.step-dots-container');
|
|
1308
|
-
const prevButton = $('button.button-link.navigation.back', {
|
|
1309
|
-
'aria-label': ( localize(12341, "Previous Step")),
|
|
1310
|
-
'tabindex': '0'
|
|
1311
|
-
}, $('span.codicon.codicon-arrow-left'), ( localize(12342, "Back")));
|
|
1312
|
-
const dotsContainer = $('.dots-centered');
|
|
1313
|
-
navigationContainer.appendChild(prevButton);
|
|
1314
|
-
navigationContainer.appendChild(dotsContainer);
|
|
1315
|
-
const allSlides = [];
|
|
1316
|
-
groupedSteps.forEach((stepsInGroup, prefix) => {
|
|
1317
|
-
if (stepsInGroup.length === 1) {
|
|
1318
|
-
allSlides.push({ id: stepsInGroup[0].id, steps: [stepsInGroup[0]] });
|
|
1319
|
-
}
|
|
1320
|
-
else {
|
|
1321
|
-
allSlides.push({ id: prefix, steps: stepsInGroup });
|
|
1322
|
-
}
|
|
1323
|
-
});
|
|
1324
|
-
allSlides.forEach((slide, index) => {
|
|
1325
|
-
const slideElement = $('.step-slide', { 'data-step': slide.id });
|
|
1326
|
-
const slideContent = $('.step-slide-content');
|
|
1327
|
-
const textContent = $('.step-text-content');
|
|
1328
|
-
if (slide.steps.length === 1) {
|
|
1329
|
-
const step = slide.steps[0];
|
|
1330
|
-
const titleElement = $('h3.step-title', { 'x-step-title-for': step.id });
|
|
1331
|
-
reset(titleElement, ...renderLabelWithIcons(step.title));
|
|
1332
|
-
textContent.appendChild(titleElement);
|
|
1333
|
-
const descriptionContainer = $('.step-description', { 'x-step-description-for': step.id });
|
|
1334
|
-
this.buildMarkdownDescription(descriptionContainer, step.description);
|
|
1335
|
-
textContent.appendChild(descriptionContainer);
|
|
1336
|
-
}
|
|
1337
|
-
else {
|
|
1338
|
-
const multiStepContainer = $('.multi-step-container');
|
|
1339
|
-
slide.steps.forEach((step, i) => {
|
|
1340
|
-
const subStep = $('.sub-step', { 'data-sub-step-id': step.id });
|
|
1341
|
-
this.detailsPageDisposables.add(addDisposableListener(subStep, 'click', () => {
|
|
1342
|
-
this.selectSubStep(step.id);
|
|
1343
|
-
}));
|
|
1344
|
-
this.detailsPageDisposables.add(addDisposableListener(subStep, 'mouseenter', () => {
|
|
1345
|
-
this.selectSubStep(step.id);
|
|
1346
|
-
}));
|
|
1347
|
-
const subStepTitleEl = $('.sub-step-title', {}, ...renderLabelWithIcons(step.title));
|
|
1348
|
-
subStep.appendChild(subStepTitleEl);
|
|
1349
|
-
const subStepDesc = $('.sub-step-description');
|
|
1350
|
-
this.buildMarkdownDescription(subStepDesc, [step.description[0]]);
|
|
1351
|
-
subStep.appendChild(subStepDesc);
|
|
1352
|
-
if (i === 0 || step.id === this.editorInput.selectedStep) {
|
|
1353
|
-
subStep.classList.add('active');
|
|
1354
|
-
}
|
|
1355
|
-
else {
|
|
1356
|
-
subStep.classList.remove('active');
|
|
1357
|
-
}
|
|
1358
|
-
multiStepContainer.appendChild(subStep);
|
|
1359
|
-
});
|
|
1360
|
-
const lastStep = slide.steps[slide.steps.length - 1];
|
|
1361
|
-
const linkedText = lastStep.description.length > 1 ? lastStep.description[1] : undefined;
|
|
1362
|
-
if (linkedText) {
|
|
1363
|
-
const descElement = $('.multi-step-action');
|
|
1364
|
-
this.buildMarkdownDescription(descElement, [linkedText]);
|
|
1365
|
-
multiStepContainer.appendChild(descElement);
|
|
1366
|
-
const actionMessage = $('span.action-message');
|
|
1367
|
-
const updatedText = parseLinkedText(copilotSettingsMessage);
|
|
1368
|
-
this.buildMarkdownDescription(actionMessage, [updatedText]);
|
|
1369
|
-
multiStepContainer.appendChild(actionMessage);
|
|
1370
|
-
}
|
|
1371
|
-
textContent.appendChild(multiStepContainer);
|
|
1372
|
-
}
|
|
1373
|
-
slideContent.appendChild(textContent);
|
|
1374
|
-
slideElement.appendChild(slideContent);
|
|
1375
|
-
slidesContainer.appendChild(slideElement);
|
|
1376
|
-
const dot = $('button.step-dot', {
|
|
1377
|
-
'data-step-dot-index': `${index}`,
|
|
1378
|
-
'role': 'button'
|
|
1379
|
-
});
|
|
1380
|
-
if (index === 0) {
|
|
1381
|
-
dot.classList.add('active');
|
|
1382
|
-
}
|
|
1383
|
-
dotsContainer.appendChild(dot);
|
|
1384
|
-
this.detailsPageDisposables.add(addDisposableListener(dot, 'click', () => {
|
|
1385
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1386
|
-
if (currentIndex === index) {
|
|
1387
|
-
return;
|
|
1388
|
-
}
|
|
1389
|
-
this.selectStepByIndex(index, ( allSlides.map(s => s.steps[0])), index > currentIndex ? 1 : -1);
|
|
1390
|
-
}));
|
|
1391
|
-
});
|
|
1392
|
-
this.nextButton = $('button.button-link.navigation.next', {
|
|
1393
|
-
'aria-label': ( localize(12340, "Next")),
|
|
1394
|
-
}, ( localize(12338, "Next")), $('span.codicon.codicon-arrow-right'));
|
|
1395
|
-
navigationContainer.appendChild(this.nextButton);
|
|
1396
|
-
this.detailsPageDisposables.add(addDisposableListener(prevButton, 'click', () => {
|
|
1397
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1398
|
-
if (currentIndex > 0) {
|
|
1399
|
-
this.selectStepByIndex(currentIndex - 1, ( allSlides.map(s => s.steps[0])), -1);
|
|
1400
|
-
}
|
|
1401
|
-
}));
|
|
1402
|
-
this.detailsPageDisposables.add(addDisposableListener(this.nextButton, 'click', () => {
|
|
1403
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1404
|
-
if (currentIndex < allSlides.length - 1) {
|
|
1405
|
-
this.selectStepByIndex(currentIndex + 1, ( allSlides.map(s => s.steps[0])), 1);
|
|
1406
|
-
}
|
|
1407
|
-
else {
|
|
1408
|
-
this.scrollPrev();
|
|
1409
|
-
}
|
|
1410
|
-
}));
|
|
1411
|
-
this.currentWalkthrough = category;
|
|
1412
|
-
this.editorInput.selectedCategory = categoryID;
|
|
1413
|
-
this.editorInput.selectedStep = this.currentWalkthrough.steps[0].id;
|
|
1414
|
-
const categoryHeader = $('.category-header');
|
|
1415
|
-
const categoryTitle = $('h2.category-title', { 'x-category-title-for': category.id });
|
|
1416
|
-
reset(categoryTitle, ...renderLabelWithIcons(category.title));
|
|
1417
|
-
categoryHeader.appendChild(categoryTitle);
|
|
1418
|
-
const descriptionContainer = $('.category-description.description.max-lines-3', { 'x-category-description-for': category.id });
|
|
1419
|
-
this.buildMarkdownDescription(descriptionContainer, parseDescription(category.description));
|
|
1420
|
-
reset(descriptionContainer, ...renderLabelWithIcons(category.description));
|
|
1421
|
-
categoryHeader.appendChild(descriptionContainer);
|
|
1422
|
-
const categoryFooter = $('.getting-started-footer');
|
|
1423
|
-
if (this.editorInput.showTelemetryNotice && getTelemetryLevel(this.configurationService) !== TelemetryLevel.NONE && this.productService.enableTelemetry) {
|
|
1424
|
-
this.buildTelemetryFooter(categoryFooter);
|
|
1425
|
-
}
|
|
1426
|
-
const stepsContainer = $('.getting-started-steps-container', {}, categoryHeader, slidesContainer, navigationContainer, categoryFooter);
|
|
1427
|
-
this.detailsScrollbar = this._register(( new DomScrollableElement(stepsContainer, { className: 'steps-container' })));
|
|
1428
|
-
const stepListComponent = this.detailsScrollbar.getDomNode();
|
|
1429
|
-
reset(this.stepsContent, stepListComponent);
|
|
1430
|
-
stepListComponent.tabIndex = 0;
|
|
1431
|
-
stepListComponent.focus();
|
|
1432
|
-
this.selectStepByIndex(0, this.currentWalkthrough.steps, 1);
|
|
1433
|
-
this.detailsPageDisposables.add(addDisposableListener(stepListComponent, 'keydown', (e) => {
|
|
1434
|
-
const event = ( new StandardKeyboardEvent(e));
|
|
1435
|
-
if (event.keyCode === KeyCode.RightArrow) {
|
|
1436
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1437
|
-
if (currentIndex < allSlides.length - 1) {
|
|
1438
|
-
this.selectStepByIndex(currentIndex + 1, ( allSlides.map(s => s.steps[0])), 1);
|
|
1439
|
-
}
|
|
1440
|
-
else {
|
|
1441
|
-
this.scrollPrev();
|
|
1442
|
-
}
|
|
1443
|
-
}
|
|
1444
|
-
else if (event.keyCode === KeyCode.LeftArrow) {
|
|
1445
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1446
|
-
if (currentIndex > 0) {
|
|
1447
|
-
this.selectStepByIndex(currentIndex - 1, ( allSlides.map(s => s.steps[0])), -1);
|
|
1448
|
-
}
|
|
1449
|
-
}
|
|
1450
|
-
else if (event.keyCode === KeyCode.UpArrow || event.keyCode === KeyCode.DownArrow) {
|
|
1451
|
-
const currentIndex = this.getCurrentSlideIndex(allSlides);
|
|
1452
|
-
if (currentIndex > 0) {
|
|
1453
|
-
return;
|
|
1454
|
-
}
|
|
1455
|
-
this.navigateWithinMultiStepContainer(event.keyCode);
|
|
1456
|
-
}
|
|
1457
|
-
}));
|
|
1458
|
-
this.registerDispatchListeners();
|
|
1459
|
-
this.detailsScrollbar.scanDomNode();
|
|
1460
|
-
this.detailsPageScrollbar?.scanDomNode();
|
|
1461
|
-
}
|
|
1462
|
-
navigateWithinMultiStepContainer(keyCode) {
|
|
1463
|
-
const currentElement = this.container.querySelector(`.multi-step-container`);
|
|
1464
|
-
if (!currentElement) {
|
|
1465
|
-
return;
|
|
1466
|
-
}
|
|
1467
|
-
const currentSubStep = currentElement.querySelector('.sub-step.active');
|
|
1468
|
-
const allElements = Array.from(this.container.querySelectorAll('.sub-step'));
|
|
1469
|
-
const currentIndex = currentSubStep ? allElements.indexOf(currentSubStep) : -1;
|
|
1470
|
-
let targetElement;
|
|
1471
|
-
if (keyCode === KeyCode.UpArrow && currentIndex > 0) {
|
|
1472
|
-
targetElement = allElements[currentIndex - 1];
|
|
1473
|
-
}
|
|
1474
|
-
else if (keyCode === KeyCode.DownArrow && currentIndex < allElements.length - 1) {
|
|
1475
|
-
targetElement = allElements[currentIndex + 1];
|
|
1476
|
-
}
|
|
1477
|
-
if (targetElement) {
|
|
1478
|
-
const stepId = targetElement.getAttribute('data-sub-step-id');
|
|
1479
|
-
this.selectSubStep(stepId);
|
|
1480
|
-
targetElement.focus();
|
|
1481
|
-
}
|
|
1482
|
-
}
|
|
1483
|
-
selectSubStep(selectedStepId) {
|
|
1484
|
-
this.telemetryService.publicLog2('gettingStarted.ActionExecuted', { command: 'selectTask', argument: selectedStepId, walkthroughId: this.currentWalkthrough?.id });
|
|
1485
|
-
if (this.editorInput.selectedStep === selectedStepId) {
|
|
1486
|
-
return;
|
|
1487
|
-
}
|
|
1488
|
-
this.editorInput.selectedStep = selectedStepId;
|
|
1489
|
-
const multiStepContainer = this.container.querySelector('.multi-step-container');
|
|
1490
|
-
if (!multiStepContainer) {
|
|
1491
|
-
return;
|
|
1492
|
-
}
|
|
1493
|
-
const subSteps = multiStepContainer.querySelectorAll('.sub-step');
|
|
1494
|
-
subSteps.forEach(subStepEl => {
|
|
1495
|
-
const stepId = subStepEl.getAttribute('data-sub-step-id');
|
|
1496
|
-
if (stepId === selectedStepId) {
|
|
1497
|
-
subStepEl.classList.add('active');
|
|
1498
|
-
}
|
|
1499
|
-
else {
|
|
1500
|
-
subStepEl.classList.remove('active');
|
|
1501
|
-
}
|
|
1502
|
-
});
|
|
1503
|
-
const prefixMatch = selectedStepId.match(/^([^.]+)\./);
|
|
1504
|
-
const prefix = prefixMatch ? prefixMatch[1] : selectedStepId;
|
|
1505
|
-
this.selectSlideWithPrefix(selectedStepId, prefix);
|
|
1506
|
-
this.gettingStartedService.progressByEvent('stepSelected:' + selectedStepId);
|
|
1507
|
-
}
|
|
1508
|
-
selectSlideWithPrefix(stepId, prefix) {
|
|
1509
|
-
this.editorInput.selectedStep = stepId;
|
|
1510
|
-
const step = this.currentWalkthrough?.steps.find(step => step.id === stepId);
|
|
1511
|
-
if (!step) {
|
|
1512
|
-
return;
|
|
1513
|
-
}
|
|
1514
|
-
const selectedSlide = this.stepsContent.querySelector(`.step-slide[data-step="${prefix}"]`);
|
|
1515
|
-
if (selectedSlide) {
|
|
1516
|
-
const selectedSlideContent = selectedSlide.querySelector('.step-slide-content');
|
|
1517
|
-
this.mediaDisposables.clear();
|
|
1518
|
-
this.stepDisposables.clear();
|
|
1519
|
-
this.buildMediaComponent(this.editorInput.selectedStep);
|
|
1520
|
-
selectedSlideContent?.appendChild(this.stepMediaComponent);
|
|
1521
|
-
setTimeout(() => selectedSlideContent.focus(), 0);
|
|
1522
|
-
}
|
|
1523
|
-
this.gettingStartedService.progressByEvent('stepSelected:' + stepId);
|
|
1524
|
-
this.detailsPageScrollbar?.scanDomNode();
|
|
1525
|
-
this.detailsScrollbar?.scanDomNode();
|
|
1526
|
-
}
|
|
1527
|
-
getCurrentSlideIndex(allSlides) {
|
|
1528
|
-
if (!this.editorInput.selectedStep) {
|
|
1529
|
-
return 0;
|
|
1530
|
-
}
|
|
1531
|
-
const directMatch = allSlides.findIndex(slide => slide.id === this.editorInput.selectedStep);
|
|
1532
|
-
if (directMatch !== -1) {
|
|
1533
|
-
return directMatch;
|
|
1534
|
-
}
|
|
1535
|
-
return allSlides.findIndex(slide => ( slide.steps.some(step => step.id === this.editorInput.selectedStep)));
|
|
1536
|
-
}
|
|
1537
|
-
selectSlide(stepId) {
|
|
1538
|
-
this.editorInput.selectedStep = stepId;
|
|
1539
|
-
const step = this.currentWalkthrough?.steps.find(step => step.id === stepId);
|
|
1540
|
-
if (!step) {
|
|
1541
|
-
return;
|
|
1542
|
-
}
|
|
1543
|
-
const effectiveStepId = stepId.match(/^([^.]+)\./)?.[1] ?? stepId;
|
|
1544
|
-
const selectedSlide = this.stepsContent.querySelector(`.step-slide[data-step="${effectiveStepId}"]`);
|
|
1545
|
-
if (selectedSlide) {
|
|
1546
|
-
const selectedSlideContent = selectedSlide.querySelector('.step-slide-content');
|
|
1547
|
-
this.mediaDisposables.clear();
|
|
1548
|
-
this.stepDisposables.clear();
|
|
1549
|
-
this.buildMediaComponent(this.editorInput.selectedStep);
|
|
1550
|
-
selectedSlideContent?.appendChild(this.stepMediaComponent);
|
|
1551
|
-
setTimeout(() => selectedSlideContent.focus(), 0);
|
|
1552
|
-
}
|
|
1553
|
-
this.gettingStartedService.progressByEvent('stepSelected:' + stepId);
|
|
1554
|
-
this.detailsPageScrollbar?.scanDomNode();
|
|
1555
|
-
this.detailsScrollbar?.scanDomNode();
|
|
1556
|
-
}
|
|
1557
1172
|
buildCategorySlide(categoryID, selectedStep) {
|
|
1558
|
-
this.container.classList.remove('newSlide');
|
|
1559
1173
|
if (this.detailsScrollbar) {
|
|
1560
1174
|
this.detailsScrollbar.dispose();
|
|
1561
1175
|
}
|
|
@@ -1564,8 +1178,7 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1564
1178
|
});
|
|
1565
1179
|
this.detailsPageDisposables.clear();
|
|
1566
1180
|
this.mediaDisposables.clear();
|
|
1567
|
-
const category =
|
|
1568
|
-
this.gettingStartedCategories.find(category => category.id === categoryID);
|
|
1181
|
+
const category = this.gettingStartedCategories.find(category => category.id === categoryID);
|
|
1569
1182
|
if (!category) {
|
|
1570
1183
|
throw Error('could not find category with ID ' + categoryID);
|
|
1571
1184
|
}
|
|
@@ -1607,8 +1220,8 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1607
1220
|
'role': 'checkbox',
|
|
1608
1221
|
'aria-checked': step.done ? 'true' : 'false',
|
|
1609
1222
|
'aria-label': step.done
|
|
1610
|
-
? ( localize(
|
|
1611
|
-
: ( localize(
|
|
1223
|
+
? ( localize(12529, "Checkbox for Step {0}: Completed", step.title))
|
|
1224
|
+
: ( localize(12530, "Checkbox for Step {0}: Not completed", step.title)),
|
|
1612
1225
|
});
|
|
1613
1226
|
const container = $('.step-description-container', { 'x-step-description-for': step.id });
|
|
1614
1227
|
this.buildMarkdownDescription(container, step.description);
|
|
@@ -1616,10 +1229,10 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1616
1229
|
reset(stepTitle, ...renderLabelWithIcons(step.title));
|
|
1617
1230
|
const stepDescription = $('.step-container', {}, stepTitle, container);
|
|
1618
1231
|
if (step.media.type === 'image') {
|
|
1619
|
-
stepDescription.appendChild($('.image-description', { 'aria-label': ( localize(
|
|
1232
|
+
stepDescription.appendChild($('.image-description', { 'aria-label': ( localize(12555, "Image showing {0}", step.media.altText)) }));
|
|
1620
1233
|
}
|
|
1621
1234
|
else if (step.media.type === 'video') {
|
|
1622
|
-
stepDescription.appendChild($('.video-description', { 'aria-label': ( localize(
|
|
1235
|
+
stepDescription.appendChild($('.video-description', { 'aria-label': ( localize(12556, "Video showing {0}", step.media.altText)) }));
|
|
1623
1236
|
}
|
|
1624
1237
|
return $('button.getting-started-step', {
|
|
1625
1238
|
'x-dispatch': 'selectTask:' + step.id,
|
|
@@ -1639,8 +1252,8 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1639
1252
|
}
|
|
1640
1253
|
}));
|
|
1641
1254
|
const showNextCategory = this.gettingStartedCategories.find(_category => _category.id === category.next);
|
|
1642
|
-
const stepsContainer = $('.getting-started-detail-container', { 'role': 'list' }, stepListContainer, $('.done-next-container', {}, $('button.button-link.all-done', { 'x-dispatch': 'allDone' }, $('span.codicon.codicon-check-all'), ( localize(
|
|
1643
|
-
? [$('button.button-link.next', { 'x-dispatch': 'nextSection' }, ( localize(
|
|
1255
|
+
const stepsContainer = $('.getting-started-detail-container', { 'role': 'list' }, stepListContainer, $('.done-next-container', {}, $('button.button-link.all-done', { 'x-dispatch': 'allDone' }, $('span.codicon.codicon-check-all'), ( localize(12557, "Mark Done"))), ...(showNextCategory
|
|
1256
|
+
? [$('button.button-link.next', { 'x-dispatch': 'nextSection' }, ( localize(12558, "Next Section")), $('span.codicon.codicon-arrow-right'))]
|
|
1644
1257
|
: [])));
|
|
1645
1258
|
this.detailsScrollbar = this._register(( new DomScrollableElement(stepsContainer, { className: 'steps-container' })));
|
|
1646
1259
|
const stepListComponent = this.detailsScrollbar.getDomNode();
|
|
@@ -1657,12 +1270,12 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1657
1270
|
}
|
|
1658
1271
|
buildTelemetryFooter(parent) {
|
|
1659
1272
|
const mdRenderer = this.instantiationService.createInstance(MarkdownRenderer, {});
|
|
1660
|
-
const privacyStatementCopy = ( localize(
|
|
1273
|
+
const privacyStatementCopy = ( localize(12559, "privacy statement"));
|
|
1661
1274
|
const privacyStatementButton = `[${privacyStatementCopy}](command:workbench.action.openPrivacyStatementUrl)`;
|
|
1662
|
-
const optOutCopy = ( localize(
|
|
1275
|
+
const optOutCopy = ( localize(12560, "opt out"));
|
|
1663
1276
|
const optOutButton = `[${optOutCopy}](command:settings.filterByTelemetry)`;
|
|
1664
1277
|
const text = ( localize(
|
|
1665
|
-
|
|
1278
|
+
12561,
|
|
1666
1279
|
"{0} collects usage data. Read our {1} and learn how to {2}.",
|
|
1667
1280
|
this.productService.nameShort,
|
|
1668
1281
|
privacyStatementButton,
|
|
@@ -1733,13 +1346,8 @@ let GettingStartedPage = class GettingStartedPage extends EditorPane {
|
|
|
1733
1346
|
slideManager.classList.remove('showCategories');
|
|
1734
1347
|
const prevButton = this.container.querySelector('.prev-button.button-link');
|
|
1735
1348
|
prevButton.style.display = this.editorInput.showWelcome || this.prevWalkthrough ? 'block' : 'none';
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
}
|
|
1739
|
-
else {
|
|
1740
|
-
const moreTextElement = prevButton.querySelector('.moreText');
|
|
1741
|
-
moreTextElement.textContent = firstLaunch ? ( localize(12350, "Welcome")) : ( localize(12317, "Go Back"));
|
|
1742
|
-
}
|
|
1349
|
+
const moreTextElement = prevButton.querySelector('.moreText');
|
|
1350
|
+
moreTextElement.textContent = firstLaunch ? ( localize(12562, "Welcome")) : ( localize(12535, "Go Back"));
|
|
1743
1351
|
this.container.querySelector('.gettingStartedSlideDetails').querySelectorAll('button').forEach(button => button.disabled = false);
|
|
1744
1352
|
this.container.querySelector('.gettingStartedSlideCategories').querySelectorAll('button').forEach(button => button.disabled = true);
|
|
1745
1353
|
this.container.querySelector('.gettingStartedSlideCategories').querySelectorAll('input').forEach(button => button.disabled = true);
|