Skip to content

Commit

Permalink
fix: sort sharing object, more defensive
Browse files Browse the repository at this point in the history
  • Loading branch information
Birkbjo committed Apr 24, 2024
1 parent 04c30c9 commit a365361
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 12 deletions.
22 changes: 14 additions & 8 deletions src/EditModel/event-program/program-access/utils.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,37 @@
import { isEqual } from 'lodash/fp';


const sortSharingObjectPart = (sharingObjectPart) => {
if(!sharingObjectPart) return sharingObjectPart;

return Object.values(sharingObjectPart).sort((a, b) => a.id < b.id);
}

export const areSharingPropertiesSimilar = (modelA, modelB) => {
const sharingA = modelA.sharing;
const sharingB = modelB.sharing;
if (sharingA.public !== sharingB.public) return false;
if (!sharingA || !sharingB || sharingA.public !== sharingB.public) return false;
if (!!sharingA.externalAccess !== !!sharingB.externalAccess) return false;

const compareFunction = (a, b) => a.id < b.id;
if (
!isEqual(
Array.sort(sharingA.users || [], compareFunction),
Array.sort(sharingB.users || [], compareFunction),
sortSharingObjectPart(sharingA.users),
sortSharingObjectPart(sharingB.users),
)
) {
return false;
}

return isEqual(
Array.sort(sharingA.userGroups || [], compareFunction),
Array.sort(sharingB.userGroups || [], compareFunction),
sortSharingObjectPart(sharingA.userGroups),
sortSharingObjectPart(sharingB.userGroups)
)
};

export const extractDisplayName = model => model.dataValues.displayName;

const getPublicAccessDescription = publicAccessString => {
if (publicAccessString.substr(0, 4) === '----') return 'No public access';
if (!publicAccessString || publicAccessString.substr(0, 4) === '----') return 'No public access';
if (publicAccessString.substr(0, 4) === 'rwrw') return 'Complete public access';

let description = '';
Expand Down Expand Up @@ -54,7 +60,7 @@ const getPublicAccessDescription = publicAccessString => {
};

export const generateSharingDescription = ({ sharing }) => {
const { public: publicAccess, users, userGroups } = sharing;
const { public: publicAccess, users, userGroups } = sharing || {};
const publicAccessDescription = getPublicAccessDescription(publicAccess);
const userGroupCount = userGroups ? Object.keys(userGroups).length : 0;
const userCount = users ? Object.keys(users).length : 0;
Expand Down
7 changes: 6 additions & 1 deletion src/EditModel/event-program/tracker-program/epics.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,12 @@ export const newTrackerProgramStage = action$ =>
const maxSortOrder = getMaxSortOrder(store);
const programStageModel = d2.models.programStages.create({
id: programStageUid,
publicAccess: "rw------",
sharing: {
public: "rw------",
userGroups: {},
users: {},
externalAccess: false
},
programStageDataElements: [],
notificationTemplates: [],
programStageSections: [],
Expand Down
4 changes: 2 additions & 2 deletions src/EditModel/sharing.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const transformSharingObjectToLegacy = sharing => {
const { public: publicAccess, users, userGroups, external } = sharing;

return {
publicAccess,
publicAccess: publicAccess || '--------',
externalAccess: Boolean(external),
userGroupAccesses: userGroups
? Object.values(userGroups).map(userGroupSharing => ({
Expand Down Expand Up @@ -87,7 +87,7 @@ export const transformLegacySharingToSharingObject = modelWithSharing => {
} = modelWithSharing;

return {
public: publicAccess,
public: publicAccess || '--------',
external: Boolean(externalAccess),
userGroups: transformLegacySharingArrayToObject(userGroupAccesses),
users: transformLegacySharingArrayToObject(userAccesses),
Expand Down
2 changes: 1 addition & 1 deletion src/List/List.component.js
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ class List extends Component {
// the data-table has functionality for rendering "publicAccess"
// we thus need to transform the sharing object to a publicAccess property
if (model.sharing) {
model.publicAccess = model.sharing.public;
model.publicAccess = model.sharing.public || '--------';
}
return model;
}
Expand Down

0 comments on commit a365361

Please sign in to comment.