Skip to content

Commit

Permalink
RocketChat#822 [EDIT] Корректное отображение рабочей группы
Browse files Browse the repository at this point in the history
  • Loading branch information
Scarvis committed Nov 27, 2020
1 parent ffb4179 commit 96b1965
Show file tree
Hide file tree
Showing 19 changed files with 163 additions and 111 deletions.
7 changes: 4 additions & 3 deletions app/api/server/v1/working-groups.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Meteor } from 'meteor/meteor';
import Busboy from 'busboy';

import { API } from '../api';
import { findWorkingGroups, findOneWorkingGroup, findWorkingGroup } from '../lib/working-groups';
import { Meteor } from "meteor/meteor";
import { FileUpload } from '../../../file-upload';
import Busboy from 'busboy';

API.v1.addRoute('working-groups.list', { authRequired: true }, {
API.v1.addRoute('working-groups.list', { authRequired: false }, {
get() {
const { offset, count } = this.getPaginationItems();
const { sort, query } = this.parseJsonQuery();
Expand Down
17 changes: 13 additions & 4 deletions app/councils/client/views/AddCouncil.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const useQuery = ({ text, itemsPerPage, current }, [column, direction]) => useMe
}), [text, itemsPerPage, current, column, direction]);

export function AddCouncilPage() {
const t = useTranslation();
const [cache, setCache] = useState();
const [params, setParams] = useState({ text: '', current: 0, itemsPerPage: 25 });
const [sort, setSort] = useState(['surname', 'asc']);
Expand All @@ -46,8 +47,8 @@ export function AddCouncilPage() {
const debouncedSort = useDebouncedValue(sort, 500);
const query = useQuery(debouncedParams, debouncedSort);

const workingGroups = useEndpointData('working-groups.list', useMemo(() => ({ query: JSON.stringify({ type: { $ne: 'subject' } }) }), [])) || { workingGroups: [] };
const data = useEndpointData('users.list', query) || { users: [] };

useEffect(() => {
if (data.users) {
setUsers(data.users);
Expand All @@ -58,14 +59,22 @@ export function AddCouncilPage() {
setCache(new Date());
}, [data]);

return <AddCouncilWithNewData users={users} setUsers={setUsers} onChange={onChange}/>;
const workingGroupOptions = useMemo(() => {
const res = [[null, t('Not_chosen')]];
if (workingGroups && workingGroups.workingGroups?.length > 0) {
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
}
return res;
}, [workingGroups]);

return <AddCouncilWithNewData users={users} setUsers={setUsers} onChange={onChange} workingGroupOptions={workingGroupOptions}/>;
}

AddCouncilPage.displayName = 'AddCouncilPage';

export default AddCouncilPage;

function AddCouncilWithNewData({ users, setUsers, onChange }) {
function AddCouncilWithNewData({ users, setUsers, onChange, workingGroupOptions }) {
const t = useTranslation();

const [context, setContext] = useState('participants');
Expand Down Expand Up @@ -169,7 +178,7 @@ function AddCouncilWithNewData({ users, setUsers, onChange }) {
</Field>}
{context === 'participants' && <Participants onChange={onChange} context={'new'} invitedUsers={invitedUsers} setInvitedUsers={setInvitedUsersIds}/>}
{context === 'addParticipants' && <AddParticipant onChange={onChange} close={onClose} invitedUsers={invitedUsersIds} setInvitedUsers={setInvitedUsersIds} users={users} onNewParticipant={onParticipantClick}/>}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions} />}
</Page.Content>
</Page>
</Page>;
Expand Down
18 changes: 13 additions & 5 deletions app/councils/client/views/Council.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useCallback, useMemo, useState } from 'react';
import { ButtonGroup, Button, Field, Icon, Label, TextInput, TextAreaInput, Modal } from '@rocket.chat/fuselage';
import moment from 'moment';

import Page from '../../../../client/components/basic/Page';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
Expand All @@ -8,7 +9,6 @@ import { useEndpointData } from '../../../../client/hooks/useEndpointData';
import { useFormatDateAndTime } from '../../../../client/hooks/useFormatDateAndTime';
import { useMethod } from '../../../../client/contexts/ServerContext';
import { settings } from '../../../settings/client';
import moment from 'moment';
import { useSetModal } from '../../../../client/contexts/ModalContext';
import { useToastMessageDispatch } from '../../../../client/contexts/ToastMessagesContext';
import { Participants } from './Participants/Participants';
Expand Down Expand Up @@ -63,6 +63,7 @@ export function CouncilPage() {
const [onCreateParticipantId, setOnCreateParticipantId] = useState();
const [context, setContext] = useState('participants');
const [cache, setCache] = useState();
const [users, setUsers] = useState([]);

const onChange = () => { console.log('onChange'); setCache(new Date()); };

Expand All @@ -71,11 +72,10 @@ export function CouncilPage() {
}), [councilId]);

const data = useEndpointData('councils.findOne', query) || { result: [] };
const workingGroups = useEndpointData('working-groups.list', useMemo(() => ({ query: JSON.stringify({ type: { $ne: 'subject' } }) }), [])) || { workingGroups: [] };

const invitedUsers = data.invitedUsers || [];

console.log(data);
console.log(invitedUsers);
const setModal = useSetModal();

const deleteCouncil = useMethod('deleteCouncil');
Expand Down Expand Up @@ -150,6 +150,14 @@ export function CouncilPage() {

const onDeleteCouncilClick = () => setModal(() => <DeleteWarningModal title={t('Council_Delete_Warning')} onDelete={onDeleteCouncilConfirm} onCancel={() => setModal(undefined)}/>);

const workingGroupOptions = useMemo(() => {
const res = [[null, t('Not_chosen')]];
if (workingGroups && workingGroups.workingGroups?.length > 0) {
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
}
return res;
}, [workingGroups]);

return <Page flexDirection='row'>
<Page>
<Page.Header>
Expand Down Expand Up @@ -202,8 +210,8 @@ export function CouncilPage() {
</Field.Row>
</Field>}
{context === 'participants' && <Participants councilId={councilId} onChange={onChange}/>}
{context === 'addParticipants' && <AddParticipant councilId={councilId} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
{context === 'addParticipants' && <AddParticipant councilId={councilId} onChange={onChange} close={onClose} users={users} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions}/>}
{context === 'onCreateParticipant' && <AddParticipant onCreateParticipantId={onCreateParticipantId} councilId={councilId} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
</Page.Content>
</Page>
Expand Down
38 changes: 17 additions & 21 deletions app/councils/client/views/EditCouncil.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,17 @@
import React, { useCallback, useState, useMemo, useEffect } from 'react';
import {
Box,
Button,
ButtonGroup,
Field,
Icon,
TextAreaInput,
TextInput,
Modal, Table, Label, Margins, CheckBox,
} from '@rocket.chat/fuselage';
import { Box, Button, ButtonGroup, Field, Icon, TextAreaInput, TextInput, Modal, Label } from '@rocket.chat/fuselage';
import DatePicker, { registerLocale } from 'react-datepicker';
import ru from 'date-fns/locale/ru';

import Page from '../../../../client/components/basic/Page';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import { useMethod } from '../../../../client/contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../client/contexts/ToastMessagesContext';
import { useEndpointData } from '../../../../client/hooks/useEndpointData';
import { useEndpointDataExperimental } from '../../../../client/hooks/useEndpointDataExperimental';
import { useSetModal } from '../../../../client/contexts/ModalContext';
import { validate, createCouncilData } from './lib';

import { useFormatDateAndTime } from '../../../../client/hooks/useFormatDateAndTime';
import { useRouteParameter } from '../../../../client/contexts/RouterContext';

import { useMediaQuery } from '@rocket.chat/fuselage-hooks';

import { GenericTable, Th } from '../../../../client/components/GenericTable';
import Page from '../../../../client/components/basic/Page';
import { validate, createCouncilData } from './lib';
import { AddParticipant } from './Participants/AddParticipant';
import { CreateParticipant } from './Participants/CreateParticipant';
import { Participants } from './Participants/Participants';
Expand Down Expand Up @@ -74,6 +60,7 @@ const SuccessModal = ({ title, onClose, ...props }) => {
};

export function EditCouncilPage() {
const t = useTranslation();
const context = useRouteParameter('context');
const councilId = useRouteParameter('id');

Expand All @@ -82,12 +69,21 @@ export function EditCouncilPage() {
}), [councilId]);

const { data } = useEndpointDataExperimental('councils.findOne', query) || { result: [] };
const workingGroups = useEndpointData('working-groups.list', useMemo(() => ({ query: JSON.stringify({ type: { $ne: 'subject' } }) }), [])) || { workingGroups: [] };
const [cache, setCache] = useState();

const onChange = useCallback(() => {
setCache(new Date());
}, []);

const workingGroupOptions = useMemo(() => {
const res = [[null, t('Not_chosen')]];
if (workingGroups && workingGroups.workingGroups?.length > 0) {
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
}
return res;
}, [workingGroups]);

if (!data) {
return <Box fontScale='h1' pb='x20'>{'error'}</Box>;
}
Expand All @@ -96,14 +92,14 @@ export function EditCouncilPage() {
data.invitedUsers = [];
}

return <EditCouncilWithNewData council={data} onChange={onChange}/>;
return <EditCouncilWithNewData council={data} onChange={onChange} workingGroupOptions={workingGroupOptions}/>;
}

EditCouncilPage.displayName = 'EditCouncilPage';

export default EditCouncilPage;

function EditCouncilWithNewData({ council, onChange }) {
function EditCouncilWithNewData({ council, onChange, workingGroupOptions }) {
const t = useTranslation();

const { _id, d: previousDate, desc: previousDescription } = council || {};
Expand Down Expand Up @@ -322,7 +318,7 @@ function EditCouncilWithNewData({ council, onChange }) {
</Field>}
{context === 'participants' && <Participants councilId={_id} onChange={onChange}/>}
{context === 'addParticipants' && <AddParticipant councilId={_id} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions}/>}
{context === 'onCreateParticipant' && <AddParticipant onCreateParticipantId={onCreateParticipantId} councilId={_id} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
</Page.Content>
</Page>
Expand Down
6 changes: 3 additions & 3 deletions app/councils/client/views/Participants/CreateParticipant.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import React, { useCallback, useMemo } from 'react';
import { Box, Button, Field } from '@rocket.chat/fuselage';

import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { useEndpointData } from '../../../../../client/hooks/useEndpointData';
import { useForm } from '../../../../../client/hooks/useForm';
import { useEndpointAction } from '../../../../../client/hooks/useEndpointAction';
import ParticipantForm from './ParticipantForm';

export function CreateParticipant({ goTo, close, ...props }) {
export function CreateParticipant({ goTo, close, workingGroupOptions, ...props }) {
const t = useTranslation();

const {
Expand Down Expand Up @@ -46,5 +46,5 @@ export function CreateParticipant({ goTo, close, ...props }) {
</Field.Row>
</Field>, [close, t, handleSave]);

return <ParticipantForm formValues={values} formHandlers={handlers} append={append} {...props}/>;
return <ParticipantForm formValues={values} formHandlers={handlers} workingGroupOptions={workingGroupOptions} append={append} {...props}/>;
}
24 changes: 13 additions & 11 deletions app/councils/client/views/Participants/ParticipantForm.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
import React, { useCallback, useMemo, useState } from 'react';
import React, { useCallback, useMemo } from 'react';
import {
Field,
TextInput,
Icon,
FieldGroup,
Scrollable,
Select, Margins, Box, ButtonGroup, Button, CheckBox,
Select,
} from '@rocket.chat/fuselage';

import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { isEmail } from '../../../../utils/lib/isEmail.js';
import VerticalBar from '../../../../../client/components/basic/VerticalBar';

export default function ParticipantForm({ formValues, formHandlers, availableRoles, append, ...props }) {
export default function ParticipantForm({ formValues, formHandlers, workingGroupOptions, availableRoles, append, ...props }) {
const t = useTranslation();

const {
Expand All @@ -37,12 +35,16 @@ export default function ParticipantForm({ formValues, formHandlers, availableRol
handleWorkingGroup,
} = formHandlers;

const workingGroupOptions = useMemo(() => [
['Не выбрано', t('Not_chosen')],
['Члены рабочей группы', 'Члены рабочей группы'],
['Представители субъектов Российской Федерации', 'Представители субъектов Российской Федерации'],
['Иные участники', 'Иные участники'],
], [t]);
// const workingGroupOptions = useMemo(() => {
// const res = [[null, t('Not_chosen')]];
// return res.concat(workingGroups?.map((workingGroup) => [workingGroup.title, workingGroup.title]));
// }, [workingGroups]);
// const workingGroupOptions = useMemo(() => [
// ['Не выбрано', t('Not_chosen')],
// ['Члены рабочей группы', 'Члены рабочей группы'],
// ['Представители субъектов Российской Федерации', 'Представители субъектов Российской Федерации'],
// ['Иные участники', 'Иные участники'],
// ], [t]);

return <Scrollable is='form' onSubmit={useCallback((e) => e.preventDefault(), [])} { ...props }>
<Field mb='x16'>
Expand Down
7 changes: 4 additions & 3 deletions app/lib/server/functions/saveUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,15 +198,16 @@ function validateUserEditing(userId, userData) {
}

function validateParticipantData(userId, userData) {
// eslint-disable-next-line react-hooks/rules-of-hooks
if (userData._id && userId !== userData._id && !hasPermission(userId, 'edit-other-user-info')) {
throw new Meteor.Error('error-action-not-allowed', 'Editing user is not allowed', {
throw new Meteor.Error('error-action-not-allowed', 'Editing_user_is_not_allowed', {
method: 'insertOrUpdateUser',
action: 'Editing_user',
});
}

if (!userData._id && !hasPermission(userId, 'create-user')) {
throw new Meteor.Error('error-action-not-allowed', 'Adding user is not allowed', {
throw new Meteor.Error('error-action-not-allowed', 'Adding_user_is_not_allowed', {
method: 'insertOrUpdateUser',
action: 'Adding_user',
});
Expand All @@ -220,7 +221,7 @@ function validateParticipantData(userId, userData) {
// }

if (!userData._id && !s.trim(userData.username)) {
throw new Meteor.Error('error-the-field-is-required', 'The field Username is required', {
throw new Meteor.Error('error-the-field-is-required', 'The_field_is_required', {
method: 'insertOrUpdateUser',
field: 'Username',
});
Expand Down
17 changes: 13 additions & 4 deletions app/protocols/client/views/Protocol.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import { AddSection } from './AddSection';
import { AddItem } from './AddItem';
import { EditSection } from './EditSection';
import { EditItem } from './EditItem';
import { Participants } from '../views/participants/Participants';
import { AddParticipant } from '../views/participants/AddParticipant';
import { CreateParticipant } from '../views/participants/CreateParticipant';
import { Participants } from './participants/Participants';
import { AddParticipant } from './participants/AddParticipant';
import { CreateParticipant } from './participants/CreateParticipant';
import { popover } from '../../../ui-utils/client/lib/popover';
import VerticalBar from '../../../../client/components/basic/VerticalBar';

Expand Down Expand Up @@ -78,6 +78,7 @@ export function ProtocolPage() {
}), [protocolId, cache]);

const data = useEndpointData('protocols.findOne', query) || {};
const workingGroups = useEndpointData('working-groups.list', useMemo(() => ({ query: JSON.stringify({ type: { $ne: 'subject' } }) }), [])) || { workingGroups: [] };

const title = t('Protocol').concat(' ').concat(data.num).concat(' ').concat(t('Date_to')).concat(' ').concat(formatDate(data.d));

Expand Down Expand Up @@ -272,6 +273,14 @@ export function ProtocolPage() {
window.history.back();
};

const workingGroupOptions = useMemo(() => {
const res = [[null, t('Not_chosen')]];
if (workingGroups && workingGroups.workingGroups?.length > 0) {
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
}
return res;
}, [workingGroups]);

return <Page flexDirection='row'>
<Page>
<Page.Header>
Expand Down Expand Up @@ -320,7 +329,7 @@ export function ProtocolPage() {
{context === 'edit-item' && <EditItem protocolId={protocolId} sectionId={sectionId} _id={itemId} close={close} onChange={onChange} cache={cache}/>}
{context === 'participants' && <Participants protocolId={protocolId} onAddParticipantClick={onAddParticipantClick} close={close}/>}
{context === 'add-participant' && <AddParticipant protocolId={protocolId} close={onParticipantsClick} onCreateParticipant={onAddParticipantClick}/>}
{context === 'create-participant' && <CreateParticipant goTo={onParticipantsClick} close={onParticipantsClick}/>}
{context === 'create-participant' && <CreateParticipant goTo={onParticipantsClick} close={onParticipantsClick} workingGroupOptions={workingGroupOptions}/>}
</VerticalBar>}
</Page>;
}
Expand Down
4 changes: 2 additions & 2 deletions app/protocols/client/views/participants/CreateParticipant.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useForm } from '../../../../../client/hooks/useForm';
import { useEndpointAction } from '../../../../../client/hooks/useEndpointAction';
import ParticipantForm from './ParticipantForm';

export function CreateParticipant({ goTo, close, ...props }) {
export function CreateParticipant({ goTo, close, workingGroupOptions, ...props }) {
const t = useTranslation();

const roleData = useEndpointData('roles.list', '') || {};
Expand Down Expand Up @@ -50,5 +50,5 @@ export function CreateParticipant({ goTo, close, ...props }) {
</Field.Row>
</Field>, [hasUnsavedChanges, close, t, handleSave]);

return <ParticipantForm formValues={values} formHandlers={handlers} availableRoles={availableRoles} append={append} {...props}/>;
return <ParticipantForm formValues={values} formHandlers={handlers} workingGroupOptions={workingGroupOptions} availableRoles={availableRoles} append={append} {...props}/>;
}
Loading

0 comments on commit 96b1965

Please sign in to comment.