[IMPROVE] Administration Pages root rewritten (#17209)

pull/17266/head
Tasso Evangelista 5 years ago committed by GitHub
parent 7a46c7d122
commit 5f9a14336f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      app/apps/client/orchestrator.js
  2. 15
      app/apps/client/routes.js
  3. 8
      app/authorization/client/route.js
  4. 4
      app/authorization/client/startup.js
  5. 2
      app/channel-settings/client/views/Multiselect.js
  6. 4
      app/chatpal-search/client/route.js
  7. 9
      app/cloud/client/index.js
  8. 5
      app/custom-sounds/client/admin/route.js
  9. 4
      app/custom-sounds/client/admin/startup.js
  10. 5
      app/emoji-custom/client/admin/route.js
  11. 4
      app/emoji-custom/client/admin/startup.js
  12. 7
      app/federation/client/admin/dashboard.js
  13. 12
      app/importer/client/index.js
  14. 14
      app/integrations/client/route.js
  15. 4
      app/integrations/client/startup.js
  16. 5
      app/invites/client/admin/route.js
  17. 4
      app/invites/client/admin/startup.js
  18. 9
      app/logger/client/viewLogs.js
  19. 4
      app/mail-messages/client/router.js
  20. 4
      app/mail-messages/client/startup.js
  21. 6
      app/oauth2-server-config/client/admin/route.js
  22. 4
      app/oauth2-server-config/client/admin/startup.js
  23. 5
      app/ui-admin/client/adminFlex.js
  24. 16
      app/ui-admin/client/components/AdministrationRouter.js
  25. 30
      app/ui-admin/client/components/PageSkeleton.js
  26. 2
      app/ui-admin/client/components/info/BuildEnvironmentSection.js
  27. 2
      app/ui-admin/client/components/info/BuildEnvironmentSection.stories.js
  28. 2
      app/ui-admin/client/components/info/CommitSection.js
  29. 0
      app/ui-admin/client/components/info/CommitSection.stories.js
  30. 0
      app/ui-admin/client/components/info/DescriptionList.js
  31. 2
      app/ui-admin/client/components/info/DescriptionList.stories.js
  32. 6
      app/ui-admin/client/components/info/InformationPage.js
  33. 2
      app/ui-admin/client/components/info/InformationPage.stories.js
  34. 9
      app/ui-admin/client/components/info/InformationRoute.js
  35. 2
      app/ui-admin/client/components/info/InstancesSection.js
  36. 2
      app/ui-admin/client/components/info/InstancesSection.stories.js
  37. 2
      app/ui-admin/client/components/info/RocketChatSection.js
  38. 2
      app/ui-admin/client/components/info/RocketChatSection.stories.js
  39. 2
      app/ui-admin/client/components/info/RuntimeEnvironmentSection.js
  40. 0
      app/ui-admin/client/components/info/RuntimeEnvironmentSection.stories.js
  41. 2
      app/ui-admin/client/components/info/UsageSection.js
  42. 0
      app/ui-admin/client/components/info/UsageSection.stories.js
  43. 0
      app/ui-admin/client/components/info/formatters.js
  44. 4
      app/ui-admin/client/components/settings/GroupPage.js
  45. 0
      app/ui-admin/client/components/settings/GroupPage.stories.js
  46. 0
      app/ui-admin/client/components/settings/GroupSelector.js
  47. 0
      app/ui-admin/client/components/settings/GroupSelector.stories.js
  48. 4
      app/ui-admin/client/components/settings/NotAuthorizedPage.js
  49. 0
      app/ui-admin/client/components/settings/NotAuthorizedPage.stories.js
  50. 2
      app/ui-admin/client/components/settings/ResetSettingButton.js
  51. 0
      app/ui-admin/client/components/settings/ResetSettingButton.stories.js
  52. 2
      app/ui-admin/client/components/settings/Section.js
  53. 0
      app/ui-admin/client/components/settings/Section.stories.js
  54. 6
      app/ui-admin/client/components/settings/Setting.js
  55. 0
      app/ui-admin/client/components/settings/Setting.stories.js
  56. 7
      app/ui-admin/client/components/settings/SettingsRoute.js
  57. 14
      app/ui-admin/client/components/settings/SettingsState.js
  58. 6
      app/ui-admin/client/components/settings/groups/AssetsGroupPage.js
  59. 0
      app/ui-admin/client/components/settings/groups/GenericGroupPage.js
  60. 10
      app/ui-admin/client/components/settings/groups/OAuthGroupPage.js
  61. 6
      app/ui-admin/client/components/settings/inputs/ActionSettingInput.js
  62. 0
      app/ui-admin/client/components/settings/inputs/ActionSettingInput.stories.js
  63. 0
      app/ui-admin/client/components/settings/inputs/AssetSettingInput.css
  64. 6
      app/ui-admin/client/components/settings/inputs/AssetSettingInput.js
  65. 0
      app/ui-admin/client/components/settings/inputs/AssetSettingInput.stories.js
  66. 0
      app/ui-admin/client/components/settings/inputs/BooleanSettingInput.js
  67. 0
      app/ui-admin/client/components/settings/inputs/BooleanSettingInput.stories.js
  68. 4
      app/ui-admin/client/components/settings/inputs/CodeSettingInput.js
  69. 0
      app/ui-admin/client/components/settings/inputs/CodeSettingInput.stories.js
  70. 2
      app/ui-admin/client/components/settings/inputs/ColorSettingInput.js
  71. 0
      app/ui-admin/client/components/settings/inputs/ColorSettingInput.stories.js
  72. 0
      app/ui-admin/client/components/settings/inputs/FontSettingInput.js
  73. 0
      app/ui-admin/client/components/settings/inputs/FontSettingInput.stories.js
  74. 0
      app/ui-admin/client/components/settings/inputs/GenericSettingInput.js
  75. 0
      app/ui-admin/client/components/settings/inputs/GenericSettingInput.stories.js
  76. 0
      app/ui-admin/client/components/settings/inputs/IntSettingInput.js
  77. 0
      app/ui-admin/client/components/settings/inputs/IntSettingInput.stories.js
  78. 2
      app/ui-admin/client/components/settings/inputs/LanguageSettingInput.js
  79. 0
      app/ui-admin/client/components/settings/inputs/LanguageSettingInput.stories.js
  80. 2
      app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.js
  81. 0
      app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.stories.js
  82. 0
      app/ui-admin/client/components/settings/inputs/PasswordSettingInput.js
  83. 0
      app/ui-admin/client/components/settings/inputs/PasswordSettingInput.stories.js
  84. 2
      app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.js
  85. 0
      app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.stories.js
  86. 0
      app/ui-admin/client/components/settings/inputs/RoomPickSettingInput.js
  87. 2
      app/ui-admin/client/components/settings/inputs/SelectSettingInput.js
  88. 0
      app/ui-admin/client/components/settings/inputs/SelectSettingInput.stories.js
  89. 0
      app/ui-admin/client/components/settings/inputs/StringSettingInput.js
  90. 0
      app/ui-admin/client/components/settings/inputs/StringSettingInput.stories.js
  91. 2
      app/ui-admin/client/hooks/useAdminSideNav.js
  92. 4
      app/ui-admin/client/index.js
  93. 53
      app/ui-admin/client/routes.js
  94. 10
      app/ui-admin/client/sidebarItems.js
  95. 1
      app/ui-utils/client/index.js
  96. 25
      app/ui-utils/client/lib/AdminBox.js
  97. 7
      app/user-status/client/admin/route.js
  98. 4
      app/user-status/client/admin/startup.js
  99. 2
      client/components/basic/Page.js
  100. 15
      client/reactAdapters.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -4,7 +4,7 @@ import toastr from 'toastr';
import { AppWebsocketReceiver } from './communication';
import { APIClient } from '../../utils';
import { AdminBox } from '../../ui-utils';
import { registerAdminSidebarItem } from '../../ui-admin/client';
import { CachedCollectionManager } from '../../ui-cached-collection';
import { hasAtLeastOnePermission } from '../../authorization';
import { handleI18nResources } from './i18n';
@ -51,14 +51,14 @@ class AppClientOrchestrator {
getAppClientManager = () => this._manager;
registerAdminMenuItems = () => {
AdminBox.addOption({
registerAdminSidebarItem({
icon: 'cube',
href: 'apps',
i18nLabel: 'Apps',
permissionGranted: () => hasAtLeastOnePermission(['manage-apps']),
});
AdminBox.addOption({
registerAdminSidebarItem({
icon: 'cube',
href: 'marketplace',
i18nLabel: 'Marketplace',

@ -1,9 +1,10 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { registerAdminRoute } from '../../ui-admin/client';
import { Apps } from './orchestrator';
FlowRouter.route('/admin/apps/what-is-it', {
registerAdminRoute('/apps/what-is-it', {
name: 'apps-what-is-it',
action: async () => {
// TODO: render loading indicator
@ -26,32 +27,32 @@ const createAppsRouteAction = (centerTemplate) => async () => {
}
};
FlowRouter.route('/admin/apps', {
registerAdminRoute('/apps', {
name: 'apps',
action: createAppsRouteAction('apps'),
});
FlowRouter.route('/admin/apps/install', {
registerAdminRoute('/apps/install', {
name: 'app-install',
action: createAppsRouteAction('appInstall'),
});
FlowRouter.route('/admin/apps/:appId', {
registerAdminRoute('/apps/:appId', {
name: 'app-manage',
action: createAppsRouteAction('appManage'),
});
FlowRouter.route('/admin/apps/:appId/logs', {
registerAdminRoute('/apps/:appId/logs', {
name: 'app-logs',
action: createAppsRouteAction('appLogs'),
});
FlowRouter.route('/admin/marketplace', {
registerAdminRoute('/marketplace', {
name: 'marketplace',
action: createAppsRouteAction('marketplace'),
});
FlowRouter.route('/admin/marketplace/:appId', {
registerAdminRoute('/marketplace/:appId', {
name: 'marketplace-app',
action: createAppsRouteAction('appManage'),
});

@ -1,9 +1,9 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { registerAdminRoute } from '../../ui-admin/client';
import { t } from '../../utils/client';
FlowRouter.route('/admin/permissions', {
registerAdminRoute('/permissions', {
name: 'admin-permissions',
async action(/* params*/) {
await import('./views');
@ -14,7 +14,7 @@ FlowRouter.route('/admin/permissions', {
},
});
FlowRouter.route('/admin/permissions/:name?/edit', {
registerAdminRoute('/permissions/:name?/edit', {
name: 'admin-permissions-edit',
async action(/* params*/) {
await import('./views');
@ -26,7 +26,7 @@ FlowRouter.route('/admin/permissions/:name?/edit', {
},
});
FlowRouter.route('/admin/permissions/new', {
registerAdminRoute('/permissions/new', {
name: 'admin-permissions-new',
async action(/* params*/) {
await import('./views');

@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import { hasAtLeastOnePermission } from './hasPermission';
import { registerAdminSidebarItem } from '../../ui-admin/client';
import { CachedCollectionManager } from '../../ui-cached-collection';
import { AdminBox } from '../../ui-utils/client/lib/AdminBox';
import { APIClient } from '../../utils/client';
import { Roles } from '../../models/client';
import { rolesStreamer } from './lib/streamer';
@ -14,7 +14,7 @@ Meteor.startup(() => {
roles.forEach((role) => Roles.insert(role));
});
AdminBox.addOption({
registerAdminSidebarItem({
href: 'admin-permissions',
i18nLabel: 'Permissions',
icon: 'lock',

@ -4,7 +4,7 @@ import { createTemplateForComponent } from '../../../../client/reactAdapters';
createTemplateForComponent(
'Multiselect',
() => import('../../../../client/components/admin/settings/inputs/MultiSelectSettingInput'),
() => import('../../../ui-admin/client/components/settings/inputs/MultiSelectSettingInput'),
{
// eslint-disable-next-line new-cap
renderContainerView: () => HTML.DIV({ class: 'rc-multiselect', style: 'display: flex;' }),

@ -1,9 +1,9 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { registerAdminRoute } from '../../ui-admin/client';
import { t } from '../../utils';
FlowRouter.route('/admin/chatpal', {
registerAdminRoute('/chatpal', {
name: 'chatpal-admin',
action() {
return BlazeLayout.render('main', {

@ -3,12 +3,11 @@ import './admin/cloud';
import './admin/cloudRegisterManually';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { AdminBox } from '../../ui-utils';
import { registerAdminRoute, registerAdminSidebarItem } from '../../ui-admin/client';
import { hasAtLeastOnePermission } from '../../authorization';
FlowRouter.route('/admin/cloud', {
registerAdminRoute('/cloud', {
name: 'cloud-config',
async action() {
await import('./admin');
@ -16,7 +15,7 @@ FlowRouter.route('/admin/cloud', {
},
});
FlowRouter.route('/admin/cloud/oauth-callback', {
registerAdminRoute('/cloud/oauth-callback', {
name: 'cloud-oauth-callback',
async action() {
await import('./admin');
@ -24,7 +23,7 @@ FlowRouter.route('/admin/cloud/oauth-callback', {
},
});
AdminBox.addOption({
registerAdminSidebarItem({
icon: 'cloud-plus',
href: 'admin/cloud',
i18nLabel: 'Connectivity_Services',

@ -1,7 +1,8 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
FlowRouter.route('/admin/custom-sounds', {
import { registerAdminRoute } from '../../../ui-admin/client';
registerAdminRoute('/custom-sounds', {
name: 'custom-sounds',
async action(/* params*/) {
await import('./views');

@ -1,7 +1,7 @@
import { AdminBox } from '../../../ui-utils';
import { hasAtLeastOnePermission } from '../../../authorization';
import { registerAdminSidebarItem } from '../../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'custom-sounds',
i18nLabel: 'Custom_Sounds',
icon: 'volume',

@ -1,7 +1,8 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
FlowRouter.route('/admin/emoji-custom', {
import { registerAdminRoute } from '../../../ui-admin/client';
registerAdminRoute('/emoji-custom', {
name: 'emoji-custom',
async action(/* params*/) {
await import('./views');

@ -1,7 +1,7 @@
import { AdminBox } from '../../../ui-utils';
import { hasPermission } from '../../../authorization';
import { registerAdminSidebarItem } from '../../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'emoji-custom',
i18nLabel: 'Custom_Emoji',
icon: 'emoji',

@ -3,10 +3,9 @@ import { Tracker } from 'meteor/tracker';
import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { AdminBox } from '../../../ui-utils';
import { hasRole } from '../../../authorization';
import { registerAdminRoute, registerAdminSidebarItem } from '../../../ui-admin/client';
import './dashboard.html';
import './dashboard.css';
@ -69,14 +68,14 @@ Template.dashboard.onRendered(() => {
// Route setup
FlowRouter.route('/admin/federation-dashboard', {
registerAdminRoute('/federation-dashboard', {
name: 'federation-dashboard',
action() {
BlazeLayout.render('main', { center: 'dashboard', old: true });
},
});
AdminBox.addOption({
registerAdminSidebarItem({
icon: 'discover',
href: 'admin/federation-dashboard',
i18nLabel: 'Federation Dashboard',

@ -1,12 +1,12 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { ImporterWebsocketReceiver } from './ImporterWebsocketReceiver';
import { registerAdminRoute } from '../../ui-admin/client';
import { Importers } from '../lib/Importers';
import { ImporterInfo } from '../lib/ImporterInfo';
import { ProgressStep } from '../lib/ImporterProgressStep';
import { ImporterWebsocketReceiver } from './ImporterWebsocketReceiver';
FlowRouter.route('/admin/import', {
registerAdminRoute('/import', {
name: 'admin-import',
async action() {
await import('./admin/adminImport');
@ -14,7 +14,7 @@ FlowRouter.route('/admin/import', {
},
});
FlowRouter.route('/admin/import/new', {
registerAdminRoute('/import/new', {
name: 'admin-import-new',
async action() {
await import('./admin/adminImportNew');
@ -22,7 +22,7 @@ FlowRouter.route('/admin/import/new', {
},
});
FlowRouter.route('/admin/import/prepare', {
registerAdminRoute('/import/prepare', {
name: 'admin-import-prepare',
async action() {
await import('./admin/adminImportPrepare');
@ -30,7 +30,7 @@ FlowRouter.route('/admin/import/prepare', {
},
});
FlowRouter.route('/admin/import/progress', {
registerAdminRoute('/import/progress', {
name: 'admin-import-progress',
async action() {
await import('./admin/adminImportProgress');

@ -1,11 +1,11 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { registerAdminRoute } from '../../ui-admin/client';
import { t } from '../../utils';
const dynamic = () => import('./views');
FlowRouter.route('/admin/integrations', {
registerAdminRoute('/integrations', {
name: 'admin-integrations',
async action() {
await dynamic();
@ -16,7 +16,7 @@ FlowRouter.route('/admin/integrations', {
},
});
FlowRouter.route('/admin/integrations/new', {
registerAdminRoute('/integrations/new', {
name: 'admin-integrations-new',
async action() {
await dynamic();
@ -27,7 +27,7 @@ FlowRouter.route('/admin/integrations/new', {
},
});
FlowRouter.route('/admin/integrations/incoming/:id?', {
registerAdminRoute('/integrations/incoming/:id?', {
name: 'admin-integrations-incoming',
async action(params) {
await dynamic();
@ -40,7 +40,7 @@ FlowRouter.route('/admin/integrations/incoming/:id?', {
},
});
FlowRouter.route('/admin/integrations/outgoing/:id?', {
registerAdminRoute('/integrations/outgoing/:id?', {
name: 'admin-integrations-outgoing',
async action(params) {
await dynamic();
@ -52,7 +52,7 @@ FlowRouter.route('/admin/integrations/outgoing/:id?', {
},
});
FlowRouter.route('/admin/integrations/outgoing/:id?/history', {
registerAdminRoute('/integrations/outgoing/:id?/history', {
name: 'admin-integrations-outgoing-history',
async action(params) {
await dynamic();
@ -64,7 +64,7 @@ FlowRouter.route('/admin/integrations/outgoing/:id?/history', {
},
});
FlowRouter.route('/admin/integrations/additional/zapier', {
registerAdminRoute('/integrations/additional/zapier', {
name: 'admin-integrations-additional-zapier',
async action() {
await dynamic();

@ -1,7 +1,7 @@
import { AdminBox } from '../../ui-utils';
import { hasAtLeastOnePermission } from '../../authorization';
import { registerAdminSidebarItem } from '../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'admin-integrations',
i18nLabel: 'Integrations',
icon: 'code',

@ -1,7 +1,8 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
FlowRouter.route('/admin/invites', {
import { registerAdminRoute } from '../../../ui-admin/client';
registerAdminRoute('/invites', {
name: 'invites',
async action(/* params */) {
await import('./adminInvites');

@ -1,7 +1,7 @@
import { AdminBox } from '../../../ui-utils';
import { hasAtLeastOnePermission } from '../../../authorization';
import { registerAdminSidebarItem } from '../../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'invites',
i18nLabel: 'Invites',
icon: 'user-plus',

@ -1,16 +1,15 @@
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { AdminBox } from '../../ui-utils';
import { hasAllPermission } from '../../authorization';
import { registerAdminRoute, registerAdminSidebarItem } from '../../ui-admin/client';
import { t } from '../../utils';
export const stdout = new Mongo.Collection(null);
Meteor.startup(function() {
AdminBox.addOption({
registerAdminSidebarItem({
href: 'admin-view-logs',
i18nLabel: 'View_Logs',
icon: 'post',
@ -20,7 +19,7 @@ Meteor.startup(function() {
});
});
FlowRouter.route('/admin/view-logs', {
registerAdminRoute('/view-logs', {
name: 'admin-view-logs',
async action() {
await import('./views/viewLogs');

@ -2,7 +2,9 @@ import { Meteor } from 'meteor/meteor';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
FlowRouter.route('/admin/mailer', {
import { registerAdminRoute } from '../../ui-admin/client';
registerAdminRoute('/mailer', {
name: 'admin-mailer',
async action() {
await import('./views');

@ -1,7 +1,7 @@
import { AdminBox } from '../../ui-utils';
import { hasAllPermission } from '../../authorization';
import { registerAdminSidebarItem } from '../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'admin-mailer',
i18nLabel: 'Mailer',
icon: 'mail',

@ -1,9 +1,9 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { registerAdminRoute } from '../../../ui-admin/client';
import { t } from '../../../utils';
FlowRouter.route('/admin/oauth-apps', {
registerAdminRoute('/oauth-apps', {
name: 'admin-oauth-apps',
async action() {
await import('./views');
@ -14,7 +14,7 @@ FlowRouter.route('/admin/oauth-apps', {
},
});
FlowRouter.route('/admin/oauth-app/:id?', {
registerAdminRoute('/oauth-app/:id?', {
name: 'admin-oauth-app',
async action(params) {
await import('./views');

@ -1,7 +1,7 @@
import { AdminBox } from '../../../ui-utils';
import { hasAllPermission } from '../../../authorization';
import { registerAdminSidebarItem } from '../../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'admin-oauth-apps',
i18nLabel: 'OAuth Apps',
icon: 'discover',

@ -5,10 +5,11 @@ import { Template } from 'meteor/templating';
import { TAPi18n } from 'meteor/rocketchat:tap-i18n';
import { settings } from '../../settings';
import { menu, SideNav, AdminBox, Layout } from '../../ui-utils/client';
import { menu, SideNav, Layout } from '../../ui-utils/client';
import { t } from '../../utils';
import { PrivateSettingsCachedCollection } from './SettingsCachedCollection';
import { hasAtLeastOnePermission } from '../../authorization/client';
import { getSidebarItems } from './sidebarItems';
Template.adminFlex.onCreated(function() {
this.isEmbedded = Layout.isEmbedded();
@ -65,7 +66,7 @@ Template.adminFlex.helpers({
},
label,
adminBoxOptions() {
return AdminBox.getOptions();
return getSidebarItems();
},
menuItem(name, icon, section, group) {
return {

@ -0,0 +1,16 @@
import React, { lazy, useMemo, Suspense } from 'react';
import { useAdminSideNav } from '../hooks/useAdminSideNav';
import PageSkeleton from './PageSkeleton';
function AdministrationRouter({ lazyRouteComponent }) {
useAdminSideNav();
const LazyRouteComponent = useMemo(() => lazy(lazyRouteComponent), [lazyRouteComponent]);
return <Suspense fallback={<PageSkeleton />}>
<LazyRouteComponent />
</Suspense>;
}
export default AdministrationRouter;

@ -0,0 +1,30 @@
import { Box, Button, ButtonGroup, Skeleton } from '@rocket.chat/fuselage';
import React from 'react';
import { Page } from '../../../../client/components/basic/Page';
function PageSkeleton() {
return <Page>
<Page.Header title={<Skeleton width='20rem' />}>
<ButtonGroup>
<Button
children={<Skeleton width='5rem' />}
disabled
primary
/>
</ButtonGroup>
</Page.Header>
<Page.Content>
<Box mb='0' mi='auto' width='full' maxWidth='590px'>
<Box is='p' textColor='hint' textStyle='p1'>
<Skeleton />
<Skeleton />
<Skeleton width='75%' />
</Box>
</Box>
</Page.Content>
</Page>;
}
export default PageSkeleton;

@ -1,7 +1,7 @@
import { Subtitle } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { DescriptionList } from './DescriptionList';
import { formatDate } from './formatters';

@ -1,6 +1,6 @@
import React from 'react';
import { dummyDate } from '../../../../.storybook/helpers';
import { dummyDate } from '../../../../../.storybook/helpers';
import { BuildEnvironmentSection } from './BuildEnvironmentSection';
export default {

@ -1,7 +1,7 @@
import { Subtitle } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { DescriptionList } from './DescriptionList';
export function CommitSection({ info }) {

@ -1,7 +1,7 @@
import React from 'react';
import { DescriptionList } from './DescriptionList';
import { Page } from '../../basic/Page';
import { Page } from '../../../../../client/components/basic/Page';
export default {
title: 'admin/info/DescriptionList',

@ -1,9 +1,9 @@
import { Button, ButtonGroup, Callout, Icon, Margins } from '@rocket.chat/fuselage';
import React from 'react';
import { Link } from '../../basic/Link';
import { Page } from '../../basic/Page';
import { useTranslation } from '../../../contexts/TranslationContext';
import { Link } from '../../../../../client/components/basic/Link';
import { Page } from '../../../../../client/components/basic/Page';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { RocketChatSection } from './RocketChatSection';
import { CommitSection } from './CommitSection';
import { RuntimeEnvironmentSection } from './RuntimeEnvironmentSection';

@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions';
import { boolean, object } from '@storybook/addon-knobs/react';
import React from 'react';
import { dummyDate } from '../../../../.storybook/helpers';
import { dummyDate } from '../../../../../.storybook/helpers';
import { InformationPage } from './InformationPage';
export default {

@ -1,14 +1,11 @@
import React, { useState, useEffect } from 'react';
import { usePermission } from '../../../contexts/AuthorizationContext';
import { useMethod, useServerInformation, useEndpoint } from '../../../contexts/ServerContext';
import { useAdminSideNav } from '../../../hooks/useAdminSideNav';
import { usePermission } from '../../../../../client/contexts/AuthorizationContext';
import { useMethod, useServerInformation, useEndpoint } from '../../../../../client/contexts/ServerContext';
import { downloadJsonAsAFile } from '../../../../../client/helpers/download';
import { InformationPage } from './InformationPage';
import { downloadJsonAsAFile } from '../../../helpers/download';
export function InformationRoute() {
useAdminSideNav();
const canViewStatistics = usePermission('view-statistics');
const [isLoading, setLoading] = useState(true);

@ -1,7 +1,7 @@
import { Subtitle } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { DescriptionList } from './DescriptionList';
import { formatDate } from './formatters';

@ -1,6 +1,6 @@
import React from 'react';
import { dummyDate } from '../../../../.storybook/helpers';
import { dummyDate } from '../../../../../.storybook/helpers';
import { InstancesSection } from './InstancesSection';
export default {

@ -1,7 +1,7 @@
import { Skeleton, Subtitle } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { formatDate, formatHumanReadableTime } from './formatters';
import { DescriptionList } from './DescriptionList';

@ -1,6 +1,6 @@
import React from 'react';
import { dummyDate } from '../../../../.storybook/helpers';
import { dummyDate } from '../../../../../.storybook/helpers';
import { RocketChatSection } from './RocketChatSection';
export default {

@ -1,7 +1,7 @@
import { Skeleton, Subtitle } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { DescriptionList } from './DescriptionList';
import { formatMemorySize, formatHumanReadableTime, formatCPULoad } from './formatters';

@ -1,7 +1,7 @@
import { Subtitle, Skeleton } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { DescriptionList } from './DescriptionList';
import { formatMemorySize } from './formatters';

@ -1,9 +1,9 @@
import { Accordion, Box, Button, ButtonGroup, Skeleton } from '@rocket.chat/fuselage';
import React, { useMemo } from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { Section } from './Section';
import { Page } from '../../basic/Page';
import { Page } from '../../../../../client/components/basic/Page';
export function GroupPage({ children, headerButtons, save, cancel, _id, i18nLabel, i18nDescription, changed }) {
const t = useTranslation();

@ -1,8 +1,8 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { Page } from '../../basic/Page';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { Page } from '../../../../../client/components/basic/Page';
export function NotAuthorizedPage() {
const t = useTranslation();

@ -1,7 +1,7 @@
import { Button, Icon } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
export function ResetSettingButton(props) {
const t = useTranslation();

@ -1,7 +1,7 @@
import { Accordion, Box, Button, FieldGroup, Skeleton } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { Setting } from './Setting';
import { useSection, useSectionChangedState } from './SettingsState';

@ -1,9 +1,9 @@
import { Callout, Field, Flex, InputBox, Margins, Skeleton } from '@rocket.chat/fuselage';
import React, { memo, useEffect, useMemo, useState, useCallback } from 'react';
import { MarkdownText } from '../../basic/MarkdownText';
import { RawText } from '../../basic/RawText';
import { useTranslation } from '../../../contexts/TranslationContext';
import { MarkdownText } from '../../../../../client/components/basic/MarkdownText';
import { RawText } from '../../../../../client/components/basic/RawText';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import { GenericSettingInput } from './inputs/GenericSettingInput';
import { BooleanSettingInput } from './inputs/BooleanSettingInput';
import { StringSettingInput } from './inputs/StringSettingInput';

@ -1,15 +1,12 @@
import React from 'react';
import { useAtLeastOnePermission } from '../../../contexts/AuthorizationContext';
import { useAdminSideNav } from '../../../hooks/useAdminSideNav';
import { useAtLeastOnePermission } from '../../../../../client/contexts/AuthorizationContext';
import { useRouteParameter } from '../../../../../client/contexts/RouterContext';
import { GroupSelector } from './GroupSelector';
import { NotAuthorizedPage } from './NotAuthorizedPage';
import { SettingsState } from './SettingsState';
import { useRouteParameter } from '../../../contexts/RouterContext';
export function SettingsRoute() {
useAdminSideNav();
const hasPermission = useAtLeastOnePermission([
'view-privileged-setting',
'edit-privileged-setting',

@ -3,13 +3,13 @@ import { Mongo } from 'meteor/mongo';
import { Tracker } from 'meteor/tracker';
import React, { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from 'react';
import { PrivateSettingsCachedCollection } from '../../../../app/ui-admin/client/SettingsCachedCollection';
import { useBatchSettingsDispatch } from '../../../contexts/SettingsContext';
import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext';
import { useEventCallback } from '../../../hooks/useEventCallback';
import { useReactiveValue } from '../../../hooks/useReactiveValue';
import { useTranslation, useLoadLanguage } from '../../../contexts/TranslationContext';
import { useUser } from '../../../contexts/UserContext';
import { PrivateSettingsCachedCollection } from '../../SettingsCachedCollection';
import { useBatchSettingsDispatch } from '../../../../../client/contexts/SettingsContext';
import { useToastMessageDispatch } from '../../../../../client/contexts/ToastMessagesContext';
import { useEventCallback } from '../../../../../client/hooks/useEventCallback';
import { useReactiveValue } from '../../../../../client/hooks/useReactiveValue';
import { useTranslation, useLoadLanguage } from '../../../../../client/contexts/TranslationContext';
import { useUser } from '../../../../../client/contexts/UserContext';
const SettingsContext = createContext({});

@ -1,9 +1,9 @@
import { Button } from '@rocket.chat/fuselage';
import React from 'react';
import { useMethod } from '../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useMethod } from '../../../../../../client/contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { GroupPage } from '../GroupPage';
import { Section } from '../Section';

@ -2,11 +2,11 @@ import { Button } from '@rocket.chat/fuselage';
import React from 'react';
import s from 'underscore.string';
import { RawText } from '../../../basic/RawText';
import { useAbsoluteUrl, useMethod } from '../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useModal } from '../../../../hooks/useModal';
import { RawText } from '../../../../../../client/components/basic/RawText';
import { useAbsoluteUrl, useMethod } from '../../../../../../client/contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { useModal } from '../../../../../../client/hooks/useModal';
import { GroupPage } from '../GroupPage';
import { Section } from '../Section';

@ -1,9 +1,9 @@
import { Button, Field } from '@rocket.chat/fuselage';
import React from 'react';
import { useMethod } from '../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useMethod } from '../../../../../../client/contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
export function ActionSettingInput({
_id,

@ -2,9 +2,9 @@ import { Button, Field, Icon } from '@rocket.chat/fuselage';
import { Random } from 'meteor/random';
import React from 'react';
import { useMethod } from '../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useMethod } from '../../../../../../client/contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import './AssetSettingInput.css';
export function AssetSettingInput({

@ -2,7 +2,7 @@ import { Box, Button, Field, Flex } from '@rocket.chat/fuselage';
import { useToggle } from '@rocket.chat/fuselage-hooks';
import React, { useEffect, useRef, useState } from 'react';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { ResetSettingButton } from '../ResetSettingButton';
function CodeMirror({
@ -31,7 +31,7 @@ function CodeMirror({
const setupCodeMirror = async () => {
const CodeMirror = await import('codemirror/lib/codemirror.js');
await import('../../../../../app/ui/client/lib/codeMirror/codeMirror');
await import('../../../../../ui/client/lib/codeMirror/codeMirror');
await import('codemirror/lib/codemirror.css');
const { current: textarea } = ref;

@ -9,7 +9,7 @@ import {
} from '@rocket.chat/fuselage';
import React, { useCallback } from 'react';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { ResetSettingButton } from '../ResetSettingButton';
export function ColorSettingInput({

@ -1,7 +1,7 @@
import { Box, Field, Flex, Select } from '@rocket.chat/fuselage';
import React from 'react';
import { useLanguages } from '../../../../contexts/TranslationContext';
import { useLanguages } from '../../../../../../client/contexts/TranslationContext';
import { ResetSettingButton } from '../ResetSettingButton';
export function LanguageSettingInput({

@ -1,7 +1,7 @@
import { Field, Flex, Box, MultiSelectFiltered, MultiSelect } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { ResetSettingButton } from '../ResetSettingButton';
export function MultiSelectSettingInput({

@ -1,7 +1,7 @@
import { Box, Field, Flex, UrlInput } from '@rocket.chat/fuselage';
import React from 'react';
import { useAbsoluteUrl } from '../../../../contexts/ServerContext';
import { useAbsoluteUrl } from '../../../../../../client/contexts/ServerContext';
import { ResetSettingButton } from '../ResetSettingButton';
export function RelativeUrlSettingInput({

@ -6,7 +6,7 @@ import {
} from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../../contexts/TranslationContext';
import { useTranslation } from '../../../../../../client/contexts/TranslationContext';
import { ResetSettingButton } from '../ResetSettingButton';
export function SelectSettingInput({

@ -1,6 +1,6 @@
import { useEffect } from 'react';
import { SideNav } from '../../app/ui-utils/client/lib/SideNav';
import { SideNav } from '../../../ui-utils/client/lib/SideNav';
export const useAdminSideNav = () => {
useEffect(() => {

@ -1,3 +1,5 @@
import './adminFlex.html';
import './adminFlex';
import './routes';
export { registerAdminRoute } from './routes';
export { registerAdminSidebarItem } from './sidebarItems';

@ -1,19 +1,62 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
import { Meteor } from 'meteor/meteor';
FlowRouter.route('/admin/users', {
import { renderRouteComponent } from '../../../client/reactAdapters';
const routeGroup = FlowRouter.group({
name: 'admin',
prefix: '/admin',
});
export const registerAdminRoute = (path, { lazyRouteComponent, action, ...options } = {}) => {
routeGroup.route(path, {
...options,
action: (params, queryParams) => {
if (action) {
action(params, queryParams);
return;
}
renderRouteComponent(() => import('./components/AdministrationRouter'), {
template: 'main',
region: 'center',
propsFn: () => ({ lazyRouteComponent, ...options, params, queryParams }),
});
},
});
};
registerAdminRoute('/', {
triggersEnter: [(context, redirect) => {
redirect('admin-info');
}],
});
registerAdminRoute('/info', {
name: 'admin-info',
lazyRouteComponent: () => import('./components/info/InformationRoute'),
});
registerAdminRoute('/users', {
name: 'admin-users',
async action() {
action: async () => {
await import('./users/views');
BlazeLayout.render('main', { center: 'adminUsers' });
},
});
FlowRouter.route('/admin/rooms', {
registerAdminRoute('/rooms', {
name: 'admin-rooms',
async action() {
action: async () => {
await import('./rooms/views');
BlazeLayout.render('main', { center: 'adminRooms' });
},
});
Meteor.startup(() => {
registerAdminRoute('/:group+', {
name: 'admin',
lazyRouteComponent: () => import('./components/settings/SettingsRoute'),
});
});

@ -0,0 +1,10 @@
import { ReactiveVar } from 'meteor/reactive-var';
import { Tracker } from 'meteor/tracker';
const items = new ReactiveVar([]);
export const registerAdminSidebarItem = (itemOptions) => {
Tracker.nonreactive(() => items.set([...items.get(), itemOptions]));
};
export const getSidebarItems = () => items.get().filter((option) => !option.permissionGranted || option.permissionGranted());

@ -1,4 +1,3 @@
export { AdminBox } from './lib/AdminBox';
export { modal } from './lib/modal';
export { SideNav } from './lib/SideNav';
export { AccountBox } from './lib/AccountBox';

@ -1,25 +0,0 @@
import { ReactiveVar } from 'meteor/reactive-var';
import { Tracker } from 'meteor/tracker';
import _ from 'underscore';
export const AdminBox = new class {
constructor() {
this.options = new ReactiveVar([]);
}
addOption(option) {
return Tracker.nonreactive(() => {
const actual = this.options.get();
actual.push(option);
return this.options.set(actual);
});
}
getOptions() {
return _.filter(this.options.get(), function(option) {
if ((option.permissionGranted == null) || option.permissionGranted()) {
return true;
}
});
}
}();

@ -1,9 +1,10 @@
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
FlowRouter.route('/admin/user-status-custom', {
import { registerAdminRoute } from '../../../ui-admin/client';
registerAdminRoute('/user-status-custom', {
name: 'user-status-custom',
async action(/* params */) {
async action() {
await import('./views');
BlazeLayout.render('main', { center: 'adminUserStatus' });
},

@ -1,7 +1,7 @@
import { AdminBox } from '../../../ui-utils';
import { hasAtLeastOnePermission } from '../../../authorization';
import { registerAdminSidebarItem } from '../../../ui-admin/client';
AdminBox.addOption({
registerAdminSidebarItem({
href: 'user-status-custom',
i18nLabel: 'Custom_User_Status',
icon: 'user',

@ -8,7 +8,7 @@ export function Page(props) {
const [border, setBorder] = useState(false);
return <PageContext.Provider value={[border, setBorder]}>
<Flex.Container direction='column'>
<Box is='section' style={useMemo(() => ({ height: '100%' }), [])} {...props} />
<Box is='section' style={useMemo(() => ({ overflow: 'hidden', flex: '1 1 auto', height: '100%' }), [])} {...props} />
</Flex.Container>
</PageContext.Provider>;
}

@ -129,7 +129,7 @@ export const createTemplateForComponent = (
export const renderRouteComponent = (importFn, {
template,
region,
renderContainerView = () => HTML.DIV(), // eslint-disable-line new-cap
propsFn = () => ({}),
} = {}) => {
const routeName = FlowRouter.getRouteName();
@ -147,7 +147,7 @@ export const renderRouteComponent = (importFn, {
if (!template || !region) {
BlazeLayout.reset();
const element = await createLazyElement(importFn);
const element = await createLazyElement(importFn, propsFn);
if (routeName !== FlowRouter.getRouteName()) {
return;
@ -158,15 +158,12 @@ export const renderRouteComponent = (importFn, {
}
if (!Template[routeName]) {
const blazeTemplate = new Blaze.Template(routeName, renderContainerView);
const blazeTemplate = new Blaze.Template(routeName, () => HTML.DIV()); // eslint-disable-line new-cap
blazeTemplate.onRendered(async function() {
const props = new ReactiveVar(this.data);
this.autorun(() => {
props.set(Template.currentData());
});
const portal = await createLazyPortal(importFn, () => props.get(), this.firstNode);
const node = this.firstNode.parentElement;
this.firstNode.remove();
const portal = await createLazyPortal(importFn, propsFn, node);
if (routeName !== FlowRouter.getRouteName()) {
return;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save