opf/openproject

View on GitHub
frontend/src/app/shared/shared.module.ts

Summary

Maintainability
A
0 mins
Test Coverage
// -- copyright
// OpenProject is an open source project management software.
// Copyright (C) 2012-2024 the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
//
// See COPYRIGHT and LICENSE files for more details.
//++
import { FormsModule } from '@angular/forms';
import {
  Injector,
  NgModule,
} from '@angular/core';
import { A11yModule } from '@angular/cdk/a11y';
import { UIRouterGlobals } from '@uirouter/core';
import { NgSelectModule } from '@ng-select/ng-select';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { PortalModule } from '@angular/cdk/portal';
import { CommonModule } from '@angular/common';
import { NgOptionHighlightModule } from '@ng-select/ng-option-highlight';
import { DragulaModule } from 'ng2-dragula';
import { DynamicModule } from 'ng-dynamic-component';
import { UIRouterModule } from '@uirouter/angular';
import { OpSpotModule } from 'core-app/spot/spot.module';
import { CurrentUserModule } from 'core-app/core/current-user/current-user.module';
import { OpenprojectAutocompleterModule } from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';
import { IconModule } from 'core-app/shared/components/icon/icon.module';
import { AttributeHelpTextModule } from 'core-app/shared/components/attribute-help-texts/attribute-help-text.module';
import { IconTriggeredContextMenuComponent } from 'core-app/shared/components/op-context-menu/icon-triggered-context-menu/icon-triggered-context-menu.component';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import { SortHeaderDirective } from 'core-app/features/work-packages/components/wp-table/sort-header/sort-header.directive';
import { ZenModeButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/zen-mode-toggle-button/zen-mode-toggle-button.component';
import { OPContextMenuComponent } from 'core-app/shared/components/op-context-menu/op-context-menu.component';
import { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';
import { FocusModule } from 'core-app/shared/directives/focus/focus.module';
import { EnterpriseBannerComponent } from 'core-app/shared/components/enterprise-banner/enterprise-banner.component';
import { EnterprisePageComponent } from 'core-app/shared/components/enterprise-page/enterprise-page.component';
import { FreeTrialButtonComponent } from 'core-app/features/enterprise/free-trial-button/free-trial-button.component';
import { HomescreenNewFeaturesBlockComponent } from 'core-app/features/homescreen/blocks/new-features.component';
import { TablePaginationComponent } from 'core-app/shared/components/table-pagination/table-pagination.component';
import { HookService } from 'core-app/features/plugins/hook-service';
import { ViewSelectComponent } from 'core-app/shared/components/op-view-select/op-view-select.component';
import { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';
import {
  highlightColSelector,
  OpHighlightColDirective,
} from './directives/highlight-col/highlight-col.directive';
import { CopyToClipboardService } from './components/copy-to-clipboard/copy-to-clipboard.service';
import { CopyToClipboardComponent } from './components/copy-to-clipboard/copy-to-clipboard.component';
import { OpDateTimeComponent } from './components/date/op-date-time.component';
import { ToastComponent } from './components/toaster/toast.component';

// Old datepickers
import { OpMultiDatePickerComponent } from 'core-app/shared/components/datepicker/multi-date-picker/multi-date-picker.component';

import { ToastsContainerComponent } from './components/toaster/toasts-container.component';
import { UploadProgressComponent } from './components/toaster/upload-progress.component';
import { ResizerComponent } from './components/resizer/resizer.component';
import { CollapsibleSectionComponent } from './components/collapsible-section/collapsible-section.component';
import { NoResultsComponent } from './components/no-results/no-results.component';
import { EditableToolbarTitleComponent } from './components/editable-toolbar-title/editable-toolbar-title.component';
import { PersistentToggleComponent } from './components/persistent-toggle/persistent-toggle.component';
import { AddSectionDropdownComponent } from './components/hide-section/add-section-dropdown/add-section-dropdown.component';
import { HideSectionLinkComponent } from './components/hide-section/hide-section-link/hide-section-link.component';
import { RemoteFieldUpdaterComponent } from './components/remote-field-updater/remote-field-updater.component';
import { ShowSectionDropdownComponent } from './components/hide-section/show-section-dropdown.component';
import { DynamicBootstrapModule } from './components/dynamic-bootstrap/dynamic-bootstrap.module';
import { OpOptionListComponent } from './components/option-list/option-list.component';
import { OpSidemenuComponent } from './components/sidemenu/sidemenu.component';
import { OpProjectIncludeComponent } from './components/project-include/project-include.component';
import { OpProjectIncludeListComponent } from './components/project-include/list/project-include-list.component';
import { OpLoadingProjectListComponent } from './components/searchable-project-list/loading-project-list.component';
import { OpNonWorkingDaysListComponent } from './components/op-non-working-days-list/op-non-working-days-list.component';
import { ViewsResourceService } from 'core-app/core/state/views/views.service';
import { OpenprojectContentLoaderModule } from 'core-app/shared/components/op-content-loader/openproject-content-loader.module';
import { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';
import { FullCalendarModule } from '@fullcalendar/angular';
import { OpDatePickerModule } from 'core-app/shared/components/datepicker/datepicker.module';
import { ShareUpsaleComponent } from 'core-app/features/enterprise/share-upsale/share-upsale.component';

export function bootstrapModule(injector:Injector):void {
  // Ensure error reporter is run
  const currentProject = injector.get(CurrentProjectService);
  const uiRouterGlobals = injector.get(UIRouterGlobals);

  (window.ErrorReporter).addHook(() => ({
    project: currentProject.identifier || 'global',
    'router state': uiRouterGlobals.current.name || 'unknown',
  }));

  const hookService = injector.get(HookService);
  hookService.register('openProjectAngularBootstrap', () => [
    {
      selector: highlightColSelector,
      cls: OpHighlightColDirective,
    },
  ]);
}

@NgModule({
  imports: [
    // UI router components (NOT routes!)
    UIRouterModule,
    // Angular browser + common module
    CommonModule,
    // Angular Forms
    FormsModule,
    OpSpotModule,
    // Angular CDK
    A11yModule,
    PortalModule,
    DragDropModule,
    DragulaModule,
    CurrentUserModule,
    FormsModule,
    NgSelectModule,
    NgOptionHighlightModule,

    DynamicBootstrapModule,
    OpenprojectPrincipalRenderingModule,
    OpenprojectContentLoaderModule,
    OpenprojectAutocompleterModule,
    OpenprojectModalModule,

    FocusModule,
    IconModule,
    AttributeHelpTextModule,
    FullCalendarModule,
    OpDatePickerModule,
  ],
  exports: [
    // Re-export all commonly used
    // modules to DRY
    UIRouterModule,
    CommonModule,
    FormsModule,
    PortalModule,
    DragDropModule,
    A11yModule,
    IconModule,
    AttributeHelpTextModule,
    FormsModule,
    NgOptionHighlightModule,
    DynamicBootstrapModule,
    OpenprojectPrincipalRenderingModule,
    OpenprojectAutocompleterModule,
    OpenprojectContentLoaderModule,

    OpSpotModule,

    OpDatePickerModule,

    FocusModule,
    OpDateTimeComponent,

    ToastsContainerComponent,
    ToastComponent,
    UploadProgressComponent,
    OpDateTimeComponent,

    // Table highlight
    OpHighlightColDirective,

    ResizerComponent,

    TablePaginationComponent,
    SortHeaderDirective,

    ZenModeButtonComponent,

    OPContextMenuComponent,
    IconTriggeredContextMenuComponent,

    NoResultsComponent,

    EditableToolbarTitleComponent,

    // Enterprise Edition
    EnterpriseBannerComponent,
    EnterprisePageComponent,
    FreeTrialButtonComponent,

    DynamicModule,

    OpOptionListComponent,
    OpSidemenuComponent,
    OpProjectIncludeComponent,
    OpProjectIncludeListComponent,
    OpLoadingProjectListComponent,

    ViewSelectComponent,

    // Old datepickers
    OpMultiDatePickerComponent,

    OpNonWorkingDaysListComponent,
  ],
  providers: [
    CopyToClipboardService,
    StaticQueriesService,
    ViewsResourceService,
  ],
  declarations: [
    ViewSelectComponent,

    ToastsContainerComponent,
    ToastComponent,
    UploadProgressComponent,
    OpDateTimeComponent,

    OPContextMenuComponent,
    IconTriggeredContextMenuComponent,

    // Table highlight
    OpHighlightColDirective,

    // Add functionality to rails rendered templates
    CopyToClipboardComponent,
    CollapsibleSectionComponent,

    ResizerComponent,

    TablePaginationComponent,
    SortHeaderDirective,

    // Zen mode button
    ZenModeButtonComponent,

    NoResultsComponent,

    EditableToolbarTitleComponent,

    PersistentToggleComponent,
    HideSectionLinkComponent,
    ShowSectionDropdownComponent,
    AddSectionDropdownComponent,
    RemoteFieldUpdaterComponent,

    // Enterprise Edition
    EnterpriseBannerComponent,
    EnterprisePageComponent,
    FreeTrialButtonComponent,

    HomescreenNewFeaturesBlockComponent,

    OpOptionListComponent,
    OpSidemenuComponent,
    OpProjectIncludeComponent,
    OpProjectIncludeListComponent,
    OpLoadingProjectListComponent,

    OpNonWorkingDaysListComponent,

    // Old datepickers
    OpMultiDatePickerComponent,

    ShareUpsaleComponent,
  ],
})
export class OpSharedModule {
  constructor(injector:Injector) {
    bootstrapModule(injector);
  }
}