Skip to content

Commit 96b1965

Browse files
committed
RocketChat#822 [EDIT] Корректное отображение рабочей группы
1 parent ffb4179 commit 96b1965

File tree

19 files changed

+163
-111
lines changed

19 files changed

+163
-111
lines changed

app/api/server/v1/working-groups.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import { Meteor } from 'meteor/meteor';
2+
import Busboy from 'busboy';
3+
14
import { API } from '../api';
25
import { findWorkingGroups, findOneWorkingGroup, findWorkingGroup } from '../lib/working-groups';
3-
import { Meteor } from "meteor/meteor";
46
import { FileUpload } from '../../../file-upload';
5-
import Busboy from 'busboy';
67

7-
API.v1.addRoute('working-groups.list', { authRequired: true }, {
8+
API.v1.addRoute('working-groups.list', { authRequired: false }, {
89
get() {
910
const { offset, count } = this.getPaginationItems();
1011
const { sort, query } = this.parseJsonQuery();

app/councils/client/views/AddCouncil.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const useQuery = ({ text, itemsPerPage, current }, [column, direction]) => useMe
3737
}), [text, itemsPerPage, current, column, direction]);
3838

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

50+
const workingGroups = useEndpointData('working-groups.list', useMemo(() => ({ query: JSON.stringify({ type: { $ne: 'subject' } }) }), [])) || { workingGroups: [] };
4951
const data = useEndpointData('users.list', query) || { users: [] };
50-
5152
useEffect(() => {
5253
if (data.users) {
5354
setUsers(data.users);
@@ -58,14 +59,22 @@ export function AddCouncilPage() {
5859
setCache(new Date());
5960
}, [data]);
6061

61-
return <AddCouncilWithNewData users={users} setUsers={setUsers} onChange={onChange}/>;
62+
const workingGroupOptions = useMemo(() => {
63+
const res = [[null, t('Not_chosen')]];
64+
if (workingGroups && workingGroups.workingGroups?.length > 0) {
65+
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
66+
}
67+
return res;
68+
}, [workingGroups]);
69+
70+
return <AddCouncilWithNewData users={users} setUsers={setUsers} onChange={onChange} workingGroupOptions={workingGroupOptions}/>;
6271
}
6372

6473
AddCouncilPage.displayName = 'AddCouncilPage';
6574

6675
export default AddCouncilPage;
6776

68-
function AddCouncilWithNewData({ users, setUsers, onChange }) {
77+
function AddCouncilWithNewData({ users, setUsers, onChange, workingGroupOptions }) {
6978
const t = useTranslation();
7079

7180
const [context, setContext] = useState('participants');
@@ -169,7 +178,7 @@ function AddCouncilWithNewData({ users, setUsers, onChange }) {
169178
</Field>}
170179
{context === 'participants' && <Participants onChange={onChange} context={'new'} invitedUsers={invitedUsers} setInvitedUsers={setInvitedUsersIds}/>}
171180
{context === 'addParticipants' && <AddParticipant onChange={onChange} close={onClose} invitedUsers={invitedUsersIds} setInvitedUsers={setInvitedUsersIds} users={users} onNewParticipant={onParticipantClick}/>}
172-
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
181+
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions} />}
173182
</Page.Content>
174183
</Page>
175184
</Page>;

app/councils/client/views/Council.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useCallback, useMemo, useState } from 'react';
22
import { ButtonGroup, Button, Field, Icon, Label, TextInput, TextAreaInput, Modal } from '@rocket.chat/fuselage';
3+
import moment from 'moment';
34

45
import Page from '../../../../client/components/basic/Page';
56
import { useTranslation } from '../../../../client/contexts/TranslationContext';
@@ -8,7 +9,6 @@ import { useEndpointData } from '../../../../client/hooks/useEndpointData';
89
import { useFormatDateAndTime } from '../../../../client/hooks/useFormatDateAndTime';
910
import { useMethod } from '../../../../client/contexts/ServerContext';
1011
import { settings } from '../../../settings/client';
11-
import moment from 'moment';
1212
import { useSetModal } from '../../../../client/contexts/ModalContext';
1313
import { useToastMessageDispatch } from '../../../../client/contexts/ToastMessagesContext';
1414
import { Participants } from './Participants/Participants';
@@ -63,6 +63,7 @@ export function CouncilPage() {
6363
const [onCreateParticipantId, setOnCreateParticipantId] = useState();
6464
const [context, setContext] = useState('participants');
6565
const [cache, setCache] = useState();
66+
const [users, setUsers] = useState([]);
6667

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

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

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

7577
const invitedUsers = data.invitedUsers || [];
7678

77-
console.log(data);
78-
console.log(invitedUsers);
7979
const setModal = useSetModal();
8080

8181
const deleteCouncil = useMethod('deleteCouncil');
@@ -150,6 +150,14 @@ export function CouncilPage() {
150150

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

153+
const workingGroupOptions = useMemo(() => {
154+
const res = [[null, t('Not_chosen')]];
155+
if (workingGroups && workingGroups.workingGroups?.length > 0) {
156+
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
157+
}
158+
return res;
159+
}, [workingGroups]);
160+
153161
return <Page flexDirection='row'>
154162
<Page>
155163
<Page.Header>
@@ -202,8 +210,8 @@ export function CouncilPage() {
202210
</Field.Row>
203211
</Field>}
204212
{context === 'participants' && <Participants councilId={councilId} onChange={onChange}/>}
205-
{context === 'addParticipants' && <AddParticipant councilId={councilId} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
206-
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
213+
{context === 'addParticipants' && <AddParticipant councilId={councilId} onChange={onChange} close={onClose} users={users} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
214+
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions}/>}
207215
{context === 'onCreateParticipant' && <AddParticipant onCreateParticipantId={onCreateParticipantId} councilId={councilId} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
208216
</Page.Content>
209217
</Page>

app/councils/client/views/EditCouncil.js

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
11
import React, { useCallback, useState, useMemo, useEffect } from 'react';
2-
import {
3-
Box,
4-
Button,
5-
ButtonGroup,
6-
Field,
7-
Icon,
8-
TextAreaInput,
9-
TextInput,
10-
Modal, Table, Label, Margins, CheckBox,
11-
} from '@rocket.chat/fuselage';
2+
import { Box, Button, ButtonGroup, Field, Icon, TextAreaInput, TextInput, Modal, Label } from '@rocket.chat/fuselage';
123
import DatePicker, { registerLocale } from 'react-datepicker';
134
import ru from 'date-fns/locale/ru';
145

6+
import Page from '../../../../client/components/basic/Page';
157
import { useTranslation } from '../../../../client/contexts/TranslationContext';
168
import { useMethod } from '../../../../client/contexts/ServerContext';
179
import { useToastMessageDispatch } from '../../../../client/contexts/ToastMessagesContext';
10+
import { useEndpointData } from '../../../../client/hooks/useEndpointData';
1811
import { useEndpointDataExperimental } from '../../../../client/hooks/useEndpointDataExperimental';
1912
import { useSetModal } from '../../../../client/contexts/ModalContext';
20-
import { validate, createCouncilData } from './lib';
21-
22-
import { useFormatDateAndTime } from '../../../../client/hooks/useFormatDateAndTime';
2313
import { useRouteParameter } from '../../../../client/contexts/RouterContext';
24-
25-
import { useMediaQuery } from '@rocket.chat/fuselage-hooks';
26-
27-
import { GenericTable, Th } from '../../../../client/components/GenericTable';
28-
import Page from '../../../../client/components/basic/Page';
14+
import { validate, createCouncilData } from './lib';
2915
import { AddParticipant } from './Participants/AddParticipant';
3016
import { CreateParticipant } from './Participants/CreateParticipant';
3117
import { Participants } from './Participants/Participants';
@@ -74,6 +60,7 @@ const SuccessModal = ({ title, onClose, ...props }) => {
7460
};
7561

7662
export function EditCouncilPage() {
63+
const t = useTranslation();
7764
const context = useRouteParameter('context');
7865
const councilId = useRouteParameter('id');
7966

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

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

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

79+
const workingGroupOptions = useMemo(() => {
80+
const res = [[null, t('Not_chosen')]];
81+
if (workingGroups && workingGroups.workingGroups?.length > 0) {
82+
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
83+
}
84+
return res;
85+
}, [workingGroups]);
86+
9187
if (!data) {
9288
return <Box fontScale='h1' pb='x20'>{'error'}</Box>;
9389
}
@@ -96,14 +92,14 @@ export function EditCouncilPage() {
9692
data.invitedUsers = [];
9793
}
9894

99-
return <EditCouncilWithNewData council={data} onChange={onChange}/>;
95+
return <EditCouncilWithNewData council={data} onChange={onChange} workingGroupOptions={workingGroupOptions}/>;
10096
}
10197

10298
EditCouncilPage.displayName = 'EditCouncilPage';
10399

104100
export default EditCouncilPage;
105101

106-
function EditCouncilWithNewData({ council, onChange }) {
102+
function EditCouncilWithNewData({ council, onChange, workingGroupOptions }) {
107103
const t = useTranslation();
108104

109105
const { _id, d: previousDate, desc: previousDescription } = council || {};
@@ -322,7 +318,7 @@ function EditCouncilWithNewData({ council, onChange }) {
322318
</Field>}
323319
{context === 'participants' && <Participants councilId={_id} onChange={onChange}/>}
324320
{context === 'addParticipants' && <AddParticipant councilId={_id} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
325-
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} />}
321+
{context === 'newParticipants' && <CreateParticipant goTo={onCreateParticipantClick} close={onParticipantClick} workingGroupOptions={workingGroupOptions}/>}
326322
{context === 'onCreateParticipant' && <AddParticipant onCreateParticipantId={onCreateParticipantId} councilId={_id} onChange={onChange} close={onClose} invitedUsers={invitedUsers} onNewParticipant={onParticipantClick}/>}
327323
</Page.Content>
328324
</Page>

app/councils/client/views/Participants/CreateParticipant.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React, { useCallback, useMemo } from 'react';
22
import { Box, Button, Field } from '@rocket.chat/fuselage';
3+
34
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
4-
import { useEndpointData } from '../../../../../client/hooks/useEndpointData';
55
import { useForm } from '../../../../../client/hooks/useForm';
66
import { useEndpointAction } from '../../../../../client/hooks/useEndpointAction';
77
import ParticipantForm from './ParticipantForm';
88

9-
export function CreateParticipant({ goTo, close, ...props }) {
9+
export function CreateParticipant({ goTo, close, workingGroupOptions, ...props }) {
1010
const t = useTranslation();
1111

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

49-
return <ParticipantForm formValues={values} formHandlers={handlers} append={append} {...props}/>;
49+
return <ParticipantForm formValues={values} formHandlers={handlers} workingGroupOptions={workingGroupOptions} append={append} {...props}/>;
5050
}

app/councils/client/views/Participants/ParticipantForm.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import React, { useCallback, useMemo, useState } from 'react';
1+
import React, { useCallback, useMemo } from 'react';
22
import {
33
Field,
44
TextInput,
55
Icon,
6-
FieldGroup,
76
Scrollable,
8-
Select, Margins, Box, ButtonGroup, Button, CheckBox,
7+
Select,
98
} from '@rocket.chat/fuselage';
109

1110
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
1211
import { isEmail } from '../../../../utils/lib/isEmail.js';
13-
import VerticalBar from '../../../../../client/components/basic/VerticalBar';
1412

15-
export default function ParticipantForm({ formValues, formHandlers, availableRoles, append, ...props }) {
13+
export default function ParticipantForm({ formValues, formHandlers, workingGroupOptions, availableRoles, append, ...props }) {
1614
const t = useTranslation();
1715

1816
const {
@@ -37,12 +35,16 @@ export default function ParticipantForm({ formValues, formHandlers, availableRol
3735
handleWorkingGroup,
3836
} = formHandlers;
3937

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

4749
return <Scrollable is='form' onSubmit={useCallback((e) => e.preventDefault(), [])} { ...props }>
4850
<Field mb='x16'>

app/lib/server/functions/saveUser.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,16 @@ function validateUserEditing(userId, userData) {
198198
}
199199

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

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

222223
if (!userData._id && !s.trim(userData.username)) {
223-
throw new Meteor.Error('error-the-field-is-required', 'The field Username is required', {
224+
throw new Meteor.Error('error-the-field-is-required', 'The_field_is_required', {
224225
method: 'insertOrUpdateUser',
225226
field: 'Username',
226227
});

app/protocols/client/views/Protocol.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import { AddSection } from './AddSection';
1414
import { AddItem } from './AddItem';
1515
import { EditSection } from './EditSection';
1616
import { EditItem } from './EditItem';
17-
import { Participants } from '../views/participants/Participants';
18-
import { AddParticipant } from '../views/participants/AddParticipant';
19-
import { CreateParticipant } from '../views/participants/CreateParticipant';
17+
import { Participants } from './participants/Participants';
18+
import { AddParticipant } from './participants/AddParticipant';
19+
import { CreateParticipant } from './participants/CreateParticipant';
2020
import { popover } from '../../../ui-utils/client/lib/popover';
2121
import VerticalBar from '../../../../client/components/basic/VerticalBar';
2222

@@ -78,6 +78,7 @@ export function ProtocolPage() {
7878
}), [protocolId, cache]);
7979

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

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

@@ -272,6 +273,14 @@ export function ProtocolPage() {
272273
window.history.back();
273274
};
274275

276+
const workingGroupOptions = useMemo(() => {
277+
const res = [[null, t('Not_chosen')]];
278+
if (workingGroups && workingGroups.workingGroups?.length > 0) {
279+
return res.concat(workingGroups.workingGroups.map((workingGroup) => [workingGroup.title, workingGroup.title]));
280+
}
281+
return res;
282+
}, [workingGroups]);
283+
275284
return <Page flexDirection='row'>
276285
<Page>
277286
<Page.Header>
@@ -320,7 +329,7 @@ export function ProtocolPage() {
320329
{context === 'edit-item' && <EditItem protocolId={protocolId} sectionId={sectionId} _id={itemId} close={close} onChange={onChange} cache={cache}/>}
321330
{context === 'participants' && <Participants protocolId={protocolId} onAddParticipantClick={onAddParticipantClick} close={close}/>}
322331
{context === 'add-participant' && <AddParticipant protocolId={protocolId} close={onParticipantsClick} onCreateParticipant={onAddParticipantClick}/>}
323-
{context === 'create-participant' && <CreateParticipant goTo={onParticipantsClick} close={onParticipantsClick}/>}
332+
{context === 'create-participant' && <CreateParticipant goTo={onParticipantsClick} close={onParticipantsClick} workingGroupOptions={workingGroupOptions}/>}
324333
</VerticalBar>}
325334
</Page>;
326335
}

app/protocols/client/views/participants/CreateParticipant.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useForm } from '../../../../../client/hooks/useForm';
66
import { useEndpointAction } from '../../../../../client/hooks/useEndpointAction';
77
import ParticipantForm from './ParticipantForm';
88

9-
export function CreateParticipant({ goTo, close, ...props }) {
9+
export function CreateParticipant({ goTo, close, workingGroupOptions, ...props }) {
1010
const t = useTranslation();
1111

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

53-
return <ParticipantForm formValues={values} formHandlers={handlers} availableRoles={availableRoles} append={append} {...props}/>;
53+
return <ParticipantForm formValues={values} formHandlers={handlers} workingGroupOptions={workingGroupOptions} availableRoles={availableRoles} append={append} {...props}/>;
5454
}

0 commit comments

Comments
 (0)