//
// SPDX-License-Identifier: AGPL-3.0
+import { Dispatch } from 'redux';
+import { reset } from 'redux-form';
import { bindDataExplorerActions } from "~/store/data-explorer/data-explorer-action";
import { dialogActions } from '~/store/dialog/dialog-actions';
+import { Person } from '~/views-components/sharing-dialog/people-select';
export const GROUPS_PANEL_ID = "groupsPanel";
export const CREATE_GROUP_DIALOG = "createGroupDialog";
export const CREATE_GROUP_FORM = "createGroupForm";
+export const CREATE_GROUP_NAME_FIELD_NAME = 'name';
+export const CREATE_GROUP_USERS_FIELD_NAME = 'users';
export const GroupsPanelActions = bindDataExplorerActions(GROUPS_PANEL_ID);
export const loadGroupsPanel = () => GroupsPanelActions.REQUEST_ITEMS();
export const openCreateGroupDialog = () =>
- dialogActions.OPEN_DIALOG({ id: CREATE_GROUP_DIALOG, data: {} });
+ (dispatch: Dispatch) => {
+ dispatch(dialogActions.OPEN_DIALOG({ id: CREATE_GROUP_DIALOG, data: {} }));
+ dispatch(reset(CREATE_GROUP_FORM));
+ };
+
+export interface CreateGroupFormData {
+ [CREATE_GROUP_NAME_FIELD_NAME]: string;
+ [CREATE_GROUP_USERS_FIELD_NAME]: Person[];
+}
+
+export const createGroup = (data: CreateGroupFormData) =>
+ (dispatch: Dispatch) => {
+ console.log(data);
+ };
import * as React from 'react';
import { compose } from "redux";
-import { reduxForm, InjectedFormProps } from 'redux-form';
+import { reduxForm, InjectedFormProps, Field, WrappedFieldArrayProps, FieldArray } from 'redux-form';
import { withDialog, WithDialogProps } from "~/store/dialog/with-dialog";
import { FormDialog } from '~/components/form-dialog/form-dialog';
-import { CREATE_GROUP_DIALOG, CREATE_GROUP_FORM } from '~/store/groups-panel/groups-panel-actions';
+import { CREATE_GROUP_DIALOG, CREATE_GROUP_FORM, createGroup, CreateGroupFormData, CREATE_GROUP_NAME_FIELD_NAME, CREATE_GROUP_USERS_FIELD_NAME } from '~/store/groups-panel/groups-panel-actions';
+import { TextField } from '~/components/text-field/text-field';
+import { maxLength } from '~/validators/max-length';
+import { require } from '~/validators/require';
+import { PeopleSelect, Person } from '~/views-components/sharing-dialog/people-select';
export const CreateGroupDialog = compose(
withDialog(CREATE_GROUP_DIALOG),
- reduxForm<{}>({
+ reduxForm<CreateGroupFormData>({
form: CREATE_GROUP_FORM,
- onSubmit: (data, dispatch) => { return; }
+ onSubmit: (data, dispatch) => {
+ dispatch(createGroup(data));
+ }
})
)(
(props: CreateGroupDialogComponentProps) =>
/>
);
-type CreateGroupDialogComponentProps = WithDialogProps<{}> & InjectedFormProps<{}>;
+type CreateGroupDialogComponentProps = WithDialogProps<{}> & InjectedFormProps<CreateGroupFormData>;
-const CreateGroupFormFields = (props: CreateGroupDialogComponentProps) => <span>
- CreateGroupFormFields
-</span>;
+const CreateGroupFormFields = () =>
+ <>
+ <GroupNameField />
+ <UsersField />
+ </>;
+
+const GroupNameField = () =>
+ <Field
+ name={CREATE_GROUP_NAME_FIELD_NAME}
+ component={TextField}
+ validate={GROUP_NAME_VALIDATION}
+ label="Name"
+ autoFocus={true} />;
+
+const GROUP_NAME_VALIDATION = [require, maxLength(255)];
+
+const UsersField = () =>
+ <FieldArray
+ name={CREATE_GROUP_USERS_FIELD_NAME}
+ component={UsersSelect} />;
+
+const UsersSelect = ({ fields }: WrappedFieldArrayProps<Person>) =>
+ <PeopleSelect
+ label='Enter email adresses '
+ items={fields.getAll() || []}
+ onSelect={fields.push}
+ onDelete={fields.remove} />;