box-ui-elements 23.4.0-beta.17 → 23.4.0-beta.18
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/explorer.js +1 -1
- package/dist/preview.js +1 -1
- package/dist/sidebar.js +1 -1
- package/es/elements/common/types/{SidebarNavigation.flow.js.flow → SidebarNavigation.js.flow} +9 -23
- package/es/elements/content-sidebar/versions/VersionsGroup.js.flow +3 -0
- package/es/elements/content-sidebar/versions/VersionsGroup.js.map +1 -1
- package/es/elements/content-sidebar/versions/VersionsList.js +16 -8
- package/es/elements/content-sidebar/versions/VersionsList.js.flow +35 -17
- package/es/elements/content-sidebar/versions/VersionsList.js.map +1 -1
- package/es/elements/content-sidebar/versions/VersionsMenu.js.flow +3 -0
- package/es/elements/content-sidebar/versions/VersionsMenu.js.map +1 -1
- package/package.json +3 -3
- package/src/elements/common/types/{SidebarNavigation.flow.js → SidebarNavigation.js.flow} +9 -23
- package/src/elements/content-sidebar/versions/VersionsGroup.js +3 -0
- package/src/elements/content-sidebar/versions/VersionsList.js +35 -17
- package/src/elements/content-sidebar/versions/VersionsMenu.js +3 -0
- package/src/elements/content-sidebar/versions/__tests__/VersionsList.test.js +138 -13
- package/src/elements/content-sidebar/versions/__tests__/VersionsMenu.test.js +75 -23
- package/es/elements/common/types/SidebarNavigation.flow.js +0 -14
- package/es/elements/common/types/SidebarNavigation.flow.js.map +0 -1
- package/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsList.test.js.snap +0 -45
package/es/elements/common/types/{SidebarNavigation.flow.js.flow → SidebarNavigation.js.flow}
RENAMED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/* @flow */
|
|
2
2
|
|
|
3
|
+
// flow version is simplified compared to Type Script due to difficult to resolve problems with Union Types
|
|
4
|
+
// Type Script works better with Union Types
|
|
5
|
+
|
|
3
6
|
export const ViewType = Object.freeze({
|
|
4
7
|
BOXAI: 'boxai',
|
|
5
8
|
SKILLS: 'skills',
|
|
@@ -18,30 +21,13 @@ export const FeedEntryType = Object.freeze({
|
|
|
18
21
|
export type ViewTypeValues = $Values<typeof ViewType>;
|
|
19
22
|
export type FeedEntryTypeValues = $Values<typeof FeedEntryType>;
|
|
20
23
|
|
|
21
|
-
type
|
|
22
|
-
sidebar:
|
|
23
|
-
versionId
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
sidebar: 'activity',
|
|
28
|
-
activeFeedEntryType: 'annotations',
|
|
29
|
-
fileVersionId: string,
|
|
30
|
-
activeFeedEntryId: string,
|
|
24
|
+
export type SidebarNavigation = {
|
|
25
|
+
sidebar: ViewTypeValues,
|
|
26
|
+
versionId?: string,
|
|
27
|
+
activeFeedEntryType?: FeedEntryTypeValues,
|
|
28
|
+
activeFeedEntryId?: string,
|
|
29
|
+
fileVersionId?: string,
|
|
31
30
|
};
|
|
32
|
-
type ActivityCommentsSidebarView = {
|
|
33
|
-
sidebar: 'activity',
|
|
34
|
-
activeFeedEntryType: 'comments' | 'tasks',
|
|
35
|
-
activeFeedEntryId: string,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export type SidebarNavigation =
|
|
39
|
-
| {|
|
|
40
|
-
sidebar: ViewTypeValues,
|
|
41
|
-
|}
|
|
42
|
-
| VersionSidebarView
|
|
43
|
-
| ActivityCommentsSidebarView
|
|
44
|
-
| ActivityAnnotationsSidebarView;
|
|
45
31
|
|
|
46
32
|
export type InternalSidebarNavigation = SidebarNavigation & {
|
|
47
33
|
open: boolean,
|
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import VersionsList from './VersionsList';
|
|
9
9
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
10
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
10
11
|
import './VersionsGroup.scss';
|
|
11
12
|
|
|
12
13
|
type Props = {
|
|
13
14
|
fileId: string,
|
|
14
15
|
heading: string,
|
|
16
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
17
|
+
routerDisabled?: boolean,
|
|
15
18
|
versionCount: number,
|
|
16
19
|
versionLimit: number,
|
|
17
20
|
versions: Array<BoxItemVersion>,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionsGroup.js","names":["React","VersionsList","VersionsGroup","_ref","heading","rest","_objectWithoutProperties","_excluded","createElement","className"],"sources":["../../../../src/elements/content-sidebar/versions/VersionsGroup.js"],"sourcesContent":["/**\n * @flow\n * @file Versions Group component\n * @author Box\n */\n\nimport * as React from 'react';\nimport VersionsList from './VersionsList';\nimport type { BoxItemVersion } from '../../../common/types/core';\nimport './VersionsGroup.scss';\n\ntype Props = {\n fileId: string,\n heading: string,\n versionCount: number,\n versionLimit: number,\n versions: Array<BoxItemVersion>,\n};\n\nconst VersionsGroup = ({ heading, ...rest }: Props) => {\n return (\n <section className=\"bcs-VersionsGroup\">\n <h4 className=\"bcs-VersionsGroup-heading\">{heading}</h4>\n <VersionsList {...rest} />\n </section>\n );\n};\n\nexport default VersionsGroup;\n"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,YAAY,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"VersionsGroup.js","names":["React","VersionsList","VersionsGroup","_ref","heading","rest","_objectWithoutProperties","_excluded","createElement","className"],"sources":["../../../../src/elements/content-sidebar/versions/VersionsGroup.js"],"sourcesContent":["/**\n * @flow\n * @file Versions Group component\n * @author Box\n */\n\nimport * as React from 'react';\nimport VersionsList from './VersionsList';\nimport type { BoxItemVersion } from '../../../common/types/core';\nimport type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';\nimport './VersionsGroup.scss';\n\ntype Props = {\n fileId: string,\n heading: string,\n internalSidebarNavigation?: InternalSidebarNavigation,\n routerDisabled?: boolean,\n versionCount: number,\n versionLimit: number,\n versions: Array<BoxItemVersion>,\n};\n\nconst VersionsGroup = ({ heading, ...rest }: Props) => {\n return (\n <section className=\"bcs-VersionsGroup\">\n <h4 className=\"bcs-VersionsGroup-heading\">{heading}</h4>\n <VersionsList {...rest} />\n </section>\n );\n};\n\nexport default VersionsGroup;\n"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,YAAY,MAAM,gBAAgB;AAGzC,OAAO,sBAAsB;AAY7B,MAAMC,aAAa,GAAGC,IAAA,IAAiC;EAAA,IAAhC;MAAEC;IAAwB,CAAC,GAAAD,IAAA;IAAbE,IAAI,GAAAC,wBAAA,CAAAH,IAAA,EAAAI,SAAA;EACrC,oBACIP,KAAA,CAAAQ,aAAA;IAASC,SAAS,EAAC;EAAmB,gBAClCT,KAAA,CAAAQ,aAAA;IAAIC,SAAS,EAAC;EAA2B,GAAEL,OAAY,CAAC,eACxDJ,KAAA,CAAAQ,aAAA,CAACP,YAAY,EAAKI,IAAO,CACpB,CAAC;AAElB,CAAC;AAED,eAAeH,aAAa","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const _excluded = ["currentId", "versions"];
|
|
1
|
+
const _excluded = ["currentId", "internalSidebarNavigation", "routerDisabled", "versions"];
|
|
2
2
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
3
3
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
4
4
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
|
|
@@ -15,15 +15,17 @@ import './VersionsList.scss';
|
|
|
15
15
|
const VersionsList = _ref => {
|
|
16
16
|
let {
|
|
17
17
|
currentId,
|
|
18
|
+
internalSidebarNavigation,
|
|
19
|
+
routerDisabled = false,
|
|
18
20
|
versions
|
|
19
21
|
} = _ref,
|
|
20
22
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const renderVersionItemWithoutRouter = version => /*#__PURE__*/React.createElement(VersionsItem, _extends({
|
|
24
|
+
isCurrent: currentId === version.id,
|
|
25
|
+
isSelected: internalSidebarNavigation?.versionId === version.id,
|
|
26
|
+
version: version
|
|
27
|
+
}, rest));
|
|
28
|
+
const renderVersionItemWithRouter = version => /*#__PURE__*/React.createElement(Route, {
|
|
27
29
|
render: ({
|
|
28
30
|
match
|
|
29
31
|
}) => /*#__PURE__*/React.createElement(VersionsItem, _extends({
|
|
@@ -31,7 +33,13 @@ const VersionsList = _ref => {
|
|
|
31
33
|
isSelected: match.params.versionId === version.id,
|
|
32
34
|
version: version
|
|
33
35
|
}, rest))
|
|
34
|
-
})
|
|
36
|
+
});
|
|
37
|
+
return /*#__PURE__*/React.createElement("ul", {
|
|
38
|
+
className: "bcs-VersionsList"
|
|
39
|
+
}, versions.map(version => /*#__PURE__*/React.createElement("li", {
|
|
40
|
+
className: "bcs-VersionsList-item",
|
|
41
|
+
key: version.id
|
|
42
|
+
}, routerDisabled ? renderVersionItemWithoutRouter(version) : renderVersionItemWithRouter(version))));
|
|
35
43
|
};
|
|
36
44
|
export default VersionsList;
|
|
37
45
|
//# sourceMappingURL=VersionsList.js.map
|
|
@@ -8,33 +8,51 @@ import * as React from 'react';
|
|
|
8
8
|
import { Route } from 'react-router-dom';
|
|
9
9
|
import VersionsItem from './VersionsItem';
|
|
10
10
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
11
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
11
12
|
import './VersionsList.scss';
|
|
12
13
|
|
|
13
14
|
type Props = {
|
|
14
15
|
currentId?: string,
|
|
15
16
|
fileId: string,
|
|
17
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
18
|
+
routerDisabled?: boolean,
|
|
16
19
|
versionCount: number,
|
|
17
20
|
versionLimit: number,
|
|
18
21
|
versions: Array<BoxItemVersion>,
|
|
19
22
|
};
|
|
20
23
|
|
|
21
|
-
const VersionsList = ({ currentId, versions, ...rest }: Props) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
const VersionsList = ({ currentId, internalSidebarNavigation, routerDisabled = false, versions, ...rest }: Props) => {
|
|
25
|
+
const renderVersionItemWithoutRouter = (version: BoxItemVersion) => (
|
|
26
|
+
<VersionsItem
|
|
27
|
+
isCurrent={currentId === version.id}
|
|
28
|
+
isSelected={internalSidebarNavigation?.versionId === version.id}
|
|
29
|
+
version={version}
|
|
30
|
+
{...rest}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const renderVersionItemWithRouter = (version: BoxItemVersion) => (
|
|
35
|
+
<Route
|
|
36
|
+
render={({ match }) => (
|
|
37
|
+
<VersionsItem
|
|
38
|
+
isCurrent={currentId === version.id}
|
|
39
|
+
isSelected={match.params.versionId === version.id}
|
|
40
|
+
version={version}
|
|
41
|
+
{...rest}
|
|
34
42
|
/>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
)}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<ul className="bcs-VersionsList">
|
|
49
|
+
{versions.map(version => (
|
|
50
|
+
<li className="bcs-VersionsList-item" key={version.id}>
|
|
51
|
+
{routerDisabled ? renderVersionItemWithoutRouter(version) : renderVersionItemWithRouter(version)}
|
|
52
|
+
</li>
|
|
53
|
+
))}
|
|
54
|
+
</ul>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
39
57
|
|
|
40
58
|
export default VersionsList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionsList.js","names":["React","Route","VersionsItem","VersionsList","_ref","currentId","versions","rest","_objectWithoutProperties","_excluded","
|
|
1
|
+
{"version":3,"file":"VersionsList.js","names":["React","Route","VersionsItem","VersionsList","_ref","currentId","internalSidebarNavigation","routerDisabled","versions","rest","_objectWithoutProperties","_excluded","renderVersionItemWithoutRouter","version","createElement","_extends","isCurrent","id","isSelected","versionId","renderVersionItemWithRouter","render","match","params","className","map","key"],"sources":["../../../../src/elements/content-sidebar/versions/VersionsList.js"],"sourcesContent":["/**\n * @flow\n * @file Versions List component\n * @author Box\n */\n\nimport * as React from 'react';\nimport { Route } from 'react-router-dom';\nimport VersionsItem from './VersionsItem';\nimport type { BoxItemVersion } from '../../../common/types/core';\nimport type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';\nimport './VersionsList.scss';\n\ntype Props = {\n currentId?: string,\n fileId: string,\n internalSidebarNavigation?: InternalSidebarNavigation,\n routerDisabled?: boolean,\n versionCount: number,\n versionLimit: number,\n versions: Array<BoxItemVersion>,\n};\n\nconst VersionsList = ({ currentId, internalSidebarNavigation, routerDisabled = false, versions, ...rest }: Props) => {\n const renderVersionItemWithoutRouter = (version: BoxItemVersion) => (\n <VersionsItem\n isCurrent={currentId === version.id}\n isSelected={internalSidebarNavigation?.versionId === version.id}\n version={version}\n {...rest}\n />\n );\n\n const renderVersionItemWithRouter = (version: BoxItemVersion) => (\n <Route\n render={({ match }) => (\n <VersionsItem\n isCurrent={currentId === version.id}\n isSelected={match.params.versionId === version.id}\n version={version}\n {...rest}\n />\n )}\n />\n );\n\n return (\n <ul className=\"bcs-VersionsList\">\n {versions.map(version => (\n <li className=\"bcs-VersionsList-item\" key={version.id}>\n {routerDisabled ? renderVersionItemWithoutRouter(version) : renderVersionItemWithRouter(version)}\n </li>\n ))}\n </ul>\n );\n};\n\nexport default VersionsList;\n"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,KAAK,QAAQ,kBAAkB;AACxC,OAAOC,YAAY,MAAM,gBAAgB;AAGzC,OAAO,qBAAqB;AAY5B,MAAMC,YAAY,GAAGC,IAAA,IAAgG;EAAA,IAA/F;MAAEC,SAAS;MAAEC,yBAAyB;MAAEC,cAAc,GAAG,KAAK;MAAEC;IAAyB,CAAC,GAAAJ,IAAA;IAAbK,IAAI,GAAAC,wBAAA,CAAAN,IAAA,EAAAO,SAAA;EACnG,MAAMC,8BAA8B,GAAIC,OAAuB,iBAC3Db,KAAA,CAAAc,aAAA,CAACZ,YAAY,EAAAa,QAAA;IACTC,SAAS,EAAEX,SAAS,KAAKQ,OAAO,CAACI,EAAG;IACpCC,UAAU,EAAEZ,yBAAyB,EAAEa,SAAS,KAAKN,OAAO,CAACI,EAAG;IAChEJ,OAAO,EAAEA;EAAQ,GACbJ,IAAI,CACX,CACJ;EAED,MAAMW,2BAA2B,GAAIP,OAAuB,iBACxDb,KAAA,CAAAc,aAAA,CAACb,KAAK;IACFoB,MAAM,EAAEA,CAAC;MAAEC;IAAM,CAAC,kBACdtB,KAAA,CAAAc,aAAA,CAACZ,YAAY,EAAAa,QAAA;MACTC,SAAS,EAAEX,SAAS,KAAKQ,OAAO,CAACI,EAAG;MACpCC,UAAU,EAAEI,KAAK,CAACC,MAAM,CAACJ,SAAS,KAAKN,OAAO,CAACI,EAAG;MAClDJ,OAAO,EAAEA;IAAQ,GACbJ,IAAI,CACX;EACH,CACL,CACJ;EAED,oBACIT,KAAA,CAAAc,aAAA;IAAIU,SAAS,EAAC;EAAkB,GAC3BhB,QAAQ,CAACiB,GAAG,CAACZ,OAAO,iBACjBb,KAAA,CAAAc,aAAA;IAAIU,SAAS,EAAC,uBAAuB;IAACE,GAAG,EAAEb,OAAO,CAACI;EAAG,GACjDV,cAAc,GAAGK,8BAA8B,CAACC,OAAO,CAAC,GAAGO,2BAA2B,CAACP,OAAO,CAC/F,CACP,CACD,CAAC;AAEb,CAAC;AAED,eAAeV,YAAY","ignoreList":[]}
|
|
@@ -11,11 +11,14 @@ import * as util from '../../../utils/datetime';
|
|
|
11
11
|
import messages from './messages';
|
|
12
12
|
import VersionsGroup from './VersionsGroup';
|
|
13
13
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
14
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
14
15
|
import './VersionsMenu.scss';
|
|
15
16
|
|
|
16
17
|
type Props = {
|
|
17
18
|
fileId: string,
|
|
18
19
|
intl: any,
|
|
20
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
21
|
+
routerDisabled?: boolean,
|
|
19
22
|
versionCount: number,
|
|
20
23
|
versionLimit: number,
|
|
21
24
|
versions: Array<BoxItemVersion>,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionsMenu.js","names":["React","last","injectIntl","util","messages","VersionsGroup","getHeading","intl","version","created_at","createdAt","currentDate","Date","currentDay","getDay","currentSunday","getDate","createdAtDate","convertToDate","heading","isToday","formatMessage","versionsToday","isYesterday","versionsYesterday","isCurrentYear","formatDate","year","isCurrentMonth","month","versionsThisMonth","versionsPriorWeek","weekday","VersionsMenu","memo","_ref","versions","rest","_objectWithoutProperties","_excluded","id","currentId","versionGroups","reduce","groups","currentGroup","groupHeading","push","groupVersions","createElement","className","map","key","_extends"],"sources":["../../../../src/elements/content-sidebar/versions/VersionsMenu.js"],"sourcesContent":["/**\n * @flow\n * @file Versions Menu component\n * @author Box\n */\n\nimport * as React from 'react';\nimport last from 'lodash/last';\nimport { injectIntl } from 'react-intl';\nimport * as util from '../../../utils/datetime';\nimport messages from './messages';\nimport VersionsGroup from './VersionsGroup';\nimport type { BoxItemVersion } from '../../../common/types/core';\nimport './VersionsMenu.scss';\n\ntype Props = {\n fileId: string,\n intl: any,\n versionCount: number,\n versionLimit: number,\n versions: Array<BoxItemVersion>,\n};\n\ntype VersionGroups = Array<{ groupHeading: string, groupVersions: Array<BoxItemVersion> }>;\n\nconst getHeading = ({ intl, version }: { intl: any, version: BoxItemVersion }): string => {\n const { created_at: createdAt } = version;\n const currentDate = new Date();\n const currentDay = currentDate.getDay();\n const currentSunday = currentDate.getDate() - currentDay;\n const createdAtDate = util.convertToDate(createdAt);\n let heading;\n\n if (util.isToday(createdAtDate)) {\n heading = intl.formatMessage(messages.versionsToday); // Today\n } else if (util.isYesterday(createdAtDate)) {\n heading = intl.formatMessage(messages.versionsYesterday); // Yesterday\n } else if (!util.isCurrentYear(createdAtDate)) {\n heading = intl.formatDate(createdAt, { year: 'numeric' }); // 2018\n } else if (!util.isCurrentMonth(createdAtDate)) {\n heading = intl.formatDate(createdAt, { month: 'long' }); // January\n } else if (createdAtDate.getDate() <= currentSunday - 7) {\n heading = intl.formatMessage(messages.versionsThisMonth); // This Month\n } else if (createdAtDate.getDate() <= currentSunday) {\n heading = intl.formatMessage(messages.versionsPriorWeek); // Last Week\n } else {\n heading = intl.formatDate(createdAt, { weekday: 'long' }); // Monday\n }\n\n return heading;\n};\n\nconst VersionsMenu = React.memo<Props>(({ intl, versions, ...rest }: Props) => {\n const { id: currentId } = versions[0] || {};\n\n // Build an ordered set of groups with headings based on the original order of the versions array\n const versionGroups = versions.reduce((groups: VersionGroups, version: BoxItemVersion): VersionGroups => {\n const currentGroup = last(groups);\n const groupHeading = getHeading({ intl, version });\n\n // Push a new group if there are no groups or if the heading has changed\n if (!currentGroup || currentGroup.groupHeading !== groupHeading) {\n groups.push({\n groupHeading,\n groupVersions: [],\n });\n }\n\n // Push the sorted version to the newest group's versions collection\n last(groups).groupVersions.push(version);\n return groups;\n }, []);\n\n return (\n <ul className=\"bcs-VersionsMenu\">\n {versionGroups.map(({ groupHeading, groupVersions }) => (\n <li className=\"bcs-VersionsMenu-item\" key={groupHeading}>\n <VersionsGroup currentId={currentId} heading={groupHeading} versions={groupVersions} {...rest} />\n </li>\n ))}\n </ul>\n );\n});\n\nexport default injectIntl(VersionsMenu);\n"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,IAAI,MAAM,aAAa;AAC9B,SAASC,UAAU,QAAQ,YAAY;AACvC,OAAO,KAAKC,IAAI,MAAM,yBAAyB;AAC/C,OAAOC,QAAQ,MAAM,YAAY;AACjC,OAAOC,aAAa,MAAM,iBAAiB;
|
|
1
|
+
{"version":3,"file":"VersionsMenu.js","names":["React","last","injectIntl","util","messages","VersionsGroup","getHeading","intl","version","created_at","createdAt","currentDate","Date","currentDay","getDay","currentSunday","getDate","createdAtDate","convertToDate","heading","isToday","formatMessage","versionsToday","isYesterday","versionsYesterday","isCurrentYear","formatDate","year","isCurrentMonth","month","versionsThisMonth","versionsPriorWeek","weekday","VersionsMenu","memo","_ref","versions","rest","_objectWithoutProperties","_excluded","id","currentId","versionGroups","reduce","groups","currentGroup","groupHeading","push","groupVersions","createElement","className","map","key","_extends"],"sources":["../../../../src/elements/content-sidebar/versions/VersionsMenu.js"],"sourcesContent":["/**\n * @flow\n * @file Versions Menu component\n * @author Box\n */\n\nimport * as React from 'react';\nimport last from 'lodash/last';\nimport { injectIntl } from 'react-intl';\nimport * as util from '../../../utils/datetime';\nimport messages from './messages';\nimport VersionsGroup from './VersionsGroup';\nimport type { BoxItemVersion } from '../../../common/types/core';\nimport type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';\nimport './VersionsMenu.scss';\n\ntype Props = {\n fileId: string,\n intl: any,\n internalSidebarNavigation?: InternalSidebarNavigation,\n routerDisabled?: boolean,\n versionCount: number,\n versionLimit: number,\n versions: Array<BoxItemVersion>,\n};\n\ntype VersionGroups = Array<{ groupHeading: string, groupVersions: Array<BoxItemVersion> }>;\n\nconst getHeading = ({ intl, version }: { intl: any, version: BoxItemVersion }): string => {\n const { created_at: createdAt } = version;\n const currentDate = new Date();\n const currentDay = currentDate.getDay();\n const currentSunday = currentDate.getDate() - currentDay;\n const createdAtDate = util.convertToDate(createdAt);\n let heading;\n\n if (util.isToday(createdAtDate)) {\n heading = intl.formatMessage(messages.versionsToday); // Today\n } else if (util.isYesterday(createdAtDate)) {\n heading = intl.formatMessage(messages.versionsYesterday); // Yesterday\n } else if (!util.isCurrentYear(createdAtDate)) {\n heading = intl.formatDate(createdAt, { year: 'numeric' }); // 2018\n } else if (!util.isCurrentMonth(createdAtDate)) {\n heading = intl.formatDate(createdAt, { month: 'long' }); // January\n } else if (createdAtDate.getDate() <= currentSunday - 7) {\n heading = intl.formatMessage(messages.versionsThisMonth); // This Month\n } else if (createdAtDate.getDate() <= currentSunday) {\n heading = intl.formatMessage(messages.versionsPriorWeek); // Last Week\n } else {\n heading = intl.formatDate(createdAt, { weekday: 'long' }); // Monday\n }\n\n return heading;\n};\n\nconst VersionsMenu = React.memo<Props>(({ intl, versions, ...rest }: Props) => {\n const { id: currentId } = versions[0] || {};\n\n // Build an ordered set of groups with headings based on the original order of the versions array\n const versionGroups = versions.reduce((groups: VersionGroups, version: BoxItemVersion): VersionGroups => {\n const currentGroup = last(groups);\n const groupHeading = getHeading({ intl, version });\n\n // Push a new group if there are no groups or if the heading has changed\n if (!currentGroup || currentGroup.groupHeading !== groupHeading) {\n groups.push({\n groupHeading,\n groupVersions: [],\n });\n }\n\n // Push the sorted version to the newest group's versions collection\n last(groups).groupVersions.push(version);\n return groups;\n }, []);\n\n return (\n <ul className=\"bcs-VersionsMenu\">\n {versionGroups.map(({ groupHeading, groupVersions }) => (\n <li className=\"bcs-VersionsMenu-item\" key={groupHeading}>\n <VersionsGroup currentId={currentId} heading={groupHeading} versions={groupVersions} {...rest} />\n </li>\n ))}\n </ul>\n );\n});\n\nexport default injectIntl(VersionsMenu);\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-ui-elements",
|
|
3
|
-
"version": "23.4.0-beta.
|
|
3
|
+
"version": "23.4.0-beta.18",
|
|
4
4
|
"description": "Box UI Elements",
|
|
5
5
|
"author": "Box (https://www.box.com/)",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
"@box/frontend": "^11.0.1",
|
|
138
138
|
"@box/item-icon": "^0.9.83",
|
|
139
139
|
"@box/languages": "^1.0.0",
|
|
140
|
-
"@box/metadata-editor": "^0.
|
|
140
|
+
"@box/metadata-editor": "^0.115.0",
|
|
141
141
|
"@box/react-virtualized": "9.22.3-rc-box.9",
|
|
142
142
|
"@cfaester/enzyme-adapter-react-18": "^0.8.0",
|
|
143
143
|
"@chromatic-com/storybook": "^1.6.1",
|
|
@@ -306,7 +306,7 @@
|
|
|
306
306
|
"@box/cldr-data": ">=34.2.0",
|
|
307
307
|
"@box/combobox-with-api": "^0.34.9",
|
|
308
308
|
"@box/item-icon": "^0.9.83",
|
|
309
|
-
"@box/metadata-editor": "^0.
|
|
309
|
+
"@box/metadata-editor": "^0.115.0",
|
|
310
310
|
"@box/react-virtualized": "9.22.3-rc-box.9",
|
|
311
311
|
"@hapi/address": "^2.1.4",
|
|
312
312
|
"axios": "^0.30.0",
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/* @flow */
|
|
2
2
|
|
|
3
|
+
// flow version is simplified compared to Type Script due to difficult to resolve problems with Union Types
|
|
4
|
+
// Type Script works better with Union Types
|
|
5
|
+
|
|
3
6
|
export const ViewType = Object.freeze({
|
|
4
7
|
BOXAI: 'boxai',
|
|
5
8
|
SKILLS: 'skills',
|
|
@@ -18,30 +21,13 @@ export const FeedEntryType = Object.freeze({
|
|
|
18
21
|
export type ViewTypeValues = $Values<typeof ViewType>;
|
|
19
22
|
export type FeedEntryTypeValues = $Values<typeof FeedEntryType>;
|
|
20
23
|
|
|
21
|
-
type
|
|
22
|
-
sidebar:
|
|
23
|
-
versionId
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
sidebar: 'activity',
|
|
28
|
-
activeFeedEntryType: 'annotations',
|
|
29
|
-
fileVersionId: string,
|
|
30
|
-
activeFeedEntryId: string,
|
|
24
|
+
export type SidebarNavigation = {
|
|
25
|
+
sidebar: ViewTypeValues,
|
|
26
|
+
versionId?: string,
|
|
27
|
+
activeFeedEntryType?: FeedEntryTypeValues,
|
|
28
|
+
activeFeedEntryId?: string,
|
|
29
|
+
fileVersionId?: string,
|
|
31
30
|
};
|
|
32
|
-
type ActivityCommentsSidebarView = {
|
|
33
|
-
sidebar: 'activity',
|
|
34
|
-
activeFeedEntryType: 'comments' | 'tasks',
|
|
35
|
-
activeFeedEntryId: string,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export type SidebarNavigation =
|
|
39
|
-
| {|
|
|
40
|
-
sidebar: ViewTypeValues,
|
|
41
|
-
|}
|
|
42
|
-
| VersionSidebarView
|
|
43
|
-
| ActivityCommentsSidebarView
|
|
44
|
-
| ActivityAnnotationsSidebarView;
|
|
45
31
|
|
|
46
32
|
export type InternalSidebarNavigation = SidebarNavigation & {
|
|
47
33
|
open: boolean,
|
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import VersionsList from './VersionsList';
|
|
9
9
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
10
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
10
11
|
import './VersionsGroup.scss';
|
|
11
12
|
|
|
12
13
|
type Props = {
|
|
13
14
|
fileId: string,
|
|
14
15
|
heading: string,
|
|
16
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
17
|
+
routerDisabled?: boolean,
|
|
15
18
|
versionCount: number,
|
|
16
19
|
versionLimit: number,
|
|
17
20
|
versions: Array<BoxItemVersion>,
|
|
@@ -8,33 +8,51 @@ import * as React from 'react';
|
|
|
8
8
|
import { Route } from 'react-router-dom';
|
|
9
9
|
import VersionsItem from './VersionsItem';
|
|
10
10
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
11
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
11
12
|
import './VersionsList.scss';
|
|
12
13
|
|
|
13
14
|
type Props = {
|
|
14
15
|
currentId?: string,
|
|
15
16
|
fileId: string,
|
|
17
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
18
|
+
routerDisabled?: boolean,
|
|
16
19
|
versionCount: number,
|
|
17
20
|
versionLimit: number,
|
|
18
21
|
versions: Array<BoxItemVersion>,
|
|
19
22
|
};
|
|
20
23
|
|
|
21
|
-
const VersionsList = ({ currentId, versions, ...rest }: Props) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
const VersionsList = ({ currentId, internalSidebarNavigation, routerDisabled = false, versions, ...rest }: Props) => {
|
|
25
|
+
const renderVersionItemWithoutRouter = (version: BoxItemVersion) => (
|
|
26
|
+
<VersionsItem
|
|
27
|
+
isCurrent={currentId === version.id}
|
|
28
|
+
isSelected={internalSidebarNavigation?.versionId === version.id}
|
|
29
|
+
version={version}
|
|
30
|
+
{...rest}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const renderVersionItemWithRouter = (version: BoxItemVersion) => (
|
|
35
|
+
<Route
|
|
36
|
+
render={({ match }) => (
|
|
37
|
+
<VersionsItem
|
|
38
|
+
isCurrent={currentId === version.id}
|
|
39
|
+
isSelected={match.params.versionId === version.id}
|
|
40
|
+
version={version}
|
|
41
|
+
{...rest}
|
|
34
42
|
/>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
)}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<ul className="bcs-VersionsList">
|
|
49
|
+
{versions.map(version => (
|
|
50
|
+
<li className="bcs-VersionsList-item" key={version.id}>
|
|
51
|
+
{routerDisabled ? renderVersionItemWithoutRouter(version) : renderVersionItemWithRouter(version)}
|
|
52
|
+
</li>
|
|
53
|
+
))}
|
|
54
|
+
</ul>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
39
57
|
|
|
40
58
|
export default VersionsList;
|
|
@@ -11,11 +11,14 @@ import * as util from '../../../utils/datetime';
|
|
|
11
11
|
import messages from './messages';
|
|
12
12
|
import VersionsGroup from './VersionsGroup';
|
|
13
13
|
import type { BoxItemVersion } from '../../../common/types/core';
|
|
14
|
+
import type { InternalSidebarNavigation } from '../../common/types/SidebarNavigation';
|
|
14
15
|
import './VersionsMenu.scss';
|
|
15
16
|
|
|
16
17
|
type Props = {
|
|
17
18
|
fileId: string,
|
|
18
19
|
intl: any,
|
|
20
|
+
internalSidebarNavigation?: InternalSidebarNavigation,
|
|
21
|
+
routerDisabled?: boolean,
|
|
19
22
|
versionCount: number,
|
|
20
23
|
versionLimit: number,
|
|
21
24
|
versions: Array<BoxItemVersion>,
|
|
@@ -1,23 +1,148 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { MemoryRouter, Route } from 'react-router-dom';
|
|
3
|
+
import { render, screen } from '../../../../test-utils/testing-library';
|
|
3
4
|
import VersionsList from '../VersionsList';
|
|
4
5
|
|
|
6
|
+
jest.mock('../VersionsItem', () => {
|
|
7
|
+
const MockVersionsItem = jest.fn(({ isCurrent, isSelected, version, fileId, versionCount, versionLimit }) => (
|
|
8
|
+
<div data-testid={`versions-item-${version.id}`}>
|
|
9
|
+
<span>Version {version.id}</span>
|
|
10
|
+
{isCurrent && <span>Current</span>}
|
|
11
|
+
{isSelected && <span>Selected</span>}
|
|
12
|
+
{fileId && <span>FileID: {fileId}</span>}
|
|
13
|
+
{versionCount && <span>VersionCount: {versionCount}</span>}
|
|
14
|
+
{versionLimit && <span>VersionLimit: {versionLimit}</span>}
|
|
15
|
+
</div>
|
|
16
|
+
));
|
|
17
|
+
return MockVersionsItem;
|
|
18
|
+
});
|
|
19
|
+
|
|
5
20
|
describe('elements/content-sidebar/versions/VersionsList', () => {
|
|
6
|
-
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
jest.clearAllMocks();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const renderComponent = (props = {}, routePath = '/activity/versions/12345') => {
|
|
26
|
+
if (props.routerDisabled) {
|
|
27
|
+
return render(<VersionsList {...props} />);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return render(
|
|
31
|
+
<MemoryRouter initialEntries={[routePath]}>
|
|
32
|
+
<Route path="/:sidebar(activity|details)/versions/:versionId?">
|
|
33
|
+
<VersionsList {...props} />
|
|
34
|
+
</Route>
|
|
35
|
+
</MemoryRouter>,
|
|
36
|
+
);
|
|
37
|
+
};
|
|
7
38
|
|
|
8
39
|
describe('render', () => {
|
|
9
|
-
test
|
|
10
|
-
versions
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
40
|
+
test('should render empty list when no versions provided', () => {
|
|
41
|
+
renderComponent({ versions: [] });
|
|
42
|
+
const list = screen.getByRole('list');
|
|
43
|
+
const listItems = screen.queryAllByRole('listitem');
|
|
44
|
+
|
|
45
|
+
expect(list).toBeInTheDocument();
|
|
46
|
+
expect(listItems).toHaveLength(0);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('should render single version item', () => {
|
|
50
|
+
const versions = [{ id: '12345' }];
|
|
51
|
+
renderComponent({ versions });
|
|
52
|
+
const list = screen.getByRole('list');
|
|
53
|
+
const listItems = screen.getAllByRole('listitem');
|
|
54
|
+
|
|
55
|
+
expect(list).toBeInTheDocument();
|
|
56
|
+
expect(listItems).toHaveLength(1);
|
|
57
|
+
expect(screen.getByText('Version 12345')).toBeInTheDocument();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('should render multiple version items', () => {
|
|
61
|
+
const versions = [{ id: '12345' }, { id: '45678' }];
|
|
62
|
+
renderComponent({ versions });
|
|
63
|
+
const list = screen.getByRole('list');
|
|
64
|
+
const listItems = screen.getAllByRole('listitem');
|
|
65
|
+
|
|
66
|
+
expect(list).toBeInTheDocument();
|
|
67
|
+
expect(listItems).toHaveLength(2);
|
|
68
|
+
expect(screen.getByText('Version 12345')).toBeInTheDocument();
|
|
69
|
+
expect(screen.getByText('Version 45678')).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('should pass correct isCurrent prop based on currentId', () => {
|
|
73
|
+
const versions = [{ id: '12345' }, { id: '67890' }];
|
|
74
|
+
const currentId = '12345';
|
|
75
|
+
renderComponent({ versions, currentId, routerDisabled: true });
|
|
76
|
+
|
|
77
|
+
// Version 12345 should be marked as current
|
|
78
|
+
const version12345Container = screen.getByTestId('versions-item-12345');
|
|
79
|
+
expect(version12345Container).toBeInTheDocument();
|
|
80
|
+
expect(screen.getByText('Current')).toBeInTheDocument();
|
|
81
|
+
|
|
82
|
+
// Only one "Current" text should exist
|
|
83
|
+
expect(screen.getAllByText('Current')).toHaveLength(1);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('should use router selection when routerDisabled is false', () => {
|
|
87
|
+
const versions = [{ id: '12345' }, { id: '67890' }];
|
|
88
|
+
renderComponent({ versions, routerDisabled: false }, '/activity/versions/12345');
|
|
89
|
+
|
|
90
|
+
// Version 12345 should be marked as selected based on route
|
|
91
|
+
const version12345Container = screen.getByTestId('versions-item-12345');
|
|
92
|
+
expect(version12345Container).toBeInTheDocument();
|
|
93
|
+
expect(version12345Container).toHaveTextContent('Selected');
|
|
94
|
+
expect(screen.getAllByText('Selected')).toHaveLength(1);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('should use internalSidebarNavigation selection when routerDisabled is true', () => {
|
|
98
|
+
const versions = [{ id: '12345' }, { id: '67890' }];
|
|
99
|
+
const internalSidebarNavigation = { versionId: '67890', open: true };
|
|
100
|
+
|
|
101
|
+
renderComponent({
|
|
102
|
+
versions,
|
|
103
|
+
routerDisabled: true,
|
|
104
|
+
internalSidebarNavigation,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Version 67890 should be marked as selected based on internal navigation
|
|
108
|
+
const version67890Container = screen.getByTestId('versions-item-67890');
|
|
109
|
+
expect(version67890Container).toBeInTheDocument();
|
|
110
|
+
expect(version67890Container).toHaveTextContent('Selected');
|
|
111
|
+
expect(screen.getAllByText('Selected')).toHaveLength(1);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('should handle no selection when internalSidebarNavigation is not provided', () => {
|
|
115
|
+
const versions = [{ id: '12345' }, { id: '67890' }];
|
|
116
|
+
|
|
117
|
+
renderComponent({ versions, routerDisabled: true });
|
|
118
|
+
|
|
119
|
+
// No version should be selected
|
|
120
|
+
expect(screen.queryByText('Selected')).not.toBeInTheDocument();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('should render items with correct version IDs', () => {
|
|
124
|
+
const versions = [{ id: 'version-abc' }, { id: 'version-xyz' }];
|
|
125
|
+
|
|
126
|
+
renderComponent({ versions, routerDisabled: true });
|
|
127
|
+
|
|
128
|
+
expect(screen.getByText('Version version-abc')).toBeInTheDocument();
|
|
129
|
+
expect(screen.getByText('Version version-xyz')).toBeInTheDocument();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('should pass down other props to VersionsItem', () => {
|
|
133
|
+
const versions = [{ id: '12345' }];
|
|
134
|
+
const props = {
|
|
135
|
+
versions,
|
|
136
|
+
fileId: 'f_123',
|
|
137
|
+
versionCount: 10,
|
|
138
|
+
versionLimit: 100,
|
|
139
|
+
routerDisabled: true,
|
|
18
140
|
};
|
|
19
|
-
|
|
20
|
-
|
|
141
|
+
renderComponent(props);
|
|
142
|
+
|
|
143
|
+
expect(screen.getByText('FileID: f_123')).toBeInTheDocument();
|
|
144
|
+
expect(screen.getByText('VersionCount: 10')).toBeInTheDocument();
|
|
145
|
+
expect(screen.getByText('VersionLimit: 100')).toBeInTheDocument();
|
|
21
146
|
});
|
|
22
147
|
});
|
|
23
148
|
});
|