Skip to content

Commit

Permalink
feat: allow customization of life event types (#4243)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremies authored Oct 31, 2020
1 parent 2c9779a commit 657d824
Show file tree
Hide file tree
Showing 26 changed files with 899 additions and 10 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

### New features:

*
* Allow customization of life event types

### Enhancements:

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace App\Http\Controllers\Account\LifeEvent;

use App\Http\Controllers\Controller;
use App\Traits\JsonRespondController;

class LifeEventCategoriesController extends Controller
{
use JsonRespondController;

/**
* Get all the life event categories.
*/
public function index()
{
$lifeEventCategoriesData = collect([]);
$lifeEventCategories = auth()->user()->account->lifeEventCategories;

foreach ($lifeEventCategories as $lifeEventCategory) {
$lifeEventTypesData = collect([]);
$lifeEventTypes = $lifeEventCategory->lifeEventTypes;

foreach ($lifeEventTypes as $lifeEventType) {
$dataLifeEventType = [
'id' => $lifeEventType->id,
'name' => $lifeEventType->name,
'default_life_event_type_key' => $lifeEventType->default_life_event_type_key,
];
$lifeEventTypesData->push($dataLifeEventType);
}

$data = [
'id' => $lifeEventCategory->id,
'name' => $lifeEventCategory->name,
'default_life_event_category_key' => $lifeEventCategory->default_life_event_category_key,
'lifeEventTypes' => $lifeEventTypesData,
];
$lifeEventCategoriesData->push($data);
}

return $lifeEventCategoriesData;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

namespace App\Http\Controllers\Account\LifeEvent;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Traits\JsonRespondController;
use App\Services\Account\LifeEvent\LifeEventType\CreateLifeEventType;
use App\Services\Account\LifeEvent\LifeEventType\UpdateLifeEventType;
use App\Services\Account\LifeEvent\LifeEventType\DestroyLifeEventType;
use App\Http\Resources\LifeEvent\LifeEventType as LifeEventTypeResource;

class LifeEventTypesController extends Controller
{
use JsonRespondController;

/**
* Store a life event type.
*
* @param Request $request
* @return LifeEventTypeResource
*/
public function store(Request $request)
{
$type = app(CreateLifeEventType::class)->execute([
'account_id' => auth()->user()->account_id,
'life_event_category_id' => $request->input('life_event_category_id'),
'name' => $request->input('name'),
]);

return new LifeEventTypeResource($type);
}

/**
* Update a life event type.
*
* @param Request $request
* @param int $liveEventTypeId
* @return LifeEventTypeResource
*/
public function update(Request $request, $liveEventTypeId)
{
$data = [
'account_id' => auth()->user()->account_id,
'life_event_type_id' => $liveEventTypeId,
'life_event_category_id' => $request->input('life_event_category_id'),
'name' => $request->input('name'),
];

$type = app(UpdateLifeEventType::class)->execute($data);

return new LifeEventTypeResource($type);
}

/**
* Delete the life event type.
*
* @param Request $request
* @param int $lifeEventTypeId
*
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $lifeEventTypeId)
{
$data = [
'account_id' => auth()->user()->account_id,
'life_event_type_id' => $lifeEventTypeId,
];

try {
app(DestroyLifeEventType::class)->execute($data);
} catch (\Exception $e) {
return $this->respondNotFound();
}

return $this->respondObjectDeleted($lifeEventTypeId);
}
}
1 change: 1 addition & 0 deletions app/Http/Controllers/Contacts/LifeEventsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public function index(Request $request, Contact $contact)
'id' => $lifeEvent->id,
'life_event_type' => $lifeEvent->lifeEventType->name,
'default_life_event_type_key' => $lifeEvent->lifeEventType->default_life_event_type_key,
'life_event_type_name' => $lifeEvent->lifeEventType->name,
'name' => $lifeEvent->name,
'note' => $lifeEvent->note,
'happened_at' => DateHelper::getShortDate($lifeEvent->happened_at),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace App\Services\Account\LifeEvent\LifeEventType;

use App\Services\BaseService;
use App\Models\Contact\LifeEventType;
use App\Models\Contact\LifeEventCategory;

class CreateLifeEventType extends BaseService
{
/**
* Get the validation rules that apply to the service.
*
* @return array
*/
public function rules()
{
return [
'account_id' => 'required|integer|exists:accounts,id',
'life_event_category_id' => 'required|integer|exists:life_event_categories,id',
'name' => 'required|string|max:255',
];
}

/**
* Create a life event type.
*
* @param array $data
* @return LifeEventType
*/
public function execute(array $data): LifeEventType
{
$this->validate($data);

LifeEventCategory::where('account_id', $data['account_id'])
->findOrFail($data['life_event_category_id']);

$lifeEventType = LifeEventType::create([
'account_id' => $data['account_id'],
'life_event_category_id' => $data['life_event_category_id'],
'name' => $data['name'],
'default_life_event_type_key' => null,
'core_monica_data' => false,
'specific_information_structure' => null,
]);

return LifeEventType::find($lifeEventType->id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace App\Services\Account\LifeEvent\LifeEventType;

use App\Services\BaseService;
use App\Models\Contact\LifeEventType;

class DestroyLifeEventType extends BaseService
{
/**
* Get the validation rules that apply to the service.
*
* @return array
*/
public function rules()
{
return [
'account_id' => 'required|integer|exists:accounts,id',
'life_event_type_id' => 'required|integer|exists:life_event_types,id',
];
}

/**
* Destroy a life event type.
*
* @param array $data
* @return bool
*/
public function execute(array $data): bool
{
$this->validate($data);

$lifeEventType = LifeEventType::where('account_id', $data['account_id'])
->findOrFail($data['life_event_type_id']);

$lifeEventType->delete();

return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace App\Services\Account\LifeEvent\LifeEventType;

use App\Services\BaseService;
use App\Models\Contact\LifeEventType;
use App\Models\Contact\LifeEventCategory;

class UpdateLifeEventType extends BaseService
{
/**
* Get the validation rules that apply to the service.
*
* @return array
*/
public function rules()
{
return [
'account_id' => 'required|integer|exists:accounts,id',
'life_event_category_id' => 'required|integer|exists:life_event_categories,id',
'life_event_type_id' => 'required|integer|exists:life_event_types,id',
'name' => 'required|string|max:255',
];
}

/**
* Update a life event type.
*
* @param array $data
* @return LifeEventType
*/
public function execute(array $data): LifeEventType
{
$this->validate($data);

LifeEventCategory::where('account_id', $data['account_id'])
->findOrFail($data['life_event_category_id']);

$lifeEventType = LifeEventType::where('account_id', $data['account_id'])
->findOrFail($data['life_event_type_id']);

$lifeEventType->update([
'life_event_category_id' => $data['life_event_category_id'],
'name' => $data['name'],
]);

return $lifeEventType;
}
}
1 change: 0 additions & 1 deletion app/Services/Auth/Population/PopulateLifeEventsTable.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ private function feedLifeEventType($defaultLifeEventType, $lifeEventCategory)
LifeEventType::create([
'account_id' => $this->data['account_id'],
'life_event_category_id' => $lifeEventCategory->id,
'name' => trans('settings.personalization_life_event_type_'.$defaultLifeEventType->translation_key),
'core_monica_data' => true,
'specific_information_structure' => $defaultLifeEventType->specific_information_structure,
'default_life_event_type_key' => $defaultLifeEventType->translation_key,
Expand Down
23 changes: 23 additions & 0 deletions database/migrations/2020_05_31_091556_custom_life_event_types.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CustomLifeEventTypes extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('life_event_types', function (Blueprint $table) {
$table->string('name')->nullable()->change();
});

DB::table('life_event_types')
->update(['name' => null]);
}
}
1 change: 1 addition & 0 deletions public/img/people/life-events/types/null.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion public/js/app.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/js/langs/en.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/js/vendor.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions public/mix-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"/js/manifest.js": "/js/manifest.js?id=7db827d654313dce4250",
"/js/vendor.js": "/js/vendor.js?id=30196262d2017b9a059e",
"/js/app.js": "/js/app.js?id=6ff9db58e9bfffe92906",
"/js/vendor.js": "/js/vendor.js?id=a7a6b24f4b2893ea8875",
"/js/app.js": "/js/app.js?id=0cfeb4f73408e366c4a7",
"/css/app-ltr.css": "/css/app-ltr.css?id=4e4748e834c27a4f0903",
"/css/app-rtl.css": "/css/app-rtl.css?id=c4d51a636d03b1f1f0fb",
"/css/stripe.css": "/css/stripe.css?id=746c8aaac01c56d3cee1",
Expand Down
4 changes: 4 additions & 0 deletions resources/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,10 @@ Vue.component(
'activity-types',
require('./components/settings/ActivityTypes.vue').default
);
Vue.component(
'life-event-types',
require('./components/settings/LifeEventTypes.vue').default
);
Vue.component(
'dav-resources',
require('./components/settings/DAVResources.vue').default
Expand Down
14 changes: 12 additions & 2 deletions resources/js/components/people/lifeevent/CreateLifeEvent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,12 @@
<div class="dib mr2">
<img :src="'img/people/life-events/types/' + type.default_life_event_type_key + '.svg'" :alt="type.default_life_event_type_key" style="min-width: 12px;" />
</div>
{{ $t('people.life_event_sentence_' + type.default_life_event_type_key) }}
<template v-if="type.name">
{{ type.name }}
</template>
<template v-else>
{{ $t('people.life_event_sentence_' + type.default_life_event_type_key) }}
</template>

<svg class="absolute life-event-add-arrow" width="10" height="13" viewBox="0 0 10 13" fill="none"
xmlns="http://www.w3.org/2000/svg"
Expand All @@ -70,7 +75,12 @@
</div>

<h3 class="pt3 ph4 f3 fw5 tc">
{{ $t('people.life_event_sentence_' + activeType.default_life_event_type_key) }}
<template v-if="activeType.name">
{{ activeType.name }}
</template>
<template v-else>
{{ $t('people.life_event_sentence_' + activeType.default_life_event_type_key) }}
</template>
</h3>

<!-- This field will be the same for every life event type no matter what, as the date is the only required field -->
Expand Down
7 changes: 6 additions & 1 deletion resources/js/components/people/lifeevent/LifeEventList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,12 @@
</div>
<p class="pt2">
<span class="b">
{{ $t('people.life_event_sentence_' + lifeEvent.default_life_event_type_key) }}
<template v-if="lifeEvent.life_event_type_name">
{{ lifeEvent.life_event_type_name }}
</template>
<template v-else>
{{ $t('people.life_event_sentence_' + lifeEvent.default_life_event_type_key) }}
</template>
</span> {{ lifeEvent.name }}
</p>
<p>{{ lifeEvent.note }}</p>
Expand Down
Loading

0 comments on commit 657d824

Please sign in to comment.