Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .ember-cli
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,12 @@
Setting `disableAnalytics` to true will prevent any data from being sent.
*/
"disableAnalytics": false,

/**
Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript
rather than JavaScript by default, when a TypeScript version of a given blueprint is available.
*/
"isTypeScriptProject": false,

"port": 4300
}
5 changes: 4 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@
# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try


# custom
/mirage/mirage
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ module.exports = {
},
},
{
// Test files:
// test files
files: ['tests/**/*-test.{js,ts}'],
extends: ['plugin:qunit/recommended'],
},
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try

.travis/*.key
# broccoli-debug
/DEBUG/
4 changes: 4 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@
/coverage/
!.*
.eslintcache
.lint-todo/

# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ You will need the following things properly installed on your computer.

* [Git](https://git-scm.com/)
* [Node.js](https://nodejs.org/) (with npm)
* [Ember CLI](https://ember-cli.com/)
* [Ember CLI](https://cli.emberjs.com/release/)
* [Google Chrome](https://google.com/chrome/)

## Installation
Expand Down Expand Up @@ -49,7 +49,7 @@ Specify what it takes to deploy your app.
## Further Reading / Useful Links

* [ember.js](https://emberjs.com/)
* [ember-cli](https://ember-cli.com/)
* [ember-cli](https://cli.emberjs.com/release/)
* Development Browser Extensions
* [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
* [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)
13 changes: 10 additions & 3 deletions app/components/calendar-slot.gjs
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,11 @@ export default class CalendarSlot extends Component {
}

get hidden() {
return !this.slot?.isNotFull && !this.isCommittedTo;
return !this.isNotFull && !this.isCommittedTo;
}

get disabled() {
const isNotFull = this.slot?.isNotFull;
const isNotFull = this.isNotFull;
const start = this.slot?.start;
const toggleIsRunning = this.toggle.isRunning;

Expand All @@ -118,6 +118,13 @@ export default class CalendarSlot extends Component {
return `${dividend}/${divisor}`;
}

get isNotFull() {
const count = this.slot?.count ?? 0;
const commitmentCount = this.slot?.commitments?.length ?? 0;

return count === 0 || commitmentCount < count;
}

toggle = task({ drop: true }, async (event) => {
event.preventDefault();

Expand All @@ -142,7 +149,7 @@ export default class CalendarSlot extends Component {
const errorDetail = error?.errors?.[0]?.detail;
this.args.setError(errorDetail || 'Couldn’t save your change');
}
} else if (this.slot?.isNotFull) {
} else if (this.isNotFull) {
const newRecord = this.store.createRecord('commitment', {
slot: this.slot,
person: this.person,
Expand Down
4 changes: 2 additions & 2 deletions app/components/ride-form.gjs
Original file line number Diff line number Diff line change
Expand Up @@ -710,12 +710,12 @@ export default class RideForm extends Component {
@action
handleSubmit(event) {
event?.preventDefault?.();
this.save?.();
return this.save?.();
}

@action
handleCancel(event) {
event?.preventDefault?.();
this.cancel?.();
return this.cancel?.();
}
}
51 changes: 26 additions & 25 deletions app/controllers/admin-calendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,17 +75,18 @@ export default class AdminCalendarController extends CalendarController {
@setDiff('activePeople', 'people')
remainingPeople;

@mapBy('viewingSlot.commitments', 'person')
viewingSlotPeople;

@mapBy('viewingSlotPeople', 'id')
viewingSlotPeopleIds;

@computed('activePeople.[]', 'viewingSlotPeopleIds.[]')
@computed('activePeople.[]', 'viewingSlot.commitments.{[],@each.person}')
get uncommittedPeople() {
const alreadyCommittedPeople = this.viewingSlotPeopleIds;
return this.activePeople.reject((person) =>
alreadyCommittedPeople.includes(person.id),
const commitments = this.viewingSlot?.commitments || [];
const committedIds = new Set(
Array.from(commitments)
.map((commitment) => commitment.person?.id)
.filter(Boolean),
);
const activePeople = this.activePeople || [];

return Array.from(activePeople).filter(
(person) => !committedIds.has(person.id),
);
}

Expand All @@ -105,27 +106,26 @@ export default class AdminCalendarController extends CalendarController {
}

@action
createCommitment(person) {
async createCommitment(person) {
const slot = this.viewingSlot;
const commitment = this.store.createRecord('commitment', {
slot: this.viewingSlot,
person: person,
});

commitment
.save()
.then(() => {
this.set('errorMessage', undefined);
this.toasts.show(
`Committed ${person.get('name')} to drive on ${moment(
slot.get('start'),
).format('MMMM D')}`,
);
})
.catch((error) => {
const errorDetail = get(error, 'errors.firstObject.detail');
this.set('errorMessage', errorDetail || 'Couldn’t save your change');
});
try {
await commitment.save();
this.set('errorMessage', undefined);
this.notifyPropertyChange('viewingSlot');
this.toasts.show(
`Committed ${person.get('name')} to drive on ${moment(
slot.get('start'),
).format('MMMM D')}`,
);
} catch (error) {
const errorDetail = get(error, 'errors.firstObject.detail');
this.set('errorMessage', errorDetail || 'Couldn’t save your change');
}
}

@action
Expand All @@ -137,6 +137,7 @@ export default class AdminCalendarController extends CalendarController {
.destroyRecord()
.then(() => {
this.set('errorMessage', undefined);
this.notifyPropertyChange('viewingSlot');
this.toasts.show(`Deleted ${name}’s commitment on ${date}`);
})
.catch((error) => {
Expand Down
43 changes: 26 additions & 17 deletions app/controllers/drivers.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import BufferedProxy from 'ember-buffered-proxy/proxy';

@classic
export default class DriversController extends Controller {
@service('people')
peopleService;

@service
store;

Expand All @@ -18,9 +21,15 @@ export default class DriversController extends Controller {
sortDir = 'asc';
errorMessage = undefined;

@computed('model.@each.{name,lastRide}', 'sortProp', 'sortDir')
@computed(
'model',
'model.[]',
'model.@each.{name,lastRide}',
'sortProp',
'sortDir',
)
get sortedPeople() {
const people = this.model ? this.model.toArray() : [];
const people = Array.from(this.model || []);
const sorted = people.slice().sort((a, b) => {
let comparison;

Expand Down Expand Up @@ -82,7 +91,7 @@ export default class DriversController extends Controller {
this.set(
'editingPerson',
BufferedProxy.create({
content: this.store.createRecord('person'),
content: this.store.createRecord('person', { active: true }),
}),
);
}
Expand All @@ -95,24 +104,24 @@ export default class DriversController extends Controller {
}

@action
savePerson(event) {
async savePerson(event) {
event?.preventDefault();

const proxy = this.editingPerson;
proxy.applyBufferedChanges();
return proxy
.get('content')
.save()
.then(() => {
this.set('editingPerson', undefined);
this.set('errorMessage', undefined);
})
.catch(() => {
this.set(
'errorMessage',
'There was an error saving this driver. Please try again.',
);
});

try {
await proxy.get('content').save();
await this.peopleService.load();

this.set('editingPerson', undefined);
this.set('errorMessage', undefined);
} catch {
this.set(
'errorMessage',
'There was an error saving this driver. Please try again.',
);
}
}

@action
Expand Down
8 changes: 5 additions & 3 deletions app/controllers/reimbursements.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import moment from 'moment-timezone';

@classic
export default class ReimbursementsController extends Controller {
queryParams = {
showProcessed: 'processed',
};
queryParams = [
{
showProcessed: 'processed',
},
];

@alias('model')
reimbursements;
Expand Down
41 changes: 23 additions & 18 deletions app/controllers/reports/new.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import classic from 'ember-classic-decorator';
import { action } from '@ember/object';
import { action, computed } from '@ember/object';
import { inject as service } from '@ember/service';
import Controller from '@ember/controller';

Expand All @@ -19,6 +19,12 @@ export default class NewController extends Controller {
editingRide;
errorMessage = undefined;

@computed('model', 'model.{[],@each.complete}')
get reportableRides() {
const rides = Array.from(this.model || []);
return rides.filter((ride) => !ride.complete);
}

_setNumberProperty(property, event) {
const ride = this.editingRide;

Expand Down Expand Up @@ -83,28 +89,27 @@ export default class NewController extends Controller {
}

@action
submitReport(event) {
async submitReport(event) {
event?.preventDefault?.();

let editingRide = this.editingRide;

if (editingRide) {
return editingRide.save().then(
() => {
this.set('errorMessage', undefined);
this.toasts.show('Your report was saved');

// Remove the ride from the store before reloading from the server
this.store.unloadRecord(this.editingRide);

this.set('editingRide', undefined);
this.router.transitionTo('application');
window.scrollTo(0, 0);
},
() => {
this.set('errorMessage', 'There was an error saving your report!');
},
);
try {
await editingRide.save();
editingRide.set('complete', true);

this.set('errorMessage', undefined);
this.toasts.show('Your report was saved');

await this.store.findAll('ride', { reload: true });

this.set('editingRide', undefined);
this.router.transitionTo('application');
window.scrollTo(0, 0);
} catch {
this.set('errorMessage', 'There was an error saving your report!');
}
} else {
this.set('errorMessage', 'Please choose a ride');
}
Expand Down
Loading
Loading