ember-tribe 2.6.9 → 3.0.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.
- package/LICENSE.md +5 -670
- package/README.md +73 -48
- package/blueprints/ember-tribe/files/app/index.html +16 -14
- package/blueprints/ember-tribe/files/config/environment.js +54 -0
- package/blueprints/ember-tribe/files/ember-cli-build.js +20 -0
- package/blueprints/ember-tribe/files/public/composer.json +11 -13
- package/blueprints/ember-tribe/files/public/favicon.png +0 -0
- package/blueprints/ember-tribe/files/pwa-assets.config.js +12 -0
- package/blueprints/ember-tribe/files/vite.config.js +43 -0
- package/blueprints/ember-tribe/index.js +53 -59
- package/package.json +51 -44
- package/blueprints/ember-tribe/files/app/modifiers/ripple.js +0 -6
- package/blueprints/ember-tribe/files/config/dotenv.js +0 -14
- package/blueprints/ember-tribe/files/config/manifest.js +0 -31
- package/blueprints/ember-tribe/files/public/assets/img/cover.png +0 -0
- package/blueprints/ember-tribe/files/public/assets/img/flame.png +0 -0
- package/config/environment.js +0 -13
package/README.md
CHANGED
|
@@ -64,9 +64,9 @@ ember install ember-tribe
|
|
|
64
64
|
|
|
65
65
|
The addon automatically configures following essential packages:
|
|
66
66
|
|
|
67
|
-
**Ember Addons:** `ember-
|
|
67
|
+
**Ember Addons:** `ember-modifier`, `ember-composable-helpers`, `ember-truth-helpers`, `ember-file-upload` , `ember-power-select`
|
|
68
68
|
|
|
69
|
-
**NPM Packages:** `bootstrap`, `@popperjs/core`, `animate.css`, `video.js`, `swiper`,
|
|
69
|
+
**NPM Packages:** `bootstrap`, `@popperjs/core`, `animate.css`, `video.js`, `swiper`, `howler`, `sortablejs`, `papaparse`
|
|
70
70
|
|
|
71
71
|
**Built-in features that can be used in routes and components**:
|
|
72
72
|
|
|
@@ -146,7 +146,7 @@ Always begin by understanding your data types, then define the routes that load
|
|
|
146
146
|
**Types**
|
|
147
147
|
|
|
148
148
|
8. **Start by Understanding Your Data**
|
|
149
|
-
|
|
149
|
+
Before writing any code, read the project description and `types.json` to understand the data model. Every architectural decision that follows — which routes to create, which services to build, whether components are even needed — depends on a clear understanding of the underlying types.
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -156,7 +156,7 @@ Always begin by understanding your data types, then define the routes that load
|
|
|
156
156
|
Match route names to user mental models. Use consistent, predictable naming conventions so that routes are self-documenting.
|
|
157
157
|
|
|
158
158
|
10. **Routes Are for Fetching, Not Logic**
|
|
159
|
-
|
|
159
|
+
Routes should primarily perform read/fetch operations and pass data down to components or services. Keep JavaScript in routes to a minimum — business logic belongs in components and services, not routes.
|
|
160
160
|
|
|
161
161
|
11. **Route Parameters**
|
|
162
162
|
Keep `get_vars` minimal and meaningful. Load only the data types that each specific route actually needs — avoid over-fetching.
|
|
@@ -270,7 +270,6 @@ The storylang.json file contains seven main sections:
|
|
|
270
270
|
}
|
|
271
271
|
```
|
|
272
272
|
|
|
273
|
-
|
|
274
273
|
#### Section Definitions
|
|
275
274
|
|
|
276
275
|
#### 1. Types
|
|
@@ -284,7 +283,8 @@ The storylang.json file contains seven main sections:
|
|
|
284
283
|
"types": [
|
|
285
284
|
{
|
|
286
285
|
"slug": "type-slug", //type slug as defined in `types.json` blueprint
|
|
287
|
-
"used_in": {
|
|
286
|
+
"used_in": {
|
|
287
|
+
//where this type is used
|
|
288
288
|
"routes": ["route-name"],
|
|
289
289
|
"components": ["component-name"],
|
|
290
290
|
"services": ["service-name"],
|
|
@@ -314,7 +314,10 @@ The storylang.json file contains seven main sections:
|
|
|
314
314
|
"tracked_vars": [{ "<variableName>": "<dataType>" }],
|
|
315
315
|
"get_vars": [{ "<paramName>": "<dataType>" }],
|
|
316
316
|
"getters": ["derived-property-name"],
|
|
317
|
-
"actions": [
|
|
317
|
+
"actions": [
|
|
318
|
+
"frontend-action",
|
|
319
|
+
{ "backend-action": ["custom/path/file.php"] }
|
|
320
|
+
],
|
|
318
321
|
"functions": ["helper-method", "compute-something"],
|
|
319
322
|
"helpers": ["helper1"],
|
|
320
323
|
"services": ["service1"],
|
|
@@ -426,7 +429,10 @@ The storylang.json file contains seven main sections:
|
|
|
426
429
|
"name": "service-name",
|
|
427
430
|
"tracked_vars": [{ "<variableName>": "<dataType>" }],
|
|
428
431
|
"getters": ["derived-property-name"],
|
|
429
|
-
"actions": [
|
|
432
|
+
"actions": [
|
|
433
|
+
"frontend-action",
|
|
434
|
+
{ "backend-action": ["custom/path/file.php"] }
|
|
435
|
+
],
|
|
430
436
|
"functions": ["internal-method"],
|
|
431
437
|
"helpers": ["helper1"],
|
|
432
438
|
"services": ["dependency1", "dependency2"]
|
|
@@ -449,7 +455,11 @@ The storylang.json file contains seven main sections:
|
|
|
449
455
|
"functions": ["build-visualization"],
|
|
450
456
|
"actions": [
|
|
451
457
|
"reset-state",
|
|
452
|
-
{
|
|
458
|
+
{
|
|
459
|
+
"assemble-data-for-visualization": [
|
|
460
|
+
"custom/visualizations/assemble-data.php"
|
|
461
|
+
]
|
|
462
|
+
},
|
|
453
463
|
"updateVisualization"
|
|
454
464
|
],
|
|
455
465
|
"helpers": ["validateConfig", "generatePreview"],
|
|
@@ -476,7 +486,10 @@ The storylang.json file contains seven main sections:
|
|
|
476
486
|
"tracked_vars": [{ "<variableName>": "<dataType>" }],
|
|
477
487
|
"inherited_args": [{ "<argumentName>": "<argType>" }],
|
|
478
488
|
"getters": ["derived-property-name"],
|
|
479
|
-
"actions": [
|
|
489
|
+
"actions": [
|
|
490
|
+
"frontend-action",
|
|
491
|
+
{ "backend-action": ["custom/path/file.php"] }
|
|
492
|
+
],
|
|
480
493
|
"functions": ["internal-method"],
|
|
481
494
|
"helpers": ["helper1", "helper2"],
|
|
482
495
|
"modifiers": ["modifier1"],
|
|
@@ -486,7 +499,6 @@ The storylang.json file contains seven main sections:
|
|
|
486
499
|
}
|
|
487
500
|
```
|
|
488
501
|
|
|
489
|
-
|
|
490
502
|
**Example**:
|
|
491
503
|
|
|
492
504
|
```json
|
|
@@ -502,7 +514,12 @@ The storylang.json file contains seven main sections:
|
|
|
502
514
|
{ "onDelete": "action" }
|
|
503
515
|
],
|
|
504
516
|
"getters": ["trust-score-color", "display-label"],
|
|
505
|
-
"actions": [
|
|
517
|
+
"actions": [
|
|
518
|
+
"toggle-selection",
|
|
519
|
+
"expand-details",
|
|
520
|
+
{ "save-file": ["custom/files/save.php"] },
|
|
521
|
+
{ "delete-file": ["custom/files/delete.php"] }
|
|
522
|
+
],
|
|
506
523
|
"helpers": ["formatDate", "truncateText"],
|
|
507
524
|
"modifiers": ["tooltip"],
|
|
508
525
|
"services": ["store", "router"]
|
|
@@ -681,7 +698,7 @@ When querying records, `modules` and `filter` serve distinct purposes that map d
|
|
|
681
698
|
|
|
682
699
|
**`modules`** applies **AND** logic: every key-value pair in the object must match for a record to be included. Use this when you want to narrow results to records that simultaneously satisfy all of the given conditions — for example, posts that are both `published` and belong to a specific `author_id`.
|
|
683
700
|
|
|
684
|
-
**`filter`** applies **OR** logic: a record is included if it matches
|
|
701
|
+
**`filter`** applies **OR** logic: a record is included if it matches _any_ of the key-value pairs. Use this when you want to broaden results across multiple values of a field — for example, items whose `category` is either `tech` or `design`.
|
|
685
702
|
|
|
686
703
|
The two can be combined in the same query. For instance, to find all published posts that are tagged as either `news` or `feature`:
|
|
687
704
|
|
|
@@ -990,11 +1007,17 @@ import Service from '@ember/service';
|
|
|
990
1007
|
export default class ShoppingCartService extends Service {
|
|
991
1008
|
items = new TrackedArray([]);
|
|
992
1009
|
|
|
993
|
-
add(item) {
|
|
1010
|
+
add(item) {
|
|
1011
|
+
this.items.push(item);
|
|
1012
|
+
}
|
|
994
1013
|
|
|
995
|
-
remove(item) {
|
|
1014
|
+
remove(item) {
|
|
1015
|
+
this.items.splice(this.items.indexOf(item), 1);
|
|
1016
|
+
}
|
|
996
1017
|
|
|
997
|
-
empty() {
|
|
1018
|
+
empty() {
|
|
1019
|
+
this.items.splice(0, this.items.length);
|
|
1020
|
+
}
|
|
998
1021
|
}
|
|
999
1022
|
```
|
|
1000
1023
|
|
|
@@ -1109,16 +1132,16 @@ async uploadFile(file) {
|
|
|
1109
1132
|
Use Ember's built-in `<Input>` component instead of a raw `<input>` tag — it automatically updates bound state via `@value`.
|
|
1110
1133
|
|
|
1111
1134
|
```handlebars
|
|
1112
|
-
<div class=
|
|
1113
|
-
<label for=
|
|
1135
|
+
<div class='mb-3'>
|
|
1136
|
+
<label for='input-name' class='form-label'>Name:</label>
|
|
1114
1137
|
<Input
|
|
1115
|
-
id=
|
|
1116
|
-
class=
|
|
1117
|
-
@type=
|
|
1138
|
+
id='input-name'
|
|
1139
|
+
class='form-control'
|
|
1140
|
+
@type='text'
|
|
1118
1141
|
@value={{this.name}}
|
|
1119
1142
|
disabled={{this.isReadOnly}}
|
|
1120
|
-
maxlength=
|
|
1121
|
-
placeholder=
|
|
1143
|
+
maxlength='50'
|
|
1144
|
+
placeholder='Enter your name'
|
|
1122
1145
|
/>
|
|
1123
1146
|
</div>
|
|
1124
1147
|
```
|
|
@@ -1134,31 +1157,32 @@ export default class ExampleComponent extends Component {
|
|
|
1134
1157
|
```
|
|
1135
1158
|
|
|
1136
1159
|
```handlebars
|
|
1137
|
-
<div class=
|
|
1160
|
+
<div class='form-check mb-3'>
|
|
1138
1161
|
<Input
|
|
1139
|
-
id=
|
|
1140
|
-
class=
|
|
1141
|
-
@type=
|
|
1162
|
+
id='admin-checkbox'
|
|
1163
|
+
class='form-check-input'
|
|
1164
|
+
@type='checkbox'
|
|
1142
1165
|
@checked={{this.isAdmin}}
|
|
1143
|
-
{{on
|
|
1166
|
+
{{on 'input' this.validateRole}}
|
|
1144
1167
|
/>
|
|
1145
|
-
<label for=
|
|
1168
|
+
<label for='admin-checkbox' class='form-check-label'>Is Admin?</label>
|
|
1146
1169
|
</div>
|
|
1147
1170
|
```
|
|
1148
1171
|
|
|
1149
1172
|
```handlebars
|
|
1150
|
-
<div class=
|
|
1151
|
-
<label for=
|
|
1173
|
+
<div class='mb-3'>
|
|
1174
|
+
<label for='user-comment' class='form-label'>Comment:</label>
|
|
1152
1175
|
<Textarea
|
|
1153
|
-
id=
|
|
1154
|
-
class=
|
|
1176
|
+
id='user-comment'
|
|
1177
|
+
class='form-control'
|
|
1155
1178
|
@value={{this.userComment}}
|
|
1156
|
-
rows=
|
|
1179
|
+
rows='6'
|
|
1157
1180
|
/>
|
|
1158
1181
|
</div>
|
|
1159
1182
|
```
|
|
1160
1183
|
|
|
1161
1184
|
**Key rules for `<Input>` and `<Textarea>`:**
|
|
1185
|
+
|
|
1162
1186
|
- `@value`, `@type`, and `@checked` must be passed as **arguments** (with `@`).
|
|
1163
1187
|
- Use the `{{on}}` modifier for event handling (e.g. `{{on "input" this.handler}}`).
|
|
1164
1188
|
- Bootstrap styles `form-control` correctly when `disabled` is present
|
|
@@ -1170,14 +1194,14 @@ export default class ExampleComponent extends Component {
|
|
|
1170
1194
|
**Single select (Bootstrap-compatible wrapper):**
|
|
1171
1195
|
|
|
1172
1196
|
```handlebars
|
|
1173
|
-
<div class=
|
|
1174
|
-
<label class=
|
|
1175
|
-
<div class=
|
|
1197
|
+
<div class='mb-3'>
|
|
1198
|
+
<label class='form-label'>Assign Category:</label>
|
|
1199
|
+
<div class='form-control p-0 border-0'>
|
|
1176
1200
|
<PowerSelect
|
|
1177
1201
|
@options={{this.categories}}
|
|
1178
1202
|
@selected={{this.selectedCategory}}
|
|
1179
1203
|
@onChange={{this.handleCategoryChange}}
|
|
1180
|
-
@placeholder=
|
|
1204
|
+
@placeholder='Select a category'
|
|
1181
1205
|
as |category|
|
|
1182
1206
|
>
|
|
1183
1207
|
{{category.name}}
|
|
@@ -1210,14 +1234,14 @@ export default class ExampleComponent extends Component {
|
|
|
1210
1234
|
**Multi-select variant:**
|
|
1211
1235
|
|
|
1212
1236
|
```handlebars
|
|
1213
|
-
<div class=
|
|
1214
|
-
<label class=
|
|
1215
|
-
<div class=
|
|
1237
|
+
<div class='mb-3'>
|
|
1238
|
+
<label class='form-label'>Assign Tags:</label>
|
|
1239
|
+
<div class='form-control p-0 border-0'>
|
|
1216
1240
|
<PowerSelectMultiple
|
|
1217
1241
|
@options={{this.availableTags}}
|
|
1218
1242
|
@selected={{this.selectedTags}}
|
|
1219
1243
|
@onChange={{this.handleTagsChange}}
|
|
1220
|
-
@placeholder=
|
|
1244
|
+
@placeholder='Select tags'
|
|
1221
1245
|
as |tag|
|
|
1222
1246
|
>
|
|
1223
1247
|
{{tag.label}}
|
|
@@ -1229,15 +1253,15 @@ export default class ExampleComponent extends Component {
|
|
|
1229
1253
|
**Async options loaded from the store:**
|
|
1230
1254
|
|
|
1231
1255
|
```handlebars
|
|
1232
|
-
<div class=
|
|
1233
|
-
<label class=
|
|
1234
|
-
<div class=
|
|
1256
|
+
<div class='mb-3'>
|
|
1257
|
+
<label class='form-label'>Select Project:</label>
|
|
1258
|
+
<div class='form-control p-0 border-0'>
|
|
1235
1259
|
<PowerSelect
|
|
1236
1260
|
@options={{this.projects}}
|
|
1237
1261
|
@selected={{this.selectedProject}}
|
|
1238
1262
|
@onChange={{this.handleProjectChange}}
|
|
1239
|
-
@searchField=
|
|
1240
|
-
@placeholder=
|
|
1263
|
+
@searchField='name'
|
|
1264
|
+
@placeholder='Search projects...'
|
|
1241
1265
|
as |project|
|
|
1242
1266
|
>
|
|
1243
1267
|
{{project.modules.name}}
|
|
@@ -1247,6 +1271,7 @@ export default class ExampleComponent extends Component {
|
|
|
1247
1271
|
```
|
|
1248
1272
|
|
|
1249
1273
|
**Key rules for `<PowerSelect>`:**
|
|
1274
|
+
|
|
1250
1275
|
- `@options`, `@selected`, and `@onChange` are always required arguments.
|
|
1251
1276
|
- Use `@searchField` to specify which object property drives the built-in search filter.
|
|
1252
1277
|
- For multi-select, use `<PowerSelectMultiple>` — the `@onChange` callback receives the full updated array, so assign it directly to your tracked property.
|
|
@@ -1270,4 +1295,4 @@ You can then upload the `dist/` folder to [Junction (open source)](http://localh
|
|
|
1270
1295
|
|
|
1271
1296
|
# License
|
|
1272
1297
|
|
|
1273
|
-
This project is licensed under the [GNU GPL v3 License](LICENSE.md).
|
|
1298
|
+
This project is licensed under the [GNU GPL v3 License](LICENSE.md).
|
|
@@ -1,30 +1,28 @@
|
|
|
1
|
-
<!
|
|
1
|
+
<!DOCTYPE html>
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
|
-
<meta charset="utf-8"
|
|
4
|
+
<meta charset="utf-8">
|
|
5
5
|
<title><%= classifiedPackageName %></title>
|
|
6
6
|
<meta name="description" content="" />
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
8
8
|
|
|
9
9
|
{{content-for "head"}}
|
|
10
10
|
|
|
11
|
-
<link rel="
|
|
12
|
-
<
|
|
11
|
+
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
|
|
12
|
+
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/new.css">
|
|
13
13
|
|
|
14
|
-
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css" />
|
|
15
14
|
<link
|
|
16
|
-
integrity=""
|
|
17
15
|
rel="stylesheet"
|
|
18
|
-
href="
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
|
16
|
+
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"
|
|
17
|
+
integrity="sha512-Evv84Mr4kqVGRNSgIGL/F/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+/U6swU2Im1vVX0SVk9ABhg=="
|
|
18
|
+
crossorigin="anonymous"
|
|
19
|
+
referrerpolicy="no-referrer"
|
|
23
20
|
/>
|
|
24
21
|
|
|
25
22
|
{{content-for "head-footer"}}
|
|
26
23
|
</head>
|
|
27
24
|
<body>
|
|
25
|
+
<!-- Full-screen loading overlay shown while Ember boots -->
|
|
28
26
|
<div
|
|
29
27
|
class="d-flex align-items-center justify-content-center vh-100 w-100 position-fixed animate__animated animate__fadeIn animate__faster"
|
|
30
28
|
id="loading"
|
|
@@ -40,12 +38,16 @@
|
|
|
40
38
|
class="position-absolute vh-100 w-100 bg-light opacity-75"
|
|
41
39
|
></div>
|
|
42
40
|
</div>
|
|
43
|
-
|
|
41
|
+
|
|
44
42
|
{{content-for "body"}}
|
|
45
43
|
|
|
46
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/js/all.min.js"></script>
|
|
47
44
|
<script src="{{rootURL}}assets/vendor.js"></script>
|
|
48
|
-
<script src="{{rootURL}}assets
|
|
45
|
+
<script src="{{rootURL}}assets/new.js"></script>
|
|
46
|
+
|
|
47
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/js/all.min.js"
|
|
48
|
+
integrity="sha512-1mCLtfa/wR7Bxm5mXQrN9K5OPF8oE6DSGE+L9XS4MCQl1bWEBIfmFmQjH0BjkgBbXbJxqGvBFHN9VPuVoR3UA=="
|
|
49
|
+
crossorigin="anonymous"
|
|
50
|
+
referrerpolicy="no-referrer"></script>
|
|
49
51
|
|
|
50
52
|
{{content-for "body-footer"}}
|
|
51
53
|
</body>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
require('dotenv').config()
|
|
3
|
+
|
|
4
|
+
module.exports = function (environment) {
|
|
5
|
+
const ENV = {
|
|
6
|
+
modulePrefix: 'new',
|
|
7
|
+
environment,
|
|
8
|
+
rootURL: '/',
|
|
9
|
+
locationType: 'history',
|
|
10
|
+
EmberENV: {
|
|
11
|
+
EXTEND_PROTOTYPES: false,
|
|
12
|
+
FEATURES: {
|
|
13
|
+
// Here you can enable experimental features on an ember canary build
|
|
14
|
+
// e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
APP: {
|
|
19
|
+
// Here you can pass flags/options to your application instance
|
|
20
|
+
// when it is created
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
TribeENV: {
|
|
24
|
+
API_URL: process.env.TRIBE_API_URL,
|
|
25
|
+
API_KEY: process.env.TRIBE_API_KEY,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
if (environment === 'development') {
|
|
30
|
+
// ENV.APP.LOG_RESOLVER = true;
|
|
31
|
+
// ENV.APP.LOG_ACTIVE_GENERATION = true;
|
|
32
|
+
// ENV.APP.LOG_TRANSITIONS = true;
|
|
33
|
+
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
|
|
34
|
+
// ENV.APP.LOG_VIEW_LOOKUPS = true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (environment === 'test') {
|
|
38
|
+
// Testem prefers this...
|
|
39
|
+
ENV.locationType = 'none';
|
|
40
|
+
|
|
41
|
+
// keep test console output quieter
|
|
42
|
+
ENV.APP.LOG_ACTIVE_GENERATION = false;
|
|
43
|
+
ENV.APP.LOG_VIEW_LOOKUPS = false;
|
|
44
|
+
|
|
45
|
+
ENV.APP.rootElement = '#ember-testing';
|
|
46
|
+
ENV.APP.autoboot = false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (environment === 'production') {
|
|
50
|
+
// here you can enable a production-specific feature
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return ENV;
|
|
54
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
require('dotenv').config();
|
|
3
|
+
|
|
4
|
+
const { compatBuild } = require('@embroider/compat');
|
|
5
|
+
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
|
|
6
|
+
|
|
7
|
+
module.exports = async function (defaults) {
|
|
8
|
+
const { buildOnce } = await import('@embroider/vite');
|
|
9
|
+
|
|
10
|
+
const app = new EmberApp(defaults, {
|
|
11
|
+
emberData: {
|
|
12
|
+
deprecations: { DEPRECATE_STORE_EXTENDS_EMBER_OBJECT: false }
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return compatBuild(app, buildOnce, {
|
|
17
|
+
staticInvokables: true, // this is the default so you don't need to set it
|
|
18
|
+
splitAtRoutes: ['route.name'], // can also be a RegExp
|
|
19
|
+
);
|
|
20
|
+
};
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"agence104/livekit-server-sdk": "1.1"
|
|
14
|
-
}
|
|
2
|
+
"name": "tribe/tribe",
|
|
3
|
+
"description": "Tribe is a project management framework by Wildfire.",
|
|
4
|
+
"license": "GPL-3.0-or-later",
|
|
5
|
+
"require": {
|
|
6
|
+
"php": "^8.0",
|
|
7
|
+
"tribe/core": "^5.2",
|
|
8
|
+
"vlucas/phpdotenv": "^5.2",
|
|
9
|
+
"alsvanzelf/jsonapi": "^2.4",
|
|
10
|
+
"phpmailer/phpmailer": "^6.7",
|
|
11
|
+
"guzzlehttp/guzzle": "^7.7"
|
|
12
|
+
}
|
|
15
13
|
}
|
|
Binary file
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { VitePWA } from 'vite-plugin-pwa';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [
|
|
6
|
+
// ...your other Ember/Vite plugins
|
|
7
|
+
|
|
8
|
+
VitePWA({
|
|
9
|
+
registerType: 'autoUpdate',
|
|
10
|
+
includeAssets: ['favicon.png', 'favicon.ico', 'apple-touch-icon.png', 'mask-icon.svg'],
|
|
11
|
+
manifest: {
|
|
12
|
+
name: 'ember-tribe',
|
|
13
|
+
short_name: 'ember-tribe',
|
|
14
|
+
description: 'Built using ember-tribe.',
|
|
15
|
+
start_url: '/',
|
|
16
|
+
scope: '/',
|
|
17
|
+
display: 'standalone',
|
|
18
|
+
background_color: '#e9ecef',
|
|
19
|
+
theme_color: '#0A1119',
|
|
20
|
+
prefer_related_applications: true,
|
|
21
|
+
icons: [
|
|
22
|
+
{
|
|
23
|
+
src: '/favicon.png',
|
|
24
|
+
sizes: '512x512',
|
|
25
|
+
type: 'image/png',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
// PWA installers prefer a 'any maskable' entry
|
|
29
|
+
src: '/favicon.png',
|
|
30
|
+
sizes: '512x512',
|
|
31
|
+
type: 'image/png',
|
|
32
|
+
purpose: 'any maskable',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
// Apple / MS meta that vite-plugin-pwa injects into the HTML <head>
|
|
37
|
+
devOptions: {
|
|
38
|
+
enabled: true,
|
|
39
|
+
},
|
|
40
|
+
})
|
|
41
|
+
]
|
|
42
|
+
})
|
|
43
|
+
|
|
@@ -1,67 +1,61 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
-
normalizeEntityName() {},
|
|
4
|
+
normalizeEntityName() {},
|
|
5
5
|
|
|
6
6
|
afterInstall() {
|
|
7
|
-
return this.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
{ name: 'papaparse' },
|
|
60
|
-
{ name: 'sortablejs' },
|
|
61
|
-
{ name: 'highlight.js' },
|
|
62
|
-
{ name: 'uuid' },
|
|
63
|
-
{ name: 'pretty-print-json' },
|
|
64
|
-
]);
|
|
7
|
+
return this.addPackagesToProject([
|
|
8
|
+
{ name: 'bootstrap' },
|
|
9
|
+
{ name: '@popperjs/core' },
|
|
10
|
+
{ name: 'sass' },
|
|
11
|
+
{ name: 'animate.css' },
|
|
12
|
+
{ name: 'video.js' },
|
|
13
|
+
{ name: 'swiper' },
|
|
14
|
+
{ name: 'howler' },
|
|
15
|
+
{ name: '@editorjs/editorjs' },
|
|
16
|
+
{ name: '@editorjs/image' },
|
|
17
|
+
{ name: '@editorjs/header' },
|
|
18
|
+
{ name: '@editorjs/raw' },
|
|
19
|
+
{ name: '@editorjs/code' },
|
|
20
|
+
{ name: '@editorjs/marker' },
|
|
21
|
+
{ name: '@editorjs/delimiter' },
|
|
22
|
+
{ name: '@editorjs/quote' },
|
|
23
|
+
{ name: '@editorjs/list' },
|
|
24
|
+
{ name: '@editorjs/attaches' },
|
|
25
|
+
{ name: '@editorjs/footnotes' },
|
|
26
|
+
{ name: '@editorjs/table' },
|
|
27
|
+
{ name: 'editorjs-hyperlink' },
|
|
28
|
+
{ name: '@embroider/vite' },
|
|
29
|
+
{ name: '@embroider/compat' },
|
|
30
|
+
{ name: 'miragejs' },
|
|
31
|
+
{ name: 'papaparse' },
|
|
32
|
+
{ name: 'sortablejs' },
|
|
33
|
+
{ name: 'highlight.js' },
|
|
34
|
+
{ name: 'uuid' },
|
|
35
|
+
{ name: 'pretty-print-json' },
|
|
36
|
+
{ name: 'dotenv' },
|
|
37
|
+
{ name: '@vite-pwa/assets-generator' },
|
|
38
|
+
{ name: 'vite-plugin-pwa' },
|
|
39
|
+
]).then(() => {
|
|
40
|
+
return this.addAddonsToProject({
|
|
41
|
+
packages: [
|
|
42
|
+
{ name: 'ember-modifier' },
|
|
43
|
+
{ name: '@nullvoxpopuli/ember-composable-helpers' },
|
|
44
|
+
{ name: 'ember-truth-helpers' },
|
|
45
|
+
{ name: 'ember-math-helpers' },
|
|
46
|
+
{ name: 'ember-cli-string-helpers' },
|
|
47
|
+
{ name: 'ember-promise-helpers' },
|
|
48
|
+
{ name: 'ember-tag-input' },
|
|
49
|
+
{ name: 'ember-file-upload' },
|
|
50
|
+
{ name: 'ember-toggle' },
|
|
51
|
+
{ name: 'ember-basic-dropdown' },
|
|
52
|
+
{ name: 'ember-power-select' },
|
|
53
|
+
{ name: 'ember-click-outside' },
|
|
54
|
+
{ name: 'ember-keyboard' },
|
|
55
|
+
{ name: 'ember-concurrency' },
|
|
56
|
+
{ name: 'ember-animated' },
|
|
57
|
+
],
|
|
58
|
+
});
|
|
65
59
|
});
|
|
66
60
|
},
|
|
67
61
|
};
|