@lvce-editor/extension-detail-view 3.39.0 → 3.41.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.
@@ -173,6 +173,7 @@ const H2 = 22;
173
173
  const Dd = 43;
174
174
  const Dl = 44;
175
175
  const Li = 48;
176
+ const P = 50;
176
177
  const Pre = 51;
177
178
  const A = 53;
178
179
  const Ul = 60;
@@ -191,6 +192,7 @@ const VirtualDomElements = {
191
192
  H2,
192
193
  Img,
193
194
  Li,
195
+ P,
194
196
  Pre,
195
197
  Span,
196
198
  TBody,
@@ -260,11 +262,16 @@ const TableCell = 'TableCell';
260
262
  const TableHeading = 'TableHeading';
261
263
  const Viewlet = 'Viewlet';
262
264
 
265
+ const li = {
266
+ type: VirtualDomElements.Li,
267
+ childCount: 1
268
+ };
269
+ const code = {
270
+ type: VirtualDomElements.Code,
271
+ childCount: 1
272
+ };
263
273
  const getActivationEventVirtualDom = event => {
264
- return [{
265
- type: VirtualDomElements.Li,
266
- childCount: 1
267
- }, text(event)];
274
+ return [li, code, text(event)];
268
275
  };
269
276
 
270
277
  const getFeatureContentHeadingVirtualDom = heading => {
@@ -509,6 +516,19 @@ class FeatureNotFoundError extends Error {
509
516
  }
510
517
  }
511
518
 
519
+ const getFeatureUnsupportedVirtualDom = state => {
520
+ return [{
521
+ type: VirtualDomElements.Div,
522
+ childCount: 2
523
+ }, {
524
+ type: VirtualDomElements.H1,
525
+ childCount: 1
526
+ }, text('Unsupported Feature'), {
527
+ type: VirtualDomElements.P,
528
+ childCount: 1
529
+ }, text('Selected feature is unknown or unsupported')];
530
+ };
531
+
512
532
  const features = Object.create(null);
513
533
  const register$1 = feature => {
514
534
  features[feature.id] = feature;
@@ -535,7 +555,7 @@ const getFeatureDetailsHandler = featureName => {
535
555
  const getFeatureVirtualDomHandler = featureName => {
536
556
  const feature = features[featureName];
537
557
  if (!feature) {
538
- throw new FeatureNotFoundError(featureName);
558
+ return getFeatureUnsupportedVirtualDom;
539
559
  }
540
560
  return feature.getVirtualDom;
541
561
  };
@@ -2078,9 +2098,10 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
2078
2098
  badge: '',
2079
2099
  baseUrl: '',
2080
2100
  builtinExtensionsBadgeEnabled: true,
2101
+ buttons: [],
2081
2102
  categories: [],
2082
- changelogVirtualDom: [],
2083
2103
  changelogScrollTop: 0,
2104
+ changelogVirtualDom: [],
2084
2105
  commands: [],
2085
2106
  description: '',
2086
2107
  detailsVirtualDom: [],
@@ -2091,10 +2112,10 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
2091
2112
  extensionVersion: '',
2092
2113
  features: [],
2093
2114
  featuresVirtualDom: [],
2115
+ focus: 0,
2094
2116
  folderSize: 0,
2095
2117
  hasColorTheme: false,
2096
2118
  iconSrc: '',
2097
- isBuiltin: false,
2098
2119
  jsonValidation: [],
2099
2120
  name: '',
2100
2121
  platform,
@@ -2111,11 +2132,12 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
2111
2132
  showAdditionalDetailsBreakpoint: 600,
2112
2133
  sizeOnDisk: 0,
2113
2134
  sizeValue: 0,
2135
+ tabs: [],
2114
2136
  themesMarkdownDom: [],
2115
2137
  uri,
2116
2138
  webViews: [],
2117
2139
  width,
2118
- focus: 0
2140
+ readmeUrl: ''
2119
2141
  };
2120
2142
  set$1(uid, state, state);
2121
2143
  };
@@ -2276,8 +2298,7 @@ const {
2276
2298
  set,
2277
2299
  setColorTheme: setColorTheme$1,
2278
2300
  uninstallExtension,
2279
- sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$1
2280
- } = RendererWorker;
2301
+ sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$1} = RendererWorker;
2281
2302
 
2282
2303
  const setColorTheme = id => {
2283
2304
  return setColorTheme$1(id);
@@ -2346,6 +2367,15 @@ const handleIconError = state => {
2346
2367
  };
2347
2368
  };
2348
2369
 
2370
+ const handleScroll = (state, scrollTop) => {
2371
+ const newScrollTop = Math.max(0, scrollTop);
2372
+ return {
2373
+ ...state,
2374
+ readmeScrollTop: newScrollTop,
2375
+ scrollSource: User
2376
+ };
2377
+ };
2378
+
2349
2379
  const readFile = async uri => {
2350
2380
  return readFile$1(uri);
2351
2381
  };
@@ -2379,17 +2409,25 @@ const loadChangelogContent = async path => {
2379
2409
  const selectTabChangelog = async state => {
2380
2410
  const {
2381
2411
  extension,
2382
- baseUrl
2412
+ baseUrl,
2413
+ tabs
2383
2414
  } = state;
2384
2415
  const changelogContent = await loadChangelogContent(extension.path); // TODO use uri
2385
2416
  const changelogMarkdownHtml = await renderMarkdown(changelogContent, {
2386
2417
  baseUrl
2387
2418
  });
2388
2419
  const changelogDom = await getMarkdownVirtualDom(changelogMarkdownHtml);
2420
+ const newTabs = tabs.map(tab => {
2421
+ return {
2422
+ ...tab,
2423
+ selected: tab.name === Changelog
2424
+ };
2425
+ });
2389
2426
  return {
2390
2427
  ...state,
2391
2428
  selectedTab: Changelog,
2392
- changelogVirtualDom: changelogDom
2429
+ changelogVirtualDom: changelogDom,
2430
+ tabs: newTabs
2393
2431
  };
2394
2432
  };
2395
2433
 
@@ -2397,9 +2435,8 @@ const selectTabDefault = async state => {
2397
2435
  return state;
2398
2436
  };
2399
2437
 
2400
- const loadReadmeContent = async path => {
2438
+ const loadReadmeContent = async readmeUrl => {
2401
2439
  try {
2402
- const readmeUrl = join(path, 'README.md');
2403
2440
  const readmeContent = await readFile(readmeUrl);
2404
2441
  return readmeContent;
2405
2442
  } catch (error) {
@@ -2415,18 +2452,26 @@ const loadReadmeContent = async path => {
2415
2452
 
2416
2453
  const selectTabDetails = async state => {
2417
2454
  const {
2418
- extension,
2419
- baseUrl
2455
+ baseUrl,
2456
+ readmeUrl,
2457
+ tabs
2420
2458
  } = state;
2421
- const readmeContent = await loadReadmeContent(extension.path);
2459
+ const readmeContent = await loadReadmeContent(readmeUrl);
2422
2460
  const readmeHtml = await renderMarkdown(readmeContent, {
2423
2461
  baseUrl
2424
2462
  });
2425
2463
  const detailsDom = await getMarkdownVirtualDom(readmeHtml);
2464
+ const newTabs = tabs.map(tab => {
2465
+ return {
2466
+ ...tab,
2467
+ selected: tab.name === Details
2468
+ };
2469
+ });
2426
2470
  return {
2427
2471
  ...state,
2428
2472
  selectedTab: Details,
2429
- detailsVirtualDom: detailsDom
2473
+ detailsVirtualDom: detailsDom,
2474
+ tabs: newTabs
2430
2475
  };
2431
2476
  };
2432
2477
 
@@ -2435,15 +2480,26 @@ const selectTabFeatures = async state => {
2435
2480
  extension,
2436
2481
  baseUrl,
2437
2482
  selectedFeature,
2438
- features
2483
+ features,
2484
+ tabs
2439
2485
  } = state;
2486
+ if (features.length === 0) {
2487
+ return state;
2488
+ }
2440
2489
  const actualSelectedFeature = selectedFeature || Theme;
2441
2490
  const fn = getFeatureDetailsHandler(actualSelectedFeature);
2442
2491
  const partialNewState = await fn(extension, baseUrl);
2492
+ const newTabs = tabs.map(tab => {
2493
+ return {
2494
+ ...tab,
2495
+ selected: tab.name === Features
2496
+ };
2497
+ });
2443
2498
  return {
2444
2499
  ...state,
2445
2500
  selectedTab: Features,
2446
2501
  selectedFeature: features[0].id || '',
2502
+ tabs: newTabs,
2447
2503
  ...partialNewState
2448
2504
  };
2449
2505
  };
@@ -2470,15 +2526,6 @@ const handleTabsClick = (state, name) => {
2470
2526
  return selectTab(state, name);
2471
2527
  };
2472
2528
 
2473
- const handleWheel = (state, deltaX, deltaY) => {
2474
- const newScrollTop = Math.max(0, state.readmeScrollTop + deltaY);
2475
- return {
2476
- ...state,
2477
- readmeScrollTop: newScrollTop,
2478
- scrollSource: User
2479
- };
2480
- };
2481
-
2482
2529
  const sendMessagePortToMarkdownWorker = async port => {
2483
2530
  await sendMessagePortToMarkdownWorker$1(port, 0);
2484
2531
  };
@@ -2505,6 +2552,11 @@ const initialize = async () => {
2505
2552
  // TODO create connection to file system worker
2506
2553
  };
2507
2554
 
2555
+ const existsFile = async uri => {
2556
+ // TODO ask file system worker
2557
+ return true;
2558
+ };
2559
+
2508
2560
  const Web = 1;
2509
2561
  const Electron = 2;
2510
2562
  const Remote = 3;
@@ -2560,7 +2612,152 @@ const getBaseUrl = (extensionPath, platform) => {
2560
2612
  }
2561
2613
  };
2562
2614
 
2615
+ const getExtensionDetailButtons = (hasColorTheme, isBuiltin) => {
2616
+ const allActions = [{
2617
+ label: setColorTheme$3(),
2618
+ onClick: HandleClickSetColorTheme,
2619
+ enabled: hasColorTheme,
2620
+ name: SetColorTheme
2621
+ }, {
2622
+ label: disable(),
2623
+ onClick: HandleClickDisable,
2624
+ enabled: true,
2625
+ name: Disable
2626
+ }, {
2627
+ label: uninstall(),
2628
+ onClick: HandleClickUninstall,
2629
+ enabled: !isBuiltin,
2630
+ name: Uninstall
2631
+ }];
2632
+ return allActions;
2633
+ };
2634
+
2635
+ const getExtensionIdFromUri = uri => {
2636
+ const id = uri.slice('extension-detail://'.length);
2637
+ return id;
2638
+ };
2639
+
2640
+ const getTabs = (selectedTab, hasReadme, hasFeatures, hasChangelog) => {
2641
+ const tabs = [{
2642
+ label: details(),
2643
+ name: Details,
2644
+ selected: selectedTab === Details,
2645
+ enabled: hasReadme
2646
+ }, {
2647
+ label: features$1(),
2648
+ name: Features,
2649
+ selected: selectedTab === Features,
2650
+ enabled: hasFeatures
2651
+ }, {
2652
+ label: changelog(),
2653
+ name: Changelog,
2654
+ selected: selectedTab === Changelog,
2655
+ enabled: hasChangelog
2656
+ }];
2657
+ return tabs;
2658
+ };
2659
+
2660
+ const Small = 1;
2661
+ const Normal = 2;
2662
+ const Large = 3;
2663
+
2664
+ const getViewletSize = width => {
2665
+ if (width < 180) {
2666
+ return Small;
2667
+ }
2668
+ if (width < 768) {
2669
+ return Normal;
2670
+ }
2671
+ return Large;
2672
+ };
2673
+
2674
+ const isLanguageBasicsExtension = extension => {
2675
+ return extension.name && extension.name.startsWith('Language Basics');
2676
+ };
2677
+
2678
+ const isThemeExtension = extension => {
2679
+ return extension.name && extension.name.endsWith(' Theme');
2680
+ };
2681
+
2682
+ const getIcon = (extension, platform, assetDir) => {
2683
+ if (!extension) {
2684
+ return extensionDefaultIcon(assetDir);
2685
+ }
2686
+ if (!extension.path || !extension.icon) {
2687
+ if (isLanguageBasicsExtension(extension)) {
2688
+ return extensionLanguageBasics(assetDir);
2689
+ }
2690
+ if (isThemeExtension(extension)) {
2691
+ return extensionTheme(assetDir);
2692
+ }
2693
+ return extensionDefaultIcon(assetDir);
2694
+ }
2695
+ if (platform === Remote || platform === Electron) {
2696
+ if (extension.builtin) {
2697
+ return `${assetDir}/extensions/${extension.id}/${extension.icon}`;
2698
+ }
2699
+ return `/remote/${extension.path}/${extension.icon}`; // TODO support windows paths
2700
+ }
2701
+ return '';
2702
+ };
2703
+
2704
+ const getDescription = extension => {
2705
+ if (!extension || !extension.description) {
2706
+ return 'n/a';
2707
+ }
2708
+ return extension.description;
2709
+ };
2710
+
2711
+ const getName = extension => {
2712
+ if (extension && extension.name) {
2713
+ return extension.name;
2714
+ }
2715
+ if (extension && extension.id) {
2716
+ return extension.id;
2717
+ }
2718
+ return 'n/a';
2719
+ };
2720
+
2721
+ const getBadge = (builtin, badgeEnabled) => {
2722
+ if (builtin && badgeEnabled) {
2723
+ return 'builtin';
2724
+ }
2725
+ return '';
2726
+ };
2727
+
2728
+ const hasColorThemes = extension => {
2729
+ return Boolean(extension && extension.colorThemes && extension.colorThemes.length > 0);
2730
+ };
2731
+
2732
+ const loadHeaderContent = (state, platform, extension) => {
2733
+ const {
2734
+ assetDir,
2735
+ builtinExtensionsBadgeEnabled
2736
+ } = state;
2737
+ const iconSrc = getIcon(extension, platform, assetDir);
2738
+ const description = getDescription(extension);
2739
+ const name = getName(extension);
2740
+ const extensionUri = extension.uri || extension.path;
2741
+ const extensionId = extension?.id || 'n/a';
2742
+ const extensionVersion = extension?.version || 'n/a';
2743
+ const hasColorTheme = hasColorThemes(extension);
2744
+ const isBuiltin = extension?.builtin;
2745
+ const badge = getBadge(isBuiltin, builtinExtensionsBadgeEnabled);
2746
+ return {
2747
+ badge,
2748
+ description,
2749
+ extension,
2750
+ extensionId,
2751
+ extensionUri,
2752
+ extensionVersion,
2753
+ hasColorTheme,
2754
+ iconSrc,
2755
+ name
2756
+ };
2757
+ };
2758
+
2563
2759
  const getCategories = () => {
2760
+ // TODO
2564
2761
  return [{
2565
2762
  id: 'themes',
2566
2763
  label: 'Themes'
@@ -2660,24 +2857,6 @@ const getDisplaySize = size => {
2660
2857
  });
2661
2858
  };
2662
2859
 
2663
- const getEntries = () => {
2664
- return [{
2665
- key: 'Identifier',
2666
- value: 'abc'
2667
- }, {
2668
- key: 'Version',
2669
- value: '1.9.5'
2670
- }, {
2671
- key: 'Last Updated',
2672
- value: 'n/a'
2673
- }];
2674
- };
2675
-
2676
- const getExtensionIdFromUri = uri => {
2677
- const id = uri.slice('extension-detail://'.length);
2678
- return id;
2679
- };
2680
-
2681
2860
  const getFolderSize = async uri => {
2682
2861
  if (!uri) {
2683
2862
  throw new VError(`uri is required`);
@@ -2689,128 +2868,77 @@ const getFolderSize = async uri => {
2689
2868
  }
2690
2869
  };
2691
2870
 
2692
- const getResources = () => {
2693
- return [{
2694
- label: 'Marketplace',
2695
- url: '#'
2871
+ const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri) => {
2872
+ const entries = [{
2873
+ key: 'Identifier',
2874
+ value: extensionId,
2875
+ odd: true,
2876
+ code: true
2696
2877
  }, {
2697
- label: 'Issues',
2698
- url: '#'
2878
+ key: 'Version',
2879
+ value: extensionVersion,
2880
+ code: true
2699
2881
  }, {
2700
- label: 'Repository',
2701
- url: '#'
2882
+ key: 'Last Updated',
2883
+ value: 'n/a',
2884
+ odd: true
2702
2885
  }, {
2703
- label: 'License',
2704
- url: '#'
2886
+ key: 'Size',
2887
+ value: displaySize,
2888
+ onClick: HandleClickSize,
2889
+ title: extensionUri
2705
2890
  }];
2891
+ return entries;
2706
2892
  };
2707
2893
 
2708
- const getSecondEntries = () => {
2894
+ const getMarketplaceEntries = isBuiltin => {
2895
+ if (isBuiltin) {
2896
+ return [];
2897
+ }
2709
2898
  return [{
2710
2899
  key: 'Published',
2711
- value: 'n/a'
2900
+ value: 'n/a',
2901
+ odd: true
2712
2902
  }, {
2713
2903
  key: 'Last Released',
2714
2904
  value: 'n/a'
2715
2905
  }];
2716
2906
  };
2717
2907
 
2718
- const Small = 1;
2719
- const Normal = 2;
2720
- const Large = 3;
2721
-
2722
- const getViewletSize = width => {
2723
- if (width < 180) {
2724
- return Small;
2725
- }
2726
- if (width < 768) {
2727
- return Normal;
2728
- }
2729
- return Large;
2730
- };
2731
-
2732
- const isLanguageBasicsExtension = extension => {
2733
- return extension.name && extension.name.startsWith('Language Basics');
2734
- };
2735
-
2736
- const isThemeExtension = extension => {
2737
- return extension.name && extension.name.endsWith(' Theme');
2738
- };
2739
-
2740
- const getIcon = (extension, platform, assetDir) => {
2741
- if (!extension) {
2742
- return extensionDefaultIcon(assetDir);
2743
- }
2744
- if (!extension.path || !extension.icon) {
2745
- if (isLanguageBasicsExtension(extension)) {
2746
- return extensionLanguageBasics(assetDir);
2747
- }
2748
- if (isThemeExtension(extension)) {
2749
- return extensionTheme(assetDir);
2750
- }
2751
- return extensionDefaultIcon(assetDir);
2752
- }
2753
- if (platform === Remote || platform === Electron) {
2754
- if (extension.builtin) {
2755
- return `${assetDir}/extensions/${extension.id}/${extension.icon}`;
2756
- }
2757
- return `/remote/${extension.path}/${extension.icon}`; // TODO support windows paths
2758
- }
2759
- return '';
2760
- };
2761
-
2762
- const getDescription = extension => {
2763
- if (!extension || !extension.description) {
2764
- return 'n/a';
2765
- }
2766
- return extension.description;
2767
- };
2768
-
2769
- const getName = extension => {
2770
- if (extension && extension.name) {
2771
- return extension.name;
2772
- }
2773
- if (extension && extension.id) {
2774
- return extension.id;
2775
- }
2776
- return 'n/a';
2777
- };
2778
-
2779
- const getBadge = (builtin, badgeEnabled) => {
2780
- if (builtin && badgeEnabled) {
2781
- return 'builtin';
2908
+ const getResources = isBuiltin => {
2909
+ if (isBuiltin) {
2910
+ return [];
2782
2911
  }
2783
- return '';
2784
- };
2785
-
2786
- const hasColorThemes = extension => {
2787
- return Boolean(extension && extension.colorThemes && extension.colorThemes.length > 0);
2912
+ // TODO
2913
+ return [{
2914
+ label: 'Marketplace',
2915
+ url: '#'
2916
+ }, {
2917
+ label: 'Issues',
2918
+ url: '#'
2919
+ }, {
2920
+ label: 'Repository',
2921
+ url: '#'
2922
+ }, {
2923
+ label: 'License',
2924
+ url: '#'
2925
+ }];
2788
2926
  };
2789
2927
 
2790
- const loadHeaderContent = (state, platform, extension) => {
2791
- const {
2792
- assetDir,
2793
- builtinExtensionsBadgeEnabled
2794
- } = state;
2795
- const iconSrc = getIcon(extension, platform, assetDir);
2796
- const description = getDescription(extension);
2797
- const name = getName(extension);
2798
- const extensionUri = extension.uri || extension.path;
2799
- const extensionId = extension?.id || 'n/a';
2800
- const extensionVersion = extension?.version || 'n/a';
2801
- const hasColorTheme = hasColorThemes(extension);
2802
- const isBuiltin = extension?.builtin;
2803
- const badge = getBadge(isBuiltin, builtinExtensionsBadgeEnabled);
2928
+ const loadSideBarContent = async (extensionId, extensionVersion, extensionUri, isBuiltin) => {
2929
+ const folderSize = await getFolderSize(extensionUri);
2930
+ const displaySize = getDisplaySize(folderSize);
2931
+ const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
2932
+ const marketplaceEntries = getMarketplaceEntries(isBuiltin);
2933
+ const categories = getCategories();
2934
+ const resources = getResources(isBuiltin);
2804
2935
  return {
2805
- badge,
2806
- description,
2807
- extension,
2808
- extensionId,
2809
- extensionUri,
2810
- extensionVersion,
2811
- hasColorTheme,
2812
- iconSrc,
2813
- name
2936
+ installationEntries,
2937
+ marketplaceEntries,
2938
+ displaySize,
2939
+ categories,
2940
+ resources,
2941
+ folderSize
2814
2942
  };
2815
2943
  };
2816
2944
 
@@ -2876,7 +3004,11 @@ const loadContent = async (state, platform, savedState) => {
2876
3004
  iconSrc,
2877
3005
  name
2878
3006
  } = headerData;
2879
- const readmeContent = await loadReadmeContent(extension.path);
3007
+ const readmeUrl = join(extension.path, 'README.md');
3008
+ join(extension.path, 'CHANGELOG.md');
3009
+ const hasReadme = await existsFile();
3010
+ const hasChangelog = await existsFile();
3011
+ const readmeContent = await loadReadmeContent(readmeUrl);
2880
3012
  const baseUrl = getBaseUrl(extension.path, platform);
2881
3013
  const readmeHtml = await renderMarkdown(readmeContent, {
2882
3014
  baseUrl
@@ -2884,30 +3016,40 @@ const loadContent = async (state, platform, savedState) => {
2884
3016
  const detailsVirtualDom = await getMarkdownVirtualDom(readmeHtml, {
2885
3017
  scrollToTopEnabled: true
2886
3018
  });
3019
+ const isBuiltin = extension?.isBuiltin;
3020
+ const buttons = getExtensionDetailButtons(hasColorTheme, isBuiltin);
3021
+ const enabledButtons = buttons.filter(button => button.enabled);
2887
3022
  const size = getViewletSize(width);
2888
3023
  const {
2889
3024
  selectedFeature,
2890
3025
  selectedTab,
2891
- readmeScrollTop
3026
+ readmeScrollTop,
3027
+ changelogScrollTop
2892
3028
  } = restoreState(savedState);
2893
3029
  const features = getFeatures(selectedFeature || Theme, extension);
2894
- const folderSize = await getFolderSize(extensionUri);
2895
- const displaySize = getDisplaySize(size);
2896
- const entries = getEntries();
2897
- const secondEntries = getSecondEntries();
2898
- const categories = getCategories();
2899
- const resources = getResources();
3030
+ const hasFeatures = features.length > 0;
3031
+ const tabs = getTabs(selectedTab, hasReadme, hasFeatures, hasChangelog);
3032
+ const enabledTabs = tabs.filter(tab => tab.enabled);
2900
3033
  const sizeValue = getViewletSize(width || 0);
2901
- const isBuiltin = extension?.builtin;
3034
+ const {
3035
+ installationEntries,
3036
+ marketplaceEntries,
3037
+ displaySize,
3038
+ categories,
3039
+ resources,
3040
+ folderSize
3041
+ } = await loadSideBarContent(extensionId, extensionVersion, extensionUri, isBuiltin);
2902
3042
  return {
2903
3043
  ...state,
2904
3044
  badge,
2905
3045
  baseUrl,
3046
+ buttons: enabledButtons,
2906
3047
  categories,
3048
+ changelogScrollTop,
2907
3049
  description,
2908
3050
  detailsVirtualDom,
2909
3051
  displaySize,
2910
- entries,
3052
+ entries: installationEntries,
2911
3053
  extension,
2912
3054
  extensionId,
2913
3055
  extensionVersion,
@@ -2915,15 +3057,17 @@ const loadContent = async (state, platform, savedState) => {
2915
3057
  folderSize,
2916
3058
  hasColorTheme,
2917
3059
  iconSrc,
2918
- isBuiltin,
2919
3060
  name,
2920
3061
  readmeScrollTop,
3062
+ readmeUrl,
2921
3063
  resources,
3064
+ scrollSource: Script,
2922
3065
  scrollToTopButtonEnabled: true,
2923
- secondEntries,
3066
+ secondEntries: marketplaceEntries,
2924
3067
  selectedTab,
2925
3068
  sizeOnDisk: size,
2926
- sizeValue
3069
+ sizeValue,
3070
+ tabs: enabledTabs
2927
3071
  };
2928
3072
  };
2929
3073
 
@@ -2931,26 +3075,6 @@ const loadContent2 = async (state, savedState) => {
2931
3075
  return loadContent(state, state.platform, savedState);
2932
3076
  };
2933
3077
 
2934
- const getExtensionDetailButtons = (hasColorTheme, isBuiltin) => {
2935
- const allActions = [{
2936
- label: setColorTheme$3(),
2937
- onClick: HandleClickSetColorTheme,
2938
- enabled: hasColorTheme,
2939
- name: SetColorTheme
2940
- }, {
2941
- label: disable(),
2942
- onClick: HandleClickDisable,
2943
- enabled: true,
2944
- name: Disable
2945
- }, {
2946
- label: uninstall(),
2947
- onClick: HandleClickUninstall,
2948
- enabled: !isBuiltin,
2949
- name: Uninstall
2950
- }];
2951
- return allActions;
2952
- };
2953
-
2954
3078
  const getChangelogVirtualDom = changelogDom => {
2955
3079
  // const notImplemented = ExtensionDetailStrings.notImplemented()
2956
3080
  // TODO set tabpanel role
@@ -3108,40 +3232,6 @@ const getAdditionalDetailsVirtualDom = (showAdditionalDetails, firstHeading, ent
3108
3232
  }, ...getAdditionalDetailsEntryVirtualDom(firstHeading, entries, getMoreInfoVirtualDom), ...getAdditionalDetailsEntryVirtualDom(secondHeading, secondEntries, getMoreInfoVirtualDom), ...getAdditionalDetailsEntryVirtualDom(thirdHeading, categories, getCategoriesDom), ...getAdditionalDetailsEntryVirtualDom(fourthHeading, resources, getResourcesVirtualDom)];
3109
3233
  };
3110
3234
 
3111
- const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri) => {
3112
- const entries = [{
3113
- key: 'Identifier',
3114
- value: extensionId,
3115
- odd: true,
3116
- code: true
3117
- }, {
3118
- key: 'Version',
3119
- value: extensionVersion,
3120
- code: true
3121
- }, {
3122
- key: 'Last Updated',
3123
- value: 'n/a',
3124
- odd: true
3125
- }, {
3126
- key: 'Size',
3127
- value: displaySize,
3128
- onClick: HandleClickSize,
3129
- title: extensionUri
3130
- }];
3131
- return entries;
3132
- };
3133
-
3134
- const getMarketplaceEntries = () => {
3135
- return [{
3136
- key: 'Published',
3137
- value: 'n/a',
3138
- odd: true
3139
- }, {
3140
- key: 'Last Released',
3141
- value: 'n/a'
3142
- }];
3143
- };
3144
-
3145
3235
  const getChildCount = (additionalDetails, scrollToTopEnabled) => {
3146
3236
  let count = 1;
3147
3237
  if (additionalDetails) {
@@ -3149,12 +3239,9 @@ const getChildCount = (additionalDetails, scrollToTopEnabled) => {
3149
3239
  }
3150
3240
  return count;
3151
3241
  };
3152
- const getDetailsVirtualDom = (sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories$1, resources$1, showAdditionalDetailsBreakpoint // new parameter, no default
3153
- ) => {
3242
+ const getDetailsVirtualDom = (sanitizedReadmeHtml, width, scrollToTopButtonEnabled, categories$1, resources$1, showAdditionalDetailsBreakpoint, marketplaceEntries, installationEntries) => {
3154
3243
  const firstHeading = installation();
3155
- const entries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
3156
3244
  const secondHeading = marketplace();
3157
- const secondEntries = getMarketplaceEntries();
3158
3245
  const thirdHeading = categories();
3159
3246
  const fourthHeading = resources();
3160
3247
  const showAdditionalDetails = width > showAdditionalDetailsBreakpoint;
@@ -3164,7 +3251,7 @@ const getDetailsVirtualDom = (sanitizedReadmeHtml, displaySize, extensionId, ext
3164
3251
  className: ExtensionDetailPanel,
3165
3252
  childCount: childCount,
3166
3253
  role: AriaRoles.Panel
3167
- }, ...sanitizedReadmeHtml, ...getAdditionalDetailsVirtualDom(showAdditionalDetails, firstHeading, entries, secondHeading, secondEntries, thirdHeading, categories$1, fourthHeading, resources$1)];
3254
+ }, ...sanitizedReadmeHtml, ...getAdditionalDetailsVirtualDom(showAdditionalDetails, firstHeading, installationEntries, secondHeading, marketplaceEntries, thirdHeading, categories$1, fourthHeading, resources$1)];
3168
3255
  return dom;
3169
3256
  };
3170
3257
 
@@ -3216,10 +3303,10 @@ const getFeaturesVirtualDom = (features, selectedFeature, state) => {
3216
3303
  }, ...featureVirtualDom];
3217
3304
  };
3218
3305
 
3219
- const getExtensionDetailContentVirtualDom = (sanitizedReadmeHtml, themesDom, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, width, scrollToTopButtonEnabled, categories, resources, breakpoint, commands, jsonValidation, settings, webViews, extensionUri, changelogDom, activationEvents, state) => {
3306
+ const getExtensionDetailContentVirtualDom = (sanitizedReadmeHtml, selectedTab, width, scrollToTopButtonEnabled, categories, resources, breakpoint, changelogDom, state) => {
3220
3307
  switch (selectedTab) {
3221
3308
  case Details:
3222
- return getDetailsVirtualDom(sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories, resources, breakpoint);
3309
+ return getDetailsVirtualDom(sanitizedReadmeHtml, width, scrollToTopButtonEnabled, categories, resources, breakpoint, state.entries, state.secondEntries);
3223
3310
  case Features:
3224
3311
  return getFeaturesVirtualDom(state.features, state.selectedFeature, state);
3225
3312
  case Changelog:
@@ -3321,32 +3408,19 @@ const getExtensionDetailHeaderVirtualDom = (name, iconSrc, description, badge, b
3321
3408
  return dom;
3322
3409
  };
3323
3410
 
3324
- const getTabs = selectedTab => {
3325
- const tabs = [{
3326
- label: details(),
3327
- name: Details,
3328
- selected: selectedTab === Details
3329
- }, {
3330
- label: features$1(),
3331
- name: Features,
3332
- selected: selectedTab === Features
3333
- }, {
3334
- label: changelog(),
3335
- name: Changelog,
3336
- selected: selectedTab === Changelog
3337
- }];
3338
- return tabs;
3339
- };
3340
-
3341
3411
  const selectedClassName = mergeClassNames(ExtensionDetailTab, ExtensionDetailTabSelected);
3342
3412
  const defaultClassName = ExtensionDetailTab;
3413
+ const getTabClassName = isSelected => {
3414
+ return isSelected ? selectedClassName : defaultClassName;
3415
+ };
3416
+
3343
3417
  const getTabVirtualDom = tab => {
3344
3418
  const {
3345
3419
  label,
3346
3420
  selected,
3347
3421
  name
3348
3422
  } = tab;
3349
- const className = selected ? selectedClassName : defaultClassName;
3423
+ const className = getTabClassName(selected);
3350
3424
  const ariaSelected = selected;
3351
3425
  return [{
3352
3426
  type: VirtualDomElements.Button,
@@ -3390,43 +3464,28 @@ const getExtensionDetailVirtualDom = (newState, selectedTab) => {
3390
3464
  // 3. virtual dom
3391
3465
  // 4. dom
3392
3466
  const {
3393
- activationEvents,
3467
+ badge,
3468
+ buttons,
3394
3469
  categories,
3395
3470
  changelogVirtualDom,
3396
- commands,
3397
3471
  description,
3398
3472
  detailsVirtualDom,
3399
- displaySize,
3400
- extension,
3401
- extensionId,
3402
- extensionVersion,
3403
- features,
3404
- hasColorTheme,
3405
3473
  iconSrc,
3406
- isBuiltin,
3407
- jsonValidation,
3408
3474
  name,
3409
3475
  resources,
3410
3476
  scrollToTopButtonEnabled,
3411
- selectedFeature,
3412
- settings,
3413
3477
  settingsButtonEnabled,
3414
3478
  showAdditionalDetailsBreakpoint,
3415
3479
  sizeValue,
3416
- themesMarkdownDom,
3417
- webViews,
3418
- badge
3480
+ tabs
3419
3481
  } = newState;
3420
- const extensionUri = extension.uri || extension.path || '';
3421
3482
  const width = newState?.width || 500;
3422
- const tabs = getTabs(selectedTab);
3423
3483
  const sizeClass = getClassNames(sizeValue);
3424
- const buttonDefs = getExtensionDetailButtons(hasColorTheme, isBuiltin); // TODO compute in loadContent
3425
3484
  const dom = [{
3426
3485
  type: VirtualDomElements.Div,
3427
3486
  className: mergeClassNames(Viewlet, ExtensionDetail, sizeClass),
3428
3487
  childCount: 3
3429
- }, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttonDefs, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...getExtensionDetailContentVirtualDom(detailsVirtualDom, themesMarkdownDom, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, width, scrollToTopButtonEnabled, categories, resources, showAdditionalDetailsBreakpoint, commands, jsonValidation, settings, webViews, extensionUri, changelogVirtualDom, activationEvents, newState)];
3488
+ }, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttons, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...getExtensionDetailContentVirtualDom(detailsVirtualDom, selectedTab, width, scrollToTopButtonEnabled, categories, resources, showAdditionalDetailsBreakpoint, changelogVirtualDom, newState)];
3430
3489
  return dom;
3431
3490
  };
3432
3491
 
@@ -3489,7 +3548,7 @@ const renderEventListeners = () => {
3489
3548
  params: ['handleReadmeContextMenu', 'event.clientX', 'event.clientY', 'event.target.href', 'event.target.src']
3490
3549
  }, {
3491
3550
  name: HandleReadmeScroll,
3492
- params: ['handleWheel', 'event.deltaX', 'event.deltaY'],
3551
+ params: ['handleScroll', 'event.target.scrollTop'],
3493
3552
  passive: true
3494
3553
  }, {
3495
3554
  name: HandleTabsClick,
@@ -3554,14 +3613,16 @@ const commandMap = {
3554
3613
  'ExtensionDetail.handleClickCategory': wrapCommand(handleClickCategory),
3555
3614
  'ExtensionDetail.handleClickDisable': wrapCommand(handleClickDisable),
3556
3615
  'ExtensionDetail.handleClickScrollToTop': wrapCommand(handleClickScrollToTop),
3557
- 'ExtensionDetail.handleClickSettings': wrapCommand(handleClickSettings),
3558
3616
  'ExtensionDetail.handleClickSetColorTheme': wrapCommand(handleClickSetColorTheme),
3617
+ 'ExtensionDetail.handleClickSettings': wrapCommand(handleClickSettings),
3559
3618
  'ExtensionDetail.handleClickSize': wrapCommand(handleClickSize),
3560
3619
  'ExtensionDetail.handleClickUninstall': wrapCommand(handleClickUninstall),
3561
3620
  'ExtensionDetail.handleFeaturesClick': wrapCommand(handleClickFeatures),
3562
3621
  'ExtensionDetail.handleIconError': wrapCommand(handleIconError),
3622
+ 'ExtensionDetail.handleScroll': wrapCommand(handleScroll),
3563
3623
  'ExtensionDetail.handleTabsClick': wrapCommand(handleTabsClick),
3564
- 'ExtensionDetail.handleWheel': wrapCommand(handleWheel),
3624
+ 'ExtensionDetail.handleWheel': wrapCommand(handleScroll),
3625
+ // deprecated
3565
3626
  'ExtensionDetail.loadContent2': wrapCommand(loadContent2),
3566
3627
  'ExtensionDetail.render2': render2,
3567
3628
  'ExtensionDetail.renderEventListeners': renderEventListeners,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-detail-view",
3
- "version": "3.39.0",
3
+ "version": "3.41.0",
4
4
  "description": "Extension Detail View Worker",
5
5
  "license": "MIT",
6
6
  "author": "Lvce Editor",