Skip to content

Commit ca38c8d

Browse files
committed
Add sorting functionality for demo files and update related components #96
1 parent 32a0331 commit ca38c8d

File tree

8 files changed

+43
-42
lines changed

8 files changed

+43
-42
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- [#87](https://github.com/estruyf/vscode-demo-time/issues/87): Added new walkthrough for Visual Studio Code
66
- [#92](https://github.com/estruyf/vscode-demo-time/issues/92): Added new `demoTime.customTheme` setting for global custom themes
7+
- [#96](https://github.com/estruyf/vscode-demo-time/issues/96): Correctly sorting the demo files in the tree view
78

89
## [1.1.0] - 2025-04-09
910

src/panels/DemoPanel.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Action, DemoFileCache, DemoFiles, Demos, Subscription } from "../models
55
import { ActionTreeItem, ActionTreeviewProvider } from "../providers/ActionTreeviewProvider";
66
import { DemoRunner } from "../services/DemoRunner";
77
import { COMMAND } from "../constants";
8-
import { parseWinPath, setContext } from "../utils";
8+
import { parseWinPath, setContext, sortFiles } from "../utils";
99
import { DemoStatusBar } from "../services/DemoStatusBar";
1010
import { Extension } from "../services/Extension";
1111

@@ -55,21 +55,7 @@ export class DemoPanel {
5555
return [];
5656
}
5757

58-
let demoKeys = Object.keys(demoFiles);
59-
demoKeys = demoKeys.sort((aPath, bPath) => {
60-
aPath = aPath.toLowerCase();
61-
bPath = bPath.toLowerCase();
62-
63-
if (aPath < bPath) {
64-
return -1;
65-
}
66-
67-
if (aPath > bPath) {
68-
return 1;
69-
}
70-
71-
return 0;
72-
});
58+
const demoKeys = sortFiles(demoFiles);
7359

7460
const accountCommands: ActionTreeItem[] = [];
7561

src/services/FileProvider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Extension } from "./Extension";
33
import { DemoFiles, Demos } from "../models";
44
import { Config, General } from "../constants";
55
import { parse as jsonParse } from "jsonc-parser";
6-
import { createDemoFile, readFile, sanitizeFileName, writeFile } from "../utils";
6+
import { createDemoFile, readFile, sanitizeFileName, sortFiles, writeFile } from "../utils";
77
import { Preview } from "../preview/Preview";
88

99
export class FileProvider {
@@ -76,7 +76,7 @@ export class FileProvider {
7676
return;
7777
}
7878

79-
const files = Object.keys(demoFiles).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
79+
const files = sortFiles(demoFiles);
8080
const demoFileOptions = files.map((path) => {
8181
return {
8282
label: (demoFiles as any)[path].title,
@@ -107,7 +107,7 @@ export class FileProvider {
107107
} else if (!demoFilePick.description) {
108108
return;
109109
} else {
110-
demoFilePath = Object.keys(demoFiles).find((path) => path.endsWith(demoFilePick.description as string));
110+
demoFilePath = sortFiles(demoFiles).find((path) => path.endsWith(demoFilePick.description as string));
111111
if (!demoFilePath) {
112112
return;
113113
}

src/services/PdfExportService.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Notifications } from "./Notifications";
55
import { Action, Step, Subscription } from "../models";
66
import { Extension } from "./Extension";
77
import { FileProvider, Logger } from ".";
8-
import { convertTemplateToHtml, getTheme, readFile, transformMarkdown, writeFile } from "../utils";
8+
import { convertTemplateToHtml, getTheme, readFile, sortFiles, transformMarkdown, writeFile } from "../utils";
99
import { commands, Uri, workspace, WorkspaceFolder, window, ProgressLocation, env, ColorThemeKind } from "vscode";
1010
import { Page } from "playwright-chromium";
1111
import { COMMAND, Config, General, SlideLayout } from "../constants";
@@ -60,14 +60,12 @@ export class PdfExportService {
6060
}
6161

6262
// Sort the demo files by their paths
63-
demoFiles = Object.keys(demoFiles)
64-
.sort()
65-
.reduce((sortedFiles, key) => {
66-
if (demoFiles) {
67-
sortedFiles[key] = demoFiles[key];
68-
}
69-
return sortedFiles;
70-
}, {} as typeof demoFiles);
63+
demoFiles = sortFiles(demoFiles).reduce((sortedFiles, key) => {
64+
if (demoFiles) {
65+
sortedFiles[key] = demoFiles[key];
66+
}
67+
return sortedFiles;
68+
}, {} as typeof demoFiles);
7169

7270
// Get all slide actions
7371
const slideActions: Step[] = [];

src/utils/getNextDemoFile.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1+
import { sortFiles } from ".";
12
import { DemoFiles, Demos } from "../models";
23
import { FileProvider } from "../services/FileProvider";
34

45
export const getNextDemoFile = async (demoFile?: {
56
filePath: string;
6-
}): Promise<{
7-
filePath: string;
8-
demo: Demos;
9-
} | undefined> => {
7+
}): Promise<
8+
| {
9+
filePath: string;
10+
demo: Demos;
11+
}
12+
| undefined
13+
> => {
1014
if (!demoFile) {
1115
return;
1216
}
1317

1418
// Get the next demo file
15-
const demoFiles: DemoFiles = await FileProvider.getFiles() || {};
16-
const files = Object.keys(demoFiles).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
19+
const demoFiles: DemoFiles = (await FileProvider.getFiles()) || {};
20+
const files = sortFiles(demoFiles);
1721
const fileIdx = files.findIndex((file) => file === demoFile.filePath);
1822
const nextIdx = fileIdx + 1;
1923

@@ -26,4 +30,4 @@ export const getNextDemoFile = async (demoFile?: {
2630
filePath: nextFile,
2731
demo: demoFiles[nextFile],
2832
};
29-
};
33+
};

src/utils/getPreviousDemoFile.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1+
import { sortFiles } from ".";
12
import { DemoFiles, Demos } from "../models";
23
import { FileProvider } from "../services/FileProvider";
34

45
export const getPreviousDemoFile = async (demoFile?: {
56
filePath: string;
6-
}): Promise<{
7-
filePath: string;
8-
demo: Demos;
9-
} | undefined> => {
7+
}): Promise<
8+
| {
9+
filePath: string;
10+
demo: Demos;
11+
}
12+
| undefined
13+
> => {
1014
if (!demoFile) {
1115
return;
1216
}
1317

1418
// Get the next demo file
15-
const demoFiles: DemoFiles = await FileProvider.getFiles() || {};
16-
const files = Object.keys(demoFiles).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
19+
const demoFiles: DemoFiles = (await FileProvider.getFiles()) || {};
20+
const files = sortFiles(demoFiles);
1721
const fileIdx = files.findIndex((file) => file === demoFile.filePath);
1822
const previousIdx = fileIdx - 1;
1923

@@ -26,4 +30,4 @@ export const getPreviousDemoFile = async (demoFile?: {
2630
filePath: nextFile,
2731
demo: demoFiles[nextFile],
2832
};
29-
};
33+
};

src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export * from "./replaceContent";
4343
export * from "./sanitizeFileName";
4444
export * from "./setContext";
4545
export * from "./sleep";
46+
export * from "./sortFiles";
4647
export * from "./togglePresentationView";
4748
export * from "./transformMarkdown";
4849
export * from "./updateConfig";

src/utils/sortFiles.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { DemoFiles } from "../models";
2+
3+
export const sortFiles = (files: DemoFiles) => {
4+
return Object.keys(files).sort((a, b) =>
5+
a.toLowerCase().localeCompare(b.toLowerCase(), undefined, { numeric: true, sensitivity: "base" })
6+
);
7+
};

0 commit comments

Comments
 (0)