Skip to content

Commit

Permalink
AB#1163 Add merge buttons to the show pages for mergeable objects
Browse files Browse the repository at this point in the history
  • Loading branch information
gjvoosten committed Jul 8, 2024
1 parent 6a61a88 commit 7b9d1a3
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 60 deletions.
8 changes: 8 additions & 0 deletions client/src/components/Model.js
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,14 @@ export default class Model {
return Model.filterClientSideFields(this, ...additionalFields)
}

fixupFields() {
if (this.customFields) {
this[DEFAULT_CUSTOM_FIELDS_PARENT] = utils.parseJsonSafe(
this.customFields
)
}
}

static isAuthorized(user, customSensitiveInformationField) {
// Admins are always allowed
if (user?.isAdmin()) {
Expand Down
5 changes: 5 additions & 0 deletions client/src/models/Location.js
Original file line number Diff line number Diff line change
Expand Up @@ -308,4 +308,9 @@ export default class Location extends Model {
filterClientSideFields(...additionalFields) {
return Location.filterClientSideFields(this, ...additionalFields)
}

fixupFields() {
super.fixupFields()
this.displayedCoordinate = convertLatLngToMGRS(this.lat, this.lng)
}
}
9 changes: 9 additions & 0 deletions client/src/models/Person.js
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,15 @@ export default class Person extends Model {
return Person.filterClientSideFields(this, ...additionalFields)
}

fixupFields() {
super.fixupFields()
if (this.customSensitiveInformation) {
this[SENSITIVE_CUSTOM_FIELDS_PARENT] = utils.parseSensitiveFields(
this.customSensitiveInformation
)
}
}

static isAuthorized(user, customSensitiveInformationField, position) {
if (Model.isAuthorized(user, customSensitiveInformationField)) {
return true
Expand Down
36 changes: 22 additions & 14 deletions client/src/pages/admin/merge/MergeLocations.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,17 @@ import PropTypes from "prop-types"
import React, { useEffect, useState } from "react"
import { Button, Col, Container, Form, Row } from "react-bootstrap"
import { connect } from "react-redux"
import { useNavigate } from "react-router-dom"
import { useLocation, useNavigate } from "react-router-dom"
import LOCATIONS_ICON from "resources/locations.png"
import Settings from "settings"
import utils from "utils"

const GQL_GET_LOCATION = gql`
query ($uuid: String!) {
location(uuid: $uuid) {
${Location.allFieldsQuery}
}
}
`

const GQL_MERGE_LOCATION = gql`
mutation ($loserUuid: String!, $winnerLocation: LocationInput!) {
Expand All @@ -53,6 +60,8 @@ const GQL_MERGE_LOCATION = gql`

const MergeLocations = ({ pageDispatchers }) => {
const navigate = useNavigate()
const { state } = useLocation()
const initialLeftUuid = state?.initialLeftUuid
const [saveError, setSaveError] = useState(null)
const [saveWarning, setSaveWarning] = useState(null)
const [locationFormat, setLocationFormat] = useState(Location.locationFormat)
Expand All @@ -68,6 +77,15 @@ const MergeLocations = ({ pageDispatchers }) => {
})
usePageTitle("Merge Locations")

if (!mergeState[MERGE_SIDES.LEFT] && initialLeftUuid) {
API.query(GQL_GET_LOCATION, {
uuid: initialLeftUuid
}).then(data => {
const location = new Location(data.location)
location.fixupFields()
dispatchMergeActions(setMergeable(location, MERGE_SIDES.LEFT))
})
}
const location1 = mergeState[MERGE_SIDES.LEFT]
const location2 = mergeState[MERGE_SIDES.RIGHT]
const mergedLocation = mergeState.merged
Expand Down Expand Up @@ -392,17 +410,7 @@ const LocationColumn = ({
overlayRenderRow={LocationOverlayRow}
filterDefs={getLocationFilters()}
onChange={value => {
if (value?.customFields) {
value[DEFAULT_CUSTOM_FIELDS_PARENT] = utils.parseJsonSafe(
value.customFields
)
}
if (value) {
value.displayedCoordinate = convertLatLngToMGRS(
value.lat,
value.lng
)
}
value?.fixupFields()
dispatchMergeActions(setMergeable(value, align))
}}
objectType={Location}
Expand Down Expand Up @@ -603,7 +611,7 @@ const LocationColumn = ({
Object.entries(Settings.fields.location.customFields).map(
([fieldName, fieldConfig]) => {
const fieldValue =
location[DEFAULT_CUSTOM_FIELDS_PARENT][fieldName]
location?.[DEFAULT_CUSTOM_FIELDS_PARENT]?.[fieldName]
return (
<MergeField
key={fieldName}
Expand Down
30 changes: 22 additions & 8 deletions client/src/pages/admin/merge/MergeOrganizations.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,19 @@ import PropTypes from "prop-types"
import React, { useState } from "react"
import { Button, Col, Container, Form, Row } from "react-bootstrap"
import { connect } from "react-redux"
import { useNavigate } from "react-router-dom"
import { useLocation, useNavigate } from "react-router-dom"
import ORGANIZATIONS_ICON from "resources/organizations.png"
import Settings from "settings"
import utils from "utils"

const GQL_GET_ORGANIZATION = gql`
query ($uuid: String!) {
organization(uuid: $uuid) {
${Organization.allFieldsQuery}
}
}
`

const GQL_MERGE_ORGANIZATION = gql`
mutation ($loserUuid: String!, $winnerOrganization: OrganizationInput!) {
mergeOrganizations(
Expand All @@ -57,6 +65,8 @@ const GQL_MERGE_ORGANIZATION = gql`

const MergeOrganizations = ({ pageDispatchers }) => {
const navigate = useNavigate()
const { state } = useLocation()
const initialLeftUuid = state?.initialLeftUuid
const [saveError, setSaveError] = useState(null)
const [mergeState, dispatchMergeActions] = useMergeObjects(
MODEL_TO_OBJECT_TYPE.Organization
Expand All @@ -69,6 +79,15 @@ const MergeOrganizations = ({ pageDispatchers }) => {
})
usePageTitle("Merge Organizations")

if (!mergeState[MERGE_SIDES.LEFT] && initialLeftUuid) {
API.query(GQL_GET_ORGANIZATION, {
uuid: initialLeftUuid
}).then(data => {
const organization = new Organization(data.organization)
organization.fixupFields()
dispatchMergeActions(setMergeable(organization, MERGE_SIDES.LEFT))
})
}
const organization1 = mergeState[MERGE_SIDES.LEFT]
const organization2 = mergeState[MERGE_SIDES.RIGHT]
const mergedOrganization = mergeState.merged
Expand Down Expand Up @@ -461,12 +480,7 @@ const OrganizationColumn = ({
overlayRenderRow={OrganizationSimpleOverlayRow}
filterDefs={organizationsFilters}
onChange={value => {
const newValue = value
if (newValue?.customFields) {
newValue[DEFAULT_CUSTOM_FIELDS_PARENT] = utils.parseJsonSafe(
value.customFields
)
}
value?.fixupFields()
dispatchMergeActions(setMergeable(value, align))
}}
objectType={Organization}
Expand Down Expand Up @@ -802,7 +816,7 @@ const OrganizationColumn = ({
Object.entries(Settings.fields.organization.customFields).map(
([fieldName, fieldConfig]) => {
const fieldValue =
organization[DEFAULT_CUSTOM_FIELDS_PARENT][fieldName]
organization?.[DEFAULT_CUSTOM_FIELDS_PARENT]?.[fieldName]
return (
<MergeField
key={fieldName}
Expand Down
36 changes: 23 additions & 13 deletions client/src/pages/admin/merge/MergePeople.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,19 @@ import PropTypes from "prop-types"
import React, { useState } from "react"
import { Button, Col, Container, Form, Row } from "react-bootstrap"
import { connect } from "react-redux"
import { useNavigate } from "react-router-dom"
import { useLocation, useNavigate } from "react-router-dom"
import PEOPLE_ICON from "resources/people.png"
import Settings from "settings"
import utils from "utils"

const GQL_GET_PERSON = gql`
query($uuid: String!) {
person(uuid: $uuid) {
${Person.allFieldsQuery}
}
}
`

const GQL_MERGE_PERSON = gql`
mutation ($loserUuid: String!, $winnerPerson: PersonInput!) {
mergePeople(loserUuid: $loserUuid, winnerPerson: $winnerPerson)
Expand All @@ -58,6 +66,8 @@ const GQL_MERGE_PERSON = gql`

const MergePeople = ({ pageDispatchers }) => {
const navigate = useNavigate()
const { state } = useLocation()
const initialLeftUuid = state?.initialLeftUuid
const [saveError, setSaveError] = useState(null)
const [showHistoryModal, setShowHistoryModal] = useState(false)
const [mergeState, dispatchMergeActions] = useMergeObjects(
Expand All @@ -71,6 +81,15 @@ const MergePeople = ({ pageDispatchers }) => {
})
usePageTitle("Merge People")

if (!mergeState[MERGE_SIDES.LEFT] && initialLeftUuid) {
API.query(GQL_GET_PERSON, {
uuid: initialLeftUuid
}).then(data => {
const person = new Person(data.person)
person.fixupFields()
dispatchMergeActions(setMergeable(person, MERGE_SIDES.LEFT))
})
}
const person1 = mergeState[MERGE_SIDES.LEFT]
const person2 = mergeState[MERGE_SIDES.RIGHT]
const mergedPerson = mergeState.merged
Expand Down Expand Up @@ -469,16 +488,7 @@ const PersonColumn = ({ align, label, mergeState, dispatchMergeActions }) => {
overlayRenderRow={PersonSimpleOverlayRow}
filterDefs={peopleFilters}
onChange={value => {
const newValue = value
if (newValue?.customFields) {
newValue[DEFAULT_CUSTOM_FIELDS_PARENT] = utils.parseJsonSafe(
value.customFields
)
}
if (newValue?.customSensitiveInformation) {
newValue[SENSITIVE_CUSTOM_FIELDS_PARENT] =
utils.parseSensitiveFields(value.customSensitiveInformation)
}
value?.fixupFields()
dispatchMergeActions(setMergeable(value, align))
}}
objectType={Person}
Expand Down Expand Up @@ -765,7 +775,7 @@ const PersonColumn = ({ align, label, mergeState, dispatchMergeActions }) => {
Object.entries(Settings.fields.person.customFields).map(
([fieldName, fieldConfig]) => {
const fieldValue =
person[DEFAULT_CUSTOM_FIELDS_PARENT][fieldName]
person?.[DEFAULT_CUSTOM_FIELDS_PARENT]?.[fieldName]
return (
<MergeField
key={fieldName}
Expand Down Expand Up @@ -794,7 +804,7 @@ const PersonColumn = ({ align, label, mergeState, dispatchMergeActions }) => {
Settings.fields.person.customSensitiveInformation
).map(([fieldName, fieldConfig]) => {
const fieldValue =
person[SENSITIVE_CUSTOM_FIELDS_PARENT][fieldName]
person?.[SENSITIVE_CUSTOM_FIELDS_PARENT]?.[fieldName]
return (
<MergeField
key={fieldName}
Expand Down
31 changes: 22 additions & 9 deletions client/src/pages/admin/merge/MergePositions.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,17 @@ import PropTypes from "prop-types"
import React, { useState } from "react"
import { Button, Col, Container, Form, Row } from "react-bootstrap"
import { connect } from "react-redux"
import { useNavigate } from "react-router-dom"
import { useLocation, useNavigate } from "react-router-dom"
import POSITIONS_ICON from "resources/positions.png"
import Settings from "settings"
import utils from "utils"

const GQL_GET_POSITION = gql`
query($uuid: String!) {
position(uuid: $uuid) {
${Position.allFieldsQuery}
}
}
`

const GQL_MERGE_POSITION = gql`
mutation ($loserUuid: String!, $winnerPosition: PositionInput!) {
Expand All @@ -57,6 +64,8 @@ const GQL_MERGE_POSITION = gql`

const MergePositions = ({ pageDispatchers }) => {
const navigate = useNavigate()
const { state } = useLocation()
const initialLeftUuid = state?.initialLeftUuid
const [saveError, setSaveError] = useState(null)
const [showHistoryModal, setShowHistoryModal] = useState(false)
const [mergeState, dispatchMergeActions] = useMergeObjects(
Expand All @@ -70,6 +79,15 @@ const MergePositions = ({ pageDispatchers }) => {
})
usePageTitle("Merge Positions")

if (!mergeState[MERGE_SIDES.LEFT] && initialLeftUuid) {
API.query(GQL_GET_POSITION, {
uuid: initialLeftUuid
}).then(data => {
const position = new Position(data.position)
position.fixupFields()
dispatchMergeActions(setMergeable(position, MERGE_SIDES.LEFT))
})
}
const position1 = mergeState[MERGE_SIDES.LEFT]
const position2 = mergeState[MERGE_SIDES.RIGHT]
const mergedPosition = mergeState.merged
Expand Down Expand Up @@ -432,12 +450,7 @@ const PositionColumn = ({ align, label, mergeState, dispatchMergeActions }) => {
overlayRenderRow={PositionOverlayRow}
filterDefs={getPositionFilters(mergeState, align)}
onChange={value => {
const newValue = value
if (newValue?.customFields) {
newValue[DEFAULT_CUSTOM_FIELDS_PARENT] = utils.parseJsonSafe(
value.customFields
)
}
value?.fixupFields()
dispatchMergeActions(setMergeable(value, align))
}}
objectType={Position}
Expand Down Expand Up @@ -636,7 +649,7 @@ const PositionColumn = ({ align, label, mergeState, dispatchMergeActions }) => {
Object.entries(Settings.fields.position.customFields).map(
([fieldName, fieldConfig]) => {
const fieldValue =
position[DEFAULT_CUSTOM_FIELDS_PARENT][fieldName]
position?.[DEFAULT_CUSTOM_FIELDS_PARENT]?.[fieldName]

return (
<MergeField
Expand Down
14 changes: 12 additions & 2 deletions client/src/pages/locations/Show.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import _isEmpty from "lodash/isEmpty"
import { Attachment, Location } from "models"
import React, { useContext, useState } from "react"
import { connect } from "react-redux"
import { useLocation, useParams } from "react-router-dom"
import { Link, useLocation, useParams } from "react-router-dom"
import Settings from "settings"
import utils from "utils"

Expand Down Expand Up @@ -77,7 +77,8 @@ const LocationShow = ({ pageDispatchers }) => {
)
}
const location = new Location(data ? data.location : {})
const canEdit = currentUser.isSuperuser()
const isAdmin = currentUser?.isAdmin()
const canEdit = currentUser?.isSuperuser()
const attachmentsEnabled = !Settings.fields.attachment.featureDisabled

return (
Expand All @@ -95,6 +96,15 @@ const LocationShow = ({ pageDispatchers }) => {
}
const action = (
<>
{isAdmin && (
<Link
to="/admin/merge/locations"
state={{ initialLeftUuid: location.uuid }}
className="btn btn-outline-secondary"
>
Merge with other location
</Link>
)}
{canEdit && (
<LinkTo
modelType="Location"
Expand Down
Loading

0 comments on commit 7b9d1a3

Please sign in to comment.