Compare commits

...

36 Commits
0.2.3 ... 0.2.6

Author SHA1 Message Date
fd661f6a2f added some config that was missed / wrong 2018-07-19 20:01:59 +02:00
679f40c16d linked actor field config added 2018-07-19 19:13:08 +02:00
ebd755d86c search view: changed no-results wording &cache off 2018-07-19 16:48:03 +02:00
c507fb29b7 changed no-results wording in views 2018-07-19 16:47:16 +02:00
af0040479e added the actual menu as well as the block 2018-07-19 16:46:23 +02:00
3198c00f5a Added add-actors block which was missing 2018-07-19 16:45:31 +02:00
2e40dc46f2 removed view caching 2018-07-19 16:29:56 +02:00
7a21352ac4 activity view query permissions. 2018-07-19 16:22:26 +02:00
8b274c0d6c Changed some permissions 2018-07-19 15:56:57 +02:00
775a08319c if you cancel a delete it now goes back to entity
like duh why didn't it just do that by default
2018-07-19 15:51:52 +02:00
352ea000f0 More on permissions for activities and cases 2018-07-19 15:35:22 +02:00
ec99009f16 Added access control for viewing activity
Can only view activity if involved in the case.
2018-07-19 15:10:02 +02:00
d2bd27c960 added another null check to contextual menu 2018-07-19 14:23:44 +02:00
b5f567f872 changed contact form address to aktivix
because gmail is giving ipv6 errors
2018-07-19 13:54:09 +02:00
221d16c7fa removed label from contextual menu block 2018-07-19 11:39:15 +02:00
6b3b744900 Added contact form to opencase_defaults 2018-07-19 11:35:43 +02:00
1c0195a632 Redirects to activity list on deleteing activity 2018-07-18 22:39:27 +02:00
a47a06aef3 Gave site admin various permissions 2018-07-18 22:21:22 +02:00
33feac1977 redirect to home after deleting case or actor
also changed contextual menu code for cases when the actor whose case it is has been deleted
2018-07-18 22:15:45 +02:00
ddab3e450a fixed bug where case list link not generated 2018-07-18 21:06:26 +02:00
e588a70a1b Added configs (didn't do that last commit) 2018-07-18 20:15:57 +02:00
c0c415e691 New config for asylum status and language. 2018-07-18 20:05:27 +02:00
6c384605ec removed old asylum and language fields
and associated config
2018-07-18 19:59:51 +02:00
09650469bf Only those with "administer users" can link actor 2018-07-18 12:06:22 +02:00
48dabf1701 minor change: null check 2018-07-17 16:19:25 +02:00
08fe6dc362 added code to remove exposedfilter when view empty 2018-07-09 20:38:48 +02:00
3f01a3ad41 typo 2018-07-09 20:31:20 +02:00
d589ef8d69 premission description 2018-07-09 20:29:25 +02:00
a267e222b8 Removed the "view own cases" permission
Now everyone sees cases they are involved in, they don't need a special perm.
2018-07-09 20:26:11 +02:00
910350699d Added 'view label' access bypass to actors
Was therefore able to get rid of the "view volunteer involvement in cases" stuff which was complicated
2018-07-09 20:15:16 +02:00
c729750705 Case views are now filtered by user involvement
unless the user has the see all cases permission
2018-07-09 19:36:47 +02:00
351bdb5afd Added "own cases" permission and access check
Works for when viewing a single case, not for view yet though.
2018-07-09 13:21:52 +02:00
2a31b1c8ce added linked actor of logged in user to new case 2018-07-09 12:11:07 +02:00
667b109de8 removed client from volunteer engagement 2018-07-09 11:32:12 +02:00
92d4f74ad7 fixed a sed mistake 2018-07-09 11:22:38 +02:00
487415c679 Another attempt to fix the "plugin does not exist" 2018-07-09 11:21:09 +02:00
46 changed files with 680 additions and 162 deletions

View File

@ -0,0 +1,31 @@
langcode: en
status: true
dependencies:
config:
- system.menu.opencase-add-actors
module:
- system
- user
theme:
- bartik
id: opencaseaddactors
theme: bartik
region: sidebar_first
weight: -8
provider: null
plugin: 'system_menu_block:opencase-add-actors'
settings:
id: 'system_menu_block:opencase-add-actors'
label: 'Add Actors'
provider: system
label_display: visible
level: 1
depth: 0
visibility:
user_role:
id: user_role
roles:
authenticated: authenticated
negate: false
context_mapping:
user: '@user.current_user_context:current_user'

View File

@ -15,5 +15,5 @@ settings:
id: opencase_contextual_menu id: opencase_contextual_menu
label: 'OpenCase Contextual Menu' label: 'OpenCase Contextual Menu'
provider: opencase provider: opencase
label_display: visible label_display: '0'
visibility: { } visibility: { }

View File

@ -0,0 +1,7 @@
langcode: en
status: true
dependencies: { }
id: opencase-add-actors
label: 'OpenCase Add Actors'
description: ''
locked: false

View File

@ -27,7 +27,7 @@ display:
role: role:
authenticated: authenticated authenticated: authenticated
cache: cache:
type: tag type: none
options: { } options: { }
query: query:
type: views_query type: views_query
@ -389,7 +389,18 @@ display:
title: 'Activity List' title: 'Activity List'
header: { } header: { }
footer: { } footer: { }
empty: { } empty:
area_text_custom:
id: area_text_custom
table: views
field: area_text_custom
relationship: none
group_type: group
admin_label: ''
empty: true
tokenize: false
content: 'This case has no activities yet. To add one, use the links in the sidebar to the right.'
plugin_id: text_custom
relationships: { } relationships: { }
arguments: arguments:
oc_case: oc_case:

View File

@ -27,7 +27,7 @@ display:
role: role:
authenticated: authenticated authenticated: authenticated
cache: cache:
type: tag type: none
options: { } options: { }
query: query:
type: views_query type: views_query
@ -48,10 +48,23 @@ display:
sort_asc_label: Asc sort_asc_label: Asc
sort_desc_label: Desc sort_desc_label: Desc
pager: pager:
type: some type: mini
options: options:
items_per_page: 10 items_per_page: 20
offset: 0 offset: 0
id: 0
total_pages: null
tags:
previous:
next:
expose:
items_per_page: false
items_per_page_label: 'Items per page'
items_per_page_options: '5, 10, 25, 50'
items_per_page_options_all: false
items_per_page_options_all_label: '- All -'
offset: false
offset_label: Offset
style: style:
type: table type: table
row: row:
@ -434,7 +447,52 @@ display:
empty_zero: false empty_zero: false
hide_alter_empty: false hide_alter_empty: false
plugin_id: custom plugin_id: custom
filters: { } filters:
type:
id: type
table: oc_case_field_data
field: type
relationship: none
group_type: group
admin_label: ''
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: type_op
label: 'Case type'
description: ''
use_operator: false
operator: type_op
identifier: type
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
overseer: '0'
caseworker: '0'
volunteer_co_ord: '0'
opencase_admin: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
entity_type: oc_case
entity_field: type
plugin_id: bundle
sorts: sorts:
created: created:
id: created id: created
@ -447,14 +505,25 @@ display:
exposed: false exposed: false
expose: expose:
label: '' label: ''
granularity: hour granularity: day
entity_type: oc_case entity_type: oc_case
entity_field: created entity_field: created
plugin_id: date plugin_id: date
title: 'Case List' title: ''
header: { } header: { }
footer: { } footer: { }
empty: { } empty:
area_text_custom:
id: area_text_custom
table: views
field: area_text_custom
relationship: none
group_type: group
admin_label: ''
empty: true
tokenize: false
content: "<p>Either there are no cases involving this person, or you do not have access to them.</p>\n"
plugin_id: text_custom
relationships: { } relationships: { }
arguments: arguments:
actors_involved_target_id: actors_involved_target_id:
@ -495,12 +564,14 @@ display:
entity_field: actors_involved entity_field: actors_involved
plugin_id: numeric plugin_id: numeric
display_extenders: { } display_extenders: { }
use_ajax: true
cache_metadata: cache_metadata:
max-age: -1 max-age: -1
contexts: contexts:
- 'languages:language_content' - 'languages:language_content'
- 'languages:language_interface' - 'languages:language_interface'
- url - url
- url.query_args
- user.roles - user.roles
tags: { } tags: { }
page_1: page_1:
@ -511,11 +582,106 @@ display:
display_options: display_options:
display_extenders: { } display_extenders: { }
path: opencase/oc_actor/%actor_id/case_list path: opencase/oc_actor/%actor_id/case_list
defaults:
filters: false
filter_groups: false
filters: { }
filter_groups:
operator: AND
groups:
1: AND
cache_metadata: cache_metadata:
max-age: -1 max-age: -1
contexts: contexts:
- 'languages:language_content' - 'languages:language_content'
- 'languages:language_interface' - 'languages:language_interface'
- url - url
- url.query_args
- user.roles
tags: { }
page_2:
display_plugin: page
id: page_2
display_title: 'All Cases'
position: 2
display_options:
display_extenders: { }
display_description: ''
arguments: { }
defaults:
arguments: false
filters: false
filter_groups: false
empty: false
path: opencase/all-cases
filters:
type:
id: type
table: oc_case_field_data
field: type
relationship: none
group_type: group
admin_label: ''
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: type_op
label: 'Case type'
description: ''
use_operator: false
operator: type_op
identifier: type
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
overseer: '0'
caseworker: '0'
volunteer_co_ord: '0'
opencase_admin: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
entity_type: oc_case
entity_field: type
plugin_id: bundle
filter_groups:
operator: AND
groups:
1: AND
empty:
area_text_custom:
id: area_text_custom
table: views
field: area_text_custom
relationship: none
group_type: group
admin_label: ''
empty: true
tokenize: false
content: "<h1>No cases found</h1>\n<p>You do not have access to any existing cases.</p>\n<p>To <b>add a new case</b>, first search for the person you want to add a case to. If they are not on the system yet you can add them using the <b>Add actors</b> menu in the left sidebar.</p>\n"
plugin_id: text_custom
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- user.roles - user.roles
tags: { } tags: { }

View File

@ -0,0 +1,11 @@
langcode: en
status: true
dependencies: { }
id: contact_opencase
label: 'Contact the OpenCase Developers'
recipients:
- naomi@aktivix.org
reply: ''
weight: 0
message: 'Thank you for your message. The OpenCase team will get back to you ASAP.'
redirect: ''

View File

@ -0,0 +1,5 @@
default_form: contact_opencase
flood:
limit: 5
interval: 3600
user_default_enabled: false

View File

@ -3,7 +3,6 @@ status: true
dependencies: dependencies:
config: config:
- opencase_entities.oc_actor_type.client - opencase_entities.oc_actor_type.client
- opencase_entities.oc_actor_type.volunteer
- opencase_entities.oc_case_type.volunteer_engagement - opencase_entities.oc_case_type.volunteer_engagement
id: oc_case.volunteer_engagement.actors_involved id: oc_case.volunteer_engagement.actors_involved
field_name: actors_involved field_name: actors_involved
@ -18,7 +17,6 @@ default_value_callback: 'Drupal\opencase_entities\Entity\OCCase::defaultVal'
settings: settings:
handler_settings: handler_settings:
target_bundles: target_bundles:
client: client
volunteer: volunteer volunteer: volunteer
handler: default handler: default
field_type: entity_reference field_type: entity_reference

View File

@ -15,7 +15,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_funds_for: field_funds_for:
weight: 27 weight: 27

View File

@ -25,12 +25,10 @@ bundle: client
mode: default mode: default
content: content:
field_asylum_status: field_asylum_status:
weight: 35 weight: 6
settings: settings: { }
size: 60
placeholder: ''
third_party_settings: { } third_party_settings: { }
type: string_textfield type: options_select
region: content region: content
field_client_field_1: field_client_field_1:
weight: 26 weight: 26
@ -41,20 +39,20 @@ content:
type: string_textfield type: string_textfield
region: content region: content
field_confidentiality_form: field_confidentiality_form:
weight: 39 weight: 15
settings: settings:
progress_indicator: throbber progress_indicator: throbber
third_party_settings: { } third_party_settings: { }
type: file_generic type: file_generic
region: content region: content
field_date_of_birth: field_date_of_birth:
weight: 27 weight: 3
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: datetime_default type: datetime_default
region: content region: content
field_dependants: field_dependants:
weight: 36 weight: 12
settings: settings:
size: 60 size: 60
placeholder: '' placeholder: ''
@ -62,7 +60,7 @@ content:
type: string_textfield type: string_textfield
region: content region: content
field_disability: field_disability:
weight: 31 weight: 10
settings: settings:
size: 60 size: 60
placeholder: '' placeholder: ''
@ -70,7 +68,7 @@ content:
type: string_textfield type: string_textfield
region: content region: content
field_ethnic_o: field_ethnic_o:
weight: 33 weight: 7
settings: settings:
size: 60 size: 60
placeholder: '' placeholder: ''
@ -78,39 +76,37 @@ content:
type: string_textfield type: string_textfield
region: content region: content
field_gender_identified_with: field_gender_identified_with:
weight: 30 weight: 4
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: options_select type: options_select
region: content region: content
field_how_heard: field_how_heard:
weight: 37 weight: 13
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: options_select type: options_select
region: content region: content
field_income: field_income:
weight: 34 weight: 11
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: options_select type: options_select
region: content region: content
field_languages_spoken: field_languages_spoken:
weight: 32 weight: 9
settings: settings: { }
size: 60
placeholder: ''
third_party_settings: { } third_party_settings: { }
type: string_textfield type: options_select
region: content region: content
field_marital_: field_marital_:
weight: 29 weight: 5
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: options_select type: options_select
region: content region: content
field_nationality: field_nationality:
weight: 28 weight: 8
settings: settings:
size: 60 size: 60
placeholder: '' placeholder: ''
@ -118,7 +114,7 @@ content:
type: string_textfield type: string_textfield
region: content region: content
field_referred_by: field_referred_by:
weight: 38 weight: 14
settings: settings:
size: 60 size: 60
placeholder: '' placeholder: ''
@ -135,7 +131,7 @@ content:
third_party_settings: { } third_party_settings: { }
phone: phone:
type: string_textfield type: string_textfield
weight: 2 weight: 0
region: content region: content
settings: settings:
size: 60 size: 60
@ -143,7 +139,7 @@ content:
third_party_settings: { } third_party_settings: { }
phone2: phone2:
type: string_textfield type: string_textfield
weight: 3 weight: 1
region: content region: content
settings: settings:
size: 60 size: 60
@ -151,7 +147,7 @@ content:
third_party_settings: { } third_party_settings: { }
postal_address: postal_address:
type: string_textarea type: string_textarea
weight: 5 weight: 2
region: content region: content
settings: settings:
rows: 5 rows: 5

View File

@ -4,6 +4,7 @@ dependencies:
config: config:
- field.field.oc_actor.volunteer.field_languages_spoken - field.field.oc_actor.volunteer.field_languages_spoken
- field.field.oc_actor.volunteer.field_nationality - field.field.oc_actor.volunteer.field_nationality
- field.field.oc_actor.volunteer.field_osic_level
- opencase_entities.oc_actor_type.volunteer - opencase_entities.oc_actor_type.volunteer
id: oc_actor.volunteer.default id: oc_actor.volunteer.default
targetEntityType: oc_actor targetEntityType: oc_actor
@ -12,11 +13,9 @@ mode: default
content: content:
field_languages_spoken: field_languages_spoken:
weight: 28 weight: 28
settings: settings: { }
size: 60
placeholder: ''
third_party_settings: { } third_party_settings: { }
type: string_textfield type: options_select
region: content region: content
field_nationality: field_nationality:
weight: 27 weight: 27
@ -26,6 +25,12 @@ content:
third_party_settings: { } third_party_settings: { }
type: string_textfield type: string_textfield
region: content region: content
field_osic_level:
weight: 29
settings: { }
third_party_settings: { }
type: options_select
region: content
field_sdfdsfds: field_sdfdsfds:
weight: 26 weight: 26
settings: settings:

View File

@ -32,7 +32,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_outcome: field_outcome:
weight: 26 weight: 26

View File

@ -32,7 +32,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_outcome: field_outcome:
weight: 30 weight: 30

View File

@ -33,7 +33,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_gave_list_of_agencies: field_gave_list_of_agencies:
weight: 27 weight: 27

View File

@ -32,7 +32,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_outcome: field_outcome:
weight: 30 weight: 30

View File

@ -33,7 +33,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_level: field_level:
weight: 26 weight: 26

View File

@ -32,7 +32,7 @@ content:
settings: settings:
placeholder: '' placeholder: ''
third_party_settings: { } third_party_settings: { }
type: number_decimal type: number
region: content region: content
field_outcome: field_outcome:
weight: 30 weight: 30

View File

@ -27,12 +27,11 @@ bundle: client
mode: default mode: default
content: content:
field_asylum_status: field_asylum_status:
weight: 15 weight: 6
label: above label: above
settings: settings: { }
link_to_entity: false
third_party_settings: { } third_party_settings: { }
type: string type: list_default
region: content region: content
field_client_field_1: field_client_field_1:
weight: 1 weight: 1
@ -43,7 +42,7 @@ content:
type: string type: string
region: content region: content
field_confidentiality_form: field_confidentiality_form:
weight: 19 weight: 15
label: above label: above
settings: settings:
use_description_as_link_text: true use_description_as_link_text: true
@ -51,7 +50,7 @@ content:
type: file_default type: file_default
region: content region: content
field_date_of_birth: field_date_of_birth:
weight: 7 weight: 3
label: above label: above
settings: settings:
format_type: medium format_type: medium
@ -60,51 +59,6 @@ content:
type: datetime_default type: datetime_default
region: content region: content
field_dependants: field_dependants:
weight: 16
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
region: content
field_disability:
weight: 11
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
region: content
field_ethnic_o:
weight: 13
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
region: content
field_gender_identified_with:
weight: 10
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_how_heard:
weight: 17
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_income:
weight: 14
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_languages_spoken:
weight: 12 weight: 12
label: above label: above
settings: settings:
@ -112,13 +66,57 @@ content:
third_party_settings: { } third_party_settings: { }
type: string type: string
region: content region: content
field_marital_: field_disability:
weight: 10
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
region: content
field_ethnic_o:
weight: 7
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
region: content
field_gender_identified_with:
weight: 4
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_how_heard:
weight: 13
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_income:
weight: 11
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_languages_spoken:
weight: 9 weight: 9
label: above label: above
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }
type: list_default type: list_default
region: content region: content
field_marital_:
weight: 5
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_nationality: field_nationality:
weight: 8 weight: 8
label: above label: above
@ -128,7 +126,7 @@ content:
type: string type: string
region: content region: content
field_referred_by: field_referred_by:
weight: 18 weight: 14
label: above label: above
settings: settings:
link_to_entity: false link_to_entity: false
@ -146,7 +144,7 @@ content:
phone: phone:
label: above label: above
type: string type: string
weight: 2 weight: 0
region: content region: content
settings: settings:
link_to_entity: false link_to_entity: false
@ -154,7 +152,7 @@ content:
phone2: phone2:
label: above label: above
type: string type: string
weight: 3 weight: 1
region: content region: content
settings: settings:
link_to_entity: false link_to_entity: false
@ -162,7 +160,7 @@ content:
postal_address: postal_address:
label: above label: above
type: basic_string type: basic_string
weight: 5 weight: 2
region: content region: content
settings: { } settings: { }
third_party_settings: { } third_party_settings: { }

View File

@ -4,8 +4,10 @@ dependencies:
config: config:
- field.field.oc_actor.volunteer.field_languages_spoken - field.field.oc_actor.volunteer.field_languages_spoken
- field.field.oc_actor.volunteer.field_nationality - field.field.oc_actor.volunteer.field_nationality
- field.field.oc_actor.volunteer.field_osic_level
- opencase_entities.oc_actor_type.volunteer - opencase_entities.oc_actor_type.volunteer
module: module:
- options
- user - user
id: oc_actor.volunteer.default id: oc_actor.volunteer.default
targetEntityType: oc_actor targetEntityType: oc_actor
@ -15,10 +17,9 @@ content:
field_languages_spoken: field_languages_spoken:
weight: 8 weight: 8
label: above label: above
settings: settings: { }
link_to_entity: false
third_party_settings: { } third_party_settings: { }
type: string type: list_default
region: content region: content
field_nationality: field_nationality:
weight: 7 weight: 7
@ -28,6 +29,13 @@ content:
third_party_settings: { } third_party_settings: { }
type: string type: string
region: content region: content
field_osic_level:
weight: 9
label: above
settings: { }
third_party_settings: { }
type: list_default
region: content
field_sdfdsfds: field_sdfdsfds:
weight: 1 weight: 1
label: above label: above

View File

@ -4,6 +4,8 @@ dependencies:
config: config:
- field.storage.oc_actor.field_asylum_status - field.storage.oc_actor.field_asylum_status
- opencase_entities.oc_actor_type.client - opencase_entities.oc_actor_type.client
module:
- options
id: oc_actor.client.field_asylum_status id: oc_actor.client.field_asylum_status
field_name: field_asylum_status field_name: field_asylum_status
entity_type: oc_actor entity_type: oc_actor
@ -15,4 +17,4 @@ translatable: false
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: { } settings: { }
field_type: string field_type: list_string

View File

@ -4,15 +4,17 @@ dependencies:
config: config:
- field.storage.oc_actor.field_languages_spoken - field.storage.oc_actor.field_languages_spoken
- opencase_entities.oc_actor_type.client - opencase_entities.oc_actor_type.client
module:
- options
id: oc_actor.client.field_languages_spoken id: oc_actor.client.field_languages_spoken
field_name: field_languages_spoken field_name: field_languages_spoken
entity_type: oc_actor entity_type: oc_actor
bundle: client bundle: client
label: 'Languages spoken' label: 'Languages spoken'
description: '' description: 'Hold down <b>Ctrl</b> (or the Mac equivalent) while clicking, and you can select more than one.'
required: false required: false
translatable: false translatable: false
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: { } settings: { }
field_type: string field_type: list_string

View File

@ -4,15 +4,17 @@ dependencies:
config: config:
- field.storage.oc_actor.field_languages_spoken - field.storage.oc_actor.field_languages_spoken
- opencase_entities.oc_actor_type.volunteer - opencase_entities.oc_actor_type.volunteer
module:
- options
id: oc_actor.volunteer.field_languages_spoken id: oc_actor.volunteer.field_languages_spoken
field_name: field_languages_spoken field_name: field_languages_spoken
entity_type: oc_actor entity_type: oc_actor
bundle: volunteer bundle: volunteer
label: 'Languages spoken' label: 'Languages spoken'
description: '' description: 'Hold down <b>Ctrl</b> (or the Mac equivalent) while clicking, and you can select more than one.'
required: false required: false
translatable: true translatable: true
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: { } settings: { }
field_type: string field_type: list_string

View File

@ -0,0 +1,20 @@
langcode: en
status: true
dependencies:
config:
- field.storage.oc_actor.field_osic_level
- opencase_entities.oc_actor_type.volunteer
module:
- options
id: oc_actor.volunteer.field_osic_level
field_name: field_osic_level
entity_type: oc_actor
bundle: volunteer
label: 'OSIC level'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings: { }
field_type: list_string

View File

@ -6,7 +6,7 @@ dependencies:
id: oc_activity.field_amount id: oc_activity.field_amount
field_name: field_amount field_name: field_amount
entity_type: oc_activity entity_type: oc_activity
type: number_decimal type: decimal
settings: settings:
precision: 10 precision: 10
scale: 2 scale: 2

View File

@ -3,15 +3,21 @@ status: true
dependencies: dependencies:
module: module:
- opencase_entities - opencase_entities
- options
id: oc_actor.field_asylum_status id: oc_actor.field_asylum_status
field_name: field_asylum_status field_name: field_asylum_status
entity_type: oc_actor entity_type: oc_actor
type: string type: list_string
settings: settings:
max_length: 255 allowed_values:
is_ascii: false -
case_sensitive: false value: Refused
module: core label: Refused
-
value: 'Leave to remain'
label: 'Leave to remain'
allowed_values_function: ''
module: options
locked: false locked: false
cardinality: 1 cardinality: 1
translatable: true translatable: true

View File

@ -3,15 +3,30 @@ status: true
dependencies: dependencies:
module: module:
- opencase_entities - opencase_entities
- options
id: oc_actor.field_languages_spoken id: oc_actor.field_languages_spoken
field_name: field_languages_spoken field_name: field_languages_spoken
entity_type: oc_actor entity_type: oc_actor
type: string type: list_string
settings: settings:
max_length: 255 allowed_values:
is_ascii: false -
case_sensitive: false value: English
module: core label: English
-
value: French
label: French
-
value: Arabic
label: Arabic
-
value: Kurdish
label: Kurdish
-
value: Farsi
label: Farsi
allowed_values_function: ''
module: options
locked: false locked: false
cardinality: -1 cardinality: -1
translatable: true translatable: true

View File

@ -0,0 +1,32 @@
langcode: en
status: true
dependencies:
module:
- opencase_entities
- options
id: oc_actor.field_osic_level
field_name: field_osic_level
entity_type: oc_actor
type: list_string
settings:
allowed_values:
-
value: 'Under supervision'
label: 'Under supervision'
-
value: 'Level 1'
label: 'Level 1'
-
value: 'Level 2'
label: 'Level 2'
-
value: 'Level 3'
label: 'Level 3'
allowed_values_function: ''
module: options
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View File

@ -6,7 +6,7 @@ dependencies:
id: oc_case.field_fee_or_equivalent_cost id: oc_case.field_fee_or_equivalent_cost
field_name: field_fee_or_equivalent_cost field_name: field_fee_or_equivalent_cost
entity_type: oc_case entity_type: oc_case
type: number_decimal type: decimal
settings: settings:
precision: 10 precision: 10
scale: 2 scale: 2

View File

@ -12,5 +12,8 @@ permissions:
- 'delete activity entities' - 'delete activity entities'
- 'delete case entities' - 'delete case entities'
- 'delete client entities' - 'delete client entities'
- 'edit activity entities'
- 'edit case entities'
- 'edit client entities' - 'edit client entities'
- 'view own cases'
- 'view published client entities' - 'view published client entities'

View File

@ -6,6 +6,8 @@ label: 'CRM Admin'
weight: 7 weight: 7
is_admin: null is_admin: null
permissions: permissions:
- 'add activity entities'
- 'add case entities'
- 'add client entities' - 'add client entities'
- 'add volunteer entities' - 'add volunteer entities'
- 'administer oc_activity fields' - 'administer oc_activity fields'
@ -17,5 +19,11 @@ permissions:
- 'delete case entities' - 'delete case entities'
- 'delete client entities' - 'delete client entities'
- 'delete volunteer entities' - 'delete volunteer entities'
- 'edit activity entities'
- 'edit case entities'
- 'edit client entities' - 'edit client entities'
- 'edit volunteer entities' - 'edit volunteer entities'
- 'view published activity entities'
- 'view published case entities'
- 'view published client entities'
- 'view published volunteer entities'

View File

@ -14,7 +14,10 @@ permissions:
- 'delete case entities' - 'delete case entities'
- 'delete client entities' - 'delete client entities'
- 'delete volunteer entities' - 'delete volunteer entities'
- 'edit activity entities'
- 'edit case entities'
- 'edit client entities' - 'edit client entities'
- 'edit volunteer entities' - 'edit volunteer entities'
- 'view published case entities'
- 'view published client entities' - 'view published client entities'
- 'view published volunteer entities' - 'view published volunteer entities'

View File

@ -7,9 +7,12 @@ weight: 6
is_admin: null is_admin: null
permissions: permissions:
- 'add activity entities' - 'add activity entities'
- 'add case entities'
- 'add volunteer entities' - 'add volunteer entities'
- 'delete activity entities' - 'delete activity entities'
- 'delete case entities' - 'delete case entities'
- 'delete volunteer entities' - 'delete volunteer entities'
- 'edit activity entities'
- 'edit case entities'
- 'edit volunteer entities' - 'edit volunteer entities'
- 'view published volunteer entities' - 'view published volunteer entities'

View File

@ -3,3 +3,8 @@ type: module
description: 'Actor types, case types, activity types and user roles suited to an asylum advice group' description: 'Actor types, case types, activity types and user roles suited to an asylum advice group'
core: 8.x core: 8.x
package: 'OpenCase' package: 'OpenCase'
dependencies:
- contact
- field
- opencase_entities
- options

View File

@ -0,0 +1,28 @@
langcode: en
status: true
dependencies:
config:
- field.storage.user.field_linked_opencase_actor
- opencase_entities.oc_actor_type.volunteer
module:
- user
id: user.user.field_linked_opencase_actor
field_name: field_linked_opencase_actor
entity_type: user
bundle: user
label: 'Linked OpenCase actor'
description: 'If this user is also an actor (e.g. a volunteer or staff member) in OpenCase, link them here. This will ensure that they have access to the correct cases and that the correct cases are shown as "theirs".'
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:oc_actor'
handler_settings:
target_bundles:
volunteer: volunteer
sort:
field: _none
auto_create: false
auto_create_bundle: ''
field_type: entity_reference

View File

@ -0,0 +1,19 @@
langcode: en
status: true
dependencies:
module:
- opencase_entities
- user
id: user.field_linked_opencase_actor
field_name: field_linked_opencase_actor
entity_type: user
type: entity_reference
settings:
target_type: oc_actor
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View File

@ -6,6 +6,7 @@
*/ */
use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\opencase_entities\CaseInvolvement;
/** /**
* Implements hook_help(). * Implements hook_help().
@ -111,3 +112,30 @@ function opencase_entities_theme_suggestions_oc_activity(array $variables) {
$suggestions[] = 'oc_activity__' . $entity->id() . '__' . $sanitized_view_mode; $suggestions[] = 'oc_activity__' . $entity->id() . '__' . $sanitized_view_mode;
return $suggestions; return $suggestions;
} }
function opencase_views_query_alter(Drupal\views\ViewExecutable $view, $query) {
if ($view->getBaseEntityType() && $view->getBaseEntityType()->id() == 'oc_case') {
$query->addTag('oc_case_access');
}
if ($view->getBaseEntityType() && $view->getBaseEntityType()->id() == 'oc_activity') {
$query->addTag('oc_activity_access');
}
}
function opencase_query_oc_case_access_alter($query) {
if (\Drupal::currentUser()->hasPermission('view published case entities')) {
return;
}
$linked_actor_id = CaseInvolvement::getLinkedActorId(\Drupal::currentUser());
$query->addJoin('INNER', 'oc_case__actors_involved', 'access_filter', 'access_filter.entity_id = oc_case_field_data.id');
$query->condition('access_filter.actors_involved_target_id', $linked_actor_id);
}
function opencase_query_oc_activity_access_alter($query) {
if (\Drupal::currentUser()->hasPermission('view published case entities')) {
return;
}
$linked_actor_id = CaseInvolvement::getLinkedActorId(\Drupal::currentUser());
$query->addJoin('INNER', 'oc_case__actors_involved', 'access_filter', 'access_filter.entity_id = oc_activity_field_data.oc_case');
$query->condition('access_filter.actors_involved_target_id', $linked_actor_id);
}

View File

@ -33,10 +33,6 @@ delete all client revisions:
title: 'Delete all Client revisions' title: 'Delete all Client revisions'
description: 'Role requires permission to <em>view Client revisions</em> and <em>delete rights</em> for client entities in question or <em>administer client entities</em>.' description: 'Role requires permission to <em>view Client revisions</em> and <em>delete rights</em> for client entities in question or <em>administer client entities</em>.'
view volunteer involvement in cases:
title: 'View names of Volunteers involved in Cases'
description: "When viewing a case record, they can see the names of the volunteers involved, but cannot click through to volunteer's details."
add volunteer entities: add volunteer entities:
title: 'Create new Volunteer entities' title: 'Create new Volunteer entities'
@ -78,7 +74,8 @@ edit case entities:
title: 'Edit Case entities' title: 'Edit Case entities'
view published case entities: view published case entities:
title: 'View published Case entities' title: 'View all cases'
description: 'All users can see cases which they are involved in. This grants permission to see all cases regardless of involvement.'
view unpublished case entities: view unpublished case entities:
title: 'View unpublished Case entities' title: 'View unpublished Case entities'
@ -107,9 +104,6 @@ delete activity entities:
edit activity entities: edit activity entities:
title: 'Edit Activity entities' title: 'Edit Activity entities'
view published activity entities:
title: 'View published Activity entities'
view unpublished activity entities: view unpublished activity entities:
title: 'View unpublished Activity entities' title: 'View unpublished Activity entities'

View File

@ -0,0 +1,22 @@
<?php
namespace Drupal\opencase_entities;
class CaseInvolvement {
public static function getLinkedActorId($account) {
return \Drupal\user\Entity\User::load($account->id())->get('field_linked_opencase_actor')->target_id;
}
public static function userIsInvolved($account, $case) {
$actorId = self::getLinkedActorId($account);
$involvedIds = array_column($case->actors_involved->getValue(), 'target_id');
return in_array($actorId, $involvedIds);
}
public static function userIsInvolved_activity($account, $activity) {
$case_id = $activity->oc_case->target_id;
$case = \Drupal::entityTypeManager()->getStorage('oc_case')->load($case_id);
return self::userIsInvolved($account, $case);
}
}

View File

@ -76,10 +76,13 @@ class OCCase extends RevisionableContentEntityBase implements OCCaseInterface {
/** /**
* When creating a case, it sets the first involved party to the actor * When creating a case, it sets the first involved party to the actor
* id from the URL. * id from the URL, and the second to the author's linked actor
* (if it exists and is different)
*/ */
public static function defaultVal() { public static function defaultVal() {
return array(\Drupal::request()->query->get('actor_id')); $author_linked_actor_id = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())->get('field_linked_opencase_actor')->target_id;
$currently_viewed_actor_id = \Drupal::request()->query->get('actor_id');
return array_unique([$currently_viewed_actor_id, $author_linked_actor_id]);
} }
/** /**

View File

@ -24,13 +24,28 @@ class OCActivityAccessControlHandler extends EntityAccessControlHandler {
if (!$entity->isPublished()) { if (!$entity->isPublished()) {
return AccessResult::allowedIfHasPermission($account, 'view unpublished activity entities'); return AccessResult::allowedIfHasPermission($account, 'view unpublished activity entities');
} }
return AccessResult::allowedIfHasPermission($account, 'view published activity entities'); return AccessResult::allowedIf(
$account->hasPermission('view published case entities') // activity permissions are inherited from case
case 'update': || CaseInvolvement::userIsInvolved_activity($account, $entity)
return AccessResult::allowedIfHasPermission($account, 'edit activity entities'); );
case 'update': // allowed only if a) they can see the case the activity is on and b) they can edit activities
case 'delete': if (!$account->hasPermission('edit activity entities')) {
return AccessResult::allowedIfHasPermission($account, 'delete activity entities'); return AccessResult::forbidden();
} else {
return AccessResult::allowedIf(
$account->hasPermission('view published case entities')
|| CaseInvolvement::userIsInvolved_activity($account, $entity)
);
}
case 'delete': // allowed only if a) they can see the case the activity is on and b) they can delete activities
if (!$account->hasPermission('delete activity entities')) {
return AccessResult::forbidden();
} else {
return AccessResult::allowedIf(
$account->hasPermission('view published case entities')
|| CaseInvolvement::userIsInvolved_activity($account, $entity)
);
}
} }
// Unknown operation, no opinion. // Unknown operation, no opinion.

View File

@ -14,6 +14,9 @@ use Drupal\Core\Access\AccessResult;
*/ */
class OCActorAccessControlHandler extends EntityAccessControlHandler { class OCActorAccessControlHandler extends EntityAccessControlHandler {
protected $viewLabelOperation = TRUE;
/** /**
* {@inheritdoc} * {@inheritdoc}
* Permissions are assigned by bundle. * Permissions are assigned by bundle.
@ -22,21 +25,18 @@ class OCActorAccessControlHandler extends EntityAccessControlHandler {
protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
/** @var \Drupal\opencase_entities\Entity\OCActorInterface $entity */ /** @var \Drupal\opencase_entities\Entity\OCActorInterface $entity */
$bundle = $entity->bundle(); $bundle = $entity->bundle();
$route_name = \Drupal::routeMatch()->getRouteName();
$case_routes = ['entity.oc_case.canonical', 'entity.oc_case.edit_form', 'view.cases.page_1', 'entity.oc_case.add_form'];
$is_case_context = in_array($route_name, $case_routes);
switch ($operation) { switch ($operation) {
case 'view label':
return AccessResult::allowed();
case 'view': case 'view':
if (!$entity->isPublished()) { if (!$entity->isPublished()) {
return AccessResult::allowedIf( return AccessResult::allowedIf(
$account->hasPermission("view unpublished $bundle entities") $account->hasPermission("view unpublished $bundle entities")
or ($is_case_context && $account->hasPermission("view unpublished $bundle entities"))
); );
} }
return AccessResult::allowedIf( return AccessResult::allowedIf(
$account->hasPermission("view published $bundle entities") $account->hasPermission("view published $bundle entities")
or ($is_case_context && $account->hasPermission("view $bundle involvement in cases"))
); );
case "update": case "update":

View File

@ -6,6 +6,7 @@ use Drupal\Core\Entity\EntityAccessControlHandler;
use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface; use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessResult;
use Drupal\opencase_entities\CaseInvolvement;
/** /**
* Access controller for the Case entity. * Access controller for the Case entity.
@ -24,13 +25,20 @@ class OCCaseAccessControlHandler extends EntityAccessControlHandler {
if (!$entity->isPublished()) { if (!$entity->isPublished()) {
return AccessResult::allowedIfHasPermission($account, 'view unpublished case entities'); return AccessResult::allowedIfHasPermission($account, 'view unpublished case entities');
} }
return AccessResult::allowedIfHasPermission($account, 'view published case entities'); return AccessResult::allowedIf(
$account->hasPermission('view published case entities')
case 'update': || CaseInvolvement::userIsInvolved($account, $entity)
return AccessResult::allowedIfHasPermission($account, 'edit case entities'); );
case 'update': // you can edit the case only if a) you can see it and b) you have the permission to edit cases.
case 'delete': return AccessResult::allowedIf(
return AccessResult::allowedIfHasPermission($account, 'delete case entities'); $account->hasPermission('edit case entities')
&& ($account->hasPermission('view published case entities') || CaseInvolvement::userIsInvolved($account, $entity))
);
case 'delete': // you can delete the case only if a) you can see it and b) you have the permission to delete cases.
return AccessResult::allowedIf(
$account->hasPermission('delete case entities')
&& ($account->hasPermission('view published case entities') || CaseInvolvement::userIsInvolved($account, $entity))
);
} }
// Unknown operation, no opinion. // Unknown operation, no opinion.

View File

@ -28,7 +28,7 @@ display:
role: role:
authenticated: authenticated authenticated: authenticated
cache: cache:
type: tag type: none
options: { } options: { }
query: query:
type: views_query type: views_query

View File

@ -1,5 +1,5 @@
opencase.manage_user_logins: opencase.manage_user_logins:
title: 'Manager user logins' title: 'Manage user logins'
description: 'Manage who can access the system' description: 'Manage who can access the system'
menu_name: opencase-admin menu_name: opencase-admin
url: internal:/admin/people url: internal:/admin/people

View File

@ -6,6 +6,7 @@
*/ */
use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\opencase\EntityTypeRelationsWidget; use Drupal\opencase\EntityTypeRelationsWidget;
@ -28,14 +29,15 @@ function opencase_block_access(\Drupal\block\Entity\Block $block, $operation, \D
'view.activities.page_1', 'view.activities.page_1',
'entity.oc_activity.canonical', 'entity.oc_activity.canonical',
'entity.oc_activity.edit_form', 'entity.oc_activity.edit_form',
'entity.oc_activity.add_form' 'entity.oc_activity.add_form',
'system.menu.opencase-add-actors',
'block.block.opencaseaddactors',
]; ];
return \Drupal\Core\Access\AccessResult::forbiddenIf(!in_array($route_name, $routes_where_it_should_be_shown)) return AccessResult::forbiddenIf(!in_array($route_name, $routes_where_it_should_be_shown))->addCacheableDependency($block);
->addCacheableDependency($block);
} }
// No opinion. // No opinion.
return \Drupal\Core\Access\AccessResult::neutral(); return AccessResult::neutral();
} }
@ -149,3 +151,47 @@ function opencase_uninstall() {
Drupal::configFactory()->getEditable($config)->delete(); Drupal::configFactory()->getEditable($config)->delete();
} }
} }
function opencase_views_pre_render($view) {
if (empty($view->result) && empty($view->exposed_input)) {
$view->exposed_widgets = NULL;
}
}
function opencase_entity_field_access($operation, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $account, $items = NULL) {
if ($field_definition->getName() == 'field_linked_opencase_actor'
&& $operation == 'edit'
&& !$account->hasPermission('administer users')) {
return AccessResult::forbidden();
}
return AccessResult::neutral();
}
/**
* Implementation of hook_form_alter()
* After deleting an actor or a case, redirect to the main page, which is a view of all cases.
*/
function opencase_form_alter(&$form, &$form_state, $form_id) {
if (preg_match('/oc_actor_.*_delete_form/', $form_id) or (preg_match('/oc_case_.*_delete_form/', $form_id))) {
$form['actions']['submit']['#submit'][] = '_opencase_delete_case_redirect';
$form['actions']['cancel']['#url'] = $form_state->getFormObject()->getEntity()->toUrl();
}
if (preg_match('/oc_activity_.*_delete_form/', $form_id)) {
$form['actions']['submit']['#submit'][] = '_opencase_delete_activity_redirect';
$form['actions']['cancel']['#url'] = $form_state->getFormObject()->getEntity()->toUrl();
}
}
function _opencase_delete_case_redirect($form, &$form_state) {
$form_state->setRedirect('view.cases.page_2'); // redirect to view of all cases
}
function _opencase_delete_activity_redirect($form, &$form_state) {
$case_id = $form_state->getFormObject()->getEntity()->oc_case->target_id;
$form_state->setRedirect('view.activities.page_1', ['case_id' => $case_id]); // redirect to the activity list
}
function _opencase_cancel_delete_activity_redirect($form, &$form_state) {
$entity = $form_state->getFormObject()->getEntity();
$form_state->setRedirect('entity.oc_activity.canonical', ['oc_activity' => $entity->id()]); // redirect to the activity
}

View File

@ -94,14 +94,24 @@ class ContextualMenu extends BlockBase {
/** /**
* Contextual menu for Case page * Contextual menu for Case page
* - Link to case list for the actor that is stored in the session * - Link either the case list for the actor stored in the session (because their case list page was previously loaded)
* or the home page
* - Link to Activity list for that case * - Link to Activity list for that case
*/ */
private function casePage() { private function casePage() {
$case = \Drupal::routeMatch()->getParameter('oc_case'); $case = \Drupal::routeMatch()->getParameter('oc_case');
$actor_id = \Drupal::service('user.private_tempstore')->get('opencase')->get('actor_id'); $actor_id = \Drupal::service('user.private_tempstore')->get('opencase')->get('actor_id');
if ($actor_id) { // there is not always one stored.
$actor = \Drupal::entityTypeManager()->getStorage('oc_actor')->load($actor_id); $actor = \Drupal::entityTypeManager()->getStorage('oc_actor')->load($actor_id);
$links = [$this->getCaseListLink($actor), $this->getActivityListLink($case)]; if ($actor) { // actor may have been deleted.
$caseListLink = $this->getCaseListLink($actor);
} else {
$caseListLink = $this->getCaseListLinkAll();
}
} else {
$caseListLink = $this->getCaseListLinkAll();
}
$links = [$caseListLink, $this->getActivityListLink($case)];
return $this->asNavLinks($links); return $this->asNavLinks($links);
} }
@ -171,6 +181,14 @@ class ContextualMenu extends BlockBase {
return Link::fromTextAndUrl(t($actor->getName(). ": Cases"), $url)->toString(); return Link::fromTextAndUrl(t($actor->getName(). ": Cases"), $url)->toString();
} }
/**
* Returns a link to the list of all cases
*/
private function getCaseListLinkAll() {
$url = Url::fromRoute('view.cases.page_2');
return Link::fromTextAndUrl(t("All cases"), $url)->toString();
}
/** /**
* Render given links as nav links div with heading * Render given links as nav links div with heading
*/ */