From 0ff1cc97d4d36a573db33b4db2f2c501dcb91383 Mon Sep 17 00:00:00 2001 From: Romaric Mourgues Date: Tue, 18 Apr 2023 11:22:14 +0200 Subject: [PATCH] Clean frontend files --- tdrive/frontend/src/app/app.tsx | 6 +- .../src/app/atoms/link/link.stories.tsx | 10 +- .../add-user-button/add-user-button.scss | 18 - .../add-user-button/add-user-button.tsx | 40 - .../attachment-picker/attachment-picker.jsx | 199 ---- .../attachment-picker/attachment-picker.scss | 39 - .../calendar-selector/calendar-selector.jsx | 159 ---- .../calendar-selector/calendar-selector.scss | 61 -- .../app/components/calendar/date-picker.jsx | 423 --------- .../app/components/calendar/date-picker.scss | 18 - .../calendar/day-picker/day-picker.jsx | 164 ---- .../calendar/day-picker/day-picker.scss | 97 -- .../app/components/calendar/event/event.jsx | 123 --- .../app/components/calendar/event/event.scss | 144 --- .../app/components/calendar/time-selector.jsx | 121 --- .../channel-attachement-list.tsx | 44 - .../parts/channel-attachment.tsx | 176 ---- .../parts/channel-files.tsx | 36 - .../parts/channel-medias.tsx | 44 - .../channel-attachement-list/parts/commun.tsx | 22 - .../channel-members-modal.tsx | 178 ---- .../channel-members-list/email-item.tsx | 106 --- .../channel-members-list/member-item.tsx | 81 -- .../channel-members-list/user-item.tsx | 100 -- .../users-search-modal.tsx | 19 - .../components/channels-selector/index.tsx | 164 ---- .../company-messages-counter.scss | 11 - .../company-messages-counter.tsx | 71 -- .../components-tester/component-doc.jsx | 59 -- .../components-tester/component-doc.scss | 50 - .../components-tester/components-tester.jsx | 370 -------- .../components-tester/components-tester.scss | 19 - .../components-tester/group/inputs.jsx | 124 --- .../connection-indicator.tsx | 6 +- .../connectors-list-manager.jsx | 6 +- .../app/components/desktop-redirect/index.tsx | 16 +- .../download-app-banner.tsx | 2 +- .../draggable/draggable-body-layer.jsx | 23 - .../components/draggable/draggable-manager.js | 238 ----- .../app/components/draggable/draggable.scss | 87 -- .../app/components/draggable/draggable.tsx | 44 - .../components/draggable/droppable-zone.jsx | 74 -- .../src/app/components/drive/directory.jsx | 87 -- .../app/components/drive/drive-element.jsx | 645 ------------- .../components/drive/drive-multi-selector.jsx | 278 ------ .../drive/drive-multi-selector.scss | 28 - .../src/app/components/drive/drive.scss | 522 ----------- .../drive/file-picker/file-picker.jsx | 213 ----- .../drive/file-picker/file-picker.scss | 84 -- .../src/app/components/drive/file.tsx | 91 -- .../app/components/drive/icons/archive.jsx | 19 - .../app/components/drive/icons/archive.svg | 15 - .../src/app/components/drive/icons/code.jsx | 19 - .../src/app/components/drive/icons/code.svg | 17 - .../app/components/drive/icons/document.jsx | 20 - .../app/components/drive/icons/document.svg | 16 - .../src/app/components/drive/icons/file.jsx | 19 - .../src/app/components/drive/icons/file.svg | 9 - .../src/app/components/drive/icons/image.jsx | 24 - .../src/app/components/drive/icons/image.svg | 16 - .../src/app/components/drive/icons/link.jsx | 24 - .../src/app/components/drive/icons/link.svg | 16 - .../src/app/components/drive/icons/pdf.jsx | 19 - .../src/app/components/drive/icons/pdf.svg | 30 - .../src/app/components/drive/icons/slides.jsx | 25 - .../src/app/components/drive/icons/slides.svg | 17 - .../src/app/components/drive/icons/sound.jsx | 19 - .../src/app/components/drive/icons/sound.svg | 11 - .../components/drive/icons/spreadsheet.jsx | 28 - .../components/drive/icons/spreadsheet.svg | 16 - .../src/app/components/drive/icons/svg.jsx | 33 - .../src/app/components/drive/icons/svg.svg | 37 - .../src/app/components/drive/icons/video.jsx | 19 - .../src/app/components/drive/icons/video.svg | 7 - .../src/app/components/drive/ui/directory.jsx | 56 -- .../src/app/components/drive/ui/file-type.jsx | 63 -- .../src/app/components/drive/ui/file.jsx | 118 --- .../app/components/drive/version-details.jsx | 128 --- .../edit-channel/channel-access.tsx | 101 -- .../edit-channel/channel-information.tsx | 248 ----- .../edit-channel/channel-notifications.tsx | 89 -- .../edit-channel/channel-settings-menu.tsx | 368 -------- .../src/app/components/edit-channel/index.tsx | 261 ------ .../editable-text/editable-text.jsx | 26 - .../editable-text/editable-text.scss | 19 - .../components/emoji-picker/emoji-picker.jsx | 142 --- .../components/emoji-picker/emoji-picker.scss | 19 - .../pending-file-row.tsx | 8 +- .../pending-files-list.tsx | 6 +- .../file-uploads/uploads-viewer.tsx | 2 +- .../app/components/file/file-component.tsx | 166 ---- .../src/app/components/file/file.scss | 160 ---- .../src/app/components/file/parts/actions.tsx | 152 --- .../src/app/components/file/parts/details.tsx | 37 - .../src/app/components/file/parts/index.ts | 4 - .../components/file/parts/large-preview.tsx | 33 - .../app/components/file/parts/progress.tsx | 61 -- .../app/components/file/parts/thumbnail.tsx | 42 - .../frontend/src/app/components/file/types.ts | 9 - .../app/components/forward-message/index.tsx | 103 --- .../highlighted-code/highlighted-code.tsx | 52 -- .../input-with-clip-board.jsx | 2 +- .../src/app/components/inputs/input-enter.jsx | 2 +- .../src/app/components/inputs/input-icon.jsx | 2 +- .../components/inputs/input-with-button.jsx | 4 +- .../components/inputs/input-with-color.jsx | 2 +- .../app/components/inputs/input-with-icon.tsx | 203 ---- .../components/inputs/input-with-select.scss | 47 - .../components/inputs/input-with-select.tsx | 105 --- .../app/components/invitation/invitation.tsx | 116 --- .../parts/allow-anyone-by-email.tsx | 62 -- .../invitation/parts/bulk-invitation.tsx | 10 - .../parts/custom-role-invitation.tsx | 10 - .../invitation/parts/invitation-channels.tsx | 44 - .../parts/invitation-input-bulk.tsx | 85 -- .../parts/invitation-input-list.tsx | 147 --- .../invitation/parts/invitation-sent.tsx | 53 -- .../invitation/parts/invitation-target.tsx | 53 -- .../invitation/parts/reached-limit.tsx | 15 - .../invitation/parts/workspace-link.tsx | 57 -- .../components/loader/application-loader.tsx | 2 +- .../feature-toggles-hooks.tsx | 4 +- .../locked-drive-popup/locked-drive-popup.tsx | 128 ++- .../locked-guests-popup.tsx | 8 +- .../locked-history-banner.tsx | 16 +- .../locked-invite-alert/index.tsx | 11 +- .../locked-only-office-popup.tsx | 130 ++- .../locked-workspace-popup.tsx | 128 ++- .../app/components/main-plus/main-plus.jsx | 24 - .../app/components/main-plus/main-plus.scss | 0 .../src/app/components/member/user-parts.tsx | 12 +- .../app/components/menus/menu-component.jsx | 4 +- .../src/app/components/menus/menu.jsx | 2 +- .../app/components/menus/menus-body-layer.jsx | 2 +- .../app/components/menus/menus-manager.jsx | 6 +- .../message-seen-by/message-seen-by.tsx | 68 -- .../app/components/mobile-redirect/index.tsx | 2 +- .../app/components/modal/modal-component.tsx | 2 +- .../src/app/components/modal/modal-manager.ts | 4 +- .../new-version/new-version-component.tsx | 14 +- .../new-version/new-version-modal.tsx | 2 +- .../object-modal/deprecated-object-modal.jsx | 2 +- .../components/object-modal/object-modal.tsx | 4 +- .../on-boarding/account-status-component.tsx | 78 -- .../on-boarding/company-billing-banner.tsx | 46 - .../on-boarding/company-status-component.tsx | 76 -- .../popups/add-mails-in-workspace.tsx | 81 -- .../on-boarding/popups/blocked-account.tsx | 94 -- .../on-boarding/popups/blocked-company.tsx | 138 --- .../on-boarding/popups/unverified-account.tsx | 86 -- .../on-boarding/popups/welcome-on-tdrive.tsx | 119 --- .../online-user-status/online-user-status.tsx | 6 +- .../open-desktop-popup/open-desktop-popup.tsx | 10 +- .../app/components/parameters/attribute.jsx | 4 +- .../parameters/attributes-manager.js | 2 +- .../src/app/components/picker/picker.jsx | 4 +- .../popup-component/popup-component.jsx | 2 +- .../reminder-selector/reminder-selector.jsx | 4 +- .../rich-text-editor/editor-data-parser.ts | 84 -- .../rich-text-editor/editor-state-service.ts | 67 -- .../rich-text-editor/editor-toolbar-config.ts | 69 -- .../rich-text-editor/editor-toolbar.scss | 30 - .../rich-text-editor/editor-toolbar.tsx | 158 ---- .../rich-text-editor/editor-utils.ts | 280 ------ .../components/rich-text-editor/editor.scss | 59 -- .../components/rich-text-editor/editor.tsx | 703 -------------- .../rich-text-editor/emojis-service.js | 139 --- .../app/components/rich-text-editor/index.ts | 3 - .../rich-text-editor/markdown/README.md | 1 - .../markdown/draft-to-markdown.js | 510 ---------- .../rich-text-editor/markdown/types.ts | 8 - .../plugins/channel/channel-suggestion.tsx | 14 - .../plugins/channel/channel.tsx | 9 - .../rich-text-editor/plugins/channel/index.ts | 110 --- .../plugins/commands/command-suggestion.tsx | 11 - .../plugins/commands/command.tsx | 8 - .../plugins/commands/index.ts | 90 -- .../plugins/emoji/emoji-suggestion.tsx | 17 - .../rich-text-editor/plugins/emoji/emoji.tsx | 8 - .../rich-text-editor/plugins/emoji/index.ts | 103 --- .../rich-text-editor/plugins/index.ts | 63 -- .../plugins/mentions/index.ts | 203 ---- .../plugins/mentions/mention-suggestion.tsx | 15 - .../plugins/mentions/mention.tsx | 9 - .../plugins/mentions/style.scss | 10 - .../plugins/suggestion/suggestion-list.scss | 22 - .../plugins/suggestion/suggestion-list.tsx | 199 ---- .../plugins/suggestion/utils.ts | 15 - .../rich-text-editor/text-count/index.ts | 4 - .../text-count/text-count-service.ts | 33 - .../text-count/text-count.scss | 11 - .../text-count/text-count.tsx | 41 - .../hidden-notification-service.ts | 2 +- .../hidden-notifications-button.tsx | 2 +- .../app/components/search-popup/common.tsx | 58 +- .../parts/channel-avatar/channel-avatar.scss | 83 -- .../parts/channel-avatar/channel-avatar.tsx | 108 --- .../parts/channel-line-result.tsx | 90 -- .../search-popup/parts/channel-result.tsx | 45 - .../search-popup/parts/drive-item-result.tsx | 49 +- .../search-popup/parts/file-result.tsx | 139 --- .../search-popup/parts/media-result.tsx | 29 - .../parts/message-result-file.tsx | 79 -- .../search-popup/parts/message-result.tsx | 90 -- .../search-popup/parts/nothing-found.tsx | 6 +- .../search-popup/parts/nothing-searched.tsx | 4 +- .../search-popup/parts/result-context.tsx | 55 +- .../components/search-popup/search-input.tsx | 26 +- .../components/search-popup/search-popup.tsx | 4 +- .../app/components/search-popup/tabs/all.tsx | 117 --- .../components/search-popup/tabs/channels.tsx | 87 -- .../components/search-popup/tabs/drive.tsx | 6 +- .../components/search-popup/tabs/files.tsx | 43 - .../components/search-popup/tabs/medias.tsx | 51 - .../components/search-popup/tabs/messages.tsx | 41 - .../src/app/components/select/select.jsx | 4 +- .../src/app/components/table/table.tsx | 2 +- .../frontend/src/app/components/tabs/tabs.jsx | 2 +- .../app/components/tag-picker/tag-picker.jsx | 10 +- .../components/tag-picker/tag-selector.jsx | 14 +- .../components/task-picker/task-picker.jsx | 8 +- .../app/components/twacode/blocks/chan.tsx | 45 - .../app/components/twacode/blocks/user.tsx | 96 -- .../app/components/twacode/blocksCompiler.ts | 262 ------ .../src/app/components/twacode/compile.tsx | 118 --- .../twacode/pseudo-markdown-dictionary.tsx | 383 -------- .../src/app/components/twacode/twacode.scss | 348 ------- .../src/app/components/twacode/twacode.tsx | 86 -- .../src/app/components/twacode/types.ts | 231 ----- .../src/app/components/ui/user-or-mail.tsx | 4 +- .../frontend/src/app/components/ui/user.jsx | 2 +- .../app/components/uploads/upload-manager.js | 273 +----- .../app/components/uploads/upload-viewer.jsx | 10 +- .../app/components/uploads/upload-zone.tsx | 58 +- .../app/components/user-card/user-card.tsx | 8 +- .../user-list-manager.tsx | 18 +- .../user-list-manager/user-list-manager.tsx | 16 +- .../components/user-picker/user-picker.jsx | 6 +- .../frontend/src/app/components/user/user.jsx | 6 +- .../writing-loader/writing-loader.scss | 44 - .../writing-loader/writing-loader.tsx | 14 - .../app/deprecated/Apps/Calendar/Calendar.js | 193 ---- .../src/app/deprecated/Apps/Drive/Drive.js | 637 ------------- .../Apps/Drive/utils/ace_modelist.js | 211 ----- .../app/deprecated/Apps/Feed/FeedLoader.ts | 120 --- .../src/app/deprecated/Apps/Tasks/Tasks.js | 154 ---- .../CollectionsV1/Collections/Collection.js | 8 +- .../Collections/SecuredConnection.js | 6 +- .../Configurators/ConfiguratorsManager.js | 4 +- .../SelectionsManager/SelectionsManager.js | 4 +- .../src/app/deprecated/login/account.js | 6 +- .../deprecated/popupManager/popupManager.js | 8 +- .../src/app/deprecated/search/search.js | 254 ----- .../uploadManager/upload-manager.js | 4 +- .../src/app/deprecated/user/CurrentUser.ts | 24 +- .../user/NotificationPreferences.ts | 8 +- .../user/notification_parameters.js | 16 +- .../src/app/deprecated/websocket/websocket.js | 10 +- .../src/app/deprecated/workspaces/groups.js | 16 +- .../deprecated/workspaces/listen_groups.js | 4 +- .../deprecated/workspaces/listen_workspace.js | 4 +- .../app/deprecated/workspaces/workspaces.jsx | 32 +- .../deprecated/workspaces/workspaces_apps.jsx | 20 +- .../src/app/features/auth/auth-service.ts | 18 +- .../app/features/auth/jwt-storage-service.ts | 8 +- .../src/app/features/auth/login-service.ts | 14 +- .../features/auth/provider/auth-provider.ts | 2 +- .../internal-auth-provider-service.ts | 8 +- .../oidc/oidc-auth-provider-service.ts | 12 +- .../api/members-api-client.ts | 51 - .../api/pending-emails-api-client.ts | 49 - .../hooks/member-hook.ts | 111 --- .../hooks/members-hook.ts | 59 -- .../hooks/search-channel-member.ts | 78 -- .../hooks/search-pending-email.ts | 22 - .../hooks/search-users.ts | 21 - .../hooks/use-pending-email-hook.ts | 71 -- .../hooks/use-pending-emails.ts | 48 - .../hooks/use-search-all.ts | 60 -- .../state/search-channel-member.ts | 19 - .../channel-members-search/state/store.ts | 55 -- .../types/channel-members.ts | 62 -- .../api/channel-members-api-client.ts | 111 --- .../use-channel-members-read-sections.ts | 54 -- .../channel-members/state/channel-guests.ts | 12 - .../state/channel-members-read-sections.ts | 39 - .../channel-members/state/channel-members.ts | 12 - .../types/channel-member-read-section-type.ts | 8 - .../types/channel-member-types.ts | 19 - .../channel-members/types/guest-types.ts | 11 - .../utils/channel-members-roles.ts | 5 - .../channels/api/channel-api-client.ts | 107 --- .../channels/api/channels-mine-api-client.ts | 98 -- .../api/channels-reachable-api-client.ts | 52 -- .../channels/hooks/use-autoselect-channel.ts | 46 - .../channels/hooks/use-channel-media-files.ts | 111 --- .../hooks/use-channel-writing-activity.ts | 150 --- .../features/channels/hooks/use-channel.ts | 89 -- .../channels/hooks/use-channels-bar-loader.ts | 18 - .../channels/hooks/use-direct-channels.ts | 107 --- .../channels/hooks/use-favorite-channels.ts | 37 - .../hooks/use-public-or-private-channels.ts | 103 --- .../channels/hooks/use-reachable-channels.ts | 42 - .../channels/services/channels-bar-service.ts | 44 - .../channels/state/channel-attachment-list.ts | 28 - .../state/channel-writing-activity.ts | 12 - .../app/features/channels/state/channels.ts | 36 - .../app/features/channels/types/channel.ts | 61 -- .../types/channels-reachable-types.ts | 15 - .../src/app/features/channels/utils/utils.ts | 12 - .../companies/api/company-api-client.ts | 4 +- .../features/companies/hooks/use-companies.ts | 22 +- .../app/features/companies/state/companies.ts | 6 +- .../app/features/companies/types/company.ts | 4 +- .../console/api/console-api-client.ts | 6 +- .../console/services/console-service.ts | 14 +- .../drive-tdrive/api-client/api-client.ts | 29 - .../hooks/use-drive-tdrive-tab.tsx | 29 - .../app/features/drive-tdrive/state/store.ts | 7 - .../src/app/features/drive-tdrive/types.ts | 7 - .../features/drive/api-client/api-client.ts | 6 +- .../drive/hooks/use-drive-actions.tsx | 4 +- .../features/drive/hooks/use-drive-item.tsx | 6 +- .../features/drive/hooks/use-drive-preview.ts | 8 +- .../drive/hooks/use-drive-realtime.tsx | 2 +- .../features/drive/hooks/use-drive-upload.tsx | 6 +- .../files/api/file-upload-api-client.ts | 8 +- .../features/files/hooks/use-upload-zones.ts | 10 +- .../app/features/files/hooks/use-upload.ts | 10 +- .../files/services/file-upload-service.ts | 17 +- .../files/state/atoms/pending-files-list.ts | 2 +- .../state/atoms/pending-upload-zones-list.ts | 4 +- .../files/state/selectors/current-task.ts | 2 +- .../src/app/features/files/types/file.ts | 36 +- .../app/features/files/utils/pending-files.ts | 2 +- .../features/global/framework/api-service.ts | 4 +- .../framework/registry-decorator-service.ts | 2 +- .../global/framework/requests-api-service.ts | 2 +- .../src/app/features/global/hooks/use-http.ts | 2 +- .../app/features/global/hooks/use-interval.ts | 2 +- .../app/features/global/hooks/use-realtime.ts | 6 +- .../app/features/global/hooks/use-usetiful.ts | 6 +- .../features/global/hooks/use-websocket.ts | 4 +- .../global/services/alert-manager-service.ts | 2 +- .../services/globals-tdrive-app-service.ts | 2 +- .../features/global/services/init-service.ts | 10 +- .../global/services/languages-service.ts | 6 +- .../pseudo-markdown-compiler-service.ts | 869 ------------------ .../services/search-list-manager-service.ts | 194 ---- .../global/services/websocket-service.ts | 4 +- .../app/features/global/utils/Autocomplete.js | 2 +- .../src/app/features/global/utils/URLUtils.ts | 4 +- .../src/app/features/global/utils/datetime.js | 6 +- .../src/app/features/global/utils/window.ts | 2 +- .../features/global/utils/workspacePicker.js | 4 +- .../invitation/api/invitation-api-client.ts | 108 --- .../hooks/use-invitation-channels.ts | 30 - .../invitation/hooks/use-invitation-users.ts | 71 -- .../invitation/hooks/use-invitation.ts | 54 -- .../features/invitation/state/invitation.ts | 47 - .../messages/api/message-api-client.ts | 262 ------ .../messages/api/message-thread-api-client.ts | 63 -- .../messages/api/message-view-api-client.ts | 47 - .../hooks/use-add-to-windowed-list.ts | 147 --- .../messages/hooks/use-channel-messages.ts | 234 ----- .../messages/hooks/use-ephemeral-messages.ts | 58 -- .../messages/hooks/use-highlight-message.ts | 45 - .../messages/hooks/use-message-editor.ts | 210 ----- .../messages/hooks/use-message-quote-reply.ts | 27 - .../messages/hooks/use-message-seen-by.ts | 34 - .../features/messages/hooks/use-message.ts | 229 ----- .../messages/hooks/use-thread-messages.ts | 189 ---- .../hooks/with-non-messages-components.tsx | 50 - .../message-editor-service-factory.ts | 23 - .../services/message-editor-service.ts | 214 ----- .../services/message-history-service.ts | 71 -- .../services/message-reaction-service.ts | 90 -- .../messages/state/atoms/message-highlight.ts | 13 - .../state/atoms/message-quote-reply.ts | 41 - .../messages/state/atoms/message-seen-by.ts | 18 - .../messages/state/atoms/messages-editor.ts | 81 -- .../features/messages/state/atoms/messages.ts | 34 - .../selectors/thread-writing-activity.ts | 19 - .../app/features/messages/types/message.ts | 273 ------ .../messages/utils/message-with-replies.ts | 13 - .../notifications-preferences-api-client.ts | 24 - .../use-notifications-preference-hook.ts | 48 - .../state/notifications-preferences.ts | 8 - .../types/notifications-preferences.ts | 20 - .../api/pending-emails-api-client.ts | 51 - .../hooks/use-pending-emails.ts | 47 - .../pending-emails/state/pending-emails.ts | 12 - .../pending-emails/types/pending-email.ts | 19 - .../hooks/use-router-channel-selected.ts | 2 +- .../router/hooks/use-router-channel.ts | 6 +- .../router/hooks/use-router-company.ts | 6 +- .../features/router/hooks/use-router-tab.ts | 6 +- .../hooks/use-router-workspace-selected.ts | 2 +- .../router/hooks/use-router-workspace.ts | 6 +- .../router/services/app-view-service.ts | 4 +- .../router/services/router-service.ts | 14 +- .../app/features/router/state/atoms/router.ts | 2 +- .../search/hooks/use-search-channels.ts | 138 --- .../search/hooks/use-search-drive-items.tsx | 10 +- .../hooks/use-search-files-or-medias.ts | 116 --- .../search/hooks/use-search-messages.ts | 80 -- .../features/search/state/recent-channels.ts | 12 - .../search/state/recent-drive-items.ts | 4 +- .../app/features/search/state/recent-files.ts | 12 - .../features/search/state/recent-medias.ts | 12 - .../search/state/search-channels-result.ts | 27 - .../state/search-drive-items-result.tsx | 2 +- .../search/state/search-files-result.ts | 22 - .../search/state/search-medias-result.ts | 22 - .../search/state/search-messages-result.ts | 22 - .../app/features/tabs/api/tabs-api-client.ts | 47 - .../src/app/features/tabs/hooks/use-tabs.ts | 54 -- .../src/app/features/tabs/state/tabs.ts | 13 - .../src/app/features/tabs/types/tab.ts | 9 - .../api/online-user-realtime-api-client.ts | 2 +- .../app/features/users/api/user-api-client.ts | 4 +- .../users/api/user-notification-api-client.ts | 22 +- .../features/users/hooks/use-current-user.ts | 12 +- .../features/users/hooks/use-notifications.ts | 14 +- .../features/users/hooks/use-online-users.ts | 6 +- .../users/hooks/use-search-user-list.ts | 10 +- .../use-set-last-workspace-preferences.ts | 6 +- .../app/features/users/hooks/use-user-list.ts | 18 +- .../src/app/features/users/hooks/use-user.ts | 8 +- .../users/hooks/use-users-listener.ts | 8 +- .../users/services/current-user-service.ts | 16 +- .../users/services/listen-users-service.ts | 8 +- .../services/push-desktop-notification.tsx | 2 +- .../users/state/atoms/current-user.ts | 4 +- .../users/state/atoms/online-users.ts | 2 +- .../features/users/state/atoms/user-list.ts | 2 +- .../users/state/context/user-context-state.ts | 8 +- .../users/state/integration/user-context.tsx | 2 +- .../users/state/selectors/search-user.ts | 4 +- .../users/state/selectors/user-selector.ts | 4 +- .../app/features/users/types/user-context.ts | 2 +- .../src/app/features/users/types/user.ts | 8 +- .../src/app/features/users/utils/async-get.ts | 4 +- .../features/viewer/api/viewer-api-client.ts | 9 +- .../app/features/viewer/hooks/use-viewer.ts | 12 +- .../api/workspace-members-api-client.ts | 5 +- .../services/workspace-members-service.ts | 24 +- .../workspaces/api/workspace-api-client.ts | 27 +- .../workspaces/hooks/use-workspaces.ts | 24 +- .../services/magic-links-service.tsx | 4 +- .../services/workspace-user-rights-service.ts | 4 +- .../services/workspaces-listener-service.ts | 10 +- .../workspaces/state/workspace-list.ts | 8 +- .../features/workspaces/types/workspace.ts | 4 +- .../app/molecules/download-banner/index.tsx | 6 +- .../src/app/molecules/message-quote/index.tsx | 61 -- .../message-quote/message-quote.stories.tsx | 49 - .../app/molecules/message-status/index.tsx | 18 - .../message-status/message-status.stories.tsx | 42 - .../src/app/molecules/tabs/index.stories.tsx | 46 - .../frontend/src/app/molecules/tabs/index.tsx | 41 - tdrive/frontend/src/app/views/client/app.tsx | 4 +- .../app/views/client/body/drive/browser.tsx | 24 +- .../body/drive/components/select-users.tsx | 12 +- .../views/client/body/drive/context-menu.tsx | 16 +- .../client/body/drive/documents/common.tsx | 4 +- .../body/drive/documents/document-row.tsx | 14 +- .../body/drive/documents/folder-row.tsx | 8 +- .../views/client/body/drive/drive-item.tsx | 2 +- .../views/client/body/drive/header-path.tsx | 6 +- .../drive/modals/confirm-delete/index.tsx | 14 +- .../body/drive/modals/confirm-trash/index.tsx | 16 +- .../drive/modals/create/create-folder.tsx | 10 +- .../body/drive/modals/create/create-link.tsx | 8 +- .../client/body/drive/modals/create/index.tsx | 12 +- .../body/drive/modals/properties/index.tsx | 12 +- .../body/drive/modals/selector/index.tsx | 10 +- .../drive/modals/update-access/common.tsx | 4 +- .../body/drive/modals/update-access/index.tsx | 4 +- .../modals/update-access/internal-access.tsx | 20 +- .../update-access/public-link-access.tsx | 10 +- .../body/drive/modals/versions/index.tsx | 16 +- .../app/views/client/body/drive/shared.tsx | 12 +- .../src/app/views/client/body/index.tsx | 10 +- .../src/app/views/client/common/account.tsx | 16 +- .../src/app/views/client/common/app-grid.tsx | 4 +- .../src/app/views/client/common/search.tsx | 10 +- .../frontend/src/app/views/client/index.tsx | 34 +- .../client/popup/AddUser/AddUserByEmail.tsx | 22 +- .../views/client/popup/AddUser/MagicLinks.tsx | 12 +- .../CreateCompanyView/CreateCompanyView.jsx | 14 +- .../CreateWorkspacePage.jsx | 10 +- .../client/popup/SecondMail/SecondMail.jsx | 14 +- .../popup/UserParameter/Pages/Assistant.tsx | 8 +- .../UserParameter/Pages/Notifications.tsx | 319 ------- .../popup/UserParameter/UserParameter.jsx | 33 +- .../Pages/Applications/ApplicationsTable.tsx | 14 +- .../Applications/CompanyApplicationPopup.tsx | 12 +- .../Applications/CompanyApplicationsTable.tsx | 18 +- .../Pages/CompanyIdendity.jsx | 10 +- .../Pages/CompanyIntegrations.tsx | 8 +- .../Pages/CreateCompanyAccount.jsx | 10 +- .../Pages/Workspace/DeleteWorkspacePopup.tsx | 16 +- .../Pages/Workspace/WorkspaceIdentity.tsx | 16 +- .../Pages/WorkspacePartner.tsx | 38 +- .../WorkspacePartnerTabs/MemberGrade.tsx | 2 +- .../Pages/WorkspacePartnerTabs/Members.tsx | 32 +- .../Pages/WorkspacePartnerTabs/Pending.tsx | 10 +- .../WorkspaceParameter/WorkspaceParameter.jsx | 20 +- .../application-parameters/AppsParameters.jsx | 12 +- .../pages/TwacodeTester.jsx | 2 +- .../pages/WorkspaceAppsEditor.jsx | 10 +- .../pages/WorkspaceAppsInformations.jsx | 6 +- .../pages/application-creator.tsx | 16 +- .../components/application-access.tsx | 4 +- .../components/application-api.tsx | 4 +- .../components/application-display.tsx | 2 +- .../components/application-help.tsx | 4 +- .../components/application-identity.tsx | 4 +- .../components/application-publication.tsx | 12 +- .../components/tag-picker.tsx | 2 +- .../application-editor/default-scopes.ts | 2 +- .../pages/application-editor/index.tsx | 16 +- .../src/app/views/client/side-bar/actions.tsx | 2 +- .../views/client/viewer/archive/display.tsx | 4 +- .../src/app/views/client/viewer/display.tsx | 4 +- .../app/views/client/viewer/drive-display.tsx | 2 +- .../app/views/client/viewer/drive-preview.tsx | 24 +- .../views/client/viewer/images/controls.tsx | 4 +- .../app/views/client/viewer/link/display.tsx | 4 +- .../views/client/viewer/other/controls.tsx | 12 +- .../client/viewer/other/editors-service.ts | 10 +- .../src/app/views/client/viewer/viewer.tsx | 88 +- .../src/app/views/error/error-boundary.tsx | 8 +- tdrive/frontend/src/app/views/error/index.tsx | 6 +- tdrive/frontend/src/app/views/join/index.tsx | 14 +- .../app/views/login/console/console-login.tsx | 4 +- .../app/views/login/internal/error/index.tsx | 10 +- .../login/internal/forgot-password/index.jsx | 6 +- .../views/login/internal/internal-login.tsx | 10 +- .../login/internal/login-view/login-view.jsx | 6 +- .../views/login/internal/signin/signin.jsx | 4 +- .../internal/verify-mail/verify-mail.jsx | 8 +- tdrive/frontend/src/app/views/login/login.tsx | 6 +- .../frontend/src/app/views/login/logout.tsx | 2 +- .../src/utils/browser-detect/index.ts | 4 +- tdrive/frontend/src/utils/messages/index.ts | 21 - 547 files changed, 1271 insertions(+), 27036 deletions(-) delete mode 100644 tdrive/frontend/src/app/components/add-user-button/add-user-button.scss delete mode 100644 tdrive/frontend/src/app/components/add-user-button/add-user-button.tsx delete mode 100755 tdrive/frontend/src/app/components/attachment-picker/attachment-picker.jsx delete mode 100755 tdrive/frontend/src/app/components/attachment-picker/attachment-picker.scss delete mode 100755 tdrive/frontend/src/app/components/calendar/calendar-selector/calendar-selector.jsx delete mode 100755 tdrive/frontend/src/app/components/calendar/calendar-selector/calendar-selector.scss delete mode 100755 tdrive/frontend/src/app/components/calendar/date-picker.jsx delete mode 100755 tdrive/frontend/src/app/components/calendar/date-picker.scss delete mode 100755 tdrive/frontend/src/app/components/calendar/day-picker/day-picker.jsx delete mode 100755 tdrive/frontend/src/app/components/calendar/day-picker/day-picker.scss delete mode 100755 tdrive/frontend/src/app/components/calendar/event/event.jsx delete mode 100755 tdrive/frontend/src/app/components/calendar/event/event.scss delete mode 100755 tdrive/frontend/src/app/components/calendar/time-selector.jsx delete mode 100644 tdrive/frontend/src/app/components/channel-attachement-list/channel-attachement-list.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-attachment.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-files.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-medias.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-attachement-list/parts/commun.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-members-list/channel-members-modal.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-members-list/email-item.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-members-list/member-item.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-members-list/user-item.tsx delete mode 100644 tdrive/frontend/src/app/components/channel-members-list/users-search-modal.tsx delete mode 100644 tdrive/frontend/src/app/components/channels-selector/index.tsx delete mode 100644 tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.scss delete mode 100644 tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.tsx delete mode 100755 tdrive/frontend/src/app/components/components-tester/component-doc.jsx delete mode 100755 tdrive/frontend/src/app/components/components-tester/component-doc.scss delete mode 100755 tdrive/frontend/src/app/components/components-tester/components-tester.jsx delete mode 100755 tdrive/frontend/src/app/components/components-tester/components-tester.scss delete mode 100755 tdrive/frontend/src/app/components/components-tester/group/inputs.jsx delete mode 100755 tdrive/frontend/src/app/components/draggable/draggable-body-layer.jsx delete mode 100755 tdrive/frontend/src/app/components/draggable/draggable-manager.js delete mode 100755 tdrive/frontend/src/app/components/draggable/draggable.scss delete mode 100755 tdrive/frontend/src/app/components/draggable/draggable.tsx delete mode 100755 tdrive/frontend/src/app/components/draggable/droppable-zone.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/directory.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/drive-element.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/drive-multi-selector.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/drive-multi-selector.scss delete mode 100755 tdrive/frontend/src/app/components/drive/drive.scss delete mode 100755 tdrive/frontend/src/app/components/drive/file-picker/file-picker.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/file-picker/file-picker.scss delete mode 100755 tdrive/frontend/src/app/components/drive/file.tsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/archive.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/archive.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/code.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/code.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/document.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/document.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/file.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/file.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/image.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/image.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/link.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/link.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/pdf.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/pdf.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/slides.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/slides.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/sound.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/sound.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/spreadsheet.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/spreadsheet.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/svg.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/svg.svg delete mode 100755 tdrive/frontend/src/app/components/drive/icons/video.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/icons/video.svg delete mode 100755 tdrive/frontend/src/app/components/drive/ui/directory.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/ui/file-type.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/ui/file.jsx delete mode 100755 tdrive/frontend/src/app/components/drive/version-details.jsx delete mode 100644 tdrive/frontend/src/app/components/edit-channel/channel-access.tsx delete mode 100644 tdrive/frontend/src/app/components/edit-channel/channel-information.tsx delete mode 100644 tdrive/frontend/src/app/components/edit-channel/channel-notifications.tsx delete mode 100644 tdrive/frontend/src/app/components/edit-channel/channel-settings-menu.tsx delete mode 100644 tdrive/frontend/src/app/components/edit-channel/index.tsx delete mode 100755 tdrive/frontend/src/app/components/editable-text/editable-text.jsx delete mode 100755 tdrive/frontend/src/app/components/editable-text/editable-text.scss delete mode 100755 tdrive/frontend/src/app/components/emoji-picker/emoji-picker.jsx delete mode 100755 tdrive/frontend/src/app/components/emoji-picker/emoji-picker.scss delete mode 100644 tdrive/frontend/src/app/components/file/file-component.tsx delete mode 100644 tdrive/frontend/src/app/components/file/file.scss delete mode 100644 tdrive/frontend/src/app/components/file/parts/actions.tsx delete mode 100644 tdrive/frontend/src/app/components/file/parts/details.tsx delete mode 100644 tdrive/frontend/src/app/components/file/parts/index.ts delete mode 100644 tdrive/frontend/src/app/components/file/parts/large-preview.tsx delete mode 100644 tdrive/frontend/src/app/components/file/parts/progress.tsx delete mode 100644 tdrive/frontend/src/app/components/file/parts/thumbnail.tsx delete mode 100644 tdrive/frontend/src/app/components/file/types.ts delete mode 100644 tdrive/frontend/src/app/components/forward-message/index.tsx delete mode 100755 tdrive/frontend/src/app/components/highlighted-code/highlighted-code.tsx delete mode 100755 tdrive/frontend/src/app/components/inputs/input-with-icon.tsx delete mode 100644 tdrive/frontend/src/app/components/inputs/input-with-select.scss delete mode 100644 tdrive/frontend/src/app/components/inputs/input-with-select.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/invitation.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/allow-anyone-by-email.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/bulk-invitation.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/custom-role-invitation.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/invitation-channels.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/invitation-input-bulk.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/invitation-input-list.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/invitation-sent.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/invitation-target.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/reached-limit.tsx delete mode 100644 tdrive/frontend/src/app/components/invitation/parts/workspace-link.tsx delete mode 100755 tdrive/frontend/src/app/components/main-plus/main-plus.jsx delete mode 100755 tdrive/frontend/src/app/components/main-plus/main-plus.scss delete mode 100644 tdrive/frontend/src/app/components/message-seen-by/message-seen-by.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/account-status-component.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/company-billing-banner.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/company-status-component.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/popups/add-mails-in-workspace.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/popups/blocked-account.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/popups/blocked-company.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/popups/unverified-account.tsx delete mode 100644 tdrive/frontend/src/app/components/on-boarding/popups/welcome-on-tdrive.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-data-parser.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-state-service.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar-config.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.scss delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor-utils.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor.scss delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/editor.tsx delete mode 100755 tdrive/frontend/src/app/components/rich-text-editor/emojis-service.js delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/markdown/README.md delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/markdown/draft-to-markdown.js delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/markdown/types.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/channel/channel-suggestion.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/channel/channel.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/channel/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/commands/command-suggestion.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/commands/command.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/commands/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/emoji/emoji-suggestion.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/emoji/emoji.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/emoji/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/mentions/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/mentions/mention-suggestion.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/mentions/mention.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/mentions/style.scss delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/suggestion/suggestion-list.scss delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/suggestion/suggestion-list.tsx delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/plugins/suggestion/utils.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/text-count/index.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/text-count/text-count-service.ts delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/text-count/text-count.scss delete mode 100644 tdrive/frontend/src/app/components/rich-text-editor/text-count/text-count.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/channel-avatar/channel-avatar.scss delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/channel-avatar/channel-avatar.tsx delete mode 100755 tdrive/frontend/src/app/components/search-popup/parts/channel-line-result.tsx delete mode 100755 tdrive/frontend/src/app/components/search-popup/parts/channel-result.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/file-result.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/media-result.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/message-result-file.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/parts/message-result.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/tabs/all.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/tabs/channels.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/tabs/files.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/tabs/medias.tsx delete mode 100644 tdrive/frontend/src/app/components/search-popup/tabs/messages.tsx delete mode 100755 tdrive/frontend/src/app/components/twacode/blocks/chan.tsx delete mode 100644 tdrive/frontend/src/app/components/twacode/blocks/user.tsx delete mode 100644 tdrive/frontend/src/app/components/twacode/blocksCompiler.ts delete mode 100644 tdrive/frontend/src/app/components/twacode/compile.tsx delete mode 100644 tdrive/frontend/src/app/components/twacode/pseudo-markdown-dictionary.tsx delete mode 100755 tdrive/frontend/src/app/components/twacode/twacode.scss delete mode 100755 tdrive/frontend/src/app/components/twacode/twacode.tsx delete mode 100644 tdrive/frontend/src/app/components/twacode/types.ts delete mode 100644 tdrive/frontend/src/app/components/writing-loader/writing-loader.scss delete mode 100644 tdrive/frontend/src/app/components/writing-loader/writing-loader.tsx delete mode 100755 tdrive/frontend/src/app/deprecated/Apps/Calendar/Calendar.js delete mode 100755 tdrive/frontend/src/app/deprecated/Apps/Drive/Drive.js delete mode 100755 tdrive/frontend/src/app/deprecated/Apps/Drive/utils/ace_modelist.js delete mode 100644 tdrive/frontend/src/app/deprecated/Apps/Feed/FeedLoader.ts delete mode 100755 tdrive/frontend/src/app/deprecated/Apps/Tasks/Tasks.js delete mode 100755 tdrive/frontend/src/app/deprecated/search/search.js delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/api/members-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/api/pending-emails-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/member-hook.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/members-hook.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/search-channel-member.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/search-pending-email.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/search-users.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/use-pending-email-hook.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/use-pending-emails.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/hooks/use-search-all.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/state/search-channel-member.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/state/store.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members-search/types/channel-members.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/api/channel-members-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/hooks/use-channel-members-read-sections.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/state/channel-guests.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/state/channel-members-read-sections.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/state/channel-members.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/types/channel-member-read-section-type.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/types/channel-member-types.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/types/guest-types.ts delete mode 100644 tdrive/frontend/src/app/features/channel-members/utils/channel-members-roles.ts delete mode 100644 tdrive/frontend/src/app/features/channels/api/channel-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channels/api/channels-mine-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channels/api/channels-reachable-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-autoselect-channel.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-channel-media-files.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-channel-writing-activity.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-channel.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-channels-bar-loader.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-direct-channels.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-favorite-channels.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-public-or-private-channels.ts delete mode 100644 tdrive/frontend/src/app/features/channels/hooks/use-reachable-channels.ts delete mode 100755 tdrive/frontend/src/app/features/channels/services/channels-bar-service.ts delete mode 100644 tdrive/frontend/src/app/features/channels/state/channel-attachment-list.ts delete mode 100644 tdrive/frontend/src/app/features/channels/state/channel-writing-activity.ts delete mode 100644 tdrive/frontend/src/app/features/channels/state/channels.ts delete mode 100644 tdrive/frontend/src/app/features/channels/types/channel.ts delete mode 100644 tdrive/frontend/src/app/features/channels/types/channels-reachable-types.ts delete mode 100644 tdrive/frontend/src/app/features/channels/utils/utils.ts delete mode 100644 tdrive/frontend/src/app/features/drive-tdrive/api-client/api-client.ts delete mode 100644 tdrive/frontend/src/app/features/drive-tdrive/hooks/use-drive-tdrive-tab.tsx delete mode 100644 tdrive/frontend/src/app/features/drive-tdrive/state/store.ts delete mode 100644 tdrive/frontend/src/app/features/drive-tdrive/types.ts delete mode 100644 tdrive/frontend/src/app/features/global/services/pseudo-markdown-compiler-service.ts delete mode 100644 tdrive/frontend/src/app/features/global/services/search-list-manager-service.ts delete mode 100644 tdrive/frontend/src/app/features/invitation/api/invitation-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/invitation/hooks/use-invitation-channels.ts delete mode 100644 tdrive/frontend/src/app/features/invitation/hooks/use-invitation-users.ts delete mode 100644 tdrive/frontend/src/app/features/invitation/hooks/use-invitation.ts delete mode 100644 tdrive/frontend/src/app/features/invitation/state/invitation.ts delete mode 100644 tdrive/frontend/src/app/features/messages/api/message-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/messages/api/message-thread-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/messages/api/message-view-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-add-to-windowed-list.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-channel-messages.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-ephemeral-messages.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-highlight-message.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-message-editor.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-message-quote-reply.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-message-seen-by.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-message.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/use-thread-messages.ts delete mode 100644 tdrive/frontend/src/app/features/messages/hooks/with-non-messages-components.tsx delete mode 100644 tdrive/frontend/src/app/features/messages/services/message-editor-service-factory.ts delete mode 100644 tdrive/frontend/src/app/features/messages/services/message-editor-service.ts delete mode 100644 tdrive/frontend/src/app/features/messages/services/message-history-service.ts delete mode 100644 tdrive/frontend/src/app/features/messages/services/message-reaction-service.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/atoms/message-highlight.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/atoms/message-quote-reply.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/atoms/message-seen-by.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/atoms/messages-editor.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/atoms/messages.ts delete mode 100644 tdrive/frontend/src/app/features/messages/state/selectors/thread-writing-activity.ts delete mode 100644 tdrive/frontend/src/app/features/messages/types/message.ts delete mode 100644 tdrive/frontend/src/app/features/messages/utils/message-with-replies.ts delete mode 100644 tdrive/frontend/src/app/features/notifications-preferences/api/notifications-preferences-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/notifications-preferences/hooks/use-notifications-preference-hook.ts delete mode 100644 tdrive/frontend/src/app/features/notifications-preferences/state/notifications-preferences.ts delete mode 100644 tdrive/frontend/src/app/features/notifications-preferences/types/notifications-preferences.ts delete mode 100644 tdrive/frontend/src/app/features/pending-emails/api/pending-emails-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/pending-emails/hooks/use-pending-emails.ts delete mode 100644 tdrive/frontend/src/app/features/pending-emails/state/pending-emails.ts delete mode 100644 tdrive/frontend/src/app/features/pending-emails/types/pending-email.ts delete mode 100644 tdrive/frontend/src/app/features/search/hooks/use-search-channels.ts delete mode 100644 tdrive/frontend/src/app/features/search/hooks/use-search-files-or-medias.ts delete mode 100644 tdrive/frontend/src/app/features/search/hooks/use-search-messages.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/recent-channels.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/recent-files.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/recent-medias.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/search-channels-result.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/search-files-result.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/search-medias-result.ts delete mode 100644 tdrive/frontend/src/app/features/search/state/search-messages-result.ts delete mode 100644 tdrive/frontend/src/app/features/tabs/api/tabs-api-client.ts delete mode 100644 tdrive/frontend/src/app/features/tabs/hooks/use-tabs.ts delete mode 100644 tdrive/frontend/src/app/features/tabs/state/tabs.ts delete mode 100644 tdrive/frontend/src/app/features/tabs/types/tab.ts delete mode 100644 tdrive/frontend/src/app/molecules/message-quote/index.tsx delete mode 100644 tdrive/frontend/src/app/molecules/message-quote/message-quote.stories.tsx delete mode 100644 tdrive/frontend/src/app/molecules/message-status/index.tsx delete mode 100644 tdrive/frontend/src/app/molecules/message-status/message-status.stories.tsx delete mode 100644 tdrive/frontend/src/app/molecules/tabs/index.stories.tsx delete mode 100644 tdrive/frontend/src/app/molecules/tabs/index.tsx delete mode 100755 tdrive/frontend/src/app/views/client/popup/UserParameter/Pages/Notifications.tsx delete mode 100644 tdrive/frontend/src/utils/messages/index.ts diff --git a/tdrive/frontend/src/app/app.tsx b/tdrive/frontend/src/app/app.tsx index 1f3b34ec..ed14586e 100755 --- a/tdrive/frontend/src/app/app.tsx +++ b/tdrive/frontend/src/app/app.tsx @@ -6,13 +6,13 @@ import { RecoilRoot } from 'recoil'; import MobileRedirect from './components/mobile-redirect'; import RouterServices, { RouteType } from './features/router/services/router-service'; -import ErrorBoundary from 'app/views/error/error-boundary'; +import ErrorBoundary from '@views/error/error-boundary'; import InitService from './features/global/services/init-service'; -import useTimeout from 'app/features/global/hooks/use-timeout'; +import useTimeout from '@features/global/hooks/use-timeout'; import ApplicationLoader from './components/loader/application-loader'; import DebugState from './components/debug/debug-state'; -import 'app/styles/index.less'; +import '@styles/index.less'; const delayMessage = 5000; diff --git a/tdrive/frontend/src/app/atoms/link/link.stories.tsx b/tdrive/frontend/src/app/atoms/link/link.stories.tsx index f5e1d151..a65de471 100644 --- a/tdrive/frontend/src/app/atoms/link/link.stories.tsx +++ b/tdrive/frontend/src/app/atoms/link/link.stories.tsx @@ -6,7 +6,13 @@ import A from './index'; export default { title: '@atoms/link', component: A, - decorators: [(Story) => ()] + decorators: [ + Story => ( + + + + ), + ], } as ComponentMeta; const Template: ComponentStory = args => ; @@ -15,7 +21,7 @@ export const Default = Template.bind({}); Default.args = { href: 'https://www.google.com', children: 'Link', -} +}; export const noColor = Template.bind({}); noColor.args = { diff --git a/tdrive/frontend/src/app/components/add-user-button/add-user-button.scss b/tdrive/frontend/src/app/components/add-user-button/add-user-button.scss deleted file mode 100644 index 14137faa..00000000 --- a/tdrive/frontend/src/app/components/add-user-button/add-user-button.scss +++ /dev/null @@ -1,18 +0,0 @@ -.addUserButton { - color: var(--primary); - - .icon { - .iconBox { - width: 18px; - height: 18px; - background-color: var(--primary-background); - border-radius: 4px; - padding-left: 2px; - - .icon-unicon { - color: var(--primary) !important; - } - } - color: var(--primary) !important ; - } -} diff --git a/tdrive/frontend/src/app/components/add-user-button/add-user-button.tsx b/tdrive/frontend/src/app/components/add-user-button/add-user-button.tsx deleted file mode 100644 index 1c097943..00000000 --- a/tdrive/frontend/src/app/components/add-user-button/add-user-button.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import Icon from 'app/components/icon/icon.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import './add-user-button.scss'; -import { useRecoilState } from 'recoil'; -import { invitationState } from 'app/features/invitation/state/invitation'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import AccessRightsService from 'app/features/workspace-members/services/workspace-members-access-rights-service'; -import { useCurrentWorkspace } from 'app/features/workspaces/hooks/use-workspaces'; - -export default () => { - const [, setInvitationOpen] = useRecoilState(invitationState); - const { allowed_guests, allowed_members } = useInvitationUsers(); - const { workspace } = useCurrentWorkspace(); - - return AccessRightsService.hasLevel(workspace?.id, 'moderator') && - (allowed_guests > 0 || allowed_members > 0) ? ( -
{ - setInvitationOpen(true); - }} - > -
-
- -
-
-
- {Languages.t( - 'scenes.app.popup.workspaceparameter.pages.collaboraters_adding_button', - [], - 'Ajouter des collaborateurs', - )} -
-
- ) : ( - <> - ); -}; diff --git a/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.jsx b/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.jsx deleted file mode 100755 index fddfebeb..00000000 --- a/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.jsx +++ /dev/null @@ -1,199 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; - -import File from 'components/drive/file'; -import FilePicker from 'components/drive/file-picker/file-picker.jsx'; -import TaskPicker from 'components/task-picker/task-picker.jsx'; -import Menu from 'components/menus/menu.jsx'; -import Icon from 'app/components/icon/icon.jsx'; -import Button from 'components/buttons/button.jsx'; -import UploadZone from 'components/uploads/upload-zone'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import './attachment-picker.scss'; - -export default class AttachmentPicker extends Component { - /* - props : { - readOnly : bool - attachments : [] - onChange - className - } - */ - - getIcon(att) { - if (att.type.toLocaleLowerCase() === 'event') { - return 'calendar-alt'; - } - if (att.type.toLocaleLowerCase() === 'file') { - return 'folder'; - } - if (att.type.toLocaleLowerCase() === 'task') { - return 'check-square'; - } - } - addAttachment(attachment) { - var attachments = this.props.attachments || []; - attachments.push(attachment); - if (this.props.onChange) { - this.props.onChange(attachments); - } - } - removeAttachment(attachment) { - var attachments = this.props.attachments || []; - var index = attachments.indexOf(attachment); - if (index >= 0) { - attachments.splice(index, 1); - if (this.props.onChange) { - this.props.onChange(attachments); - } - } - } - render() { - return ( -
-
- {(Object.values(this.props.attachments || {}) || []).map(att => { - if (att.type === 'file') { - var additionalMenu = []; - if (!this.props.readOnly) { - additionalMenu = [ - { - type: 'menu', - text: Languages.t( - 'components.attachmentpicker.remove_attach', - [], - 'Remove attachment', - ), - onClick: () => { - this.removeAttachment(att); - }, - }, - ]; - } - return ( -
- -
- ); - } - return ( -
- - {att.name} - {!this.props.readOnly && ( - { - this.removeAttachment(att); - }} - /> - )} -
- ); - })} -
- {!this.props.readOnly && ( - { - this.upload_zone.open(); - MenusManager.closeMenu(); - }, - }, - { - type: 'menu', - icon: 'folder', - text: Languages.t( - 'components.attachmentpicker.from_tdrive', - [], - 'From Tdrive Documents', - ), - submenu: [ - { - type: 'react-element', - reactElement: ( - { - this.addAttachment({ type: 'file', id: res.id, name: res.name }); - MenusManager.closeMenu(); - }} - initialDirectory={{ id: '' }} - /> - ), - }, - ], - }, - ], - }, - { - type: 'menu', - text: Languages.t('scenes.apps.tasks.task', [], 'Task'), - icon: 'check-square', - submenu: [ - { - type: 'react-element', - reactElement: ( - { - this.addAttachment({ type: 'task', id: res.id, name: res.title }); - MenusManager.closeMenu(); - }} - /> - ), - }, - ], - }, - ]} - > - {' '} - - - )} - - (this.upload_zone = node)} - disableClick - parent={''} - driveCollectionKey={'attachment_' + Workspaces.currentWorkspaceId} - uploadOptions={{ workspace_id: Workspaces.currentWorkspaceId, detached: true }} - onUploaded={res => { - this.addAttachment({ type: 'file', id: res.id, name: res.name }); - }} - multiple={false} - /> -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.scss b/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.scss deleted file mode 100755 index 1641b683..00000000 --- a/tdrive/frontend/src/app/components/attachment-picker/attachment-picker.scss +++ /dev/null @@ -1,39 +0,0 @@ -.attachmentPicker { - .attachment { - display: inline-block; - font-size: 12px; - color: var(--black); - border: solid 1px var(--grey-background); - height: 32px; - box-sizing: border-box; - border-radius: var(--border-radius-large); - padding: 4px; - padding-right: 8px; - line-height: 24px; - margin-right: 8px; - margin-bottom: 8px; - - &.attachment_file { - border: 0; - padding: 0; - height: auto; - } - } - - i.app-icon { - margin-right: 4px; - margin-left: 4px; - font-size: 14px; - position: relative; - top: -1px; - vertical-align: top; - } - - .remove { - opacity: 0.5; - cursor: pointer; - &:hover { - opacity: 1; - } - } -} diff --git a/tdrive/frontend/src/app/components/calendar/calendar-selector/calendar-selector.jsx b/tdrive/frontend/src/app/components/calendar/calendar-selector/calendar-selector.jsx deleted file mode 100755 index 5b3d3155..00000000 --- a/tdrive/frontend/src/app/components/calendar/calendar-selector/calendar-selector.jsx +++ /dev/null @@ -1,159 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/jsx-key */ -import React from 'react'; -import './calendar-selector.scss'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import Select from 'components/select/select.jsx'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; -import WorkspacesService from 'app/deprecated/workspaces/workspaces.jsx'; -import Languages from 'app/features/global/services/languages-service'; - -export default class CalendarSelector extends React.Component { - constructor(props) { - super(); - this.props = props; - - this.state = { - selected: [], - }; - } - - delete(item) { - var list = this.props.value.map(item => item.calendar_id); - const index = list.indexOf(item.id); - if (index >= 0) { - list.splice(index, 1); - this.change(list); - } - MenusManager.closeMenu(); - } - - openMenu(evt, item) { - if (this.props.readonly) { - return; - } - MenusManager.openMenu( - [ - { - className: 'error', - icon: 'trash', - text: Languages.t('components.calendar.calendarselector.remove', [], 'Retirer'), - onClick: () => { - this.delete(item); - }, - }, - ], - { x: evt.clientX, y: evt.clientY, width: 150 }, - 'bottom', - ); - } - - change(list) { - if (this.props.onChange) - this.props.onChange( - list - .map(id => { - var cal = Collections.get('calendars').find(id); - if (!cal) { - return undefined; - } - return { - calendar_id: cal.id, - workspace_id: cal.workspace_id, - }; - }) - .filter(item => item), - ); - } - - render() { - return ( -
-
- {this.props.value.map(ws_cal_id => { - var item = Collections.get('calendars').find(ws_cal_id.calendar_id); - if (!item || item.workspace_id !== WorkspacesService.currentWorkspaceId) { - return ''; - } - return ( -
(this.node = node)} - onClick={evt => this.openMenu(evt, item)} - className={'calendar_item ' + (this.props.readonly ? '' : 'removable')} - > -
- {'' + item.title} -
- ); - })} - - {(!this.props.value || this.props.value.length === 0) && ( -
- {Languages.t( - 'components.calendar.calendarselector.no_workspace_calendar', - [], - "Aucun calendrier d'espace de travail.", - )} -
- )} -
- - {!this.props.readonly && ( -
- this.input.blur()} - onEnter={() => this.input.blur()} - onBlur={() => this.blur()} - onFocus={() => this.focus()} - placeholder={'No date'} - value={this.state.time_ts ? this.state.time_string : ''} - style={{ maxWidth: 108 }} - onChange={evt => this.process(evt.target.value)} - refInput={node => (this.input = node)} - big={this.props.big} - medium={this.props.medium} - small={this.props.small} - /> - {this.props.withReset && ( -
{ - this.setState({ time_ts: false }); - this.props.onChangeBlur(this.state.time_ts); - this.setState({}); - }} - > - -
- )} - -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/calendar/date-picker.scss b/tdrive/frontend/src/app/components/calendar/date-picker.scss deleted file mode 100755 index ee6dd11b..00000000 --- a/tdrive/frontend/src/app/components/calendar/date-picker.scss +++ /dev/null @@ -1,18 +0,0 @@ -.date_selector { - .reset_date { - width: 16px; - height: 16px; - position: absolute; - right: 8px; - top: 12px; - background: #eee; - border-radius: var(--border-radius-large); - font-size: 12px; - color: #444; - cursor: pointer; - - &:hover { - background: #ddd; - } - } -} diff --git a/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.jsx b/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.jsx deleted file mode 100755 index 99bff9f9..00000000 --- a/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.jsx +++ /dev/null @@ -1,164 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; -import Icon from 'app/components/icon/icon.jsx'; -import moment from 'moment'; -import './day-picker.scss'; - -export default class DayPicker extends Component { - /* - this.props :{ - onChange(day) - value : Array of selected days - } - */ - constructor(props) { - super(props); - this.state = { - days: [], - currentDate: moment(), - }; - this.openSelected = false; - window.moment = moment; - } - componentDidMount() { - this.setState(this.updateDay()); - } - UNSAFE_componentWillUpdate(nextProps, nextState) { - if (moment(nextProps.value).valueOf() != this.oldProp) { - var obj = this.updateDay(nextProps.value); - nextState.days = obj.days; - nextState.currentDate = obj.currentDate; - } - this.oldProp = moment(nextProps.value).valueOf(); - } - updateDay(date) { - var searchedDate = date || moment(); - var days = []; - var first_day_of_month = moment(searchedDate).startOf('month').startOf('week'); - for (var i = 0; i < 35; i++) { - days.push(moment(moment(first_day_of_month).add(i, 'days'))); - } - return { - days: days, - currentDate: searchedDate, - }; - } - isSelected(day) { - if (this.props.value) { - if ( - Array.isArray(this.props.value) && - this.props.value.length == 2 && - this.props.value[0] && - this.props.value[1] - ) { - return day.isBetween(this.props.value[0], this.props.value[1], 'day', '[]'); - } else if ( - Array.isArray(this.props.value) && - this.props.value.length >= 1 && - this.props.value[0] - ) { - return day.isSame(this.props.value[0], 'day'); - } else if (!Array.isArray(this.props.value) && this.props.value) { - return day.isSame(this.props.value, 'day'); - } - } - return false; - } - isLast(day) { - if (this.props.value) { - if ( - Array.isArray(this.props.value) && - this.props.value.length == 2 && - this.props.value[0] && - this.props.value[1] - ) { - return day.isSame(this.props.value[1], 'day'); - } else if ( - Array.isArray(this.props.value) && - this.props.value.length >= 1 && - this.props.value[0] - ) { - return day.isSame(this.props.value[0], 'day'); - } else if (!Array.isArray(this.props.value) && this.props.value) { - return day.isSame(this.props.value, 'day'); - } - } - return false; - } - render() { - var last_week = -1; - return ( -
this.props.onClick && this.props.onClick()} - onMouseDown={this.props.onMouseDown} - > -
-
{moment(this.state.currentDate).format('MMMM YYYY')}
-
-
{ - this.setState(this.updateDay(moment(this.state.currentDate).subtract(1, 'months'))); - }} - > - -
-
{ - this.setState(this.updateDay(moment(this.state.currentDate).add(1, 'months'))); - }} - > - -
-
-
-
-
- Wk -
- {this.state.days.map((day, index) => { - if (index < 7) { - return ( -
- {day.format('ddd')} -
- ); - } - })} - {this.state.days.map(day => { - var list = []; - if (day.week() != last_week) { - last_week = day.week(); - list.push(
{last_week}
); - } - list.push( -
{ - if (this.props.onChange) { - this.props.onChange(day); - } - }} - className={ - 'day ' + - (day.month() == this.state.currentDate.month() ? '' : 'notInMonth') + - ' ' + - (day.format('YYYY MM DD') == moment().format('YYYY MM DD') ? 'today' : '') + - ' ' + - (this.isSelected(day) ? 'selected' : '') + - ' ' + - (this.isLast(day) ? 'last' : '') - } - > - {day.date()} -
, - ); - return list; - })} -
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.scss b/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.scss deleted file mode 100755 index 8fa3a3cd..00000000 --- a/tdrive/frontend/src/app/components/calendar/day-picker/day-picker.scss +++ /dev/null @@ -1,97 +0,0 @@ -.dayPicker { - width: 200px; - font-size: 14px; - font-weight: 500; - - .titleDayPicker { - display: flex; - margin-top: -8px; - margin-bottom: -4px; - .month { - display: inline-block; - text-transform: capitalize; - line-height: 30px; - } - .chevron { - flex: 1; - text-align: right; - display: inline-block; - .move_icon { - display: inline-block; - font-size: 14px; - opacity: 1; - padding: 5px; - border-radius: var(--border-radius-base); - } - .move_icon:hover { - cursor: pointer; - background: rgba(55, 53, 47, 0.08); - } - } - } - .days { - .weeknumber { - background: #dfdfdf; - height: 26px; - line-height: 26px; - vertical-align: top; - display: inline-block; - font-size: 12px; - color: #000; - opacity: 0.3; - padding: 0 1px; - box-sizing: border-box; - width: 12.5%; - text-align: center; - } - .dayName { - display: inline-block; - width: 12.5%; - text-align: center; - height: 28px; - line-height: 28px; - font-size: 11px; - border-radius: var(--border-radius-base); - opacity: 0.6; - } - .dayName:first-child { - opacity: 0.3; - } - .day { - display: inline-block; - width: 12.5%; - text-align: center; - height: 24px; - line-height: 24px; - margin-bottom: 2px; - border-radius: var(--border-radius-base); - } - .day:not(.selected):hover { - background: rgba(45, 156, 219, 0.2); - } - .day:hover { - cursor: pointer; - } - .notInMonth { - opacity: 0.5; - } - .selected + .selected:not(.last) { - border-radius: 0px; - } - .selected { - background: #827dff; - border-radius: var(--border-radius-base) 0px 0px var(--border-radius-base); - color: white; - } - .selected + .last { - border-radius: 0px 4px 4px 0px; - } - :not(.selected) + .last { - border-radius: var(--border-radius-base); - } - .today:not(.selected) { - color: rgb(235, 87, 87); - border-radius: var(--border-radius-base); - } - } -} diff --git a/tdrive/frontend/src/app/components/calendar/event/event.jsx b/tdrive/frontend/src/app/components/calendar/event/event.jsx deleted file mode 100755 index 2ede0d6a..00000000 --- a/tdrive/frontend/src/app/components/calendar/event/event.jsx +++ /dev/null @@ -1,123 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; -import './event.scss'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import Icon from 'app/components/icon/icon.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import UserListManager from 'components/user-list-manager-depreciated/user-list-manager'; - -import moment from 'moment'; - -export default class Event extends Component { - constructor(props) { - super(); - this.props = props; - } - render() { - var className = ''; - var icon = ''; - var event_duration = ''; - var classNameUser = ''; - if (this.props.inEvent) { - classNameUser = 'inEvent'; - } - - var event_name = - this.props.event.title || Languages.t('scenes.apps.drive.navigators.new_file.untitled'); - - var event_start = moment(parseInt(this.props.event.from) * 1000).format('LT'); - - var event_end = moment(parseInt(this.props.event.to) * 1000).format('LT'); - - var location = this.props.event.location || ''; - - if (event_start) event_duration = event_start; - if (event_end) - event_duration = - event_duration + Languages.t('components.calendar.event.to', [], ' à ') + event_end; - - var duration = (parseInt(this.props.event.to) - parseInt(this.props.event.from)) / 60; - - if ( - (duration > 0 && duration <= 15) || - this.props.event.type == 'deadline' || - this.props.event.type == 'remind' - ) { - className += ' size_15 '; - } else if ((duration > 15 && duration <= 30) || this.props.event.all_day) { - className += ' size_30'; - if (location) event_duration += ', ' + location; - } else if (duration > 30 && duration <= 45) { - className += ' size_45'; - } else if (duration > 45 && duration <= 60) { - className += ' size_60'; - } - - className += ' ' + this.props.event.type; - - if (this.props.event.type == 'remind') { - icon = 'stopwatch'; - } else if (this.props.event.type == 'deadline') { - icon = 'stopwatch-slash'; - } else if (this.props.event.type == 'move') { - icon = 'car-sideview'; - } - - var users = []; - var emails = []; - - (this.props.event.participants || []).map(obj => { - if (obj) { - var regex = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; - if (obj.user_id_or_mail.match(regex)) { - var user = Collections.get('users').find(obj.user_id_or_mail); - users.push(user); - } else { - var email = obj.user_id_or_mail; - emails.push(email); - } - } - }); - - return ( -
-
- {icon && } - - - {event_name} - - {(duration <= 30 || this.props.event.all_day) && ', ' + event_start} - - -
- - {duration > 30 && !this.props.event.all_day && ( -
- {event_duration} -
- )} - -
- {'' + location} -
- -
- { - return { id: u.user_id_or_mail }; - })} - max={4} - readOnly - collapsed - medium - /> -
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/calendar/event/event.scss b/tdrive/frontend/src/app/components/calendar/event/event.scss deleted file mode 100755 index c959d537..00000000 --- a/tdrive/frontend/src/app/components/calendar/event/event.scss +++ /dev/null @@ -1,144 +0,0 @@ -.event_container { - margin: 0px; - width: auto; - height: auto; - border-radius: var(--border-radius-base); - color: var(--white); - box-sizing: border-box; - padding-left: 4px; - padding-right: 2px; - padding-top: 2px; - position: relative; - transition: box-shadow 0.2s; - cursor: pointer; - - & > div { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - &:hover { - box-shadow: 0 0px 1000px 0px rgba(0, 0, 0, 0.1) inset; - } - - .icon { - display: inline-block; - font-size: 14px; - font-weight: 700; - margin-left: -2px; - } - - .text { - &.title { - font-size: 12px; - font-weight: 700; - } - - &.simple { - font-size: 11px; - font-weight: 500; - } - } - - .time, - .place, - .description, - .users { - display: flex; - flex-direction: row; - text-overflow: ellipsis; - } - - .users { - position: absolute; - bottom: 2px; - right: 2px; - display: flex; - align-items: center; - height: 28px; - - .emoji-container { - width: 24px; - text-align: center; - } - - .more { - font-size: 12px; - margin: 0 2px; - font-weight: 700; - opacity: 0.8; - } - } - - .time.size_15, - .place.size_15, - .place.size_30, - .users.size_15, - .users.size_30, - .users.size_45 { - .user_head { - width: 12px !important; - height: 12px !important; - } - } - - .place.size_45 { - margin-top: 8px; - } - - .users > div { - border-radius: var(--border-radius-base); - margin-left: 2px; - } - - //event - min-height: 60px; - - &.size_15 { - min-height: 16px; - height: 16px; - font-size: 11px; - } - - &.size_30 { - min-height: 24px; - height: 24px; - } - - &.size_45 { - min-height: 32px; - height: 32px; - } - - &.size_60 { - min-height: 48px; - } - - .inEvent { - border-style: solid; - border: 0px; - } - - //rappel - &.remind { - border-radius: var(--border-radius-large); - min-height: 18px; - } - - //deadline - - &.deadline { - border-top-left-radius: 1px; - border-top-right-radius: 1px; - box-shadow: 0 2px 0px 0px rgba(255, 0, 0, 0.5) inset; - min-height: 18px; - } - - //deplacement - - &.move { - border-radius: var(--border-radius-large); - border-top-left-radius: 4px; - } -} diff --git a/tdrive/frontend/src/app/components/calendar/time-selector.jsx b/tdrive/frontend/src/app/components/calendar/time-selector.jsx deleted file mode 100755 index 5b8d12f9..00000000 --- a/tdrive/frontend/src/app/components/calendar/time-selector.jsx +++ /dev/null @@ -1,121 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/no-direct-mutation-state */ -import React, { Component } from 'react'; -import Input from 'components/inputs/input.jsx'; -import Tooltip from 'components/tooltip/tooltip.jsx'; -import moment from 'moment'; -import DateTimeUtils from 'app/features/global/utils/datetime.js'; -import Languages from 'app/features/global/services/languages-service'; - -export default class TimeSelector extends Component { - constructor(props) { - super(props); - this.state = { - time_ts: props.ts, - time_string: moment(new Date(props.ts * 1000)).format(DateTimeUtils.getDefaultTimeFormat()), - }; - this.old_ts = props.ts; - this.focus = false; - } - - shouldComponentUpdate(nextProps, nextStates) { - if (nextProps.ts != this.old_ts) { - this.old_ts = nextProps.ts; - nextStates.time_ts = nextProps.ts; - if (!this.focus) { - nextStates.time_string = moment(new Date(nextProps.ts * 1000)).format( - DateTimeUtils.getDefaultTimeFormat(), - ); - } - } - return true; - } - - process(string) { - var h, m, am_pm; - var error = false; - - if (string) { - var match = string.match(/^[^0-9]*([0-9]+)([^0-9]+)?([0-9]*)?(.*?)$/); - - if (match) { - h = parseInt(match[1]); - m = parseInt(match[3] || '0'); - am_pm = ((match[4] ? match[4] : match[2]) || '').toLocaleLowerCase(); - if (am_pm && (am_pm[0] == 'p' || am_pm.indexOf('pm') >= 0)) { - am_pm = 'PM'; - } else if (am_pm && (am_pm[0] == 'a' || am_pm.indexOf('am') >= 0)) { - am_pm = 'AM'; - } else { - if (h == 12) { - am_pm = 'PM'; - } else { - am_pm = 'AM'; - } - } - } else { - error = true; - } - - if (h > 12) { - am_pm = ''; - } - - if (h > 23) { - error = true; - } - - if (m > 59) { - error = true; - } - } else { - error = true; - } - - this.state.time_string = string; - - if (!error) { - var d = moment(h + ':' + m + am_pm, 'LT').toDate(); - var date = new Date(this.state.time_ts * 1000); - date.setHours(d.getHours()); - date.setMinutes(d.getMinutes()); - this.state.time_ts = date.getTime() / 1000; - this.state.error = false; - this.state.time_string_formatted = moment(this.state.time_ts * 1000).format( - DateTimeUtils.getDefaultTimeFormat(), - ); - this.props.onChange && this.props.onChange(this.state.time_ts); - } else { - this.state.error = true; - } - this.setState({}); - } - - blur() { - this.focus = false; - this.setState({ time_string: this.state.time_string_formatted, error: false }); - this.props.onChangeBlur && this.props.onChangeBlur(this.state.time_ts); - this.props.onChange && this.props.onChange(this.state.time_ts); - } - - render() { - return ( -
- - this.blur()} - onFocus={() => (this.focus = true)} - value={this.state.time_string} - style={{ maxWidth: 94 }} - onChange={evt => this.process(evt.target.value)} - /> - -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/channel-attachement-list/channel-attachement-list.tsx b/tdrive/frontend/src/app/components/channel-attachement-list/channel-attachement-list.tsx deleted file mode 100644 index 0a62132e..00000000 --- a/tdrive/frontend/src/app/components/channel-attachement-list/channel-attachement-list.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Modal, ModalContent } from 'app/atoms/modal'; -import { - channelAttachmentListState, - activeChannelAttachementListTabState, -} from 'app/features/channels/state/channel-attachment-list'; -import Languages from 'app/features/global/services/languages-service'; -import Tab from 'app/molecules/tabs'; -import React from 'react'; -import { useRecoilState } from 'recoil'; -import ChannelFiles from './parts/channel-files'; -import ChannelMedias from './parts/channel-medias'; - -enum Tabs { - Medias = 0, - Files = 1, -} - -export default (): React.ReactElement => { - const [open, setOpen] = useRecoilState(channelAttachmentListState); - const [activeTab, setActiveTab] = useRecoilState(activeChannelAttachementListTabState); - - return ( - setOpen(false)} className="sm:w-[60vw] sm:max-w-2xl"> - - -
- {Languages.t('components.channel_attachement_list.medias')} -
-
, -
-
{Languages.t('components.channel_attachement_list.files')}
-
, - ]} - selected={activeTab} - onClick={index => setActiveTab(index)} - /> - {activeTab === Tabs.Medias && } - {activeTab === Tabs.Files && } - - - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-attachment.tsx b/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-attachment.tsx deleted file mode 100644 index 0da3ac28..00000000 --- a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-attachment.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { Button } from 'app/atoms/button/button'; -import { DownloadIcon } from 'app/atoms/icons-agnostic'; -import { - FileTypeArchiveIcon, - FileTypeDocumentIcon, - FileTypePdfIcon, - FileTypeSlidesIcon, - FileTypeSpreadsheetIcon, - FileTypeUnknownIcon, -} from 'app/atoms/icons-colored'; -import { Base, Info } from 'app/atoms/text'; -import { channelAttachmentListState } from 'app/features/channels/state/channel-attachment-list'; -import fileUploadApiClient from 'app/features/files/api/file-upload-api-client'; -import fileUploadService from 'app/features/files/services/file-upload-service'; -import { formatDate } from 'app/features/global/utils/format-date'; -import { formatSize } from 'app/features/global/utils/format-file-size'; -import { Message, MessageFileType } from 'app/features/messages/types/message'; -import routerService from 'app/features/router/services/router-service'; -import { UserType } from 'app/features/users/types/user'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; -import Media from 'app/molecules/media'; -import React from 'react'; -import { ArrowRight } from 'react-feather'; -import { useRecoilState } from 'recoil'; - -type FileMessageType = { - message?: Message; -}; - -type FileUserType = { - user?: UserType; -}; - -type PropsType = { - file: MessageFileType & FileMessageType & FileUserType; - is_media: boolean; -}; - -type FilePreviewType = { - file: MessageFileType & FileMessageType & FileUserType; -}; - -export default ({ file, is_media }: PropsType): React.ReactElement => { - return is_media ? : ; -}; - -const ChannelFile = ({ file }: FilePreviewType): React.ReactElement => { - const [, setOpen] = useRecoilState(channelAttachmentListState); - const name = file?.metadata?.name; - const extension = name?.split('.').pop(); - const previewUrl = fileUploadApiClient.getFileThumbnailUrlFromMessageFile(file); - const fileType = fileUploadApiClient.mimeToType(file?.metadata?.mime || ''); - const { open: openViewer } = useFileViewerModal(); - - const iconClassName = previewUrl - ? 'absolute left-0 top-0 bottom-0 right-0 m-auto w-8 h-8' - : 'absolute bottom-1 left-1 w-6 h-6'; - - return ( -
openViewer(file)} - > -
- - {(!['image', 'video'].includes(fileType) || !previewUrl) && ( - <> - {fileType === 'archive' ? ( - - ) : fileType === 'pdf' ? ( - - ) : fileType === 'document' ? ( - - ) : fileType === 'slides' ? ( - - ) : fileType === 'spreadsheet' ? ( - - ) : ( - - )} - - )} -
-
- {name} - - {extension?.toLocaleUpperCase()} • {formatDate(file?.message?.created_at)} •{' '} - {formatSize(file?.metadata?.size)} - -
-
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - - - {!!file.message && ( - - )} -
-
- ); -}; - -const ChannelMedia = ({ file }: FilePreviewType): React.ReactElement => { - const previewUrl = fileUploadApiClient.getFileThumbnailUrlFromMessageFile(file); - const type = fileUploadApiClient.mimeToType(file?.metadata?.mime || ''); - const { open: openViewer } = useFileViewerModal(); - - return ( -
openViewer(file)} - > - -
- ); -}; - -const getFileDownloadRoute = (file: MessageFileType): string => { - if (file?.metadata?.source !== 'internal') { - return ''; - } - - return fileUploadService.getDownloadRoute({ - companyId: file.metadata?.external_id?.company_id, - fileId: file.metadata?.external_id?.id, - }); -}; - -const downloadFile = (file: MessageFileType): void => { - const url = getFileDownloadRoute(file); - - if (url) { - window.location.href = url; - } -}; - -const gotoMessage = (message: Message): void => { - routerService.push( - routerService.generateRouteFromState({ - companyId: message?.cache?.company_id, - channelId: message?.cache?.channel_id, - threadId: message?.thread_id, - workspaceId: message?.cache?.workspace_id, - ...(message.id !== message?.thread_id ? { messageId: message.id } : {}), - }), - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-files.tsx b/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-files.tsx deleted file mode 100644 index ba273508..00000000 --- a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-files.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useChannelFileList } from 'app/features/channels/hooks/use-channel-media-files'; -import React, { useEffect } from 'react'; -import ChannelAttachment from './channel-attachment'; -import { LoadingAttachements, NoAttachements } from './commun'; -import PerfectScrollbar from 'react-perfect-scrollbar'; - -type PropsType = { - maxItems?: number; -}; - -export default ({ maxItems }: PropsType): React.ReactElement => { - const { loading, result, loadMore, loadItems } = useChannelFileList(); - - useEffect(() => { - loadItems(); - }, []); - - return ( - loadMore()} - > - {result.length === 0 && !loading && } - {loading ? ( - - ) : ( - result - .slice(0, maxItems || result.length) - .map(file => ) - )} - - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-medias.tsx b/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-medias.tsx deleted file mode 100644 index 8404d77c..00000000 --- a/tdrive/frontend/src/app/components/channel-attachement-list/parts/channel-medias.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { useChannelMediaList } from 'app/features/channels/hooks/use-channel-media-files'; -import fileUploadApiClient from 'app/features/files/api/file-upload-api-client'; -import React, { useEffect } from 'react'; -import ChannelAttachment from './channel-attachment'; -import { LoadingAttachements, NoAttachements } from './commun'; -import PerfectScrollbar from 'react-perfect-scrollbar'; - -type PropsType = { - maxItems?: number; -}; - -export default ({ maxItems }: PropsType): React.ReactElement => { - const { loading, result, loadMore, loadItems } = useChannelMediaList(); - - useEffect(() => { - loadItems(); - }, []); - - return ( - <> - loadMore()} - > - {result.length === 0 && !loading && } - {loading ? ( - - ) : ( - result - .slice(0, maxItems || result.length) - .map(file => { - const url = fileUploadApiClient.getFileThumbnailUrlFromMessageFile(file); - - return url && ; - }) - .filter(Boolean) - )} - - - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-attachement-list/parts/commun.tsx b/tdrive/frontend/src/app/components/channel-attachement-list/parts/commun.tsx deleted file mode 100644 index 24ba5228..00000000 --- a/tdrive/frontend/src/app/components/channel-attachement-list/parts/commun.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Loader } from 'app/atoms/loader'; -import { Info } from 'app/atoms/text'; -import Languages from 'app/features/global/services/languages-service'; -import React from 'react'; - -export const LoadingAttachements = (): React.ReactElement => { - return ( -
- -
- ); -}; - -export const NoAttachements = (): React.ReactElement => { - return ( -
- - {Languages.t('components.channel_attachement_list.nothing_found')} - -
- ); -}; diff --git a/tdrive/frontend/src/app/components/channel-members-list/channel-members-modal.tsx b/tdrive/frontend/src/app/components/channel-members-list/channel-members-modal.tsx deleted file mode 100644 index 1a524bb9..00000000 --- a/tdrive/frontend/src/app/components/channel-members-list/channel-members-modal.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { InformationCircleIcon } from '@heroicons/react/outline'; -import { SearchIcon } from '@heroicons/react/solid'; -import { Alert } from 'app/atoms/alert'; -import { InputDecorationIcon } from 'app/atoms/input/input-decoration-icon'; -import { Input } from 'app/atoms/input/input-text'; -import Text, { Info } from 'app/atoms/text'; -import { useSearchChannelMembersAll } from 'app/features/channel-members-search/hooks/use-search-all'; -import Languages from 'app/features/global/services/languages-service'; -import { delayRequest } from 'app/features/global/utils/managedSearchRequest'; -import Strings from 'app/features/global/utils/strings'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import { invitationState } from 'app/features/invitation/state/invitation'; -import useRouterChannel from 'app/features/router/hooks/use-router-channel'; -import { useEffect, useState } from 'react'; -import PerfectScrollbar from 'react-perfect-scrollbar'; -import { useRecoilState } from 'recoil'; -import { EmailItem } from './email-item'; -import { MemberItem } from './member-item'; -import { UserItem } from './user-item'; -import AccessRightsService from 'app/features/workspace-members/services/workspace-members-access-rights-service'; -import { useCurrentWorkspace } from 'app/features/workspaces/hooks/use-workspaces'; - -export const ChannelMembersListModal = (): JSX.Element => { - const channelId = useRouterChannel(); - const [query, setQuery] = useState(''); - - const { addEmailSuggestion, pendingEmailList, channelMembersList, usersList, search, refresh } = - useSearchChannelMembersAll({ - channelId, - }); - - useEffect(() => { - delayRequest('ChannelMembersListModal', async () => { - search(query); - }); - }, [search, query]); - - useEffect(() => { - if (channelId) refresh(); - }, [channelId]); - - return ( -
-
- ( - { - setQuery(e.target.value); - }} - value={query} - /> - )} - /> - {pendingEmailList?.length === 0 && channelMembersList?.length <= 1 && ( - - )} -
-
- -
- {addEmailSuggestion && - pendingEmailList?.length === 0 && - channelMembersList?.length === 0 && - usersList?.length === 0 && - !Strings.verifyMail(query) && ( - <> - - {Languages.t( - 'scenes.client.channelbar.channelmemberslist.search_invite_type_email', - )} - - - )} - {addEmailSuggestion && } - {pendingEmailList?.length > 0 && ( - <> - - {Languages.t('scenes.client.channelbar.channelmemberslist.pending_section')} - - - )} - {pendingEmailList && - pendingEmailList.map((item, index) => { - return ( -
- -
- ); - })} - {channelMembersList?.length > 0 && ( - <> - - {Languages.t('scenes.client.channelbar.channelmemberslist.members_section')} - - - )} - {channelMembersList && - channelMembersList - .filter(a => a && a?.user) - .map(cMember => { - return ( -
- -
- ); - })} - {usersList?.length > 0 && ( - <> - - {Languages.t('scenes.client.channelbar.channelmemberslist.not_members_section')} - - - )} - {usersList && - usersList.map(user => { - return ( -
- -
- ); - })} -
-
-
-
- ); -}; - -const EmailSuggestion = ({ email }: { email: string }) => { - const [, setInvitationOpen] = useRecoilState(invitationState); - const { addInvitation, allowed_guests, allowed_members } = useInvitationUsers(); - const { workspace } = useCurrentWorkspace(); - - const invite = () => { - addInvitation(email); - setInvitationOpen(true); - }; - if (!email || !Strings.verifyMail(email)) { - return <>; - } - - return AccessRightsService.hasLevel(workspace?.id, 'moderator') && - (allowed_guests > 0 || allowed_members > 0) ? ( -
- - invite()}> - {Languages.t( - 'scenes.client.channelbar.channelmemberslist.invite_to_workspace', - [email], - `Invite ${email} to the workspace ➡`, - )} - - -
- ) : ( - <> - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-members-list/email-item.tsx b/tdrive/frontend/src/app/components/channel-members-list/email-item.tsx deleted file mode 100644 index a3741725..00000000 --- a/tdrive/frontend/src/app/components/channel-members-list/email-item.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { MailIcon } from '@heroicons/react/outline'; -import { XIcon } from '@heroicons/react/solid'; -import { Tooltip } from 'antd'; -import { Button } from 'app/atoms/button/button'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import { Info } from 'app/atoms/text'; -import { usePendingEmail } from 'app/features/channel-members-search/hooks/use-pending-email-hook'; -import Languages from 'app/features/global/services/languages-service'; -import { PendingEmail } from 'app/features/pending-emails/types/pending-email'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import WorkspaceUserAPIClient from 'app/features/workspace-members/api/workspace-members-api-client'; -import { WorkspacePendingUserType } from 'app/features/workspaces/types/workspace'; -import { useState } from 'react'; - -type IProps = { - email: PendingEmail; -}; - -export const EmailItem = (props: IProps): JSX.Element => { - const { email } = props.email; - const { loading, cancelInvite } = usePendingEmail(email); - const workspaceId = useRouterWorkspace(); - const companyId = useRouterCompany(); - const [cancelWorkspaceInvitation, setCancelWorkspaceInvitation] = - useState(null); - - const _cancelInvite = async () => { - //Also check if the user is pending in the workspace and display something if that's the case - const pending = await WorkspaceUserAPIClient.listPending(companyId, workspaceId); - const foundWorkspacePending = pending.find( - p => p.email.toLocaleLowerCase() === email.toLocaleLowerCase(), - ); - if (foundWorkspacePending) { - //Propose to also cancel workspace invitation - setCancelWorkspaceInvitation(foundWorkspacePending); - } else { - await cancelInvite(); - } - }; - - return ( - <> - setCancelWorkspaceInvitation(null)}> - { - setCancelWorkspaceInvitation(null); - cancelInvite(); - }} - > - {Languages.t('general.no')} - , - , - ]} - > - -
- -
- - {email}{' '} - - ( - {Languages.t( - 'scenes.client.channels_bar.modals.parts.channel_member_row.label.pending_email', - )} - ) - - -
-
-
- - - -
- - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-members-list/member-item.tsx b/tdrive/frontend/src/app/components/channel-members-list/member-item.tsx deleted file mode 100644 index c7ad9c7f..00000000 --- a/tdrive/frontend/src/app/components/channel-members-list/member-item.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import Avatar from 'app/atoms/avatar'; -import { ChannelMemberWithUser } from 'app/features/channel-members-search/types/channel-members'; -import Languages from 'app/features/global/services/languages-service'; -import UsersService from 'app/features/users/services/current-user-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import useRouterChannel from 'app/features/router/hooks/use-router-channel'; -import { useChannelMember } from 'app/features/channel-members-search/hooks/member-hook'; -import { LogoutIcon } from '@heroicons/react/outline'; -import { Tooltip } from 'antd'; -import { ButtonConfirm } from 'app/atoms/button/confirm'; -import MemberGrade from 'app/views/client/popup/WorkspaceParameter/Pages/WorkspacePartnerTabs/MemberGrade'; - -type IMemberProps = { - member: ChannelMemberWithUser; - userId?: string; -}; - -export const MemberItem = (props: IMemberProps): JSX.Element => { - const { member, userId } = props; - const { first_name, email } = member.user; - const companyId = useRouterCompany(); - const workspaceId = useRouterWorkspace(); - const channelId = useRouterChannel(); - - const parameters = { companyId, workspaceId, channelId }; - - const { leave, loading } = useChannelMember(userId || '', parameters); - - const isCurrentUser = (): boolean => { - const currentUserId: string = UsersService.getCurrentUserId(); - - return props.userId === currentUserId; - }; - - return ( - <> -
- -
-
-
- {first_name} - {email} -
-
-
- c.company.id === companyId)?.role || ''} - workspaceRole={member.user.workspaces?.find(c => c.id === workspaceId)?.role || ''} - /> -
-
- {isCurrentUser() ? ( - - leave(props.userId || '')} - /> - - ) : ( - - leave(props.userId || '')} - /> - - )} -
- - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-members-list/user-item.tsx b/tdrive/frontend/src/app/components/channel-members-list/user-item.tsx deleted file mode 100644 index 81982c98..00000000 --- a/tdrive/frontend/src/app/components/channel-members-list/user-item.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import Avatar from 'app/atoms/avatar'; -import UsersService from 'app/features/users/services/current-user-service'; -import { useUser } from 'app/features/users/hooks/use-user'; -import { Button } from 'app/atoms/button/button'; -import Languages from 'app/features/global/services/languages-service'; -import { useChannelMember } from 'app/features/channel-members-search/hooks/member-hook'; -import { PlusIcon } from '@heroicons/react/solid'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import React from 'react'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import ConsoleService from 'app/features/console/services/console-service'; -import MemberGrade from 'app/views/client/popup/WorkspaceParameter/Pages/WorkspacePartnerTabs/MemberGrade'; - -type IUserProps = { - userId: string; -}; - -export const UserItem = (props: IUserProps): JSX.Element => { - const { userId } = props; - const user = useUser(userId || ''); - const workspaceId = useRouterWorkspace(); - const companyId = useRouterCompany(); - const [confirmWorkspaceInvitation, setConfirmWorkspaceInvitation] = - React.useState(false); - - if (!user) { - return <>; - } - - const { addMember, loading } = useChannelMember(userId || ''); - const [full_name, avatar] = [UsersService.getFullName(user), UsersService.getThumbnail(user)]; - - const _addMember = () => { - if (!(user.workspaces || []).map(w => w.id).includes(workspaceId)) { - //Ask for confirmation to invite the user to the workspace first - setConfirmWorkspaceInvitation(true); - } else { - addMember(userId || ''); - } - }; - - return ( - <> - setConfirmWorkspaceInvitation(false)}> - setConfirmWorkspaceInvitation(false)}> - {Languages.t('general.no')} - , - , - ]} - > - - -
- -
-
-
- {full_name} - {user.email} -
-
-
- c.company.id === companyId)?.role || ''} - workspaceRole={user.workspaces?.find(c => c.id === workspaceId)?.role || ''} - /> -
-
-
- - ); -}; diff --git a/tdrive/frontend/src/app/components/channel-members-list/users-search-modal.tsx b/tdrive/frontend/src/app/components/channel-members-list/users-search-modal.tsx deleted file mode 100644 index 7543b427..00000000 --- a/tdrive/frontend/src/app/components/channel-members-list/users-search-modal.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Modal, ModalContent } from 'app/atoms/modal'; -import { useUsersSearchModal } from 'app/features/channel-members-search/state/search-channel-member'; -import Languages from 'app/features/global/services/languages-service'; -import { ChannelMembersListModal } from './channel-members-modal'; - -export default () => { - const { open, setOpen } = useUsersSearchModal(); - - return ( - setOpen(false)} className="sm:w-[80vw] sm:max-w-xl"> - - - - - ); -}; diff --git a/tdrive/frontend/src/app/components/channels-selector/index.tsx b/tdrive/frontend/src/app/components/channels-selector/index.tsx deleted file mode 100644 index 1e13c54c..00000000 --- a/tdrive/frontend/src/app/components/channels-selector/index.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { SearchIcon } from '@heroicons/react/outline'; -import Avatar from 'app/atoms/avatar'; -import { InputDecorationIcon } from 'app/atoms/input/input-decoration-icon'; -import { Input } from 'app/atoms/input/input-text'; -import { Loader } from 'app/atoms/loader'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import { Base, Info } from 'app/atoms/text'; -import { - useSearchChannels, - useSearchChannelsLoading, -} from 'app/features/search/hooks/use-search-channels'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import Block from 'app/molecules/grouped-rows/base'; -import { useEffect, useState } from 'react'; -import PerfectScrollbar from 'react-perfect-scrollbar'; -import { atom, useRecoilState, useSetRecoilState } from 'recoil'; -import Button from '../buttons/button'; -import Emojione from '../emojione/emojione'; -import UsersService from 'app/features/users/services/current-user-service'; -import { ChannelType } from 'app/features/channels/types/channel'; -import { Checkbox } from 'app/atoms/input/input-checkbox'; -import Languages from '../../features/global/services/languages-service'; -import Icon from '../icon/icon'; - -export const SelectChannelModalAtom = atom({ - key: 'SelectChannelModalAtom', - default: false, -}); - -export const ChannelSelectorModal = (props: { - initialChannels: ChannelType[]; - onChange: (channels: ChannelType[]) => void; - lockDefaultChannels?: boolean; -}) => { - const [open, setOpen] = useRecoilState(SelectChannelModalAtom); - const [channels, setChannels] = useState([]); - - return ( - setOpen(false)}> - - { - setChannels(channels); - }} - lockDefaultChannels={props.lockDefaultChannels} - /> - - - - ); -}; - -export const ChannelSelector = (props: { - initialChannels: ChannelType[]; - onChange: (channels: ChannelType[]) => void; - lockDefaultChannels?: boolean; -}) => { - const [selectedChannels, setSelectedChannels] = useState(props.initialChannels); - const setSearch = useSetRecoilState(SearchInputState); - const { channels } = useSearchChannels(); - const loading = useSearchChannelsLoading(); - - const displayedChannels = props.lockDefaultChannels - ? [ - ...channels.filter(channel => channel.is_default), - ...channels.filter(channel => !channel.is_default), - ] - : channels; - - useEffect(() => { - props.onChange(selectedChannels); - }, [selectedChannels]); - - return ( - <> - ( -
- -
- ) - : SearchIcon - } - input={({ className }) => ( - setSearch({ query: e.target.value })} - /> - )} - /> - - - {displayedChannels.map(channel => { - const name = - channel.name || channel.users?.map(u => UsersService.getFullName(u)).join(', '); - - return ( - - -
- ) - } - title={name || ''} - /> - } - title={{name}} - subtitle={ - {`${ - channel.stats?.members || channel.members?.length || 0 - } members`} - } - suffix={ -
- {props.lockDefaultChannels && - props.initialChannels.find(({ id }) => channel.id === id) && - channel.is_default ? ( -
- -
- ) : ( - channel.id === id)} - onChange={() => { - if (selectedChannels.includes(channel)) { - setSelectedChannels(selectedChannels.filter(c => c.id !== channel.id)); - } else if (channel.id) { - setSelectedChannels([...selectedChannels, channel]); - } - }} - /> - )} -
- } - className="py-2" - /> - ); - })} - - - ); -}; diff --git a/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.scss b/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.scss deleted file mode 100644 index bfbe28d4..00000000 --- a/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.scss +++ /dev/null @@ -1,11 +0,0 @@ -.companyMessagesCounter { - margin-right: 8px; - - .info { - font-weight: 400; - opacity: 0.5; - } - .link { - margin-top: 4px; - } -} diff --git a/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.tsx b/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.tsx deleted file mode 100644 index 51346ddf..00000000 --- a/tdrive/frontend/src/app/components/company-messages-counter/company-messages-counter.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Col, Progress, Row, Typography } from 'antd'; -import './company-messages-counter.scss'; -import i18n from 'i18next'; - -import Languages from 'app/features/global/services/languages-service'; -import { useCurrentCompany } from 'app/features/companies/hooks/use-companies'; -import FeatureTogglesService, { - FeatureNames, -} from 'app/features/global/services/feature-toggles-service'; -import MessageHistoryService from 'app/features/messages/services/message-history-service'; -import consoleService from 'app/features/console/services/console-service'; - -const { Text, Title, Link } = Typography; -const CompanyMessagesCounter = () => { - const [messagesCount, setMessagesCount] = useState(1); - const companyMessagesLimit = MessageHistoryService.getLimitCompanyMessages(); - - const { company } = useCurrentCompany(); - - const companySubscriptionUrl = consoleService.getCompanySubscriptionUrl(company.id); - - const onClickLink = () => window.open(companySubscriptionUrl, 'blank'); - - useEffect(() => { - if (company) { - setMessagesCount(company.stats?.total_messages || 1); - } - }, [company]); - - return !FeatureTogglesService.isActiveFeatureName(FeatureNames.MESSAGE_HISTORY) ? ( - <> - - - - {Languages.t('scenes.app.channelsbar.currentuser.company_messages_counter_header', [])} - - - {Languages.t('scenes.app.channelsbar.currentuser.company_messages_counter_info', [ - Intl.NumberFormat(i18n.language).format(companyMessagesLimit), - ])} - -
- - {Languages.t('scenes.app.channelsbar.currentuser.company_messages_counter_link', [])} - -
- - - (messagesCount / 1000).toFixed(1) + 'k'} - percent={(messagesCount / companyMessagesLimit) * 100} - width={55} - /> - -
- - ) : ( - <> - ); -}; -export default CompanyMessagesCounter; diff --git a/tdrive/frontend/src/app/components/components-tester/component-doc.jsx b/tdrive/frontend/src/app/components/components-tester/component-doc.jsx deleted file mode 100755 index 985c48f0..00000000 --- a/tdrive/frontend/src/app/components/components-tester/component-doc.jsx +++ /dev/null @@ -1,59 +0,0 @@ -/* eslint-disable react/jsx-key */ -import React, { Component } from 'react'; -import InputWithClipBoard from 'components/input-with-clip-board/input-with-clip-board.jsx'; -import './component-doc.scss'; - -export default class ComponentDoc extends React.Component { - constructor() { - super(); - } - render() { - return ( -
-
- {this.props.title &&
{this.props.title}
} - {this.props.import && ( - - )} -
-
{this.props.children}
-
- {this.props.properties && [ -
Properties
, - - - - - - - - - - {this.props.properties.map(property => { - return ( - - - - - - - ); - })} -
PropertyTypeDefaultDescription
{property[0]} - {property[1].split(',').map(item => ( - {item} - ))} - {property[2]}{property[3]}
, -
, -
, - ]} - - {this.props.infos && [ -
Infos
, -
{this.props.infos}
, - ]} -
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/components-tester/component-doc.scss b/tdrive/frontend/src/app/components/components-tester/component-doc.scss deleted file mode 100755 index 1fc53cbe..00000000 --- a/tdrive/frontend/src/app/components/components-tester/component-doc.scss +++ /dev/null @@ -1,50 +0,0 @@ -.component_doc { - background: var(--grey-background); - padding: 25px; - max-height: 100vh; - overflow: scroll; - box-sizing: border-box; - - .section { - background: var(--white); - max-width: 900px; - margin: auto; - left: 0; - right: 0; - padding: 25px; - box-sizing: border-box; - border-radius: var(--border-radius-base); - margin-top: 25px; - } - - .header { - input { - background: var(--black); - color: #fff; - font-family: monospace; - } - } - - .subtitle { - font-weight: 700; - } - - .properties { - border-collapse: collapse; - width: 100%; - - thead { - font-weight: 700; - } - - td { - border: 1px solid var(--grey-background); - padding: 8px; - } - .type { - background: var(--grey-background); - padding: 2px 4px; - border-radius: var(--border-radius-base); - } - } -} diff --git a/tdrive/frontend/src/app/components/components-tester/components-tester.jsx b/tdrive/frontend/src/app/components/components-tester/components-tester.jsx deleted file mode 100755 index 67bab63a..00000000 --- a/tdrive/frontend/src/app/components/components-tester/components-tester.jsx +++ /dev/null @@ -1,370 +0,0 @@ -/* eslint-disable react/jsx-key */ -import React, { Component } from 'react'; -import Emojione from 'components/emojione/emojione'; -import Icon from 'app/components/icon/icon.jsx'; -import Menu from 'components/menus/menu.jsx'; -import MenusBodyLayer from 'app/components/menus/menus-body-layer.jsx'; -import AutoComplete from 'components/auto-complete/auto-complete'; -import UserPicker from 'components/user-picker/user-picker.jsx'; -import EmojiPicker from 'components/emoji-picker/emoji-picker.jsx'; - -import Directory from 'components/drive/directory.jsx'; -import File from 'components/drive/file'; -import DriveMultiSelector from 'components/drive/drive-multi-selector.jsx'; - -import Rounded from 'components/inputs/rounded.jsx'; - -import DraggableBodyLayer from 'components/draggable/draggable-body-layer.jsx'; - -import emojiService from 'app/components/rich-text-editor/emojis-service.jsx'; -import User from 'components/ui/user.jsx'; - -import AutoHeight from 'components/auto-height/auto-height.jsx'; -import Tooltip from 'components/tooltip/tooltip.jsx'; -import InputWithClipBoard from 'components/input-with-clip-board/input-with-clip-board.jsx'; - -import './components-tester.scss'; -import GroupInputs from './group/inputs.js'; - -export default class ComponentsTester extends React.Component { - constructor() { - super(); - this.state = { - autocompValue: '', - visible: false, - }; - } - render() { - return [ -
-
-
Test des composants
-
ctrl+alt+e pour revenir à Tdrive
-
- - - -
-
Icones
- -
- Title -
-
- Sub title -
-
- Text -
-
- -
-
Emojione
-
- Title -
-
- Subtitle -
-
- Text -
-
-
-
Tooltip
-
- (this.tooltip = o)} - tooltip={'toolltiiiiiiiiip'} - position={'top'} - overable={false} - > -
this is my tooltip top
-
-
- -
- -
this is my tooltip top
-
-
-
- -
-
Input with clipboard
-
- -
-
- -
-
Menus
- - salut
, - }, - ], - }, - { type: 'separator' }, - { type: 'text', text: 'Du texte' }, - ]} - > - Click here ! - -
-
-
Auto complete one line
- { - cb( - [ - { - id: 1, - username: 'benoit', - mail: 'benoit.tallandier@g.a', - userimage: 'https://randomuser.me/api/portraits/men/40.jpg', - }, - { - id: 2, - username: 'romaric', - mail: 'romaric.mourgues@g.a', - userimage: 'https://randomuser.me/api/portraits/men/41.jpg', - }, - { - id: 3, - username: 'guillaume', - mail: 'romaric.mourgues@g.a', - userimage: 'https://randomuser.me/api/portraits/men/42.jpg', - }, - { - id: 4, - username: 'Amandine', - mail: 'romaric.mourgues@g.a', - userimage: 'https://randomuser.me/api/portraits/women/40.jpg', - }, - ].filter(function (item) { - if (item && item.username.indexOf(text) !== -1) { - return true; - } - return false; - }), - ); - }, - (text, cb) => { - cb(emojiService.search(text)); - }, - ]} - max={[5, 5]} - renderItemChoosen={[ - item => { - return '@' + (item || {}).username + ' '; - }, - item => { - return item.shortname + ' '; - }, - ]} - renderItem={[ - item => { - return ( -
- -
- ); - }, - item => { - return ( -
- {item.shortname} -
- ); - }, - ]} - regexHooked={[/\B@([\-+\w]*)$/, /\B:([\-+\w]{0}[\-+\w]*)$/]} - placeholder="Placeholder" - autoHeight - /> -
-
-
Multi-line input
- - -
-
-
Users picker
-
In menu
- this.setState({ users_picker_value: list })} - /> - ), - }, - ]} - > -
Open menu
-
- -
-
-
Inline
- - this.setState({ users_picker_value: list })} - inline - /> - -
-
Inline read only
- - - -
-
Inline read only miniatures
- - -
-
-
Emoji picker
- }]}> - Click here ! - -
- -
- - -
Drive
- -
- TODO: Tester drag drop depuis ordinateur -
- TODO: Faire apparaitre l'icone "drag + menu" au survol -
- - -
-
Dossiers
- - - - - - - - - -
-
- -
Fichiers
- - - - - - - - - -
-
-
- , - , - , - ]; - } -} diff --git a/tdrive/frontend/src/app/components/components-tester/components-tester.scss b/tdrive/frontend/src/app/components/components-tester/components-tester.scss deleted file mode 100755 index 3f42f35e..00000000 --- a/tdrive/frontend/src/app/components/components-tester/components-tester.scss +++ /dev/null @@ -1,19 +0,0 @@ -.componentTester { - background: #f5f5f7; - padding: 25px; - max-height: 100vh; - overflow: scroll; - box-sizing: border-box; - - .section { - background: #fff; - max-width: 900px; - margin: auto; - left: 0; - right: 0; - padding: 25px; - box-sizing: border-box; - border-radius: var(--border-radius-base); - margin-top: 25px; - } -} diff --git a/tdrive/frontend/src/app/components/components-tester/group/inputs.jsx b/tdrive/frontend/src/app/components/components-tester/group/inputs.jsx deleted file mode 100755 index 040d872c..00000000 --- a/tdrive/frontend/src/app/components/components-tester/group/inputs.jsx +++ /dev/null @@ -1,124 +0,0 @@ -/* eslint-disable react/jsx-key */ -import React, { Component } from 'react'; - -import Checkbox from 'app/components/inputs/deprecated_checkbox.jsx'; -import Switch from 'components/inputs/switch'; -import Button from 'components/buttons/button.jsx'; -import Input from 'components/inputs/input.jsx'; - -import StepCounter from 'components/step-counter/step-counter.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import { lang } from 'moment'; - -export default class GroupInputs extends React.Component { - constructor() { - super(); - this.state = { - input: 'Example', - }; - } - render() { - return [ -
-
Formulaires
- -
className="big"
- this.setState({ input: evt.target.value })} - /> -
- this.setState({ input: value })} - /> -
- this.setState({ input: value })} - /> -
- -
className="medium"
- this.setState({ input: evt.target.value })} - /> -
- this.setState({ input: value })} - /> -
- this.setState({ input: value })} - /> -
- -
className="small"
- this.setState({ input: evt.target.value })} - /> -
- this.setState({ input: value })} - /> -
- this.setState({ input: value })} - /> -
-
, -
-
- -
Create my company 3/4
-
- {Languages.t( - 'scenes.app.workspaces.create_company.importations.title_1', - [], - 'Already working with digital tools? Import or integrate your tools now!', - )} -
- {Languages.t( - 'scenes.app.workspaces.create_company.importations.title_2', - [], - 'No worries, you can do this later!', - )} -
- -
-
-
What's your company name ?
- this.setState({ company_name: evt.target.value })} - placeholder="Ex : Google, Aircall, Doctolib" - /> -
-
- -
-
-
-
, - ]; - } -} diff --git a/tdrive/frontend/src/app/components/connection-indicator/connection-indicator.tsx b/tdrive/frontend/src/app/components/connection-indicator/connection-indicator.tsx index 22d0c911..43dc4334 100644 --- a/tdrive/frontend/src/app/components/connection-indicator/connection-indicator.tsx +++ b/tdrive/frontend/src/app/components/connection-indicator/connection-indicator.tsx @@ -3,10 +3,10 @@ import './connection-indicator.scss'; import ErrorOutlinedIcon from '@material-ui/icons/ErrorOutlined'; import HourglassEmpty from '@material-ui/icons/HourglassEmpty'; import CheckCircleIcon from '@material-ui/icons/CheckCircle'; -import Languages from 'app/features/global/services/languages-service'; -import { ConnectedState } from 'app/features/users/state/atoms/connected'; +import Languages from '@features/global/services/languages-service'; +import { ConnectedState } from '@features/users/state/atoms/connected'; import { useRecoilState } from 'recoil'; -import WebSocket, { WebsocketEvents } from 'app/features/global/types/websocket-types'; +import WebSocket, { WebsocketEvents } from '@features/global/types/websocket-types'; export default () => { const [{ connected, reconnecting }, setState] = useRecoilState(ConnectedState); diff --git a/tdrive/frontend/src/app/components/connectors-list-manager/connectors-list-manager.jsx b/tdrive/frontend/src/app/components/connectors-list-manager/connectors-list-manager.jsx index f62f1160..ef63da2d 100755 --- a/tdrive/frontend/src/app/components/connectors-list-manager/connectors-list-manager.jsx +++ b/tdrive/frontend/src/app/components/connectors-list-manager/connectors-list-manager.jsx @@ -6,9 +6,9 @@ import AddIcon from '@material-ui/icons/AddOutlined'; import GearIcon from '@material-ui/icons/BuildOutlined'; import Input from 'components/inputs/input.jsx'; import './connectors-list-manager.scss'; -import Languages from 'app/features/global/services/languages-service'; -import WorkspacesApps from 'app/deprecated/workspaces/workspaces_apps.jsx'; -import { getCompanyApplication as getApplication } from 'app/features/applications/state/company-applications'; +import Languages from '@features/global/services/languages-service'; +import WorkspacesApps from '@deprecated/workspaces/workspaces_apps.jsx'; +import { getCompanyApplication as getApplication } from '@features/applications/state/company-applications'; export default class ConnectorsListManager extends Component { constructor(props) { diff --git a/tdrive/frontend/src/app/components/desktop-redirect/index.tsx b/tdrive/frontend/src/app/components/desktop-redirect/index.tsx index 67c38639..54bf60e0 100644 --- a/tdrive/frontend/src/app/components/desktop-redirect/index.tsx +++ b/tdrive/frontend/src/app/components/desktop-redirect/index.tsx @@ -1,11 +1,11 @@ -import { Loader } from 'app/atoms/loader'; -import { OpenDesktopPopup } from 'app/components/open-desktop-popup/open-desktop-popup'; -import Electron from 'app/features/global/framework/electron-service'; -import { useGlobalEffect } from 'app/features/global/hooks/use-global-effect'; -import { LoadingState } from 'app/features/global/state/atoms/Loading'; -import { useWebState } from 'app/features/global/state/atoms/use-web'; -import { getDevice } from 'app/features/global/utils/device'; -import { useCurrentUser } from 'app/features/users/hooks/use-current-user'; +import { Loader } from '@atoms/loader'; +import { OpenDesktopPopup } from '@components/open-desktop-popup/open-desktop-popup'; +import Electron from '@features/global/framework/electron-service'; +import { useGlobalEffect } from '@features/global/hooks/use-global-effect'; +import { LoadingState } from '@features/global/state/atoms/Loading'; +import { useWebState } from '@features/global/state/atoms/use-web'; +import { getDevice } from '@features/global/utils/device'; +import { useCurrentUser } from '@features/users/hooks/use-current-user'; import React from 'react'; import { useRecoilState } from 'recoil'; import { detectDesktopAppPresence } from 'src/utils/browser-detect'; diff --git a/tdrive/frontend/src/app/components/download-app-banner/download-app-banner.tsx b/tdrive/frontend/src/app/components/download-app-banner/download-app-banner.tsx index 11c13d2f..a5a679f2 100644 --- a/tdrive/frontend/src/app/components/download-app-banner/download-app-banner.tsx +++ b/tdrive/frontend/src/app/components/download-app-banner/download-app-banner.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import InitService from '../../features/global/services/init-service'; import LocalStorage from '../../features/global/framework/local-storage-service'; -import DownloadBanner from 'app/molecules/download-banner'; +import DownloadBanner from '@molecules/download-banner'; import { detectDesktopAppPresence } from '../../../utils/browser-detect'; export default (): React.ReactElement => { diff --git a/tdrive/frontend/src/app/components/draggable/draggable-body-layer.jsx b/tdrive/frontend/src/app/components/draggable/draggable-body-layer.jsx deleted file mode 100755 index d37734c9..00000000 --- a/tdrive/frontend/src/app/components/draggable/draggable-body-layer.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import React, { Component } from 'react'; - -import DraggableManager from './draggable-manager.js'; - -export default class DraggableBodyLayer extends Component { - constructor() { - super(); - this.state = { - draggable_manager: DraggableManager, - }; - this.draggable_body_dom = null; - DraggableManager.addListener(this); - } - componentDidMount() { - DraggableManager.registerContainer(this.draggable_body_dom); - } - componentWillUnmount() { - DraggableManager.removeListener(this); - } - render() { - return
(this.draggable_body_dom = node)} />; - } -} diff --git a/tdrive/frontend/src/app/components/draggable/draggable-manager.js b/tdrive/frontend/src/app/components/draggable/draggable-manager.js deleted file mode 100755 index 9af86534..00000000 --- a/tdrive/frontend/src/app/components/draggable/draggable-manager.js +++ /dev/null @@ -1,238 +0,0 @@ -import React, { Component } from 'react'; - -import Observable from 'app/deprecated/CollectionsV1/observable.js'; -import SelectionsManager from 'app/deprecated/SelectionsManager/SelectionsManager.js'; - -class DraggableManager extends Observable { - constructor() { - super(); - this.setObservableName('draggable_manager'); - this.container = null; - - this.move = this.move.bind(this); - this.end = this.end.bind(this); - this.start = this.start.bind(this); - - this.drag = false; - this.clone_created = false; - this.drag_initial_point = []; - this.current_node_initial_position = []; - } - - registerContainer(container) { - this.container = container; - } - - setDropCallback(key, callback) { - this.callback_key = key; - this.callback = callback; - } - - removeDropCallback(key) { - if (this.callback_key == key) { - this.callback = false; - this.callback_key = null; - } - } - - start(evt, node, react_draggable) { - if (this.dragging) { - return; - } - - if (react_draggable.props.dragHandler) { - var onHandler = false; - var handlers = node.getElementsByClassName(react_draggable.props.dragHandler); - if (handlers.length > 0) { - Array.from(handlers).forEach(item => { - if (item == evt.target || item.contains(evt.target)) { - onHandler = true; - } - }); - } - - if (!onHandler) { - return; - } - } - - this.data = {}; - if (node) { - this.current_node = node; - } - if (react_draggable) { - this.current_react_draggable = react_draggable; - this.props = { - parentClassOnDrag: this.current_react_draggable.props.parentClassOnDrag, - minMove: this.current_react_draggable.props.minMove, - }; - this.data = this.current_react_draggable.props.data; - } - - this.selected_number = 1; - if (this.data.selection_type) { - this.selected_number = SelectionsManager.selected_per_type[this.data.selection_type]; - if (this.selected_number) { - this.selected_number = Object.keys(this.selected_number).length; - } - - if (!this.selected_number) { - this.selected_number = 1; - } - } - - evt.stopPropagation(); - evt.preventDefault(); - - document.addEventListener('mousemove', this.move); - document.addEventListener('mouseup', this.end); - var rect = window.getBoundingClientRect(this.current_node); - rect.x = rect.x || rect.left; - rect.y = rect.y || rect.top; - - this.clone_created = false; - this.drag_initial_point = [evt.clientX, evt.clientY]; - this.current_node_initial_position = [rect.left, rect.top, node.clientWidth, node.clientHeight]; - - this.drag = true; - if (this.current_react_draggable) this.current_react_draggable.setState({ drag: true }); - } - end(evt, node, react_draggable) { - if (this.dragging) { - evt.preventDefault(); - evt.stopPropagation(); - } - - this.current_react_draggable && this.current_react_draggable.setState({ hide_original: false }); - - if (!this.data) { - return; - } - - if (node) { - this.current_node = node; - } - if (react_draggable) { - this.current_react_draggable = react_draggable; - this.props = { - parentClassOnDrag: this.current_react_draggable.props.parentClassOnDrag, - minMove: this.current_react_draggable.props.minMove, - }; - } - - document.removeEventListener('mousemove', this.move); - document.removeEventListener('mouseup', this.end); - - document.body.classList.remove('dragging'); - document.body.classList.remove('drag_' + this.data.type); - this.drag = false; - this.dragging = false; - if (this.current_react_draggable) - this.current_react_draggable.setState({ drag: false, dragging: false }); - - var delete_delay = 0; - if (this.callback) { - this.callback(this.data); - } else { - if (this.clone) { - this.clone.style.transition = 'transform 0.2s'; - this.clone.style.transform = - 'translateX(' + - this.current_node_initial_position[0] + - 'px) translateY(' + - this.current_node_initial_position[1] + - 'px)'; - } - delete_delay = 200; - } - - setTimeout(() => { - if (this.clone) { - try { - this.container.removeChild(this.clone); - } catch (e) {} - } - if (this.current_react_draggable) - this.current_react_draggable.setState({ hide_original: false }); - if (this.props.parentClassOnDrag) { - this.props.parentClassOnDrag.split(' ').forEach(c => { - this.container.classList.remove(c); - }); - } - }, delete_delay); - - this.data = {}; - } - move(evt) { - if (!this.data) { - return; - } - - var deltaX = evt.clientX - this.drag_initial_point[0]; - var deltaY = evt.clientY - this.drag_initial_point[1]; - - if ( - !this.clone_created && - Math.max(Math.abs(deltaX), Math.abs(deltaY)) < (this.props.minMove || 10) - ) { - return; - } - - if (this.drag) { - if (!this.clone_created) { - var html = this.current_node.outerHTML; - var div = document.createElement('div'); - div.classList.add('draggable_clone'); - div.innerHTML = html.trim(); - div.firstChild.classList.remove('dragging_opacity'); - div.firstChild.classList.remove('fade_in'); - div.firstChild.classList.remove('is_selected'); - - div.style.width = this.current_node_initial_position[2] + 'px'; - div.style.height = this.current_node_initial_position[3] + 'px'; - - this.clone = div; - - if (this.selected_number > 1) { - var div_number = document.createElement('div'); - div_number.classList.add('draggable_number'); - div_number.innerHTML = this.selected_number; - this.clone.appendChild(div_number); - } - - this.container.appendChild(this.clone); - this.clone_created = true; - - if (this.props.parentClassOnDrag) { - this.props.parentClassOnDrag.split(' ').forEach(c => { - this.container.classList.add(c); - }); - } - - if ( - this.current_react_draggable && - this.current_react_draggable.props && - this.current_react_draggable.props.onDragStart - ) { - this.current_react_draggable.props.onDragStart(evt); - } - - this.dragging = true; - if (this.current_react_draggable) - this.current_react_draggable.setState({ dragging: true, hide_original: true }); - } - - document.body.classList.add('dragging'); - document.body.classList.add('drag_' + this.data.type); - this.clone.style.transform = - 'translateX(' + - (deltaX + this.current_node_initial_position[0]) + - 'px) translateY(' + - (deltaY + this.current_node_initial_position[1]) + - 'px)'; - } - } -} - -const service = new DraggableManager(); -export default service; diff --git a/tdrive/frontend/src/app/components/draggable/draggable.scss b/tdrive/frontend/src/app/components/draggable/draggable.scss deleted file mode 100755 index 77d2d039..00000000 --- a/tdrive/frontend/src/app/components/draggable/draggable.scss +++ /dev/null @@ -1,87 +0,0 @@ -.draggable { - .js-drag-handler { - cursor: grab; - width: 100%; - min-height: 16px; - } -} - -.dragging { - cursor: grabbing !important; -} - -.draggable_clone { - position: absolute; - z-index: 1000; - left: 0px; - top: 0px; - pointer-events: none; - - & > * { - opacity: 0.5; - } - - .draggable_number { - opacity: 1; - position: absolute; - right: -10px; - bottom: -10px; - background: #fff; - color: var(--primary); - font-size: 16px; - width: 40px; - height: 40px; - text-align: center; - line-height: 40px; - border-radius: 50%; - box-shadow: var(--box-shadow-base); - } -} - -.dragging_opacity { - //opacity: 0.5; -} - -.droppable_zone { - background: #f2f2f200; - margin: 0px; - border-radius: var(--border-radius-base); - transition: margin 0.2s, border 0.2s; - border: 0px dashed #ffffff00; - - .empty { - border-radius: var(--border-radius-base); - background: #ffffff; - padding: 0px; - text-align: center; - color: #00000088; - margin: 0px; - opacity: 0; - overflow: hidden; - max-height: 0px; - transition: margin 0.2s, opacity 0.2s, height 0.2s, padding 0.2s, max-height 0.2s; - } -} - -.dragging.drag_channel .droppable_zone.for_channel, -.dragging.drag_message .droppable_zone.for_message { - border: 2px dashed #f2f2f2; - margin: 10px 0px; - - .empty { - padding: 10px; - opacity: 1; - max-height: 40px; - .m-icon-small { - vertical-align: bottom; - } - } - - &:hover { - border: 2px dashed #eaeaea; - background: #f2f2f2; - .empty { - background: #f2f2f2; - } - } -} diff --git a/tdrive/frontend/src/app/components/draggable/draggable.tsx b/tdrive/frontend/src/app/components/draggable/draggable.tsx deleted file mode 100755 index 9bf5234e..00000000 --- a/tdrive/frontend/src/app/components/draggable/draggable.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -// eslint-disable-next-line @typescript-eslint/no-use-before-define -import React from 'react'; -import './draggable.scss'; -import DraggableManager from './draggable-manager.js'; -import classNames from 'classnames'; - -type PropsType = { [key: string]: any }; - -type StateType = { [key: string]: any }; - -export default class Draggable extends React.Component { - node: HTMLDivElement | null | undefined; - - render() { - return ( -
{ - this.node = node; - if (this.props.refDraggable) { - this.props.refDraggable(node); - } - }} - onClick={this.props.onClick} - onMouseDown={evt => { - !this.props?.deactivated && DraggableManager.start(evt, this.node, this); - }} - onMouseUp={evt => { - !this.props?.deactivated && DraggableManager.end(evt, this.node, this); - }} - onMouseOver={this.props.onMouseOver} - onMouseOut={this.props.onMouseOut} - onDoubleClick={this.props.onDoubleClick} - > - {this.props.children} -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/draggable/droppable-zone.jsx b/tdrive/frontend/src/app/components/draggable/droppable-zone.jsx deleted file mode 100755 index a80b8b05..00000000 --- a/tdrive/frontend/src/app/components/draggable/droppable-zone.jsx +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; - -import DraggableManager from './draggable-manager.js'; -import Number from 'app/features/global/utils/Numbers'; -import './draggable.scss'; - -export default class DroppableZone extends Component { - constructor() { - super(); - this.unique_drop_key = Number.unid(); - this.longOverTimeout = ''; - } - onDrop(data) { - if (!data) { - return; - } - if (this.props.types && data.type) { - if (this.props.types.indexOf(data.type) < 0) { - return; - } - } - if (this.props.onDrop) { - this.props.onDrop(data); - } - } - componentWillUnmount() { - DraggableManager.removeDropCallback(this.unique_drop_key); - clearTimeout(this.longOverTimeout); - } - onEnter() { - if (DraggableManager.drag) { - this.longOverTimeout = setTimeout(() => { - if (DraggableManager.drag) { - if (this.props.onClick && !this.props.disableLongOver) { - this.props.onClick(); - } - if (this.props.onLongOver) { - this.props.onLongOver(); - } - } - }, 1500); - DraggableManager.setDropCallback(this.unique_drop_key, d => this.onDrop(d)); - } - } - onLeave() { - DraggableManager.removeDropCallback(this.unique_drop_key); - clearTimeout(this.longOverTimeout); - } - render() { - return ( -
{ - if (!this.props.deactivated) { - this.onEnter(); - } - }} - onMouseLeave={() => { - if (!this.props.deactivated) { - this.onLeave(); - } - }} - > - {this.props.children} - {!this.props.children && !this.props.deactivated && ( -
{this.props.empty || ''}
- )} -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/drive/directory.jsx b/tdrive/frontend/src/app/components/drive/directory.jsx deleted file mode 100755 index b07c0165..00000000 --- a/tdrive/frontend/src/app/components/drive/directory.jsx +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react'; -import DriveElement from './drive-element.jsx'; -import UIDirectory from './ui/directory.jsx'; -import Loader from 'components/loader/loader.jsx'; - -import WorkspaceUserRights from 'app/features/workspaces/services/workspace-user-rights-service'; -import Draggable from 'components/draggable/draggable'; -import DroppableZone from 'components/draggable/droppable-zone.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import './drive.scss'; - -export default class Directory extends DriveElement { - constructor(props) { - super(); - this.props = props; - this.state = { - loading: true, - }; - } - componentDidMount() { - super.componentDidMount(); - if (this.state.loading) { - setTimeout(() => { - this.setState({ loading: false }); - }, 4000); - } - } - render() { - if (!this.state.element || !this.state.element.front_id) { - return ( -
- {this.state.loading && } - {!this.state.loading && ( - - {Languages.t( - 'components.drive.navigators.directory_not_found', - [], - 'Directory not found.', - )} - - )} -
- ); - } else { - this.state.loading = false; - } - - if (this.props.hide) { - return ''; - } - - return ( - this.dropFile(data)} - onLongOver={this.props.onClick} - className="directory_drop_zone" - > - (this.node = node)} - onClick={evt => { - this.clickElement(evt); - }} - onDoubleClick={this.props.onDoubleClick} - parentClassOnDrag="grid" - onDragStart={evt => { - this.dragElement(evt); - }} - minMove={10} - data={{ type: 'file', selection_type: this.props.selectionType, data: this.props.data }} - > - - - - ); - } -} diff --git a/tdrive/frontend/src/app/components/drive/drive-element.jsx b/tdrive/frontend/src/app/components/drive/drive-element.jsx deleted file mode 100755 index b8d49e90..00000000 --- a/tdrive/frontend/src/app/components/drive/drive-element.jsx +++ /dev/null @@ -1,645 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/no-direct-mutation-state */ -import React, { useState } from 'react'; - -import SelectionsManager from 'app/deprecated/SelectionsManager/SelectionsManager.js'; -import DriveService from 'app/deprecated/Apps/Drive/Drive.js'; -import AlertManager from 'app/features/global/services/alert-manager-service'; -import MenuManager from 'app/components/menus/menus-manager.jsx'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import FilePicker from 'components/drive/file-picker/file-picker.jsx'; -import Button from 'components/buttons/button.jsx'; -import Input from 'components/inputs/input.jsx'; -import VersionDetails from './version-details.jsx'; -import WorkspacesApps from 'app/deprecated/workspaces/workspaces_apps.jsx'; -import InputWithClipBoard from 'components/input-with-clip-board/input-with-clip-board.jsx'; -import WorkspaceUserRights from 'app/features/workspaces/services/workspace-user-rights-service'; -import MediumPopupManager from 'app/components/modal/modal-manager'; -import Languages from 'app/features/global/services/languages-service'; -import TagPicker from 'components/tag-picker/tag-picker.jsx'; -import RouterServices from 'app/features/router/services/router-service'; -import { getAsFrontUrl } from 'app/features/global/utils/URLUtils'; -import FeatureTogglesService, { - FeatureNames, -} from 'app/features/global/services/feature-toggles-service'; -import ModalManager from 'app/components/modal/modal-manager'; -import LockedOnlyOfficePopup from 'app/components/locked-features-components/locked-only-office-popup/locked-only-office-popup'; - -const RenameInput = props => { - const [value, setValue] = useState(props.value); - return ( -
-
- { - if ((value || '').trim().length > 0) { - props.rename(value); - } - }} - className="full_width bottom-margin" - onEchap={() => { - MenuManager.closeMenu(); - }} - autoFocus - value={value} - onChange={evt => setValue(evt.target.value)} - /> -
-
-
-
- ); -}; - -const PublicSharing = props => { - Collections.get('drive').useListener(useState); - const element = Collections.get('drive').find(props?.id); - if (!element) { - return
; - } - const sharedUrl = RouterServices.generateRouteFromState({ - workspaceId: element.workspace_id, - documentId: element?.id, - appName: 'drive', - shared: true, - token: (element.acces_info || {}).token, - }); - return ( -
- {(element.acces_info || {}).token && ( -
- -
-
-
- )} - {!(element.acces_info || {}).token && ( -
-
- )} -
- ); -}; - -export default class DriveElement extends React.Component { - constructor() { - super(); - this.state = { - selections_manager: SelectionsManager, - }; - SelectionsManager.addListener(this); - - this.driveCollectionKey = ''; - - this.driveSelectorOver = this.driveSelectorOver.bind(this); - this.driveSelectorOut = this.driveSelectorOut.bind(this); - Collections.get('drive').addListener(this); - } - componentWillUnmount() { - SelectionsManager.removeListener(this); - Collections.get('drive').removeListener(this); - if (this.node) { - this.node.removeEventListener('drive_selector_over', this.driveSelectorOver); - this.node.removeEventListener('drive_selector_out', this.driveSelectorOut); - } - - if (this.driveCollectionKey && this.driveCollectionKey != this.props.driveCollectionKey) { - Collections.get('drive').removeSource(this.driveCollectionKey); - } - } - UNSAFE_componentWillMount() { - if (this.props && this.props.data && this.props.data.front_id) { - Collections.get('drive').listenOnly(this, [this.props.data.front_id]); - } - - this.state.element = DriveService.find( - Workspaces.currentWorkspaceId, - this.props.data?.id, - el => { - this.setState({ element: el }); - }, - ); - this.updateMenu(); - } - componentDidMount() { - if (this.node) { - this.node.addEventListener('drive_selector_over', this.driveSelectorOver); - this.node.addEventListener('drive_selector_out', this.driveSelectorOut); - this.node.setAttribute('drive_selector_unid', this.state.element?.id); - } - - if (this.props && this.props.data && this.props.data?.id) { - SelectionsManager.listenOnly(this, [this.props.data?.id]); - } - } - driveSelectorOut() { - if (this.state.selected) this.setState({ selected: false }); - } - driveSelectorOver() { - if (!this.state.selected) this.setState({ selected: true }); - } - - dropFile(data, directory) { - var destination = directory || this.props.data; - - var objects = data.data?.id; - if (data.selection_type) { - var selected = Object.keys(SelectionsManager.selected_per_type[data.selection_type] || {}); - if (selected && selected.length > 1) { - objects = selected; - } - } - - DriveService.moveFile( - objects, - destination, - this.props.driveCollectionKey || this.driveCollectionKey, - ); - } - - dragElement(evt) { - SelectionsManager.setType(this.props.selectionType); - if ( - !evt.shiftKey && - !SelectionsManager.selected_per_type[this.props.selectionType][this.state.element?.id] - ) { - SelectionsManager.unselectAll(); - } - SelectionsManager.select(this.state.element?.id); - } - - clickElement(evt, previewonly = false) { - evt.stopPropagation(); - evt.preventDefault(); - - if (this.props.notInDrive) { - if (this.props.onClick) { - this.props.onClick(); - } else { - DriveService.viewDocument(this.state.element, previewonly); - } - } else { - SelectionsManager.setType(this.props.selectionType); - if (!evt.shiftKey) { - if (this.props.onClick) { - this.props.onClick(); - } else { - DriveService.viewDocument(this.state.element, previewonly); - } - - var oldStatus = - SelectionsManager.selected_per_type[this.props.selectionType][this.state.element?.id]; - SelectionsManager.unselectAll(); - if (oldStatus) { - SelectionsManager.unselect(this.state.element?.id); - } else { - SelectionsManager.select(this.state.element?.id); - } - } else { - SelectionsManager.toggle(this.state.element?.id); - } - } - } - UNSAFE_componentWillUpdate(nextProps, nextState) { - nextState.element = - Collections.get('drive').find(this.props.data?.id) || - DriveService.find(Workspaces.currentWorkspaceId, this.props.data?.id, el => { - this.setState({ element: el }); - }); - this.state.element = nextState.element; - - if ( - this.state.element && - SelectionsManager.selected_per_type[nextProps.selectionType] && - SelectionsManager.selected_per_type[nextProps.selectionType][this.state.element?.id] != - this.old_selection_state - ) { - nextState.selected = - SelectionsManager.selected_per_type[nextProps.selectionType][nextProps.data?.id]; - this.old_selection_state = nextState.selected; - } - - if (this.state.element && !this.props.driveCollectionKey) { - this.channel = 'standalone_drive_collection_' + this.state.element.parent_id; - var parent_id = this.state.element.parent_id; - if (this.state.element.parent_id == 'detached') { - parent_id += '_' + this.state.element.workspace_id; - } - var old_collection_key = this.driveCollectionKey; - this.driveCollectionKey = DriveService.addSourceIfNotExist( - Workspaces.currentWorkspaceId, - this.channel, - parent_id, - 'standalone', - ); - if (old_collection_key && old_collection_key != this.driveCollectionKey) { - Collections.get('drive').removeSource(old_collection_key); - } - } - - this.updateMenu(); - - return true; - } - - moveTo(new_parent) { - DriveService.moveFile( - [this.state.element?.id], - new_parent, - this.props.driveCollectionKey || this.driveCollectionKey, - ); - } - - rename(new_name) { - if (!this.state.element.is_directory) { - new_name = new_name + '.' + this.state.element.extension; - } - this.state.element.name = new_name || this.state.element.name; - new_name = undefined; - MenuManager.closeMenu(); - DriveService.save(this.state.element, this.props.driveCollectionKey || this.driveCollectionKey); - } - - updateMenu() { - if (!this.state.element) { - this.common_menu = []; - return; - } - - this.common_menu = []; - - //-- All files - if (!this.state.element.is_directory) { - this.common_menu = [ - { - type: 'menu', - text: Languages.t('components.drive.elements.see', [], 'Voir'), - onClick: () => { - DriveService.viewDocument(this.state.element); - }, - }, - ]; - - var candidates = DriveService.getEditorsCandidates(this.state.element); - var editor_candidate = candidates.preview_candidate || []; - - if (editor_candidate.length > 0 && editor_candidate[0].app) { - this.common_menu.push({ - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.viewer.edit_with_button', - [editor_candidate[0].app?.identity?.name], - 'Editer avec $1', - ), - onClick: () => { - if (FeatureTogglesService.isActiveFeatureName(FeatureNames.EDIT_FILES)) { - var app = editor_candidate[0]; - if (app.url && app.is_url_file) { - window.open(app.url); - } - app = app.app; - DriveService.getFileUrlForEdition( - app.display?.tdrive?.files?.editor?.edition_url, - app, - this.state.element?.id, - url => { - window.open(url); - }, - ); - } else { - ModalManager.open( - , - { - position: 'center', - size: { width: '600px' }, - }, - false, - ); - } - }, - }); - } - } - - this.common_menu.push({ - type: 'menu', - text: - this.state.element.url && this.state.element.extension == 'url' - ? Languages.t('scenes.apps.drive.open_link', [], 'Open link') - : Languages.t('scenes.apps.drive.download_button', [], 'Télécharger'), - onClick: () => { - var link = DriveService.getLink(this.state.element, undefined, 1); - if (this.state.element.url) { - window.open(link, '_blank'); - } else { - window.open(link); - } - }, - }); - - if (!WorkspaceUserRights.isNotConnected()) { - //-- All files - if (this.state.element.detached) { - this.common_menu.push({ - type: 'menu', - text: Languages.t('scenes.apps.drive.move_text2', [], 'Déplacer'), - submenu_replace: true, - submenu: [ - { - type: 'react-element', - reactElement: () => ( - this.moveTo(res)} - initialDirectory={{ id: '' }} - /> - ), - }, - ], - }); - } - - if (!this.props.notInDrive && !this.state.element.detached) { - if (this.common_menu.length > 0) { - this.common_menu.push({ type: 'separator' }); - } - - if (!this.state.element.detached && this.state.element.parent_id) { - this.common_menu = this.common_menu.concat([ - { - type: 'menu', - text: Languages.t('scenes.app.mainview.tabs.rename', [], 'Renommer'), - submenu_replace: true, - submenu: [ - { - type: 'title', - text: Languages.t('scenes.app.mainview.tabs.rename', [], 'Renommer'), - }, - { - type: 'text', - text: - Languages.t('components.drive.elements.current_name', [], 'Nom actuel : ') + - this.state.element.name, - }, - { - type: 'react-element', - reactElement: () => ( - { - this.rename(name); - }} - value={ - this.state.element.is_directory - ? this.state.element.name - : this.state.element.name.replace(/\.[^.]*$/, '') - } - /> - ), - }, - ], - }, - ]); - } - - if (!this.state.element.trash) { - this.common_menu = this.common_menu.concat([ - { - type: 'menu', - text: Languages.t('scenes.apps.drive.right_preview.public', [], 'Accès public...'), - submenu_replace: true, - submenu: [ - { - type: 'title', - text: Languages.t( - 'scenes.apps.drive.right_preview.public_link', - [], - "Lien d'accès public", - ), - }, - { - //TODO menu react-element to refactor - type: 'react-element', - reactElement: () => ( - - ), - }, - ], - }, - ]); - - if (!(this.state.element.application_id && this.state.element.is_directory)) { - this.common_menu.push({ - type: 'menu', - text: Languages.t('scenes.apps.drive.move_text', [], 'Déplacer'), - submenu_replace: true, - submenu: [ - { - type: 'react-element', - reactElement: () => ( - this.moveTo(res)} - initialDirectory={{ id: this.state.element.parent_id }} - /> - ), - }, - ], - }); - } - - if (WorkspaceUserRights.hasWorkspacePrivilege()) { - if (this.state.element.application_id && this.state.element.is_directory) { - this.common_menu.push({ - type: 'menu', - text: Languages.t( - 'components.drive.elements.configurate_mod', - [], - 'Configurer le module...', - ), - onClick: () => { - var data = { - drive_element: this.state.element, - }; - WorkspacesApps.notifyApp( - this.state.element.application_id, - 'configuration', - 'drive', - data, - ); - }, - }); - } - } - - if (!this.state.element.is_directory && !this.state.element.url) { - var versions_indicator = ''; - if ((this.state.element.versions || {}).length > 1) { - versions_indicator = ' (' + (this.state.element.versions || {}).length + ')'; - } - this.common_menu.push( - { - type: 'menu', - text: - Languages.t( - 'components.drive.elements.manage_version', - [], - 'Gérer les versions', - ) + - versions_indicator + - '...', - onClick: () => { - MediumPopupManager.open(, { - size: { width: 600 }, - }); - }, - }, - { - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.navigators.navigator_labels.title', - [], - 'Labels', - ), - submenu_replace: true, - submenu: [ - { - type: 'title', - text: Languages.t( - 'scenes.apps.drive.navigators.navigator_labels.title', - [], - 'Labels', - ), - }, - { - type: 'react-element', - reactElement: level => ( -
- { - this.state.element.tags = values; - MenuManager.closeMenu(); - DriveService.save( - this.state.element, - this.props.driveCollectionKey || this.driveCollectionKey, - ); - }} - /> -
- ), - }, - ], - }, - ); - } - - if (this.props.attachmentMenu) { - this.common_menu.push(this.props.attachment_menu); - } - - this.common_menu.push({ type: 'separator' }); - - this.common_menu.push({ - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.right_preview.operations_delete', - [], - 'Mettre à la corbeille', - ), - className: 'error', - onClick: () => { - DriveService.remove( - [this.props.data], - this.props.driveCollectionKey || this.driveCollectionKey, - ); - }, - }); - } else { - this.common_menu.push({ - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.right_preview.operations_restore', - [], - 'Restaurer', - ), - onClick: () => { - DriveService.restore( - [this.props.data], - this.props.driveCollectionKey || this.driveCollectionKey, - ); - }, - }); - this.common_menu.push({ - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.remove_definitely_menu', - [], - 'Supprimer définitivement', - ), - className: 'error', - onClick: () => { - AlertManager.confirm(() => { - DriveService.removeDefinitively( - [this.props.data], - this.props.driveCollectionKey || this.driveCollectionKey, - ); - }); - }, - }); - } - } - - if (this.props.additionalMenu && this.props.additionalMenu.length > 0) { - this.common_menu.push({ type: 'separator' }); - this.common_menu = this.common_menu.concat(this.props.additionalMenu); - } - } - } -} diff --git a/tdrive/frontend/src/app/components/drive/drive-multi-selector.jsx b/tdrive/frontend/src/app/components/drive/drive-multi-selector.jsx deleted file mode 100755 index 679c1310..00000000 --- a/tdrive/frontend/src/app/components/drive/drive-multi-selector.jsx +++ /dev/null @@ -1,278 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/no-direct-mutation-state */ -import React, { Component } from 'react'; - -import './drive-multi-selector.scss'; -import SelectionsManager from 'app/deprecated/SelectionsManager/SelectionsManager.js'; -import './drive.scss'; - -export default class DriveMultiSelector extends Component { - constructor() { - super(); - this.state = { - start_drag: false, - dragging: true, - }; - this.move = this.move.bind(this); - this.end = this.end.bind(this); - this.start = this.start.bind(this); - this.pause = this.pause.bind(this); - this.unpause = this.unpause.bind(this); - - this.currentSelection = {}; - this.currentSelectionCount = 0; - - this.noMovementRefreshAnyway = setTimeout(''); - } - componentDidMount() { - this.scroller_container = this.props.scroller; - } - componentWillUnmount() { - clearInterval(this.noMovementRefreshAnyway); - - this.container.removeEventListener('mouseleave', this.pause); - this.container.removeEventListener('mouseenter', this.unpause); - document.removeEventListener('mousemove', this.move); - document.removeEventListener('mouseup', this.end); - document.body.classList.remove('no_select'); - } - pause() { - clearInterval(this.noMovementRefreshAnyway); - - this.setState({ dragging: false }); - } - unpause() { - this.setState({ dragging: true }); - } - end(evt) { - clearInterval(this.noMovementRefreshAnyway); - - this.setState({ start_drag: false }); - - document.removeEventListener('mousemove', this.move); - document.removeEventListener('mouseup', this.end); - this.container.removeEventListener('mouseleave', this.pause); - this.container.removeEventListener('mouseenter', this.unpause); - - document.body.classList.remove('no_select'); - - if (!this.did_drag) { - if (!evt.shiftKey && !this.did_start_drag == 0) { - SelectionsManager.unselectAll(); - } - this.did_start_drag = false; - return; - } - this.did_drag = false; - - Object.keys(this.currentSelection).forEach(id => { - if (this.currentSelection[id]) { - SelectionsManager.select(id); - } else { - SelectionsManager.unselect(id); - } - }); - this.did_start_drag = false; - - this.noMovementRefreshAnyway = setTimeout(() => { - this.state.left = 0; - this.state.right = 0; - this.state.width = 0; - this.state.height = 0; - this.setState({}); - }, 500); - } - start(evt) { - this.did_drag = false; - this.did_start_drag = true; - - this.element_position_cache = {}; - - SelectionsManager.setType(this.props.selectionType); - - clearInterval(this.noMovementRefreshAnyway); - this.currentSelection = {}; - - this.state.start_drag = true; - this.state.dragging = true; - var rect = window.getBoundingClientRect(this.container); - rect.x = rect.x || rect.left; - rect.y = rect.y || rect.top; - - this.drag_add = evt.nativeEvent.shiftKey; - this.drag_start = [ - evt.clientX - rect.left, - evt.clientY - rect.top, - this.container.scrollLeft, - this.container.scrollTop, - ]; - - document.addEventListener('mousemove', this.move); - document.addEventListener('mouseup', this.end); - this.container.addEventListener('mouseleave', this.pause); - this.container.addEventListener('mouseenter', this.unpause); - - document.body.classList.add('no_select'); - - rect = {}; - rect.width = 0; - rect.height = 0; - rect.left = evt.clientX; - rect.top = evt.clientY; - this.autoSelect(rect); - } - move(evt) { - clearInterval(this.noMovementRefreshAnyway); - var rect = window.getBoundingClientRect(this.container); - rect.x = rect.x || rect.left; - rect.y = rect.y || rect.top; - var pos = []; - - if (this.state.start_drag && this.state.dragging) { - this.did_drag = true; - - pos = [evt.clientX - rect.left, evt.clientY - rect.top]; - - pos[0] = Math.min(pos[0], rect.width - 5); - pos[0] = Math.max(pos[0], 5); - - pos[1] = Math.min(pos[1], rect.height - 5); - pos[1] = Math.max(pos[1], 5); - - var w = this.drag_start[0] + this.drag_start[2] - (pos[0] + this.container.scrollLeft); - var h = this.drag_start[1] + this.drag_start[3] - (pos[1] + this.container.scrollTop); - var winv = w > 0; - var hinv = h > 0; - var selectorRect = { - width: Math.abs(w), - height: Math.abs(h), - left: this.drag_start[0] + this.drag_start[2] - Math.abs(winv ? w : 0), - top: this.drag_start[1] + this.drag_start[3] - Math.abs(hinv ? h : 0), - }; - this.setState(selectorRect); - - rect = window.getBoundingClientRect(this.selector); - rect.x = rect.x || rect.left; - rect.y = rect.y || rect.top; - this.autoSelect(rect); - } - - pos = [evt.clientX, evt.clientY]; - - if ( - rect.height + rect.top < pos[1] || - rect.top > pos[1] || - rect.width + rect.left < pos[0] || - rect.left > pos[0] - ) { - var newScrollTop = - this.container.scrollTop + - (pos[1] - ((pos[1] > rect.height + rect.top ? rect.height : 0) + rect.top)) / 10; - var newScrollLeft = - this.container.scrollLeft + - (pos[0] - ((pos[0] > rect.width + rect.top ? rect.width : 0) + rect.left)) / 10; - - if (this.container.scrollTop != newScrollTop || this.container.scrollLeft != newScrollLeft) { - this.container.scrollTop = newScrollTop; - this.container.scrollLeft = newScrollLeft; - this.state.dragging = true; - - this.noMovementRefreshAnyway = setTimeout(() => { - this.move({ - clientX: evt.clientX, - clientY: evt.clientY, - }); - }, 50); - } else { - this.state.dragging = false; - } - } - } - autoSelect(rect) { - this.currentSelectionCount = 0; - var scroll_top = this.container.scrollTop; - if (this.old_scroll_top != scroll_top) { - this.element_position_cache = {}; - } - this.old_scroll_top = scroll_top; - - Array.from(this.container.getElementsByClassName('js-drive-multi-selector-selectable')).forEach( - element => { - var element_id = element.getAttribute('drive_selector_unid'); - - var selected = SelectionsManager.selected_per_type[this.props.selectionType][element_id]; - - var over = false; - var elementRect = {}; - - if (this.element_position_cache[element_id]) { - elementRect = JSON.parse(JSON.stringify(this.element_position_cache[element_id])); - } else { - var er = window.getBoundingClientRect(element); - er.x = er.x || er.left; - er.y = er.y || er.top; - elementRect = JSON.parse(JSON.stringify(er)); - this.element_position_cache[element_id] = elementRect; - } - - if ( - !( - rect.left > elementRect.left + elementRect.width || - elementRect.left > rect.left + rect.width || - rect.top > elementRect.top + elementRect.height || - elementRect.top > rect.top + rect.height - ) - ) { - over = true; - } - - if ( - (over && this.drag_add && selected) || - (!over && this.drag_add && !selected) || - (!over && !this.drag_add) - ) { - element.dispatchEvent(new Event('drive_selector_out')); - this.currentSelection[element_id] = false; - } - if ( - (over && this.drag_add && !selected) || - (over && !this.drag_add) || - (!over && this.drag_add && selected) - ) { - element.dispatchEvent(new Event('drive_selector_over')); - this.currentSelection[element_id] = true; - this.currentSelectionCount++; - } - }, - ); - } - render() { - return ( -
{ - this.start(evt); - }} - onMouseUp={evt => { - this.end(evt); - }} - ref={node => (this.container = node)} - style={this.props.style || {}} - className={'drive_multiselector'} - > -
(this.selector = node)} - className={ - 'selectionRect ' + (this.state.start_drag && this.state.dragging ? 'visible ' : '') - } - style={{ - width: this.state.width, - height: this.state.height, - left: this.state.left, - top: this.state.top, - }} - /> - {this.props.children} -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/drive/drive-multi-selector.scss b/tdrive/frontend/src/app/components/drive/drive-multi-selector.scss deleted file mode 100755 index 4599207b..00000000 --- a/tdrive/frontend/src/app/components/drive/drive-multi-selector.scss +++ /dev/null @@ -1,28 +0,0 @@ -body.no_select { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.drive_multiselector { - position: relative; - overflow-x: visible; - overflow-y: scroll; -} - -.selectionRect { - background: var(--primary); - z-index: 10; - border-radius: var(--border-radius-base); - position: absolute; - pointer-events: none; - opacity: 0; - transition: opacity 0.2s; - - &.visible { - opacity: 0.2; - } -} diff --git a/tdrive/frontend/src/app/components/drive/drive.scss b/tdrive/frontend/src/app/components/drive/drive.scss deleted file mode 100755 index 433aef9a..00000000 --- a/tdrive/frontend/src/app/components/drive/drive.scss +++ /dev/null @@ -1,522 +0,0 @@ -/* Drive */ - -.directory, -.file { - .file_loader { - width: 32px; - height: 32px; - display: inline-block; - margin: auto; - } - .options { - padding-left: 5px; - display: none; - } - - &:hover { - .options { - display: block; - } - } -} - -.directory_drop_zone { - display: inline-block; -} -.directory { - background: #fff; - border: 1px solid var(--grey-background); - height: 50px; - box-sizing: border-box; - display: inline-flex; - flex-direction: row; - line-height: 32px; - margin-right: 16px; - margin-bottom: 16px; - border-radius: var(--border-radius-base); - font-size: 13px; - vertical-align: middle; - width: 200px; - padding: 8px; - font-weight: 500; - padding-right: 12px; - cursor: pointer; - - .text { - font-size: 12px; - font-weight: bold; - } - - &:hover:not(.notInDrive) { - box-shadow: 4px 4px 16px 0 #00000022; - border-color: #fff; - } - - .options { - .m-icon-small { - font-size: 20px !important; - } - } - - .app_icon { - width: 20px; - background-size: contain; - background-position: center; - background-repeat: no-repeat; - height: 20px; - margin-top: 2px; - } - - .icon { - font-size: 14px; - padding-right: 8px; - margin-left: 6px; - padding-top: 4px; - - .m-icon-small { - color: var(--warning); - font-size: 20px !important; - } - - i.icon-fontastic { - position: relative; - top: 8px; - } - - .icon { - height: 30px; - background-size: 16px auto; - background-position: center left; - background-repeat: no-repeat; - } - } -} - -.file { - overflow: hidden; - border: 1px solid var(--grey-background); - background: #fff; - height: 180px; - width: 216px; - box-sizing: border-box; - display: inline-flex; - flex-direction: column; - line-height: 30px; - margin-right: 16px; - margin-bottom: 16px; - border-radius: var(--border-radius-base); - font-size: 13px; - vertical-align: middle; - position: relative; - cursor: pointer; - - &:hover:not(.notInDrive) { - box-shadow: 4px 4px 16px 0 #00000022; - border-color: #fff; - } - - .options { - .m-icon-small { - font-size: 20px !important; - } - } - - &.mini { - height: 32px; - - .data { - border-top: none; - .no-grid { - display: none; - } - } - - .preview { - height: 32px; - background: #fff !important; - - &:after { - content: none; - } - } - } - - .preview { - width: 216px; - background-size: contain; - background-repeat: no-repeat; - background-position: center; - background-color: #f5f5f7; - flex: 1; - - .tags_list { - position: absolute; - top: 4px; - padding-left: 8px; - line-height: 30px; - } - - &.no_preview { - background-color: #f5f5f7; - background-repeat: no-repeat; - background-size: 64px; - } - - /*&:after { - content: ""; - position: absolute; - width: 100%; - height: 100%; - background: linear-gradient(180deg, rgba(0,0,0,0) 40%, rgba(0,0,0,0.05) 70%, rgba(0,0,0,0.5) 100%); - }*/ - } - - .data { - display: flex; - flex-direction: row; - padding-left: 8px; - padding-right: 8px; - bottom: 0px; - color: var(--black); - height: 32px; - font-weight: 500; - width: 100%; - box-sizing: border-box; - border-top: 1px solid var(--grey-background); - - .icon { - height: 20px; - width: 20px; - box-sizing: border-box; - border-radius: var(--border-radius-base); - margin-right: 6px; - margin-left: -3px; - margin-top: 5px; - color: #fff; - text-align: center; - background-size: 70%; - background-repeat: no-repeat; - background-position: center; - - i.icon-fontastic { - position: relative; - top: 4px; - } - } - } -} - -.draggable_clone { - .file, - .directory { - opacity: 1; - box-shadow: 4px 4px 16px 0 #00000022; - border-color: #fff; - } -} - -.dragging.drag_file .drive_multiselector { - .file.is_selected, - .directory.is_selected { - opacity: 0; - transition: opacity 0.2s; - } -} - -.file, -.directory { - transition: opacity 0s; - - &.notInDrive { - margin-bottom: 0px; - } - - &.dragging_opacity { - opacity: 0; - } - - &.is_selected { - background: var(--primary); - color: #fff; - box-shadow: none; - - .file_type_icon svg, - .file_type_icon svg * { - fill: #fff; - } - - &:hover:not(.notInDrive), - .data { - background-color: var(--primary); - color: #fff; - } - } - - .text { - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .created-by, - .last-modified { - width: 200px; - } - - .size { - text-align: right; - width: 70px; - } - - .last-modified { - text-align: right; - width: 120px; - } - - .detail_preview_parent { - width: 32px; - margin-left: 12px; - - .detail_preview { - width: 32px; - height: 32px; - border-radius: var(--border-radius-base); - background-position: center; - background-repeat: no-repeat; - background-size: cover; - background-color: var(--primary-background); - - &.no_preview { - background-size: 60%; - } - } - } -} - -.drive_view.list { - .directory_drop_zone { - display: inherit; - } -} - -.drive_view.list .directory, -.drive_view.list .file { - margin-right: 0px; - margin-bottom: 0px; - border: 0; - border-bottom: 1px solid var(--grey-background); - border-top: 1px solid var(--grey-background); - border-radius: 2px; - width: 100%; - height: 64px; - padding-top: 16px; - color: var(--black); - margin-top: -1px; - padding-right: 12px; - - &.exit-active, - &.enter-active { - margin-top: -1px !important; - } - - .data { - border-top: 0px; - bottom: -1px; - } - - .text { - font-size: 14px; - } - - .options { - display: block; - } - - &:hover:not(.notInDrive):not(.is_selected) { - box-shadow: none; - background: var(--primary-background); - } - - &.is_selected { - background: var(--primary); - color: #fff; - box-shadow: none; - } -} - -.drive_view.list .file .preview { - display: none; -} - -.drive_view.list { - .rounded-btn { - margin-top: 10px; - } -} - -.drive_view.grid { - .is_selected.file { - background: var(--primary); - color: #fff; - box-shadow: none; - } -} - -.drive_view.grid .no-grid { - display: none; -} -.drive_view.list .no-list { - display: none; -} - -.file_type_icon { - line-height: 38px; - width: 24px; - - svg, - svg * { - fill: var(--primary); - } - - &.link { - background-image: url('./icons/link.svg'); - } - - &.code { - background-image: url('./icons/code.svg'); - } - - &.document { - background-image: url('./icons/document.svg'); - } - - &.image { - background-image: url('./icons/image.svg'); - } - - &.pdf { - background-image: url('./icons/pdf.svg'); - } - - &.slides { - background-image: url('./icons/slides.svg'); - } - - &.sound, &.audio { - background-image: url('./icons/sound.svg'); - } - - &.spreadsheet { - background-image: url('./icons/spreadsheet.svg'); - } - - &.svg { - background-image: url('./icons/svg.svg'); - } - - &.video { - background-image: url('./icons/video.svg'); - } - - &.archive { - background-image: url('./icons/archive.svg'); - } - - &.other { - background-image: url('./icons/file.svg'); - } -} - -.drive_view.list .file_type_icon { - line-height: 38px; - width: 34px; - text-align: center; -} - -/* version details */ -.versionDetails { - min-height: 250px; - - .text.no-more { - text-align: center; - width: 100%; - opacity: 0.5; - margin-top: 32px; - margin-bottom: 32px; - } - - .version { - display: flex; - padding: 24px 0px; - border-bottom: solid 1px var(--grey-background); - .titleVersionDetails { - font-size: 24px; - color: var(--black); - font-weight: bold; - margin-bottom: 24px; - } - .info { - flex: 0.5; - margin-bottom: 8px; - .versionTitle { - font-size: 14px; - font-weight: bold; - color: var(--black); - } - .versionDate { - font-size: 14px; - color: var(--black); - } - } - .name { - flex: 0.5; - font-size: 14px; - line-height: 24px; - color: var(--black); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .more { - } - } -} -.footerVersionDetails { - display: flex; - .addVersion { - flex: 1; - .addVersionButton { - width: 100%; - height: 24px; - line-height: 24px; - } - .addVersionButton:hover { - cursor: pointer; - opacity: 0.8; - } - .icon { - display: inline-block; - width: 24px; - height: 24px; - .iconWithBackground { - width: 24px; - height: 24px; - display: inline-block; - background-color: var(--grey-background); - border-radius: var(--border-radius-base); - } - } - .footerTitle { - margin-left: 8px; - display: inline-block; - font-size: 14px; - font-weight: bold; - color: var(--black); - .addVersionButton:hover { - cursor: pointer; - opacity: 0.8; - } - } - } -} diff --git a/tdrive/frontend/src/app/components/drive/file-picker/file-picker.jsx b/tdrive/frontend/src/app/components/drive/file-picker/file-picker.jsx deleted file mode 100755 index a7c40b39..00000000 --- a/tdrive/frontend/src/app/components/drive/file-picker/file-picker.jsx +++ /dev/null @@ -1,213 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; - -import DriveService from 'app/deprecated/Apps/Drive/Drive.js'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import UIFile from '../ui/file.jsx'; -import UIDirectory from '../ui/directory.jsx'; -import LeftIcon from '@material-ui/icons/KeyboardArrowLeftOutlined'; -import NewFolderIcon from '@material-ui/icons/CreateNewFolderOutlined'; -import Menu from 'components/menus/menu.jsx'; -import Button from 'components/buttons/button.jsx'; -import Input from 'components/inputs/input.jsx'; -import './file-picker.scss'; - -export default class FilePicker extends Component { - constructor() { - super(); - this.drive_channel = 'file_picker_' + Workspaces.currentWorkspaceId; - this.drive_collection_key = this.drive_channel; - - this.state = { - i18n: Languages, - drive_repository: Collections.get('drive'), - app_drive_service: DriveService, - current_selection: {}, - creating_folder: false, - }; - - Languages.addListener(this); - Collections.get('drive').addListener(this); - DriveService.addListener(this); - } - componentWillUnmount() { - Languages.removeListener(this); - Collections.get('drive').removeListener(this); - DriveService.removeListener(this); - - if (this.drive_channel) { - Collections.get('drive').removeSource( - this.state.app_drive_service.current_collection_key_channels[this.drive_channel], - ); - } - } - componentDidMount() { - this.changeCurrentDirectory({ id: (this.props.initialDirectory || {}).id || '' }); - } - clickOnFile(file) { - if (this.props.mode == 'select_file') { - this.setState({ current_selection: file }); - } - } - changeCurrentDirectory(directory) { - if (this.props.mode == 'select_file') { - this.setState({ current_selection: {} }); - } - if (this.props.mode == 'select_location') { - this.setState({ current_selection: directory }); - } - DriveService.changeCurrentDirectory(this.drive_channel, directory); - } - submit() { - var result = null; - if (this.props.mode == 'select_file') { - result = this.state.current_selection; - } - if (this.props.mode == 'select_location') { - result = this.state.app_drive_service.current_directory_channels[this.drive_channel] || {}; - } - Menu.closeAll(); - if (this.props.onChoose) this.props.onChoose(result); - } - render() { - var workspace_id = Workspaces.currentWorkspaceId; - var directory = - this.state.app_drive_service.current_directory_channels[this.drive_channel] || {}; - var directory_id = directory.id; - - var filter_dir = { - workspace_id: workspace_id, - parent_id: directory_id, - is_directory: true, - trash: false, - }; - var directories = this.state.drive_repository - .findBy(filter_dir) - .sort((a, b) => (a.name || '').localeCompare(b.name || '')); - - var filter_files = { - workspace_id: workspace_id, - parent_id: directory_id, - is_directory: false, - trash: false, - }; - var files = this.state.drive_repository - .findBy(filter_files) - .sort((a, b) => (a.name || '').localeCompare(b.name || '')); - - var allow_go_parent = true; - var drive_channel = null; - if (!drive_channel && (this.props.initialDirectory || {}).id == directory_id) { - allow_go_parent = false; - } - - return ( -
-
- {directory.parent_id && allow_go_parent && ( - { - this.changeCurrentDirectory({ id: directory.parent_id }); - }} - /> - )}{' '} - {directory.parent_id - ? directory.name - : Languages.t('app.identity?.name.tdrive_drive', [], 'Documents')} -
-
- {directories.map((item, index) => ( -
DriveService.changeCurrentDirectory(this.drive_channel, item)} - > - -
- ))} - {files.map((item, index) => ( -
this.clickOnFile(item)} - > - -
- ))} -
- - {this.state.creating_folder && ( -
- - (node ? node.focus() : '')} - type="text" - defaultValue={''} - placeholder={Languages.t( - 'scenes.apps.drive.navigators.navigator_content.directory_name', - [], - 'Nom du dossier', - )} - onKeyPress={e => { - if (e.key === 'Enter') { - DriveService.createDirectory( - directory.workspace_id, - e.target.value, - directory, - DriveService.current_collection_key_channels[this.drive_channel], - res => { - this.changeCurrentDirectory(res); - }, - ); - this.setState({ creating_folder: false }); - } - }} - /> -
- )} - {!this.state.creating_folder && ( -
- {!this.state.creating_folder && directory.workspace_id && ( - - )} - {this.props.mode == 'select_location' && ( -
- )} -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/drive/file-picker/file-picker.scss b/tdrive/frontend/src/app/components/drive/file-picker/file-picker.scss deleted file mode 100755 index f3f2c1f2..00000000 --- a/tdrive/frontend/src/app/components/drive/file-picker/file-picker.scss +++ /dev/null @@ -1,84 +0,0 @@ -.filepicker { - margin: -5px 0; - - .no-filepicker { - display: none; - } - - .file_type_icon { - width: 20px; - margin-right: 4px; - } - - .title { - background: #ffffff; - margin-bottom: 0px; - font-size: 16px; - color: #000; - line-height: 20px; - padding-bottom: 8px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .getback { - background: var(--grey-background); - border-radius: var(--border-radius-base); - width: 20px; - height: 20px; - vertical-align: top; - margin-right: 5px; - margin-left: 0px; - cursor: pointer; - &:hover { - background: #f0f0f0; - } - } - - .menu-buttons { - text-align: right; - padding: 8px 0px; - } - - .drive_view.list { - height: 150px; - overflow: auto; - width: 100%; - - .file .icon { - width: 20px; - background-size: 60%; - } - - .directory .icon { - width: 24px; - } - - .directory .app_icon { - height: 16px; - } - - .file, - .directory { - height: 40px; - padding-top: 4px; - - .text { - line-height: 30px; - margin-left: 6px; - } - - .icon { - padding-top: 3px; - padding-right: 0px; - padding-left: 5px; - } - - &.disabled { - opacity: 0.5; - pointer-events: none; - } - } - } -} diff --git a/tdrive/frontend/src/app/components/drive/file.tsx b/tdrive/frontend/src/app/components/drive/file.tsx deleted file mode 100755 index 8c036f01..00000000 --- a/tdrive/frontend/src/app/components/drive/file.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React from 'react'; -import Draggable from 'components/draggable/draggable'; -import DriveElement from './drive-element.jsx'; -import './drive.scss'; -import UIFile from './ui/file.jsx'; -import Loader from 'components/loader/loader.jsx'; -import WorkspaceUserRights from 'app/features/workspaces/services/workspace-user-rights-service'; -import Languages from 'app/features/global/services/languages-service'; - -type StateType = any; - -type NodeType = any; - -export default class File extends DriveElement { - node: NodeType; - state: StateType; - constructor() { - super(); - this.state = { - loading: true, - }; - } - componentDidMount() { - super.componentDidMount(); - if (this.state.loading) { - setTimeout(() => { - this.setState({ loading: false }); - }, 4000); - } - } - render() { - if (!this.state.element || !this.state.element.front_id) { - return ( -
- {this.state.loading && } - {!this.state.loading && ( - - {Languages.t('scenes.apps.drive.preview_bloc.error_file', [], 'File not found.')} - - )} -
- ); - } else { - this.state.loading = false; - } - - if (this.props.hide) { - return ''; - } - - const mini = (!this.state.element.has_preview && this.props.notInDrive) || this.props.mini; - return ( - (this.node = node)} - onClick={(evt: any) => this.clickElement(evt, this.props.previewonly)} - onDoubleClick={this.props.onDoubleClick} - parentClassOnDrag="drive_view list" - onDragStart={(evt: any) => { - this.dragElement(evt); - }} - minMove={10} - data={{ type: 'file', selection_type: this.props.selectionType, data: this.props.data }} - deactivated={WorkspaceUserRights.isNotConnected() || this.props.notInDrive} - > - { - e.preventDefault(); - e.stopPropagation(); - this.props.removeOnClick(); - }} - /> - - ); - } -} diff --git a/tdrive/frontend/src/app/components/drive/icons/archive.jsx b/tdrive/frontend/src/app/components/drive/icons/archive.jsx deleted file mode 100755 index 44e4e817..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/archive.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/archive.svg b/tdrive/frontend/src/app/components/drive/icons/archive.svg deleted file mode 100755 index af396f1f..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/archive.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/code.jsx b/tdrive/frontend/src/app/components/drive/icons/code.jsx deleted file mode 100755 index c83b6ec4..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/code.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/code.svg b/tdrive/frontend/src/app/components/drive/icons/code.svg deleted file mode 100755 index 4359143b..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/code.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/document.jsx b/tdrive/frontend/src/app/components/drive/icons/document.jsx deleted file mode 100755 index 2db77ebc..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/document.jsx +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/document.svg b/tdrive/frontend/src/app/components/drive/icons/document.svg deleted file mode 100755 index 7160424e..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/document.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/file.jsx b/tdrive/frontend/src/app/components/drive/icons/file.jsx deleted file mode 100755 index 46da903b..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/file.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/file.svg b/tdrive/frontend/src/app/components/drive/icons/file.svg deleted file mode 100755 index 8b32e854..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/file.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/image.jsx b/tdrive/frontend/src/app/components/drive/icons/image.jsx deleted file mode 100755 index ee544c5c..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/image.jsx +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/image.svg b/tdrive/frontend/src/app/components/drive/icons/image.svg deleted file mode 100755 index 477b7a5d..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/image.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/link.jsx b/tdrive/frontend/src/app/components/drive/icons/link.jsx deleted file mode 100755 index cf5fad3d..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/link.jsx +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/link.svg b/tdrive/frontend/src/app/components/drive/icons/link.svg deleted file mode 100755 index 2a14d480..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/link.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/pdf.jsx b/tdrive/frontend/src/app/components/drive/icons/pdf.jsx deleted file mode 100755 index b508a39a..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/pdf.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/pdf.svg b/tdrive/frontend/src/app/components/drive/icons/pdf.svg deleted file mode 100755 index 366c9b15..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/pdf.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/slides.jsx b/tdrive/frontend/src/app/components/drive/icons/slides.jsx deleted file mode 100755 index 16cca67d..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/slides.jsx +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/slides.svg b/tdrive/frontend/src/app/components/drive/icons/slides.svg deleted file mode 100755 index 98dea993..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/slides.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/sound.jsx b/tdrive/frontend/src/app/components/drive/icons/sound.jsx deleted file mode 100755 index 398d4307..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/sound.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/sound.svg b/tdrive/frontend/src/app/components/drive/icons/sound.svg deleted file mode 100755 index 58ca3b76..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/sound.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/spreadsheet.jsx b/tdrive/frontend/src/app/components/drive/icons/spreadsheet.jsx deleted file mode 100755 index b4f6523f..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/spreadsheet.jsx +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/spreadsheet.svg b/tdrive/frontend/src/app/components/drive/icons/spreadsheet.svg deleted file mode 100755 index a0ddedfd..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/spreadsheet.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/svg.jsx b/tdrive/frontend/src/app/components/drive/icons/svg.jsx deleted file mode 100755 index 33a46b88..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/svg.jsx +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/svg.svg b/tdrive/frontend/src/app/components/drive/icons/svg.svg deleted file mode 100755 index 1347b9b1..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/svg.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/icons/video.jsx b/tdrive/frontend/src/app/components/drive/icons/video.jsx deleted file mode 100755 index 4356053b..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/video.jsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const SvgComponent = props => ( - - - -); - -export default SvgComponent; diff --git a/tdrive/frontend/src/app/components/drive/icons/video.svg b/tdrive/frontend/src/app/components/drive/icons/video.svg deleted file mode 100755 index 3b554029..00000000 --- a/tdrive/frontend/src/app/components/drive/icons/video.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tdrive/frontend/src/app/components/drive/ui/directory.jsx b/tdrive/frontend/src/app/components/drive/ui/directory.jsx deleted file mode 100755 index 1af75a04..00000000 --- a/tdrive/frontend/src/app/components/drive/ui/directory.jsx +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/jsx-key */ -import React from 'react'; - -import Icon from 'app/components/icon/icon.jsx'; -import FolderIcon from '@material-ui/icons/FolderOutlined'; -import Menu from 'components/menus/menu.jsx'; -import Numbers from 'app/features/global/utils/Numbers'; -import '../drive.scss'; -import 'moment-timezone'; -import { getCompanyApplication as getApplication } from 'app/features/applications/state/company-applications'; - -export default class Directory extends React.Component { - constructor() { - super(); - } - render() { - var app = {}; - if (this.props.data.application_id && this.props.data.external_storage) { - app = getApplication(this.props.data.application_id); - } - - return [ -
-
- {!app.id && } - {!!app.id && ( -
- )} -
-
- {this.props.data.name} - {!!app.id && ({app.identity?.name})} -
- - {(this.props.data.acces_info || {}).token && ( - - )} - - {this.props.details && ( -
- {this.props.data.size ? Numbers.humanFileSize(this.props.data.size, true) : '-'} -
- )} - {this.props.menu && this.props.menu.length > 0 && ( - - - - )} -
, - ]; - } -} diff --git a/tdrive/frontend/src/app/components/drive/ui/file-type.jsx b/tdrive/frontend/src/app/components/drive/ui/file-type.jsx deleted file mode 100755 index 3a2a764f..00000000 --- a/tdrive/frontend/src/app/components/drive/ui/file-type.jsx +++ /dev/null @@ -1,63 +0,0 @@ -/* eslint-disable react/prop-types */ -import React, { Component } from 'react'; - -import Archive from '../icons/archive.jsx'; -import Code from '../icons/code.jsx'; -import Document from '../icons/document.jsx'; -import Files from '../icons/file.jsx'; -import Images from '../icons/image.jsx'; -import Link from '../icons/link.jsx'; -import Pdf from '../icons/pdf.jsx'; -import Slide from '../icons/slides.jsx'; -import Sound from '../icons/sound.jsx'; -import Spreadsheet from '../icons/spreadsheet.jsx'; -import Svg from '../icons/svg.jsx'; -import Video from '../icons/video.jsx'; - -export default class FileType extends Component { - /* props : type (string) */ - constructor() { - super(); - } - render() { - var type = this.props.type; - var TypeIcon = Files; - switch (type) { - case 'link': - TypeIcon = Link; - break; - case 'code': - TypeIcon = Code; - break; - case 'document': - TypeIcon = Document; - break; - case 'image': - TypeIcon = Images; - break; - case 'pdf': - TypeIcon = Pdf; - break; - case 'slides': - TypeIcon = Slide; - break; - case 'audio': - TypeIcon = Sound; - break; - case 'spreadsheet': - TypeIcon = Spreadsheet; - break; - case 'svg': - TypeIcon = Svg; - break; - case 'video': - TypeIcon = Video; - break; - case 'archive': - TypeIcon = Archive; - break; - default: - } - return ; - } -} diff --git a/tdrive/frontend/src/app/components/drive/ui/file.jsx b/tdrive/frontend/src/app/components/drive/ui/file.jsx deleted file mode 100755 index c2e308b4..00000000 --- a/tdrive/frontend/src/app/components/drive/ui/file.jsx +++ /dev/null @@ -1,118 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/jsx-key */ -import React from 'react'; -import moment from 'moment'; -import 'moment-timezone'; - -import Icon from 'app/components/icon/icon'; -import Menu from 'components/menus/menu'; -import DriveService from 'app/deprecated/Apps/Drive/Drive'; -import Numbers from 'app/features/global/utils/Numbers'; -import FileType from './file-type'; -import TagPicker from 'components/tag-picker/tag-picker'; -import { addApiUrlIfNeeded } from 'app/features/global/utils/URLUtils'; -import '../drive.scss'; -import { formatTime } from '@features/global/utils/Numbers'; - -export default class File extends React.Component { - constructor() { - super(); - } - render() { - var date = false; - if (this.props.data.modified) { - date = new Date(this.props.data.modified * 1000); - } - if (this.props.data.added && this.props.isVersion) { - date = new Date(this.props.data.added * 1000); - } - - var date_string = date ? formatTime(date) : '-'; - - return [ -
-
- -
-
, -
-
- -
-
- {!!this.props.versionLabel &&
{this.props.versionLabel}
} - {this.props.data.name} - {!this.props.isVersion && (this.props.data.versions || {}).length > 1 && ( - - ({(this.props.data.versions || {}).length} versions) - - )} -    - -
- - {(this.props.data.acces_info || {}).token && ( - - )} - {this.props.data.url && } - - {/* -
- {this.state.element.created_by || "-"} -
- */} - {this.props.details && [ -
{date_string}
, -
- {this.props.data.size ? Numbers.humanFileSize(this.props.data.size, true) : '-'} -
, - ]} - {!this.props.isVersion && ( -
-
-
- )} - {this.props.menu && this.props.menu.length > 0 && ( - - - - )} - - {this.props.removeIcon === true && ( - - )} -
, - ]; - } -} diff --git a/tdrive/frontend/src/app/components/drive/version-details.jsx b/tdrive/frontend/src/app/components/drive/version-details.jsx deleted file mode 100755 index 4a7bae3e..00000000 --- a/tdrive/frontend/src/app/components/drive/version-details.jsx +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; -import Languages from 'app/features/global/services/languages-service'; -import Icon from 'app/components/icon/icon.jsx'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import DriveService from 'app/deprecated/Apps/Drive/Drive.js'; -import UploadZone from 'components/uploads/upload-zone'; -import WorkspaceUserRights from 'app/features/workspaces/services/workspace-user-rights-service'; -import MediumPopupManager from 'app/components/modal/modal-manager'; -import { ObjectModal, ObjectModalTitle } from 'components/object-modal/deprecated-object-modal.jsx'; -import UIFile from './ui/file.jsx'; -import 'moment-timezone'; - -import './drive.scss'; - -export default class VersionDetails extends React.Component { - constructor() { - super(); - this.state = { - workspaces: Workspaces, - i18n: Languages, - }; - Languages.addListener(this); - DriveService.addListener(this); - Collections.get('drive').addListener(this); - } - componentWillUnmount() { - Languages.removeListener(this); - DriveService.removeListener(this); - Collections.get('drive').removeListener(this); - } - render() { - var countVersion = (this.props.file.versions || []).length; - return ( - MediumPopupManager.closeAll()} - footer={ -
-
-
{ - if (this.upload_zone) { - this.upload_zone.open(); - } - }} - > -
- -
-
- {Languages.t('components.drive.new_versions', [], 'Ajouter une nouvelle version')} -
-
-
-
- } - title={ -
- - {Languages.t('scenes.apps.drive.right_preview.versions', [], 'Versions')} - -
- } - > -
- (this.upload_zone = node)} - parent={this.props.file.parent_id} - driveCollectionKey={{ id: this.props.file.parent_id }} - uploadOptions={{ - workspace_id: this.state.workspaces.currentWorkspaceId, - new_version: true, - file_id: this.props.file.id, - }} - allowPaste={true} - > - {(this.props.file.versions || []) - .sort((a, b) => { - return b.added - a.added; - }) - .map((version, index) => { - var data = {}; - if (index > 0) { - data.extension = this.props.file.extension; - data.name = version.name; - data.creator = version.creator; - data.size = version.size; - } else { - data = JSON.parse(JSON.stringify(this.props.file)); - } - data.added = version.added; - return ( -
- { - var link = DriveService.getLink(this.props.file, version.id, 1); - window.open(link); - }, - }, - ]} - details={true} - /> -
- ); - })} -
-
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/edit-channel/channel-access.tsx b/tdrive/frontend/src/app/components/edit-channel/channel-access.tsx deleted file mode 100644 index 7de5e929..00000000 --- a/tdrive/frontend/src/app/components/edit-channel/channel-access.tsx +++ /dev/null @@ -1,101 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Button } from 'app/atoms/button/button'; -import { BaseSmall } from 'app/atoms/text'; -import Switch from 'app/components/inputs/switch'; -import { ChannelType } from 'app/features/channels/types/channel'; -import Languages from 'app/features/global/services/languages-service'; -import Block from 'app/molecules/grouped-rows/base'; -import { useState } from 'react'; - -export const ChannelAccessForm = (props: { - channel?: ChannelType; - onChange: (change: { - visibility: 'private' | 'public'; - is_default: boolean; - is_readonly: boolean; - }) => void; -}) => { - const [visibility, setVisibility] = useState<'private' | 'public'>( - props.channel?.visibility || ('private' as any), - ); - const [isDefault, setIsDefault] = useState(props.channel?.is_default || false); - const [isReadOnly, setIsReadOnly] = useState(props.channel?.is_readonly || false); - const [loading, setLoading] = useState(false); - - return ( -
- } - title={Languages.t('scenes.app.channelsbar.channel_access.visibility')} - subtitle={ - - {Languages.t('scenes.app.channelsbar.channel_access.visibility.info')} - - } - suffix={ - { - if (visibility === 'public') setIsDefault(false); - setVisibility(visibility === 'public' ? 'private' : 'public'); - }} - /> - } - /> - - } - title={Languages.t('scenes.app.channelsbar.channel_access.default')} - subtitle={ - - {Languages.t('scenes.app.channelsbar.channel_access.default.info')} - - } - suffix={ - { - setIsDefault(!isDefault); - if (visibility === 'private' && !isDefault) setVisibility('public'); - }} - /> - } - /> - - } - title={Languages.t('scenes.app.channelsbar.channel_access.readonly')} - subtitle={ - - {Languages.t('scenes.app.channelsbar.channel_access.readonly.info')} - - } - suffix={ - { - setIsReadOnly(!isReadOnly); - }} - /> - } - /> - -
- -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/edit-channel/channel-information.tsx b/tdrive/frontend/src/app/components/edit-channel/channel-information.tsx deleted file mode 100644 index 51fa20c2..00000000 --- a/tdrive/frontend/src/app/components/edit-channel/channel-information.tsx +++ /dev/null @@ -1,248 +0,0 @@ -import Avatar from 'app/atoms/avatar'; -import { Button } from 'app/atoms/button/button'; -import { Checkbox } from 'app/atoms/input/input-checkbox'; -import { InputLabel } from 'app/atoms/input/input-decoration-label'; -import Select from 'app/atoms/input/input-select'; -import { Input } from 'app/atoms/input/input-text'; -import A from 'app/atoms/link'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import { usePublicOrPrivateChannels } from 'app/features/channels/hooks/use-public-or-private-channels'; -import { ChannelType } from 'app/features/channels/types/channel'; -import Languages from 'app/features/global/services/languages-service'; -import { getBase64 } from 'app/features/global/utils/strings'; -import Block from 'app/molecules/grouped-rows/base'; -import _ from 'lodash'; -import { useEffect, useState } from 'react'; -import Emojione from '../emojione/emojione'; - -const ChannelGroupSelector = (props: { group: string; onChange: (str: string) => void }) => { - const clean = (str?: string) => str?.toLocaleLowerCase().trim().replace(/ +/, ' '); - - const [group, setGroup] = useState(clean(props.group) || ''); - const [newGroup, setNewGroup] = useState(''); - const { publicChannels, privateChannels } = usePublicOrPrivateChannels(); - const groups = _.uniq( - [...publicChannels, ...privateChannels] - .filter(p => p.channel_group) - .map(p => clean(p.channel_group) || ''), - ).sort(); - - useEffect(() => { - if (!groups.includes(group) && !newGroup) setNewGroup(group); - }, [groups]); - - return ( -
-
- - {groups.map(g => ( - } - title={_.capitalize(g)} - suffix={ - { - setGroup(v ? g : ''); - }} - value={g === group} - /> - } - subtitle={<>} - /> - ))} - - } - title={ -
- { - setNewGroup(e.target.value); - setGroup(clean(e.target.value) || ''); - }} - value={newGroup} - className="" - placeholder={Languages.t('scenes.app.channelsbar.channel_information.group.new')} - /> -
- } - suffix={ - { - setGroup(v ? newGroup : ''); - }} - value={!!group && clean(newGroup) === clean(group)} - /> - } - subtitle={<>} - /> - -
- -
-
- ); -}; - -export const ChannelInformationForm = (props: { - channel?: ChannelType; - onChange: (change: { - name: string; - icon: string; - description: string; - channel_group: string; - }) => void; -}) => { - const [channelGroupModal, setChannelGroupModal] = useState(false); - - const [group, setGroup] = useState(props.channel?.channel_group || ''); - const [name, setName] = useState(props.channel?.name || ''); - const [description, setDescription] = useState(props.channel?.description || ''); - const [icon, setIcon] = useState(props.channel?.icon || ''); - - return ( -
- setChannelGroupModal(false)}> - - { - setChannelGroupModal(false); - setGroup(group); - }} - /> - - - - - - setName(e.target.value)} - /> - } - /> - - setDescription(e.target.value)} - multiline - /> - } - /> - - { - e.preventDefault(); - e.stopPropagation(); - setChannelGroupModal(group || ''); - }} - > - -
- } - /> - -
- -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/edit-channel/channel-notifications.tsx b/tdrive/frontend/src/app/components/edit-channel/channel-notifications.tsx deleted file mode 100644 index 87247108..00000000 --- a/tdrive/frontend/src/app/components/edit-channel/channel-notifications.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Checkbox } from 'app/atoms/input/input-checkbox'; -import { useChannelMemberCurrentUser } from 'app/features/channel-members-search/hooks/member-hook'; -import { ChannelType } from 'app/features/channels/types/channel'; -import Languages from 'app/features/global/services/languages-service'; -import { ToasterService } from 'app/features/global/services/toaster-service'; -import Block from 'app/molecules/grouped-rows/base'; -import { useState } from 'react'; - -export const ChannelNotificationsForm = (props: { channel?: ChannelType; onBack: () => void }) => { - const { member, setNotificationPreference } = useChannelMemberCurrentUser( - props.channel?.id || '', - ); - const [value, _setValue] = useState(member?.notification_level || 'all'); - - const setValue = (value: any) => { - _setValue(value); - setNotificationPreference(value).finally(() => ToasterService.success('Updated')); - props.onBack(); - }; - - return ( -
- } - title={Languages.t('scenes.apps.messages.left_bar.stream.notifications.all')} - subtitle={<>} - suffix={ - { - setValue('all'); - }} - /> - } - /> - - } - title={Languages.t('scenes.apps.messages.left_bar.stream.notifications.mentions', [ - '@all', - '@here', - `@[you]`, - ])} - subtitle={<>} - suffix={ - { - setValue('mentions'); - }} - /> - } - /> - - } - title={Languages.t('scenes.apps.messages.left_bar.stream.notifications.me', [`@[you]`])} - subtitle={<>} - suffix={ - { - setValue('me'); - }} - /> - } - /> - - } - title={Languages.t('scenes.apps.messages.left_bar.stream.notifications.never')} - subtitle={<>} - suffix={ - { - setValue('none'); - }} - /> - } - /> -
- ); -}; diff --git a/tdrive/frontend/src/app/components/edit-channel/channel-settings-menu.tsx b/tdrive/frontend/src/app/components/edit-channel/channel-settings-menu.tsx deleted file mode 100644 index a632315b..00000000 --- a/tdrive/frontend/src/app/components/edit-channel/channel-settings-menu.tsx +++ /dev/null @@ -1,368 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/ban-types */ -import { - BellIcon, - ChevronRightIcon, - HandIcon, - LinkIcon, - LogoutIcon, - PhotographIcon, - StarIcon, - TrashIcon, -} from '@heroicons/react/outline'; -import { StarIcon as StarIconSolid } from '@heroicons/react/solid'; -import Avatar from 'app/atoms/avatar'; -import { UsersIcon } from 'app/atoms/icons-agnostic'; -import A from 'app/atoms/link'; -import { Loader } from 'app/atoms/loader'; -import { Base, Info } from 'app/atoms/text'; -import { useChannelMemberCurrentUser } from 'app/features/channel-members-search/hooks/member-hook'; -import ChannelsMineAPIClient from 'app/features/channels/api/channels-mine-api-client'; -import { useFavoriteChannels } from 'app/features/channels/hooks/use-favorite-channels'; -import { ChannelType } from 'app/features/channels/types/channel'; -import { isDirectChannel, isPrivateChannel } from 'app/features/channels/utils/utils'; -import AlertManager from 'app/features/global/services/alert-manager-service'; -import Languages from 'app/features/global/services/languages-service'; -import { ToasterService } from 'app/features/global/services/toaster-service'; -import { copyToClipboard } from 'app/features/global/utils/CopyClipboard'; -import RouterServices from 'app/features/router/services/router-service'; -import { useCurrentUser } from 'app/features/users/hooks/use-current-user'; -import workspaceUserRightsService from 'app/features/workspaces/services/workspace-user-rights-service'; -import Block from 'app/molecules/grouped-rows/base'; -import { addUrlTryDesktop } from 'app/components/desktop-redirect'; -import { useState } from 'react'; - -export const ChannelSettingsMenu = (props: { - channel?: ChannelType; - onEditChannel?: Function; - onAccess?: Function; - onMedias?: Function; - onNotifications?: Function; - onMembers?: Function; - onFavorite?: Function; - onClose?: Function; -}) => { - const icon = props.channel?.icon || ''; - const name = props.channel?.name || ''; - - const { user } = useCurrentUser(); - const canEdit = - props.channel?.owner === user?.id || workspaceUserRightsService.hasWorkspacePrivilege(); - const isGuest = workspaceUserRightsService.isInvite(); - const isDirect = isDirectChannel(props.channel?.visibility || ''); - const canLeave = !isGuest || isDirect; - const canRemove = - user?.id === props.channel?.owner || workspaceUserRightsService.hasWorkspacePrivilege(); - - return ( -
- {!isDirect && ( - <> - { - canEdit && props.onEditChannel && props.onEditChannel(); - }} - className={ - '-mx-2 my-2 p-2 rounded-md ' + - (canEdit ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800' : '') - } - title={{name || ''}} - subtitle={ - canEdit ? ( - - {Languages.t('scenes.app.channelsbar.channel_information')} - - ) : ( - <> - ) - } - avatar={ 20 ? icon : ''} title={name || ''} />} - suffix={canEdit ? : <>} - /> - {canRemove && } - -
- { - canEdit && props.onAccess && props.onAccess(); - }} - className={ - '-mx-2 my-1 p-2 rounded-md ' + - (canEdit ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800' : '') - } - title={ - - {Languages.t('scenes.app.channelsbar.channel_access')} - - } - subtitle={<>} - avatar={} - suffix={ -
- - {props.channel?.visibility === 'public' ? 'Public' : 'Private'} - - {canEdit ? : <> } -
- } - /> - {!isGuest && !!props.onMembers && ( - { - props.onMembers && props.onMembers(); - }} - className={ - '-mx-2 my-1 p-2 rounded-md ' + - (canEdit ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800' : '') - } - title={ - - {Languages.t('scenes.apps.parameters.workspace_sections.members')} - - } - subtitle={<>} - avatar={} - suffix={} - /> - )} - - )} - { - props.onMedias && props.onMedias(); - }} - className="-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800" - title={ - - {Languages.t('components.channel_attachement_list.title')} - - } - subtitle={<>} - avatar={} - suffix={} - /> -
- - { - const url = addUrlTryDesktop( - `${document.location.origin}${RouterServices.generateRouteFromState({ - workspaceId: props.channel?.workspace_id || '', - companyId: props.channel?.company_id, - channelId: props.channel?.id, - })}`, - ); - copyToClipboard(url); - ToasterService.success(Languages.t('components.input.copied')); - }} - className={ - '-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800' - } - title={ - - {Languages.t('scenes.app.channelsbar.channel_copy_link')} - - } - subtitle={<>} - avatar={} - suffix={<>} - /> - - {!isDirect && ( - { - props.onNotifications && props.onNotifications(); - }} - /> - )} - - {canLeave && } -
-
- ); -}; - -const RemoveBlock = (props: { channel?: ChannelType; onLeave?: Function }) => { - const { refresh: refreshAllChannels } = useFavoriteChannels(); - const [loading, setLoading] = useState(false); - - return ( - { - AlertManager.confirm(async () => { - setLoading(true); - await ChannelsMineAPIClient.removeChannel( - props.channel?.company_id || '', - props.channel?.workspace_id || '', - props.channel?.id || '', - ); - await refreshAllChannels(); - - RouterServices.push( - RouterServices.generateRouteFromState({ - companyId: props.channel?.company_id || '', - workspaceId: props.channel?.workspace_id || '', - channelId: '', - }), - ); - - props.onLeave && props.onLeave(); - }); - }} - className="-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-rose-50 dark:hover:bg-rose-800" - title={ - - {Languages.t('scenes.app.channelsbar.channel_removing')} - - } - subtitle={<>} - avatar={ - loading ? ( - - ) : ( - - ) - } - /> - ); -}; - -const LeaveBlock = (props: { channel?: ChannelType; onLeave?: Function }) => { - const { refresh: refreshAllChannels } = useFavoriteChannels(); - const { user } = useCurrentUser(); - const [loading, setLoading] = useState(false); - - const leaveChannel = async (isDirectChannel = false) => { - setLoading(true); - if (props.channel?.id && props.channel?.company_id && props.channel.workspace_id) { - const res = await ChannelsMineAPIClient.removeUser(user?.id || '', { - companyId: props.channel.company_id, - workspaceId: isDirectChannel ? 'direct' : props.channel.workspace_id, - channelId: props.channel.id, - }); - - if (res?.error?.length && res?.message?.length) { - ToasterService.error(`${res.error} - ${res.message}`); - } else { - await refreshAllChannels(); - - RouterServices.push( - RouterServices.generateRouteFromState({ - companyId: props.channel?.company_id || '', - workspaceId: props.channel?.workspace_id || '', - channelId: '', - }), - ); - - props.onLeave && props.onLeave(); - } - await refreshAllChannels(); - } - - setLoading(false); - }; - - return ( - { - if (props.channel!.visibility) { - if (isPrivateChannel(props.channel!.visibility)) { - return AlertManager.confirm(() => leaveChannel(), undefined, { - title: Languages.t('components.alert.leave_private_channel.title'), - text: Languages.t('components.alert.leave_private_channel.description'), - }); - } - if (isDirectChannel(props.channel!.visibility)) { - return leaveChannel(true); - } - } - - return leaveChannel(); - }} - className="-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-rose-50 dark:hover:bg-rose-800" - title={ - - {Languages.t('scenes.app.channelsbar.channel_leaving')} - - } - subtitle={<>} - avatar={ - loading ? ( - - ) : ( - - ) - } - /> - ); -}; - -const NotificationsBlock = (props: { channel?: ChannelType; onClick: Function }) => { - const { member } = useChannelMemberCurrentUser(props.channel?.id || ''); - - return ( - { - props.onClick(); - }} - className="-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800" - title={ - - {Languages.t('scenes.app.channelsbar.currentuser.user_parameter')} - - } - subtitle={<>} - avatar={} - suffix={ -
- - {member?.notification_level === 'all' && - Languages.t('scenes.apps.messages.left_bar.stream.notifications.all')} - {member?.notification_level === 'mentions' && '@all, @[you]'} - {member?.notification_level === 'me' && - Languages.t('scenes.apps.messages.left_bar.stream.notifications.me', [`@[you]`])} - {member?.notification_level === 'none' && - Languages.t('scenes.apps.messages.left_bar.stream.notifications.never')} - - -
- } - /> - ); -}; - -const FavoriteBlock = (props: { channel?: ChannelType }) => { - const { favorite, setFavorite } = useChannelMemberCurrentUser(props.channel?.id || ''); - const [loading, setLoading] = useState(false); - - return ( - { - setLoading(true); - await setFavorite(!favorite); - setLoading(false); - }} - className="-mx-2 my-1 p-2 rounded-md cursor-pointer hover:bg-blue-50 dark:hover:bg-zinc-800" - title={ - - {Languages.t( - favorite - ? 'scenes.apps.messages.left_bar.stream.remove_from_favorites' - : 'scenes.apps.messages.left_bar.stream.add_to_favorites', - )} - - } - subtitle={<>} - avatar={ - loading ? ( - - ) : favorite ? ( - - ) : ( - - ) - } - /> - ); -}; diff --git a/tdrive/frontend/src/app/components/edit-channel/index.tsx b/tdrive/frontend/src/app/components/edit-channel/index.tsx deleted file mode 100644 index dc97247a..00000000 --- a/tdrive/frontend/src/app/components/edit-channel/index.tsx +++ /dev/null @@ -1,261 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { Transition } from '@headlessui/react'; -import { ChevronLeftIcon } from '@heroicons/react/outline'; -import A from 'app/atoms/link'; -import { Loader } from 'app/atoms/loader'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import { useUsersSearchModal } from 'app/features/channel-members-search/state/search-channel-member'; -import ChannelAPIClient from 'app/features/channels/api/channel-api-client'; -import { useChannel } from 'app/features/channels/hooks/use-channel'; -import { useFavoriteChannels } from 'app/features/channels/hooks/use-favorite-channels'; -import { channelAttachmentListState } from 'app/features/channels/state/channel-attachment-list'; -import { ChannelType } from 'app/features/channels/types/channel'; -import useRouteState from 'app/features/router/hooks/use-route-state'; -import { useEffect, useState } from 'react'; -import { atom, useRecoilState, useSetRecoilState } from 'recoil'; -import { slideXTransition, slideXTransitionReverted } from 'src/utils/transitions'; -import { ChannelAccessForm } from './channel-access'; -import { ChannelInformationForm } from './channel-information'; -import { ChannelNotificationsForm } from './channel-notifications'; -import { ChannelSettingsMenu } from './channel-settings-menu'; -import RouterServices from '@features/router/services/router-service'; -import Languages from 'app/features/global/services/languages-service'; - -const EditChannelModalAtom = atom({ - key: 'EditChannelModalAtom', - default: { - open: false, - channelId: '', - }, -}); - -export const useOpenChannelModal = () => { - const setModal = useSetRecoilState(EditChannelModalAtom); - return (channelId: string) => setModal({ open: true, channelId }); -}; - -export const EditChannelModal = () => { - const [channelModal, setChannelModal] = useRecoilState(EditChannelModalAtom); - - return ( - setChannelModal({ ...channelModal, open: false })} - className="int-channel-edit-modal !max-w-sm" - > - {!channelModal.channelId && } - {!!channelModal.channelId && } - - ); -}; - -const EditChannelForm = () => { - const [channelModal, setChannelModal] = useRecoilState(EditChannelModalAtom); - const [page, setPage] = useState<'information' | 'access' | 'notifications' | 'menu'>('menu'); - const { setOpen: setParticipantsOpen } = useUsersSearchModal(); - const [, setChannelAttachmentState] = useRecoilState(channelAttachmentListState); - const { refresh } = useFavoriteChannels(); - - const { channel } = useChannel(channelModal.channelId); - - return ( - - {page !== 'menu' && ( - setPage('menu')}> - - - )} - {Languages.t('scenes.app.channelsbar.modify_channel_menu')} -
- } - > -
- -
- - setPage('information')} - onAccess={() => setPage('access')} - onNotifications={() => setPage('notifications')} - onClose={() => { - setChannelModal({ ...channelModal, open: false }); - }} - onMembers={() => { - setChannelModal({ ...channelModal, open: false }); - setTimeout(() => setParticipantsOpen(true), 500); - }} - onMedias={() => { - setChannelModal({ ...channelModal, open: false }); - setTimeout(() => setChannelAttachmentState(true), 500); - }} - channel={channel} - /> - - - { - setPage('menu'); - await ChannelAPIClient.save( - { ...channel, ...changes }, - { - companyId: channel.company_id!, - workspaceId: channel.workspace_id!, - channelId: channel.id, - }, - ); - await refresh(); - }} - channel={channel} - /> - - - { - await ChannelAPIClient.save( - { ...channel, ...changes }, - { - companyId: channel.company_id!, - workspaceId: channel.workspace_id!, - channelId: channel.id, - }, - ); - await refresh(); - setPage('menu'); - }} - channel={channel} - /> - - - setPage('menu')} channel={channel} /> - -
- - ); -}; - -const CreateChannelForm = () => { - const setChannelModal = useSetRecoilState(EditChannelModalAtom); - const { setOpen: setParticipantsOpen } = useUsersSearchModal(); - const { companyId, workspaceId } = useRouteState(); - const { refresh } = useFavoriteChannels(); - - const [step, setStep] = useState(0); - const [channel, setChannel] = useState>({}); - - useEffect(() => { - if (step === 2) { - (async () => { - const created = await ChannelAPIClient.save(channel, { - companyId: companyId!, - workspaceId: workspaceId!, - }); - await refresh(); - RouterServices.push(RouterServices.generateRouteFromState({ channelId: created.id })); - setChannelModal({ open: false, channelId: '' }); - setTimeout(() => { - setParticipantsOpen(true); - }, 500); - })(); - } - }, [step]); - - return ( - -
- -
- - { - setStep(1); - setChannel({ ...channel, ...changes }); - }} - /> - - - - { - setStep(2); - setChannel({ ...channel, ...changes }); - }} - /> - - - -
- -
-
-
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/editable-text/editable-text.jsx b/tdrive/frontend/src/app/components/editable-text/editable-text.jsx deleted file mode 100755 index acb509c4..00000000 --- a/tdrive/frontend/src/app/components/editable-text/editable-text.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { Component } from 'react'; -import './editable-text.scss'; - -import Input from 'components/inputs/input.jsx'; - -export default class EditableText extends React.Component { - constructor(props) { - super(); - this.props = props; - - this.state = { - value: '#FF0000', - }; - } - render() { - return ( -
- this.setState({ value: evt.target.value })} - /> -
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/editable-text/editable-text.scss b/tdrive/frontend/src/app/components/editable-text/editable-text.scss deleted file mode 100755 index b44898cd..00000000 --- a/tdrive/frontend/src/app/components/editable-text/editable-text.scss +++ /dev/null @@ -1,19 +0,0 @@ -.color_input { - position: relative; - - .color_square { - position: absolute; - left: 8px; - top: 8px; - width: 24px; - height: 24px; - border-radius: var(--border-radius-base); - } - - input { - background: #888; - padding-left: 40px !important; - box-sizing: border-box; - width: 120px; - } -} diff --git a/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.jsx b/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.jsx deleted file mode 100755 index e232d9c8..00000000 --- a/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.jsx +++ /dev/null @@ -1,142 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; -import { Picker } from 'emoji-mart'; -import Emojione from 'components/emojione/emojione'; -import { getAsFrontUrl } from 'app/features/global/utils/URLUtils'; -import './emoji-picker.scss'; -import 'emoji-mart/css/emoji-mart.css'; -import Languages from 'app/features/global/services/languages-service'; -import { isArray } from 'lodash'; - -Picker.defaultProps.backgroundImageFn = function backgroundImageFn(set, sheetSize) { - sheetSize = 20; - return getAsFrontUrl( - '/public/emoji-datasource/'.concat(set, '/sheets-256/').concat(sheetSize, '.png'), - ); -}; -export default class EmojiPicker extends React.Component { - /* - props = { - preferedEmoji : Array of emoji's shortname - onChange : called when a smiley is selected - } - */ - constructor(props) { - super(); - this.props = props; - this.state = { - suggestions: [], - currentTitle: '', - availableCategories: [], - scrollToRow: 0, - loaded: false, - }; - this.currentTitleIndex = 100000; - this.clickScrollToRow = 0; - } - onChange(list) { - if (list.length > 0) { - if (this.props.onChange) { - this.props.onChange(list[0]); - } - this.setState({ list: [] }); - } - } - renderItemChoosen(item) { - return ( -
- -
- ); - } - renderItem(item) { - return ( -
- -
- ); - } - scrollToCategory(category) { - var index = 0; - this.state.suggestions.forEach((item, i) => { - if (item.value == category) { - index = i; - return false; - } - }); - this.clickScrollToRow = index; - if (this.state.scrollToRow != index) { - this.setState({ scrollToRow: index }); - } else { - this.list_node.forceUpdateGrid(); - } - } - select(emoji) { - if (this.picker) { - this.picker.onSelect(emoji); - } else { - this.onChange([emoji]); - } - } - getPrefered() { - var pref = this.props.preferedEmoji || [ - ':thumbsup:', - ':thumbsdown:', - ':hearts:', - ':tada:', - ':smile:', - ':confused:', - ]; - if ( - typeof this.props.selected === 'string' && - this.props.selected && - pref.indexOf(this.props.selected) < 0 - ) { - pref.unshift(this.props.selected); - } - if (isArray(this.props.selected)) { - this.props.selected.forEach(s => pref.unshift(s)); - } - return pref; - } - componentDidMount() { - setTimeout(() => { - this.setState({ loaded: true }); - }, 300); - } - render() { - if (!this.state.loaded) { - return
; - } - return ( -
- -
- ); - } -} diff --git a/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.scss b/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.scss deleted file mode 100755 index 98fa496f..00000000 --- a/tdrive/frontend/src/app/components/emoji-picker/emoji-picker.scss +++ /dev/null @@ -1,19 +0,0 @@ -.emoji-mart { - border: none; - color: var(--grey-dark); - font-size: 14px; - width: unset !important; - left: 0px; - .emoji-mart-emoji { - padding: 7px; - } -} - -.emoji-mart-search > input { - padding-top: 6px; - font-size: 14px; -} -.emoji-mart-emoji { - display: inline-flex; - align-items: center; -} diff --git a/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-file-row.tsx b/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-file-row.tsx index ba47ec81..545fda1e 100644 --- a/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-file-row.tsx +++ b/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-file-row.tsx @@ -10,11 +10,9 @@ import { isPendingFileStatusPending, isPendingFileStatusSuccess, } from '../../../features/files/utils/pending-files'; -import Languages from 'app/features/global/services/languages-service'; -import { useUpload } from 'app/features/files/hooks/use-upload'; -import { PendingFileRecoilType, PendingFileType } from 'app/features/files/types/file'; - -import '../../file/file.scss'; +import Languages from '@features/global/services/languages-service'; +import { useUpload } from '@features/files/hooks/use-upload'; +import { PendingFileRecoilType, PendingFileType } from '@features/files/types/file'; type PropsType = { pendingFileState: PendingFileRecoilType; diff --git a/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-files-list.tsx b/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-files-list.tsx index 321d9dc0..b66afbcc 100644 --- a/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-files-list.tsx +++ b/tdrive/frontend/src/app/components/file-uploads/pending-file-components/pending-files-list.tsx @@ -6,9 +6,9 @@ import PerfectScrollbar from 'react-perfect-scrollbar'; import moment from 'moment'; import PendingFileRow from './pending-file-row'; -import Languages from 'app/features/global/services/languages-service'; -import { PendingFileRecoilType } from 'app/features/files/types/file'; -import { useUpload } from 'app/features/files/hooks/use-upload'; +import Languages from '@features/global/services/languages-service'; +import { PendingFileRecoilType } from '@features/files/types/file'; +import { useUpload } from '@features/files/hooks/use-upload'; import './styles.scss'; diff --git a/tdrive/frontend/src/app/components/file-uploads/uploads-viewer.tsx b/tdrive/frontend/src/app/components/file-uploads/uploads-viewer.tsx index 9d025701..552e4b45 100644 --- a/tdrive/frontend/src/app/components/file-uploads/uploads-viewer.tsx +++ b/tdrive/frontend/src/app/components/file-uploads/uploads-viewer.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useUpload } from 'app/features/files/hooks/use-upload'; +import { useUpload } from '@features/files/hooks/use-upload'; import PendingFilesList from './pending-file-components/pending-files-list'; const ChatUploadsViewer = (): JSX.Element => { diff --git a/tdrive/frontend/src/app/components/file/file-component.tsx b/tdrive/frontend/src/app/components/file/file-component.tsx deleted file mode 100644 index 9d5c617a..00000000 --- a/tdrive/frontend/src/app/components/file/file-component.tsx +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { useState, useEffect } from 'react'; -import classNames, { Argument } from 'classnames'; - -import { FileThumbnail, FileDetails, FileActions, FileProgress } from './parts'; -import { - isPendingFileStatusCancel, - isPendingFileStatusError, - isPendingFileStatusSuccess, -} from 'app/features/files/utils/pending-files'; -import { DataFileType } from './types'; -import DriveService from 'app/deprecated/Apps/Drive/Drive.js'; -import RouterService from 'app/features/router/services/router-service'; - -import './file.scss'; -import { PendingFileRecoilType } from 'app/features/files/types/file'; -import Api from 'app/features/global/framework/api-service'; -import FileUploadAPIClient from '../../features/files/api/file-upload-api-client'; -import LargePreview from './parts/large-preview'; -import { MessageFileType } from 'app/features/messages/types/message'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; - -type PropsType = { - source: 'internal' | 'drive' | string; - externalId: string | any; - file: DataFileType; - messageFile: MessageFileType; - context: 'input' | 'message' | 'drive'; - progress?: number; - status?: PendingFileRecoilType['status']; - onRemove?: () => void; - className?: string; - large?: boolean; - xlarge?: boolean; -}; - -export default ({ - source, - externalId, - file: _file, - messageFile, - className, - context, - progress, - status, - onRemove, - large, - xlarge, -}: PropsType) => { - const { companyId, workspaceId } = RouterService.getStateFromRoute(); - const [file, setFile] = useState(_file); - const classNameArguments: Argument[] = [ - 'file-component', - className, - { 'large-view': large }, - { - 'file-component-error': - status && (isPendingFileStatusError(status) || isPendingFileStatusCancel(status)), - 'file-component-uploading': progress != undefined && progress < 1, - }, - ]; - - const { open: openViewer } = useFileViewerModal(); - - useEffect(() => { - if (source === 'drive') { - (async () => { - if (typeof externalId === 'string') { - externalId = { id: externalId, workspace_id: workspaceId }; - } - - let driveFile = (await Api.post('/ajax/drive/v2/find', { - options: { - element_id: externalId?.id, - workspace_id: externalId?.workspace_id, - }, - })) as any; - driveFile = driveFile?.data || {}; - - setFile({ - ...file, - thumbnail: driveFile.preview_link, - name: driveFile.name, - size: driveFile.size, - type: FileUploadAPIClient.mimeToType( - FileUploadAPIClient.extensionToMime(driveFile.extension), - ), - }); - })(); - } else { - setFile(_file); - } - }, [_file]); - - const onClickFile = async () => { - if (source === 'internal') { - //Only if upload has ended - if ((!status || isPendingFileStatusSuccess(status)) && file.id) openViewer(messageFile); - } - if (source === 'drive') { - if (typeof externalId === 'string') { - externalId = { id: externalId, workspace_id: workspaceId }; - } - - const file = (await Api.post('/ajax/drive/v2/find', { - options: { - element_id: externalId?.id, - workspace_id: externalId?.workspace_id, - }, - })) as any; - DriveService.viewDocument(file?.data, context === 'input'); - } - }; - - let computedHeight = 200; - let computedWidth = file.thumbnail_ratio * 200; - const isMediaFile = ['image', 'video'].includes(file.type); - - if (xlarge) { - computedWidth = Math.max( - 160, - Math.min( - Math.min(messageFile.metadata?.thumbnails?.[0]?.width || 600, 600), - file.thumbnail_ratio * document.body.clientHeight * 0.5, - ), - ); - computedHeight = Math.max( - 200, - Math.min( - Math.min( - messageFile.metadata?.thumbnails?.[0]?.height || 10000, - document.body.clientHeight * 0.5, - ), - computedWidth / file.thumbnail_ratio, - ), - ); - } - - return ( -
companyId && onClickFile()} - > - {large && } -
- - - -
- -
- ); -}; diff --git a/tdrive/frontend/src/app/components/file/file.scss b/tdrive/frontend/src/app/components/file/file.scss deleted file mode 100644 index 8c1c5432..00000000 --- a/tdrive/frontend/src/app/components/file/file.scss +++ /dev/null @@ -1,160 +0,0 @@ -.file-component { - border: 1px solid var(--grey-light); - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); - border-radius: 8px 8px 8px 8px; - width: 218px; - display: flex; - flex-direction: column; - justify-content: space-between; - overflow: hidden; - min-height: 50px; - - &:hover { - cursor: pointer; - } - - &.large-view { - min-height: 200px; - max-height: 500px; - max-width: 90%; - min-width: 160px; - position: relative; - - .file-large-preview { - position: absolute; - height: 100%; - top: 0px; - left: 0px; - right: 0px; - background-size: contain; - background-position: center; - background-repeat: no-repeat; - } - - &:hover { - .file-info-container { - opacity: 1; - transition: opacity 0s; - } - } - - .file-info-container { - background-color: #fffffff0; - position: absolute; - border-top: 1px solid var(--grey-light); - bottom: 0px; - width: 100%; - - .file-thumbnail-container { - display: none; - } - } - - .media-file-info-container { - opacity: 0; - transition: opacity 0.2s; - } - - .file-large-preview-play-container { - width: 64px; - height: 64px; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - border-radius: 15px; - } - } - - &.file-component-uploading { - border-radius: 8px 8px 0px 0px; - - & .file-info-container { - opacity: 0.5; - } - - .file-info-container { - padding-bottom: 0; - } - - .file-progress-bar-container { - padding-top: 3px; - padding-bottom: 3px; - height: 5px; - } - } - - &.file-component-error { - background: var(--error-background); - } - - .file-info-container { - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 8px 8px 6px 8px; - - .file-thumbnail-container { - display: flex; - align-items: center; - justify-content: center; - width: 32px; - - .file-thumbnail-component { - border-radius: 4px; - } - } - - .file-component-details { - overflow: hidden; - flex: 1; - display: flex; - flex-direction: column; - - .ant-tag { - height: 15px; - line-height: 15px; - padding: 0 4px; - } - } - } - - .file-menu { - display: flex; - - align-items: center; - justify-content: space-between; - - .ant-btn { - display: flex; - justify-content: center; - align-items: center; - &:hover { - color: var(--black); - } - color: var(--grey-dark); - background-color: transparent; - } - } -} - -.file-progress-bar-container { - display: flex; - - .file-progress-bar { - .ant-progress-outer { - height: 3px; - display: flex; - - .ant-progress-inner { - border-radius: 0px; - - .ant-progress-bg { - border-radius: 2px; - height: 3px !important; - transition: all 0.2s; - } - } - } - } -} diff --git a/tdrive/frontend/src/app/components/file/parts/actions.tsx b/tdrive/frontend/src/app/components/file/parts/actions.tsx deleted file mode 100644 index fcdd5833..00000000 --- a/tdrive/frontend/src/app/components/file/parts/actions.tsx +++ /dev/null @@ -1,152 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { useRef } from 'react'; -import { Button } from 'antd'; -import { MoreHorizontal, RotateCw, X } from 'react-feather'; - -import { - isPendingFileStatusPending, - isPendingFileStatusPause, - isPendingFileStatusSuccess, - isPendingFileStatusError, - isPendingFileStatusCancel, -} from 'app/features/files/utils/pending-files'; -import Languages from 'app/features/global/services/languages-service'; -import { useUpload } from 'app/features/files/hooks/use-upload'; -import { DataFileType } from '../types'; -import MenuManager from 'app/components/menus/menus-manager'; -import { PendingFileRecoilType } from 'app/features/files/types/file'; -import { MessageFileType } from 'app/features/messages/types/message'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; -import { useEditors } from 'app/views/client/viewer/other/editors-service'; - -type PropsType = { - file: DataFileType; - messageFile: MessageFileType; - status?: PendingFileRecoilType['status']; - deletable?: boolean; - actionMenu?: boolean; - onRemove?: () => void; - source?: string; -}; - -export const FileActions = ({ - file, - messageFile, - status, - deletable, - actionMenu, - onRemove, -}: PropsType): JSX.Element => { - const { cancelUpload, deleteOneFile, downloadOneFile, retryUpload } = useUpload(); - const menuRef = useRef(); - const { open: openPreview } = useFileViewerModal(); - const { candidates } = useEditors(file.name.split('.').pop() || ''); - - const onClickDownload = async () => { - file.company_id && - (await downloadOneFile({ - companyId: file.company_id, - fileId: file.id, - messageFile, - })); - }; - - const onClickOpen = async () => { - openPreview(messageFile); - }; - - const buildMenu = (e: React.MouseEvent) => { - e.stopPropagation(); - - const menu = [ - { - type: 'menu', - text: Languages.t('scenes.apps.drive.download_button'), - onClick: onClickDownload, - }, - ]; - - if (candidates.length > 0) { - const openerName = candidates[0].name || candidates[0].app?.identity.name; - - menu.push({ - type: 'menu', - text: Languages.t( - 'scenes.apps.drive.viewer.edit_with_button', - [openerName], - `Edit with ${openerName}`, - ), - onClick: onClickOpen, - }); - } - - MenuManager.openMenu(menu, (window as any).getBoundingClientRect(menuRef.current), null, { - margin: 0, - }); - }; - - const onClickCancel = (e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - - if (status && isPendingFileStatusSuccess(status)) { - if (file.id) deleteOneFile(file.id); - } else { - cancelUpload(file.id); - } - - if (onRemove) onRemove(); - }; - - const onClickRetry = () => { - retryUpload(file.id); - }; - - const setActions = () => { - if (actionMenu) { - return ( - - - ); -}; diff --git a/tdrive/frontend/src/app/components/highlighted-code/highlighted-code.tsx b/tdrive/frontend/src/app/components/highlighted-code/highlighted-code.tsx deleted file mode 100755 index b665270c..00000000 --- a/tdrive/frontend/src/app/components/highlighted-code/highlighted-code.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { useEffect, useState } from 'react'; -import hljs from 'highlight.js'; -import 'highlight.js/styles/railscasts.css'; //monokai-sublime -import { Copy } from 'react-feather'; -import { Tooltip } from 'antd'; -import { ToasterService } from 'app/features/global/services/toaster-service'; - -export default ({ code, className }: { code: string; className?: string }) => { - let renderedCode = code.replace(/\t/g, ' '); - - const [expanded, setExpanded] = useState(renderedCode.split('\n').length < 5); - const ref = React.createRef(); - - useEffect(() => { - hljs.highlightElement(ref.current); - }, [expanded]); - - renderedCode = renderedCode - .split('\n') - .slice(0, expanded ? 100000000 : 5) - .join('\n'); - - const copy = () => { - navigator.clipboard.writeText(code).then(function () { - ToasterService.success('Content copied!'); - }); - }; - - return ( -
-
-        {renderedCode}
-      
- {!expanded && ( - { - setExpanded(true); - }} - > - Click to expand ({code.split('\n').length} lines) - - )} - - - - - -
- ); -}; diff --git a/tdrive/frontend/src/app/components/input-with-clip-board/input-with-clip-board.jsx b/tdrive/frontend/src/app/components/input-with-clip-board/input-with-clip-board.jsx index 14ad9e77..51c6f109 100755 --- a/tdrive/frontend/src/app/components/input-with-clip-board/input-with-clip-board.jsx +++ b/tdrive/frontend/src/app/components/input-with-clip-board/input-with-clip-board.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/prop-types */ import React, { Component } from 'react'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import Tooltip from 'components/tooltip/tooltip.jsx'; import InputWithButton from 'components/inputs/input-with-button.jsx'; diff --git a/tdrive/frontend/src/app/components/inputs/input-enter.jsx b/tdrive/frontend/src/app/components/inputs/input-enter.jsx index 903ef1c9..2f8dec22 100755 --- a/tdrive/frontend/src/app/components/inputs/input-enter.jsx +++ b/tdrive/frontend/src/app/components/inputs/input-enter.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import Input from './input.jsx'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import './inputs.scss'; export default class InputEnter extends Component { diff --git a/tdrive/frontend/src/app/components/inputs/input-icon.jsx b/tdrive/frontend/src/app/components/inputs/input-icon.jsx index 10b29e5b..e31672df 100755 --- a/tdrive/frontend/src/app/components/inputs/input-icon.jsx +++ b/tdrive/frontend/src/app/components/inputs/input-icon.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import Input from './input.jsx'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import './inputs.scss'; export default class InputIcon extends Component { diff --git a/tdrive/frontend/src/app/components/inputs/input-with-button.jsx b/tdrive/frontend/src/app/components/inputs/input-with-button.jsx index 45159598..1c5abb2e 100644 --- a/tdrive/frontend/src/app/components/inputs/input-with-button.jsx +++ b/tdrive/frontend/src/app/components/inputs/input-with-button.jsx @@ -1,9 +1,9 @@ /* eslint-disable react/prop-types */ import React, { Component } from 'react'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import './input-with-button.scss'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import Input from './input.jsx'; export default class InputWithButton extends Component { diff --git a/tdrive/frontend/src/app/components/inputs/input-with-color.jsx b/tdrive/frontend/src/app/components/inputs/input-with-color.jsx index 61c6829f..9c4893ca 100755 --- a/tdrive/frontend/src/app/components/inputs/input-with-color.jsx +++ b/tdrive/frontend/src/app/components/inputs/input-with-color.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/prop-types */ import React, { Component } from 'react'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; import ColorPicker from 'components/color-picker/color-picker.jsx'; import Input from 'components/inputs/input.jsx'; import './inputs.scss'; diff --git a/tdrive/frontend/src/app/components/inputs/input-with-icon.tsx b/tdrive/frontend/src/app/components/inputs/input-with-icon.tsx deleted file mode 100755 index 17de3a9d..00000000 --- a/tdrive/frontend/src/app/components/inputs/input-with-icon.tsx +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React from 'react'; -import { Input, Col, Row } from 'antd'; - -import Emojione from 'components/emojione/emojione'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; -import EmojiPicker from 'components/emoji-picker/emoji-picker.jsx'; - -import './inputs.scss'; - -type PropsType = { [key: string]: any }; -type StateType = { [key: string]: any }; - -export default class InputWithIcon extends React.Component { - outsideClickListener: (event: any) => void = () => undefined; - input: any; - emojiPickerIsOpen: any; - emojipicker_dom: any; - allChanEmojies = [ - ':8ball:', - ':dart:', - ':joystick:', - ':video_game:', - ':bar_chart:', - ':crystal_ball:', - ':speech_balloon:', - ':bulb:', - ':deciduous_tree:', - ':palm_tree:', - ':earth_americas:', - ':open_file_folder:', - ':penguin:', - ':seedling:', - ':sailboat:', - ':fire_engine:', - ':scroll:', - ':newspaper:', - ':factory:', - ':package:', - ':mailbox:', - ':moneybag:', - ':smiley_cat:', - ':sunglasses:', - ]; - emoji_dom: any; - - UNSAFE_componentWillMount() { - this.randomizeEmojies(); - } - - randomizeEmojies() { - this.allChanEmojies.sort((a, b) => { - if (b === this.props.value[0]) { - return -1; - } - if (a === this.props.value[0]) { - return 1; - } - return Math.floor(Math.random() * 3) - 1; - }); - } - - outsideMenuListener() { - this.closeEmojiPicker(); - } - - componentWillUnmount() { - document.removeEventListener('click', this.outsideClickListener); - } - - componentDidMount() { - if (this.props.focusOnDidMount && this.input) { - this.input.focus(); - } - - this.outsideClickListener = event => { - if ( - this.emojiPickerIsOpen && - this.emojipicker_dom && - !this.emojipicker_dom.contains(event.target) && - document.contains(event.target) - ) { - this.outsideMenuListener(); - } - }; - - this.outsideClickListener = this.outsideClickListener.bind(this); - document.addEventListener('click', this.outsideClickListener); - } - - closeEmojiPicker() { - if (!this.emojiPickerIsOpen) { - return; - } - - if (this.props.menu_level !== undefined) { - MenusManager.closeSubMenu(this.props.menu_level); - } else { - MenusManager.closeMenu(); - } - - this.emojiPickerIsOpen = false; - } - - openEmojiPicker() { - if (this.emojiPickerIsOpen) { - return; - } - - let preferedEmojis = [this.props.value[0]]; - if (this.props.preferedEmoji) { - preferedEmojis = this.props.preferedEmoji; - } else { - this.randomizeEmojies(); - for (let i = 0; i < 5; i++) { - preferedEmojis[i + 1] = this.allChanEmojies[i]; - } - } - - const menu = [ - { - type: 'react-element', - className: 'menu-cancel-margin', - reactElement: () => { - return ( - (this.emojipicker_dom = node)} - onChange={(emoji: any) => this.selectEmoji(emoji)} - /> - ); - }, - }, - ]; - const elementRect = (window as any).getBoundingClientRect(this.emoji_dom); - elementRect.x = elementRect.x || elementRect.left; - elementRect.y = elementRect.y || elementRect.top; - if (this.props.menu_level !== undefined) { - MenusManager.openSubMenu(menu, elementRect, this.props.menu_level, 'bottom'); - } else { - MenusManager.openMenu(menu, elementRect, 'bottom', {}); - } - - setTimeout(() => { - this.emojiPickerIsOpen = true; - }, 200); - } - selectEmoji(emoji: any) { - this.closeEmojiPicker(); - const value = [emoji.native, this.props.value[1]]; - this.onChange(value); - } - onChange(value: any) { - if (this.props.onChange) { - this.props.onChange(value); - } - } - render() { - let icon = this.props.value[0]; - if (!this.props.value[0]) { - this.onChange([this.allChanEmojies[0], this.props.value[1]]); - icon = this.allChanEmojies[0]; - } - return ( - - - -
(this.emoji_dom = node)} - onClick={() => { - this.openEmojiPicker(); - }} - > - -
- - - {(!this.props.children && ( - { - this.input = obj; - if (this.props.inputRef) this.props.inputRef(obj); - }} - type="text" - placeholder={this.props.placeholder} - value={this.props.value[1]} - onPressEnter={this.props.onEnter} - onChange={evt => { - if (this.onChange) this.onChange([this.props.value[0], evt.target.value]); - }} - /> - )) || - this.props.children} - -
-
- ); - } -} diff --git a/tdrive/frontend/src/app/components/inputs/input-with-select.scss b/tdrive/frontend/src/app/components/inputs/input-with-select.scss deleted file mode 100644 index d16d0954..00000000 --- a/tdrive/frontend/src/app/components/inputs/input-with-select.scss +++ /dev/null @@ -1,47 +0,0 @@ -.group-container { - .ant-btn-icon-only { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - background-color: var(--grey-background); - border-radius: var(--border-radius-base) 0px 0px var(--border-radius-base); - padding: 0; - - &:hover { - background-color: var(--grey-background); - } - } - - .ant-select { - max-width: 120px; - - .ant-select-selector { - border-radius: 0 !important; - } - - .ant-select-selector, - .border-radius-left { - border-radius: var(--border-radius-base) 0 0 var(--border-radius-base) !important; - } - } - - .group-divider { - height: 100%; - margin: 0; - top: 0; - background-color: var(--black-alpha-70); - opacity: 0.28; - } - - .ant-btn .small-margin-left { - color: var(--grey-dark); - &:hover { - color: var(--primary); - } - } - - .ant-input { - border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0; - } -} diff --git a/tdrive/frontend/src/app/components/inputs/input-with-select.tsx b/tdrive/frontend/src/app/components/inputs/input-with-select.tsx deleted file mode 100644 index 6ff6e7c9..00000000 --- a/tdrive/frontend/src/app/components/inputs/input-with-select.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Input, Col, Row, Select, Typography, Button, Divider, Tooltip } from 'antd'; -import { ChannelType } from 'app/features/channels/types/channel'; -import { List, X } from 'react-feather'; -import Languages from 'app/features/global/services/languages-service'; -import './input-with-select.scss'; - -type PropsType = { - channel: ChannelType | undefined; - onChange: (array: string[]) => void; - groups: string[]; -}; - -const { Group } = Input; -const { Option } = Select; -const InputWithSelect = ({ groups, channel, onChange }: PropsType): JSX.Element => { - const [group, setGroup] = useState(channel?.channel_group || ''); - const [channelName, setChannelName] = useState(channel?.name || ''); - const [searchedGroup, setSearchedGroup] = useState(''); - const [displaySelector, setDisplaySelector] = useState( - channel?.channel_group ? true : false, - ); - - useEffect(() => { - onChange([group || '', channelName]); - }); - - return ( - - - {!displaySelector && ( - - -
, -
- {Languages.t('components.invitation.bulk_invitation')} -
, - ]} - selected={activeTab} - onClick={index => setInvitationTab(index)} - className="w-full" - parentClassName="basis-1/2 justify-center" - /> - {activeTab === InvitationTabs.custom && } - {activeTab === InvitationTabs.bulk && }*/} - - - - - - ) : ( - - )} - - - ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/allow-anyone-by-email.tsx b/tdrive/frontend/src/app/components/invitation/parts/allow-anyone-by-email.tsx deleted file mode 100644 index ccd9c28a..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/allow-anyone-by-email.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Info, Subtitle } from 'app/atoms/text'; -import Switch from 'app/components/inputs/switch'; -import Languages from 'app/features/global/services/languages-service'; -import { ToasterService } from 'app/features/global/services/toaster-service'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import { useCurrentUser } from 'app/features/users/hooks/use-current-user'; -import workspaceApiClient from 'app/features/workspaces/api/workspace-api-client'; -import { useCurrentWorkspace } from 'app/features/workspaces/hooks/use-workspaces'; -import React, { useState } from 'react'; - -export default (): React.ReactElement => { - const { user } = useCurrentUser(); - const { members_limit_reached } = useInvitationUsers(); - const { workspace } = useCurrentWorkspace(); - const [allow, setAllow] = useState(!!workspace?.preferences?.invite_domain); - - const currentUserDomain = user?.email.split('@').pop(); - - const handleChange = async (value: boolean): Promise => { - if (value) { - try { - await workspaceApiClient.setInvitationDomain( - workspace?.company_id as string, - workspace?.id as string, - currentUserDomain as string, - ); - setAllow(true); - ToasterService.success('Invitation domain updated'); - } catch (error) { - ToasterService.error('Failed to set invitation domain'); - } - } - }; - - return !members_limit_reached ? ( - <> - Automatically invite my business - - If this is enabled, anyone creating a Tdrive account with your business email will - automatically be added to this company and this workspace. - -
-
- {Languages.t( - 'components.invitation.allow_anyone_by_email.text', - [workspace?.preferences?.invite_domain || currentUserDomain], - `Let anyone with @${ - workspace?.preferences?.invite_domain || currentUserDomain - } email join this workspace`, - )} -
- -
- - ) : ( - <> - ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/bulk-invitation.tsx b/tdrive/frontend/src/app/components/invitation/parts/bulk-invitation.tsx deleted file mode 100644 index b0a8d307..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/bulk-invitation.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import InvitationInputBulk from './invitation-input-bulk'; - -export default (): React.ReactElement => { - return ( -
- -
- ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/custom-role-invitation.tsx b/tdrive/frontend/src/app/components/invitation/parts/custom-role-invitation.tsx deleted file mode 100644 index 979bdf01..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/custom-role-invitation.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import InvitationInputList from './invitation-input-list'; - -export default (): React.ReactElement => { - return ( -
- -
- ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/invitation-channels.tsx b/tdrive/frontend/src/app/components/invitation/parts/invitation-channels.tsx deleted file mode 100644 index 0360bb5d..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/invitation-channels.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { Button } from 'app/atoms/button/button'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import { ChannelSelector } from 'app/components/channels-selector'; -import { ChannelType } from 'app/features/channels/types/channel'; -import { useInvitationChannels } from 'app/features/invitation/hooks/use-invitation-channels'; -import { uniqBy } from 'lodash'; -import Languages from 'app/features/global/services/languages-service'; - -export default (): React.ReactElement => { - const { selectedChannels, closeSelection, setChannels, open } = useInvitationChannels(); - - const handleSelectionChange = (channels: ChannelType[]) => { - setChannels(uniqBy(channels, 'id')); - }; - - return ( - closeSelection()} className="sm:w-[20vw] sm:max-w-xl"> - - - - - - - ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/invitation-input-bulk.tsx b/tdrive/frontend/src/app/components/invitation/parts/invitation-input-bulk.tsx deleted file mode 100644 index a7e7525d..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/invitation-input-bulk.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React from 'react'; -import { - invitationEmailsState, - invitationTypeState, - InvitedUser, -} from 'app/features/invitation/state/invitation'; -import { useRecoilState } from 'recoil'; -import ChipInput from 'material-ui-chip-input'; -import { RemoveIcon } from 'app/atoms/icons-colored'; -import PerfectScrollbar from 'react-perfect-scrollbar'; -import { useCurrentUser } from 'app/features/users/hooks/use-current-user'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import ReachedLimit from './reached-limit'; - -const emailRegex = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/; - -export default (): React.ReactElement => { - const [invitations, setInvitations] = useRecoilState(invitationEmailsState); - const [role] = useRecoilState(invitationTypeState); - const { user } = useCurrentUser(); - const { can_add_invitations, members_limit_reached } = useInvitationUsers(); - - const emails = (invitations || []).map(invitation => invitation.email); - const currentUserEmailDomain = user?.email.split('@').pop(); - - const handleChange = (chips: string[]) => { - const newInvitations: InvitedUser[] = chips - .filter(chip => !invitations.find(invitation => invitation.email === chip)) - .map(chip => ({ email: chip, role })); - const updatedInvitations = [...invitations, ...newInvitations]; - - setInvitations(updatedInvitations); - }; - - const validate = (chip: string): boolean => { - return emailRegex.test(chip) && currentUserEmailDomain === chip.split('@').pop(); - }; - - const handleDelete = (chip: string) => { - const updatedInvitations = invitations.filter(({ email }) => email !== chip); - - setInvitations(updatedInvitations); - }; - - const rederChip = ( - { chip, handleDelete }: { chip: string; handleDelete: React.EventHandler }, - key: string, - ): React.ReactElement => { - return ( -
- -
{chip}
-
- ); - }; - - return ( - - {members_limit_reached && } - - - ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/invitation-input-list.tsx b/tdrive/frontend/src/app/components/invitation/parts/invitation-input-list.tsx deleted file mode 100644 index a33a1d83..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/invitation-input-list.tsx +++ /dev/null @@ -1,147 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Button } from 'app/atoms/button/button'; -import { RemoveIcon } from 'app/atoms/icons-colored'; -import { Input } from 'app/atoms/input/input-text'; -import { - invitationEmailsState, - InvitationType, - invitationTypeState, -} from 'app/features/invitation/state/invitation'; -import React, { useState } from 'react'; -import { useRecoilState } from 'recoil'; -import PerfectScrollbar from 'react-perfect-scrollbar'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import ReachedLimit from './reached-limit'; -import Languages from 'app/features/global/services/languages-service'; -import { PlusIcon } from '@heroicons/react/outline'; -import Select from 'app/atoms/input/input-select'; - -export default (): React.ReactElement => { - const [invitations, setInvitations] = useRecoilState(invitationEmailsState); - const [currentInput, setCurrentInput] = useState(''); - const [notValidEmail, setNotValidEmail] = useState(false); - const [invitationTargetType] = useRecoilState(invitationTypeState); - const emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; - const { can_add_invitations, members_limit_reached, allowed_members, allowed_guests } = - useInvitationUsers(); - - const emailExists = (target: string): boolean => - !!invitations.find(invitation => invitation.email === target); - - const handleEnter = (event: unknown): void => { - if ((event as KeyboardEvent).key === 'Enter') { - handleAdd(); - } - }; - - const handleAdd = (): void => { - const role = invitationTargetType; - if (emailRegex.test(currentInput) && !emailExists(currentInput)) { - setInvitations([...invitations, { email: currentInput, role }]); - setCurrentInput(''); - setNotValidEmail(false); - } else { - setNotValidEmail(true); - } - }; - - const removeEmail = (targetEmail: string): void => { - setInvitations(invitations.filter(invitation => invitation.email !== targetEmail)); - }; - - const handleInput = (event: any): void => { - setCurrentInput(event.target.value); - setNotValidEmail(!emailRegex.test(event.target.value) || emailExists(event.target.value)); - }; - - const handleRoleChange = (email: string, role: InvitationType): void => { - if (role === InvitationType.guest && allowed_guests <= 0) return; - if (role === InvitationType.member && allowed_members <= 0) return; - - const changedInvitations = invitations.map(invitation => { - if (invitation.email === email) { - return { - email, - role, - }; - } - - return invitation; - }); - - setInvitations(changedInvitations); - }; - - return ( -
- {can_add_invitations ? ( -
- - -
- ) : members_limit_reached ? ( - - ) : ( - <> - )} - - {invitations.map(invitation => ( -
- removeEmail(invitation.email)} - /> - - -
- ))} -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/invitation-sent.tsx b/tdrive/frontend/src/app/components/invitation/parts/invitation-sent.tsx deleted file mode 100644 index d1313351..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/invitation-sent.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { SentIcon } from 'app/atoms/icons-colored'; -import { Title, Base } from 'app/atoms/text'; -import Link from 'app/atoms/link'; -import React from 'react'; -import { Button } from 'app/atoms/button/button'; -import { useInvitation } from 'app/features/invitation/hooks/use-invitation'; -import Languages from 'app/features/global/services/languages-service'; - -export default (): React.ReactElement => { - const { reset } = useInvitation(); - - return ( -
-
- -
-
- - {Languages.t( - 'components.invitation.invitation_sent.title', - [], - 'Invitations have successfully been sent', - )} - -
-
- - {Languages.t( - 'components.invitation.invitation_sent.subtitle_status', - [], - 'You can track invitaion status in:', - )} - - {Languages.t( - 'components.invitation.invitation_sent.subtitle_location', - [], - 'Workspace settings > Member management', - )} - -
-
- - {Languages.t('components.invitation.invitation_sent.link', [], 'Check invitation status')} - -
-
- -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/invitation-target.tsx b/tdrive/frontend/src/app/components/invitation/parts/invitation-target.tsx deleted file mode 100644 index 8cdad06f..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/invitation-target.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { BaseSmall } from 'app/atoms/text'; -import Switch from 'app/components/inputs/switch'; -import Languages from 'app/features/global/services/languages-service'; -import { useInvitationChannels } from 'app/features/invitation/hooks/use-invitation-channels'; -import { useInvitationUsers } from 'app/features/invitation/hooks/use-invitation-users'; -import { - invitationEmailsState, - InvitationType, - invitationTypeState, -} from 'app/features/invitation/state/invitation'; -import React from 'react'; -import { useRecoilState } from 'recoil'; - -export default (): React.ReactElement => { - const [invitationType, setInvitationType] = useRecoilState(invitationTypeState); - const { openSelection, selectedChannels } = useInvitationChannels(); - const [invitations, setInvitations] = useRecoilState(invitationEmailsState); - const { allowed_guests, allowed_members } = useInvitationUsers(); - - const changeInvitationType = (type: InvitationType) => { - setInvitationType(type); - - if (type === InvitationType.guest && allowed_guests <= 0) return; - if (type === InvitationType.member && allowed_members <= 0) return; - setInvitations(invitations.map(({ email }) => ({ email, role: type }))); - }; - - return ( -
-
- - {Languages.t('components.invitation.invitation_target.invite_as_guests')} - - changeInvitationType(e ? InvitationType.guest : InvitationType.member)} - /> -
-
-
openSelection()} - > - {Languages.t('components.invitation.invitation_target.channels_button')} -
- {selectedChannels.length} -
-
-
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/reached-limit.tsx b/tdrive/frontend/src/app/components/invitation/parts/reached-limit.tsx deleted file mode 100644 index e3a2a688..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/reached-limit.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import Text from 'app/atoms/text'; -import Languages from 'app/features/global/services/languages-service'; -import React from 'react'; - -export default (): React.ReactElement => { - return ( - - {Languages.t( - 'components.invitation.reached_limit.text', - [], - 'you reached the maximum number of users inside your company. Increase your subscription or add these users as guests.', - )} - - ); -}; diff --git a/tdrive/frontend/src/app/components/invitation/parts/workspace-link.tsx b/tdrive/frontend/src/app/components/invitation/parts/workspace-link.tsx deleted file mode 100644 index 6fa94f1d..00000000 --- a/tdrive/frontend/src/app/components/invitation/parts/workspace-link.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Button } from 'app/atoms/button/button'; -import React, { useState } from 'react'; -import { CopyIcon } from '@atoms/icons-agnostic'; -import { useInvitation } from 'app/features/invitation/hooks/use-invitation'; -import Languages from 'app/features/global/services/languages-service'; -import { Input } from 'app/atoms/input/input-text'; -import { InputDecorationIcon } from 'app/atoms/input/input-decoration-icon'; -import { LinkIcon } from '@heroicons/react/outline'; -import { copyToClipboard } from 'app/features/global/utils/CopyClipboard'; -import { ToasterService } from 'app/features/global/services/toaster-service'; - -export default (): React.ReactElement => { - const { generateInvitationLink } = useInvitation(); - const [loading, setLoading] = useState(false); - - const copyLink = async () => { - setLoading(true); - const link = await generateInvitationLink(); - - if (link) { - copyToClipboard(link); - ToasterService.success('Link copied to clipboard'); - } - setLoading(false); - }; - - return ( -
- ( - - )} - prefix={LinkIcon} - /> - -
- ); -}; diff --git a/tdrive/frontend/src/app/components/loader/application-loader.tsx b/tdrive/frontend/src/app/components/loader/application-loader.tsx index c5331542..f7472d2e 100644 --- a/tdrive/frontend/src/app/components/loader/application-loader.tsx +++ b/tdrive/frontend/src/app/components/loader/application-loader.tsx @@ -1,6 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-use-before-define import React from 'react'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; type PropsType = { message?: string; diff --git a/tdrive/frontend/src/app/components/locked-features-components/feature-toggles-hooks.tsx b/tdrive/frontend/src/app/components/locked-features-components/feature-toggles-hooks.tsx index 1dc531b5..d14827fd 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/feature-toggles-hooks.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/feature-toggles-hooks.tsx @@ -2,9 +2,9 @@ import { useEffect } from 'react'; import FeatureTogglesService, { FeatureNames, -} from 'app/features/global/services/feature-toggles-service'; +} from '@features/global/services/feature-toggles-service'; import { FeatureToggles, Feature, withFeatures } from '@paralleldrive/react-feature-toggles'; -import { useCurrentCompany } from 'app/features/companies/hooks/use-companies'; +import { useCurrentCompany } from '@features/companies/hooks/use-companies'; export const useFeatureToggles = () => { const { activeFeatureNames } = FeatureTogglesService; diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-drive-popup/locked-drive-popup.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-drive-popup/locked-drive-popup.tsx index 2c318485..6fe813b0 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-drive-popup/locked-drive-popup.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-drive-popup/locked-drive-popup.tsx @@ -1,74 +1,72 @@ import React from 'react'; -import ObjectModal from 'app/components/object-modal/object-modal'; +import ObjectModal from '@components/object-modal/object-modal'; import { Button, Row, Typography } from 'antd'; -import ModalManager from 'app/components/modal/modal-manager'; -import Languages from 'app/features/global/services/languages-service'; -import consoleService from 'app/features/console/services/console-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; +import ModalManager from '@components/modal/modal-manager'; +import Languages from '@features/global/services/languages-service'; +import consoleService from '@features/console/services/console-service'; +import useRouterCompany from '@features/router/hooks/use-router-company'; const { Title, Text } = Typography; export default () => { const companyId = useRouterCompany(); return ( - - - - {Languages.t('components.locked_features.locked_guests_popup.or')} - - -
- } - hideFooterDivider - footerAlign="center" - footerStyle={{ marginBottom: 16 }} - > - - - </Row> + <Button + type="primary" + size="large" + style={{ marginTop: 8 }} + onClick={() => + window.open(consoleService.getCompanySubscriptionUrl(companyId), 'blank') + } + > + {Languages.t('components.locked_features.locked_guests_popup.learn_more_button')} + </Button> + <Text style={{ margin: '16px 0 ' }} strong> + {Languages.t('components.locked_features.locked_guests_popup.or')} + </Text> + <Button + type="ghost" + style={{ height: 36, width: 163 }} + onClick={() => ModalManager.closeAll()} + > + {Languages.t('components.locked_features.locked_guests_popup.skip_for_now_button')} + </Button> + </div> + } + hideFooterDivider + footerAlign="center" + footerStyle={{ marginBottom: 16 }} + > + <Row justify="center" align="middle" className="bottom-margin"> + <Title + level={3} + children={Languages.t('components.locked_features.locked_drive_popup.subtitle')} + style={{ + textAlign: 'center', + margin: 0, + }} + /> + </Row> - <Row justify="center"> - <Text - style={{ - textAlign: 'center', - width: '404px', - }} - children={Languages.t('components.locked_features.locked_only_office_popup.text')} - /> - </Row> - </ObjectModal> -)}; + <Row justify="center"> + <Text + style={{ + textAlign: 'center', + width: '404px', + }} + children={Languages.t('components.locked_features.locked_only_office_popup.text')} + /> + </Row> + </ObjectModal> + ); +}; diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-guests-popup/locked-guests-popup.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-guests-popup/locked-guests-popup.tsx index 6da2cb7d..6aff6a01 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-guests-popup/locked-guests-popup.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-guests-popup/locked-guests-popup.tsx @@ -1,9 +1,9 @@ import { Button, Row, Typography } from 'antd'; -import ObjectModal from 'app/components/object-modal/object-modal'; +import ObjectModal from '@components/object-modal/object-modal'; import React from 'react'; -import ModalManager from 'app/components/modal/modal-manager'; -import Languages from 'app/features/global/services/languages-service'; -import Emojione from 'app/components/emojione/emojione'; +import ModalManager from '@components/modal/modal-manager'; +import Languages from '@features/global/services/languages-service'; +import Emojione from '@components/emojione/emojione'; type PropsType = { companySubscriptionUrl: string; diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-history-banner/locked-history-banner.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-history-banner/locked-history-banner.tsx index 545dca6b..bfcc8cbc 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-history-banner/locked-history-banner.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-history-banner/locked-history-banner.tsx @@ -1,22 +1,18 @@ import React from 'react'; import { Typography, Button } from 'antd'; -import Banner from 'app/components/banner/banner'; -import Emojione from 'app/components/emojione/emojione'; -import Languages from 'app/features/global/services/languages-service'; +import Banner from '@components/banner/banner'; +import Emojione from '@components/emojione/emojione'; +import Languages from '@features/global/services/languages-service'; import './locked-history-banner.scss'; -import consoleService from 'app/features/console/services/console-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; +import consoleService from '@features/console/services/console-service'; +import useRouterCompany from '@features/router/hooks/use-router-company'; const { Title, Text } = Typography; const LockedHistoryBanner = (): JSX.Element => { - const companyId = useRouterCompany(); const onClickBtn = () => - window.open( - consoleService.getCompanySubscriptionUrl(companyId), - 'blank', - ); + window.open(consoleService.getCompanySubscriptionUrl(companyId), 'blank'); return ( <Banner diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-invite-alert/index.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-invite-alert/index.tsx index 28a36216..65d7b541 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-invite-alert/index.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-invite-alert/index.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { Typography, Alert } from 'antd'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import { AlertTriangle } from 'react-feather'; -import { CompanyLimitsEnum, CompanyType } from 'app/features/companies/types/company'; -import consoleService from 'app/features/console/services/console-service'; +import { CompanyLimitsEnum, CompanyType } from '@features/companies/types/company'; +import consoleService from '@features/console/services/console-service'; type PropsType = { company: Partial<CompanyType>; magicLink?: boolean }; @@ -11,10 +11,7 @@ const { Text, Link } = Typography; const LockedInviteAlert = (props: PropsType): JSX.Element => { const limit = props?.company?.plan?.limits?.[CompanyLimitsEnum.COMPANY_MEMBERS_LIMIT] || 0; const onClickBtn = () => - window.open( - consoleService.getCompanySubscriptionUrl(props.company.id || ""), - 'blank', - ); + window.open(consoleService.getCompanySubscriptionUrl(props.company.id || ''), 'blank'); return ( <Alert diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-only-office-popup/locked-only-office-popup.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-only-office-popup/locked-only-office-popup.tsx index c1f25d67..96b12694 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-only-office-popup/locked-only-office-popup.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-only-office-popup/locked-only-office-popup.tsx @@ -1,75 +1,73 @@ import React from 'react'; -import ObjectModal from 'app/components/object-modal/object-modal'; +import ObjectModal from '@components/object-modal/object-modal'; import { Button, Row, Typography } from 'antd'; -import ModalManager from 'app/components/modal/modal-manager'; -import Languages from 'app/features/global/services/languages-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import consoleService from 'app/features/console/services/console-service'; +import ModalManager from '@components/modal/modal-manager'; +import Languages from '@features/global/services/languages-service'; +import useRouterCompany from '@features/router/hooks/use-router-company'; +import consoleService from '@features/console/services/console-service'; const { Title, Text } = Typography; export default () => { const companyId = useRouterCompany(); return ( - <ObjectModal - titleCenter - titleLevel={2} - title={Languages.t('components.locked_features.locked_only_office_popup.title')} - titleTypographyStyle={{ textAlign: 'center', marginBottom: 32 }} - style={{ padding: 32 }} - contentStyle={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }} - footer={ - <div - style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: 32 }} - > - <Button - type="primary" - size="large" - style={{ marginTop: 8 }} - onClick={() => - window.open( - consoleService.getCompanySubscriptionUrl(companyId), - 'blank', - ) - } + <ObjectModal + titleCenter + titleLevel={2} + title={Languages.t('components.locked_features.locked_only_office_popup.title')} + titleTypographyStyle={{ textAlign: 'center', marginBottom: 32 }} + style={{ padding: 32 }} + contentStyle={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }} + footer={ + <div + style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: 32 }} > - {Languages.t('components.locked_features.locked_guests_popup.learn_more_button')} - </Button> - <Text style={{ margin: '16px 0 ' }} strong> - {Languages.t('components.locked_features.locked_guests_popup.or')} - </Text> - <Button - type="ghost" - style={{ height: 36, width: 163 }} - onClick={() => ModalManager.closeAll()} - > - {Languages.t('components.locked_features.locked_guests_popup.skip_for_now_button')} - </Button> - </div> - } - hideFooterDivider - footerAlign="center" - footerStyle={{ marginBottom: 16 }} - > - <Row justify="center" align="middle" className="bottom-margin"> - <Title - level={3} - children={Languages.t('components.locked_features.locked_only_office_popup.subtitle')} - style={{ - textAlign: 'center', - margin: 0, - height: 54, - }} - /> - </Row> + <Button + type="primary" + size="large" + style={{ marginTop: 8 }} + onClick={() => + window.open(consoleService.getCompanySubscriptionUrl(companyId), 'blank') + } + > + {Languages.t('components.locked_features.locked_guests_popup.learn_more_button')} + </Button> + <Text style={{ margin: '16px 0 ' }} strong> + {Languages.t('components.locked_features.locked_guests_popup.or')} + </Text> + <Button + type="ghost" + style={{ height: 36, width: 163 }} + onClick={() => ModalManager.closeAll()} + > + {Languages.t('components.locked_features.locked_guests_popup.skip_for_now_button')} + </Button> + </div> + } + hideFooterDivider + footerAlign="center" + footerStyle={{ marginBottom: 16 }} + > + <Row justify="center" align="middle" className="bottom-margin"> + <Title + level={3} + children={Languages.t('components.locked_features.locked_only_office_popup.subtitle')} + style={{ + textAlign: 'center', + margin: 0, + height: 54, + }} + /> + </Row> - <Row justify="center"> - <Text - style={{ - textAlign: 'center', - width: '404px', - }} - children={Languages.t('components.locked_features.locked_only_office_popup.text')} - /> - </Row> - </ObjectModal> -)}; + <Row justify="center"> + <Text + style={{ + textAlign: 'center', + width: '404px', + }} + children={Languages.t('components.locked_features.locked_only_office_popup.text')} + /> + </Row> + </ObjectModal> + ); +}; diff --git a/tdrive/frontend/src/app/components/locked-features-components/locked-workspace-popup/locked-workspace-popup.tsx b/tdrive/frontend/src/app/components/locked-features-components/locked-workspace-popup/locked-workspace-popup.tsx index e78882de..50cb1e90 100644 --- a/tdrive/frontend/src/app/components/locked-features-components/locked-workspace-popup/locked-workspace-popup.tsx +++ b/tdrive/frontend/src/app/components/locked-features-components/locked-workspace-popup/locked-workspace-popup.tsx @@ -1,74 +1,72 @@ import React from 'react'; -import ObjectModal from 'app/components/object-modal/object-modal'; +import ObjectModal from '@components/object-modal/object-modal'; import { Button, Row, Typography } from 'antd'; -import ModalManager from 'app/components/modal/modal-manager'; -import Languages from 'app/features/global/services/languages-service'; -import consoleService from 'app/features/console/services/console-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; +import ModalManager from '@components/modal/modal-manager'; +import Languages from '@features/global/services/languages-service'; +import consoleService from '@features/console/services/console-service'; +import useRouterCompany from '@features/router/hooks/use-router-company'; const { Title, Text } = Typography; export default () => { const companyId = useRouterCompany(); return ( - <ObjectModal - titleCenter - titleLevel={2} - title={Languages.t('components.locked_features.locked_workspace_popup.title')} - titleTypographyStyle={{ textAlign: 'center', marginBottom: 32 }} - style={{ padding: 32 }} - contentStyle={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }} - footer={ - <div - style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: 32 }} - > - <Button - type="primary" - size="large" - style={{ marginTop: 8 }} - onClick={() => - window.open( - consoleService.getCompanySubscriptionUrl(companyId), - 'blank', - ) - } + <ObjectModal + titleCenter + titleLevel={2} + title={Languages.t('components.locked_features.locked_workspace_popup.title')} + titleTypographyStyle={{ textAlign: 'center', marginBottom: 32 }} + style={{ padding: 32 }} + contentStyle={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }} + footer={ + <div + style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: 32 }} > - {Languages.t('components.locked_features.locked_guests_popup.learn_more_button')} - </Button> - <Text style={{ margin: '16px 0 ' }} strong> - {Languages.t('components.locked_features.locked_guests_popup.or')} - </Text> - <Button - type="ghost" - style={{ height: 36, width: 163 }} - onClick={() => ModalManager.closeAll()} - > - {Languages.t('components.locked_features.locked_guests_popup.skip_for_now_button')} - </Button> - </div> - } - hideFooterDivider - footerAlign="center" - footerStyle={{ marginBottom: 16 }} - > - <Row justify="center" align="middle" className="bottom-margin"> - <Title - level={3} - children={Languages.t('components.locked_features.locked_workspace_popup.subtitle')} - style={{ - textAlign: 'center', - margin: 0, - }} - /> - </Row> + <Button + type="primary" + size="large" + style={{ marginTop: 8 }} + onClick={() => + window.open(consoleService.getCompanySubscriptionUrl(companyId), 'blank') + } + > + {Languages.t('components.locked_features.locked_guests_popup.learn_more_button')} + </Button> + <Text style={{ margin: '16px 0 ' }} strong> + {Languages.t('components.locked_features.locked_guests_popup.or')} + </Text> + <Button + type="ghost" + style={{ height: 36, width: 163 }} + onClick={() => ModalManager.closeAll()} + > + {Languages.t('components.locked_features.locked_guests_popup.skip_for_now_button')} + </Button> + </div> + } + hideFooterDivider + footerAlign="center" + footerStyle={{ marginBottom: 16 }} + > + <Row justify="center" align="middle" className="bottom-margin"> + <Title + level={3} + children={Languages.t('components.locked_features.locked_workspace_popup.subtitle')} + style={{ + textAlign: 'center', + margin: 0, + }} + /> + </Row> - <Row justify="center"> - <Text - style={{ - textAlign: 'center', - width: '404px', - }} - children={Languages.t('components.locked_features.locked_workspace_popup.text')} - /> - </Row> - </ObjectModal> -)}; + <Row justify="center"> + <Text + style={{ + textAlign: 'center', + width: '404px', + }} + children={Languages.t('components.locked_features.locked_workspace_popup.text')} + /> + </Row> + </ObjectModal> + ); +}; diff --git a/tdrive/frontend/src/app/components/main-plus/main-plus.jsx b/tdrive/frontend/src/app/components/main-plus/main-plus.jsx deleted file mode 100755 index 311ec5ee..00000000 --- a/tdrive/frontend/src/app/components/main-plus/main-plus.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { Component } from 'react'; -import Icon from 'app/components/icon/icon.jsx'; -import Menu from 'components/menus/menu.jsx'; -import './main-plus.scss'; - -export default class MainPlus extends Component { - constructor(props) { - super(props); - } - render() { - if (this.props.onClick) { - return ( - <div className="main_plus_button" onClick={this.props.onClick}> - <Icon type="plus" className="m-icon-small" /> - </div> - ); - } - return ( - <Menu menu={this.props.menu} className="main_plus_button" position={'top'}> - <Icon type="plus" className="m-icon-small" /> - </Menu> - ); - } -} diff --git a/tdrive/frontend/src/app/components/main-plus/main-plus.scss b/tdrive/frontend/src/app/components/main-plus/main-plus.scss deleted file mode 100755 index e69de29b..00000000 diff --git a/tdrive/frontend/src/app/components/member/user-parts.tsx b/tdrive/frontend/src/app/components/member/user-parts.tsx index 1d26108d..f5f395c2 100644 --- a/tdrive/frontend/src/app/components/member/user-parts.tsx +++ b/tdrive/frontend/src/app/components/member/user-parts.tsx @@ -2,13 +2,13 @@ import React from 'react'; import { Avatar, Badge, Tag } from 'antd'; import { DashOutlined } from '@ant-design/icons'; import { User } from 'react-feather'; -import Languages from 'app/features/global/services/languages-service'; -import RouterServices from 'app/features/router/services/router-service'; -import { UserType } from 'app/features/users/types/user'; -import UserService from 'app/features/users/services/current-user-service'; -import UsersService from 'app/features/users/services/current-user-service'; +import Languages from '@features/global/services/languages-service'; +import RouterServices from '@features/router/services/router-service'; +import { UserType } from '@features/users/types/user'; +import UserService from '@features/users/services/current-user-service'; +import UsersService from '@features/users/services/current-user-service'; import UserIcon from 'components/user/user'; -import { getUser } from 'app/features/users/hooks/use-user-list'; +import { getUser } from '@features/users/hooks/use-user-list'; export type UserPartsType = { avatar: JSX.Element; diff --git a/tdrive/frontend/src/app/components/menus/menu-component.jsx b/tdrive/frontend/src/app/components/menus/menu-component.jsx index 2433a2f2..c7197bc2 100755 --- a/tdrive/frontend/src/app/components/menus/menu-component.jsx +++ b/tdrive/frontend/src/app/components/menus/menu-component.jsx @@ -1,8 +1,8 @@ import React, { Component } from 'react'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import Emojione from 'components/emojione/emojione'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; import './menu.scss'; /* diff --git a/tdrive/frontend/src/app/components/menus/menu.jsx b/tdrive/frontend/src/app/components/menus/menu.jsx index 7ec8fc63..a7c5de0e 100755 --- a/tdrive/frontend/src/app/components/menus/menu.jsx +++ b/tdrive/frontend/src/app/components/menus/menu.jsx @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; /* One menu diff --git a/tdrive/frontend/src/app/components/menus/menus-body-layer.jsx b/tdrive/frontend/src/app/components/menus/menus-body-layer.jsx index 79455183..0f998ecc 100755 --- a/tdrive/frontend/src/app/components/menus/menus-body-layer.jsx +++ b/tdrive/frontend/src/app/components/menus/menus-body-layer.jsx @@ -1,7 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; import MenuComponent from './menu-component.jsx'; import OutsideClickHandler from 'react-outside-click-handler'; diff --git a/tdrive/frontend/src/app/components/menus/menus-manager.jsx b/tdrive/frontend/src/app/components/menus/menus-manager.jsx index d5c4d655..c2670851 100755 --- a/tdrive/frontend/src/app/components/menus/menus-manager.jsx +++ b/tdrive/frontend/src/app/components/menus/menus-manager.jsx @@ -1,6 +1,6 @@ -import Observable from 'app/deprecated/CollectionsV1/observable.js'; -import Number from 'app/features/global/utils/Numbers'; -import Globals from 'app/features/global/services/globals-tdrive-app-service'; +import Observable from '@deprecated/CollectionsV1/observable.js'; +import Number from '@features/global/utils/Numbers'; +import Globals from '@features/global/services/globals-tdrive-app-service'; /** * Menus manager service, choose where to generate menu diff --git a/tdrive/frontend/src/app/components/message-seen-by/message-seen-by.tsx b/tdrive/frontend/src/app/components/message-seen-by/message-seen-by.tsx deleted file mode 100644 index 11099696..00000000 --- a/tdrive/frontend/src/app/components/message-seen-by/message-seen-by.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import UserBlock from 'app/molecules/grouped-rows/user'; -import { Modal, ModalContent } from 'app/atoms/modal'; -import messageApiClient from 'app/features/messages/api/message-api-client'; -import { UserType } from 'app/features/users/types/user'; -import React, { useEffect, useState } from 'react'; -import Avatar from 'app/atoms/avatar'; -import { useMessageSeenBy } from 'app/features/messages/hooks/use-message-seen-by'; -import Loader from '../loader/loader'; -import Languages from 'app/features/global/services/languages-service'; -import { Base } from 'app/atoms/text'; - -export default (): React.ReactElement => { - const { isOpen, closeSeenBy, seenMessage } = useMessageSeenBy(); - const [users, setUsers] = useState<UserType[]>(); - const [loading, setLoading] = useState(true); - - useEffect(() => { - if (isOpen && seenMessage) { - const { company_id, message_id, thread_id, workspace_id } = seenMessage; - - setLoading(true); - messageApiClient.seenBy(message_id, thread_id, company_id, workspace_id).then(users => { - setLoading(false); - setUsers(users); - }); - } - }, [open, seenMessage]); - - return ( - <Modal open={isOpen} onClose={() => closeSeenBy()} className="sm:w-[60vw] sm:max-w-2xl"> - <ModalContent - textCenter - title={Languages.t('components.message_seen_by.title', [], "Users who've seen the message")} - > - {loading ? ( - <div className="flex h-full justify-center items-center px-2"> - <Loader className="h-8 w-8 m-auto" /> - </div> - ) : ( - <div className="flex"> - <div className="w-[60vw] rounded-sm px-2 m-2"> - {users && users.length ? ( - users.map(user => ( - <UserBlock - avatar={ - <Avatar title={user.full_name ?? user.username} avatar={user.thumbnail} /> - } - title={user.full_name ?? user.username} - subtitle={user.email} - key={user.id} - /> - )) - ) : ( - <Base className='pt-4'> - {Languages.t( - 'components.message_seen_by.none_seen_it', - [], - 'No one has seen the message yet', - )} - </Base> - )} - </div> - </div> - )} - </ModalContent> - </Modal> - ); -}; diff --git a/tdrive/frontend/src/app/components/mobile-redirect/index.tsx b/tdrive/frontend/src/app/components/mobile-redirect/index.tsx index 948177c7..c9ba0f9b 100644 --- a/tdrive/frontend/src/app/components/mobile-redirect/index.tsx +++ b/tdrive/frontend/src/app/components/mobile-redirect/index.tsx @@ -5,7 +5,7 @@ import { Smartphone, X } from 'react-feather'; import './style.scss'; import { Button } from 'antd'; import InitService from '../../features/global/services/init-service'; -import LocalStorage from 'app/features/global/framework/local-storage-service'; +import LocalStorage from '@features/global/framework/local-storage-service'; const environment = configuration; diff --git a/tdrive/frontend/src/app/components/modal/modal-component.tsx b/tdrive/frontend/src/app/components/modal/modal-component.tsx index af0bd85d..bc69bec4 100755 --- a/tdrive/frontend/src/app/components/modal/modal-component.tsx +++ b/tdrive/frontend/src/app/components/modal/modal-component.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useMemo } from 'react'; import { Modal } from 'antd'; import './modal-component.scss'; -import ModalManager from 'app/components/modal/modal-manager'; +import ModalManager from '@components/modal/modal-manager'; let component: any = null; export default () => { diff --git a/tdrive/frontend/src/app/components/modal/modal-manager.ts b/tdrive/frontend/src/app/components/modal/modal-manager.ts index 765044d3..06debf5a 100755 --- a/tdrive/frontend/src/app/components/modal/modal-manager.ts +++ b/tdrive/frontend/src/app/components/modal/modal-manager.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import Observable from 'app/deprecated/Observable/Observable'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import Observable from '@deprecated/Observable/Observable'; +import MenusManager from '@components/menus/menus-manager.jsx'; class ModalManagerService extends Observable { static service: ModalManagerService = new ModalManagerService(); diff --git a/tdrive/frontend/src/app/components/new-version/new-version-component.tsx b/tdrive/frontend/src/app/components/new-version/new-version-component.tsx index 9895d1b4..9a8455db 100644 --- a/tdrive/frontend/src/app/components/new-version/new-version-component.tsx +++ b/tdrive/frontend/src/app/components/new-version/new-version-component.tsx @@ -1,14 +1,14 @@ import React, { useMemo, useState } from 'react'; import { Col, Row, Typography } from 'antd'; -import Api from 'app/features/global/framework/api-service'; -import Banner from 'app/components/banner/banner'; -import Emojione from 'app/components/emojione/emojione'; -import Languages from 'app/features/global/services/languages-service'; -import Globals from 'app/features/global/services/globals-tdrive-app-service'; -import ModalManager from 'app/components/modal/modal-manager'; +import Api from '@features/global/framework/api-service'; +import Banner from '@components/banner/banner'; +import Emojione from '@components/emojione/emojione'; +import Languages from '@features/global/services/languages-service'; +import Globals from '@features/global/services/globals-tdrive-app-service'; +import ModalManager from '@components/modal/modal-manager'; import NewVersionModal from './new-version-modal'; -import { ServerInfoType } from 'app/features/global/services/init-service'; +import { ServerInfoType } from '@features/global/services/init-service'; let lastScrape = 0; diff --git a/tdrive/frontend/src/app/components/new-version/new-version-modal.tsx b/tdrive/frontend/src/app/components/new-version/new-version-modal.tsx index f4415f29..c6f89ac2 100644 --- a/tdrive/frontend/src/app/components/new-version/new-version-modal.tsx +++ b/tdrive/frontend/src/app/components/new-version/new-version-modal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import ObjectModal from '../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import Emojione from '../emojione/emojione'; import { Button } from 'antd'; diff --git a/tdrive/frontend/src/app/components/object-modal/deprecated-object-modal.jsx b/tdrive/frontend/src/app/components/object-modal/deprecated-object-modal.jsx index 86cf5075..5e517a47 100755 --- a/tdrive/frontend/src/app/components/object-modal/deprecated-object-modal.jsx +++ b/tdrive/frontend/src/app/components/object-modal/deprecated-object-modal.jsx @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import PerfectScrollbar from 'react-perfect-scrollbar'; import Tabs from 'components/tabs/tabs.jsx'; import './deprecated-object-modal.scss'; diff --git a/tdrive/frontend/src/app/components/object-modal/object-modal.tsx b/tdrive/frontend/src/app/components/object-modal/object-modal.tsx index 62238ec0..697b1e3c 100644 --- a/tdrive/frontend/src/app/components/object-modal/object-modal.tsx +++ b/tdrive/frontend/src/app/components/object-modal/object-modal.tsx @@ -4,8 +4,8 @@ import React, { FC } from 'react'; import classNames from 'classnames'; import { Divider, Layout, Typography, Col, Row } from 'antd'; -import ModalManager from 'app/components/modal/modal-manager'; -import Icon from 'app/components/icon/icon.jsx'; +import ModalManager from '@components/modal/modal-manager'; +import Icon from '@components/icon/icon.jsx'; import './object-modal.scss'; diff --git a/tdrive/frontend/src/app/components/on-boarding/account-status-component.tsx b/tdrive/frontend/src/app/components/on-boarding/account-status-component.tsx deleted file mode 100644 index 674e5622..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/account-status-component.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; - -import Banner from 'app/components/banner/banner'; -import { Button, Typography } from 'antd'; -import Languages from 'app/features/global/services/languages-service'; -import ModalManager from 'app/components/modal/modal-manager'; -import UnverifiedAccount from './popups/unverified-account'; -import BlockedAccount from './popups/blocked-account'; -import InitService from 'app/features/global/services/init-service'; -import { useCurrentUser } from 'app/features/users/hooks/use-current-user'; - -const AccountStatusComponent = (): JSX.Element => { - const { user } = useCurrentUser(); - const maxUnverifiedDays = - InitService.server_infos?.configuration?.accounts?.remote?.max_unverified_days || 7; - const oneDay = 1000 * 60 * 60 * 24; - const periodLimit = (user?.created_at || 0) + maxUnverifiedDays * oneDay; - const daysLeft = Math.ceil((periodLimit - Date.now()) / oneDay); - - if (!user || InitService.server_infos?.configuration?.accounts?.type !== 'remote') { - return <></>; - } - - const showBlockedModal = () => { - if (InitService.server_infos?.configuration?.accounts?.type === 'remote') - return ModalManager.open( - <BlockedAccount email={user?.email} />, - { - position: 'center', - size: { width: '600px' }, - }, - false, - ); - }; - - const showUnverifiedModal = () => { - if (InitService.server_infos?.configuration?.accounts?.type === 'remote') - return ModalManager.open( - <UnverifiedAccount daysLeft={daysLeft} limit={maxUnverifiedDays} email={user.email} />, - { - position: 'center', - size: { width: '600px' }, - }, - ); - }; - - if (!user.is_verified && daysLeft <= 0) { - showBlockedModal(); - } - - const showBanner = !user.is_verified; - return ( - <> - {showBanner && ( - <Banner - type="important" - content={ - <div style={{ display: 'flex', alignItems: 'center' }}> - <Typography.Title level={5} style={{ marginBottom: 0, color: 'var(--white)' }}> - {Languages.t('components.account_verification_status_sentence', [ - Languages.t('components.account_verication_status_unverified'), - ])} - </Typography.Title> - <Button - style={{ marginLeft: 17, height: 32, color: 'var(--red)' }} - onClick={showUnverifiedModal} - > - {Languages.t('general.verify')} - </Button> - </div> - } - /> - )} - </> - ); -}; - -export default AccountStatusComponent; diff --git a/tdrive/frontend/src/app/components/on-boarding/company-billing-banner.tsx b/tdrive/frontend/src/app/components/on-boarding/company-billing-banner.tsx deleted file mode 100644 index 9f676d83..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/company-billing-banner.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import { Row, Typography } from 'antd'; -import Banner from '../banner/banner'; -import { CompanyType } from 'app/features/companies/types/company'; -import Groups from 'app/deprecated/workspaces/groups.js'; -import Languages from 'app/features/global/services/languages-service'; -import { AlertTriangle } from 'react-feather'; -import consoleService from 'app/features/console/services/console-service'; - -type PropsType = { - companyId: string; -}; - -const { Link } = Typography; -export default ({ companyId }: PropsType): JSX.Element => { - const companySubscriptionUrl = consoleService.getCompanySubscriptionUrl(companyId); - const userGroups: { [key: string]: CompanyType } = Groups.user_groups; - const currentUserGroup = userGroups[companyId]; - const isCurrentUserAdminOrOwner = - currentUserGroup?.role === 'admin' || currentUserGroup?.role === 'owner'; - - const onClickLink = () => window.open(companySubscriptionUrl, 'blank'); - - const shouldDisplayBanner = currentUserGroup?.plan?.billing?.status === 'warning'; - return shouldDisplayBanner ? ( - <Banner type="important"> - <Row align="middle"> - <AlertTriangle size={24} /> - <div className="small-x-margin"> - {Languages.t( - isCurrentUserAdminOrOwner - ? 'components.on_boarding.company_billing_banner.admin_or_owner_text' - : 'components.on_boarding.company_billing_banner.guest_or_member_text', - )} - </div> - {isCurrentUserAdminOrOwner && ( - <Link onClick={onClickLink}> - {Languages.t('components.on_boarding.company_billing_banner.link')} - </Link> - )} - </Row> - </Banner> - ) : ( - <></> - ); -}; diff --git a/tdrive/frontend/src/app/components/on-boarding/company-status-component.tsx b/tdrive/frontend/src/app/components/on-boarding/company-status-component.tsx deleted file mode 100644 index 2d6eb2f0..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/company-status-component.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useEffect } from 'react'; -import ModalManager from 'app/components/modal/modal-manager'; -import UserService from 'app/features/users/services/current-user-service'; -import WelcomeOnTdrive from './popups/welcome-on-tdrive'; -import DepreciatedCollections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import InitService from 'app/features/global/services/init-service'; -import Groups from 'app/deprecated/workspaces/groups.js'; -import { CompanyType } from 'app/features/companies/types/company'; -import BlockedCompany from './popups/blocked-company'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; - -const CompanyStatusComponent = (): JSX.Element => { - const companyId = useRouterCompany(); - const workspaceId = useRouterWorkspace(); - const user = UserService.getCurrentUser(); - const onboarding: string | null = localStorage.getItem(`onboarding_${companyId}`); - const workspace = DepreciatedCollections.get('workspaces').find(workspaceId); - - useEffect(() => { - if (InitService.server_infos?.configuration?.accounts?.type === 'remote') { - isNewAccount(); - } - - isBlockedCompany(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [companyId]); - - const isNewCompany = (): boolean => { - const oneDay = 1000 * 60 * 60 * 24; - const createdDay = workspace?.group?.stats?.created_at; - const currentDay = Date.now(); - const currentPeriod = Math.round(Math.round(currentDay - createdDay) / oneDay); - - return currentPeriod <= 7 ? true : false; - }; - - const isNewAccount = () => { - if (!workspace?.id) return; - - const isNewUser: boolean = - onboarding !== 'completed' && - workspace?.group?.stats?.total_members <= 1 && - isNewCompany() && - !user?.is_verified; - - if (isNewUser) { - localStorage.setItem(`onboarding_${companyId}`, 'completed'); - return ModalManager.open(<WelcomeOnTdrive email={user.email} />, { - position: 'center', - size: { width: '600px' }, - }); - } - }; - - const isBlockedCompany = () => { - if (!companyId) return; - const userGroups: { [key: string]: CompanyType } = Groups.user_groups; - const currentGroup = userGroups[companyId]; - - if (currentGroup?.plan?.billing?.status === 'error') { - return ModalManager.open( - <BlockedCompany />, - { - position: 'center', - size: { width: '600px' }, - }, - false, - ); - } - }; - - return <></>; -}; - -export default CompanyStatusComponent; diff --git a/tdrive/frontend/src/app/components/on-boarding/popups/add-mails-in-workspace.tsx b/tdrive/frontend/src/app/components/on-boarding/popups/add-mails-in-workspace.tsx deleted file mode 100644 index 9a7dbff7..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/popups/add-mails-in-workspace.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React, { useState } from 'react'; -import { Button, Col, Row, Typography } from 'antd'; -import AutoHeight from '../../auto-height/auto-height'; -import ObjectModal from '../../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; -import ModalManager from 'app/components/modal/modal-manager'; -import ConsoleService from 'app/features/console/services/console-service'; -import RouterServices from 'app/features/router/services/router-service'; -import WorkspacesUsers from 'app/features/workspace-members/services/workspace-members-service'; - -export default (): JSX.Element => { - const { companyId, workspaceId } = RouterServices.getStateFromRoute(); - const [emails, _setEmails] = useState<string[]>([]); - const [loading, setLoading] = useState<boolean>(false); - - const setEmails = (str: string) => - _setEmails(WorkspacesUsers.fullStringToEmails(str) as string[]); - - const onChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => setEmails(e.target.value); - - const onClickButton = async () => { - setLoading(true); - - return await ConsoleService.addMailsInWorkspace({ - workspace_id: workspaceId || '', - company_id: companyId || '', - emails, - }).finally(() => { - setLoading(false); - return ModalManager.close(); - }); - }; - - return ( - <ObjectModal - title={Languages.t('components.add_mails_workspace.title_1')} - closable - style={{ height: 600 }} - titleLevel={2} - titleCenter - hideFooterDivider - footerAlign="center" - footer={ - <Row className="x-margin" justify="center"> - <Button onClick={onClickButton} type="primary" size="large" loading={loading}> - {Languages.t('components.add_mails_workspace.button')} - </Button> - </Row> - } - > - <Row - className="x-margin" - style={{ padding: '0 16px', marginTop: 16, marginBottom: 62 }} - justify="center" - > - <Typography.Text - style={{ textAlign: 'center', width: '464px', fontSize: 17, height: '44px' }} - > - {Languages.t('components.add_mails_workspace.title_2')} - </Typography.Text> - </Row> - - <Row className="x-margin" style={{ marginBottom: 12, paddingTop: 32 }} justify="center"> - <Col style={{ width: 400 }}> - <AutoHeight - minHeight="110px" - maxHeight="300px" - onChange={onChange} - placeholder={Languages.t('components.add_mails_workspace.text_area_placeholder')} - /> - </Col> - </Row> - - <Row className="x-margin" style={{ display: 'flex', justifyContent: 'center' }}> - <Typography.Text type="secondary" style={{ width: 380, fontSize: 13, height: 32 }}> - {Languages.t('scenes.app.popup.adduser.adresses_message')} - </Typography.Text> - </Row> - </ObjectModal> - ); -}; diff --git a/tdrive/frontend/src/app/components/on-boarding/popups/blocked-account.tsx b/tdrive/frontend/src/app/components/on-boarding/popups/blocked-account.tsx deleted file mode 100644 index b40dca93..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/popups/blocked-account.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* eslint-disable jsx-a11y/anchor-is-valid */ -import React, { useState } from 'react'; -import { Button, Row, Typography } from 'antd'; -import ObjectModal from '../../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; -import ConsoleService from 'app/features/console/services/console-service'; -import LoginService from 'app/features/auth/login-service'; - -type PropsType = { - email: string; -}; - -export default ({ email }: PropsType): JSX.Element => { - const [loading, setLoading] = useState<boolean>(false); - - const onClickButton = () => { - setLoading(true); - return ConsoleService.verifyMail().finally(() => setLoading(false)); - }; - - return ( - <ObjectModal - title={Languages.t('components.account_verification_status_sentence', [ - Languages.t('components.account_verication_status_blocked'), - ])} - titleColor="var(--white)" - titleCenter - headerStyle={{ backgroundColor: 'var(--red)', color: 'var(--white)', height: 76 }} - hideFooterDivider - footerAlign="center" - footer={ - <> - <Button type="ghost" size="small" onClick={onClickButton} loading={loading}> - {Languages.t('general.re_send')} - </Button> - - <Row justify="center" style={{ marginTop: 16 }}> - <a className="blue_link" onClick={() => LoginService.logout()}> - {Languages.t('scenes.apps.account.account.logout')} - </a> - </Row> - </> - } - > - <Row justify="center" style={{ marginTop: 36 }}> - <Typography.Title - level={3} - style={{ - textAlign: 'center', - margin: 0, - width: 493, - }} - > - {Languages.t('components.blocked_account.trial_period_over')} - </Typography.Title> - </Row> - - <Row justify="center" style={{ marginTop: 24 }}> - <Typography.Text - style={{ - textAlign: 'center', - height: 22, - }} - > - {Languages.t('components.unverified_account.verification_details')} - </Typography.Text> - </Row> - - <Row justify="center" style={{ marginTop: 12 }}> - <Typography.Text - strong - style={{ - textAlign: 'center', - height: '22px', - }} - > - {email} - </Typography.Text> - </Row> - - <Row justify="center" style={{ marginTop: 32, marginBottom: 8 }}> - <Typography.Text - style={{ - textAlign: 'center', - fontSize: 15, - height: '22px', - }} - > - {Languages.t('components.unverified_account.re_send_email')} - </Typography.Text> - </Row> - </ObjectModal> - ); -}; diff --git a/tdrive/frontend/src/app/components/on-boarding/popups/blocked-company.tsx b/tdrive/frontend/src/app/components/on-boarding/popups/blocked-company.tsx deleted file mode 100644 index a3c1e653..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/popups/blocked-company.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import React from 'react'; -import { Button, Row, Typography, Select } from 'antd'; -import ObjectModal from '../../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; -import LoginService from 'app/features/auth/login-service'; -import { CompanyType } from 'app/features/companies/types/company'; -import { capitalize } from 'lodash'; -import ModalManager from 'app/components/modal/modal-manager'; -import UserService from 'app/features/users/services/current-user-service'; -import Groups from 'app/deprecated/workspaces/groups.js'; -import { AlertTriangle } from 'react-feather'; -import consoleService from 'app/features/console/services/console-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; - -type SwitchCompanyPropsType = { - placeholder?: string; - companiesIds: string[]; -}; - -const { Option } = Select; -const { Text, Title } = Typography; -const SwitchCompany = ({ placeholder, companiesIds }: SwitchCompanyPropsType): JSX.Element => { - const userGroups: { [key: string]: CompanyType } = Groups.user_groups; - const companies = companiesIds - .map(id => userGroups[id]) - .filter(company => company.plan?.billing?.status !== 'error'); - - const onSelect = (companyId: string) => { - Groups.select(userGroups[companyId]); - return ModalManager.close(); - }; - - const onClickBtn = () => LoginService.logout(); - - return ( - (!!companies.length && ( - <Select - placeholder={placeholder || 'Select a company'} - onSelect={onSelect} - style={{ width: 224 }} - > - {companies.map(company => ( - <Option key={company.id} value={company.id}> - {capitalize(company.name)} - </Option> - ))} - </Select> - )) || ( - <Button - type="primary" - style={{ height: 36, width: 163, backgroundColor: 'var(--red)' }} - onClick={onClickBtn} - > - {Languages.t('scenes.app.channelsbar.currentuser.logout')} - </Button> - ) - ); -}; - -export default (): JSX.Element => { - const companyId = useRouterCompany(); - const onClickButton = () => - window.open( - consoleService.getCompanySubscriptionUrl(companyId), - 'blank', - ); - - return ( - <ObjectModal - title={ - <div style={{ display: 'flex' }}> - <AlertTriangle size={24} /> - <span className="small-left-margin"> - {Languages.t('components.on_boarding.popups.blocked_company.title')} - </span> - </div> - } - titleColor="var(--white)" - titleCenter - headerStyle={{ backgroundColor: 'var(--red)', color: 'var(--white)', height: 76 }} - hideFooterDivider - footerAlign="center" - footerStyle={{ marginBottom: 24 }} - footer={ - <Row justify="space-between" align="middle"> - <div - style={{ - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - marginTop: 32, - }} - > - <Button type="ghost" size="large" onClick={onClickButton}> - {Languages.t( - 'components.on_boarding.popups.blocked_company.company_subscription_plan_button', - )} - </Button> - <Text style={{ margin: '8px 0 ' }} strong> - {Languages.t('components.on_boarding.popups.blocked_company.or')} - </Text> - <SwitchCompany - placeholder={Languages.t( - 'components.on_boarding.popups.blocked_company.company_selector', - )} - companiesIds={[...(UserService.getCurrentUser()?.groups_id || [])]} - /> - </div> - </Row> - } - > - <Row justify="center" style={{ marginTop: 36 }}> - <Title - level={3} - style={{ - textAlign: 'center', - margin: 0, - width: 493, - }} - > - {Languages.t('components.on_boarding.popups.blocked_company.description')} - - - - - - {Languages.t('components.on_boarding.popups.blocked_company.learn_more_text')} - - - - ); -}; diff --git a/tdrive/frontend/src/app/components/on-boarding/popups/unverified-account.tsx b/tdrive/frontend/src/app/components/on-boarding/popups/unverified-account.tsx deleted file mode 100644 index 2f7186ef..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/popups/unverified-account.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState } from 'react'; -import { Button, Row, Typography } from 'antd'; -import ObjectModal from '../../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; -import ConsoleService from 'app/features/console/services/console-service'; - -type PropsType = { - daysLeft: number; - limit: number; - email: string; -}; - -export default ({ daysLeft, email, limit }: PropsType): JSX.Element => { - const [loading, setLoading] = useState(false); - - const onClickButton = () => { - setLoading(true); - return ConsoleService.verifyMail().finally(() => setLoading(false)); - }; - - return ( - - {Languages.t('general.re_send')} - - } - > - - - {Languages.t('components.unverified_account.typography_text_danger', [daysLeft, limit])} - - - - - - {Languages.t('components.unverified_account.verification_details')} - - - - - - {email} - - - - - - {Languages.t('components.unverified_account.re_send_email')} - - - - ); -}; diff --git a/tdrive/frontend/src/app/components/on-boarding/popups/welcome-on-tdrive.tsx b/tdrive/frontend/src/app/components/on-boarding/popups/welcome-on-tdrive.tsx deleted file mode 100644 index 2413dff2..00000000 --- a/tdrive/frontend/src/app/components/on-boarding/popups/welcome-on-tdrive.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { Button, Row, Typography } from 'antd'; -import React, { useState } from 'react'; -import Emojione from '../../emojione/emojione'; -import ObjectModal from '../../object-modal/object-modal'; -import Languages from 'app/features/global/services/languages-service'; -import ModalManager from 'app/components/modal/modal-manager'; -import AddMailsInWorkspace from './add-mails-in-workspace'; -import ConsoleService from 'app/features/console/services/console-service'; - -type PropsType = { - email: string; -}; - -export default ({ email }: PropsType) => { - const [loading, setLoading] = useState(false); - const openAddMembers = () => - ModalManager.open(, { - position: 'center', - size: { width: '600px' }, - }); - - const onClickButton = () => { - setLoading(true); - return ConsoleService.verifyMail().finally(() => setLoading(false)); - }; - - return ( - - {Languages.t('components.verify_mail.title_1')} - -
- } - closable - style={{ height: 600 }} - titleLevel={2} - titleCenter - footerAlign="center" - hideFooterDivider - footer={ - - } - > - - - {Languages.t('components.verify_mail.title_2')} - - - - - {Languages.t('components.verify_mail.text')} - - - - - - {email} - - - - - - {Languages.t('components.verify_mail.paragraph')} - - - - - - {Languages.t('components.unverified_account.re_send_email')} - - - - - - - - ); -}; diff --git a/tdrive/frontend/src/app/components/online-user-status/online-user-status.tsx b/tdrive/frontend/src/app/components/online-user-status/online-user-status.tsx index 6447ffb0..1501813a 100644 --- a/tdrive/frontend/src/app/components/online-user-status/online-user-status.tsx +++ b/tdrive/frontend/src/app/components/online-user-status/online-user-status.tsx @@ -2,11 +2,11 @@ import React, { Suspense } from 'react'; import classNames from 'classnames'; -import { UserType } from 'app/features/users/types/user'; -import { useOnlineUser } from 'app/features/users/hooks/use-online-user'; +import { UserType } from '@features/users/types/user'; +import { useOnlineUser } from '@features/users/hooks/use-online-user'; import './online-user-status.scss'; -import { useUser } from 'app/features/users/hooks/use-user'; +import { useUser } from '@features/users/hooks/use-user'; type PropsType = { user: UserType; diff --git a/tdrive/frontend/src/app/components/open-desktop-popup/open-desktop-popup.tsx b/tdrive/frontend/src/app/components/open-desktop-popup/open-desktop-popup.tsx index a5a25f51..a697bc92 100644 --- a/tdrive/frontend/src/app/components/open-desktop-popup/open-desktop-popup.tsx +++ b/tdrive/frontend/src/app/components/open-desktop-popup/open-desktop-popup.tsx @@ -1,10 +1,10 @@ import React, { useState, useEffect } from 'react'; -import { Logo } from 'app/atoms/logo'; -import { Subtitle } from 'app/atoms/text'; -import A from 'app/atoms/link'; +import { Logo } from '@atoms/logo'; +import { Subtitle } from '@atoms/text'; +import A from '@atoms/link'; import { useRecoilState } from 'recoil'; -import { useWebState } from 'app/features/global/state/atoms/use-web'; -import Languages from 'app/features/global/services/languages-service'; +import { useWebState } from '@features/global/state/atoms/use-web'; +import Languages from '@features/global/services/languages-service'; export const OpenDesktopPopup = (): React.ReactElement => { const [showLink, setShowLink] = useState(true); diff --git a/tdrive/frontend/src/app/components/parameters/attribute.jsx b/tdrive/frontend/src/app/components/parameters/attribute.jsx index 3bbe597c..a928b0d8 100755 --- a/tdrive/frontend/src/app/components/parameters/attribute.jsx +++ b/tdrive/frontend/src/app/components/parameters/attribute.jsx @@ -1,9 +1,9 @@ import React, { Component } from 'react'; -import Number from 'app/features/global/utils/Numbers'; +import Number from '@features/global/utils/Numbers'; import AttributesManager from './attributes-manager.js'; import './parameters.scss'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; export default class Attribute extends React.Component { constructor(props) { diff --git a/tdrive/frontend/src/app/components/parameters/attributes-manager.js b/tdrive/frontend/src/app/components/parameters/attributes-manager.js index 76886190..5bea4d24 100755 --- a/tdrive/frontend/src/app/components/parameters/attributes-manager.js +++ b/tdrive/frontend/src/app/components/parameters/attributes-manager.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import Observable from 'app/deprecated/CollectionsV1/observable.js'; +import Observable from '@deprecated/CollectionsV1/observable.js'; /* Menus manager service, choose where to generate menu diff --git a/tdrive/frontend/src/app/components/picker/picker.jsx b/tdrive/frontend/src/app/components/picker/picker.jsx index fb89ab3a..a59175d9 100755 --- a/tdrive/frontend/src/app/components/picker/picker.jsx +++ b/tdrive/frontend/src/app/components/picker/picker.jsx @@ -1,8 +1,8 @@ /* eslint-disable react/jsx-key */ import React, { Component } from 'react'; import AutoComplete from 'components/auto-complete/auto-complete'; -import Icon from 'app/components/icon/icon.jsx'; -import Languages from 'app/features/global/services/languages-service'; +import Icon from '@components/icon/icon.jsx'; +import Languages from '@features/global/services/languages-service'; import './picker.scss'; export default class Picker extends React.Component { diff --git a/tdrive/frontend/src/app/components/popup-component/popup-component.jsx b/tdrive/frontend/src/app/components/popup-component/popup-component.jsx index 8e80b718..5862874f 100755 --- a/tdrive/frontend/src/app/components/popup-component/popup-component.jsx +++ b/tdrive/frontend/src/app/components/popup-component/popup-component.jsx @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import './popup-component.scss'; -import popupManager from 'app/deprecated/popupManager/popupManager.js'; +import popupManager from '@deprecated/popupManager/popupManager.js'; import CloseIcon from '@material-ui/icons/CloseOutlined'; export default class PopupComponent extends React.Component { diff --git a/tdrive/frontend/src/app/components/reminder-selector/reminder-selector.jsx b/tdrive/frontend/src/app/components/reminder-selector/reminder-selector.jsx index 414620b0..59d222e9 100755 --- a/tdrive/frontend/src/app/components/reminder-selector/reminder-selector.jsx +++ b/tdrive/frontend/src/app/components/reminder-selector/reminder-selector.jsx @@ -2,10 +2,10 @@ import React, { Component } from 'react'; import Button from 'components/buttons/button.jsx'; import Input from 'components/inputs/input.jsx'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import Select from 'components/select/select.jsx'; import './reminder-selector.scss'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; export default class ReminderSelector extends React.Component { constructor(props) { diff --git a/tdrive/frontend/src/app/components/rich-text-editor/editor-data-parser.ts b/tdrive/frontend/src/app/components/rich-text-editor/editor-data-parser.ts deleted file mode 100644 index 28cf3b7e..00000000 --- a/tdrive/frontend/src/app/components/rich-text-editor/editor-data-parser.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { ContentState, EditorState, convertToRaw, convertFromRaw } from 'draft-js'; -import { markdownToDraft, DraftToMarkdownOptions } from 'markdown-draft-js'; -import draftToMarkdown from './markdown/draft-to-markdown'; -import { EditorTextFormat } from './editor'; -import { EditorSuggestionPlugin } from './plugins'; -import { EntityItemsOptions } from './markdown/types'; - -export default class EditorDataParser { - private entityItems: EntityItemsOptions = {}; - private styleItems: DraftToMarkdownOptions['styleItems'] = {}; - - constructor(private plugins: EditorSuggestionPlugin[] = []) { - this.plugins.forEach(plugin => { - if (plugin.serializer) { - this.entityItems![plugin.resourceType] = { - open: (entity, block) => plugin.serializer?.open(entity, block) || '', - close: (entity, block) => plugin.serializer?.close(entity, block) || '', - }; - } - }); - - // adding custom support for underline since it is not natively available in markdown - this.styleItems!['UNDERLINE'] = { - open: () => '__', - close: () => '__', - }; - } - - toString(editorState: EditorState, format: EditorTextFormat): string { - const contentState = editorState.getCurrentContent(); - - switch (format) { - case 'markdown': { - let markdown = draftToMarkdown(convertToRaw(contentState), { - entityItems: this.entityItems, - styleItems: this.styleItems, - escapeMarkdownCharacters: false, - preserveNewlines: true, - // types definition are not up to date... - } as DraftToMarkdownOptions).trim(); - - // when empty the stateToMarkdown lib returns a zero-width-space character in first position - if (markdown.length === 1 && markdown.charCodeAt(0) === 8203) { - markdown = ''; - } - - return this.replaceElements(markdown); - } - - case 'raw': { - return JSON.stringify(convertToRaw(contentState)); - } - - default: { - throw new Error(`${format} format not supported`); - } - } - } - - fromString(markup: string, format: EditorTextFormat): ContentState { - switch (format) { - case 'markdown': { - return convertFromRaw(markdownToDraft(markup, { preserveNewlines: true })); - } - case 'raw': { - return convertFromRaw(JSON.parse(markup)); - } - default: { - throw new Error(`${format} format not supported`); - } - } - } - - private replaceElements(content: string): string { - this.plugins.forEach(plugin => { - if (plugin.serializer && plugin.serializer.replace) { - content = plugin.serializer.replace(content); - } - }); - return content; - } -} diff --git a/tdrive/frontend/src/app/components/rich-text-editor/editor-state-service.ts b/tdrive/frontend/src/app/components/rich-text-editor/editor-state-service.ts deleted file mode 100644 index 101748c4..00000000 --- a/tdrive/frontend/src/app/components/rich-text-editor/editor-state-service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { EditorState, CompositeDecorator, ContentState } from "draft-js"; -import EditorDataParser from "./editor-data-parser"; -import { getPlugins } from "./plugins"; - -class EditorStateService { - private states: Map; - - constructor() { - this.states = new Map(); - } - - /** - * Get editor state for given ID is already exists, else create a new one - * - * @param editorId - * @returns - */ - get(editorId: string, options?: { plugins?: Array, initialContent?: ContentState, clearIfExists?: boolean }): EditorState { - if (!editorId) { - throw new Error("Editor id is required"); - } - - let editor = this.states.get(editorId); - - if (editor && options?.clearIfExists) { - editor = this.clear(editorId).states.get(editorId); - } - - if (!editor) { - editor = this.createEditor(options?.plugins, options?.initialContent); - this.states.set(editorId, editor); - } - - return editor; - } - - set(editorId: string, editorState: EditorState): this { - this.states.set(editorId, editorState); - - return this; - } - - clear(editorId: string): this { - this.states.delete(editorId); - - return this; - } - - createEditor(plugins?: Array, initialContent?: ContentState): EditorState { - const editorPlugins = getPlugins(plugins); - const decorators = new CompositeDecorator(editorPlugins.map(p => p.decorator)); - - if (initialContent) { - return EditorState.createWithContent(initialContent, decorators); - } - - return EditorState.createEmpty(decorators); - } - - getDataParser(plugins?: Array): EditorDataParser { - return new EditorDataParser(getPlugins(plugins)); - } -} - -const instance = new EditorStateService(); - -export default instance; \ No newline at end of file diff --git a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar-config.ts b/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar-config.ts deleted file mode 100644 index a2e0bd6e..00000000 --- a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar-config.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ -export type StyleConfig = { - /** - * Draft.js style to apply - */ - style: string; - /** - * Label to display when i18n is not defined - */ - label: string; - /** - * i18n key - */ - i18n?: string; - className?: string; -}; - -export type StyleConfigList = Array; - -export type GroupName = 'INLINE_STYLE_BUTTONS' | 'BLOCK_ALIGNMENT_BUTTONS' | 'BLOCK_TYPE_BUTTONS' | 'LINK_BUTTONS' | 'BLOCK_TYPE_DROPDOWN' | 'HISTORY_BUTTONS' | 'IMAGE_BUTTON'; - -export type ToolbarConfig = { - display: Array; - extraProps?: Object; - INLINE_STYLE_BUTTONS: StyleConfigList; - BLOCK_ALIGNMENT_BUTTONS: StyleConfigList; - BLOCK_TYPE_DROPDOWN: StyleConfigList; - BLOCK_TYPE_BUTTONS: StyleConfigList; -}; - -export const INLINE_STYLE_BUTTONS: StyleConfigList = [ - { label: 'Bold', style: 'BOLD', i18n: 'components.richtexteditor.toolbar.bold' }, - { label: 'Underline', style: 'UNDERLINE', i18n: 'components.richtexteditor.toolbar.underline' }, - { label: 'Italic', style: 'ITALIC', i18n: 'components.richtexteditor.toolbar.italic' }, - { label: 'Strikethrough', style: 'STRIKETHROUGH', i18n: 'components.richtexteditor.toolbar.strikethrough' }, - { label: 'Code', style: 'CODE', i18n: 'components.richtexteditor.toolbar.code' }, -]; - -export const BLOCK_ALIGNMENT_BUTTONS: StyleConfigList = [ - {label: 'Align Left', style: 'ALIGN_LEFT'}, - {label: 'Align Center', style: 'ALIGN_CENTER'}, - {label: 'Align Right', style: 'ALIGN_RIGHT'}, - {label: 'Align Justify', style: 'ALIGN_JUSTIFY'}, -]; - -export const BLOCK_TYPE_DROPDOWN: StyleConfigList = [ - {label: 'Normal', style: 'unstyled'}, - {label: 'Heading Large', style: 'header-one'}, - {label: 'Heading Medium', style: 'header-two'}, - {label: 'Heading Small', style: 'header-three'}, - {label: 'Code Block', style: 'code-block'}, -]; -export const BLOCK_TYPE_BUTTONS: StyleConfigList = [ - {label: 'UL', style: 'unordered-list-item', i18n: 'components.richtexteditor.toolbar.unordered-list'}, - {label: 'OL', style: 'ordered-list-item', i18n: 'components.richtexteditor.toolbar.ordered-list'}, - {label: 'Blockquote', style: 'blockquote', i18n: 'components.richtexteditor.toolbar.blockquote'}, - {label: 'Code Block', style: 'code-block', i18n: 'components.richtexteditor.toolbar.code-block'}, -]; - -const EditorToolbarConfig: ToolbarConfig = { - //display: ['INLINE_STYLE_BUTTONS', 'BLOCK_ALIGNMENT_BUTTONS', 'BLOCK_TYPE_BUTTONS', 'LINK_BUTTONS', 'IMAGE_BUTTON', 'BLOCK_TYPE_DROPDOWN', 'HISTORY_BUTTONS'], - display: ['INLINE_STYLE_BUTTONS', 'BLOCK_TYPE_BUTTONS'], - INLINE_STYLE_BUTTONS, - BLOCK_ALIGNMENT_BUTTONS, - BLOCK_TYPE_DROPDOWN, - BLOCK_TYPE_BUTTONS, -}; - -export default EditorToolbarConfig; \ No newline at end of file diff --git a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.scss b/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.scss deleted file mode 100644 index d58d705f..00000000 --- a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.scss +++ /dev/null @@ -1,30 +0,0 @@ -.editor-toolbar { - display: flex; - flex-direction: row; - padding-left: 5px; - margin-right: -4px; - - .button-group:first-child { - padding-left: 0; - border-left: none; - } - - .inline, - .block { - color: var(--grey-dark); - - &.active { - color: var(--black); - background: var(--primary-background); - } - } - - .button-group { - border-left: 1px solid var(--grey-light); - padding-left: 4px; - padding-right: 4px; - - display: flex; - align-items: center; - } -} diff --git a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.tsx b/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.tsx deleted file mode 100644 index a91c0bf7..00000000 --- a/tdrive/frontend/src/app/components/rich-text-editor/editor-toolbar.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import React, { ReactNode } from 'react'; -import classNames from 'classnames'; -import { EditorState, RichUtils } from 'draft-js'; -import { Bold, Underline, Italic, Code } from 'react-feather'; -import { Button, Tooltip } from 'antd'; -import { - StrikethroughOutlined, - OrderedListOutlined, - UnorderedListOutlined, - MenuUnfoldOutlined, - CodeOutlined, -} from '@ant-design/icons'; -import Languages from 'app/features/global/services/languages-service'; -import DefaultToolbarConfig, { - GroupName, - StyleConfig, - ToolbarConfig, -} from './editor-toolbar-config'; -import './editor-toolbar.scss'; - -// Todo: Check this https://github.com/sstur/react-rte/blob/master/src/lib/EditorToolbar.js -// https://dev.to/rose/rich-text-editing-on-the-web-formatting-text-and-keyboard-shortcuts-in-draft-js-4g9f - -type ChangeHandler = (state: EditorState) => unknown; - -type EditorToolbarProps = { - toobarConfig?: ToolbarConfig; - editorState: EditorState; - onChange: ChangeHandler; - buttonSize?: number; -}; - -export default (props: EditorToolbarProps) => { - const toolbarConfig = props.toobarConfig || DefaultToolbarConfig; - const buttonSize = props.buttonSize || 16; - const buttonGroups = toolbarConfig.display.map(groupName => { - switch (groupName) { - case 'INLINE_STYLE_BUTTONS': { - return _renderInlineStyleButtons(groupName, toolbarConfig); - } - case 'BLOCK_TYPE_BUTTONS': { - return _renderBlockTypeButtons(groupName, toolbarConfig); - } - default: - return null; - } - }); - - return
{buttonGroups}
; - - function _renderBlockTypeButtons(groupName: GroupName, config: ToolbarConfig) { - const { editorState } = props; - const selection = editorState.getSelection(); - const blockType = editorState - .getCurrentContent() - .getBlockForKey(selection.getStartKey()) - .getType(); - const buttons = (config.BLOCK_TYPE_BUTTONS || []).map((type, index) => ( - - -
- - {Languages.t( - 'scenes.client.channelsbar.modals.workspace_channel_list.workspace_channel_row.tag', - )} - - - )} - {!!channel.user_member && (notifications?.badges?.length || 0) > 0 && ( - <> - - {notifications.badges.length} - - - )} -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/channel-result.tsx b/tdrive/frontend/src/app/components/search-popup/parts/channel-result.tsx deleted file mode 100755 index b38c8719..00000000 --- a/tdrive/frontend/src/app/components/search-popup/parts/channel-result.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { ChannelType } from 'app/features/channels/types/channel'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; -import ChannelAvatar from 'app/components/search-popup/parts/channel-avatar/channel-avatar'; -import { openChannel } from '../common'; -import { useChannelNotifications } from 'app/features/users/hooks/use-notifications'; -import { useChannel } from 'app/features/channels/hooks/use-channel'; -import { Badge } from 'app/atoms/badge'; - -type PropsType = { - channel: ChannelType; -}; - -export default ({ channel: _channel }: PropsType): JSX.Element => { - const channel = - (_channel.visibility !== 'direct' - ? useChannel(_channel.id || '', { - companyId: _channel.company_id || '', - workspaceId: _channel.workspace_id || '', - })?.channel - : undefined) || _channel; - const currentWorkspaceId = useRouterWorkspace(); - const { setOpen } = useSearchModal(); - - const notifications = useChannelNotifications(channel.id || ''); - - return ( -
{ - openChannel(channel, currentWorkspaceId); - setOpen(false); - }} - > - - {!!channel.user_member && !!notifications?.badges?.length && ( - <> - - {notifications.badges.length} - - - )} -
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/drive-item-result.tsx b/tdrive/frontend/src/app/components/search-popup/parts/drive-item-result.tsx index 86c680eb..4add9b1f 100644 --- a/tdrive/frontend/src/app/components/search-popup/parts/drive-item-result.tsx +++ b/tdrive/frontend/src/app/components/search-popup/parts/drive-item-result.tsx @@ -1,8 +1,11 @@ -import * as Text from '@atoms/text'; -import FileUploadAPIClient from '@features/files/api/file-upload-api-client'; -import { Button } from 'app/atoms/button/button'; -import { DownloadIcon } from 'app/atoms/icons-agnostic'; +import { FolderIcon } from '@heroicons/react/solid'; import { ArrowRight } from 'react-feather'; +import Highlighter from 'react-highlight-words'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { onDriveItemDownloadClick, openDriveItem } from '../common'; +import ResultContext from './result-context'; +import { Button } from '@atoms/button/button'; +import { DownloadIcon } from '@atoms/icons-agnostic'; import { FileTypeArchiveIcon, FileTypeDocumentIcon, @@ -10,23 +13,20 @@ import { FileTypeSlidesIcon, FileTypeSpreadsheetIcon, FileTypeUnknownIcon, -} from 'app/atoms/icons-colored'; -import { formatDate } from 'app/features/global/utils/format-date'; -import { formatSize } from 'app/features/global/utils/format-file-size'; -import { DriveItem } from 'app/features/drive/types'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import { UserType } from 'app/features/users/types/user'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; -import Media from 'app/molecules/media'; -import Highlighter from 'react-highlight-words'; -import { useRecoilValue, useRecoilState } from 'recoil'; -import { openDriveItem, onDriveItemDownloadClick } from '../common'; -import ResultContext from './result-context'; -import { useCompanyApplications } from 'app/features/applications/hooks/use-company-applications'; -import { DriveCurrentFolderAtom } from 'app/views/client/body/drive/browser'; -import { FolderIcon } from '@heroicons/react/solid'; +} from '@atoms/icons-colored'; +import * as Text from '@atoms/text'; +import { useCompanyApplications } from '@features/applications/hooks/use-company-applications'; +import { DriveItem } from '@features/drive/types'; +import FileUploadAPIClient from '@features/files/api/file-upload-api-client'; +import { formatDate } from '@features/global/utils/format-date'; +import { formatSize } from '@features/global/utils/format-file-size'; +import useRouterWorkspace from '@features/router/hooks/use-router-workspace'; +import { useSearchModal } from '@features/search/hooks/use-search'; +import { SearchInputState } from '@features/search/state/search-input'; +import { UserType } from '@features/users/types/user'; +import { useFileViewerModal } from '@features/viewer/hooks/use-viewer'; +import Media from '@molecules/media'; +import { DriveCurrentFolderAtom } from '@views/client/body/drive/browser'; export default (props: { driveItem: DriveItem & { user?: UserType } }) => { const input = useRecoilValue(SearchInputState); @@ -63,12 +63,7 @@ export default (props: { driveItem: DriveItem & { user?: UserType } }) => { {extension?.toLocaleUpperCase()} • {formatDate(parseInt(file?.last_modified))} •{' '} {formatSize(file?.size)} - +
{ - const input = useRecoilValue(SearchInputState); - const currentWorkspaceId = useRouterWorkspace(); - const file = props.file; - const name = file?.metadata?.name; - const extension = name?.split('.').pop(); - - const { setOpen } = useSearchModal(); - const { open: openViewer } = useFileViewerModal(); - - return ( -
openViewer(file)} - > - -
- - - - - {extension?.toLocaleUpperCase()} • {formatDate(file?.message?.created_at)} •{' '} - {formatSize(file?.metadata?.size)} - - -
-
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - - - {!!file.message && ( - - )} -
-
- ); -}; - -export const FileResultMedia = (props: { - className?: string; - size?: 'md' | 'lg' | 'sm'; - file: MessageFileType & { message?: Message } & { user?: UserType }; -}) => { - const file = props.file; - - const name = file?.metadata?.name; - const type = FileUploadAPIClient.mimeToType(file?.metadata?.mime || ''); - const url = FileUploadAPIClient.getFileThumbnailUrlFromMessageFile(file); - const extension = name?.split('.').pop(); - - let iconClassName = 'absolute left-0 top-0 bottom-0 right-0 m-auto w-8 h-8'; - if (url) iconClassName = 'absolute bottom-1 left-1 w-6 h-6'; - - return ( -
- - {(!['image', 'video'].includes(type) || !url) && ( - <> - {type === 'archive' ? ( - - ) : type === 'pdf' ? ( - - ) : type === 'document' ? ( - - ) : type === 'spreadsheet' ? ( - - ) : type === 'slides' ? ( - - ) : ( - - )} - - )} -
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/media-result.tsx b/tdrive/frontend/src/app/components/search-popup/parts/media-result.tsx deleted file mode 100644 index cf3acdaa..00000000 --- a/tdrive/frontend/src/app/components/search-popup/parts/media-result.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import FileUploadAPIClient from '@features/files/api/file-upload-api-client'; -import { MessageFileType } from '@features/messages/types/message'; -import Media from '@molecules/media'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; - -export default (props: { file: MessageFileType }) => { - const file = props.file; - const url = FileUploadAPIClient.getFileThumbnailUrlFromMessageFile(file); - const type = FileUploadAPIClient.mimeToType(file?.metadata?.mime || ''); - const { open: openViewer } = useFileViewerModal(); - - return ( -
openViewer(file)} - > - -
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/message-result-file.tsx b/tdrive/frontend/src/app/components/search-popup/parts/message-result-file.tsx deleted file mode 100644 index 0bf3b5fb..00000000 --- a/tdrive/frontend/src/app/components/search-popup/parts/message-result-file.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import * as Text from '@atoms/text'; - -import { Button } from 'app/atoms/button/button'; -import { DownloadIcon } from 'app/atoms/icons-agnostic'; -import { formatDate } from 'app/features/global/utils/format-date'; -import { formatSize } from 'app/features/global/utils/format-file-size'; -import { Message, MessageFileType } from 'app/features/messages/types/message'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import { UserType } from 'app/features/users/types/user'; -import { useFileViewerModal } from 'app/features/viewer/hooks/use-viewer'; -import { ArrowRight } from 'react-feather'; -import Highlighter from 'react-highlight-words'; -import { useRecoilValue } from 'recoil'; -import { onFileDownloadClick, openMessage } from '../common'; -import { FileResultMedia } from './file-result'; - -export default (props: { file: MessageFileType & { message?: Message } & { user?: UserType } }) => { - const input = useRecoilValue(SearchInputState); - const currentWorkspaceId = useRouterWorkspace(); - const file = props.file; - const name = file?.metadata?.name; - const extension = name?.split('.').pop(); - - const { setOpen } = useSearchModal(); - const { open: openViewer } = useFileViewerModal(); - - return ( -
openViewer(file)} - > - -
- - - - - {extension?.toLocaleUpperCase()} • {formatDate(file?.message?.created_at)} •{' '} - {formatSize(file?.metadata?.size)} - -
-
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - - - {!!file.message && ( - - )} -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/message-result.tsx b/tdrive/frontend/src/app/components/search-popup/parts/message-result.tsx deleted file mode 100644 index 841a15e3..00000000 --- a/tdrive/frontend/src/app/components/search-popup/parts/message-result.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import A from '@atoms/link'; -import * as Text from '@atoms/text'; -import { formatDate } from '@features/global/utils/format-date'; -import { Message } from '@features/messages/types/message'; -import ChannelAvatar from 'app/components/search-popup/parts/channel-avatar/channel-avatar'; -import { useChannel } from 'app/features/channels/hooks/use-channel'; -import { ChannelType } from 'app/features/channels/types/channel'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import { useUser } from 'app/features/users/hooks/use-user'; -import { UserType } from 'app/features/users/types/user'; -import { useState } from 'react'; -import Highlighter from 'react-highlight-words'; -import { useRecoilValue } from 'recoil'; -import { openMessage } from '../common'; -import MessageResultFile from './message-result-file'; -import ResultContext from './result-context'; - -export default ({ - message, -}: { - message: Message & { users?: UserType[]; channel?: ChannelType }; -}) => { - const input = useRecoilValue(SearchInputState); - const currentWorkspaceId = useRouterWorkspace(); - const user = - (message.users || []).find(u => u.id === message.user_id) || useUser(message.user_id || ''); - const channel = message.channel || useChannel(message?.cache?.channel_id || '').channel; - const [truncated, setTruncated] = useState(true); - const { setOpen } = useSearchModal(); - - return ( -
{ - openMessage(message, currentWorkspaceId); - setOpen(false); - }} - > -
- {channel && } -
-
-
- -
-
- - - {truncated && (message.text?.length || 0) > 500 && ( - { - e.stopPropagation(); - setTruncated(false); - }} - > - See more - - )} - - {(message.files || []).map(file => ( -
e.stopPropagation()} - className="rounded-md border bg-white border-gray-200 hover:border-gray-300 mb-1" - > - -
- ))} -
- {formatDate(message.created_at)} -
-
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/nothing-found.tsx b/tdrive/frontend/src/app/components/search-popup/parts/nothing-found.tsx index 0c181b32..e3e044d3 100644 --- a/tdrive/frontend/src/app/components/search-popup/parts/nothing-found.tsx +++ b/tdrive/frontend/src/app/components/search-popup/parts/nothing-found.tsx @@ -1,6 +1,6 @@ -import { NotFoundIcon } from 'app/atoms/icons-colored'; -import Languages from 'app/features/global/services/languages-service'; -import { SearchInputState } from 'app/features/search/state/search-input'; +import { NotFoundIcon } from '@atoms/icons-colored'; +import Languages from '@features/global/services/languages-service'; +import { SearchInputState } from '@features/search/state/search-input'; import { useRecoilValue } from 'recoil'; import * as Text from '@atoms/text'; diff --git a/tdrive/frontend/src/app/components/search-popup/parts/nothing-searched.tsx b/tdrive/frontend/src/app/components/search-popup/parts/nothing-searched.tsx index fe738162..d1f78ee1 100644 --- a/tdrive/frontend/src/app/components/search-popup/parts/nothing-searched.tsx +++ b/tdrive/frontend/src/app/components/search-popup/parts/nothing-searched.tsx @@ -1,5 +1,5 @@ -import { NotFoundIcon } from 'app/atoms/icons-colored'; -import Languages from 'app/features/global/services/languages-service'; +import { NotFoundIcon } from '@atoms/icons-colored'; +import Languages from '@features/global/services/languages-service'; import * as Text from '@atoms/text'; export default () => { diff --git a/tdrive/frontend/src/app/components/search-popup/parts/result-context.tsx b/tdrive/frontend/src/app/components/search-popup/parts/result-context.tsx index 3d7cd531..2376aa2e 100644 --- a/tdrive/frontend/src/app/components/search-popup/parts/result-context.tsx +++ b/tdrive/frontend/src/app/components/search-popup/parts/result-context.tsx @@ -1,62 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import A from '@atoms/link'; -import { getChannel } from '@features/channels/hooks/use-channel'; -import { UserType } from '@features/users/types/user'; -import { useWorkspace } from '@features/workspaces/hooks/use-workspaces'; import UsersService from '@features/users/services/current-user-service'; -import RouterServices from '@features/router/services/router-service'; -import useRouterCompany from 'app/features/router/hooks/use-router-company'; -import useRouterWorkspace from 'app/features/router/hooks/use-router-workspace'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; - -export default ({ - user, - context, -}: { - user?: UserType; - context?: { channelId?: string; workspaceId?: string; companyId?: string }; -}) => { - const channel = getChannel(context?.channelId || ''); - - const routerWorkspace = useRouterWorkspace(); - const routerCompany = useRouterCompany(); - const workspaceId = - (context?.workspaceId !== 'direct' ? context?.workspaceId : '') || routerWorkspace; - const { workspace } = useWorkspace(workspaceId || ''); - const companyId = context?.companyId || routerCompany; - - const { setOpen } = useSearchModal(); - - const workspaceName = - context?.workspaceId === 'direct' ? 'Direct' : workspace?.name ? workspace?.name : ''; +import { UserType } from '@features/users/types/user'; +export default ({ user }: { user?: UserType }) => { return (
{!!user && <>{UsersService.getFullName(user)}} - {!!user && !!(channel || workspaceName) && {'->'} } - {(channel || workspaceName) && ( - <> - {!!workspaceName && {workspaceName}} - {!!workspaceName && !!channel?.name && / } - {!!channel?.name && ( - { - e.stopPropagation(); - setOpen(false); - RouterServices.push( - RouterServices.generateRouteFromState({ - companyId: companyId || '', - workspaceId: workspaceId || '', - channelId: context?.channelId || '', - }), - ); - }} - > - {channel?.name} - - )} - - )}
); }; diff --git a/tdrive/frontend/src/app/components/search-popup/search-input.tsx b/tdrive/frontend/src/app/components/search-popup/search-input.tsx index f8f5352b..46c66148 100755 --- a/tdrive/frontend/src/app/components/search-popup/search-input.tsx +++ b/tdrive/frontend/src/app/components/search-popup/search-input.tsx @@ -1,19 +1,12 @@ -import { InputDecorationIcon } from '@atoms/input/input-decoration-icon'; import { SearchIcon } from '@heroicons/react/solid'; -import { Input } from 'app/atoms/input/input-text'; -import { Loader } from 'app/atoms/loader'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchChannelsLoading } from 'app/features/search/hooks/use-search-channels'; -import { - useSearchMessagesFilesLoading, - useSearchMessagesMediasLoading, -} from 'app/features/search/hooks/use-search-files-or-medias'; -import { useSearchDriveItemsLoading } from 'app/features/search/hooks/use-search-drive-items'; -import { useSearchMessagesLoading } from 'app/features/search/hooks/use-search-messages'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import _ from 'lodash'; import { useEffect, useRef } from 'react'; import { useRecoilState } from 'recoil'; +import { InputDecorationIcon } from '@atoms/input/input-decoration-icon'; +import { Input } from '@atoms/input/input-text'; +import { Loader } from '@atoms/loader'; +import Languages from '@features/global/services/languages-service'; +import { useSearchDriveItemsLoading } from '@features/search/hooks/use-search-drive-items'; +import { SearchInputState } from '@features/search/state/search-input'; export const SearchInput = () => { const [input, setInput] = useRecoilState(SearchInputState); @@ -23,14 +16,9 @@ export const SearchInput = () => { if (inputElement.current) inputElement.current.focus(); }, []); - const channelsLoading = useSearchChannelsLoading(); - const messagesLoading = useSearchMessagesLoading(); - const filesLoading = useSearchMessagesFilesLoading(); - const mediasLoading = useSearchMessagesMediasLoading(); const driveItemsLoading = useSearchDriveItemsLoading(); - const loading = - channelsLoading || messagesLoading || filesLoading || mediasLoading || driveItemsLoading; + const loading = driveItemsLoading; return (
diff --git a/tdrive/frontend/src/app/components/search-popup/search-popup.tsx b/tdrive/frontend/src/app/components/search-popup/search-popup.tsx index 54fdc23e..291190b6 100755 --- a/tdrive/frontend/src/app/components/search-popup/search-popup.tsx +++ b/tdrive/frontend/src/app/components/search-popup/search-popup.tsx @@ -1,6 +1,6 @@ import { Modal, ModalContent } from '@atoms/modal'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchModal } from 'app/features/search/hooks/use-search'; +import Languages from '@features/global/services/languages-service'; +import { useSearchModal } from '@features/search/hooks/use-search'; import { SearchInput } from './search-input'; import { SearchResultsIndex } from './search-tabs'; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/all.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/all.tsx deleted file mode 100644 index 6b5f4a3b..00000000 --- a/tdrive/frontend/src/app/components/search-popup/tabs/all.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import * as Text from '@atoms/text'; -import A from 'app/atoms/link'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchChannels } from 'app/features/search/hooks/use-search-channels'; -import { - useSearchMessagesFiles, - useSearchMessagesMedias, -} from 'app/features/search/hooks/use-search-files-or-medias'; -import { useSearchMessages } from 'app/features/search/hooks/use-search-messages'; -import { SearchInputState, SearchTabsState } from 'app/features/search/state/search-input'; -import { useRecoilValue, useSetRecoilState } from 'recoil'; -import { ChannelsResults, ChannelsRowResults } from './channels'; -import { FilesResults } from './files'; -import { MediasResults } from './medias'; -import { MessagesResults } from './messages'; - -export default () => { - const setTab = useSetRecoilState(SearchTabsState); - - const input = useRecoilValue(SearchInputState); - const isRecent = input?.query?.trim()?.length === 0; - - const { channels } = useSearchChannels(); - const { messages } = useSearchMessages(); - const { files } = useSearchMessagesFiles(); - const { files: medias } = useSearchMessagesMedias(); - - return ( -
- {channels.length > 0 && ( - <> -
- - {isRecent - ? Languages.t('components.searchpopup.recent_channels_and_contacts') - : Languages.t('components.searchpopup.channels')} - - {channels.length > 6 && ( - - )} -
- {isRecent && ( -
- -
- )} - {!isRecent && ( -
- -
- )} - - )} - - {medias.length > 0 && ( - <> -
- - {isRecent - ? Languages.t('components.searchpopup.recent_media') - : Languages.t('components.searchpopup.media')} - - {medias.length > 6 && ( - - )} -
-
- -
- - )} - - {files.length > 0 && ( - <> -
- - {isRecent - ? Languages.t('components.searchpopup.recent_files') - : Languages.t('components.searchpopup.files')} - - {files.length > 6 && ( - - )} -
-
- -
- - )} - - {messages.length > 0 && ( - <> -
- - {Languages.t('components.searchpopup.messages')} - -
-
- -
- - )} -
- ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/channels.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/channels.tsx deleted file mode 100644 index cb3d9052..00000000 --- a/tdrive/frontend/src/app/components/search-popup/tabs/channels.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import * as Text from '@atoms/text'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchChannels } from 'app/features/search/hooks/use-search-channels'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import { useRecoilValue } from 'recoil'; -import ChannelLineResult from '../parts/channel-line-result'; -import ChannelResult from '../parts/channel-result'; -import NothingFound from '../parts/nothing-found'; - -export default () => { - const input = useRecoilValue(SearchInputState); - const isRecent = input?.query?.trim()?.length === 0; - const { channels, loading } = useSearchChannels(); - - if (channels.length === 0 && !loading) return ; - - const topChannels = channels - .slice() - .filter(a => Date.now() - (a.last_activity || 0) < 1000 * 60 * 60 * 24 * 31) - .sort((a, b) => Math.min(50, b?.stats?.messages || 0) - Math.min(50, a?.stats?.messages || 0)) - .slice(0, 5); - - return ( -
- {!!isRecent && !!topChannels.length && ( -
- - {Languages.t('components.searchpopup.recent_channels_and_contacts')} - - -
- {topChannels.map(channel => ( -
- -
- ))} -
-
- )} - - {!!isRecent && ( - - {Languages.t('components.searchpopup.channels')} - - )} -
- -
-
- ); -}; - -export const ChannelsRowResults = (props: { max?: number }) => { - const { channels, loading } = useSearchChannels(); - - if (channels.length === 0 && !loading) return ; - - return ( - <> - {channels.slice(0, props?.max || channels.length).map(channel => ( -
- -
- ))} - - ); -}; - -export const ChannelsResults = (props: { max?: number }) => { - const { channels, loading } = useSearchChannels(); - - if (channels.length === 0 && !loading) return ; - - return ( - <> - {channels.slice(0, props?.max || channels.length).map(channel => ( - - ))} - - ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/drive.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/drive.tsx index 8b6dc2ea..7551fd76 100644 --- a/tdrive/frontend/src/app/components/search-popup/tabs/drive.tsx +++ b/tdrive/frontend/src/app/components/search-popup/tabs/drive.tsx @@ -1,7 +1,7 @@ import * as Text from '@atoms/text'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchDriveItems } from 'app/features/search/hooks/use-search-drive-items'; -import { SearchInputState } from 'app/features/search/state/search-input'; +import Languages from '@features/global/services/languages-service'; +import { useSearchDriveItems } from '@features/search/hooks/use-search-drive-items'; +import { SearchInputState } from '@features/search/state/search-input'; import { useRecoilValue } from 'recoil'; import DriveItemResult from '../parts/drive-item-result'; import NothingFound from '../parts/nothing-found'; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/files.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/files.tsx deleted file mode 100644 index 6a6d18cc..00000000 --- a/tdrive/frontend/src/app/components/search-popup/tabs/files.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as Text from '@atoms/text'; -import Languages from 'app/features/global/services/languages-service'; -import { useSearchMessagesFiles } from 'app/features/search/hooks/use-search-files-or-medias'; -import { SearchInputState } from 'app/features/search/state/search-input'; -import { useRecoilValue } from 'recoil'; -import FileResult from '../parts/file-result'; -import NothingFound from '../parts/nothing-found'; - -export default () => { - const input = useRecoilValue(SearchInputState); - const isRecent = input?.query?.trim()?.length === 0; - const { files, loading } = useSearchMessagesFiles(); - - if (files.length === 0 && !loading) return ; - - return ( -
- {!!isRecent && ( - - {Languages.t('components.searchpopup.recent_files')} - - )} - -
- -
-
- ); -}; - -export const FilesResults = (props: { max?: number }) => { - const { files, loading } = useSearchMessagesFiles(); - - if (files.length === 0 && !loading) return ; - - return ( - <> - {files.slice(0, props?.max || files.length).map(file => ( - - ))} - - ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/medias.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/medias.tsx deleted file mode 100644 index 76ce0373..00000000 --- a/tdrive/frontend/src/app/components/search-popup/tabs/medias.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import * as Text from '@atoms/text'; -import FileUploadAPIClient from '@features/files/api/file-upload-api-client'; -import Languages from '@features/global/services/languages-service'; -import { useSearchMessagesMedias } from '@features/search/hooks/use-search-files-or-medias'; -import { SearchInputState } from '@features/search/state/search-input'; -import { useRecoilValue } from 'recoil'; -import FileResult from '../parts/file-result'; -import MediaResult from '../parts/media-result'; -import NothingFound from '../parts/nothing-found'; - -export default () => { - const input = useRecoilValue(SearchInputState); - const isRecent = input?.query?.trim()?.length === 0; - - return ( -
- {!!isRecent && ( - - {Languages.t('components.searchpopup.recent_media')} - - )} - -
- -
-
- ); -}; - -export const MediasResults = (props: { max?: number; showAsFiles?: boolean }) => { - const { files, loading } = useSearchMessagesMedias(); - - if (files.length === 0 && !loading) return ; - - return ( - <> - {files - .slice(0, props?.max || files.length) - .map(file => { - const url = FileUploadAPIClient.getFileThumbnailUrlFromMessageFile(file); - if (url || props.showAsFiles) - return props.showAsFiles ? ( - - ) : ( - - ); - }) - .filter(a => a)} - - ); -}; diff --git a/tdrive/frontend/src/app/components/search-popup/tabs/messages.tsx b/tdrive/frontend/src/app/components/search-popup/tabs/messages.tsx deleted file mode 100644 index 8d5231de..00000000 --- a/tdrive/frontend/src/app/components/search-popup/tabs/messages.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { SearchInputState } from '@features/search/state/search-input'; -import { useSearchMessages } from 'app/features/search/hooks/use-search-messages'; -import { useRecoilValue } from 'recoil'; -import MessageResult from '../parts/message-result'; -import NothingFound from '../parts/nothing-found'; -import NothingSearched from '../parts/nothing-searched'; - -export default () => { - return ( -
-
- -
-
- ); -}; - -export const MessagesResults = () => { - const input = useRecoilValue(SearchInputState); - const isRecent = input?.query?.trim()?.length === 0; - const { messages, loading } = useSearchMessages(); - - if (isRecent) return ; - if (messages.length === 0 && !loading) return ; - - return ( - <> -
- {messages - .map(message => { - return ( -
- -
- ); - }) - .filter(a => a)} -
- - ); -}; diff --git a/tdrive/frontend/src/app/components/select/select.jsx b/tdrive/frontend/src/app/components/select/select.jsx index 25f7094b..febb0178 100755 --- a/tdrive/frontend/src/app/components/select/select.jsx +++ b/tdrive/frontend/src/app/components/select/select.jsx @@ -1,7 +1,7 @@ import React, { Component } from 'react'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; -import Icon from 'app/components/icon/icon.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; +import Icon from '@components/icon/icon.jsx'; import './select.scss'; export default class Select extends React.Component { diff --git a/tdrive/frontend/src/app/components/table/table.tsx b/tdrive/frontend/src/app/components/table/table.tsx index a1660bd5..8180e99c 100755 --- a/tdrive/frontend/src/app/components/table/table.tsx +++ b/tdrive/frontend/src/app/components/table/table.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable jsx-a11y/anchor-is-valid */ import React, { Component } from 'react'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import Button from 'components/buttons/button.jsx'; import InputIcon from 'components/inputs/input-icon.jsx'; import './table.scss'; diff --git a/tdrive/frontend/src/app/components/tabs/tabs.jsx b/tdrive/frontend/src/app/components/tabs/tabs.jsx index b02fbfd3..3cae0e4e 100755 --- a/tdrive/frontend/src/app/components/tabs/tabs.jsx +++ b/tdrive/frontend/src/app/components/tabs/tabs.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-key */ import React, { Component } from 'react'; -import Languages from 'app/features/global/services/languages-service'; +import Languages from '@features/global/services/languages-service'; import PerfectScrollbar from 'react-perfect-scrollbar'; import './tabs.scss'; diff --git a/tdrive/frontend/src/app/components/tag-picker/tag-picker.jsx b/tdrive/frontend/src/app/components/tag-picker/tag-picker.jsx index 90fb2da1..a1986961 100755 --- a/tdrive/frontend/src/app/components/tag-picker/tag-picker.jsx +++ b/tdrive/frontend/src/app/components/tag-picker/tag-picker.jsx @@ -1,14 +1,14 @@ /* eslint-disable react/jsx-key */ /* eslint-disable react/no-direct-mutation-state */ import React, { Component } from 'react'; -import Icon from 'app/components/icon/icon.jsx'; +import Icon from '@components/icon/icon.jsx'; import Button from 'components/buttons/button.jsx'; import './tag-picker.scss'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import MenusManager from '@components/menus/menus-manager.jsx'; import TagSelector from './tag-selector.jsx'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import Languages from 'app/features/global/services/languages-service'; +import Workspaces from '@deprecated/workspaces/workspaces.jsx'; +import Collections from '@deprecated/CollectionsV1/Collections/Collections.js'; +import Languages from '@features/global/services/languages-service'; export default class TagPicker extends React.Component { constructor(props) { diff --git a/tdrive/frontend/src/app/components/tag-picker/tag-selector.jsx b/tdrive/frontend/src/app/components/tag-picker/tag-selector.jsx index 63ed8d32..e91086fd 100755 --- a/tdrive/frontend/src/app/components/tag-picker/tag-selector.jsx +++ b/tdrive/frontend/src/app/components/tag-picker/tag-selector.jsx @@ -2,15 +2,15 @@ import React, { Component } from 'react'; import Picker from 'components/picker/picker.jsx'; import Button from 'components/buttons/button.jsx'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; -import Icon from 'app/components/icon/icon.jsx'; +import Workspaces from '@deprecated/workspaces/workspaces.jsx'; +import Collections from '@deprecated/CollectionsV1/Collections/Collections.js'; +import Icon from '@components/icon/icon.jsx'; import ColorPicker from 'components/color-picker/color-picker.jsx'; -import Strings from 'app/features/global/utils/strings'; +import Strings from '@features/global/utils/strings'; import InputWithColor from 'components/inputs/input-with-color.jsx'; -import AlertManager from 'app/features/global/services/alert-manager-service'; -import Languages from 'app/features/global/services/languages-service'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; +import AlertManager from '@features/global/services/alert-manager-service'; +import Languages from '@features/global/services/languages-service'; +import MenusManager from '@components/menus/menus-manager.jsx'; class TagEditor extends React.Component { constructor(props) { diff --git a/tdrive/frontend/src/app/components/task-picker/task-picker.jsx b/tdrive/frontend/src/app/components/task-picker/task-picker.jsx index 189de0d6..dc134cd2 100755 --- a/tdrive/frontend/src/app/components/task-picker/task-picker.jsx +++ b/tdrive/frontend/src/app/components/task-picker/task-picker.jsx @@ -1,12 +1,12 @@ /* eslint-disable react/jsx-key */ import React, { Component } from 'react'; -import Workspaces from 'app/deprecated/workspaces/workspaces.jsx'; +import Workspaces from '@deprecated/workspaces/workspaces.jsx'; import Button from 'components/buttons/button.jsx'; -import Languages from 'app/features/global/services/languages-service'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections.js'; +import Languages from '@features/global/services/languages-service'; +import Collections from '@deprecated/CollectionsV1/Collections/Collections.js'; import Emojione from 'components/emojione/emojione'; import Loader from 'components/loader/loader.jsx'; -import TasksService from 'app/deprecated/Apps/Tasks/Tasks.js'; +import TasksService from '@deprecated/Apps/Tasks/Tasks.js'; import LeftIcon from '@material-ui/icons/KeyboardArrowLeftOutlined'; import './task-picker.scss'; diff --git a/tdrive/frontend/src/app/components/twacode/blocks/chan.tsx b/tdrive/frontend/src/app/components/twacode/blocks/chan.tsx deleted file mode 100755 index c05db283..00000000 --- a/tdrive/frontend/src/app/components/twacode/blocks/chan.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import Emojione from 'components/emojione/emojione'; -import MainViewService from 'app/features/router/services/main-view-service'; -import { useChannel } from 'app/features/channels/hooks/use-channel'; - -type PropsType = { - // channel id - id: string; - // channel name - name: string; -}; - -export default (props: PropsType): JSX.Element => { - const { channel } = useChannel(props.id); - - if (!props.id || !channel) { - return #{props.name}; - } - - return ( -
{ - MainViewService.select(props.id, { - app: { - identity: { - code: 'messages', - name: '', - icon: '', - description: '', - website: '', - categories: [], - compatibility: [], - }, - }, - context: { type: 'channel' }, - hasTabs: channel.visibility !== 'direct', - }); - }} - > - - {channel.name} -
- ); -}; diff --git a/tdrive/frontend/src/app/components/twacode/blocks/user.tsx b/tdrive/frontend/src/app/components/twacode/blocks/user.tsx deleted file mode 100644 index e3704a31..00000000 --- a/tdrive/frontend/src/app/components/twacode/blocks/user.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { useEffect, useRef, useState } from 'react'; -import classNames from 'classnames'; -import UserService from 'app/features/users/services/current-user-service'; -import MenusManager from 'app/components/menus/menus-manager.jsx'; -import UserCard from 'app/components/user-card/user-card'; -import { UserType } from 'app/features/users/types/user'; -import { useUser, useUserByUsername } from 'app/features/users/hooks/use-user'; -import Collections from 'app/deprecated/CollectionsV1/Collections/Collections'; -import { useDirectChannels } from 'app/features/channels/hooks/use-direct-channels'; - -const globalMentions = ['channel', 'everyone', 'all', 'here']; - -type PropsType = { - // User id - id?: string; - // user username - username?: string; - // should we hide the user image? - hideUserImage?: boolean; -}; - -export default (props: PropsType): JSX.Element => { - const { openDiscussion } = useDirectChannels(); - const collection = Collections.get('users'); - const nodeRef = useRef(null); - let user: UserType | undefined; - if (props.id) { - user = useUser(props.id || ''); - } else { - user = useUserByUsername(props.username || ''); - } - - useEffect(() => { - const listener = collection.addListener(useState, [user]); - - return () => { - collection.removeListener(listener); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [user]); - - const displayUserCard = (user: UserType): void => { - if (!nodeRef.current) { - return; - } - - MenusManager.openMenu( - [ - { - type: 'react-element', - reactElement: () => ( - openDiscussion([user.id || ''])} /> - ), - }, - ], - (window as any).getBoundingClientRect(nodeRef.current), - null, - { margin: 8 }, - ); - }; - - const highlighted = - user?.id === UserService.getCurrentUserId() || - globalMentions.includes(props.username || props.id || ''); - - if (user) { - return ( -
displayUserCard(user as UserType)} - style={{ - paddingLeft: props.hideUserImage ? 5 : 0, - backgroundColor: props.hideUserImage ? 'var(--grey-background)' : '', - }} - > - {!props.hideUserImage && ( -
- )} - {UserService.getFullName(user)} -
- ); - } else { - return ( - - @{props.username || 'unknown'} - - ); - } -}; diff --git a/tdrive/frontend/src/app/components/twacode/blocksCompiler.ts b/tdrive/frontend/src/app/components/twacode/blocksCompiler.ts deleted file mode 100644 index 1028b0b1..00000000 --- a/tdrive/frontend/src/app/components/twacode/blocksCompiler.ts +++ /dev/null @@ -1,262 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - Block, - BlockActions, - BlockContext, - BlockDivider, - BlockElementButton, - BlockElementCheckboxes, - BlockElementDatePicker, - BlockElementImage, - BlockElementMultiselectMenu, - BlockElementOverflowMenus, - BlockElementProgressBar, - BlockElementRadioButtonInput, - BlockElementSelectMenus, - BlockIframe, - BlockImage, - BlockInput, - BlockSection, -} from './types'; - -export const formatData = ( - object: any, - content: any, - flatted: Block[], - level: number | null = null, -) => { - for (let i = 0; i < object.length; i++) { - const recursif = - object[content] && typeof object[content] !== 'string' ? { ...object[content] } : null; - - delete object[content]; - flatted.push(object[i]); - const currentLevel = level ? level + 1 : 1; - if (recursif) { - formatData(recursif, content, flatted, currentLevel); - } - } -}; - -export const blocksToTwacode = (event: Block[]) => { - const blocks: any[] = []; - - event.forEach((obj: Block) => { - let object = obj; - - switch (object.type) { - case 'actions': - object = object as BlockActions; - for (let i = 0; i < object.elements.length; i++) { - const element = object.elements[i]; - createTwacodeElements(element, blocks); - } - lineBreak(blocks); - break; - case 'context': - object = object as BlockContext; - for (let i = 0; i < object.elements.length; i++) { - const element = object.elements[i]; - createTwacodeElements(element, blocks); - } - lineBreak(blocks); - break; - case 'divider': - object = object as BlockDivider; - blocks.push(blocks); - break; - case 'header': - createTwacodeElements({ type: 'mrkdwn', text: `\n **${object.text.text}** \n` }, blocks); - - break; - case 'image': - object = object as BlockImage; - createTwacodeElements(object, blocks, object.type); - lineBreak(blocks); - break; - - case 'input': - object = object as BlockInput; - createTwacodeElements(object, blocks); - break; - case 'section': - object = object as BlockSection; - if (object.text) { - createTwacodeElements(object.text, blocks); - lineBreak(blocks); - } - if (object.fields) { - for (let i = 0; i < object.fields.length; i++) { - const element = object.fields[i]; - createTwacodeElements(element, blocks); - lineBreak(blocks); - } - } - if (object.accessory) { - const element = object.accessory; - createTwacodeElements(element, blocks); - } - lineBreak(blocks); - - break; - case 'iframe': - object = object as BlockIframe; - createTwacodeElements( - { - type: 'iframe', - src: object.iframe_url, - width: object.width, - height: object.height, - }, - blocks, - object.type, - ); - break; - case 'twacode': - blocks.push(object.elements); - break; - default: - // TODO - } - }); - return blocks; -}; - -const createTwacodeElements = (object: any, blocks: any[], type?: any) => { - switch (object.type) { - case 'button': - object = object as BlockElementButton; - blocks.push({ - type: 'button', - content: - object.text.emoji === true - ? { type: 'compile', content: object.text.text } - : object.text.text, - action_id: object.action_id, - value: object.value, - style: object.style ? object.style : 'default', - url: object.url, - }); - break; - case 'checkboxes': - object = object as BlockElementCheckboxes; - blocks.push({ type: 'checkboxes' }); - break; - case 'datepicker': - object = object as BlockElementDatePicker; - blocks.push({ type: 'datepicker' }); - break; - case 'image': - object = object as BlockElementImage; - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - object.title - ? blocks.push({ - type: 'system', - content: { - type: 'compile', - content: object.title.text + '\n', - }, - }) - : null; - - blocks.push({ - type: type === 'image' ? 'image' : 'icon', - src: object.image_url, - }); - break; - case 'progress_bar': - object = object as BlockElementProgressBar; - blocks.push({ - type: 'compile', - content: object.title + '\n', - }); - blocks.push({ - type: 'progress_bar', - value: object.value, - }); - break; - case 'multi_static_select': - object = object as BlockElementMultiselectMenu; - blocks.push(generateSelect(object)); - break; - case 'overflow': - object = object as BlockElementOverflowMenus; - blocks.push(generateSelect(object)); - break; - case 'input': - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - object.label.text - ? createTwacodeElements( - { type: 'mrkdwn', text: `**${object.label.text}** \n` }, - blocks, - type, - ) - : null; - createTwacodeElements(object.element, blocks, type); - - break; - case 'plain_text_input': - if (object.readonly === true && object.copiable === true) { - blocks.push({ - type: 'copiable', - content: object.initial_value ? object.initial_value : '', - }); - } else { - blocks.push({ - type: 'input', - placeholder: object.placeholder ? object.placeholder.text : null, - passive_id: object.action_id, - }); - lineBreak(blocks); - } - break; - case 'radio_buttons': - object = object as BlockElementRadioButtonInput; - blocks.push(generateSelect(object)); - break; - case 'static_select': - object = object as BlockElementSelectMenus; - blocks.push(generateSelect(object)); - break; - case 'timepicker': - //not implemented yet - break; - case 'context': - if (object.elements[0].type === 'mrkdwn') { - createTwacodeElements(object.elements[0], blocks); - } else { - createTwacodeElements(object.elements[0], blocks); - } - break; - case 'mrkdwn': - blocks.push({ - type: 'compile', - content: object.text, - }); - break; - case 'plain_text': - blocks.push({ - type: 'text', - content: object.text, - }); - break; - default: - // TODO - } -}; - -const generateSelect = (object: any) => { - return { - type: 'select', - //placeholder not yet implemented - title: '', - values: object.options.map((option: any) => { - return { name: option.text.text, value: option.value }; - }), - action_id: object.action_id, - }; -}; - -const lineBreak = (blocks: any[]) => { - createTwacodeElements({ type: 'mrkdwn', text: '\n' }, blocks); -}; diff --git a/tdrive/frontend/src/app/components/twacode/compile.tsx b/tdrive/frontend/src/app/components/twacode/compile.tsx deleted file mode 100644 index f8f9d818..00000000 --- a/tdrive/frontend/src/app/components/twacode/compile.tsx +++ /dev/null @@ -1,118 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import _ from 'lodash'; -import React from 'react'; -import PseudoMarkdownCompiler from 'app/features/global/services/pseudo-markdown-compiler-service'; -import { DynamicComponent } from './pseudo-markdown-dictionary'; - -type Props = { - content: any; - isApp: boolean; - eventContainer: any; - textTransform?: any; -}; - -const Compile = (props: Props) => { - let content = props.content; - const isApp = props.isApp; - const eventContainer = props.eventContainer; - let textTransform = props.textTransform; - - if (!content) { - return PseudoMarkdownCompiler.pseudo_markdown['text'].object(''); - } - - if (!textTransform) textTransform = {}; - if (content.formatted || content.prepared) content = content.formatted || content.prepared; - if (typeof content === 'string') content = [content]; - if (content.type || content.start) content = [content]; - - if (!_.isArray(content)) { - content = [content]; - } - - try { - return ( - <> - {content.map((item: any, index: number) => { - if (typeof item === 'string') { - return ( - - {item} - - ); - } else if (Array.isArray(item)) { - return ( - - ); - } else { - let type = PseudoMarkdownCompiler.pseudo_markdown[item.start]; - if (item.type === 'compile' && isApp && typeof item.content === 'string') { - return ( - - ); - } else { - if (item.type) { - type = PseudoMarkdownCompiler.pseudo_markdown_types[item.type]; - } - if (type) { - if (!type.apps_only || isApp) { - //If text transform do it - const old_textTransform = JSON.parse(JSON.stringify(textTransform)); - textTransform = JSON.parse(JSON.stringify(textTransform)); - if (type.textTransform) { - Object.keys(type.textTransform).forEach(key => { - textTransform[key] = type.textTransform[key]; - }); - } - - textTransform = old_textTransform; - - return ( - - - } - data={item} - eventContainer={eventContainer} - textTransform={textTransform} - /> - - ); - } - } - } - } - })} - - ); - } catch (e) { - //Nothing - } - - return ( - - An error occured while showing PseudoMarkdownCompiler message. - - ); -}; - -export default Compile; diff --git a/tdrive/frontend/src/app/components/twacode/pseudo-markdown-dictionary.tsx b/tdrive/frontend/src/app/components/twacode/pseudo-markdown-dictionary.tsx deleted file mode 100644 index 5af617f0..00000000 --- a/tdrive/frontend/src/app/components/twacode/pseudo-markdown-dictionary.tsx +++ /dev/null @@ -1,383 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { ReactNode } from 'react'; - -import Emojione from 'components/emojione/emojione'; -import HighlightedCode from 'components/highlighted-code/highlighted-code'; -import User from './blocks/user'; -import Chan from './blocks/chan'; -import File from 'components/drive/file'; -import InputWithClipBoard from 'components/input-with-clip-board/input-with-clip-board.jsx'; -import UserService from 'app/features/users/services/current-user-service'; -import Button from 'components/buttons/button.jsx'; -import Input from 'components/inputs/input.jsx'; - -export const DynamicComponent = ({ - type, - child, - data, - eventContainer, - textTransform, -}: { - type?: string; - child?: ReactNode; - data?: any; - eventContainer?: any; - textTransform?: any; -}) => { - if (type === 'text_block_parent') { - return {child}; - } - if (type === 'text') { - return {child}; - } - if (type === 'br') { - return ( - <> -
- {child} - - ); - } - if (type === 'emoji') { - return ; - } - if (type === 'user') { - const split = (data.content || '').split(':'); - const id = data.id || split[1]; - const username = split[0]; - return ( - <> - - - - ); - } - if (type === 'channel') { - const split = (data.content || '').split(':'); - const id = data.id || split[1]; - const name = split[0]; - return ( - <> - - - - ); - } - if (type === 'underline') return
{child}
; - if (type === 'strikethrough') return
{child}
; - if (type === 'bold') return
{child}
; - if (type === 'italic') return
{child}
; - if (type === 'mquote') return
{child}
; - if (type === 'quote') return
{child}
; - if (type === 'nop') { - return <>{child}; - } - - if (type === 'mcode') { - return ; - } - if (type === 'icode') { - return
{(data.content || '').trim()}
; - } - if (type === 'url') { - if (!data.url && data.url !== undefined) { - return {child}; - } - let url = setUrlProtocol(data.url || data.content); - if (data.user_identifier && UserService.getCurrentUser()) { - let separator = '?'; - if (url.indexOf('?') > 0) { - separator = '&'; - } - url += separator + 'tdrive_user=' + UserService.getCurrentUser().id; - } - return ( - // eslint-disable-next-line react/jsx-no-target-blank - - {child} - - ); - } - if (type === 'markdown_link') { - const linkData = data.content.split(']('); - const url = linkData[1] || ''; - - return ( - - {linkData[0]} - - ); - } - if (type === 'email') { - return ( - - {child} - - ); - } - if (type === 'system') { - return {child}; - } - - if (type === 'file') { - return ( -
- -
- ); - } - if (type === 'iframe') { - return ( -