From 5a67ca79ae2ec2dbd56b9a2c272ab36cfa1f359d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20H=2E=20Fjeld?= Date: Tue, 14 Jan 2025 13:59:51 +0100 Subject: [PATCH] legacy: Remove legacy code It is still in the git history, but removing it avoid confusion for people looking at the repository, and it avoid messages from github about security problems in the legacy code that is no longer maintained. --- .../actions/dotnet-build-test/action.yaml | 30 - legacy/.github/linters/.jscpd.json | 11 - legacy/.github/workflows/cd-workflow.yaml | 74 - legacy/.github/workflows/ci-workflow.yaml | 29 - legacy/.github/workflows/linter-workflow.yaml | 78 - ...y-5832e41d-f80d-4b6b-a790-5cc1cea1891c.xml | 17 - legacy/SQLWallet/sqlwallet.s3db | Bin 1183744 -> 0 bytes legacy/Services/AnalyseWorker.cs | 40 - legacy/Services/DataUploadSvcWorker.cs | 243 - legacy/Services/FileGenerationWorker.cs | 109 - legacy/Services/ImportExecutor.cs | 203 - legacy/Services/Services.csproj | 13 - legacy/appsettings.Shared.json | 194 - legacy/client/.nvmrc | 1 - legacy/client/.parcelrc | 4 - legacy/client/App.jsx | 18 - legacy/client/apple-touch-icon.png | Bin 3420 -> 0 bytes legacy/client/browserconfig.xml | 12 - legacy/client/components/ActivityTree.jsx | 92 - legacy/client/components/DataAccess/index.jsx | 138 - .../client/components/DataAccess/styles.scss | 13 - .../components/FunctionalAttributes.jsx | 78 - legacy/client/components/Info.jsx | 27 - legacy/client/components/ListWithDnd.jsx | 81 - .../client/components/Paginate/Paginate.jsx | 155 - legacy/client/components/Paginate/index.jsx | 22 - legacy/client/components/Paginate/styles.scss | 11 - .../client/components/Printable/Printable.jsx | 37 - .../client/components/Printable/styles.scss | 4 - legacy/client/components/RegionTree.jsx | 87 - .../client/components/SearchInput/index.jsx | 109 - .../components/SearchInput/nameCreator.js | 4 - .../client/components/SearchInput/sources.js | 42 - .../components/StatUnitFormBody/Field.jsx | 64 - .../StatUnitFormBody/FieldGroup.jsx | 18 - .../StatUnitFormBody/FormSection.jsx | 24 - .../StatUnitFormBody/getSectioned.js | 56 - .../components/StatUnitFormBody/index.jsx | 82 - .../createSchemaFormHoc/createSubForm.jsx | 115 - .../components/createSchemaFormHoc/index.js | 26 - .../createSchemaFormHoc/propTypes.js | 36 - .../createSchemaFormHoc/styles.scss | 3 - .../components/fields/ActivitiesList/Edit.jsx | 296 - .../components/fields/ActivitiesList/View.jsx | 98 - .../fields/ActivitiesList/index.jsx | 200 - .../client/components/fields/AddressField.jsx | 311 - .../client/components/fields/CheckField.jsx | 75 - .../components/fields/DateTimeField.jsx | 142 - .../fields/ForeignParticipationField.jsx | 343 - .../fields/InstitutionalSectorCodeField.jsx | 318 - .../components/fields/LegalFormField.jsx | 315 - .../client/components/fields/MainActivity.jsx | 316 - .../client/components/fields/NumberField.jsx | 77 - .../components/fields/PersonsList/Edit.jsx | 415 - .../components/fields/PersonsList/View.jsx | 130 - .../components/fields/PersonsList/index.jsx | 237 - .../client/components/fields/RangeField.jsx | 117 - .../client/components/fields/RegionField.jsx | 340 - .../client/components/fields/SearchField.jsx | 102 - .../client/components/fields/SelectField.jsx | 377 - .../client/components/fields/SelectField.scss | 4 - .../client/components/fields/StatusField.jsx | 334 - legacy/client/components/fields/TextField.jsx | 75 - .../client/components/fields/TextField2.jsx | 76 - legacy/client/components/fields/index.js | 18 - legacy/client/components/fields/styles.scss | 5 - .../client/components/fields/withDebounce.jsx | 74 - legacy/client/components/styles.scss | 10 - .../client/components/withSpinnerUnless.jsx | 38 - legacy/client/crossdomain.xml | 15 - legacy/client/favicon.ico | Bin 34494 -> 0 bytes legacy/client/fonts/notification.eot | Bin 2092 -> 0 bytes legacy/client/fonts/notification.svg | 14 - legacy/client/fonts/notification.ttf | Bin 1908 -> 0 bytes legacy/client/fonts/notification.woff | Bin 1984 -> 0 bytes legacy/client/helpers/actionCreators.js | 27 - legacy/client/helpers/colors.js | 12 - legacy/client/helpers/config.js | 57 - legacy/client/helpers/createStatUnitSchema.js | 260 - legacy/client/helpers/dateHelper.js | 70 - legacy/client/helpers/enumerable.js | 40 - legacy/client/helpers/enums.js | 175 - legacy/client/helpers/getUid.js | 2 - legacy/client/helpers/handleSetFieldValue.js | 7 - legacy/client/helpers/locale.js | 92 - legacy/client/helpers/modelProperties.js | 42 - legacy/client/helpers/paginate.js | 24 - .../helpers/parseDataSourceAttributes.js | 43 - legacy/client/helpers/queryObjectToString.js | 17 - legacy/client/helpers/request.js | 138 - legacy/client/helpers/string.js | 19 - legacy/client/helpers/systemFunctions.js | 46 - legacy/client/helpers/tryPersist.js | 6 - legacy/client/helpers/validation.js | 219 - legacy/client/humans.txt | 16 - legacy/client/icons/EnterpriseGroup.png | Bin 6540 -> 0 bytes legacy/client/icons/EnterpriseUnit.png | Bin 9378 -> 0 bytes legacy/client/icons/LegalUnit.png | Bin 9596 -> 0 bytes legacy/client/icons/LocalUnit.png | Bin 9694 -> 0 bytes legacy/client/index.html | 22 - legacy/client/index.js | 36 - legacy/client/jsconfig.json | 14 - .../layout/Authentication/Authentication.jsx | 46 - .../client/layout/Authentication/actions.js | 19 - legacy/client/layout/Authentication/index.js | 11 - .../client/layout/Authentication/reducer.js | 16 - legacy/client/layout/Breadcrumbs.jsx | 100 - legacy/client/layout/Footer.jsx | 28 - legacy/client/layout/Header.jsx | 223 - legacy/client/layout/Layout/Layout.jsx | 42 - legacy/client/layout/Layout/index.js | 49 - .../layout/Notification/Notification.jsx | 37 - legacy/client/layout/Notification/index.js | 11 - legacy/client/layout/Notification/reducer.js | 26 - .../layout/SelectLocale/SelectLocale.jsx | 34 - legacy/client/layout/SelectLocale/index.js | 10 - legacy/client/layout/SelectLocale/reducer.js | 10 - legacy/client/layout/createMenuMeta.js | 80 - legacy/client/layout/index.js | 12 - legacy/client/layout/styles.scss | 60 - legacy/client/logo-small.jpg | Bin 145867 -> 0 bytes legacy/client/logo.png | Bin 1417584 -> 0 bytes legacy/client/notifications.css | 115 - legacy/client/package-lock.json | 61748 ---------------- legacy/client/package.json | 446 - legacy/client/pages/About.jsx | 10 - .../client/pages/Account/Edit/EditDetails.jsx | 32 - legacy/client/pages/Account/Edit/FormBody.jsx | 49 - legacy/client/pages/Account/Edit/actions.js | 34 - legacy/client/pages/Account/Edit/index.js | 31 - legacy/client/pages/Account/Edit/model.js | 83 - legacy/client/pages/Account/View.jsx | 63 - .../pages/Analysis/AnalysisLogs/Item.jsx | 58 - .../pages/Analysis/AnalysisLogs/Logs.jsx | 43 - .../pages/Analysis/AnalysisLogs/index.js | 48 - .../client/pages/Analysis/Create/Create.jsx | 48 - legacy/client/pages/Analysis/Create/index.js | 35 - legacy/client/pages/Analysis/Details/Page.jsx | 34 - .../pages/Analysis/Details/connectFormBody.js | 66 - legacy/client/pages/Analysis/Details/index.js | 43 - legacy/client/pages/Analysis/Queue/Item.jsx | 53 - legacy/client/pages/Analysis/Queue/Queue.jsx | 135 - .../pages/Analysis/Queue/SearchForm.jsx | 58 - legacy/client/pages/Analysis/Queue/index.js | 49 - legacy/client/pages/Analysis/actions.js | 141 - legacy/client/pages/Analysis/reducer.js | 159 - .../ClassFlowExample/index.jsx | 88 - .../FromClassToHooksExample/index.jsx | 71 - .../FromRecomposeToHooksExample/index.jsx | 75 - .../RecomposeFlowExample/index.jsx | 80 - .../LiftUpStateWithClassExample/index.jsx | 133 - .../LiftUpStateWithHooksExample/index.jsx | 34 - .../index.jsx | 77 - .../StateContextWithHooksExample/index.jsx | 47 - .../index.jsx | 82 - legacy/client/pages/DataSources/Create.js | 37 - legacy/client/pages/DataSources/Edit.js | 58 - legacy/client/pages/DataSources/FormBody.jsx | 147 - legacy/client/pages/DataSources/List/List.jsx | 163 - .../pages/DataSources/List/ListItem.jsx | 57 - .../pages/DataSources/List/SearchForm.jsx | 106 - legacy/client/pages/DataSources/List/index.js | 25 - .../pages/DataSources/MappingEditor/Item.jsx | 49 - .../pages/DataSources/MappingEditor/index.jsx | 310 - .../DataSources/MappingEditor/styles.scss | 18 - legacy/client/pages/DataSources/Routes.jsx | 20 - .../TemplateFileAttributesParser.jsx | 99 - .../pages/DataSources/Upload/Upload.jsx | 149 - .../client/pages/DataSources/Upload/index.js | 25 - .../pages/DataSources/Upload/styles.scss | 27 - legacy/client/pages/DataSources/actions.js | 190 - legacy/client/pages/DataSources/model.js | 193 - legacy/client/pages/DataSources/reducer.js | 65 - ...aceComplexEntitiesForDataSourceTemplate.js | 240 - legacy/client/pages/DataSources/styles.scss | 29 - .../ActivityLogDetails/Item.jsx | 29 - .../ActivityLogDetails/Page.jsx | 34 - .../ActivityLogDetails/index.js | 44 - .../pages/DataSourcesQueue/List/Item.jsx | 62 - .../pages/DataSourcesQueue/List/Queue.jsx | 146 - .../DataSourcesQueue/List/SearchForm.jsx | 93 - .../pages/DataSourcesQueue/List/index.js | 63 - .../DataSourcesQueue/LogDetails/Page.jsx | 85 - .../LogDetails/connectFormBody.js | 66 - .../DataSourcesQueue/LogDetails/index.js | 46 - .../pages/DataSourcesQueue/QueueLog/Item.jsx | 66 - .../DataSourcesQueue/QueueLog/QueueLog.jsx | 43 - .../pages/DataSourcesQueue/QueueLog/index.js | 60 - .../client/pages/DataSourcesQueue/actions.js | 174 - .../client/pages/DataSourcesQueue/reducer.js | 180 - legacy/client/pages/NotFound.jsx | 17 - legacy/client/pages/Reports/Reports.jsx | 28 - legacy/client/pages/Reports/ReportsTree.jsx | 43 - legacy/client/pages/Reports/actions.js | 19 - legacy/client/pages/Reports/index.js | 31 - legacy/client/pages/Reports/reducer.js | 16 - legacy/client/pages/Roles/Create/Create.jsx | 157 - legacy/client/pages/Roles/Create/actions.js | 19 - legacy/client/pages/Roles/Create/index.js | 15 - legacy/client/pages/Roles/Create/styles.scss | 14 - legacy/client/pages/Roles/Edit/Edit.jsx | 109 - legacy/client/pages/Roles/Edit/actions.js | 37 - legacy/client/pages/Roles/Edit/index.js | 15 - legacy/client/pages/Roles/Edit/reducers.js | 25 - legacy/client/pages/Roles/Edit/styles.scss | 14 - legacy/client/pages/Roles/List/List.jsx | 96 - legacy/client/pages/Roles/List/ListItem.jsx | 39 - .../pages/Roles/List/Table/TableHeader.jsx | 18 - legacy/client/pages/Roles/List/actions.js | 36 - legacy/client/pages/Roles/List/index.js | 15 - legacy/client/pages/Roles/List/reducers.js | 29 - legacy/client/pages/Roles/List/styles.scss | 7 - legacy/client/pages/Roles/Routes.jsx | 19 - legacy/client/pages/SampleFrames/Create.js | 35 - legacy/client/pages/SampleFrames/Edit.js | 47 - .../pages/SampleFrames/FieldsEditor.jsx | 77 - legacy/client/pages/SampleFrames/FormBody.jsx | 118 - .../client/pages/SampleFrames/List/List.jsx | 223 - .../client/pages/SampleFrames/List/index.js | 51 - .../PredicateEditor/ClauseRow.jsx | 168 - .../SampleFrames/PredicateEditor/Header.jsx | 68 - .../PredicateEditor/InsertButton.jsx | 19 - .../PredicateEditor/ValueInput.jsx | 169 - .../SampleFrames/PredicateEditor/index.jsx | 72 - .../SampleFrames/PredicateEditor/styles.scss | 68 - .../pages/SampleFrames/Preview/List.jsx | 95 - .../pages/SampleFrames/Preview/index.js | 79 - legacy/client/pages/SampleFrames/actions.js | 104 - legacy/client/pages/SampleFrames/model.js | 63 - .../client/pages/SampleFrames/predicateFns.js | 206 - legacy/client/pages/SampleFrames/propTypes.js | 22 - legacy/client/pages/SampleFrames/reducer.js | 101 - .../pages/StatUnits/Create/ConnectedForm.jsx | 187 - .../client/pages/StatUnits/Create/Create.jsx | 41 - .../client/pages/StatUnits/Create/actions.js | 64 - legacy/client/pages/StatUnits/Create/index.js | 30 - .../client/pages/StatUnits/Create/reducer.js | 28 - .../client/pages/StatUnits/Create/styles.scss | 6 - .../pages/StatUnits/Deleted/DeletedList.jsx | 173 - .../pages/StatUnits/Deleted/ListItem.jsx | 68 - .../client/pages/StatUnits/Deleted/actions.js | 47 - .../client/pages/StatUnits/Deleted/index.js | 64 - .../client/pages/StatUnits/Deleted/reducer.js | 43 - .../pages/StatUnits/Deleted/styles.scss | 18 - .../pages/StatUnits/Edit/ConnectedForm.js | 63 - legacy/client/pages/StatUnits/Edit/Edit.jsx | 139 - legacy/client/pages/StatUnits/Edit/actions.js | 59 - legacy/client/pages/StatUnits/Edit/index.js | 33 - legacy/client/pages/StatUnits/Edit/reducer.js | 21 - .../client/pages/StatUnits/Edit/styles.scss | 6 - .../StatUnits/Links/Components/LinkForm.jsx | 104 - .../Components/LinksGrid/LinksGridRow.jsx | 64 - .../Links/Components/LinksGrid/index.jsx | 61 - .../Links/Components/LinksTree/LinksTree.jsx | 143 - .../Links/Components/LinksTree/UnitNode.jsx | 37 - .../Links/Components/LinksTree/actions.js | 18 - .../Links/Components/LinksTree/index.js | 10 - .../StatUnits/Links/Components/UnitSearch.jsx | 188 - .../StatUnits/Links/Create/CreateLink.jsx | 69 - .../pages/StatUnits/Links/Create/actions.js | 77 - .../pages/StatUnits/Links/Create/index.js | 22 - .../pages/StatUnits/Links/Create/reducers.js | 39 - .../StatUnits/Links/Delete/DeleteLink.jsx | 69 - .../pages/StatUnits/Links/Delete/actions.js | 37 - .../pages/StatUnits/Links/Delete/index.js | 22 - .../pages/StatUnits/Links/Delete/reducers.js | 31 - .../client/pages/StatUnits/Links/Layout.jsx | 75 - .../client/pages/StatUnits/Links/Routes.jsx | 16 - .../pages/StatUnits/Links/View/ViewFilter.jsx | 228 - .../pages/StatUnits/Links/View/ViewLinks.jsx | 61 - .../pages/StatUnits/Links/View/actions.js | 21 - .../pages/StatUnits/Links/View/index.js | 15 - .../pages/StatUnits/Links/View/reducers.js | 22 - .../pages/StatUnits/Links/View/styles.scss | 10 - .../pages/StatUnits/Search/ListItem.jsx | 55 - .../pages/StatUnits/Search/SearchStatUnit.jsx | 208 - .../pages/StatUnits/Search/TableHeader.jsx | 22 - .../client/pages/StatUnits/Search/actions.js | 83 - legacy/client/pages/StatUnits/Search/index.js | 71 - .../client/pages/StatUnits/Search/reducers.js | 71 - .../client/pages/StatUnits/Search/styles.scss | 27 - legacy/client/pages/StatUnits/SearchForm.jsx | 479 - .../pages/StatUnits/View/StatUnitViewPage.jsx | 341 - legacy/client/pages/StatUnits/View/actions.js | 106 - legacy/client/pages/StatUnits/View/index.js | 28 - .../client/pages/StatUnits/View/reducers.js | 67 - .../pages/StatUnits/View/tabs/Activity.jsx | 27 - .../pages/StatUnits/View/tabs/AddressView.jsx | 39 - .../pages/StatUnits/View/tabs/BarInfo.jsx | 81 - .../pages/StatUnits/View/tabs/ContactInfo.jsx | 361 - .../pages/StatUnits/View/tabs/History.jsx | 203 - .../pages/StatUnits/View/tabs/Links.jsx | 29 - .../client/pages/StatUnits/View/tabs/Main.jsx | 225 - .../pages/StatUnits/View/tabs/OrgLinks.jsx | 76 - .../client/pages/StatUnits/View/tabs/index.js | 9 - .../pages/StatUnits/View/tabs/styles.scss | 45 - .../pages/StatUnits/View/tabs/tabEnum.js | 9 - legacy/client/pages/StatUnits/actions.js | 10 - legacy/client/pages/StatUnits/styles.scss | 46 - legacy/client/pages/Users/Create/Create.jsx | 314 - legacy/client/pages/Users/Create/actions.js | 38 - legacy/client/pages/Users/Create/index.js | 15 - legacy/client/pages/Users/Create/styles.scss | 10 - legacy/client/pages/Users/Edit/Edit.jsx | 284 - legacy/client/pages/Users/Edit/actions.js | 67 - legacy/client/pages/Users/Edit/index.js | 19 - legacy/client/pages/Users/Edit/reducers.js | 39 - legacy/client/pages/Users/Edit/styles.scss | 10 - .../client/pages/Users/List/ColumnActions.jsx | 57 - legacy/client/pages/Users/List/FilterList.jsx | 92 - legacy/client/pages/Users/List/List.jsx | 159 - legacy/client/pages/Users/List/ListItem.jsx | 74 - legacy/client/pages/Users/List/actions.js | 37 - legacy/client/pages/Users/List/index.js | 14 - legacy/client/pages/Users/List/reducers.js | 57 - legacy/client/pages/Users/List/styles.scss | 15 - legacy/client/pages/Users/Routes.jsx | 19 - legacy/client/robots.txt | 5 - legacy/client/routes.jsx | 125 - legacy/client/store/combinedReducers.js | 47 - legacy/client/store/configureStore.js | 30 - legacy/client/styles.css | 55 - legacy/client/styles.scss | 96 - legacy/client/tile-wide.png | Bin 25975 -> 0 bytes legacy/client/tile.png | Bin 103959 -> 0 bytes legacy/client/tools/buildcontext.sh | 23 - legacy/client/tools/cssstub.js | 1 - legacy/client/tools/manageIIS.ps1 | 16 - legacy/client/tools/manageSvc.ps1 | 14 - legacy/client/tools/remoteUnzip.ps1 | 9 - legacy/client/tools/run.mjs | 347 - legacy/client/tools/webpack.config.mjs | 117 - legacy/conf.d/nginx.conf | 33 - legacy/db-admin-password.txt | 1 - legacy/dbackups/SBR_NOR.bak | Bin 84021248 -> 0 bytes legacy/docker-compose.debug.yml | 108 - ...docker-compose.support-services-ms-sql.yml | 59 - ...cker-compose.support-services-postgres.yml | 81 - legacy/docker-compose.yml | 85 - .../secret.json | 3 - .../secret.json | 3 - legacy/nscreg.sln | 177 - legacy/nscreg.sln.DotSettings | 2 - legacy/sbr.code-workspace | 82 - .../Analysis/Contracts/IAnalysisManager.cs | 17 - .../Analysis/Contracts/IStatUnitAnalyzer.cs | 46 - .../StatUnit/AnalysisDublicateResult.cs | 17 - .../Analysis/StatUnit/AnalysisResult.cs | 16 - .../StatUnitCustomCheckManager.cs | 90 - .../EnterpriseGroupDuplicatesManager.cs | 125 - .../StatisticalUnitDuplicatesManager.cs | 125 - .../EnterpriseGroupMandatoryFieldsManager.cs | 72 - .../StatisticalUnitMandatoryFieldsManager.cs | 183 - .../Analysis/StatUnit/StatUnitAnalyzer.cs | 507 - .../nscreg.Business/DataSources/CsvParser.cs | 137 - .../DataSources/PropertyParser.cs | 367 - .../DataSources/StatUnitKeyValueParser.cs | 371 - .../nscreg.Business/DataSources/XmlParser.cs | 96 - .../AnalysisPredicateBuilder.cs | 148 - .../PredicateBuilders/BasePredicateBuilder.cs | 251 - .../SampleFramePredicateBuilder.cs | 123 - .../EnterpriseGroupsPredicateBuilder.cs | 64 - .../SampleFramesPredicateBuilderFactory.cs | 32 - .../SampleFrames/StatUnitsPredicateBuilder.cs | 230 - .../SearchPredicateBuilder.cs | 79 - .../PredicateBuilders/SortingBuilder.cs | 37 - .../SampleFrames/ExpressionGroup.cs | 8 - .../SampleFrames/ExpressionItem.cs | 11 - .../SampleFrames/ExpressionTreeParser.cs | 57 - .../SampleFrames/ExpressionTuple.cs | 10 - .../SampleFrames/PredicateExpression.cs | 13 - .../SampleFrames/PredicateExpressionTuple.cs | 10 - .../src/nscreg.Business/SampleFrames/Rule.cs | 11 - .../SampleFrames/SwapVisitor.cs | 24 - .../nscreg.Business/nscreg.Business.csproj | 16 - .../ActivityCategoryConfiguration.cs | 22 - .../ActivityCategoryUserConfiguration.cs | 24 - .../Configuration/ActivityConfiguration.cs | 41 - .../ActivityStatisticalUnitConfiguration.cs | 29 - .../Configuration/AddressConfiguration.cs | 42 - .../Configuration/AnalysisLogConfiguration.cs | 24 - .../AnalysisQueueConfiguration.cs | 23 - .../Configuration/CountryConfiguration.cs | 19 - .../CountryStatisticalUnitConfiguration.cs | 26 - .../CustomAnalysisCheckConfiguration.cs | 21 - .../DataSourceClassificationConfiguration.cs | 19 - .../Configuration/DataSourceConfiguration.cs | 25 - .../DataSourceQueueConfiguration.cs | 24 - .../DataUploadingLogConfiguration.cs | 23 - .../DictionaryVersionConfiguration.cs | 15 - .../EnterpriseGroupConfiguration.cs | 56 - .../EnterpriseGroupRoleConfiguration.cs | 19 - .../EnterpriseGroupTypeConfiguration.cs | 19 - .../EnterpriseUnitConfiguration.cs | 56 - .../ForeignParticipationConfiguration.cs | 19 - .../ActivityHistoryConfiguration.cs | 39 - ...vityStatisticalUnitHistoryConfiguration.cs | 26 - ...ntryStatisticalUnitHistoryConfiguration.cs | 26 - .../EnterpriseGroupHistoryConfiguration.cs | 36 - .../EnterpriseUnitHistoryConfiguration.cs | 22 - .../LegalUnitHistoryConfiguration.cs | 22 - .../LocalUnitHistoryConfiguration.cs | 22 - ...rsonStatisticalUnitHistoryConfiguration.cs | 27 - .../StatisticalUnitHistoryConfiguration.cs | 34 - .../Configuration/LegalFormConfiguration.cs | 19 - .../Configuration/LegalUnitConfiguration.cs | 47 - .../Configuration/LocalUnitConfiguration.cs | 25 - .../PersonStatisticalUnitConfiguration.cs | 27 - .../Configuration/PersonTypeConfiguration.cs | 17 - .../Configuration/PersonsConfiguration.cs | 15 - .../Configuration/RegionConfiguration.cs | 21 - .../RegistrationReasonConfiguration.cs | 19 - .../Configuration/ReorgTypeConfiguration.cs | 19 - .../Configuration/SampleFrameConfiguration.cs | 21 - .../Configuration/SectorCodesConfiguration.cs | 25 - .../StatUnitEnterprise_2021Configuration.cs | 17 - .../StatUnitLocal_2021Configuration.cs | 17 - .../StatUnitSearchViewConfiguration.cs | 17 - .../StatisticalUnitConfiguration.cs | 104 - .../Configuration/UnitSizeConfiguration.cs | 19 - .../Configuration/UnitStatusConfiguration.cs | 19 - .../Configuration/UserRegionConfiguration.cs | 26 - .../nscreg.Data/Constants/ActivityTypes.cs | 13 - .../Constants/DataSourceAllowedOperation.cs | 12 - .../Constants/DataSourcePriority.cs | 21 - .../Constants/DataSourceQueueStatuses.cs | 14 - .../Constants/DataSourceUploadTypes.cs | 13 - .../Constants/DataUploadingLogStatuses.cs | 12 - .../nscreg.Data/Constants/DefaultRoleNames.cs | 12 - .../src/nscreg.Data/Constants/RoleStatuses.cs | 11 - .../SampleFrameGenerationStatuses.cs | 12 - .../nscreg.Data/Constants/StatUnitTypes.cs | 13 - .../nscreg.Data/Constants/SystemFunctions.cs | 91 - .../src/nscreg.Data/Constants/UserStatuses.cs | 12 - .../EntityTypeConfigurationBase.cs | 23 - .../IEntityTypeConfiguration.cs | 15 - .../nscreg.Data/Core/ModelBuilderExtension.cs | 32 - .../Core/StatisticalUnitsTypeHelper.cs | 39 - .../nscreg.Data/DateTimeOffsetExtensions.cs | 60 - legacy/src/nscreg.Data/DbContextHelper.cs | 121 - .../DbDataProviders/IDbDataProvider.cs | 14 - .../DbDataProviders/MsSqlDbDataProvider.cs | 29 - .../DbDataProviders/MySqlDataProvider.cs | 31 - .../PostgreSqlDbDataProvider.cs | 34 - .../DbDataProviders/SqlWalletDataProvider.cs | 65 - .../DbInitializers/IDbInitializer.cs | 9 - .../DbInitializers/InMemoryDbInitializer.cs | 90 - .../DbInitializers/MsSqlDbInitializer.cs | 585 - .../DbInitializers/MySqlDbInitializer.cs | 187 - .../DbInitializers/PostgreSqlDbInitializer.cs | 558 - legacy/src/nscreg.Data/Dockerfile | 24 - legacy/src/nscreg.Data/Entities/Activity.cs | 29 - .../nscreg.Data/Entities/ActivityCategory.cs | 23 - .../Entities/ActivityCategoryUser.cs | 14 - .../Entities/ActivityStatisticalUnit.cs | 17 - legacy/src/nscreg.Data/Entities/Address.cs | 26 - .../src/nscreg.Data/Entities/AnalysisLog.cs | 22 - .../src/nscreg.Data/Entities/AnalysisQueue.cs | 20 - .../nscreg.Data/Entities/CodeLookupBase.cs | 10 - .../ComplexTypes/DataAccessPermissions.cs | 63 - .../Entities/ComplexTypes/Permission.cs | 21 - legacy/src/nscreg.Data/Entities/Country.cs | 15 - .../Entities/CountryStatisticalUnit.cs | 16 - .../Entities/CustomAnalysisCheck.cs | 17 - legacy/src/nscreg.Data/Entities/DataSource.cs | 60 - .../Entities/DataSourceClassification.cs | 9 - .../nscreg.Data/Entities/DataSourceQueue.cs | 27 - .../nscreg.Data/Entities/DataUploadingLog.cs | 36 - .../nscreg.Data/Entities/DictionaryVersion.cs | 12 - .../nscreg.Data/Entities/EnterpriseGroup.cs | 297 - .../Entities/EnterpriseGroupRole.cs | 9 - .../Entities/EnterpriseGroupType.cs | 17 - .../nscreg.Data/Entities/EnterpriseUnit.cs | 98 - .../Entities/ForeignParticipation.cs | 9 - .../History/ActivityStatisticalUnitHistory.cs | 41 - .../History/CountryStatisticalUnitHistory.cs | 21 - .../History/EnterpriseGroupHistory.cs | 148 - .../Entities/History/EnterpriseUnitHistory.cs | 55 - .../History/IStatisticalUnitHistory.cs | 38 - .../Entities/History/LegalUnitHistory.cs | 44 - .../Entities/History/LocalUnitHistory.cs | 34 - .../History/PersonStatisticalUnitHistory.cs | 25 - .../History/StatisticalUnitHistory.cs | 180 - .../src/nscreg.Data/Entities/IIdentifiable.cs | 12 - .../src/nscreg.Data/Entities/IModelWithId.cs | 12 - .../nscreg.Data/Entities/IStatisticalUnit.cs | 40 - legacy/src/nscreg.Data/Entities/LegalForm.cs | 11 - legacy/src/nscreg.Data/Entities/LegalUnit.cs | 92 - legacy/src/nscreg.Data/Entities/LocalUnit.cs | 48 - legacy/src/nscreg.Data/Entities/LookupBase.cs | 14 - legacy/src/nscreg.Data/Entities/Person.cs | 43 - .../Entities/PersonStatisticalUnit.cs | 21 - legacy/src/nscreg.Data/Entities/PersonType.cs | 7 - .../src/nscreg.Data/Entities/PostalIndex.cs | 9 - legacy/src/nscreg.Data/Entities/Region.cs | 20 - .../Entities/RegistrationReason.cs | 7 - legacy/src/nscreg.Data/Entities/ReorgType.cs | 13 - legacy/src/nscreg.Data/Entities/ReportTree.cs | 20 - legacy/src/nscreg.Data/Entities/Role.cs | 62 - .../src/nscreg.Data/Entities/SampleFrame.cs | 21 - legacy/src/nscreg.Data/Entities/SectorCode.cs | 15 - .../Entities/StatUnitEnterprise_2021.cs | 59 - .../Entities/StatUnitLocal_2021.cs | 57 - .../Entities/StatUnitSearchView.cs | 40 - .../nscreg.Data/Entities/StatisticalUnit.cs | 298 - legacy/src/nscreg.Data/Entities/UnitSize.cs | 13 - legacy/src/nscreg.Data/Entities/UnitStatus.cs | 13 - legacy/src/nscreg.Data/Entities/User.cs | 57 - legacy/src/nscreg.Data/Entities/UserRegion.cs | 13 - legacy/src/nscreg.Data/Entities/UserRole.cs | 11 - .../20230922142945_InitialCreate.Designer.cs | 3640 - .../20230922142945_InitialCreate.cs | 2213 - ...essIdFromStatisticalUnitsTable.Designer.cs | 3632 - ...olumnAddressIdFromStatisticalUnitsTable.cs | 48 - .../NSCRegDbContextModelSnapshot.cs | 3629 - legacy/src/nscreg.Data/NSCRegDbContext.cs | 105 - legacy/src/nscreg.Data/NscRegDbInitializer.cs | 105 - .../Repositories/CodeLookupRepository.cs | 35 - .../Repositories/LookupRepository.cs | 54 - .../SeedData.AddActivityCategories.cs | 1830 - .../nscreg.Data/SeedData.AddAnalysisLogs.cs | 40 - .../src/nscreg.Data/SeedData.AddCountries.cs | 254 - .../nscreg.Data/SeedData.AddDataSources.cs | 74 - .../SeedData.AddEnterpriseGroupRoles.cs | 22 - .../SeedData.AddEnterpriseGroupTypes.cs | 21 - .../src/nscreg.Data/SeedData.AddLegalForms.cs | 15 - .../nscreg.Data/SeedData.AddPersonTypes.cs | 16 - legacy/src/nscreg.Data/SeedData.AddRegions.cs | 2552 - .../nscreg.Data/SeedData.AddSectorCodes.cs | 168 - .../src/nscreg.Data/SeedData.AddStatUnits.cs | 206 - .../src/nscreg.Data/SeedData.AddStatuses.cs | 18 - .../nscreg.Data/SeedData.AddUsersAndRoles.cs | 152 - legacy/src/nscreg.Data/SeedData.cs | 11 - legacy/src/nscreg.Data/Startup.cs | 58 - legacy/src/nscreg.Data/nscreg.Data.csproj | 48 - .../IPropertyCreator.cs | 11 - .../ActivityPropertyMetadata.cs | 21 - .../AddressPropertyMetadata.cs | 21 - .../BooleanPropertyMetadata.cs | 20 - .../CountryPropertyMetadata.cs | 21 - .../DateTimeOffsetPropertyMetadata.cs | 21 - .../FloatPropertyMetadata.cs | 19 - .../IntegerPropertyMetadata.cs | 19 - .../LegalFormSectorCodePropertyMetadata.cs | 18 - .../MultiReferenceProperty.cs | 26 - .../PersonPropertyMetada.cs | 21 - .../ReferencePropertyMetadata.cs | 24 - .../StringPropertyMetadata.cs | 19 - .../PropertyCreatorBase.cs | 47 - .../ActivityPropertyCreator.cs | 45 - .../AddressPropertyCreator.cs | 40 - .../BooleanPropertyCreator.cs | 41 - .../CountryPropertyCreator.cs | 48 - .../DateTimePropertyCreator.cs | 43 - .../PropertyCreators/FloatPropertyCreator.cs | 40 - .../IntegerPropertyCreator.cs | 42 - .../LegalFormSectorCodePropertyCreator.cs | 44 - .../MultireferencePropertyCreator.cs | 59 - .../PropertyCreators/PersonPropertyCreator.cs | 54 - .../ReferencePropertyCreator.cs | 48 - .../PropertyCreators/StringPropertyCreator.cs | 45 - .../PropertyMetadataBase.cs | 51 - .../PropertyMetadataFactory.cs | 38 - .../Validation/IValidationEndpointProvider.cs | 9 - .../Validation/ValidationEndpointProvider.cs | 23 - .../nscreg.ModelGeneration/ViewModelBase.cs | 13 - .../nscreg.ModelGeneration.csproj | 15 - .../Languages/Resource.Designer.cs | 8064 -- .../Languages/Resource.ky-KG.resx | 2625 - .../nscreg.Resources/Languages/Resource.resx | 2980 - .../Languages/Resource.ru-RU.resx | 2846 - .../nscreg.Resources/nscreg.Resources.csproj | 31 - .../nscreg.Server.Common/AutoMapperProfile.cs | 492 - .../BadRequestException.cs | 26 - .../Helpers/ForeingKeysResolver.cs | 151 - .../Helpers/StatUnitAnalysisHelper.cs | 90 - .../Helpers/StatUnitCheckPermissionsHelper.cs | 94 - .../Helpers/StatUnitCopyHelper.cs | 94 - .../Helpers/StatUnitCreationHelper.cs | 242 - .../Helpers/UnitsHistoryHolder.cs | 73 - .../src/nscreg.Server.Common/Localization.cs | 68 - .../Models/Account/DetailsEditM.cs | 28 - .../Models/Account/DetailsVm.cs | 21 - .../Models/Account/LoginVm.cs | 20 - .../ActivityCategories/ActivityCategoryVm.cs | 13 - .../Models/Addresses/AddressListModel.cs | 20 - .../Models/Addresses/AddressModel.cs | 16 - .../AnalysisQueue/AnalisysQueueCreateModel.cs | 13 - .../AnalysisQueue/AnalysisQueueListModel.cs | 10 - .../AnalysisQueue/AnalysisQueueModel.cs | 15 - .../Models/AnalysisQueue/LogItemDetailsVm.cs | 53 - .../Models/AnalysisQueue/LogItemModel.cs | 15 - .../Models/AnalysisQueue/LogItemsListModel.cs | 6 - .../Models/AnalysisQueue/LogsQueryModel.cs | 11 - .../Models/AnalysisQueue/SearchQueryModel.cs | 10 - .../Models/DataAccess/DataAccessAttributeM.cs | 15 - .../DataAccess/DataAccessAttributeVm.cs | 12 - .../Models/DataAccess/DataAccessModel.cs | 116 - .../Models/DataSources/DataSourceEditVm.cs | 52 - .../Models/DataSources/DataSourceVm.cs | 47 - .../Models/DataSources/PropertyInfoM.cs | 41 - .../Models/DataSources/SearchQueryM.cs | 63 - .../Models/DataSources/SubmitM.cs | 109 - .../DataSourcesQueue/QueueLogDetailsVm.cs | 69 - .../Models/DataSourcesQueue/QueueLogVm.cs | 40 - .../Models/DataSourcesQueue/QueueVm.cs | 37 - .../Models/DataSourcesQueue/SearchQueryM.cs | 49 - .../DataSourcesQueue/UploadDataSourceVm.cs | 14 - .../Models/Links/LinkCommentM.cs | 13 - .../Models/Links/LinkM.cs | 16 - .../Models/Links/LinkSearchM.cs | 42 - .../Models/Links/LinkSubmitM.cs | 16 - .../Models/Lookup/CodeLookupVm.cs | 17 - .../Models/Lookup/IUnitVm.cs | 13 - .../Models/Lookup/LookupVm.cs | 11 - .../Models/Lookup/RegionLookupVm.cs | 14 - .../Models/Lookup/SearchLookupModel.cs | 12 - .../Models/Lookup/UnitLookupVm.cs | 12 - .../Models/Lookup/UnitNodeVm.cs | 13 - .../Models/Lookup/UnitSubmitM.cs | 13 - .../Models/OrgLinks/OrgLinksNode.cs | 36 - .../Models/PaginatedQueryM.cs | 20 - .../Models/PaginatedResultModelBase.cs | 20 - .../Models/Regions/RegionM.cs | 20 - .../Models/Regions/RegionNode.cs | 17 - .../Models/Roles/RoleListVm.cs | 29 - .../Models/Roles/RoleSubmitM.cs | 34 - .../Models/Roles/RoleVm.cs | 42 - .../Models/SampleFrames/SampleFrameM.cs | 72 - .../Models/SampleFrames/SearchQueryM.cs | 13 - .../nscreg.Server.Common/Models/SearchVm.cs | 27 - .../Models/StatUnits/ActivityM.cs | 38 - .../Models/StatUnits/AddressM.cs | 65 - .../Create/EnterpriseGroupCreateM.cs | 118 - .../StatUnits/Create/EnterpriseUnitCreateM.cs | 32 - .../StatUnits/Create/LegalUnitCreateM.cs | 29 - .../StatUnits/Create/LocalUnitCreateM.cs | 17 - .../StatUnits/Edit/EnterpriseGroupEditM.cs | 131 - .../StatUnits/Edit/EnterpriseUnitEditM.cs | 29 - .../Models/StatUnits/Edit/LegalUnitEditM.cs | 33 - .../Models/StatUnits/Edit/LocalUnitEditM.cs | 19 - .../Models/StatUnits/History/ChangedField.cs | 9 - .../Models/StatUnits/IStatUnitM.cs | 18 - .../Models/StatUnits/InconsistentRecord.cs | 30 - .../StatUnits/InconsistentRecordValidator.cs | 73 - .../Models/StatUnits/LinkInfo.cs | 41 - .../Models/StatUnits/PersonM.cs | 40 - .../Models/StatUnits/PersonStatUnitModel.cs | 16 - .../StatUnits/Search/ActivityAdapterModel.cs | 16 - .../StatUnits/Search/AddressAdapterModel.cs | 19 - .../StatUnits/Search/PersonAdapterModel.cs | 12 - .../Search/SearchViewAdapterModel.cs | 26 - .../Models/StatUnits/SearchItemVm.cs | 28 - .../Models/StatUnits/SearchQueryM.cs | 124 - .../Models/StatUnits/SearchVm.cs | 22 - .../Models/StatUnits/StatUnitModelBase.cs | 107 - .../StatUnits/StatUnitPersonsRoleModel.cs | 11 - .../Models/StatUnits/StatUnitViewModel.cs | 14 - .../StatUnits/StatUnitViewModelCreator.cs | 57 - .../Models/Users/IUserSubmit.cs | 14 - .../Models/Users/UserCreateM.cs | 50 - .../Models/Users/UserEditM.cs | 50 - .../Models/Users/UserListFilter.cs | 15 - .../Models/Users/UserListItemVm.cs | 39 - .../Models/Users/UserListVm.cs | 32 - .../Models/Users/UserRoleVm.cs | 11 - .../Models/Users/UserVm.cs | 48 - .../nscreg.Server.Common/NotFoundException.cs | 20 - .../Services/AccessAttributesService.cs | 28 - .../Services/AddressService.cs | 107 - .../Services/AnalysisQueueService.cs | 200 - .../CodeLookup/ActivityCodeLookupStrategy.cs | 16 - .../Services/CodeLookup/CodeLookupService.cs | 71 - .../Services/CodeLookup/CodeLookupStrategy.cs | 30 - .../Services/CodeLookupProvider.cs | 38 - .../Services/Contracts/IAddressService.cs | 17 - .../Services/Contracts/IRegionService.cs | 16 - .../Contracts/IStatUnitAnalyzeService.cs | 24 - .../Services/Contracts/IUserService.cs | 23 - .../Services/DataAccessAttributesProvider.cs | 79 - .../DataSources/BulkUpsertUnitService.cs | 407 - .../Services/DataSources/DbLogBuffer.cs | 77 - .../Services/DataSources/EditUnitService.cs | 354 - .../Services/DataSources/FileParser.cs | 57 - .../DataSources/GetStatUnitSetHelper.cs | 72 - .../Services/DataSources/IdComparer.cs | 25 - .../Services/DataSources/PopulateService.cs | 128 - .../Services/DataSources/QueueService.cs | 194 - .../Services/DataSources/SaveManager.cs | 82 - .../DataSources/StatUnitPostProcessor.cs | 408 - .../DataSources/UpsertUnitBulkBuffer.cs | 265 - .../Services/DataSourcesQueueService.cs | 492 - .../Services/DataSourcesService.cs | 131 - .../Services/LookupService.cs | 358 - .../Services/PersonService.cs | 74 - .../Services/RegionService.cs | 230 - .../Services/ReportService.cs | 181 - .../Services/RoleService.cs | 186 - .../SampleFrames/PropertyValuesProvider.cs | 89 - .../SampleFrames/SampleFrameExecutor.cs | 168 - .../SampleFrames/SampleFramesService.cs | 141 - .../Services/StatUnit/AnalyzeService.cs | 188 - .../Services/StatUnit/CommonService.cs | 675 - .../Services/StatUnit/CreateService.cs | 299 - .../Services/StatUnit/DataAccessService.cs | 28 - .../Services/StatUnit/DeleteService.cs | 841 - .../Services/StatUnit/EditService.cs | 529 - .../Services/StatUnit/ElasticService.cs | 384 - .../Services/StatUnit/HistoryService.cs | 192 - .../Services/StatUnit/IElasticService.cs | 19 - .../Services/StatUnit/LinkService.cs | 597 - .../Services/StatUnit/SearchService.cs | 295 - .../Services/StatUnit/ViewService.cs | 368 - .../Services/UserService.cs | 396 - legacy/src/nscreg.Server.Common/UserAccess.cs | 11 - ...ckStringNotEmptyAndGreaterThanValidator.cs | 35 - .../Validators/Extensions/PersonExtention.cs | 33 - .../Extensions/StatUnitExtension.cs | 43 - .../Extensions/ValidatorExtetions.cs | 43 - .../StatUnitCreateEditBaseValidator.cs | 41 - .../nscreg.Server.Common.csproj | 24 - .../Controllers/AccessAttributes.cs | 26 - .../src/nscreg.Server/Controllers/Account.cs | 186 - .../nscreg.Server/Controllers/Activities.cs | 33 - .../nscreg.Server/Controllers/Addresses.cs | 90 - .../Controllers/AnalysisQueue.cs | 94 - .../nscreg.Server/Controllers/DataSources.cs | 91 - .../Controllers/DataSourcesQueue.cs | 137 - legacy/src/nscreg.Server/Controllers/Home.cs | 156 - .../nscreg.Server/Controllers/LegalForms.cs | 39 - legacy/src/nscreg.Server/Controllers/Links.cs | 93 - .../src/nscreg.Server/Controllers/Lookup.cs | 53 - .../src/nscreg.Server/Controllers/Persons.cs | 30 - .../src/nscreg.Server/Controllers/Regions.cs | 136 - .../src/nscreg.Server/Controllers/Reports.cs | 35 - legacy/src/nscreg.Server/Controllers/Roles.cs | 95 - .../nscreg.Server/Controllers/SampleFrames.cs | 115 - .../nscreg.Server/Controllers/SectorCodes.cs | 39 - .../nscreg.Server/Controllers/StatUnits.cs | 378 - .../Controllers/StatUnitsDeleted.cs | 50 - legacy/src/nscreg.Server/Controllers/Users.cs | 166 - .../AttributeAuthorizationHandler.cs | 55 - .../Core/Authorize/SystemFunctionAttribute.cs | 20 - .../Authorize/SystemFunctionAuthHandler.cs | 52 - .../SystemFunctionAuthRequirement.cs | 11 - .../Core/ClaimsPrincipalExtensions.cs | 18 - .../DisableValidateModelStateAttribute.cs | 8 - .../Core/GlobalExceptionFilter.cs | 52 - .../Core/StartupConfiguration.cs | 69 - .../Core/ValidateModelStateAttribute.cs | 27 - legacy/src/nscreg.Server/Dockerfile | 44 - .../V1_1_0_0__Optimization_create_indices.sql | 9 - .../V1_1_0_0__Optimization_create_indices.sql | 9 - .../HostedServices/AnalysisHostedService.cs | 30 - .../HostedServices/BaseHostedService.cs | 113 - .../DataUploadSvcHostedService.cs | 25 - .../DataUploadSvcQueueCleanupHostedService.cs | 25 - .../SampleFrameGenerationHostedService.cs | 30 - .../Properties/launchSettings.json | 13 - legacy/src/nscreg.Server/Startup.cs | 326 - legacy/src/nscreg.Server/Views/Index.cshtml | 41 - legacy/src/nscreg.Server/Views/LogIn.cshtml | 57 - .../appsettings.Development.json | 194 - .../nscreg.Server/appsettings.Production.json | 196 - legacy/src/nscreg.Server/logs/default.txt | 0 legacy/src/nscreg.Server/nlog.config | 21 - legacy/src/nscreg.Server/nscreg.Server.csproj | 74 - .../nscreg.Server/sampleframes/default.txt | 0 legacy/src/nscreg.Server/uploads/default.txt | 0 .../nscreg.Server/wwwroot/browserconfig.xml | 12 - .../src/nscreg.Server/wwwroot/crossdomain.xml | 15 - legacy/src/nscreg.Server/wwwroot/humans.txt | 16 - .../src/nscreg.Server/wwwroot/logo-small.jpg | Bin 145867 -> 0 bytes legacy/src/nscreg.Server/wwwroot/logo.png | Bin 1417584 -> 0 bytes legacy/src/nscreg.Server/wwwroot/robots.txt | 5 - .../src/nscreg.Server/wwwroot/tile-wide.png | Bin 25975 -> 0 bytes legacy/src/nscreg.Server/wwwroot/tile.png | Bin 103959 -> 0 bytes .../nscreg.ServiceUtils/Interfaces/IJob.cs | 12 - legacy/src/nscreg.ServiceUtils/JobService.cs | 45 - legacy/src/nscreg.ServiceUtils/JobWrapper.cs | 65 - .../nscreg.ServicesUtils.csproj | 11 - .../nscreg.Utilities/AppsettingsValidation.cs | 39 - .../Attributes/AllowedToAttribute.cs | 21 - .../Attributes/AsyncValidationAttribute.cs | 17 - .../Attributes/DataAccessCommonAttribute.cs | 11 - .../nscreg.Utilities/Attributes/NotCompare.cs | 12 - .../Attributes/NotMappedForAttribute.cs | 18 - .../Attributes/OperationAllowedAttribute.cs | 15 - .../Attributes/PopupLocalizedKeyAttribute.cs | 15 - .../Attributes/PrintableStringAttribute.cs | 22 - .../Attributes/ReferenceAttribute.cs | 20 - .../Attributes/SearchComponentAttribute.cs | 12 - .../Attributes/UsedByServerSideAttribute.cs | 11 - .../nscreg.Utilities/Classes/DataProperty.cs | 12 - .../Classes/GenericDataProperty.cs | 61 - .../Configuration/ConnectionSettings.cs | 28 - .../DBMandatoryFields/Activity.cs | 15 - .../DBMandatoryFields/Addresses.cs | 15 - .../DBMandatoryFields/DbMandatoryFields.cs | 17 - .../DBMandatoryFields/Enterprise.cs | 13 - .../DBMandatoryFields/EnterpriseGroup.cs | 40 - .../DBMandatoryFields/LegalUnit.cs | 16 - .../DBMandatoryFields/LocalUnit.cs | 11 - .../Configuration/DBMandatoryFields/Person.cs | 18 - .../DBMandatoryFields/StatUnit.cs | 42 - .../Configuration/ISettings.cs | 6 - .../Configuration/Localization/Locale.cs | 12 - .../Localization/LocalizationSettings.cs | 13 - .../Configuration/ReportingSettings.cs | 14 - .../Configuration/ServicesSettings.cs | 33 - .../StatUnitAnalysis/Connections.cs | 12 - .../StatUnitAnalysis/Duplicates.cs | 18 - .../Configuration/StatUnitAnalysis/Orphan.cs | 14 - .../StatUnitAnalysis/StatUnitAnalysisRules.cs | 13 - .../Configuration/ValidationSettings.cs | 8 - legacy/src/nscreg.Utilities/CsvHelper.cs | 59 - .../DataAccessAttributesHelper.cs | 31 - .../nscreg.Utilities/DataAccessResolver.cs | 66 - .../DataSourceVariableMappingHelper.cs | 23 - .../DynamicContractResolver.cs | 55 - .../src/nscreg.Utilities/Enums/ActionsEnum.cs | 15 - .../nscreg.Utilities/Enums/ChangeReasons.cs | 14 - .../Enums/ConnectionProvider.cs | 10 - .../src/nscreg.Utilities/Enums/GroupNames.cs | 21 - .../src/nscreg.Utilities/Enums/LookupEnum.cs | 27 - .../src/nscreg.Utilities/Enums/OrderRule.cs | 11 - .../Enums/Predicate/ComparisonEnum.cs | 11 - .../Enums/Predicate/FieldEnum.cs | 150 - .../Enums/Predicate/OperationEnum.cs | 21 - .../src/nscreg.Utilities/Enums/SortFields.cs | 13 - .../Enums/StatUnitTypeOfSave.cs | 8 - .../Enums/ValidationTypeEnum.cs | 11 - .../EqualityComparerCreator.cs | 35 - .../src/nscreg.Utilities/ExpressionUtils.cs | 23 - .../Extensions/DictionaryExtensions.cs | 15 - .../Extensions/EnumExtensions.cs | 19 - .../Extensions/EnumerableExtensions.cs | 78 - .../Extensions/StringExtensions.cs | 43 - .../Extensions/TypeExtensions.cs | 24 - legacy/src/nscreg.Utilities/JsonPathHelper.cs | 55 - .../nscreg.Utilities/LocalizationProvider.cs | 23 - .../src/nscreg.Utilities/LogExecutionTime.cs | 23 - legacy/src/nscreg.Utilities/ObjectComparer.cs | 50 - legacy/src/nscreg.Utilities/Pagination.cs | 15 - .../nscreg.Utilities/nscreg.Utilities.csproj | 19 - legacy/test/client.test/.eslintrc | 8 - .../helpers/queryObjectToString.test.js | 23 - .../test/client.test/helpers/string.test.js | 51 - .../nscreg.Business.Test/Base/BaseTest.cs | 21 - .../DataSources/CsvParserTest.cs | 96 - .../DataSources/PopulateServiceTest.cs | 559 - .../ConvertOrDefaultTest.cs | 110 - .../ParseActivityCategoryTest.cs | 19 - .../PropertyParserTest/ParseActivityTest.cs | 21 - .../PropertyParserTest/ParseAddressTest.cs | 40 - .../PropertyParserTest/ParseCountryTest.cs | 19 - .../ParseDataSourceClassificationTest.cs | 19 - .../PropertyParserTest/ParseLegalFormTest.cs | 19 - .../PropertyParserTest/ParsePersonTest.cs | 19 - .../PropertyParserTest/ParseRegionTest.cs | 19 - .../PropertyParserTest/ParseSectorCodeTest.cs | 19 - .../GetStatIdSourceKeyTest.cs | 39 - .../ParseAndMutateTest.cs | 312 - .../DataSources/XmlParserTest.cs | 151 - .../nscreg.Business.Test.csproj | 38 - .../DataAccessResolverTest.cs | 60 - .../DataSourceQueues/ServiceTest.cs | 75 - .../DataSourceVariableMappingHelperTest.cs | 20 - .../DataSources/EntityTest.cs | 37 - .../DataSources/ModelsTest.cs | 85 - .../DataSources/ServiceTest.cs | 147 - .../DynamicContractResolverTest.cs | 32 - .../Extensions/DbContextExtensions.cs | 98 - .../Helpers/ServiceFactories.cs | 25 - .../Helpers/StatUnitTestHelper.cs | 315 - .../nscreg.Server.Test/JsonPathHelperTest.cs | 75 - .../nscreg.Server.Test/LocalizationTest.cs | 31 - .../nscreg.Server.Test/RoleServiceTest.cs | 169 - legacy/test/nscreg.Server.Test/RoleTest.cs | 28 - .../SampleFramesServiceTest.cs | 406 - .../test/nscreg.Server.Test/SettingsTest.cs | 60 - .../StatUnitAnalysisRulesServiceTest.cs | 57 - .../nscreg.Server.Test/StatUnitServiceTest.cs | 1167 - .../StringExtensionsTest.cs | 36 - .../nscreg.Server.Test/UserServiceTest.cs | 167 - .../nscreg.Server.Test.csproj | 51 - .../test/nscreg.Server.Test/xunit.runner.json | 3 - .../nscreg.Server.TestUI/CommonScenarios.cs | 40 - .../Commons/OrderAttribute.cs | 16 - .../Commons/PriorityOrderer .cs | 50 - .../nscreg.Server.TestUI/Login/LoginTest.cs | 47 - legacy/test/nscreg.Server.TestUI/MenuMap.cs | 12 - .../nscreg.Server.TestUI/Roles/RolePage.cs | 190 - .../nscreg.Server.TestUI/Roles/RolesTest.cs | 56 - .../nscreg.Server.TestUI/SeleniumTestBase.cs | 22 - legacy/test/nscreg.Server.TestUI/Setup.cs | 22 - .../StatUnits/StatUnitPage.cs | 271 - .../StatUnits/StatUnitsTest.cs | 155 - .../nscreg.Server.TestUI/Users/UserPage.cs | 59 - .../nscreg.Server.TestUI/Users/UsersTest.cs | 51 - .../nscreg.Server.TestUI/appsettings.json | 3 - .../nscreg.Server.TestUI.csproj | 43 - .../QueueServiceTest/DequeueTest.cs | 112 - .../QueueServiceTest/QueueServiceMainTest.cs | 142 - .../nscreg.Services.Test.csproj | 34 - .../DateTimeFlushSecondsTest.cs | 21 - .../nscreg.TestUtils.Test/InMemoryDbTest.cs | 33 - .../nscreg.TestUtils.Test.csproj | 35 - .../DateTimeOffsetExtensions.cs | 10 - legacy/test/nscreg.TestUtils/InMemoryDb.cs | 37 - .../test/nscreg.TestUtils/InMemoryDbSqlite.cs | 36 - .../nscreg.TestUtils/nscreg.TestUtils.csproj | 15 - 912 files changed, 158964 deletions(-) delete mode 100644 legacy/.github/actions/dotnet-build-test/action.yaml delete mode 100644 legacy/.github/linters/.jscpd.json delete mode 100644 legacy/.github/workflows/cd-workflow.yaml delete mode 100644 legacy/.github/workflows/ci-workflow.yaml delete mode 100644 legacy/.github/workflows/linter-workflow.yaml delete mode 100644 legacy/SQLWallet/key-5832e41d-f80d-4b6b-a790-5cc1cea1891c.xml delete mode 100644 legacy/SQLWallet/sqlwallet.s3db delete mode 100644 legacy/Services/AnalyseWorker.cs delete mode 100644 legacy/Services/DataUploadSvcWorker.cs delete mode 100644 legacy/Services/FileGenerationWorker.cs delete mode 100644 legacy/Services/ImportExecutor.cs delete mode 100644 legacy/Services/Services.csproj delete mode 100644 legacy/appsettings.Shared.json delete mode 100644 legacy/client/.nvmrc delete mode 100644 legacy/client/.parcelrc delete mode 100644 legacy/client/App.jsx delete mode 100644 legacy/client/apple-touch-icon.png delete mode 100644 legacy/client/browserconfig.xml delete mode 100644 legacy/client/components/ActivityTree.jsx delete mode 100644 legacy/client/components/DataAccess/index.jsx delete mode 100644 legacy/client/components/DataAccess/styles.scss delete mode 100644 legacy/client/components/FunctionalAttributes.jsx delete mode 100644 legacy/client/components/Info.jsx delete mode 100644 legacy/client/components/ListWithDnd.jsx delete mode 100644 legacy/client/components/Paginate/Paginate.jsx delete mode 100644 legacy/client/components/Paginate/index.jsx delete mode 100644 legacy/client/components/Paginate/styles.scss delete mode 100644 legacy/client/components/Printable/Printable.jsx delete mode 100644 legacy/client/components/Printable/styles.scss delete mode 100644 legacy/client/components/RegionTree.jsx delete mode 100644 legacy/client/components/SearchInput/index.jsx delete mode 100644 legacy/client/components/SearchInput/nameCreator.js delete mode 100644 legacy/client/components/SearchInput/sources.js delete mode 100644 legacy/client/components/StatUnitFormBody/Field.jsx delete mode 100644 legacy/client/components/StatUnitFormBody/FieldGroup.jsx delete mode 100644 legacy/client/components/StatUnitFormBody/FormSection.jsx delete mode 100644 legacy/client/components/StatUnitFormBody/getSectioned.js delete mode 100644 legacy/client/components/StatUnitFormBody/index.jsx delete mode 100644 legacy/client/components/createSchemaFormHoc/createSubForm.jsx delete mode 100644 legacy/client/components/createSchemaFormHoc/index.js delete mode 100644 legacy/client/components/createSchemaFormHoc/propTypes.js delete mode 100644 legacy/client/components/createSchemaFormHoc/styles.scss delete mode 100644 legacy/client/components/fields/ActivitiesList/Edit.jsx delete mode 100644 legacy/client/components/fields/ActivitiesList/View.jsx delete mode 100644 legacy/client/components/fields/ActivitiesList/index.jsx delete mode 100644 legacy/client/components/fields/AddressField.jsx delete mode 100644 legacy/client/components/fields/CheckField.jsx delete mode 100644 legacy/client/components/fields/DateTimeField.jsx delete mode 100644 legacy/client/components/fields/ForeignParticipationField.jsx delete mode 100644 legacy/client/components/fields/InstitutionalSectorCodeField.jsx delete mode 100644 legacy/client/components/fields/LegalFormField.jsx delete mode 100644 legacy/client/components/fields/MainActivity.jsx delete mode 100644 legacy/client/components/fields/NumberField.jsx delete mode 100644 legacy/client/components/fields/PersonsList/Edit.jsx delete mode 100644 legacy/client/components/fields/PersonsList/View.jsx delete mode 100644 legacy/client/components/fields/PersonsList/index.jsx delete mode 100644 legacy/client/components/fields/RangeField.jsx delete mode 100644 legacy/client/components/fields/RegionField.jsx delete mode 100644 legacy/client/components/fields/SearchField.jsx delete mode 100644 legacy/client/components/fields/SelectField.jsx delete mode 100644 legacy/client/components/fields/SelectField.scss delete mode 100644 legacy/client/components/fields/StatusField.jsx delete mode 100644 legacy/client/components/fields/TextField.jsx delete mode 100644 legacy/client/components/fields/TextField2.jsx delete mode 100644 legacy/client/components/fields/index.js delete mode 100644 legacy/client/components/fields/styles.scss delete mode 100644 legacy/client/components/fields/withDebounce.jsx delete mode 100644 legacy/client/components/styles.scss delete mode 100644 legacy/client/components/withSpinnerUnless.jsx delete mode 100644 legacy/client/crossdomain.xml delete mode 100644 legacy/client/favicon.ico delete mode 100644 legacy/client/fonts/notification.eot delete mode 100644 legacy/client/fonts/notification.svg delete mode 100644 legacy/client/fonts/notification.ttf delete mode 100644 legacy/client/fonts/notification.woff delete mode 100644 legacy/client/helpers/actionCreators.js delete mode 100644 legacy/client/helpers/colors.js delete mode 100644 legacy/client/helpers/config.js delete mode 100644 legacy/client/helpers/createStatUnitSchema.js delete mode 100644 legacy/client/helpers/dateHelper.js delete mode 100644 legacy/client/helpers/enumerable.js delete mode 100644 legacy/client/helpers/enums.js delete mode 100644 legacy/client/helpers/getUid.js delete mode 100644 legacy/client/helpers/handleSetFieldValue.js delete mode 100644 legacy/client/helpers/locale.js delete mode 100644 legacy/client/helpers/modelProperties.js delete mode 100644 legacy/client/helpers/paginate.js delete mode 100644 legacy/client/helpers/parseDataSourceAttributes.js delete mode 100644 legacy/client/helpers/queryObjectToString.js delete mode 100644 legacy/client/helpers/request.js delete mode 100644 legacy/client/helpers/string.js delete mode 100644 legacy/client/helpers/systemFunctions.js delete mode 100644 legacy/client/helpers/tryPersist.js delete mode 100644 legacy/client/helpers/validation.js delete mode 100644 legacy/client/humans.txt delete mode 100644 legacy/client/icons/EnterpriseGroup.png delete mode 100644 legacy/client/icons/EnterpriseUnit.png delete mode 100644 legacy/client/icons/LegalUnit.png delete mode 100644 legacy/client/icons/LocalUnit.png delete mode 100644 legacy/client/index.html delete mode 100644 legacy/client/index.js delete mode 100644 legacy/client/jsconfig.json delete mode 100644 legacy/client/layout/Authentication/Authentication.jsx delete mode 100644 legacy/client/layout/Authentication/actions.js delete mode 100644 legacy/client/layout/Authentication/index.js delete mode 100644 legacy/client/layout/Authentication/reducer.js delete mode 100644 legacy/client/layout/Breadcrumbs.jsx delete mode 100644 legacy/client/layout/Footer.jsx delete mode 100644 legacy/client/layout/Header.jsx delete mode 100644 legacy/client/layout/Layout/Layout.jsx delete mode 100644 legacy/client/layout/Layout/index.js delete mode 100644 legacy/client/layout/Notification/Notification.jsx delete mode 100644 legacy/client/layout/Notification/index.js delete mode 100644 legacy/client/layout/Notification/reducer.js delete mode 100644 legacy/client/layout/SelectLocale/SelectLocale.jsx delete mode 100644 legacy/client/layout/SelectLocale/index.js delete mode 100644 legacy/client/layout/SelectLocale/reducer.js delete mode 100644 legacy/client/layout/createMenuMeta.js delete mode 100644 legacy/client/layout/index.js delete mode 100644 legacy/client/layout/styles.scss delete mode 100644 legacy/client/logo-small.jpg delete mode 100644 legacy/client/logo.png delete mode 100644 legacy/client/notifications.css delete mode 100644 legacy/client/package-lock.json delete mode 100644 legacy/client/package.json delete mode 100644 legacy/client/pages/About.jsx delete mode 100644 legacy/client/pages/Account/Edit/EditDetails.jsx delete mode 100644 legacy/client/pages/Account/Edit/FormBody.jsx delete mode 100644 legacy/client/pages/Account/Edit/actions.js delete mode 100644 legacy/client/pages/Account/Edit/index.js delete mode 100644 legacy/client/pages/Account/Edit/model.js delete mode 100644 legacy/client/pages/Account/View.jsx delete mode 100644 legacy/client/pages/Analysis/AnalysisLogs/Item.jsx delete mode 100644 legacy/client/pages/Analysis/AnalysisLogs/Logs.jsx delete mode 100644 legacy/client/pages/Analysis/AnalysisLogs/index.js delete mode 100644 legacy/client/pages/Analysis/Create/Create.jsx delete mode 100644 legacy/client/pages/Analysis/Create/index.js delete mode 100644 legacy/client/pages/Analysis/Details/Page.jsx delete mode 100644 legacy/client/pages/Analysis/Details/connectFormBody.js delete mode 100644 legacy/client/pages/Analysis/Details/index.js delete mode 100644 legacy/client/pages/Analysis/Queue/Item.jsx delete mode 100644 legacy/client/pages/Analysis/Queue/Queue.jsx delete mode 100644 legacy/client/pages/Analysis/Queue/SearchForm.jsx delete mode 100644 legacy/client/pages/Analysis/Queue/index.js delete mode 100644 legacy/client/pages/Analysis/actions.js delete mode 100644 legacy/client/pages/Analysis/reducer.js delete mode 100644 legacy/client/pages/DataFlowExamples/ClassFlowExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/HooksExamples/FromClassToHooksExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/HooksExamples/FromRecomposeToHooksExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/RecomposeFlowExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithClassExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksStatUnitExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksExample/index.jsx delete mode 100644 legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksStatUnitExample/index.jsx delete mode 100644 legacy/client/pages/DataSources/Create.js delete mode 100644 legacy/client/pages/DataSources/Edit.js delete mode 100644 legacy/client/pages/DataSources/FormBody.jsx delete mode 100644 legacy/client/pages/DataSources/List/List.jsx delete mode 100644 legacy/client/pages/DataSources/List/ListItem.jsx delete mode 100644 legacy/client/pages/DataSources/List/SearchForm.jsx delete mode 100644 legacy/client/pages/DataSources/List/index.js delete mode 100644 legacy/client/pages/DataSources/MappingEditor/Item.jsx delete mode 100644 legacy/client/pages/DataSources/MappingEditor/index.jsx delete mode 100644 legacy/client/pages/DataSources/MappingEditor/styles.scss delete mode 100644 legacy/client/pages/DataSources/Routes.jsx delete mode 100644 legacy/client/pages/DataSources/TemplateFileAttributesParser.jsx delete mode 100644 legacy/client/pages/DataSources/Upload/Upload.jsx delete mode 100644 legacy/client/pages/DataSources/Upload/index.js delete mode 100644 legacy/client/pages/DataSources/Upload/styles.scss delete mode 100644 legacy/client/pages/DataSources/actions.js delete mode 100644 legacy/client/pages/DataSources/model.js delete mode 100644 legacy/client/pages/DataSources/reducer.js delete mode 100644 legacy/client/pages/DataSources/replaceComplexEntitiesForDataSourceTemplate.js delete mode 100644 legacy/client/pages/DataSources/styles.scss delete mode 100644 legacy/client/pages/DataSourcesQueue/ActivityLogDetails/Item.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/ActivityLogDetails/Page.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/ActivityLogDetails/index.js delete mode 100644 legacy/client/pages/DataSourcesQueue/List/Item.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/List/Queue.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/List/SearchForm.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/List/index.js delete mode 100644 legacy/client/pages/DataSourcesQueue/LogDetails/Page.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/LogDetails/connectFormBody.js delete mode 100644 legacy/client/pages/DataSourcesQueue/LogDetails/index.js delete mode 100644 legacy/client/pages/DataSourcesQueue/QueueLog/Item.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/QueueLog/QueueLog.jsx delete mode 100644 legacy/client/pages/DataSourcesQueue/QueueLog/index.js delete mode 100644 legacy/client/pages/DataSourcesQueue/actions.js delete mode 100644 legacy/client/pages/DataSourcesQueue/reducer.js delete mode 100644 legacy/client/pages/NotFound.jsx delete mode 100644 legacy/client/pages/Reports/Reports.jsx delete mode 100644 legacy/client/pages/Reports/ReportsTree.jsx delete mode 100644 legacy/client/pages/Reports/actions.js delete mode 100644 legacy/client/pages/Reports/index.js delete mode 100644 legacy/client/pages/Reports/reducer.js delete mode 100644 legacy/client/pages/Roles/Create/Create.jsx delete mode 100644 legacy/client/pages/Roles/Create/actions.js delete mode 100644 legacy/client/pages/Roles/Create/index.js delete mode 100644 legacy/client/pages/Roles/Create/styles.scss delete mode 100644 legacy/client/pages/Roles/Edit/Edit.jsx delete mode 100644 legacy/client/pages/Roles/Edit/actions.js delete mode 100644 legacy/client/pages/Roles/Edit/index.js delete mode 100644 legacy/client/pages/Roles/Edit/reducers.js delete mode 100644 legacy/client/pages/Roles/Edit/styles.scss delete mode 100644 legacy/client/pages/Roles/List/List.jsx delete mode 100644 legacy/client/pages/Roles/List/ListItem.jsx delete mode 100644 legacy/client/pages/Roles/List/Table/TableHeader.jsx delete mode 100644 legacy/client/pages/Roles/List/actions.js delete mode 100644 legacy/client/pages/Roles/List/index.js delete mode 100644 legacy/client/pages/Roles/List/reducers.js delete mode 100644 legacy/client/pages/Roles/List/styles.scss delete mode 100644 legacy/client/pages/Roles/Routes.jsx delete mode 100644 legacy/client/pages/SampleFrames/Create.js delete mode 100644 legacy/client/pages/SampleFrames/Edit.js delete mode 100644 legacy/client/pages/SampleFrames/FieldsEditor.jsx delete mode 100644 legacy/client/pages/SampleFrames/FormBody.jsx delete mode 100644 legacy/client/pages/SampleFrames/List/List.jsx delete mode 100644 legacy/client/pages/SampleFrames/List/index.js delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/ClauseRow.jsx delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/Header.jsx delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/InsertButton.jsx delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/ValueInput.jsx delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/index.jsx delete mode 100644 legacy/client/pages/SampleFrames/PredicateEditor/styles.scss delete mode 100644 legacy/client/pages/SampleFrames/Preview/List.jsx delete mode 100644 legacy/client/pages/SampleFrames/Preview/index.js delete mode 100644 legacy/client/pages/SampleFrames/actions.js delete mode 100644 legacy/client/pages/SampleFrames/model.js delete mode 100644 legacy/client/pages/SampleFrames/predicateFns.js delete mode 100644 legacy/client/pages/SampleFrames/propTypes.js delete mode 100644 legacy/client/pages/SampleFrames/reducer.js delete mode 100644 legacy/client/pages/StatUnits/Create/ConnectedForm.jsx delete mode 100644 legacy/client/pages/StatUnits/Create/Create.jsx delete mode 100644 legacy/client/pages/StatUnits/Create/actions.js delete mode 100644 legacy/client/pages/StatUnits/Create/index.js delete mode 100644 legacy/client/pages/StatUnits/Create/reducer.js delete mode 100644 legacy/client/pages/StatUnits/Create/styles.scss delete mode 100644 legacy/client/pages/StatUnits/Deleted/DeletedList.jsx delete mode 100644 legacy/client/pages/StatUnits/Deleted/ListItem.jsx delete mode 100644 legacy/client/pages/StatUnits/Deleted/actions.js delete mode 100644 legacy/client/pages/StatUnits/Deleted/index.js delete mode 100644 legacy/client/pages/StatUnits/Deleted/reducer.js delete mode 100644 legacy/client/pages/StatUnits/Deleted/styles.scss delete mode 100644 legacy/client/pages/StatUnits/Edit/ConnectedForm.js delete mode 100644 legacy/client/pages/StatUnits/Edit/Edit.jsx delete mode 100644 legacy/client/pages/StatUnits/Edit/actions.js delete mode 100644 legacy/client/pages/StatUnits/Edit/index.js delete mode 100644 legacy/client/pages/StatUnits/Edit/reducer.js delete mode 100644 legacy/client/pages/StatUnits/Edit/styles.scss delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinkForm.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksGrid/LinksGridRow.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksGrid/index.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksTree/LinksTree.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksTree/UnitNode.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksTree/actions.js delete mode 100644 legacy/client/pages/StatUnits/Links/Components/LinksTree/index.js delete mode 100644 legacy/client/pages/StatUnits/Links/Components/UnitSearch.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Create/CreateLink.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Create/actions.js delete mode 100644 legacy/client/pages/StatUnits/Links/Create/index.js delete mode 100644 legacy/client/pages/StatUnits/Links/Create/reducers.js delete mode 100644 legacy/client/pages/StatUnits/Links/Delete/DeleteLink.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Delete/actions.js delete mode 100644 legacy/client/pages/StatUnits/Links/Delete/index.js delete mode 100644 legacy/client/pages/StatUnits/Links/Delete/reducers.js delete mode 100644 legacy/client/pages/StatUnits/Links/Layout.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/Routes.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/View/ViewFilter.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/View/ViewLinks.jsx delete mode 100644 legacy/client/pages/StatUnits/Links/View/actions.js delete mode 100644 legacy/client/pages/StatUnits/Links/View/index.js delete mode 100644 legacy/client/pages/StatUnits/Links/View/reducers.js delete mode 100644 legacy/client/pages/StatUnits/Links/View/styles.scss delete mode 100644 legacy/client/pages/StatUnits/Search/ListItem.jsx delete mode 100644 legacy/client/pages/StatUnits/Search/SearchStatUnit.jsx delete mode 100644 legacy/client/pages/StatUnits/Search/TableHeader.jsx delete mode 100644 legacy/client/pages/StatUnits/Search/actions.js delete mode 100644 legacy/client/pages/StatUnits/Search/index.js delete mode 100644 legacy/client/pages/StatUnits/Search/reducers.js delete mode 100644 legacy/client/pages/StatUnits/Search/styles.scss delete mode 100644 legacy/client/pages/StatUnits/SearchForm.jsx delete mode 100644 legacy/client/pages/StatUnits/View/StatUnitViewPage.jsx delete mode 100644 legacy/client/pages/StatUnits/View/actions.js delete mode 100644 legacy/client/pages/StatUnits/View/index.js delete mode 100644 legacy/client/pages/StatUnits/View/reducers.js delete mode 100644 legacy/client/pages/StatUnits/View/tabs/Activity.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/AddressView.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/BarInfo.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/ContactInfo.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/History.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/Links.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/Main.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/OrgLinks.jsx delete mode 100644 legacy/client/pages/StatUnits/View/tabs/index.js delete mode 100644 legacy/client/pages/StatUnits/View/tabs/styles.scss delete mode 100644 legacy/client/pages/StatUnits/View/tabs/tabEnum.js delete mode 100644 legacy/client/pages/StatUnits/actions.js delete mode 100644 legacy/client/pages/StatUnits/styles.scss delete mode 100644 legacy/client/pages/Users/Create/Create.jsx delete mode 100644 legacy/client/pages/Users/Create/actions.js delete mode 100644 legacy/client/pages/Users/Create/index.js delete mode 100644 legacy/client/pages/Users/Create/styles.scss delete mode 100644 legacy/client/pages/Users/Edit/Edit.jsx delete mode 100644 legacy/client/pages/Users/Edit/actions.js delete mode 100644 legacy/client/pages/Users/Edit/index.js delete mode 100644 legacy/client/pages/Users/Edit/reducers.js delete mode 100644 legacy/client/pages/Users/Edit/styles.scss delete mode 100644 legacy/client/pages/Users/List/ColumnActions.jsx delete mode 100644 legacy/client/pages/Users/List/FilterList.jsx delete mode 100644 legacy/client/pages/Users/List/List.jsx delete mode 100644 legacy/client/pages/Users/List/ListItem.jsx delete mode 100644 legacy/client/pages/Users/List/actions.js delete mode 100644 legacy/client/pages/Users/List/index.js delete mode 100644 legacy/client/pages/Users/List/reducers.js delete mode 100644 legacy/client/pages/Users/List/styles.scss delete mode 100644 legacy/client/pages/Users/Routes.jsx delete mode 100644 legacy/client/robots.txt delete mode 100644 legacy/client/routes.jsx delete mode 100644 legacy/client/store/combinedReducers.js delete mode 100644 legacy/client/store/configureStore.js delete mode 100644 legacy/client/styles.css delete mode 100644 legacy/client/styles.scss delete mode 100644 legacy/client/tile-wide.png delete mode 100644 legacy/client/tile.png delete mode 100755 legacy/client/tools/buildcontext.sh delete mode 100644 legacy/client/tools/cssstub.js delete mode 100644 legacy/client/tools/manageIIS.ps1 delete mode 100644 legacy/client/tools/manageSvc.ps1 delete mode 100644 legacy/client/tools/remoteUnzip.ps1 delete mode 100644 legacy/client/tools/run.mjs delete mode 100644 legacy/client/tools/webpack.config.mjs delete mode 100644 legacy/conf.d/nginx.conf delete mode 100644 legacy/db-admin-password.txt delete mode 100755 legacy/dbackups/SBR_NOR.bak delete mode 100644 legacy/docker-compose.debug.yml delete mode 100644 legacy/docker-compose.support-services-ms-sql.yml delete mode 100644 legacy/docker-compose.support-services-postgres.yml delete mode 100644 legacy/docker-compose.yml delete mode 100644 legacy/microsoft/usersecrets/aspnet-nscreg.Data-20161112123049/secret.json delete mode 100644 legacy/microsoft/usersecrets/aspnet-nscreg.Server-20161112011040/secret.json delete mode 100644 legacy/nscreg.sln delete mode 100644 legacy/nscreg.sln.DotSettings delete mode 100644 legacy/sbr.code-workspace delete mode 100644 legacy/src/nscreg.Business/Analysis/Contracts/IAnalysisManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/Contracts/IStatUnitAnalyzer.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/AnalysisDublicateResult.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/AnalysisResult.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/Managers/AnalysisChecks/StatUnitCustomCheckManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/Managers/Duplicates/EnterpriseGroupDuplicatesManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/Managers/Duplicates/StatisticalUnitDuplicatesManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/Managers/MandatoryFields/EnterpriseGroupMandatoryFieldsManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/Managers/MandatoryFields/StatisticalUnitMandatoryFieldsManager.cs delete mode 100644 legacy/src/nscreg.Business/Analysis/StatUnit/StatUnitAnalyzer.cs delete mode 100644 legacy/src/nscreg.Business/DataSources/CsvParser.cs delete mode 100644 legacy/src/nscreg.Business/DataSources/PropertyParser.cs delete mode 100644 legacy/src/nscreg.Business/DataSources/StatUnitKeyValueParser.cs delete mode 100644 legacy/src/nscreg.Business/DataSources/XmlParser.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/AnalysisPredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/BasePredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SampleFramePredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SampleFrames/EnterpriseGroupsPredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SampleFrames/SampleFramesPredicateBuilderFactory.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SampleFrames/StatUnitsPredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SearchPredicateBuilder.cs delete mode 100644 legacy/src/nscreg.Business/PredicateBuilders/SortingBuilder.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/ExpressionGroup.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/ExpressionItem.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/ExpressionTreeParser.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/ExpressionTuple.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/PredicateExpression.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/PredicateExpressionTuple.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/Rule.cs delete mode 100644 legacy/src/nscreg.Business/SampleFrames/SwapVisitor.cs delete mode 100644 legacy/src/nscreg.Business/nscreg.Business.csproj delete mode 100644 legacy/src/nscreg.Data/Configuration/ActivityCategoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/ActivityCategoryUserConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/ActivityConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/ActivityStatisticalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/AddressConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/AnalysisLogConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/AnalysisQueueConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/CountryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/CountryStatisticalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/CustomAnalysisCheckConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/DataSourceClassificationConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/DataSourceConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/DataSourceQueueConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/DataUploadingLogConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/DictionaryVersionConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/EnterpriseGroupConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/EnterpriseGroupRoleConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/EnterpriseGroupTypeConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/EnterpriseUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/ForeignParticipationConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/ActivityHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/ActivityStatisticalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/CountryStatisticalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/EnterpriseGroupHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/EnterpriseUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/LegalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/LocalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/PersonStatisticalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/HistoryConfiguration/StatisticalUnitHistoryConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/LegalFormConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/LegalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/LocalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/PersonStatisticalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/PersonTypeConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/PersonsConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/RegionConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/RegistrationReasonConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/ReorgTypeConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/SampleFrameConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/SectorCodesConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/StatUnitEnterprise_2021Configuration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/StatUnitLocal_2021Configuration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/StatUnitSearchViewConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/StatisticalUnitConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/UnitSizeConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/UnitStatusConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Configuration/UserRegionConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Constants/ActivityTypes.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DataSourceAllowedOperation.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DataSourcePriority.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DataSourceQueueStatuses.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DataSourceUploadTypes.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DataUploadingLogStatuses.cs delete mode 100644 legacy/src/nscreg.Data/Constants/DefaultRoleNames.cs delete mode 100644 legacy/src/nscreg.Data/Constants/RoleStatuses.cs delete mode 100644 legacy/src/nscreg.Data/Constants/SampleFrameGenerationStatuses.cs delete mode 100644 legacy/src/nscreg.Data/Constants/StatUnitTypes.cs delete mode 100644 legacy/src/nscreg.Data/Constants/SystemFunctions.cs delete mode 100644 legacy/src/nscreg.Data/Constants/UserStatuses.cs delete mode 100644 legacy/src/nscreg.Data/Core/EntityConfiguration/EntityTypeConfigurationBase.cs delete mode 100644 legacy/src/nscreg.Data/Core/EntityConfiguration/IEntityTypeConfiguration.cs delete mode 100644 legacy/src/nscreg.Data/Core/ModelBuilderExtension.cs delete mode 100644 legacy/src/nscreg.Data/Core/StatisticalUnitsTypeHelper.cs delete mode 100644 legacy/src/nscreg.Data/DateTimeOffsetExtensions.cs delete mode 100644 legacy/src/nscreg.Data/DbContextHelper.cs delete mode 100644 legacy/src/nscreg.Data/DbDataProviders/IDbDataProvider.cs delete mode 100644 legacy/src/nscreg.Data/DbDataProviders/MsSqlDbDataProvider.cs delete mode 100644 legacy/src/nscreg.Data/DbDataProviders/MySqlDataProvider.cs delete mode 100644 legacy/src/nscreg.Data/DbDataProviders/PostgreSqlDbDataProvider.cs delete mode 100644 legacy/src/nscreg.Data/DbDataProviders/SqlWalletDataProvider.cs delete mode 100644 legacy/src/nscreg.Data/DbInitializers/IDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/DbInitializers/InMemoryDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/DbInitializers/MsSqlDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/DbInitializers/MySqlDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/DbInitializers/PostgreSqlDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/Dockerfile delete mode 100644 legacy/src/nscreg.Data/Entities/Activity.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ActivityCategory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ActivityCategoryUser.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ActivityStatisticalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/Address.cs delete mode 100644 legacy/src/nscreg.Data/Entities/AnalysisLog.cs delete mode 100644 legacy/src/nscreg.Data/Entities/AnalysisQueue.cs delete mode 100644 legacy/src/nscreg.Data/Entities/CodeLookupBase.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ComplexTypes/DataAccessPermissions.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ComplexTypes/Permission.cs delete mode 100644 legacy/src/nscreg.Data/Entities/Country.cs delete mode 100644 legacy/src/nscreg.Data/Entities/CountryStatisticalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/CustomAnalysisCheck.cs delete mode 100644 legacy/src/nscreg.Data/Entities/DataSource.cs delete mode 100644 legacy/src/nscreg.Data/Entities/DataSourceClassification.cs delete mode 100644 legacy/src/nscreg.Data/Entities/DataSourceQueue.cs delete mode 100644 legacy/src/nscreg.Data/Entities/DataUploadingLog.cs delete mode 100644 legacy/src/nscreg.Data/Entities/DictionaryVersion.cs delete mode 100644 legacy/src/nscreg.Data/Entities/EnterpriseGroup.cs delete mode 100644 legacy/src/nscreg.Data/Entities/EnterpriseGroupRole.cs delete mode 100644 legacy/src/nscreg.Data/Entities/EnterpriseGroupType.cs delete mode 100644 legacy/src/nscreg.Data/Entities/EnterpriseUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ForeignParticipation.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/ActivityStatisticalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/CountryStatisticalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/EnterpriseGroupHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/EnterpriseUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/IStatisticalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/LegalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/LocalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/PersonStatisticalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/History/StatisticalUnitHistory.cs delete mode 100644 legacy/src/nscreg.Data/Entities/IIdentifiable.cs delete mode 100644 legacy/src/nscreg.Data/Entities/IModelWithId.cs delete mode 100644 legacy/src/nscreg.Data/Entities/IStatisticalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/LegalForm.cs delete mode 100644 legacy/src/nscreg.Data/Entities/LegalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/LocalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/LookupBase.cs delete mode 100644 legacy/src/nscreg.Data/Entities/Person.cs delete mode 100644 legacy/src/nscreg.Data/Entities/PersonStatisticalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/PersonType.cs delete mode 100644 legacy/src/nscreg.Data/Entities/PostalIndex.cs delete mode 100644 legacy/src/nscreg.Data/Entities/Region.cs delete mode 100644 legacy/src/nscreg.Data/Entities/RegistrationReason.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ReorgType.cs delete mode 100644 legacy/src/nscreg.Data/Entities/ReportTree.cs delete mode 100644 legacy/src/nscreg.Data/Entities/Role.cs delete mode 100644 legacy/src/nscreg.Data/Entities/SampleFrame.cs delete mode 100644 legacy/src/nscreg.Data/Entities/SectorCode.cs delete mode 100644 legacy/src/nscreg.Data/Entities/StatUnitEnterprise_2021.cs delete mode 100644 legacy/src/nscreg.Data/Entities/StatUnitLocal_2021.cs delete mode 100644 legacy/src/nscreg.Data/Entities/StatUnitSearchView.cs delete mode 100644 legacy/src/nscreg.Data/Entities/StatisticalUnit.cs delete mode 100644 legacy/src/nscreg.Data/Entities/UnitSize.cs delete mode 100644 legacy/src/nscreg.Data/Entities/UnitStatus.cs delete mode 100644 legacy/src/nscreg.Data/Entities/User.cs delete mode 100644 legacy/src/nscreg.Data/Entities/UserRegion.cs delete mode 100644 legacy/src/nscreg.Data/Entities/UserRole.cs delete mode 100644 legacy/src/nscreg.Data/Migrations/20230922142945_InitialCreate.Designer.cs delete mode 100644 legacy/src/nscreg.Data/Migrations/20230922142945_InitialCreate.cs delete mode 100644 legacy/src/nscreg.Data/Migrations/20231019130548_DropColumnAddressIdFromStatisticalUnitsTable.Designer.cs delete mode 100644 legacy/src/nscreg.Data/Migrations/20231019130548_DropColumnAddressIdFromStatisticalUnitsTable.cs delete mode 100644 legacy/src/nscreg.Data/Migrations/NSCRegDbContextModelSnapshot.cs delete mode 100644 legacy/src/nscreg.Data/NSCRegDbContext.cs delete mode 100644 legacy/src/nscreg.Data/NscRegDbInitializer.cs delete mode 100644 legacy/src/nscreg.Data/Repositories/CodeLookupRepository.cs delete mode 100644 legacy/src/nscreg.Data/Repositories/LookupRepository.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddActivityCategories.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddAnalysisLogs.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddCountries.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddDataSources.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddEnterpriseGroupRoles.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddEnterpriseGroupTypes.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddLegalForms.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddPersonTypes.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddRegions.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddSectorCodes.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddStatUnits.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddStatuses.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.AddUsersAndRoles.cs delete mode 100644 legacy/src/nscreg.Data/SeedData.cs delete mode 100644 legacy/src/nscreg.Data/Startup.cs delete mode 100644 legacy/src/nscreg.Data/nscreg.Data.csproj delete mode 100644 legacy/src/nscreg.ModelGeneration/IPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/ActivityPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/AddressPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/BooleanPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/CountryPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/DateTimeOffsetPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/FloatPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/IntegerPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/LegalFormSectorCodePropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/MultiReferenceProperty.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/PersonPropertyMetada.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/ReferencePropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertiesMetadata/StringPropertyMetadata.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreatorBase.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/ActivityPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/AddressPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/BooleanPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/CountryPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/DateTimePropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/FloatPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/IntegerPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/LegalFormSectorCodePropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/MultireferencePropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/PersonPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/ReferencePropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyCreators/StringPropertyCreator.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyMetadataBase.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/PropertyMetadataFactory.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/Validation/IValidationEndpointProvider.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/Validation/ValidationEndpointProvider.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/ViewModelBase.cs delete mode 100644 legacy/src/nscreg.ModelGeneration/nscreg.ModelGeneration.csproj delete mode 100644 legacy/src/nscreg.Resources/Languages/Resource.Designer.cs delete mode 100644 legacy/src/nscreg.Resources/Languages/Resource.ky-KG.resx delete mode 100644 legacy/src/nscreg.Resources/Languages/Resource.resx delete mode 100644 legacy/src/nscreg.Resources/Languages/Resource.ru-RU.resx delete mode 100644 legacy/src/nscreg.Resources/nscreg.Resources.csproj delete mode 100644 legacy/src/nscreg.Server.Common/AutoMapperProfile.cs delete mode 100644 legacy/src/nscreg.Server.Common/BadRequestException.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/ForeingKeysResolver.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/StatUnitAnalysisHelper.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/StatUnitCheckPermissionsHelper.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/StatUnitCopyHelper.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/StatUnitCreationHelper.cs delete mode 100644 legacy/src/nscreg.Server.Common/Helpers/UnitsHistoryHolder.cs delete mode 100644 legacy/src/nscreg.Server.Common/Localization.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Account/DetailsEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Account/DetailsVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Account/LoginVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/ActivityCategories/ActivityCategoryVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Addresses/AddressListModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Addresses/AddressModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/AnalisysQueueCreateModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/AnalysisQueueListModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/AnalysisQueueModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/LogItemDetailsVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/LogItemModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/LogItemsListModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/LogsQueryModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/AnalysisQueue/SearchQueryModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataAccess/DataAccessAttributeM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataAccess/DataAccessAttributeVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataAccess/DataAccessModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSources/DataSourceEditVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSources/DataSourceVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSources/PropertyInfoM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSources/SearchQueryM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSources/SubmitM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSourcesQueue/QueueLogDetailsVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSourcesQueue/QueueLogVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSourcesQueue/QueueVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSourcesQueue/SearchQueryM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/DataSourcesQueue/UploadDataSourceVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Links/LinkCommentM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Links/LinkM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Links/LinkSearchM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Links/LinkSubmitM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/CodeLookupVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/IUnitVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/LookupVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/RegionLookupVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/SearchLookupModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/UnitLookupVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/UnitNodeVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Lookup/UnitSubmitM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/OrgLinks/OrgLinksNode.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/PaginatedQueryM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/PaginatedResultModelBase.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Regions/RegionM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Regions/RegionNode.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Roles/RoleListVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Roles/RoleSubmitM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Roles/RoleVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/SampleFrames/SampleFrameM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/SampleFrames/SearchQueryM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/SearchVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/ActivityM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/AddressM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Create/EnterpriseGroupCreateM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Create/EnterpriseUnitCreateM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Create/LegalUnitCreateM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Create/LocalUnitCreateM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Edit/EnterpriseGroupEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Edit/EnterpriseUnitEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Edit/LegalUnitEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Edit/LocalUnitEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/History/ChangedField.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/IStatUnitM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/InconsistentRecord.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/InconsistentRecordValidator.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/LinkInfo.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/PersonM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/PersonStatUnitModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Search/ActivityAdapterModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Search/AddressAdapterModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Search/PersonAdapterModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/Search/SearchViewAdapterModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/SearchItemVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/SearchQueryM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/SearchVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/StatUnitModelBase.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/StatUnitPersonsRoleModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/StatUnitViewModel.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/StatUnits/StatUnitViewModelCreator.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/IUserSubmit.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserCreateM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserEditM.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserListFilter.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserListItemVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserListVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserRoleVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/Models/Users/UserVm.cs delete mode 100644 legacy/src/nscreg.Server.Common/NotFoundException.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/AccessAttributesService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/AddressService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/AnalysisQueueService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/CodeLookup/ActivityCodeLookupStrategy.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/CodeLookup/CodeLookupService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/CodeLookup/CodeLookupStrategy.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/CodeLookupProvider.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/Contracts/IAddressService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/Contracts/IRegionService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/Contracts/IStatUnitAnalyzeService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/Contracts/IUserService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataAccessAttributesProvider.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/BulkUpsertUnitService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/DbLogBuffer.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/EditUnitService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/FileParser.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/GetStatUnitSetHelper.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/IdComparer.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/PopulateService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/QueueService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/SaveManager.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/StatUnitPostProcessor.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSources/UpsertUnitBulkBuffer.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSourcesQueueService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/DataSourcesService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/LookupService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/PersonService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/RegionService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/ReportService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/RoleService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/SampleFrames/PropertyValuesProvider.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/SampleFrames/SampleFrameExecutor.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/SampleFrames/SampleFramesService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/AnalyzeService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/CommonService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/CreateService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/DataAccessService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/DeleteService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/EditService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/ElasticService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/HistoryService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/IElasticService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/LinkService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/SearchService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/StatUnit/ViewService.cs delete mode 100644 legacy/src/nscreg.Server.Common/Services/UserService.cs delete mode 100644 legacy/src/nscreg.Server.Common/UserAccess.cs delete mode 100644 legacy/src/nscreg.Server.Common/Validators/CheckStringNotEmptyAndGreaterThanValidator.cs delete mode 100644 legacy/src/nscreg.Server.Common/Validators/Extensions/PersonExtention.cs delete mode 100644 legacy/src/nscreg.Server.Common/Validators/Extensions/StatUnitExtension.cs delete mode 100644 legacy/src/nscreg.Server.Common/Validators/Extensions/ValidatorExtetions.cs delete mode 100644 legacy/src/nscreg.Server.Common/Validators/StatUnitCreateEditBaseValidator.cs delete mode 100644 legacy/src/nscreg.Server.Common/nscreg.Server.Common.csproj delete mode 100644 legacy/src/nscreg.Server/Controllers/AccessAttributes.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Account.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Activities.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Addresses.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/AnalysisQueue.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/DataSources.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/DataSourcesQueue.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Home.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/LegalForms.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Links.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Lookup.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Persons.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Regions.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Reports.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Roles.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/SampleFrames.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/SectorCodes.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/StatUnits.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/StatUnitsDeleted.cs delete mode 100644 legacy/src/nscreg.Server/Controllers/Users.cs delete mode 100644 legacy/src/nscreg.Server/Core/Authorize/AttributeAuthorizationHandler.cs delete mode 100644 legacy/src/nscreg.Server/Core/Authorize/SystemFunctionAttribute.cs delete mode 100644 legacy/src/nscreg.Server/Core/Authorize/SystemFunctionAuthHandler.cs delete mode 100644 legacy/src/nscreg.Server/Core/Authorize/SystemFunctionAuthRequirement.cs delete mode 100644 legacy/src/nscreg.Server/Core/ClaimsPrincipalExtensions.cs delete mode 100644 legacy/src/nscreg.Server/Core/DisableValidateModelStateAttribute.cs delete mode 100644 legacy/src/nscreg.Server/Core/GlobalExceptionFilter.cs delete mode 100644 legacy/src/nscreg.Server/Core/StartupConfiguration.cs delete mode 100644 legacy/src/nscreg.Server/Core/ValidateModelStateAttribute.cs delete mode 100644 legacy/src/nscreg.Server/Dockerfile delete mode 100644 legacy/src/nscreg.Server/EvolveMigrations/MsSql/V1_1_0_0__Optimization_create_indices.sql delete mode 100644 legacy/src/nscreg.Server/EvolveMigrations/PostgreSql/V1_1_0_0__Optimization_create_indices.sql delete mode 100644 legacy/src/nscreg.Server/HostedServices/AnalysisHostedService.cs delete mode 100644 legacy/src/nscreg.Server/HostedServices/BaseHostedService.cs delete mode 100644 legacy/src/nscreg.Server/HostedServices/DataUploadSvcHostedService.cs delete mode 100644 legacy/src/nscreg.Server/HostedServices/DataUploadSvcQueueCleanupHostedService.cs delete mode 100644 legacy/src/nscreg.Server/HostedServices/SampleFrameGenerationHostedService.cs delete mode 100644 legacy/src/nscreg.Server/Properties/launchSettings.json delete mode 100644 legacy/src/nscreg.Server/Startup.cs delete mode 100644 legacy/src/nscreg.Server/Views/Index.cshtml delete mode 100644 legacy/src/nscreg.Server/Views/LogIn.cshtml delete mode 100644 legacy/src/nscreg.Server/appsettings.Development.json delete mode 100644 legacy/src/nscreg.Server/appsettings.Production.json delete mode 100644 legacy/src/nscreg.Server/logs/default.txt delete mode 100644 legacy/src/nscreg.Server/nlog.config delete mode 100644 legacy/src/nscreg.Server/nscreg.Server.csproj delete mode 100644 legacy/src/nscreg.Server/sampleframes/default.txt delete mode 100644 legacy/src/nscreg.Server/uploads/default.txt delete mode 100644 legacy/src/nscreg.Server/wwwroot/browserconfig.xml delete mode 100644 legacy/src/nscreg.Server/wwwroot/crossdomain.xml delete mode 100644 legacy/src/nscreg.Server/wwwroot/humans.txt delete mode 100644 legacy/src/nscreg.Server/wwwroot/logo-small.jpg delete mode 100644 legacy/src/nscreg.Server/wwwroot/logo.png delete mode 100644 legacy/src/nscreg.Server/wwwroot/robots.txt delete mode 100644 legacy/src/nscreg.Server/wwwroot/tile-wide.png delete mode 100644 legacy/src/nscreg.Server/wwwroot/tile.png delete mode 100644 legacy/src/nscreg.ServiceUtils/Interfaces/IJob.cs delete mode 100644 legacy/src/nscreg.ServiceUtils/JobService.cs delete mode 100644 legacy/src/nscreg.ServiceUtils/JobWrapper.cs delete mode 100644 legacy/src/nscreg.ServiceUtils/nscreg.ServicesUtils.csproj delete mode 100644 legacy/src/nscreg.Utilities/AppsettingsValidation.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/AllowedToAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/AsyncValidationAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/DataAccessCommonAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/NotCompare.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/NotMappedForAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/OperationAllowedAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/PopupLocalizedKeyAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/PrintableStringAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/ReferenceAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/SearchComponentAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Attributes/UsedByServerSideAttribute.cs delete mode 100644 legacy/src/nscreg.Utilities/Classes/DataProperty.cs delete mode 100644 legacy/src/nscreg.Utilities/Classes/GenericDataProperty.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/ConnectionSettings.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/Activity.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/Addresses.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/DbMandatoryFields.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/Enterprise.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/EnterpriseGroup.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/LegalUnit.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/LocalUnit.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/Person.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/DBMandatoryFields/StatUnit.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/ISettings.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/Localization/Locale.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/Localization/LocalizationSettings.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/ReportingSettings.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/ServicesSettings.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/StatUnitAnalysis/Connections.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/StatUnitAnalysis/Duplicates.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/StatUnitAnalysis/Orphan.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/StatUnitAnalysis/StatUnitAnalysisRules.cs delete mode 100644 legacy/src/nscreg.Utilities/Configuration/ValidationSettings.cs delete mode 100644 legacy/src/nscreg.Utilities/CsvHelper.cs delete mode 100644 legacy/src/nscreg.Utilities/DataAccessAttributesHelper.cs delete mode 100644 legacy/src/nscreg.Utilities/DataAccessResolver.cs delete mode 100644 legacy/src/nscreg.Utilities/DataSourceVariableMappingHelper.cs delete mode 100644 legacy/src/nscreg.Utilities/DynamicContractResolver.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/ActionsEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/ChangeReasons.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/ConnectionProvider.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/GroupNames.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/LookupEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/OrderRule.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/Predicate/ComparisonEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/Predicate/FieldEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/Predicate/OperationEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/SortFields.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/StatUnitTypeOfSave.cs delete mode 100644 legacy/src/nscreg.Utilities/Enums/ValidationTypeEnum.cs delete mode 100644 legacy/src/nscreg.Utilities/EqualityComparerCreator.cs delete mode 100644 legacy/src/nscreg.Utilities/ExpressionUtils.cs delete mode 100644 legacy/src/nscreg.Utilities/Extensions/DictionaryExtensions.cs delete mode 100644 legacy/src/nscreg.Utilities/Extensions/EnumExtensions.cs delete mode 100644 legacy/src/nscreg.Utilities/Extensions/EnumerableExtensions.cs delete mode 100644 legacy/src/nscreg.Utilities/Extensions/StringExtensions.cs delete mode 100644 legacy/src/nscreg.Utilities/Extensions/TypeExtensions.cs delete mode 100644 legacy/src/nscreg.Utilities/JsonPathHelper.cs delete mode 100644 legacy/src/nscreg.Utilities/LocalizationProvider.cs delete mode 100644 legacy/src/nscreg.Utilities/LogExecutionTime.cs delete mode 100644 legacy/src/nscreg.Utilities/ObjectComparer.cs delete mode 100644 legacy/src/nscreg.Utilities/Pagination.cs delete mode 100644 legacy/src/nscreg.Utilities/nscreg.Utilities.csproj delete mode 100644 legacy/test/client.test/.eslintrc delete mode 100644 legacy/test/client.test/helpers/queryObjectToString.test.js delete mode 100644 legacy/test/client.test/helpers/string.test.js delete mode 100644 legacy/test/nscreg.Business.Test/Base/BaseTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/CsvParserTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PopulateServiceTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ConvertOrDefaultTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseActivityCategoryTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseActivityTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseAddressTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseCountryTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseDataSourceClassificationTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseLegalFormTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParsePersonTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseRegionTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/PropertyParserTest/ParseSectorCodeTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/StatUnitKeyValueParserTest/GetStatIdSourceKeyTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/StatUnitKeyValueParserTest/ParseAndMutateTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/DataSources/XmlParserTest.cs delete mode 100644 legacy/test/nscreg.Business.Test/nscreg.Business.Test.csproj delete mode 100644 legacy/test/nscreg.Server.Test/DataAccessResolverTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DataSourceQueues/ServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DataSourceVariableMappingHelperTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DataSources/EntityTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DataSources/ModelsTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DataSources/ServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/DynamicContractResolverTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/Extensions/DbContextExtensions.cs delete mode 100644 legacy/test/nscreg.Server.Test/Helpers/ServiceFactories.cs delete mode 100644 legacy/test/nscreg.Server.Test/Helpers/StatUnitTestHelper.cs delete mode 100644 legacy/test/nscreg.Server.Test/JsonPathHelperTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/LocalizationTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/RoleServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/RoleTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/SampleFramesServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/SettingsTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/StatUnitAnalysisRulesServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/StatUnitServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/StringExtensionsTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/UserServiceTest.cs delete mode 100644 legacy/test/nscreg.Server.Test/nscreg.Server.Test.csproj delete mode 100644 legacy/test/nscreg.Server.Test/xunit.runner.json delete mode 100644 legacy/test/nscreg.Server.TestUI/CommonScenarios.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Commons/OrderAttribute.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Commons/PriorityOrderer .cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Login/LoginTest.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/MenuMap.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Roles/RolePage.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Roles/RolesTest.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/SeleniumTestBase.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Setup.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/StatUnits/StatUnitPage.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/StatUnits/StatUnitsTest.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Users/UserPage.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/Users/UsersTest.cs delete mode 100644 legacy/test/nscreg.Server.TestUI/appsettings.json delete mode 100644 legacy/test/nscreg.Server.TestUI/nscreg.Server.TestUI.csproj delete mode 100644 legacy/test/nscreg.Services.Test/DataSources/QueueServiceTest/DequeueTest.cs delete mode 100644 legacy/test/nscreg.Services.Test/DataSources/QueueServiceTest/QueueServiceMainTest.cs delete mode 100644 legacy/test/nscreg.Services.Test/nscreg.Services.Test.csproj delete mode 100644 legacy/test/nscreg.TestUtils.Test/DateTimeFlushSecondsTest.cs delete mode 100644 legacy/test/nscreg.TestUtils.Test/InMemoryDbTest.cs delete mode 100644 legacy/test/nscreg.TestUtils.Test/nscreg.TestUtils.Test.csproj delete mode 100644 legacy/test/nscreg.TestUtils/DateTimeOffsetExtensions.cs delete mode 100644 legacy/test/nscreg.TestUtils/InMemoryDb.cs delete mode 100644 legacy/test/nscreg.TestUtils/InMemoryDbSqlite.cs delete mode 100644 legacy/test/nscreg.TestUtils/nscreg.TestUtils.csproj diff --git a/legacy/.github/actions/dotnet-build-test/action.yaml b/legacy/.github/actions/dotnet-build-test/action.yaml deleted file mode 100644 index 017d6a26f..000000000 --- a/legacy/.github/actions/dotnet-build-test/action.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: "Build for PR" -description: "Build and test dotnet project" - -inputs: - test_filter: - description: Test filter - required: true - configuration: - description: "Development|Production" - required: true - project: - description: "Path to the project or solution file" - required: true - -runs: - using: "composite" - steps: - - name: Setup .NET Core - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 3.1.x - - shell: bash - run: dotnet restore - - shell: bash - run: dotnet format --verify-no-changes || true - - shell: bash - run: dotnet build --configuration ${{ inputs.configuration }} --no-restore - - shell: bash - run: dotnet test --configuration ${{ inputs.configuration }} --no-build --verbosity normal --filter "${{ inputs.test_filter }}" --logger "GitHubActions" || true diff --git a/legacy/.github/linters/.jscpd.json b/legacy/.github/linters/.jscpd.json deleted file mode 100644 index 40952494c..000000000 --- a/legacy/.github/linters/.jscpd.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "threshold": 20, - "reporters": [ - "consoleFull", - "badge" - ], - "ignore": [ - "**/__snapshots__/**" - ], - "absolute": true -} diff --git a/legacy/.github/workflows/cd-workflow.yaml b/legacy/.github/workflows/cd-workflow.yaml deleted file mode 100644 index 6370cd162..000000000 --- a/legacy/.github/workflows/cd-workflow.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -################################## -################################## -## Continuous Delivery workflow ## -################################## -################################## -name: CD -on: - push: - branches: - - develop - - main - pull_request: -jobs: - build: - runs-on: ubuntu-20.04 - outputs: - version: ${{ steps.gitversion.outputs.FullSemVer }} - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 3.1.x - - uses: gittools/actions/gitversion/setup@v0.9.7 - with: - versionSpec: "5.x" - - name: Determine Version - id: gitversion - uses: gittools/actions/gitversion/execute@v0.9.7 - - - name: Docker meta - id: docker-meta - uses: docker/metadata-action@v4 - with: - github-token: ${{ github.token }} - images: | - ghcr.io/statisticsnorway/nscreg - tags: | - type=raw,value=${{ steps.gitversion.outputs.SemVer }} - type=raw,value=latest,enable={{is_default_branch}} - - name: Login to GitHub - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - file: ./src/nscreg.Server/Dockerfile - push: true - tags: ${{ steps.docker-meta.outputs.tags }} - labels: ${{ steps.docker-meta.outputs.labels }} - - deploy: - runs-on: ubuntu-20.04 - needs: build - steps: - - name: Fetch image - shell: bash - run: "echo docker pull ghcr.io/statisticsnorway/nscreg:latest" - - name: Deploy image - shell: bash - run: "echo Deploy 2" - e2e_test: - runs-on: ubuntu-20.04 - needs: deploy - steps: - - name: run e2e tests - shell: bash - run: "echo e2e" diff --git a/legacy/.github/workflows/ci-workflow.yaml b/legacy/.github/workflows/ci-workflow.yaml deleted file mode 100644 index 061dd0fca..000000000 --- a/legacy/.github/workflows/ci-workflow.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: CI -on: - workflow_dispatch: - push: - pull_request: - -jobs: - build-aspnet: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - uses: ./.github/actions/dotnet-build-test - with: - project: ./src/nscreg.Server/nscreg.Server.csproj - configuration: Debug - test_filter: Category=Unit - - build-app: - runs-on: ubuntu-20.04 - container: - image: node:20.10-alpine - steps: - - uses: actions/checkout@v3 - - name: Build app - run: | - cd app - npm ci - npm run lint -- --quiet - npm run build -- --no-lint diff --git a/legacy/.github/workflows/linter-workflow.yaml b/legacy/.github/workflows/linter-workflow.yaml deleted file mode 100644 index dfbfad40c..000000000 --- a/legacy/.github/workflows/linter-workflow.yaml +++ /dev/null @@ -1,78 +0,0 @@ ---- -################################# -################################# -## Super Linter GitHub Actions ## -################################# -################################# -name: Lint Code Base - -############################# -# Start the job on all push # -############################# -on: - push: - pull_request: - -############### -# Set the Job # -############### -jobs: - lint: - # Name the Job - name: Lint Code Base - # Set the agent to run on - runs-on: ubuntu-20.04 - - ################## - # Load all steps # - ################## - steps: - ########################## - # Checkout the code base # - ########################## - - name: Checkout Code - uses: actions/checkout@v3 - with: - # Full git history is needed to get a proper - # list of changed files within `super-linter` - fetch-depth: 0 - - ################################ - # Run Linter against code base # - ################################ - - name: Set DEFAULT_BRANCH to PR target - # if base_ref has a value, this is a PR - # we save the PR target branch name to a variable for use in linter config - # we pass string between job steps by echoing to $GITHUB_ENV, making it available in $env later - if: ${{ github.base_ref != '' }} - run: | - # shellcheck disable=2086 - echo "DEFAULT_BRANCH=${{ github.base_ref }}" >> $GITHUB_ENV - echo "this is a PR branch. Let's only lint the files that are changed against the target branch '${{ github.base_ref }}'" - - name: Set DEFAULT_BRANCH to current branch - # if base_ref has no value, this is just a commit on a branch - # we need to strip refs/heads from github.ref to find the current branch name - # then save the current branch name to a variable for use in linter config later - # we pass strings between job steps by echoing to $GITHUB_ENV, making it available in $env later - if: ${{ github.base_ref == '' }} - run: | - # shellcheck disable=2086 - echo "DEFAULT_BRANCH=$(echo '${{ github.ref }}' | sed 's/refs\/heads\///')" >> $GITHUB_ENV - echo "this is just a branch push, not a PR." - - run: printenv | grep BRANCH - - name: Lint Code Base - uses: github/super-linter/slim@v4 - env: - VALIDATE_ALL_CODEBASE: ${{ !contains(github.event_name, 'pull_request') }} - VALIDATE_CSHARP: false - VALIDATE_JAVASCRIPT_ES: false - VALIDATE_JAVASCRIPT_STANDARD: false - VALIDATE_TYPESCRIPT_ES: false - VALIDATE_TYPESCRIPT_STANDARD: false - VALIDATE_JSX: false - VALIDATE_CSS: false - VALIDATE_SQLFLUFF: false - VALIDATE_JSCPD_ALL_CODEBASE: ${{ !contains(github.event_name, 'pull_request') }} - DEFAULT_BRANCH: ${{ env.DEFAULT_BRANCH }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - IGNORE_GITIGNORED_FILES: true diff --git a/legacy/SQLWallet/key-5832e41d-f80d-4b6b-a790-5cc1cea1891c.xml b/legacy/SQLWallet/key-5832e41d-f80d-4b6b-a790-5cc1cea1891c.xml deleted file mode 100644 index eeb62bc89..000000000 --- a/legacy/SQLWallet/key-5832e41d-f80d-4b6b-a790-5cc1cea1891c.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017-11-21T04:27:04.5565224Z - 2017-11-21T04:27:04.5390102Z - 2117-10-28T04:27:04.5390102Z - - - - - - - Tz+EEjua1p8XscSSs314qVS7yGqsIoEdgn4HDTkM2IckferANVFBO5lvNyWMgM5SXQgBskuEa72YmfZIHliloA== - - - - diff --git a/legacy/SQLWallet/sqlwallet.s3db b/legacy/SQLWallet/sqlwallet.s3db deleted file mode 100644 index 9c53c7d6ebb783a58f14f97a6d34a24f0174d20a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183744 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 diff --git a/legacy/Services/AnalyseWorker.cs b/legacy/Services/AnalyseWorker.cs deleted file mode 100644 index 7e5db2297..000000000 --- a/legacy/Services/AnalyseWorker.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using NLog; -using nscreg.Data; -using nscreg.Server.Common.Services.Contracts; - -namespace nscreg.Services -{ - /// - /// Analysis work class - /// - public class AnalyseWorker - { - private readonly NSCRegDbContext _ctx; - private readonly IStatUnitAnalyzeService _analysisService; - private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); - - public AnalyseWorker(NSCRegDbContext ctx, - IStatUnitAnalyzeService analysisService) - { - _ctx = ctx; - _analysisService = analysisService; - } - - /// - /// Analysis processing method - /// - /// - public async Task Execute() - { - _logger.Info("analysis queue attempt..."); - var analysisQueue = await _ctx.AnalysisQueues.FirstOrDefaultAsync(aq => aq.ServerEndPeriod == null); - if (analysisQueue != null) - { - _logger.Info("analizing stat units queue {0}", analysisQueue.Id); - await _analysisService.AnalyzeStatUnits(analysisQueue); - } - } - } -} diff --git a/legacy/Services/DataUploadSvcWorker.cs b/legacy/Services/DataUploadSvcWorker.cs deleted file mode 100644 index 9a6af2609..000000000 --- a/legacy/Services/DataUploadSvcWorker.cs +++ /dev/null @@ -1,243 +0,0 @@ -using AutoMapper; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options; -using NLog; -using nscreg.Data; -using nscreg.Data.Entities; -using nscreg.Resources.Languages; -using nscreg.Server.Common.Services; -using nscreg.Server.Common.Services.Contracts; -using nscreg.Server.Common.Services.DataSources; -using nscreg.Server.Common.Services.StatUnit; -using nscreg.Utilities.Configuration; -using nscreg.Utilities.Extensions; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using QueueStatus = nscreg.Data.Constants.DataSourceQueueStatuses; - -namespace nscreg.Services -{ - public class DataUploadSvcWorker - { - private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); - private readonly DataAccessService _dataAccessService; - private readonly ServicesSettings _serviceSettings; - private readonly IMapper _mapper; - private QueueService _queueSvc; - - private DbLogBuffer _logBuffer; - private NSCRegDbContext _context; - private readonly IConfiguration _configuration; - - public DataUploadSvcWorker(IOptions servicesSettings, IMapper mapper, DataAccessService dataAccessService, IConfiguration configuration) - { - _serviceSettings = servicesSettings.Value; - _mapper = mapper; - _dataAccessService = dataAccessService; - _configuration = configuration; - } - - private void AddScopedServices() - { - var dbContextHelper = new DbContextHelper(_configuration); - _context = dbContextHelper.CreateDbContext(new string[] { }); - _queueSvc = new QueueService(_context); - _logBuffer = new DbLogBuffer(_context, _serviceSettings.DataUploadMaxBufferCount); - } - - /// - /// Queue execution method - /// - public async Task Execute() - { - AddScopedServices(); - - _logger.Info("dequeue attempt..."); - - var (dequeueError, dequeued) = await Dequeue(); - if (dequeueError.HasValue()) - { - _logger.Info("dequeue failed with error: {0}", dequeueError); - return; - } - if (dequeued == null) return; - try - { - //To wait for the elastic service to start - await Task.Delay(15000); - await new ElasticService(_context, _mapper).CheckElasticSearchConnection(); - } - catch (Exception ex) - { - _logger.Error("finish queue item with error: {0}", Resource.ElasticSearchIsDisable); - await _queueSvc.FinishQueueItem(dequeued, QueueStatus.DataLoadFailed, ex.Message); - return; - } - - if (_dataAccessService.CheckWritePermissions(dequeued.UserId, dequeued.DataSource.StatUnitType)) - { - var message = $"User doesn't have write permission for {dequeued.DataSource.StatUnitType}"; - _logger.Info("finish queue item with error: {0}", message); - await _queueSvc.FinishQueueItem(dequeued, QueueStatus.DataLoadFailed, message); - } - - var executor = new ImportExecutor(_mapper, _serviceSettings, _configuration); - var (parseError, parsed, problemLine) = await ParseFile(dequeued); - - if (parseError.HasValue()) - { - _logger.Error("finish queue item with error: {0}", parseError); - if (!string.IsNullOrEmpty(problemLine)) - _logger.Error($"Possible problem line:\n{problemLine}"); - await _queueSvc.FinishQueueItem(dequeued, QueueStatus.DataLoadFailed, parseError); - return; - } - - _logger.Info("parsed {0} entities", parsed.Length); - var anyWarnings = false; - var exceptionMessage = string.Empty; - await CatchAndLogException(async () => await executor.Start(dequeued, parsed), ex => - { - anyWarnings = true; - exceptionMessage = ex; - }); - await CatchAndLogException(async () => await _logBuffer.FlushAsync(), ex => - { - anyWarnings = true; - exceptionMessage = ex; - }); - - await _queueSvc.FinishQueueItem( - dequeued, - anyWarnings || executor.AnyWarnings - ? QueueStatus.DataLoadCompletedPartially - : QueueStatus.DataLoadCompleted, exceptionMessage); - - DisposeScopedServices(); - } - - private async Task CatchAndLogException(Func func, Action onException) - { - try - { - await func(); - } - catch (Exception e) - { - _logger.Error(e.ToString()); - onException(e.Message); - } - } - - private void DisposeScopedServices() - { - _queueSvc = null; - _context.Dispose(); - _logBuffer = null; - } - - private async Task<(string error, DataSourceQueue result)> Dequeue() - { - DataSourceQueue queueItem; - try - { - queueItem = await _queueSvc.Dequeue(); - } - catch (Exception ex) - { - return (ex.Message, null); - } - return (null, queueItem); - } - - private async Task<(string error, IReadOnlyDictionary[] result, string problemLine)> ParseFile(DataSourceQueue queueItem) - { - _logger.Info("parsing queue entry #{0}", queueItem.Id); - IEnumerable> parsed; - try - { - switch (queueItem.DataSourceFileName) - { - case string name when name.EndsWith(".xml", StringComparison.OrdinalIgnoreCase): - parsed = await FileParser.GetRawEntitiesFromXml(queueItem.DataSourcePath, - queueItem.DataSource.VariablesMappingArray, queueItem.SkipLinesCount); - break; - case string name when name.EndsWith(".csv", StringComparison.OrdinalIgnoreCase): - parsed = await FileParser.GetRawEntitiesFromCsv( - queueItem.DataSourcePath, - queueItem.DataSource.CsvDelimiter, - queueItem.DataSource.VariablesMappingArray, - queueItem.SkipLinesCount); - break; - default: - return ("Unsupported type of file", null, null); - } - } - catch (Exception ex) - { - return (ex.Message, null, ex.Data["ProblemLine"] as string); - } - var parsedArr = parsed.ToArray(); - - if (parsedArr.Length == 0) - { - return (Resource.UploadFileEmpty, parsedArr, null); - } - - if (parsedArr.Any(x => x.Count == 0)) - { - return (Resource.FileHasEmptyUnit, parsedArr, null); - } - return (null, parsedArr, null); - } - /// - /// Делает копию файла с удалением пустых строк - /// - /// - /// - private async Task MutateFileAsync(DataSourceQueue item) - { - var rawLines = (await GetRawFileAsync(item)) - .Select(x => x.EndsWith(item.DataSource.CsvDelimiter) - ? x.Substring(0, x.Length - 1) : x).ToArray(); //Remove the csv delimiter at the end of the line - try - { - await File.WriteAllTextAsync(item.DataSourcePath, - string.Join("\r\n", rawLines.Where(c => !string.IsNullOrEmpty(c))), encoding: Encoding.UTF8); - } - catch (Exception ex) - { - return ex.Message; - } - return string.Empty; - } - - private async Task GetRawFileAsync(DataSourceQueue item) - { - if (item.DataSource == null) throw new Exception(Resource.DataSourceNotFound); - string rawLines; - if (!File.Exists(item.DataSourcePath)) throw new FileNotFoundException(Resource.FileDoesntExistOrInQueue); - using (var stream = File.OpenRead(item.DataSourcePath)) - using (var reader = new StreamReader(stream, encoding: Encoding.UTF8)) - { - rawLines = await reader.ReadToEndAsync(); - } - - return rawLines.Split('\r', '\n'); - } - - /// - /// Method for performing queue cleanup - /// - public async Task QueueCleanup() - { - _logger.Info("cleaning up queue..."); - AddScopedServices(); - await new QueueService(_context).ResetDequeuedByTimeout(_serviceSettings.DataUploadServiceCleanupTimeout); - } - } -} diff --git a/legacy/Services/FileGenerationWorker.cs b/legacy/Services/FileGenerationWorker.cs deleted file mode 100644 index 798d82b9a..000000000 --- a/legacy/Services/FileGenerationWorker.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using nscreg.Data; -using nscreg.Data.Constants; -using Newtonsoft.Json; -using nscreg.Utilities.Enums.Predicate; -using System.Collections.Generic; -using nscreg.Business.SampleFrames; -using nscreg.Server.Common.Services.SampleFrames; -using nscreg.Utilities.Configuration; -using System.IO; -using Microsoft.Extensions.Options; -using NLog; -using System.Reflection; - -namespace nscreg.Services -{ - /// - /// Sample frame file generation job class - /// - public class FileGenerationWorker - { - public int Interval { get; } - private readonly NSCRegDbContext _ctx; - private readonly SampleFrameExecutor _sampleFrameExecutor; - private static Logger _logger = LogManager.GetCurrentClassLogger(); - private readonly int _timeoutMilliseconds; - private readonly string _sampleFramesDir; - - public FileGenerationWorker(NSCRegDbContext ctx, - IOptions servicesSettings, SampleFrameExecutor executor) - { - _ctx = ctx; - _sampleFrameExecutor = executor; - Interval = servicesSettings.Value.SampleFrameGenerationServiceDequeueInterval; - _timeoutMilliseconds = servicesSettings.Value.SampleFrameGenerationServiceCleanupTimeout; - _sampleFramesDir = servicesSettings.Value.SampleFramesDir; - } - - /// - /// Sample frame file generation method - /// - /// - public async Task Execute() - { - _logger.Info("sample frame generation/clearing attempt..."); - - var moment = DateTimeOffset.UtcNow.AddMilliseconds(-_timeoutMilliseconds); - var sampleFrameToDelete = await _ctx.SampleFrames.FirstOrDefaultAsync(sf => sf.Status == SampleFrameGenerationStatuses.Downloaded - || (sf.Status == SampleFrameGenerationStatuses.GenerationCompleted && sf.GeneratedDateTime < moment)); - if (sampleFrameToDelete != null) - { - _logger.Info("sample frame clearing: {0}", sampleFrameToDelete.Id); - if (File.Exists(sampleFrameToDelete.FilePath)) - File.Delete(sampleFrameToDelete.FilePath); - sampleFrameToDelete.FilePath = null; - sampleFrameToDelete.GeneratedDateTime = null; - sampleFrameToDelete.Status = SampleFrameGenerationStatuses.Pending; - _ctx.SaveChanges(); - } else - { - var sampleFrameQueue = await _ctx.SampleFrames.FirstOrDefaultAsync(sf => sf.Status == SampleFrameGenerationStatuses.InQueue); - if (sampleFrameQueue != null) - { - _logger.Info("sample frame generation: {0}", sampleFrameQueue.Id); - - sampleFrameQueue.Status = SampleFrameGenerationStatuses.InProgress; - _ctx.SaveChanges(); - - var path = Path.Combine(Path.GetFullPath(AssemblyDirectory), _sampleFramesDir); - Directory.CreateDirectory(path); - var filePath = Path.Combine(path, Guid.NewGuid() + ".csv"); - try - { - var fields = JsonConvert.DeserializeObject>(sampleFrameQueue.Fields); - var predicateTree = JsonConvert.DeserializeObject(sampleFrameQueue.Predicate); - await _sampleFrameExecutor.ExecuteToFile(predicateTree, fields, filePath); - sampleFrameQueue.FilePath = filePath; - sampleFrameQueue.GeneratedDateTime = DateTime.Now; - sampleFrameQueue.Status = SampleFrameGenerationStatuses.GenerationCompleted; - _ctx.SaveChanges(); - } - catch (Exception e) - { - sampleFrameQueue.FilePath = null; - sampleFrameQueue.GeneratedDateTime = DateTime.Now; - sampleFrameQueue.Status = SampleFrameGenerationStatuses.GenerationFailed; - _ctx.SaveChanges(); - if (File.Exists(filePath)) - File.Delete(filePath); - throw new Exception("Error occurred during file generation", e); - } - } - } - } - - private string AssemblyDirectory - { - get - { - string codeBase = Assembly.GetExecutingAssembly().Location; - UriBuilder uri = new UriBuilder(codeBase); - string path = Uri.UnescapeDataString(uri.Path); - return Path.GetDirectoryName(path); - } - } - } -} diff --git a/legacy/Services/ImportExecutor.cs b/legacy/Services/ImportExecutor.cs deleted file mode 100644 index c1d2c421b..000000000 --- a/legacy/Services/ImportExecutor.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using nscreg.Data.Constants; -using LogStatus = nscreg.Data.Constants.DataUploadingLogStatuses; -using nscreg.Server.Common.Services.DataSources; -using Newtonsoft.Json; -using nscreg.Data.Entities; -using nscreg.Utilities.Enums; -using nscreg.Business.Analysis.StatUnit; -using System.Linq; -using nscreg.Data; -using nscreg.Server.Common.Models.StatUnits; -using nscreg.Server.Common.Services.StatUnit; -using nscreg.Utilities.Configuration; -using nscreg.Utilities.Extensions; -using nscreg.Resources.Languages; -using Microsoft.EntityFrameworkCore; -using NLog; -using AutoMapper; -using Microsoft.Extensions.Configuration; -using nscreg.Server.Common.Services; -using nscreg.Server.Common.Services.Contracts; -using nscreg.Utilities.Configuration.StatUnitAnalysis; -using nscreg.Utilities.Configuration.DBMandatoryFields; - -namespace nscreg.Services -{ - public class ImportExecutor - { - public bool AnyWarnings { get; private set; } - private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); - private readonly IMapper _mapper; - private readonly ServicesSettings _servicesSettings; - private readonly IConfiguration _configuration; - - private readonly StatUnitAnalysisRules _analysisRules; - private readonly DbMandatoryFields _mandatoryFields; - private readonly ValidationSettings _validationSettings; - - public ImportExecutor(IMapper mapper, ServicesSettings servicesSettings, IConfiguration configuration) - { - _mapper = mapper; - _servicesSettings = servicesSettings; - _configuration = configuration; - _analysisRules = configuration.GetSection(nameof(StatUnitAnalysisRules)).Get(); - _mandatoryFields = configuration.GetSection(nameof(DbMandatoryFields)).Get(); - _validationSettings = configuration.GetSection(nameof(ValidationSettings)).Get(); - } - - public Task Start(DataSourceQueue dequeued, IReadOnlyDictionary[] keyValues) => Task.Run(Job(dequeued, keyValues)); - - private Func Job(DataSourceQueue dequeued, IReadOnlyDictionary[] keyValues) => async () => - { - var dbContextHelper = new DbContextHelper(_configuration); - NSCRegDbContext context = null; - UpsertUnitBulkBuffer sqlBulkBuffer = null; - PopulateService populateService = null; - SaveManager saveService = null; - IStatUnitAnalyzeService analyzeService = null; - DbLogBuffer logBuffer = null; - bool isAdmin = false; - for (int i = 0; i < keyValues.Length; i++) - { - var parsedUnit = keyValues[i]; - if(i % _servicesSettings.DataUploadMaxBufferCount == 0) - { - if(sqlBulkBuffer != null) - { - _logger.Debug("Flushing"); - await sqlBulkBuffer.FlushAsync(); - await logBuffer.FlushAsync(); - await context.DisposeAsync(); - } - - context = dbContextHelper.CreateDbContext(new string[] { }); - context.Database.SetCommandTimeout(180); - await InitializeCacheForLookups(context); - var userService = new UserService(context, _mapper); - analyzeService = new AnalyzeService(context, _analysisRules, _mandatoryFields, _validationSettings); - logBuffer = new DbLogBuffer(context, _servicesSettings.DataUploadMaxBufferCount); - var permissions = await new CommonService(context, _mapper).InitializeDataAccessAttributes(userService, null, dequeued.UserId, dequeued.DataSource.StatUnitType); - sqlBulkBuffer = new UpsertUnitBulkBuffer(context, new ElasticService(context, _mapper), permissions, dequeued, _mapper, _servicesSettings.DataUploadMaxBufferCount); - populateService = new PopulateService(dequeued.DataSource.VariablesMappingArray, dequeued.DataSource.AllowedOperations, dequeued.DataSource.StatUnitType, context, dequeued.UserId, permissions, _mapper); - saveService = new SaveManager(context, sqlBulkBuffer, permissions, _mapper, dequeued.UserId); - isAdmin = await userService.IsInRoleAsync(dequeued.UserId, DefaultRoleNames.Administrator); - } - - _logger.Debug("processing entity #{0}", i); - var startedAt = DateTime.Now; - - /// Populate Unit - _logger.Trace("populating unit"); - (StatisticalUnit populated, bool isNew, string populateError, StatisticalUnit historyUnit) = await populateService.PopulateAsync(parsedUnit, isAdmin, startedAt, _servicesSettings.PersonGoodQuality); - - if (populateError.HasValue()) - { - _logger.Trace("error during populating of unit: {0}", populateError); - AnyWarnings = true; - await LogUpload(LogStatus.Error, populateError, analysisSummary: new List() { populateError }); - continue; - } - - populated.DataSource = dequeued.DataSourceFileName; - populated.ChangeReason = ChangeReasons.Edit; - populated.EditComment = "Uploaded from data source file"; - - /// Analyze Unit - - _logger.Trace("analyzing populated unit RegId={0}", populated.RegId > 0 ? populated.RegId.ToString() : "(new)"); - - var (analysisError, (errors, summary)) = await AnalyzeUnitAsync(analyzeService, populated, dequeued); - - if (analysisError.HasValue()) - { - _logger.Trace("analysis attempt failed with error: {0}", analysisError); - AnyWarnings = true; - await LogUpload(LogStatus.Error, analysisError); - continue; - } - if (errors.Any()) - { - _logger.Trace("analysis revealed {0} errors", errors.Count); - errors.Values.ForEach(x => x.ForEach(e => _logger.Trace(Resource.ResourceManager.GetString(e.ToString())))); - AnyWarnings = true; - await LogUpload(LogStatus.Warning, string.Join(",", errors.SelectMany(c => c.Value)), errors, summary); - continue; - } - - /// Save Unit - - _logger.Trace("saving unit"); - - var (saveError, saved) = await saveService.SaveUnit(populated, dequeued.DataSource, dequeued.UserId, isNew, historyUnit); - - if (saveError.HasValue()) - { - _logger.Debug(saveError); - AnyWarnings = true; - await LogUpload(LogStatus.Warning, saveError); - continue; - } - - if (!saved) AnyWarnings = true; - await LogUpload(saved ? LogStatus.Done : LogStatus.Warning); - - - async Task LogUpload(LogStatus status, string note = "", - IReadOnlyDictionary analysisErrors = null, - IEnumerable analysisSummary = null) - { - - var rawUnit = JsonConvert.SerializeObject(dequeued.DataSource.VariablesMappingArray.ToDictionary(x => x.target, x => - { - var tmp = x.source.Split('.', 2); - return tmp[0]; - })); - await logBuffer.LogUnitUpload( - dequeued, rawUnit, startedAt, populated, - status, note ?? "", analysisErrors, analysisSummary); - - } - } - await sqlBulkBuffer.FlushAsync(); - }; - - private async Task<(string, (IReadOnlyDictionary, string[] test))> AnalyzeUnitAsync(IStatUnitAnalyzeService analyzeService, IStatisticalUnit unit, DataSourceQueue queueItem) - { - if (queueItem.DataSource.DataSourceUploadType != DataSourceUploadTypes.StatUnits) - return (null, (new Dictionary(), new string[0])); - - AnalysisResult analysisResult; - try - { - analysisResult = await analyzeService.AnalyzeStatUnit(unit, queueItem.DataSource.AllowedOperations == DataSourceAllowedOperation.Alter, true, false); - } - catch (Exception ex) - { - return (ex.Message, (null, null)); - } - return (null, ( - analysisResult.Messages, - analysisResult.SummaryMessages?.ToArray() ?? Array.Empty())); - } - - private static async Task InitializeCacheForLookups(NSCRegDbContext context) - { - await context.ActivityCategories.AsNoTracking().LoadAsync(); - await context.PersonTypes.AsNoTracking().LoadAsync(); - await context.RegistrationReasons.AsNoTracking().LoadAsync(); - await context.Regions.AsNoTracking().LoadAsync(); - await context.UnitSizes.AsNoTracking().LoadAsync(); - await context.UnitStatuses.AsNoTracking().LoadAsync(); - await context.ReorgTypes.AsNoTracking().LoadAsync(); - await context.SectorCodes.AsNoTracking().LoadAsync(); - await context.DataSourceClassifications.AsNoTracking().LoadAsync(); - await context.LegalForms.AsNoTracking().LoadAsync(); - await context.ForeignParticipations.AsNoTracking().LoadAsync(); - await context.Countries.AsNoTracking().LoadAsync(); - await context.UserRegions.AsNoTracking().LoadAsync(); - } - } -} diff --git a/legacy/Services/Services.csproj b/legacy/Services/Services.csproj deleted file mode 100644 index 62a7db0e7..000000000 --- a/legacy/Services/Services.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - - - - - - - - - diff --git a/legacy/appsettings.Shared.json b/legacy/appsettings.Shared.json deleted file mode 100644 index 32cab709d..000000000 --- a/legacy/appsettings.Shared.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "ConnectionSettings": { - "ConnectionString": "Server=localhost;Port=6543;Database=statbus_development;User Id=statbus_development;Password=boo8baequoopo5Eoneez;Include Error Detail=true;", - "Provider": "PostgreSql" - }, - "DataProtectionKeysDir": "keys", - "ElasticServiceAddress": "http://elasticsearch:9200", - "ElasticStatUnitSearchIndexName": "demoview", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "ServicesSettings": { - "PersonGoodQuality": true, - "DataUploadMaxBufferCount": 500, - "ElementsForRecreateContext": 50000, - "SampleFrameGenerationServiceDequeueInterval": 60, - "SampleFrameGenerationServiceCleanupTimeout": 7200000, - "StatUnitAnalysisServiceDequeueInterval": 60, - "DataUploadServiceDequeueInterval": 10, - "DataUploadServiceCleanupTimeout": 60, - "UploadDir": "uploads", - "SampleFramesDir": "sampleframes" - }, - "LocalizationSettings": { - "Locales": [ - { - "Key": "en-GB", - "Text": "English" - }, - { - "Key": "ky-KG", - "Text": "Кыргызча" - }, - { - "Key": "ru-RU", - "Text": "Русский" - } - ], - "DefaultKey": "en-GB", - "Language1": "ky-KG", - "Language2": "ru-RU" - }, - "DbMandatoryFields": { - "Addresses": { - "AddressPart1": false, - "AddressPart2": false, - "AddressPart3": false, - "GeographicalCodes": true, - "Latitude": false, - "Longitude": false - }, - "StatUnit": { - "StatId": true, - "StatIdDate": true, - "ExternalId": false, - "ExternalIdType": false, - "ExternalIdDate": false, - "Name": true, - "ShortName": false, - "Address": false, - "TelephoneNo": false, - "Activities": false, - "RegistrationDate": false, - "RegistrationReasonId": false, - "ActualAddress": false, - "Persons": false, - "Employees": false, - "NumOfPeopleEmp": false, - "EmployeesYear": false, - "EmployeesDate": false, - "TaxRegId": false, - "TaxRegDate": false, - "Turnover": false, - "TurnoverYear": false, - "TurnoverDate": false, - "StatusDate": false, - "FreeEconZone": false, - "Classified": false, - "SizeId": false, - "DataSourceClassificationId": false, - "UnitStatusId": true - }, - "LegalUnit": { - "Market": false, - "LegalFormId": false, - "InstSectorCodeId": false, - "TotalCapital": false, - "EnterpriseUnitRegId": false, - "EntRegIdDate": false, - "LocalUnits": false - }, - "Enterprise": { - "InstSectorCodeId": false, - "EntGroupId": false, - "EntGroupIdDate": false - }, - "LocalUnit": { - "LegalUnitId": false, - "LegalUnitIdDate": false - }, - "EnterpriseGroup": { - "StatId": true, - "StatIdDate": true, - "TaxRegId": false, - "TaxRegDate": false, - "ExternalId": false, - "ExternalIdType": false, - "ExternalIdDate": false, - "Name": true, - "ShortName": false, - "Address": false, - "PostalAddress": false, - "TelephoneNo": false, - "EmailAddress": false, - "WebAddress": false, - "EntGroupTypeId": true, - "RegistrationDate": false, - "ContactPerson": false, - "Employees": false, - "NumOfPeopleEmp": false, - "EmployeesYear": false, - "EmployeesDate": false, - "Turnover": false, - "TurnoverYear": false, - "TurnoverDate": false, - "StatusDate": true, - "Notes": false, - "SizeId": false, - "DataSourceClassificationId": false, - "UnitStatusId": true, - "ActualAddress": false, - "EnterpriseUnits": true - }, - "Person": { - "PersonalId": false, - "GivenName": true, - "Surname": true, - "BirthDate": false, - "Sex": false, - "Role": false, - "CountryId": false, - "Address": false - }, - "Activity": { - "IdDate": true, - "ActivityCategoryId": false, - "ActivityYear": false, - "ActivityType": false, - "Employees": false, - "Turnover": false - } - }, - "StatUnitAnalysisRules": { - "Connections": { - "CheckRelatedActivities": false, - "CheckRelatedPersons": false, - "CheckAddress": false - }, - "Orphan": { - "CheckOrphanLocalUnits": false, - "CheckOrphanLegalUnits": false, - "CheckLegalUnitRelatedLocalUnits": false, - "CheckEnterpriseRelatedLegalUnits": false, - "CheckEnterpriseGroupRelatedEnterprises": false - }, - "Duplicates": { - "CheckName": true, - "CheckStatId": true, - "CheckTaxRegId": false, - "CheckExternalId": false, - "CheckShortName": false, - "CheckTelephoneNo": false, - "CheckAddressId": false, - "CheckEmailAddress": false, - "MinimalIdenticalFieldsCount": 2 - }, - "CustomAnalysisChecks": true - }, - "ReportingSettings": { - "HostName": "localhost:88", - "ExternalHostName": "", - "SecretKey": "secret", - "LinkedServerName": "SQLWALLET", - "SQLiteConnectionString": "Data Source=./SQLWallet/sqlwallet.s3db" - }, - "ValidationSettings": { - "ValidateStatIdChecksum": false, - "StatIdUnique": false - } -} diff --git a/legacy/client/.nvmrc b/legacy/client/.nvmrc deleted file mode 100644 index 2ab3d4be5..000000000 --- a/legacy/client/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v16.20.2 diff --git a/legacy/client/.parcelrc b/legacy/client/.parcelrc deleted file mode 100644 index 0bf68e7e2..000000000 --- a/legacy/client/.parcelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "@parcel/config-default", - "reporters": ["...", "parcel-reporter-bundle-manifest", "parcel-reporter-static-files-copy"] -} diff --git a/legacy/client/App.jsx b/legacy/client/App.jsx deleted file mode 100644 index 3670a807f..000000000 --- a/legacy/client/App.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import { Provider } from 'react-redux' -import { Router, browserHistory } from 'react-router' -import { syncHistoryWithStore } from 'react-router-redux' - -import './styles.scss' -import routes from './routes.jsx' - -// eslint-disable-next-line react/prop-types -export default ({ store }) => ( - - - -) diff --git a/legacy/client/apple-touch-icon.png b/legacy/client/apple-touch-icon.png deleted file mode 100644 index 2ad984992c98bfeadca5b845c0be1afee2ecc22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3420 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 - - - - - - - - - - - diff --git a/legacy/client/components/ActivityTree.jsx b/legacy/client/components/ActivityTree.jsx deleted file mode 100644 index 4c23c7780..000000000 --- a/legacy/client/components/ActivityTree.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react' -import { func, string, arrayOf, shape, bool } from 'prop-types' -import Tree from 'antd/lib/tree' -import { Loader } from 'semantic-ui-react' - -import { getNewName } from 'helpers/locale.js' - -const { TreeNode } = Tree - -export const transform = x => ({ - ...x, - name: getNewName(x, true), -}) - -const buildSubtree = (parent, tree) => { - const children = tree.filter(c => c.parentId === parent.id) - return ( - - {children.length ? children.map(x => buildSubtree(x, tree)) : null} - - ) -} - -const buildTree = (parents, dataTree) => parents.map(x => buildSubtree(x, dataTree)) - -const onLoadData = loadNode => (node) => { - const key = node.props.eventKey - if (key !== 'all') { - loadNode(key) - } - return new Promise((resolve) => { - resolve() - }) -} - -const ActivityTree = ({ - dataTree, - localize, - name, - label, - checked, - callBack, - loadNode, - loaded, - disabled, -}) => { - const tree = buildTree( - dataTree.filter(x => x.parentId === 0).map(transform), - dataTree.map(transform), - ) - return ( -
- -
- {loaded ? ( - - - {tree} - - - ) : ( - - )} -
- ) -} - -ActivityTree.propTypes = { - localize: func.isRequired, - callBack: func.isRequired, - name: string.isRequired, - label: string.isRequired, - dataTree: arrayOf(shape({})).isRequired, - checked: arrayOf(string), - loadNode: func.isRequired, - loaded: bool, - disabled: bool, -} - -ActivityTree.defaultProps = { - checked: [], - loaded: true, - disabled: false, -} - -export default ActivityTree diff --git a/legacy/client/components/DataAccess/index.jsx b/legacy/client/components/DataAccess/index.jsx deleted file mode 100644 index e4efc1e13..000000000 --- a/legacy/client/components/DataAccess/index.jsx +++ /dev/null @@ -1,138 +0,0 @@ -import React, { useState } from 'react' -import PropTypes from 'prop-types' -import Tree from 'antd/lib/tree' -import { groupByToArray, mapToArray } from '/helpers/enumerable' -import { statUnitTypes } from '/helpers/enums' -import { toCamelCase } from '/helpers/string' -import styles from './styles.scss' - -const { TreeNode } = Tree - -const unitTypes = mapToArray(statUnitTypes).map(v => v.value) - -const validUnit = PropTypes.arrayOf(PropTypes.shape({ - name: PropTypes.string.isRequired, - allowed: PropTypes.bool.isRequired, -}).isRequired) - -const compareByName = (a, b) => { - if (a.name < b.name) return -1 - if (a.name > b.name) return 1 - return 0 -} - -function DataAccess(props) { - const [checkedReadKeys, setCheckedReadKeys] = useState([]) - const [checkedWriteKeys, setCheckedWriteKeys] = useState([]) - - const onCheck = permission => (checkedKeys, { node }) => { - const { value, name, onChange } = props - const keys = new Set(checkedKeys) - const { type } = node.props.node - onChange(null, { - name, - value: { - ...value, - [type]: value[type].map((v) => { - const allowed = keys.has(v.name) - return { - ...v, - [permission]: allowed, - canWrite: - permission === 'canRead' && !allowed - ? allowed - : permission === 'canWrite' && allowed - ? allowed && v.canRead - : permission === 'canWrite' - ? allowed - : v.canWrite, - } - }), - }, - }) - } - - const { name, value, label, localize, readEditable, writeEditable } = props - - const dataAccessItems = (type, items) => - items - .map(x => ({ - key: x.name, - name: localize(x.localizeKey), - type, - children: null, - })) - .sort(compareByName) - - const dataAccessGroups = (type, items) => - groupByToArray(items, v => v.groupName) - .map(x => ({ - key: `Group-${type}-${x.key}`, - type, - name: localize(x.key || 'Other'), - children: dataAccessItems(type, x.value), - })) - .sort(compareByName) - - const dataAccessByType = (items, localizeKey) => { - const type = toCamelCase(localizeKey) - return { - key: localizeKey, - type, - name: localize(localizeKey), - children: dataAccessGroups(type, items), - } - } - - const loop = (nodes, editable, checkedKeys, onCheck) => - nodes.map(item => ( - - {item.children !== null && loop(item.children, editable, checkedKeys, onCheck)} - - )) - - const root = unitTypes.map(v => dataAccessByType(value[toCamelCase(v)], v)) - - return ( -
- -
-
- {localize('Read')} - - {loop(root, readEditable, checkedReadKeys, onCheck('canRead'))} - -
-
- {localize('Write')} - - {loop(root, writeEditable, checkedWriteKeys, onCheck('canWrite'))} - -
-
-
- ) -} - -DataAccess.propTypes = { - label: PropTypes.string.isRequired, - value: PropTypes.shape({ - legalUnit: validUnit, - localUnit: validUnit, - enterpriseUnit: validUnit, - enterpriseGroup: validUnit, - }).isRequired, - name: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, - localize: PropTypes.func.isRequired, - readEditable: PropTypes.bool.isRequired, - writeEditable: PropTypes.bool.isRequired, -} - -export default DataAccess diff --git a/legacy/client/components/DataAccess/styles.scss b/legacy/client/components/DataAccess/styles.scss deleted file mode 100644 index 21f67e409..000000000 --- a/legacy/client/components/DataAccess/styles.scss +++ /dev/null @@ -1,13 +0,0 @@ -.tree-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.tree-column { - display: flex; - flex-direction: column; - > span { - justify-self: center; - } -} diff --git a/legacy/client/components/FunctionalAttributes.jsx b/legacy/client/components/FunctionalAttributes.jsx deleted file mode 100644 index 15e3507cd..000000000 --- a/legacy/client/components/FunctionalAttributes.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react' -import { Table, Checkbox } from 'semantic-ui-react' -import systemFunctions from '/helpers/systemFunctions' - -const FunctionalAttributes = ({ localize, value, onChange, label, name }) => { - const onChangeCreator = propName => (e, { checked }) => { - onChange({ name, value: systemFunctions.get(propName), checked }) - } - - const isChecked = fname => value.some(x => x === systemFunctions.get(fname)) - - const renderTableRow = (attribute, read, create, update, del) => ( - - {localize(attribute)} - - - - - {create && ( - - )} - - - - - - {del && ( - - )} - - - ) - - return ( -
- - - - - - {localize('Read')} - {localize('Create')} - {localize('Update')} - {localize('Delete')} - - - - {renderTableRow('Account', true, false, true, false)} - {renderTableRow('Roles', true, true, true, true)} - {renderTableRow('Users', true, true, true, true)} - {renderTableRow('StatUnits', true, true, true, true)} - {renderTableRow('Regions', true, true, true, true)} - {renderTableRow('Address', true, true, true, true)} - {renderTableRow('LinkUnits', true, true, false, true)} - {renderTableRow('DataSourceQueues', true, false, false, false)} - -
-
- ) -} - -export default FunctionalAttributes diff --git a/legacy/client/components/Info.jsx b/legacy/client/components/Info.jsx deleted file mode 100644 index e1d9dbb88..000000000 --- a/legacy/client/components/Info.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' - -const Info = ({ label, text }) => { - const id = `${label}.${text}` - return ( -

- - - - {text} -

- ) -} - -const { number, oneOfType, string } = PropTypes -Info.propTypes = { - label: string, - text: oneOfType([number, string]), -} - -Info.defaultProps = { - label: '', - text: '', -} - -export default Info diff --git a/legacy/client/components/ListWithDnd.jsx b/legacy/client/components/ListWithDnd.jsx deleted file mode 100644 index bc3466e60..000000000 --- a/legacy/client/components/ListWithDnd.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd' -import { List } from 'semantic-ui-react' -import * as R from 'ramda' - -const ListWithDnd = ({ value, renderItem, getItemKey, id, listProps, listItemProps, onChange }) => { - const onDragEnd = ({ source, destination }) => { - if (destination == null) return - const result = Array.from(value) - const [removed] = result.splice(source.index, 1) - result.splice(destination.index, 0, removed) - onChange(result) - } - return ( - - - {(droppable, { isDraggingOver }) => ( - -
- {value.map((item, i) => ( - - {({ innerRef, draggableProps, dragHandleProps, placeholder }, { isDragging }) => ( - -
- {renderItem(item, i)} -
- {placeholder} -
- )} -
- ))} -
-
- )} -
-
- ) -} - -const { array, arrayOf, func, oneOfType, number, shape, string } = PropTypes -ListWithDnd.propTypes = { - value: arrayOf(oneOfType([shape({}), string, number, array])).isRequired, - renderItem: func.isRequired, - getItemKey: func, - id: string, - listProps: shape({}), - listItemProps: oneOfType([func, shape({})]), - onChange: func.isRequired, -} -ListWithDnd.defaultProps = { - getItemKey: R.identity, - id: 'ListWithDnd', - listProps: {}, - listItemProps: {}, -} - -export default ListWithDnd diff --git a/legacy/client/components/Paginate/Paginate.jsx b/legacy/client/components/Paginate/Paginate.jsx deleted file mode 100644 index 070229e32..000000000 --- a/legacy/client/components/Paginate/Paginate.jsx +++ /dev/null @@ -1,155 +0,0 @@ -import React from 'react' -import { node, number, func, oneOfType, shape, string } from 'prop-types' -import { Menu } from 'semantic-ui-react' -import { Link } from 'react-router' -import { is, replace } from 'ramda' - -import { defaultPageSize, getPagesRange, getPageSizesRange } from 'helpers/paginate.js' -import styles from './styles.scss' - -class Paginate extends React.Component { - static propTypes = { - routing: shape({ - pathname: string, - page: oneOfType([number, string]), - pageSize: oneOfType([number, string]), - queryString: string, - }).isRequired, - totalCount: oneOfType([number, string]), - children: node.isRequired, - localize: func.isRequired, - updateFilter: func.isRequired, - } - - static defaultProps = { - totalCount: 0, - } - - getPage() { - return this.props.routing.page > this.getTotalPages() - ? this.getTotalPages() - : Number(this.props.routing.page) || 1 - } - - getPageSize() { - return Number(this.props.routing.pageSize) || defaultPageSize - } - - getTotalCount() { - return Number(this.props.totalCount) - } - - getTotalPages() { - return Math.ceil(this.getTotalCount() / this.getPageSize()) - } - - getLastPage() { - return (this.getTotalPages() - 1) * this.getPageSize() - } - - getDisplayTotalString() { - const { localize } = this.props - const to = this.getPage() * this.getPageSize() - // eslint-disable-next-line no-mixed-operators - const from = to - this.getPageSize() + 1 - - const rangeDescription = - this.getTotalPages() === 1 - ? localize('AllOf') - : this.getTotalPages() === 0 - ? `0 ${localize('OfCount')}` - : from === to - ? `№ ${from} ${localize('OfCount')}` - : to > this.getTotalCount() - ? `${this.getLastPage() + 1} - ${this.getTotalCount()} ${localize('OfCount')}` - : `${from} - ${to} ${localize('OfCount')}` - - return `${localize('Displaying')} ${rangeDescription} ${this.getTotalCount()}` - } - - renderPageSizeLink(value) { - const { - routing: { pathname, queryString }, - updateFilter, - } = this.props - const current = this.getPageSize() - const lastPageOfCurrentPageSize = Math.ceil(this.getTotalCount() / value || defaultPageSize) - const nextQueryString = queryString.includes(`pageSize=${current}`) - ? replace(`pageSize=${current}`, `pageSize=${value}`, queryString) - : queryString - ? `${queryString}&pageSize=${value}` - : `?pageSize=${value}` - - const searchParams = new URLSearchParams(nextQueryString) - const currentPage = searchParams.get('page') - let queryStringWithLastPage - if (currentPage) { - if (currentPage > lastPageOfCurrentPageSize) { - queryStringWithLastPage = nextQueryString.replace( - `page=${currentPage}`, - `page=${lastPageOfCurrentPageSize}`, - ) - } - } - const isCurrent = value === current - const link = () => - isCurrent ? ( - {value} - ) : ( - updateFilter({ pageSize: value })} - > - {value} - - ) - - return - } - - renderPageLink(value) { - if (!is(Number, value)) return - const { pathname, queryString } = this.props.routing - const current = this.getPage() - - const nextQueryString = queryString.includes(`page=${current}`) - ? replace(`page=${current}`, `page=${value}`, queryString) - : queryString.includes('page=') - ? queryString.replace(/page=\d*/, `page=${value}`) - : queryString - ? `${queryString}&page=${value}` - : `?page=${value}` - - const isCurrent = value === current - const link = () => - isCurrent ? ( - {value} - ) : ( - - {value} - - ) - - return - } - - render() { - return ( -
- - - - {getPageSizesRange(this.getPageSize()).map(x => this.renderPageSizeLink(x))} - - {this.props.children} - - - {getPagesRange(this.getPage(), this.getTotalPages()).map(x => this.renderPageLink(x))} - -
- ) - } -} - -export default Paginate diff --git a/legacy/client/components/Paginate/index.jsx b/legacy/client/components/Paginate/index.jsx deleted file mode 100644 index 39a342bf5..000000000 --- a/legacy/client/components/Paginate/index.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import { connect } from 'react-redux' - -import { getText } from '/helpers/locale' -import Paginate from './Paginate.jsx' - -export default connect(( - { - locale, - routing: { - locationBeforeTransitions: { pathname, query, search }, - }, - }, - ownProps, -) => ({ - routing: { - ...query, - pathname, - queryString: search, - }, - localize: getText(locale), - ...ownProps, -}))(Paginate) diff --git a/legacy/client/components/Paginate/styles.scss b/legacy/client/components/Paginate/styles.scss deleted file mode 100644 index 6f64a928d..000000000 --- a/legacy/client/components/Paginate/styles.scss +++ /dev/null @@ -1,11 +0,0 @@ -.root { - width: 100%; - display: flex; - flex-direction: column; - justify-content: flex-start; - - .footer { - display: flex; - justify-content: center; - } -} diff --git a/legacy/client/components/Printable/Printable.jsx b/legacy/client/components/Printable/Printable.jsx deleted file mode 100644 index 069e2716e..000000000 --- a/legacy/client/components/Printable/Printable.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, { useRef } from 'react' -import { node, bool, string } from 'prop-types' -import ReactToPrint from 'react-to-print' - -import getUid from 'helpers/getUid.js' -import styles from './styles.scss' - -const Printable = ({ children, btnPrint, btnShowCondition }) => { - const printContainerId = useRef(`printContainer${getUid()}`) - const content = useRef(null) - - return ( -
-
- {children} -
-
- {btnShowCondition && ( - btnPrint} content={() => content.current} /> - )} -
-
-
- ) -} - -Printable.propTypes = { - children: node.isRequired, - btnShowCondition: bool, - btnPrint: node.isRequired, -} - -Printable.defaultProps = { - btnShowCondition: true, -} - -export default Printable diff --git a/legacy/client/components/Printable/styles.scss b/legacy/client/components/Printable/styles.scss deleted file mode 100644 index d3873d65a..000000000 --- a/legacy/client/components/Printable/styles.scss +++ /dev/null @@ -1,4 +0,0 @@ -.printStyle { - padding: 15px -} - diff --git a/legacy/client/components/RegionTree.jsx b/legacy/client/components/RegionTree.jsx deleted file mode 100644 index 2c47192e7..000000000 --- a/legacy/client/components/RegionTree.jsx +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react' -import { string, arrayOf, shape, bool, func } from 'prop-types' -import { Loader } from 'semantic-ui-react' -import Tree from 'antd/lib/tree' - -import { transform } from './ActivityTree.jsx' -import { getNewName } from 'helpers/locale.js' -import styles from './styles.scss' - -const { TreeNode } = Tree - -class RegionTree extends React.Component { - static propTypes = { - name: string.isRequired, - label: string.isRequired, - dataTree: shape({}).isRequired, - checked: arrayOf(string), - isView: bool, - localize: func, - callBack: func, - loaded: bool, - disabled: bool, - } - - static defaultProps = { - checked: [], - isView: false, - loaded: true, - disabled: false, - } - - getAllChilds(data) { - return data.map(x => ( - - {x.regionNodes && Object.keys(x.regionNodes).length > 0 - ? this.getAllChilds(x.regionNodes.map(transform)) - : null} - - )) - } - - getFilteredTree(node, ids) { - if (ids.has(node.id)) return - - const nodes = node.regionNodes.map(x => this.getFilteredTree(x, ids)).filter(x => x != null) - if (nodes.length == 0) return null - return ( - - {nodes} - - ) - } - - render() { - const { - localize, - name, - label, - checked, - callBack, - dataTree, - isView, - loaded, - disabled, - } = this.props - - return isView ? ( - {this.getFilteredTree(dataTree, new Set(checked))} - ) : ( -
- -
- {loaded ? ( - - - {this.getAllChilds(dataTree.regionNodes.map(transform))} - - - ) : ( - - )} -
- ) - } -} - -export default RegionTree diff --git a/legacy/client/components/SearchInput/index.jsx b/legacy/client/components/SearchInput/index.jsx deleted file mode 100644 index a18fa4ae6..000000000 --- a/legacy/client/components/SearchInput/index.jsx +++ /dev/null @@ -1,109 +0,0 @@ -import React, { useState, useEffect, useCallback } from 'react' -import { func, shape, string, bool } from 'prop-types' -import { Form, Search } from 'semantic-ui-react' -import debounce from 'lodash/debounce' -import { equals, isEmpty, isNil } from 'ramda' - -import { internalRequest } from '/helpers/request' -import simpleName from './nameCreator.js' - -const waitTime = 250 - -function SearchInput({ - localize, - searchData: { url, editUrl, label, placeholder, data: initialData }, - onValueSelected, - onValueChanged, - required, - disabled, -}) { - const [data, setData] = useState(initialData) - const [results, setResults] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [searchValue, setSearchValue] = useState('') - - useEffect(() => { - if (!isEmpty(initialData) && !equals(data, initialData)) { - setData(initialData) - } - }, [initialData]) - - const handleSearchResultSelect = (e, { result: { data } }) => { - e.preventDefault() - setData({ ...data, name: simpleName(data) }) - onValueSelected(data) - } - - const handleSearchChange = useCallback( - (e, { value }) => { - if (isNil(value) || isEmpty(value)) { - return - } - setData(prevData => ({ - ...prevData, - name: value, - })) - setSearchValue(value) - onValueChanged(value) - search(value) - }, - [onValueChanged], - ) - - const search = debounce((params) => { - internalRequest({ - url, - queryParams: { wildcard: params }, - method: 'get', - onSuccess: (result) => { - setIsLoading(false) - setResults(result.map(x => ({ - title: simpleName(x), - description: x.code, - data: x, - key: x.code, - }))) - }, - onFail: () => { - setIsLoading(false) - setResults([]) - onValueSelected({}) - }, - }) - }, waitTime) - - return ( - - ) -} - -SearchInput.propTypes = { - localize: func.isRequired, - searchData: shape({ - url: string.isRequired, - editUrl: string, - label: string.isRequired, - placeholder: string.isRequired, - data: shape({}).isRequired, - }).isRequired, - onValueSelected: func.isRequired, - onValueChanged: func.isRequired, - required: bool.isRequired, - disabled: bool.isRequired, -} - -export default SearchInput diff --git a/legacy/client/components/SearchInput/nameCreator.js b/legacy/client/components/SearchInput/nameCreator.js deleted file mode 100644 index 74813cd36..000000000 --- a/legacy/client/components/SearchInput/nameCreator.js +++ /dev/null @@ -1,4 +0,0 @@ -export default data => - data.adminstrativeCenter === null || data.adminstrativeCenter === undefined - ? data.name - : `${data.adminstrativeCenter}, ${data.name}` diff --git a/legacy/client/components/SearchInput/sources.js b/legacy/client/components/SearchInput/sources.js deleted file mode 100644 index 9dc986408..000000000 --- a/legacy/client/components/SearchInput/sources.js +++ /dev/null @@ -1,42 +0,0 @@ -export default { - region: { - url: '/api/regions/search', - label: 'Region', - placeholder: 'RegionAdd', - data: {}, - }, - activity: { - url: '/api/activities/search', - label: 'ActualMainActivity1', - placeholder: 'RegMainActivity', - data: {}, - }, - sectorCode: { - url: '/api/sectorcodes/search', - editUrl: '/api/sectorcodes/GetById/', - label: 'InstSectorCodeId', - placeholder: 'InstSectorCodeId', - data: {}, - }, - legalForm: { - url: '/api/legalforms/search', - editUrl: '/api/legalforms/GetById/', - label: 'LegalForm', - placeholder: 'LegalForm', - data: {}, - }, - parentOrgLink: { - url: '/api/StatUnits/SearchByWildcard', - editUrl: '/api/StatUnits/GetStatUnitById/', - label: 'ParentOrgLink', - placeholder: 'ParentOrgLink', - data: {}, - }, - reorgReferences: { - url: '/api/StatUnits/SearchByWildcard', - editUrl: '/api/StatUnits/GetStatUnitById/', - label: 'ReorgReferences', - placeholder: 'ReorgReferences', - data: {}, - }, -} diff --git a/legacy/client/components/StatUnitFormBody/Field.jsx b/legacy/client/components/StatUnitFormBody/Field.jsx deleted file mode 100644 index 3038442ab..000000000 --- a/legacy/client/components/StatUnitFormBody/Field.jsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' - -import { statUnitFormFieldTypes } from '/helpers/enums' -import handlerFor from '/helpers/handleSetFieldValue' -import { - CheckField, - DateTimeField, - NumberField, - TextField, - SelectField, - ActivitiesList, - PersonsList, - AddressField, - SearchField, - withDebounce, -} from '/components/fields' - -const DebouncedCheckField = withDebounce(CheckField) -const DebouncedDateTimeField = withDebounce(DateTimeField) -const DebouncedNumberField = withDebounce(NumberField) -const DebouncedTextField = withDebounce(TextField) - -const Field = ({ fieldType, setFieldValue, validationUrl, ...restProps }) => { - const props = { ...restProps, onChange: handlerFor(setFieldValue) } - - switch (statUnitFormFieldTypes.get(fieldType)) { - case 'Boolean': - return - case 'DateTime': - return - case 'Float': - case 'Integer': - return - case 'String': - return - case 'MultiReference': - return - case 'Reference': - return - case 'Activities': - return - case 'Addresses': - return - case 'Persons': - return - case 'SearchComponent': - return - default: - return null - } -} - -const { oneOf, string } = PropTypes -Field.propTypes = { - fieldType: oneOf([...statUnitFormFieldTypes.keys]).isRequired, - validationUrl: string, -} - -Field.defaultProps = { - validationUrl: null, -} - -export default Field diff --git a/legacy/client/components/StatUnitFormBody/FieldGroup.jsx b/legacy/client/components/StatUnitFormBody/FieldGroup.jsx deleted file mode 100644 index 41b401e25..000000000 --- a/legacy/client/components/StatUnitFormBody/FieldGroup.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Form } from 'semantic-ui-react' - -const FieldGroup = ({ isExtended, children }) => ( - - {children} - {!isExtended && children.length % 2 !== 0 &&
} - -) - -const { bool, node } = PropTypes -FieldGroup.propTypes = { - isExtended: bool.isRequired, - children: node.isRequired, -} - -export default FieldGroup diff --git a/legacy/client/components/StatUnitFormBody/FormSection.jsx b/legacy/client/components/StatUnitFormBody/FormSection.jsx deleted file mode 100644 index a0cdbe509..000000000 --- a/legacy/client/components/StatUnitFormBody/FormSection.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Segment, Header } from 'semantic-ui-react' - -const FormSection = ({ id, title, children }) => ( - - {title ?
: null} - {children} - -) - -const { node, string } = PropTypes -FormSection.propTypes = { - id: string, - title: string, - children: node.isRequired, -} - -FormSection.defaultProps = { - id: undefined, - title: 'Other', -} - -export default FormSection diff --git a/legacy/client/components/StatUnitFormBody/getSectioned.js b/legacy/client/components/StatUnitFormBody/getSectioned.js deleted file mode 100644 index 21a6786dd..000000000 --- a/legacy/client/components/StatUnitFormBody/getSectioned.js +++ /dev/null @@ -1,56 +0,0 @@ -import { groupByToArray } from '/helpers/enumerable' - -// is one of Activities, Addresses or Persons -const isExtended = type => [7, 8, 9].includes(type) - -const toGroupProps = ({ key, value }) => ({ - key, - isExtended: isExtended(value[0].fieldType), - fieldsMeta: value, -}) - -const getSectionsArray = (arr) => { - let offset = 0 - const len = arr.length - let inSequenceFlag = false - let lastIndex = 0 - return arr.reduce((acc, cur, i) => { - const extended = isExtended(cur.fieldType) - if (extended && (i + offset) % 2 !== 0) offset += 1 - const index = Math.floor((i + offset) / 2) - - if (i < len - 2 && arr[i + 2].order - arr[i + 1].order === 1 && !inSequenceFlag) { - offset += 1 - inSequenceFlag = true - return [...acc, index] - } - - if (extended) offset += 1 - - if (!inSequenceFlag) { - lastIndex = index + 1 - } - - if (i < len - 1 && arr[i + 1].order - arr[i].order !== 1 && inSequenceFlag) { - inSequenceFlag = false - return [...acc, lastIndex++] - } - - return [...acc, inSequenceFlag ? lastIndex : index] - }, []) -} - -const toSection = ({ key, value }) => { - const indexes = getSectionsArray(value.map(x => x.props)) - const groups = groupByToArray( - value.map(x => x.props), - (_, i) => indexes[i], - ).map(toGroupProps) - - return { - key, - groups, - } -} - -export default fieldsMeta => groupByToArray(fieldsMeta, x => x.section).map(toSection) diff --git a/legacy/client/components/StatUnitFormBody/index.jsx b/legacy/client/components/StatUnitFormBody/index.jsx deleted file mode 100644 index 57acf77c6..000000000 --- a/legacy/client/components/StatUnitFormBody/index.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { Segment } from 'semantic-ui-react' -import { map, pipe } from 'ramda' - -import { formBody as bodyPropTypes } from '/components/createSchemaFormHoc/propTypes' -import FormSection from './FormSection.jsx' -import FieldGroup from './FieldGroup.jsx' -import Field from './Field.jsx' -import getSectioned from './getSectioned.js' - -class FormBody extends Component { - renderGroup = group => ( - - {group.fieldsMeta.map(Field)} - - ) - - renderSection = section => ( - - {section.groups.map(this.renderGroup)} - - ) - - toFieldMeta = ([key, value]) => { - const { - selector, - isRequired, - localizeKey, - groupName, - writable, - popupLocalizedKey, - ...restProps - } = this.props.fieldsMeta[key] - - const props = { - ...restProps, - key, - fieldType: selector, - name: key, - value, - setFieldValue: this.props.setFieldValue, - onChange: this.props.handleChange, - onBlur: this.props.handleBlur, - label: localizeKey, - touched: !!this.props.touched[key], - errors: this.props.getFieldErrors(key), - disabled: this.props.isSubmitting || !writable, - required: isRequired, - localize: this.props.localize, - locale: this.props.locale, - popuplocalizedKey: popupLocalizedKey, - regId: this.props.regId, - } - - return { section: groupName, props } - } - - render() { - const sections = pipe( - Object.entries, - map(this.toFieldMeta), - getSectioned, - map(this.renderSection), - )(this.props.values) - - return {sections} - } -} - -const { bool, shape, string, number, objectOf } = PropTypes -FormBody.propTypes = { - ...bodyPropTypes, - fieldsMeta: objectOf(shape({ - selector: number.isRequired, - localizeKey: string.isRequired, - isRequired: bool.isRequired, - groupName: string.isRequired, - })).isRequired, -} - -export default FormBody diff --git a/legacy/client/components/createSchemaFormHoc/createSubForm.jsx b/legacy/client/components/createSchemaFormHoc/createSubForm.jsx deleted file mode 100644 index 743fa19f1..000000000 --- a/legacy/client/components/createSchemaFormHoc/createSubForm.jsx +++ /dev/null @@ -1,115 +0,0 @@ -import React from 'react' -import { Form, Segment, Message, Grid, Icon, Header, Loader } from 'semantic-ui-react' -import * as R from 'ramda' -import { ensureArray, hasValue } from 'helpers/validation.js' -import { capitalizeFirstLetter } from 'helpers/string.js' -import { subForm as propTypes } from './propTypes.js' -import styles from '/components/styles.scss' - -const unmappedEntries = (from = [], to = []) => - Object.entries(from).filter(([key]) => !R.has(key, to)) - -function createSubForm(Body, showReset) { - function SubForm(props) { - const { - errors, - initialErrors, - status, - isSubmitting, - dirty, - handleSubmit, - onCancel, - showSummary, - localize, - setErrors, - resetForm, - } = props - const { summary, ...statusErrors } = R.pathOr({}, ['errors'], status) - const unmappedErrors = [ - ...unmappedEntries(errors, props.values), - ...unmappedEntries(statusErrors, props.values), - ...unmappedEntries(initialErrors, props.values), - ].map(([k, v]) => - k === 'message' ? `${localize(v)}` : `${localize(capitalizeFirstLetter(k))}: ${localize(v)}`) - const getFieldErrors = key => [ - ...ensureArray(errors[key]), - ...R.pathOr([], [key], statusErrors), - ...R.pathOr([], [key], initialErrors), - ] - const hasSummaryErrors = hasValue(summary) - const hasErrors = hasValue(errors) - const hasUnmappedErrors = hasValue(unmappedErrors) - - const onReset = () => { - resetForm() - setTimeout(() => { - setErrors({}) - }, 0) - } - - return ( -
- - - {(hasUnmappedErrors || hasSummaryErrors || (hasErrors && showSummary)) && ( - -
- {hasUnmappedErrors && } - {hasSummaryErrors && } - {showSummary && hasErrors && ( - - )} - - )} - - - } - floated="left" - /> - - - {showReset && ( - - )} - - - -
- {isSubmitting && } -
-
-
- - ) - } - - SubForm.propTypes = propTypes - - SubForm.defaultProps = { - showSummary: false, - } - - return SubForm -} - -const createSubFormWrapper = showReset => Body => createSubForm(Body, showReset) - -export default createSubFormWrapper diff --git a/legacy/client/components/createSchemaFormHoc/index.js b/legacy/client/components/createSchemaFormHoc/index.js deleted file mode 100644 index 94f1da4b1..000000000 --- a/legacy/client/components/createSchemaFormHoc/index.js +++ /dev/null @@ -1,26 +0,0 @@ -import { withFormik } from 'formik' -import { pipe, prop } from 'ramda' - -import createSubForm from './createSubForm.jsx' - -const handleSubmit = (values, { props: { onSubmit, ...props }, setSubmitting, setStatus }) => { - onSubmit(values, { - props, - started: () => { - setSubmitting(true) - }, - succeeded: () => { - setSubmitting(false) - }, - failed: (errors) => { - setSubmitting(false) - setStatus({ errors }) - }, - }) -} - -export default (validationSchema, mapPropsToValues = prop('values'), showReset = true) => - pipe( - createSubForm(showReset), - withFormik({ validationSchema, mapPropsToValues, handleSubmit }), - ) diff --git a/legacy/client/components/createSchemaFormHoc/propTypes.js b/legacy/client/components/createSchemaFormHoc/propTypes.js deleted file mode 100644 index 092e558b3..000000000 --- a/legacy/client/components/createSchemaFormHoc/propTypes.js +++ /dev/null @@ -1,36 +0,0 @@ -import { shape, bool, func, string, oneOfType, arrayOf, objectOf } from 'prop-types' - -import { shapeOf } from '/helpers/validation' - -const fieldsOf = shapeOf([]) -export const subForm = { - values: shape({}).isRequired, - status: shape({ - errors: fieldsOf(oneOfType([string, arrayOf(string)])), - }), - touched: fieldsOf(oneOfType([bool, shapeOf([])])).isRequired, - errors: fieldsOf(string).isRequired, - dirty: bool.isRequired, - isValid: bool.isRequired, - isSubmitting: bool.isRequired, - setFieldValue: func.isRequired, - handleChange: func.isRequired, - handleBlur: func.isRequired, - handleSubmit: func.isRequired, - handleReset: func.isRequired, - localize: func.isRequired, - locale: string.isRequired, -} - -export const formBody = { - values: shape({}).isRequired, - getFieldErrors: func.isRequired, - touched: objectOf(bool).isRequired, - isSubmitting: bool.isRequired, - setFieldValue: func.isRequired, - setValues: func.isRequired, - handleChange: func.isRequired, - handleBlur: func.isRequired, - localize: func.isRequired, - locale: string.isRequired, -} diff --git a/legacy/client/components/createSchemaFormHoc/styles.scss b/legacy/client/components/createSchemaFormHoc/styles.scss deleted file mode 100644 index a4e29f206..000000000 --- a/legacy/client/components/createSchemaFormHoc/styles.scss +++ /dev/null @@ -1,3 +0,0 @@ -.btn-group { - margin-top: 10px !important; -} diff --git a/legacy/client/components/fields/ActivitiesList/Edit.jsx b/legacy/client/components/fields/ActivitiesList/Edit.jsx deleted file mode 100644 index b1c0c3c72..000000000 --- a/legacy/client/components/fields/ActivitiesList/Edit.jsx +++ /dev/null @@ -1,296 +0,0 @@ -import React from 'react' -import { shape, number, func, string, oneOfType, bool } from 'prop-types' -import { Button, Table, Form, Popup } from 'semantic-ui-react' -import * as R from 'ramda' -import config from '/helpers/config' -import { activityTypes } from '/helpers/enums' -import { DateTimeField, SelectField } from '/components/fields' -import { getNewName } from 'helpers/locale.js' - -const activities = [...activityTypes].map(([key, value]) => ({ key, value })) -// eslint-disable-next-line max-len -const yearsOptions = R.pipe( - R.range(1900), - R.reverse, - R.map(x => ({ value: x, text: x })), -)(new Date().getFullYear()) - -const ActivityCode = ({ 'data-name': name, 'data-code': code }) => ( - - {code} -   - {name != null && name.length > 50 ? ( - {`${name.substring(0, 50)}...`} - ) : ( - {name} - )} - -) - -ActivityCode.propTypes = { - 'data-name': string.isRequired, - 'data-code': string.isRequired, -} - -class ActivityEdit extends React.Component { - static propTypes = { - value: shape({ - id: number, - activityYear: oneOfType([string, number]), - activityType: oneOfType([string, number]), - employees: oneOfType([string, number]), - turnover: oneOfType([string, number]), - activityCategoryId: oneOfType([string, number]), - }).isRequired, - onSave: func.isRequired, - onCancel: func.isRequired, - localize: func.isRequired, - locale: string.isRequired, - disabled: bool, - index: number, - } - - static defaultProps = { - disabled: false, - value: null, - } - - state = { - value: this.props.value, - touched: false, - index: this.props.index, - } - - componentWillReceiveProps(nextProps) { - const { locale } = this.props - const { value } = this.state - if (nextProps.locale !== locale) { - this.setState({ - value: { - ...value, - value: value.id, - label: getNewName(value), - }, - }) - } - } - - onFieldChange = (e, { name, value }) => { - this.setState(s => ({ - value: { ...s.value, [name]: value }, - touched: true, - })) - } - - onCodeChange = (e, { value }) => { - this.setState(s => ({ - value: { - ...s.value, - activityCategoryId: { - id: undefined, - code: value, - name: '', - }, - }, - isLoading: true, - })) - this.searchData(value) - } - - saveHandler = () => { - this.props.onSave(this.state.value, this.state.index) - } - - cancelHandler = () => { - this.props.onCancel(this.state.value.id) - } - - activitySelectedHandler = (e, { value: activityCategoryId }, activityCategory) => { - this.setState(s => ({ - value: { - ...s.value, - activityCategoryId, - activityCategory, - }, - touched: true, - })) - } - - render() { - const { localize, disabled, locale } = this.props - const { value, touched } = this.state - // eslint-disable-next-line no-restricted-globals - const employeesIsNaN = isNaN(parseInt(value.employees, 10)) - const notSelected = { value: 0, text: localize('NotSelected') } - const activityMandatoryFields = config.mandatoryFields.Activity - return ( - - -
- -
- -
-
- -
- ({ - value: a.key, - text: localize(a.value), - }))} - value={value.activityType} - error={!value.activityType} - name="activityType" - onChange={this.onFieldChange} - disabled={disabled} - required={activityMandatoryFields.ActivityType} - /> -
-
- -
-
- -
- - } - content={`6 ${localize('MaxLength')}`} - open={value.employees != null && value.employees.length > 6} - /> -
-
- - } - content={`10 ${localize('MaxLength')}`} - open={value.turnover != null && value.turnover.length > 10} - /> -
-
- -
- -
-
- - -
-
-
-
-
-
-
-
-
-
- ) - } -} - -export default ActivityEdit diff --git a/legacy/client/components/fields/ActivitiesList/View.jsx b/legacy/client/components/fields/ActivitiesList/View.jsx deleted file mode 100644 index f7d99e5af..000000000 --- a/legacy/client/components/fields/ActivitiesList/View.jsx +++ /dev/null @@ -1,98 +0,0 @@ -import React from 'react' -import { shape, string, number, func, bool, oneOfType } from 'prop-types' -import { Icon, Table, Popup, Confirm } from 'semantic-ui-react' - -import { activityTypes } from '/helpers/enums' -import { getNewName } from '/helpers/locale' - -class ActivityView extends React.Component { - static propTypes = { - value: shape({ - id: number, - activityYear: oneOfType([string, number]), - activityType: oneOfType([string, number]), - employees: oneOfType([string, number]), - turnover: oneOfType([string, number]), - activityCategoryId: oneOfType([string, number]), - }).isRequired, - onEdit: func.isRequired, - onDelete: func.isRequired, - readOnly: bool.isRequired, - editMode: bool.isRequired, - localize: func.isRequired, - index: number, - } - - state = { - showConfirm: false, - } - - editHandler = () => { - const { value, onEdit } = this.props - onEdit(this.props.index) - } - - deleteHandler = () => { - this.setState({ showConfirm: true }) - } - - cancelHandler = () => { - this.setState({ showConfirm: false }) - } - - confirmHandler = () => { - this.setState({ showConfirm: false }) - const { value, onDelete } = this.props - onDelete(this.props.index) - } - - render() { - const { value, readOnly, editMode, localize } = this.props - const { showConfirm } = this.state - return ( - - {value.activityCategory && value.activityCategory.code} - - {value.activityCategory && getNewName(value.activityCategory, false)} - - {localize(activityTypes.get(value.activityType))} - {value.employees} - {value.turnover} - - {value.activityYear === 0 ? '' : value.activityYear} - - {!readOnly && ( - - {!editMode && ( - - } - content={localize('EditButton')} - position="top center" - size="mini" - /> - } - content={localize('ButtonDelete')} - position="top center" - size="mini" - /> - - - )} - - )} - - ) - } -} - -export default ActivityView diff --git a/legacy/client/components/fields/ActivitiesList/index.jsx b/legacy/client/components/fields/ActivitiesList/index.jsx deleted file mode 100644 index 5c549b51e..000000000 --- a/legacy/client/components/fields/ActivitiesList/index.jsx +++ /dev/null @@ -1,200 +0,0 @@ -import React from 'react' -import { shape, arrayOf, func, string, bool } from 'prop-types' -import { Icon, Table, Message } from 'semantic-ui-react' -import * as R from 'ramda' - -import { getDate, formatDate } from '/helpers/dateHelper' -import ActivityView from './View.jsx' -import ActivityEdit from './Edit.jsx' - -export class ActivitiesList extends React.Component { - static propTypes = { - localize: func.isRequired, - locale: string.isRequired, - name: string.isRequired, - value: arrayOf(shape({})), - onChange: func, - label: string, - readOnly: bool, - errors: arrayOf(string), - disabled: bool, - popuplocalizedKey: string, - } - - static defaultProps = { - value: [], - readOnly: false, - onChange: R.identity, - label: '', - errors: [], - disabled: false, - popuplocalizedKey: undefined, - } - - state = { - addRow: false, - editRow: undefined, - newRowId: -1, - } - - editHandler = (index) => { - this.setState({ - editRow: index, - }) - } - - deleteHandler = (index) => { - this.changeHandler(this.props.value.filter((v, itemIndex) => itemIndex !== index)) - } - - saveHandler = (value, itemIndex) => { - this.changeHandler(this.props.value.map((v, index) => (index === itemIndex ? value : v))) - this.setState({ editRow: undefined }) - } - - editCancelHandler = () => { - this.setState({ editRow: undefined }) - } - - addHandler = () => { - this.setState({ addRow: true }) - } - - addSaveHandler = (value) => { - this.changeHandler([value, ...this.props.value]) - this.setState(s => ({ - addRow: false, - newRowId: s.newRowId - 1, - })) - } - - addCancelHandler = () => { - this.setState({ addRow: false }) - } - - changeHandler(value) { - const { name, onChange } = this.props - onChange({ target: { name, value } }, { ...this.props, value }) - } - - renderRows() { - const { readOnly, value, localize, disabled } = this.props - const { addRow, editRow } = this.state - const renderComponent = (x, index) => - index !== editRow ? ( - - ) : ( - - ) - return value - .sort((a, b) => a.activityType - b.activityType) - .map((el, index) => renderComponent(el, index)) - } - - render() { - const { - readOnly, - value, - label: labelKey, - localize, - errors, - name, - disabled, - locale, - required, - } = this.props - const { addRow, editRow, newRowId } = this.state - const label = localize(labelKey) - return ( -
- {!readOnly && ( - - )} - - - - - - - - - - {!readOnly && ( - - {editRow === undefined && addRow === false && ( -
- -
- )} -
- )} -
-
- - {addRow && ( - - )} - {value.length === 0 && !addRow ? ( - - - - ) : ( - this.renderRows() - )} - -
- {errors.length !== 0 && } -
- ) - } -} - -export default ActivitiesList diff --git a/legacy/client/components/fields/AddressField.jsx b/legacy/client/components/fields/AddressField.jsx deleted file mode 100644 index c7da13c39..000000000 --- a/legacy/client/components/fields/AddressField.jsx +++ /dev/null @@ -1,311 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { Form, Message, Button, Icon, Segment, Header, Popup } from 'semantic-ui-react' -import { arrayOf, func, shape, string, bool } from 'prop-types' -import { equals } from 'ramda' - -import config from '/helpers/config' -import { hasValue } from '/helpers/validation' -import { SelectField } from '/components/fields' - -const defaultAddressState = { - id: 0, - addressPart1: '', - addressPart2: '', - addressPart3: '', - regionId: undefined, - latitude: 0, - longitude: 0, -} - -const ensureAddress = value => value || defaultAddressState -const mandatoryField = config.mandatoryFields.Addresses -const regLatitude = /^-?(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$/ -const regLongitude = /^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$/ -const validateLatitude = latitude => latitude === null || regLatitude.exec(latitude) -const validateLongitude = longitude => longitude === null || regLongitude.exec(longitude) - -export function AddressField({ - name, - label, - value, - errors, - disabled, - onChange, - localize, - required, - locale, - popuplocalizedKey, -}) { - const [addressValue, setAddressValue] = useState(ensureAddress(value)) - const [msgFailFetchAddress, setMsgFailFetchAddress] = useState(undefined) - const [editing, setEditing] = useState(false) - const [touched, setTouched] = useState(false) - - useEffect(() => { - if (!equals(addressValue, value)) { - setAddressValue(ensureAddress(value)) - } - }, [value]) - - const handleEdit = (e, { name, value }) => { - setAddressValue(prevState => ({ ...prevState, [name]: value })) - setTouched(true) - } - - const startEditing = () => { - setEditing(true) - } - - const doneEditing = (e) => { - e.preventDefault() - const { name } = props - onChange({ target: { name, value: addressValue } }, { ...props, value: addressValue }) - setEditing(false) - setTouched(false) - } - - const cancelEditing = (e) => { - e.preventDefault() - setAddressValue(ensureAddress(value)) - setEditing(false) - } - - const regionSelectedHandler = (_, { value: regionId }) => { - setAddressValue(prevState => ({ ...prevState, regionId })) - setTouched(true) - } - - const latitudeIsBad = !validateLatitude(addressValue.latitude) - const longitudeIsBad = !validateLongitude(addressValue.longitude) - const isShowFieldsRequired = editing || required - const isMandatoryFieldEmpty = - isShowFieldsRequired && - ((mandatoryField.GeographicalCodes && !addressValue.regionId) || - (mandatoryField.AddressPart1 && !addressValue.addressPart1) || - (mandatoryField.AddressPart2 && !addressValue.addressPart2) || - (mandatoryField.AddressPart3 && !addressValue.addressPart3) || - (mandatoryField.Latitude && !addressValue.latitude) || - (mandatoryField.Longitude && !addressValue.longitude)) - - return ( - - - - -
- -
- -
- -
- -
-
- -
-
- -
- -
-
-
- -
- - } - content={localize('BadLatitude')} - open={ - hasValue(addressValue.latitude) && - editing && - (addressValue.latitude.length === 10 || latitudeIsBad) - } - /> -
-
- - } - content={localize('BadLongitude')} - open={ - hasValue(addressValue.longitude) && - editing && - (addressValue.longitude.length === 11 || longitudeIsBad) - } - /> -
-
- - - {editing ? ( -
- {(isMandatoryFieldEmpty || - (!!addressValue.latitude && latitudeIsBad) || - (!!addressValue.longitude && longitudeIsBad)) && ( - - )} - -
-
-
-
-
-
- ) : ( - -
-
-
- )} -
- - {msgFailFetchAddress && } - {hasValue(errors) && } - - ) -} - -AddressField.propTypes = { - name: string.isRequired, - label: string.isRequired, - value: shape(), - errors: arrayOf(string), - disabled: bool, - onChange: func.isRequired, - localize: func.isRequired, - required: bool, - locale: string.isRequired, - popuplocalizedKey: string, -} - -AddressField.defaultProps = { - value: null, - errors: [], - disabled: false, - required: false, - popuplocalizedKey: undefined, -} diff --git a/legacy/client/components/fields/CheckField.jsx b/legacy/client/components/fields/CheckField.jsx deleted file mode 100644 index fd6ce6a6a..000000000 --- a/legacy/client/components/fields/CheckField.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react' -import { arrayOf, func, string, bool } from 'prop-types' -import { Message, Form } from 'semantic-ui-react' - -export function CheckField({ - id: ambiguousId, - name: ambiguousName, - value, - onChange, - label: labelKey, - title: titleKey, - touched, - error, - errors: errorKeys, - localize, - popuplocalizedKey, - ...restProps -}) { - const label = labelKey !== undefined ? localize(labelKey) : undefined - const title = titleKey ? localize(titleKey) : label - const id = - ambiguousId != null ? ambiguousId : ambiguousName != null ? ambiguousName : 'CheckField' - const hasErrors = touched !== false && errorKeys.length !== 0 - - const handleChange = (e, { checked, ...inputProps }) => { - onChange(e, { ...inputProps, value: checked }) - } - - return ( -
- - - {hasErrors && } -
- ) -} - -CheckField.propTypes = { - id: string, - name: string, - label: string, - title: string, - value: bool, - onChange: func.isRequired, - touched: bool, - error: bool, - errors: arrayOf(string), - localize: func.isRequired, - popuplocalizedKey: string, -} - -CheckField.defaultProps = { - id: undefined, - name: undefined, - value: false, - label: undefined, - title: undefined, - touched: undefined, - error: false, - errors: [], - popuplocalizedKey: undefined, -} diff --git a/legacy/client/components/fields/DateTimeField.jsx b/legacy/client/components/fields/DateTimeField.jsx deleted file mode 100644 index 87314cebc..000000000 --- a/legacy/client/components/fields/DateTimeField.jsx +++ /dev/null @@ -1,142 +0,0 @@ -import React, { useState } from 'react' -import { bool, arrayOf, func, string } from 'prop-types' -import DatePicker from 'react-datepicker' -import { Form, Message } from 'semantic-ui-react' -import * as R from 'ramda' -import * as dateFns from '/helpers/dateHelper' -import { hasValue } from '/helpers/validation' - -export function DateTimeField({ - id: ambiguousId, - name: ambiguousName, - value, - onChange, - label: labelKey, - title: titleKey, - placeholder: placeholderKey, - touched, - error, - required, - errors: errorKeys, - localize, - popuplocalizedKey, - disabled, - readOnly, - ...restProps -}) { - const [isDateValid, setIsDateValid] = useState(true) - const [errorMessages, setErrorMessages] = useState([]) - - const onChangeWrapper = (ambiguousValue) => { - const { name } = restProps - const nextValue = ensure(ambiguousValue) - setIsDateValid(true) - setErrorMessages([]) - onChange({ target: { name, value: nextValue } }, { ...restProps, value: nextValue }) - } - - const onChangeRawWrapper = (event) => { - const { name } = restProps - const isEmpty = event.target.value === '' - const parsed = dateFns.parse(event.target.value && event.target.value.slice(0, 10)) - const isDateValid = (!!parsed && parsed.isValid() && dateFns.isDateInThePast(parsed)) || isEmpty - const errorMessages = - isDateValid && !!parsed - ? [] - : !parsed.isValid() - ? ['DateNotValid'] - : !dateFns.isDateInThePast(parsed) - ? ['DateCantBeInFuture'] - : ['DateNotValid'] - setIsDateValid(isDateValid) - setErrorMessages(errorMessages) - const nextValue = isEmpty ? '' : isDateValid ? ensure(parsed) : '' - onChange({ target: { name, value: nextValue } }, { ...restProps, value: nextValue }) - } - - const format = x => dateFns.formatDate(x, restProps.dateFormat) - - const ensure = x => - R.cond([ - [hasValue, R.pipe(format, dateFns.toUtc)], - [R.T, R.identity], - ])(x) - - const label = labelKey !== undefined ? localize(labelKey) : undefined - const title = titleKey ? localize(titleKey) : label - const id = - ambiguousId != null ? ambiguousId : ambiguousName != null ? ambiguousName : 'DateTimeField' - - const hasErrors = touched !== false && hasValue(errorKeys) - - const inputProps = { - ...restProps, - id, - name: ambiguousName, - title, - required, - as: DatePicker, - disabled: disabled || readOnly, - selected: dateFns.getDateOrNull(value), - error: error || hasErrors, - placeholder: placeholderKey ? localize(placeholderKey) : label, - className: 'ui input', - onChange: onChangeWrapper, - onChangeRaw: onChangeRawWrapper, - maxDate: dateFns.now(), - autoComplete: 'off', - } - - return ( -
- {label !== undefined && } - - {(hasErrors || !isDateValid) && ( - - )} -
- ) -} - -DateTimeField.propTypes = { - value: string, - onChange: func.isRequired, - id: string, - name: string, - label: string, - title: string, - placeholder: string, - dateFormat: string, - required: bool, - touched: bool, - error: bool, - errors: arrayOf(string), - localize: func.isRequired, - popuplocalizedKey: string, - disabled: bool, - readOnly: bool, -} - -DateTimeField.defaultProps = { - id: undefined, - name: undefined, - label: undefined, - title: undefined, - placeholder: undefined, - dateFormat: dateFns.dateFormat, - value: null, - required: false, - touched: undefined, - error: false, - errors: [], - popuplocalizedKey: undefined, - disabled: false, - readOnly: false, -} diff --git a/legacy/client/components/fields/ForeignParticipationField.jsx b/legacy/client/components/fields/ForeignParticipationField.jsx deleted file mode 100644 index 9de215180..000000000 --- a/legacy/client/components/fields/ForeignParticipationField.jsx +++ /dev/null @@ -1,343 +0,0 @@ -import React from 'react' -import { arrayOf, string, number, oneOfType, func, bool, shape } from 'prop-types' -import { Message, Select as SemanticUiSelect, Label } from 'semantic-ui-react' -import ReactSelect from 'react-select' -import debounce from 'lodash/debounce' -import * as R from 'ramda' - -import { hasValue, createPropType } from 'helpers/validation.js' -import { internalRequest } from 'helpers/request.js' -import { getNewName } from 'helpers/locale.js' - -import styles from './styles.scss' - -const notSelected = { value: undefined, text: 'NotSelected' } - -const NameCodeOption = { - transform: x => ({ - ...x, - value: x.id, - label: getNewName(x), - }), - // eslint-disable-next-line react/prop-types - render: params => ( -
-
- {params.code &&
{params.code}
} - {params.code &&
} - {getNewName(params, false)} -
-
-
- ), -} - -// eslint-disable-next-line react/prop-types -const createRemovableValueComponent = localize => ({ value, onRemove }) => ( -
- ) : ( -
- )} - {this.state.showLocalUnit ? ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- -
-
- ) : ( -
- )} -
- ) - } -} - -export default ClassFlowExample diff --git a/legacy/client/pages/DataFlowExamples/HooksExamples/FromClassToHooksExample/index.jsx b/legacy/client/pages/DataFlowExamples/HooksExamples/FromClassToHooksExample/index.jsx deleted file mode 100644 index a2daf67a7..000000000 --- a/legacy/client/pages/DataFlowExamples/HooksExamples/FromClassToHooksExample/index.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useState } from 'react' - -const FromClassToHooksExample = () => { - const [legalUnitId, setLegalUnitId] = useState(3) - const [legalUnitName] = useState('LegalUnitName') - const [localUnitId] = useState('5') - const [localUnitName] = useState('LocalUnitName') - const [showLegalUnit, setShowLegalUnit] = useState(false) - const [showLocalUnit, setShowLocalUnit] = useState(false) - - const setLegalUnit = () => { - setShowLegalUnit(true) - setShowLocalUnit(false) - } - - const setLocalUnit = () => { - setShowLocalUnit(true) - setShowLegalUnit(false) - } - - const handleLegalUnitIdChange = (event) => { - setLegalUnitId(event.target.value) - } - - return ( -
-

From class to hooks example

-

Stat unit types

-
- - -
-
- - {showLegalUnit && ( -
- Legal unit -
- ID: -
- -
- Name: -
- -
-
- )} - {showLocalUnit && ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- -
-
- )} -
- ) -} - -export default FromClassToHooksExample diff --git a/legacy/client/pages/DataFlowExamples/HooksExamples/FromRecomposeToHooksExample/index.jsx b/legacy/client/pages/DataFlowExamples/HooksExamples/FromRecomposeToHooksExample/index.jsx deleted file mode 100644 index eb366ebf2..000000000 --- a/legacy/client/pages/DataFlowExamples/HooksExamples/FromRecomposeToHooksExample/index.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React, { useState } from 'react' - -const FromRecomposeToHooksExample = () => { - const [legalUnitId, setLegalUnitId] = useState(3) - const [legalUnitName] = useState('LegalUnitName') - const [localUnitId] = useState('5') - const [localUnitName] = useState('LocalUnitName') - const [showLegalUnit, setShowLegalUnit] = useState(false) - const [showLocalUnit, setShowLocalUnit] = useState(false) - - const setLegalUnit = () => { - setShowLegalUnit(true) - setShowLocalUnit(false) - } - - const setLocalUnit = () => { - setShowLocalUnit(true) - setShowLegalUnit(false) - } - - return ( -
-

From recompose to hooks example

-

Stat unit types

-
- - -
-
- - {showLegalUnit && ( -
- Legal unit -
- ID: -
- setLegalUnitId(ev.target.value)} - /> -
- Name: -
- -
-
- )} - {showLocalUnit && ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- setLegalUnitId(ev.target.value)} - /> -
-
- )} -
- ) -} - -export default FromRecomposeToHooksExample diff --git a/legacy/client/pages/DataFlowExamples/RecomposeFlowExample/index.jsx b/legacy/client/pages/DataFlowExamples/RecomposeFlowExample/index.jsx deleted file mode 100644 index d2110ab05..000000000 --- a/legacy/client/pages/DataFlowExamples/RecomposeFlowExample/index.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react' -import { compose, withState, withHandlers, branch, renderComponent } from 'recompose' - -const RecomposeFlowExample = ({ - legalUnitId, - legalUnitName, - localUnitId, - localUnitName, - showLegalUnit, - showLocalUnit, - setLegalUnit, - setLocalUnit, - setLegalUnitId, -}) => ( -
-

Recompose flow example

-

Stat unit types

-
- - -
-
- - {showLegalUnit && ( -
- Legal unit -
- ID: -
- setLegalUnitId(ev.target.value)} /> -
- Name: -
- -
-
- )} - {showLocalUnit && ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- setLegalUnitId(ev.target.value)} /> -
-
- )} -
-) - -export default compose( - withState('legalUnitId', 'setLegalUnitId', 3), - withState('legalUnitName', 'setLegalUnitName', 'LegalUnitName'), - withState('localUnitId', 'setLocalUnitId', '5'), - withState('localUnitName', 'setLocalUnitName', 'LocalUnitName'), - withState('showLegalUnit', 'setShowLegalUnit', false), - withState('showLocalUnit', 'setShowLocalUnit', false), - withHandlers({ - setLegalUnit: ({ setShowLegalUnit, setShowLocalUnit }) => () => { - setShowLegalUnit(true) - setShowLocalUnit(false) - }, - setLocalUnit: ({ setShowLocalUnit, setShowLegalUnit }) => () => { - setShowLocalUnit(true) - setShowLegalUnit(false) - }, - }), - branch( - ({ showLegalUnit, showLocalUnit }) => false, - renderComponent(() => null), - ), -)(RecomposeFlowExample) diff --git a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithClassExample/index.jsx b/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithClassExample/index.jsx deleted file mode 100644 index b8f77d63c..000000000 --- a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithClassExample/index.jsx +++ /dev/null @@ -1,133 +0,0 @@ -import React, { Component } from 'react' - -class LiftUpStateWithClassExample extends Component { - constructor(props) { - super(props) - this.state = { - legalUnitId: 3, - showLegalUnit: false, - showLocalUnit: false, - } - } - - setLegalUnit = () => { - this.setState({ - showLegalUnit: true, - showLocalUnit: false, - }) - } - - setLocalUnit = () => { - this.setState({ - showLocalUnit: true, - showLegalUnit: false, - }) - } - - setLegalUnitId = (event) => { - this.setState({ - legalUnitId: event.target.value, - }) - } - - render() { - return ( -
-

Lift up state with class flow example

-

Stat unit types

-
- - -
-
- - -
- ) - } -} - -class LegalUnit extends Component { - constructor(props) { - super(props) - this.state = { - legalUnitName: 'LegalUnitName', - } - } - render() { - return ( -
- {this.props.showLegalUnit ? ( -
- Legal unit -
- ID: -
- -
- Name: -
- -
-
- ) : ( -
- )} -
- ) - } -} - -class LocalUnit extends Component { - constructor(props) { - super(props) - this.state = { - localUnitId: '5', - localUnitName: 'LocalUnitName', - } - } - render() { - return ( -
- {this.props.showLocalUnit ? ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- -
-
- ) : ( -
- )} -
- ) - } -} - -export default LiftUpStateWithClassExample diff --git a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksExample/index.jsx b/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksExample/index.jsx deleted file mode 100644 index 2596d5ea9..000000000 --- a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksExample/index.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useState } from 'react' - -function LiftUpStateWithHooksParent() { - const [state, setState] = useState('Initial state') - - return ( -
- - -
- ) -} - -function LiftUpStateChildA({ state, setState }) { - return ( -
-

Component child A

-

Shared State: {state}

- -
- ) -} - -function LiftUpStateChildB({ state, setState }) { - return ( -
-

Component child B

-

Shared State: {state}

- -
- ) -} - -export default LiftUpStateWithHooksParent diff --git a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksStatUnitExample/index.jsx b/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksStatUnitExample/index.jsx deleted file mode 100644 index 463b8f247..000000000 --- a/legacy/client/pages/DataFlowExamples/SharedStateExamples/LiftUpStateWithHooksStatUnitExample/index.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import React, { useState } from 'react' - -function LiftUpStateWithHooksStatUnitParent() { - const [legalUnitId, setLegalUnitId] = useState(3) - const [showLegalUnit, setShowLegalUnit] = useState(false) - const [showLocalUnit, setShowLocalUnit] = useState(false) - - const switchToLegalUnit = () => { - setShowLegalUnit(true) - setShowLocalUnit(false) - } - - const switchToLocalUnit = () => { - setShowLocalUnit(true) - setShowLegalUnit(false) - } - - return ( -
-

Lift up state with hooks example

-

Stat unit types

-
- - -
-
- -
- {showLegalUnit && } - {showLocalUnit && } -
-
- ) -} - -function LegalUnit({ legalUnitId, setLegalUnitId }) { - const [legalUnitName] = useState('LegalUnitName') - return ( -
- Legal unit -
- ID: -
- setLegalUnitId(ev.target.value)} /> -
- Name: -
- -
-
- ) -} - -function LocalUnit({ legalUnitId, setLegalUnitId }) { - const [localUnitId] = useState('5') - const [localUnitName] = useState('LocalUnitName') - return ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- setLegalUnitId(ev.target.value)} /> -
-
- ) -} - -export default LiftUpStateWithHooksStatUnitParent diff --git a/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksExample/index.jsx b/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksExample/index.jsx deleted file mode 100644 index dcbc1bc29..000000000 --- a/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksExample/index.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { useContext, useState } from 'react' - -const StateContext = React.createContext() - -function StateContextWithHooksParent() { - const [state, setState] = useState('Initial state') - - return ( - - - - - ) -} - -function ParentA() { - return ( -
-

Inside parent A

- -
- ) -} - -function StateContextWithHooksChildA() { - const { state, setState } = useContext(StateContext) - - return ( -
-

State from Context: {state}

- -
- ) -} - -function StateContextWithHooksChildB() { - const { state, setState } = useContext(StateContext) - - return ( -
-

State from Context: {state}

- -
- ) -} - -export default StateContextWithHooksParent diff --git a/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksStatUnitExample/index.jsx b/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksStatUnitExample/index.jsx deleted file mode 100644 index 1526de8cb..000000000 --- a/legacy/client/pages/DataFlowExamples/SharedStateExamples/StateContextWithHooksStatUnitExample/index.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useContext, useState } from 'react' - -const StateContext = React.createContext() - -function StateContextWithHooksStatUnitParent() { - const [legalUnitId, setLegalUnitId] = useState(3) - const [showLegalUnit, setShowLegalUnit] = useState(false) - const [showLocalUnit, setShowLocalUnit] = useState(false) - - const switchToLegalUnit = () => { - setShowLegalUnit(true) - setShowLocalUnit(false) - } - - const switchToLocalUnit = () => { - setShowLocalUnit(true) - setShowLegalUnit(false) - } - - return ( -
-

State context with hooks example

-

Stat unit types

-
- - -
-
- - - {showLegalUnit && } - {showLocalUnit && } - -
- ) -} - -function LegalUnit() { - const { legalUnitId, setLegalUnitId } = useContext(StateContext) - const [legalUnitName] = useState('LegalUnitName') - - return ( -
- Legal unit -
- ID: -
- setLegalUnitId(ev.target.value)} /> -
- Name: -
- -
-
- ) -} - -function LocalUnit() { - const { legalUnitId, setLegalUnitId } = useContext(StateContext) - const [localUnitId] = useState('5') - const [localUnitName] = useState('LocalUnitName') - return ( -
- Local unit: -
- ID: -
- -
- Name: -
- -
- Legal unit ID: -
- setLegalUnitId(ev.target.value)} /> -
-
- ) -} - -export default StateContextWithHooksStatUnitParent diff --git a/legacy/client/pages/DataSources/Create.js b/legacy/client/pages/DataSources/Create.js deleted file mode 100644 index 906299a4a..000000000 --- a/legacy/client/pages/DataSources/Create.js +++ /dev/null @@ -1,37 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import { pipe, prop } from 'ramda' -import { defaultProps, lifecycle } from 'recompose' - -import createSchemaFormHoc from '/components/createSchemaFormHoc' -import withSpinnerUnless from '/components/withSpinnerUnless' -import { getText } from '/helpers/locale' -import { hasValue, hasValues } from '/helpers/validation' -import { create as actions } from './actions.js' -import { defaults, createSchema } from './model.js' -import FormBody from './FormBody.jsx' - -const propsToSchema = props => createSchema(props.columns) - -const assert = ({ columns }) => hasValue(columns) && hasValues(columns) - -const hooks = { - componentDidMount() { - this.props.fetchColumns() - }, -} - -const stateToProps = state => ({ - columns: state.dataSources.columns, - localize: getText(state.locale), -}) - -const dispatchToProps = dispatch => bindActionCreators(actions, dispatch) - -export default pipe( - createSchemaFormHoc(propsToSchema, prop('values'), false), - defaultProps({ values: defaults }), - withSpinnerUnless(assert), - lifecycle(hooks), - connect(stateToProps, dispatchToProps), -)(FormBody) diff --git a/legacy/client/pages/DataSources/Edit.js b/legacy/client/pages/DataSources/Edit.js deleted file mode 100644 index a9009dad6..000000000 --- a/legacy/client/pages/DataSources/Edit.js +++ /dev/null @@ -1,58 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import { pipe } from 'ramda' -import { lifecycle } from 'recompose' - -import createSchemaFormHoc from '/components/createSchemaFormHoc' -import withSpinnerUnless from '/components/withSpinnerUnless' -import { getText } from '/helpers/locale' -import { hasValue, hasValues } from '/helpers/validation' -import { edit as actions, clear } from './actions.js' -import { createSchema } from './model.js' -import FormBody from './FormBody.jsx' - -const propsToSchema = props => createSchema(props.columns) - -const assert = ({ values, columns }) => hasValue(values) && hasValues(columns) - -const { fetchDataSource, fetchColumns, onSubmit, onCancel } = actions - -const hooks = { - componentDidMount() { - this.props.fetchColumns() - }, - componentWillReceiveProps(nextProps) { - if (!hasValues(this.props.columns) && hasValues(nextProps.columns)) { - this.props.fetchDataSource(nextProps.columns) - } - }, - componentWillUnmount() { - this.props.clear() - }, -} - -const stateToProps = state => ({ - values: state.dataSources.editFormData, - columns: state.dataSources.columns, - localize: getText(state.locale), - errors: state.dataSources.errors, -}) - -const dispatchToProps = (dispatch, props) => - bindActionCreators( - { - fetchColumns, - fetchDataSource: columns => fetchDataSource(props.params.id, columns), - onSubmit: onSubmit(props.params.id), - onCancel, - clear, - }, - dispatch, - ) - -export default pipe( - createSchemaFormHoc(propsToSchema), - withSpinnerUnless(assert), - lifecycle(hooks), - connect(stateToProps, dispatchToProps), -)(FormBody) diff --git a/legacy/client/pages/DataSources/FormBody.jsx b/legacy/client/pages/DataSources/FormBody.jsx deleted file mode 100644 index 45078b768..000000000 --- a/legacy/client/pages/DataSources/FormBody.jsx +++ /dev/null @@ -1,147 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Grid, Form } from 'semantic-ui-react' - -import { formBody as bodyPropTypes } from '/components/createSchemaFormHoc/propTypes' -import { - SelectField as PlainSelectField, - TextField as PlainTextField, - withDebounce, -} from '/components/fields' -import { getMandatoryFields as getMandatoryFieldsForStatUnitUpload } from 'helpers/config.js' -import handlerFor from 'helpers/handleSetFieldValue.js' -import { toCamelCase } from 'helpers/string.js' -import MappingEditor from './MappingEditor/index.jsx' -import TemplateFileAttributesParser from './TemplateFileAttributesParser.jsx' -import { meta, getMandatoryFieldsForActivityUpload, getFieldsForActivityUpload } from './model.js' -import styles from './styles.scss' - -const getTypeName = value => - toCamelCase(meta.get('statUnitType').options.find(op => op.value === value).text) - -const variablesForActivities = getFieldsForActivityUpload() - -const { Column } = Grid -const { Group } = Form -const TextField = withDebounce(PlainTextField) -const SelectField = withDebounce(PlainSelectField) - -const FormBody = ({ - values, - getFieldErrors, - touched, - isSubmitting, - setFieldValue, - setValues, - handleBlur, - localize, - columns, - location: { pathname }, -}) => { - const createProps = (key) => { - const props = { - ...meta.get(key), - name: key, - value: values[key], - touched: !!touched[key], - errors: getFieldErrors(key), - disabled: isSubmitting, - onChange: handlerFor(setFieldValue), - onBlur: handleBlur, - localize, - url: pathname, - } - if (props.options) { - props.options = props.options.map(x => ({ - ...x, - text: localize(x.text), - })) - } - return props - } - - const updateValues = data => setValues({ ...values, ...data }) - const [mapping, attribs] = [createProps('variablesMapping'), createProps('attributesToCheck')] - const columnsByUnitType = columns[getTypeName(values.statUnitType)] - const filteredColumnsForActivities = columnsByUnitType.filter(el => variablesForActivities.filter(varForAc => varForAc === el.name).length === 1) - - return ( - - - - -
- Please do not use hyphens (-) in the column values of the XML/CSV file, it is currently - not supported. -
-
- - - - - - - - - - -
- - - setFieldValue('variablesMapping', value)} - attributes={values.attributesToCheck} - columns={ - values.dataSourceUploadType === 1 ? columnsByUnitType : filteredColumnsForActivities - } - mandatoryColumns={ - values.dataSourceUploadType === 1 - ? getMandatoryFieldsForStatUnitUpload(values.statUnitType) - : getMandatoryFieldsForActivityUpload() - } - localize={localize} - mapping={mapping} - attribs={attribs} - isUpdate={values.allowedOperations === 2} - /> - - -
- ) -} - -const { arrayOf, number, shape, string, oneOfType } = PropTypes -const unitColumnPropType = arrayOf(shape({ name: string })).isRequired -FormBody.propTypes = { - ...bodyPropTypes, - values: shape({ - name: string.isRequired, - description: string.isRequired, - allowedOperations: number.isRequired, - priority: number.isRequired, - statUnitType: number.isRequired, - attributesToCheck: arrayOf(string).isRequired, - variablesMapping: arrayOf(arrayOf(string)).isRequired, - csvDelimiter: string.isRequired, - csvSkipCount: oneOfType([string, number]).isRequired, - }).isRequired, - columns: shape({ - localUnit: unitColumnPropType, - legalUnit: unitColumnPropType, - enterpriseUnit: unitColumnPropType, - }).isRequired, - mandatoryColumns: arrayOf(string), -} - -FormBody.defaultProps = { - mandatoryColumns: [], -} - -export default FormBody diff --git a/legacy/client/pages/DataSources/List/List.jsx b/legacy/client/pages/DataSources/List/List.jsx deleted file mode 100644 index 2e1a5f0db..000000000 --- a/legacy/client/pages/DataSources/List/List.jsx +++ /dev/null @@ -1,163 +0,0 @@ -import React from 'react' -import { arrayOf, shape, func, string, number, oneOfType } from 'prop-types' -import { Link } from 'react-router' -import * as R from 'ramda' -import { Button, Table, Segment, Confirm, Modal, Header } from 'semantic-ui-react' - -import { checkSystemFunction as sF } from '/helpers/config' -import Paginate from '/components/Paginate' -import SearchForm from './SearchForm.jsx' -import ListItem from './ListItem.jsx' - -class List extends React.Component { - static propTypes = { - formData: shape({ - wildcard: string, - statUnitType: oneOfType([number, string]), - priority: oneOfType([number, string]), - allowedOperations: oneOfType([number, string]), - }).isRequired, - query: shape({}).isRequired, - dataSources: arrayOf(shape({ - id: number.isRequired, - name: string.isRequired, - })), - totalCount: oneOfType([string, number]).isRequired, - onSubmit: func.isRequired, - onChange: func.isRequired, - onItemDelete: func.isRequired, - localize: func.isRequired, - fetchData: func.isRequired, - clear: func.isRequired, - errors: shape({ - message: string.isRequired, - }), - fetchError: func.isRequired, - } - - static defaultProps = { - dataSources: [], - errors: undefined, - } - - state = { - selectedDataSource: undefined, - } - - componentDidMount() { - this.props.fetchData(this.props.query) - } - - componentWillReceiveProps(nextProps) { - if (!R.equals(nextProps.query, this.props.query)) { - nextProps.fetchData(nextProps.query) - } - } - - componentWillUnmount() { - this.props.clear() - } - - displayConfirm = id => () => { - this.setState({ selectedDataSource: id }) - } - - handleConfirm = () => { - const selectedId = this.state.selectedDataSource - this.setState({ selectedDataSource: undefined }, () => this.props.onItemDelete(selectedId)) - } - - handleCancel = () => { - this.setState({ selectedDataSource: undefined }) - } - - renderConfirm() { - const { dataSources, localize } = this.props - const { name } = dataSources.find(ds => ds.id === this.state.selectedDataSource) - return ( - - ) - } - - render() { - const { - formData, - dataSources, - totalCount, - onSubmit, - onChange, - localize, - errors, - fetchError, - } = this.props - const canEdit = sF('DataSourcesEdit') - const canDelete = sF('DataSourcesDelete') - return ( -
-

{localize('DataSources')}

- - - - )} -
- ) - } -} - -export default List diff --git a/legacy/client/pages/DataSources/List/ListItem.jsx b/legacy/client/pages/DataSources/List/ListItem.jsx deleted file mode 100644 index f57c78e5b..000000000 --- a/legacy/client/pages/DataSources/List/ListItem.jsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react' -import { number, string, func, bool } from 'prop-types' -import { Table, Button } from 'semantic-ui-react' -import { Link } from 'react-router' -import * as R from 'ramda' - -import { dataSourceOperations, dataSourcePriorities } from '/helpers/enums' - -const ListItem = ({ - id, - name, - description, - priority, - allowedOperations, - canEdit, - canDelete, - onDelete, - localize, -}) => ( - - - {canEdit ? {name} : name} - - - - - {canDelete && ( - -
- ) - } - icon="upload" - color={color} - /> - - ) -} - -TemplateFileAttributesParser.propTypes = { - csvDelimiter: PropTypes.string.isRequired, - csvSkipCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, - onChange: PropTypes.func.isRequired, - localize: PropTypes.func.isRequired, -} - -export default TemplateFileAttributesParser diff --git a/legacy/client/pages/DataSources/Upload/Upload.jsx b/legacy/client/pages/DataSources/Upload/Upload.jsx deleted file mode 100644 index 142ee6688..000000000 --- a/legacy/client/pages/DataSources/Upload/Upload.jsx +++ /dev/null @@ -1,149 +0,0 @@ -import React, { useState, useCallback, useRef } from 'react' -import PropTypes from 'prop-types' -import { Grid, Input, Dropdown, Button, Segment, List } from 'semantic-ui-react' -import Dropzone from 'react-dropzone' - -import styles from './styles.scss' - -function Upload({ dataSources, uploadFile, localize }) { - const [description, setDescription] = useState('') - const [dataSourceId, setDataSourceId] = useState(undefined) - const [acceptedFiles, setAcceptedFiles] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [dropError, setDropError] = useState('') - - const dropzoneRef = useRef() - - const handleAcceptedDrop = useCallback((accepted) => { - const file = accepted[0] - if (file.name.endsWith('.csv') || file.name.endsWith('.xml')) { - setAcceptedFiles([file]) - setDropError('') - } else { - setAcceptedFiles([]) - setDropError('incorrect-format') - } - }, []) - - const handleRejectedDrop = useCallback(() => { - setAcceptedFiles([]) - setDropError('incorrect-format') - }, []) - - const handleEdit = prop => (_, { value }) => { - if (prop === 'dataSourceId') { - setDataSourceId(value) - } else if (prop === 'description') { - setDescription(value) - } - } - - const handleSubmit = () => { - const file = acceptedFiles[0] - const formData = new FormData() - formData.append('datafile', file, file.name) - formData.append('DataSourceId', dataSourceId) - formData.append('Description', description) - - setIsLoading(true) - - uploadFile(formData, () => { - setAcceptedFiles([]) - setIsLoading(false) - }) - } - - const file = acceptedFiles[0] - const canSubmit = file !== undefined && dataSourceId !== undefined - const options = dataSources.map(x => ({ text: x.name, value: x.id })) - - return ( - - - - - - - - - - - - - - {file === undefined ? ( -

{localize('DropZoneLabel')}

- ) : ( - - - - - - - - )} - {dropError && ( -

- {localize('IncorrectFileFormat')} -

- )} -

- {`${localize('OnlySupportedFormatsAllowed')}: CSV, XML`} -

-
-
-
- - - - -
- ) -} - -CreateForm.propTypes = { - localize: PropTypes.func.isRequired, - submitRole: PropTypes.func.isRequired, - navigateBack: PropTypes.func.isRequired, -} - -export default CreateForm diff --git a/legacy/client/pages/Roles/Create/actions.js b/legacy/client/pages/Roles/Create/actions.js deleted file mode 100644 index c75c16900..000000000 --- a/legacy/client/pages/Roles/Create/actions.js +++ /dev/null @@ -1,19 +0,0 @@ -import { push } from 'react-router-redux' - -import dispatchRequest from '/helpers/request' -import { navigateBack } from '/helpers/actionCreators' - -const submitRole = data => - dispatchRequest({ - url: '/api/roles', - method: 'post', - body: data, - onSuccess: (dispatch) => { - dispatch(push('/roles')) - }, - }) - -export default { - navigateBack, - submitRole, -} diff --git a/legacy/client/pages/Roles/Create/index.js b/legacy/client/pages/Roles/Create/index.js deleted file mode 100644 index e44f9485b..000000000 --- a/legacy/client/pages/Roles/Create/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' - -import { getText } from '/helpers/locale' - -import actions from './actions.js' -import Create from './Create.jsx' - -export default connect( - state => ({ - ...state.createRole, - localize: getText(state.locale), - }), - dispatch => bindActionCreators(actions, dispatch), -)(Create) diff --git a/legacy/client/pages/Roles/Create/styles.scss b/legacy/client/pages/Roles/Create/styles.scss deleted file mode 100644 index d5ba2fd0d..000000000 --- a/legacy/client/pages/Roles/Create/styles.scss +++ /dev/null @@ -1,14 +0,0 @@ -.rolecreate { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.form { - width: 50%; - - .sybbtn { - float: right; - } -} diff --git a/legacy/client/pages/Roles/Edit/Edit.jsx b/legacy/client/pages/Roles/Edit/Edit.jsx deleted file mode 100644 index 5ac3bec93..000000000 --- a/legacy/client/pages/Roles/Edit/Edit.jsx +++ /dev/null @@ -1,109 +0,0 @@ -import React, { useEffect } from 'react' -import PropTypes from 'prop-types' -import { Button, Form, Loader, Icon } from 'semantic-ui-react' -import { equals } from 'ramda' - -import DataAccess from '/components/DataAccess' -import { roles } from '/helpers/enums' -import styles from './styles.scss' - -function Edit({ id, activityTree, role, editForm, fetchRole, submitRole, navigateBack, localize }) { - useEffect(() => { - fetchRole(id) - }, [id, fetchRole]) - - const setRegion = (region) => { - editForm({ name: 'region', value: region }) - } - - const setActivities = (activities) => { - editForm({ name: 'activityCategoryIds', value: activities.filter(x => x !== 'all') }) - } - - const handleEdit = (e, { name, value }) => { - editForm({ name, value }) - } - - const handleSubmit = (e) => { - e.preventDefault() - submitRole({ ...role }) - } - - const handleAccessToSystemFunctionsChange = e => - editForm({ - name: e.name, - value: e.checked - ? [...role.accessToSystemFunctions, e.value] - : role.accessToSystemFunctions.filter(x => x !== e.value), - }) - - return ( -
- {role === undefined ? ( - - ) : ( -
-

{localize('EditRole')}

- - - {role.name !== roles.external && ( - - )} - {role.name !== roles.admin && ( - - )} -
- ) -} - -Edit.propTypes = { - id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, - activityTree: PropTypes.arrayOf(PropTypes.shape({})).isRequired, - role: PropTypes.shape({}).isRequired, - editForm: PropTypes.func.isRequired, - fetchRole: PropTypes.func.isRequired, - submitRole: PropTypes.func.isRequired, - navigateBack: PropTypes.func.isRequired, - localize: PropTypes.func.isRequired, -} - -export default Edit diff --git a/legacy/client/pages/Roles/Edit/actions.js b/legacy/client/pages/Roles/Edit/actions.js deleted file mode 100644 index ecddde1ea..000000000 --- a/legacy/client/pages/Roles/Edit/actions.js +++ /dev/null @@ -1,37 +0,0 @@ -import { createAction } from 'redux-act' -import { push } from 'react-router-redux' - -import dispatchRequest from '/helpers/request' -import { navigateBack } from '/helpers/actionCreators' - -export const fetchRoleSucceeded = createAction('fetch role succeeded') - -const fetchRole = id => - dispatchRequest({ - url: `/api/roles/${id}`, - onSuccess: (dispatch, resp) => { - dispatch(fetchRoleSucceeded(resp)) - }, - onFail: (dispatch) => { - dispatch(push('/roles')) - }, - }) - -const submitRole = ({ id, ...data }) => - dispatchRequest({ - url: `/api/roles/${id}`, - method: 'put', - body: data, - onSuccess: (dispatch) => { - dispatch(push('/roles')) - }, - }) - -export const editForm = createAction('edit role form') - -export default { - editForm, - submitRole, - fetchRole, - navigateBack, -} diff --git a/legacy/client/pages/Roles/Edit/index.js b/legacy/client/pages/Roles/Edit/index.js deleted file mode 100644 index 781bef151..000000000 --- a/legacy/client/pages/Roles/Edit/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' - -import { getText } from '/helpers/locale' -import actions from './actions.js' -import Edit from './Edit.jsx' - -export default connect( - (state, props) => ({ - ...state.editRole, - ...props.params, - localize: getText(state.locale), - }), - dispatch => bindActionCreators(actions, dispatch), -)(Edit) diff --git a/legacy/client/pages/Roles/Edit/reducers.js b/legacy/client/pages/Roles/Edit/reducers.js deleted file mode 100644 index 852ca9ea1..000000000 --- a/legacy/client/pages/Roles/Edit/reducers.js +++ /dev/null @@ -1,25 +0,0 @@ -import { createReducer } from 'redux-act' - -import * as actions from './actions.js' - -const initialState = { - role: undefined, -} - -const editRole = createReducer( - { - [actions.fetchRoleSucceeded]: (state, data) => ({ - ...state, - role: data, - }), - [actions.editForm]: (state, data) => ({ - ...state, - role: { ...state.role, [data.name]: data.value }, - }), - }, - initialState, -) - -export default { - editRole, -} diff --git a/legacy/client/pages/Roles/Edit/styles.scss b/legacy/client/pages/Roles/Edit/styles.scss deleted file mode 100644 index 0e975374f..000000000 --- a/legacy/client/pages/Roles/Edit/styles.scss +++ /dev/null @@ -1,14 +0,0 @@ -.roleEdit { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.form { - width: 50%; - - .sybbtn { - float: right; - } -} diff --git a/legacy/client/pages/Roles/List/List.jsx b/legacy/client/pages/Roles/List/List.jsx deleted file mode 100644 index f5f141e49..000000000 --- a/legacy/client/pages/Roles/List/List.jsx +++ /dev/null @@ -1,96 +0,0 @@ -import React, { useState, useEffect } from 'react' -import PropTypes from 'prop-types' -import { Table, Confirm } from 'semantic-ui-react' -import { equals } from 'ramda' - -import Paginate from '/components/Paginate' -import TableHeader from './Table/TableHeader.jsx' -import ListItem from './ListItem.jsx' - -function RolesList({ localize, toggleRole, fetchRoles, totalCount, query, roles: initialRoles }) { - const [showConfirm, setShowConfirm] = useState(false) - const [selectedId, setSelectedId] = useState(undefined) - const [selectedStatus, setSelectedStatus] = useState(undefined) - const [roles, setRoles] = useState(initialRoles) - - useEffect(() => { - fetchRoles(query) - }, [fetchRoles, query]) - - useEffect(() => { - if (!equals(roles, initialRoles)) { - setRoles(initialRoles) - } - }, [initialRoles]) - - const handleToggle = (id, status) => () => { - setSelectedId(id) - setSelectedStatus(status) - setShowConfirm(true) - } - - const handleConfirm = () => { - const id = selectedId - const status = selectedStatus - setShowConfirm(false) - setSelectedId(undefined) - setSelectedStatus(undefined) - toggleRole(id, status ? 0 : 1) - } - - const handleCancel = () => { - setShowConfirm(false) - } - - const renderConfirm = () => { - const { name: confirmName } = roles.find(r => r.id === selectedId) - const msgKey = selectedStatus ? 'DeleteRoleMessage' : 'UndeleteRoleMessage' - return ( - - ) - } - - return ( -
- {showConfirm && renderConfirm()} -

{localize('RolesList')}

- - - - {roles && - roles.map(r => ( - - ))} -
-
-
- ) -} - -RolesList.propTypes = { - localize: PropTypes.func.isRequired, - toggleRole: PropTypes.func.isRequired, - fetchRoles: PropTypes.func.isRequired, - totalCount: PropTypes.number.isRequired, - query: PropTypes.shape({}).isRequired, - roles: PropTypes.arrayOf(PropTypes.shape({ - id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - description: PropTypes.string.isRequired, - activeUsers: PropTypes.number.isRequired, - status: PropTypes.number.isRequired, - })).isRequired, -} - -export default RolesList diff --git a/legacy/client/pages/Roles/List/ListItem.jsx b/legacy/client/pages/Roles/List/ListItem.jsx deleted file mode 100644 index d802c1d8c..000000000 --- a/legacy/client/pages/Roles/List/ListItem.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react' -import { func, string, number } from 'prop-types' -import { Link } from 'react-router' -import { Table, Label } from 'semantic-ui-react' - -import { checkSystemFunction as sF } from '/helpers/config' -import styles from './styles.scss' - -const ListItem = ({ id, name, description, activeUsers, status, localize }) => ( - - - - {sF('RoleEdit') ? ( - {localize(name)} - ) : ( - {name} - )} - - {description} - - - - - -) - -ListItem.propTypes = { - onToggle: func.isRequired, - id: string.isRequired, - name: string.isRequired, - description: string.isRequired, - activeUsers: number.isRequired, - status: number.isRequired, - localize: func.isRequired, -} - -export default ListItem diff --git a/legacy/client/pages/Roles/List/Table/TableHeader.jsx b/legacy/client/pages/Roles/List/Table/TableHeader.jsx deleted file mode 100644 index 4fd27545c..000000000 --- a/legacy/client/pages/Roles/List/Table/TableHeader.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Table } from 'semantic-ui-react' - -const TableHeader = ({ localize }) => ( - - - {localize('RoleName')} - {localize('Description')} - {localize('ActiveUsers')} - - - -) - -TableHeader.propTypes = { localize: PropTypes.func.isRequired } - -export default TableHeader diff --git a/legacy/client/pages/Roles/List/actions.js b/legacy/client/pages/Roles/List/actions.js deleted file mode 100644 index d98a8ab87..000000000 --- a/legacy/client/pages/Roles/List/actions.js +++ /dev/null @@ -1,36 +0,0 @@ -import { createAction } from 'redux-act' - -import dispatchRequest from '/helpers/request' - -export const fetchRolesSucceeded = createAction('fetch roles succeeded') - -const fetchRoles = query => - dispatchRequest({ - queryParams: { - onlyActive: 'false', - page: query.page, - pageSize: query.pageSize, - }, - onSuccess: (dispatch, resp) => { - dispatch(fetchRolesSucceeded(resp)) - }, - }) - -export const toggleRoleSucceeded = createAction('toggle role succeeded') - -const toggleRole = (id, toggle) => - dispatchRequest({ - url: `/api/roles/${id}`, - queryParams: { - status: toggle, - }, - method: 'delete', - onSuccess: (dispatch) => { - dispatch(toggleRoleSucceeded({ id, status: toggle })) - }, - }) - -export default { - fetchRoles, - toggleRole, -} diff --git a/legacy/client/pages/Roles/List/index.js b/legacy/client/pages/Roles/List/index.js deleted file mode 100644 index 0e448da19..000000000 --- a/legacy/client/pages/Roles/List/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' - -import { getText } from '/helpers/locale' -import actions from './actions.js' -import List from './List.jsx' - -export default connect( - ({ roles, locale }, { location: { query } }) => ({ - ...roles, - query, - localize: getText(locale), - }), - dispatch => bindActionCreators(actions, dispatch), -)(List) diff --git a/legacy/client/pages/Roles/List/reducers.js b/legacy/client/pages/Roles/List/reducers.js deleted file mode 100644 index e362bef1f..000000000 --- a/legacy/client/pages/Roles/List/reducers.js +++ /dev/null @@ -1,29 +0,0 @@ -import { createReducer } from 'redux-act' - -import * as actions from './actions.js' - -const initialState = { - roles: [], - totalCount: 0, - totalPages: 0, -} - -const roles = createReducer( - { - [actions.fetchRolesSucceeded]: (state, data) => ({ - ...state, - roles: data.result, - totalCount: data.totalCount, - totalPages: data.totalPages, - }), - [actions.toggleRoleSucceeded]: (state, { id, status }) => ({ - ...state, - roles: state.roles.map(x => (x.id !== id ? x : { ...x, status })), - }), - }, - initialState, -) - -export default { - roles, -} diff --git a/legacy/client/pages/Roles/List/styles.scss b/legacy/client/pages/Roles/List/styles.scss deleted file mode 100644 index 08ac0210b..000000000 --- a/legacy/client/pages/Roles/List/styles.scss +++ /dev/null @@ -1,7 +0,0 @@ -.wrap { - > * { - overflow-wrap: break-word; - word-break: break-word; - hyphens: auto; - } -} diff --git a/legacy/client/pages/Roles/Routes.jsx b/legacy/client/pages/Roles/Routes.jsx deleted file mode 100644 index 85eb30197..000000000 --- a/legacy/client/pages/Roles/Routes.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' -import { Route, IndexRoute } from 'react-router' -import { node } from 'prop-types' - -import { checkSystemFunction as sF } from '/helpers/config' -import List from './List/index.js' -import Create from './Create/index.js' -import Edit from './Edit/index.js' - -const Layout = props =>
{props.children}
-Layout.propTypes = { children: node.isRequired } - -export default ( - - - {sF('RoleCreate') && } - {sF('RoleEdit') && } - -) diff --git a/legacy/client/pages/SampleFrames/Create.js b/legacy/client/pages/SampleFrames/Create.js deleted file mode 100644 index c691ccece..000000000 --- a/legacy/client/pages/SampleFrames/Create.js +++ /dev/null @@ -1,35 +0,0 @@ -import { bindActionCreators } from 'redux' -import { connect } from 'react-redux' -import { pipe } from 'ramda' -import { defaultProps } from 'recompose' - -import createSchemaFormHoc from '/components/createSchemaFormHoc' -import { getText } from '/helpers/locale' -import { create as actions } from './actions.js' -import FormBody from './FormBody.jsx' -import { createDefaults, schema } from './model.js' - -const stateToProps = state => ({ - localize: getText(state.locale), - locale: state.locale, -}) - -const { postSampleFrame, navigateBack } = actions -const dispatchToProps = dispatch => - bindActionCreators( - { - onSubmit: postSampleFrame, - onCancel: navigateBack, - }, - dispatch, - ) - -export default pipe( - createSchemaFormHoc(schema), - defaultProps({ - values: createDefaults(), - validateOnBlur: false, - validateOnChange: false, - }), - connect(stateToProps, dispatchToProps), -)(FormBody) diff --git a/legacy/client/pages/SampleFrames/Edit.js b/legacy/client/pages/SampleFrames/Edit.js deleted file mode 100644 index 337a4e694..000000000 --- a/legacy/client/pages/SampleFrames/Edit.js +++ /dev/null @@ -1,47 +0,0 @@ -import { bindActionCreators } from 'redux' -import { connect } from 'react-redux' -import { pipe, prop } from 'ramda' -import { lifecycle } from 'recompose' - -import createSchemaFormHoc from '/components/createSchemaFormHoc' -import withSpinnerUnless from '/components/withSpinnerUnless' -import { getText } from '/helpers/locale' -import { edit as actions } from './actions.js' -import FormBody from './FormBody.jsx' -import { schema } from './model.js' - -const stateToProps = state => ({ - ...state.sampleFrames.edit, - localize: getText(state.locale), - locale: state.locale, -}) - -const { putSampleFrame, navigateBack, getSampleFrame, ...restActions } = actions -const dispatchToProps = (dispatch, props) => - bindActionCreators( - { - ...restActions, - getSampleFrame: () => getSampleFrame(props.params.id), - onSubmit: (...params) => putSampleFrame(props.params.id, ...params), - onCancel: navigateBack, - }, - dispatch, - ) - -const hooks = { - componentDidMount() { - this.props.getSampleFrame(this.props.id) - }, - componentWillUnmount() { - this.props.clearEditForm() - }, -} - -const assert = props => props.formData != null - -export default pipe( - createSchemaFormHoc(schema, prop('formData')), - withSpinnerUnless(assert), - lifecycle(hooks), - connect(stateToProps, dispatchToProps), -)(FormBody) diff --git a/legacy/client/pages/SampleFrames/FieldsEditor.jsx b/legacy/client/pages/SampleFrames/FieldsEditor.jsx deleted file mode 100644 index acd707d2a..000000000 --- a/legacy/client/pages/SampleFrames/FieldsEditor.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import React, { useState } from 'react' -import PropTypes from 'prop-types' -import { Checkbox, Table, List, Label } from 'semantic-ui-react' - -import ListWithDnd from '/components/ListWithDnd' -import { sampleFrameFields } from '/helpers/enums' - -const listStyle = { display: 'inline-block' } -const floatRight = { float: 'right' } -const fields = [...sampleFrameFields] - -function FieldsEditor({ value: selected, onChange, localize }) { - const [isAllSelected, setIsAllSelected] = useState(selected.length === fields.length) - - const toggleSelectAll = () => { - const updatedSelected = isAllSelected ? [] : fields.map(([key]) => key) - onChange(updatedSelected) - setIsAllSelected(!isAllSelected) - } - - const onAdd = (_, { id }) => onChange([...selected, id]) - const onRemove = (_, { id }) => onChange(selected.filter(y => y !== id)) - - const allItems = fields.map(([key, value]) => { - const checked = selected.includes(key) - const props = { id: key, checked, label: localize(value), onClick: checked ? onRemove : onAdd } - return { key, content: } - }) - - return ( - - - - - - {localize('FieldsToSelect')} - - - - - - - - - - - ( - - - -
- ) -} - -FieldsEditor.propTypes = { - value: PropTypes.arrayOf(PropTypes.number).isRequired, - onChange: PropTypes.func.isRequired, - localize: PropTypes.func.isRequired, -} - -export default FieldsEditor diff --git a/legacy/client/pages/SampleFrames/FormBody.jsx b/legacy/client/pages/SampleFrames/FormBody.jsx deleted file mode 100644 index ecba1cfa4..000000000 --- a/legacy/client/pages/SampleFrames/FormBody.jsx +++ /dev/null @@ -1,118 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Grid, Message, Tab, Form } from 'semantic-ui-react' - -import { formBody as bodyPropTypes } from '/components/createSchemaFormHoc/propTypes' -import { TextField as PlainTextField, withDebounce } from '/components/fields' -import handlerFor from '/helpers/handleSetFieldValue' -import { hasValue, filterPredicateErrors } from '/helpers/validation' -import PredicateEditor from './PredicateEditor/index.jsx' -import FieldsEditor from './FieldsEditor.jsx' -import { predicate as predicatePropTypes } from './propTypes.js' - -const TextField = withDebounce(PlainTextField) - -function FormBody({ - values, - getFieldErrors, - touched, - isSubmitting, - setFieldValue, - handleBlur, - localize, - locale, - isEdit, -}) { - const propsFor = key => ({ - name: key, - value: values[key], - touched: !!touched[key], - errors: getFieldErrors(key), - disabled: isSubmitting, - onChange: handlerFor(setFieldValue), - onBlur: handleBlur, - localize, - }) - - const predicateProps = propsFor('predicate') - const fieldsProps = propsFor('fields') - - const filteredPredicateErrors = - hasValue(predicateProps.errors) && filterPredicateErrors(predicateProps.errors[0]) - - const renderPredicateEditor = () => ( - setFieldValue('predicate', value)} - localize={localize} - locale={locale} - /> - ) - - const renderFieldsEditor = () => ( - setFieldValue('fields', value)} - localize={localize} - /> - ) - - return ( -
-
- - - - - - - - - - {(hasValue(predicateProps.errors) || hasValue(fieldsProps.errors)) && ( - - - {hasValue(predicateProps.errors) && ( - - )} - {hasValue(fieldsProps.errors) && ( - - )} - - - )} - -
- ) -} - -const { arrayOf, number, shape, string } = PropTypes -FormBody.propTypes = { - ...bodyPropTypes, - values: shape({ - name: string.isRequired, - description: string, - fields: arrayOf(number).isRequired, - predicate: predicatePropTypes.isRequired, - }).isRequired, -} - -export default FormBody diff --git a/legacy/client/pages/SampleFrames/List/List.jsx b/legacy/client/pages/SampleFrames/List/List.jsx deleted file mode 100644 index caef346ac..000000000 --- a/legacy/client/pages/SampleFrames/List/List.jsx +++ /dev/null @@ -1,223 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Link } from 'react-router' -import { Button, Table, Segment, Form, Confirm } from 'semantic-ui-react' -import config, { checkSystemFunction as sF } from '/helpers/config' - -import { internalRequest } from '/helpers/request' -import Paginate from '/components/Paginate' - -class List extends React.Component { - state = { id: undefined } - - askDelete = id => () => this.setState({ id }) - - cancelDelete = () => this.setState({ id: undefined }) - - confirmDelete = () => { - const { id } = this.state - this.setState({ id: undefined }, () => this.props.deleteSampleFrame(id)) - } - - handleEdit = (_, { name, value }) => this.props.updateFilter({ [name]: value }) - - handleSubmit = (e) => { - e.preventDefault() - this.props.setQuery(this.props.formData) - } - - handleDownload = (_, { item }) => { - internalRequest({ - url: `/api/sampleframes/${item.id}/enqueue`, - method: 'get', - onSuccess: () => { - this.props.getSampleFrames(this.props.query) - }, - }) - } - - handleCheckFileGeneration = () => { - this.props.getSampleFrames(this.props.query) - } - - handleCheckOnClickDownload = () => { - setTimeout(this.handleCheckFileGeneration, 3000) - } - - renderConfirm() { - const { result, localize } = this.props - const { name } = result.find(x => x.id === this.state.id) - return ( - - ) - } - - render() { - const { formData, result, totalCount, localize } = this.props - const canPreview = sF('SampleFramesView') - const canEdit = sF('SampleFramesEdit') - const canDelete = sF('SampleFramesDelete') - return ( -
-

{localize('SampleFrames')}

- {canEdit && ( -
- ) - } -} - -const { arrayOf, func, number, shape, string } = PropTypes -List.propTypes = { - formData: shape({ - wildcard: string.isRequired, - }).isRequired, - result: arrayOf(shape({ - id: number.isRequired, - name: string.isRequired, - status: number.isRequired, - generatedDateTime: string, - })).isRequired, - totalCount: number.isRequired, - query: shape.isRequired, - setQuery: func.isRequired, - updateFilter: func.isRequired, - getSampleFrames: func.isRequired, - deleteSampleFrame: func.isRequired, - localize: func.isRequired, -} - -export default List diff --git a/legacy/client/pages/SampleFrames/List/index.js b/legacy/client/pages/SampleFrames/List/index.js deleted file mode 100644 index 987deb6b4..000000000 --- a/legacy/client/pages/SampleFrames/List/index.js +++ /dev/null @@ -1,51 +0,0 @@ -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import { lifecycle } from 'recompose' -import { pipe, merge, equals } from 'ramda' - -import withSpinnerUnless from '/components/withSpinnerUnless' -import { getText } from '/helpers/locale' -import { list as actions } from '../actions.js' -import List from './List.jsx' - -const assertProps = props => props.result != null -const createFilterFromQuery = query => - Object.entries(query).reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}) - -const hooks = { - componentDidMount() { - if (this.props.queryString === '') return - const newQuery = createFilterFromQuery(this.props.query) - if (!equals(this.props.formData, newQuery)) { - this.props.updateFilter(newQuery) - this.props.getSampleFrames(this.props.query) - } - window.scrollTo(0, 0) - }, - componentWillReceiveProps(nextProps) { - if (!equals(nextProps.query, this.props.query)) { - nextProps.getSampleFrames(nextProps.query) - } - }, - componentWillUnmount() { - this.props.clearSearchForm() - }, -} - -const mapStateToProps = (state, props) => ({ - ...state.sampleFrames.list, - query: props.location.query, - localize: getText(state.locale), -}) - -const { setQuery, ...restActions } = actions -const mapDispatchToProps = (dispatch, props) => ({ - ...bindActionCreators(restActions, dispatch), - setQuery: pipe(merge(props.location.query), setQuery(props.location.pathname), dispatch), -}) - -export default pipe( - withSpinnerUnless(assertProps), - lifecycle(hooks), - connect(mapStateToProps, mapDispatchToProps), -)(List) diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/ClauseRow.jsx b/legacy/client/pages/SampleFrames/PredicateEditor/ClauseRow.jsx deleted file mode 100644 index dd2627629..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/ClauseRow.jsx +++ /dev/null @@ -1,168 +0,0 @@ -/* eslint-disable no-mixed-operators */ -import React from 'react' -import PropTypes from 'prop-types' -import { Dropdown, Table, Input, Icon } from 'semantic-ui-react' -import * as R from 'ramda' - -import { predicateFields } from '/helpers/config' -import { pairsToOptions } from '/helpers/enumerable' -import { predicateComparison, predicateOperations } from '/helpers/enums' -import { clause as clausePropTypes } from '../propTypes.js' -import InsertButton from './InsertButton.jsx' -import ValueInput from './ValueInput.jsx' -import styles from './styles.scss' - -const getCellClassName = (isStart, isEnd, i) => - `${styles.group} ${styles[`group-${(i - 1) % 10}`]} ${styles['group-edge']} ` + - `${isStart ? styles['group-start'] : ''} ` + - `${isEnd ? styles['group-end'] : ''}` - -const { Row, Cell } = Table -const ClauseRow = ({ - value: clause, - path, - meta: { shift, startAt, endAt, allSelectedAt }, - isHead, - maxShift, - onChange, - onInsert, - onToggle, - onToggleGroup, - onRemove, - onUngroup, - localize, - locale, - isEdit, -}) => { - const handleChange = onChange(path) - const propsFor = name => ({ - name, - value: clause[name], - onChange: handleChange, - }) - const lastGroupCellSpan = maxShift - shift + 1 - const toGroupCell = (i) => { - const isTop = startAt.includes(i) - const className = getCellClassName(isTop, endAt.includes(i), i) - const allSelected = allSelectedAt.includes(i) - const colSpan = i === shift ? lastGroupCellSpan : 1 - return ( - - {isTop && ( - - )} - {isTop && ( - - - - - )} - - ) - } - const allOperations = pairsToOptions(predicateOperations, localize) - const operationsFor = field => - allOperations.filter(x => predicateFields.get(field).operations.includes(x.value)) - return ( - - {R.range(1, shift + 1).map(toGroupCell)} - - -   - - - - - - localize(x.value))} - size="mini" - search - /> - - - - - - - - - - - - - ) -} - -const { arrayOf, bool, func, number, oneOfType, shape, string } = PropTypes -ClauseRow.propTypes = { - value: clausePropTypes.isRequired, - path: arrayOf(oneOfType([number, string])).isRequired, - meta: shape({ - shift: number.isRequired, - startAt: arrayOf(number).isRequired, - endAt: arrayOf(number).isRequired, - allSelectedAt: arrayOf(number).isRequired, - }).isRequired, - isHead: bool.isRequired, - maxShift: number.isRequired, - onChange: func.isRequired, - onInsert: func.isRequired, - onToggle: func.isRequired, - onToggleGroup: func.isRequired, - onRemove: func.isRequired, - onUngroup: func.isRequired, - localize: func.isRequired, - locale: string.isRequired, -} - -export default ClauseRow diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/Header.jsx b/legacy/client/pages/SampleFrames/PredicateEditor/Header.jsx deleted file mode 100644 index add1b1dfb..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/Header.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Table, Icon } from 'semantic-ui-react' -import InsertButton from './InsertButton.jsx' -import styles from './styles.scss' - -function Header(props) { - const { maxShift, canGroup, anySelected, group, toggleAll, onInsert, localize } = props - - return ( - - - - - - - -   - - - - - - {['Comparisons', 'Fields', 'Operations', 'Values'].map(x => ( - - ))} - - - - - - ) -} - -const { bool, func, number } = PropTypes - -Header.propTypes = { - canGroup: bool.isRequired, - anySelected: bool.isRequired, - maxShift: number.isRequired, - group: func.isRequired, - toggleAll: func.isRequired, - onInsert: func.isRequired, - localize: func.isRequired, -} - -export default Header diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/InsertButton.jsx b/legacy/client/pages/SampleFrames/PredicateEditor/InsertButton.jsx deleted file mode 100644 index 523af7ba7..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/InsertButton.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Icon } from 'semantic-ui-react' - -import styles from './styles.scss' - -const InsertButton = ({ onClick, title }) => ( - - - - -) - -InsertButton.propTypes = { - onClick: PropTypes.func.isRequired, - title: PropTypes.string.isRequired, -} - -export default InsertButton diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/ValueInput.jsx b/legacy/client/pages/SampleFrames/PredicateEditor/ValueInput.jsx deleted file mode 100644 index 897c57e74..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/ValueInput.jsx +++ /dev/null @@ -1,169 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import * as R from 'ramda' - -import { - RangeField, - SelectField, - withDebounce, - RegionField, - MainActivity, - StatusField, - ForeignParticipationField, - LegalFormField, - InstitutionalSectorCodeField, - TextField2, -} from '/components/fields' -import { statUnitTypes } from '/helpers/enums' -import { oneOf } from '/helpers/enumerable' -import { hasValue } from '/helpers/validation' - -const separator = ',' -const delimiter = '—' - -const unitTypeOptions = localize => - [...statUnitTypes].map(([, v]) => ({ value: v, text: localize(v) })) - -const freeEconZoneOptions = localize => - [ - { value: '0', text: 'No' }, - { value: '1', text: 'Yes' }, - ].map(x => ({ - value: x.value, - text: localize(x.text), - })) - -const fieldToLookup = new Map([ - [2, 12], - [3, 13], - [4, 9], - [10, 11], - [22, 5], - [23, 6], -]) - -const selectFields = [1, 9] -const lookupFields = [2, 3, 4, 10, 22, 23] -const numberFields = [5, 6, 7, 8] -const region = 2 -const mainActivityField = 3 -const status = 4 -const foreignParticipation = 10 -const legalForm = 22 -const institutionalSectorCode = 23 - -const rangeOperations = [9, 10] -const listOperations = [11, 12] - -const getComponent = R.cond([ - [R.where({ field: R.equals(region) }), R.always(RegionField)], - [R.where({ field: R.equals(mainActivityField) }), R.always(MainActivity)], - [R.where({ field: R.equals(status) }), R.always(StatusField)], - [R.where({ field: R.equals(foreignParticipation) }), R.always(ForeignParticipationField)], - [R.where({ field: R.equals(legalForm) }), R.always(LegalFormField)], - [R.where({ field: R.equals(institutionalSectorCode) }), R.always(InstitutionalSectorCodeField)], - [R.where({ field: oneOf([...selectFields]) }), R.always(SelectField)], - [ - R.where({ field: oneOf(numberFields), operation: oneOf(rangeOperations) }), - R.always(RangeField), - ], - [R.T, R.always(withDebounce(TextField2))], -]) - -const addValueConverting = R.cond([ - [ - R.where({ operation: oneOf(listOperations), field: oneOf(lookupFields) }), - ({ value, onChange, ...props }) => ({ - ...props, - value: value.split(separator).map(Number), - onChange: (_, { value: val, ...rest }) => - onChange(_, { ...rest, value: val.join(separator) }), - }), - ], - [ - R.where({ field: oneOf(lookupFields) }), - ({ value, onChange, ...props }) => ({ - ...props, - value: Number(value), - onChange: (_, { value: val, ...rest }) => - onChange(_, { ...rest, value: hasValue(val) ? val.toString() : '' }), - }), - ], - [ - R.where({ - operation: oneOf(listOperations), - field: R.complement(oneOf(numberFields)), - }), - ({ value, onChange, ...props }) => ({ - ...props, - value: value.split(separator), - onChange: (_, { value: val, ...rest }) => - onChange(_, { ...rest, value: val.join(separator) }), - }), - ], - [ - R.where({ operation: oneOf(rangeOperations) }), - ({ field, operation, value, ...props }) => { - const values = value.split(delimiter) - const from = Number(values[0]) || 0 - const to = Number(values[1]) || 0 - const onChange = (e, { from: fromVal, to: toVal, ...rest }) => - props.onChange(e, { - ...rest, - value: `${fromVal}${delimiter}${toVal}`, - }) - return { ...props, from, to, onChange, delimiter, field, operation } - }, - ], - [R.T, R.identity], -]) - -const setAdditionalProps = R.cond([ - [ - R.where({ field: oneOf(numberFields), operation: oneOf(listOperations) }), - ({ ...props }) => ({ - ...props, - placeholder: 'Values must be separated by a comma.', - }), - ], - [ - R.where({ field: R.equals(1) }), - ({ field, operation, ...props }) => ({ - ...props, - options: unitTypeOptions(props.localize), - multiselect: listOperations.includes(operation), - }), - ], - [ - R.where({ field: R.equals(9) }), - ({ field, operation, ...props }) => ({ - ...props, - options: freeEconZoneOptions(props.localize), - }), - ], - [ - R.where({ field: oneOf(lookupFields) }), - ({ field, operation, ...props }) => ({ - ...props, - lookup: fieldToLookup.get(field), - multiselect: listOperations.includes(operation), - }), - ], - [R.where({ operation: oneOf(rangeOperations) }), R.omit(['field', 'operation'])], - [R.T, R.omit(['field', 'operation'])], -]) - -const getProps = R.pipe(addValueConverting, setAdditionalProps) - -export default function ValueInput(props) { - const Component = getComponent(props) - return -} - -ValueInput.propTypes = { - field: PropTypes.number.isRequired, - operation: PropTypes.number.isRequired, - onChange: PropTypes.func.isRequired, - localize: PropTypes.func.isRequired, - locale: PropTypes.string.isRequired, -} diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/index.jsx b/legacy/client/pages/SampleFrames/PredicateEditor/index.jsx deleted file mode 100644 index f84bf7161..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/index.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Table } from 'semantic-ui-react' - -import { predicate as predicatePropTypes } from '../propTypes.js' -import * as fns from '../predicateFns.js' -import Header from './Header.jsx' -import ClauseRow from './ClauseRow.jsx' - -const PredicateEditor = ({ value: predicate, onChange, localize, locale, isEdit }) => { - const { clauses, maxShift } = fns.flatten(predicate) - const selected = fns.getSequentiallySelected(clauses) - const anySelected = clauses.some(x => x.clause.selected) - const group = () => - onChange(fns.group( - predicate, - selected.map(x => x.path), - )) - const toggleAll = () => onChange(fns.toggleAll(!anySelected)(predicate)) - const edit = path => (_, data) => onChange(fns.edit(path, data)(predicate)) - const add = (path, at) => () => onChange(fns.add(path, at)(predicate)) - const toggle = path => () => onChange(fns.toggle(path)(predicate)) - const toggleGroup = (path, value) => () => onChange(fns.toggleGroup(predicate, path, value)) - const ungroup = path => () => onChange(fns.ungroup(predicate, path)) - const remove = path => () => onChange(fns.remove(path)(predicate)) - const firstClausePath = clauses.length > 0 ? clauses[0].path : undefined - const addHeadClause = () => onChange(fns.addHeadClause(predicate, firstClausePath)) - return ( - -
1} - anySelected={anySelected} - group={group} - toggleAll={toggleAll} - onInsert={addHeadClause} - localize={localize} - /> - - {clauses.map(({ clause, path, meta }, i) => ( - - ))} - -
- ) -} - -const { func, string } = PropTypes -PredicateEditor.propTypes = { - value: predicatePropTypes.isRequired, - onChange: func.isRequired, - localize: func.isRequired, - locale: string.isRequired, -} - -export default PredicateEditor diff --git a/legacy/client/pages/SampleFrames/PredicateEditor/styles.scss b/legacy/client/pages/SampleFrames/PredicateEditor/styles.scss deleted file mode 100644 index 73682a044..000000000 --- a/legacy/client/pages/SampleFrames/PredicateEditor/styles.scss +++ /dev/null @@ -1,68 +0,0 @@ -.flipped { - transform: scale(1, -1) !important; -} - -.rotated-270 { - transform: rotate(270deg) !important; -} - -.large-corner-icon { - transform: scale(1.5, 1.5) !important; -} - -.group { - padding: 0 !important; - width: 1em !important; - - &-edge { - border-left: 0.1em solid rgba(185, 185, 185, 1); - } - - &-start { - border-top: 0.1em solid rgba(185, 185, 185, 1) !important; - } - - &-end { - border-bottom: 0.1em solid rgba(185, 185, 185, 1); - } - - &-0 { - background: rgba(255, 232, 230, 1) !important; - } - - &-1 { - background: rgba(235, 255, 237, 1) !important; - } - - &-2 { - background: rgba(247, 191, 143, 1) !important; - } - - &-3 { - background: rgba(255, 237, 222, 1) !important; - } - - &-4 { - background: rgba(255, 248, 219, 1) !important; - } - - &-5 { - background: rgba(241, 155, 241, 1) !important; - } - - &-6 { - background: rgba(233, 255, 255, 1) !important; - } - - &-7 { - background: rgba(234, 231, 255, 1) !important; - } - - &-8 { - background: rgba(166, 166, 76, 1) !important; - } - - &-9 { - background: rgba(255, 227, 251, 1) !important; - } -} diff --git a/legacy/client/pages/SampleFrames/Preview/List.jsx b/legacy/client/pages/SampleFrames/Preview/List.jsx deleted file mode 100644 index 474fa39f6..000000000 --- a/legacy/client/pages/SampleFrames/Preview/List.jsx +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import * as R from 'ramda' -import { Container, Table, Button, Grid, Segment, Header } from 'semantic-ui-react' - -import { capitalizeFirstLetter } from '/helpers/string' - -const getHeaders = R.pipe(R.head, R.dissoc('uid'), R.keys) -const tableWrapperStyle = { maxHeight: '500px', overflow: 'auto' } - -const List = ({ id, sampleFrame, list, localize, error }) => { - if (error !== undefined) return

{localize(error)}

- if (list.length === 0) return

{localize('Empty')}

- const headers = getHeaders(list) - - return ( - - - - -
- {sampleFrame && ( - -
{sampleFrame.name}
-
- )} - {sampleFrame && sampleFrame.description && ( - - {sampleFrame.description} - - )} -
-
- - -
- - - - {headers.map(key => ( - - ))} - - - - {list.map(({ uid, ...unit }) => ( - - {headers.map(key => ( - - ))} - - ))} - -
-
-
-
- - -