Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow customization of life event types #4243

Merged
merged 7 commits into from
Oct 31, 2020
Merged
Show file tree
Hide file tree
Changes from 6 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
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=bff74b3baecd183e247b",
"/js/vendor.js": "/js/vendor.js?id=a7a6b24f4b2893ea8875",
"/js/app.js": "/js/app.js?id=d5da38f22bb5cd3fc852",
"/css/app-ltr.css": "/css/app-ltr.css?id=3656924c5fce352ba736",
"/css/app-rtl.css": "/css/app-rtl.css?id=8ee9e03a2fc4b4087b8a",
"/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