├── .stylelintrc.json ├── Dockerfile ├── LICENSE ├── README.md ├── angular.json ├── dist ├── 3rdpartylicenses.txt ├── Roboto-Black.eot ├── Roboto-Black.svg ├── Roboto-Black.ttf ├── Roboto-Black.woff ├── Roboto-Black.woff2 ├── Roboto-BlackItalic.eot ├── Roboto-BlackItalic.svg ├── Roboto-BlackItalic.ttf ├── Roboto-BlackItalic.woff ├── Roboto-BlackItalic.woff2 ├── Roboto-Bold.eot ├── Roboto-Bold.svg ├── Roboto-Bold.ttf ├── Roboto-Bold.woff ├── Roboto-Bold.woff2 ├── Roboto-BoldItalic.eot ├── Roboto-BoldItalic.svg ├── Roboto-BoldItalic.ttf ├── Roboto-BoldItalic.woff ├── Roboto-BoldItalic.woff2 ├── Roboto-Light.eot ├── Roboto-Light.svg ├── Roboto-Light.ttf ├── Roboto-Light.woff ├── Roboto-Light.woff2 ├── Roboto-LightItalic.eot ├── Roboto-LightItalic.svg ├── Roboto-LightItalic.ttf ├── Roboto-LightItalic.woff ├── Roboto-LightItalic.woff2 ├── Roboto-Medium.eot ├── Roboto-Medium.svg ├── Roboto-Medium.ttf ├── Roboto-Medium.woff ├── Roboto-Medium.woff2 ├── Roboto-MediumItalic.eot ├── Roboto-MediumItalic.svg ├── Roboto-MediumItalic.ttf ├── Roboto-MediumItalic.woff ├── Roboto-MediumItalic.woff2 ├── Roboto-Regular.eot ├── Roboto-Regular.svg ├── Roboto-Regular.ttf ├── Roboto-Regular.woff ├── Roboto-Regular.woff2 ├── Roboto-RegularItalic.eot ├── Roboto-RegularItalic.svg ├── Roboto-RegularItalic.ttf ├── Roboto-RegularItalic.woff ├── Roboto-RegularItalic.woff2 ├── Roboto-Thin.eot ├── Roboto-Thin.svg ├── Roboto-Thin.ttf ├── Roboto-Thin.woff ├── Roboto-Thin.woff2 ├── Roboto-ThinItalic.eot ├── Roboto-ThinItalic.svg ├── Roboto-ThinItalic.ttf ├── Roboto-ThinItalic.woff ├── Roboto-ThinItalic.woff2 ├── app-pages-pages-module.js ├── app-pages-pages-module.js.map ├── assets │ ├── images │ │ ├── bootstrap.min.css │ │ ├── logo.svg │ │ ├── nick.png │ │ ├── square_pattern.svg │ │ ├── square_pattern_cosmic.svg │ │ └── your_style.css │ ├── img │ │ └── markers │ │ │ ├── layers-2x.png │ │ │ ├── layers.png │ │ │ ├── marker-icon-2x.png │ │ │ ├── marker-icon.png │ │ │ └── marker-shadow.png │ ├── leaflet-countries │ │ └── countries.geo.json │ ├── map │ │ └── world.json │ ├── ngx-datatable │ │ ├── app.css │ │ ├── dark.css │ │ ├── icons.css │ │ ├── index.css │ │ └── material.css │ └── skins │ │ └── lightgray │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── fonts │ │ ├── tinymce-small.eot │ │ ├── tinymce-small.svg │ │ ├── tinymce-small.ttf │ │ ├── tinymce-small.woff │ │ ├── tinymce.eot │ │ ├── tinymce.svg │ │ ├── tinymce.ttf │ │ └── tinymce.woff │ │ ├── img │ │ ├── anchor.gif │ │ ├── loader.gif │ │ ├── object.gif │ │ └── trans.gif │ │ ├── skin.ie7.min.css │ │ └── skin.min.css ├── common.js ├── common.js.map ├── exo-latin-100.eot ├── exo-latin-100.svg ├── exo-latin-100.woff ├── exo-latin-100.woff2 ├── exo-latin-100italic.eot ├── exo-latin-100italic.svg ├── exo-latin-100italic.woff ├── exo-latin-100italic.woff2 ├── exo-latin-200.eot ├── exo-latin-200.svg ├── exo-latin-200.woff ├── exo-latin-200.woff2 ├── exo-latin-200italic.eot ├── exo-latin-200italic.svg ├── exo-latin-200italic.woff ├── exo-latin-200italic.woff2 ├── exo-latin-300.eot ├── exo-latin-300.svg ├── exo-latin-300.woff ├── exo-latin-300.woff2 ├── exo-latin-300italic.eot ├── exo-latin-300italic.svg ├── exo-latin-300italic.woff ├── exo-latin-300italic.woff2 ├── exo-latin-400.eot ├── exo-latin-400.svg ├── exo-latin-400.woff ├── exo-latin-400.woff2 ├── exo-latin-400italic.eot ├── exo-latin-400italic.svg ├── exo-latin-400italic.woff ├── exo-latin-400italic.woff2 ├── exo-latin-500.eot ├── exo-latin-500.svg ├── exo-latin-500.woff ├── exo-latin-500.woff2 ├── exo-latin-500italic.eot ├── exo-latin-500italic.svg ├── exo-latin-500italic.woff ├── exo-latin-500italic.woff2 ├── exo-latin-600.eot ├── exo-latin-600.svg ├── exo-latin-600.woff ├── exo-latin-600.woff2 ├── exo-latin-600italic.eot ├── exo-latin-600italic.svg ├── exo-latin-600italic.woff ├── exo-latin-600italic.woff2 ├── exo-latin-700.eot ├── exo-latin-700.svg ├── exo-latin-700.woff ├── exo-latin-700.woff2 ├── exo-latin-700italic.eot ├── exo-latin-700italic.svg ├── exo-latin-700italic.woff ├── exo-latin-700italic.woff2 ├── exo-latin-800.eot ├── exo-latin-800.svg ├── exo-latin-800.woff ├── exo-latin-800.woff2 ├── exo-latin-800italic.eot ├── exo-latin-800italic.svg ├── exo-latin-800italic.woff ├── exo-latin-800italic.woff2 ├── exo-latin-900.eot ├── exo-latin-900.svg ├── exo-latin-900.woff ├── exo-latin-900italic.eot ├── exo-latin-900italic.svg ├── exo-latin-900italic.woff ├── exo-latin-900italic.woff2 ├── fa-brands-400.eot ├── fa-brands-400.svg ├── fa-brands-400.ttf ├── fa-brands-400.woff ├── fa-brands-400.woff2 ├── fa-regular-400.eot ├── fa-regular-400.svg ├── fa-regular-400.ttf ├── fa-regular-400.woff ├── fa-regular-400.woff2 ├── fa-solid-900.eot ├── fa-solid-900.svg ├── fa-solid-900.ttf ├── fa-solid-900.woff ├── fa-solid-900.woff2 ├── favicon.ico ├── favicon.png ├── index.html ├── ionicons.eot ├── ionicons.svg ├── ionicons.ttf ├── ionicons.woff ├── main.js ├── main.js.map ├── nebular.eot ├── nebular.svg ├── nebular.ttf ├── nebular.woff ├── policy-policy-module.js ├── policy-policy-module.js.map ├── policy-policy-module~server-server-module.js ├── policy-policy-module~server-server-module.js.map ├── polyfills.js ├── polyfills.js.map ├── runtime.js ├── runtime.js.map ├── scripts.js ├── scripts.js.map ├── server-server-module.js ├── server-server-module.js.map ├── socicon.eot ├── socicon.svg ├── socicon.ttf ├── socicon.woff ├── styles.js ├── styles.js.map ├── vendor.js └── vendor.js.map ├── e2e └── tsconfig.e2e.json ├── karma.conf.js ├── nginx └── openwaf-ui ├── package-lock.json ├── package.json ├── protractor.conf.js ├── src ├── app │ ├── @core │ │ ├── core.module.ts │ │ ├── data │ │ │ ├── .gitkeep │ │ │ ├── README.md │ │ │ ├── data.module.ts │ │ │ ├── earning.service.ts │ │ │ ├── electricity.service.ts │ │ │ ├── layout.service.ts │ │ │ ├── orders-chart.service.ts │ │ │ ├── orders-profit-chart.service.ts │ │ │ ├── periods.service.ts │ │ │ ├── player.service.ts │ │ │ ├── profit-bar-animation-chart.service.ts │ │ │ ├── profit-chart.service.ts │ │ │ ├── smart-table.service.ts │ │ │ ├── state.service.ts │ │ │ ├── traffic-bar.service.ts │ │ │ ├── traffic-list.service.ts │ │ │ ├── user-activity.service.ts │ │ │ └── users.service.ts │ │ ├── module-import-guard.ts │ │ └── utils │ │ │ ├── .gitkeep │ │ │ └── analytics.service.ts │ ├── @theme │ │ ├── components │ │ │ ├── footer │ │ │ │ ├── footer.component.scss │ │ │ │ └── footer.component.ts │ │ │ ├── header │ │ │ │ ├── header.component.html │ │ │ │ ├── header.component.scss │ │ │ │ └── header.component.ts │ │ │ ├── index.ts │ │ │ ├── layout-direction-switcher │ │ │ │ └── layout-direction-switcher.component.ts │ │ │ ├── search-input │ │ │ │ ├── search-input.component.scss │ │ │ │ └── search-input.component.ts │ │ │ ├── switcher │ │ │ │ ├── switcher.component.scss │ │ │ │ └── switcher.component.ts │ │ │ ├── theme-settings │ │ │ │ ├── theme-settings.component.scss │ │ │ │ └── theme-settings.component.ts │ │ │ ├── theme-switcher │ │ │ │ ├── theme-switcher.component.html │ │ │ │ ├── theme-switcher.component.scss │ │ │ │ ├── theme-switcher.component.ts │ │ │ │ └── themes-switcher-list │ │ │ │ │ ├── theme-switcher-list.component.scss │ │ │ │ │ └── themes-switcher-list.component.ts │ │ │ └── tiny-mce │ │ │ │ └── tiny-mce.component.ts │ │ ├── const │ │ │ └── url.ts │ │ ├── directives │ │ │ └── .gitkeep │ │ ├── http │ │ │ └── basichttp.service.ts │ │ ├── layouts │ │ │ ├── index.ts │ │ │ ├── one-column │ │ │ │ ├── one-column.layout.scss │ │ │ │ └── one-column.layout.ts │ │ │ ├── sample │ │ │ │ ├── sample.layout.scss │ │ │ │ └── sample.layout.ts │ │ │ ├── three-columns │ │ │ │ ├── three-columns.layout.scss │ │ │ │ └── three-columns.layout.ts │ │ │ └── two-columns │ │ │ │ ├── two-columns.layout.scss │ │ │ │ └── two-columns.layout.ts │ │ ├── model │ │ │ ├── page.class.ts │ │ │ └── paged-data.class.ts │ │ ├── pipes │ │ │ ├── .gitkeep │ │ │ ├── capitalize.pipe.ts │ │ │ ├── index.ts │ │ │ ├── number-with-commas.pipe.ts │ │ │ ├── plural.pipe.ts │ │ │ ├── round.pipe.ts │ │ │ └── timing.pipe.ts │ │ ├── styles │ │ │ ├── bootstrap-rtl.scss │ │ │ ├── font-size.scss │ │ │ ├── pace.theme.scss │ │ │ ├── styles.scss │ │ │ ├── theme.corporate.ts │ │ │ ├── theme.cosmic.ts │ │ │ ├── theme.default.ts │ │ │ └── themes.scss │ │ └── theme.module.ts │ ├── app-routing.module.ts │ ├── app.component.ts │ ├── app.module.ts │ └── pages │ │ ├── charts │ │ ├── chartjs │ │ │ ├── chartjs-bar-horizontal.component.ts │ │ │ ├── chartjs-bar.component.ts │ │ │ ├── chartjs-line.component.ts │ │ │ ├── chartjs-multiple-xaxis.component.ts │ │ │ ├── chartjs-pie.component.ts │ │ │ ├── chartjs-radar.component.ts │ │ │ ├── chartjs.component.html │ │ │ ├── chartjs.component.scss │ │ │ └── chartjs.component.ts │ │ ├── charts-routing.module.ts │ │ ├── charts.component.ts │ │ ├── charts.module.ts │ │ ├── d3 │ │ │ ├── d3-advanced-pie.component.ts │ │ │ ├── d3-area-stack.component.ts │ │ │ ├── d3-bar.component.ts │ │ │ ├── d3-line.component.ts │ │ │ ├── d3-pie.component.ts │ │ │ ├── d3-polar.component.ts │ │ │ ├── d3.component.html │ │ │ ├── d3.component.scss │ │ │ └── d3.component.ts │ │ └── echarts │ │ │ ├── echarts-area-stack.component.ts │ │ │ ├── echarts-bar-animation.component.ts │ │ │ ├── echarts-bar.component.ts │ │ │ ├── echarts-line.component.ts │ │ │ ├── echarts-multiple-xaxis.component.ts │ │ │ ├── echarts-pie.component.ts │ │ │ ├── echarts-radar.component.ts │ │ │ ├── echarts.component.html │ │ │ ├── echarts.component.scss │ │ │ └── echarts.component.ts │ │ ├── components │ │ ├── components-routing.module.ts │ │ ├── components.component.ts │ │ ├── components.module.ts │ │ ├── notifications │ │ │ ├── notifications.component.html │ │ │ ├── notifications.component.scss │ │ │ └── notifications.component.ts │ │ └── tree │ │ │ ├── tree.component.html │ │ │ ├── tree.component.scss │ │ │ └── tree.component.ts │ │ ├── dashboard │ │ ├── contacts │ │ │ ├── contacts.component.html │ │ │ ├── contacts.component.scss │ │ │ └── contacts.component.ts │ │ ├── dashboard.component.html │ │ ├── dashboard.component.scss │ │ ├── dashboard.component.ts │ │ ├── dashboard.module.ts │ │ ├── electricity │ │ │ ├── electricity-chart │ │ │ │ ├── electricity-chart.component.scss │ │ │ │ └── electricity-chart.component.ts │ │ │ ├── electricity.component.html │ │ │ ├── electricity.component.scss │ │ │ └── electricity.component.ts │ │ ├── kitten │ │ │ ├── kitten.component.html │ │ │ ├── kitten.component.scss │ │ │ └── kitten.component.ts │ │ ├── rooms │ │ │ ├── player │ │ │ │ ├── player.component.html │ │ │ │ ├── player.component.scss │ │ │ │ └── player.component.ts │ │ │ ├── room-selector │ │ │ │ ├── room-selector.component.html │ │ │ │ ├── room-selector.component.scss │ │ │ │ └── room-selector.component.ts │ │ │ ├── rooms.component.scss │ │ │ └── rooms.component.ts │ │ ├── security-cameras │ │ │ ├── security-cameras.component.html │ │ │ ├── security-cameras.component.scss │ │ │ └── security-cameras.component.ts │ │ ├── solar │ │ │ ├── solar.component.scss │ │ │ └── solar.component.ts │ │ ├── status-card │ │ │ ├── status-card.component.scss │ │ │ └── status-card.component.ts │ │ ├── team │ │ │ ├── team.component.html │ │ │ ├── team.component.scss │ │ │ └── team.component.ts │ │ ├── temperature │ │ │ ├── temperature-dragger │ │ │ │ ├── temperature-dragger.component.html │ │ │ │ ├── temperature-dragger.component.scss │ │ │ │ └── temperature-dragger.component.ts │ │ │ ├── temperature.component.html │ │ │ ├── temperature.component.scss │ │ │ └── temperature.component.ts │ │ ├── traffic │ │ │ ├── traffic-chart.component.ts │ │ │ ├── traffic.component.scss │ │ │ └── traffic.component.ts │ │ └── weather │ │ │ ├── weather.component.html │ │ │ ├── weather.component.scss │ │ │ └── weather.component.ts │ │ ├── e-commerce │ │ ├── charts-panel │ │ │ ├── chart-panel-header │ │ │ │ ├── chart-panel-header.component.html │ │ │ │ ├── chart-panel-header.component.scss │ │ │ │ └── chart-panel-header.component.ts │ │ │ ├── chart-panel-summary │ │ │ │ ├── chart-panel-summary.component.scss │ │ │ │ └── chart-panel-summary.component.ts │ │ │ ├── charts-panel.component.html │ │ │ ├── charts-panel.component.scss │ │ │ ├── charts-panel.component.ts │ │ │ └── charts │ │ │ │ ├── charts-common.component.scss │ │ │ │ ├── orders-chart.component.ts │ │ │ │ └── profit-chart.component.ts │ │ ├── country-orders │ │ │ ├── chart │ │ │ │ ├── country-orders-chart.component.scss │ │ │ │ └── country-orders-chart.component.ts │ │ │ ├── country-orders.component.scss │ │ │ ├── country-orders.component.ts │ │ │ └── map │ │ │ │ ├── country-orders-map.component.scss │ │ │ │ ├── country-orders-map.component.ts │ │ │ │ └── country-orders-map.service.ts │ │ ├── e-commerce.component.html │ │ ├── e-commerce.component.ts │ │ ├── e-commerce.module.ts │ │ ├── earning-card │ │ │ ├── back-side │ │ │ │ ├── earning-card-back.component.html │ │ │ │ ├── earning-card-back.component.scss │ │ │ │ ├── earning-card-back.component.ts │ │ │ │ └── earning-pie-chart.component.ts │ │ │ ├── earning-card.component.html │ │ │ ├── earning-card.component.scss │ │ │ ├── earning-card.component.ts │ │ │ └── front-side │ │ │ │ ├── earning-card-front.component.html │ │ │ │ ├── earning-card-front.component.scss │ │ │ │ ├── earning-card-front.component.ts │ │ │ │ └── earning-live-update-chart.component.ts │ │ ├── legend-chart │ │ │ ├── enum.legend-item-color.ts │ │ │ ├── legend-chart.component.html │ │ │ ├── legend-chart.component.scss │ │ │ └── legend-chart.component.ts │ │ ├── profit-card │ │ │ ├── back-side │ │ │ │ ├── stats-area-chart.component.ts │ │ │ │ ├── stats-card-back.component.html │ │ │ │ ├── stats-card-back.component.scss │ │ │ │ └── stats-card-back.component.ts │ │ │ ├── front-side │ │ │ │ ├── stats-bar-animation-chart.component.ts │ │ │ │ ├── stats-card-front.component.html │ │ │ │ ├── stats-card-front.component.scss │ │ │ │ └── stats-card-front.component.ts │ │ │ ├── profit-card.component.html │ │ │ ├── profit-card.component.scss │ │ │ └── profit-card.component.ts │ │ ├── progress-section │ │ │ ├── progress-section.component.html │ │ │ ├── progress-section.component.scss │ │ │ └── progress-section.component.ts │ │ ├── slide-out │ │ │ ├── slide-out.component.html │ │ │ ├── slide-out.component.scss │ │ │ └── slide-out.component.ts │ │ ├── traffic-reveal-card │ │ │ ├── back-side │ │ │ │ ├── traffic-back-card.component.html │ │ │ │ ├── traffic-back-card.component.scss │ │ │ │ ├── traffic-back-card.component.ts │ │ │ │ └── traffic-bar-chart.component.ts │ │ │ ├── front-side │ │ │ │ ├── traffic-bar │ │ │ │ │ ├── traffic-bar.component.html │ │ │ │ │ ├── traffic-bar.component.scss │ │ │ │ │ └── traffic-bar.component.ts │ │ │ │ ├── traffic-front-card.component.html │ │ │ │ ├── traffic-front-card.component.scss │ │ │ │ └── traffic-front-card.component.ts │ │ │ ├── traffic-cards-header │ │ │ │ ├── traffic-cards-header.component.html │ │ │ │ ├── traffic-cards-header.component.scss │ │ │ │ └── traffic-cards-header.component.ts │ │ │ ├── traffic-reveal-card.component.html │ │ │ ├── traffic-reveal-card.component.scss │ │ │ └── traffic-reveal-card.component.ts │ │ ├── user-activity │ │ │ ├── user-activity.component.scss │ │ │ └── user-activity.component.ts │ │ └── visitors-analytics │ │ │ ├── visitors-analytics-chart │ │ │ ├── visitors-analytics-chart.component.scss │ │ │ └── visitors-analytics-chart.component.ts │ │ │ ├── visitors-analytics.component.html │ │ │ ├── visitors-analytics.component.scss │ │ │ ├── visitors-analytics.component.ts │ │ │ └── visitors-statistics │ │ │ ├── visitors-statistics.component.html │ │ │ ├── visitors-statistics.component.scss │ │ │ └── visitors-statistics.component.ts │ │ ├── editors │ │ ├── ckeditor │ │ │ ├── ckeditor.component.ts │ │ │ └── ckeditor.loader.ts │ │ ├── editors-routing.module.ts │ │ ├── editors.component.ts │ │ ├── editors.module.ts │ │ └── tiny-mce │ │ │ └── tiny-mce.component.ts │ │ ├── forms │ │ ├── form-inputs │ │ │ ├── form-inputs.component.html │ │ │ ├── form-inputs.component.scss │ │ │ └── form-inputs.component.ts │ │ ├── form-layouts │ │ │ ├── form-layouts.component.html │ │ │ ├── form-layouts.component.scss │ │ │ └── form-layouts.component.ts │ │ ├── forms-routing.module.ts │ │ ├── forms.component.ts │ │ └── forms.module.ts │ │ ├── maps │ │ ├── bubble │ │ │ ├── bubble-map.component.scss │ │ │ └── bubble-map.component.ts │ │ ├── gmaps │ │ │ ├── gmaps.component.scss │ │ │ └── gmaps.component.ts │ │ ├── leaflet │ │ │ ├── leaflet.component.scss │ │ │ └── leaflet.component.ts │ │ ├── maps-routing.module.ts │ │ ├── maps.component.ts │ │ ├── maps.module.ts │ │ └── search-map │ │ │ ├── entity │ │ │ └── Location.ts │ │ │ ├── map │ │ │ ├── map.component.html │ │ │ ├── map.component.scss │ │ │ └── map.component.ts │ │ │ ├── search-map.component.html │ │ │ ├── search-map.component.ts │ │ │ └── search │ │ │ ├── search.component.html │ │ │ └── search.component.ts │ │ ├── miscellaneous │ │ ├── miscellaneous-routing.module.ts │ │ ├── miscellaneous.component.ts │ │ ├── miscellaneous.module.ts │ │ └── not-found │ │ │ ├── not-found.component.html │ │ │ ├── not-found.component.scss │ │ │ └── not-found.component.ts │ │ ├── pages-menu.ts │ │ ├── pages-routing.module.ts │ │ ├── pages.component.ts │ │ ├── pages.module.ts │ │ ├── policy │ │ ├── antidetection │ │ │ ├── antidetection.component.css │ │ │ ├── antidetection.component.html │ │ │ └── antidetection.component.ts │ │ ├── antilink │ │ │ ├── antilink.component.css │ │ │ ├── antilink.component.html │ │ │ └── antilink.component.ts │ │ ├── limitconn │ │ │ ├── limitconn.component.css │ │ │ ├── limitconn.component.html │ │ │ └── limitconn.component.ts │ │ ├── policy-list │ │ │ ├── modal-content-policy.component.html │ │ │ ├── modal-content-policy.component.ts │ │ │ ├── policy-list.component.html │ │ │ └── policy-list.component.ts │ │ ├── policy.class.ts │ │ ├── policy.component.html │ │ ├── policy.component.ts │ │ ├── policy.module.ts │ │ ├── policy.routing.ts │ │ ├── policy.service.ts │ │ └── secrules │ │ │ ├── secrules.component.css │ │ │ ├── secrules.component.html │ │ │ └── secrules.component.ts │ │ ├── server │ │ ├── server-list │ │ │ ├── modal-content-rule.component.html │ │ │ ├── modal-content-rule.component.ts │ │ │ ├── server-list.component.html │ │ │ └── server-list.component.ts │ │ ├── server-routing.module.ts │ │ ├── server.component.html │ │ ├── server.component.ts │ │ ├── server.module.ts │ │ └── server.service.ts │ │ ├── tables │ │ ├── smart-table │ │ │ ├── smart-table.component.html │ │ │ └── smart-table.component.ts │ │ ├── tables-routing.module.ts │ │ ├── tables.component.ts │ │ └── tables.module.ts │ │ └── ui-features │ │ ├── buttons │ │ ├── action-groups │ │ │ ├── action-groups.component.html │ │ │ ├── action-groups.component.scss │ │ │ └── action-groups.component.ts │ │ ├── block-level-buttons │ │ │ ├── block-level-buttons.component.html │ │ │ └── block-level-buttons.component.ts │ │ ├── button-groups │ │ │ ├── button-groups.component.html │ │ │ ├── button-groups.component.scss │ │ │ └── button-groups.component.ts │ │ ├── buttons.component.html │ │ ├── buttons.component.scss │ │ ├── buttons.component.ts │ │ ├── buttons.module.ts │ │ ├── default-buttons │ │ │ ├── default-buttons.component.html │ │ │ ├── default-buttons.component.scss │ │ │ └── default-buttons.component.ts │ │ ├── dropdown-buttons │ │ │ ├── dropdown-button.component.html │ │ │ ├── dropdown-button.component.scss │ │ │ └── dropdown-button.component.ts │ │ ├── hero-buttons │ │ │ ├── hero-buttons.component.html │ │ │ ├── hero-buttons.component.scss │ │ │ └── hero-buttons.component.ts │ │ ├── icon-buttons │ │ │ ├── icon-buttons.component.html │ │ │ ├── icon-buttons.component.scss │ │ │ └── icon-buttons.component.ts │ │ ├── labeled-actions-group │ │ │ ├── labeled-actions-group.component.html │ │ │ ├── labeled-actions-group.component.scss │ │ │ └── labeled-actions-group.component.ts │ │ ├── shape-buttons │ │ │ ├── shape-buttons.component.html │ │ │ ├── shape-buttons.component.scss │ │ │ └── shape-buttons.component.ts │ │ └── size-buttons │ │ │ ├── size-buttons.component.html │ │ │ ├── size-buttons.component.scss │ │ │ └── size-buttons.component.ts │ │ ├── grid │ │ ├── grid.component.html │ │ ├── grid.component.scss │ │ └── grid.component.ts │ │ ├── icons │ │ ├── icons.component.html │ │ ├── icons.component.scss │ │ └── icons.component.ts │ │ ├── modals │ │ ├── modal │ │ │ ├── modal.component.html │ │ │ └── modal.component.ts │ │ ├── modals.component.html │ │ ├── modals.component.scss │ │ └── modals.component.ts │ │ ├── popovers │ │ ├── popover-examples.component.ts │ │ ├── popovers.component.html │ │ ├── popovers.component.scss │ │ └── popovers.component.ts │ │ ├── search-fields │ │ ├── search-fields.component.html │ │ └── search-fields.component.ts │ │ ├── tabs │ │ ├── tabs.component.html │ │ ├── tabs.component.scss │ │ └── tabs.component.ts │ │ ├── typography │ │ ├── typography.component.html │ │ ├── typography.component.scss │ │ └── typography.component.ts │ │ ├── ui-features-routing.module.ts │ │ ├── ui-features.component.ts │ │ └── ui-features.module.ts ├── assets │ ├── .gitkeep │ ├── images │ │ ├── bootstrap.min.css │ │ ├── logo.svg │ │ ├── nick.png │ │ ├── square_pattern.svg │ │ ├── square_pattern_cosmic.svg │ │ └── your_style.css │ ├── leaflet-countries │ │ └── countries.geo.json │ ├── map │ │ └── world.json │ ├── ngx-datatable │ │ ├── app.css │ │ ├── dark.css │ │ ├── icons.css │ │ ├── index.css │ │ └── material.css │ └── skins │ │ └── lightgray │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── fonts │ │ ├── tinymce-small.eot │ │ ├── tinymce-small.svg │ │ ├── tinymce-small.ttf │ │ ├── tinymce-small.woff │ │ ├── tinymce.eot │ │ ├── tinymce.svg │ │ ├── tinymce.ttf │ │ └── tinymce.woff │ │ ├── img │ │ ├── anchor.gif │ │ ├── loader.gif │ │ ├── object.gif │ │ └── trans.gif │ │ ├── skin.ie7.min.css │ │ └── skin.min.css ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── favicon.png ├── index.html ├── main.ts ├── polyfills.ts ├── test.ts ├── tsconfig.app.json ├── tsconfig.spec.json └── typings.d.ts ├── tsconfig.json └── tslint.json /Dockerfile: -------------------------------------------------------------------------------- 1 | ################################################### 2 | # Dockerfile to build OpenWAF-UI container images # 3 | # Based on jessie # 4 | ################################################### 5 | 6 | #Set the base image to jessie 7 | FROM debian:jessie 8 | 9 | #File Author 10 | MAINTAINER Miracle 11 | 12 | #Docker Build Arguments 13 | ARG OPENWAF_UI_VERSION="0.1.1" 14 | ARG OPENWAF_UI_PREFIX="/opt" 15 | ARG NODEJS_VERSION="v10.12.0" 16 | ARG ANGULAR_CLI_VERSION="6.2.5" 17 | 18 | RUN apt-get update 19 | 20 | # Install OpenWAF-UI 21 | RUN cd ${OPENWAF_UI_PREFIX} \ 22 | && apt-get install git nginx -y \ 23 | && git clone https://github.com/titansec/OpenWAF-UI \ 24 | && cp OpenWAF-UI/nginx/* /etc/nginx/sites-enabled/ 25 | 26 | CMD ["nginx", "-g", "daemon off;"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 akveo.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | openwaf ui 2 | 在当前根目录下: 3 | 1. 安装依赖,执行命令: npm install 4 | 2. 待第一步执行完以后, 启动服务,执行命令: ng serve 5 | -------------------------------------------------------------------------------- /dist/Roboto-Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Black.eot -------------------------------------------------------------------------------- /dist/Roboto-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Black.ttf -------------------------------------------------------------------------------- /dist/Roboto-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Black.woff -------------------------------------------------------------------------------- /dist/Roboto-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Black.woff2 -------------------------------------------------------------------------------- /dist/Roboto-BlackItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BlackItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BlackItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BlackItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BlackItalic.woff2 -------------------------------------------------------------------------------- /dist/Roboto-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Bold.eot -------------------------------------------------------------------------------- /dist/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Bold.ttf -------------------------------------------------------------------------------- /dist/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Bold.woff -------------------------------------------------------------------------------- /dist/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /dist/Roboto-BoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BoldItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BoldItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BoldItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-BoldItalic.woff2 -------------------------------------------------------------------------------- /dist/Roboto-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Light.eot -------------------------------------------------------------------------------- /dist/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Light.ttf -------------------------------------------------------------------------------- /dist/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Light.woff -------------------------------------------------------------------------------- /dist/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Light.woff2 -------------------------------------------------------------------------------- /dist/Roboto-LightItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-LightItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-LightItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-LightItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-LightItalic.woff2 -------------------------------------------------------------------------------- /dist/Roboto-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Medium.eot -------------------------------------------------------------------------------- /dist/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Medium.ttf -------------------------------------------------------------------------------- /dist/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Medium.woff -------------------------------------------------------------------------------- /dist/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /dist/Roboto-MediumItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-MediumItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-MediumItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-MediumItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-MediumItalic.woff2 -------------------------------------------------------------------------------- /dist/Roboto-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Regular.eot -------------------------------------------------------------------------------- /dist/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Regular.ttf -------------------------------------------------------------------------------- /dist/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Regular.woff -------------------------------------------------------------------------------- /dist/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /dist/Roboto-RegularItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-RegularItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-RegularItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-RegularItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-RegularItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-RegularItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-RegularItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-RegularItalic.woff2 -------------------------------------------------------------------------------- /dist/Roboto-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Thin.eot -------------------------------------------------------------------------------- /dist/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Thin.ttf -------------------------------------------------------------------------------- /dist/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Thin.woff -------------------------------------------------------------------------------- /dist/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /dist/Roboto-ThinItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-ThinItalic.eot -------------------------------------------------------------------------------- /dist/Roboto-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-ThinItalic.ttf -------------------------------------------------------------------------------- /dist/Roboto-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-ThinItalic.woff -------------------------------------------------------------------------------- /dist/Roboto-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/Roboto-ThinItalic.woff2 -------------------------------------------------------------------------------- /dist/assets/images/nick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/images/nick.png -------------------------------------------------------------------------------- /dist/assets/images/square_pattern.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg -------------------------------------------------------------------------------- /dist/assets/images/square_pattern_cosmic.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg 2 | -------------------------------------------------------------------------------- /dist/assets/img/markers/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/img/markers/layers-2x.png -------------------------------------------------------------------------------- /dist/assets/img/markers/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/img/markers/layers.png -------------------------------------------------------------------------------- /dist/assets/img/markers/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/img/markers/marker-icon-2x.png -------------------------------------------------------------------------------- /dist/assets/img/markers/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/img/markers/marker-icon.png -------------------------------------------------------------------------------- /dist/assets/img/markers/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/img/markers/marker-shadow.png -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /dist/assets/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/assets/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /dist/common.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./node_modules/rxjs-compat/_esm5/add/observable/fromEvent.js","webpack:///(webpack)/buildin/module.js"],"names":[],"mappings":";;;;;;;;;;;;AAAmD;AACnD;AACA,qC;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA","file":"common.js","sourcesContent":["import { Observable, fromEvent as staticFromEvent } from 'rxjs';\nObservable.fromEvent = staticFromEvent;\n//# sourceMappingURL=fromEvent.js.map","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/exo-latin-100.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100.eot -------------------------------------------------------------------------------- /dist/exo-latin-100.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100.woff -------------------------------------------------------------------------------- /dist/exo-latin-100.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-100italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-100italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-100italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-100italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-200.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200.eot -------------------------------------------------------------------------------- /dist/exo-latin-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200.woff -------------------------------------------------------------------------------- /dist/exo-latin-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-200italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-200italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-200italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300.eot -------------------------------------------------------------------------------- /dist/exo-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300.woff -------------------------------------------------------------------------------- /dist/exo-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-300italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-300italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-300italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400.eot -------------------------------------------------------------------------------- /dist/exo-latin-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400.woff -------------------------------------------------------------------------------- /dist/exo-latin-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-400italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-400italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-400italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-400italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500.eot -------------------------------------------------------------------------------- /dist/exo-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500.woff -------------------------------------------------------------------------------- /dist/exo-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-500italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-500italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-500italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-500italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600.eot -------------------------------------------------------------------------------- /dist/exo-latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600.woff -------------------------------------------------------------------------------- /dist/exo-latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-600italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-600italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-600italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700.eot -------------------------------------------------------------------------------- /dist/exo-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700.woff -------------------------------------------------------------------------------- /dist/exo-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-700italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-700italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-800.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800.eot -------------------------------------------------------------------------------- /dist/exo-latin-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800.woff -------------------------------------------------------------------------------- /dist/exo-latin-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-800italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-800italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-800italic.woff2 -------------------------------------------------------------------------------- /dist/exo-latin-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-900.eot -------------------------------------------------------------------------------- /dist/exo-latin-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-900.woff -------------------------------------------------------------------------------- /dist/exo-latin-900italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-900italic.eot -------------------------------------------------------------------------------- /dist/exo-latin-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-900italic.woff -------------------------------------------------------------------------------- /dist/exo-latin-900italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/exo-latin-900italic.woff2 -------------------------------------------------------------------------------- /dist/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-brands-400.eot -------------------------------------------------------------------------------- /dist/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-brands-400.ttf -------------------------------------------------------------------------------- /dist/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-brands-400.woff -------------------------------------------------------------------------------- /dist/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-brands-400.woff2 -------------------------------------------------------------------------------- /dist/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-regular-400.eot -------------------------------------------------------------------------------- /dist/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-regular-400.ttf -------------------------------------------------------------------------------- /dist/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-regular-400.woff -------------------------------------------------------------------------------- /dist/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-regular-400.woff2 -------------------------------------------------------------------------------- /dist/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-solid-900.eot -------------------------------------------------------------------------------- /dist/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-solid-900.ttf -------------------------------------------------------------------------------- /dist/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-solid-900.woff -------------------------------------------------------------------------------- /dist/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/fa-solid-900.woff2 -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/favicon.ico -------------------------------------------------------------------------------- /dist/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/favicon.png -------------------------------------------------------------------------------- /dist/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/ionicons.eot -------------------------------------------------------------------------------- /dist/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/ionicons.ttf -------------------------------------------------------------------------------- /dist/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/ionicons.woff -------------------------------------------------------------------------------- /dist/nebular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/nebular.eot -------------------------------------------------------------------------------- /dist/nebular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/nebular.ttf -------------------------------------------------------------------------------- /dist/nebular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/nebular.woff -------------------------------------------------------------------------------- /dist/socicon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/socicon.eot -------------------------------------------------------------------------------- /dist/socicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/socicon.ttf -------------------------------------------------------------------------------- /dist/socicon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/dist/socicon.woff -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | const configuration = { 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], 20 | fixWebpackSourcePaths: true 21 | }, 22 | angularCli: { 23 | environment: 'dev' 24 | }, 25 | reporters: ['progress', 'kjhtml'], 26 | port: 9876, 27 | colors: true, 28 | logLevel: config.LOG_INFO, 29 | autoWatch: true, 30 | browsers: ['Chrome'], 31 | customLaunchers: { 32 | Chrome_travis_ci: { 33 | base: 'Chrome', 34 | flags: ['--no-sandbox'] 35 | } 36 | }, 37 | singleRun: false 38 | }; 39 | 40 | if (process.env.TRAVIS) { 41 | configuration.browsers = ['Chrome_travis_ci']; 42 | } 43 | 44 | config.set(configuration); 45 | }; 46 | -------------------------------------------------------------------------------- /nginx/openwaf-ui: -------------------------------------------------------------------------------- 1 | server { 2 | listen 8080; 3 | server_name _; 4 | 5 | location / { 6 | root /opt/OpenWAF-UI/dist/; 7 | index signin.html index.htm index.html; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome', 13 | 'chromeOptions': { 14 | 'args': ['show-fps-counter=true', '--no-sandbox'] 15 | } 16 | }, 17 | directConnect: true, 18 | baseUrl: 'http://localhost:4200/', 19 | framework: 'jasmine', 20 | jasmineNodeOpts: { 21 | showColors: true, 22 | defaultTimeoutInterval: 30000, 23 | print: function() {} 24 | }, 25 | onPrepare() { 26 | require('ts-node').register({ 27 | project: 'e2e/tsconfig.e2e.json' 28 | }); 29 | 30 | jasmine.getEnv().addReporter(new SpecReporter({ acspec: { displayStacktrace: true } })); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/app/@core/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/@core/data/.gitkeep -------------------------------------------------------------------------------- /src/app/@core/data/README.md: -------------------------------------------------------------------------------- 1 | Application-wise data providers. 2 | -------------------------------------------------------------------------------- /src/app/@core/data/layout.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable, Subject } from 'rxjs'; 3 | import { delay, share } from 'rxjs/operators'; 4 | 5 | @Injectable() 6 | export class LayoutService { 7 | 8 | protected layoutSize$ = new Subject(); 9 | 10 | changeLayoutSize() { 11 | this.layoutSize$.next(); 12 | } 13 | 14 | onChangeLayoutSize(): Observable { 15 | return this.layoutSize$.pipe( 16 | share(), 17 | delay(1), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/@core/data/orders-profit-chart.service.ts: -------------------------------------------------------------------------------- 1 | import { of as observableOf, Observable } from 'rxjs'; 2 | import { Injectable } from '@angular/core'; 3 | import { OrdersChart, OrdersChartService } from './orders-chart.service'; 4 | import { ProfitChart, ProfitChartService } from './profit-chart.service'; 5 | 6 | export class OrderProfitChartSummary { 7 | title: string; 8 | value: number; 9 | } 10 | 11 | @Injectable() 12 | export class OrdersProfitChartService { 13 | 14 | private summary = [ 15 | { 16 | title: 'Marketplace', 17 | value: 3654, 18 | }, 19 | { 20 | title: 'Last Month', 21 | value: 946, 22 | }, 23 | { 24 | title: 'Last Week', 25 | value: 654, 26 | }, 27 | { 28 | title: 'Today', 29 | value: 230, 30 | }, 31 | ]; 32 | 33 | constructor(private ordersChartService: OrdersChartService, 34 | private profitChartService: ProfitChartService) { 35 | } 36 | 37 | getOrderProfitChartSummary(): Observable { 38 | return observableOf(this.summary); 39 | } 40 | 41 | getOrdersChartData(period: string): Observable { 42 | return observableOf(this.ordersChartService.getOrdersChartData(period)); 43 | } 44 | 45 | getProfitChartData(period: string): Observable { 46 | return observableOf(this.profitChartService.getProfitChartData(period)); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/app/@core/data/periods.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class PeriodsService { 5 | getYears() { 6 | return [ 7 | '2010', '2011', '2012', 8 | '2013', '2014', '2015', 9 | '2016', '2017', '2018', 10 | ]; 11 | } 12 | 13 | getMonths() { 14 | return [ 15 | 'Jan', 'Feb', 'Mar', 16 | 'Apr', 'May', 'Jun', 17 | 'Jul', 'Aug', 'Sep', 18 | 'Oct', 'Nov', 'Dec', 19 | ]; 20 | } 21 | 22 | getWeeks() { 23 | return [ 24 | 'Mon', 25 | 'Tue', 26 | 'Wed', 27 | 'Thu', 28 | 'Fri', 29 | 'Sat', 30 | 'Sun', 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/@core/data/profit-bar-animation-chart.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { of as observableOf, Observable } from 'rxjs'; 3 | 4 | @Injectable() 5 | export class ProfitBarAnimationChartService { 6 | 7 | private data: any; 8 | 9 | constructor() { 10 | this.data = { 11 | firstLine: this.getDataForFirstLine(), 12 | secondLine: this.getDataForSecondLine(), 13 | }; 14 | } 15 | 16 | getDataForFirstLine(): number[] { 17 | return this.createEmptyArray(100) 18 | .map((_, index) => { 19 | const oneFifth = index / 5; 20 | 21 | return (Math.sin(oneFifth) * (oneFifth - 10) + index / 6) * 5; 22 | }); 23 | } 24 | 25 | getDataForSecondLine(): number[] { 26 | return this.createEmptyArray(100) 27 | .map((_, index) => { 28 | const oneFifth = index / 5; 29 | 30 | return (Math.cos(oneFifth) * (oneFifth - 10) + index / 6) * 5; 31 | }); 32 | } 33 | 34 | createEmptyArray(nPoints: number) { 35 | return Array.from(Array(nPoints)); 36 | } 37 | 38 | getChartData(): Observable<{ firstLine: number[]; secondLine: number[] }> { 39 | return observableOf(this.data); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/app/@core/data/traffic-bar.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { of as observableOf, Observable } from 'rxjs'; 3 | import { PeriodsService } from './periods.service'; 4 | 5 | export class TrafficBar { 6 | data: number[]; 7 | labels: string[]; 8 | formatter: string; 9 | } 10 | 11 | @Injectable() 12 | export class TrafficBarService { 13 | 14 | private data = { }; 15 | 16 | constructor(private period: PeriodsService) { 17 | this.data = { 18 | week: this.getDataForWeekPeriod(), 19 | month: this.getDataForMonthPeriod(), 20 | year: this.getDataForYearPeriod(), 21 | }; 22 | } 23 | 24 | getDataForWeekPeriod(): TrafficBar { 25 | return { 26 | data: [10, 15, 19, 7, 20, 13, 15], 27 | labels: this.period.getWeeks(), 28 | formatter: '{c0} MB', 29 | }; 30 | } 31 | 32 | getDataForMonthPeriod(): TrafficBar { 33 | return { 34 | data: [0.5, 0.3, 0.8, 0.2, 0.3, 0.7, 0.8, 1, 0.7, 0.8, 0.6, 0.7], 35 | labels: this.period.getMonths(), 36 | formatter: '{c0} GB', 37 | }; 38 | } 39 | 40 | getDataForYearPeriod(): TrafficBar { 41 | return { 42 | data: [10, 15, 19, 7, 20, 13, 15, 19, 11], 43 | labels: this.period.getYears(), 44 | formatter: '{c0} GB', 45 | }; 46 | } 47 | 48 | getTrafficBarData(period: string): Observable { 49 | return observableOf(this.data[period]); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/app/@core/data/users.service.ts: -------------------------------------------------------------------------------- 1 | 2 | import { of as observableOf, Observable } from 'rxjs'; 3 | import { Injectable } from '@angular/core'; 4 | 5 | 6 | let counter = 0; 7 | 8 | @Injectable() 9 | export class UserService { 10 | 11 | private users = { 12 | nick: { name: 'Nick Jones', picture: 'assets/images/nick.png' }, 13 | eva: { name: 'Eva Moor', picture: 'assets/images/eva.png' }, 14 | jack: { name: 'Jack Williams', picture: 'assets/images/jack.png' }, 15 | lee: { name: 'Lee Wong', picture: 'assets/images/lee.png' }, 16 | alan: { name: 'Alan Thompson', picture: 'assets/images/alan.png' }, 17 | kate: { name: 'Kate Martinez', picture: 'assets/images/kate.png' }, 18 | }; 19 | 20 | private userArray: any[]; 21 | 22 | constructor() { 23 | // this.userArray = Object.values(this.users); 24 | } 25 | 26 | getUsers(): Observable { 27 | return observableOf(this.users); 28 | } 29 | 30 | getUserArray(): Observable { 31 | return observableOf(this.userArray); 32 | } 33 | 34 | getUser(): Observable { 35 | counter = (counter + 1) % this.userArray.length; 36 | return observableOf(this.userArray[counter]); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/app/@core/module-import-guard.ts: -------------------------------------------------------------------------------- 1 | export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) { 2 | if (parentModule) { 3 | throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/app/@core/utils/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/@core/utils/.gitkeep -------------------------------------------------------------------------------- /src/app/@core/utils/analytics.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { NavigationEnd, Router } from '@angular/router'; 3 | import { Location } from '@angular/common'; 4 | import { filter } from 'rxjs/operators'; 5 | 6 | declare const ga: any; 7 | 8 | @Injectable() 9 | export class AnalyticsService { 10 | private enabled: boolean; 11 | 12 | constructor(private location: Location, private router: Router) { 13 | this.enabled = false; 14 | } 15 | 16 | trackPageViews() { 17 | if (this.enabled) { 18 | this.router.events.pipe( 19 | filter((event) => event instanceof NavigationEnd), 20 | ) 21 | .subscribe(() => { 22 | ga('send', {hitType: 'pageview', page: this.location.path()}); 23 | }); 24 | } 25 | } 26 | 27 | trackEvent(eventName: string) { 28 | if (this.enabled) { 29 | ga('send', 'event', eventName); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/@theme/components/footer/footer.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~@nebular/theme/styles/global/breakpoints'; 3 | @import '~bootstrap/scss/mixins/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | width: 100%; 7 | display: flex; 8 | justify-content: space-between; 9 | align-items: center; 10 | 11 | .socials { 12 | font-size: 2rem; 13 | 14 | a { 15 | padding: 0.4rem; 16 | color: nb-theme(color-fg); 17 | transition: color ease-out 0.1s; 18 | 19 | &:hover { 20 | color: nb-theme(color-fg-heading); 21 | } 22 | } 23 | } 24 | 25 | @include media-breakpoint-down(is) { 26 | .socials { 27 | font-size: 1.5rem; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/@theme/components/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-footer', 5 | styleUrls: ['./footer.component.scss'], 6 | template: ` 7 | Sponsor : 上海天泰网络技术有限公司 8 |
9 | 10 | 11 | star 12 | 13 |
14 | `, 15 | }) 16 | export class FooterComponent { 17 | } 18 | -------------------------------------------------------------------------------- /src/app/@theme/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './header/header.component'; 2 | export * from './footer/footer.component'; 3 | export * from './search-input/search-input.component'; 4 | export * from './tiny-mce/tiny-mce.component'; 5 | export * from './theme-settings/theme-settings.component'; 6 | export * from './theme-switcher/theme-switcher.component'; 7 | export * from './switcher/switcher.component'; 8 | export * from './layout-direction-switcher/layout-direction-switcher.component'; 9 | export * from './theme-switcher/themes-switcher-list/themes-switcher-list.component'; 10 | -------------------------------------------------------------------------------- /src/app/@theme/components/layout-direction-switcher/layout-direction-switcher.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy, Input } from '@angular/core'; 2 | import { NbLayoutDirectionService, NbLayoutDirection } from '@nebular/theme'; 3 | import { takeWhile } from 'rxjs/operators/takeWhile'; 4 | 5 | @Component({ 6 | selector: 'ngx-layout-direction-switcher', 7 | template: ` 8 | 17 | 18 | `, 19 | }) 20 | export class LayoutDirectionSwitcherComponent implements OnDestroy { 21 | directions = NbLayoutDirection; 22 | currentDirection: NbLayoutDirection; 23 | alive = true; 24 | 25 | @Input() vertical: boolean = false; 26 | 27 | constructor(private directionService: NbLayoutDirectionService) { 28 | this.currentDirection = this.directionService.getDirection(); 29 | 30 | this.directionService.onDirectionChange() 31 | .pipe(takeWhile(() => this.alive)) 32 | .subscribe(newDirection => this.currentDirection = newDirection); 33 | } 34 | 35 | toggleDirection(newDirection) { 36 | this.directionService.setDirection(newDirection); 37 | } 38 | 39 | ngOnDestroy() { 40 | this.alive = false; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/app/@theme/components/search-input/search-input.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | align-items: center; 4 | 5 | i.control-icon { 6 | &::before { 7 | font-size: 2.3rem; 8 | } 9 | 10 | &:hover { 11 | cursor: pointer; 12 | } 13 | } 14 | 15 | input { 16 | border: none; 17 | outline: none; 18 | margin-left: 1rem; 19 | width: 15rem; 20 | transition: width 0.2s ease; 21 | 22 | &.hidden { 23 | width: 0; 24 | margin: 0; 25 | } 26 | } 27 | 28 | /deep/ search-input { 29 | input { 30 | background: transparent; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/@theme/components/search-input/search-input.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ElementRef, EventEmitter, Output, ViewChild } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-search-input', 5 | styleUrls: ['./search-input.component.scss'], 6 | template: ` 7 | 9 | 14 | `, 15 | }) 16 | export class SearchInputComponent { 17 | @ViewChild('input') input: ElementRef; 18 | 19 | @Output() search: EventEmitter = new EventEmitter(); 20 | 21 | isInputShown = false; 22 | 23 | showInput() { 24 | this.isInputShown = true; 25 | this.input.nativeElement.focus(); 26 | } 27 | 28 | hideInput() { 29 | this.isInputShown = false; 30 | } 31 | 32 | onInput(val: string) { 33 | this.search.emit(val); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/@theme/components/theme-switcher/theme-switcher.component.html: -------------------------------------------------------------------------------- 1 |
5 | 6 | Themes 7 |
8 | -------------------------------------------------------------------------------- /src/app/@theme/components/theme-switcher/theme-switcher.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~@nebular/theme/styles/core/mixins'; 3 | @import '~@nebular/theme/styles/core/functions'; 4 | 5 | @include nb-install-component() { 6 | .themes-switcher { 7 | display: flex; 8 | font-size: 1.25rem; 9 | padding: 0.8rem 1.25rem; 10 | align-items: center; 11 | cursor: pointer; 12 | background-color: nb-theme(switcher-background); 13 | border-radius: nb-theme(radius); 14 | 15 | &:hover { 16 | $color: nb-theme(switcher-background); 17 | $percentage: nb-theme(switcher-background-percentage); 18 | 19 | background-color: tint($color, $percentage); 20 | } 21 | 22 | span { 23 | margin: 0 1.2rem; 24 | } 25 | 26 | i { 27 | color: nb-theme(color-primary); 28 | font-size: 1.8rem; 29 | border-radius: 50%; 30 | position: relative; 31 | 32 | @include nb-for-theme(default) { 33 | color: nb-theme(color-success); 34 | } 35 | 36 | @include nb-for-theme(corporate) { 37 | color: nb-theme(color-fg-highlight); 38 | } 39 | 40 | &::before { 41 | // Hack for IE11, IE11 should not set background 42 | background: nb-theme(drops-icon-line-gadient); 43 | -webkit-background-clip: text; 44 | -webkit-text-fill-color: transparent; 45 | } 46 | } 47 | } 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/app/@theme/components/theme-switcher/theme-switcher.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, ViewChild } from '@angular/core'; 2 | import { NbPopoverDirective } from '@nebular/theme'; 3 | import { NbJSThemeOptions } from '@nebular/theme/services/js-themes/theme.options'; 4 | 5 | import { ThemeSwitcherListComponent } from './themes-switcher-list/themes-switcher-list.component'; 6 | 7 | @Component({ 8 | selector: 'ngx-theme-switcher', 9 | templateUrl: './theme-switcher.component.html', 10 | styleUrls: ['./theme-switcher.component.scss'], 11 | }) 12 | export class ThemeSwitcherComponent { 13 | @ViewChild(NbPopoverDirective) popover: NbPopoverDirective; 14 | 15 | @Input() showTitle: boolean = true; 16 | 17 | switcherListComponent = ThemeSwitcherListComponent; 18 | theme: NbJSThemeOptions; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/@theme/components/tiny-mce/tiny-mce.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy, AfterViewInit, Output, EventEmitter, ElementRef } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-tiny-mce', 5 | template: '', 6 | }) 7 | export class TinyMCEComponent implements OnDestroy, AfterViewInit { 8 | 9 | @Output() editorKeyup = new EventEmitter(); 10 | 11 | editor: any; 12 | 13 | constructor(private host: ElementRef) { } 14 | 15 | ngAfterViewInit() { 16 | tinymce.init({ 17 | target: this.host.nativeElement, 18 | plugins: ['link', 'paste', 'table'], 19 | skin_url: 'assets/skins/lightgray', 20 | setup: editor => { 21 | this.editor = editor; 22 | editor.on('keyup', () => { 23 | this.editorKeyup.emit(editor.getContent()); 24 | }); 25 | }, 26 | height: '320', 27 | }); 28 | } 29 | 30 | ngOnDestroy() { 31 | tinymce.remove(this.editor); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/@theme/const/url.ts: -------------------------------------------------------------------------------- 1 | 2 | export class Urls { 3 | 4 | static readonly userName = 'admin'; 5 | static readonly baseUrl = "http://127.0.0.1:8008/api"; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/@theme/directives/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/@theme/directives/.gitkeep -------------------------------------------------------------------------------- /src/app/@theme/layouts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './one-column/one-column.layout'; 2 | export * from './two-columns/two-columns.layout'; 3 | export * from './three-columns/three-columns.layout'; 4 | export * from './sample/sample.layout'; 5 | -------------------------------------------------------------------------------- /src/app/@theme/model/page.class.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * An object used to get page information from the server 3 | */ 4 | export class PageClass { 5 | //The number of elements in the page 6 | size: number = 0; 7 | //The total number of elements 8 | totalElements: number = 0; 9 | //The total number of pages 10 | totalPages: number = 0; 11 | //The current page number 12 | pageNumber: number = 0; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/@theme/model/paged-data.class.ts: -------------------------------------------------------------------------------- 1 | import {PageClass} from "./page.class"; 2 | 3 | /** 4 | * An array of data with an associated page object used for paging 5 | */ 6 | export class PagedDataClass { 7 | data = new Array(); 8 | page = new PageClass(); 9 | } -------------------------------------------------------------------------------- /src/app/@theme/pipes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/@theme/pipes/.gitkeep -------------------------------------------------------------------------------- /src/app/@theme/pipes/capitalize.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxCapitalize' }) 4 | export class CapitalizePipe implements PipeTransform { 5 | 6 | transform(input: string): string { 7 | return input && input.length 8 | ? (input.charAt(0).toUpperCase() + input.slice(1).toLowerCase()) 9 | : input; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './capitalize.pipe'; 2 | export * from './plural.pipe'; 3 | export * from './round.pipe'; 4 | export * from './timing.pipe'; 5 | export * from './number-with-commas.pipe'; 6 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/number-with-commas.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxNumberWithCommas' }) 4 | export class NumberWithCommasPipe implements PipeTransform { 5 | 6 | transform(input: number): string { 7 | return new Intl.NumberFormat().format(input); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/plural.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxPlural' }) 4 | export class PluralPipe implements PipeTransform { 5 | 6 | transform(input: number, label: string, pluralLabel: string = ''): string { 7 | input = input || 0; 8 | return input === 1 9 | ? `${input} ${label}` 10 | : pluralLabel 11 | ? `${input} ${pluralLabel}` 12 | : `${input} ${label}s`; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/round.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxRound' }) 4 | export class RoundPipe implements PipeTransform { 5 | 6 | transform(input: number): number { 7 | return Math.round(input); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/timing.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'timing' }) 4 | export class TimingPipe implements PipeTransform { 5 | transform(time: number): string { 6 | if (time) { 7 | const minutes = Math.floor(time / 60); 8 | const seconds = Math.floor(time % 60); 9 | return `${this.initZero(minutes)}${minutes}:${this.initZero(seconds)}${seconds}`; 10 | } 11 | 12 | return '00:00'; 13 | } 14 | 15 | private initZero(time: number): string { 16 | return time < 10 ? '0' : ''; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/@theme/styles/font-size.scss: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 14px; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/@theme/styles/pace.theme.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | @mixin ngx-pace-theme() { 8 | 9 | .pace .pace-progress { 10 | background: nb-theme(color-fg-highlight); 11 | } 12 | 13 | .pace .pace-progress-inner { 14 | box-shadow: 0 0 10px nb-theme(color-fg-highlight), 0 0 5px nb-theme(color-fg-highlight); 15 | } 16 | 17 | .pace .pace-activity { 18 | display: none; 19 | // border-top-color: nb-theme(color-fg-highlight); 20 | // border-left-color: nb-theme(color-fg-highlight); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/@theme/styles/styles.scss: -------------------------------------------------------------------------------- 1 | // themes - our custom or/and out of the box themes 2 | @import 'themes'; 3 | 4 | // framework component themes (styles tied to theme variables) 5 | @import '~@nebular/theme/styles/globals'; 6 | @import '~@nebular/auth/styles/all'; 7 | @import '~@nebular/bootstrap/styles/globals'; 8 | // ... 9 | 10 | // global app font size 11 | @import './font-size'; 12 | 13 | // loading progress bar theme 14 | @import './pace.theme'; 15 | 16 | @import './bootstrap-rtl'; 17 | 18 | // install the framework and custom global styles 19 | @include nb-install() { 20 | 21 | // framework global styles 22 | @include nb-theme-global(); 23 | @include nb-auth-global(); 24 | @include nb-bootstrap-global(); 25 | 26 | // loading progress bar 27 | @include ngx-pace-theme(); 28 | 29 | // fixed in rc.9 and can be removed after upgrade 30 | .custom-control .custom-control-indicator { 31 | border-radius: 50%; // TODO: quickfix for https://github.com/akveo/nebular/issues/275 32 | } 33 | @include bootstrap-rtl(); 34 | }; 35 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { ExtraOptions, RouterModule, Routes } from '@angular/router'; 2 | import { NgModule } from '@angular/core'; 3 | import { 4 | NbAuthComponent, 5 | NbLoginComponent, 6 | NbLogoutComponent, 7 | NbRegisterComponent, 8 | NbRequestPasswordComponent, 9 | NbResetPasswordComponent, 10 | } from '@nebular/auth'; 11 | 12 | const routes: Routes = [ 13 | { path: 'pages', loadChildren: 'app/pages/pages.module#PagesModule' }, 14 | { 15 | path: 'auth', 16 | component: NbAuthComponent, 17 | children: [ 18 | { 19 | path: '', 20 | component: NbLoginComponent, 21 | }, 22 | { 23 | path: 'login', 24 | component: NbLoginComponent, 25 | }, 26 | { 27 | path: 'register', 28 | component: NbRegisterComponent, 29 | }, 30 | { 31 | path: 'logout', 32 | component: NbLogoutComponent, 33 | }, 34 | { 35 | path: 'request-password', 36 | component: NbRequestPasswordComponent, 37 | }, 38 | { 39 | path: 'reset-password', 40 | component: NbResetPasswordComponent, 41 | }, 42 | ], 43 | }, 44 | { path: '', redirectTo: 'pages', pathMatch: 'full' }, 45 | { path: '**', redirectTo: 'pages' }, 46 | ]; 47 | 48 | const config: ExtraOptions = { 49 | useHash: true, 50 | }; 51 | 52 | @NgModule({ 53 | imports: [RouterModule.forRoot(routes, config)], 54 | exports: [RouterModule], 55 | }) 56 | export class AppRoutingModule { 57 | } 58 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { Component, OnInit } from '@angular/core'; 7 | import { AnalyticsService } from './@core/utils/analytics.service'; 8 | import {Urls} from "./@theme/const/url"; 9 | 10 | @Component({ 11 | selector: 'ngx-app', 12 | template: '', 13 | }) 14 | export class AppComponent implements OnInit { 15 | 16 | constructor(private analytics: AnalyticsService) { 17 | } 18 | 19 | ngOnInit(): void { 20 | this.analytics.trackPageViews(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { APP_BASE_HREF } from '@angular/common'; 7 | import { BrowserModule } from '@angular/platform-browser'; 8 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 9 | import { NgModule } from '@angular/core'; 10 | import { HttpClientModule } from '@angular/common/http'; 11 | import { CoreModule } from './@core/core.module'; 12 | 13 | import { AppComponent } from './app.component'; 14 | import { AppRoutingModule } from './app-routing.module'; 15 | import { ThemeModule } from './@theme/theme.module'; 16 | import {NgbModule} from '@ng-bootstrap/ng-bootstrap'; 17 | import {ModalModule} from "ngx-bootstrap"; 18 | 19 | @NgModule({ 20 | declarations: [AppComponent], 21 | imports: [ 22 | BrowserModule, 23 | BrowserAnimationsModule, 24 | HttpClientModule, 25 | AppRoutingModule, 26 | 27 | NgbModule.forRoot(), 28 | ThemeModule.forRoot(), 29 | CoreModule.forRoot(), 30 | ModalModule.forRoot(), 31 | ], 32 | bootstrap: [AppComponent], 33 | providers: [ 34 | { provide: APP_BASE_HREF, useValue: '/' }, 35 | ], 36 | }) 37 | export class AppModule { 38 | } 39 | -------------------------------------------------------------------------------- /src/app/pages/charts/chartjs/chartjs.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | ngx-chartjs-pie, 5 | ngx-chartjs-bar, 6 | ngx-chartjs-line, 7 | ngx-chartjs-multiple-xaxis, 8 | ngx-chartjs-bar-horizontal, 9 | ngx-chartjs-radar { 10 | display: block; 11 | height: nb-theme(card-height-medium); 12 | width: 100%; 13 | 14 | /deep/ chart { 15 | display: block; 16 | height: 100%; 17 | width: 100%; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/charts/chartjs/chartjs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-chartjs', 5 | styleUrls: ['./chartjs.component.scss'], 6 | templateUrl: './chartjs.component.html', 7 | }) 8 | export class ChartjsComponent {} 9 | -------------------------------------------------------------------------------- /src/app/pages/charts/charts-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ChartsComponent } from './charts.component'; 5 | import { EchartsComponent } from './echarts/echarts.component'; 6 | import { D3Component } from './d3/d3.component'; 7 | import { ChartjsComponent } from './chartjs/chartjs.component'; 8 | 9 | const routes: Routes = [{ 10 | path: '', 11 | component: ChartsComponent, 12 | children: [{ 13 | path: 'echarts', 14 | component: EchartsComponent, 15 | }, { 16 | path: 'd3', 17 | component: D3Component, 18 | }, { 19 | path: 'chartjs', 20 | component: ChartjsComponent, 21 | }], 22 | }]; 23 | 24 | @NgModule({ 25 | imports: [RouterModule.forChild(routes)], 26 | exports: [RouterModule], 27 | }) 28 | export class ChartsRoutingModule { } 29 | 30 | export const routedComponents = [ 31 | ChartsComponent, 32 | EchartsComponent, 33 | D3Component, 34 | ChartjsComponent, 35 | ]; 36 | -------------------------------------------------------------------------------- /src/app/pages/charts/charts.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-charts', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ChartsComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3-advanced-pie.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-d3-advanced-pie', 6 | template: ` 7 | 10 | 11 | `, 12 | }) 13 | export class D3AdvancedPieComponent implements OnDestroy { 14 | single = [ 15 | { 16 | name: 'Germany', 17 | value: 8940000, 18 | }, 19 | { 20 | name: 'USA', 21 | value: 5000000, 22 | }, 23 | { 24 | name: 'France', 25 | value: 7200000, 26 | }, 27 | ]; 28 | colorScheme: any; 29 | themeSubscription: any; 30 | 31 | constructor(private theme: NbThemeService) { 32 | this.themeSubscription = this.theme.getJsTheme().subscribe(config => { 33 | const colors: any = config.variables; 34 | this.colorScheme = { 35 | domain: [colors.primaryLight, colors.infoLight, colors.successLight, colors.warningLight, colors.dangerLight], 36 | }; 37 | }); 38 | } 39 | 40 | ngOnDestroy(): void { 41 | this.themeSubscription.unsubscribe(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-d3-bar', 6 | template: ` 7 | 15 | 16 | `, 17 | }) 18 | export class D3BarComponent implements OnDestroy { 19 | 20 | results = [ 21 | { name: 'Germany', value: 8940 }, 22 | { name: 'USA', value: 5000 }, 23 | { name: 'France', value: 7200 }, 24 | ]; 25 | showLegend = true; 26 | showXAxis = true; 27 | showYAxis = true; 28 | xAxisLabel = 'Country'; 29 | yAxisLabel = 'Population'; 30 | colorScheme: any; 31 | themeSubscription: any; 32 | 33 | constructor(private theme: NbThemeService) { 34 | this.themeSubscription = this.theme.getJsTheme().subscribe(config => { 35 | const colors: any = config.variables; 36 | this.colorScheme = { 37 | domain: [colors.primaryLight, colors.infoLight, colors.successLight, colors.warningLight, colors.dangerLight], 38 | }; 39 | }); 40 | } 41 | 42 | ngOnDestroy(): void { 43 | this.themeSubscription.unsubscribe(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3-pie.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-d3-pie', 6 | template: ` 7 | 12 | 13 | `, 14 | }) 15 | export class D3PieComponent implements OnDestroy { 16 | results = [ 17 | { name: 'Germany', value: 8940 }, 18 | { name: 'USA', value: 5000 }, 19 | { name: 'France', value: 7200 }, 20 | ]; 21 | showLegend = true; 22 | showLabels = true; 23 | colorScheme: any; 24 | themeSubscription: any; 25 | 26 | constructor(private theme: NbThemeService) { 27 | this.themeSubscription = this.theme.getJsTheme().subscribe(config => { 28 | const colors: any = config.variables; 29 | this.colorScheme = { 30 | domain: [colors.primaryLight, colors.infoLight, colors.successLight, colors.warningLight, colors.dangerLight], 31 | }; 32 | }); 33 | } 34 | 35 | ngOnDestroy(): void { 36 | this.themeSubscription.unsubscribe(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | Pie 5 | 6 | 7 | 8 | 9 |
10 |
11 | 12 | Bar 13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | Line 21 | 22 | 23 | 24 | 25 |
26 |
27 | 28 | Advanced Pie 29 | 30 | 31 | 32 | 33 |
34 |
35 | 36 | Area Chart 37 | 38 | 39 | 40 | 41 |
42 |
43 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | ngx-d3-bar, 5 | ngx-d3-pie, 6 | ngx-d3-advanced-pie, 7 | ngx-d3-area-stack, 8 | ngx-d3-line, 9 | ngx-d3-polar { 10 | display: block; 11 | width: 100%; 12 | height: nb-theme(card-height-medium); 13 | 14 | /deep/ { 15 | .pie-label { 16 | fill: nb-theme(color-fg-heading); 17 | } 18 | 19 | .grid-line-path { 20 | stroke: nb-theme(separator); 21 | } 22 | 23 | text { 24 | fill: nb-theme(color-fg-heading); 25 | } 26 | 27 | .chart-legend { 28 | .legend-labels { 29 | background: nb-theme(color-bg); 30 | } 31 | .legend-label { 32 | color: nb-theme(color-fg-heading); 33 | .active .legend-label-text { 34 | color: nb-theme(color-fg-heading); 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/app/pages/charts/d3/d3.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-d3', 5 | styleUrls: ['./d3.component.scss'], 6 | templateUrl: './d3.component.html', 7 | }) 8 | export class D3Component {} 9 | -------------------------------------------------------------------------------- /src/app/pages/charts/echarts/echarts.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | ngx-echarts-pie, 5 | ngx-echarts-bar, 6 | ngx-echarts-line, 7 | ngx-echarts-multiple-xaxis, 8 | ngx-echarts-area-stack, 9 | ngx-echarts-bar-animation, 10 | ngx-echarts-radar { 11 | display: block; 12 | height: nb-theme(card-height-medium); 13 | width: 100%; 14 | } 15 | 16 | /deep/ .echart { 17 | height: 100%; 18 | width: 100%; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/charts/echarts/echarts.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-echarts', 5 | styleUrls: ['./echarts.component.scss'], 6 | templateUrl: './echarts.component.html', 7 | }) 8 | export class EchartsComponent {} 9 | -------------------------------------------------------------------------------- /src/app/pages/components/components-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ComponentsComponent } from './components.component'; 5 | import { TreeComponent } from './tree/tree.component'; 6 | import { NotificationsComponent } from './notifications/notifications.component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: ComponentsComponent, 11 | children: [ 12 | { 13 | path: 'tree', 14 | component: TreeComponent, 15 | }, { 16 | path: 'notifications', 17 | component: NotificationsComponent, 18 | }, 19 | ], 20 | }]; 21 | 22 | @NgModule({ 23 | imports: [RouterModule.forChild(routes)], 24 | exports: [RouterModule], 25 | }) 26 | export class ComponentsRoutingModule { } 27 | 28 | export const routedComponents = [ 29 | ComponentsComponent, 30 | TreeComponent, 31 | NotificationsComponent, 32 | ]; 33 | -------------------------------------------------------------------------------- /src/app/pages/components/components.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-components', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ComponentsComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/components/components.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { TreeModule } from 'angular-tree-component'; 4 | import { ToasterModule } from 'angular2-toaster'; 5 | 6 | import { ThemeModule } from '../../@theme/theme.module'; 7 | import { ComponentsRoutingModule, routedComponents } from './components-routing.module'; 8 | 9 | @NgModule({ 10 | imports: [ 11 | ThemeModule, 12 | ComponentsRoutingModule, 13 | TreeModule, 14 | ToasterModule.forRoot(), 15 | ], 16 | declarations: [ 17 | ...routedComponents, 18 | ], 19 | }) 20 | export class ComponentsModule { } 21 | -------------------------------------------------------------------------------- /src/app/pages/components/notifications/notifications.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | 7 | nb-card-footer { 8 | padding-bottom: 0.25rem; 9 | 10 | button { 11 | @include nb-ltr(margin, 0 1rem 1rem 0); 12 | @include nb-rtl(margin, 0 0 1rem 1rem); 13 | } 14 | } 15 | 16 | /* stylelint-disable */ 17 | toaster-container /deep/ { 18 | #toast-container .toast-close-button { 19 | right: 0; 20 | } 21 | } 22 | /* stylelint-enable */ 23 | 24 | @include media-breakpoint-down(xs) { 25 | .dropdown-toggle { 26 | font-size: 0.75rem; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app/pages/components/tree/tree.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | Tree 5 | 6 | 7 | 8 | 9 |
10 |
11 | -------------------------------------------------------------------------------- /src/app/pages/components/tree/tree.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | /deep/ .angular-tree-component { 6 | cursor: default; 7 | 8 | .node-wrapper { 9 | .node-content-wrapper { 10 | background: none; 11 | box-shadow: none; 12 | cursor: default; 13 | } 14 | 15 | .toggle-children-wrapper { 16 | cursor: pointer; 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/components/tree/tree.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-tree', 5 | templateUrl: './tree.component.html', 6 | styleUrls: ['./tree.component.scss'], 7 | }) 8 | export class TreeComponent { 9 | 10 | nodes = [{ 11 | name: 'Programming languages by programming paradigm', 12 | children: [{ 13 | name: 'Object-oriented programming', 14 | children: [{ 15 | name: 'Java', 16 | }, { 17 | name: 'C++', 18 | }, { 19 | name: 'C#', 20 | }], 21 | }, { 22 | name: 'Prototype-based programming', 23 | children: [{ 24 | name: 'JavaScript', 25 | }, { 26 | name: 'CoffeeScript', 27 | }, { 28 | name: 'Lua', 29 | }], 30 | }], 31 | }]; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/contacts/contacts.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 |
8 |
9 | 10 |
11 | 12 | {{ c.time }} 13 |
14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 5 | 6 | 7 |
8 |
9 | 10 |
11 |
12 | 13 |
14 | 15 |
16 | 17 |
18 |
19 | 20 |
21 |
22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 | 32 | 33 |
34 | 35 |
36 | 37 | 38 |
39 | 40 |
41 | 42 |
43 |
44 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .solar-card nb-card-header { 7 | border: none; 8 | padding-bottom: 0; 9 | } 10 | 11 | @include media-breakpoint-down(sm) { 12 | ngx-traffic { 13 | display: none; 14 | } 15 | } 16 | 17 | @include media-breakpoint-down(is) { 18 | /deep/ nb-card.large-card { 19 | height: nb-theme(card-height-medium); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/electricity/electricity-chart/electricity-chart.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | display: block; 6 | flex: 1; 7 | position: relative; 8 | 9 | .echart { 10 | position: absolute; 11 | width: 100%; 12 | height: 100%; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/electricity/electricity.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | import { ElectricityService } from '../../../@core/data/electricity.service'; 5 | 6 | @Component({ 7 | selector: 'ngx-electricity', 8 | styleUrls: ['./electricity.component.scss'], 9 | templateUrl: './electricity.component.html', 10 | }) 11 | export class ElectricityComponent implements OnDestroy { 12 | 13 | data: Array; 14 | 15 | type = 'week'; 16 | types = ['week', 'month', 'year']; 17 | 18 | currentTheme: string; 19 | themeSubscription: any; 20 | 21 | constructor(private eService: ElectricityService, private themeService: NbThemeService) { 22 | this.data = this.eService.getData(); 23 | 24 | this.themeSubscription = this.themeService.getJsTheme().subscribe(theme => { 25 | this.currentTheme = theme.name; 26 | }); 27 | } 28 | 29 | ngOnDestroy() { 30 | this.themeSubscription.unsubscribe(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/kitten/kitten.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 |
7 | React Native UI Kitten 8 |
9 |
10 | React Native UI Kitten is a framework that contains a set of commonly used UI components styled in a similar way. The most awesome thing: you can change themes on the fly by just passing a different set of variables. 100% native. Give our kitten a try! 11 |
12 |
13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/kitten/kitten.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-kitten', 6 | styleUrls: ['./kitten.component.scss'], 7 | templateUrl: './kitten.component.html', 8 | }) 9 | export class KittenComponent implements OnDestroy { 10 | 11 | currentTheme: string; 12 | themeSubscription: any; 13 | 14 | constructor(private themeService: NbThemeService) { 15 | this.themeSubscription = this.themeService.getJsTheme().subscribe(theme => { 16 | this.currentTheme = theme.name; 17 | }); 18 | } 19 | 20 | ngOnDestroy() { 21 | this.themeSubscription.unsubscribe(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/security-cameras/security-cameras.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-security-cameras', 5 | styleUrls: ['./security-cameras.component.scss'], 6 | templateUrl: './security-cameras.component.html', 7 | }) 8 | export class SecurityCamerasComponent { 9 | 10 | cameras: any[] = [{ 11 | title: 'Camera #1', 12 | source: 'assets/images/camera1.jpg', 13 | }, { 14 | title: 'Camera #2', 15 | source: 'assets/images/camera2.jpg', 16 | }, { 17 | title: 'Camera #3', 18 | source: 'assets/images/camera3.jpg', 19 | }, { 20 | title: 'Camera #4', 21 | source: 'assets/images/camera4.jpg', 22 | }]; 23 | 24 | selectedCamera: any = this.cameras[0]; 25 | 26 | userMenu = [{ 27 | title: 'Profile', 28 | }, { 29 | title: 'Log out', 30 | }]; 31 | 32 | isSingleView = false; 33 | 34 | selectCamera(camera: any) { 35 | this.selectedCamera = camera; 36 | this.isSingleView = true; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/solar/solar.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~@nebular/theme/styles/global/breakpoints'; 3 | @import '~bootstrap/scss/mixins/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | 7 | $padding: 1rem; 8 | 9 | nb-card-body { 10 | overflow: hidden; 11 | padding: $padding; 12 | } 13 | 14 | .echart { 15 | position: absolute; 16 | left: 1em; 17 | height: calc(100% - 2 * #{$padding}); 18 | width: 40%; 19 | } 20 | 21 | .info { 22 | margin-left: 45%; 23 | padding-top: 1.5rem; 24 | color: nb-theme(color-fg); 25 | } 26 | 27 | .value { 28 | font-family: nb-theme(font-secondary); 29 | font-size: 2rem; 30 | font-weight: nb-theme(font-weight-bold); 31 | color: nb-theme(color-fg-heading); 32 | } 33 | 34 | .details { 35 | font-size: 1.25rem; 36 | font-weight: nb-theme(font-weight-bolder); 37 | line-height: 1; 38 | span { 39 | font-size: 1rem; 40 | font-weight: nb-theme(font-weight-light); 41 | } 42 | } 43 | 44 | .text-hint { 45 | font-size: 1rem; 46 | } 47 | 48 | @include nb-for-theme(cosmic) { 49 | color: nb-theme(color-fg-heading); 50 | 51 | .value { 52 | color: nb-theme(color-fg-highlight); 53 | } 54 | 55 | .details span { 56 | color: nb-theme(color-fg); 57 | } 58 | } 59 | 60 | @include media-breakpoint-down(xs) { 61 | .value { 62 | font-size: 1.75rem; 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/status-card/status-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-status-card', 5 | styleUrls: ['./status-card.component.scss'], 6 | template: ` 7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
{{ title }}
16 |
{{ on ? 'ON' : 'OFF' }}
17 |
18 |
19 | `, 20 | }) 21 | export class StatusCardComponent { 22 | 23 | @Input() title: string; 24 | @Input() type: string; 25 | @Input() on = true; 26 | } 27 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/team/team.component.html: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |
11 |
12 |

Akveo Team

13 |
14 |
Design & Development
15 |
16 | We're small team of fullstack software experts. We're crazy about creation of modern and secure software. We help to make 17 | your product amazing. 18 |
19 |
20 | 21 | 35 |
36 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/team/team.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-team', 5 | styleUrls: ['./team.component.scss'], 6 | templateUrl: './team.component.html', 7 | }) 8 | export class TeamComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/temperature/temperature.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-temperature', 6 | styleUrls: ['./temperature.component.scss'], 7 | templateUrl: './temperature.component.html', 8 | }) 9 | export class TemperatureComponent implements OnDestroy { 10 | 11 | temperature = 24; 12 | temperatureOff = false; 13 | temperatureMode = 'cool'; 14 | 15 | humidity = 87; 16 | humidityOff = false; 17 | humidityMode = 'heat'; 18 | 19 | colors: any; 20 | themeSubscription: any; 21 | 22 | constructor(private theme: NbThemeService) { 23 | this.themeSubscription = this.theme.getJsTheme().subscribe(config => { 24 | this.colors = config.variables; 25 | }); 26 | } 27 | 28 | ngOnDestroy() { 29 | this.themeSubscription.unsubscribe(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/traffic/traffic.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | nb-card-header { 6 | display: flex; 7 | align-items: center; 8 | justify-content: space-between; 9 | padding: 0.675rem 0.5rem 0.5rem 1.25rem; 10 | } 11 | 12 | nb-card-body { 13 | overflow: hidden; 14 | position: relative; 15 | } 16 | 17 | /deep/ canvas { 18 | border-bottom-left-radius: nb-theme(card-border-radius); 19 | border-bottom-right-radius: nb-theme(card-border-radius); 20 | } 21 | 22 | .echart { 23 | position: absolute; 24 | height: 100%; 25 | width: 100%; 26 | } 27 | 28 | .dropdown { 29 | min-width: 120px; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/weather/weather.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-weather', 5 | styleUrls: ['./weather.component.scss'], 6 | templateUrl: './weather.component.html', 7 | }) 8 | 9 | export class WeatherComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/chart-panel-header/chart-panel-header.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 20 |
21 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/chart-panel-header/chart-panel-header.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .chart-header { 7 | display: flex; 8 | justify-content: space-between; 9 | margin-bottom: 2.125rem; 10 | align-items: center; 11 | } 12 | 13 | .dropdown { 14 | min-width: 8.125rem; 15 | } 16 | 17 | @include media-breakpoint-down(is) { 18 | .chart-header { 19 | flex-direction: column-reverse; 20 | } 21 | 22 | ngx-legend-chart { 23 | align-self: flex-start; 24 | 25 | /deep/ .legends { 26 | padding-left: 0; 27 | font-size: nb-theme(font-size-sm); 28 | } 29 | 30 | /deep/ .legend { 31 | margin-left: 1rem; 32 | } 33 | } 34 | 35 | .dropdown { 36 | margin-top: 1.5rem; 37 | margin-bottom: 1.5rem; 38 | align-self: flex-end; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/chart-panel-summary/chart-panel-summary.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .summary-container { 7 | display: flex; 8 | flex: 1; 9 | background-color: nb-theme(chart-panel-summary-background-color); 10 | box-shadow: nb-theme(chart-panel-summary-box-shadow); 11 | justify-content: space-between; 12 | padding: 1.5rem 4rem 1rem; 13 | margin-bottom: 1rem; 14 | border: 15 | nb-theme(chart-panel-summary-border-width) 16 | solid 17 | nb-theme(chart-panel-summary-border-color); 18 | border-left: none; 19 | border-right: none; 20 | } 21 | 22 | .value { 23 | font-size: 2rem; 24 | color: nb-theme(color-fg-heading); 25 | } 26 | 27 | @include media-breakpoint-down(sm) { 28 | .value, .title { 29 | font-weight: nb-theme(font-weight-bold); 30 | } 31 | 32 | .title { 33 | font-size: nb-theme(font-size-sm); 34 | } 35 | 36 | .value { 37 | font-size: nb-theme(font-size-xlg); 38 | } 39 | } 40 | 41 | @include media-breakpoint-down(is) { 42 | .summary-container { 43 | padding-left: nb-theme(padding); 44 | padding-right: nb-theme(padding); 45 | } 46 | 47 | .value { 48 | margin-top: 0.5rem; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/chart-panel-summary/chart-panel-summary.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-chart-panel-summary', 5 | styleUrls: ['./chart-panel-summary.component.scss'], 6 | template: ` 7 |
8 |
9 |
{{ item.title }}
10 |
{{ item.value }}
11 |
12 |
13 | `, 14 | }) 15 | export class ChartPanelSummaryComponent { 16 | @Input() summary: {title: string; value: number}[]; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/charts-panel.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 8 | 9 | 10 |
11 |
12 | 13 |
14 | 15 | 17 | 18 | 19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/charts-panel.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | $legend-all-orders-color: #00977e; 4 | $legend-payment-color: #6935ca; 5 | $legend-canceled-color: #3f4fda; 6 | 7 | @include nb-install-component() { 8 | 9 | /deep/ nb-tabset { 10 | display: flex; 11 | flex-direction: column; 12 | flex: 1; 13 | 14 | ul { 15 | border-bottom: none; 16 | } 17 | } 18 | 19 | nb-tab { 20 | flex: 1; 21 | padding-bottom: 1.25rem; 22 | } 23 | 24 | .chart-container { 25 | flex: 1; 26 | height: 100%; 27 | display: flex; 28 | flex-direction: column; 29 | overflow: hidden; 30 | } 31 | 32 | ngx-chart-panel-header, ngx-profit-chart, ngx-orders-chart { 33 | padding: 0 1.25rem; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/charts-panel/charts/charts-common.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | display: block; 5 | height: 100%; 6 | width: 100%; 7 | 8 | .echart { 9 | display: block; 10 | height: 100%; 11 | width: 100%; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/country-orders/chart/country-orders-chart.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | display: flex; 7 | flex-direction: column; 8 | height: 100%; 9 | flex: 1; 10 | padding: nb-theme(card-padding); 11 | border-left: 12 | nb-theme(card-header-border-width) 13 | nb-theme(card-header-border-type) 14 | nb-theme(card-header-border-color); 15 | 16 | .header { 17 | margin-left: 1rem; 18 | } 19 | 20 | .title { 21 | font-family: nb-theme(card-header-font-family); 22 | color: nb-theme(color-fg); 23 | } 24 | 25 | .echart { 26 | height: 85%; 27 | } 28 | 29 | @include media-breakpoint-down(sm) { 30 | height: 50%; 31 | border-top: 32 | nb-theme(card-border-width) 33 | nb-theme(card-header-border-type) 34 | nb-theme(card-header-border-color); 35 | 36 | .echart { 37 | height: 75%; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/country-orders/country-orders.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | 7 | nb-card-body { 8 | display: flex; 9 | height: 100%; 10 | padding: 0; 11 | } 12 | 13 | @include media-breakpoint-down(sm) { 14 | nb-card-body { 15 | flex-direction: column; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/country-orders/map/country-orders-map.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { Observable } from 'rxjs/Observable'; 4 | 5 | 6 | @Injectable() 7 | export class CountryOrdersMapService { 8 | 9 | constructor(private http: HttpClient) {} 10 | 11 | getCords(): Observable { 12 | return this.http.get('./assets/leaflet-countries/countries.geo.json'); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/e-commerce.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 | 9 |
10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 |
19 | 20 |
21 |
22 | 23 |
24 | 25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 | 33 |
34 | 35 |
36 | 37 |
38 |
39 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/e-commerce.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-ecommerce', 5 | templateUrl: './e-commerce.component.html', 6 | }) 7 | export class ECommerceComponent { 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/back-side/earning-card-back.component.html: -------------------------------------------------------------------------------- 1 | 2 | Earnings 3 | 4 | 5 |
6 |
{{ name }}
7 |
Last week
8 |
{{ value }}%
9 |
10 | 13 | 14 |
15 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/back-side/earning-card-back.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | nb-card-header { 7 | flex-direction: row; 8 | } 9 | 10 | ngx-earning-pie-chart, .chart-info { 11 | flex: 1; 12 | } 13 | 14 | .chart-info { 15 | padding-top: 0.7rem; 16 | } 17 | 18 | .title { 19 | font-size: nb-theme(font-size-xlg); 20 | } 21 | 22 | .time-period { 23 | margin-top: 1.5rem; 24 | color: nb-theme(color-fg); 25 | } 26 | 27 | .value { 28 | margin-top: 0.2rem; 29 | font-size: 1.5rem; 30 | font-weight: nb-theme(font-weight-bold); 31 | color: nb-theme(color-fg-heading); 32 | } 33 | 34 | .echart { 35 | position: absolute; 36 | width: calc(50% - #{nb-theme(card-padding)}); 37 | height: calc(100% - 2 * #{nb-theme(card-padding)}); 38 | } 39 | 40 | @include media-breakpoint-between(xl, xl) { 41 | ngx-earning-pie-chart { 42 | flex: 2; 43 | } 44 | } 45 | 46 | @include media-breakpoint-between(sm, sm) { 47 | ngx-earning-pie-chart { 48 | flex: 2; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/back-side/earning-card-back.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { EarningService, PieChart } from '../../../../@core/data/earning.service'; 3 | import { takeWhile } from 'rxjs/operators'; 4 | 5 | @Component({ 6 | selector: 'ngx-earning-card-back', 7 | styleUrls: ['./earning-card-back.component.scss'], 8 | templateUrl: './earning-card-back.component.html', 9 | }) 10 | export class EarningCardBackComponent implements OnDestroy { 11 | private alive = true; 12 | 13 | earningPieChartData: PieChart[]; 14 | name: string; 15 | color: string; 16 | value: number; 17 | defaultSelectedCurrency: string = 'Bitcoin'; 18 | 19 | constructor(private earningService: EarningService ) { 20 | this.earningService.getEarningPieChartData() 21 | .pipe(takeWhile(() => this.alive)) 22 | .subscribe((earningPieChartData) => { 23 | this.earningPieChartData = earningPieChartData; 24 | }); 25 | } 26 | 27 | changeChartInfo(pieData: {value: number; name: string; color: any}) { 28 | this.value = pieData.value; 29 | this.name = pieData.name; 30 | this.color = pieData.color; 31 | } 32 | 33 | ngOnDestroy() { 34 | this.alive = false; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/earning-card.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/earning-card.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | nb-card { 5 | position: relative; 6 | } 7 | 8 | .nb-arrow-right { 9 | position: absolute; 10 | top: 0; 11 | right: 0; 12 | @include nb-rtl(right, auto); 13 | @include nb-rtl(left, 0); 14 | padding: 1.5rem; 15 | cursor: pointer; 16 | } 17 | 18 | /deep/ .flipped { 19 | .back-container { 20 | .nb-arrow-right { 21 | transform: scaleX(-1); 22 | } 23 | } 24 | 25 | .front-container { 26 | .nb-arrow-right { 27 | display: none; 28 | } 29 | } 30 | } 31 | 32 | ngx-earning-card-back, ngx-earning-card-front { 33 | display: flex; 34 | flex-direction: column; 35 | flex: 1; 36 | } 37 | 38 | /deep/ nb-card-header { 39 | display: flex; 40 | justify-content: space-between; 41 | @include nb-rtl(flex-direction, row-reverse); 42 | padding-left: 1rem; 43 | } 44 | 45 | /deep/ nb-card-body { 46 | overflow: hidden; 47 | display: flex; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/earning-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-earning-card', 5 | styleUrls: ['./earning-card.component.scss'], 6 | templateUrl: './earning-card.component.html', 7 | }) 8 | export class EarningCardComponent { 9 | 10 | flipped = false; 11 | 12 | toggleFlipView() { 13 | this.flipped = !this.flipped; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/earning-card/front-side/earning-card-front.component.html: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 |
16 |
Daily Income
17 |
{{ earningLiveUpdateCardData.dailyIncome | ngxNumberWithCommas }}
18 |
21 | {{ earningLiveUpdateCardData.delta.value }}% 22 |
23 |
24 | 26 | 27 |
28 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/legend-chart/enum.legend-item-color.ts: -------------------------------------------------------------------------------- 1 | export enum NgxLegendItemColor { 2 | GREEN = 'green', 3 | PURPLE = 'purple', 4 | LIGHT_PURPLE = 'light-purple', 5 | BLUE = 'blue', 6 | YELLOW = 'yellow', 7 | } 8 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/legend-chart/legend-chart.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
5 |
{{ legend.title }}
6 |
7 |
8 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/legend-chart/legend-chart.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .legends { 7 | display: flex; 8 | @include nb-rtl(flex-direction, row-reverse); 9 | color: nb-theme(color-fg); 10 | padding: 0 0 0 2.85rem; 11 | } 12 | 13 | .legend { 14 | display: flex; 15 | justify-content: space-between; 16 | align-items: baseline; 17 | margin-left: 4rem; 18 | 19 | &:first-child { 20 | margin-left: 0; 21 | } 22 | } 23 | 24 | .legend-item-color { 25 | min-width: 15px; 26 | min-height: 15px; 27 | border-radius: 0.2rem; 28 | } 29 | 30 | .legend-title { 31 | padding: 0 0.75rem; 32 | white-space: nowrap; 33 | } 34 | 35 | @include media-breakpoint-down(md) { 36 | .legend { 37 | margin-left: 1.5rem; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/legend-chart/legend-chart.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | import { NgxLegendItemColor } from './enum.legend-item-color'; 4 | 5 | @Component({ 6 | selector: 'ngx-legend-chart', 7 | styleUrls: ['./legend-chart.component.scss'], 8 | templateUrl: './legend-chart.component.html', 9 | }) 10 | export class ECommerceLegendChartComponent { 11 | 12 | /** 13 | * Take an array of legend items 14 | * Available iconColor: 'green', 'purple', 'light-purple', 'blue', 'yellow' 15 | * @type {{iconColor: string; title: string}[]} 16 | */ 17 | @Input() 18 | legendItems: { iconColor: NgxLegendItemColor; title: string }[] = []; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/back-side/stats-card-back.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 |
6 | Profit 7 |
8 |
9 | 10 |
11 |
12 | Jun 1 - Jun 30 13 |
14 | $ 15 | 300 16 |
17 |
18 |
19 | Jul 1 - Jul 31 20 |
21 | $ 22 | 860 23 |
24 |
25 |
26 | 27 |
28 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/back-side/stats-card-back.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-stats-card-back', 5 | styleUrls: ['./stats-card-back.component.scss'], 6 | templateUrl: './stats-card-back.component.html', 7 | }) 8 | export class StatsCardBackComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/front-side/stats-card-front.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 |
6 | Profit 7 |
8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/front-side/stats-card-front.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ProfitBarAnimationChartService } from '../../../../@core/data/profit-bar-animation-chart.service'; 3 | import { takeWhile } from 'rxjs/operators'; 4 | 5 | @Component({ 6 | selector: 'ngx-stats-card-front', 7 | styleUrls: ['./stats-card-front.component.scss'], 8 | templateUrl: './stats-card-front.component.html', 9 | }) 10 | export class StatsCardFrontComponent { 11 | 12 | private alive = true; 13 | 14 | linesData: { firstLine: number[]; secondLine: number[] }; 15 | 16 | constructor(private profitBarAnimationChartService: ProfitBarAnimationChartService) { 17 | this.profitBarAnimationChartService.getChartData() 18 | .pipe(takeWhile(() => this.alive)) 19 | .subscribe((linesData) => { 20 | this.linesData = linesData; 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/profit-card.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/profit-card.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | .nb-arrow-right { 5 | position: absolute; 6 | right: 0; 7 | top: 0; 8 | @include nb-rtl(right, auto); 9 | @include nb-rtl(left, 0); 10 | padding: 1.5rem; 11 | cursor: pointer; 12 | } 13 | 14 | ::ng-deep .flipped { 15 | .back-container { 16 | .nb-arrow-right { 17 | transform: scaleX(-1); 18 | } 19 | } 20 | 21 | .front-container { 22 | .nb-arrow-right { 23 | display: none; 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/profit-card/profit-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-profit-card', 5 | styleUrls: ['./profit-card.component.scss'], 6 | templateUrl: './profit-card.component.html', 7 | }) 8 | export class ProfitCardComponent { 9 | 10 | flipped = false; 11 | 12 | toggleView() { 13 | this.flipped = !this.flipped; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/progress-section/progress-section.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
{{ item.title }}
5 |
{{ item.value | ngxNumberWithCommas }}
6 | 7 |
8 | {{ item.description }} 9 |
10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/progress-section/progress-section.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | $shadow-green: #00977e; 4 | 5 | @include nb-install-component() { 6 | .progress-info { 7 | color: nb-theme(color-fg-heading); 8 | margin-top: 2.5rem; 9 | 10 | &:first-child { 11 | margin-top: 0; 12 | } 13 | } 14 | 15 | .title { 16 | font-family: nb-theme(font-secondary); 17 | font-size: nb-theme(font-size-lg); 18 | font-weight: nb-theme(font-weight-bold); 19 | } 20 | 21 | .value { 22 | font-size: 3rem; 23 | font-weight: nb-theme(font-weight-light); 24 | margin-top: 0.5rem; 25 | } 26 | 27 | .description { 28 | color: nb-theme(color-fg); 29 | margin-top: 0.5rem; 30 | } 31 | 32 | /deep/ nb-progress-bar { 33 | margin-top: 0.2rem; 34 | 35 | .progress-container { 36 | height: 0.8rem; 37 | border-radius: 0; 38 | } 39 | 40 | .progress-value { 41 | height: 0.6rem; 42 | background: nb-theme(progress-bar-background); 43 | 44 | @include nb-for-theme(cosmic) { 45 | box-shadow: 0 0.2rem $shadow-green; 46 | } 47 | 48 | @include nb-for-theme(corporate) { 49 | height: 100%; 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/progress-section/progress-section.component.ts: -------------------------------------------------------------------------------- 1 | import {Component} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-progress-section', 5 | styleUrls: ['./progress-section.component.scss'], 6 | templateUrl: './progress-section.component.html', 7 | }) 8 | export class ECommerceProgressSectionComponent { 9 | progressInfoData = [ 10 | { 11 | title: 'Today’s Profit', 12 | value: 572900, 13 | activeProgress: 70, 14 | description: 'Better than last week (70%)', 15 | }, 16 | { 17 | title: 'New Orders', 18 | value: 6378, 19 | activeProgress: 30, 20 | description: 'Better than last week (30%)', 21 | }, 22 | { 23 | title: 'New Comments', 24 | value: 200, 25 | activeProgress: 55, 26 | description: 'Better than last week (55%)', 27 | }, 28 | ]; 29 | } 30 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/slide-out/slide-out.component.html: -------------------------------------------------------------------------------- 1 | 5 |
8 |
9 | 10 |
11 |
12 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/slide-out/slide-out.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-slide-out', 5 | styleUrls: ['./slide-out.component.scss'], 6 | templateUrl: './slide-out.component.html', 7 | }) 8 | export class SlideOutComponent { 9 | 10 | @Input() showVisitorsStatistics: boolean = false; 11 | 12 | toggleStatistics() { 13 | this.showVisitorsStatistics = !this.showVisitorsStatistics; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/back-side/traffic-back-card.component.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/back-side/traffic-back-card.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | display: flex; 5 | flex-direction: column; 6 | flex: 1; 7 | 8 | nb-card-body { 9 | overflow: hidden; 10 | position: relative; 11 | display: flex; 12 | flex-direction: column; 13 | } 14 | 15 | ngx-traffic-bar-chart { 16 | flex: 1; 17 | position: relative; 18 | } 19 | 20 | /deep/ canvas { 21 | border-bottom-left-radius: nb-theme(card-border-radius); 22 | border-bottom-right-radius: nb-theme(card-border-radius); 23 | } 24 | 25 | .echart { 26 | height: 100%; 27 | width: 100%; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/back-side/traffic-back-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | import { takeWhile } from 'rxjs/operators'; 4 | 5 | @Component({ 6 | selector: 'ngx-traffic-back-card', 7 | styleUrls: ['./traffic-back-card.component.scss'], 8 | templateUrl: './traffic-back-card.component.html', 9 | }) 10 | export class TrafficBackCardComponent implements OnDestroy { 11 | 12 | private alive = true; 13 | 14 | @Input() trafficBarData: any; 15 | 16 | currentTheme: string; 17 | 18 | constructor(private themeService: NbThemeService) { 19 | this.themeService.getJsTheme() 20 | .pipe(takeWhile(() => this.alive)) 21 | .subscribe(theme => { 22 | this.currentTheme = theme.name; 23 | }); 24 | } 25 | 26 | ngOnDestroy() { 27 | this.alive = false; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/front-side/traffic-bar/traffic-bar.component.html: -------------------------------------------------------------------------------- 1 |
2 |
{{ barData.prevDate }}
3 |
4 |
6 |
7 |
8 |
9 |
13 |
14 |
15 |
{{ barData.nextDate }}
16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/front-side/traffic-bar/traffic-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-traffic-bar', 5 | styleUrls: ['./traffic-bar.component.scss'], 6 | templateUrl: './traffic-bar.component.html', 7 | }) 8 | export class TrafficBarComponent { 9 | 10 | @Input() barData: { prevDate: string; prevValue: number; nextDate: string; nextValue: number }; 11 | @Input() successDelta: boolean; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/front-side/traffic-front-card.component.html: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
  • 4 |
    {{ item.date }}
    5 |
    {{ item.value }}
    6 |
    9 | {{ item.delta.value }}% 10 |
    11 | 13 | 14 |
  • 15 |
16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/front-side/traffic-front-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnDestroy } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | import { takeWhile } from 'rxjs/operators'; 4 | 5 | import { TrafficList } from '../../../../@core/data/traffic-list.service'; 6 | 7 | @Component({ 8 | selector: 'ngx-traffic-front-card', 9 | styleUrls: ['./traffic-front-card.component.scss'], 10 | templateUrl: './traffic-front-card.component.html', 11 | }) 12 | export class TrafficFrontCardComponent implements OnDestroy { 13 | 14 | private alive = true; 15 | 16 | @Input() frontCardData: TrafficList; 17 | 18 | currentTheme: string; 19 | 20 | constructor(private themeService: NbThemeService) { 21 | this.themeService.getJsTheme() 22 | .pipe(takeWhile(() => this.alive)) 23 | .subscribe(theme => { 24 | this.currentTheme = theme.name; 25 | }); 26 | } 27 | 28 | trackByDate(_, item) { 29 | return item.date; 30 | } 31 | 32 | ngOnDestroy() { 33 | this.alive = false; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/traffic-cards-header/traffic-cards-header.component.html: -------------------------------------------------------------------------------- 1 | 2 | Traffic 3 | 16 | 17 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/traffic-cards-header/traffic-cards-header.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | nb-card-header { 5 | display: flex; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 0.675rem 4rem 0.5rem 1.25rem; 9 | @include nb-rtl(padding-right, 1.25rem); 10 | @include nb-rtl(padding-left, 4rem); 11 | } 12 | 13 | .dropdown { 14 | min-width: 120px; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/traffic-cards-header/traffic-cards-header.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core'; 2 | import { NbThemeService } from '@nebular/theme'; 3 | import { takeWhile } from 'rxjs/operators'; 4 | 5 | @Component({ 6 | selector: 'ngx-traffic-cards-header', 7 | styleUrls: ['./traffic-cards-header.component.scss'], 8 | templateUrl: './traffic-cards-header.component.html', 9 | }) 10 | export class TrafficCardsHeaderComponent implements OnDestroy { 11 | private alive = true; 12 | 13 | @Output() periodChange = new EventEmitter(); 14 | 15 | @Input() type: string = 'week'; 16 | 17 | types: string[] = ['week', 'month', 'year']; 18 | currentTheme: string; 19 | 20 | constructor(private themeService: NbThemeService) { 21 | this.themeService.getJsTheme() 22 | .pipe(takeWhile(() => this.alive)) 23 | .subscribe(theme => { 24 | this.currentTheme = theme.name; 25 | }); 26 | } 27 | 28 | changePeriod(period: string): void { 29 | this.type = period; 30 | this.periodChange.emit(period); 31 | } 32 | 33 | ngOnDestroy() { 34 | this.alive = false; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/traffic-reveal-card.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | > 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/traffic-reveal-card/traffic-reveal-card.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | .nb-arrow-up, .nb-arrow-down { 5 | position: absolute; 6 | top: 0; 7 | right: 0; 8 | @include nb-rtl(right, auto); 9 | @include nb-rtl(left, 0); 10 | padding: 1.5rem; 11 | cursor: pointer; 12 | } 13 | 14 | nb-card-back { 15 | /deep/ nb-card-header { 16 | border: none; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-analytics-chart/visitors-analytics-chart.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | display: block; 5 | height: 290px; 6 | width: 100%; 7 | 8 | .echart { 9 | display: block; 10 | height: 100%; 11 | width: 100%; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-analytics.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Visitors Analytics
4 |
Consumption
5 |
6 | 7 |
8 |
9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 18 |
19 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-analytics.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | position: relative; 7 | display: block; 8 | overflow: hidden; 9 | 10 | nb-card { 11 | position: relative; 12 | } 13 | 14 | nb-card-header { 15 | border-bottom: none; 16 | 17 | .title { 18 | font-size: 1.5rem; 19 | font-weight: nb-theme(font-weight-bold); 20 | } 21 | 22 | .sub-title { 23 | color: nb-theme(color-fg); 24 | } 25 | } 26 | 27 | .container { 28 | display: flex; 29 | flex-direction: row; 30 | } 31 | 32 | .chart-container { 33 | flex: 1; 34 | height: 100%; 35 | display: flex; 36 | flex-direction: column; 37 | overflow: hidden; 38 | position: relative; 39 | } 40 | 41 | .chart-header { 42 | display: flex; 43 | justify-content: space-between; 44 | margin-bottom: 2.125rem; 45 | } 46 | 47 | @include media-breakpoint-down(is) { 48 | ngx-legend-chart { 49 | /deep/ .legends { 50 | padding-left: 0; 51 | font-size: nb-theme(font-size-sm); 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-analytics.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { takeWhile } from 'rxjs/operators'; 3 | import { NbThemeService } from '@nebular/theme'; 4 | 5 | 6 | @Component({ 7 | selector: 'ngx-ecommerce-visitors-analytics', 8 | styleUrls: ['./visitors-analytics.component.scss'], 9 | templateUrl: './visitors-analytics.component.html', 10 | }) 11 | export class ECommerceVisitorsAnalyticsComponent implements OnDestroy { 12 | private alive = true; 13 | 14 | chartLegend: {iconColor: string; title: string}[]; 15 | 16 | constructor(private themeService: NbThemeService) { 17 | this.themeService.getJsTheme() 18 | .pipe(takeWhile(() => this.alive)) 19 | .subscribe(theme => { 20 | this.setLegendItems(theme.variables.visitorsLegend); 21 | }); 22 | } 23 | 24 | setLegendItems(visitorsLegend): void { 25 | this.chartLegend = [ 26 | { 27 | iconColor: visitorsLegend.firstIcon, 28 | title: 'Unique Visitors', 29 | }, 30 | { 31 | iconColor: visitorsLegend.secondIcon, 32 | title: 'Page Views', 33 | }, 34 | ]; 35 | } 36 | 37 | ngOnDestroy() { 38 | this.alive = false; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-statistics/visitors-statistics.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
1,100
4 |
New Visitors
5 |
6 |
7 |
12 |
13 |
14 | 21 |
22 | -------------------------------------------------------------------------------- /src/app/pages/e-commerce/visitors-analytics/visitors-statistics/visitors-statistics.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | .visitors-value { 6 | font-size: 3rem; 7 | font-weight: nb-theme(font-weight-light); 8 | color: nb-theme(color-fg-heading); 9 | line-height: 0.8; 10 | } 11 | 12 | .visitors-title { 13 | margin-top: 1rem; 14 | font-size: 1.25rem; 15 | color: nb-theme(color-fg); 16 | } 17 | 18 | .visitors-statistics { 19 | width: 100%; 20 | } 21 | 22 | .statistics-chart { 23 | margin-top: 3.5rem; 24 | margin-bottom: 1.5rem; 25 | width: 100%; 26 | 27 | .echart { 28 | display: block; 29 | height: 190px; 30 | width: 100%; 31 | } 32 | } 33 | 34 | .chart-values { 35 | display: flex; 36 | } 37 | 38 | .chart-value { 39 | color: nb-theme(color-fg-heading); 40 | font-size: 2rem; 41 | font-weight: nb-theme(font-weight-bold); 42 | margin-bottom: 1rem; 43 | flex: 1; 44 | } 45 | 46 | // legend start 47 | .visitors-statistics-legend { 48 | /deep/ .legends { 49 | padding: 0; 50 | margin-left: 0; 51 | } 52 | 53 | /deep/ .legend { 54 | flex: 1; 55 | margin-left: 0; 56 | justify-content: flex-start; 57 | } 58 | } 59 | // legend end 60 | } 61 | -------------------------------------------------------------------------------- /src/app/pages/editors/ckeditor/ckeditor.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | import './ckeditor.loader'; 4 | import 'ckeditor'; 5 | 6 | @Component({ 7 | selector: 'ngx-ckeditor', 8 | template: ` 9 | 10 | 11 | CKEditor 12 | 13 | 14 | 15 | 16 | 17 | `, 18 | }) 19 | export class CKEditorComponent { 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/editors/ckeditor/ckeditor.loader.ts: -------------------------------------------------------------------------------- 1 | window['CKEDITOR_BASEPATH'] = '//cdn.ckeditor.com/4.6.2/full-all/'; 2 | -------------------------------------------------------------------------------- /src/app/pages/editors/editors-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { EditorsComponent } from './editors.component'; 5 | import { TinyMCEComponent } from './tiny-mce/tiny-mce.component'; 6 | import { CKEditorComponent } from './ckeditor/ckeditor.component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: EditorsComponent, 11 | children: [{ 12 | path: 'tinymce', 13 | component: TinyMCEComponent, 14 | }, { 15 | path: 'ckeditor', 16 | component: CKEditorComponent, 17 | }], 18 | }]; 19 | 20 | @NgModule({ 21 | imports: [RouterModule.forChild(routes)], 22 | exports: [RouterModule], 23 | }) 24 | export class EditorsRoutingModule { } 25 | 26 | export const routedComponents = [ 27 | EditorsComponent, 28 | TinyMCEComponent, 29 | CKEditorComponent, 30 | ]; 31 | -------------------------------------------------------------------------------- /src/app/pages/editors/editors.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-editors', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class EditorsComponent { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pages/editors/editors.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CKEditorModule } from 'ng2-ckeditor'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | 6 | import { EditorsRoutingModule, routedComponents } from './editors-routing.module'; 7 | 8 | @NgModule({ 9 | imports: [ 10 | ThemeModule, 11 | EditorsRoutingModule, 12 | CKEditorModule, 13 | ], 14 | declarations: [ 15 | ...routedComponents, 16 | ], 17 | }) 18 | export class EditorsModule { } 19 | -------------------------------------------------------------------------------- /src/app/pages/editors/tiny-mce/tiny-mce.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-tiny-mce-page', 5 | template: ` 6 | 7 | 8 | Tiny MCE 9 | 10 | 11 | 12 | 13 | 14 | `, 15 | }) 16 | export class TinyMCEComponent { 17 | } 18 | -------------------------------------------------------------------------------- /src/app/pages/forms/form-inputs/form-inputs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-inputs', 5 | styleUrls: ['./form-inputs.component.scss'], 6 | templateUrl: './form-inputs.component.html', 7 | }) 8 | export class FormInputsComponent { 9 | 10 | starRate = 2; 11 | heartRate = 4; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/pages/forms/form-layouts/form-layouts.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | .full-width { 5 | flex: 1; 6 | min-width: 220px; 7 | } 8 | 9 | nb-checkbox { 10 | margin-bottom: 1rem; 11 | } 12 | 13 | .form-inline > * { 14 | @include nb-ltr(margin, 0 1.5rem 1.5rem 0); 15 | @include nb-rtl(margin, 0 0 1.5rem 1.5rem); 16 | } 17 | 18 | nb-card.inline-form-card nb-card-body { 19 | padding-bottom: 0; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/pages/forms/form-layouts/form-layouts.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-layouts', 5 | styleUrls: ['./form-layouts.component.scss'], 6 | templateUrl: './form-layouts.component.html', 7 | }) 8 | export class FormLayoutsComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/forms/forms-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { FormsComponent } from './forms.component'; 5 | import { FormInputsComponent } from './form-inputs/form-inputs.component'; 6 | import { FormLayoutsComponent } from './form-layouts/form-layouts.component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: FormsComponent, 11 | children: [{ 12 | path: 'inputs', 13 | component: FormInputsComponent, 14 | }, { 15 | path: 'layouts', 16 | component: FormLayoutsComponent, 17 | }], 18 | }]; 19 | 20 | @NgModule({ 21 | imports: [ 22 | RouterModule.forChild(routes), 23 | ], 24 | exports: [ 25 | RouterModule, 26 | ], 27 | }) 28 | export class FormsRoutingModule { 29 | 30 | } 31 | 32 | export const routedComponents = [ 33 | FormsComponent, 34 | FormInputsComponent, 35 | FormLayoutsComponent, 36 | ]; 37 | -------------------------------------------------------------------------------- /src/app/pages/forms/forms.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class FormsComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/forms/forms.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { FormsRoutingModule, routedComponents } from './forms-routing.module'; 5 | 6 | @NgModule({ 7 | imports: [ 8 | ThemeModule, 9 | FormsRoutingModule, 10 | ], 11 | declarations: [ 12 | ...routedComponents, 13 | ], 14 | }) 15 | export class FormsModule { } 16 | -------------------------------------------------------------------------------- /src/app/pages/maps/bubble/bubble-map.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | nb-card-body { 6 | padding: nb-theme(card-padding) 0 0 0; 7 | } 8 | 9 | .echarts { 10 | width: 100%; 11 | height: nb-theme(card-height-large); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/maps/gmaps/gmaps.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | nb-card-body { 6 | padding: 0; 7 | } 8 | 9 | /deep/ agm-map { 10 | width: 100%; 11 | height: nb-theme(card-height-large); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/maps/gmaps/gmaps.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-gmaps', 5 | styleUrls: ['./gmaps.component.scss'], 6 | template: ` 7 | 8 | Google Maps 9 | 10 | 11 | 12 | 13 | 14 | 15 | `, 16 | }) 17 | export class GmapsComponent { 18 | 19 | lat = 51.678418; 20 | lng = 7.809007; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/pages/maps/leaflet/leaflet.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | nb-card-body { 6 | padding: 0; 7 | } 8 | 9 | /deep/ .leaflet-container { 10 | width: 100%; 11 | height: nb-theme(card-height-large); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/maps/leaflet/leaflet.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | import * as L from 'leaflet'; 4 | import 'style-loader!leaflet/dist/leaflet.css'; 5 | 6 | @Component({ 7 | selector: 'ngx-leaflet', 8 | styleUrls: ['./leaflet.component.scss'], 9 | template: ` 10 | 11 | Leaflet Maps 12 | 13 |
14 |
15 |
16 | `, 17 | }) 18 | export class LeafletComponent { 19 | 20 | options = { 21 | layers: [ 22 | L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }), 23 | ], 24 | zoom: 5, 25 | center: L.latLng({ lat: 38.991709, lng: -76.886109 }), 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /src/app/pages/maps/maps-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { MapsComponent } from './maps.component'; 5 | import { GmapsComponent } from './gmaps/gmaps.component'; 6 | import { LeafletComponent } from './leaflet/leaflet.component'; 7 | import { BubbleMapComponent } from './bubble/bubble-map.component'; 8 | import { SearchMapComponent } from './search-map/search-map.component'; 9 | import { MapComponent } from './search-map/map/map.component'; 10 | import { SearchComponent } from './search-map/search/search.component'; 11 | 12 | const routes: Routes = [{ 13 | path: '', 14 | component: MapsComponent, 15 | children: [{ 16 | path: 'gmaps', 17 | component: GmapsComponent, 18 | }, { 19 | path: 'leaflet', 20 | component: LeafletComponent, 21 | }, { 22 | path: 'bubble', 23 | component: BubbleMapComponent, 24 | }, { 25 | path: 'searchmap', 26 | component: SearchMapComponent, 27 | }], 28 | }]; 29 | 30 | @NgModule({ 31 | imports: [RouterModule.forChild(routes)], 32 | exports: [RouterModule], 33 | }) 34 | export class MapsRoutingModule { } 35 | 36 | export const routedComponents = [ 37 | MapsComponent, 38 | GmapsComponent, 39 | LeafletComponent, 40 | BubbleMapComponent, 41 | SearchMapComponent, 42 | MapComponent, 43 | SearchComponent, 44 | ]; 45 | -------------------------------------------------------------------------------- /src/app/pages/maps/maps.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-maps', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class MapsComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/maps/maps.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { AgmCoreModule } from '@agm/core'; 3 | import { LeafletModule } from '@asymmetrik/ngx-leaflet'; 4 | import { NgxEchartsModule } from 'ngx-echarts'; 5 | 6 | import { ThemeModule } from '../../@theme/theme.module'; 7 | import { MapsRoutingModule, routedComponents } from './maps-routing.module'; 8 | 9 | @NgModule({ 10 | imports: [ 11 | ThemeModule, 12 | AgmCoreModule.forRoot({ 13 | apiKey: 'AIzaSyCpVhQiwAllg1RAFaxMWSpQruuGARy0Y1k', 14 | libraries: ['places'], 15 | }), 16 | LeafletModule.forRoot(), 17 | MapsRoutingModule, 18 | NgxEchartsModule, 19 | ], 20 | exports: [], 21 | declarations: [ 22 | ...routedComponents, 23 | ], 24 | }) 25 | export class MapsModule { } 26 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/entity/Location.ts: -------------------------------------------------------------------------------- 1 | export class Location { 2 | constructor(public latitude: number = 53.9, public longitude: number = 27.5667) { 3 | } 4 | } 5 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/map/map.component.html: -------------------------------------------------------------------------------- 1 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/map/map.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | 5 | nb-card-body { 6 | padding: 0; 7 | } 8 | 9 | /deep/ agm-map { 10 | width: 100%; 11 | height: nb-theme(card-height-large); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/map/map.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { Location } from '../entity/Location'; 3 | 4 | @Component({ 5 | selector: 'ngx-map', 6 | templateUrl: './map.component.html', 7 | styleUrls: ['./map.component.scss'], 8 | }) 9 | export class MapComponent implements OnInit { 10 | latitude: number; 11 | longitude: number; 12 | zoom: number; 13 | 14 | @Input() 15 | public set searchedLocation(searchedLocation: Location) { 16 | this.latitude = searchedLocation.latitude; 17 | this.longitude = searchedLocation.longitude; 18 | this.zoom = 12; 19 | } 20 | 21 | ngOnInit(): void { 22 | // set up current location 23 | if ('geolocation' in navigator) { 24 | navigator.geolocation.getCurrentPosition((position) => { 25 | this.searchedLocation = new Location( 26 | position.coords.latitude, position.coords.longitude, 27 | ); 28 | }); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/search-map.component.html: -------------------------------------------------------------------------------- 1 | 2 | Google Maps with search 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/search-map.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Location } from './entity/Location'; 3 | 4 | @Component({ 5 | selector: 'ngx-search-map', 6 | templateUrl: './search-map.component.html', 7 | }) 8 | export class SearchMapComponent { 9 | 10 | searchedLocation: Location = new Location(); 11 | 12 | updateLocation(event: Location) { 13 | this.searchedLocation = new Location(event.latitude, event.longitude); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/maps/search-map/search/search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 4 |
5 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { MiscellaneousComponent } from './miscellaneous.component'; 5 | import { NotFoundComponent } from './not-found/not-found.component'; 6 | 7 | const routes: Routes = [{ 8 | path: '', 9 | component: MiscellaneousComponent, 10 | children: [{ 11 | path: '404', 12 | component: NotFoundComponent, 13 | }], 14 | }]; 15 | 16 | @NgModule({ 17 | imports: [RouterModule.forChild(routes)], 18 | exports: [RouterModule], 19 | }) 20 | export class MiscellaneousRoutingModule { } 21 | 22 | export const routedComponents = [ 23 | MiscellaneousComponent, 24 | NotFoundComponent, 25 | ]; 26 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-miscellaneous', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class MiscellaneousComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { ThemeModule } from '../../@theme/theme.module'; 3 | import { MiscellaneousRoutingModule, routedComponents } from './miscellaneous-routing.module'; 4 | 5 | @NgModule({ 6 | imports: [ 7 | ThemeModule, 8 | MiscellaneousRoutingModule, 9 | ], 10 | declarations: [ 11 | ...routedComponents, 12 | ], 13 | }) 14 | export class MiscellaneousModule { } 15 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 |

404 Page Not Found

7 | The page you were looking for doesn't exist 8 | 11 |
12 |
13 |
14 |
15 |
-------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | .flex-centered { 2 | margin: auto; 3 | } 4 | nb-card-body { 5 | display: flex; 6 | } 7 | 8 | .title { 9 | text-align: center; 10 | } 11 | 12 | .sub-title { 13 | text-align: center; 14 | display: block; 15 | margin-bottom: 3rem; 16 | } 17 | 18 | .btn { 19 | margin-bottom: 2rem; 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { NbMenuService } from '@nebular/theme'; 2 | import { Component } from '@angular/core'; 3 | 4 | @Component({ 5 | selector: 'ngx-not-found', 6 | styleUrls: ['./not-found.component.scss'], 7 | templateUrl: './not-found.component.html', 8 | }) 9 | export class NotFoundComponent { 10 | 11 | constructor(private menuService: NbMenuService) { 12 | } 13 | 14 | goToHome() { 15 | this.menuService.navigateHome(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/pages/pages-menu.ts: -------------------------------------------------------------------------------- 1 | import {NbMenuItem} from '@nebular/theme'; 2 | 3 | export const MENU_ITEMS: NbMenuItem[] = [ 4 | { 5 | title: '服务', 6 | icon: 'nb-gear', 7 | link: '/pages/server' 8 | }, 9 | { 10 | title: '策略', 11 | icon: 'nb-compose', 12 | link: '/pages/policy', 13 | }, 14 | ]; 15 | -------------------------------------------------------------------------------- /src/app/pages/pages.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | import { MENU_ITEMS } from './pages-menu'; 4 | 5 | @Component({ 6 | selector: 'ngx-pages', 7 | template: ` 8 | 9 | 10 | 11 | 12 | `, 13 | }) 14 | export class PagesComponent { 15 | 16 | menu = MENU_ITEMS; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/pages/pages.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { PagesComponent } from './pages.component'; 4 | import { DashboardModule } from './dashboard/dashboard.module'; 5 | import { ECommerceModule } from './e-commerce/e-commerce.module'; 6 | import { PagesRoutingModule } from './pages-routing.module'; 7 | import { ThemeModule } from '../@theme/theme.module'; 8 | import { MiscellaneousModule } from './miscellaneous/miscellaneous.module'; 9 | 10 | const PAGES_COMPONENTS = [ 11 | PagesComponent, 12 | ]; 13 | 14 | @NgModule({ 15 | imports: [ 16 | PagesRoutingModule, 17 | ThemeModule, 18 | DashboardModule, 19 | ECommerceModule, 20 | MiscellaneousModule, 21 | ], 22 | declarations: [ 23 | ...PAGES_COMPONENTS, 24 | ], 25 | }) 26 | export class PagesModule { 27 | } 28 | -------------------------------------------------------------------------------- /src/app/pages/policy/antidetection/antidetection.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/pages/policy/antidetection/antidetection.component.css -------------------------------------------------------------------------------- /src/app/pages/policy/antilink/antilink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/pages/policy/antilink/antilink.component.css -------------------------------------------------------------------------------- /src/app/pages/policy/limitconn/limitconn.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/pages/policy/limitconn/limitconn.component.css -------------------------------------------------------------------------------- /src/app/pages/policy/policy-list/modal-content-policy.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from "@angular/core"; 2 | import {BsModalRef} from "ngx-bootstrap"; 3 | import {PolicyService} from "../policy.service"; 4 | 5 | @Component({ 6 | selector: 'app-modal-content-policy', 7 | templateUrl: './modal-content-policy.component.html', 8 | }) 9 | 10 | export class ModalContentPolicyComponent implements OnInit { 11 | toastr: any; 12 | thats: any; 13 | datas: any; 14 | 15 | constructor(public bsModalRef: BsModalRef, 16 | private _service: PolicyService, 17 | ) { 18 | } 19 | 20 | ngOnInit() { 21 | } 22 | 23 | submit(form) { 24 | this._service.addPolicy( 25 | this.datas['result']['name'], 26 | {config: this.datas['result']['config']}) 27 | .subscribe( 28 | data => { 29 | if (data['success']) { 30 | // this.toastr.success('防护策略添加成功!', ''); 31 | } else { 32 | // this.toastr.error(data.message); 33 | } 34 | this.bsModalRef.hide(); 35 | this.thats.setPage(); 36 | }, 37 | error => { 38 | // this.toastr.error('防护策略添加失败!', JSON.stringify(error.error._issues)); 39 | }) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/app/pages/policy/policy.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | -------------------------------------------------------------------------------- /src/app/pages/policy/policy.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit, ViewContainerRef} from '@angular/core'; 2 | import {Router} from "@angular/router"; 3 | import {PolicyService} from "./policy.service"; 4 | 5 | @Component({ 6 | selector: 'app-policy', 7 | templateUrl: './policy.component.html', 8 | styleUrls: [] 9 | }) 10 | export class PolicyComponent implements OnInit { 11 | public state: any = { 12 | tabs: { 13 | demo1: 0, 14 | } 15 | }; 16 | constructor( 17 | private _service: PolicyService, 18 | private _router: Router, 19 | 20 | ) { 21 | } 22 | ngOnInit() { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/pages/policy/policy.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import {PolicyRouting} from "./policy.routing"; 3 | import {PolicyListComponent} from "./policy-list/policy-list.component"; 4 | import {PolicyComponent} from "./policy.component"; 5 | import {NgxDatatableModule} from "@swimlane/ngx-datatable"; 6 | import {SecrulesComponent} from "./secrules/secrules.component"; 7 | import {AntilinkComponent} from "./antilink/antilink.component"; 8 | import {LimitconnComponent} from "./limitconn/limitconn.component"; 9 | import {AntidetectionComponent} from "./antidetection/antidetection.component"; 10 | import {ModalContentPolicyComponent} from "./policy-list/modal-content-policy.component"; 11 | import {ModalModule} from "ngx-bootstrap"; 12 | import {ThemeModule} from "../../@theme/theme.module"; 13 | import {RlTagInputModule} from "angular2-tag-input/dist"; 14 | 15 | @NgModule({ 16 | imports: [ 17 | ModalModule.forRoot(), 18 | ThemeModule, 19 | PolicyRouting, 20 | NgxDatatableModule, 21 | RlTagInputModule, 22 | ], 23 | declarations: [ 24 | PolicyListComponent, ModalContentPolicyComponent, PolicyComponent, 25 | SecrulesComponent, AntilinkComponent, LimitconnComponent, AntidetectionComponent], 26 | entryComponents: [ModalContentPolicyComponent] 27 | }) 28 | export class PolicyModule { } 29 | -------------------------------------------------------------------------------- /src/app/pages/policy/policy.routing.ts: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core'; 2 | import {Routes, RouterModule} from '@angular/router'; 3 | import {PolicyComponent} from "./policy.component"; 4 | import {SecrulesComponent} from "./secrules/secrules.component"; 5 | import {AntilinkComponent} from "./antilink/antilink.component"; 6 | import {LimitconnComponent} from "./limitconn/limitconn.component"; 7 | import {AntidetectionComponent} from "./antidetection/antidetection.component"; 8 | 9 | const routes: Routes = [ 10 | { 11 | path: '', 12 | component: PolicyComponent, 13 | }, 14 | { 15 | path: 'edit/:_id', 16 | component: SecrulesComponent, 17 | data: { 18 | pageTitle: '编辑', 19 | }, 20 | }, 21 | { 22 | path: 'secrules/:_id', 23 | component: SecrulesComponent, 24 | data: { 25 | pageTitle: '攻击防护', 26 | }, 27 | }, 28 | { 29 | path: 'antilink/:_id', 30 | component: AntilinkComponent, 31 | data: { 32 | pageTitle: '防信息滥用', 33 | }, 34 | }, 35 | { 36 | path: 'limitconn/:_id', 37 | component: LimitconnComponent, 38 | data: { 39 | pageTitle: '防CC', 40 | }, 41 | }, 42 | { 43 | path: 'antidetection/:_id', 44 | component: AntidetectionComponent, 45 | data: { 46 | pageTitle: '防探测', 47 | }, 48 | }, 49 | ]; 50 | 51 | @NgModule({ 52 | imports: [RouterModule.forChild(routes)], 53 | exports: [RouterModule] 54 | }) 55 | export class PolicyRouting { 56 | } 57 | -------------------------------------------------------------------------------- /src/app/pages/policy/policy.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {BasicHttpService} from "../../@theme/http/basichttp.service"; 3 | 4 | @Injectable({ 5 | providedIn: 'root' 6 | }) 7 | @Injectable() 8 | export class PolicyService { 9 | 10 | policyUrl = '/policy'; 11 | 12 | constructor(private _basicHttpService: BasicHttpService) { 13 | } 14 | // policy 15 | getPolicyAll = function () { 16 | const opt = this._basicHttpService.NewReqOpts(); 17 | return this._basicHttpService.MyPolicy(this.policyUrl, opt); 18 | } 19 | 20 | getPolicy(id) { 21 | const opt = this._basicHttpService.NewReqOpts(); 22 | return this._basicHttpService.MyGet(this.policyUrl + '/' + id, opt); 23 | } 24 | 25 | addPolicy(uuid, data) { 26 | const opt = this._basicHttpService.NewReqOpts(); 27 | return this._basicHttpService.MyPost(this.policyUrl + '/' + uuid, data, opt, true); 28 | } 29 | 30 | setPolicy(id, data) { 31 | const opt = this._basicHttpService.NewReqOpts(); 32 | return this._basicHttpService.MyPut(this.policyUrl + '/' + id, data, opt, true); 33 | } 34 | 35 | deletePolicy(id) { 36 | const opt = this._basicHttpService.NewReqOpts(); 37 | return this._basicHttpService.MyDelete(this.policyUrl + '/' + id, opt, true); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/app/pages/policy/secrules/secrules.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/app/pages/policy/secrules/secrules.component.css -------------------------------------------------------------------------------- /src/app/pages/server/server-routing.module.ts: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core'; 2 | import {Routes, RouterModule} from '@angular/router'; 3 | import {ServerComponent} from "./server.component"; 4 | import {ServerListComponent} from "./server-list/server-list.component"; 5 | 6 | 7 | const routes: Routes = [{ 8 | path: '', 9 | component: ServerComponent, 10 | }]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule], 15 | }) 16 | export class ServerRoutingModule { 17 | } 18 | 19 | export const routedComponents = [ 20 | ServerComponent, 21 | ServerListComponent, 22 | ]; 23 | -------------------------------------------------------------------------------- /src/app/pages/server/server.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | -------------------------------------------------------------------------------- /src/app/pages/server/server.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-server', 5 | templateUrl: './server.component.html', 6 | // template: ``, 7 | }) 8 | export class ServerComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/server/server.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Ng2SmartTableModule } from 'ng2-smart-table'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | import {routedComponents, ServerRoutingModule} from './server-routing.module'; 6 | import {NgxDatatableModule} from "@swimlane/ngx-datatable"; 7 | import {ModalContentRuleComponent} from "./server-list/modal-content-rule.component"; 8 | import {ModalModule} from "ngx-bootstrap"; 9 | 10 | @NgModule({ 11 | imports: [ 12 | ModalModule.forRoot(), 13 | ThemeModule, 14 | ServerRoutingModule, 15 | Ng2SmartTableModule, 16 | NgxDatatableModule, 17 | ], 18 | declarations: [ 19 | routedComponents, 20 | ModalContentRuleComponent 21 | ], 22 | entryComponents: [ 23 | ModalContentRuleComponent 24 | ] 25 | }) 26 | export class ServerModule { } 27 | -------------------------------------------------------------------------------- /src/app/pages/tables/smart-table/smart-table.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Smart Table 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/app/pages/tables/tables-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { TablesComponent } from './tables.component'; 5 | import { SmartTableComponent } from './smart-table/smart-table.component'; 6 | 7 | const routes: Routes = [{ 8 | path: '', 9 | component: TablesComponent, 10 | children: [{ 11 | path: 'smart-table', 12 | component: SmartTableComponent, 13 | }], 14 | }]; 15 | 16 | @NgModule({ 17 | imports: [RouterModule.forChild(routes)], 18 | exports: [RouterModule], 19 | }) 20 | export class TablesRoutingModule { } 21 | 22 | export const routedComponents = [ 23 | TablesComponent, 24 | SmartTableComponent, 25 | ]; 26 | -------------------------------------------------------------------------------- /src/app/pages/tables/tables.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-tables', 5 | template: ``, 6 | }) 7 | export class TablesComponent { 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/tables/tables.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Ng2SmartTableModule } from 'ng2-smart-table'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | import { TablesRoutingModule, routedComponents } from './tables-routing.module'; 6 | import { SmartTableService } from '../../@core/data/smart-table.service'; 7 | 8 | @NgModule({ 9 | imports: [ 10 | ThemeModule, 11 | TablesRoutingModule, 12 | Ng2SmartTableModule, 13 | ], 14 | declarations: [ 15 | ...routedComponents, 16 | ], 17 | providers: [ 18 | SmartTableService, 19 | ], 20 | }) 21 | export class TablesModule { } 22 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/action-groups/action-groups.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Action Groups 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/action-groups/action-groups.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-action-groups', 5 | styleUrls: ['./action-groups.component.scss'], 6 | templateUrl: './action-groups.component.html', 7 | }) 8 | export class ActionGroupsComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/block-level-buttons/block-level-buttons.component.html: -------------------------------------------------------------------------------- 1 | 2 | Block Level Buttons 3 | 4 |
5 |
6 |
7 | 10 | 11 |
12 | 13 |
14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/block-level-buttons/block-level-buttons.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-block-level-buttons', 5 | templateUrl: './block-level-buttons.component.html', 6 | }) 7 | export class BlockLevelButtonsComponent { 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/button-groups/button-groups.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-button-groups', 5 | styleUrls: ['./button-groups.component.scss'], 6 | templateUrl: './button-groups.component.html', 7 | }) 8 | export class ButtonGroupsComponent { 9 | 10 | radioModel = 'left'; 11 | 12 | checkboxModel = { 13 | left: false, 14 | middle: false, 15 | right: false, 16 | }; 17 | 18 | dividedCheckboxModel = { 19 | monday: true, 20 | tuesday: true, 21 | wednesday: false, 22 | thursday: false, 23 | friday: false, 24 | saturday: false, 25 | }; 26 | 27 | paginationModel = 1; 28 | 29 | iconToolbarModel = { 30 | one: false, 31 | two: false, 32 | three: true, 33 | four: false, 34 | five: false, 35 | }; 36 | 37 | dividedButtonGroupOne = 'left'; 38 | 39 | dividedButtonGroupTwo = { 40 | left: false, 41 | middle: false, 42 | right: false, 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/buttons.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 |
15 |
16 | 17 |
18 |
19 |
20 |
21 | 22 | 23 | 24 |
25 |
26 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/buttons.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-buttons', 5 | styleUrls: ['./buttons.component.scss'], 6 | templateUrl: './buttons.component.html', 7 | }) 8 | export class ButtonsComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/dropdown-buttons/dropdown-button.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | text-align: center; 5 | 6 | .dropdown, .dropup, .btn-group { 7 | margin-bottom: 1rem; 8 | } 9 | 10 | nb-card-body { 11 | overflow: visible; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/dropdown-buttons/dropdown-button.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-dropdown-buttons', 5 | styleUrls: ['./dropdown-button.component.scss'], 6 | templateUrl: './dropdown-button.component.html', 7 | }) 8 | 9 | export class DropdownButtonsComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/icon-buttons/icon-buttons.component.scss: -------------------------------------------------------------------------------- 1 | nb-card-body { 2 | div:not(:last-child) { 3 | margin-bottom: 1rem; 4 | } 5 | } 6 | 7 | .btn-with-icon-example { 8 | width: 100%; 9 | 10 | .btn { 11 | width: 100%; 12 | } 13 | } 14 | 15 | .btn-group:not(:last-child) { 16 | margin-bottom: 1rem; 17 | } 18 | 19 | .icon-button-examples { 20 | display: flex; 21 | justify-content: space-between; 22 | 23 | button { 24 | min-width: 4rem; 25 | } 26 | } 27 | 28 | .icon-button-examples:not(:last-child) { 29 | margin-bottom: 1rem; 30 | } 31 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/icon-buttons/icon-buttons.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-icon-buttons', 5 | styleUrls: ['./icon-buttons.component.scss'], 6 | templateUrl: './icon-buttons.component.html', 7 | }) 8 | export class IconButtonsComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/labeled-actions-group/labeled-actions-group.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Pause 6 | 7 | 8 | Logs 9 | 10 | 11 | Search 12 | 13 | 14 | Setup 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/labeled-actions-group/labeled-actions-group.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-labeled-actions-group', 5 | styleUrls: ['./labeled-actions-group.component.scss'], 6 | templateUrl: './labeled-actions-group.component.html', 7 | }) 8 | export class LabeledActionsGroupComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/shape-buttons/shape-buttons.component.html: -------------------------------------------------------------------------------- 1 | 2 | Button Shapes 3 | 4 |
5 |
6 | Rectangle Button 7 |
8 |
9 | Border radius: 10 | 4px 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 | Semi-round Button 20 |
21 |
22 | Border radius: 23 | 12px 24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 | Rounded Button 33 |
34 |
35 | Border radius: 36 | round 37 |
38 |
39 | 40 |
41 |
42 |
43 |
44 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/shape-buttons/shape-buttons.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~@nebular/bootstrap/styles/buttons'; 3 | 4 | @include nb-install-component() { 5 | 6 | nb-card-body { 7 | padding: 0 0 29px; 8 | display: flex; 9 | flex-wrap: wrap; 10 | justify-content: space-between; 11 | } 12 | 13 | .shape-container { 14 | margin: 1.25rem 1.25rem 0; 15 | } 16 | 17 | .container-title { 18 | margin-bottom: 0.25rem; 19 | } 20 | 21 | .subheader { 22 | margin-bottom: 1rem; 23 | font-size: 0.875rem; 24 | 25 | span:nth-child(2) { 26 | color: nb-theme(color-fg-heading); 27 | font-weight: nb-theme(font-weight-bold); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/shape-buttons/shape-buttons.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-shape-buttons', 5 | styleUrls: ['./shape-buttons.component.scss'], 6 | templateUrl: './shape-buttons.component.html', 7 | }) 8 | export class ShapeButtonsComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/size-buttons/size-buttons.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../@theme/styles/themes'; 2 | @import '~@nebular/bootstrap/styles/buttons'; 3 | 4 | @include nb-install-component() { 5 | 6 | nb-card-body { 7 | padding: 0 1.25rem 1.25rem 0; 8 | display: flex; 9 | flex-wrap: wrap; 10 | } 11 | 12 | .container-title { 13 | margin-bottom: 0.25rem; 14 | } 15 | 16 | .size-container { 17 | margin: 1.25rem 0 0 1.25rem; 18 | } 19 | 20 | .subheader { 21 | margin-bottom: 0.75rem; 22 | font-size: 0.875rem; 23 | font-weight: nb-theme(font-weight-bolder); 24 | color: nb-theme(color-fg-heading); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/buttons/size-buttons/size-buttons.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-size-buttons', 5 | styleUrls: ['./size-buttons.component.scss'], 6 | templateUrl: './size-buttons.component.html', 7 | }) 8 | export class SizeButtonsComponent { 9 | } 10 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/grid/grid.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | .show-grid { 5 | .row { 6 | margin: -0.5rem; 7 | } 8 | 9 | div[class^=col-] { 10 | padding: 0.5rem; 11 | box-sizing: border-box; 12 | 13 | div { 14 | text-align: center; 15 | background-color: nb-theme(color-bg-active); 16 | padding: 0.75rem 0.25rem; 17 | border-radius: 0.25rem; 18 | } 19 | } 20 | } 21 | 22 | .grid-h { 23 | margin-top: 1.5rem; 24 | 25 | &:first-child { 26 | margin-top: 0; 27 | } 28 | } 29 | 30 | .table-responsive { 31 | margin-top: 1rem; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/grid/grid.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-grid', 5 | styleUrls: ['./grid.component.scss'], 6 | templateUrl: './grid.component.html', 7 | }) 8 | export class GridComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/icons/icons.component.scss: -------------------------------------------------------------------------------- 1 | .icon { 2 | display: inline-block; 3 | width: 4rem; 4 | padding: 1.25rem 0; 5 | text-align: center; 6 | font-size: 1.25rem; 7 | 8 | i:hover { 9 | opacity: 0.8; 10 | cursor: pointer; 11 | } 12 | } 13 | 14 | .nb-icons .icon { 15 | padding: 0.75rem 0; 16 | font-size: 1.75rem; 17 | } 18 | 19 | nb-card-body { 20 | padding: 0; 21 | } 22 | 23 | nb-card-footer { 24 | text-align: right; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/modals/modal/modal.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/modals/modal/modal.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; 3 | 4 | @Component({ 5 | selector: 'ngx-modal', 6 | template: ` 7 | 13 | 16 | 19 | `, 20 | }) 21 | export class ModalComponent { 22 | 23 | modalHeader: string; 24 | modalContent = `Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy 25 | nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis 26 | nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.`; 27 | 28 | constructor(private activeModal: NgbActiveModal) { } 29 | 30 | closeModal() { 31 | this.activeModal.close(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/modals/modals.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | Modals 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/modals/modals.component.scss: -------------------------------------------------------------------------------- 1 | @import '~@nebular/theme/styles/core/mixins'; 2 | 3 | :host { 4 | button { 5 | @include nb-ltr(margin, 0 0.75rem 2rem 0); 6 | @include nb-rtl(margin, 0 0 2rem 0.75rem); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/modals/modals.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; 3 | 4 | import { ModalComponent } from './modal/modal.component'; 5 | 6 | @Component({ 7 | selector: 'ngx-modals', 8 | styleUrls: ['./modals.component.scss'], 9 | templateUrl: './modals.component.html', 10 | }) 11 | export class ModalsComponent { 12 | 13 | constructor(private modalService: NgbModal) { } 14 | 15 | showLargeModal() { 16 | const activeModal = this.modalService.open(ModalComponent, { size: 'lg', container: 'nb-layout' }); 17 | 18 | activeModal.componentInstance.modalHeader = 'Large Modal'; 19 | } 20 | showSmallModal() { 21 | const activeModal = this.modalService.open(ModalComponent, { size: 'sm', container: 'nb-layout' }); 22 | 23 | activeModal.componentInstance.modalHeader = 'Small Modal'; 24 | } 25 | 26 | showStaticModal() { 27 | const activeModal = this.modalService.open(ModalComponent, { 28 | size: 'sm', 29 | backdrop: 'static', 30 | container: 'nb-layout', 31 | }); 32 | 33 | activeModal.componentInstance.modalHeader = 'Static modal'; 34 | activeModal.componentInstance.modalContent = `This is static modal, backdrop click 35 | will not close it. Click × or confirmation button to close modal.`; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/popovers/popovers.component.scss: -------------------------------------------------------------------------------- 1 | @import '~@nebular/theme/styles/core/mixins'; 2 | 3 | /deep/ nb-card.popover-card { 4 | margin-bottom: 0; 5 | width: 300px; 6 | box-shadow: none; 7 | } 8 | 9 | :host { 10 | button.with-margins { 11 | @include nb-ltr(margin, 0 0.75rem 2rem 0); 12 | @include nb-rtl(margin, 0 0 2rem 0.75rem); 13 | } 14 | 15 | /deep/ .btn-outline-secondary { 16 | @include nb-ltr(margin, 0 0.5rem 0.5rem 0); 17 | @include nb-rtl(margin, 0 0 0.5rem 0.5rem); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/popovers/popovers.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { 3 | NgxPopoverCardComponent, NgxPopoverFormComponent, 4 | NgxPopoverTabsComponent, 5 | } from './popover-examples.component'; 6 | 7 | @Component({ 8 | selector: 'ngx-popovers', 9 | styleUrls: ['./popovers.component.scss'], 10 | templateUrl: './popovers.component.html', 11 | }) 12 | export class PopoversComponent { 13 | tabsComponent = NgxPopoverTabsComponent; 14 | cardComponent = NgxPopoverCardComponent; 15 | formComponent = NgxPopoverFormComponent; 16 | } 17 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/search-fields/search-fields.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-search-fields', 5 | templateUrl: 'search-fields.component.html', 6 | }) 7 | export class SearchComponent { 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/tabs/tabs.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | nb-tabset { 7 | height: 100%; 8 | display: flex; 9 | flex-direction: column; 10 | } 11 | 12 | nb-tab { 13 | padding: nb-theme(padding); 14 | } 15 | 16 | /deep/ ngx-tab1, /deep/ ngx-tab2 { 17 | display: block; 18 | padding: nb-theme(padding); 19 | } 20 | 21 | @include media-breakpoint-down(xs) { 22 | nb-tabset /deep/ul { 23 | font-size: 1rem; 24 | padding: 0 0.25rem; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/tabs/tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-tab1', 5 | template: ` 6 |

Early home automation began with labor-saving machines. Self-contained electric or gas powered 7 | home appliances 8 | became viable in the 1900s with the introduction of 9 | electric power distribution 10 | and led to the introduction of washing machines (1904), water heaters (1889), refrigerators, sewing machines, 11 | dishwashers, and clothes dryers. 12 |

13 | `, 14 | }) 15 | export class Tab1Component { } 16 | 17 | @Component({ 18 | selector: 'ngx-tab2', 19 | template: ` 20 |

Tab 2 works!

21 | `, 22 | }) 23 | export class Tab2Component { } 24 | 25 | @Component({ 26 | selector: 'ngx-tabs', 27 | styleUrls: ['./tabs.component.scss'], 28 | templateUrl: './tabs.component.html', 29 | }) 30 | export class TabsComponent { 31 | 32 | tabs: any[] = [ 33 | { 34 | title: 'Route tab #1', 35 | route: '/pages/ui-features/tabs/tab1', 36 | }, 37 | { 38 | title: 'Route tab #2', 39 | route: '/pages/ui-features/tabs/tab2', 40 | }, 41 | ]; 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/typography/typography.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy } from '@angular/core'; 2 | import { NbThemeService, NbMediaBreakpoint, NbMediaBreakpointsService } from '@nebular/theme'; 3 | 4 | @Component({ 5 | selector: 'ngx-typography', 6 | styleUrls: ['./typography.component.scss'], 7 | templateUrl: './typography.component.html', 8 | }) 9 | export class TypographyComponent implements OnDestroy { 10 | breakpoint: NbMediaBreakpoint; 11 | breakpoints: any; 12 | themeSubscription: any; 13 | 14 | constructor(private themeService: NbThemeService, 15 | private breakpointService: NbMediaBreakpointsService) { 16 | 17 | this.breakpoints = this.breakpointService.getBreakpointsMap(); 18 | this.themeSubscription = this.themeService.onMediaQueryChange() 19 | .subscribe(([oldValue, newValue]) => { 20 | this.breakpoint = newValue; 21 | }); 22 | } 23 | 24 | ngOnDestroy() { 25 | this.themeSubscription.unsubscribe(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/pages/ui-features/ui-features.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-ui-features', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class UiFeaturesComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/images/nick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/images/nick.png -------------------------------------------------------------------------------- /src/assets/images/square_pattern.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg -------------------------------------------------------------------------------- /src/assets/images/square_pattern_cosmic.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg 2 | -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/assets/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | export const environment = { 7 | production: true, 8 | }; 9 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | // The file contents for the current environment will overwrite these during build. 7 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 8 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 9 | // The list of which env maps to which file can be found in `.angular-cli.json`. 10 | 11 | export const environment = { 12 | production: false, 13 | }; 14 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/favicon.ico -------------------------------------------------------------------------------- /src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titansec/OpenWAF-UI/295fdd5aadf694d95fa264d99f923ee6451dfbaa/src/favicon.png -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { enableProdMode } from '@angular/core'; 7 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 8 | 9 | import { AppModule } from './app/app.module'; 10 | import { environment } from './environments/environment'; 11 | 12 | if (environment.production) { 13 | enableProdMode(); 14 | } 15 | 16 | platformBrowserDynamic().bootstrapModule(AppModule) 17 | .catch(err => console.error(err)); 18 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 8 | 9 | import 'zone.js/dist/long-stack-trace-zone'; 10 | import 'zone.js/dist/proxy.js'; 11 | import 'zone.js/dist/sync-test'; 12 | import 'zone.js/dist/jasmine-patch'; 13 | import 'zone.js/dist/async-test'; 14 | import 'zone.js/dist/fake-async-test'; 15 | import { getTestBed } from '@angular/core/testing'; 16 | import { 17 | BrowserDynamicTestingModule, 18 | platformBrowserDynamicTesting, 19 | } from '@angular/platform-browser-dynamic/testing'; 20 | 21 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 22 | declare const __karma__: any; 23 | declare const require: any; 24 | 25 | // Prevent Karma from running prematurely. 26 | __karma__.loaded = function () {}; 27 | 28 | // First, initialize the Angular testing environment. 29 | getTestBed().initTestEnvironment( 30 | BrowserDynamicTestingModule, 31 | platformBrowserDynamicTesting(), 32 | ); 33 | // Then we find all the tests. 34 | const context = require.context('./', true, /\.spec\.ts$/); 35 | // And load the modules. 36 | context.keys().map(context); 37 | // Finally, start Karma to run the tests. 38 | __karma__.start(); 39 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "es2015", 6 | "baseUrl": "./", 7 | "types": [], 8 | "paths": { 9 | "@angular/*": [ 10 | "../node_modules/@angular/*" 11 | ], 12 | "@nebular/*": [ 13 | "../node_modules/@nebular/*" 14 | ] 15 | } 16 | }, 17 | "exclude": [ 18 | "test.ts", 19 | "**/*.spec.ts", 20 | "../node_modules/@nebular/**/*.spec.ts" 21 | ], 22 | "include": [ 23 | "../src/*.ts", 24 | "../src/**/*.ts", 25 | "../node_modules/@nebular/**/*.ts" 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | }, 13 | "files": [ 14 | "test.ts", 15 | "polyfills.ts" 16 | ], 17 | "include": [ 18 | "**/*.spec.ts", 19 | "**/*.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | /* SystemJS module definition */ 8 | declare var module: NodeModule; 9 | interface NodeModule { 10 | id: string; 11 | } 12 | 13 | declare var tinymce: any; 14 | 15 | declare var echarts: any; 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es5", 11 | "typeRoots": [ 12 | "node_modules/@types" 13 | ], 14 | "lib": [ 15 | "es2017", 16 | "dom" 17 | ], 18 | "plugins": [ 19 | { "name": "tslint-language-service"} 20 | ] 21 | } 22 | } 23 | --------------------------------------------------------------------------------