Skip to content

Commit

Permalink
feat(meetings): add pinned user in meeting (#340)
Browse files Browse the repository at this point in the history
  • Loading branch information
enkhtuvshinD committed Sep 27, 2023
1 parent b2ac96f commit d26cf02
Show file tree
Hide file tree
Showing 26 changed files with 420 additions and 81 deletions.
8 changes: 8 additions & 0 deletions packages/plugin-meetings-api/src/connectionResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ import { IMeetingDocument } from './models/definitions/meeting';
import { createGenerateModels } from '@erxes/api-utils/src/core';
import { ITopicModel, loadTopicClass } from './models/Topics';
import { ITopicDocument } from './models/definitions/topic';
import { IPinnedUserDocument } from './models/definitions/pinnerUser';
import { IPinnedUserModel, loadPinnedUserClass } from './models/pinnedUsers';

export interface IModels {
Meetings: IMeetingModel;
Topics: ITopicModel;
PinnedUsers: IPinnedUserModel;
}

export let models: IModels | null = null;
Expand All @@ -24,6 +27,11 @@ export const loadClasses = (db: mongoose.Connection): IModels => {
loadTopicClass(models)
);

models.PinnedUsers = db.model<IPinnedUserDocument, IPinnedUserModel>(
'meeting_pinnedUsers',
loadPinnedUserClass(models)
);

return models;
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import Meeting from './meeting';
import PinnedUsers from './pinnedUsers';
export default {
Meeting
Meeting,
PinnedUsers
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default {
async pinnedUsersInfo(pinnedUser) {
if (!pinnedUser.pinnedUserIds) return null;
return pinnedUser.pinnedUserIds.map(userId => {
return {
__typename: 'User',
_id: userId
};
});
}
};
5 changes: 3 additions & 2 deletions packages/plugin-meetings-api/src/graphql/resolvers/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import customScalars from '@erxes/api-utils/src/customScalars';

import { Meeting, Topic } from './mutations';
import { Meeting, Topic, PinnedUser } from './mutations';
import Query from './queries';

import customResolvers from './customResolvers';
Expand All @@ -11,7 +11,8 @@ const resolvers: any = async () => ({

Mutation: {
...Meeting,
...Topic
...Topic,
...PinnedUser
},
Query
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Meeting from './meeting';
import Topic from './topic';
import PinnedUser from './pinnedUser';

export { Meeting, Topic };
export { Meeting, Topic, PinnedUser };
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { IContext } from '../../../messageBroker';

const pinnedUserMutations = {
// /**
// * Creates a new pinnedUser
// */
async meetingPinnedUserAdd(
_root,
{ pinnedUserIds },
{ models, user }: IContext
) {
return await models.PinnedUsers.createPinnedUser(pinnedUserIds, user);
},

// /**
// * Edits a pinnedUser
// */
async meetingPinnedUserEdit(
_root,
{ pinnedUserIds },
{ models, user }: IContext
) {
return models.PinnedUsers.updatePinnedUser(pinnedUserIds, user);
}
};

export default pinnedUserMutations;
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import meetingQueries from './meeting';
import pinnedUserQueries from './pinnedUser';

export default {
...meetingQueries
...meetingQueries,
...pinnedUserQueries
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { paginate } from '@erxes/api-utils/src';
import { IContext } from '../../../messageBroker';

const pinnedUserQueries = {
async meetingPinnedUsers(_root, {}, { models, user }: IContext) {
return await paginate(models.PinnedUsers.findOne({ userId: user._id }), {});
}
};

export default pinnedUserQueries;
11 changes: 11 additions & 0 deletions packages/plugin-meetings-api/src/graphql/schema/pinnedUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const params = `
pinnedUserIds: [String]
`;
export const mutations = `
meetingPinnedUserAdd(${params}): PinnedUsers
meetingPinnedUserEdit(${params}): PinnedUsers
`;

export const queries = `
meetingPinnedUsers: PinnedUsers
`;
12 changes: 12 additions & 0 deletions packages/plugin-meetings-api/src/graphql/typeDefs.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import gql from 'graphql-tag';
import { mutations as meetingMutations, queries } from './schema/meeting';
import { mutations as topicMutations } from './schema/topic';
import {
mutations as pinnedUserMutations,
queries as pinnedUserQueries
} from './schema/pinnedUser';

const types = `
type Topic {
Expand Down Expand Up @@ -42,6 +46,12 @@ const types = `
dealIds: [String]
deals: [Deal]
}
type PinnedUsers {
userId: String
pinnedUserIds: [String]
pinnedUsersInfo: [User]
}
`;

const typeDefs = async () => {
Expand All @@ -53,11 +63,13 @@ const typeDefs = async () => {
extend type Query {
${queries}
${pinnedUserQueries}
}
extend type Mutation {
${meetingMutations}
${topicMutations}
${pinnedUserMutations}
}
`;
};
Expand Down
16 changes: 16 additions & 0 deletions packages/plugin-meetings-api/src/models/definitions/pinnerUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Schema, Document } from 'mongoose';
import { field } from './utils';

export interface IPinnedUser {
userId: string;
pinnedUserIds: string;
}
export interface IPinnedUserDocument extends IPinnedUser, Document {
_id: String;
}

export const pinnedUserSchema = new Schema({
_id: field({ pkey: true }),
userId: field({ pkey: true }),
pinnedUserIds: field({ type: [String] })
});
43 changes: 43 additions & 0 deletions packages/plugin-meetings-api/src/models/pinnedUsers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { Model } from 'mongoose';
import { IModels } from '../connectionResolver';
import { IUser } from '@erxes/api-utils/src/types';
import {
IPinnedUserDocument,
pinnedUserSchema
} from './definitions/pinnerUser';
import { checkLogin } from '@erxes/api-utils/src';

export interface IPinnedUserModel extends Model<IPinnedUserDocument> {
createPinnedUser(
pinnedUserIds: String[],
user: IUser
): Promise<IPinnedUserDocument>;
updatePinnedUser(
pinnedUserIds: String[],
user: IUser
): Promise<IPinnedUserDocument>;
}

export const loadPinnedUserClass = (model: IModels) => {
class PinnedUser {
// create
public static async createPinnedUser(pinnedUserIds, user) {
return await model.PinnedUsers.create({
pinnedUserIds,
userId: user._id
});
}

// update
public static async updatePinnedUser(pinnedUserIds, user) {
return await model.PinnedUsers.updateOne(
{ userId: user._id },
{ $set: { pinnedUserIds } }
).then(err => console.error(err));
}
}

pinnedUserSchema.loadClass(PinnedUser);

return pinnedUserSchema;
};
1 change: 0 additions & 1 deletion packages/plugin-meetings-ui/src/components/List.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ function List(props: Props) {
queryParams={queryParams}
meetings={meetings}
loading={loading}
participantUsers={participantUsers}
/>
);
break;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import React, { useState } from 'react';
import { Button, ControlLabel, Form, SelectTeamMembers } from '@erxes/ui/src';
import FormGroup from '@erxes/ui/src/components/form/Group';
import { ModalFooter } from '@erxes/ui/src/styles/main';
import { IButtonMutateProps } from '@erxes/ui/src/types';

type Props = {
closeModal: () => void;
pinnedUserIds: string[];
renderButton: (props: IButtonMutateProps) => JSX.Element;
};
const ChooseOwnerForm = (props: Props) => {
const { pinnedUserIds } = props;

const [pinnedIds, setPinnedUserIds] = useState([pinnedUserIds] || []);

const generateDoc = values => {
const finalValues = values;

if (pinnedIds) {
finalValues.pinnedUserIds = pinnedIds;
}
return {
...finalValues
};
};

const onUserSelect = users => {
setPinnedUserIds(users);
};

const renderContent = formProps => {
const { closeModal, renderButton } = props;
const { values, isSubmitted } = formProps;
const object = pinnedUserIds;

return (
<>
<FormGroup>
<div style={{ marginBottom: '0' }}>
<ControlLabel>Team members </ControlLabel>
<div style={{ width: '100%' }}>
<SelectTeamMembers
initialValue={pinnedUserIds}
customField="userIds"
filterParams={{}}
label={'Select team member'}
onSelect={onUserSelect}
name="userId"
/>
</div>
</div>
</FormGroup>
<ModalFooter id={'AddTeamMembersButtons'}>
<Button btnStyle="simple" onClick={closeModal} icon="times-circle">
Cancel
</Button>

{renderButton({
passedName: 'Pinned Users',
values: generateDoc(values),
isSubmitted,
callback: closeModal,
object: object
})}
</ModalFooter>
</>
);
};

return <Form renderContent={renderContent} />;
};

export default ChooseOwnerForm;
Loading

0 comments on commit d26cf02

Please sign in to comment.