@rpcbase/client 0.227.0 → 0.231.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.
- package/package.json +11 -113
- package/src/apiClient/getServerApiClient.ts +131 -0
- package/src/apiClient/index.ts +86 -0
- package/src/index.ts +3 -0
- package/src/initClient.ts +32 -0
- package/src/types.ts +7 -0
- package/AppProvider/AnalyticsContainer.js +0 -56
- package/AppProvider/debug.js +0 -4
- package/AppProvider/index.tsx +0 -79
- package/access-control/ACLForm/components/GrantField/OpSelector.tsx +0 -129
- package/access-control/ACLForm/components/GrantField/ResourceSelector.tsx +0 -86
- package/access-control/ACLForm/components/GrantField/UsersSelector.tsx +0 -96
- package/access-control/ACLForm/components/GrantField/grant-field.scss +0 -26
- package/access-control/ACLForm/components/GrantField/icons/CheckMark.tsx +0 -16
- package/access-control/ACLForm/components/GrantField/icons/CollapseArrow.tsx +0 -14
- package/access-control/ACLForm/components/GrantField/icons/ExpandArrow.tsx +0 -14
- package/access-control/ACLForm/components/GrantField/index.tsx +0 -91
- package/access-control/ACLForm/components/GrantsList.tsx +0 -48
- package/access-control/ACLForm/components/RoleForm.tsx +0 -134
- package/access-control/ACLForm/components/RoleView.tsx +0 -115
- package/access-control/ACLForm/components/RolesList.tsx +0 -79
- package/access-control/ACLForm/components/constants.tsx +0 -1
- package/access-control/ACLForm/components/resolver.ts +0 -57
- package/access-control/ACLForm/components/role-form.scss +0 -19
- package/access-control/ACLForm/index.tsx +0 -48
- package/access-control/ACLModal/acl-modal.scss +0 -7
- package/access-control/ACLModal/index.tsx +0 -66
- package/access-control/PolicyEditor/TargetSelector/QueryBuilder.tsx +0 -48
- package/access-control/PolicyEditor/TargetSelector/index.tsx +0 -5
- package/access-control/PolicyEditor/TargetSelector/query-builder.scss +0 -9
- package/access-control/PolicyEditor/index.tsx +0 -165
- package/access-control/index.ts +0 -3
- package/apiClient.js +0 -15
- package/auth/authProps.js +0 -8
- package/auth/components/AccountsList/AccountListItem.js +0 -61
- package/auth/components/AccountsList/account-list-item.scss +0 -5
- package/auth/components/AccountsList/index.js +0 -17
- package/auth/components/Footer/index.js +0 -11
- package/auth/components/ForgotPassword/forgot-password.scss +0 -37
- package/auth/components/ForgotPassword/index.js +0 -114
- package/auth/components/SetNewPassword/index.js +0 -130
- package/auth/components/SetNewPassword/set-new-password.scss +0 -47
- package/auth/components/SignIn/SignInEmailForm.tsx +0 -115
- package/auth/components/SignIn/index.js +0 -69
- package/auth/components/SignIn/sign-in.scss +0 -56
- package/auth/components/SignOut/index.js +0 -144
- package/auth/components/SignOut/sign-out.scss +0 -34
- package/auth/components/SignUp/SignUpEmailForm.tsx +0 -98
- package/auth/components/SignUp/index.js +0 -66
- package/auth/components/SignUp/sign-up.scss +0 -56
- package/auth/getTenantId.js +0 -12
- package/auth/getUid.js +0 -11
- package/auth/helpers/redirectSignIn.native.js +0 -9
- package/auth/helpers/redirectSignIn.web.js +0 -7
- package/auth/index.js +0 -146
- package/auth/signOut.js +0 -20
- package/auth/useAuthRouter.js +0 -56
- package/env.d.ts +0 -3
- package/firebase/index.js +0 -1
- package/firebase/sw.js +0 -1
- package/form/FileInput/FileUploadContext.tsx +0 -162
- package/form/FileInput/FileUploadForm/index.tsx +0 -139
- package/form/FileInput/FileUploadForm/usePreventUnload.js +0 -21
- package/form/FileInput/UploadButton.tsx +0 -23
- package/form/FileInput/constants.ts +0 -16
- package/form/FileInput/file-input.scss +0 -1
- package/form/FileInput/index.tsx +0 -21
- package/form/FileInput/upload-worker/get_file_hash.js +0 -63
- package/form/FileInput/upload-worker/index.js +0 -16
- package/form/FileInput/upload-worker/no_compress_exts.ts +0 -33
- package/form/FileInput/upload-worker/upload_file.js +0 -129
- package/form/Form.tsx +0 -23
- package/form/Input.tsx +0 -62
- package/form/SubmitButton/index.tsx +0 -58
- package/form/hook-form.tsx +0 -7
- package/form/index.tsx +0 -5
- package/getBaseUrl.js +0 -14
- package/getObjectId.ts +0 -31
- package/hashState.js +0 -158
- package/helpers/createBatcher/index.js +0 -36
- package/helpers/getInitials.js +0 -39
- package/helpers/onReady.js +0 -15
- package/helpers/post.js +0 -18
- package/helpers/postRPC.js +0 -42
- package/helpers/useRPC.js +0 -41
- package/helpers/useStoredValue/batchedGetStoredValues.js +0 -30
- package/helpers/useStoredValue/index.js +0 -107
- package/helpers/useStoredValue/setStoredValues.js +0 -14
- package/i18n/en/rb.nav.json +0 -13
- package/i18n/en/rb.sign_in.json +0 -11
- package/i18n/en/rb.sign_out.json +0 -5
- package/i18n/fr/rb.sign_in.json +0 -11
- package/i18n/fr/rb.sign_out.json +0 -5
- package/i18n/index.js +0 -63
- package/index.js +0 -6
- package/isEqualValues.js +0 -47
- package/jest.config.js +0 -16
- package/notifications/Notification/index.js +0 -36
- package/notifications/Notification/notification.scss +0 -1
- package/notifications/NotificationItem/HeaderStatus.js +0 -93
- package/notifications/NotificationItem/index.js +0 -65
- package/notifications/NotificationItem/notification-item.scss +0 -25
- package/notifications/NotificationsContainer/index.js +0 -37
- package/notifications/NotificationsContainer/notifications-container.scss +0 -38
- package/notifications/NotificationsContainer/useLLTs.js +0 -28
- package/notifications/NotificationsContext/index.js +0 -71
- package/notifications/NotificationsContext/useNotificationsList.js +0 -75
- package/notifications/NotificationsSettingsModal/SettingsForm.js +0 -52
- package/notifications/NotificationsSettingsModal/index.js +0 -48
- package/notifications/NotificationsSettingsModal/notifications-settings.scss +0 -1
- package/notifications/config.js +0 -1
- package/notifications/index.js +0 -4
- package/page.js +0 -9
- package/publish-output.txt +0 -0
- package/rpc.js +0 -32
- package/rr-trace/get_fingerprint.js +0 -10
- package/rr-trace/get_perf_vitals.js +0 -24
- package/rr-trace/get_session_id.js +0 -29
- package/rr-trace/index.js +0 -138
- package/rr-trace/write_session_data.js +0 -86
- package/rts/boot.js +0 -3
- package/rts/getUseDocument.js +0 -21
- package/rts/getUseQuery/index.js +0 -233
- package/rts/getUseQuery/useData.js +0 -55
- package/rts/index.js +0 -10
- package/rts/rts.js +0 -243
- package/rts/signout.ts +0 -8
- package/rts/store/constants.js +0 -3
- package/rts/store/debug.js +0 -24
- package/rts/store/get_collection.js +0 -55
- package/rts/store/index.js +0 -100
- package/rts/store/replace_query_keys.js +0 -30
- package/rts/store/satisfies_projection.js +0 -32
- package/rts/store/update_docs.js +0 -47
- package/storage/index.jest.js +0 -15
- package/storage/index.native.js +0 -38
- package/storage/index.web.js +0 -25
- package/types.ts +0 -6
- package/ui/ActivityIndicator/index.js +0 -113
- package/ui/Avatar/index.native.js +0 -31
- package/ui/Avatar/index.web.js +0 -37
- package/ui/Avatar/styles.js +0 -41
- package/ui/ErrorBoundary/index.js +0 -12
- package/ui/ExpandableFloatView/exp.scss +0 -15
- package/ui/ExpandableFloatView/index.tsx +0 -123
- package/ui/ExpandableFloatView/useBackdrop.js +0 -45
- package/ui/LottiePlayer/LottiePlayer.js +0 -4
- package/ui/LottiePlayer/index.js +0 -8
- package/ui/Modal/HashStateModal.js +0 -30
- package/ui/Modal/Modal.js +0 -93
- package/ui/Modal/ModalForm/AlertBanner.js +0 -82
- package/ui/Modal/ModalForm/index.js +0 -188
- package/ui/Modal/ModalForm/modal-form.scss +0 -63
- package/ui/Modal/index.js +0 -10
- package/ui/Modal/modal.scss +0 -101
- package/ui/Modal/withHashStateModal.js +0 -24
- package/ui/RedboxError/index.js +0 -3
- package/ui/Search/SearchHistory/index.js +0 -45
- package/ui/Search/SearchHistory/search-history.scss +0 -9
- package/ui/Search/SearchHistory/useSearchHistory.tsx +0 -57
- package/ui/Search/SearchResults/index.tsx +0 -90
- package/ui/Search/index.tsx +0 -298
- package/ui/Search/search.scss +0 -0
- package/ui/SelectPills/index.tsx +0 -96
- package/ui/SelectPills/select-pills.scss +0 -66
- package/ui/Tabs/index.tsx +0 -161
- package/ui/Tabs/tabs.scss +0 -53
- package/ui/Tree/index.js +0 -257
- package/ui/Tree/model.js +0 -71
- package/ui/Tree/node.js +0 -112
- package/ui/Tree/tree.scss +0 -98
- package/ui/UserAvatar/default_colors.json +0 -82
- package/ui/UserAvatar/index.js +0 -55
- package/ui/View/index.tsx +0 -17
- package/ui/View/index.web.js +0 -44
- package/ui/animations/checkmark.json +0 -1
- package/ui/helpers/SizeContext/index.tsx +0 -11
- package/ui/helpers/helpers.scss +0 -61
- package/ui/helpers/index.ts +0 -6
- package/ui/helpers/stopEventPropagation.js +0 -5
- package/ui/helpers/useActiveListItemIndex/index.tsx +0 -45
- package/ui/helpers/useScrollSelectorIntoView/index.tsx +0 -14
- package/ui/helpers/useThrottledMeasure/index.js +0 -47
- package/ui/helpers/withSuspense/index.js +0 -37
- package/ui/icons/AddAccount.tsx +0 -5
- package/ui/icons/Billing.tsx +0 -6
- package/ui/icons/Close.tsx +0 -14
- package/ui/icons/Organization.tsx +0 -5
- package/ui/icons/Signout.tsx +0 -5
- package/ui/icons/index.tsx +0 -6
- package/ui/nav/AccountsDropdown/SwitchAccounts.tsx +0 -28
- package/ui/nav/AccountsDropdown/accounts-dropdown.scss +0 -51
- package/ui/nav/AccountsDropdown/index.tsx +0 -90
- package/ui/nav/AccountsToggle/index.tsx +0 -24
- package/ui/nav/ContentView/ContentViewContext.ts +0 -23
- package/ui/nav/ContentView/index.tsx +0 -115
- package/ui/nav/HeaderContainer/header.scss +0 -52
- package/ui/nav/HeaderContainer/index.tsx +0 -23
- package/ui/nav/HeaderContainer/variables.scss +0 -1
- package/ui/nav/MorphingDropdown/MorphingDropdownContext.tsx +0 -151
- package/ui/nav/MorphingDropdown/MorphingDropdownMenu.tsx +0 -38
- package/ui/nav/MorphingDropdown/MorphingDropdownPortal.tsx +0 -166
- package/ui/nav/MorphingDropdown/MorphingDropdownToggle.tsx +0 -34
- package/ui/nav/MorphingDropdown/index.tsx +0 -16
- package/ui/nav/MorphingDropdown/morphing-dropdown.scss +0 -35
- package/ui/nav/NotificationsDropdown/index.tsx +0 -52
- package/ui/nav/NotificationsDropdown/notifications-dropdown.scss +0 -5
- package/ui/nav/NotificationsToggle/NotificationsGlyph.tsx +0 -54
- package/ui/nav/NotificationsToggle/index.tsx +0 -12
- package/ui/nav/NotificationsToggle/notification-animation.json +0 -1
- package/ui/nav/NotificationsToggle/notifications-toggle.scss +0 -26
- package/ui/nav/SidebarContainer/index.tsx +0 -48
- package/ui/nav/SidebarContainer/sidebar-container.scss +0 -21
- package/ui/nav/SlideoutContainer/components/Body.tsx +0 -19
- package/ui/nav/SlideoutContainer/components/Header.tsx +0 -23
- package/ui/nav/SlideoutContainer/components/Wrapper.tsx +0 -46
- package/ui/nav/SlideoutContainer/index.tsx +0 -50
- package/ui/nav/SlideoutContainer/slideout-container.scss +0 -40
- package/ui/nav/index.ts +0 -13
- package/ui/oauth/GitHub.js +0 -38
- package/ui/oauth/getGitHubSigninUrl.js +0 -30
- package/ui/oauth/index.js +0 -9
- package/ui/oauth/oauth.scss +0 -16
- package/ui/sortable-hoc/AutoScroller.js +0 -76
- package/ui/sortable-hoc/DragHandle.js +0 -31
- package/ui/sortable-hoc/Manager.js +0 -54
- package/ui/sortable-hoc/README.md +0 -1
- package/ui/sortable-hoc/SortableContainer/defaultGetHelperDimensions.js +0 -7
- package/ui/sortable-hoc/SortableContainer/defaultShouldCancelStart.js +0 -24
- package/ui/sortable-hoc/SortableContainer/index.js +0 -994
- package/ui/sortable-hoc/SortableContainer/props.js +0 -81
- package/ui/sortable-hoc/SortableElement.js +0 -111
- package/ui/sortable-hoc/SortableHandle.js +0 -45
- package/ui/sortable-hoc/drag-handle.scss +0 -14
- package/ui/sortable-hoc/index.js +0 -9
- package/ui/sortable-hoc/utils.js +0 -292
- package/ui/springs.ts +0 -17
package/ui/Tabs/index.tsx
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import React, {useState, useEffect, useRef} from "react"
|
|
2
|
-
import _isEmpty from "lodash/isEmpty"
|
|
3
|
-
|
|
4
|
-
import stopEventPropagation from "../helpers/stopEventPropagation"
|
|
5
|
-
import {useThrottledMeasure} from "..//helpers/useThrottledMeasure"
|
|
6
|
-
|
|
7
|
-
import "./tabs.scss"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type Props = {
|
|
11
|
-
active: boolean,
|
|
12
|
-
onChange: () => void,
|
|
13
|
-
scrollIntoView: boolean
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const Tabs = (props: Props) => {
|
|
17
|
-
const els = useRef({})
|
|
18
|
-
|
|
19
|
-
// tracks drag movement, to prevent activating a tab if the user was just dragging the view arround
|
|
20
|
-
const dragRef = useRef(null)
|
|
21
|
-
|
|
22
|
-
const root = useRef(null)
|
|
23
|
-
const [containerRef, {width: rootWidth}] = useThrottledMeasure()
|
|
24
|
-
|
|
25
|
-
const [sizes, setSizes] = useState({})
|
|
26
|
-
const [isFirstRender, setIsFirstRender] = useState(true)
|
|
27
|
-
|
|
28
|
-
useEffect(() => {
|
|
29
|
-
const updateSizes = () => {
|
|
30
|
-
if (!root.current) {
|
|
31
|
-
return
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const rootBounds = root.current.getBoundingClientRect()
|
|
35
|
-
|
|
36
|
-
const newSizes = {}
|
|
37
|
-
|
|
38
|
-
Object.keys(els.current).forEach((key) => {
|
|
39
|
-
const el = els.current[key]
|
|
40
|
-
const bounds = el.getBoundingClientRect()
|
|
41
|
-
|
|
42
|
-
const left = bounds.left - rootBounds.left
|
|
43
|
-
const right = rootBounds.right - bounds.right
|
|
44
|
-
|
|
45
|
-
newSizes[key] = {left, right}
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
setSizes(newSizes)
|
|
49
|
-
return newSizes
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
requestAnimationFrame(() => {
|
|
53
|
-
updateSizes()
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
const handleResize = () => {
|
|
57
|
-
updateSizes()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
window.addEventListener("resize", handleResize)
|
|
61
|
-
|
|
62
|
-
return () => {
|
|
63
|
-
window.removeEventListener("resize", handleResize)
|
|
64
|
-
}
|
|
65
|
-
}, [rootWidth])
|
|
66
|
-
|
|
67
|
-
useEffect(() => {
|
|
68
|
-
if (!_isEmpty(sizes) && isFirstRender) {
|
|
69
|
-
requestAnimationFrame(() => {
|
|
70
|
-
setIsFirstRender(false)
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
}, [sizes])
|
|
74
|
-
|
|
75
|
-
const onMouseDown = (event) => {
|
|
76
|
-
dragRef.current = {
|
|
77
|
-
x: event.clientX,
|
|
78
|
-
y: event.clientY,
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const onMouseMove = (event) => {
|
|
83
|
-
if (dragRef.current) {
|
|
84
|
-
const distance = Math.sqrt(
|
|
85
|
-
Math.pow(event.clientX - dragRef.current.x, 2) +
|
|
86
|
-
Math.pow(event.clientY - dragRef.current.y, 2),
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
if (distance > 10) {
|
|
90
|
-
dragRef.current.hasDragged = true
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const getOnClickHandler = (child) => (event) => {
|
|
96
|
-
if (dragRef.current?.hasDragged) {
|
|
97
|
-
event.preventDefault()
|
|
98
|
-
} else {
|
|
99
|
-
const id = `tab-${child.key}`
|
|
100
|
-
const el = document.getElementById(id)
|
|
101
|
-
|
|
102
|
-
if (props.scrollIntoView) {
|
|
103
|
-
el?.scrollIntoView({behavior: "smooth", block: "end", inline: "nearest"})
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
props.onChange(child.key)
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
dragRef.current = null
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const getTransitionTime = () => (isFirstRender ? 0 : 200)
|
|
113
|
-
|
|
114
|
-
const getUnderlineStyle = () => {
|
|
115
|
-
if (props.active === null || Object.keys(sizes).length === 0) {
|
|
116
|
-
return {left: "0", right: "100%"}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const size = sizes[props.active]
|
|
120
|
-
|
|
121
|
-
if (!size) return {}
|
|
122
|
-
|
|
123
|
-
const transitionTime = getTransitionTime()
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
left: `${size.left}px`,
|
|
127
|
-
right: `${size.right}px`,
|
|
128
|
-
transition: `left ${transitionTime}ms, right ${transitionTime}ms`,
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return (
|
|
133
|
-
<div ref={containerRef} className="u-tabs-container">
|
|
134
|
-
<div
|
|
135
|
-
className={cx("u-tabs", props.className)}
|
|
136
|
-
onMouseDown={stopEventPropagation}
|
|
137
|
-
ref={root}
|
|
138
|
-
style={props.style}
|
|
139
|
-
>
|
|
140
|
-
{React.Children.map(props.children, (child, i) => {
|
|
141
|
-
if (!child) return null
|
|
142
|
-
|
|
143
|
-
return (
|
|
144
|
-
<div
|
|
145
|
-
id={`tab-${child.key}`}
|
|
146
|
-
className={cx([`u-tabs__Tab`, {active: child.key === props.active}])}
|
|
147
|
-
onMouseDown={onMouseDown}
|
|
148
|
-
onMouseMove={onMouseMove}
|
|
149
|
-
onClick={getOnClickHandler(child)}
|
|
150
|
-
ref={(el) => (els.current[child.key] = el)}
|
|
151
|
-
>
|
|
152
|
-
{child}
|
|
153
|
-
</div>
|
|
154
|
-
)
|
|
155
|
-
})}
|
|
156
|
-
|
|
157
|
-
<div className="u-tabs__Underline" style={getUnderlineStyle()} />
|
|
158
|
-
</div>
|
|
159
|
-
</div>
|
|
160
|
-
)
|
|
161
|
-
}
|
package/ui/Tabs/tabs.scss
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
@import "helpers";
|
|
2
|
-
|
|
3
|
-
$border-height: 3px;
|
|
4
|
-
|
|
5
|
-
/* stylelint-disable */
|
|
6
|
-
.u-tabs {
|
|
7
|
-
position: relative;
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-direction: row;
|
|
10
|
-
margin-bottom: $border-height;
|
|
11
|
-
|
|
12
|
-
// overflow-x: scroll;
|
|
13
|
-
// overflow-y: visible;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.u-tabs__Tab {
|
|
17
|
-
display: inline-block;
|
|
18
|
-
width: 100%;
|
|
19
|
-
padding: 4px 8px;
|
|
20
|
-
color: $gray-900;
|
|
21
|
-
cursor: pointer;
|
|
22
|
-
|
|
23
|
-
& > div {
|
|
24
|
-
display: flex;
|
|
25
|
-
flex-direction: row;
|
|
26
|
-
justify-content: center;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
&.active {
|
|
30
|
-
background-color: lighten($blue, 45%) !important;
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
|
|
33
|
-
// &:first-child {
|
|
34
|
-
// border-top-left-radius: 3px;
|
|
35
|
-
// }
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
&:hover:not(.active) {
|
|
39
|
-
color: $primary;
|
|
40
|
-
|
|
41
|
-
svg path {
|
|
42
|
-
fill: $primary;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.u-tabs__Underline {
|
|
48
|
-
position: absolute;
|
|
49
|
-
top: 100%;
|
|
50
|
-
left: 0;
|
|
51
|
-
right: 0;
|
|
52
|
-
border-bottom: $border-height solid $primary;
|
|
53
|
-
}
|
package/ui/Tree/index.js
DELETED
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
/* @flow */
|
|
2
|
-
import * as React from "react"
|
|
3
|
-
|
|
4
|
-
import TreeModel from "./model"
|
|
5
|
-
import Node from "./node"
|
|
6
|
-
|
|
7
|
-
import "./tree.scss"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type Props = {|
|
|
11
|
-
id: String,
|
|
12
|
-
tree: Object,
|
|
13
|
-
paddingLeft: number,
|
|
14
|
-
renderNode: () => any,
|
|
15
|
-
onChange: ?Function,
|
|
16
|
-
style?: Object,
|
|
17
|
-
disableDragging?: boolean,
|
|
18
|
-
shouldHideNode?: (nodeProps) => boolean,
|
|
19
|
-
|}
|
|
20
|
-
|
|
21
|
-
type State = {|
|
|
22
|
-
tree: Object,
|
|
23
|
-
dragging: Object,
|
|
24
|
-
|}
|
|
25
|
-
|
|
26
|
-
export class Tree extends React.Component<Props, State> {
|
|
27
|
-
static defaultProps = {
|
|
28
|
-
paddingLeft: 10,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
dragging: Object
|
|
32
|
-
_updated: boolean
|
|
33
|
-
_startX: number
|
|
34
|
-
_startY: number
|
|
35
|
-
_offsetX: number
|
|
36
|
-
_offsetY: number
|
|
37
|
-
_start: boolean
|
|
38
|
-
|
|
39
|
-
constructor(props: Props) {
|
|
40
|
-
super(props)
|
|
41
|
-
this.state = this.init(props)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
UNSAFE_componentWillReceiveProps(nextProps: Props) {
|
|
45
|
-
if (!this._updated) {
|
|
46
|
-
this.setState(this.init(nextProps))
|
|
47
|
-
} else {
|
|
48
|
-
this._updated = false
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
init = (props: Props) => {
|
|
53
|
-
const tree = new TreeModel(props.tree)
|
|
54
|
-
tree.renderNode = props.renderNode
|
|
55
|
-
tree.updateNodesPosition()
|
|
56
|
-
|
|
57
|
-
return {
|
|
58
|
-
tree: tree,
|
|
59
|
-
dragging: {
|
|
60
|
-
id: null,
|
|
61
|
-
x: null,
|
|
62
|
-
y: null,
|
|
63
|
-
w: null,
|
|
64
|
-
h: null,
|
|
65
|
-
},
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
renderDraggingElement = () => {
|
|
70
|
-
const {tree, dragging} = this.state
|
|
71
|
-
|
|
72
|
-
if (dragging?.id) {
|
|
73
|
-
const draggingIndex = tree.getIndex(dragging.id)
|
|
74
|
-
const draggingStyles = {
|
|
75
|
-
top: dragging.y,
|
|
76
|
-
left: dragging.x,
|
|
77
|
-
width: dragging.w,
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return (
|
|
81
|
-
<div className="m-draggable" style={draggingStyles}>
|
|
82
|
-
<Node
|
|
83
|
-
tree={tree}
|
|
84
|
-
index={draggingIndex}
|
|
85
|
-
paddingLeft={this.props.paddingLeft}
|
|
86
|
-
shouldHideNode={this.props.shouldHideNode}
|
|
87
|
-
/>
|
|
88
|
-
</div>
|
|
89
|
-
)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return null
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
dragStart = (id: number, dom: HTMLElement, e: SyntheticMouseEvent<HTMLElement>) => {
|
|
96
|
-
if (e.button !== 0) return
|
|
97
|
-
this.dragging = {
|
|
98
|
-
id: id,
|
|
99
|
-
w: dom.offsetWidth,
|
|
100
|
-
h: dom.offsetHeight,
|
|
101
|
-
x: dom.offsetLeft,
|
|
102
|
-
y: dom.offsetTop,
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
this._startX = dom.offsetLeft
|
|
106
|
-
this._startY = dom.offsetTop
|
|
107
|
-
this._offsetX = e.clientX
|
|
108
|
-
this._offsetY = e.clientY
|
|
109
|
-
this._start = true
|
|
110
|
-
|
|
111
|
-
window.addEventListener("mousemove", this.dragMouseMove)
|
|
112
|
-
window.addEventListener("mouseup", this.dragEnd)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
//
|
|
116
|
-
dragMouseMove = (e: SyntheticMouseEvent<HTMLElement>) => {
|
|
117
|
-
if (this._start) {
|
|
118
|
-
this.setState({
|
|
119
|
-
dragging: this.dragging,
|
|
120
|
-
})
|
|
121
|
-
this._start = false
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const {tree} = this.state
|
|
125
|
-
const dragging = this.dragging
|
|
126
|
-
const paddingLeft = this.props.paddingLeft
|
|
127
|
-
let newIndex = null
|
|
128
|
-
let index = tree.getIndex(dragging.id)
|
|
129
|
-
const collapsed = index.node.collapsed
|
|
130
|
-
|
|
131
|
-
const _startX = this._startX
|
|
132
|
-
const _startY = this._startY
|
|
133
|
-
const _offsetX = this._offsetX
|
|
134
|
-
const _offsetY = this._offsetY
|
|
135
|
-
|
|
136
|
-
const pos = {
|
|
137
|
-
x: _startX + e.clientX - _offsetX,
|
|
138
|
-
y: _startY + e.clientY - _offsetY,
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
dragging.x = pos.x
|
|
142
|
-
dragging.y = pos.y
|
|
143
|
-
|
|
144
|
-
const diffX = dragging.x - paddingLeft / 2 - (index.left - 2) * paddingLeft
|
|
145
|
-
const diffY = dragging.y - dragging.h / 2 - (index.top - 2) * dragging.h
|
|
146
|
-
|
|
147
|
-
if (diffX < 0) {
|
|
148
|
-
// left
|
|
149
|
-
if (index.parent && !index.next) {
|
|
150
|
-
newIndex = tree.move(index.id, index.parent, "after")
|
|
151
|
-
}
|
|
152
|
-
} else if (diffX > paddingLeft) {
|
|
153
|
-
// right
|
|
154
|
-
if (index.prev) {
|
|
155
|
-
const prevNode = tree.getIndex(index.prev).node
|
|
156
|
-
if (!prevNode.collapsed && !prevNode.leaf) {
|
|
157
|
-
newIndex = tree.move(index.id, index.prev, "append")
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (newIndex) {
|
|
163
|
-
index = newIndex
|
|
164
|
-
newIndex.node.collapsed = collapsed
|
|
165
|
-
dragging.id = newIndex.id
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (diffY < 0) {
|
|
169
|
-
// up
|
|
170
|
-
const above = tree.getNodeByTop(index.top - 1)
|
|
171
|
-
newIndex = tree.move(index.id, above.id, "before")
|
|
172
|
-
} else if (diffY > dragging.h) {
|
|
173
|
-
// down
|
|
174
|
-
if (index.next) {
|
|
175
|
-
const below = tree.getIndex(index.next)
|
|
176
|
-
if (below.children && below.children.length && !below.node.collapsed) {
|
|
177
|
-
newIndex = tree.move(index.id, index.next, "prepend")
|
|
178
|
-
} else {
|
|
179
|
-
newIndex = tree.move(index.id, index.next, "after")
|
|
180
|
-
}
|
|
181
|
-
} else {
|
|
182
|
-
const below = tree.getNodeByTop(index.top + index.height)
|
|
183
|
-
if (below && below.parent !== index.id) {
|
|
184
|
-
if (below.children && below.children.length && !below.node.collapsed) {
|
|
185
|
-
newIndex = tree.move(index.id, below.id, "prepend")
|
|
186
|
-
} else {
|
|
187
|
-
newIndex = tree.move(index.id, below.id, "after")
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (newIndex) {
|
|
194
|
-
newIndex.node.collapsed = collapsed
|
|
195
|
-
dragging.id = newIndex.id
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
this.setState({
|
|
199
|
-
tree: tree,
|
|
200
|
-
dragging: dragging,
|
|
201
|
-
})
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
dragEnd = () => {
|
|
205
|
-
this.setState({
|
|
206
|
-
dragging: {
|
|
207
|
-
id: null,
|
|
208
|
-
x: null,
|
|
209
|
-
y: null,
|
|
210
|
-
w: null,
|
|
211
|
-
h: null,
|
|
212
|
-
},
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
this.change(this.state.tree)
|
|
216
|
-
window.removeEventListener("mousemove", this.dragMouseMove)
|
|
217
|
-
window.removeEventListener("mouseup", this.dragEnd)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
change = (tree: Object) => {
|
|
221
|
-
this._updated = true
|
|
222
|
-
if (this.props.onChange) this.props.onChange(tree.obj)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
toggleCollapse = (nodeId: number) => {
|
|
226
|
-
const {tree} = this.state
|
|
227
|
-
const index = tree.getIndex(nodeId)
|
|
228
|
-
const node = index.node
|
|
229
|
-
node.collapsed = !node.collapsed
|
|
230
|
-
tree.updateNodesPosition()
|
|
231
|
-
|
|
232
|
-
this.setState({tree})
|
|
233
|
-
|
|
234
|
-
this.change(tree)
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
render() {
|
|
238
|
-
const tree = this.state.tree
|
|
239
|
-
const dragging = this.state.dragging
|
|
240
|
-
|
|
241
|
-
return (
|
|
242
|
-
<div id={this.props.id} className="m-tree" style={this.props.style || {}}>
|
|
243
|
-
{this.renderDraggingElement()}
|
|
244
|
-
<Node
|
|
245
|
-
tree={tree}
|
|
246
|
-
index={tree.getIndex(1)}
|
|
247
|
-
key={1}
|
|
248
|
-
paddingLeft={this.props.paddingLeft}
|
|
249
|
-
onDragStart={this.props.disableDragging ? null : this.dragStart}
|
|
250
|
-
onCollapse={this.toggleCollapse}
|
|
251
|
-
dragging={dragging?.id}
|
|
252
|
-
shouldHideNode={this.props.shouldHideNode}
|
|
253
|
-
/>
|
|
254
|
-
</div>
|
|
255
|
-
)
|
|
256
|
-
}
|
|
257
|
-
}
|
package/ui/Tree/model.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/* @flow */
|
|
2
|
-
/* eslint-disable */
|
|
3
|
-
const Tree = require("js-tree")
|
|
4
|
-
|
|
5
|
-
const proto = Tree.prototype
|
|
6
|
-
|
|
7
|
-
proto.updateNodesPosition = function () {
|
|
8
|
-
let top = 1
|
|
9
|
-
let left = 1
|
|
10
|
-
let root = this.getIndex(1)
|
|
11
|
-
let self = this
|
|
12
|
-
|
|
13
|
-
root.top = top++
|
|
14
|
-
root.left = left++
|
|
15
|
-
|
|
16
|
-
if (root.children && root.children.length) {
|
|
17
|
-
walk(root.children, root, left, root.node.collapsed)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function walk(children, parent, left, collapsed) {
|
|
21
|
-
var height = 1
|
|
22
|
-
children.forEach(function (id) {
|
|
23
|
-
var node = self.getIndex(id)
|
|
24
|
-
if (collapsed) {
|
|
25
|
-
node.top = null
|
|
26
|
-
node.left = null
|
|
27
|
-
} else {
|
|
28
|
-
node.top = top++
|
|
29
|
-
node.left = left
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (node.children && node.children.length) {
|
|
33
|
-
height += walk(node.children, node, left + 1, collapsed || node.node.collapsed)
|
|
34
|
-
} else {
|
|
35
|
-
node.height = 1
|
|
36
|
-
height += 1
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
if (parent.node.collapsed) parent.height = 1
|
|
41
|
-
else parent.height = height
|
|
42
|
-
return parent.height
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
proto.move = function (fromId, toId, placement) {
|
|
47
|
-
if (fromId === toId || toId === 1) return
|
|
48
|
-
|
|
49
|
-
var obj = this.remove(fromId)
|
|
50
|
-
var index = null
|
|
51
|
-
|
|
52
|
-
if (placement === "before") index = this.insertBefore(obj, toId)
|
|
53
|
-
else if (placement === "after") index = this.insertAfter(obj, toId)
|
|
54
|
-
else if (placement === "prepend") index = this.prepend(obj, toId)
|
|
55
|
-
else if (placement === "append") index = this.append(obj, toId)
|
|
56
|
-
|
|
57
|
-
// todo: perf
|
|
58
|
-
this.updateNodesPosition()
|
|
59
|
-
return index
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
proto.getNodeByTop = function (top) {
|
|
63
|
-
var indexes = this.indexes
|
|
64
|
-
for (var id in indexes) {
|
|
65
|
-
if (indexes.hasOwnProperty(id)) {
|
|
66
|
-
if (indexes[id].top === top) return indexes[id]
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
module.exports = Tree
|
package/ui/Tree/node.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/* @flow */
|
|
2
|
-
import React, {Component} from "react"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
type Props = {|
|
|
6
|
-
paddingLeft: number,
|
|
7
|
-
index: Object,
|
|
8
|
-
tree: Object,
|
|
9
|
-
dragging?: ?boolean,
|
|
10
|
-
onDragStart?: ?Function,
|
|
11
|
-
onCollapse?: ?Function,
|
|
12
|
-
shouldHideNode?: () => boolean,
|
|
13
|
-
|}
|
|
14
|
-
|
|
15
|
-
type State = {}
|
|
16
|
-
|
|
17
|
-
export default class UITreeNode extends Component<Props, State> {
|
|
18
|
-
innerRef = React.createRef<HTMLDivElement>()
|
|
19
|
-
|
|
20
|
-
renderCollapse = () => {
|
|
21
|
-
const {index} = this.props
|
|
22
|
-
|
|
23
|
-
if (index.children && index.children.length) {
|
|
24
|
-
const {collapsed} = index.node
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div
|
|
28
|
-
className={cx("tree-collapse", collapsed ? "caret-right" : "caret-down")}
|
|
29
|
-
onMouseDown={(e) => e.stopPropagation()}
|
|
30
|
-
onClick={this.handleCollapse}
|
|
31
|
-
/>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return null
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
renderChildren = () => {
|
|
39
|
-
const {index, tree, dragging} = this.props
|
|
40
|
-
|
|
41
|
-
if (index.children && index.children.length) {
|
|
42
|
-
const childrenStyles = {
|
|
43
|
-
paddingLeft: this.props.paddingLeft,
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return (
|
|
47
|
-
<div className="children" style={childrenStyles}>
|
|
48
|
-
{index.children.map((child) => {
|
|
49
|
-
const childIndex = tree.getIndex(child)
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<UITreeNode
|
|
53
|
-
tree={tree}
|
|
54
|
-
index={childIndex}
|
|
55
|
-
key={childIndex.id}
|
|
56
|
-
dragging={dragging}
|
|
57
|
-
paddingLeft={this.props.paddingLeft}
|
|
58
|
-
onCollapse={this.props.onCollapse}
|
|
59
|
-
onDragStart={this.props.onDragStart}
|
|
60
|
-
/>
|
|
61
|
-
)
|
|
62
|
-
})}
|
|
63
|
-
</div>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return null
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
handleCollapse = (e: SyntheticMouseEvent<HTMLElement>) => {
|
|
71
|
-
e.stopPropagation()
|
|
72
|
-
const nodeId = this.props.index.id
|
|
73
|
-
|
|
74
|
-
if (this.props.onCollapse) {
|
|
75
|
-
this.props.onCollapse(nodeId)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
handleMouseDown = (e: SyntheticMouseEvent<HTMLDivElement>) => {
|
|
80
|
-
const nodeId = this.props.index.id
|
|
81
|
-
const dom = this.innerRef.current
|
|
82
|
-
|
|
83
|
-
if (this.props.onDragStart) {
|
|
84
|
-
this.props.onDragStart(nodeId, dom, e)
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
render() {
|
|
89
|
-
const {tree, index, dragging, shouldHideNode} = this.props
|
|
90
|
-
const {node} = index
|
|
91
|
-
const styles = {}
|
|
92
|
-
|
|
93
|
-
if (typeof shouldHideNode === "function" && shouldHideNode(index)) {
|
|
94
|
-
return this.renderChildren()
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return (
|
|
98
|
-
<div
|
|
99
|
-
className={cx("m-node", {
|
|
100
|
-
placeholder: index.id === dragging,
|
|
101
|
-
})}
|
|
102
|
-
style={styles}
|
|
103
|
-
>
|
|
104
|
-
<div className="d-flex flex-row align-items-center inner" ref={this.innerRef} onMouseDown={this.handleMouseDown}>
|
|
105
|
-
{this.renderCollapse()}
|
|
106
|
-
{tree.renderNode(node)}
|
|
107
|
-
</div>
|
|
108
|
-
{node.collapsed ? null : this.renderChildren()}
|
|
109
|
-
</div>
|
|
110
|
-
)
|
|
111
|
-
}
|
|
112
|
-
}
|