@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.
Files changed (211) hide show
  1. package/.php-cs-fixer.php +29 -0
  2. package/LICENSE.md +651 -0
  3. package/README.md +122 -0
  4. package/addon/adapters/registry-bridge.js +5 -0
  5. package/addon/adapters/registry-extension-bundle.js +1 -0
  6. package/addon/adapters/registry-extension.js +1 -0
  7. package/addon/components/extension-card.hbs +12 -0
  8. package/addon/components/extension-card.js +235 -0
  9. package/addon/components/extension-form.hbs +237 -0
  10. package/addon/components/extension-form.js +123 -0
  11. package/addon/components/extension-modal-title.hbs +14 -0
  12. package/addon/components/extension-modal-title.js +20 -0
  13. package/addon/components/extension-monetize-form.hbs +56 -0
  14. package/addon/components/extension-monetize-form.js +7 -0
  15. package/addon/components/extension-pending-publish-viewer.hbs +52 -0
  16. package/addon/components/extension-pending-publish-viewer.js +37 -0
  17. package/addon/components/extension-reviewer-control.hbs +68 -0
  18. package/addon/components/extension-reviewer-control.js +68 -0
  19. package/addon/components/modals/confirm-extension-purchase.hbs +5 -0
  20. package/addon/components/modals/confirm-extension-purchase.js +3 -0
  21. package/addon/components/modals/extension-details.hbs +69 -0
  22. package/addon/components/modals/extension-details.js +33 -0
  23. package/addon/components/modals/extension-purchase-form.hbs +5 -0
  24. package/addon/components/modals/extension-purchase-form.js +3 -0
  25. package/addon/components/modals/extension-uninstall.hbs +25 -0
  26. package/addon/components/modals/extension-uninstall.js +11 -0
  27. package/addon/components/modals/select-extension-bundle.hbs +43 -0
  28. package/addon/components/modals/select-extension-bundle.js +31 -0
  29. package/addon/components/progress-bar.hbs +12 -0
  30. package/addon/components/progress-bar.js +8 -0
  31. package/addon/controllers/application.js +6 -0
  32. package/addon/controllers/developers/analytics.js +26 -0
  33. package/addon/controllers/developers/extensions/edit/bundles.js +70 -0
  34. package/addon/controllers/developers/extensions/edit/index.js +3 -0
  35. package/addon/controllers/developers/extensions/edit/monetize.js +7 -0
  36. package/addon/controllers/developers/extensions/edit.js +107 -0
  37. package/addon/controllers/developers/extensions/index.js +3 -0
  38. package/addon/controllers/developers/extensions/new.js +32 -0
  39. package/addon/controllers/developers/payments/index.js +39 -0
  40. package/addon/controllers/developers/payments/onboard.js +67 -0
  41. package/addon/controllers/explore/category.js +22 -0
  42. package/addon/controllers/explore/index.js +15 -0
  43. package/addon/controllers/installed.js +86 -0
  44. package/addon/controllers/purchased.js +18 -0
  45. package/addon/engine.js +44 -0
  46. package/addon/models/registry-extension-bundle.js +62 -0
  47. package/addon/models/registry-extension.js +215 -0
  48. package/addon/routes/application.js +12 -0
  49. package/addon/routes/developers/analytics.js +10 -0
  50. package/addon/routes/developers/credentials.js +3 -0
  51. package/addon/routes/developers/extensions/edit/bundles.js +21 -0
  52. package/addon/routes/developers/extensions/edit/details.js +3 -0
  53. package/addon/routes/developers/extensions/edit/index.js +3 -0
  54. package/addon/routes/developers/extensions/edit/monetize.js +3 -0
  55. package/addon/routes/developers/extensions/edit.js +18 -0
  56. package/addon/routes/developers/extensions/index.js +10 -0
  57. package/addon/routes/developers/extensions/new.js +3 -0
  58. package/addon/routes/developers/extensions.js +3 -0
  59. package/addon/routes/developers/payments/index.js +26 -0
  60. package/addon/routes/developers/payments/onboard.js +21 -0
  61. package/addon/routes/developers/payments.js +3 -0
  62. package/addon/routes/developers.js +3 -0
  63. package/addon/routes/explore/category.js +27 -0
  64. package/addon/routes/explore/index.js +17 -0
  65. package/addon/routes/explore.js +3 -0
  66. package/addon/routes/installed.js +10 -0
  67. package/addon/routes/purchased.js +10 -0
  68. package/addon/routes.js +28 -0
  69. package/addon/serializers/registry-extension-bundle.js +15 -0
  70. package/addon/serializers/registry-extension.js +21 -0
  71. package/addon/services/stripe.js +83 -0
  72. package/addon/styles/registry-bridge-engine.css +142 -0
  73. package/addon/templates/application.hbs +26 -0
  74. package/addon/templates/developers/analytics.hbs +83 -0
  75. package/addon/templates/developers/credentials.hbs +1 -0
  76. package/addon/templates/developers/extensions/edit/bundles.hbs +71 -0
  77. package/addon/templates/developers/extensions/edit/details.hbs +16 -0
  78. package/addon/templates/developers/extensions/edit/index.hbs +1 -0
  79. package/addon/templates/developers/extensions/edit/monetize.hbs +3 -0
  80. package/addon/templates/developers/extensions/edit.hbs +48 -0
  81. package/addon/templates/developers/extensions/index.hbs +27 -0
  82. package/addon/templates/developers/extensions/new.hbs +39 -0
  83. package/addon/templates/developers/extensions.hbs +1 -0
  84. package/addon/templates/developers/payments/index.hbs +33 -0
  85. package/addon/templates/developers/payments/onboard.hbs +48 -0
  86. package/addon/templates/developers/payments.hbs +1 -0
  87. package/addon/templates/developers.hbs +1 -0
  88. package/addon/templates/explore/category.hbs +12 -0
  89. package/addon/templates/explore/index.hbs +12 -0
  90. package/addon/templates/explore.hbs +1 -0
  91. package/addon/templates/installed.hbs +32 -0
  92. package/addon/templates/purchased.hbs +34 -0
  93. package/app/adapters/registry-bridge.js +1 -0
  94. package/app/adapters/registry-extension-bundle.js +1 -0
  95. package/app/adapters/registry-extension.js +1 -0
  96. package/app/components/extension-card.js +1 -0
  97. package/app/components/extension-form.js +1 -0
  98. package/app/components/extension-modal-title.js +1 -0
  99. package/app/components/extension-monetize-form.js +1 -0
  100. package/app/components/extension-pending-publish-viewer.js +1 -0
  101. package/app/components/extension-reviewer-control.js +1 -0
  102. package/app/components/modals/confirm-extension-purchase.js +1 -0
  103. package/app/components/modals/extension-details.js +1 -0
  104. package/app/components/modals/extension-purchase-form.js +1 -0
  105. package/app/components/modals/extension-uninstall.js +1 -0
  106. package/app/components/modals/select-extension-bundle.js +1 -0
  107. package/app/components/progress-bar.js +1 -0
  108. package/app/controllers/application.js +1 -0
  109. package/app/controllers/developers/analytics.js +1 -0
  110. package/app/controllers/developers/extensions/edit/bundles.js +1 -0
  111. package/app/controllers/developers/extensions/edit/index.js +1 -0
  112. package/app/controllers/developers/extensions/edit/monetize.js +1 -0
  113. package/app/controllers/developers/extensions/edit.js +1 -0
  114. package/app/controllers/developers/extensions/index.js +1 -0
  115. package/app/controllers/developers/extensions/new.js +1 -0
  116. package/app/controllers/developers/payments/index.js +1 -0
  117. package/app/controllers/developers/payments/onboard.js +1 -0
  118. package/app/controllers/explore/category.js +1 -0
  119. package/app/controllers/explore/index.js +1 -0
  120. package/app/controllers/installed.js +1 -0
  121. package/app/controllers/purchased.js +1 -0
  122. package/app/models/registry-extension-bundle.js +1 -0
  123. package/app/models/registry-extension.js +1 -0
  124. package/app/routes/developers/analytics.js +1 -0
  125. package/app/routes/developers/credentials.js +1 -0
  126. package/app/routes/developers/extensions/edit/bundles.js +1 -0
  127. package/app/routes/developers/extensions/edit/details.js +1 -0
  128. package/app/routes/developers/extensions/edit/index.js +1 -0
  129. package/app/routes/developers/extensions/edit/monetize.js +1 -0
  130. package/app/routes/developers/extensions/edit.js +1 -0
  131. package/app/routes/developers/extensions/index.js +1 -0
  132. package/app/routes/developers/extensions/new.js +1 -0
  133. package/app/routes/developers/extensions.js +1 -0
  134. package/app/routes/developers/payments/index.js +1 -0
  135. package/app/routes/developers/payments/onboard.js +1 -0
  136. package/app/routes/developers/payments.js +1 -0
  137. package/app/routes/developers.js +1 -0
  138. package/app/routes/explore/category.js +1 -0
  139. package/app/routes/explore/index.js +1 -0
  140. package/app/routes/explore.js +1 -0
  141. package/app/routes/installed.js +1 -0
  142. package/app/routes/purchased.js +1 -0
  143. package/app/serializers/registry-extension-bundle.js +1 -0
  144. package/app/serializers/registry-extension.js +1 -0
  145. package/app/services/stripe.js +1 -0
  146. package/app/templates/developers/analytics.js +1 -0
  147. package/app/templates/developers/credentials.js +1 -0
  148. package/app/templates/developers/extensions/edit/bundles.js +1 -0
  149. package/app/templates/developers/extensions/edit/details.js +1 -0
  150. package/app/templates/developers/extensions/edit/index.js +1 -0
  151. package/app/templates/developers/extensions/edit/monetize.js +1 -0
  152. package/app/templates/developers/extensions/edit.js +1 -0
  153. package/app/templates/developers/extensions/index.js +1 -0
  154. package/app/templates/developers/extensions/new.js +1 -0
  155. package/app/templates/developers/extensions.js +1 -0
  156. package/app/templates/developers/payments/index.js +1 -0
  157. package/app/templates/developers/payments/onboard.js +1 -0
  158. package/app/templates/developers/payments.js +1 -0
  159. package/app/templates/developers.js +1 -0
  160. package/app/templates/explore/category.js +1 -0
  161. package/app/templates/explore/index.js +1 -0
  162. package/app/templates/explore.js +1 -0
  163. package/app/templates/installed.js +1 -0
  164. package/app/templates/purchased.js +1 -0
  165. package/composer.json +95 -0
  166. package/config/environment.js +28 -0
  167. package/extension.json +10 -0
  168. package/index.js +26 -0
  169. package/package.json +129 -0
  170. package/phpstan.neon.dist +8 -0
  171. package/phpunit.xml.dist +16 -0
  172. package/server/.gitattributes +14 -0
  173. package/server/config/registry-bridge.php +32 -0
  174. package/server/migrations/2024_03_19_060627_create_registry_users_table.php +42 -0
  175. package/server/migrations/2024_03_21_051614_create_registry_extensions_table.php +76 -0
  176. package/server/migrations/2024_03_25_044537_create_registry_extension_bundles_table.php +54 -0
  177. package/server/migrations/2024_03_29_072101_registry_extension_installs.php +35 -0
  178. package/server/migrations/2024_07_16_155000_create_registry_extension_purchases.php +41 -0
  179. package/server/seeders/ExtensionsCategorySeeder.php +359 -0
  180. package/server/src/Console/Commands/Initialize.php +35 -0
  181. package/server/src/Console/Commands/PostInstallExtension.php +84 -0
  182. package/server/src/Exceptions/InstallFailedException.php +21 -0
  183. package/server/src/Expansions/CategoryExpansion.php +30 -0
  184. package/server/src/Http/Controllers/Internal/v1/ExtensionInstallerController.php +153 -0
  185. package/server/src/Http/Controllers/Internal/v1/RegistryAuthController.php +230 -0
  186. package/server/src/Http/Controllers/Internal/v1/RegistryController.php +54 -0
  187. package/server/src/Http/Controllers/Internal/v1/RegistryExtensionBundleController.php +112 -0
  188. package/server/src/Http/Controllers/Internal/v1/RegistryExtensionController.php +257 -0
  189. package/server/src/Http/Controllers/Internal/v1/RegistryPaymentsController.php +227 -0
  190. package/server/src/Http/Controllers/RegistryBridgeController.php +13 -0
  191. package/server/src/Http/Filter/RegistryExtensionFilter.php +80 -0
  192. package/server/src/Http/Requests/AddRegistryUserRequest.php +47 -0
  193. package/server/src/Http/Requests/AuthenticateRegistryUserRequest.php +47 -0
  194. package/server/src/Http/Requests/CreateRegistryExtensionBundleRequest.php +42 -0
  195. package/server/src/Http/Requests/CreateRegistryExtensionRequest.php +31 -0
  196. package/server/src/Http/Requests/InstallExtensionRequest.php +30 -0
  197. package/server/src/Http/Requests/RegistryAuthRequest.php +46 -0
  198. package/server/src/Http/Requests/RegistryExtensionActionRequest.php +30 -0
  199. package/server/src/Http/Resources/RegistryUser.php +40 -0
  200. package/server/src/Models/RegistryExtension.php +656 -0
  201. package/server/src/Models/RegistryExtensionBundle.php +1015 -0
  202. package/server/src/Models/RegistryExtensionInstall.php +76 -0
  203. package/server/src/Models/RegistryExtensionPurchase.php +87 -0
  204. package/server/src/Models/RegistryUser.php +140 -0
  205. package/server/src/Providers/RegistryBridgeServiceProvider.php +117 -0
  206. package/server/src/Support/Bridge.php +53 -0
  207. package/server/src/Support/Utils.php +19 -0
  208. package/server/src/routes.php +58 -0
  209. package/server/tests/Feature.php +5 -0
  210. package/translations/en-us.yaml +119 -0
  211. 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,3 @@
1
+ <div class="flex-1">
2
+ <ExtensionMonetizeForm @extension={{@model}} />
3
+ </div>
@@ -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>