@fleetbase/registry-bridge-engine 0.0.1
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/.php-cs-fixer.php +29 -0
- package/LICENSE.md +651 -0
- package/README.md +122 -0
- package/addon/adapters/registry-bridge.js +5 -0
- package/addon/adapters/registry-extension-bundle.js +1 -0
- package/addon/adapters/registry-extension.js +1 -0
- package/addon/components/extension-card.hbs +12 -0
- package/addon/components/extension-card.js +235 -0
- package/addon/components/extension-form.hbs +237 -0
- package/addon/components/extension-form.js +123 -0
- package/addon/components/extension-modal-title.hbs +14 -0
- package/addon/components/extension-modal-title.js +20 -0
- package/addon/components/extension-monetize-form.hbs +56 -0
- package/addon/components/extension-monetize-form.js +7 -0
- package/addon/components/extension-pending-publish-viewer.hbs +52 -0
- package/addon/components/extension-pending-publish-viewer.js +37 -0
- package/addon/components/extension-reviewer-control.hbs +68 -0
- package/addon/components/extension-reviewer-control.js +68 -0
- package/addon/components/modals/confirm-extension-purchase.hbs +5 -0
- package/addon/components/modals/confirm-extension-purchase.js +3 -0
- package/addon/components/modals/extension-details.hbs +69 -0
- package/addon/components/modals/extension-details.js +33 -0
- package/addon/components/modals/extension-purchase-form.hbs +5 -0
- package/addon/components/modals/extension-purchase-form.js +3 -0
- package/addon/components/modals/extension-uninstall.hbs +25 -0
- package/addon/components/modals/extension-uninstall.js +11 -0
- package/addon/components/modals/select-extension-bundle.hbs +43 -0
- package/addon/components/modals/select-extension-bundle.js +31 -0
- package/addon/components/progress-bar.hbs +12 -0
- package/addon/components/progress-bar.js +8 -0
- package/addon/controllers/application.js +6 -0
- package/addon/controllers/developers/analytics.js +26 -0
- package/addon/controllers/developers/extensions/edit/bundles.js +70 -0
- package/addon/controllers/developers/extensions/edit/index.js +3 -0
- package/addon/controllers/developers/extensions/edit/monetize.js +7 -0
- package/addon/controllers/developers/extensions/edit.js +107 -0
- package/addon/controllers/developers/extensions/index.js +3 -0
- package/addon/controllers/developers/extensions/new.js +32 -0
- package/addon/controllers/developers/payments/index.js +39 -0
- package/addon/controllers/developers/payments/onboard.js +67 -0
- package/addon/controllers/explore/category.js +22 -0
- package/addon/controllers/explore/index.js +15 -0
- package/addon/controllers/installed.js +86 -0
- package/addon/controllers/purchased.js +18 -0
- package/addon/engine.js +44 -0
- package/addon/models/registry-extension-bundle.js +62 -0
- package/addon/models/registry-extension.js +215 -0
- package/addon/routes/application.js +12 -0
- package/addon/routes/developers/analytics.js +10 -0
- package/addon/routes/developers/credentials.js +3 -0
- package/addon/routes/developers/extensions/edit/bundles.js +21 -0
- package/addon/routes/developers/extensions/edit/details.js +3 -0
- package/addon/routes/developers/extensions/edit/index.js +3 -0
- package/addon/routes/developers/extensions/edit/monetize.js +3 -0
- package/addon/routes/developers/extensions/edit.js +18 -0
- package/addon/routes/developers/extensions/index.js +10 -0
- package/addon/routes/developers/extensions/new.js +3 -0
- package/addon/routes/developers/extensions.js +3 -0
- package/addon/routes/developers/payments/index.js +26 -0
- package/addon/routes/developers/payments/onboard.js +21 -0
- package/addon/routes/developers/payments.js +3 -0
- package/addon/routes/developers.js +3 -0
- package/addon/routes/explore/category.js +27 -0
- package/addon/routes/explore/index.js +17 -0
- package/addon/routes/explore.js +3 -0
- package/addon/routes/installed.js +10 -0
- package/addon/routes/purchased.js +10 -0
- package/addon/routes.js +28 -0
- package/addon/serializers/registry-extension-bundle.js +15 -0
- package/addon/serializers/registry-extension.js +21 -0
- package/addon/services/stripe.js +83 -0
- package/addon/styles/registry-bridge-engine.css +142 -0
- package/addon/templates/application.hbs +26 -0
- package/addon/templates/developers/analytics.hbs +83 -0
- package/addon/templates/developers/credentials.hbs +1 -0
- package/addon/templates/developers/extensions/edit/bundles.hbs +71 -0
- package/addon/templates/developers/extensions/edit/details.hbs +16 -0
- package/addon/templates/developers/extensions/edit/index.hbs +1 -0
- package/addon/templates/developers/extensions/edit/monetize.hbs +3 -0
- package/addon/templates/developers/extensions/edit.hbs +48 -0
- package/addon/templates/developers/extensions/index.hbs +27 -0
- package/addon/templates/developers/extensions/new.hbs +39 -0
- package/addon/templates/developers/extensions.hbs +1 -0
- package/addon/templates/developers/payments/index.hbs +33 -0
- package/addon/templates/developers/payments/onboard.hbs +48 -0
- package/addon/templates/developers/payments.hbs +1 -0
- package/addon/templates/developers.hbs +1 -0
- package/addon/templates/explore/category.hbs +12 -0
- package/addon/templates/explore/index.hbs +12 -0
- package/addon/templates/explore.hbs +1 -0
- package/addon/templates/installed.hbs +32 -0
- package/addon/templates/purchased.hbs +34 -0
- package/app/adapters/registry-bridge.js +1 -0
- package/app/adapters/registry-extension-bundle.js +1 -0
- package/app/adapters/registry-extension.js +1 -0
- package/app/components/extension-card.js +1 -0
- package/app/components/extension-form.js +1 -0
- package/app/components/extension-modal-title.js +1 -0
- package/app/components/extension-monetize-form.js +1 -0
- package/app/components/extension-pending-publish-viewer.js +1 -0
- package/app/components/extension-reviewer-control.js +1 -0
- package/app/components/modals/confirm-extension-purchase.js +1 -0
- package/app/components/modals/extension-details.js +1 -0
- package/app/components/modals/extension-purchase-form.js +1 -0
- package/app/components/modals/extension-uninstall.js +1 -0
- package/app/components/modals/select-extension-bundle.js +1 -0
- package/app/components/progress-bar.js +1 -0
- package/app/controllers/application.js +1 -0
- package/app/controllers/developers/analytics.js +1 -0
- package/app/controllers/developers/extensions/edit/bundles.js +1 -0
- package/app/controllers/developers/extensions/edit/index.js +1 -0
- package/app/controllers/developers/extensions/edit/monetize.js +1 -0
- package/app/controllers/developers/extensions/edit.js +1 -0
- package/app/controllers/developers/extensions/index.js +1 -0
- package/app/controllers/developers/extensions/new.js +1 -0
- package/app/controllers/developers/payments/index.js +1 -0
- package/app/controllers/developers/payments/onboard.js +1 -0
- package/app/controllers/explore/category.js +1 -0
- package/app/controllers/explore/index.js +1 -0
- package/app/controllers/installed.js +1 -0
- package/app/controllers/purchased.js +1 -0
- package/app/models/registry-extension-bundle.js +1 -0
- package/app/models/registry-extension.js +1 -0
- package/app/routes/developers/analytics.js +1 -0
- package/app/routes/developers/credentials.js +1 -0
- package/app/routes/developers/extensions/edit/bundles.js +1 -0
- package/app/routes/developers/extensions/edit/details.js +1 -0
- package/app/routes/developers/extensions/edit/index.js +1 -0
- package/app/routes/developers/extensions/edit/monetize.js +1 -0
- package/app/routes/developers/extensions/edit.js +1 -0
- package/app/routes/developers/extensions/index.js +1 -0
- package/app/routes/developers/extensions/new.js +1 -0
- package/app/routes/developers/extensions.js +1 -0
- package/app/routes/developers/payments/index.js +1 -0
- package/app/routes/developers/payments/onboard.js +1 -0
- package/app/routes/developers/payments.js +1 -0
- package/app/routes/developers.js +1 -0
- package/app/routes/explore/category.js +1 -0
- package/app/routes/explore/index.js +1 -0
- package/app/routes/explore.js +1 -0
- package/app/routes/installed.js +1 -0
- package/app/routes/purchased.js +1 -0
- package/app/serializers/registry-extension-bundle.js +1 -0
- package/app/serializers/registry-extension.js +1 -0
- package/app/services/stripe.js +1 -0
- package/app/templates/developers/analytics.js +1 -0
- package/app/templates/developers/credentials.js +1 -0
- package/app/templates/developers/extensions/edit/bundles.js +1 -0
- package/app/templates/developers/extensions/edit/details.js +1 -0
- package/app/templates/developers/extensions/edit/index.js +1 -0
- package/app/templates/developers/extensions/edit/monetize.js +1 -0
- package/app/templates/developers/extensions/edit.js +1 -0
- package/app/templates/developers/extensions/index.js +1 -0
- package/app/templates/developers/extensions/new.js +1 -0
- package/app/templates/developers/extensions.js +1 -0
- package/app/templates/developers/payments/index.js +1 -0
- package/app/templates/developers/payments/onboard.js +1 -0
- package/app/templates/developers/payments.js +1 -0
- package/app/templates/developers.js +1 -0
- package/app/templates/explore/category.js +1 -0
- package/app/templates/explore/index.js +1 -0
- package/app/templates/explore.js +1 -0
- package/app/templates/installed.js +1 -0
- package/app/templates/purchased.js +1 -0
- package/composer.json +95 -0
- package/config/environment.js +28 -0
- package/extension.json +10 -0
- package/index.js +26 -0
- package/package.json +129 -0
- package/phpstan.neon.dist +8 -0
- package/phpunit.xml.dist +16 -0
- package/server/.gitattributes +14 -0
- package/server/config/registry-bridge.php +32 -0
- package/server/migrations/2024_03_19_060627_create_registry_users_table.php +42 -0
- package/server/migrations/2024_03_21_051614_create_registry_extensions_table.php +76 -0
- package/server/migrations/2024_03_25_044537_create_registry_extension_bundles_table.php +54 -0
- package/server/migrations/2024_03_29_072101_registry_extension_installs.php +35 -0
- package/server/migrations/2024_07_16_155000_create_registry_extension_purchases.php +41 -0
- package/server/seeders/ExtensionsCategorySeeder.php +359 -0
- package/server/src/Console/Commands/Initialize.php +35 -0
- package/server/src/Console/Commands/PostInstallExtension.php +84 -0
- package/server/src/Exceptions/InstallFailedException.php +21 -0
- package/server/src/Expansions/CategoryExpansion.php +30 -0
- package/server/src/Http/Controllers/Internal/v1/ExtensionInstallerController.php +153 -0
- package/server/src/Http/Controllers/Internal/v1/RegistryAuthController.php +230 -0
- package/server/src/Http/Controllers/Internal/v1/RegistryController.php +54 -0
- package/server/src/Http/Controllers/Internal/v1/RegistryExtensionBundleController.php +112 -0
- package/server/src/Http/Controllers/Internal/v1/RegistryExtensionController.php +257 -0
- package/server/src/Http/Controllers/Internal/v1/RegistryPaymentsController.php +227 -0
- package/server/src/Http/Controllers/RegistryBridgeController.php +13 -0
- package/server/src/Http/Filter/RegistryExtensionFilter.php +80 -0
- package/server/src/Http/Requests/AddRegistryUserRequest.php +47 -0
- package/server/src/Http/Requests/AuthenticateRegistryUserRequest.php +47 -0
- package/server/src/Http/Requests/CreateRegistryExtensionBundleRequest.php +42 -0
- package/server/src/Http/Requests/CreateRegistryExtensionRequest.php +31 -0
- package/server/src/Http/Requests/InstallExtensionRequest.php +30 -0
- package/server/src/Http/Requests/RegistryAuthRequest.php +46 -0
- package/server/src/Http/Requests/RegistryExtensionActionRequest.php +30 -0
- package/server/src/Http/Resources/RegistryUser.php +40 -0
- package/server/src/Models/RegistryExtension.php +656 -0
- package/server/src/Models/RegistryExtensionBundle.php +1015 -0
- package/server/src/Models/RegistryExtensionInstall.php +76 -0
- package/server/src/Models/RegistryExtensionPurchase.php +87 -0
- package/server/src/Models/RegistryUser.php +140 -0
- package/server/src/Providers/RegistryBridgeServiceProvider.php +117 -0
- package/server/src/Support/Bridge.php +53 -0
- package/server/src/Support/Utils.php +19 -0
- package/server/src/routes.php +58 -0
- package/server/tests/Feature.php +5 -0
- package/translations/en-us.yaml +119 -0
- package/tsconfig.declarations.json +10 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
.developer-extensions-index-container {
|
|
2
|
+
margin: auto;
|
|
3
|
+
padding: 2rem 2.25rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.flb--modal.flb--default-modal > .flb--modal-dialog > .flb--modal-content > .flb--modal-header,
|
|
7
|
+
.flb--modal.flb--default-modal > .flb--modal-dialog > .flb--modal-content > .flb--modal-header.flb--extension-modal-header {
|
|
8
|
+
align-items: start;
|
|
9
|
+
padding-bottom: 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.modal-title--extension-icon-wrapper {
|
|
13
|
+
width: 5rem;
|
|
14
|
+
height: 5rem;
|
|
15
|
+
margin-right: 0.75rem;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.flb--extension-tag {
|
|
19
|
+
font-size: 0.875rem;
|
|
20
|
+
line-height: 1.25rem;
|
|
21
|
+
padding: 0.375rem 1rem;
|
|
22
|
+
border-radius: 0.5rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.flb--modal.flb--extension-modal > .flb--modal-dialog > .flb--modal-content > .flb--modal-body > .modal-body-container {
|
|
26
|
+
padding-top: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.flb--extension-screenshots-container {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: row;
|
|
32
|
+
align-items: center;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.flb--extension-screenshot {
|
|
36
|
+
width: 150px;
|
|
37
|
+
height: 85px;
|
|
38
|
+
border: 3px #fff solid;
|
|
39
|
+
border-radius: 0.5rem;
|
|
40
|
+
margin-right: 1rem;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
body[data-theme='dark'] .flb--extension-screenshot {
|
|
44
|
+
border: 3px #202a37 solid;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.flb--extension-screenshot-lightbox {
|
|
48
|
+
position: absolute;
|
|
49
|
+
z-index: 999999;
|
|
50
|
+
inset: 0;
|
|
51
|
+
margin: auto;
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
background-color: rgb(0 0 0 / 45%);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.flb--extension-screenshot-lightbox > .flb--extension-screenshot {
|
|
59
|
+
width: 600px;
|
|
60
|
+
height: 350px;
|
|
61
|
+
box-shadow:
|
|
62
|
+
0 10px 15px -3px rgb(0 0 0 / 10%),
|
|
63
|
+
0 4px 6px -4px rgb(0 0 0 / 10%);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
body[data-theme='dark'] .flb--modal.flb--default-modal.finalize-extension-purchase,
|
|
67
|
+
body[data-theme='light'] .flb--modal.flb--default-modal.finalize-extension-purchase,
|
|
68
|
+
.flb--modal.flb--default-modal.finalize-extension-purchase {
|
|
69
|
+
pointer-events: none !important;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.flb--modal.flb--default-modal.finalize-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header button.close,
|
|
73
|
+
body[data-theme='dark'] .flb--modal.flb--default-modal.finalize-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header button.close,
|
|
74
|
+
body[data-theme='light'] .flb--modal.flb--default-modal.finalize-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header button.close {
|
|
75
|
+
display: none !important;
|
|
76
|
+
pointer-events: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content,
|
|
80
|
+
body[data-theme='dark'] .flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content,
|
|
81
|
+
body[data-theme='light'] .flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content {
|
|
82
|
+
background-color: #fff;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header,
|
|
86
|
+
body[data-theme='dark'] .flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header,
|
|
87
|
+
body[data-theme='light'] .flb--modal.flb--default-modal.stripe-extension-purchase > .flb--modal-dialog > .flb--modal-content > .flb--modal-header {
|
|
88
|
+
display: none !important;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.extension-card-container {
|
|
92
|
+
border-radius: 0.5rem;
|
|
93
|
+
border: 1px solid #e5e7eb;
|
|
94
|
+
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 5%);
|
|
95
|
+
width: 11rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
body[data-theme='dark'] .extension-card-container {
|
|
99
|
+
border-color: #4b5563;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.extension-card-container > .extension-card-icon-container {
|
|
103
|
+
display: flex;
|
|
104
|
+
align-items: center;
|
|
105
|
+
justify-content: center;
|
|
106
|
+
border-radius: 0.5rem 0.5rem 0 0;
|
|
107
|
+
width: 100%;
|
|
108
|
+
height: 9rem;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.extension-card-container > .extension-card-icon-container > img {
|
|
112
|
+
width: 100%;
|
|
113
|
+
height: 9rem;
|
|
114
|
+
object-fit: cover;
|
|
115
|
+
border-radius: 0.5rem 0.5rem 0 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.extension-card-container > .extension-card-body-container {
|
|
119
|
+
text-align: left;
|
|
120
|
+
padding: 0.5rem 0.75rem;
|
|
121
|
+
border-radius: 0 0 0.5rem 0.5rem;
|
|
122
|
+
background-color: white;
|
|
123
|
+
border-top: 1px solid #e5e7eb;
|
|
124
|
+
min-height: 5.5rem;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
body[data-theme='dark'] .extension-card-container > .extension-card-body-container {
|
|
128
|
+
border-top-color: #4b5563;
|
|
129
|
+
background-color: #111827;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.extension-card-grid-container {
|
|
133
|
+
display: flex;
|
|
134
|
+
flex-direction: row;
|
|
135
|
+
align-items: stretch;
|
|
136
|
+
margin-left: -2rem;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.extension-card-grid-container > * {
|
|
140
|
+
margin-left: 2rem;
|
|
141
|
+
margin-bottom: 2rem;
|
|
142
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<EmberWormhole @to="sidebar-menu-items">
|
|
2
|
+
<Layout::Sidebar::Item @route="console.extensions.installed" @icon="inbox">Installed</Layout::Sidebar::Item>
|
|
3
|
+
<Layout::Sidebar::Item @route="console.extensions.purchased" @icon="bag-shopping">Purchased</Layout::Sidebar::Item>
|
|
4
|
+
<Layout::Sidebar::Panel @open={{true}} @title="Explore">
|
|
5
|
+
<Layout::Sidebar::Item @route="console.extensions.explore.index" @icon="shapes">Explore All</Layout::Sidebar::Item>
|
|
6
|
+
{{#each this.categories as |category|}}
|
|
7
|
+
<LinkTo @route="explore.category" @model={{category}} class="next-nav-item">
|
|
8
|
+
<div class="next-nav-item-icon-container">
|
|
9
|
+
<FaIcon @icon={{category.icon}} @size="sm" />
|
|
10
|
+
</div>
|
|
11
|
+
<div class="truncate w-10/12">{{category.name}}</div>
|
|
12
|
+
<div class="next-nav-item-right-side"></div>
|
|
13
|
+
</LinkTo>
|
|
14
|
+
{{/each}}
|
|
15
|
+
</Layout::Sidebar::Panel>
|
|
16
|
+
<Layout::Sidebar::Panel @open={{true}} @title="Developers">
|
|
17
|
+
<Layout::Sidebar::Item @route="console.extensions.developers.extensions" @icon="box-archive">Extensions</Layout::Sidebar::Item>
|
|
18
|
+
<Layout::Sidebar::Item @route="console.extensions.developers.analytics" @icon="chart-simple">Analytics</Layout::Sidebar::Item>
|
|
19
|
+
<Layout::Sidebar::Item @route="console.extensions.developers.payments" @icon="cash-register">Payments</Layout::Sidebar::Item>
|
|
20
|
+
</Layout::Sidebar::Panel>
|
|
21
|
+
<Spacer @height="200px" />
|
|
22
|
+
</EmberWormhole>
|
|
23
|
+
|
|
24
|
+
<Layout::Section::Container>
|
|
25
|
+
{{outlet}}
|
|
26
|
+
</Layout::Section::Container>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<Layout::Section::Header @title="Analytics">
|
|
2
|
+
<DropdownButton
|
|
3
|
+
class="h-8"
|
|
4
|
+
@text={{if this.selectedExtension this.selectedExtension.name "Select Extension"}}
|
|
5
|
+
@textClass="text-sm mr-2"
|
|
6
|
+
@buttonClass="flex-row-reverse w-44 justify-between"
|
|
7
|
+
@icon="caret-down"
|
|
8
|
+
@iconClass="mr-0i"
|
|
9
|
+
@size="xs"
|
|
10
|
+
@iconPrefix="fas"
|
|
11
|
+
@triggerClass="hidden md:flex"
|
|
12
|
+
as |dd|
|
|
13
|
+
>
|
|
14
|
+
<div class="next-dd-menu mt-1 mx-0" aria-labelledby="user-menu">
|
|
15
|
+
<div class="p-1">
|
|
16
|
+
{{#each @model as |extension|}}
|
|
17
|
+
<a href="javascript:;" class="next-dd-item" {{on "click" (dropdown-fn dd this.selectExtension extension)}}>
|
|
18
|
+
<div class="flex-1 flex flex-row items-center">
|
|
19
|
+
<div class="w-6">
|
|
20
|
+
<FaIcon @icon="box-archive" />
|
|
21
|
+
</div>
|
|
22
|
+
<span>{{extension.name}}</span>
|
|
23
|
+
</div>
|
|
24
|
+
<div>
|
|
25
|
+
{{#if (eq this.selectedExtension.id extension.id)}}
|
|
26
|
+
<FaIcon @icon="check" class="text-green-500" />
|
|
27
|
+
{{/if}}
|
|
28
|
+
</div>
|
|
29
|
+
</a>
|
|
30
|
+
{{/each}}
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</DropdownButton>
|
|
34
|
+
</Layout::Section::Header>
|
|
35
|
+
|
|
36
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
37
|
+
<div class="container">
|
|
38
|
+
<div class="max-w-3xl mx-auto mt-4">
|
|
39
|
+
<div class="content">
|
|
40
|
+
<div class="h-10">
|
|
41
|
+
{{#if this.getExtensionAnalytics.isRunning}}
|
|
42
|
+
<div class="flex items-center justify-center">
|
|
43
|
+
<Spinner
|
|
44
|
+
@loadingMessage={{concat "Loading analytical metrics for " this.selectedExtension.name}}
|
|
45
|
+
@loadingMessageClass="ml-2 text-black dark:text-white"
|
|
46
|
+
@wrapperClass="flex flex-row items-center"
|
|
47
|
+
/>
|
|
48
|
+
</div>
|
|
49
|
+
{{/if}}
|
|
50
|
+
</div>
|
|
51
|
+
{{#if this.selectedExtension}}
|
|
52
|
+
<ExtensionModalTitle @extension={{this.selectedExtension}} class="mb-6" />
|
|
53
|
+
<div class="grid grid-cols-2 lg:grid-cols-4 gap-4">
|
|
54
|
+
{{#each-in this.metrics as |key value|}}
|
|
55
|
+
<StatWidget @title={{humanize key}} @value={{value}} />
|
|
56
|
+
{{/each-in}}
|
|
57
|
+
</div>
|
|
58
|
+
{{else}}
|
|
59
|
+
<div class="flex items-center justify-center flex-col mb-12">
|
|
60
|
+
<h1 class="text-black dark:text-white text-lg font-semibold mb-2">Extension Analytics Viewer</h1>
|
|
61
|
+
<p class="text-gray-600 dark:text-gray-400">Please select an extension from the list to load and display its associated analytics. Once selected, detailed performance metrics and data
|
|
62
|
+
insights will be rendered here.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="extension-card-grid-container">
|
|
65
|
+
{{#each @model as |extension|}}
|
|
66
|
+
<button type="button" class="extension-card-container hover:opacity-50" {{on "click" (fn this.selectExtension extension)}}>
|
|
67
|
+
<div class="extension-card-icon-container">
|
|
68
|
+
<Image src={{extension.icon_url}} class="w-full h-36 rounded-t-lg" alt={{extension.name}} @fallbackSrc={{config "defaultValues.extensionIcon"}} />
|
|
69
|
+
</div>
|
|
70
|
+
<div class="extension-card-body-container">
|
|
71
|
+
<div class="flex flex-col">
|
|
72
|
+
<div class="font-semibold text-sm block">{{extension.name}}</div>
|
|
73
|
+
<div class="text-xs truncate">{{n-a extension.description}}</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</button>
|
|
77
|
+
{{/each}}
|
|
78
|
+
</div>
|
|
79
|
+
{{/if}}
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{outlet}}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<div class="flex-1">
|
|
2
|
+
<ContentPanel @title={{t "registry-bridge.developers.extensions.extension-form.bundles"}} @open={{true}} @pad={{false}} @panelBodyClass="bg-white dark:bg-gray-800">
|
|
3
|
+
<div class="px-4 pb-4 pt-2">
|
|
4
|
+
<div>
|
|
5
|
+
<FileUpload
|
|
6
|
+
@name={{t "registry-bridge.developers.extensions.extension-form.upload-new-bundle"}}
|
|
7
|
+
@accept={{join "," this.acceptedBundleTypes}}
|
|
8
|
+
@onFileAdded={{perform this.uploadBundle}}
|
|
9
|
+
as |queue|
|
|
10
|
+
>
|
|
11
|
+
<a tabindex={{0}} class="flex items-center px-0 mt-2 text-xs no-underline truncate btn btn-sm btn-default" disabled={{not queue.files.length}}>
|
|
12
|
+
{{#if queue.files.length}}
|
|
13
|
+
<div class="mr-1.5">
|
|
14
|
+
<Spinner />
|
|
15
|
+
</div>
|
|
16
|
+
<span>
|
|
17
|
+
{{t "common.uploading"}}
|
|
18
|
+
</span>
|
|
19
|
+
{{else}}
|
|
20
|
+
<FaIcon @icon="box-archive" class="mr-1.5" />
|
|
21
|
+
<span>
|
|
22
|
+
{{t "registry-bridge.developers.extensions.extension-form.upload-new-bundle"}}
|
|
23
|
+
</span>
|
|
24
|
+
{{/if}}
|
|
25
|
+
</a>
|
|
26
|
+
</FileUpload>
|
|
27
|
+
</div>
|
|
28
|
+
{{#unless this.createBundle.isIdle}}
|
|
29
|
+
<div class="flex flex-row items-center mt-4">
|
|
30
|
+
<Spinner @wrapperClass="flex flex-row items-center space-x-2" @loadingMessage="Creating a new bundle..." />
|
|
31
|
+
</div>
|
|
32
|
+
{{/unless}}
|
|
33
|
+
{{#if this.lastError}}
|
|
34
|
+
<div class="flex flex-row items-center mt-4 rounded-lg shadow-sm bg-red-100 border-red-200 text-red-900 px-4 py-2 text-xs">
|
|
35
|
+
<FaIcon @icon="triangle-exclamation" @size="sm" class="text-red-800" />
|
|
36
|
+
<span class="ml-2">{{this.lastError}}</span>
|
|
37
|
+
</div>
|
|
38
|
+
{{/if}}
|
|
39
|
+
</div>
|
|
40
|
+
{{#if @model.length}}
|
|
41
|
+
<div class="next-table-wrapper auto-height">
|
|
42
|
+
<table>
|
|
43
|
+
<thead>
|
|
44
|
+
<tr>
|
|
45
|
+
<th {{set-width "175px"}}>ID</th>
|
|
46
|
+
<th {{set-width "145px"}}>Filename</th>
|
|
47
|
+
<th {{set-width "80px"}}>Bundle</th>
|
|
48
|
+
<th {{set-width "80px"}}>Version</th>
|
|
49
|
+
<th {{set-width "165px"}}>Date Uploaded</th>
|
|
50
|
+
<th>Status</th>
|
|
51
|
+
</tr>
|
|
52
|
+
</thead>
|
|
53
|
+
<tbody>
|
|
54
|
+
{{#each @model as |bundle|}}
|
|
55
|
+
<tr>
|
|
56
|
+
<td>{{bundle.bundle_id}}</td>
|
|
57
|
+
<td>{{bundle.bundle_filename}}</td>
|
|
58
|
+
<td>{{bundle.bundle_number}}</td>
|
|
59
|
+
<td>{{bundle.version}}</td>
|
|
60
|
+
<td>{{bundle.createdAt}}</td>
|
|
61
|
+
<td>
|
|
62
|
+
<Badge @status={{bundle.status}} />
|
|
63
|
+
</td>
|
|
64
|
+
</tr>
|
|
65
|
+
{{/each}}
|
|
66
|
+
</tbody>
|
|
67
|
+
</table>
|
|
68
|
+
</div>
|
|
69
|
+
{{/if}}
|
|
70
|
+
</ContentPanel>
|
|
71
|
+
</div>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<div class="flex-1">
|
|
2
|
+
<ContentPanel @title={{t "registry-bridge.developers.extensions.extension-form.details"}} @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-800">
|
|
3
|
+
<InputGroup
|
|
4
|
+
@name={{t "registry-bridge.developers.extensions.extension-form.extension-id"}}
|
|
5
|
+
@value={{@model.public_id}}
|
|
6
|
+
@disabled={{true}}
|
|
7
|
+
@helpText={{t "registry-bridge.developers.extensions.extension-form.extension-id-help-text"}}
|
|
8
|
+
/>
|
|
9
|
+
<InputGroup
|
|
10
|
+
@name={{t "registry-bridge.developers.extensions.extension-form.bundle-id"}}
|
|
11
|
+
@value={{@model.current_bundle_id}}
|
|
12
|
+
@disabled={{true}}
|
|
13
|
+
@helpText={{t "registry-bridge.developers.extensions.extension-form.bundle-id-help-text"}}
|
|
14
|
+
/>
|
|
15
|
+
</ContentPanel>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<ExtensionForm @extension={{@model}} />
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<Layout::Section::Header @title={{concat (t "registry-bridge.developers.extensions.extension") ": " @model.name}}>
|
|
2
|
+
<div class="flex items-center mr-2">
|
|
3
|
+
<Badge @status={{@model.status}} />
|
|
4
|
+
</div>
|
|
5
|
+
<Button @type="default" @size="sm" @icon="arrow-left" @text={{t "common.back"}} @onClick={{transition-to "developers.extensions"}} @wrapperClass="mr-2" />
|
|
6
|
+
<Button @type="primary" @size="sm" @icon="save" @text={{t "common.save"}} @onClick={{perform this.save}} @isLoading={{not this.save.isIdle}} @wrapperClass="mr-2" />
|
|
7
|
+
<Button
|
|
8
|
+
@type="magic"
|
|
9
|
+
@size="sm"
|
|
10
|
+
@icon="paper-plane"
|
|
11
|
+
@text={{t "registry-bridge.developers.extensions.extension-form.submit-for-review"}}
|
|
12
|
+
@helpText={{this.isReadyMessage}}
|
|
13
|
+
@onClick={{this.submitForReview}}
|
|
14
|
+
@disabled={{not this.isReady}}
|
|
15
|
+
@isLoading={{not this.startReview.isIdle}}
|
|
16
|
+
/>
|
|
17
|
+
</Layout::Section::Header>
|
|
18
|
+
|
|
19
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
20
|
+
<div class="section-header-actions w-full overflow-x-scroll lg:overflow-x-auto py-4 px-10">
|
|
21
|
+
<div class="fleetops-pill-tabs">
|
|
22
|
+
<nav>
|
|
23
|
+
<LinkTo @route="developers.extensions.edit.index" class="ui-tab">
|
|
24
|
+
<FaIcon @icon="cog" class="mr-1" />
|
|
25
|
+
<span>{{t "registry-bridge.developers.extensions.submission"}}</span>
|
|
26
|
+
</LinkTo>
|
|
27
|
+
<LinkTo @route="developers.extensions.edit.details" class="ui-tab">
|
|
28
|
+
<FaIcon @icon="circle-info" class="mr-1" />
|
|
29
|
+
<span>{{t "registry-bridge.developers.extensions.details"}}</span>
|
|
30
|
+
</LinkTo>
|
|
31
|
+
<LinkTo @route="developers.extensions.edit.bundles" class="ui-tab">
|
|
32
|
+
<FaIcon @icon="box-archive" class="mr-1" />
|
|
33
|
+
<span>{{t "registry-bridge.developers.extensions.bundles"}}</span>
|
|
34
|
+
</LinkTo>
|
|
35
|
+
<LinkTo @route="developers.extensions.edit.monetize" class="ui-tab">
|
|
36
|
+
<FaIcon @icon="money-bill-1" class="mr-1" />
|
|
37
|
+
<span>{{t "registry-bridge.developers.extensions.monetize"}}</span>
|
|
38
|
+
</LinkTo>
|
|
39
|
+
</nav>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="container">
|
|
43
|
+
<div class="max-w-3xl mx-auto mt-4">
|
|
44
|
+
{{outlet}}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<Spacer @height="500px" />
|
|
48
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<Layout::Section::Header @title={{t "registry-bridge.developers.extensions.extensions"}}>
|
|
2
|
+
<Button @type="primary" @size="sm" @icon="circle-plus" @text={{t "registry-bridge.developers.extensions.create-new-extension"}} @onClick={{transition-to "developers.extensions.new"}} />
|
|
3
|
+
</Layout::Section::Header>
|
|
4
|
+
|
|
5
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
6
|
+
<div class="m-auto p-8">
|
|
7
|
+
<div class="extension-card-grid-container">
|
|
8
|
+
{{#each (filter-by "isNew" false @model) as |extension|}}
|
|
9
|
+
<button type="button" class="extension-card-container hover:opacity-50" {{on "click" (transition-to "developers.extensions.edit" extension)}}>
|
|
10
|
+
<div class="extension-card-icon-container">
|
|
11
|
+
<Image src={{extension.icon_url}} class="w-full h-36 rounded-t-lg" alt={{extension.name}} @fallbackSrc={{config "defaultValues.extensionIcon"}} />
|
|
12
|
+
</div>
|
|
13
|
+
<div class="extension-card-body-container">
|
|
14
|
+
<div class="flex flex-col">
|
|
15
|
+
<div class="font-semibold text-sm block">{{extension.name}}</div>
|
|
16
|
+
<div class="text-xs truncate">{{n-a extension.description}}</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div>
|
|
19
|
+
<Badge @status={{extension.status}} />
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</button>
|
|
23
|
+
{{/each}}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<Spacer @height="300px" />
|
|
27
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<Layout::Section::Header @title={{t "registry-bridge.developers.extensions.new-extension"}} />
|
|
2
|
+
|
|
3
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
4
|
+
<div class="container">
|
|
5
|
+
<div class="max-w-3xl mx-auto mt-4">
|
|
6
|
+
<div class="flex-1 px-6">
|
|
7
|
+
<ContentPanel
|
|
8
|
+
@title={{t "registry-bridge.developers.extensions.extension-form.details-content-block"}}
|
|
9
|
+
@open={{true}}
|
|
10
|
+
@pad={{true}}
|
|
11
|
+
@panelBodyClass="bg-white dark:bg-gray-800"
|
|
12
|
+
>
|
|
13
|
+
<InputGroup
|
|
14
|
+
@name={{t "registry-bridge.developers.extensions.extension-form.extension-name"}}
|
|
15
|
+
@value={{this.extension.name}}
|
|
16
|
+
@helpText={{t "registry-bridge.developers.extensions.extension-form.extension-name-help-text"}}
|
|
17
|
+
/>
|
|
18
|
+
<InputGroup
|
|
19
|
+
@name={{t "registry-bridge.developers.extensions.extension-form.extension-description"}}
|
|
20
|
+
@wrapperClass="mb-0i"
|
|
21
|
+
@helpText={{t "registry-bridge.developers.extensions.extension-form.extension-description-help-text"}}
|
|
22
|
+
>
|
|
23
|
+
<Textarea
|
|
24
|
+
@value={{this.extension.description}}
|
|
25
|
+
placeholder={{t "registry-bridge.developers.extensions.extension-form.extension-description"}}
|
|
26
|
+
class="form-input w-full"
|
|
27
|
+
rows="3"
|
|
28
|
+
/>
|
|
29
|
+
</InputGroup>
|
|
30
|
+
</ContentPanel>
|
|
31
|
+
<div class="mt-4 flex items-center space-x-4">
|
|
32
|
+
<Button @size="lg" @type="primary" @text="Continue" @icon="check" @onClick={{perform this.save}} @isLoading={{not this.save.isIdle}} />
|
|
33
|
+
<Button @size="lg" @type="default" @text="Cancel" @icon="times" @onClick={{this.cancel}} />
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<Spacer @height="500px" />
|
|
39
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{outlet}}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<Layout::Section::Header @title="Payments">
|
|
2
|
+
<div class="flex flex-row space-x-1">
|
|
3
|
+
<span class="text-sm text-black dark:text-white font-bold">Total Amount:</span>
|
|
4
|
+
<span class="text-sm text-black dark:text-white">{{format-currency @model.total_amount "USD"}}</span>
|
|
5
|
+
</div>
|
|
6
|
+
</Layout::Section::Header>
|
|
7
|
+
|
|
8
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
9
|
+
{{#unless this.hasStripeConnectAccount}}
|
|
10
|
+
<div class="container">
|
|
11
|
+
<div class="max-w-3xl mx-auto mt-4">
|
|
12
|
+
<div class="content">
|
|
13
|
+
<div class="flex flex-col items-center justify-center">
|
|
14
|
+
<h1 class="text-lg font-semibold mb-1">Your account is not setup to accept payments yet.</h1>
|
|
15
|
+
<p class="text-sm mb-2">To accept payments for extensions, you must complete the onboard process via Stripe.</p>
|
|
16
|
+
<Button @type="primary" @size="lg" @text="Start payments onboard" @onClick={{transition-to "developers.payments.onboard"}} />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
{{/unless}}
|
|
22
|
+
<Table
|
|
23
|
+
@rows={{@model.data}}
|
|
24
|
+
@columns={{this.columns}}
|
|
25
|
+
@selectable={{false}}
|
|
26
|
+
@canSelectAll={{false}}
|
|
27
|
+
@onSetup={{fn (mut this.table)}}
|
|
28
|
+
@pagination={{true}}
|
|
29
|
+
@paginationMeta={{@model.meta}}
|
|
30
|
+
@page={{this.page}}
|
|
31
|
+
@onPageChange={{fn (mut this.page)}}
|
|
32
|
+
/>
|
|
33
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<Layout::Section::Header @title="Payments Onboard" />
|
|
2
|
+
|
|
3
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
4
|
+
<div class="container">
|
|
5
|
+
<div class="max-w-3xl mx-auto mt-4">
|
|
6
|
+
<div class="content">
|
|
7
|
+
<div class="onboard-header">
|
|
8
|
+
<h2 id="title" class="text-base font-semibold mb-1 {{if this.onboardCompleted 'text-green-700'}}">
|
|
9
|
+
{{#if this.onboardCompleted}}
|
|
10
|
+
<FaIcon @icon="check" @size="sm" class="text-green-700" />
|
|
11
|
+
Onboarding was completed successfully!
|
|
12
|
+
{{else}}
|
|
13
|
+
Complete this onboard process to accept payments via Fleetbase.
|
|
14
|
+
{{/if}}
|
|
15
|
+
</h2>
|
|
16
|
+
<p id="subtitle" class="text-sm mb-2">
|
|
17
|
+
{{#if this.onboardCompleted}}
|
|
18
|
+
Your onboard was successful and you're now able to sell and receive payments for published extensions.
|
|
19
|
+
{{else}}
|
|
20
|
+
Extension authors who wish to receive payments for their published extensions must complete this onboarding.
|
|
21
|
+
{{/if}}
|
|
22
|
+
</p>
|
|
23
|
+
<div class="flex mb-2">
|
|
24
|
+
{{#if this.onboardCompleted}}
|
|
25
|
+
<Button @icon="check" @type="primary" @size="lg" @text="Continue" @onClick={{transition-to "developers.payments"}} @disabled={{this.onboardInProgress}} />
|
|
26
|
+
{{else}}
|
|
27
|
+
<Button
|
|
28
|
+
@icon="play"
|
|
29
|
+
@type="default"
|
|
30
|
+
@size="lg"
|
|
31
|
+
@text={{if this.onboardInProgress "Onboard in progress" "Start onboard now"}}
|
|
32
|
+
@onClick={{perform this.startOnboard}}
|
|
33
|
+
@isLoading={{this.startOnboard.isRunning}}
|
|
34
|
+
@disabled={{this.onboardInProgress}}
|
|
35
|
+
/>
|
|
36
|
+
{{/if}}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<div
|
|
40
|
+
id="embedded-onboarding-container"
|
|
41
|
+
class="min-h-20 bg-gray-50 dark:bg-gray-100 shadow-md rounded-lg border border-gray-300 dark:border-gray-900 {{unless this.onboardInProgress 'hidden'}}"
|
|
42
|
+
{{did-insert (fn this.createTrackedElement "embeddedOnboardingContainer")}}
|
|
43
|
+
>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{outlet}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{outlet}}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<Layout::Section::Header @searchQuery={{this.query}} @onSearch={{perform this.search}} @title={{t "registry-bridge.developers.extensions.explore.explore-extensions"}} />
|
|
2
|
+
|
|
3
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
4
|
+
<div class="m-auto p-8">
|
|
5
|
+
<div class="extension-card-grid-container">
|
|
6
|
+
{{#each this.extensions as |extension|}}
|
|
7
|
+
<ExtensionCard @extension={{extension}} />
|
|
8
|
+
{{/each}}
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
<Spacer @height="300px" />
|
|
12
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<Layout::Section::Header @searchQuery={{this.query}} @onSearch={{perform this.search}} @title={{t "registry-bridge.developers.extensions.explore.explore-extensions"}} />
|
|
2
|
+
|
|
3
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
4
|
+
<div class="m-auto p-8">
|
|
5
|
+
<div class="extension-card-grid-container">
|
|
6
|
+
{{#each @model as |extension|}}
|
|
7
|
+
<ExtensionCard @extension={{extension}} />
|
|
8
|
+
{{/each}}
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
<Spacer @height="300px" />
|
|
12
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{outlet}}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<Layout::Section::Header @title={{t "registry-bridge.installed.title"}} />
|
|
2
|
+
|
|
3
|
+
<Layout::Section::Body class="overflow-y-scroll h-full">
|
|
4
|
+
<div class="m-auto p-8">
|
|
5
|
+
<div class="extension-card-grid-container">
|
|
6
|
+
{{#each @model as |extension|}}
|
|
7
|
+
<div class="extension-card-container">
|
|
8
|
+
<div class="extension-card-icon-container">
|
|
9
|
+
<Image src={{extension.icon_url}} alt={{extension.name}} @fallbackSrc={{config "defaultValues.extensionIcon"}} />
|
|
10
|
+
</div>
|
|
11
|
+
<div class="extension-card-body-container">
|
|
12
|
+
<div class="flex flex-col">
|
|
13
|
+
<div class="font-semibold text-sm block">{{extension.name}}</div>
|
|
14
|
+
<div class="text-xs">{{n-a extension.description}}</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="pt-1 space-y-2">
|
|
17
|
+
<Button
|
|
18
|
+
@type="default"
|
|
19
|
+
@text={{t "registry-bridge.common.about-extension" extensionName=extension.name}}
|
|
20
|
+
@icon="circle-info"
|
|
21
|
+
@onClick={{fn this.about extension}}
|
|
22
|
+
class="w-full"
|
|
23
|
+
/>
|
|
24
|
+
<Button @type="danger" @text={{t "registry-bridge.common.uninstall"}} @icon="trash" @onClick={{fn this.uninstall extension}} class="w-full" />
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
{{/each}}
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<Spacer @height="300px" />
|
|
32
|
+
</Layout::Section::Body>
|