11<script lang="ts">
2+ import semver from ' semver' ;
23import Vue , { VueConstructor } from ' vue' ;
34import { mapGetters } from ' vuex' ;
45
5- import { demoMarketplace } from ' ../utils/_demo_marketplace_items.js' ;
6-
76import MarketplaceCard from ' @pkg/components/MarketplaceCard.vue' ;
87import { Settings , ContainerEngine } from ' @pkg/config/settings' ;
9- import { ExtensionState } from ' @pkg/store/extensions.js' ;
10-
11- type FilteredExtensions = typeof demoMarketplace .summaries ;
8+ import { ExtensionState , MarketplaceData } from ' @pkg/store/extensions.js' ;
129
13- interface installedExtensions extends ExtensionState {
14- id: string
15- }
10+ type ExtensionData = MarketplaceData & { installed: boolean };
1611
1712interface VuexBindings {
1813 getPreferences: Settings ;
@@ -30,8 +25,6 @@ export default (Vue as VueConstructor<Vue & VuexBindings>).extend({
3025 password: ' ' ,
3126 port: 0 ,
3227 },
33- extensions: demoMarketplace .summaries ,
34- installedExtensions: [] as installedExtensions [],
3528 };
3629 },
3730 async fetch() {
@@ -47,6 +40,10 @@ export default (Vue as VueConstructor<Vue & VuexBindings>).extend({
4740 },
4841 computed: {
4942 ... mapGetters (' preferences' , [' getPreferences' ]),
43+ ... mapGetters (' extensions' , { installedExtensions: ' list' , extensions: ' marketData' }) as {
44+ installedExtensions: () => ({ id: string } & ExtensionState )[],
45+ extensions: () => MarketplaceData [],
46+ },
5047 containerEngine(): string {
5148 return this .getPreferences .containerEngine .name ;
5249 },
@@ -59,28 +56,21 @@ export default (Vue as VueConstructor<Vue & VuexBindings>).extend({
5956 allowedExtensions(): string [] {
6057 return this .getPreferences .application .extensions .allowed .list ;
6158 },
62- filteredExtensions(): FilteredExtensions {
59+ filteredExtensions(): ExtensionData [] {
6360 let tempExtensions = this .extensions
6461 .filter ((item ) => {
6562 return this .isAllowed (item .slug );
6663 })
6764 .map ((item ) => {
68- if (this .isInstalled (item .slug )) {
69- return {
70- ... item ,
71- installed: true ,
72- };
73- }
74-
7565 return {
7666 ... item ,
77- installed: false ,
67+ installed: this . isInstalled ( item . slug ) ,
7868 };
7969 });
8070
8171 if (this .searchValue ) {
8272 tempExtensions = tempExtensions .filter ((item ) => {
83- return item .name
73+ return item .title
8474 .toLowerCase ()
8575 .includes (this .searchValue .toLowerCase ());
8676 });
@@ -89,15 +79,19 @@ export default (Vue as VueConstructor<Vue & VuexBindings>).extend({
8979 const collator = new Intl .Collator (' en' , { sensitivity: ' base' });
9080
9181 return filteredExtensions .sort ((s1 , s2 ) => {
92- return collator .compare (s1 .name , s2 .name );
82+ return collator .compare (s1 .title , s2 .title );
9383 });
9484 },
9585 },
9686 methods: {
9787 isInstalled(slug : string ) {
98- this .installedExtensions = this .$store .getters [' extensions/list' ];
88+ return !! this .installedExtensions .find (item => item ?.id === slug );
89+ },
90+ isOutdated(slug : string ) {
91+ const available = this .extensions .find (item => item .slug === slug );
92+ const installed = this .installedExtensions .find (item => item ?.id === slug );
9993
100- return this . installedExtensions . find ( item => item ?. id === slug );
94+ return available && installed && semver . gt ( available . version , installed . version );
10195 },
10296 isAllowed(slug : string ) {
10397 return ! this .allowedListEnabled || this .allowedExtensions .includes (slug );
@@ -130,7 +124,7 @@ export default (Vue as VueConstructor<Vue & VuexBindings>).extend({
130124 >
131125 <MarketplaceCard
132126 :extension =" item"
133- :data-test =" `extension-card-${item.name .toLowerCase()}`"
127+ :data-test =" `extension-card-${item.title .toLowerCase()}`"
134128 :is-installed =" item.installed"
135129 :credentials =" credentials"
136130 @update:extension =" isInstalled"
0 commit comments