@deix/rossini-identity-management 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/src/components/AddItemDialog.d.ts.map +1 -1
  2. package/lib/src/components/AddItemDialog.js +7 -20
  3. package/lib/src/components/DeleteConfirmationDialog.d.ts.map +1 -1
  4. package/lib/src/components/DeleteConfirmationDialog.js +5 -22
  5. package/lib/src/components/groups/CreateGroupDialog.d.ts.map +1 -1
  6. package/lib/src/components/groups/CreateGroupDialog.js +3 -3
  7. package/lib/src/components/groups/GroupForm.d.ts.map +1 -1
  8. package/lib/src/components/groups/GroupForm.js +4 -4
  9. package/lib/src/components/groups/GroupTabs.d.ts.map +1 -1
  10. package/lib/src/components/groups/GroupTabs.js +3 -3
  11. package/lib/src/components/groups/GroupUsers.d.ts.map +1 -1
  12. package/lib/src/components/groups/GroupUsers.js +13 -23
  13. package/lib/src/components/groups/Groups.d.ts.map +1 -1
  14. package/lib/src/components/groups/Groups.js +7 -5
  15. package/lib/src/components/groups/GroupsTable.d.ts.map +1 -1
  16. package/lib/src/components/groups/GroupsTable.js +5 -6
  17. package/lib/src/components/tables/Table.d.ts +29 -0
  18. package/lib/src/components/tables/Table.d.ts.map +1 -0
  19. package/lib/src/components/tables/Table.js +96 -0
  20. package/lib/src/components/users/CreateUserDialog.d.ts.map +1 -1
  21. package/lib/src/components/users/CreateUserDialog.js +3 -3
  22. package/lib/src/components/users/UserCredentials.d.ts.map +1 -1
  23. package/lib/src/components/users/UserCredentials.js +3 -3
  24. package/lib/src/components/users/UserForm.d.ts.map +1 -1
  25. package/lib/src/components/users/UserForm.js +4 -6
  26. package/lib/src/components/users/UserGroups.d.ts.map +1 -1
  27. package/lib/src/components/users/UserGroups.js +5 -7
  28. package/lib/src/components/users/Users.d.ts.map +1 -1
  29. package/lib/src/components/users/Users.js +16 -6
  30. package/lib/src/components/users/UsersTable.d.ts +4 -1
  31. package/lib/src/components/users/UsersTable.d.ts.map +1 -1
  32. package/lib/src/components/users/UsersTable.js +14 -37
  33. package/lib/src/components/users/UsersTabs.d.ts.map +1 -1
  34. package/lib/src/components/users/UsersTabs.js +3 -3
  35. package/lib/src/lang/common.d.ts +6 -0
  36. package/lib/src/lang/common.d.ts.map +1 -0
  37. package/lib/src/lang/common.js +35 -0
  38. package/lib/src/lang/groups.d.ts.map +1 -1
  39. package/lib/src/lang/groups.js +4 -0
  40. package/lib/src/lang/tables.d.ts +6 -0
  41. package/lib/src/lang/tables.d.ts.map +1 -0
  42. package/lib/src/lang/tables.js +11 -0
  43. package/lib/src/lang/users.d.ts.map +1 -1
  44. package/lib/src/lang/users.js +16 -0
  45. package/lib/src/utils/hooks/groups.d.ts.map +1 -1
  46. package/lib/src/utils/hooks/groups.js +10 -10
  47. package/lib/src/utils/hooks/useTranslate.d.ts +6 -0
  48. package/lib/src/utils/hooks/useTranslate.d.ts.map +1 -0
  49. package/lib/src/utils/hooks/useTranslate.js +16 -0
  50. package/lib/src/utils/hooks/users.d.ts.map +1 -1
  51. package/lib/src/utils/hooks/users.js +19 -19
  52. package/lib/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +16 -18
@@ -1 +1 @@
1
- {"version":3,"file":"AddItemDialog.d.ts","sourceRoot":"","sources":["../../../src/components/AddItemDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AAkBlE,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,QAAA,MAAM,aAAa,kDAMhB,kBAAkB,sBAkDpB,CAAC;eAEa,aAAa"}
1
+ {"version":3,"file":"AddItemDialog.d.ts","sourceRoot":"","sources":["../../../src/components/AddItemDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKvD,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,QAAA,MAAM,aAAa,kDAMhB,kBAAkB,sBAkDpB,CAAC;eAEa,aAAa"}
@@ -1,23 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Autocomplete, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField, } from '@mui/material';
3
- import { useLocale } from '@deix/rossini-core';
4
3
  import { useEffect, useState } from 'react';
5
- const translations = {
6
- ok: {
7
- en: 'Add',
8
- it: 'Aggiungi',
9
- },
10
- cancel: {
11
- en: 'Cancel',
12
- it: 'Annulla',
13
- },
14
- search: {
15
- en: 'Search...',
16
- it: 'Cerca...',
17
- },
18
- };
4
+ import useTranslate from '../utils/hooks/useTranslate';
5
+ import commonTranslations from '../lang/common';
19
6
  const AddItemDialog = ({ title, options, open, onClose, onConfirm, }) => {
20
- const locale = useLocale();
7
+ const t = useTranslate();
21
8
  const [value, setValue] = useState(null);
22
9
  // Reset the value when the dialog is closed
23
10
  useEffect(() => {
@@ -25,15 +12,15 @@ const AddItemDialog = ({ title, options, open, onClose, onConfirm, }) => {
25
12
  setValue(null);
26
13
  }
27
14
  }, [open]);
28
- return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: title[locale] }), _jsx(DialogContent, { children: _jsx(Autocomplete
15
+ return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: t(title) }), _jsx(DialogContent, { children: _jsx(Autocomplete
29
16
  // multiple
30
17
  , {
31
18
  // multiple
32
- options: options ?? [], getOptionLabel: (option) => option.label, getOptionKey: (option) => option.value, isOptionEqualToValue: (option, value) => option.value === value.value, renderInput: (params) => (_jsx(TextField, { ...params, label: translations.search[locale], placeholder: '' })), onChange: (event, newValue) => {
19
+ options: options ?? [], getOptionLabel: (option) => option.label, getOptionKey: (option) => option.value, isOptionEqualToValue: (option, value) => option.value === value.value, renderInput: (params) => (_jsx(TextField, { ...params, label: t(commonTranslations.search), placeholder: '' })), onChange: (event, newValue) => {
33
20
  setValue(newValue);
34
- }, value: value }) }), _jsxs(DialogActions, { children: [_jsx(Button, { size: 'small', variant: 'outlined', onClick: onClose, children: translations.cancel[locale] }), _jsx(Button, { variant: 'contained', onClick: () => {
21
+ }, value: value }) }), _jsxs(DialogActions, { children: [_jsx(Button, { size: 'small', variant: 'outlined', onClick: onClose, children: t(commonTranslations.cancel) }), _jsx(Button, { variant: 'contained', onClick: () => {
35
22
  onConfirm(value);
36
23
  onClose();
37
- }, children: translations.ok[locale] })] })] }));
24
+ }, children: t(commonTranslations.add) })] })] }));
38
25
  };
39
26
  export default AddItemDialog;
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteConfirmationDialog.d.ts","sourceRoot":"","sources":["../../../src/components/DeleteConfirmationDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA8B1B,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,QAAA,MAAM,wBAAwB,kCAI3B,6BAA6B,sBA2B/B,CAAC;eAEa,wBAAwB"}
1
+ {"version":3,"file":"DeleteConfirmationDialog.d.ts","sourceRoot":"","sources":["../../../src/components/DeleteConfirmationDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,QAAA,MAAM,wBAAwB,kCAI3B,6BAA6B,sBA2B/B,CAAC;eAEa,wBAAwB"}
@@ -1,29 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography, } from '@mui/material';
3
- import { useLocale } from '@deix/rossini-core';
4
- const translations = {
5
- title: {
6
- en: 'Delete item?',
7
- it: 'Cancellare elemento?',
8
- },
9
- message: {
10
- en: 'This is a permanent action',
11
- it: "Questa è un'azione permanente",
12
- },
13
- yes: {
14
- en: 'Yes',
15
- it: 'Si',
16
- },
17
- no: {
18
- en: 'No',
19
- it: 'No',
20
- },
21
- };
3
+ import useTranslate from '../utils/hooks/useTranslate';
4
+ import commonTranslations from '../lang/common';
22
5
  const DeleteConfirmationDialog = ({ open, onClose, onConfirm, }) => {
23
- const locale = useLocale();
24
- return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: translations.title[locale] }), _jsx(DialogContent, { children: _jsx(Typography, { variant: 'caption', children: translations.message[locale] }) }), _jsxs(DialogActions, { children: [_jsx(Button, { size: 'small', variant: 'outlined', onClick: onClose, children: translations.no[locale] }), _jsx(Button, { size: 'small', variant: 'contained', onClick: () => {
6
+ const t = useTranslate();
7
+ return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: t(commonTranslations.deleteTitle) }), _jsx(DialogContent, { children: _jsx(Typography, { variant: 'caption', children: t(commonTranslations.deleteMessage) }) }), _jsxs(DialogActions, { children: [_jsx(Button, { size: 'small', variant: 'outlined', onClick: onClose, children: t(commonTranslations.no) }), _jsx(Button, { size: 'small', variant: 'contained', onClick: () => {
25
8
  onConfirm();
26
9
  onClose();
27
- }, children: translations.yes[locale] })] })] }));
10
+ }, children: t(commonTranslations.yes) })] })] }));
28
11
  };
29
12
  export default DeleteConfirmationDialog;
@@ -1 +1 @@
1
- {"version":3,"file":"CreateGroupDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/CreateGroupDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK3C,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3C;AAED,QAAA,MAAM,iBAAiB,sCAIpB,sBAAsB,sBAuBxB,CAAC;eAEa,iBAAiB"}
1
+ {"version":3,"file":"CreateGroupDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/CreateGroupDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3C;AAED,QAAA,MAAM,iBAAiB,sCAIpB,sBAAsB,sBAuBxB,CAAC;eAEa,iBAAiB"}
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useLocale } from '@deix/rossini-core';
3
2
  import { Dialog, DialogContent, DialogTitle } from '@mui/material';
4
3
  import { useQueryClient } from '@tanstack/react-query';
5
4
  import groupsTranslations from '../../lang/groups';
6
5
  import { useAddGroup } from '../../utils/hooks/groups';
7
6
  import GroupForm from './GroupForm';
8
7
  import { useAPIClient } from '../../utils/hooks/useAPIClient';
8
+ import useTranslate from '../../utils/hooks/useTranslate';
9
9
  const CreateGroupDialog = ({ open, onClose, onGroupCreate, }) => {
10
- const locale = useLocale();
10
+ const t = useTranslate();
11
11
  const apiClient = useAPIClient();
12
12
  const queryClient = useQueryClient();
13
13
  const { mutate: addGroup } = useAddGroup(queryClient, apiClient);
@@ -18,6 +18,6 @@ const CreateGroupDialog = ({ open, onClose, onGroupCreate, }) => {
18
18
  }
19
19
  onClose();
20
20
  };
21
- return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: groupsTranslations.create[locale] }), _jsx(DialogContent, { children: _jsx(GroupForm, { mode: 'create', onSave: handleSave, onCancel: onClose }) })] }));
21
+ return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: t(groupsTranslations.create) }), _jsx(DialogContent, { children: _jsx(GroupForm, { mode: 'create', onSave: handleSave, onCancel: onClose }) })] }));
22
22
  };
23
23
  export default CreateGroupDialog;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupForm.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,iDAMZ,cAAc,sBAiEhB,CAAC;eAEa,SAAS"}
1
+ {"version":3,"file":"GroupForm.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,iDAMZ,cAAc,sBAiEhB,CAAC;eAEa,SAAS"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useLocale } from '@deix/rossini-core';
3
2
  import { Button, Grid, TextField } from '@mui/material';
4
3
  import { Controller, useForm } from 'react-hook-form';
5
4
  import { useEffect } from 'react';
6
5
  import groupsTranslations from '../../lang/groups';
6
+ import useTranslate from '../../utils/hooks/useTranslate';
7
7
  const GroupForm = ({ group, onCancel, onSave, mode, editName, }) => {
8
- const locale = useLocale();
8
+ const t = useTranslate();
9
9
  const { control, handleSubmit, setValue } = useForm({
10
10
  defaultValues: {
11
11
  id: group?.id,
@@ -21,12 +21,12 @@ const GroupForm = ({ group, onCancel, onSave, mode, editName, }) => {
21
21
  const onSubmit = (data) => {
22
22
  onSave(data);
23
23
  };
24
- return (_jsx("form", { onSubmit: (event) => void handleSubmit(onSubmit)(event), children: _jsxs(Grid, { container: true, spacing: 2, sx: { mt: 2, maxWidth: 'sm', justifyContent: 'stretch' }, children: [_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'name', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: groupsTranslations.name[locale], disabled: mode === 'modify' && !editName, sx: { flexShrink: 0 }, ...field })) }) }), _jsxs(Grid, { sx: {
24
+ return (_jsx("form", { onSubmit: (event) => void handleSubmit(onSubmit)(event), children: _jsxs(Grid, { container: true, spacing: 2, sx: { mt: 2, maxWidth: 'sm', justifyContent: 'stretch' }, children: [_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'name', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: t(groupsTranslations.name), disabled: mode === 'modify' && !editName, sx: { flexShrink: 0 }, ...field })) }) }), _jsxs(Grid, { sx: {
25
25
  mt: 2,
26
26
  display: 'flex',
27
27
  justifyContent: 'flex-end',
28
28
  gap: 2,
29
29
  width: '100%',
30
- }, children: [mode === 'create' && (_jsx(Button, { variant: 'outlined', onClick: onCancel, children: groupsTranslations.cancel[locale] })), _jsx(Button, { variant: 'contained', type: 'submit', children: groupsTranslations.save[locale] })] })] }) }));
30
+ }, children: [mode === 'create' && (_jsx(Button, { variant: 'outlined', onClick: onCancel, children: t(groupsTranslations.cancel) })), _jsx(Button, { variant: 'contained', type: 'submit', children: t(groupsTranslations.save) })] })] }) }));
31
31
  };
32
32
  export default GroupForm;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupTabs.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupTabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK3C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,wDAKZ,cAAc,sBAkDhB,CAAC;eAEa,SAAS"}
1
+ {"version":3,"file":"GroupTabs.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupTabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,wDAKZ,cAAc,sBAkDhB,CAAC;eAEa,SAAS"}
@@ -2,12 +2,12 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { Box, Tab, Tabs } from '@mui/material';
5
- import { useLocale } from '@deix/rossini-core';
6
5
  import GroupDetails from './GroupDetails';
7
6
  import groupsTranslations from '../../lang/groups';
8
7
  import GroupUsers from './GroupUsers';
8
+ import useTranslate from '../../utils/hooks/useTranslate';
9
9
  const GroupTabs = ({ group, additionalTabs = [], onGroupUpdate, editName, }) => {
10
- const locale = useLocale();
10
+ const t = useTranslate();
11
11
  const [selectedTab, setSelectedTab] = useState('DETAILS');
12
12
  return (_jsxs(Box, { sx: {
13
13
  flexGrow: 1,
@@ -16,6 +16,6 @@ const GroupTabs = ({ group, additionalTabs = [], onGroupUpdate, editName, }) =>
16
16
  alignSelf: 'stretch',
17
17
  }, children: [_jsx(Box, { sx: { borderBottom: 1, borderColor: 'divider' }, children: _jsxs(Tabs, { value: selectedTab, onChange: (_evt, newValue) => {
18
18
  setSelectedTab(newValue);
19
- }, "aria-label": 'basic tabs example', children: [_jsx(Tab, { label: groupsTranslations.details[locale], value: 'DETAILS' }), _jsx(Tab, { label: groupsTranslations.users[locale], value: 'USERS' }), additionalTabs.map((tab, index) => (_jsx(Tab, { label: tab.title[locale], value: `ADDITIONAL_TAB_${index}` }, `tab${index}`)))] }) }), _jsxs(Box, { sx: { p: 1 }, children: [selectedTab === 'DETAILS' && (_jsx(GroupDetails, { group: group, onGroupUpdate: onGroupUpdate, editName: editName })), selectedTab === 'USERS' && _jsx(GroupUsers, { group: group }), additionalTabs.map((tab, index) => selectedTab === `ADDITIONAL_TAB_${index}` && (_jsx(tab.component, { group: group }, `tab${index}`)))] })] }));
19
+ }, "aria-label": t(groupsTranslations.details), children: [_jsx(Tab, { label: t(groupsTranslations.details), value: 'DETAILS' }), _jsx(Tab, { label: t(groupsTranslations.users), value: 'USERS' }), additionalTabs.map((tab, index) => (_jsx(Tab, { label: t(tab.title), value: `ADDITIONAL_TAB_${index}` }, `tab${index}`)))] }) }), _jsxs(Box, { sx: { p: 1 }, children: [selectedTab === 'DETAILS' && (_jsx(GroupDetails, { group: group, onGroupUpdate: onGroupUpdate, editName: editName })), selectedTab === 'USERS' && _jsx(GroupUsers, { group: group }), additionalTabs.map((tab, index) => selectedTab === `ADDITIONAL_TAB_${index}` && (_jsx(tab.component, { group: group }, `tab${index}`)))] })] }));
20
20
  };
21
21
  export default GroupTabs;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupUsers.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupUsers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA8B3C,UAAU,eAAe;IACvB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,QAAA,MAAM,UAAU,cAAe,eAAe,sBA8F7C,CAAC;eAEa,UAAU"}
1
+ {"version":3,"file":"GroupUsers.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupUsers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAgC3C,UAAU,eAAe;IACvB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,QAAA,MAAM,UAAU,cAAe,eAAe,sBAoD7C,CAAC;eAEa,UAAU"}
@@ -1,32 +1,32 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Button, IconButton, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, } from '@mui/material';
2
+ import { Box, Button } from '@mui/material';
3
3
  import AddIcon from '@mui/icons-material/Add';
4
- import DeleteIcon from '@mui/icons-material/Delete';
5
- import { isStringTranslation, useLocale } from '@deix/rossini-core';
6
4
  import { useAddUserToGroup, useRemoveUserFromGroup, useUsers, } from '../../utils/hooks/users';
7
5
  import { useState } from 'react';
8
- import DeleteConfirmationDialog from '../DeleteConfirmationDialog';
9
6
  import { useQueryClient } from '@tanstack/react-query';
10
7
  import AddItemDialog from '../AddItemDialog';
8
+ import Table from '../tables/Table';
11
9
  import { useGroupUsers } from '../../utils/hooks/groups';
12
10
  import groupsTranslations from '../../lang/groups';
11
+ import usersTranslations from '../../lang/users';
13
12
  import { useAPIClient } from '../../utils/hooks/useAPIClient';
13
+ import useTranslate from '../../utils/hooks/useTranslate';
14
14
  const groupUsersTableColumns = [
15
15
  {
16
- id: 'username',
17
- label: { en: 'Username', it: 'Username' },
16
+ field: 'username',
17
+ label: usersTranslations.username,
18
18
  },
19
19
  {
20
- id: 'firstName',
21
- label: { en: 'First name', it: 'Nome' },
20
+ field: 'firstName',
21
+ label: usersTranslations.firstName,
22
22
  },
23
23
  {
24
- id: 'lastName',
25
- label: { en: 'Last name', it: 'Cognome' },
24
+ field: 'lastName',
25
+ label: usersTranslations.lastName,
26
26
  },
27
27
  ];
28
28
  const GroupUsers = ({ group }) => {
29
- const locale = useLocale();
29
+ const t = useTranslate();
30
30
  const apiClient = useAPIClient();
31
31
  const queryClient = useQueryClient();
32
32
  const { data: users } = useUsers(apiClient);
@@ -34,23 +34,13 @@ const GroupUsers = ({ group }) => {
34
34
  const { mutate: addUserToGroup } = useAddUserToGroup(queryClient, apiClient);
35
35
  const { mutate: removeUserFromGroup } = useRemoveUserFromGroup(queryClient, apiClient);
36
36
  const [openAddUserDialog, setOpenAddUserDialog] = useState(false);
37
- const [openConfirmationDialog, setOpenConfirmationDialog] = useState(false);
38
- const [deleteId, setDeleteId] = useState();
39
- return (_jsxs(_Fragment, { children: [groupUsers && groupUsers.length > 0 && (_jsx(Box, { sx: { maxWidth: 'md' }, children: _jsx(TableContainer, { children: _jsxs(Table, { size: 'small', children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [groupUsersTableColumns.map((col) => (_jsx(TableCell, { align: col.align || 'inherit', children: isStringTranslation(col.label)
40
- ? col.label[locale]
41
- : col.label }, col.id))), _jsx(TableCell, { padding: 'none', children: '' })] }) }), _jsx(TableBody, { children: groupUsers?.map((user, rowIdx) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: user.username }), _jsx(TableCell, { children: user.firstName }), _jsx(TableCell, { children: user.lastName }), _jsx(TableCell, { padding: 'none', align: 'right', children: _jsx(IconButton, { size: 'small', onClick: (evt) => {
42
- evt.stopPropagation();
43
- setOpenConfirmationDialog(true);
44
- setDeleteId(user.id);
45
- }, children: _jsx(DeleteIcon, {}) }) })] }, rowIdx))) })] }) }) })), _jsx(Button, { variant: 'outlined', startIcon: _jsx(AddIcon, {}), onClick: () => setOpenAddUserDialog(true), sx: { marginTop: 2 }, children: groupsTranslations.addUser[locale] }), _jsx(AddItemDialog, { open: openAddUserDialog, onClose: () => setOpenAddUserDialog(false), onConfirm: (value) => {
37
+ return (_jsxs(_Fragment, { children: [groupUsers && groupUsers.length > 0 && (_jsx(Box, { sx: { maxWidth: 'md' }, children: _jsx(Table, { rows: groupUsers, columns: groupUsersTableColumns, onDelete: (user) => removeUserFromGroup({ userId: user.id, groupId: group.id }) }) })), _jsx(Button, { variant: 'outlined', startIcon: _jsx(AddIcon, {}), onClick: () => setOpenAddUserDialog(true), sx: { marginTop: 2 }, children: t(groupsTranslations.addUser) }), _jsx(AddItemDialog, { open: openAddUserDialog, onClose: () => setOpenAddUserDialog(false), onConfirm: (value) => {
46
38
  if (value) {
47
39
  addUserToGroup({ userId: value?.value, groupId: group.id });
48
40
  }
49
41
  }, title: groupsTranslations.addUser, options: users?.map((user) => ({
50
42
  value: user.id,
51
43
  label: user.username || '',
52
- })) }), _jsx(DeleteConfirmationDialog, { open: openConfirmationDialog, onClose: () => setOpenConfirmationDialog(false), onConfirm: () => deleteId
53
- ? removeUserFromGroup({ userId: deleteId, groupId: group.id })
54
- : {} })] }));
44
+ })) })] }));
55
45
  };
56
46
  export default GroupUsers;
@@ -1 +1 @@
1
- {"version":3,"file":"Groups.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/Groups.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAWnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIlD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAE5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAE3D,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAE1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,MAAM,uFAOT,WAAW,sBAgJb,CAAC;eAEa,MAAM"}
1
+ {"version":3,"file":"Groups.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/Groups.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAWnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMlD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAE5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAE3D,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;IAE1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,MAAM,uFAOT,WAAW,sBAgJb,CAAC;eAEa,MAAM"}
@@ -5,7 +5,7 @@ import GroupAddIcon from '@mui/icons-material/GroupAdd';
5
5
  import { Box, Button, Grid, IconButton, Link } from '@mui/material';
6
6
  import ArrowBackIcon from '@mui/icons-material/ArrowBack';
7
7
  import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
8
- import { useAPI, useLocale } from '@deix/rossini-core';
8
+ import { useAPI } from '@deix/rossini-core';
9
9
  import { SearchField } from '..';
10
10
  import CreateGroupDialog from './CreateGroupDialog';
11
11
  import GroupsTable from './GroupsTable';
@@ -14,8 +14,10 @@ import { useDeleteGroup, useGroups } from '../../utils/hooks/groups';
14
14
  import GroupTabs from './GroupTabs';
15
15
  import { useQueryClient } from '@tanstack/react-query';
16
16
  import { APIClientProvider } from '../../utils/hooks/useAPIClient';
17
+ import commonTranslations from '../../lang/common';
18
+ import useTranslate from '../../utils/hooks/useTranslate';
17
19
  const Groups = ({ apiUrl, additionalTabs = [], onGroupUpdate, onGroupCreate, onGroupDelete, editName, }) => {
18
- const locale = useLocale();
20
+ const t = useTranslate();
19
21
  const apiClient = useAPI(apiUrl);
20
22
  const queryClient = useQueryClient();
21
23
  const { data: groups } = useGroups(apiClient);
@@ -60,10 +62,10 @@ const Groups = ({ apiUrl, additionalTabs = [], onGroupUpdate, onGroupCreate, onG
60
62
  paddingTop: 3,
61
63
  paddingLeft: 3,
62
64
  paddingRight: 3,
63
- }, children: [!selectedGroup && (_jsxs(_Fragment, { children: [_jsxs(Grid, { container: true, spacing: 2, sx: { marginBottom: 2 }, children: [_jsx(Grid, { children: _jsx(SearchField, { placeholder: groupsTranslations.search[locale], onSearch: (value) => setSearchString(value) }) }), _jsx(Grid, { children: _jsx(Button, { variant: 'contained', startIcon: _jsx(GroupAddIcon, {}), onClick: () => {
65
+ }, children: [!selectedGroup && (_jsxs(_Fragment, { children: [_jsxs(Grid, { container: true, spacing: 2, sx: { marginBottom: 2 }, children: [_jsx(Grid, { children: _jsx(SearchField, { placeholder: t(groupsTranslations.search), onSearch: (value) => setSearchString(value) }) }), _jsx(Grid, { children: _jsx(Button, { variant: 'contained', startIcon: _jsx(GroupAddIcon, {}), onClick: () => {
64
66
  setOpenGroupDialog(true);
65
67
  setSelectedGroup(undefined);
66
- }, children: groupsTranslations.new[locale] }) })] }), _jsx(GroupsTable, { groups: filteredGroups, selectedGroup: selectedGroup, setSelectedGroup: (group) => {
68
+ }, children: t(groupsTranslations.new) }) })] }), _jsx(GroupsTable, { groups: filteredGroups, selectedGroup: selectedGroup, setSelectedGroup: (group) => {
67
69
  setSelectedGroup(group);
68
70
  }, onDelete: handleDelete })] })), selectedGroup && (_jsxs(Box, { sx: {
69
71
  display: 'flex',
@@ -74,7 +76,7 @@ const Groups = ({ apiUrl, additionalTabs = [], onGroupUpdate, onGroupCreate, onG
74
76
  display: 'flex',
75
77
  flexDirection: 'row',
76
78
  alignItems: 'center',
77
- }, children: [_jsx(IconButton, { "aria-label": 'delete', color: 'primary', onClick: () => setSelectedGroup(undefined), sx: { mr: 2 }, children: _jsx(ArrowBackIcon, {}) }), _jsx(Link, { underline: 'none', href: '#', onClick: () => setSelectedGroup(undefined), children: groupsTranslations.title[locale] }), _jsx(KeyboardArrowRightIcon, {}), selectedGroup.name] }), _jsx(GroupTabs, { group: selectedGroup, additionalTabs: additionalTabs, onGroupUpdate: onGroupUpdate, editName: editName })] })), _jsx(CreateGroupDialog, { open: openGroupDialog, onClose: () => {
79
+ }, children: [_jsx(IconButton, { "aria-label": t(commonTranslations.back), color: 'primary', onClick: () => setSelectedGroup(undefined), sx: { mr: 2 }, children: _jsx(ArrowBackIcon, {}) }), _jsx(Link, { underline: 'none', href: '#', onClick: () => setSelectedGroup(undefined), children: t(groupsTranslations.title) }), _jsx(KeyboardArrowRightIcon, {}), selectedGroup.name] }), _jsx(GroupTabs, { group: selectedGroup, additionalTabs: additionalTabs, onGroupUpdate: onGroupUpdate, editName: editName })] })), _jsx(CreateGroupDialog, { open: openGroupDialog, onClose: () => {
78
80
  setOpenGroupDialog(false);
79
81
  }, onGroupCreate: onGroupCreate })] }) }));
80
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"GroupsTable.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupsTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAW3C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,QAAA,MAAM,WAAW,2DAKd,UAAU,sBA8DZ,CAAC;eAEa,WAAW"}
1
+ {"version":3,"file":"GroupsTable.d.ts","sourceRoot":"","sources":["../../../../src/components/groups/GroupsTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAa3C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,QAAA,MAAM,WAAW,2DAKd,UAAU,sBA4DZ,CAAC;eAEa,WAAW"}
@@ -1,23 +1,22 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { isStringTranslation, useLocale } from '@deix/rossini-core';
3
2
  import DeleteIcon from '@mui/icons-material/Delete';
4
3
  import { IconButton, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, useTheme, } from '@mui/material';
5
4
  import { useState } from 'react';
6
5
  import DeleteConfirmationDialog from '../DeleteConfirmationDialog';
6
+ import groupsTranslations from '../../lang/groups';
7
+ import useTranslate from '../../utils/hooks/useTranslate';
7
8
  const groupsTableColumns = [
8
9
  {
9
10
  id: 'name',
10
- label: { en: 'Name', it: 'Nome' },
11
+ label: groupsTranslations.nameColumn,
11
12
  },
12
13
  ];
13
14
  const GroupsTable = ({ groups = [], selectedGroup, setSelectedGroup, onDelete, }) => {
14
- const locale = useLocale();
15
+ const t = useTranslate();
15
16
  const muiTheme = useTheme();
16
17
  const [openConfirmationDialog, setOpenConfirmationDialog] = useState(false);
17
18
  const [deleteGroup, setDeleteGroup] = useState();
18
- return (_jsxs(_Fragment, { children: [_jsx(TableContainer, { children: _jsxs(Table, { size: 'small', children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [groupsTableColumns.map((col) => (_jsx(TableCell, { align: col.align || 'inherit', children: isStringTranslation(col.label)
19
- ? col.label[locale]
20
- : col.label }, col.id))), _jsx(TableCell, { padding: 'none', children: '' })] }) }), _jsx(TableBody, { children: groups.map((group, rowIdx) => (_jsxs(TableRow, { onClick: () => setSelectedGroup(group), sx: {
19
+ return (_jsxs(_Fragment, { children: [_jsx(TableContainer, { children: _jsxs(Table, { size: 'small', children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [groupsTableColumns.map((col) => (_jsx(TableCell, { align: col.align || 'inherit', children: t(col.label) }, col.id))), _jsx(TableCell, { padding: 'none', children: '' })] }) }), _jsx(TableBody, { children: groups.map((group, rowIdx) => (_jsxs(TableRow, { onClick: () => setSelectedGroup(group), sx: {
21
20
  cursor: 'pointer',
22
21
  background: selectedGroup && group.id === selectedGroup.id
23
22
  ? muiTheme.palette.primary.light
@@ -0,0 +1,29 @@
1
+ import React, { ReactElement, ReactNode } from 'react';
2
+ import { StringTranslation } from '@deix/rossini-core';
3
+ import { DataGridProps, GridRowId, GridValidRowModel } from '@mui/x-data-grid';
4
+ export interface TableColumn<T extends GridValidRowModel> {
5
+ field: string;
6
+ label: string | StringTranslation;
7
+ type?: 'string' | 'number' | 'boolean' | 'date' | 'dateTime';
8
+ align?: 'left' | 'right' | 'center';
9
+ width?: number;
10
+ minWidth?: number;
11
+ flex?: number;
12
+ sortable?: boolean;
13
+ valueGetter?: (row: T) => unknown;
14
+ renderCell?: (row: T) => ReactNode;
15
+ }
16
+ export interface TableProps<T extends GridValidRowModel> extends Omit<DataGridProps<T>, 'rows' | 'columns' | 'onRowClick'> {
17
+ rows?: T[];
18
+ columns: TableColumn<T>[];
19
+ rowIdColumn?: string;
20
+ pageSizeOptions?: number[];
21
+ onRowClick?: (row: T) => void;
22
+ selectedRowId?: GridRowId;
23
+ onDelete?: (row: T) => void;
24
+ additionalActions?: (row: T) => ReactElement[];
25
+ noDataLabel?: string | StringTranslation;
26
+ }
27
+ declare const Table: <T extends GridValidRowModel>({ rows, columns, rowIdColumn, pageSizeOptions, onRowClick, selectedRowId, onDelete, additionalActions, noDataLabel, initialState, localeText, sx, ...props }: TableProps<T>) => React.JSX.Element;
28
+ export default Table;
29
+ //# sourceMappingURL=Table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../src/components/tables/Table.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AACjE,OAAO,EAAU,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AAK1E,OAAO,EAEL,aAAa,EAMb,SAAS,EACT,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAY1B,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,iBAAiB;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAClC,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAElC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,iBAAiB,CAAE,SAAQ,IAAI,CACnE,aAAa,CAAC,CAAC,CAAC,EAChB,MAAM,GAAG,SAAS,GAAG,YAAY,CAClC;IACC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACX,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAE9B,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,YAAY,EAAE,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;CAC1C;AAED,QAAA,MAAM,KAAK,GAAI,CAAC,SAAS,iBAAiB,gKAcvC,UAAU,CAAC,CAAC,CAAC,sBAwHf,CAAC;eAEa,KAAK"}
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { useLocale } from '@deix/rossini-core';
5
+ import CheckIcon from '@mui/icons-material/Check';
6
+ import CloseIcon from '@mui/icons-material/Close';
7
+ import DeleteIcon from '@mui/icons-material/Delete';
8
+ import { Tooltip, useTheme } from '@mui/material';
9
+ import { DataGrid, GridActionsCell, GridActionsCellItem, } from '@mui/x-data-grid';
10
+ import { enUS, itIT } from '@mui/x-data-grid/locales';
11
+ import DeleteConfirmationDialog from '../DeleteConfirmationDialog';
12
+ import tablesTranslations from '../../lang/tables';
13
+ import useTranslate from '../../utils/hooks/useTranslate';
14
+ // DataGrid built-in texts (pagination, sorting, ...); English is the default
15
+ const dataGridLocales = {
16
+ en: enUS.components.MuiDataGrid.defaultProps.localeText,
17
+ it: itIT.components.MuiDataGrid.defaultProps.localeText,
18
+ };
19
+ const Table = ({ rows = [], columns, rowIdColumn = 'id', pageSizeOptions = [25, 50, 100], onRowClick, selectedRowId, onDelete, additionalActions, noDataLabel = tablesTranslations.noData, initialState, localeText, sx, ...props }) => {
20
+ const locale = useLocale();
21
+ const t = useTranslate();
22
+ const theme = useTheme();
23
+ const [openConfirmationDialog, setOpenConfirmationDialog] = useState(false);
24
+ const [deleteRow, setDeleteRow] = useState();
25
+ const gridColumns = columns.map((col) => ({
26
+ field: col.field,
27
+ headerName: t(col.label),
28
+ type: col.type,
29
+ align: col.align,
30
+ headerAlign: col.align,
31
+ width: col.width,
32
+ minWidth: col.minWidth,
33
+ flex: col.width ? undefined : (col.flex ?? 1),
34
+ sortable: col.sortable ?? true,
35
+ valueGetter: col.valueGetter
36
+ ? (_value, row) => col.valueGetter?.(row)
37
+ : undefined,
38
+ renderCell: (params) => {
39
+ if (col.renderCell) {
40
+ return col.renderCell(params.row);
41
+ }
42
+ if (col.type === 'boolean') {
43
+ return params.value ? _jsx(CheckIcon, {}) : _jsx(CloseIcon, {});
44
+ }
45
+ return (_jsx(Tooltip, { title: String(params.formattedValue ?? ''), children: _jsx("span", { children: params.formattedValue }) }));
46
+ },
47
+ }));
48
+ if (onDelete || additionalActions) {
49
+ gridColumns.push({
50
+ field: 'actions',
51
+ type: 'actions',
52
+ renderCell: (params) => {
53
+ const actionItems = [];
54
+ if (additionalActions) {
55
+ actionItems.push(...additionalActions(params.row));
56
+ }
57
+ if (onDelete) {
58
+ actionItems.push(_jsx(GridActionsCellItem, { icon: _jsx(DeleteIcon, {}), label: t(tablesTranslations.delete), onClick: (evt) => {
59
+ evt.stopPropagation();
60
+ setDeleteRow(params.row);
61
+ setOpenConfirmationDialog(true);
62
+ } }, 'delete'));
63
+ }
64
+ return _jsx(GridActionsCell, { ...params, children: actionItems });
65
+ },
66
+ });
67
+ }
68
+ return (_jsxs(_Fragment, { children: [_jsx(DataGrid, { rows: rows, columns: gridColumns, getRowId: (row) => row[rowIdColumn], pageSizeOptions: pageSizeOptions, initialState: {
69
+ ...initialState,
70
+ pagination: {
71
+ paginationModel: { page: 0, pageSize: pageSizeOptions[0] },
72
+ ...initialState?.pagination,
73
+ },
74
+ }, onRowClick: onRowClick ? (params) => onRowClick(params.row) : undefined, getRowClassName: (params) => selectedRowId !== undefined && params.id === selectedRowId
75
+ ? 'Table-selectedRow'
76
+ : '', localeText: {
77
+ ...(dataGridLocales[locale] ?? dataGridLocales.en),
78
+ noRowsLabel: t(noDataLabel),
79
+ ...localeText,
80
+ }, density: 'compact', autoHeight: true, disableColumnMenu: true, disableRowSelectionOnClick: true, sx: {
81
+ '& .Table-selectedRow': {
82
+ backgroundColor: theme.palette.primary.light,
83
+ },
84
+ ...(!!onRowClick && {
85
+ '& .MuiDataGrid-row:hover': {
86
+ cursor: 'pointer',
87
+ backgroundColor: theme.palette.primary.light,
88
+ },
89
+ '.MuiDataGrid-cell:focus, .MuiDataGrid-cell:focus-within': {
90
+ outline: 'none',
91
+ },
92
+ }),
93
+ ...sx,
94
+ }, ...props }), onDelete && (_jsx(DeleteConfirmationDialog, { open: openConfirmationDialog, onClose: () => setOpenConfirmationDialog(false), onConfirm: () => (deleteRow ? onDelete(deleteRow) : {}) }))] }));
95
+ };
96
+ export default Table;
@@ -1 +1 @@
1
- {"version":3,"file":"CreateUserDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/users/CreateUserDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,QAAA,MAAM,gBAAgB,qEAMnB,qBAAqB,sBA6CvB,CAAC;eAEa,gBAAgB"}
1
+ {"version":3,"file":"CreateUserDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/users/CreateUserDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,QAAA,MAAM,gBAAgB,qEAMnB,qBAAqB,sBA6CvB,CAAC;eAEa,gBAAgB"}
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useLocale } from '@deix/rossini-core';
3
2
  import { Dialog, DialogContent, DialogTitle } from '@mui/material';
4
3
  import { useQueryClient } from '@tanstack/react-query';
5
4
  import { getUsers, useAddUser } from '../../utils/hooks/users';
6
5
  import UserForm from './UserForm';
7
6
  import usersTranslations from '../../lang/users';
8
7
  import { useAPIClient } from '../../utils/hooks/useAPIClient';
8
+ import useTranslate from '../../utils/hooks/useTranslate';
9
9
  const CreateUserDialog = ({ open, onClose, onUserCreate, filteredGroup, emailAsUsername, }) => {
10
- const locale = useLocale();
10
+ const t = useTranslate();
11
11
  const apiClient = useAPIClient();
12
12
  const queryClient = useQueryClient();
13
13
  const addUserMutation = useAddUser(queryClient, apiClient);
@@ -31,6 +31,6 @@ const CreateUserDialog = ({ open, onClose, onUserCreate, filteredGroup, emailAsU
31
31
  });
32
32
  onClose();
33
33
  };
34
- return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: usersTranslations.create[locale] }), _jsx(DialogContent, { children: _jsx(UserForm, { mode: 'create', onSave: handleSave, onCancel: onClose, emailAsUsername: emailAsUsername }) })] }));
34
+ return (_jsxs(Dialog, { open: open, fullWidth: true, maxWidth: 'sm', onClose: onClose, children: [_jsx(DialogTitle, { children: t(usersTranslations.create) }), _jsx(DialogContent, { children: _jsx(UserForm, { mode: 'create', onSave: handleSave, onCancel: onClose, emailAsUsername: emailAsUsername }) })] }));
35
35
  };
36
36
  export default CreateUserDialog;
@@ -1 +1 @@
1
- {"version":3,"file":"UserCredentials.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserCredentials.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAOzC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,QAAA,MAAM,eAAe,aAAc,oBAAoB,sBAkBtD,CAAC;eAEa,eAAe"}
1
+ {"version":3,"file":"UserCredentials.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserCredentials.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQzC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,QAAA,MAAM,eAAe,aAAc,oBAAoB,sBAkBtD,CAAC;eAEa,eAAe"}
@@ -1,15 +1,15 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useLocale } from '@deix/rossini-core';
3
2
  import { Box, Button } from '@mui/material';
4
3
  import usersTranslations from '../../lang/users';
5
4
  import { useSendUpdatePasswordEmail } from '../../utils/hooks/users';
6
5
  import { useQueryClient } from '@tanstack/react-query';
7
6
  import { useAPIClient } from '../../utils/hooks/useAPIClient';
7
+ import useTranslate from '../../utils/hooks/useTranslate';
8
8
  const UserCredentials = ({ user }) => {
9
- const locale = useLocale();
9
+ const t = useTranslate();
10
10
  const apiClient = useAPIClient();
11
11
  const queryClient = useQueryClient();
12
12
  const { mutate: sendResetPasswordEmail } = useSendUpdatePasswordEmail(queryClient, apiClient);
13
- return (_jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { variant: 'contained', onClick: () => sendResetPasswordEmail(user.id), children: usersTranslations.sendResetPasswordEmail[locale] }) }));
13
+ return (_jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { variant: 'contained', onClick: () => sendResetPasswordEmail(user.id), children: t(usersTranslations.sendResetPasswordEmail) }) }));
14
14
  };
15
15
  export default UserCredentials;
@@ -1 +1 @@
1
- {"version":3,"file":"UserForm.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,WAAW,cAAe,SAAQ,IAAI;IAC1C,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,QAAA,MAAM,QAAQ,qEAOX,aAAa,sBA4Kf,CAAC;eAEa,QAAQ"}
1
+ {"version":3,"file":"UserForm.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,MAAM,WAAW,cAAe,SAAQ,IAAI;IAC1C,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,QAAA,MAAM,QAAQ,qEAOX,aAAa,sBA0Kf,CAAC;eAEa,QAAQ"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useLocale } from '@deix/rossini-core';
3
2
  import { Button, FormControlLabel, Grid, Switch, TextField, } from '@mui/material';
4
3
  import { Controller, useForm } from 'react-hook-form';
5
4
  import { useEffect } from 'react';
6
5
  import usersTranslations from '../../lang/users';
6
+ import useTranslate from '../../utils/hooks/useTranslate';
7
7
  const UserForm = ({ user, onSave, onCancel, mode = 'create', editUsername, emailAsUsername = false, }) => {
8
- const locale = useLocale();
8
+ const t = useTranslate();
9
9
  const { control, formState: { errors }, handleSubmit, setValue, } = useForm({
10
10
  defaultValues: {
11
11
  id: user?.id,
@@ -37,14 +37,12 @@ const UserForm = ({ user, onSave, onCancel, mode = 'create', editUsername, email
37
37
  const onSubmit = (data) => {
38
38
  onSave(data);
39
39
  };
40
- return (_jsx("form", { onSubmit: (event) => void handleSubmit(onSubmit)(event), children: _jsxs(Grid, { container: true, spacing: 2, sx: { mt: 2, maxWidth: 'sm', justifyContent: 'stretch' }, children: [!emailAsUsername && (_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'username', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: usersTranslations.username[locale], disabled: mode === 'modify' && !editUsername, sx: { flexShrink: 0 }, ...field })) }) })), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'firstName', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: usersTranslations.firstName[locale], sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'lastName', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: usersTranslations.lastName[locale], sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'email', control: control, rules: { required: true }, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, error: !!errors.email, helperText: errors.email
41
- ? usersTranslations.requiredField[locale]
42
- : undefined, label: usersTranslations.email[locale], sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'enabled', control: control, render: ({ field }) => (_jsx(FormControlLabel, { sx: { ml: 1 }, control: _jsx(Switch, { checked: field.value, size: 'small', ...field }), label: usersTranslations.enabled[locale] })) }) }), mode === 'create' && (_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'sendEmailOnCreation', control: control, render: ({ field }) => (_jsx(FormControlLabel, { sx: { ml: 1 }, control: _jsx(Switch, { checked: field.value, size: 'small', ...field }), label: usersTranslations.sendResetPasswordEmail[locale] })) }) })), _jsxs(Grid, { sx: {
40
+ return (_jsx("form", { onSubmit: (event) => void handleSubmit(onSubmit)(event), children: _jsxs(Grid, { container: true, spacing: 2, sx: { mt: 2, maxWidth: 'sm', justifyContent: 'stretch' }, children: [!emailAsUsername && (_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'username', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: t(usersTranslations.username), disabled: mode === 'modify' && !editUsername, sx: { flexShrink: 0 }, ...field })) }) })), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'firstName', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: t(usersTranslations.firstName), sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'lastName', control: control, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, label: t(usersTranslations.lastName), sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'email', control: control, rules: { required: true }, render: ({ field }) => (_jsx(TextField, { size: 'small', fullWidth: true, error: !!errors.email, helperText: errors.email ? t(usersTranslations.requiredField) : undefined, label: t(usersTranslations.email), sx: { flexShrink: 0 }, ...field })) }) }), _jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'enabled', control: control, render: ({ field }) => (_jsx(FormControlLabel, { sx: { ml: 1 }, control: _jsx(Switch, { checked: field.value, size: 'small', ...field }), label: t(usersTranslations.enabled) })) }) }), mode === 'create' && (_jsx(Grid, { size: { xs: 12 }, children: _jsx(Controller, { name: 'sendEmailOnCreation', control: control, render: ({ field }) => (_jsx(FormControlLabel, { sx: { ml: 1 }, control: _jsx(Switch, { checked: field.value, size: 'small', ...field }), label: t(usersTranslations.sendResetPasswordEmail) })) }) })), _jsxs(Grid, { sx: {
43
41
  mt: 2,
44
42
  display: 'flex',
45
43
  justifyContent: 'flex-end',
46
44
  gap: 2,
47
45
  width: '100%',
48
- }, children: [mode === 'create' && (_jsx(Button, { variant: 'outlined', onClick: onCancel, children: usersTranslations.cancel[locale] })), _jsx(Button, { variant: 'contained', type: 'submit', children: usersTranslations.save[locale] })] })] }) }));
46
+ }, children: [mode === 'create' && (_jsx(Button, { variant: 'outlined', onClick: onCancel, children: t(usersTranslations.cancel) })), _jsx(Button, { variant: 'contained', type: 'submit', children: t(usersTranslations.save) })] })] }) }));
49
47
  };
50
48
  export default UserForm;
@@ -1 +1 @@
1
- {"version":3,"file":"UserGroups.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserGroups.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsBzC,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,QAAA,MAAM,UAAU,aAAc,eAAe,sBA4F5C,CAAC;eAEa,UAAU"}
1
+ {"version":3,"file":"UserGroups.d.ts","sourceRoot":"","sources":["../../../../src/components/users/UserGroups.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAuBzC,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,QAAA,MAAM,UAAU,aAAc,eAAe,sBA0F5C,CAAC;eAEa,UAAU"}