Showing preview only (5,801K chars total). Download the full file or copy to clipboard to get everything.
Repository: dsuryd/dotnetify-react-demo-vs2017
Branch: master
Commit: c1f80d7cdb75
Files: 280
Total size: 5.3 MB
Directory structure:
gitextract_j6oj_ypb/
├── .gitattributes
├── .gitignore
├── LICENSE
├── MicrofrontendTemplate/
│ ├── .gitignore
│ ├── .template.config/
│ │ └── template.json
│ ├── Microfrontend.sln
│ ├── Portal/
│ │ ├── Portal.csproj
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── auth.js
│ │ │ ├── components/
│ │ │ │ ├── App.js
│ │ │ │ ├── Landing.js
│ │ │ │ ├── Login.js
│ │ │ │ └── Portal.js
│ │ │ ├── index.js
│ │ │ └── loader.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Controllers/
│ │ │ │ └── LoginController.cs
│ │ │ ├── Program.cs
│ │ │ └── Startup.cs
│ │ ├── tempkey.rsa
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ ├── 404.html
│ │ └── index.html
│ ├── README.md
│ ├── ReactDashboardApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactDashboardApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ ├── ActivitiesCard.js
│ │ │ │ ├── Dashboard.js
│ │ │ │ └── InfoCard.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ └── MockLiveDataService.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── Dashboard.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── ReactFormApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactFormApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ ├── AddressForm.js
│ │ │ │ ├── BasicInfoForm.js
│ │ │ │ ├── Form.js
│ │ │ │ └── NewCustomerDialog.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── Customer.cs
│ │ │ │ ├── CustomerFormData.cs
│ │ │ │ └── CustomerRepository.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ ├── AddressForm.cs
│ │ │ ├── CustomerForm.cs
│ │ │ ├── NewCustomerForm.cs
│ │ │ ├── PersonForm.cs
│ │ │ └── PhoneForm.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── ReactTodoApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactTodoApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ └── TodoList.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── TodoList.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── Shared/
│ │ ├── IdentityServer/
│ │ │ ├── IdentityServerClient.cs
│ │ │ ├── IdentityServerConfig.cs
│ │ │ └── IdentityServerSettings.cs
│ │ └── Shared.csproj
│ ├── VueTodoApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── VueTodoApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ └── TodoList.vue
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── TodoList.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── global.json
│ ├── heroku-deploy/
│ │ ├── Portal/
│ │ │ ├── Dockerfile
│ │ │ ├── appsettings.json
│ │ │ ├── build.bat
│ │ │ ├── deploy.bat
│ │ │ └── excludedfiles.txt
│ │ ├── ReactDashboardApp/
│ │ │ ├── Dockerfile
│ │ │ ├── appsettings.json
│ │ │ ├── build.bat
│ │ │ ├── deploy.bat
│ │ │ └── excludedfiles.txt
│ │ └── nginx/
│ │ ├── Dockerfile
│ │ ├── deploy.bat
│ │ └── nginx.conf
│ ├── nginx/
│ │ ├── .gitignore
│ │ ├── conf/
│ │ │ ├── fastcgi.conf
│ │ │ ├── fastcgi_params
│ │ │ ├── koi-utf
│ │ │ ├── koi-win
│ │ │ ├── mime.types
│ │ │ ├── nginx.conf
│ │ │ ├── scgi_params
│ │ │ ├── uwsgi_params
│ │ │ └── win-utf
│ │ ├── contrib/
│ │ │ ├── README
│ │ │ ├── geo2nginx.pl
│ │ │ ├── unicode2nginx/
│ │ │ │ ├── koi-utf
│ │ │ │ ├── unicode-to-nginx.pl
│ │ │ │ └── win-utf
│ │ │ └── vim/
│ │ │ ├── ftdetect/
│ │ │ │ └── nginx.vim
│ │ │ ├── ftplugin/
│ │ │ │ └── nginx.vim
│ │ │ ├── indent/
│ │ │ │ └── nginx.vim
│ │ │ └── syntax/
│ │ │ └── nginx.vim
│ │ ├── docs/
│ │ │ ├── CHANGES
│ │ │ ├── CHANGES.ru
│ │ │ ├── LICENSE
│ │ │ ├── OpenSSL.LICENSE
│ │ │ ├── PCRE.LICENCE
│ │ │ ├── README
│ │ │ └── zlib.LICENSE
│ │ ├── html/
│ │ │ ├── 50x.html
│ │ │ └── index.html
│ │ ├── run.bat
│ │ └── stop.bat
│ └── run.bat
├── README.md
├── ReactTemplate/
│ ├── README.md
│ ├── content/
│ │ ├── .gitignore
│ │ ├── .template.config/
│ │ │ └── template.json
│ │ ├── client/
│ │ │ ├── app.tsx
│ │ │ ├── auth.ts
│ │ │ ├── components/
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── InfoBox.tsx
│ │ │ │ │ ├── RecentActivities.tsx
│ │ │ │ │ ├── ServerUsage.tsx
│ │ │ │ │ ├── Traffic.tsx
│ │ │ │ │ └── Utilization.tsx
│ │ │ │ └── table/
│ │ │ │ ├── InlineEdit.tsx
│ │ │ │ └── Pagination.tsx
│ │ │ ├── routes.tsx
│ │ │ ├── styles/
│ │ │ │ ├── app.css
│ │ │ │ ├── styles.ts
│ │ │ │ └── theme-default.ts
│ │ │ └── views/
│ │ │ ├── App.tsx
│ │ │ ├── AppLayout.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── FormPage.tsx
│ │ │ ├── LoginPage.tsx
│ │ │ └── TablePage.tsx
│ │ ├── package.json
│ │ ├── projectName.csproj
│ │ ├── projectName.sln
│ │ ├── server/
│ │ │ ├── AuthServer.cs
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── EmployeeService.cs
│ │ │ │ ├── MockLiveDataService.cs
│ │ │ │ └── employees.json
│ │ │ └── ViewModels/
│ │ │ ├── AppLayout.cs
│ │ │ ├── Dashboard.cs
│ │ │ ├── Form.cs
│ │ │ └── Table.cs
│ │ ├── tsconfig.json
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ ├── 404.html
│ │ └── index.html
│ └── template.nuspec
└── _archive/
├── HelloWorld/
│ ├── HelloWorld.cs
│ ├── HelloWorld.csproj
│ ├── HelloWorld.sln
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── Startup.cs
│ ├── package.json
│ ├── src/
│ │ ├── HelloWorld.jsx
│ │ └── app.js
│ ├── webpack.config.js
│ └── wwwroot/
│ ├── bundle.js
│ └── index.html
├── LiveChart/
│ ├── IISPublishingSteps.md
│ ├── LiveChart.cs
│ ├── LiveChart.csproj
│ ├── LiveChart.sln
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── Startup.cs
│ ├── compilerconfig.json
│ ├── compilerconfig.json.defaults
│ ├── package.json
│ ├── src/
│ │ ├── LiveChart.jsx
│ │ └── app.js
│ ├── webpack.config.js
│ └── wwwroot/
│ ├── bundle.js
│ └── index.html
├── README.md
├── ReactTemplateTS/
│ ├── .editorconfig
│ ├── README.md
│ ├── content/
│ │ ├── .babelrc
│ │ ├── .gitignore
│ │ ├── .template.config/
│ │ │ └── template.json
│ │ ├── client/
│ │ │ ├── app.tsx
│ │ │ ├── auth.tsx
│ │ │ ├── components/
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── InfoBox.tsx
│ │ │ │ │ ├── RecentActivities.tsx
│ │ │ │ │ ├── ServerUsage.tsx
│ │ │ │ │ ├── Traffic.tsx
│ │ │ │ │ └── Utilization.tsx
│ │ │ │ └── table/
│ │ │ │ ├── InlineEdit.tsx
│ │ │ │ └── Pagination.tsx
│ │ │ ├── routes.tsx
│ │ │ ├── styles/
│ │ │ │ ├── app.css
│ │ │ │ ├── styles.ts
│ │ │ │ └── theme-default.ts
│ │ │ └── views/
│ │ │ ├── App.tsx
│ │ │ ├── AppLayout.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── FormPage.tsx
│ │ │ ├── LoginPage.tsx
│ │ │ └── TablePage.tsx
│ │ ├── dotnetify_react_template.csproj
│ │ ├── dotnetify_react_template.sln
│ │ ├── images.d.ts
│ │ ├── package.json
│ │ ├── server/
│ │ │ ├── AuthServer.cs
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── EmployeeService.cs
│ │ │ │ ├── MockLiveDataService.cs
│ │ │ │ └── employees.json
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ ├── AppLayout.cs
│ │ │ ├── Dashboard.cs
│ │ │ ├── Form.cs
│ │ │ └── Table.cs
│ │ ├── tsconfig.json
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ └── template.nuspec
└── Routing/
├── DotNetify.ServerSideRender.cs
├── Program.cs
├── Properties/
│ └── launchSettings.json
├── Routing.csproj
├── Routing.sln
├── Startup.cs
├── ViewModels/
│ ├── Index.cs
│ ├── Page1.cs
│ └── Page2.cs
├── compilerconfig.json
├── compilerconfig.json.defaults
├── package.json
├── src/
│ ├── Index.js
│ ├── Index.jsx
│ ├── app.js
│ └── app.server.js
├── webpack.config.js
└── wwwroot/
├── Index.html
├── Page1.js
├── Page1.jsx
├── Page2.js
├── Page2.jsx
├── Page3.html
└── bundle.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio Code
.vscode/
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
/ReactTemplate/content/wwwroot/dist
**/Typings
**/*.tgz
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: MicrofrontendTemplate/.gitignore
================================================
### App ###
dist/
### Code ###
# Visual Studio Code - https://code.visualstudio.com/
.settings/
.vscode/
jsconfig.json
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
#*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
*.vs
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Uncomment the next line to ignore your web deploy settings.
# By default, sensitive information, such as encrypted password
# should be stored in the .pubxml.user file.
#*.pubxml
*.pubxml.user
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Typescript v1 declaration files
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
### VisualStudio Patch ###
# By default, sensitive information, such as encrypted password
# should be stored in the .pubxml.user file.
ASP.NET Demo/WebApplication.Knockout/Scripts/lib
# End of https://www.gitignore.io/api/node,code,visualstudio
================================================
FILE: MicrofrontendTemplate/Microfrontend.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.572
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Portal", "Portal\Portal.csproj", "{3A4AEABB-3F8D-4442-B844-5C63975AFF76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactDashboardApp", "ReactDashboardApp\ReactDashboardApp.csproj", "{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactFormApp", "ReactFormApp\ReactFormApp.csproj", "{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactTodoApp", "ReactTodoApp\ReactTodoApp.csproj", "{4B835F6E-C512-48B3-86CD-C41298A6B04D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VueTodoApp", "VueTodoApp\VueTodoApp.csproj", "{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Release|Any CPU.Build.0 = Release|Any CPU
{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Release|Any CPU.Build.0 = Release|Any CPU
{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Release|Any CPU.Build.0 = Release|Any CPU
{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Release|Any CPU.Build.0 = Release|Any CPU
{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Release|Any CPU.Build.0 = Release|Any CPU
{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BA286E46-A723-4519-AC1B-4D323C6C5AD9}
EndGlobalSection
EndGlobal
================================================
FILE: MicrofrontendTemplate/Portal/Portal.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>Portal</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
<Folder Include="wwwroot\dist\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.5.2" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
<!-- In development, the dist files won't exist on the first run or when cloning to
a different machine, so rebuild them if not already present. -->
<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
<!-- Build JS resources -->
<Message Importance="high" Text="Performing first-run Webpack build..." />
<Exec Command="npm install" />
<Exec Command="npm run build" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec Command="npm install" />
<Exec Command="npm run prod" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>
================================================
FILE: MicrofrontendTemplate/Portal/Properties/launchSettings.json
================================================
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5000/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"dev": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5000/"
},
"prod": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:5000/"
}
}
}
================================================
FILE: MicrofrontendTemplate/Portal/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://localhost:5000"
}
}
================================================
FILE: MicrofrontendTemplate/Portal/client/auth.js
================================================
const url = '/api/login';
export const signIn = (username, password) => {
return fetch(url, {
method: 'post',
body: 'username=' + username + '&password=' + password,
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
})
.then(response => {
if (!response.ok) throw new Error(response.status);
return response.json();
})
.then(token => window.sessionStorage.setItem('access_token', token.access_token));
};
export const signOut = () => {
window.sessionStorage.removeItem('access_token');
window.location.href = '/';
};
export const validateToken = token => {
return fetch(url + '/validate', {
method: 'post',
body: 'token=' + token,
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
}).then(response => response.ok);
};
export const getAccessToken = () => {
return window.sessionStorage.getItem('access_token');
};
export const getAuthHeaders = _ => ({
headers: { Authorization: 'Bearer ' + getAccessToken() },
exceptionHandler: _ => signOut()
});
================================================
FILE: MicrofrontendTemplate/Portal/client/components/App.js
================================================
import { Fragment, useState, useEffect } from 'react';
import { getAccessToken, validateToken } from '../auth';
import Portal from './Portal';
import Landing from './Landing';
export const CompanyLogo = styled.a`
display: flex;
align-items: center;
margin-left: 1rem;
background-image: url(https://dotnetify.net/content/images/dotnetify-logo.png);
background-size: 100% 100%;
width: 200px;
height: 39px;
`;
const App = _ => {
const [ accessToken ] = useState(getAccessToken());
const [ validatingToken, setValidatingToken ] = useState(null);
const [ loggedIn, setLoggedIn ] = useState(false);
useEffect(() => {
if (validatingToken === null) {
setValidatingToken(!!accessToken);
if (accessToken) {
validateToken(accessToken).then(valid => {
setLoggedIn(valid);
setValidatingToken(false);
});
}
}
});
if (validatingToken !== false) return <Fragment />;
return loggedIn ? <Portal /> : <Landing onLoggedIn={() => setLoggedIn(true)} />;
};
export default App;
================================================
FILE: MicrofrontendTemplate/Portal/client/components/Landing.js
================================================
import { Main, Header, Alert, Panel, Section, withTheme } from 'dotnetify-elements';
import { CompanyLogo } from './App';
import Login from './Login';
const imagePanelCss = `
position: relative;
margin-bottom: 6rem;
img { width: 100vw; height: 400px; }
a {
position: relative;
color: #fff;
font-size: 8pt;
float: right;
margin-top: -1rem;
padding-right: .5rem;
}
`;
const Landing = ({ onLoggedIn }) => (
<Main>
<Header>
<CompanyLogo href="https://dotnetify.net" />
</Header>
<Section>
{/*
Why using Panel instead pf div? Think of Panels as super-divs: flex by default, automatically
add gaps between child elements, support scss-like syntax for nesting styles, and support many
shorthands to make manipulating layout easier!
*/}
<Panel>
<Panel css={imagePanelCss}>
<div>
<img src="/landing.jpg" />
<a href="https://www.freepik.com/free-photos-vectors/background">Background photo created by kjpargeter - www.freepik.com </a>
</div>
<Panel horizontal css="position: absolute; top: 2rem">
<Panel right css="padding: 0 5%">
<Login onAuthenticated={onLoggedIn} />
</Panel>
<Panel css="padding-right: 10%">
<h3>Welcome to your homepage!</h3>
<Alert success>
<h5>Getting Started</h5>
To sign in, enter username <b>guest</b> with password <b>dotnetify</b>.
</Alert>
<Alert>
<h5>Micro-Frontend Demo</h5>
This is an SPA that's dynamically composed of smaller, independently deployable apps written in <i>React</i> and <i>Vue</i>;
each communicates with a cross-platform <i>.NET Core (C#)</i> back-end, using <i>SignalR</i> to facilitate real-time update.
</Alert>
</Panel>
</Panel>
</Panel>
<Panel horizontal>
<Panel right flex="20%">
<h4>About</h4>
</Panel>
<Panel flex="80%" css="padding-right: 10%; > * { padding: 2rem; border-left: 4px solid orange }">
<div>
<p>
<i>DotNetify</i> glues all these together with simple, lightweight, yet powerful abstractions that make developing complex
web applications a breeze! For documentation, visit{' '}
<b>
<a href="https://dotnetify.net">https://dotnetify.net</a>
</b>
</p>
<p>
Like this project? Leave a star on{' '}
<b>
<a href="https://github.com/dsuryd/dotNetify">the project's Github page</a>
</b>
. Use the issues forum to ask questions, report bugs, or suggest new features.
</p>
</div>
</Panel>
</Panel>
</Panel>
</Section>
</Main>
);
export default withTheme(Landing);
================================================
FILE: MicrofrontendTemplate/Portal/client/components/Login.js
================================================
import { useState } from 'react';
import { signIn } from '../auth';
import { Alert, Button, Form, Panel, PasswordField, TextField, VMContext, withTheme } from 'dotnetify-elements';
const outerPanelCss = `
width: 25rem;
padding: 3rem;
background-color: #f5f5f5;
border-radius: 5px;
box-shadow: 0 20px 40px -20px rgba(0,0,0,.5);
`;
const Login = ({ onAuthenticated }) => {
const [ loginError, setLoginError ] = useState();
const handleLogin = ({ User, Password }) => {
setLoginError(null);
signIn(User, Password)
.then(_ => {
onAuthenticated();
})
.catch(error => {
if (error.message == '401') setLoginError('Invalid username and/or password');
else setLoginError(`Unexpected error: ${error.message}`);
});
};
return (
<VMContext vm="LoginVM" options={{ appId: 'portal' }}>
<Panel css={outerPanelCss}>
<h3>Sign In To Get Started</h3>
<Form onSubmit={handleLogin}>
<Panel>
<TextField id="User" label="Username:" />
<PasswordField id="Password" label="Password:" />
<Alert danger>{loginError}</Alert>
<Button stretch submit enable={true} label="Sign In" css="margin-top: 1rem" />
</Panel>
</Form>
</Panel>
</VMContext>
);
};
window.LoginVM = {
onConnect() {
return {
User: 'guest',
User__validation: [
{
Type: 'Required',
Message: 'Username is required',
Category: 'Error'
}
],
Password: '',
Password__attr: { Placeholder: 'Type dotnetify' },
Password__validation: [
{
Type: 'Required',
Message: 'Password is required',
Category: 'Error'
}
]
};
}
};
export default withTheme(Login);
================================================
FILE: MicrofrontendTemplate/Portal/client/components/Portal.js
================================================
import {
Main,
Header,
Nav,
NavDrawerButton,
NavMenu,
NavMenuTarget,
Button,
Panel,
Section,
VMContext,
withTheme
} from 'dotnetify-elements';
import { CompanyLogo } from './App';
import { signOut } from '../auth';
const Portal = _ => (
<VMContext vm="PortalVM" options={{ appId: 'portal-app' }}>
<Main>
<Header>
<NavDrawerButton css="margin-left: .5rem" />
<CompanyLogo href="https://dotnetify.net" />
</Header>
<Nav>
<Panel>
<NavMenu id="NavMenu" />
<Panel flex bottom padding="1rem">
<Button stretch label="Logout" onClick={_ => signOut()} />
</Panel>
</Panel>
</Nav>
<Section>
<NavMenuTarget />
</Section>
</Main>
</VMContext>
);
window.PortalVM = new class {
apps = [];
initialState = { NavMenu: [] };
onConnect() {
return this.initialState;
}
addApp(newApp) {
if (this.apps.find(x => x.id === newApp.id)) return;
this.apps.push(newApp);
// Set the root component to global window variable to be discovered by dotNetify routing.
// Note that the component can be React component, Vue component, or web component.
window[newApp.id] = newApp.rootComponent;
const homeTemplate = this.apps.length > 0 ? { Id: 'Home', UrlPattern: '', ViewUrl: this.apps[0].id } : {};
const templates = this.apps.map(app => ({ Id: app.id, UrlPattern: app.routePath, ViewUrl: app.id }));
const NavMenu = this.apps.map(app => ({ Route: { TemplateId: app.id, Path: app.routePath }, Label: app.label }));
const state = {
RoutingState: {
Templates: [ homeTemplate, ...templates ],
Root: '/'
},
NavMenu
};
if (this.$pushUpdate) this.$pushUpdate(state);
else this.initialState = state;
}
}();
export function updatePortal(app) {
window.PortalVM.addApp(app);
}
export default withTheme(Portal);
================================================
FILE: MicrofrontendTemplate/Portal/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import loader from './loader';
import App from './components/App';
let useApiGateway = process.env.NODE_ENV !== 'development';
loader(
[
{
id: 'react-dashboard-app',
label: 'React Dashboard',
routePath: 'dashboard',
baseUrl: useApiGateway ? 'http://localhost:8080/app1' : 'http://localhost:5060',
moduleUrl: '/dist/app.js'
},
{
id: 'react-form-app',
label: 'React Form',
routePath: 'form',
baseUrl: useApiGateway ? 'http://localhost:8080/app2' : 'http://localhost:5070',
moduleUrl: '/dist/app.js'
},
{
id: 'react-todo-app',
label: 'React Todo',
routePath: 'react-todo',
baseUrl: useApiGateway ? 'http://localhost:8080/app3' : 'http://localhost:5010',
moduleUrl: '/dist/app.js'
},
{
id: 'vue-todo-app',
label: 'Vue Todo',
routePath: 'vue-todo',
baseUrl: useApiGateway ? 'http://localhost:8080/app4' : 'http://localhost:5020',
moduleUrl: '/dist/app.js'
}
],
// External dependencies from script tags.
['dotnetify', 'dotNetifyElements', 'styled']
);
createWebComponent(App, 'my-portal');
================================================
FILE: MicrofrontendTemplate/Portal/client/loader.js
================================================
import dotnetify from 'dotnetify';
import { getAccessToken } from './auth';
import { updatePortal } from './components/Portal';
//dotnetify.debug = true;
export default (apps, externalDeps) => {
// Intercept initial view model connection to override which hub server it should connect with.
// ***IMPORTANT***: Each app module would need to set the 'appId' option on its VM connect.
// For example: dotnetify.react.connect("MyVM", { appId: 'my-app' })
dotnetify.connectHandler = vmConnectArgs => {
const appId = vmConnectArgs.options && vmConnectArgs.options.appId;
if (!appId) {
console.error(`'${vmConnectArgs.vmId}' needs 'appId' option to participate in the Portal.`);
return;
}
const app = apps.find(x => x.id === appId);
if (app) {
app.hub = app.hub || dotnetify.createHub(app.baseUrl);
return {
...vmConnectArgs,
hub: app.hub,
options: { ...vmConnectArgs.options, headers: { Authorization: 'Bearer ' + getAccessToken() } }
};
}
};
// Register the external dependencies from the script tags to SystemJS.
externalDeps.forEach(x => SystemJS.set(x, SystemJS.newModule({ ...window[x] })));
// Use SystemJS to import the app modules.
function importApp(app) {
const appUrl = app.baseUrl + app.moduleUrl;
return SystemJS.import(appUrl)
.then(module => {
if (module.default) updatePortal({ ...app, rootComponent: module.default });
})
.catch(err => {
SystemJS.delete(appUrl);
console.error(`${err}. Retrying in 5 seconds...`);
setTimeout(() => importApp(app), 5000);
});
}
apps.map(app => importApp(app));
};
================================================
FILE: MicrofrontendTemplate/Portal/package.json
================================================
{
"version": "1.0.0",
"name": "portal",
"private": true,
"scripts": {
"build": "webpack",
"prod": "webpack --mode production"
},
"babel": {
"presets": [
"env",
"react"
],
"plugins": [
"babel-plugin-styled-components",
"babel-plugin-transform-class-properties",
"babel-plugin-transform-object-rest-spread"
]
},
"dependencies": {
"dotnetify": "^4.0.0",
"dotnetify-elements": "^1.1.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"styled-components": "^4.3.2",
"systemjs": "~0.21.6"
},
"devDependencies": {
"aspnet-webpack": "~3.0.0",
"babel-core": "~6.26.3",
"babel-loader": "~7.1.4",
"babel-plugin-styled-components": "~1.5.1",
"babel-plugin-transform-class-properties": "~6.24.1",
"babel-plugin-transform-object-rest-spread": "~6.26.0",
"babel-preset-env": "~1.7.0",
"babel-preset-react": "~6.24.1",
"copy-webpack-plugin": "^5.0.4",
"css-loader": "~0.28.11",
"file-loader": "~1.1.11",
"style-loader": "~0.21.0",
"url-loader": "~1.0.1",
"webpack": "~4.12.0",
"webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "~3.0.8",
"webpack-dev-middleware": "~3.1.3",
"webpack-hot-middleware": "~2.22.2"
}
}
================================================
FILE: MicrofrontendTemplate/Portal/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit
:prod
call npm run prod
dotnet run --launch-profile prod
================================================
FILE: MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs
================================================
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Shared;
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace Portal
{
[Route("api/[controller]")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IdentityServerSettings _identityServerSettings;
public LoginController(IHttpClientFactory httpClientFactory, IOptions<IdentityServerSettings> identityServerOptions)
{
_httpClientFactory = httpClientFactory;
_identityServerSettings = identityServerOptions.Value;
}
[HttpPost]
public async Task<object> Post([FromForm] string username, [FromForm] string password)
{
if (username != "guest" || password != "dotnetify")
return Unauthorized();
using (var client = _httpClientFactory.CreateClient())
{
var tokenResponse = await IdentityServerClient.RequestClientCredentialsTokenAsync(client, _identityServerSettings);
return new
{
access_token = tokenResponse.AccessToken,
expires_in = tokenResponse.ExpiresIn
};
}
}
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> Validate([FromForm]string token)
{
using (var client = _httpClientFactory.CreateClient())
{
var response = await IdentityServerClient.IntrospectTokenAsync(client, _identityServerSettings, token);
if (response.IsError)
throw new Exception(response.Error);
return response.IsActive ? new OkResult() : (IActionResult)Unauthorized();
}
}
}
}
================================================
FILE: MicrofrontendTemplate/Portal/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
namespace Portal
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((_, config) => config.AddJsonFile("appsettings.json"))
.UseStartup<Startup>()
.Build();
}
}
================================================
FILE: MicrofrontendTemplate/Portal/server/Startup.cs
================================================
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Shared;
using System.Collections.Generic;
using System.IO;
namespace Portal
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName);
var identityServerUri = identityServerSettings.GetValue<string>(nameof(IdentityServerSettings.Uri));
services.AddOptions();
services.Configure<IdentityServerSettings>(identityServerSettings);
services.AddControllers();
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(IdentityServerConfig.GetApiResources())
.AddInMemoryClients(IdentityServerConfig.GetClients());
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = identityServerUri;
options.RequireHttpsMetadata = false;
options.ApiName = IdentityServerConfig.MyClientId;
});
services.AddAuthorization();
services.AddHttpClient();
services.AddResponseCompression();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
#pragma warning disable 618
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
});
#pragma warning restore 618
}
app.UseIdentityServer();
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapControllers());
app.UseResponseCompression();
app.UseFileServer();
app.Run(async (context) =>
{
using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
await context.Response.WriteAsync(reader.ReadToEnd());
});
}
}
}
================================================
FILE: MicrofrontendTemplate/Portal/tempkey.rsa
================================================
{"KeyId":"0ba2028548bfe91576a5940388a7cdbb","Parameters":{"D":"UkWCmbhxnXgJc4SiqAk+6xS0V48iNAt7n/TBICboACMdc+ocGvcR5mqBnRVbRg6S8W+an8JpccDYZtf734TPjV2eRtH2udHlsSeOGlGaa/Mbs1uohglSqwC4i6YMIZQL2E0hRcRpR/YFAK2pYhf3NBI7LQojbmg7ghcsybjK1KFrNTFgI28bkk3f87sf1oJX91Le13tVXpf0mdwP7eEj+cJ+8YK/mV42KEeAHbuQpr920nWy5vi1fO+tqDJvoeq4hyyW21FXlwjxhC0rVI/lcED3dgzok5qXMJniqzyiw7X1noLwtc08QvpqOtoNOaDQALOV2mBWgJmBcloHTHqEUQ==","DP":"W1kMQ859BP9u5Ngu3uz3shu+vVAXIUsjviMe3Pfnj9HlDzZ2zaUEpaQAbvzbaOvwn1vwXwKFvyO7cTpykwi0gYTj9RSYdmRj36CQWQfc9bkiWpOYTPSt5pNusATMDVgQWrmE63MMZg2dpVd5kxWRYebMoQO0lW+YRvACibLPap0=","DQ":"bte4YhkaV6cJdi4UlQBsDreW55EvrwTd982iuxYZ00sleZoSoIgjE7Wesnt1x8gwzWycmJ469ExsblZ4sXSFgB+/51nXi6axTjTbo4mJDgePypMf84fzBGsQmf7b+yMhB1gHdzfpngZ9JCbTv9LZGTuM1mKSY6vGKvpLrzbjvcs=","Exponent":"AQAB","InverseQ":"fZl7/xHyDdh9PH/paje6da8nOXvV7EY4oeI4mjoX/fSq/Eu2/3GNOPBUpHqGHszNNxjDL3hv/E+wep/HI3m6XwingH7AS9DUPRDnBsjVUG+kSuOSCruWzfVLIzMK5xhE+pMVsLn9dBL/pgm5rLBOaq/TSz8KS0gF3K9ONUXmYz4=","Modulus":"uTw8FFxFAOTeA0o/XSdtRRbBhhlYOPhc+Vq8rLsVxIEEP4ev1fQU8dyKHEZuokNpksFhnfbdLIWhS2SH/7l+ERKATYmQlcyQQxkTin+aGWC0dNwvt9QIMxw1uNriRSoEQn9c7yD0ZONfXBZ2aVa6fGgfy7MsJ6TnAgdgt0NWjb8S/s7ehGNE+2PixKZsp7KqX0wIRTzh2hy0qafzY2o3yT5NMajxXJSCEUTZtmgfZxOKVAtIK1YsYGCzimVoCyPemUSY43etvjv9MsHQ3X/WnsHkQ8wYyzyU24O7aj/HHalekKoPM4Ckd9vVy6ebjflkye8A8UGn8BcwXwF62HDMuQ==","P":"y09WRKLTgBCWRHcIvQDo2U6v3ndaewVP8VCZ2QGEcK9zPQJvNos58RZByVgXAIiKyHNzz4xO9HMy7+XhwhfjBDzEAxCnS9XfLAwIOIv9IJ7JI5wUhbhsCoOIMYz2k7o4ZTaK1RHAZ7fWksMvghrrmXu8ZQ+BorvNfkFJVstFyhs=","Q":"6T27LxHMkV33tUvdeFXSTuv/oaO4bN16PUx0fo5a1pbegt55XAIqsQHJeM4VnIJvBwXgj9VrOrDxBZrf0dDTxonosr3hazoUV7zPwybPR1wMzqpILHNspEcoSwY0o257MxPCJj+95bbrtgXvCkE41t27pSbktGOaoBsD3g7FMbs="}}
================================================
FILE: MicrofrontendTemplate/Portal/webpack.config.js
================================================
'use strict';
const path = require('path');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
mode: 'development',
entry: {
app: './client/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/wwwroot/dist',
publicPath: '/dist/',
libraryTarget: 'umd'
},
resolve: {
modules: [ 'client', 'node_modules' ],
extensions: [ '.js', '.jsx' ]
},
module: {
rules: [
{ test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
{ test: /\.css$/, use: [ 'css-loader?minimize' ] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
]
},
externals: {
dotnetify: 'dotnetify',
'dotnetify-elements': 'dotNetifyElements',
react: 'React',
'react-dom': 'ReactDOM',
'styled-components': 'styled'
},
devtool: 'source-map',
plugins: [
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
new CopyPlugin([
{ from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
{ from: 'node_modules/dotnetify/dist/dotnetify-vue.min.js' },
{ from: 'node_modules/dotnetify-elements/lib', to: 'lib/' },
{ from: 'node_modules/dotnetify-elements/web-components', to: 'web-components/' },
{ from: 'node_modules/styled-components/dist/styled-components.min.js' },
{ from: 'node_modules/systemjs/dist/system.js' }
])
]
};
================================================
FILE: MicrofrontendTemplate/Portal/wwwroot/404.html
================================================
<h2>Page not found (404)</h2>
<p>Redirecting to home page...</p>
<script>setTimeout(function() {(window.location.href = '/')}, 2000)</script></p>
================================================
FILE: MicrofrontendTemplate/Portal/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>DotNetify Micro-Frontend Demo</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<style>
body { height: 100vh }
</style>
</head>
<body>
<my-portal />
<!-- Polyfills for IE 11 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.2.10/webcomponents-bundle.js"></script>
<script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>
<script src="/dist/styled-components.min.js"></script>
<script src="/dist/dotnetify-react.min.js"></script>
<script src="/dist/system.js"></script>
<script src="/dist/lib/basic-web-components.bundle.js"></script>
<script src="/dist/web-components/chart.js"></script>
<script src="/dist/web-components/datagrid.js"></script>
<script src="/dist/app.js"></script>
</body>
</html>
================================================
FILE: MicrofrontendTemplate/README.md
================================================
<p align="center"><img width="300px" src="https://dotnetify.net/content/images/dotnetify-logo.png"></p>
## DotNetify - Micro-Frontend Demo
### How to Run
If on Windows, type `run` from the command prompt to start the portal and the nginx API gateway. Wait until the portal app started, then type `run apps` to start all the apps. Alternatively, you can start them one at a time by going to an app's folder and type `run prod`. Open the website at http://localhost:8080.
If not on Windows, you can't use the Windows-based nginx from this repo. Either install one for your system and copy the configuration `conf/nginx.conf`, or just run the portal and the apps in development mode below.
### Running In Dev Mode
Go the the Portal folder and type `npm i` followed by `dotnet run`. Then go to each app's folder and do the same thing. They will start in development mode. Open the website at http://localhost:5000.
In development mode, authentication is disabled so you can run the app as stand-alone, and hot module reload is also enabled. The app's port is specified in `Properties/launchsettings.json`.
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/Properties/launchSettings.json
================================================
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5060/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"dev": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5060/"
},
"prod": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:5060/"
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/README.md
================================================
## How to run:
Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/ReactDashboardApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>ReactDashboardApp</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
<Folder Include="wwwroot\dist\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNetify.Elements" Version="1.3.0" />
<PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" />
<PackageReference Include="System.Reactive" Version="3.1.1" />
<PackageReference Include="Bogus" Version="22.1.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
<!-- In development, the dist files won't exist on the first run or when cloning to
a different machine, so rebuild them if not already present. -->
<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
<!-- Build JS resources -->
<Message Importance="high" Text="Performing first-run Webpack build..." />
<Exec Command="npm install" />
<Exec Command="npm run build" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec Command="npm install" />
<Exec Command="npm run prod" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://localhost:5000"
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js
================================================
import React from 'react';
import styled from 'styled-components';
import { Card, Cell, Element, Panel } from 'dotnetify-elements';
const panelCss = `
overflow-x: hidden;
.cell { border: none; }
.cell-body { padding: .5rem 0 }
`;
const statusColors = [ '', 'silver', 'limegreen', 'red', 'gray', 'orange' ];
const userIconColors = [ '#00ce6f', '#a95df0', '#2ea7eb' ];
const UserIcon = styled.span`
width: 25px;
height: 25px;
border-radius: 50%;
color: white;
background: ${props => props.color};
font-weight: bold;
margin-right: 1rem;
text-align: center;
`;
const StatusIcon = styled.span`
height: 14px;
width: 14px;
margin-left: 1rem;
background-color: ${props => statusColors[props.status]};
border-radius: 50%;
display: inline-block;
`;
const Activity = ({ person }) => {
const initial = person.PersonName[0].toUpperCase();
const iconColor = userIconColors[initial.charCodeAt(0) % 3];
return (
<Panel horizontal css={panelCss}>
<Cell flex>
<UserIcon color={iconColor}>{initial}</UserIcon>
{person.PersonName}
</Cell>
<Cell flex right middle>
{person.Status}
<StatusIcon status={person.StatusId} />
</Cell>
</Panel>
);
};
export default class ActivitiesCard extends Element {
render() {
const activities = this.value || [];
return (
<Card horizontal>
<h4>Activities</h4>
{activities.map((person, idx) => <Activity key={idx} person={person} />)}
</Card>
);
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/Dashboard.js
================================================
import React from 'react';
import { Card, Frame, Panel, VMContext, withTheme } from 'dotnetify-elements';
import { BarChart, LineChart, PieChart } from 'dotnetify-elements';
import InfoCard from './InfoCard';
import ActivitiesCard from './ActivitiesCard';
const infoPanelCss = `
flex: 1 1 20%;
@media (max-width: 1280px) { flex: 1 1 40%; }
@media (max-width: 880px) { flex: 1 1 100%; }
`;
/* You can access the 'vm' object from VMContext by handling the 'onConnected' event. */
const handleConnected = (vm, initialState) => console.log(vm, initialState);
const Dashboard = _ => (
<VMContext vm="Dashboard" options={{ appId: 'react-dashboard-app' }} onConnected={handleConnected}>
<Frame css="max-width: calc(100% - 3rem)">
<Panel horizontal wrap childProps={{ css: infoPanelCss }}>
<Panel>
<InfoCard id="Download" color="#1c8adb" />
</Panel>
<Panel>
<InfoCard id="Upload" color="#5cb85c" />
</Panel>
<Panel>
<InfoCard id="Latency" color="#f0ad4e" />
</Panel>
<Panel>
<InfoCard id="Users" color="#d9534f" />
</Panel>
</Panel>
<Panel>
<Card>
<Panel horizontal>
<Panel flex="70%">
<h4>Network Traffic</h4>
<LineChart id="Traffic" height="75px" />
</Panel>
<Panel flex="30%">
<h4>Utilization</h4>
<PieChart id="Utilization" />
</Panel>
</Panel>
</Card>
<Panel horizontal>
<Panel flex="40%">
<ActivitiesCard flex id="RecentActivities" />
</Panel>
<Panel flex="60%">
<Card flex>
<h4>Server Usage</h4>
<BarChart id="ServerUsage" height="70px" />
</Card>
</Panel>
</Panel>
</Panel>
</Frame>
</VMContext>
);
export default withTheme(Dashboard);
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js
================================================
import React from 'react';
import styled from 'styled-components';
import { Card, CardImage, Element } from 'dotnetify-elements';
const InfoIcon = styled.i.attrs(props => ({
className: 'material-icons'
}))`
font-size: 3rem;
padding: 1.5rem;
color: white;
background: ${props => props.color};
opacity: .8;
`;
const cardCss = `
.card-body { padding: .5rem 1.5rem }
h3 { font: 600 2rem Helvetica; }
@media (max-width: 1550px) and (min-width: 1280px) {
h3 { font-size: 1.25rem }
}
`;
export default class InfoCard extends Element {
render() {
const { color, icon, label } = this.attrs;
return (
<Card horizontal css={cardCss}>
<CardImage>
<InfoIcon color={color}>{icon}</InfoIcon>
</CardImage>
<label>{label}</label>
<h3>{this.value}</h3>
</Card>
);
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import Dashboard from './components/Dashboard';
const elementName = 'react-dashboard-app';
createWebComponent(Dashboard, elementName);
export default document.createElement(elementName);
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/package.json
================================================
{
"version": "1.0.0",
"name": "react-dashboard-app",
"private": true,
"scripts": {
"build": "webpack",
"prod": "webpack --mode production"
},
"babel": {
"presets": [
"env",
"react"
],
"plugins": [
"babel-plugin-styled-components",
"babel-plugin-transform-class-properties",
"babel-plugin-transform-object-rest-spread"
]
},
"dependencies": {
"dotnetify": "^4.0.0",
"dotnetify-elements": "^1.1.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"styled-components": "^4.3.2"
},
"devDependencies": {
"aspnet-webpack": "~3.0.0",
"babel-core": "~6.26.3",
"babel-loader": "~7.1.4",
"babel-plugin-styled-components": "~1.5.1",
"babel-plugin-transform-class-properties": "~6.24.1",
"babel-plugin-transform-object-rest-spread": "~6.26.0",
"babel-preset-env": "~1.7.0",
"babel-preset-react": "~6.24.1",
"copy-webpack-plugin": "^5.0.4",
"css-loader": "~0.28.11",
"file-loader": "~1.1.11",
"style-loader": "~0.21.0",
"url-loader": "~1.0.1",
"webpack": "~4.12.0",
"webpack-bundle-analyzer": "^3.4.1",
"webpack-cli": "~3.0.8",
"webpack-dev-middleware": "~3.1.3",
"webpack-hot-middleware": "~2.22.2"
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit
:prod
call npm run prod
dotnet run --launch-profile prod
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace ReactDashboardApp
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using Bogus;
namespace ReactDashboardApp
{
public interface ILiveDataService
{
IObservable<string> Download { get; }
IObservable<string> Upload { get; }
IObservable<string> Latency { get; }
IObservable<int> Users { get; }
IObservable<int[]> Traffic { get; }
IObservable<int[]> ServerUsage { get; }
IObservable<int[]> Utilization { get; }
IObservable<Activity> RecentActivity { get; }
}
public class Activity
{
private static readonly Dictionary<int, string> _activities = new Dictionary<int, string> {
{1, "Offline"},
{2, "Active"},
{3, "Busy"},
{4, "Away"},
{5, "In a Call"}
};
public int Id { get; set; }
public string PersonName { get; set; }
public int StatusId { get; set; }
public string Status => _activities[StatusId];
}
public class Customer
{
public int Id { get; set;}
public string Name { get; set; }
}
public class MockLiveDataService : ILiveDataService
{
private readonly Random _random = new Random();
public IObservable<string> Download { get; }
public IObservable<string> Upload { get; }
public IObservable<string> Latency { get; }
public IObservable<int> Users { get; }
public IObservable<int[]> Traffic { get; }
public IObservable<int[]> ServerUsage { get; }
public IObservable<int[]> Utilization { get; }
public IObservable<Activity> RecentActivity { get; }
public MockLiveDataService()
{
Download = Observable
.Interval(TimeSpan.FromMilliseconds(900))
.StartWith(0)
.Select(_ => $"{Math.Round(_random.Next(15, 30) + _random.NextDouble(), 1)} Mb/s");
Upload = Observable
.Interval(TimeSpan.FromMilliseconds(800))
.StartWith(0)
.Select(_ => $"{Math.Round(_random.Next(5, 7) + _random.NextDouble(), 1)} Mb/s");
Latency = Observable
.Interval(TimeSpan.FromSeconds(1))
.StartWith(0)
.Select(_ => $"{_random.Next(50, 200)} ms");
Users = Observable
.Interval(TimeSpan.FromMilliseconds(1200))
.StartWith(0)
.Select(_ => _random.Next(200, 300));
Traffic = Observable
.Interval(TimeSpan.FromMilliseconds(600))
.StartWith(0)
.Select(_ => Enumerable.Range(1, 7).Select(i => _random.Next(1000, 10000)).ToArray());
ServerUsage = Observable
.Interval(TimeSpan.FromMilliseconds(400))
.StartWith(0)
.Select(_ => Enumerable.Range(1, 10).Select(i => _random.Next(1, 100)).ToArray());
Utilization = Observable
.Interval(TimeSpan.FromMilliseconds(800))
.StartWith(0)
.Select(_ => Enumerable.Range(1, 3).Select(i => _random.Next(1, 100)).ToArray());
RecentActivity = Observable
.Interval(TimeSpan.FromSeconds(2))
.StartWith(0)
.Select(_ => GetRandomCustomer())
.Select(customer => new Activity
{
Id = customer.Id,
PersonName = customer.Name,
StatusId = _random.Next(1, 6)
})
.StartWith(
Enumerable.Range(1, 4)
.Select(_ => GetRandomCustomer())
.Select(customer => new Activity
{
Id = customer.Id,
PersonName = customer.Name,
StatusId = _random.Next(1, 6)
})
.ToArray()
);
}
private Customer GetRandomCustomer()
{
return new Faker<Customer>()
.CustomInstantiator(f => new Customer { Id = f.Random.Number(0, 100) })
.RuleFor(o => o.Name, f => f.Person.FullName)
.Generate();
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Shared;
namespace ReactDashboardApp
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMemoryCache();
services.AddSignalR();
services.AddDotNetify();
services.AddResponseCompression();
services.AddHttpClient();
services.AddTransient<ILiveDataService, MockLiveDataService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors(builder => builder
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed(_ => true)
.AllowCredentials());
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapHub<DotNetifyHub>("/dotnetify"));
app.UseDotNetify(config =>
{
if (env.IsProduction())
{
IEnumerable<SecurityKey> keys;
var httpClientFactory = app.ApplicationServices.GetRequiredService<IHttpClientFactory>();
using (var client = httpClientFactory.CreateClient())
{
var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
}
// Middleware to do authenticate token in incoming request headers.
config.UseJwtBearerAuthentication(new TokenValidationParameters
{
IssuerSigningKeys = keys,
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(0)
});
// Filter to check whether user has permission to access view models with [Authorize] attribute.
config.UseFilter<AuthorizeFilter>();
}
else
config.UseDeveloperLogging();
});
if (env.IsDevelopment())
{
#pragma warning disable 618
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
});
#pragma warning restore
}
app.UseResponseCompression();
app.UseFileServer();
app.Run(async (context) =>
{
using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
await context.Response.WriteAsync(reader.ReadToEnd());
});
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Routing;
using DotNetify.Security;
namespace ReactDashboardApp
{
[Authorize]
public class Dashboard : BaseVM, IRoutable
{
private IDisposable _subscription;
public RoutingState RoutingState { get; set; } = new RoutingState();
public Dashboard(ILiveDataService liveDataService)
{
AddProperty<string>("Download")
.WithAttribute(new { Label = "Download", Icon = "cloud_download" })
.SubscribeTo(liveDataService.Download);
AddProperty<string>("Upload")
.WithAttribute(new { Label = "Upload", Icon = "cloud_upload" })
.SubscribeTo(liveDataService.Upload);
AddProperty<string>("Latency")
.WithAttribute(new { Label = "Latency", Icon = "network_check" })
.SubscribeTo(liveDataService.Latency);
AddProperty<int>("Users")
.WithAttribute(new { Label = "Users", Icon = "face" })
.SubscribeTo(liveDataService.Users);
AddProperty<int[]>("Traffic").SubscribeTo(liveDataService.Traffic);
AddProperty<int[]>("Utilization")
.WithAttribute(new ChartAttribute { Labels = new string[] { "Memory", "Disk", "Network" } })
.SubscribeTo(liveDataService.Utilization);
AddProperty<int[]>("ServerUsage").SubscribeTo(liveDataService.ServerUsage)
.WithAttribute(new ChartAttribute { Labels = new string[] { "dns", "sql", "nethst", "w2k", "ubnt", "uat", "ftp", "smtp", "exch", "demo" } });
AddProperty<Activity[]>("RecentActivities")
.SubscribeTo(liveDataService.RecentActivity.Select(value =>
{
var activities = new Queue<Activity>(Get<Activity[]>("RecentActivities")?.Reverse() ?? new Activity[] { });
activities.Enqueue(value);
if (activities.Count > 4)
activities.Dequeue();
return activities.Reverse().ToArray();
}));
// Regulate data update interval to no less than every 200 msecs.
_subscription = Observable
.Interval(TimeSpan.FromMilliseconds(200))
.StartWith(0)
.Subscribe(_ => PushUpdates());
}
public override void Dispose()
{
_subscription?.Dispose();
base.Dispose();
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/webpack.config.js
================================================
'use strict';
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
mode: 'development',
entry: {
app: './client/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/wwwroot/dist',
publicPath: '/dist/',
libraryTarget: 'umd'
},
resolve: {
modules: [ 'client', 'node_modules' ],
extensions: [ '.js', '.jsx' ]
},
module: {
rules: [
{ test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
{ test: /\.css$/, use: [ 'css-loader?minimize' ] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
]
},
externals: {
dotnetify: 'dotnetify',
'dotnetify-elements': 'dotNetifyElements',
'styled-components': 'styled'
},
devtool: 'source-map',
plugins: [
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
new CopyPlugin([
{ from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
{ from: 'node_modules/dotnetify-elements/lib/dotnetify-elements.bundle.js' },
{ from: 'node_modules/styled-components/dist/styled-components.min.js' }
])
]
};
================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>React Dashboard App</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<react-dashboard-app />
<script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>
<script src="/dist/styled-components.min.js"></script>
<script src="/dist/dotnetify-react.min.js"></script>
<script src="/dist/dotnetify-elements.bundle.js"></script>
<script src="/dist/app.js"></script>
</body>
</html>
================================================
FILE: MicrofrontendTemplate/ReactFormApp/Properties/launchSettings.json
================================================
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5070/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"dev": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5070/"
},
"prod": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:5070/"
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/README.md
================================================
## How to run:
Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.
================================================
FILE: MicrofrontendTemplate/ReactFormApp/ReactFormApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>ReactFormApp</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
<Folder Include="wwwroot\dist\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNetify.Elements" Version="1.3.0" />
<PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" />
<PackageReference Include="System.Reactive" Version="3.1.1" />
<PackageReference Include="Bogus" Version="22.1.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
<!-- In development, the dist files won't exist on the first run or when cloning to
a different machine, so rebuild them if not already present. -->
<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
<!-- Build JS resources -->
<Message Importance="high" Text="Performing first-run Webpack build..." />
<Exec Command="npm install" />
<Exec Command="npm run build" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec Command="npm install" />
<Exec Command="npm run prod" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>
================================================
FILE: MicrofrontendTemplate/ReactFormApp/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://localhost:5000"
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/AddressForm.js
================================================
import React from 'react';
import { Cell, DropdownList, Form, NumberField, Panel, TextField, VMContext } from 'dotnetify-elements';
const AddressForm = () => (
<Panel>
<Cell header="Primary Address">
<VMContext vm="AddressForm" options={{ appId: 'react-form-app' }}>
<Form id="Address">
<Panel flex childProps={{ horizontal: true }}>
<TextField id="Address1" />
<TextField id="Address2" />
<TextField id="City" />
<DropdownList id="State" />
<NumberField id="ZipCode" />
</Panel>
</Form>
</VMContext>s
</Cell>
</Panel>
);
export default AddressForm;
================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/BasicInfoForm.js
================================================
import React from 'react';
import { Cell, DropdownList, Form, Panel, TextField, VMContext } from 'dotnetify-elements';
const BasicInfoForm = () => (
<Panel horizontal noGap>
<Panel horizontal>
<Cell header="Person" flex>
<VMContext vm="PersonForm" options={{ appId: 'react-form-app' }}>
<Form id="Person">
<Panel childProps={{ horizontal: true }}>
<TextField id="FullName" plainText />
<DropdownList id="Prefix" />
<TextField id="FirstName" />
<TextField id="MiddleName" />
<TextField id="LastName" />
<DropdownList id="Suffix" />
</Panel>
</Form>
</VMContext>
</Cell>
<Cell header="Phone" flex borders="top, right, bottom">
<VMContext vm="PhoneForm" options={{ appId: 'react-form-app' }}>
<Form id="Phone">
<Panel childProps={{ horizontal: true }}>
<TextField id="Work" />
<TextField id="Home" />
<TextField id="Mobile" />
<DropdownList id="Primary" />
</Panel>
</Form>
</VMContext>
</Cell>
</Panel>
</Panel>
);
export default BasicInfoForm;
================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/Form.js
================================================
import React from 'react';
import BasicInfoForm from './BasicInfoForm';
import AddressForm from './AddressForm';
import NewCustomerDialog from './NewCustomerDialog';
import { Button, DataGrid, Form, Frame, Panel, Tab, TabItem, VMContext, withTheme } from 'dotnetify-elements';
class CustomerForm extends React.Component {
state = { editable: false, edit: false, openDialog: false };
handleSelect = value => this.setState({ editable: value ? true : false });
toggleEdit = _ => this.setState({ edit: !this.state.edit });
toggleDialog = _ => this.setState({ openDialog: !this.state.openDialog });
render() {
const { editable, edit, openDialog } = this.state;
const canEdit = editable && !edit;
return (
<VMContext vm="CustomerForm" options={{ appId: 'react-form-app' }}>
<Frame css="max-width: calc(100% - 3rem)">
<DataGrid id="Contacts" onSelect={this.handleSelect} enable={!edit} />
<Form plainText={!edit}>
<Panel>
{/* Toolbar */}
<Panel horizontal>
<Panel horizontal>
<Button label="Edit" enable={canEdit} onClick={this.toggleEdit} />
<Button label="Update" id="Submit" submit show={edit} onClick={this.toggleEdit} />
<Button label="Cancel" cancel secondary show={edit} onClick={this.toggleEdit} />
</Panel>
<Panel horizontal right>
<Button label="New Customer" onClick={this.toggleDialog} enable={!edit} />
</Panel>
</Panel>
{/* Edit forms */}
<Tab margin="1.5rem 0 0 0">
<TabItem label="Basic Info">
<BasicInfoForm />
</TabItem>
<TabItem label="Address">
<AddressForm />
</TabItem>
</Tab>
</Panel>
</Form>
</Frame>
<NewCustomerDialog open={openDialog} onClose={this.toggleDialog} />
</VMContext>
);
}
}
export default withTheme(CustomerForm);
================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js
================================================
import React from 'react';
import { Button, DropdownList, Form, Modal, NumberField, Panel, Tab, TabItem, TextField, VMContext } from 'dotnetify-elements';
export default class NewCustomerDialog extends React.Component {
state = { activeTab: 'Person' };
handleClose = _ => this.props.onClose();
handleSubmitError = data => this.setState({ activeTab: data.failedForms[0].formId });
handleActivate = tab => this.setState({ activeTab: tab });
render() {
const { open } = this.props;
const { activeTab } = this.state;
return (
<VMContext vm="NewCustomerForm" options={{ appId: 'react-form-app' }}>
<Modal header="New Customer" open={open} large onSubmitError={this.handleSubmitError}>
<Tab active={activeTab} onActivate={this.handleActivate}>
<TabItem itemKey="Person" label="Person">
<VMContext vm="PersonForm" options={{ appId: 'react-form-app' }}>
<Form id="Person">
<Panel>
<DropdownList id="Prefix" />
<TextField id="FirstName" />
<TextField id="MiddleName" />
<TextField id="LastName" />
<DropdownList id="Suffix" />
</Panel>
</Form>
</VMContext>
</TabItem>
<TabItem itemKey="Phone" label="Phone">
<VMContext vm="PhoneForm" options={{ appId: 'react-form-app' }}>
<Form id="Phone">
<Panel>
<TextField id="Work" />
<TextField id="Home" />
<TextField id="Mobile" />
<DropdownList id="Primary" />
</Panel>
</Form>
</VMContext>
</TabItem>
<TabItem itemKey="Address" label="Address">
<VMContext vm="AddressForm" options={{ appId: 'react-form-app' }}>
<Form id="Address">
<Panel>
<TextField id="Address1" />
<TextField id="Address2" />
<TextField id="City" />
<DropdownList id="State" />
<NumberField id="ZipCode" />
</Panel>
</Form>
</VMContext>
</TabItem>
</Tab>
<footer>
<Panel horizontal right>
<Button label="Cancel" cancel secondary onClick={this.handleClose} />
<Button label="Submit" id="Submit" submit onClick={this.handleClose} />
</Panel>
</footer>
</Modal>
</VMContext>
);
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import Form from './components/Form';
const elementName = 'react-form-app';
createWebComponent(Form, elementName);
export default document.createElement(elementName);
================================================
FILE: MicrofrontendTemplate/ReactFormApp/package.json
================================================
{
"version": "1.0.0",
"name": "react-form-app",
"private": true,
"scripts": {
"build": "webpack",
"prod": "webpack --mode production"
},
"babel": {
"presets": [
"env",
"react"
],
"plugins": [
"babel-plugin-styled-components",
"babel-plugin-transform-class-properties",
"babel-plugin-transform-object-rest-spread"
]
},
"dependencies": {
"dotnetify": "^4.0.0",
"dotnetify-elements": "^1.1.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"styled-components": "^4.3.2"
},
"devDependencies": {
"aspnet-webpack": "~3.0.0",
"babel-core": "~6.26.3",
"babel-loader": "~7.1.4",
"babel-plugin-styled-components": "~1.5.1",
"babel-plugin-transform-class-properties": "~6.24.1",
"babel-plugin-transform-object-rest-spread": "~6.26.0",
"babel-preset-env": "~1.7.0",
"babel-preset-react": "~6.24.1",
"copy-webpack-plugin": "^5.0.4",
"css-loader": "~0.28.11",
"file-loader": "~1.1.11",
"style-loader": "~0.21.0",
"url-loader": "~1.0.1",
"webpack": "~4.12.0",
"webpack-bundle-analyzer": "^3.4.1",
"webpack-cli": "~3.0.8",
"webpack-dev-middleware": "~3.1.3",
"webpack-hot-middleware": "~2.22.2"
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit
:prod
call npm run prod
dotnet run --launch-profile prod
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace ReactFormApp
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs
================================================
using System;
using System.ComponentModel;
namespace ReactFormApp
{
#region Enums
public enum NamePrefix
{
[Description("")] None,
[Description("Mr.")] Mr,
[Description("Mrs.")] Mrs,
[Description("Ms.")] Ms
}
public enum NameSuffix
{
[Description("")] None,
[Description("Jr.")] Jr,
[Description("Sr.")] Sr,
[Description("II")] Second,
[Description("III")] Third,
[Description("IV")] Fourth
}
public enum PrimaryPhone
{
[Description("")] None,
[Description("Work")] Work,
[Description("Home")] Home,
[Description("Mobile")] Mobile
}
public enum State
{
[Description("")] Unknown,
[Description("Alabama")] AL, [Description("Alaska")] AK, [Description("Arkansas")] AR, [Description("Arizona")] AZ,
[Description("California")] CA, [Description("Colorado")] CO, [Description("Connecticut")] CT, [Description("D.C.")] DC,
[Description("Delaware")] DE, [Description("Florida")] FL, [Description("Georgia")] GA, [Description("Hawaii")] HI,
[Description("Iowa")] IA, [Description("Idaho")] ID, [Description("Illinois")] IL, [Description("Indiana")] IN,
[Description("Kansas")] KS, [Description("Kentucky")] KY, [Description("Louisiana")] LA, [Description("Massachusetts")] MA,
[Description("Maryland")] MD, [Description("Maine")] ME, [Description("Michigan")] MI, [Description("Minnesota")] MN,
[Description("Missouri")] MO, [Description("Mississippi")] MS, [Description("Montana")] MT, [Description("North Carolina")] NC,
[Description("North Dakota")] ND, [Description("Nebraska")] NE, [Description("New Hampshire")] NH, [Description("New Jersey")] NJ,
[Description("New Mexico")] NM, [Description("Nevada")] NV, [Description("New York")] NY, [Description("Oklahoma")] OK,
[Description("Ohio")] OH, [Description("Oregon")] OR, [Description("Pennsylvania")] PA, [Description("Rhode Island")] RI,
[Description("South Carolina")] SC, [Description("South Dakota")] SD, [Description("Tennessee")] TN, [Description("Texas")] TX,
[Description("Utah")] UT, [Description("Virginia")] VA, [Description("Vermont")] VT, [Description("Washington")] WA,
[Description("Wisconsin")] WI, [Description("West Virginia")] WV, [Description("Wyoming")] WY
}
#endregion Enums
public class Customer
{
public int Id { get; set; }
public NameInfo Name { get; set; }
public AddressInfo Address { get; set; }
public PhoneInfo Phone { get; set; }
}
public class NameInfo
{
public NamePrefix Prefix { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public NameSuffix Suffix { get; set; }
public string FullName => $"{FirstName} {LastName}";
}
public class AddressInfo
{
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public State State { get; set; }
public string ZipCode { get; set; }
public string StreetAddress => $"{Address1} {Address2}".TrimEnd();
}
public class PhoneInfo
{
public string Work { get; set; }
public string Home { get; set; }
public string Mobile { get; set; }
public PrimaryPhone Primary { get; set; }
public string PrimaryNumber => Primary == PrimaryPhone.Work ? Work : Primary == PrimaryPhone.Home ? Home : Mobile;
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs
================================================
using System.Collections.Generic;
namespace ReactFormApp
{
using StringDictionary = Dictionary<string, string>;
public class CustomerFormData
{
public StringDictionary Person { get; set; }
public StringDictionary Phone { get; set; }
public StringDictionary Address { get; set; }
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs
================================================
using Bogus;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading;
namespace ReactFormApp
{
using StringDictionary = Dictionary<string, string>;
public interface ICustomerRepository
{
IEnumerable<Customer> GetAll();
Customer Get(int id);
Customer Add(CustomerFormData formData);
Customer Update(int id, CustomerFormData formData);
}
public class CustomerRepository : ICustomerRepository
{
private IList<Customer> _mockData = GenerateMockData();
public IEnumerable<Customer> GetAll() => _mockData;
public Customer Get(int id) => _mockData.FirstOrDefault(x => x.Id == id);
public Customer Add(CustomerFormData formData)
{
var customer = new Customer
{
Id = _mockData.Max(x => x.Id) + 1,
Name = new NameInfo(),
Address = new AddressInfo(),
Phone = new PhoneInfo()
};
Update(customer.Name, formData.Person);
Update(customer.Address, formData.Address);
Update(customer.Phone, formData.Phone);
_mockData.Add(customer);
return customer;
}
public Customer Update(int id, CustomerFormData formData)
{
var customer = Get(id);
Update(customer.Name, formData.Person);
Update(customer.Address, formData.Address);
Update(customer.Phone, formData.Phone);
return customer;
}
private void Update(object record, StringDictionary newValues)
{
if (newValues != null)
foreach (var prop in record.GetType().GetProperties().Where(prop => newValues.ContainsKey(prop.Name)))
prop.SetValue(record, TypeDescriptor.GetConverter(prop.PropertyType).ConvertFromString(newValues[prop.Name]));
}
private static IList<Customer> GenerateMockData()
{
int id = 0;
return new Faker<Customer>()
.CustomInstantiator(f => new Customer { Id = ++id })
.RuleFor(o => o.Name, f => new NameInfo
{
FirstName = f.Person.FirstName,
LastName = f.Person.LastName,
})
.RuleFor(o => o.Address, f => new AddressInfo
{
Address1 = f.Address.StreetAddress(),
Address2 = f.Address.SecondaryAddress(),
City = f.Address.City(),
State = (State)Enum.Parse(typeof(State), f.Address.StateAbbr()),
ZipCode = f.Address.ZipCode("#####")
})
.RuleFor(o => o.Phone, f => new PhoneInfo
{
Work = f.Phone.PhoneNumber("(###) ###-####"),
Primary = f.PickRandomWithout(PrimaryPhone.None),
})
.Generate(100);
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Shared;
namespace ReactFormApp
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMemoryCache();
services.AddSignalR();
services.AddDotNetify();
services.AddResponseCompression();
services.AddHttpClient();
services.AddScoped<ICustomerRepository, CustomerRepository>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors(builder => builder
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed(_ => true)
.AllowCredentials());
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapHub<DotNetifyHub>("/dotnetify"));
app.UseDotNetify(config =>
{
if (env.IsProduction())
{
IEnumerable<SecurityKey> keys;
var httpClientFactory = app.ApplicationServices.GetRequiredService<IHttpClientFactory>();
using (var client = httpClientFactory.CreateClient())
{
var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
}
// Middleware to do authenticate token in incoming request headers.
config.UseJwtBearerAuthentication(new TokenValidationParameters
{
IssuerSigningKeys = keys,
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(0)
});
// Filter to check whether user has permission to access view models with [Authorize] attribute.
config.UseFilter<AuthorizeFilter>();
}
else
config.UseDeveloperLogging();
});
if (env.IsDevelopment())
{
#pragma warning disable 618
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
});
#pragma warning restore
}
app.UseResponseCompression();
app.UseFileServer();
app.Run(async (context) =>
{
using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
await context.Response.WriteAsync(reader.ReadToEnd());
});
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
namespace ReactFormApp
{
[Authorize]
public class AddressForm : BaseVM
{
public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();
public AddressForm()
{
AddProperty<string>(nameof(AddressInfo.Address1))
.WithAttribute(new TextFieldAttribute { Label = "Address 1:" })
.SubscribeTo(Customer.Select(x => x.Address.Address1));
AddProperty<string>(nameof(AddressInfo.Address2))
.WithAttribute(new TextFieldAttribute { Label = "Address 2:" })
.SubscribeTo(Customer.Select(x => x.Address.Address2));
AddProperty<string>(nameof(AddressInfo.City))
.WithAttribute(new TextFieldAttribute { Label = "City:" })
.SubscribeTo(Customer.Select(x => x.Address.City));
AddProperty<State>(nameof(AddressInfo.State))
.WithAttribute(new DropdownListAttribute
{
Label = "State:",
Options = typeof(State).ToDescriptions()
})
.SubscribeTo(Customer.Select(x => x.Address.State));
AddProperty<string>(nameof(AddressInfo.ZipCode))
.WithAttribute(new TextFieldAttribute { Label = "Zip Code:" })
.SubscribeTo(Customer.Select(x => x.Address.ZipCode));
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs
================================================
using System;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
namespace ReactFormApp
{
[Authorize]
public class CustomerForm : BaseVM
{
private readonly ICustomerRepository _customerRepository;
private readonly ReactiveProperty<int> _selectedContact;
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}
public CustomerForm(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
_selectedContact = AddProperty<int>("SelectedContact", 1);
AddProperty("Contacts", customerRepository.GetAll().Select(customer => ToContact(customer)))
.WithItemKey(nameof(Contact.Id))
.WithAttribute(new DataGridAttribute
{
RowKey = nameof(Contact.Id),
Columns = new DataGridColumn[] {
new DataGridColumn(nameof(Contact.Name), "Name") { Sortable = true },
new DataGridColumn(nameof(Contact.Phone), "Phone") { Sortable = true },
new DataGridColumn(nameof(Contact.Address), "Address") { Sortable = true },
new DataGridColumn(nameof(Contact.City), "City") { Sortable = true },
new DataGridColumn(nameof(Contact.ZipCode), "ZipCode") { Sortable = true }
},
Rows = 5
}.CanSelect(DataGridAttribute.Selection.Single, _selectedContact));
AddInternalProperty<CustomerFormData>("Submit")
.SubscribedBy(AddProperty<bool>("SubmitSuccess"), formData => Save(formData));
}
public override void OnSubVMCreated(BaseVM subVM)
{
// Have sub-forms with 'Customer' property subscribe to the customer data grid's selection changed event.
var customerPropInfo = subVM.GetType().GetProperty(nameof(Customer));
if (typeof(ReactiveProperty<Customer>).IsAssignableFrom(customerPropInfo?.PropertyType))
_selectedContact.SubscribedBy(
customerPropInfo.GetValue(subVM) as ReactiveProperty<Customer>,
id => _customerRepository.Get(id)
);
if (subVM is NewCustomerForm)
(subVM as NewCustomerForm).NewCustomer.Subscribe(customer => UpdateContact(customer));
}
private bool Save(CustomerFormData formData)
{
var id = (int)_selectedContact.Value;
var customer = _customerRepository.Update(id, formData);
this.UpdateList("Contacts", ToContact(customer));
_selectedContact.Value = id;
return true;
}
private Contact ToContact(Customer customer) => new Contact
{
Id = customer.Id,
Name = customer.Name.FullName,
Address = customer.Address.StreetAddress,
City = customer.Address.City,
ZipCode = customer.Address.ZipCode,
Phone = customer.Phone.PrimaryNumber
};
private void UpdateContact(Customer newCustomer)
{
this.AddList("Contacts", ToContact(newCustomer));
_selectedContact.OnNext(newCustomer.Id);
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs
================================================
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
using System.Linq;
using System.Reactive.Linq;
namespace ReactFormApp
{
[Authorize]
public class NewCustomerForm : BaseVM
{
private readonly ICustomerRepository _customerRepository;
public ReactiveProperty<Customer> NewCustomer { get; } = new ReactiveProperty<Customer>();
public NewCustomerForm(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
AddInternalProperty<CustomerFormData>("Submit")
.SubscribedBy(NewCustomer, formData => Save(formData));
}
public override void Dispose()
{
base.Dispose();
}
public Customer Save(CustomerFormData formData)
{
return _customerRepository.Add(formData);
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
namespace ReactFormApp
{
[Authorize]
public class PersonForm : BaseVM
{
public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();
public PersonForm()
{
AddProperty<string>(nameof(NameInfo.FullName))
.WithAttribute(new TextFieldAttribute { Label = "Name:" })
.SubscribeTo(Customer.Select(x => x.Name.FullName));
AddProperty<NamePrefix>(nameof(NameInfo.Prefix))
.WithAttribute(new DropdownListAttribute { Label = "Prefix:", Options = typeof(NamePrefix).ToDescriptions() })
.SubscribeTo(Customer.Select(x => x.Name.Prefix));
AddProperty<string>(nameof(NameInfo.FirstName))
.WithAttribute(new TextFieldAttribute { Label = "First Name:", MaxLength = 35 })
.WithRequiredValidation()
.SubscribeTo(Customer.Select(x => x.Name.FirstName));
AddProperty<string>(nameof(NameInfo.MiddleName))
.WithAttribute(new TextFieldAttribute { Label = "Middle Name:", MaxLength = 35 })
.SubscribeTo(Customer.Select(x => x.Name.MiddleName));
AddProperty<string>(nameof(NameInfo.LastName))
.WithAttribute(new TextFieldAttribute { Label = "Last Name:", MaxLength = 35 })
.WithRequiredValidation()
.SubscribeTo(Customer.Select(x => x.Name.LastName));
AddProperty<NameSuffix>(nameof(NameInfo.Suffix))
.WithAttribute(new DropdownListAttribute { Label = "Suffix:", Options = typeof(NameSuffix).ToDescriptions() })
.SubscribeTo(Customer.Select(x => x.Name.Suffix));
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
namespace ReactFormApp
{
[Authorize]
public class PhoneForm : BaseVM
{
public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();
public PhoneForm()
{
AddProperty<string>(nameof(PhoneInfo.Work))
.WithAttribute(new TextFieldAttribute { Label = "Work:", Mask = "(999) 999-9999" })
.WithPatternValidation(Pattern.USPhoneNumber)
.SubscribeTo(Customer.Select(x => x.Phone.Work));
AddProperty<string>(nameof(PhoneInfo.Home))
.WithAttribute(new TextFieldAttribute { Label = "Home:", Mask = "(999) 999-9999" })
.WithPatternValidation(Pattern.USPhoneNumber)
.SubscribeTo(Customer.Select(x => x.Phone.Home));
AddProperty<string>(nameof(PhoneInfo.Mobile))
.WithAttribute(new TextFieldAttribute { Label = "Mobile:", Mask = "(999) 999-9999" })
.WithPatternValidation(Pattern.USPhoneNumber)
.SubscribeTo(Customer.Select(x => x.Phone.Mobile));
AddProperty<PrimaryPhone>(nameof(PhoneInfo.Primary))
.WithAttribute(new DropdownListAttribute { Label = "Primary Phone:", Options = typeof(PrimaryPhone).ToDescriptions() })
.SubscribeTo(Customer.Select(x => x.Phone.Primary));
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactFormApp/webpack.config.js
================================================
'use strict';
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
mode: 'development',
entry: {
app: './client/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/wwwroot/dist',
publicPath: '/dist/',
libraryTarget: 'umd'
},
resolve: {
modules: [ 'client', 'node_modules' ],
extensions: [ '.js', '.jsx' ]
},
module: {
rules: [
{ test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
{ test: /\.css$/, use: [ 'css-loader?minimize' ] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
]
},
externals: {
dotnetify: 'dotnetify',
'dotnetify-elements': 'dotNetifyElements',
'styled-components': 'styled'
},
devtool: 'source-map',
plugins: [
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
new CopyPlugin([
{ from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
{ from: 'node_modules/dotnetify-elements/lib/dotnetify-elements.bundle.js' },
{ from: 'node_modules/styled-components/dist/styled-components.min.js' }
])
]
};
================================================
FILE: MicrofrontendTemplate/ReactFormApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>React Form App</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<react-form-app />
<script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>
<script src="/dist/styled-components.min.js"></script>
<script src="/dist/dotnetify-react.min.js"></script>
<script src="/dist/dotnetify-elements.bundle.js"></script>
<script src="/dist/app.js"></script>
</body>
</html>
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/Properties/launchSettings.json
================================================
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5010/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"dev": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5010/"
},
"prod": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:5010/"
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/README.md
================================================
## How to run:
Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/ReactTodoApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RootNamespace>ReactTodoApp</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
<Folder Include="wwwroot\dist\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNetify.Elements" Version="1.0.0" />
<PackageReference Include="DotNetify.SignalR" Version="3.4.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="System.Reactive" Version="3.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
<!-- In development, the dist files won't exist on the first run or when cloning to
a different machine, so rebuild them if not already present. -->
<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
<!-- Build JS resources -->
<Message Importance="high" Text="Performing first-run Webpack build..." />
<Exec Command="npm install" />
<Exec Command="npm run build" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec Command="npm install" />
<Exec Command="npm run prod" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://localhost:5000"
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js
================================================
import React from 'react';
import dotnetify from 'dotnetify';
import { Alert, Checkbox, Cell, Frame, Panel, TextField, withTheme } from 'dotnetify-elements';
class TodoList extends React.Component {
constructor() {
super();
this.vm = dotnetify.react.connect('TodoList', this, {
appId: 'react-todo-app',
exceptionHandler: ex => this.setState({ error: ex })
});
this.state = { Todos: [], newTodo: '', editTodoId: 0, editTodo: '', error: null };
}
componentDidMount() {
setTimeout(() => this.todoRef.focus());
}
componentWillUnmount() {
this.vm.$destroy();
}
render() {
const { Todos, ItemsLeft, newTodo, editTodoId, editTodo, error } = this.state;
// Control the new todo and existing todo input elements.
const typeTodo = value => this.setState({ newTodo: value });
const typeEditTodo = value => this.setState({ editTodo: value });
// Called when focus leaves or Enter keypress on the new todo input.
const addTodo = (value, { changed }) => {
if (changed) {
this.vm.$dispatch({ Add: value });
setTimeout(() => this.setState({ newTodo: '' }));
}
};
// Called after edit's done / checkbox clicked.
const updateTodo = todo => {
this.vm.$dispatch({ Update: todo });
};
// Called when existing todo is double-clicked.
const startEditTodo = id => {
const todo = this.state.Todos.find(x => x.Id === id);
this.setState({ editTodoId: id, editTodo: todo.Text });
setTimeout(() => {
this.editTodoRef.focus();
this.editTodoRef.select();
});
};
// Called when focus leaves or Enter keypress on the edited todo input.
const doneEditTodo = (todo, changed) => {
this.setState({ editTodoId: 0, editTodo: '' });
this.todoRef.focus();
if (changed) updateTodo(todo);
};
// Called when the remove icon is clicked.
const removeTodo = id => this.vm.$dispatch({ Remove: id });
if (error) return <h4>{error.message}</h4>;
return (
<Frame middle css="width: calc(100% - 3rem)">
<h2>
<img src="https://www.dotnetify.net/content/images/reactlogo.svg" width="35px" height="35px" />
<span>Multicast Todo List</span>
</h2>
<Panel css="width: 50%; padding-top: 1rem">
<TextField
value={newTodo}
placeholder="What do you want to do?"
onChange={typeTodo}
onDone={addTodo}
onInputRef={ref => (this.todoRef = ref)}
/>
<div>
{Todos.map(todo => (
<Cell key={todo.Id} css=".cell-body { padding: 0 }" tabIndex="0">
{todo.Id !== editTodoId ? (
<Panel horizontal apart middle padding=".5rem">
<Panel onDoubleClick={_ => startEditTodo(todo.Id)}>
<Checkbox
label={todo.Text}
value={todo.Done}
onChange={val => updateTodo({ ...todo, Done: val })}
/>
</Panel>
<i className="material-icons" style={{ cursor: 'pointer' }} onClick={_ => removeTodo(todo.Id)}>
cancel
</i>
</Panel>
) : (
<TextField
css="width: 100%"
value={editTodo}
onChange={typeEditTodo}
onDone={(value, { changed }) => doneEditTodo({ ...todo, Text: value }, changed)}
onInputRef={ref => (this.editTodoRef = ref)}
/>
)}
</Cell>
))}
</div>
<Alert success={ItemsLeft === 0} warning={ItemsLeft > 0}>
{ItemsLeft} item{ItemsLeft > 1 && 's'} left
</Alert>
</Panel>
</Frame>
);
}
}
export default withTheme(TodoList);
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import TodoList from './components/TodoList';
const elementName = 'react-todo-app';
createWebComponent(TodoList, elementName);
export default document.createElement(elementName);
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/package.json
================================================
{
"version": "1.0.0",
"name": "react-todo-app",
"private": true,
"scripts": {
"build": "webpack",
"prod": "webpack --mode production"
},
"babel": {
"presets": [
"env",
"react"
],
"plugins": [
"babel-plugin-styled-components",
"babel-plugin-transform-class-properties",
"babel-plugin-transform-object-rest-spread"
]
},
"dependencies": {
"dotnetify": "^4.0.0",
"dotnetify-elements": "^1.1.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"styled-components": "^4.3.2"
},
"devDependencies": {
"aspnet-webpack": "~3.0.0",
"babel-core": "~6.26.3",
"babel-loader": "~7.1.4",
"babel-plugin-styled-components": "~1.5.1",
"babel-plugin-transform-class-properties": "~6.24.1",
"babel-plugin-transform-object-rest-spread": "~6.26.0",
"babel-preset-env": "~1.7.0",
"babel-preset-react": "~6.24.1",
"copy-webpack-plugin": "^5.0.4",
"css-loader": "~0.28.11",
"file-loader": "~1.1.11",
"style-loader": "~0.21.0",
"url-loader": "~1.0.1",
"webpack": "~4.12.0",
"webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "~3.0.8",
"webpack-dev-middleware": "~3.1.3",
"webpack-hot-middleware": "~2.22.2"
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit
:prod
call npm run prod
dotnet run --launch-profile prod
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace ReactTodoApp
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/Startup.cs
================================================
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Shared;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
namespace ReactTodoApp
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMemoryCache();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(builder => builder
.AllowAnyMethod()
.AllowAnyHeader()
.AllowAnyOrigin()
.AllowCredentials());
app.UseWebSockets();
app.UseSignalR(routes => routes.MapDotNetifyHub());
app.UseDotNetify(config =>
{
if (env.IsProduction())
{
IEnumerable<SecurityKey> keys;
using (var client = HttpClientFactory.Create())
{
var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
}
// Middleware to do authenticate token in incoming request headers.
config.UseJwtBearerAuthentication(new TokenValidationParameters
{
IssuerSigningKeys = keys,
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(0)
});
// Filter to check whether user has permission to access view models with [Authorize] attribute.
config.UseFilter<AuthorizeFilter>();
}
else
config.UseDeveloperLogging();
});
if (env.IsDevelopment())
{
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
});
}
app.UseFileServer();
app.Run(async (context) =>
{
using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
await context.Response.WriteAsync(reader.ReadToEnd());
});
}
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Security;
namespace ReactTodoApp
{
[Authorize]
public class TodoList : MulticastVM
{
private static List<Todo> _todos = new List<Todo>();
public class Todo
{
public int Id { get; set; }
public string Text { get; set; }
public bool Done { get; set; }
}
public List<Todo> Todos => _todos;
public string Todos_itemKey => nameof(Todo.Id);
public int ItemsLeft => Todos.Count(x => !x.Done);
public Action<string> Add => text =>
{
var todo = new Todo { Id = text.GetHashCode(), Text = text };
if(!Todos.Any(x => x.Id == todo.Id))
{
Todos.Add(todo);
this.AddList(nameof(Todos), todo);
Changed(nameof(ItemsLeft));
}
};
public Action<Todo> Update => update =>
{
var todo = Todos.Find(x => x.Id == update.Id);
if(todo != null)
{
if(string.IsNullOrWhiteSpace(update.Text))
Remove(update.Id);
else
{
todo.Text = update.Text;
todo.Done = update.Done;
this.UpdateList(nameof(Todos), todo);
Changed(nameof(ItemsLeft));
}
}
};
public Action<int> Remove => id =>
{
var todo = Todos.Find(x => x.Id == id);
if(todo != null)
{
Todos.Remove(todo);
this.RemoveList(nameof(Todos), id);
Changed(nameof(ItemsLeft));
}
};
}
}
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/webpack.config.js
================================================
'use strict';
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
mode: 'development',
entry: {
app: './client/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/wwwroot/dist',
publicPath: '/dist/',
libraryTarget: 'umd'
},
resolve: {
modules: [ 'client', 'node_modules' ],
extensions: [ '.js', '.jsx' ]
},
module: {
rules: [
{ test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
{ test: /\.css$/, use: [ 'css-loader?minimize' ] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
]
},
externals: {
dotnetify: 'dotnetify',
'dotnetify-elements': 'dotNetifyElements',
'styled-components': 'styled'
},
devtool: 'source-map',
plugins: [
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
new CopyPlugin([
{ from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
{ from: 'node_modules/dotnetify-elements/lib/basic-elements.bundle.js' },
{ from: 'node_modules/styled-components/dist/styled-components.min.js' }
])
]
};
================================================
FILE: MicrofrontendTemplate/ReactTodoApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>ReactTodoApp</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body style="height: 100vh">
<react-todo-app />
<!-- Polyfills for IE 11 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.2.10/webcomponents-bundle.js"></script>
<script src="https://unpkg.com/react@latest/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>
<script src="/dist/styled-components.min.js"></script>
<script src="/dist/dotnetify-react.min.js"></script>
<script src="/dist/basic-elements.bundle.js"></script>
<script src="/dist/app.js"></script>
</body>
</html>
================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs
================================================
using IdentityModel;
using IdentityModel.Client;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace Shared
{
public class IdentityServerClient
{
public static async Task<TokenResponse> RequestClientCredentialsTokenAsync(HttpClient client, IdentityServerSettings settings)
{
var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
return await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = IdentityServerConfig.MyClientId,
ClientSecret = IdentityServerConfig.MyClientSecret,
Scope = IdentityServerConfig.MyApiResource
});
}
public static async Task<IntrospectionResponse> IntrospectTokenAsync(HttpClient client, IdentityServerSettings settings, string token)
{
var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
return await client.IntrospectTokenAsync(new TokenIntrospectionRequest
{
Address = disco.IntrospectionEndpoint,
Token = token,
ClientId = IdentityServerConfig.MyApiResource,
ClientSecret = IdentityServerConfig.MyClientSecret
});
}
public static async Task<IEnumerable<SecurityKey>> GetIssuerSigningKeysAsync(HttpClient client, IdentityServerSettings settings)
{
var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
if(disco?.KeySet == null)
throw new Exception("Failed to get signing keys. Make sure the Portal is running.");
var keys = new List<SecurityKey>();
foreach(var webKey in disco.KeySet.Keys)
{
var key = new RsaSecurityKey(new RSAParameters
{
Exponent = Base64Url.Decode(webKey.E),
Modulus = Base64Url.Decode(webKey.N)
});
key.KeyId = webKey.Kid;
keys.Add(key);
}
return keys;
}
}
}
================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs
================================================
using System.Collections.Generic;
using IdentityServer4.Models;
namespace Shared
{
public class IdentityServerConfig
{
public static readonly string MyClientId = "dotNetifyDemo";
public static readonly string MyClientSecret = "secret";
public static readonly string MyApiResource = "demo";
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = MyClientId,
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = { new Secret(MyClientSecret.Sha256()) },
AllowedScopes = { MyApiResource }
}
};
}
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource(MyApiResource, "DotNetify Demo") { ApiSecrets = { new Secret(MyClientSecret.Sha256()) } }
};
}
}
}
================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs
================================================
namespace Shared
{
public class IdentityServerSettings
{
public static readonly string SectionName = "IdentityServer";
public string Uri { get; set; }
}
}
================================================
FILE: MicrofrontendTemplate/Shared/Shared.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IdentityServer4" Version="2.5.3" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="2.7.0" />
</ItemGroup>
</Project>
================================================
FILE: MicrofrontendTemplate/VueTodoApp/Properties/launchSettings.json
================================================
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5020/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"dev": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5020/"
},
"prod": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:5020/"
}
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/README.md
================================================
## How to run:
Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.
================================================
FILE: MicrofrontendTemplate/VueTodoApp/VueTodoApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RootNamespace>VueTodoApp</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
<Folder Include="wwwroot\dist\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNetify.Elements" Version="1.0.0" />
<PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="System.Reactive" Version="3.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
<!-- In development, the dist files won't exist on the first run or when cloning to
a different machine, so rebuild them if not already present. -->
<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
<!-- Build JS resources -->
<Message Importance="high" Text="Performing first-run Webpack build..." />
<Exec Command="npm install" />
<Exec Command="npm run build" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec Command="npm install" />
<Exec Command="npm run prod" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>
================================================
FILE: MicrofrontendTemplate/VueTodoApp/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://localhost:5000"
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/client/components/TodoList.vue
================================================
<template>
<h4 v-if="error">{{error.message}}</h4>
<d-frame v-else middle="true" css="width: calc(100% - 3rem)">
<h2>
<img src="https://www.dotnetify.net/content/images/vuelogo.png" width="45px" height="45px" />
<span>Multicast Todo List</span>
</h2>
<d-panel css="width: 50%; padding-top: 1rem">
<d-text-field
placeholder="What do you want to do?"
@onDone="addTodo"
@onInputRef="setTodoRef($event)"
/>
<div>
<d-panel
v-for="todo in Todos"
:key="todo.Id"
css="padding: 0; border: 1px solid #ddd"
tabindex="0"
>
<d-panel
v-if="todo.Id !== editTodoId"
horizontal="true"
apart="true"
middle="true"
padding=".5rem"
>
<d-panel @dblclick="startEditTodo(todo)">
<d-checkbox :label="todo.Text" :value="todo.Done" @click="toggleTodo($event, todo)" />
</d-panel>
<i class="material-icons" style="cursor: pointer" @click="removeTodo(todo.Id)">cancel</i>
</d-panel>
<d-text-field
v-else
@onDone="doneEditTodo($event, todo)"
@onInputRef="setEditTodoRef($event, todo)"
css="width: 100%"
/>
</d-panel>
</div>
<d-alert :success="noItemLeft" :warning="hasItems" :text="itemsLeft" css="p { margin: 0 }"></d-alert>
</d-panel>
</d-frame>
</template>
<script>
import dotnetify from 'dotnetify/vue';
export default {
created() {
this.vm = dotnetify.vue.connect("TodoList", this, { appId: 'vue-todo-app', exceptionHandler: ex => this.error = ex });
},
destroyed() {
this.vm.$destroy();
},
data() {
return {
Todos: [],
ItemsLeft: 0,
editTodoId: 0,
error: null
}
},
computed: {
hasItems() { return `${this.ItemsLeft > 0}` },
noItemLeft() { return `${this.ItemsLeft === 0}` },
itemsLeft() { return `${this.ItemsLeft} item${this.ItemsLeft > 1 ? 's' : ''} left` }
},
methods: {
// Called when focus leaves or Enter keypress on the new todo input.
addTodo(e) {
const [value, { changed }] = e.detail;
if (changed) {
this.vm.$dispatch({ Add: value });
setTimeout(() => {
this.todoRef.value = '';
this.todoRef.focus();
})
}
},
// Called when existing todo is double-clicked.
startEditTodo(todo) {
this.editTodoId = todo.Id
},
// Called when focus leaves or Enter keypress on the edited todo input.
doneEditTodo(e, todo) {
const [value, { changed }] = e.detail;
if (changed && todo.Text !== value) {
todo.Text = value;
this.updateTodo(todo);
}
this.editTodoId = 0;
this.todoRef.focus();
},
toggleTodo(e, todo) {
e.preventDefault();
todo.Done = !todo.Done;
this.updateTodo(todo);
},
// Called after edit's done / checkbox clicked.
updateTodo(todo) {
this.vm.$dispatch({ Update: { Id: todo.Id, Text: todo.Text, Done: todo.Done } });
},
// Called when the remove icon is clicked.
removeTodo(id) {
this.vm.$dispatch({ Remove: id });
},
// Called when the todo input element ref is received.
setTodoRef(e) {
const [ref] = e.detail;
if (this.todoRef !== ref) {
this.todoRef = ref;
this.todoRef.focus();
}
},
// Called when the edit todo input element ref is received.
setEditTodoRef(e, todo) {
const [ref] = e.detail;
if (this.editTodoRef !== ref) {
this.editTodoRef = ref;
this.editTodoRef.value = todo.Text;
this.editTodoRef.focus();
this.editTodoRef.select();
}
}
}
}
</script>
================================================
FILE: MicrofrontendTemplate/VueTodoApp/client/index.js
================================================
import Vue from 'vue';
import vueCustomElement from 'vue-custom-element';
import TodoList from './components/TodoList.vue';
const elementName = 'vue-todo-app';
Vue.use(vueCustomElement);
Vue.customElement(elementName, TodoList, {
shadow: false, // Don't use shadow-DOM so global css can affect the inner Vue component.
destroyTimeout: 1 // Immediately destroy the Vue component when the custom element is detached.
});
export default document.createElement(elementName);
================================================
FILE: MicrofrontendTemplate/VueTodoApp/package.json
================================================
{
"version": "1.0.0",
"name": "vue-todo-app",
"private": true,
"scripts": {
"build": "webpack",
"prod": "webpack --mode production"
},
"dependencies": {
"dotnetify": "^4.0.0",
"dotnetify-elements": "^1.1.0",
"vue": "^2.5.22",
"vue-custom-element": "^3.2.9"
},
"devDependencies": {
"aspnet-webpack": "~3.0.0",
"babel-core": "~6.26.3",
"babel-loader": "~7.1.4",
"babel-preset-env": "~1.7.0",
"copy-webpack-plugin": "^5.0.4",
"css-loader": "^3.2.0",
"node-sass": "~4.9.4",
"sass-loader": "~7.1.0",
"url-loader": "~1.0.1",
"vue-loader": "^15.4.2",
"vue-template-compiler": "^2.5.22",
"webpack": "~4.12.0",
"webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "~3.0.8",
"webpack-dev-middleware": "~3.1.3",
"webpack-hot-middleware": "~2.22.2"
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit
:prod
call npm run prod
dotnet run --launch-profile prod
================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace VueTodoApp
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/Startup.cs
================================================
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Shared;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
namespace VueTodoApp
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMemoryCache();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(builder => builder
.AllowAnyMethod()
.AllowAnyHeader()
.AllowAnyOrigin()
.AllowCredentials());
app.UseWebSockets();
app.UseSignalR(routes => routes.MapDotNetifyHub());
app.UseDotNetify(config =>
{
if (env.IsProduction())
{
IEnumerable<SecurityKey> keys;
using (var client = HttpClientFactory.Create())
{
var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
}
// Middleware to do authenticate token in incoming request headers.
config.UseJwtBearerAuthentication(new TokenValidationParameters
{
IssuerSigningKeys = keys,
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(0)
});
// Filter to check whether user has permission to access view models with [Authorize] attribute.
config.UseFilter<AuthorizeFilter>();
}
else
config.UseDeveloperLogging();
});
if (env.IsDevelopment())
{
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
});
}
app.UseFileServer();
app.Run(async (context) =>
{
using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
await context.Response.WriteAsync(reader.ReadToEnd());
});
}
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Security;
namespace VueTodoApp
{
[Authorize]
public class TodoList : MulticastVM
{
private static List<Todo> _todos = new List<Todo>();
public class Todo
{
public int Id { get; set; }
public string Text { get; set; }
public bool Done { get; set; }
}
public List<Todo> Todos => _todos;
public string Todos_itemKey => nameof(Todo.Id);
public int ItemsLeft => Todos.Count(x => !x.Done);
public Action<string> Add => text =>
{
var todo = new Todo { Id = text.GetHashCode(), Text = text };
if (!Todos.Any(x => x.Id == todo.Id))
{
Todos.Add(todo);
this.AddList(nameof(Todos), todo);
Changed(nameof(ItemsLeft));
}
};
public Action<Todo> Update => update =>
{
var todo = Todos.Find(x => x.Id == update.Id);
if (todo != null)
{
if (string.IsNullOrWhiteSpace(update.Text))
Remove(update.Id);
else
{
todo.Text = update.Text;
todo.Done = update.Done;
this.UpdateList(nameof(Todos), todo);
Changed(nameof(ItemsLeft));
}
}
};
public Action<int> Remove => id =>
{
var todo = Todos.Find(x => x.Id == id);
if (todo != null)
{
Todos.Remove(todo);
this.RemoveList(nameof(Todos), id);
Changed(nameof(ItemsLeft));
}
};
}
}
================================================
FILE: MicrofrontendTemplate/VueTodoApp/webpack.config.js
================================================
'use strict';
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
mode: 'development',
entry: {
app: './client/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/wwwroot/dist',
publicPath: '/dist/',
libraryTarget: 'umd'
},
resolve: {
modules: [ 'client', 'node_modules' ],
alias: { vue$: 'vue/dist/vue.esm.js' }
},
module: {
rules: [
{ test: /\.vue$/, use: 'vue-loader' },
{ test: /\.js?$/, loader: 'babel-loader', query: { presets: [ 'env' ] } },
{ test: /\.scss$/, use: [ 'vue-style-loader', 'css-loader', 'sass-loader' ] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
]
},
externals: {
'dotnetify-elements': 'dotNetifyElements'
},
devtool: 'source-map',
plugins: [
new VueLoaderPlugin(),
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
new CopyPlugin([
{ from: 'node_modules/dotnetify/dist/dotnetify-vue.min.js' },
{ from: 'node_modules/dotnetify-elements/lib/basic-web-components.bundle.js' }
])
]
};
================================================
FILE: MicrofrontendTemplate/VueTodoApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>VueTodoApp</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body style="height: 100vh">
<vue-todo-app></vue-todo-app>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/styled-components/4.3.2/styled-components.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>
<script src="/dist/dotnetify-vue.min.js"></script>
<script src="/dist/basic-web-components.bundle.js"></script>
<script src="/dist/app.js"></script>
</body>
</html>
================================================
FILE: MicrofrontendTemplate/global.json
================================================
{
"sdk": {
"version": "3.1.201"
}
}
================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/Dockerfile
================================================
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
LABEL stage=build
WORKDIR /src
COPY ./__tmp__ .
# Install node.js
RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash \
&& apt-get install nodejs -yq
RUN dotnet publish ./Portal/Portal.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ARG aspnetenv=Production
ENV ASPNETCORE_ENVIRONMENT ${aspnetenv}
CMD ASPNETCORE_URLS=http://*:$PORT dotnet Portal.dll
================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://dotnetify-mfe.herokuapp.com"
}
}
================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/build.bat
================================================
@echo off
set env=Production
if "%1"=="" goto :next
set env=%1
:next
echo --- Copy source code
xcopy ..\..\Portal\*.* .\__tmp__\Portal\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt
echo --- Remove any existing image
docker rmi portal -f
echo --- Build a new image
docker build -t portal -f ./Dockerfile . --build-arg aspnetenv=%env%
echo --- Remove build images
docker image prune -f --filter label=stage=build
rd __tmp__ /q /s
echo --- Run a container on port 5000
docker run -it --rm -p:5000:80 --name portal_5000 portal
================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/deploy.bat
================================================
@echo off
echo --- Copy source code
xcopy ..\..\Portal\*.* .\__tmp__\Portal\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy appsettings.json .\__tmp__\Portal\ /q /y
call heroku container:push web -a dotnetify-portal
call heroku container:release web -a dotnetify-portal
rd __tmp__ /q /s
================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/excludedfiles.txt
================================================
.vssscc
.vspscc
.log
.user
\obj\
\bin\
\Properties\
\node_modules\
\coverage\
\wwwroot\dist\
================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/Dockerfile
================================================
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
LABEL stage=build
WORKDIR /src
COPY ./__tmp__ .
# Install node.js
RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash \
&& apt-get install nodejs -yq
RUN dotnet publish ./ReactDashboardApp/ReactDashboardApp.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ARG aspnetenv=Production
ENV ASPNETCORE_ENVIRONMENT ${aspnetenv}
CMD ASPNETCORE_URLS=http://*:$PORT dotnet ReactDashboardApp.dll
================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/appsettings.json
================================================
{
"IdentityServer": {
"Uri": "http://dotnetify-mfe.herokuapp.com"
}
}
================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/build.bat
================================================
@echo off
set env=Production
if "%1"=="" goto :next
set env=%1
:next
echo --- Copy source code
xcopy ..\..\ReactDashboardApp\*.* .\__tmp__\ReactDashboardApp\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt
echo --- Remove any existing image
docker rmi dashboard -f
echo --- Build a new image
docker build -t portal -f ./Dockerfile . --build-arg aspnetenv=%env%
echo --- Remove build images
docker image prune -f --filter label=stage=build
rd __tmp__ /q /s
echo --- Run a container on port 5060
docker run -it --rm -p:5060:80 --name dashboard_5060 dashboard
================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/deploy.bat
================================================
@echo off
echo --- Copy source code
xcopy ..\..\ReactDashboardApp\*.* .\__tmp__\ReactDashboardApp\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy appsettings.json .\__tmp__\ReactDashboardApp\ /q /y
call heroku container:push web -a dotnetify-dashboard
call heroku container:release web -a dotnetify-dashboard
rd __tmp__ /q /s
================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/excludedfiles.txt
================================================
.vssscc
.vspscc
.log
.user
\obj\
\bin\
\Properties\
\node_modules\
\coverage\
\wwwroot\dist\
================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/Dockerfile
================================================
FROM nginx:alpine
COPY ./nginx.conf /etc/nginx
CMD sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf && nginx -g 'daemon off;'
================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/deploy.bat
================================================
@echo off
call heroku container:push web -a dotnetify-mfe
call heroku container:release web -a dotnetify-mfe
================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/nginx.conf
================================================
worker_processes 1;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen $PORT;
server_name localhost;
location / {
proxy_pass http://dotnetify-portal.herokuapp.com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host dotnetify-portal.herokuapp.com;
proxy_cache_bypass $http_upgrade;
}
location /app1 {
rewrite ^/app1/(.*) /$1 break;
proxy_pass http://dotnetify-dashboard.herokuapp.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host dotnetify-dashboard.herokuapp.com;
proxy_cache_bypass $http_upgrade;
}
# location /app2 {
# rewrite ^/app2/(.*) /$1 break;
# proxy_pass http://hostip:5070;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $http_connection;
# proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
# }
# location /app3 {
# rewrite ^/app3/(.*) /$1 break;
# proxy_pass http://hostip:5010;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $http_connection;
# proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
# }
# location /app4 {
# rewrite ^/app4/(.*) /$1 break;
# proxy_pass http://hostip:5020;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $http_connection;
# proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
# }
}
}
================================================
FILE: MicrofrontendTemplate/nginx/.gitignore
================================================
logs
================================================
FILE: MicrofrontendTemplate/nginx/conf/fastcgi.conf
================================================
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
================================================
FILE: MicrofrontendTemplate/nginx/conf/fastcgi_params
================================================
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
================================================
FILE: MicrofrontendTemplate/nginx/conf/koi-utf
================================================
# This map is not a full koi8-r <> utf8 map: it does not contain
# box-drawing and some other characters. Besides this map contains
# several koi8-u and Byelorussian letters which are not in koi8-r.
# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
# map instead.
charset_map koi8-r utf-8 {
80 E282AC ; # euro
95 E280A2 ; # bullet
9A C2A0 ; #
9E C2B7 ; # ·
A3 D191 ; # small yo
A4 D194 ; # small Ukrainian ye
A6 D196 ; # small Ukrainian i
A7 D197 ; # small Ukrainian yi
AD D291 ; # small Ukrainian soft g
AE D19E ; # small Byelorussian short u
B0 C2B0 ; # °
B3 D081 ; # capital YO
B4 D084 ; # capital Ukrainian YE
B6 D086 ; # capital Ukrainian I
B7 D087 ; # capital Ukrainian YI
B9 E28496 ; # numero sign
BD D290 ; # capital Ukrainian soft G
BE D18E ; # capital Byelorussian short U
BF C2A9 ; # (C)
C0 D18E ; # small yu
C1 D0B0 ; # small a
C2 D0B1 ; # small b
C3 D186 ; # small ts
C4 D0B4 ; # small d
C5 D0B5 ; # small ye
C6 D184 ; # small f
C7 D0B3 ; # small g
C8 D185 ; # small kh
C9 D0B8 ; # small i
CA D0B9 ; # small j
CB D0BA ; # small k
CC D0BB ; # small l
CD D0BC ; # small m
CE D0BD ; # small n
CF D0BE ; # small o
D0 D0BF ; # small p
D1 D18F ; # small ya
D2 D180 ; # small r
D3 D181 ; # small s
D4 D182 ; # small t
D5 D183 ; # small u
D6 D0B6 ; # small zh
D7 D0B2 ; # small v
D8 D18C ; # small soft sign
D9 D18B ; # small y
DA D0B7 ; # small z
DB D188 ; # small sh
DC D18D ; # small e
DD D189 ; # small shch
DE D187 ; # small ch
DF D18A ; # small hard sign
E0 D0AE ; # capital YU
E1 D090 ; # capital A
E2 D091 ; # capital B
E3 D0A6 ; # capital TS
E4 D094 ; # capital D
E5 D095 ; # capital YE
E6 D0A4 ; # capital F
E7 D093 ; # capital G
E8 D0A5 ; # capital KH
E9 D098 ; # capital I
EA D099 ; # capital J
EB D09A ; # capital K
EC D09B ; # capital L
ED D09C ; # capital M
EE D09D ; # capital N
EF D09E ; # capital O
F0 D09F ; # capital P
F1 D0AF ; # capital YA
F2 D0A0 ; # capital R
F3 D0A1 ; # capital S
F4 D0A2 ; # capital T
F5 D0A3 ; # capital U
F6 D096 ; # capital ZH
F7 D092 ; # capital V
F8 D0AC ; # capital soft sign
F9 D0AB ; # capital Y
FA D097 ; # capital Z
FB D0A8 ; # capital SH
FC D0AD ; # capital E
FD D0A9 ; # capital SHCH
FE D0A7 ; # capital CH
FF D0AA ; # capital hard sign
}
================================================
FILE: MicrofrontendTemplate/nginx/conf/koi-win
================================================
charset_map koi8-r windows-1251 {
80 88 ; # euro
95 95 ; # bullet
9A A0 ; #
9E B7 ; # ·
A3 B8 ; # small yo
A4 BA ; # small Ukrainian ye
A6 B3 ; # small Ukrainian i
A7 BF ; # small Ukrainian yi
AD B4 ; # small Ukrainian soft g
AE A2 ; # small Byelorussian short u
B0 B0 ; # °
B3 A8 ; # capital YO
B4 AA ; # capital Ukrainian YE
B6 B2 ; # capital Ukrainian I
B7 AF ; # capital Ukrainian YI
B9 B9 ; # numero sign
BD A5 ; # capital Ukrainian soft G
BE A1 ; # capital Byelorussian short U
BF A9 ; # (C)
C0 FE ; # small yu
C1 E0 ; # small a
C2 E1 ; # small b
C3 F6 ; # small ts
C4 E4 ; # small d
C5 E5 ; # small ye
C6 F4 ; # small f
C7 E3 ; # small g
C8 F5 ; # small kh
C9 E8 ; # small i
CA E9 ; # small j
CB EA ; # small k
CC EB ; # small l
CD EC ; # small m
CE ED ; # small n
CF EE ; # small o
D0 EF ; # small p
D1 FF ; # small ya
D2 F0 ; # small r
D3 F1 ; # small s
D4 F2 ; # small t
D5 F3 ; # small u
D6 E6 ; # small zh
D7 E2 ; # small v
D8 FC ; # small soft sign
D9 FB ; # small y
DA E7 ; # small z
DB F8 ; # small sh
DC FD ; # small e
DD F9 ; # small shch
DE F7 ; # small ch
DF FA ; # small hard sign
E0 DE ; # capital YU
E1 C0 ; # capital A
E2 C1 ; # capital B
E3 D6 ; # capital TS
E4 C4 ; # capital D
E5 C5 ; # capital YE
E6 D4 ; # capital F
E7 C3 ; # capital G
E8 D5 ; # capital KH
E9 C8 ; # capital I
EA C9 ; # capital J
EB CA ; # capital K
EC CB ; # capital L
ED CC ; # capital M
EE CD ; # capital N
EF CE ; # capital O
F0 CF ; # capital P
F1 DF ; # capital YA
F2 D0 ; # capital R
F3 D1 ; # capital S
F4 D2 ; # capital T
F5 D3 ; # capital U
F6 C6 ; # capital ZH
F7 C2 ; # capital V
F8 DC ; # capital soft sign
F9 DB ; # capital Y
FA C7 ; # capital Z
FB D8 ; # capital SH
FC DD ; # capital E
FD D9 ; # capital SHCH
FE D7 ; # capital CH
FF DA ; # capital hard sign
}
================================================
FILE: MicrofrontendTemplate/nginx/conf/mime.types
================================================
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
================================================
FILE: MicrofrontendTemplate/nginx/conf/nginx.conf
================================================
worker_processes 1;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /app1 {
rewrite ^/app1/(.*) /$1 break;
proxy_pass http://localhost:5060;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /app2 {
rewrite ^/app2/(.*) /$1 break;
proxy_pass http://localhost:5070;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /app3 {
rewrite ^/app3/(.*) /$1 break;
proxy_pass http://localhost:5010;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /app4 {
rewrite ^/app4/(.*) /$1 break;
proxy_pass http://localhost:5020;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
================================================
FILE: MicrofrontendTemplate/nginx/conf/scgi_params
================================================
scgi_param REQUEST_METHOD $request_method;
scgi_param REQUEST_URI $request_uri;
scgi_param QUERY_STRING $query_string;
scgi_param CONTENT_TYPE $content_type;
scgi_param DOCUMENT_URI $document_uri;
scgi_param DOCUMENT_ROOT $document_root;
scgi_param SCGI 1;
scgi_param SERVER_PROTOCOL $server_protocol;
scgi_param REQUEST_SCHEME $scheme;
scgi_param HTTPS $https if_not_empty;
scgi_param REMOTE_ADDR $remote_addr;
scgi_param REMOTE_PORT $remote_port;
scgi_param SERVER_PORT $server_port;
scgi_param SERVER_NAME $server_name;
================================================
FILE: MicrofrontendTemplate/nginx/conf/uwsgi_params
================================================
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
================================================
FILE: MicrofrontendTemplate/nginx/conf/win-utf
================================================
# This map is not a full windows-1251 <> utf8 map: it does not
# contain Serbian and Macedonian letters. If you need a full map,
# use contrib/unicode2nginx/win-utf map instead.
charset_map windows-1251 utf-8 {
82 E2809A ; # single low-9 quotation mark
84 E2809E ; # double low-9 quotation mark
85 E280A6 ; # ellipsis
86 E280A0 ; # dagger
87 E280A1 ; # double dagger
88 E282AC ; # euro
89 E280B0 ; # per mille
91 E28098 ; # left single quotation mark
92 E28099 ; # right single quotation mark
93 E2809C ; # left double quotation mark
94 E2809D ; # right double quotation mark
95 E280A2 ; # bullet
96 E28093 ; # en dash
97 E28094 ; # em dash
99 E284A2 ; # trade mark sign
A0 C2A0 ; #
A1 D18E ; # capital Byelorussian short U
A2 D19E ; # small Byelorussian short u
A4 C2A4 ; # currency sign
A5 D290 ; # capital Ukrainian soft G
A6 C2A6 ; # borken bar
A7 C2A7 ; # section sign
A8 D081 ; # capital YO
A9 C2A9 ; # (C)
AA D084 ; # capital Ukrainian YE
AB C2AB ; # left-pointing double angle quotation mark
AC C2AC ; # not sign
AD C2AD ; # soft hypen
AE C2AE ; # (R)
AF D087 ; # capital Ukrainian YI
B0 C2B0 ; # °
B1 C2B1 ; # plus-minus sign
B2 D086 ; # capital Ukrainian I
B3 D196 ; # small Ukrainian i
B4 D291 ; # small Ukrainian soft g
B5 C2B5 ; # micro sign
B6 C2B6 ; # pilcrow sign
B7 C2B7 ; # ·
B8 D191 ; # small yo
B9 E28496 ; # numero sign
BA D194 ; # small Ukrainian ye
BB C2BB ; # right-pointing double angle quotation mark
BF D197 ; # small Ukrainian yi
C0 D090 ; # capital A
C1 D091 ; # capital B
C2 D092 ; # capital V
C3 D093 ; # capital G
C4 D094 ; # capital D
C5 D095 ; # capital YE
C6 D096 ; # capital ZH
C7 D097 ; # capital Z
C8 D098 ; # capital I
C9 D099 ; # capital J
CA D09A ; # capital K
CB D09B ; # capital L
CC D09C ; # capital M
CD D09D ; # capital N
CE D09E ; # capital O
CF D09F ; # capital P
D0 D0A0 ; # capital R
D1 D0A1 ; # capital S
D2 D0A2 ; # capital T
D3 D0A3 ; # capital U
D4 D0A4 ; # capital F
D5 D0A5 ; # capital KH
D6 D0A6 ; # capital TS
D7 D0A7 ; # capital CH
D8 D0A8 ; # capital SH
D9 D0A9 ; # capital SHCH
DA D0AA ; # capital hard sign
DB D0AB ; # capital Y
DC D0AC ; # capital soft sign
DD D0AD ; # capital E
DE D0AE ; # capital YU
DF D0AF ; # capital YA
E0 D0B0 ; # small a
E1 D0B1 ; # small b
E2 D0B2 ; # small v
E3 D0B3 ; # small g
E4 D0B4 ; # small d
E5 D0B5 ; # small ye
E6 D0B6 ; # small zh
E7 D0B7 ; # small z
E8 D0B8 ; # small i
E9 D0B9 ; # small j
EA D0BA ; # small k
EB D0BB ; # small l
EC D0BC ; # small m
ED D0BD ; # small n
EE D0BE ; # small o
EF D0BF ; # small p
F0 D180 ; # small r
F1 D181 ; # small s
F2 D182 ; # small t
F3 D183 ; # small u
F4 D184 ; # small f
F5 D185 ; # small kh
F6 D186 ; # small ts
F7 D187 ; # small ch
F8 D188 ; # small sh
F9 D189 ; # small shch
FA D18A ; # small hard sign
FB D18B ; # small y
FC D18C ; # small soft sign
FD D18D ; # small e
FE D18E ; # small yu
FF D18F ; # small ya
}
================================================
FILE: MicrofrontendTemplate/nginx/contrib/README
================================================
geo2nginx.pl by Andrei Nigmatulin
The perl script to convert CSV geoip database ( free download
at http://www.maxmind.com/app/geoip_country ) to format, suitable
for use by the ngx_http_geo_module.
unicode2nginx by Maxim Dounin
The perl script to convert unicode mappings ( available
at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx
configuration file format.
Two generated full maps for windows-1251 and koi8-r.
vim by Evan Miller
Syntax highlighting of nginx configuration for vim, to be
placed into ~/.vim/.
================================================
FILE: MicrofrontendTemplate/nginx/contrib/geo2nginx.pl
================================================
#!/usr/bin/perl -w
# (c) Andrei Nigmatulin, 2005
#
# this script provided "as is", without any warranties. use it at your own risk.
#
# special thanx to Andrew Sitnikov for perl port
#
# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country)
# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx)
#
# for example, line with ip range
#
# "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation"
#
# will be converted to four subnetworks:
#
# 62.16.68.0/22 RU;
# 62.16.72.0/21 RU;
# 62.16.80.0/20 RU;
# 62.16.96.0/19 RU;
use warnings;
use strict;
while( <STDIN> ){
if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){
print_subnets($1, $2, $3);
}
}
sub print_subnets {
my ($a1, $a2, $c) = @_;
my $l;
while ($a1 <= $a2) {
for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};
print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n";
$a1 += (1 << $l);
}
}
sub long2ip {
my $ip = shift;
my $str = 0;
$str = ($ip & 255);
$ip >>= 8;
$str = ($ip & 255).".$str";
$ip >>= 8;
$str = ($ip & 255).".$str";
$ip >>= 8;
$str = ($ip & 255).".$str";
}
================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/koi-utf
================================================
charset_map koi8-r utf-8 {
80 E29480 ; # BOX DRAWINGS LIGHT HORIZONTAL
81 E29482 ; # BOX DRAWINGS LIGHT VERTICAL
82 E2948C ; # BOX DRAWINGS LIGHT DOWN AND RIGHT
83 E29490 ; # BOX DRAWINGS LIGHT DOWN AND LEFT
84 E29494 ; # BOX DRAWINGS LIGHT UP AND RIGHT
85 E29498 ; # BOX DRAWINGS LIGHT UP AND LEFT
86 E2949C ; # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
87 E294A4 ; # BOX DRAWINGS LIGHT VERTICAL AND LEFT
88 E294AC ; # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
89 E294B4 ; # BOX DRAWINGS LIGHT UP AND HORIZONTAL
8A E294BC ; # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
8B E29680 ; # UPPER HALF BLOCK
8C E29684 ; # LOWER HALF BLOCK
8D E29688 ; # FULL BLOCK
8E E2968C ; # LEFT HALF BLOCK
8F E29690 ; # RIGHT HALF BLOCK
90 E29691 ; # LIGHT SHADE
91 E29692 ; # MEDIUM SHADE
92 E29693 ; # DARK SHADE
93 E28CA0 ; # TOP HALF INTEGRAL
94 E296A0 ; # BLACK SQUARE
95 E28899 ; # BULLET OPERATOR
96 E2889A ; # SQUARE ROOT
97 E28988 ; # ALMOST EQUAL TO
98 E289A4 ; # LESS-THAN OR EQUAL TO
99 E289A5 ; # GREATER-THAN OR EQUAL TO
9A C2A0 ; # NO-BREAK SPACE
9B E28CA1 ; # BOTTOM HALF INTEGRAL
9C C2B0 ; # DEGREE SIGN
9D C2B2 ; # SUPERSCRIPT TWO
9E C2B7 ; # MIDDLE DOT
9F C3B7 ; # DIVISION SIGN
A0 E29590 ; # BOX DRAWINGS DOUBLE HORIZONTAL
A1 E29591 ; # BOX DRAWINGS DOUBLE VERTICAL
A2 E29592 ; # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
A3 D191 ; # CYRILLIC SMALL LETTER IO
A4 E29593 ; # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
A5 E29594 ; # BOX DRAWINGS DOUBLE DOWN AND RIGHT
A6 E29595 ; # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
A7 E29596 ; # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
A8 E29597 ; # BOX DRAWINGS DOUBLE DOWN AND LEFT
A9 E29598 ; # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
AA E29599 ; # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
AB E2959A ; # BOX DRAWINGS DOUBLE UP AND RIGHT
AC E2959B ; # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
AD E2959C ; # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
AE E2959D ; # BOX DRAWINGS DOUBLE UP AND LEFT
AF E2959E ; # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
B0 E2959F ; # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
B1 E295A0 ; # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
B2 E295A1 ; # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
B3 D081 ; # CYRILLIC CAPITAL LETTER IO
B4 E295A2 ; # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
B5 E295A3 ; # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
B6 E295A4 ; # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
B7 E295A5 ; # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
B8 E295A6 ; # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
B9 E295A7 ; # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
BA E295A8 ; # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
BB E295A9 ; # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
BC E295AA ; # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
BD E295AB ; # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
BE E295AC ; # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
BF C2A9 ; # COPYRIGHT SIGN
C0 D18E ; # CYRILLIC SMALL LETTER YU
C1 D0B0 ; # CYRILLIC SMALL LETTER A
C2 D0B1 ; # CYRILLIC SMALL LETTER BE
C3 D186 ; # CYRILLIC SMALL LETTER TSE
C4 D0B4 ; # CYRILLIC SMALL LETTER DE
C5 D0B5 ; # CYRILLIC SMALL LETTER IE
C6 D184 ; # CYRILLIC SMALL LETTER EF
C7 D0B3 ; # CYRILLIC SMALL LETTER GHE
C8 D185 ; # CYRILLIC SMALL LETTER HA
C9 D0B8 ; # CYRILLIC SMALL LETTER I
CA D0B9 ; # CYRILLIC SMALL LETTER SHORT I
CB D0BA ; # CYRILLIC SMALL LETTER KA
CC D0BB ; # CYRILLIC SMALL LETTER EL
CD D0BC ; # CYRILLIC SMALL LETTER EM
CE D0BD ; # CYRILLIC SMALL LETTER EN
CF D0BE ; # CYRILLIC SMALL LETTER O
D0 D0BF ; # CYRILLIC SMALL LETTER PE
D1 D18F ; # CYRILLIC SMALL LETTER YA
D2 D180 ; # CYRILLIC SMALL LETTER ER
D3 D181 ; # CYRILLIC SMALL LETTER ES
D4 D182 ; # CYRILLIC SMALL LETTER TE
D5 D183 ; # CYRILLIC SMALL LETTER U
D6 D0B6 ; # CYRILLIC SMALL LETTER ZHE
D7 D0B2 ; # CYRILLIC SMALL LETTER VE
D8 D18C ; # CYRILLIC SMALL LETTER SOFT SIGN
D9 D18B ; # CYRILLIC SMALL LETTER YERU
DA D0B7 ; # CYRILLIC SMALL LETTER ZE
DB D188 ; # CYRILLIC SMALL LETTER SHA
DC D18D ; # CYRILLIC SMALL LETTER E
DD D189 ; # CYRILLIC SMALL LETTER SHCHA
DE D187 ; # CYRILLIC SMALL LETTER CHE
DF D18A ; # CYRILLIC SMALL LETTER HARD SIGN
E0 D0AE ; # CYRILLIC CAPITAL LETTER YU
E1 D090 ; # CYRILLIC CAPITAL LETTER A
E2 D091 ; # CYRILLIC CAPITAL LETTER BE
E3 D0A6 ; # CYRILLIC CAPITAL LETTER TSE
E4 D094 ; # CYRILLIC CAPITAL LETTER DE
E5 D095 ; # CYRILLIC CAPITAL LETTER IE
E6 D0A4 ; # CYRILLIC CAPITAL LETTER EF
E7 D093 ; # CYRILLIC CAPITAL LETTER GHE
E8 D0A5 ; # CYRILLIC CAPITAL LETTER HA
E9 D098 ; # CYRILLIC CAPITAL LETTER I
EA D099 ; # CYRILLIC CAPITAL LETTER SHORT I
EB D09A ; # CYRILLIC CAPITAL LETTER KA
EC D09B ; # CYRILLIC CAPITAL LETTER EL
ED D09C ; # CYRILLIC CAPITAL LETTER EM
EE D09D ; # CYRILLIC CAPITAL LETTER EN
EF D09E ; # CYRILLIC CAPITAL LETTER O
F0 D09F ; # CYRILLIC CAPITAL LETTER PE
F1 D0AF ; # CYRILLIC CAPITAL LETTER YA
F2 D0A0 ; # CYRILLIC CAPITAL LETTER ER
F3 D0A1 ; # CYRILLIC CAPITAL LETTER ES
F4 D0A2 ; # CYRILLIC CAPITAL LETTER TE
F5 D0A3 ; # CYRILLIC CAPITAL LETTER U
F6 D096 ; # CYRILLIC CAPITAL LETTER ZHE
F7 D092 ; # CYRILLIC CAPITAL LETTER VE
F8 D0AC ; # CYRILLIC CAPITAL LETTER SOFT SIGN
F9 D0AB ; # CYRILLIC CAPITAL LETTER YERU
FA D097 ; # CYRILLIC CAPITAL LETTER ZE
FB D0A8 ; # CYRILLIC CAPITAL LETTER SHA
FC D0AD ; # CYRILLIC CAPITAL LETTER E
FD D0A9 ; # CYRILLIC CAPITAL LETTER SHCHA
FE D0A7 ; # CYRILLIC CAPITAL LETTER CHE
FF D0AA ; # CYRILLIC CAPITAL LETTER HARD SIGN
}
================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/unicode-to-nginx.pl
================================================
#!/usr/bin/perl -w
# Convert unicode mappings to nginx configuration file format.
# You may find useful mappings in various places, including
# unicode.org official site:
#
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT
# Needs perl 5.6 or later.
# Written by Maxim Dounin, mdounin@mdounin.ru
###############################################################################
require 5.006;
while (<>) {
# Skip comments and empty lines
next if /^#/;
next if /^\s*$/;
chomp;
# Convert mappings
if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) {
# Mapping <from-code> <unicode-code> "#" <unicode-name>
my $cs_code = $1;
my $un_code = $2;
my $un_name = $3;
# Produce UTF-8 sequence from character code;
my $un_utf8 = join('',
map { sprintf("%02X", $_) }
unpack("U0C*", pack("U", hex($un_code)))
);
print " $cs_code $un_utf8 ; $un_name\n";
} else {
warn "Unrecognized line: '$_'";
}
}
###############################################################################
================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/win-utf
================================================
charset_map windows-1251 utf-8 {
80 D082 ; #CYRILLIC CAPITAL LETTER DJE
81 D083 ; #CYRILLIC CAPITAL LETTER GJE
82 E2809A ; #SINGLE LOW-9 QUOTATION MARK
83 D193 ; #CYRILLIC SMALL LETTER GJE
84 E2809E ; #DOUBLE LOW-9 QUOTATION MARK
85 E280A6 ; #HORIZONTAL ELLIPSIS
86 E280A0 ; #DAGGER
87 E280A1 ; #DOUBLE DAGGER
88 E282AC ; #EURO SIGN
89 E280B0 ; #PER MILLE SIGN
8A D089 ; #CYRILLIC CAPITAL LETTER LJE
8B E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
8C D08A ; #CYRILLIC CAPITAL LETTER NJE
8D D08C ; #CYRILLIC CAPITAL LETTER KJE
gitextract_j6oj_ypb/
├── .gitattributes
├── .gitignore
├── LICENSE
├── MicrofrontendTemplate/
│ ├── .gitignore
│ ├── .template.config/
│ │ └── template.json
│ ├── Microfrontend.sln
│ ├── Portal/
│ │ ├── Portal.csproj
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── auth.js
│ │ │ ├── components/
│ │ │ │ ├── App.js
│ │ │ │ ├── Landing.js
│ │ │ │ ├── Login.js
│ │ │ │ └── Portal.js
│ │ │ ├── index.js
│ │ │ └── loader.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Controllers/
│ │ │ │ └── LoginController.cs
│ │ │ ├── Program.cs
│ │ │ └── Startup.cs
│ │ ├── tempkey.rsa
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ ├── 404.html
│ │ └── index.html
│ ├── README.md
│ ├── ReactDashboardApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactDashboardApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ ├── ActivitiesCard.js
│ │ │ │ ├── Dashboard.js
│ │ │ │ └── InfoCard.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ └── MockLiveDataService.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── Dashboard.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── ReactFormApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactFormApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ ├── AddressForm.js
│ │ │ │ ├── BasicInfoForm.js
│ │ │ │ ├── Form.js
│ │ │ │ └── NewCustomerDialog.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── Customer.cs
│ │ │ │ ├── CustomerFormData.cs
│ │ │ │ └── CustomerRepository.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ ├── AddressForm.cs
│ │ │ ├── CustomerForm.cs
│ │ │ ├── NewCustomerForm.cs
│ │ │ ├── PersonForm.cs
│ │ │ └── PhoneForm.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── ReactTodoApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── ReactTodoApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ └── TodoList.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── TodoList.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── Shared/
│ │ ├── IdentityServer/
│ │ │ ├── IdentityServerClient.cs
│ │ │ ├── IdentityServerConfig.cs
│ │ │ └── IdentityServerSettings.cs
│ │ └── Shared.csproj
│ ├── VueTodoApp/
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── README.md
│ │ ├── VueTodoApp.csproj
│ │ ├── appsettings.json
│ │ ├── client/
│ │ │ ├── components/
│ │ │ │ └── TodoList.vue
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── server/
│ │ │ ├── Program.cs
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ └── TodoList.cs
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ ├── global.json
│ ├── heroku-deploy/
│ │ ├── Portal/
│ │ │ ├── Dockerfile
│ │ │ ├── appsettings.json
│ │ │ ├── build.bat
│ │ │ ├── deploy.bat
│ │ │ └── excludedfiles.txt
│ │ ├── ReactDashboardApp/
│ │ │ ├── Dockerfile
│ │ │ ├── appsettings.json
│ │ │ ├── build.bat
│ │ │ ├── deploy.bat
│ │ │ └── excludedfiles.txt
│ │ └── nginx/
│ │ ├── Dockerfile
│ │ ├── deploy.bat
│ │ └── nginx.conf
│ ├── nginx/
│ │ ├── .gitignore
│ │ ├── conf/
│ │ │ ├── fastcgi.conf
│ │ │ ├── fastcgi_params
│ │ │ ├── koi-utf
│ │ │ ├── koi-win
│ │ │ ├── mime.types
│ │ │ ├── nginx.conf
│ │ │ ├── scgi_params
│ │ │ ├── uwsgi_params
│ │ │ └── win-utf
│ │ ├── contrib/
│ │ │ ├── README
│ │ │ ├── geo2nginx.pl
│ │ │ ├── unicode2nginx/
│ │ │ │ ├── koi-utf
│ │ │ │ ├── unicode-to-nginx.pl
│ │ │ │ └── win-utf
│ │ │ └── vim/
│ │ │ ├── ftdetect/
│ │ │ │ └── nginx.vim
│ │ │ ├── ftplugin/
│ │ │ │ └── nginx.vim
│ │ │ ├── indent/
│ │ │ │ └── nginx.vim
│ │ │ └── syntax/
│ │ │ └── nginx.vim
│ │ ├── docs/
│ │ │ ├── CHANGES
│ │ │ ├── CHANGES.ru
│ │ │ ├── LICENSE
│ │ │ ├── OpenSSL.LICENSE
│ │ │ ├── PCRE.LICENCE
│ │ │ ├── README
│ │ │ └── zlib.LICENSE
│ │ ├── html/
│ │ │ ├── 50x.html
│ │ │ └── index.html
│ │ ├── run.bat
│ │ └── stop.bat
│ └── run.bat
├── README.md
├── ReactTemplate/
│ ├── README.md
│ ├── content/
│ │ ├── .gitignore
│ │ ├── .template.config/
│ │ │ └── template.json
│ │ ├── client/
│ │ │ ├── app.tsx
│ │ │ ├── auth.ts
│ │ │ ├── components/
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── InfoBox.tsx
│ │ │ │ │ ├── RecentActivities.tsx
│ │ │ │ │ ├── ServerUsage.tsx
│ │ │ │ │ ├── Traffic.tsx
│ │ │ │ │ └── Utilization.tsx
│ │ │ │ └── table/
│ │ │ │ ├── InlineEdit.tsx
│ │ │ │ └── Pagination.tsx
│ │ │ ├── routes.tsx
│ │ │ ├── styles/
│ │ │ │ ├── app.css
│ │ │ │ ├── styles.ts
│ │ │ │ └── theme-default.ts
│ │ │ └── views/
│ │ │ ├── App.tsx
│ │ │ ├── AppLayout.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── FormPage.tsx
│ │ │ ├── LoginPage.tsx
│ │ │ └── TablePage.tsx
│ │ ├── package.json
│ │ ├── projectName.csproj
│ │ ├── projectName.sln
│ │ ├── server/
│ │ │ ├── AuthServer.cs
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── EmployeeService.cs
│ │ │ │ ├── MockLiveDataService.cs
│ │ │ │ └── employees.json
│ │ │ └── ViewModels/
│ │ │ ├── AppLayout.cs
│ │ │ ├── Dashboard.cs
│ │ │ ├── Form.cs
│ │ │ └── Table.cs
│ │ ├── tsconfig.json
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ ├── 404.html
│ │ └── index.html
│ └── template.nuspec
└── _archive/
├── HelloWorld/
│ ├── HelloWorld.cs
│ ├── HelloWorld.csproj
│ ├── HelloWorld.sln
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── Startup.cs
│ ├── package.json
│ ├── src/
│ │ ├── HelloWorld.jsx
│ │ └── app.js
│ ├── webpack.config.js
│ └── wwwroot/
│ ├── bundle.js
│ └── index.html
├── LiveChart/
│ ├── IISPublishingSteps.md
│ ├── LiveChart.cs
│ ├── LiveChart.csproj
│ ├── LiveChart.sln
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── Startup.cs
│ ├── compilerconfig.json
│ ├── compilerconfig.json.defaults
│ ├── package.json
│ ├── src/
│ │ ├── LiveChart.jsx
│ │ └── app.js
│ ├── webpack.config.js
│ └── wwwroot/
│ ├── bundle.js
│ └── index.html
├── README.md
├── ReactTemplateTS/
│ ├── .editorconfig
│ ├── README.md
│ ├── content/
│ │ ├── .babelrc
│ │ ├── .gitignore
│ │ ├── .template.config/
│ │ │ └── template.json
│ │ ├── client/
│ │ │ ├── app.tsx
│ │ │ ├── auth.tsx
│ │ │ ├── components/
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── InfoBox.tsx
│ │ │ │ │ ├── RecentActivities.tsx
│ │ │ │ │ ├── ServerUsage.tsx
│ │ │ │ │ ├── Traffic.tsx
│ │ │ │ │ └── Utilization.tsx
│ │ │ │ └── table/
│ │ │ │ ├── InlineEdit.tsx
│ │ │ │ └── Pagination.tsx
│ │ │ ├── routes.tsx
│ │ │ ├── styles/
│ │ │ │ ├── app.css
│ │ │ │ ├── styles.ts
│ │ │ │ └── theme-default.ts
│ │ │ └── views/
│ │ │ ├── App.tsx
│ │ │ ├── AppLayout.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── FormPage.tsx
│ │ │ ├── LoginPage.tsx
│ │ │ └── TablePage.tsx
│ │ ├── dotnetify_react_template.csproj
│ │ ├── dotnetify_react_template.sln
│ │ ├── images.d.ts
│ │ ├── package.json
│ │ ├── server/
│ │ │ ├── AuthServer.cs
│ │ │ ├── Program.cs
│ │ │ ├── Services/
│ │ │ │ ├── EmployeeService.cs
│ │ │ │ ├── MockLiveDataService.cs
│ │ │ │ └── employees.json
│ │ │ ├── Startup.cs
│ │ │ └── ViewModels/
│ │ │ ├── AppLayout.cs
│ │ │ ├── Dashboard.cs
│ │ │ ├── Form.cs
│ │ │ └── Table.cs
│ │ ├── tsconfig.json
│ │ ├── webpack.config.js
│ │ └── wwwroot/
│ │ └── index.html
│ └── template.nuspec
└── Routing/
├── DotNetify.ServerSideRender.cs
├── Program.cs
├── Properties/
│ └── launchSettings.json
├── Routing.csproj
├── Routing.sln
├── Startup.cs
├── ViewModels/
│ ├── Index.cs
│ ├── Page1.cs
│ └── Page2.cs
├── compilerconfig.json
├── compilerconfig.json.defaults
├── package.json
├── src/
│ ├── Index.js
│ ├── Index.jsx
│ ├── app.js
│ └── app.server.js
├── webpack.config.js
└── wwwroot/
├── Index.html
├── Page1.js
├── Page1.jsx
├── Page2.js
├── Page2.jsx
├── Page3.html
└── bundle.js
SYMBOL INDEX (1270 symbols across 101 files)
FILE: MicrofrontendTemplate/Portal/client/components/Login.js
method onConnect (line 46) | onConnect() {
FILE: MicrofrontendTemplate/Portal/client/components/Portal.js
method onConnect (line 43) | onConnect() {
method addApp (line 47) | addApp(newApp) {
function updatePortal (line 72) | function updatePortal(app) {
FILE: MicrofrontendTemplate/Portal/client/loader.js
function importApp (line 33) | function importApp(app) {
FILE: MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs
class LoginController (line 10) | [Route("api/[controller]")]
method LoginController (line 17) | public LoginController(IHttpClientFactory httpClientFactory, IOptions<...
method Post (line 23) | [HttpPost]
method Validate (line 40) | [HttpPost]
FILE: MicrofrontendTemplate/Portal/server/Program.cs
class Program (line 7) | public class Program
method Main (line 9) | public static void Main(string[] args)
method BuildWebHost (line 14) | public static IWebHost BuildWebHost(string[] args) =>
FILE: MicrofrontendTemplate/Portal/server/Startup.cs
class Startup (line 15) | public class Startup
method Startup (line 19) | public Startup(IConfiguration config)
method ConfigureServices (line 24) | public void ConfigureServices(IServiceCollection services)
method Configure (line 53) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js
class ActivitiesCard (line 51) | class ActivitiesCard extends Element {
method render (line 52) | render() {
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js
class InfoCard (line 23) | class InfoCard extends Element {
method render (line 24) | render() {
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs
type ILiveDataService (line 9) | public interface ILiveDataService
class Activity (line 21) | public class Activity
class Customer (line 37) | public class Customer
class MockLiveDataService (line 43) | public class MockLiveDataService : ILiveDataService
method MockLiveDataService (line 63) | public MockLiveDataService()
method GetRandomCustomer (line 123) | private Customer GetRandomCustomer()
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs
class Startup (line 19) | public class Startup
method Startup (line 23) | public Startup(IConfiguration config)
method ConfigureServices (line 28) | public void ConfigureServices(IServiceCollection services)
method Configure (line 40) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs
class Dashboard (line 12) | [Authorize]
method Dashboard (line 19) | public Dashboard(ILiveDataService liveDataService)
method Dispose (line 64) | public override void Dispose()
FILE: MicrofrontendTemplate/ReactFormApp/client/components/Form.js
class CustomerForm (line 7) | class CustomerForm extends React.Component {
method render (line 14) | render() {
FILE: MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js
class NewCustomerDialog (line 4) | class NewCustomerDialog extends React.Component {
method render (line 11) | render() {
FILE: MicrofrontendTemplate/ReactFormApp/server/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs
type NamePrefix (line 8) | public enum NamePrefix
type NameSuffix (line 16) | public enum NameSuffix
type PrimaryPhone (line 26) | public enum PrimaryPhone
type State (line 34) | public enum State
class Customer (line 54) | public class Customer
class NameInfo (line 62) | public class NameInfo
class AddressInfo (line 73) | public class AddressInfo
class PhoneInfo (line 84) | public class PhoneInfo
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs
class CustomerFormData (line 7) | public class CustomerFormData
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs
type ICustomerRepository (line 12) | public interface ICustomerRepository
method GetAll (line 14) | IEnumerable<Customer> GetAll();
method Get (line 16) | Customer Get(int id);
method Add (line 18) | Customer Add(CustomerFormData formData);
method Update (line 20) | Customer Update(int id, CustomerFormData formData);
class CustomerRepository (line 23) | public class CustomerRepository : ICustomerRepository
method GetAll (line 27) | public IEnumerable<Customer> GetAll() => _mockData;
method Get (line 29) | public Customer Get(int id) => _mockData.FirstOrDefault(x => x.Id == id);
method Add (line 31) | public Customer Add(CustomerFormData formData)
method Update (line 49) | public Customer Update(int id, CustomerFormData formData)
method Update (line 59) | private void Update(object record, StringDictionary newValues)
method GenerateMockData (line 66) | private static IList<Customer> GenerateMockData()
FILE: MicrofrontendTemplate/ReactFormApp/server/Startup.cs
class Startup (line 19) | public class Startup
method Startup (line 23) | public Startup(IConfiguration config)
method ConfigureServices (line 28) | public void ConfigureServices(IServiceCollection services)
method Configure (line 40) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs
class AddressForm (line 9) | [Authorize]
method AddressForm (line 14) | public AddressForm()
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs
class CustomerForm (line 10) | [Authorize]
class Contact (line 16) | public class Contact
method CustomerForm (line 26) | public CustomerForm(ICustomerRepository customerRepository)
method OnSubVMCreated (line 51) | public override void OnSubVMCreated(BaseVM subVM)
method Save (line 65) | private bool Save(CustomerFormData formData)
method ToContact (line 75) | private Contact ToContact(Customer customer) => new Contact
method UpdateContact (line 85) | private void UpdateContact(Customer newCustomer)
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs
class NewCustomerForm (line 9) | [Authorize]
method NewCustomerForm (line 16) | public NewCustomerForm(ICustomerRepository customerRepository)
method Dispose (line 24) | public override void Dispose()
method Save (line 29) | public Customer Save(CustomerFormData formData)
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs
class PersonForm (line 9) | [Authorize]
method PersonForm (line 14) | public PersonForm()
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs
class PhoneForm (line 9) | [Authorize]
method PhoneForm (line 14) | public PhoneForm()
FILE: MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js
class TodoList (line 5) | class TodoList extends React.Component {
method constructor (line 6) | constructor() {
method componentDidMount (line 15) | componentDidMount() {
method componentWillUnmount (line 19) | componentWillUnmount() {
method render (line 23) | render() {
FILE: MicrofrontendTemplate/ReactTodoApp/server/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>
FILE: MicrofrontendTemplate/ReactTodoApp/server/Startup.cs
class Startup (line 18) | public class Startup
method Startup (line 22) | public Startup(IConfiguration config)
method ConfigureServices (line 27) | public void ConfigureServices(IServiceCollection services)
method Configure (line 35) | public void Configure(IApplicationBuilder app, IHostingEnvironment env)
FILE: MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs
class TodoList (line 10) | [Authorize]
class Todo (line 15) | public class Todo
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs
class IdentityServerClient (line 12) | public class IdentityServerClient
method RequestClientCredentialsTokenAsync (line 14) | public static async Task<TokenResponse> RequestClientCredentialsTokenA...
method IntrospectTokenAsync (line 26) | public static async Task<IntrospectionResponse> IntrospectTokenAsync(H...
method GetIssuerSigningKeysAsync (line 38) | public static async Task<IEnumerable<SecurityKey>> GetIssuerSigningKey...
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs
class IdentityServerConfig (line 6) | public class IdentityServerConfig
method GetClients (line 12) | public static IEnumerable<Client> GetClients()
method GetApiResources (line 26) | public static IEnumerable<ApiResource> GetApiResources()
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs
class IdentityServerSettings (line 3) | public class IdentityServerSettings
FILE: MicrofrontendTemplate/VueTodoApp/server/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>
FILE: MicrofrontendTemplate/VueTodoApp/server/Startup.cs
class Startup (line 18) | public class Startup
method Startup (line 22) | public Startup(IConfiguration config)
method ConfigureServices (line 27) | public void ConfigureServices(IServiceCollection services)
method Configure (line 35) | public void Configure(IApplicationBuilder app, IHostingEnvironment env)
FILE: MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs
class TodoList (line 10) | [Authorize]
class Todo (line 15) | public class Todo
FILE: ReactTemplate/content/client/auth.ts
class Auth (line 1) | class Auth {
method signIn (line 4) | signIn(username: string, password: string): Promise<void> {
method signOut (line 20) | signOut() {
method getAccessToken (line 25) | getAccessToken(): string {
method hasAccessToken (line 29) | hasAccessToken(): boolean {
FILE: ReactTemplate/content/client/components/BasePage.tsx
type IBasePageProps (line 6) | interface IBasePageProps {
function BasePage (line 12) | function BasePage({ title, navigation, children }: IBasePageProps) {
FILE: ReactTemplate/content/client/components/Header.tsx
type IHeaderProps (line 35) | interface IHeaderProps {
function Header (line 40) | function Header({ styles, onSidebarToggle }: IHeaderProps) {
FILE: ReactTemplate/content/client/components/Sidebar.tsx
type ISidebarProps (line 60) | interface ISidebarProps {
function Sidebar (line 69) | function Sidebar({ vm, logoTitle, open, userName, userAvatarUrl, menus }...
FILE: ReactTemplate/content/client/components/dashboard/InfoBox.tsx
type IInfoBoxProps (line 40) | interface IInfoBoxProps {
function InfoBox (line 47) | function InfoBox({ icon, color, title, value }: IInfoBoxProps) {
FILE: ReactTemplate/content/client/components/dashboard/RecentActivities.tsx
class ActivityModel (line 29) | class ActivityModel {
type IRecentActivitiesProps (line 35) | interface IRecentActivitiesProps {
function RecentActivities (line 40) | function RecentActivities({ vm, data }: IRecentActivitiesProps) {
FILE: ReactTemplate/content/client/components/dashboard/ServerUsage.tsx
type IServerUsageProps (line 42) | interface IServerUsageProps {
function ServerUsage (line 47) | function ServerUsage(props: IServerUsageProps) {
FILE: ReactTemplate/content/client/components/dashboard/Traffic.tsx
type ITrafficProps (line 36) | interface ITrafficProps {
function Traffic (line 40) | function Traffic(props: ITrafficProps) {
FILE: ReactTemplate/content/client/components/dashboard/Utilization.tsx
type IUtilizationProps (line 46) | interface IUtilizationProps {
function Utilization (line 51) | function Utilization(props: IUtilizationProps) {
FILE: ReactTemplate/content/client/components/table/InlineEdit.tsx
type IInlineEditProps (line 6) | interface IInlineEditProps {
class InlineEditState (line 11) | class InlineEditState {
class InlineEdit (line 17) | class InlineEdit extends React.Component<IInlineEditProps, InlineEditSta...
method constructor (line 20) | constructor(props: IInlineEditProps) {
method render (line 24) | render() {
FILE: ReactTemplate/content/client/components/table/Pagination.tsx
type IPaginationProps (line 15) | interface IPaginationProps {
function Pagination (line 22) | function Pagination(props: IPaginationProps) {
FILE: ReactTemplate/content/client/views/App.tsx
function App (line 6) | function App() {
FILE: ReactTemplate/content/client/views/AppLayout.tsx
class AppLayoutModel (line 12) | class AppLayoutModel {
type IAppLayoutProps (line 19) | interface IAppLayoutProps {
class AppLayout (line 23) | class AppLayout extends React.Component<IAppLayoutProps, AppLayoutModel> {
method constructor (line 27) | constructor(props: IAppLayoutProps) {
method componentWillUnmount (line 41) | componentWillUnmount() {
method componentDidUpdate (line 45) | componentDidUpdate(prevProps: IAppLayoutProps) {
method render (line 49) | render() {
FILE: ReactTemplate/content/client/views/Dashboard.tsx
class DashboardModel (line 18) | class DashboardModel {
class Dashboard (line 31) | class Dashboard extends React.Component<any, DashboardModel> {
method constructor (line 36) | constructor(props: any) {
method componentWillUnmount (line 47) | componentWillUnmount() {
method render (line 51) | render() {
FILE: ReactTemplate/content/client/views/FormPage.tsx
class EmployeeModel (line 28) | class EmployeeModel {
class FormPageModel (line 34) | class FormPageModel {
class FormPageState (line 41) | class FormPageState extends FormPageModel {
class FormPage (line 45) | class FormPage extends React.Component<any, FormPageState> {
method constructor (line 51) | constructor(props: any) {
method componentWillUnmount (line 58) | componentWillUnmount() {
method render (line 62) | render() {
FILE: ReactTemplate/content/client/views/LoginPage.tsx
type ILoginPageProps (line 46) | interface ILoginPageProps {
function LoginPage (line 50) | function LoginPage({ onAuthenticated }: ILoginPageProps) {
FILE: ReactTemplate/content/client/views/TablePage.tsx
class EmployeeModel (line 31) | class EmployeeModel {
class TablePageModel (line 37) | class TablePageModel {
class TablePageState (line 45) | class TablePageState extends TablePageModel {
class TablePage (line 49) | class TablePage extends React.Component<any, TablePageState> {
method constructor (line 54) | constructor(props: any) {
method componentWillUnmount (line 60) | componentWillUnmount() {
method render (line 64) | render() {
FILE: ReactTemplate/content/server/AuthServer.cs
class AuthServer (line 11) | public static class AuthServer
method AddAuthenticationServer (line 16) | public static void AddAuthenticationServer(this IServiceCollection ser...
FILE: ReactTemplate/content/server/Services/EmployeeService.cs
type IEmployeeService (line 6) | public interface IEmployeeService
method GetAll (line 8) | IList<EmployeeModel> GetAll();
method GetById (line 10) | EmployeeModel GetById(int id);
method Add (line 12) | int Add(EmployeeModel record);
method Update (line 14) | void Update(EmployeeModel record);
method Delete (line 16) | void Delete(int id);
class EmployeeModel (line 19) | public class EmployeeModel
class EmployeeService (line 28) | public class EmployeeService : IEmployeeService
method EmployeeService (line 33) | public EmployeeService()
method GetAll (line 39) | public IList<EmployeeModel> GetAll() => _employees;
method GetById (line 41) | public EmployeeModel GetById(int id) => _employees.FirstOrDefault(i =>...
method Add (line 43) | public int Add(EmployeeModel record)
method Update (line 50) | public void Update(EmployeeModel record)
method Delete (line 57) | public void Delete(int id) => _employees.Remove(_employees.FirstOrDefa...
method GetEmbeddedResource (line 59) | private string GetEmbeddedResource(string resourceName)
FILE: ReactTemplate/content/server/Services/MockLiveDataService.cs
type ILiveDataService (line 5) | public interface ILiveDataService
class Activity (line 17) | public class Activity
class MockLiveDataService (line 24) | public class MockLiveDataService : ILiveDataService
method MockLiveDataService (line 52) | public MockLiveDataService(IEmployeeService employeeService)
method GetRandomEmployee (line 112) | private EmployeeModel GetRandomEmployee(IEmployeeService employeeService)
FILE: ReactTemplate/content/server/ViewModels/AppLayout.cs
class AppLayout (line 8) | [Authorize]
type Route (line 11) | private enum Route
method AppLayout (line 33) | public AppLayout(IPrincipalAccessor principalAccessor)
FILE: ReactTemplate/content/server/ViewModels/Dashboard.cs
class Dashboard (line 8) | [Authorize]
class Activity (line 13) | public class Activity
method Dashboard (line 25) | public Dashboard(ILiveDataService liveDataService)
method Dispose (line 58) | public override void Dispose()
FILE: ReactTemplate/content/server/ViewModels/Form.cs
class Form (line 7) | [Authorize]
class EmployeeInfo (line 12) | public class EmployeeInfo
class SavedEmployeeInfo (line 19) | public class SavedEmployeeInfo
method Form (line 71) | public Form(IEmployeeService employeeService)
method LoadEmployee (line 82) | private void LoadEmployee(int id)
FILE: ReactTemplate/content/server/ViewModels/Table.cs
class Table (line 9) | [Authorize]
class EmployeeInfo (line 15) | public class EmployeeInfo
method Table (line 117) | public Table(IEmployeeService employeeService)
method Paginate (line 122) | private IEnumerable<EmployeeInfo> Paginate(IEnumerable<EmployeeInfo> e...
method GetPageCount (line 134) | private int GetPageCount(int records) => (int)Math.Ceiling(records / (...
FILE: _archive/HelloWorld/HelloWorld.cs
class HelloWorld (line 7) | public class HelloWorld : BaseVM
class Person (line 9) | public class Person
method HelloWorld (line 19) | public HelloWorld()
method Dispose (line 28) | public override void Dispose() => _timer.Dispose();
FILE: _archive/HelloWorld/Program.cs
class Program (line 13) | public class Program
method Main (line 15) | public static void Main(string[] args)
method CreateWebHostBuilder (line 20) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
FILE: _archive/HelloWorld/Startup.cs
class Startup (line 12) | public class Startup
method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
method Configure (line 21) | public void Configure(IApplicationBuilder app)
FILE: _archive/HelloWorld/src/HelloWorld.jsx
class HelloWorld (line 4) | class HelloWorld extends React.Component {
method constructor (line 5) | constructor(props) {
method render (line 15) | render() {
FILE: _archive/HelloWorld/wwwroot/bundle.js
function hotDisposeChunk (line 2) | function hotDisposeChunk(chunkId) {
function hotDownloadUpdateChunk (line 13) | function hotDownloadUpdateChunk(chunkId) {
function hotDownloadManifest (line 23) | function hotDownloadManifest(requestTimeout) {
function hotCreateRequire (line 77) | function hotCreateRequire(moduleId) {
function hotCreateModule (line 153) | function hotCreateModule(moduleId) {
function hotSetStatus (line 216) | function hotSetStatus(newStatus) {
function toModuleId (line 233) | function toModuleId(id) {
function hotCheck (line 238) | function hotCheck(apply) {
function hotAddUpdateChunk (line 280) | function hotAddUpdateChunk(chunkId, moreModules) {
function hotEnsureUpdateChunk (line 294) | function hotEnsureUpdateChunk(chunkId) {
function hotUpdateDownloaded (line 304) | function hotUpdateDownloaded() {
function hotApply (line 336) | function hotApply(options) {
function __webpack_require__ (line 708) | function __webpack_require__(moduleId) {
FILE: _archive/LiveChart/LiveChart.cs
class LiveChart (line 8) | public class LiveChart : BaseVM
method LiveChart (line 13) | public LiveChart()
method Dispose (line 28) | public override void Dispose() => _subscription.Dispose();
FILE: _archive/LiveChart/Program.cs
class Program (line 13) | public class Program
method Main (line 15) | public static void Main(string[] args)
method CreateWebHostBuilder (line 20) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
FILE: _archive/LiveChart/Startup.cs
class Startup (line 12) | public class Startup
method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
method Configure (line 21) | public void Configure(IApplicationBuilder app)
FILE: _archive/LiveChart/src/LiveChart.jsx
class LiveChart (line 5) | class LiveChart extends React.Component {
method constructor (line 6) | constructor(props) {
method componentWillUnmount (line 12) | componentWillUnmount() {
method shouldComponentUpdate (line 16) | shouldComponentUpdate(_, nextState) {
method render (line 24) | render() {
FILE: _archive/LiveChart/wwwroot/bundle.js
function hotDisposeChunk (line 2) | function hotDisposeChunk(chunkId) {
function hotDownloadUpdateChunk (line 13) | function hotDownloadUpdateChunk(chunkId) {
function hotDownloadManifest (line 23) | function hotDownloadManifest(requestTimeout) {
function hotCreateRequire (line 77) | function hotCreateRequire(moduleId) {
function hotCreateModule (line 153) | function hotCreateModule(moduleId) {
function hotSetStatus (line 216) | function hotSetStatus(newStatus) {
function toModuleId (line 233) | function toModuleId(id) {
function hotCheck (line 238) | function hotCheck(apply) {
function hotAddUpdateChunk (line 280) | function hotAddUpdateChunk(chunkId, moreModules) {
function hotEnsureUpdateChunk (line 294) | function hotEnsureUpdateChunk(chunkId) {
function hotUpdateDownloaded (line 304) | function hotUpdateDownloaded() {
function hotApply (line 336) | function hotApply(options) {
function __webpack_require__ (line 708) | function __webpack_require__(moduleId) {
FILE: _archive/ReactTemplateTS/content/client/auth.tsx
class Auth (line 1) | class Auth {
method signIn (line 4) | signIn(username, password) {
method signOut (line 20) | signOut() {
method getAccessToken (line 25) | getAccessToken() {
method hasAccessToken (line 29) | hasAccessToken() {
FILE: _archive/ReactTemplateTS/content/client/components/Header.tsx
type Props (line 15) | type Props = {
FILE: _archive/ReactTemplateTS/content/client/components/Sidebar.tsx
type Props (line 10) | type Props = {
FILE: _archive/ReactTemplateTS/content/client/components/dashboard/InfoBox.tsx
type Props (line 6) | type Props = {
class InfoBox (line 12) | class InfoBox extends React.Component<Props, any> {
method render (line 13) | render() {
FILE: _archive/ReactTemplateTS/content/client/components/table/InlineEdit.tsx
type State (line 7) | type State = {
type Props (line 12) | type Props = {
class InlineEdit (line 16) | class InlineEdit extends React.Component<Props, State> {
method constructor (line 17) | constructor(props) {
method render (line 25) | render() {
FILE: _archive/ReactTemplateTS/content/client/views/App.tsx
type State (line 6) | type State = {
type Props (line 9) | type Props = {
class App (line 12) | class App extends React.Component<any, any> {
method constructor (line 13) | constructor(props) {
method render (line 18) | render(): JSX.Element {
FILE: _archive/ReactTemplateTS/content/client/views/AppLayout.tsx
type State (line 10) | type State = {};
type Props (line 11) | type Props = {
class AppLayout (line 17) | class AppLayout extends React.Component<any, any> {
method constructor (line 19) | constructor(props) {
method componentWillUnmount (line 34) | componentWillUnmount() {
method componentWillReceiveProps (line 38) | componentWillReceiveProps(nextProps) {
method render (line 44) | render() {
FILE: _archive/ReactTemplateTS/content/client/views/Dashboard.tsx
type State (line 17) | type State = {
type Props (line 29) | type Props = {};
class Dashboard (line 30) | class Dashboard extends React.Component<any, State> {
method constructor (line 33) | constructor(props) {
method componentWillUnmount (line 53) | componentWillUnmount() {
method render (line 57) | render() {
FILE: _archive/ReactTemplateTS/content/client/views/FormPage.tsx
type State (line 14) | type State = {
type Props (line 21) | type Props = {};
class FormPage (line 22) | class FormPage extends React.Component<Props, State> {
method constructor (line 26) | constructor(props) {
method componentWillUnmount (line 40) | componentWillUnmount() {
method render (line 44) | render() {
FILE: _archive/ReactTemplateTS/content/client/views/LoginPage.tsx
type Props (line 9) | type Props = {
type State (line 12) | type State = {
class LoginPage (line 17) | class LoginPage extends React.Component<Props, State> {
method constructor (line 18) | constructor(props) {
method render (line 23) | render() {
FILE: _archive/ReactTemplateTS/content/client/views/TablePage.tsx
type Props (line 18) | type Props = {};
type State (line 19) | type State = {
class TablePage (line 26) | class TablePage extends React.Component<Props, State> {
method constructor (line 29) | constructor(state, props) {
method componentWillUnmount (line 43) | componentWillUnmount() {
method render (line 47) | render() {
FILE: _archive/ReactTemplateTS/content/server/AuthServer.cs
class AuthServer (line 13) | public static class AuthServer
method AddAuthenticationServer (line 18) | public static void AddAuthenticationServer(this IServiceCollection ser...
FILE: _archive/ReactTemplateTS/content/server/Program.cs
class Program (line 13) | public class Program
method Main (line 15) | public static void Main(string[] args)
method BuildWebHost (line 20) | public static IWebHost BuildWebHost(string[] args) =>
FILE: _archive/ReactTemplateTS/content/server/Services/EmployeeService.cs
type IEmployeeService (line 10) | public interface IEmployeeService
method GetAll (line 12) | IList<EmployeeModel> GetAll();
method GetById (line 13) | EmployeeModel GetById(int id);
method Add (line 14) | int Add(EmployeeModel record);
method Update (line 15) | void Update(EmployeeModel record);
method Delete (line 16) | void Delete(int id);
class EmployeeModel (line 19) | public class EmployeeModel
class EmployeeService (line 28) | public class EmployeeService : IEmployeeService
method EmployeeService (line 33) | public EmployeeService()
method GetAll (line 39) | public IList<EmployeeModel> GetAll() => _employees;
method GetById (line 41) | public EmployeeModel GetById(int id) => _employees.FirstOrDefault(i =>...
method Add (line 43) | public int Add(EmployeeModel record)
method Update (line 50) | public void Update(EmployeeModel record)
method Delete (line 57) | public void Delete(int id) => _employees.Remove(_employees.FirstOrDefa...
method GetEmbeddedResource (line 59) | private string GetEmbeddedResource(string resourceName)
FILE: _archive/ReactTemplateTS/content/server/Services/MockLiveDataService.cs
type ILiveDataService (line 8) | public interface ILiveDataService
class Activity (line 20) | public class Activity
class MockLiveDataService (line 27) | public class MockLiveDataService : ILiveDataService
method MockLiveDataService (line 55) | public MockLiveDataService(IEmployeeService employeeService)
method GetRandomEmployee (line 115) | private EmployeeModel GetRandomEmployee(IEmployeeService employeeService)
FILE: _archive/ReactTemplateTS/content/server/Startup.cs
class Startup (line 15) | public class Startup
method ConfigureServices (line 17) | public void ConfigureServices(IServiceCollection services)
method Configure (line 29) | public void Configure(IApplicationBuilder app)
FILE: _archive/ReactTemplateTS/content/server/ViewModels/AppLayout.cs
class AppLayout (line 10) | [Authorize]
type Route (line 13) | private enum Route
method AppLayout (line 35) | public AppLayout(IPrincipalAccessor principalAccessor)
FILE: _archive/ReactTemplateTS/content/server/ViewModels/Dashboard.cs
class Dashboard (line 11) | [Authorize]
class Activity (line 16) | public class Activity
method Dashboard (line 28) | public Dashboard(ILiveDataService liveDataService)
method Dispose (line 61) | public override void Dispose()
FILE: _archive/ReactTemplateTS/content/server/ViewModels/Form.cs
class Form (line 10) | [Authorize]
class EmployeeInfo (line 15) | public class EmployeeInfo
class SavedEmployeeInfo (line 22) | public class SavedEmployeeInfo
method Form (line 74) | public Form(IEmployeeService employeeService)
method LoadEmployee (line 85) | private void LoadEmployee(int id)
FILE: _archive/ReactTemplateTS/content/server/ViewModels/Table.cs
class Table (line 9) | [Authorize]
class EmployeeInfo (line 15) | public class EmployeeInfo
method Table (line 116) | public Table(IEmployeeService employeeService)
method Paginate (line 121) | private IEnumerable<EmployeeInfo> Paginate(IEnumerable<EmployeeInfo> e...
method GetPageCount (line 133) | private int GetPageCount(int records) => (int)Math.Ceiling(records / (...
FILE: _archive/Routing/DotNetify.ServerSideRender.cs
class ServerSideRender (line 9) | public static class ServerSideRender
method GetInitialStates (line 11) | public static string GetInitialStates(ref string path, Type entryVMType)
FILE: _archive/Routing/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method CreateWebHostBuilder (line 13) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
FILE: _archive/Routing/Startup.cs
class Startup (line 12) | public class Startup
method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
method Configure (line 22) | public void Configure(IApplicationBuilder app, INodeServices nodeServi...
FILE: _archive/Routing/ViewModels/Index.cs
class Index (line 8) | public class Index : BaseVM, IRoutable
method Index (line 19) | public Index()
FILE: _archive/Routing/ViewModels/Page1.cs
class Page1 (line 8) | public class Page1 : BaseVM, IRoutable
method Page1 (line 16) | public Page1()
FILE: _archive/Routing/ViewModels/Page2.cs
class Page2 (line 9) | public class Page2 : BaseVM, IRoutable
method Page2 (line 19) | public Page2()
class Page2Item (line 29) | public class Page2Item : BaseVM, IRoutable
method Page2Item (line 34) | public Page2Item()
FILE: _archive/Routing/src/Index.js
function defineProperties (line 7) | function defineProperties(target, props) { for (var i = 0; i < props.len...
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _classCallCheck (line 13) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _inherits (line 15) | function _inherits(subClass, superClass) { if (typeof superClass !== 'fu...
function Index (line 30) | function Index(props) {
function Home (line 84) | function Home() {
FILE: _archive/Routing/src/Index.jsx
class Index (line 5) | class Index extends React.Component {
method constructor (line 6) | constructor(props) {
method componentWillUnmount (line 13) | componentWillUnmount() {
method render (line 16) | render() {
class Home (line 33) | class Home extends React.Component {
method render (line 34) | render() {
FILE: _archive/Routing/wwwroot/Page1.js
function defineProperties (line 3) | function defineProperties(target, props) { for (var i = 0; i < props.len...
function _classCallCheck (line 7) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _inherits (line 9) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function Page1 (line 14) | function Page1(props) {
function Page1A (line 81) | function Page1A() {
function Page1B (line 113) | function Page1B() {
FILE: _archive/Routing/wwwroot/Page1.jsx
class Page1 (line 1) | class Page1 extends React.Component {
method constructor (line 2) | constructor(props) {
method componentWillUnmount (line 8) | componentWillUnmount() {
method render (line 12) | render() {
class Page1A (line 36) | class Page1A extends React.Component {
method render (line 37) | render() {
class Page1B (line 47) | class Page1B extends React.Component {
method render (line 48) | render() {
FILE: _archive/Routing/wwwroot/Page2.js
function defineProperties (line 3) | function defineProperties(target, props) { for (var i = 0; i < props.len...
function _classCallCheck (line 7) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _inherits (line 9) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function Page2 (line 14) | function Page2(props) {
function Page2Item (line 104) | function Page2Item(props) {
FILE: _archive/Routing/wwwroot/Page2.jsx
class Page2 (line 1) | class Page2 extends React.Component {
method constructor (line 2) | constructor(props) {
method componentWillUnmount (line 22) | componentWillUnmount() {
method render (line 26) | render() {
class Page2Item (line 63) | class Page2Item extends React.Component {
method constructor (line 64) | constructor(props) {
method componentWillUnmount (line 69) | componentWillUnmount() {
method render (line 72) | render() {
FILE: _archive/Routing/wwwroot/bundle.js
function t (line 1) | function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{...
function n (line 1) | function n(){throw new Error("setTimeout has not been defined")}
function o (line 1) | function o(){throw new Error("clearTimeout has not been defined")}
function r (line 1) | function r(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&s...
function i (line 1) | function i(e){if(d===clearTimeout)return clearTimeout(e);if((d===o||!d)&...
function a (line 1) | function a(){m&&f&&(m=!1,f.length?h=f.concat(h):v=-1,h.length&&s())}
function s (line 1) | function s(){if(!m){var e=r(a);m=!0;for(var t=h.length;t;){for(f=h,h=[];...
function u (line 1) | function u(e,t){this.fun=e,this.array=t}
function l (line 1) | function l(){}
function n (line 1) | function n(e,t,n,r,i,a,s,u){if(o(t),!e){var l;if(void 0===t)l=new Error(...
function o (line 1) | function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+...
function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
function e (line 1) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 1) | function o(e){if(null===e||void 0===e)throw new TypeError("Object.assign...
function r (line 1) | function r(){try{if(!Object.assign)return!1;var e=new String("abc");if(e...
function o (line 6) | function o(e,t){return 1===e.nodeType&&e.getAttribute(m)===String(t)||8=...
function r (line 6) | function r(e){for(var t;t=e._renderedComponent;)e=t;return e}
function i (line 6) | function i(e,t){var n=r(e);n._hostNode=t,t[y]=n}
function a (line 6) | function a(e){var t=e._hostNode;t&&(delete t[y],e._hostNode=null)}
function s (line 6) | function s(e,n){if(!(e._flags&v.hasCachedChildNodes)){var a=e._renderedC...
function u (line 6) | function u(e){if(e[y])return e[y];for(var t=[];!e[y];){if(t.push(e),!e.p...
function l (line 6) | function l(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}
function c (line 6) | function c(e){if(void 0===e._hostNode&&("production"!==t.env.NODE_ENV?h(...
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e){var t=Function.prototype.toString,n=Object.prototype.hasOw...
function r (line 6) | function r(e){var t=l(e);if(t){var n=t.childIDs;c(e),n.forEach(r)}}
function i (line 6) | function i(e,t,n){return"\n in "+(e||"Unknown")+(t?" (at "+t.fileName...
function a (line 6) | function a(e){return null==e?"#empty":"string"==typeof e||"number"==type...
function s (line 6) | function s(e){var n,o=N.getDisplayName(e),r=N.getElement(e),a=N.getOwner...
function o (line 6) | function o(e){return function(){return e}}
function o (line 6) | function o(){O.ReactReconcileTransaction&&w||("production"!==t.env.NODE_...
function r (line 6) | function r(){this.reinitializeTransaction(),this.dirtyComponentsLength=n...
function i (line 6) | function i(e,t,n,r,i,a){return o(),w.batchedUpdates(e,t,n,r,i,a)}
function a (line 6) | function a(e,t){return e._mountOrder-t._mountOrder}
function s (line 6) | function s(e){var n=e.dirtyComponentsLength;n!==g.length&&("production"!...
function u (line 6) | function u(e){if(o(),!w.isBatchingUpdates)return void w.batchedUpdates(u...
function l (line 6) | function l(e,n){w.isBatchingUpdates||("production"!==t.env.NODE_ENV?y(!1...
function o (line 6) | function o(e,n,o,r){"production"!==t.env.NODE_ENV&&(delete this.nativeEv...
function r (line 6) | function r(e,n){function o(e){return i(a?"setting the method":"setting t...
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e,t){return(e&t)===t}
function o (line 6) | function o(e){if("production"!==t.env.NODE_ENV&&f.call(e,"ref")){var n=O...
function r (line 6) | function r(e){if("production"!==t.env.NODE_ENV&&f.call(e,"key")){var n=O...
function i (line 6) | function i(e,n){var o=function(){s||(s=!0,"production"!==t.env.NODE_ENV&...
function a (line 6) | function a(e,n){var o=function(){u||(u=!0,"production"!==t.env.NODE_ENV&...
function o (line 6) | function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+...
function o (line 6) | function o(e,t,n){return n?[e,t]:e}
function o (line 6) | function o(e){if(v){var t=e.node,n=e.children;if(n.length)for(var o=0;o<...
function r (line 6) | function r(e,t){e.parentNode.replaceChild(t.node,e),o(t)}
function i (line 6) | function i(e,t){v?e.children.push(t):e.node.appendChild(t.node)}
function a (line 6) | function a(e,t){v?e.html=t:d(e.node,t)}
function s (line 6) | function s(e,t){v?e.text=t:f(e.node,t)}
function u (line 6) | function u(){return this.node.nodeName}
function l (line 6) | function l(e){return{node:e,children:[],html:null,text:null,toString:u}}
function o (line 6) | function o(){r.attachRefs(this,this._currentElement)}
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}
function r (line 6) | function r(e,t){if(o(e,t))return!0;if("object"!=typeof e||null===e||"obj...
function o (line 6) | function o(e){return"button"===e||"input"===e||"select"===e||"textarea"=...
function r (line 6) | function r(e,t,n){switch(e){case"onClick":case"onClickCapture":case"onDo...
function o (line 6) | function o(e,t,n){var o=t.dispatchConfig.phasedRegistrationNames[n];retu...
function r (line 6) | function r(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NO...
function i (line 6) | function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.traverseTwo...
function a (line 6) | function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._t...
function s (line 6) | function s(e,t,n){if(n&&n.dispatchConfig.registrationName){var o=n.dispa...
function u (line 6) | function u(e){e&&e.dispatchConfig.registrationName&&s(e._targetInst,null...
function l (line 6) | function l(e){v(e,i)}
function c (line 6) | function c(e){v(e,a)}
function d (line 6) | function d(e,t,n,o){h.traverseEnterLeave(n,o,s,e,t)}
function p (line 6) | function p(e){v(e,u)}
function o (line 6) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(){if(u)for(var e in l){var n=l[e],o=u.indexOf(e);if(o>-1||("p...
function r (line 6) | function r(e,n,o){c.eventNameDispatchConfigs.hasOwnProperty(o)&&("produc...
function i (line 6) | function i(e,n,o){if(c.registrationNameModules[e]&&("production"!==t.env...
function o (line 6) | function o(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=f+...
function o (line 6) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 6) | function o(e){var t=""+e,n=i.exec(t);if(!n)return t;var o,r="",a=0,s=0;f...
function r (line 6) | function r(e){return"boolean"==typeof e||"number"==typeof e?""+e:o(e)}
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 6) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function i (line 6) | function i(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
function a (line 6) | function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
function e (line 6) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
function t (line 6) | function t(e){r(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf...
function t (line 6) | function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf...
function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 6) | function o(e){return"string"==typeof e&&r.test(e)}
function o (line 6) | function o(e){return e.charAt(0).toUpperCase()+e.slice(1)}
function n (line 6) | function n(e){if(e&&"object"==typeof e){var t=e.which||e.keyCode||e.char...
function o (line 9) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 9) | function r(){if(!A){var e=document.createElement("style");e.innerHTML="\...
function i (line 9) | function i(){R||(N.default.on(window,"keydown",function(e){L="tab"===(0,...
function t (line 9) | function t(){var e,n,o,r;(0,f.default)(this,t);for(var i=arguments.lengt...
function o (line 9) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 9) | function r(e,t,n){return e<t?t:e>n?n:e}
function i (line 9) | function i(e){var t=e.type,n=e.values;if(t.indexOf("rgb")>-1)for(var o=0...
function a (line 9) | function a(e){if(4===e.length){for(var t="#",n=1;n<e.length;n++)t+=e.cha...
function s (line 9) | function s(t){if("#"===t.charAt(0))return s(a(t));var n=t.indexOf("(");"...
function u (line 9) | function u(e,t){var n=l(e),o=l(t),r=(Math.max(n,o)+.05)/(Math.min(n,o)+....
function l (line 9) | function l(e){if(e=s(e),e.type.indexOf("rgb")>-1){var t=e.values.map(fun...
function c (line 9) | function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
function d (line 9) | function d(e,t){return e=s(e),t=r(t,0,1),"rgb"!==e.type&&"hsl"!==e.type|...
function p (line 9) | function p(e,t){if(e=s(e),t=r(t,0,1),e.type.indexOf("hsl")>-1)e.values[2...
function f (line 9) | function f(e,t){if(e=s(e),t=r(t,0,1),e.type.indexOf("hsl")>-1)e.values[2...
function o (line 9) | function o(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firs...
function r (line 9) | function r(e,t,n){c.insertTreeBefore(e,t,n)}
function i (line 9) | function i(e,t,n){Array.isArray(t)?s(e,t[0],t[1],n):y(e,t,n)}
function a (line 9) | function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],u(e,t,n),e.remove...
function s (line 9) | function s(e,t,n,o){for(var r=t;;){var i=r.nextSibling;if(y(e,r,o),r===n...
function u (line 9) | function u(e,t,n){for(;;){var o=t.nextSibling;if(o===n)break;e.removeChi...
function l (line 9) | function l(e,n,o){var r=e.parentNode,i=e.nextSibling;i===n?o&&y(r,docume...
function o (line 9) | function o(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel...
function r (line 9) | function r(e){return"topMouseMove"===e||"topTouchMove"===e}
function i (line 9) | function i(e){return"topMouseDown"===e||"topTouchStart"===e}
function a (line 9) | function a(e,t,n,o){var r=e.type||"unknown-event";e.currentTarget=_.getN...
function s (line 9) | function s(e,n){var o=e._dispatchListeners,r=e._dispatchInstances;if("pr...
function u (line 9) | function u(e){var n=e._dispatchListeners,o=e._dispatchInstances;if("prod...
function l (line 9) | function l(e){var t=u(e);return e._dispatchInstances=null,e._dispatchLis...
function c (line 9) | function c(e){"production"!==t.env.NODE_ENV&&h(e);var n=e._dispatchListe...
function d (line 9) | function d(e){return!!e._dispatchListeners}
function o (line 9) | function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g...
function r (line 9) | function r(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[...
function o (line 9) | function o(e){null!=e.checkedLink&&null!=e.valueLink&&("production"!==t....
function r (line 9) | function r(e){o(e),(null!=e.value||null!=e.onChange)&&("production"!==t....
function i (line 9) | function i(e){o(e),(null!=e.checked||null!=e.onChange)&&("production"!==...
function a (line 9) | function a(e){if(e){var t=e.getName();if(t)return" Check the render meth...
function n (line 9) | function n(e,t,n){try{t(n)}catch(e){null===o&&(o=e)}}
function o (line 9) | function o(e){c.enqueueUpdate(e)}
function r (line 9) | function r(e){var t=typeof e;if("object"!==t)return t;var n=e.constructo...
function i (line 9) | function i(e,n){var o=u.get(e);if(!o){if("production"!==t.env.NODE_ENV){...
function o (line 9) | function o(e){var t,n=e.keyCode;return"charCode"in e?0===(t=e.charCode)&...
function o (line 9) | function o(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n....
function r (line 9) | function r(e){return o}
function o (line 9) | function o(e){var t=e.target||e.srcElement||window;return t.correspondin...
function o (line 23) | function o(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))ret...
function o (line 23) | function o(e,t){var n=null===e||!1===e,o=null===t||!1===t;if(n||o)return...
function o (line 23) | function o(e,t,n){this.props=e,this.context=t,this.refs=s,this.updater=n...
function o (line 23) | function o(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"p...
function o (line 23) | function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}
function n (line 23) | function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbo...
function o (line 23) | function o(t){return"function"==typeof Symbol&&"symbol"===n(Symbol.itera...
function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 23) | function r(e){return(0,a.default)(e)}
function e (line 30) | function e(){throw new Error("Dynamic requires are not currently support...
function o (line 30) | function o(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.ca...
function r (line 30) | function r(e,t){return t={exports:{}},e(t,t.exports),t.exports}
function i (line 30) | function i(e,t){function n(){this.constructor=e}C(e,t),e.prototype=null=...
function a (line 30) | function a(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty....
function s (line 30) | function s(e,t,n,o){var r,i=arguments.length,a=i<3?t:null===o?o=Object.g...
function u (line 30) | function u(e,t){return function(n,o){t(n,o,e)}}
function l (line 30) | function l(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect....
function c (line 30) | function c(e,t,n,o){return new(n||(n=Promise))(function(r,i){function a(...
function d (line 30) | function d(e,t){function n(e){return function(t){return o([e,t])}}functi...
function p (line 30) | function p(e,t){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}
function f (line 30) | function f(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;re...
function h (line 30) | function h(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!...
function m (line 30) | function m(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(h(argume...
function v (line 30) | function v(e){return this instanceof v?(this.v=e,this):new v(e)}
function y (line 30) | function y(e,t,n){function o(e){c[e]&&(l[e]=function(t){return new Promi...
function g (line 30) | function g(e){function t(t,r){e[t]&&(n[t]=function(n){return(o=!o)?{valu...
function b (line 30) | function b(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.async...
function _ (line 30) | function _(e,t){return Object.defineProperty?Object.defineProperty(e,"ra...
function E (line 30) | function E(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n ...
function w (line 30) | function w(e){return e&&e.__esModule?e:{default:e}}
function t (line 37) | function t(e){var t=typeof e;return null!==e&&("object"===t||"function"=...
function o (line 37) | function o(e){return"function"==typeof e}
function r (line 37) | function r(e){$=e}
function i (line 37) | function i(e){Y=e}
function a (line 37) | function a(){return function(){return n.nextTick(d)}}
function s (line 37) | function s(){return void 0!==K?function(){K(d)}:c()}
function u (line 37) | function u(){var e=0,t=new J(d),n=document.createTextNode("");return t.o...
function l (line 37) | function l(){var e=new MessageChannel;return e.port1.onmessage=d,functio...
function c (line 37) | function c(){var e=setTimeout;return function(){return e(d,1)}}
function d (line 37) | function d(){for(var e=0;e<z;e+=2){(0,ee[e])(ee[e+1]),ee[e]=void 0,ee[e+...
function p (line 37) | function p(){try{var t=e,n=t("vertx");return K=n.runOnLoop||n.runOnConte...
function f (line 37) | function f(e,t){var n=this,o=new this.constructor(m);void 0===o[ne]&&R(o...
function h (line 37) | function h(e){var t=this;if(e&&"object"==typeof e&&e.constructor===t)ret...
function m (line 37) | function m(){}
function v (line 37) | function v(){return new TypeError("You cannot resolve a promise with its...
function y (line 37) | function y(){return new TypeError("A promises callback cannot return tha...
function g (line 37) | function g(e){try{return e.then}catch(e){return ae.error=e,ae}}
function b (line 37) | function b(e,t,n,o){try{e.call(t,n,o)}catch(e){return e}}
function _ (line 37) | function _(e,t,n){Y(function(e){var o=!1,r=b(n,t,function(n){o||(o=!0,t!...
function E (line 37) | function E(e,t){t._state===re?T(e,t._result):t._state===ie?N(e,t._result...
function w (line 37) | function w(e,t,n){t.constructor===e.constructor&&n===f&&t.constructor.re...
function C (line 37) | function C(e,n){e===n?N(e,v()):t(n)?w(e,n,g(n)):T(e,n)}
function k (line 37) | function k(e){e._onerror&&e._onerror(e._result),S(e)}
function T (line 37) | function T(e,t){e._state===oe&&(e._result=t,e._state=re,0!==e._subscribe...
function N (line 37) | function N(e,t){e._state===oe&&(e._state=ie,e._result=t,Y(k,e))}
function O (line 37) | function O(e,t,n,o){var r=e._subscribers,i=r.length;e._onerror=null,r[i]...
function S (line 37) | function S(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var o...
function D (line 37) | function D(){this.error=null}
function M (line 37) | function M(e,t){try{return e(t)}catch(e){return se.error=e,se}}
function P (line 37) | function P(e,t,n,r){var i=o(n),a=void 0,s=void 0,u=void 0,l=void 0;if(i)...
function I (line 37) | function I(e,t){try{t(function(t){C(e,t)},function(t){N(e,t)})}catch(t){...
function A (line 37) | function A(){return ue++}
function R (line 37) | function R(e){e[ne]=ue++,e._state=void 0,e._result=void 0,e._subscribers...
function L (line 37) | function L(){return new Error("Array Methods must be provided an Array")}
function L (line 37) | function L(){return new Error("Array Methods must be provided an Array")}
function j (line 37) | function j(e){return new le(this,e).promise}
function F (line 37) | function F(e){var t=this;return new t(q(e)?function(n,o){for(var r=e.len...
function V (line 37) | function V(e){var t=this,n=new t(m);return N(n,e),n}
function W (line 37) | function W(){throw new TypeError("You must pass a resolver function as t...
function B (line 37) | function B(){throw new TypeError("Failed to construct 'Promise': Please ...
function U (line 37) | function U(){var e=void 0;if(void 0!==x)e=x;else if("undefined"!=typeof ...
function e (line 37) | function e(e,t){this._instanceConstructor=e,this.promise=new e(m),this.p...
function e (line 37) | function e(t){this[ne]=A(),this._result=this._state=void 0,this._subscri...
function t (line 37) | function t(t,n){var o=this.constructor,r=this,i=o.prototype;return r=e.c...
function t (line 37) | function t(t){var n=this.constructor;void 0===t&&(t="A timeout occurred....
function e (line 37) | function e(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}
function e (line 37) | function e(){}
function t (line 37) | function t(t){var n=e.call(this)||this;return n.logger=t,n}
function e (line 37) | function e(){}
function e (line 37) | function e(){}
function e (line 37) | function e(){}
function n (line 37) | function n(e,t){var n=null;return e instanceof ArrayBuffer?(n="Binary da...
function o (line 37) | function o(e){var t=new Uint8Array(e),n="";return t.forEach(function(e){...
function r (line 37) | function r(e,t,o,r,i,a,s){return T.__awaiter(this,void 0,void 0,function...
function i (line 37) | function i(e){return void 0===e?new l(O.LogLevel.Information):null===e?I...
function e (line 37) | function e(){}
function e (line 37) | function e(e){this.observers=[],this.cancelCallback=e}
function e (line 37) | function e(e,t){this.subject=e,this.observer=t}
function e (line 37) | function e(e){this.minimumLogLevel=e}
function e (line 37) | function e(e,t,o){var r=this;A.Arg.isRequired(e,"connection"),A.Arg.isRe...
function e (line 37) | function e(){this.isAborted=!1}
function e (line 37) | function e(e,t,o,r,i){this.httpClient=e,this.accessTokenFactory=t||funct...
function e (line 37) | function e(e,t,n,o){this.httpClient=e,this.accessTokenFactory=t||functio...
function e (line 37) | function e(e,t,n){this.logger=t,this.accessTokenFactory=e||function(){re...
function n (line 37) | function n(e,t){return!e||0!=(t&e)}
function e (line 37) | function e(e,t){void 0===t&&(t={}),this.features={},A.Arg.isRequired(e,"...
function e (line 37) | function e(){this.name=n,this.version=1,this.transferFormat=L.TransferFo...
function n (line 37) | function n(e){return void 0!==e.log}
function e (line 37) | function e(){}
function o (line 37) | function o(e){try{e.focus()}catch(e){}}
function o (line 37) | function o(e){if(void 0===(e=e||("undefined"!=typeof document?document:v...
function o (line 37) | function o(e,t){-1===e.indexOf(t)&&e.push(t)}
function r (line 37) | function r(e,t){if(Array.isArray(t))for(var n=0,r=t.length;n<r;++n)o(e,t...
function o (line 37) | function o(e){return e instanceof Object&&!Array.isArray(e)}
function o (line 37) | function o(e,t,n,o,r){for(var i=0,a=e.length;i<a;++i){var s=e[i](t,n,o,r...
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 37) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
function o (line 37) | function o(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}
function o (line 37) | function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function e (line 37) | function e(t){o(this,e),this._callbacks=null,this._contexts=null,this._a...
function o (line 37) | function o(e){return!!p.hasOwnProperty(e)||!d.hasOwnProperty(e)&&(c.test...
function r (line 37) | function r(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue...
function o (line 37) | function o(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this...
function r (line 37) | function r(e){if(e){var t=e.getName();if(t)return" Check the render meth...
function i (line 37) | function i(e,n){var o=e._currentElement._owner;l.checkPropTypes("select"...
function a (line 37) | function a(e,t,n){var o,r,i=c.getNodeFromInstance(e).options;if(t){for(o...
function s (line 37) | function s(e){var t=this._currentElement.props,n=l.executeOnChange(t,e);...
function o (line 37) | function o(e){return u||("production"!==t.env.NODE_ENV?s(!1,"There is no...
function r (line 37) | function r(e){return new l(e)}
function i (line 37) | function i(e){return e instanceof l}
function o (line 37) | function o(e){return i(document.documentElement,e)}
function o (line 37) | function o(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e.c...
function r (line 37) | function r(e){return e?e.nodeType===W?e.documentElement:e.firstChild:null}
function i (line 37) | function i(e){return e.getAttribute&&e.getAttribute(j)||""}
function a (line 37) | function a(e,t,n,o,r){var i;if(C.logTopLevelRenders){var a=e._currentEle...
function s (line 37) | function s(e,t,n,o){var r=D.ReactReconcileTransaction.getPooled(!n&&x.us...
function u (line 37) | function u(e,n,o){for("production"!==t.env.NODE_ENV&&T.debugTool.onBegin...
function l (line 37) | function l(e){var t=r(e);if(t){var n=E.getInstanceFromNode(t);return!(!n...
function c (line 37) | function c(e){var t=r(e);return!(!t||!p(t)||E.getInstanceFromNode(t))}
function d (line 37) | function d(e){return!(!e||e.nodeType!==V&&e.nodeType!==W&&e.nodeType!==B)}
function p (line 37) | function p(e){return d(e)&&(e.hasAttribute(F)||e.hasAttribute(j))}
function f (line 37) | function f(e){var t=r(e),n=t&&E.getInstanceFromNode(t);return n&&!n._hos...
function h (line 37) | function h(e){var t=f(e);return t?t._hostContainerInfo._topLevelWrapper:...
function o (line 37) | function o(e,n){return null==n&&("production"!==t.env.NODE_ENV?i(!1,"acc...
function o (line 37) | function o(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}
function o (line 37) | function o(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._rend...
function o (line 37) | function o(){return!i&&r.canUseDOM&&(i="textContent"in document.document...
function o (line 37) | function o(e){if(e){var t=e.getName();if(t)return" Check the render meth...
function r (line 37) | function r(e){return"function"==typeof e&&void 0!==e.prototype&&"functio...
function i (line 37) | function i(e,n){var s;if(null===e||!1===e)s=l.create(i);else if("object"...
function o (line 37) | function o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input...
function o (line 37) | function o(e,t){return e&&"object"==typeof e&&null!=e.key?d.escape(e.key...
function r (line 37) | function r(e,n,i,v){var y=typeof e;if("undefined"!==y&&"boolean"!==y||(e...
function i (line 37) | function i(e,t,n){return null==e?0:r(e,"",t,n)}
function o (line 37) | function o(e){return e&&"object"==typeof e&&"default"in e?e.default:e}
function r (line 37) | function r(e,t,n){return Object.defineProperty(e,t,n)}
function i (line 37) | function i(e){return y({},x,e)}
function a (line 37) | function a(e,t,n){var o=[e,t];return o.push(w?n:n.capture),o}
function s (line 37) | function s(e,t,n,o){e.addEventListener.apply(e,a(t,n,o))}
function u (line 37) | function u(e,t,n,o){e.removeEventListener.apply(e,a(t,n,o))}
function l (line 37) | function l(e,t){var n=(e.children,e.target,v(e,["children","target"]));O...
function c (line 37) | function c(t,n){return"production"!==e.env.NODE_ENV&&E(n,"react-event-li...
function t (line 37) | function t(){return d(this,t),f(this,(t.__proto__||Object.getPrototypeOf...
function r (line 37) | function r(e){return e&&e.__esModule?e:{default:e}}
function i (line 37) | function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function a (line 37) | function a(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
function s (line 37) | function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
function t (line 37) | function t(n,o){i(this,t);var r=a(this,e.call(this,n,o));return r.perfor...
function o (line 37) | function o(){if(u.current){var e=u.current.getName();if(e)return" Check ...
function r (line 37) | function r(e){var t=o();if(!t){var n="string"==typeof e?e:e.displayName|...
function i (line 37) | function i(e,n){if(e._store&&!e._store.validated&&null==e.key){e._store....
function a (line 37) | function a(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n<...
function s (line 37) | function s(e){var n=e.type;if("function"==typeof n){var o=n.displayName|...
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 37) | function t(){return(0,s.default)(this,t),(0,d.default)(this,(t.__proto__...
function n (line 37) | function n(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
function n (line 37) | function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function n (line 37) | function n(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
function o (line 37) | function o(e,t,o){return t&&n(e.prototype,t),o&&n(e,o),e}
function n (line 37) | function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
function o (line 37) | function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
function o (line 37) | function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
function o (line 37) | function o(e,t){if(null==e)return{};var n,o,i=r(e,t);if(Object.getOwnPro...
function n (line 37) | function n(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=...
function o (line 37) | function o(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?i(e):t}
function n (line 37) | function n(t,o){return e.exports=n=Object.setPrototypeOf||function(e,t){...
function e (line 42) | function e(e){function t(t){var n=e.match(t);return n&&n.length>1&&n[1]|...
function t (line 42) | function t(e){return e.split(".").length}
function n (line 42) | function n(e,t){var n,o=[];if(Array.prototype.map)return Array.prototype...
function o (line 42) | function o(e){for(var o=Math.max(t(e[0]),t(e[1])),r=n(e,function(e){var ...
function r (line 42) | function r(t,n,r){var i=s;"string"==typeof n&&(r=n,n=void 0),void 0===n&...
function i (line 42) | function i(e,t,n){return!r(e,t,n)}
function o (line 42) | function o(e){return e}
function r (line 42) | function r(e,n,r){function d(e,n,o){for(var r in n)n.hasOwnProperty(r)&&...
function r (line 42) | function r(t,n){return function(){n.apply(t,e.makeArray(arguments))}}
function i (line 42) | function i(t,n){var o,i,a,s,u;for(o in t)if(t.hasOwnProperty(o)){if(i=t[...
function r (line 42) | function r(t,n,r){this.$vmId=t,this.$component=n,this.$vmArg=r&&r.vmArg,...
function o (line 42) | function o(e){return e.replace(r,function(e,t){return t.toUpperCase()})}
function o (line 42) | function o(e){return r(e.replace(i,"ms-"))}
function o (line 42) | function o(e,t){return!(!e||!t)&&(e===t||!r(e)&&(r(t)?o(e,t.parentNode):...
function o (line 42) | function o(e){var n=e.length;if((Array.isArray(e)||"object"!=typeof e&&"...
function r (line 42) | function r(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"le...
function i (line 42) | function i(e){return r(e)?Array.isArray(e)?e.slice():o(e):[e]}
function o (line 42) | function o(e){var t=e.match(c);return t&&t[1].toLowerCase()}
function r (line 42) | function r(e,n){var r=l;l||("production"!==t.env.NODE_ENV?u(!1,"createNo...
function o (line 42) | function o(e){return a||("production"!==t.env.NODE_ENV?i(!1,"Markup wrap...
function o (line 42) | function o(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e...
function o (line 42) | function o(e){return e.replace(r,"-$1").toLowerCase()}
function o (line 42) | function o(e){return r(e).replace(i,"-ms-")}
function o (line 42) | function o(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||windo...
function o (line 42) | function o(e){return r(e)&&3==e.nodeType}
function o (line 42) | function o(e){var t={};return function(n){return t.hasOwnProperty(n)||(t...
function o (line 42) | function o(e){return e in a?a[e]:a[e]=e.replace(r,"-$&").toLowerCase().r...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function i (line 42) | function i(e){var t=e.prefixMap,n=e.plugins,o=arguments.length>1&&void 0...
function e (line 42) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,s=o.cssPrefix...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,u=o.cssPrefix...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,l=o.cssPrefix...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,l=o.cssPrefix...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,u=o.cssPrefix...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.cssPrefix,i=o.keepUnprefixed;if(s.hasOwnProp...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n,o){var r=o.cssPrefix,i=o.keepUnprefixed,l=o.requiresPre...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e){function t(e){for(var r in e){var i=e[r];if((0,p.default)(...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t){if("string"==typeof t&&!(0,a.default)(t)&&t.indexOf("cal...
function o (line 42) | function o(e,t){if("display"===e&&r.hasOwnProperty(t))return r[t]}
function o (line 42) | function o(e,t,n){i.hasOwnProperty(e)&&(n[i[e]]=r[t]||t)}
function o (line 42) | function o(e,t,n){"flexDirection"===e&&"string"==typeof t&&(t.indexOf("c...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t){if("string"==typeof t&&!(0,a.default)(t)&&u.test(t))retu...
function o (line 42) | function o(e,t){if(i.hasOwnProperty(e)&&a.hasOwnProperty(t))return r.map...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t){if((0,l.default)(e))return e;for(var n=e.split(/,(?![^()...
function i (line 42) | function i(e,t,n,o){if("string"==typeof t&&p.hasOwnProperty(e)){var i=r(...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e){if(e.firefox)return"firefox";if(e.mobile||e.tablet){if(e.i...
function i (line 42) | function i(e){var t=s.default._detect(e);t.yandexbrowser&&(t=s.default._...
function o (line 42) | function o(e,t,n){var o="keyframes";return"chrome"===e&&t<43||("safari"=...
function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 42) | function r(e,t,n){if(e.hasOwnProperty(t))for(var o=e[t],r=0,i=o.length;r...
function o (line 42) | function o(e){var t=a[e]={};return r.each(e.split(i),function(e,n){t[n]=...
function n (line 42) | function n(e){return null==e?String(e):c[l.call(e)]||"object"}
function o (line 42) | function o(e){return"function"===u.type(e)}
function r (line 42) | function r(e){return"array"===u.type(e)}
function i (line 42) | function i(e,t,n){var r,i=0,a=e.length,s=void 0===a||o(e);if(n)if(s){for...
function a (line 42) | function a(e){return!(!e||"object"!==u.type(e))}
function s (line 42) | function s(){var e,t,n,o,r,i,a=arguments[0]||{},s=1,l=arguments.length,c...
function a (line 60) | function a(e,t){t=t||ae;var n=t.createElement("script");n.text=e,t.head....
function s (line 60) | function s(e){var t=!!e&&"length"in e&&e.length,n=be.type(e);return"func...
function u (line 60) | function u(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerC...
function l (line 60) | function l(e,t,n){return be.isFunction(t)?be.grep(e,function(e,o){return...
function c (line 60) | function c(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}
function d (line 60) | function d(e){var t={};return be.each(e.match(Ae)||[],function(e,n){t[n]...
function p (line 60) | function p(e){return e}
function f (line 60) | function f(e){throw e}
function h (line 60) | function h(e,t,n,o){var r;try{e&&be.isFunction(r=e.promise)?r.call(e).do...
function m (line 60) | function m(){ae.removeEventListener("DOMContentLoaded",m),n.removeEventL...
function v (line 60) | function v(){this.expando=be.expando+v.uid++}
function y (line 60) | function y(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?...
function g (line 60) | function g(e,t,n){var o;if(void 0===n&&1===e.nodeType)if(o="data-"+t.rep...
function b (line 60) | function b(e,t,n,o){var r,i=1,a=20,s=o?function(){return o.cur()}:functi...
function _ (line 60) | function _(e){var t,n=e.ownerDocument,o=e.nodeName,r=Ye[o];return r||(t=...
function E (line 60) | function E(e,t){for(var n,o,r=[],i=0,a=e.length;i<a;i++)o=e[i],o.style&&...
function w (line 60) | function w(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElem...
function x (line 60) | function x(e,t){for(var n=0,o=e.length;n<o;n++)Ve.set(e[n],"globalEval",...
function C (line 60) | function C(e,t,n,o,r){for(var i,a,s,u,l,c,d=t.createDocumentFragment(),p...
function k (line 60) | function k(){return!0}
function T (line 60) | function T(){return!1}
function N (line 60) | function N(){try{return ae.activeElement}catch(e){}}
function O (line 60) | function O(e,t,n,o,r,i){var a,s;if("object"==typeof t){"string"!=typeof ...
function S (line 60) | function S(e,t){return u(e,"table")&&u(11!==t.nodeType?t:t.firstChild,"t...
function D (line 60) | function D(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
function M (line 60) | function M(e){var t=st.exec(e.type);return t?e.type=t[1]:e.removeAttribu...
function P (line 60) | function P(e,t){var n,o,r,i,a,s,u,l;if(1===t.nodeType){if(Ve.hasData(e)&...
function I (line 60) | function I(e,t){var n=t.nodeName.toLowerCase();"input"===n&&Ge.test(e.ty...
function A (line 60) | function A(e,t,n,o){t=le.apply([],t);var r,i,s,u,l,c,d=0,p=e.length,f=p-...
function R (line 60) | function R(e,t,n){for(var o,r=t?be.filter(t,e):e,i=0;null!=(o=r[i]);i++)...
function L (line 60) | function L(e,t,n){var o,r,i,a,s=e.style;return n=n||dt(e),n&&(a=n.getPro...
function j (line 60) | function j(e,t){return{get:function(){return e()?void delete this.get:(t...
function F (line 60) | function F(e){if(e in yt)return e;for(var t=e[0].toUpperCase()+e.slice(1...
function V (line 60) | function V(e){var t=be.cssProps[e];return t||(t=be.cssProps[e]=F(e)||e),t}
function W (line 60) | function W(e,t,n){var o=qe.exec(t);return o?Math.max(0,o[2]-(n||0))+(o[3...
function B (line 60) | function B(e,t,n,o,r){var i,a=0;for(i=n===(o?"border":"content")?4:"widt...
function U (line 60) | function U(e,t,n){var o,r=dt(e),i=L(e,t,r),a="border-box"===be.css(e,"bo...
function H (line 60) | function H(e,t,n,o,r){return new H.prototype.init(e,t,n,o,r)}
function q (line 60) | function q(){bt&&(!1===ae.hidden&&n.requestAnimationFrame?n.requestAnima...
function z (line 60) | function z(){return n.setTimeout(function(){gt=void 0}),gt=be.now()}
function K (line 60) | function K(e,t){var n,o=0,r={height:e};for(t=t?1:0;o<4;o+=2-t)n=ze[o],r[...
function $ (line 60) | function $(e,t,n){for(var o,r=(X.tweeners[t]||[]).concat(X.tweeners["*"]...
function Y (line 60) | function Y(e,t,n){var o,r,i,a,s,u,l,c,d="width"in t||"height"in t,p=this...
function G (line 60) | function G(e,t){var n,o,r,i,a;for(n in e)if(o=be.camelCase(n),r=t[o],i=e...
function X (line 60) | function X(e,t,n){var o,r,i=0,a=X.prefilters.length,s=be.Deferred().alwa...
function J (line 60) | function J(e){return(e.match(Ae)||[]).join(" ")}
function Q (line 60) | function Q(e){return e.getAttribute&&e.getAttribute("class")||""}
function Z (line 60) | function Z(e,t,n,o){var r;if(Array.isArray(t))be.each(t,function(t,r){n|...
function ee (line 60) | function ee(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
function te (line 60) | function te(e,t,n,o){function r(s){var u;return i[s]=!0,be.each(e[s]||[]...
function ne (line 60) | function ne(e,t){var n,o,r=be.ajaxSettings.flatOptions||{};for(n in t)vo...
function oe (line 60) | function oe(e,t,n){for(var o,r,i,a,s=e.contents,u=e.dataTypes;"*"===u[0]...
function re (line 60) | function re(e,t,n,o){var r,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])fo...
function t (line 70) | function t(e,t,n,o){var r,i,a,s,u,l,c,p=t&&t.ownerDocument,h=t?t.nodeTyp...
function n (line 70) | function n(){function e(n,o){return t.push(n+" ")>x.cacheLength&&delete ...
function o (line 70) | function o(e){return e[W]=!0,e}
function r (line 70) | function r(e){var t=I.createElement("fieldset");try{return!!e(t)}catch(e...
function i (line 70) | function i(e,t){for(var n=e.split("|"),o=n.length;o--;)x.attrHandle[n[o]...
function a (line 70) | function a(e,t){var n=t&&e,o=n&&1===e.nodeType&&1===t.nodeType&&e.source...
function s (line 70) | function s(e){return function(t){return"input"===t.nodeName.toLowerCase(...
function u (line 70) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("...
function l (line 70) | function l(e){return function(t){return"form"in t?t.parentNode&&!1===t.d...
function c (line 70) | function c(e){return o(function(t){return t=+t,o(function(n,o){for(var r...
function d (line 70) | function d(e){return e&&void 0!==e.getElementsByTagName&&e}
function p (line 70) | function p(){}
function f (line 70) | function f(e){for(var t=0,n=e.length,o="";t<n;t++)o+=e[t].value;return o}
function h (line 70) | function h(e,t,n){var o=t.dir,r=t.next,i=r||o,a=n&&"parentNode"===i,s=H+...
function m (line 70) | function m(e){return e.length>1?function(t,n,o){for(var r=e.length;r--;)...
function v (line 70) | function v(e,n,o){for(var r=0,i=n.length;r<i;r++)t(e,n[r],o);return o}
function y (line 70) | function y(e,t,n,o,r){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i...
function g (line 70) | function g(e,t,n,r,i,a){return r&&!r[W]&&(r=g(r)),i&&!i[W]&&(i=g(i,a)),o...
function b (line 70) | function b(e){for(var t,n,o,r=e.length,i=x.relative[e[0].type],a=i||x.re...
function _ (line 70) | function _(e,n){var r=n.length>0,i=e.length>0,a=function(o,a,s,u,l){var ...
function i (line 70) | function i(e,t,o,r){return function(){var s=this,u=arguments,l=function(...
function e (line 70) | function e(){if(s){s.style.cssText="box-sizing:border-box;position:relat...
function o (line 70) | function o(e,t,o,s){var l,p,f,_,E,w=t;c||(c=!0,u&&n.clearTimeout(u),r=vo...
function o (line 70) | function o(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return...
function r (line 70) | function r(e,t){for(var n=-1,o=Array(e);++n<e;)o[n]=t(n);return o}
function i (line 70) | function i(e){return function(t){return e(t)}}
function a (line 70) | function a(e,t){return null==e?void 0:e[t]}
function s (line 70) | function s(e,t){return function(n){return e(t(n))}}
function u (line 70) | function u(e,t){return"__proto__"==t?void 0:e[t]}
function l (line 70) | function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
function c (line 70) | function c(){this.__data__=wt?wt(null):{},this.size=0}
function d (line 70) | function d(e){var t=this.has(e)&&delete this.__data__[e];return this.siz...
function p (line 70) | function p(e){var t=this.__data__;if(wt){var n=t[e];return n===Ne?void 0...
function f (line 70) | function f(e){var t=this.__data__;return wt?void 0!==t[e]:ot.call(t,e)}
function h (line 70) | function h(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[...
function m (line 70) | function m(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
function v (line 70) | function v(){this.__data__=[],this.size=0}
function y (line 70) | function y(e){var t=this.__data__,n=L(t,e);return!(n<0)&&(n==t.length-1?...
function g (line 70) | function g(e){var t=this.__data__,n=L(t,e);return n<0?void 0:t[n][1]}
function b (line 70) | function b(e){return L(this.__data__,e)>-1}
function _ (line 70) | function _(e,t){var n=this.__data__,o=L(n,e);return o<0?(++this.size,n.p...
function E (line 70) | function E(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
function w (line 70) | function w(){this.size=0,this.__data__={hash:new l,map:new(Et||m),string...
function x (line 70) | function x(e){var t=Z(this,e).delete(e);return this.size-=t?1:0,t}
function C (line 70) | function C(e){return Z(this,e).get(e)}
function k (line 70) | function k(e){return Z(this,e).has(e)}
function T (line 70) | function T(e,t){var n=Z(this,e),o=n.size;return n.set(e,t),this.size+=n....
function N (line 70) | function N(e){var t=this.__data__=new m(e);this.size=t.size}
function O (line 70) | function O(){this.__data__=new m,this.size=0}
function S (line 70) | function S(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}
function D (line 70) | function D(e){return this.__data__.get(e)}
function M (line 70) | function M(e){return this.__data__.has(e)}
function P (line 70) | function P(e,t){var n=this.__data__;if(n instanceof m){var o=n.__data__;...
function I (line 70) | function I(e,t){var n=Ot(e),o=!n&&Nt(e),i=!n&&!o&&St(e),a=!n&&!o&&!i&&Dt...
function A (line 70) | function A(e,t,n){(void 0===n||fe(e[t],n))&&(void 0!==n||t in e)||j(e,t,n)}
function R (line 70) | function R(e,t,n){var o=e[t];ot.call(e,t)&&fe(o,n)&&(void 0!==n||t in e)...
function L (line 70) | function L(e,t){for(var n=e.length;n--;)if(fe(e[n][0],t))return n;return-1}
function j (line 70) | function j(e,t,n){"__proto__"==t&&yt?yt(e,t,{configurable:!0,enumerable:...
function F (line 70) | function F(e){return null==e?void 0===e?Fe:Re:vt&&vt in Object(e)?te(e):...
function V (line 70) | function V(e){return be(e)&&F(e)==Me}
function W (line 70) | function W(e){return!(!ge(e)||ae(e))&&(ve(e)?st:We).test(pe(e))}
function B (line 70) | function B(e){return be(e)&&ye(e.length)&&!!Ue[F(e)]}
function U (line 70) | function U(e){if(!ge(e))return ue(e);var t=se(e),n=[];for(var o in e)("c...
function H (line 70) | function H(e,t,n,o,r){e!==t&&Ct(t,function(i,a){if(ge(i))r||(r=new N),q(...
function q (line 70) | function q(e,t,n,o,r,i,a){var s=u(e,n),l=u(t,n),c=a.get(l);if(c)return v...
function z (line 70) | function z(e,t){return Tt(ce(e,t,Ce),e+"")}
function K (line 70) | function K(e,t){if(t)return e.slice();var n=e.length,o=dt?dt(n):new e.co...
function $ (line 70) | function $(e){var t=new e.constructor(e.byteLength);return new ct(t).set...
function Y (line 70) | function Y(e,t){var n=t?$(e.buffer):e.buffer;return new e.constructor(n,...
function G (line 70) | function G(e,t){var n=-1,o=e.length;for(t||(t=Array(o));++n<o;)t[n]=e[n]...
function X (line 70) | function X(e,t,n,o){var r=!n;n||(n={});for(var i=-1,a=t.length;++i<a;){v...
function J (line 70) | function J(e){return z(function(t,n){var o=-1,r=n.length,i=r>1?n[r-1]:vo...
function Q (line 70) | function Q(e){return function(t,n,o){for(var r=-1,i=Object(t),a=o(t),s=a...
function Z (line 70) | function Z(e,t){var n=e.__data__;return ie(t)?n["string"==typeof t?"stri...
function ee (line 70) | function ee(e,t){var n=a(e,t);return W(n)?n:void 0}
function te (line 70) | function te(e){var t=ot.call(e,vt),n=e[vt];try{e[vt]=void 0;var o=!0}cat...
function ne (line 70) | function ne(e){return"function"!=typeof e.constructor||se(e)?{}:xt(pt(e))}
function oe (line 70) | function oe(e,t){var n=typeof e;return!!(t=null==t?De:t)&&("number"==n||...
function re (line 70) | function re(e,t,n){if(!ge(n))return!1;var o=typeof t;return!!("number"==...
function ie (line 70) | function ie(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==...
function ae (line 70) | function ae(e){return!!rt&&rt in e}
function se (line 70) | function se(e){var t=e&&e.constructor;return e===("function"==typeof t&&...
function ue (line 70) | function ue(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);retu...
function le (line 70) | function le(e){return it.call(e)}
function ce (line 70) | function ce(e,t,n){return t=bt(void 0===t?e.length-1:t,0),function(){for...
function de (line 70) | function de(e){var t=0,n=0;return function(){var o=_t(),r=Se-(o-n);if(n=...
function pe (line 70) | function pe(e){if(null!=e){try{return nt.call(e)}catch(e){}try{return e+...
function fe (line 70) | function fe(e,t){return e===t||e!==e&&t!==t}
function he (line 70) | function he(e){return null!=e&&ye(e.length)&&!ve(e)}
function me (line 70) | function me(e){return be(e)&&he(e)}
function ve (line 70) | function ve(e){if(!ge(e))return!1;var t=F(e);return t==Ie||t==Ae||t==Pe|...
function ye (line 70) | function ye(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=De}
function ge (line 70) | function ge(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}
function be (line 70) | function be(e){return null!=e&&"object"==typeof e}
function _e (line 70) | function _e(e){if(!be(e)||F(e)!=Le)return!1;var t=pt(e);if(null===t)retu...
function Ee (line 70) | function Ee(e){return X(e,we(e))}
function we (line 70) | function we(e){return he(e)?I(e,!0):U(e)}
function xe (line 70) | function xe(e){return function(){return e}}
function Ce (line 70) | function Ce(e){return e}
function ke (line 70) | function ke(){return!1}
function e (line 70) | function e(){}
function n (line 70) | function n(e,t,n){function o(t){var n=m,o=v;return m=v=void 0,C=t,g=e.ap...
function o (line 70) | function o(e,t,o){var i=!0,a=!0;if("function"!=typeof e)throw new TypeEr...
function r (line 70) | function r(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}
function i (line 70) | function i(e){return!!e&&"object"==typeof e}
function a (line 70) | function a(e){return"symbol"==typeof e||i(e)&&_.call(e)==c}
function s (line 70) | function s(e){if("number"==typeof e)return e;if(a(e))return l;if(r(e)){v...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme,o=n.appBar,r=n.button.iconButtonSize;re...
function n (line 70) | function n(){var e,t,o,r;(0,h.default)(this,n);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t,n){var o=e.color,r=e.hoverColor,i=t.muiTheme.baseTheme,a=...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme.baseTheme;return{root:{boxSizing:"borde...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t,n){var o=e.autoGenerateNestedIndicator,r=e.insetChildren,...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme.baseTheme.palette.disabledColor,o=t.mui...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=e.desktop,o=e.maxHeight,r=e.width,i=t.muiTheme;ret...
function t (line 70) | function t(e,n){(0,h.default)(this,t);var o=(0,g.default)(this,(t.__prot...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function e (line 70) | function e(){var t=this;(0,i.default)(this,e),this.clear=function(){t.ti...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=e.rounded,o=e.circle,r=e.transitionEnabled,i=e.zDe...
function t (line 70) | function t(){return(0,p.default)(this,t),(0,v.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(e,n){(0,d.default)(this,t);var o=(0,m.default)(this,(t.__prot...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t,n){var o=e.targetOrigin,r=n.open,i=t.muiTheme,a=o.horizon...
function t (line 70) | function t(){var e,n,o,r;(0,u.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,d.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme,o=n.inkBar,r=n.isRtl;return{root:{left:...
function t (line 70) | function t(){return(0,u.default)(this,t),(0,p.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme.tabs;return{root:{color:e.selected?n.se...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){return{tabItemContainer:{width:"100%",backgroundColor:t....
function n (line 70) | function n(){var e,t,o,r;(0,p.default)(this,n);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){var n=t.muiTheme.overlay,o={root:{position:"fixed",heigh...
function t (line 70) | function t(){return(0,p.default)(this,t),(0,v.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t,n){var o=e.verticalPosition,r=e.horizontalPosition,i=e.to...
function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function t (line 70) | function t(e,n){(0,l.default)(this,t);var o=(0,f.default)(this,(t.__prot...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o<t;o++)...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(){if("production"!==e.env.NODE_ENV)return function(t){return ...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t,n){return a.default.Children.map(e,function(e){if(!a.defa...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e){if(e.isRtl)return function(e){if(!0===e.directionInvariant...
function o (line 70) | function o(e,n,o,s,u){if("production"!==t.env.NODE_ENV)for(var l in e)if...
function o (line 70) | function o(){}
function e (line 70) | function e(e,t,n,o,i,a){if(a!==r){var s=new Error("Calling PropTypes val...
function t (line 70) | function t(){return e}
function o (line 70) | function o(){return null}
function u (line 70) | function u(e){var t=e&&(S&&e[S]||e[D]);if("function"==typeof t)return t}
function l (line 70) | function l(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}
function c (line 70) | function c(e){this.message=e,this.stack=""}
function d (line 70) | function d(e){function o(o,u,l,d,p,f,h){if(d=d||M,f=f||l,h!==i){if(n){va...
function p (line 70) | function p(e){function t(t,n,o,r,i,a){var s=t[n];if(k(s)!==e)return new ...
function f (line 70) | function f(){return d(o)}
function h (line 70) | function h(e){function t(t,n,o,r,a){if("function"!=typeof e)return new c...
function m (line 70) | function m(){function t(t,n,o,r,i){var a=t[n];if(!e(a)){return new c("In...
function v (line 70) | function v(e){function t(t,n,o,r,i){if(!(t[n]instanceof e)){var a=e.name...
function y (line 70) | function y(e){function n(t,n,o,r,i){for(var a=t[n],s=0;s<e.length;s++)if...
function g (line 70) | function g(e){function t(t,n,o,r,a){if("function"!=typeof e)return new c...
function b (line 70) | function b(e){function n(t,n,o,r,a){for(var s=0;s<e.length;s++){if(null=...
function _ (line 70) | function _(){function e(e,t,n,o,r){return x(e[t])?null:new c("Invalid "+...
function E (line 70) | function E(e){function t(t,n,o,r,a){var s=t[n],u=k(s);if("object"!==u)re...
function w (line 70) | function w(e){function t(t,n,o,a,s){var u=t[n],l=k(u);if("object"!==l)re...
function x (line 70) | function x(t){switch(typeof t){case"number":case"string":case"undefined"...
function C (line 70) | function C(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"fun...
function k (line 70) | function k(e){var t=typeof e;return Array.isArray(e)?"array":e instanceo...
function T (line 70) | function T(e){if(void 0===e||null===e)return""+e;var t=k(e);if("object"=...
function N (line 70) | function N(e){var t=T(e);switch(t){case"array":case"object":return"an "+...
function O (line 70) | function O(e){return e.constructor&&e.constructor.name?e.constructor.nam...
function o (line 70) | function o(){var e=window.opera;return"object"==typeof e&&"function"==ty...
function r (line 70) | function r(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.alt...
function i (line 70) | function i(e){switch(e){case"topCompositionStart":return T.compositionSt...
function a (line 70) | function a(e,t){return"topKeyDown"===e&&t.keyCode===b}
function s (line 70) | function s(e,t){switch(e){case"topKeyUp":return-1!==g.indexOf(t.keyCode)...
function u (line 70) | function u(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data...
function l (line 70) | function l(e,t,n,o){var r,l;if(_?r=i(e):O?s(e,n)&&(r=T.compositionEnd):a...
function c (line 70) | function c(e,t){switch(e){case"topCompositionEnd":return u(t);case"topKe...
function d (line 70) | function d(e,t){if(O){if("topCompositionEnd"===e||!_&&s(e,t)){var n=O.ge...
function p (line 70) | function p(e,t,n,o){var r;if(!(r=w?c(e,n):d(e,n)))return null;var i=y.ge...
function o (line 70) | function o(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"=...
function r (line 70) | function r(e){var t=x.getPooled(N.change,S,e,C(e));b.accumulateTwoPhaseD...
function i (line 70) | function i(e){g.enqueueEvents(e),g.processEventQueue(!1)}
function a (line 70) | function a(e,t){O=e,S=t,O.attachEvent("onchange",r)}
function s (line 70) | function s(){O&&(O.detachEvent("onchange",r),O=null,S=null)}
function u (line 70) | function u(e,t){if("topChange"===e)return t}
function l (line 70) | function l(e,t,n){"topFocus"===e?(s(),a(t,n)):"topBlur"===e&&s()}
function c (line 70) | function c(e,t){O=e,S=t,D=e.value,M=Object.getOwnPropertyDescriptor(e.co...
function d (line 70) | function d(){O&&(delete O.value,O.detachEvent?O.detachEvent("onpropertyc...
function p (line 70) | function p(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==...
function f (line 70) | function f(e,t){if("topInput"===e)return t}
function h (line 70) | function h(e,t,n){"topFocus"===e?(d(),c(t,n)):"topBlur"===e&&d()}
function m (line 70) | function m(e,t){if(("topSelectionChange"===e||"topKeyUp"===e||"topKeyDow...
function v (line 70) | function v(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("c...
function y (line 70) | function y(e,t){if("topClick"===e)return t}
function o (line 70) | function o(e){this._root=e,this._startText=this.getText(),this._fallback...
function o (line 70) | function o(e,o,i,u){var l=void 0===e[i];"production"!==t.env.NODE_ENV&&(...
function o (line 70) | function o(e){}
function r (line 70) | function r(e,n){"production"!==t.env.NODE_ENV&&("production"!==t.env.NOD...
function i (line 70) | function i(e){return!(!e.prototype||!e.prototype.isReactComponent)}
function a (line 70) | function a(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}
function s (line 70) | function s(e,t,n){if(0===t)return e();m.debugTool.onBeginLifeCycleTimer(...
function o (line 70) | function o(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.g...
function r (line 70) | function r(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map...
function i (line 70) | function i(e,n,o){if(null!=e&&null!=n&&!B(e,n)){var i,a=o._tag,s=o._curr...
function a (line 70) | function a(e,n){n&&(ie[e._tag]&&(null!=n.children||null!=n.dangerouslySe...
function s (line 70) | function s(e,n,o,r){if(!(r instanceof L)){"production"!==t.env.NODE_ENV&...
function u (line 70) | function u(){var e=this;k.putListener(e.inst,e.registrationName,e.listen...
function l (line 70) | function l(){var e=this;D.postMountWrapper(e)}
function c (line 70) | function c(){var e=this;I.postMountWrapper(e)}
function d (line 70) | function d(){var e=this;M.postMountWrapper(e)}
function p (line 70) | function p(){var e=this;e._rootNodeID||("production"!==t.env.NODE_ENV?V(...
function f (line 70) | function f(){P.postUpdateWrapper(this)}
function h (line 70) | function h(e){ue.call(se,e)||(ae.test(e)||("production"!==t.env.NODE_ENV...
function m (line 70) | function m(e,t){return e.indexOf("-")>=0||null!=t.is}
function v (line 70) | function v(e){var n=e.type;h(n),this._currentElement=e,this._tag=n.toLow...
function o (line 70) | function o(e,n){var o={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?...
function o (line 70) | function o(){this._rootNodeID&&_.updateWrapper(this)}
function r (line 70) | function r(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checke...
function i (line 70) | function i(e){var n=this._currentElement.props,r=l.executeOnChange(n,e);...
function o (line 70) | function o(e,n,o){if(l.hasOwnProperty(n)&&l[n])return!0;if(c.test(n)){va...
function r (line 70) | function r(e,n){var r=[];for(var i in n.props){o(n.type,i,e)||r.push(i)}...
function i (line 70) | function i(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=...
function o (line 70) | function o(e,n){null!=n&&("input"!==n.type&&"textarea"!==n.type&&"select...
function o (line 70) | function o(e){var n="";return i.Children.forEach(e,function(e){null!=e&&...
function o (line 70) | function o(e,t,n,o){return e===n&&t===o}
function r (line 70) | function r(e){var t=document.selection,n=t.createRange(),o=n.text.length...
function i (line 70) | function i(e){var t=window.getSelection&&window.getSelection();if(!t||0=...
function a (line 70) | function a(e,t){var n,o,r=document.selection.createRange().duplicate();v...
function s (line 70) | function s(e,t){if(window.getSelection){var n=window.getSelection(),o=e[...
function o (line 70) | function o(){this._rootNodeID&&h.updateWrapper(this)}
function r (line 70) | function r(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);...
function o (line 70) | function o(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1,"ge...
function r (line 70) | function r(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1,"is...
function i (line 70) | function i(e){return"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1...
function a (line 70) | function a(e,t,n){for(var o=[];e;)o.push(e),e=e._hostParent;var r;for(r=...
function s (line 70) | function s(e,t,n,r,i){for(var a=e&&t?o(e,t):null,s=[];e&&e!==a;)s.push(e...
function o (line 70) | function o(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=...
function o (line 70) | function o(e,n,o,r,i,a,s,u){try{n.call(o,r,i,a,s,u)}catch(n){"production...
function r (line 70) | function r(e,t,n,r,i,a){for(var s=0;s<w.length;s++){var u=w[s],l=u[e];l&...
function i (line 70) | function i(){g.purgeUnmountedComponents(),y.clearHistory()}
function a (line 70) | function a(e){return e.reduce(function(e,t){var n=g.getOwnerID(t),o=g.ge...
function s (line 70) | function s(){var e=S,t=O,n=y.getHistory();if(0===N)return S=0,O=[],void ...
function u (line 70) | function u(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&0...
function l (line 70) | function l(e,n){0!==N&&(I&&!A&&("production"!==t.env.NODE_ENV&&E(!1,"The...
function c (line 70) | function c(e,n){0!==N&&(I===n||A||("production"!==t.env.NODE_ENV&&E(!1,"...
function d (line 70) | function d(){var e={startTime:M,nestedFlushStartTime:_(),debugID:D,timer...
function p (line 70) | function p(){var e=T.pop(),t=e.startTime,n=e.nestedFlushStartTime,o=e.de...
function f (line 70) | function f(e){if(!C||!L)return!1;var t=g.getElement(e);return null!=t&&"...
function h (line 70) | function h(e,t){if(f(e)){var n=e+"::"+t;R=_(),performance.mark(n)}}
function m (line 70) | function m(e,t){if(f(e)){var n=e+"::"+t,o=g.getDisplayName(e)||"Unknown"...
function o (line 70) | function o(){this.reinitializeTransaction()}
function o (line 70) | function o(){x||(x=!0,g.EventEmitter.injectReactEventListener(y),g.Event...
function o (line 70) | function o(e){r.enqueueEvents(e),r.processEventQueue(!1)}
function o (line 70) | function o(e){for(;e._hostParent;)e=e._hostParent;var t=d.getNodeFromIns...
function r (line 70) | function r(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}
function i (line 70) | function i(e){var t=f(e.nativeEvent),n=d.getClosestInstanceFromNode(t),r...
function a (line 70) | function a(e){e(h(window))}
function o (line 70) | function o(e,t,n){return{type:"INSERT_MARKUP",content:e,fromIndex:null,f...
function r (line 70) | function r(e,t,n){return{type:"MOVE_EXISTING",content:null,fromIndex:e._...
function i (line 70) | function i(e,t){return{type:"REMOVE_NODE",content:null,fromIndex:e._moun...
function a (line 70) | function a(e){return{type:"SET_MARKUP",content:e,fromIndex:null,fromNode...
function s (line 70) | function s(e){return{type:"TEXT_CONTENT",content:e,fromIndex:null,fromNo...
function u (line 70) | function u(e,t){return t&&(e=e||[],e.push(t)),e}
function l (line 70) | function l(e,t){d.processChildrenUpdates(e,t)}
function o (line 70) | function o(e){return!(!e||"function"!=typeof e.attachRef||"function"!=ty...
function o (line 70) | function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!...
function o (line 70) | function o(e,t,n){"function"==typeof e?e(t.getPublicInstance()):i.addCom...
function r (line 70) | function r(e,t,n){"function"==typeof e?e(null):i.removeComponentAsRefFro...
function o (line 70) | function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e...
function o (line 70) | function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function r (line 70) | function r(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"p...
function e (line 70) | function e(t){o(this,e),this.transaction=t}
function o (line 70) | function o(e){if("selectionStart"in e&&u.hasSelectionCapabilities(e))ret...
function r (line 70) | function r(e,t){if(g||null==m||m!==c())return null;var n=o(m);if(!y||!p(...
function o (line 70) | function o(e){return"."+e._rootNodeID}
function r (line 70) | function r(e){return"button"===e||"input"===e||"select"===e||"textarea"=...
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
function o (line 70) | function o(e){for(var t=1,n=0,o=0,i=e.length,a=-4&i;o<a;){for(var s=Math...
function o (line 70) | function o(e,o,d,p,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try...
function o (line 70) | function o(e,n,o){if(null==n||"boolean"==typeof n||""===n)return"";if(is...
function o (line 70) | function o(e){if("production"!==t.env.NODE_ENV){var n=i.current;null!==n...
function o (line 70) | function o(e,o,r,s){if(e&&"object"==typeof e){var l=e,c=void 0===l[r];"p...
function r (line 70) | function r(e,n){if(null==e)return e;var r={};return"production"!==t.env....
function o (line 70) | function o(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)retu...
function o (line 70) | function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}
function o (line 70) | function o(){return r++}
function o (line 70) | function o(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function r (line 70) | function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentN...
function i (line 70) | function i(e,t){for(var n=o(e),i=0,a=0;n;){if(3===n.nodeType){if(a=i+n.t...
function o (line 70) | function o(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["We...
function r (line 70) | function r(e){if(s[e])return s[e];if(!a[e])return e;var t=a[e];for(var n...
function o (line 70) | function o(e){return'"'+r(e)+'"'}
function o (line 70) | function o(e){if(!e)return e;var t={};return i.Children.map(e,function(e...
function r (line 70) | function r(e,t){function n(n){return t.hasOwnProperty(n)?t[n]:e[n]}e=e||...
function o (line 70) | function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g...
function r (line 70) | function r(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[...
function o (line 70) | function o(e){return(""+e).replace(_,"$&/")}
function r (line 70) | function r(e,t){this.func=e,this.context=t,this.count=0}
function i (line 70) | function i(e,t,n){var o=e.func,r=e.context;o.call(r,t,e.count++)}
function a (line 70) | function a(e,t,n){if(null==e)return e;var o=r.getPooled(t,n);y(e,i,o),r....
function s (line 70) | function s(e,t,n,o){this.result=e,this.keyPrefix=t,this.func=n,this.cont...
function u (line 70) | function u(e,t,n){var r=e.result,i=e.keyPrefix,a=e.func,s=e.context,u=a....
function l (line 70) | function l(e,t,n,r,i){var a="";null!=n&&(a=o(n)+"/");var l=s.getPooled(t...
function c (line 70) | function c(e,t,n){if(null==e)return e;var o=[];return l(e,o,null,t,n),o}
function d (line 70) | function d(e,t,n){return null}
function p (line 70) | function p(e,t){return y(e,d,null)}
function f (line 70) | function f(e){var t=[];return l(e,t,null,v.thatReturnsArgument),t}
function o (line 70) | function o(e){return e}
function r (line 70) | function r(e,n,o){for(var r in n)n.hasOwnProperty(r)&&"production"!==t.e...
function i (line 70) | function i(e,n){var o=C.hasOwnProperty(n)?C[n]:null;T.hasOwnProperty(n)&...
function a (line 70) | function a(e,n){if(n){"function"==typeof n&&("production"!==t.env.NODE_E...
function s (line 70) | function s(e,n){if(n)for(var o in n){var r=n[o];if(n.hasOwnProperty(o)){...
function u (line 70) | function u(e,n){e&&n&&"object"==typeof e&&"object"==typeof n||("producti...
function l (line 70) | function l(e,t){return function(){var n=e.apply(this,arguments),o=t.appl...
function c (line 70) | function c(e,t){return function(){e.apply(this,arguments),t.apply(this,a...
function d (line 70) | function d(e,n){var o=n.bind(e);if("production"!==t.env.NODE_ENV){o.__re...
function p (line 70) | function p(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var ...
function o (line 70) | function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}
function r (line 70) | function r(e){this.message=e,this.stack=""}
function i (line 70) | function i(e){function n(n,i,a,s,u,l,c){if(s=s||N,l=l||a,"production"!==...
function a (line 70) | function a(e){function t(t,n,o,i,a,s){var u=t[n];if(g(u)!==e)return new ...
function s (line 70) | function s(){return i(C.thatReturns(null))}
function u (line 70) | function u(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r...
function l (line 70) | function l(){function e(e,t,n,o,i){var a=e[t];if(!E.isValidElement(a)){r...
function c (line 70) | function c(e){function t(t,n,o,i,a){if(!(t[n]instanceof e)){var s=w[i],u...
function d (line 70) | function d(e){function n(t,n,i,a,s){for(var u=t[n],l=0;l<e.length;l++)if...
function p (line 70) | function p(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r...
function f (line 70) | function f(e){function n(t,n,o,i,a){for(var s=0;s<e.length;s++){if(null=...
function h (line 70) | function h(){function e(e,t,n,o,i){if(!v(e[t])){return new r("Invalid "+...
function m (line 70) | function m(e){function t(t,n,o,i,a){var s=t[n],u=g(s);if("object"!==u){r...
function v (line 70) | function v(e){switch(typeof e){case"number":case"string":case"undefined"...
function y (line 70) | function y(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"fun...
function g (line 70) | function g(e){var t=typeof e;return Array.isArray(e)?"array":e instanceo...
function b (line 70) | function b(e){var t=g(e);if("object"===t){if(e instanceof Date)return"da...
function _ (line 70) | function _(e){return e.constructor&&e.constructor.name?e.constructor.nam...
function o (line 70) | function o(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n...
function r (line 70) | function r(){}
function o (line 70) | function o(e,o,d,p,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try...
function o (line 70) | function o(e){return i.isValidElement(e)||("production"!==t.env.NODE_ENV...
function o (line 70) | function o(e,t){return e&&"object"==typeof e&&null!=e.key?d.escape(e.key...
function r (line 70) | function r(e,n,i,v){var y=typeof e;if("undefined"!==y&&"boolean"!==y||(e...
function i (line 70) | function i(e,t,n){return null==e?0:r(e,"",t,n)}
function o (line 70) | function o(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=argu...
function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
function r (line 70) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
function i (line 70) | function i(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
function a (line 70) | function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
function n (line 70) | function n(){return r(this,n),i(this,e.apply(this,arguments))}
Condensed preview — 280 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,985K chars).
[
{
"path": ".gitattributes",
"chars": 2518,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".gitignore",
"chars": 4283,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MicrofrontendTemplate/.gitignore",
"chars": 6064,
"preview": "### App ###\ndist/\n\n### Code ###\n# Visual Studio Code - https://code.visualstudio.com/\n.settings/\n.vscode/\njsconfig.json"
},
{
"path": "MicrofrontendTemplate/Microfrontend.sln",
"chars": 3500,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.572\nMi"
},
{
"path": "MicrofrontendTemplate/Portal/Portal.csproj",
"chars": 1995,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n <RootN"
},
{
"path": "MicrofrontendTemplate/Portal/Properties/launchSettings.json",
"chars": 832,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "MicrofrontendTemplate/Portal/appsettings.json",
"chars": 64,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://localhost:5000\"\n }\n}"
},
{
"path": "MicrofrontendTemplate/Portal/client/auth.js",
"chars": 1074,
"preview": "const url = '/api/login';\n\nexport const signIn = (username, password) => {\n return fetch(url, {\n method: 'post',\n "
},
{
"path": "MicrofrontendTemplate/Portal/client/components/App.js",
"chars": 1050,
"preview": "import { Fragment, useState, useEffect } from 'react';\nimport { getAccessToken, validateToken } from '../auth';\nimport P"
},
{
"path": "MicrofrontendTemplate/Portal/client/components/Landing.js",
"chars": 3026,
"preview": "import { Main, Header, Alert, Panel, Section, withTheme } from 'dotnetify-elements';\nimport { CompanyLogo } from './App'"
},
{
"path": "MicrofrontendTemplate/Portal/client/components/Login.js",
"chars": 1820,
"preview": "import { useState } from 'react';\nimport { signIn } from '../auth';\nimport { Alert, Button, Form, Panel, PasswordField, "
},
{
"path": "MicrofrontendTemplate/Portal/client/components/Portal.js",
"chars": 1930,
"preview": "import {\n Main,\n Header,\n Nav,\n NavDrawerButton,\n NavMenu,\n NavMenuTarget,\n Button,\n Panel,\n Section,\n VMConte"
},
{
"path": "MicrofrontendTemplate/Portal/client/index.js",
"chars": 1225,
"preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport loader from './loader';\nimport App f"
},
{
"path": "MicrofrontendTemplate/Portal/client/loader.js",
"chars": 1695,
"preview": "import dotnetify from 'dotnetify';\nimport { getAccessToken } from './auth';\nimport { updatePortal } from './components/P"
},
{
"path": "MicrofrontendTemplate/Portal/package.json",
"chars": 1268,
"preview": "{\n \"version\": \"1.0.0\",\n \"name\": \"portal\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \"prod\": \"webpa"
},
{
"path": "MicrofrontendTemplate/Portal/run.bat",
"chars": 169,
"preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
},
{
"path": "MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs",
"chars": 1773,
"preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Options;\nusing Shared;\nusing System;\nusing System.Net.Http;\n"
},
{
"path": "MicrofrontendTemplate/Portal/server/Program.cs",
"chars": 521,
"preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Po"
},
{
"path": "MicrofrontendTemplate/Portal/server/Startup.cs",
"chars": 2581,
"preview": "using Microsoft.AspNetCore.Authentication.JwtBearer;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hos"
},
{
"path": "MicrofrontendTemplate/Portal/tempkey.rsa",
"chars": 1689,
"preview": "{\"KeyId\":\"0ba2028548bfe91576a5940388a7cdbb\",\"Parameters\":{\"D\":\"UkWCmbhxnXgJc4SiqAk+6xS0V48iNAt7n/TBICboACMdc+ocGvcR5mqBn"
},
{
"path": "MicrofrontendTemplate/Portal/webpack.config.js",
"chars": 1429,
"preview": "'use strict';\n\nconst path = require('path');\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpac"
},
{
"path": "MicrofrontendTemplate/Portal/wwwroot/404.html",
"chars": 146,
"preview": "<h2>Page not found (404)</h2>\n<p>Redirecting to home page...</p>\n<script>setTimeout(function() {(window.location.href = "
},
{
"path": "MicrofrontendTemplate/Portal/wwwroot/index.html",
"chars": 1554,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>DotNetify Micro-Frontend Demo</title>\n <meta charset=\"utf-8\">\n "
},
{
"path": "MicrofrontendTemplate/README.md",
"chars": 1119,
"preview": "<p align=\"center\"><img width=\"300px\" src=\"https://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify - "
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/Properties/launchSettings.json",
"chars": 832,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/README.md",
"chars": 105,
"preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/ReactDashboardApp.csproj",
"chars": 2269,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n <RootN"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/appsettings.json",
"chars": 64,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://localhost:5000\"\n }\n}"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js",
"chars": 1520,
"preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { Card, Cell, Element, Panel } from 'dotnetify"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/client/components/Dashboard.js",
"chars": 1960,
"preview": "import React from 'react';\nimport { Card, Frame, Panel, VMContext, withTheme } from 'dotnetify-elements';\nimport { BarCh"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js",
"chars": 903,
"preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { Card, CardImage, Element } from 'dotnetify-e"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/client/index.js",
"chars": 266,
"preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport Dashboard from './components/Dashboa"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/package.json",
"chars": 1254,
"preview": "{\n \"version\": \"1.0.0\",\n \"name\": \"react-dashboard-app\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \""
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/run.bat",
"chars": 169,
"preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/server/Program.cs",
"chars": 394,
"preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactDashboardApp\n{\n public class Program\n"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs",
"chars": 4040,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing Bogus;\n\nnamespace R"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs",
"chars": 3411,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Http;\nusing DotNetify;\nusing DotNetif"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs",
"chars": 2524,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/webpack.config.js",
"chars": 1154,
"preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
},
{
"path": "MicrofrontendTemplate/ReactDashboardApp/wwwroot/index.html",
"chars": 1008,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>React Dashboard App</title>\n <meta charset=\"utf-8\">\n <meta "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/Properties/launchSettings.json",
"chars": 832,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/README.md",
"chars": 105,
"preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/ReactFormApp.csproj",
"chars": 2262,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n <RootN"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/appsettings.json",
"chars": 64,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://localhost:5000\"\n }\n}"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/client/components/AddressForm.js",
"chars": 672,
"preview": "import React from 'react';\nimport { Cell, DropdownList, Form, NumberField, Panel, TextField, VMContext } from 'dotnetify"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/client/components/BasicInfoForm.js",
"chars": 1241,
"preview": "import React from 'react';\nimport { Cell, DropdownList, Form, Panel, TextField, VMContext } from 'dotnetify-elements';\n\n"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/client/components/Form.js",
"chars": 2088,
"preview": "import React from 'react';\nimport BasicInfoForm from './BasicInfoForm';\nimport AddressForm from './AddressForm';\nimport "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js",
"chars": 2674,
"preview": "import React from 'react';\nimport { Button, DropdownList, Form, Modal, NumberField, Panel, Tab, TabItem, TextField, VMCo"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/client/index.js",
"chars": 246,
"preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport Form from './components/Form';\n\ncons"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/package.json",
"chars": 1249,
"preview": "{\n \"version\": \"1.0.0\",\n \"name\": \"react-form-app\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \"prod\""
},
{
"path": "MicrofrontendTemplate/ReactFormApp/run.bat",
"chars": 169,
"preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/Program.cs",
"chars": 389,
"preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactFormApp\n{\n public class Program\n {\n"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs",
"chars": 3528,
"preview": "using System;\nusing System.ComponentModel;\n\nnamespace ReactFormApp\n{\n #region Enums\n\n public enum NamePrefix\n {\n "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs",
"chars": 315,
"preview": "using System.Collections.Generic;\n\nnamespace ReactFormApp\n{\n using StringDictionary = Dictionary<string, string>;\n\n "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs",
"chars": 2840,
"preview": "using Bogus;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing Syst"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/Startup.cs",
"chars": 3397,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Http;\nusing DotNetify;\nusing DotNetif"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs",
"chars": 1435,
"preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs",
"chars": 3556,
"preview": "using System;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs",
"chars": 836,
"preview": "using DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\nusing System.Linq;\nusing System.Reactive.Linq;\n\nna"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs",
"chars": 1751,
"preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs",
"chars": 1415,
"preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
},
{
"path": "MicrofrontendTemplate/ReactFormApp/webpack.config.js",
"chars": 1154,
"preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
},
{
"path": "MicrofrontendTemplate/ReactFormApp/wwwroot/index.html",
"chars": 998,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>React Form App</title>\n <meta charset=\"utf-8\">\n <meta name="
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/Properties/launchSettings.json",
"chars": 832,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/README.md",
"chars": 105,
"preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/ReactTodoApp.csproj",
"chars": 2101,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>netcoreapp2.1</TargetFramework>\n <RootN"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/appsettings.json",
"chars": 64,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://localhost:5000\"\n }\n}"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js",
"chars": 3962,
"preview": "import React from 'react';\nimport dotnetify from 'dotnetify';\nimport { Alert, Checkbox, Cell, Frame, Panel, TextField, w"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/client/index.js",
"chars": 258,
"preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport TodoList from './components/TodoList"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/package.json",
"chars": 1249,
"preview": "{\n \"version\": \"1.0.0\",\n \"name\": \"react-todo-app\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \"prod\""
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/run.bat",
"chars": 169,
"preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/server/Program.cs",
"chars": 389,
"preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactTodoApp\n{\n public class Program\n {\n"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/server/Startup.cs",
"chars": 2992,
"preview": "using DotNetify;\nusing DotNetify.Security;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusin"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs",
"chars": 1679,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/webpack.config.js",
"chars": 1150,
"preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
},
{
"path": "MicrofrontendTemplate/ReactTodoApp/wwwroot/index.html",
"chars": 1285,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>ReactTodoApp</title>\n <meta charset=\"utf-8\">\n <meta name=\"v"
},
{
"path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs",
"chars": 2153,
"preview": "using IdentityModel;\nusing IdentityModel.Client;\nusing Microsoft.IdentityModel.Tokens;\nusing System;\nusing System.Colle"
},
{
"path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs",
"chars": 1020,
"preview": "using System.Collections.Generic;\nusing IdentityServer4.Models;\n\nnamespace Shared\n{\n public class IdentityServerConfi"
},
{
"path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs",
"chars": 177,
"preview": "namespace Shared\n{\n public class IdentityServerSettings\n {\n public static readonly string SectionName = \"Ident"
},
{
"path": "MicrofrontendTemplate/Shared/Shared.csproj",
"chars": 324,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/Properties/launchSettings.json",
"chars": 832,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "MicrofrontendTemplate/VueTodoApp/README.md",
"chars": 105,
"preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/VueTodoApp.csproj",
"chars": 2099,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>netcoreapp2.1</TargetFramework>\n <RootN"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/appsettings.json",
"chars": 64,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://localhost:5000\"\n }\n}"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/client/components/TodoList.vue",
"chars": 3804,
"preview": "<template>\n <h4 v-if=\"error\">{{error.message}}</h4>\n <d-frame v-else middle=\"true\" css=\"width: calc(100% - 3rem)\">\n "
},
{
"path": "MicrofrontendTemplate/VueTodoApp/client/index.js",
"chars": 478,
"preview": "import Vue from 'vue';\nimport vueCustomElement from 'vue-custom-element';\nimport TodoList from './components/TodoList.vu"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/package.json",
"chars": 846,
"preview": "{\n \"version\": \"1.0.0\",\n \"name\": \"vue-todo-app\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \"prod\": "
},
{
"path": "MicrofrontendTemplate/VueTodoApp/run.bat",
"chars": 169,
"preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/server/Program.cs",
"chars": 387,
"preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace VueTodoApp\n{\n public class Program\n {\n "
},
{
"path": "MicrofrontendTemplate/VueTodoApp/server/Startup.cs",
"chars": 2978,
"preview": "using DotNetify;\nusing DotNetify.Security;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusin"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs",
"chars": 1675,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/webpack.config.js",
"chars": 1178,
"preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\nconst { VueLoaderP"
},
{
"path": "MicrofrontendTemplate/VueTodoApp/wwwroot/index.html",
"chars": 1157,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>VueTodoApp</title>\n <meta charset=\"utf-8\">\n <meta name=\"vie"
},
{
"path": "MicrofrontendTemplate/global.json",
"chars": 44,
"preview": "{\n \"sdk\": {\n \"version\": \"3.1.201\"\n }\n}\n"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/Portal/Dockerfile",
"chars": 550,
"preview": "FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build\nLABEL stage=build\nWORKDIR /src\nCOPY ./__tmp__ .\n\n# Install node.js\nR"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/Portal/appsettings.json",
"chars": 78,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://dotnetify-mfe.herokuapp.com\"\n }\n}\n"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/Portal/build.bat",
"chars": 607,
"preview": "@echo off\nset env=Production\nif \"%1\"==\"\" goto :next\nset env=%1\n:next\n\necho --- Copy source code\nxcopy ..\\..\\Portal\\*.* ."
},
{
"path": "MicrofrontendTemplate/heroku-deploy/Portal/deploy.bat",
"chars": 375,
"preview": "@echo off\n\necho --- Copy source code\nxcopy ..\\..\\Portal\\*.* .\\__tmp__\\Portal\\ /q /s /e /d /y /exclude:excludedfiles.txt\n"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/Portal/excludedfiles.txt",
"chars": 92,
"preview": ".vssscc\n.vspscc\n.log\n.user\n\\obj\\\n\\bin\\\n\\Properties\\\n\\node_modules\\\n\\coverage\\\n\\wwwroot\\dist\\"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/Dockerfile",
"chars": 583,
"preview": "FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build\nLABEL stage=build\nWORKDIR /src\nCOPY ./__tmp__ .\n\n# Install node.js\nR"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/appsettings.json",
"chars": 78,
"preview": "{\n \"IdentityServer\": {\n \"Uri\": \"http://dotnetify-mfe.herokuapp.com\"\n }\n}\n"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/build.bat",
"chars": 638,
"preview": "@echo off\nset env=Production\nif \"%1\"==\"\" goto :next\nset env=%1\n:next\n\necho --- Copy source code\nxcopy ..\\..\\ReactDashboa"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/deploy.bat",
"chars": 414,
"preview": "@echo off\n\necho --- Copy source code\nxcopy ..\\..\\ReactDashboardApp\\*.* .\\__tmp__\\ReactDashboardApp\\ /q /s /e /d /y /excl"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/excludedfiles.txt",
"chars": 92,
"preview": ".vssscc\n.vspscc\n.log\n.user\n\\obj\\\n\\bin\\\n\\Properties\\\n\\node_modules\\\n\\coverage\\\n\\wwwroot\\dist\\"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/nginx/Dockerfile",
"chars": 130,
"preview": "FROM nginx:alpine\nCOPY ./nginx.conf /etc/nginx\nCMD sed -i -e 's/$PORT/'\"$PORT\"'/g' /etc/nginx/nginx.conf && nginx -g 'da"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/nginx/deploy.bat",
"chars": 111,
"preview": "@echo off\n\ncall heroku container:push web -a dotnetify-mfe\ncall heroku container:release web -a dotnetify-mfe\n\n"
},
{
"path": "MicrofrontendTemplate/heroku-deploy/nginx/nginx.conf",
"chars": 2287,
"preview": "\nworker_processes 1;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n log_format main '$remote_addr - $remote_us"
},
{
"path": "MicrofrontendTemplate/nginx/.gitignore",
"chars": 4,
"preview": "logs"
},
{
"path": "MicrofrontendTemplate/nginx/conf/fastcgi.conf",
"chars": 1077,
"preview": "\nfastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\nfastcgi_param QUERY_STRING $query_string;\n"
},
{
"path": "MicrofrontendTemplate/nginx/conf/fastcgi_params",
"chars": 1007,
"preview": "\nfastcgi_param QUERY_STRING $query_string;\nfastcgi_param REQUEST_METHOD $request_method;\nfastcgi_param CONT"
},
{
"path": "MicrofrontendTemplate/nginx/conf/koi-utf",
"chars": 2837,
"preview": "\n# This map is not a full koi8-r <> utf8 map: it does not contain\n# box-drawing and some other characters. Besides this"
},
{
"path": "MicrofrontendTemplate/nginx/conf/koi-win",
"chars": 2223,
"preview": "\ncharset_map koi8-r windows-1251 {\n\n 80 88 ; # euro\n\n 95 95 ; # bullet\n\n 9A A0 ; # \n\n 9E B7 ; # "
},
{
"path": "MicrofrontendTemplate/nginx/conf/mime.types",
"chars": 5231,
"preview": "\ntypes {\n text/html html htm shtml;\n text/css "
},
{
"path": "MicrofrontendTemplate/nginx/conf/nginx.conf",
"chars": 2080,
"preview": "\nworker_processes 1;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n log_format main '$remote_addr - $remote_us"
},
{
"path": "MicrofrontendTemplate/nginx/conf/scgi_params",
"chars": 636,
"preview": "\nscgi_param REQUEST_METHOD $request_method;\nscgi_param REQUEST_URI $request_uri;\nscgi_param QUERY_STRING "
},
{
"path": "MicrofrontendTemplate/nginx/conf/uwsgi_params",
"chars": 664,
"preview": "\nuwsgi_param QUERY_STRING $query_string;\nuwsgi_param REQUEST_METHOD $request_method;\nuwsgi_param CONTENT_TY"
},
{
"path": "MicrofrontendTemplate/nginx/conf/win-utf",
"chars": 3610,
"preview": "\n# This map is not a full windows-1251 <> utf8 map: it does not\n# contain Serbian and Macedonian letters. If you need a"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/README",
"chars": 543,
"preview": "\ngeo2nginx.pl \t\tby Andrei Nigmatulin\n\n\tThe perl script to convert CSV geoip database ( free download\n\tat http://www.maxm"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/geo2nginx.pl",
"chars": 1214,
"preview": "#!/usr/bin/perl -w\n\n# (c) Andrei Nigmatulin, 2005\n#\n# this script provided \"as is\", without any warranties. use it at yo"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/koi-utf",
"chars": 5991,
"preview": "charset_map koi8-r utf-8 {\n\n 80 E29480 ; #\tBOX DRAWINGS LIGHT HORIZONTAL\n 81 E29482 ; #\tBOX DRAWINGS LIGHT VER"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/unicode-to-nginx.pl",
"chars": 1090,
"preview": "#!/usr/bin/perl -w\n\n# Convert unicode mappings to nginx configuration file format.\n\n# You may find useful mappings in va"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/win-utf",
"chars": 5339,
"preview": "charset_map windows-1251 utf-8 {\n\n 80 D082 ; #CYRILLIC CAPITAL LETTER DJE\n 81 D083 ; #CYRILLIC CAPITAL LETTER "
},
{
"path": "MicrofrontendTemplate/nginx/contrib/vim/ftdetect/nginx.vim",
"chars": 198,
"preview": "au BufRead,BufNewFile *.nginx set ft=nginx\nau BufRead,BufNewFile */etc/nginx/* set ft=nginx\nau BufRead,BufNewFile */usr/"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/vim/ftplugin/nginx.vim",
"chars": 29,
"preview": "setlocal commentstring=#\\ %s\n"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/vim/indent/nginx.vim",
"chars": 250,
"preview": "if exists(\"b:did_indent\")\n finish\nendif\nlet b:did_indent = 1\n\nsetlocal indentexpr=\n\n\" cindent actually works for ngin"
},
{
"path": "MicrofrontendTemplate/nginx/contrib/vim/syntax/nginx.vim",
"chars": 129789,
"preview": "\" Vim syntax file\n\" Language: nginx.conf\n\nif exists(\"b:current_syntax\")\n finish\nend\n\n\" general syntax\n\nif has(\"patch-7."
},
{
"path": "MicrofrontendTemplate/nginx/docs/CHANGES",
"chars": 296215,
"preview": "\nChanges with nginx 1.16.0 23 Apr 2019\n\n *) 1.16.x stable branch.\n\n\nChanges wi"
},
{
"path": "MicrofrontendTemplate/nginx/docs/CHANGES.ru",
"chars": 305256,
"preview": "\nИзменения в nginx 1.16.0 23.04.2019\n\n *) Стабильная ветка 1.16.x.\n\n\nИзменен"
},
{
"path": "MicrofrontendTemplate/nginx/docs/LICENSE",
"chars": 1397,
"preview": "/* \n * Copyright (C) 2002-2019 Igor Sysoev\n * Copyright (C) 2011-2019 Nginx, Inc.\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "MicrofrontendTemplate/nginx/docs/OpenSSL.LICENSE",
"chars": 6121,
"preview": "\n LICENSE ISSUES\n ==============\n\n The OpenSSL toolkit stays under a double license, i.e. both the conditions of\n th"
},
{
"path": "MicrofrontendTemplate/nginx/docs/PCRE.LICENCE",
"chars": 3182,
"preview": "PCRE LICENCE\n------------\n\nPCRE is a library of functions to support regular expressions whose syntax\nand semantics are "
},
{
"path": "MicrofrontendTemplate/nginx/docs/README",
"chars": 49,
"preview": "\nDocumentation is available at http://nginx.org\n\n"
},
{
"path": "MicrofrontendTemplate/nginx/docs/zlib.LICENSE",
"chars": 983,
"preview": " (C) 1995-2017 Jean-loup Gailly and Mark Adler\n\n This software is provided 'as-is', without any express or implied\n wa"
},
{
"path": "MicrofrontendTemplate/nginx/html/50x.html",
"chars": 494,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<title>Error</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n "
},
{
"path": "MicrofrontendTemplate/nginx/html/index.html",
"chars": 612,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0"
},
{
"path": "MicrofrontendTemplate/nginx/run.bat",
"chars": 64,
"preview": "if not exist logs mkdir logs\nif not exist temp mkdir temp\nnginx\n"
},
{
"path": "MicrofrontendTemplate/nginx/stop.bat",
"chars": 14,
"preview": "nginx -s stop\n"
},
{
"path": "MicrofrontendTemplate/run.bat",
"chars": 453,
"preview": "@echo off\nif \"%1\" == \"apps\" goto :apps\n\ncd nginx\nstart cmd /k run.bat\ncd ..\n\ncd Portal\nstart cmd /k run prod\ncd ..\n@echo"
},
{
"path": "README.md",
"chars": 898,
"preview": "<p align=\"center\"><img width=\"300px\" src=\"http://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify Rea"
},
{
"path": "ReactTemplate/README.md",
"chars": 1716,
"preview": "<p align=\"center\"><img width=\"300px\" src=\"http://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify Rea"
},
{
"path": "ReactTemplate/content/.gitignore",
"chars": 293,
"preview": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/bin\n/obj\n\n#Vis"
},
{
"path": "ReactTemplate/content/client/app.tsx",
"chars": 217,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './routes';\nimport 'flexboxgrid/css/flexbox"
},
{
"path": "ReactTemplate/content/client/auth.ts",
"chars": 920,
"preview": "class Auth {\n url = '/token';\n\n signIn(username: string, password: string): Promise<void> {\n return fetch(this.url,"
},
{
"path": "ReactTemplate/content/client/components/BasePage.tsx",
"chars": 649,
"preview": "import React from 'react';\nimport Paper from '@material-ui/core/Paper';\nimport Divider from '@material-ui/core/Divider';"
},
{
"path": "ReactTemplate/content/client/components/Header.tsx",
"chars": 1993,
"preview": "import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/"
},
{
"path": "ReactTemplate/content/client/components/Sidebar.tsx",
"chars": 2672,
"preview": "import React from 'react';\nimport { RouteLink, IDotnetifyVM } from 'dotnetify';\nimport { makeStyles } from '@material-ui"
},
{
"path": "ReactTemplate/content/client/components/dashboard/InfoBox.tsx",
"chars": 1302,
"preview": "import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Card from \"@material-ui/core/Ca"
},
{
"path": "ReactTemplate/content/client/components/dashboard/RecentActivities.tsx",
"chars": 2652,
"preview": "import React from \"react\";\nimport { IDotnetifyVM, RouteType } from \"dotnetify\";\nimport { makeStyles } from \"@material-ui"
},
{
"path": "ReactTemplate/content/client/components/dashboard/ServerUsage.tsx",
"chars": 1717,
"preview": "import React from \"react\";\nimport { Chart as ChartJS, CategoryScale, LinearScale, ArcElement, BarElement, Title, Tooltip"
},
{
"path": "ReactTemplate/content/client/components/dashboard/Traffic.tsx",
"chars": 1595,
"preview": "import React from \"react\";\nimport { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Title, Tool"
},
{
"path": "ReactTemplate/content/client/components/dashboard/Utilization.tsx",
"chars": 2699,
"preview": "import React from \"react\";\nimport { Doughnut } from \"react-chartjs-2\";\nimport { makeStyles } from \"@material-ui/core/sty"
},
{
"path": "ReactTemplate/content/client/components/table/InlineEdit.tsx",
"chars": 2246,
"preview": "import React from 'react';\nimport EditIcon from '@material-ui/icons/Create';\nimport TextField from '@material-ui/core/Te"
},
{
"path": "ReactTemplate/content/client/components/table/Pagination.tsx",
"chars": 890,
"preview": "import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/P"
},
{
"path": "ReactTemplate/content/client/routes.tsx",
"chars": 312,
"preview": "import App from './views/App';\nimport Dashboard from './views/Dashboard';\nimport FormPage from './views/FormPage';\nimpor"
},
{
"path": "ReactTemplate/content/client/styles/app.css",
"chars": 398,
"preview": "html {\n font-family: 'Roboto', sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n\nbody,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n f"
},
{
"path": "ReactTemplate/content/client/styles/styles.ts",
"chars": 389,
"preview": "import React from 'react';\n\nconst styles: { [name: string]: React.CSSProperties } = {\n navigation: {\n fontSize: 15,\n"
},
{
"path": "ReactTemplate/content/client/styles/theme-default.ts",
"chars": 425,
"preview": "import { blue, pink, grey } from \"@material-ui/core/colors\";\nimport { createTheme } from \"@material-ui/core/styles\";\n\nex"
},
{
"path": "ReactTemplate/content/client/views/App.tsx",
"chars": 403,
"preview": "import React from 'react';\nimport LoginPage from './LoginPage';\nimport AppLayout from './AppLayout';\nimport auth from '."
},
{
"path": "ReactTemplate/content/client/views/AppLayout.tsx",
"chars": 2336,
"preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM, RouteTarget } from 'dotnetify';\nimport { ThemeProvider } fr"
},
{
"path": "ReactTemplate/content/client/views/Dashboard.tsx",
"chars": 3567,
"preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM } from 'dotnetify';\nimport { ThemeProvider } from '@material"
},
{
"path": "ReactTemplate/content/client/views/FormPage.tsx",
"chars": 3598,
"preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM, RouteType } from 'dotnetify';\nimport { ThemeProvider } from"
},
{
"path": "ReactTemplate/content/client/views/LoginPage.tsx",
"chars": 2937,
"preview": "import React from 'react';\nimport { useState } from 'react';\nimport Card from '@material-ui/core/Card';\nimport Button fr"
},
{
"path": "ReactTemplate/content/client/views/TablePage.tsx",
"chars": 5051,
"preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM } from 'dotnetify';\nimport { ThemeProvider } from '@material"
},
{
"path": "ReactTemplate/content/package.json",
"chars": 1191,
"preview": "{\n \"version\": \"6.0.0\",\n \"name\": \"projectName__lower\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\",\n \"b"
},
{
"path": "ReactTemplate/content/projectName.csproj",
"chars": 2351,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>net6.0</TargetFramework>\n <TypeScriptCo"
},
{
"path": "ReactTemplate/content/projectName.sln",
"chars": 1091,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.16\nMin"
},
{
"path": "ReactTemplate/content/server/AuthServer.cs",
"chars": 2660,
"preview": "using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing AspNet.Security.OpenIdCon"
},
{
"path": "ReactTemplate/content/server/Program.cs",
"chars": 1502,
"preview": "using System.Text;\nusing BrunoLau.SpaServices.Webpack;\nusing DotNetify;\nusing DotNetify.Security;\nusing Microsoft.Ident"
},
{
"path": "ReactTemplate/content/server/Services/EmployeeService.cs",
"chars": 1837,
"preview": "using System.Text;\nusing Newtonsoft.Json;\n\nnamespace projectName;\n\npublic interface IEmployeeService\n{\n IList<Employe"
},
{
"path": "ReactTemplate/content/server/Services/MockLiveDataService.cs",
"chars": 3576,
"preview": "using System.Reactive.Linq;\n\nnamespace projectName;\n\npublic interface ILiveDataService\n{\n IObservable<string> Download"
},
{
"path": "ReactTemplate/content/server/Services/employees.json",
"chars": 1890,
"preview": "[\n {\n \"Id\": 1,\n \"FirstName\": \"Clive\",\n \"LastName\": \"Lewis\",\n \"ReportTo\": 0\n },\n {\n \"Id\": 2,\n \"Firs"
},
{
"path": "ReactTemplate/content/server/ViewModels/AppLayout.cs",
"chars": 1565,
"preview": "using System.Security.Claims;\nusing DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName"
},
{
"path": "ReactTemplate/content/server/ViewModels/Dashboard.cs",
"chars": 2169,
"preview": "using System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName;\n"
},
{
"path": "ReactTemplate/content/server/ViewModels/Form.cs",
"chars": 2114,
"preview": "using DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName;\n\n[Authorize]\npublic class Fo"
},
{
"path": "ReactTemplate/content/server/ViewModels/Table.cs",
"chars": 3588,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing DotNetify;\nusing DotNetify.Security;\n\nnamespace"
},
{
"path": "ReactTemplate/content/tsconfig.json",
"chars": 465,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"esnext\",\n \"moduleResolution\": \"node\",\n \"target\": \"es5\",\n \"noImplicitAny"
},
{
"path": "ReactTemplate/content/webpack.config.js",
"chars": 743,
"preview": "\"use strict\";\n\nconst MiniCssExtractPlugin = require(\"mini-css-extract-plugin\");\n\nmodule.exports = {\n mode: \"development"
},
{
"path": "ReactTemplate/content/wwwroot/404.html",
"chars": 556,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>Page not found</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\""
},
{
"path": "ReactTemplate/content/wwwroot/index.html",
"chars": 715,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>DotNetify Template</title>\n <meta charset=\"utf-8\">\n <meta na"
},
{
"path": "ReactTemplate/template.nuspec",
"chars": 680,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd\">\n <me"
},
{
"path": "_archive/HelloWorld/HelloWorld.cs",
"chars": 666,
"preview": "using System;\nusing DotNetify;\nusing System.Threading;\n\nnamespace HelloWorld\n{\n public class HelloWorld : BaseVM\n {"
},
{
"path": "_archive/HelloWorld/HelloWorld.csproj",
"chars": 365,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp2.1</TargetFramework>\n </Prope"
},
{
"path": "_archive/HelloWorld/HelloWorld.sln",
"chars": 962,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.4\nMini"
},
{
"path": "_archive/HelloWorld/Program.cs",
"chars": 606,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing"
},
{
"path": "_archive/HelloWorld/Properties/launchSettings.json",
"chars": 623,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "_archive/HelloWorld/Startup.cs",
"chars": 1281,
"preview": "using System.IO;\nusing System.Collections.Generic;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosti"
},
{
"path": "_archive/HelloWorld/package.json",
"chars": 913,
"preview": "{\n \"name\": \"livechart\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"webpack\"\n },\n \"babel\": {\n \"presets\": [\n "
},
{
"path": "_archive/HelloWorld/src/HelloWorld.jsx",
"chars": 625,
"preview": "import React from 'react';\nimport dotnetify from 'dotnetify';\n\nclass HelloWorld extends React.Component {\n constructo"
},
{
"path": "_archive/HelloWorld/src/app.js",
"chars": 175,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport HelloWorld from './HelloWorld.jsx';\n\nReactDOM.rende"
},
{
"path": "_archive/HelloWorld/webpack.config.js",
"chars": 310,
"preview": "'use strict';\n\nmodule.exports = {\n\tmode: 'development',\n\tentry: { bundle: './src/app.js' },\n\toutput: {\n\t\tpath: __dirnam"
},
{
"path": "_archive/HelloWorld/wwwroot/bundle.js",
"chars": 1265644,
"preview": "/******/ (function(modules) { // webpackBootstrap\n/******/ \tfunction hotDisposeChunk(chunkId) {\n/******/ \t\tdelete instal"
},
{
"path": "_archive/HelloWorld/wwwroot/index.html",
"chars": 400,
"preview": "<html>\n<head>\n <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF8\">\n <title>DotNetify-React</title>\n<"
},
{
"path": "_archive/LiveChart/IISPublishingSteps.md",
"chars": 1091,
"preview": "## IIS Publishing Steps\n\n### Prerequisite:\n\nInstall ASP.NET Core Module for IIS. You can download it here:<br/>\nhttps:/"
},
{
"path": "_archive/LiveChart/LiveChart.cs",
"chars": 865,
"preview": "using System;\nusing System.Reactive.Linq;\nusing Rx = System.Reactive.Linq;\nusing DotNetify;\n\nnamespace LiveChart\n{\n p"
},
{
"path": "_archive/LiveChart/LiveChart.csproj",
"chars": 432,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp2.1</TargetFramework>\n </Prope"
},
{
"path": "_archive/LiveChart/LiveChart.sln",
"chars": 960,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.4\nMini"
},
{
"path": "_archive/LiveChart/Program.cs",
"chars": 605,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing"
},
{
"path": "_archive/LiveChart/Properties/launchSettings.json",
"chars": 620,
"preview": "{\n \"iisSettings\": {\n \"windowsAuthentication\": false,\n \"anonymousAuthentication\": true,\n \"iisExpress\": {\n "
},
{
"path": "_archive/LiveChart/Startup.cs",
"chars": 1280,
"preview": "using System.IO;\nusing System.Collections.Generic;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosti"
}
]
// ... and 80 more files (download for full content)
About this extraction
This page contains the full source code of the dsuryd/dotnetify-react-demo-vs2017 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 280 files (5.3 MB), approximately 1.4M tokens, and a symbol index with 1270 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.