cozy-search 2.11.2 → 2.11.3
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.
- package/dist/components/KnowledgeBase/KnowledgeBaseChip.d.ts +2 -0
- package/dist/components/KnowledgeBase/KnowledgeBaseChip.js +14 -7
- package/dist/components/KnowledgeBase/KnowledgeBaseChip.spec.d.ts +1 -0
- package/dist/components/KnowledgeBase/KnowledgeBaseChip.spec.js +82 -0
- package/dist/components/KnowledgeBase/KnowledgeBaseChip.spec.jsx +122 -0
- package/package.json +2 -2
|
@@ -8,6 +8,8 @@ export default KnowledgeBaseChip;
|
|
|
8
8
|
* open the folder in Drive (new tab) or change the knowledge base through
|
|
9
9
|
* the Drive folder picker (persisted on the assistant immediately). The
|
|
10
10
|
* menu starts with the folder name, which the icon button does not show.
|
|
11
|
+
* Changing the folder is part of editing assistants, so it follows the
|
|
12
|
+
* same flag as creating and editing them.
|
|
11
13
|
*/
|
|
12
14
|
declare function KnowledgeBaseChip({ dirId, folder, isRoot, isUnavailable, onChangeFolder, variant }: {
|
|
13
15
|
dirId: any;
|
|
@@ -15,6 +15,8 @@ var _twakeIcons = require("@linagora/twake-icons");
|
|
|
15
15
|
|
|
16
16
|
var _cozyClient = require("cozy-client");
|
|
17
17
|
|
|
18
|
+
var _cozyFlags = _interopRequireDefault(require("cozy-flags"));
|
|
19
|
+
|
|
18
20
|
var _ActionsMenu = _interopRequireDefault(require("cozy-ui/transpiled/react/ActionsMenu"));
|
|
19
21
|
|
|
20
22
|
var _ActionsMenuItem = _interopRequireDefault(require("cozy-ui/transpiled/react/ActionsMenu/ActionsMenuItem"));
|
|
@@ -57,6 +59,8 @@ var sourceStyles = {
|
|
|
57
59
|
* open the folder in Drive (new tab) or change the knowledge base through
|
|
58
60
|
* the Drive folder picker (persisted on the assistant immediately). The
|
|
59
61
|
* menu starts with the folder name, which the icon button does not show.
|
|
62
|
+
* Changing the folder is part of editing assistants, so it follows the
|
|
63
|
+
* same flag as creating and editing them.
|
|
60
64
|
*/
|
|
61
65
|
|
|
62
66
|
var KnowledgeBaseChip = function KnowledgeBaseChip(_ref) {
|
|
@@ -86,6 +90,9 @@ var KnowledgeBaseChip = function KnowledgeBaseChip(_ref) {
|
|
|
86
90
|
isPickerOpen = _useState4[0],
|
|
87
91
|
setIsPickerOpen = _useState4[1];
|
|
88
92
|
|
|
93
|
+
var canChangeFolder = (0, _cozyFlags.default)('cozy.assistant.create-assistant.enabled');
|
|
94
|
+
var hasActions = !isUnavailable || canChangeFolder;
|
|
95
|
+
|
|
89
96
|
var closeMenu = function closeMenu() {
|
|
90
97
|
return setIsMenuOpen(false);
|
|
91
98
|
};
|
|
@@ -133,12 +140,12 @@ var KnowledgeBaseChip = function KnowledgeBaseChip(_ref) {
|
|
|
133
140
|
preserveColor: true
|
|
134
141
|
}),
|
|
135
142
|
label: label,
|
|
136
|
-
clickable:
|
|
137
|
-
"aria-haspopup":
|
|
138
|
-
"aria-expanded": isMenuOpen,
|
|
139
|
-
onClick: function
|
|
143
|
+
clickable: hasActions,
|
|
144
|
+
"aria-haspopup": hasActions ? 'menu' : undefined,
|
|
145
|
+
"aria-expanded": hasActions ? isMenuOpen : undefined,
|
|
146
|
+
onClick: hasActions ? function () {
|
|
140
147
|
return setIsMenuOpen(true);
|
|
141
|
-
},
|
|
148
|
+
} : undefined,
|
|
142
149
|
className: sourceStyles['source-chip'],
|
|
143
150
|
classes: _SourceButton.CHIP_CLASSES
|
|
144
151
|
}))), isMenuOpen && /*#__PURE__*/_react.default.createElement(_ActionsMenu.default, {
|
|
@@ -168,7 +175,7 @@ var KnowledgeBaseChip = function KnowledgeBaseChip(_ref) {
|
|
|
168
175
|
className: "u-mr-half"
|
|
169
176
|
}), /*#__PURE__*/_react.default.createElement(_Typography.default, {
|
|
170
177
|
variant: "body1"
|
|
171
|
-
}, t('assistant.knowledge_base.open_folder')))), /*#__PURE__*/_react.default.createElement(_ActionsMenuItem.default, {
|
|
178
|
+
}, t('assistant.knowledge_base.open_folder')))), canChangeFolder && /*#__PURE__*/_react.default.createElement(_ActionsMenuItem.default, {
|
|
172
179
|
onClick: handleChangeFolder
|
|
173
180
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
174
181
|
className: "u-flex u-flex-items-center"
|
|
@@ -178,7 +185,7 @@ var KnowledgeBaseChip = function KnowledgeBaseChip(_ref) {
|
|
|
178
185
|
className: "u-mr-half"
|
|
179
186
|
}), /*#__PURE__*/_react.default.createElement(_Typography.default, {
|
|
180
187
|
variant: "body1"
|
|
181
|
-
}, t('assistant.knowledge_base.change_folder'))))), isPickerOpen && /*#__PURE__*/_react.default.createElement(_FolderPickerDialog.default, {
|
|
188
|
+
}, t('assistant.knowledge_base.change_folder'))))), canChangeFolder && isPickerOpen && /*#__PURE__*/_react.default.createElement(_FolderPickerDialog.default, {
|
|
182
189
|
open: isPickerOpen,
|
|
183
190
|
onClose: function onClose() {
|
|
184
191
|
return setIsPickerOpen(false);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import flag from 'cozy-flags';
|
|
4
|
+
import KnowledgeBaseChip from './KnowledgeBaseChip';
|
|
5
|
+
jest.mock('cozy-flags', () => jest.fn());
|
|
6
|
+
jest.mock('cozy-client', () => ({
|
|
7
|
+
useClient: () => ({
|
|
8
|
+
getStackClient: () => ({ uri: 'https://alice.cozy.example' }),
|
|
9
|
+
getInstanceOptions: () => ({ subdomain: 'flat' })
|
|
10
|
+
}),
|
|
11
|
+
generateWebLink: ({ hash }) => `https://alice-drive.cozy.example/#${hash}`
|
|
12
|
+
}));
|
|
13
|
+
jest.mock('cozy-intent', () => ({
|
|
14
|
+
useWebviewIntent: () => null
|
|
15
|
+
}));
|
|
16
|
+
jest.mock('cozy-ui/transpiled/react/providers/Breakpoints', () => {
|
|
17
|
+
const useBreakpoints = () => ({ isMobile: false });
|
|
18
|
+
return { __esModule: true, default: useBreakpoints, useBreakpoints };
|
|
19
|
+
});
|
|
20
|
+
jest.mock('twake-i18n', () => ({
|
|
21
|
+
useI18n: () => ({ t: key => key })
|
|
22
|
+
}));
|
|
23
|
+
jest.mock('./FolderPickerDialog', () => () => (React.createElement("div", { "data-testid": "folder-picker" })));
|
|
24
|
+
const CHANGE_FOLDER = 'assistant.knowledge_base.change_folder';
|
|
25
|
+
const OPEN_FOLDER = 'assistant.knowledge_base.open_folder';
|
|
26
|
+
const setup = props => render(React.createElement(KnowledgeBaseChip, Object.assign({ dirId: "folder-id", folder: { _id: 'folder-id', name: 'Meetings' }, isRoot: false, isUnavailable: false, onChangeFolder: jest.fn() }, props)));
|
|
27
|
+
const mockCreateAssistantFlag = isEnabled => flag.mockImplementation(name => name === 'cozy.assistant.create-assistant.enabled' ? isEnabled : null);
|
|
28
|
+
describe('KnowledgeBaseChip', () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
flag.mockReset();
|
|
31
|
+
});
|
|
32
|
+
describe('when creating assistants is enabled', () => {
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
mockCreateAssistantFlag(true);
|
|
35
|
+
});
|
|
36
|
+
it('offers to open the folder and to change it', () => {
|
|
37
|
+
setup();
|
|
38
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }));
|
|
39
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null);
|
|
40
|
+
expect(screen.queryByText(CHANGE_FOLDER)).not.toBe(null);
|
|
41
|
+
});
|
|
42
|
+
it('opens the folder picker from the menu', () => {
|
|
43
|
+
setup();
|
|
44
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }));
|
|
45
|
+
fireEvent.click(screen.getByText(CHANGE_FOLDER));
|
|
46
|
+
expect(screen.queryByTestId('folder-picker')).not.toBe(null);
|
|
47
|
+
});
|
|
48
|
+
it('still offers to change an unavailable folder', () => {
|
|
49
|
+
setup({ isUnavailable: true });
|
|
50
|
+
fireEvent.click(screen.getByRole('button', {
|
|
51
|
+
name: 'assistant.knowledge_base.unavailable'
|
|
52
|
+
}));
|
|
53
|
+
expect(screen.queryByText(OPEN_FOLDER)).toBe(null);
|
|
54
|
+
expect(screen.queryByText(CHANGE_FOLDER)).not.toBe(null);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('when creating assistants is disabled', () => {
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
mockCreateAssistantFlag(false);
|
|
60
|
+
});
|
|
61
|
+
it('only offers to open the folder', () => {
|
|
62
|
+
setup();
|
|
63
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }));
|
|
64
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null);
|
|
65
|
+
expect(screen.queryByText(CHANGE_FOLDER)).toBe(null);
|
|
66
|
+
expect(screen.queryByTestId('folder-picker')).toBe(null);
|
|
67
|
+
});
|
|
68
|
+
it('only offers to open the folder from the icon button', () => {
|
|
69
|
+
setup({ variant: 'icon' });
|
|
70
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }));
|
|
71
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null);
|
|
72
|
+
expect(screen.queryByText(CHANGE_FOLDER)).toBe(null);
|
|
73
|
+
});
|
|
74
|
+
it('does not open an empty menu for an unavailable folder', () => {
|
|
75
|
+
setup({ isUnavailable: true });
|
|
76
|
+
expect(screen.queryByRole('button', {
|
|
77
|
+
name: 'assistant.knowledge_base.unavailable'
|
|
78
|
+
})).toBe(null);
|
|
79
|
+
expect(screen.queryByRole('menu')).toBe(null);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { fireEvent, render, screen } from '@testing-library/react'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
|
|
4
|
+
import flag from 'cozy-flags'
|
|
5
|
+
|
|
6
|
+
import KnowledgeBaseChip from './KnowledgeBaseChip'
|
|
7
|
+
|
|
8
|
+
jest.mock('cozy-flags', () => jest.fn())
|
|
9
|
+
jest.mock('cozy-client', () => ({
|
|
10
|
+
useClient: () => ({
|
|
11
|
+
getStackClient: () => ({ uri: 'https://alice.cozy.example' }),
|
|
12
|
+
getInstanceOptions: () => ({ subdomain: 'flat' })
|
|
13
|
+
}),
|
|
14
|
+
generateWebLink: ({ hash }) => `https://alice-drive.cozy.example/#${hash}`
|
|
15
|
+
}))
|
|
16
|
+
jest.mock('cozy-intent', () => ({
|
|
17
|
+
useWebviewIntent: () => null
|
|
18
|
+
}))
|
|
19
|
+
jest.mock('cozy-ui/transpiled/react/providers/Breakpoints', () => {
|
|
20
|
+
const useBreakpoints = () => ({ isMobile: false })
|
|
21
|
+
return { __esModule: true, default: useBreakpoints, useBreakpoints }
|
|
22
|
+
})
|
|
23
|
+
jest.mock('twake-i18n', () => ({
|
|
24
|
+
useI18n: () => ({ t: key => key })
|
|
25
|
+
}))
|
|
26
|
+
jest.mock('./FolderPickerDialog', () => () => (
|
|
27
|
+
<div data-testid="folder-picker" />
|
|
28
|
+
))
|
|
29
|
+
|
|
30
|
+
const CHANGE_FOLDER = 'assistant.knowledge_base.change_folder'
|
|
31
|
+
const OPEN_FOLDER = 'assistant.knowledge_base.open_folder'
|
|
32
|
+
|
|
33
|
+
const setup = props =>
|
|
34
|
+
render(
|
|
35
|
+
<KnowledgeBaseChip
|
|
36
|
+
dirId="folder-id"
|
|
37
|
+
folder={{ _id: 'folder-id', name: 'Meetings' }}
|
|
38
|
+
isRoot={false}
|
|
39
|
+
isUnavailable={false}
|
|
40
|
+
onChangeFolder={jest.fn()}
|
|
41
|
+
{...props}
|
|
42
|
+
/>
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
const mockCreateAssistantFlag = isEnabled =>
|
|
46
|
+
flag.mockImplementation(name =>
|
|
47
|
+
name === 'cozy.assistant.create-assistant.enabled' ? isEnabled : null
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
describe('KnowledgeBaseChip', () => {
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
flag.mockReset()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
describe('when creating assistants is enabled', () => {
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
mockCreateAssistantFlag(true)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('offers to open the folder and to change it', () => {
|
|
61
|
+
setup()
|
|
62
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }))
|
|
63
|
+
|
|
64
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null)
|
|
65
|
+
expect(screen.queryByText(CHANGE_FOLDER)).not.toBe(null)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('opens the folder picker from the menu', () => {
|
|
69
|
+
setup()
|
|
70
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }))
|
|
71
|
+
fireEvent.click(screen.getByText(CHANGE_FOLDER))
|
|
72
|
+
|
|
73
|
+
expect(screen.queryByTestId('folder-picker')).not.toBe(null)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('still offers to change an unavailable folder', () => {
|
|
77
|
+
setup({ isUnavailable: true })
|
|
78
|
+
fireEvent.click(
|
|
79
|
+
screen.getByRole('button', {
|
|
80
|
+
name: 'assistant.knowledge_base.unavailable'
|
|
81
|
+
})
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
expect(screen.queryByText(OPEN_FOLDER)).toBe(null)
|
|
85
|
+
expect(screen.queryByText(CHANGE_FOLDER)).not.toBe(null)
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
describe('when creating assistants is disabled', () => {
|
|
90
|
+
beforeEach(() => {
|
|
91
|
+
mockCreateAssistantFlag(false)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('only offers to open the folder', () => {
|
|
95
|
+
setup()
|
|
96
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }))
|
|
97
|
+
|
|
98
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null)
|
|
99
|
+
expect(screen.queryByText(CHANGE_FOLDER)).toBe(null)
|
|
100
|
+
expect(screen.queryByTestId('folder-picker')).toBe(null)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('only offers to open the folder from the icon button', () => {
|
|
104
|
+
setup({ variant: 'icon' })
|
|
105
|
+
fireEvent.click(screen.getByRole('button', { name: 'Meetings' }))
|
|
106
|
+
|
|
107
|
+
expect(screen.queryByText(OPEN_FOLDER)).not.toBe(null)
|
|
108
|
+
expect(screen.queryByText(CHANGE_FOLDER)).toBe(null)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('does not open an empty menu for an unavailable folder', () => {
|
|
112
|
+
setup({ isUnavailable: true })
|
|
113
|
+
|
|
114
|
+
expect(
|
|
115
|
+
screen.queryByRole('button', {
|
|
116
|
+
name: 'assistant.knowledge_base.unavailable'
|
|
117
|
+
})
|
|
118
|
+
).toBe(null)
|
|
119
|
+
expect(screen.queryByRole('menu')).toBe(null)
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
})
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozy-search",
|
|
3
3
|
"description": "UI components about search bar and IA assistant",
|
|
4
|
-
"version": "2.11.
|
|
4
|
+
"version": "2.11.3",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cozy Cloud",
|
|
7
7
|
"url": "https://github.com/cozy"
|
|
@@ -96,5 +96,5 @@
|
|
|
96
96
|
"lint": "cd .. && yarn eslint --ext js,jsx,ts packages/cozy-search"
|
|
97
97
|
},
|
|
98
98
|
"types": "dist/index.d.ts",
|
|
99
|
-
"gitHead": "
|
|
99
|
+
"gitHead": "cf7659dd90d8e1e970e79dd421f1620bd1f6a84f"
|
|
100
100
|
}
|