diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index ffbaa92d..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 - -updates: - - package-ecosystem: 'npm' - directory: '/' - schedule: - interval: 'weekly' - day: 'monday' - time: '08:00' - timezone: 'Etc/GMT' - target-branch: 'workflow/dependency-update' - labels: - - 'workflow' - milestone: 2 diff --git a/.github/lighthouserc.yml b/.github/lighthouserc.yml new file mode 100644 index 00000000..0f6da6e3 --- /dev/null +++ b/.github/lighthouserc.yml @@ -0,0 +1,4 @@ +ci: + collect: + settings: + preset: "desktop" diff --git a/.github/workflows/cron-dependency-checker-workflow.yml b/.github/workflows/cron-dependency-checker-workflow.yml index 70522fd4..f8104219 100644 --- a/.github/workflows/cron-dependency-checker-workflow.yml +++ b/.github/workflows/cron-dependency-checker-workflow.yml @@ -17,7 +17,7 @@ jobs: - name: Install Node uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 16 - name: NPM Install run: npm i @@ -26,9 +26,18 @@ jobs: - name: Build run: npm run buildProd + - name: Check for Changes + run: | + if git diff --exit-code; then + echo "changes_exist=false" >> $GITHUB_ENV + else + echo "changes_exist=true" >> $GITHUB_ENV + fi + - name: Git Commit and Push + if: ${{ env.changes_exist == 'true' }} run: | - git config --global user.email "furknyavuz@gmail.com" - git config --global user.name "Furkan Yavuz" + git config --global user.email "98660390+oth-service-user@users.noreply.github.com" + git config --global user.name "OTH Service User" git commit -am "Workflow/dependency check" git push diff --git a/.github/workflows/cron-lighthouse-report-generator-workflow.yml b/.github/workflows/cron-lighthouse-report-generator-workflow.yml new file mode 100644 index 00000000..dafa83ff --- /dev/null +++ b/.github/workflows/cron-lighthouse-report-generator-workflow.yml @@ -0,0 +1,44 @@ +name: Cron Lighthouse Report Generator + +on: + schedule: + - cron: '0 5 * * 1' + +jobs: + cron-lighthouse-report-generator: + name: 'Cron Lighthouse Report Generator' + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + with: + token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} + + - name: Audit URLs using Lighthouse + uses: treosh/lighthouse-ci-action@v9 + with: + urls: | + https://web.opentemplatehub.com + uploadArtifacts: true + configPath: .github/lighthouserc.yml + + - name: Check for Changes + run: | + rm docs/lighthouse/* + find .lighthouseci -name 'lhr-*.html' -exec sh -c 'x="{}"; cp "$x" "docs/lighthouse/lighthouse-report.html"' \; + rm .lighthouseci/* + + if git status --porcelain; then + echo "changes_exist=true" >> $GITHUB_ENV + else + echo "changes_exist=false" >> $GITHUB_ENV + fi + + - name: Git Commit and Push + if: ${{ env.changes_exist == 'true' }} + run: | + git config --global user.email "98660390+oth-service-user@users.noreply.github.com" + git config --global user.name "OTH Service User" + git add --all + git commit -am "Workflow/lighthouse report update" + git push diff --git a/.github/workflows/issue-assigned-workflows.yml b/.github/workflows/issue-assigned-workflows.yml index 8bc46b6b..dc78cf9d 100644 --- a/.github/workflows/issue-assigned-workflows.yml +++ b/.github/workflows/issue-assigned-workflows.yml @@ -13,6 +13,6 @@ jobs: - name: Move Issue to In-Progress uses: alex-page/github-project-automation-plus@v0.3.0 with: - project: Open Template Hub Servers + project: Open Template Hub User Interfaces column: In progress repo-token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} diff --git a/.github/workflows/issue-open-workflows.yml b/.github/workflows/issue-open-workflows.yml index c179dec2..34b5eda1 100644 --- a/.github/workflows/issue-open-workflows.yml +++ b/.github/workflows/issue-open-workflows.yml @@ -13,7 +13,7 @@ jobs: - name: Move Issue to In-Progress uses: alex-page/github-project-automation-plus@v0.3.0 with: - project: Open Template Hub Servers + project: Open Template Hub User Interfaces column: To do repo-token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} diff --git a/.github/workflows/on-version-update.yml b/.github/workflows/on-version-update.yml index 113154cb..7d2f9cf1 100644 --- a/.github/workflows/on-version-update.yml +++ b/.github/workflows/on-version-update.yml @@ -4,6 +4,8 @@ on: push: paths-ignore: - 'package.json' + - 'src/version.ts' + - 'src/index.html' branches: - 'master' @@ -21,7 +23,7 @@ jobs: - name: Install Node uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 16 - name: Bump Version and Create Tag uses: phips28/gh-action-bump-version@master @@ -29,10 +31,39 @@ jobs: tag-prefix: '' token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} + update-version-ts-file: + name: 'Update Version.ts File' + runs-on: ubuntu-latest + needs: bump-version + + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + with: + token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} + ref: master + + - name: Install Node + uses: actions/setup-node@v1 + with: + node-version: 16 + + - name: Run version-generator.ts + run: | + npm install + node src/version-generator.ts > ./src/version.ts + + - name: Git Commit and Push + run: | + git config --global user.email "98660390+oth-service-user@users.noreply.github.com" + git config --global user.name "OTH Service User" + git commit -am "Workflow/version update" + git push + create-version-update-pr: name: 'Create Version Update PR' runs-on: ubuntu-latest - needs: bump-version + needs: update-version-ts-file steps: - name: Checkout Repo diff --git a/.github/workflows/pr-open-workflows.yml b/.github/workflows/pr-open-workflows.yml index ec17d3d3..99f7d9cd 100644 --- a/.github/workflows/pr-open-workflows.yml +++ b/.github/workflows/pr-open-workflows.yml @@ -24,7 +24,7 @@ jobs: - name: Move PR to In-Progress uses: alex-page/github-project-automation-plus@v0.3.0 with: - project: Open Template Hub Servers + project: Open Template Hub User Interfaces column: In progress repo-token: ${{ secrets.MASTER_BRANCH_ACCESS_TOKEN }} diff --git a/.gitignore b/.gitignore index 67a55f2d..31d58dc4 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ package-lock.json .env icon.png +.angular diff --git a/.run/buildLocal.run.xml b/.run/buildLocal.run.xml index 366dbda6..1d8ec3f1 100644 --- a/.run/buildLocal.run.xml +++ b/.run/buildLocal.run.xml @@ -1,14 +1,14 @@ - - + + - - - - - diff --git a/docs/lighthouse-report-mobile.html b/docs/lighthouse-report-mobile.html deleted file mode 100644 index 3b2322af..00000000 --- a/docs/lighthouse-report-mobile.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - Lighthouse Report - - - - -
- -
- - - - - - diff --git a/docs/lighthouse/lighthouse-report.html b/docs/lighthouse/lighthouse-report.html new file mode 100644 index 00000000..f7185ea6 --- /dev/null +++ b/docs/lighthouse/lighthouse-report.html @@ -0,0 +1,266 @@ + + + + + + + + Lighthouse Report + + + + + +
+ + + + + + diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js index 3a85f4df..ee81e8a5 100644 --- a/e2e/protractor.conf.js +++ b/e2e/protractor.conf.js @@ -16,13 +16,11 @@ exports.config = { browserName: "chrome" }, directConnect: true, - baseUrl: "http://localhost:4200/", + baseUrl: "http://localhost:4201/", framework: "jasmine", jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, - print: function () { - } }, onPrepare() { require( "ts-node" ).register( { diff --git a/env.sh b/env.sh index 56ae331c..d197a10d 100644 --- a/env.sh +++ b/env.sh @@ -4,7 +4,7 @@ if [ ! -f .env ]; then echo "Generating .env file.." touch .env { - echo "PORT=4200" + echo "PORT=4201" } >>.env else echo ".env file already exists. Nothing to do..." diff --git a/messages.xlf b/messages.xlf index 09ec69ad..029938a2 100644 --- a/messages.xlf +++ b/messages.xlf @@ -5,18 +5,21 @@ Read more - src/app/component/card/blog-holder-card/blog-holder-card.component.html + src/app/component/card/blog-holder-card/blog-holder-card.component.html + 22 - src/app/component/card/doc-holder-card/doc-holder-card.component.html + src/app/component/card/doc-holder-card/doc-holder-card.component.html + 22 Learn more - src/app/component/card/presentation-card/presentation-card.component.html + src/app/component/card/presentation-card/presentation-card.component.html + 18 @@ -35,42 +38,42 @@ - About + About src/app/component/nav/footer/footer.component.html 30,32 - Customers + Customers src/app/component/nav/footer/footer.component.html 33,35 - Partners + Partners src/app/component/nav/footer/footer.component.html 36,38 - Branding + Branding src/app/component/nav/footer/footer.component.html 39,41 - Jobs + Jobs src/app/component/nav/footer/footer.component.html 45,47 - Blog + Blog src/app/component/nav/footer/footer.component.html 49,51 @@ -84,28 +87,28 @@ - Open Source + Open Source src/app/component/nav/footer/footer.component.html 59,61 - Docs + Docs src/app/component/nav/footer/footer.component.html 63,65 - API + API src/app/component/nav/footer/footer.component.html 66,68 - Status + Status src/app/component/nav/footer/footer.component.html 69,71 @@ -119,42 +122,42 @@ - Support + Support src/app/component/nav/footer/footer.component.html 75,77 - Contact + Contact src/app/component/nav/footer/footer.component.html 78,80 - Terms & Conditions + Terms & Conditions src/app/component/nav/footer/footer.component.html 81,83 - Privacy + Privacy src/app/component/nav/footer/footer.component.html 84,86 - Cookies + Cookies src/app/component/nav/footer/footer.component.html 87,89 - Sitemap + Sitemap src/app/component/nav/footer/footer.component.html 90,92 @@ -163,33 +166,44 @@ Products - src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + + src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + 16 Services - src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + + src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + 25 About - src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + + src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + 33 Contact Us - src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + + src/app/component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component.html + 40 - By continuing to use this site you agree to our Cookie Policy. + By continuing to use this site you agree to our + Cookie Policy. + src/app/component/popup/cookie-popup/cookie-popup.component.html 2,4 @@ -219,47 +233,61 @@ Some of the preconfigured systems: - src/app/component/product-represantation/product-presentation.component.html + + src/app/component/product-represantation/product-presentation.component.html + 43 *configuration still requires some level of developer experience - src/app/component/product-represantation/product-presentation.component.html + + src/app/component/product-represantation/product-presentation.component.html + 49,50 Integrate your servers with social login providers in minutes. - src/app/component/product-represantation/product-presentation.component.ts + + src/app/component/product-represantation/product-presentation.component.ts + 66 Integrate your servers with payment solution providers in minutes. - src/app/component/product-represantation/product-presentation.component.ts + + src/app/component/product-represantation/product-presentation.component.ts + 70 Integrate your servers with file storage solution providers in minutes. - src/app/component/product-represantation/product-presentation.component.ts + + src/app/component/product-represantation/product-presentation.component.ts + 74 Integrate your servers with email service providers in minutes. - src/app/component/product-represantation/product-presentation.component.ts + + src/app/component/product-represantation/product-presentation.component.ts + 78 - Open Source first organization that helps you to minimize the effort while building a new software business with our server and UI templates + Open Source first organization that helps you to minimize the effort while building a new software + business with our server and UI templates + src/app/data/brand/brand.data.ts 3 @@ -1733,14 +1761,21 @@ - Furkan is an experienced full-stack developer who has worked on various projects, including online payment solutions and fraud detection areas, in a well-known airline company. He's co-founded a startup to discover talents from the open-source community. After one year, Furkan successfully exited from his startup and then co-founded Open Template Hub. + Furkan is an experienced full-stack developer who has worked on various projects, including online + payment solutions and fraud detection areas, in a well-known airline company. He's co-founded a startup + to discover talents from the open-source community. After one year, Furkan successfully exited from his + startup and then co-founded Open Template Hub. + src/app/data/employee/employee.data.ts 8 - Fatih is a young professional with wide-ranging experience in software design and technology. He worked several years on Finance and Telecom business areas. He is now a Founder and CEO at Remoklify. He also co-founded Open Template Hub. + Fatih is a young professional with wide-ranging experience in software design and technology. He worked + several years on Finance and Telecom business areas. He is now a Founder and CEO at Remoklify. He also + co-founded Open Template Hub. + src/app/data/employee/employee.data.ts 23 @@ -1754,7 +1789,10 @@ - Mert is a new grad software engineer who has been experienced various technologies in his bachelor years. He worked on e-commercial and banking areas. Now, he is a full-stack developer at Open Template Hub and also working on native iOS applications. + Mert is a new grad software engineer who has been experienced various technologies in his bachelor + years. He worked on e-commercial and banking areas. Now, he is a full-stack developer at Open Template Hub and + also working on native iOS applications. + src/app/data/employee/employee.data.ts 38 @@ -1768,7 +1806,9 @@ - Would you like to join our team? Please feel free to reach us from info@opentemplatehub.com or from jobs page. + Would you like to join our team? Please feel free to reach us from info@opentemplatehub.com or from jobs + page. + src/app/data/employee/employee.data.ts 53 @@ -1782,7 +1822,12 @@ - Do not lost on functional dependencies, you can only focus on your business. All other layers like authentication, payment, mail, storage, analytics are covered by us with extremely lightweight and configurable microservices. Always be safe with encrypted service communications. Order your out-of-transaction requests with message queues. Do not spend your resources on performance enhancements, enjoy fastest service response times. + Do not lost on functional dependencies, you can only focus on your business. All other layers like + authentication, payment, mail, storage, analytics are covered by us with extremely lightweight and + configurable microservices. Always be safe with encrypted service communications. Order your + out-of-transaction requests with message queues. Do not spend your resources on performance enhancements, + enjoy fastest service response times. + src/app/data/feature/feature.data.ts 6 @@ -1796,7 +1841,10 @@ - Store your data efficiently and do not waste your time on your data architecture and performance analysis. Open Template Hub provides you efficient storage, orients and keeps your data in NOSQL and RDBMS, handles connection pools and management. + Store your data efficiently and do not waste your time on your data architecture and performance + analysis. Open Template Hub provides you efficient storage, orients and keeps your data in NOSQL and RDBMS, + handles connection pools and management. + src/app/data/feature/feature.data.ts 11 @@ -1810,14 +1858,18 @@ - Shout your business out to the world using responsive user interfaces with handy and highly customizable components. + Shout your business out to the world using responsive user interfaces with handy and highly customizable + components. + src/app/data/feature/feature.data.ts 16 - : Minimizes your effort while building a new software business with our open source GitHub micro server templates and responsive web UI + mobile UI templates + : Minimizes your effort while building a new software business with our open source GitHub micro server + templates and responsive web UI + mobile UI templates + src/app/data/navigation/navigation.data.ts 9 @@ -2193,7 +2245,9 @@ - No need to pay a price to get started. Get the latest updates from community driven open source project. + No need to pay a price to get started. Get the latest updates from community driven open source + project. + src/app/data/product/product.data.ts 12 @@ -2372,42 +2426,56 @@ - Auth Server Template is a generic open source authentication server that has simple yet powerful design to connect your business with all OAuth 2.0 and OAuth supporting third party companies (like Google, Facebook, Twitter or LinkedIn). It also supports basic username password authentication system. + Auth Server Template is a generic open source authentication server that has simple yet powerful design + to connect your business with all OAuth 2.0 and OAuth supporting third party companies (like Google, Facebook, + Twitter or LinkedIn). It also supports basic username password authentication system. + src/app/data/product/product.data.ts 111 - Payment Server Template is a generic open source payment server that has simple yet powerful design to connect your business with third party payment solution provider companies (like Stripe or Coinbase). + Payment Server Template is a generic open source payment server that has simple yet powerful design to + connect your business with third party payment solution provider companies (like Stripe or Coinbase). + src/app/data/product/product.data.ts 130 - File Storage Server Template is a generic open source file storage server that has simple yet powerful design to connect your business with third party file storage provider companies (like AWS S3). + File Storage Server Template is a generic open source file storage server that has simple yet powerful + design to connect your business with third party file storage provider companies (like AWS S3). + src/app/data/product/product.data.ts 150 - Mail Server Template is a generic open source mail server that has simple yet powerful design to connect your business with third party email service providers (like Gmail, Yahoo or Outlook). + Mail Server Template is a generic open source mail server that has simple yet powerful design to connect + your business with third party email service providers (like Gmail, Yahoo or Outlook). + src/app/data/product/product.data.ts 170 - Analytics Server Template is a generic open source analytics server that has simple yet powerful design to connect your business with third party analytics service providers (like Google Analytics or Matomo). + Analytics Server Template is a generic open source analytics server that has simple yet powerful design + to connect your business with third party analytics service providers (like Google Analytics or Matomo). + src/app/data/product/product.data.ts 188 - Business Logic Server Template is a generic open source server that encodes the real-world business rules that determine how data can be created, stored, and changed. It saves you from rewriting boilerplate code. It works best with other Open Template Hub products. + Business Logic Server Template is a generic open source server that encodes the real-world business + rules that determine how data can be created, stored, and changed. It saves you from rewriting boilerplate + code. It works best with other Open Template Hub products. + src/app/data/product/product.data.ts 207 @@ -2428,7 +2496,9 @@ - Company Profile UI Template is modern, responsive and customisable company profile ui template for your business. It contains reusable components, theme color and design support along with dark theme support. + Company Profile UI Template is modern, responsive and customisable company profile ui template for your + business. It contains reusable components, theme color and design support along with dark theme support. + src/app/data/product/product.data.ts 241 @@ -2497,7 +2567,9 @@ - Web UI Template is modern, responsive and customisable web ui template for your business. It contains reusable components, theme color and design support along with dark theme support. + Web UI Template is modern, responsive and customisable web ui template for your business. It contains + reusable components, theme color and design support along with dark theme support. + src/app/data/product/product.data.ts 286 @@ -2511,7 +2583,9 @@ - Mobile UI Template is modern, responsive and customisable mobile ui template for your business. It contains reusable components, theme color and design support along with dark theme support. + Mobile UI Template is modern, responsive and customisable mobile ui template for your business. It + contains reusable components, theme color and design support along with dark theme support. + src/app/data/product/product.data.ts 331 @@ -2574,7 +2648,10 @@ - Orchestration Server Template is a middleware server that has simple yet powerful design to connect your business with all Open Template Hub servers (like Auth Server, Payment Server, File Storage Server or Mail Server). It also has generic design to integrate any other servers. + Orchestration Server Template is a middleware server that has simple yet powerful design to connect your + business with all Open Template Hub servers (like Auth Server, Payment Server, File Storage Server or Mail + Server). It also has generic design to integrate any other servers. + src/app/data/product/product.data.ts 489 @@ -2665,7 +2742,10 @@ - We perform world-class custom software development services from startups to enterprise businesses. Our highly experienced software developers have a deep understanding of how to leverage top programming languages, frameworks, and other software development tools to create the ideal solution for your business. + We perform world-class custom software development services from startups to enterprise businesses. Our + highly experienced software developers have a deep understanding of how to leverage top programming languages, + frameworks, and other software development tools to create the ideal solution for your business. + src/app/data/product/product.data.ts 570 @@ -2686,7 +2766,9 @@ - We rely on our industry-specific technology experience to deliver highly scalable, flexible, and interoperable web, mobile, desktop, and hybrid applications. + We rely on our industry-specific technology experience to deliver highly scalable, flexible, and + interoperable web, mobile, desktop, and hybrid applications. + src/app/data/product/product.data.ts 578 @@ -2700,7 +2782,9 @@ - Our app maintenance & modernization services are designed to ensure the scalability, performance, and sustainability of your entire software infrastructure. + Our app maintenance & modernization services are designed to ensure the scalability, performance, + and sustainability of your entire software infrastructure. + src/app/data/product/product.data.ts 582 @@ -2714,14 +2798,20 @@ - We devise an in-depth, comprehensive software implementation & deployment plan, assessing your needs to deliver enhanced technologies to end-users. + We devise an in-depth, comprehensive software implementation & deployment plan, assessing your needs + to deliver enhanced technologies to end-users. + src/app/data/product/product.data.ts 586 - When a company adopts a new technology or business process, they face many challenges between their current applications and systems and the complicated software implementation process. Our industry-specific software engineers handle all of your challenging integration & implementation obstacles, including architectural design, testing, debugging, and execution. + When a company adopts a new technology or business process, they face many challenges between their + current applications and systems and the complicated software implementation process. Our industry-specific + software engineers handle all of your challenging integration & implementation obstacles, including + architectural design, testing, debugging, and execution. + src/app/data/product/product.data.ts 595 @@ -2742,7 +2832,9 @@ - We perform data integration services, including merging data, consolidating business processes, and creating Database Management Systems to ensure complete data integrity during the transfer process. + We perform data integration services, including merging data, consolidating business processes, and + creating Database Management Systems to ensure complete data integrity during the transfer process. + src/app/data/product/product.data.ts 603 @@ -2756,7 +2848,10 @@ - We provide integrating custom-built and third-party APIs service. We, integrate, and customize add web service functionality to mobile and web applications, and seamlessly synchronize data formats across these applications. + We provide integrating custom-built and third-party APIs service. We, integrate, and customize add web + service functionality to mobile and web applications, and seamlessly synchronize data formats across these + applications. + src/app/data/product/product.data.ts 607 @@ -2770,14 +2865,20 @@ - We provide Enterprise Application Integration solutions, facilitating seamless communications between business platforms. We are providing integrations for content management, accounting, customer relationship management, analytics, and marketing. + We provide Enterprise Application Integration solutions, facilitating seamless communications between + business platforms. We are providing integrations for content management, accounting, customer relationship + management, analytics, and marketing. + src/app/data/product/product.data.ts 611 - We deliver full-cycle QA automated software testing for web, mobile, and desktop applications to enable improved test coverage, enhance product quality, optimize testing activities, boost productivity, and decrease overall testing times. + We deliver full-cycle QA automated software testing for web, mobile, and desktop applications to enable + improved test coverage, enhance product quality, optimize testing activities, boost productivity, and decrease + overall testing times. + src/app/data/product/product.data.ts 620 @@ -2798,7 +2899,10 @@ - We deliver full-cycle QA automated software testing for web, mobile, and desktop applications to enable improved test coverage, enhance product quality, optimize testing activities, boost productivity, and decrease overall testing times. + We deliver full-cycle QA automated software testing for web, mobile, and desktop applications to enable + improved test coverage, enhance product quality, optimize testing activities, boost productivity, and decrease + overall testing times. + src/app/data/product/product.data.ts 628 @@ -2812,7 +2916,10 @@ - Our dedicated QA team will test your mobile, web, or desktop application manually to identify & fix bugs, detect & eradicate errors, and confirm its compliance with regulatory standards, providing you with the highest quality result possible. + Our dedicated QA team will test your mobile, web, or desktop application manually to identify & fix + bugs, detect & eradicate errors, and confirm its compliance with regulatory standards, providing you with + the highest quality result possible. + src/app/data/product/product.data.ts 632 @@ -2826,7 +2933,10 @@ - We design QA usability testing platforms that incorporate specific usability testing tools and UX research methods selected based on the client, focused on measuring how user-friendly and flexible your application or website is. + We design QA usability testing platforms that incorporate specific usability testing tools and UX + research methods selected based on the client, focused on measuring how user-friendly and flexible your + application or website is. + src/app/data/product/product.data.ts 636 @@ -2868,49 +2978,68 @@ - I can say, without a doubt, that Open Template Hub's products scale quickly and provide the best performance in the market. The best part is that we don't have to worry about any licensing fees at all... I highly recommend this affordable and reliable products! + I can say, without a doubt, that Open Template Hub's products scale quickly and provide the best + performance in the market. The best part is that we don't have to worry about any licensing fees at + all... I highly recommend this affordable and reliable products! + src/app/data/testimonial/testimonial.data.ts 8 - Working with the team at Open Template Hub has been a very satisfying experience. The team was communicative and supportive throughout the project, which made for a pleasant working environment. They were able to complete my project in an expert and timely manner. + Working with the team at Open Template Hub has been a very satisfying experience. The team was + communicative and supportive throughout the project, which made for a pleasant working environment. They were + able to complete my project in an expert and timely manner. + src/app/data/testimonial/testimonial.data.ts 21 - I've been researching for days about microserver templates and didn't really find much. But then I found Open Template Hub... This is an excellent way to save money and time for startups or small companies who don't have the means to pay hefty prices for licenses. Thank you so much. + I've been researching for days about microserver templates and didn't really find much. But + then I found Open Template Hub... This is an excellent way to save money and time for startups or small + companies who don't have the means to pay hefty prices for licenses. Thank you so much. + src/app/data/testimonial/testimonial.data.ts 34 - As a startup, time is of the essence for us. That's why Open Template Hub has been so helpful for us. It has saved us hours of time when it comes to creating the perfect website for our company. + As a startup, time is of the essence for us. That's why Open Template Hub has been so helpful for + us. It has saved us hours of time when it comes to creating the perfect website for our company. + src/app/data/testimonial/testimonial.data.ts 47 - Open Template Hub's Orchestration Server was easy to set up and integrate with our existing servers. I liked how the system automatically synced over all of the latest updates, it made managing our company's server so much easier. The customer service is also top-notch! + Open Template Hub's Orchestration Server was easy to set up and integrate with our existing + servers. I liked how the system automatically synced over all of the latest updates, it made managing our + company's server so much easier. The customer service is also top-notch! + src/app/data/testimonial/testimonial.data.ts 60 - I'm a big fan of Open Template Hub. The process was really easy, the team is efficient, and the payment service is really accurate. I would recommend this to any business owner. + I'm a big fan of Open Template Hub. The process was really easy, the team is efficient, and the + payment service is really accurate. I would recommend this to any business owner. + src/app/data/testimonial/testimonial.data.ts 73 - Would you like to tell us how was your Open Template Hub experience or are you planning to use our products but need some professional help? Please feel free to reach us from info@opentemplatehub.com or from contact us page. + Would you like to tell us how was your Open Template Hub experience or are you planning to use our + products but need some professional help? Please feel free to reach us from info@opentemplatehub.com or from + contact us page. + src/app/data/testimonial/testimonial.data.ts 86 @@ -2926,463 +3055,668 @@ Team Behind the Open Template Hub - src/app/page/landing-layout/about-us-page/about-us-page.component.ts + src/app/page/landing-layout/about-us-page/about-us-page.component.ts + 19 Follow us on social media - src/app/page/landing-layout/about-us-page/about-us-page.component.ts + src/app/page/landing-layout/about-us-page/about-us-page.component.ts + 22 - Minimizes your effort while building a new software business with our open source GitHub micro server templates and responsive web UI + mobile UI templates + Minimizes your effort while building a new software business with our open source GitHub micro server + templates and responsive web UI + mobile UI templates + - src/app/page/landing-layout/about-us-page/about-us-page.component.ts + src/app/page/landing-layout/about-us-page/about-us-page.component.ts + 23 History of the Open Template Hub - src/app/page/landing-layout/about-us-page/about-us-page.component.ts + src/app/page/landing-layout/about-us-page/about-us-page.component.ts + 26 - Minimizes your effort while building a new software business with our open source GitHub micro server templates and responsive web UI + mobile UI templates + Minimizes your effort while building a new software business with our open source GitHub micro server + templates and responsive web UI + mobile UI templates + - src/app/page/landing-layout/about-us-page/about-us-page.component.ts + src/app/page/landing-layout/about-us-page/about-us-page.component.ts + 27 - All of Open Template Hub’s brand features including Open Template Hub, OTH and the Open Template Hub logo are protected by applicable trademark, copyright and other intellectual property laws. Any use of a Open Template Hub trademark is subject to the Open Template Hub Trademark Standards for Use. Basic usage guidelines can be found below. If you have any questions or want to request approval to use these assets, please do not hesitate to contact us or email info@opentemplatehub.com Basic Usage Guidelines: - Do not rotate the Open Template Hub logo. - Do not change the color of the Open Template Hub logo. - Do not distort the Open Template Hub logo (be sure to scale proportionately). - Allow an appropriate amount of white space around the Open Template Hub logo, at least as much as the x-height of the logo (suggested). - Preferred minimum size for the Open Template Hub logo is 100px wide. For smaller sizes, you must seek permission from the Open Template Hub team. - - src/app/page/landing-layout/branding-page/branding-page.component.html + + + All of Open Template Hub’s brand features includingOpen Template Hub,OTH + + and theOpen Template Hub + + logo are protected by applicable trademark, copyright and other intellectual property laws. Any use of aOpen Template Hub trademark + + is subject to theOpen Template Hub + Trademark Standards + + for Use. + + + Basic usage guidelines can be found below. If you have any questions or want to request approval to use these + assets, please do not hesitate to contact us or emailinfo@opentemplatehub.com + + + + + + Basic Usage Guidelines: + + + + - Do not rotate theOpen Template Hub + + logo. + + + - Do not change the color of theOpen + Template Hub + + logo. + + + - Do not distort theOpen Template Hub + + logo (be sure to scale proportionately). + + + - Allow an appropriate amount of white space around theOpen Template Hublogo, at least as much as the x-height + of the logo (suggested). + + + - Preferred minimum size for theOpen + Template Hub + + logo is 100px wide. For smaller sizes, you must seek permission from the Open Template Hub team. + + + + src/app/page/landing-layout/branding-page/branding-page.component.html + 8,46 Thank you for reaching us. Our team will contact with you soon. - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 8 First Name - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 20 Last Name - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 30 Email - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 41 Phone Number - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 51 Website - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 61 - Select range of employees + Select range of employees - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 65,67 Company Size - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 72 Select a country - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 76 Country - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 81 Tell us more about your project, needs, and timeline.... - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 90 Your Message - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 93 CONTACT US - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 96 General Communication - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 115 - For general queries, including partnership opportunities, please email - - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + For general queries, including partnership opportunities, please email + + + + + + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 116,119 Technical or account support - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 126 - We're here to help! If you have technical issues, contact support - - src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + We're here to help! If you have technical issues, + + contact support + + + + + src/app/page/landing-layout/contact-us-page/contact-us-page.component.html + 127,130 Contact Us - src/app/page/landing-layout/contact-us-page/contact-us-page.component.ts + src/app/page/landing-layout/contact-us-page/contact-us-page.component.ts + 30 Please provide a first name - src/app/page/landing-layout/contact-us-page/contact-us-page.component.ts + src/app/page/landing-layout/contact-us-page/contact-us-page.component.ts + 68 Customer Testimonials - src/app/page/landing-layout/customers-page/customers-page.component.ts + src/app/page/landing-layout/customers-page/customers-page.component.ts + 15 What our customers are saying... - src/app/page/landing-layout/customers-page/customers-page.component.ts + src/app/page/landing-layout/customers-page/customers-page.component.ts + 16 Username... - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + 12 SEND - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + 17 'Reset email sent!' - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + 23 'Please check you inbox' - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + 24 LOG IN - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.html + 27 Forget password - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.ts + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.ts + 25 Please provide a valid username. - src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.ts + + src/app/page/landing-layout/form-pages/forget-password-page/forget-password-page.component.ts + 62 or - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 15 Username or Email... - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 20 Password... - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 24 Remember Me - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 31 LOG IN - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 36 Don't have an account? - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 38 - Sign Up + Sign Up - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 39,41 - Forget password? + Forget password? - src/app/page/landing-layout/form-pages/login-page/login-page.component.html + + src/app/page/landing-layout/form-pages/login-page/login-page.component.html + 44,46 Welcome - src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + 35 Please provide a valid username - src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + 78 Please provide a valid password - src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + src/app/page/landing-layout/form-pages/login-page/login-page.component.ts + 79 Password... - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + 12 Confirm Password... - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + 16 DONE - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + 21 Please proceed with login - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + 26 'LOG IN' - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.html + 29 Reset password - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + 27 Please provide a valid password (min length 6) - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + 71 Please provide the same value for confirm password - src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + + src/app/page/landing-layout/form-pages/reset-password-page/reset-password-page.component.ts + 72 or - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 15 Username... - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 21 Email... - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 25 Password... - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 29 Confirm Password... - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 33 CONTINUE - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 38 - By signing up, you agree Terms of Use, Privacy Policy and Cookie Policy - - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + By signing up, you agree + Terms of Use, + Privacy Policy + + and + Cookie Policy + + + + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 40,46 - Already have an account? Login - - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + Already have an account? + + Login + + + + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.html + 50,54 Register - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + 32 Please provide a valid username - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + 75 Please provide a valid email address - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + 76 Please provide a valid password (min length 6) - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + 77 Please provide the same value for confirm password - src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + + src/app/page/landing-layout/form-pages/sign-up-page/sign-up-page.component.ts + 78 @@ -3414,7 +3748,8 @@ 49 - src/app/page/landing-layout/product-page/product-page.component.html + src/app/page/landing-layout/product-page/product-page.component.html + 111 @@ -3440,7 +3775,9 @@ - Thousands of companies in over 50 countries use Open Template Hub to start, run, and scale their businesses. + Thousands of companies in over 50 countries use Open Template Hub to start, run, and scale their + businesses. + src/app/page/landing-layout/home-page/home-page.component.ts 54 @@ -3481,7 +3818,8 @@ 155 - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 141 @@ -3492,343 +3830,407 @@ 155 - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 141 Business Partners - src/app/page/landing-layout/partners-page/partners-page.component.ts + src/app/page/landing-layout/partners-page/partners-page.component.ts + 17 Create and run your online business with Open Template Hub and our partners. - src/app/page/landing-layout/partners-page/partners-page.component.ts + src/app/page/landing-layout/partners-page/partners-page.component.ts + 18 - Pricing Plan + Pricing Plan - src/app/page/landing-layout/pricing-page/pricing-page.component.ts + src/app/page/landing-layout/pricing-page/pricing-page.component.ts + 57 No hidden fees. Cancel at any time. - src/app/page/landing-layout/pricing-page/pricing-page.component.ts + src/app/page/landing-layout/pricing-page/pricing-page.component.ts + 58 Open Source - src/app/page/landing-layout/product-page/product-page.component.html + src/app/page/landing-layout/product-page/product-page.component.html + 23 Professional Help - src/app/page/landing-layout/product-page/product-page.component.html + src/app/page/landing-layout/product-page/product-page.component.html + 30 Download Package - src/app/page/landing-layout/product-page/product-page.component.html + src/app/page/landing-layout/product-page/product-page.component.html + 37 Activity history - src/app/page/landing-layout/product-page/product-page.component.html + src/app/page/landing-layout/product-page/product-page.component.html + 148 Customer testimonials - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 33 What our customers are saying... - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 34 Related Products - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 38 Package Installation & Usage - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 42 Contact Us - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 136 Request for Demo - src/app/page/landing-layout/product-page/product-page.component.ts + src/app/page/landing-layout/product-page/product-page.component.ts + 137 HOME - src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.html + + src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.html + 10 Under maintenance - src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.ts + + src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.ts + 19 Please check again later - src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.ts + + src/app/page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component.ts + 20 HOME - src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.html + + src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.html + 10 404 Page not found - src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.ts + + src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.ts + 19 Something went wrong! - src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.ts + + src/app/page/landing-layout/raw-content-pages/not-found-page/not-found-page.component.ts + 20 Registration successful 🎉 - src/app/page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component.ts + + src/app/page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component.ts + 27 - Verification email sent to: + Verification email sent to: - src/app/page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component.ts + + src/app/page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component.ts + 28 HOME - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.html + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.html + 16 LOG IN - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.html + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.html + 23 Verifying account... - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + 28 Account verification failed - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + 31 Something went wrong! - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + 32 Account verified 🎉 - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + 35 Please proceed with login - src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + + src/app/page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component.ts + 36 Products - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 8 Company - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 39 About - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 41 Customers - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 42 Enterprise - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 43 Partners - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 44 Branding - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 45 Jobs - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 46 Blog - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 47 Developers - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 53 Docs - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 55 API - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 56 Status - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 57 Resources - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 61 Support - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 63 Contact - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 64 Terms & Conditions - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 65 Privacy - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 66 Cookies - src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + src/app/page/landing-layout/sitemap-page/sitemap-page.component.html + 67 @@ -3842,84 +4244,107 @@ Dark/Light Mode - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 7 Light theme - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 12 Dark theme - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 14 Auto - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 16 Color - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 20 Design - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 30 Default - src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + + src/app/page/settings-layout/edit-theme-page/edit-theme-page.component.html + 40 Payment succeeded - src/app/page/splash-layout/callback-page/callback-page.component.ts + src/app/page/splash-layout/callback-page/callback-page.component.ts + 56 Home - src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.html + + src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.html + 24 Proceed - src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.html + + src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.html + 25 - Will be redirected to: + Will be redirected to: - src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.ts + + src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.ts + 66 - Looks like the link is broken: + Looks like the link is broken: - src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.ts + + src/app/page/splash-layout/external-redirect-page/external-redirect-page.component.ts + 67 diff --git a/package.json b/package.json index b0af98b9..f681bfd3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "web-ui-template", - "description": "Web UI Template is modern, responsive and customisable web ui template for your business. It contains reusable components, theme color and design support along with dark theme support.", - "version": "3.1.1", + "description": "Web UI Template is a modern, responsive, and customizable web UI template for your business. It contains reusable components, theme color, and design support along with dark theme support.", + "version": "5.0.1", "license": "MIT", "scripts": { "buildLocal": "ng build --configuration=local --localize", @@ -13,11 +13,11 @@ "lint": "ng lint", "sitemap": "node src/sitemap-generator.ts > seo/sitemap.xml", "ng": "ng", - "startLocal": "node src/version-generator.ts > ./src/environments/version.ts && ng serve --configuration=local", - "startLocalFromIPhone": "node src/version-generator.ts > ./src/environments/version.ts && ng serve --configuration=local --host 0.0.0.0 --disable-host-check true", - "startLocalToStagingApi": "node src/version-generator.ts > ./src/environments/version.ts && ng serve --configuration=local-to-staging-api", - "startLocalFromIPhoneToStagingApi": "node src/version-generator.ts > ./src/environments/version.ts && ng serve --configuration=local-to-staging-api --host 0.0.0.0 --disable-host-check true", - "startStaging": "node src/version-generator.ts > ./src/environments/version.ts && node server.js --configuration=staging", + "startLocal": "ng serve --configuration=local --port 4201", + "startLocalFromIPhone": "ng serve --configuration=local --port 4201 --host 0.0.0.0 --disable-host-check true", + "startLocalToStagingApi": "ng serve --configuration=local-to-staging-api --port 4201", + "startLocalFromIPhoneToStagingApi": "ng serve --configuration=local-to-staging-api --port 4201 --host 0.0.0.0 --disable-host-check true", + "startStaging": "node server.js --configuration=staging", "start": "node server.js --configuration=production", "outdated": "node src/dependency-checker.ts > docs/OUTDATED.md", "test": "ng test", @@ -26,69 +26,67 @@ "serve:local:fr": "ng serve -c=fr" }, "dependencies": { - "@angular/animations": "^12.2.5", - "@angular/cdk": "^12.2.5", - "@angular/common": "^12.2.5", - "@angular/compiler": "^12.2.5", - "@angular/core": "^12.2.5", - "@angular/forms": "^12.2.5", - "@angular/platform-browser": "^12.2.5", - "@angular/platform-browser-dynamic": "^12.2.5", - "@angular/router": "^12.2.5", - "@angular/service-worker": "^12.2.5", - "@fortawesome/fontawesome-free": "^5.15.3", - "@fullcalendar/angular": "^5.8.0", - "@fullcalendar/daygrid": "^5.8.0", - "@fullcalendar/interaction": "^5.8.0", - "@ng-toolkit/universal": "^8.1.0", - "@stripe/stripe-js": "^1.15.1", - "@swimlane/ngx-charts": "^19.0.1", - "@types/simple-icons": "^5.0.0", - "angular-google-tag-manager": "^1.4.2", - "angular-in-memory-web-api": "^0.11.0", + "@angular/animations": "^15.1.0", + "@angular/cdk": "^15.1.0", + "@angular/common": "^15.1.0", + "@angular/compiler": "^15.1.0", + "@angular/core": "^15.1.0", + "@angular/forms": "^15.1.0", + "@angular/platform-browser": "^15.1.0", + "@angular/platform-browser-dynamic": "^15.1.0", + "@angular/router": "^15.1.0", + "@angular/service-worker": "^15.1.0", + "@fortawesome/fontawesome-free": "^6.2.1", + "@open-template-hub/animated-code-editor": "^5.0.1", + "@open-template-hub/button": "^5.0.1", + "@open-template-hub/card": "^5.0.1", + "@open-template-hub/countdown": "^5.0.1", + "@open-template-hub/hero": "^5.0.1", + "@open-template-hub/led": "^5.0.1", + "@stripe/stripe-js": "^1.46.0", "compression": "^1.7.4", - "countup.js": "^2.0.7", - "dotenv": "^10.0.0", - "express": "^4.17.1", - "graphql": "^15.5.3", - "graphql-tag": "^2.12.5", - "helmet": "^4.6.0", - "ics": "^2.29.0", - "jsdom": "^17.0.0", - "ng2-date-picker": "^12.0.3", - "ng2-tooltip-directive": "^2.10.1", - "ngx-image-cropper": "^4.0.1", - "ngx-markdown": "^12.0.1", - "ngx-toastr": "^14.1.3", + "countup.js": "^2.3.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "graphql": "^16.6.0", + "graphql-tag": "^2.12.6", + "helmet": "^6.0.1", + "ics": "^2.41.0", + "jsdom": "^21.0.0", + "mixpanel-browser": "^2.45.0", + "ngx-image-cropper": "^6.3.2", + "ngx-markdown": "^15.1.0", + "ngx-toastr": "^16.0.2", "path": "^0.12.7", - "rxjs": "^7.3.0", - "simple-icons": "^5.13.0", - "swiper": "^7.0.4", - "tslib": "^2.3.0", + "rxjs": "^7.8.0", + "simple-icons": "^8.2.0", + "socket.io-client": "^4.5.4", + "swiper": "^8.4.5", + "tslib": "^2.4.1", "xmlserializer": "^0.6.1", - "zone.js": "^0.11.4" + "zone.js": "~0.12.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^12.2.5", - "@angular/cli": "^12.2.5", - "@angular/compiler-cli": "^12.2.5", - "@angular/language-service": "^12.2.5", - "@angular/localize": "^12.2.5", - "@types/jasmine": "^3.9.0", - "@types/jasminewd2": "^2.0.9", - "@types/node": "^16.9.0", + "@angular-devkit/build-angular": "^15.1.1", + "@angular/cli": "^15.1.1", + "@angular/compiler-cli": "^15.1.0", + "@angular/language-service": "^15.1.0", + "@angular/localize": "^15.1.0", + "@types/jasmine": "^4.3.1", + "@types/jasminewd2": "^2.0.10", + "@types/node": "^18.11.18", "codelyzer": "^6.0.2", - "jasmine-core": "^3.9.0", + "jasmine-core": "^4.5.0", "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.3.4", - "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^3.0.2", - "karma-jasmine": "^4.0.0", - "karma-jasmine-html-reporter": "^1.6.0", + "karma": "^6.4.1", + "karma-chrome-launcher": "^3.1.1", + "karma-coverage-istanbul-reporter": "^3.0.3", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.0.0", "protractor": "^7.0.0", - "ts-node": "^10.2.1", - "tslint": "^6.1.0", - "typescript": "~4.3.5" + "ts-node": "^10.9.1", + "tslint": "^6.1.3", + "typescript": "^4.9.4" }, "git repository": "https://github.com/open-template-hub/web-ui-template", "repository": { diff --git a/seo/sitemap.xml b/seo/sitemap.xml index 6735363c..d82df97b 100644 --- a/seo/sitemap.xml +++ b/seo/sitemap.xml @@ -1 +1,123 @@ -https://opentemplatehub.com2021-10-22https://opentemplatehub.com/about2021-10-22https://opentemplatehub.com/contact-us2021-10-22https://opentemplatehub.com/branding2021-10-22https://opentemplatehub.com/blog2021-10-22https://opentemplatehub.com/docs2021-10-22https://opentemplatehub.com/partners2021-10-22https://opentemplatehub.com/customers2021-10-22https://opentemplatehub.com/terms2021-10-22https://opentemplatehub.com/sitemap2021-10-22https://opentemplatehub.com/product2021-10-22https://opentemplatehub.com/product/servers2021-10-22https://opentemplatehub.com/product/servers/auth-server-template2021-10-22https://opentemplatehub.com/product/servers/payment-server-template2021-10-22https://opentemplatehub.com/product/servers/file-storage-server-template2021-10-22https://opentemplatehub.com/product/servers/analytics-server-template2021-10-22https://opentemplatehub.com/product/servers/business-logic-server-template2021-10-22https://opentemplatehub.com/product/user-interface2021-10-22https://opentemplatehub.com/product/user-interface/company-profile-ui-template2021-10-22https://opentemplatehub.com/product/user-interface/web-ui-template2021-10-22https://opentemplatehub.com/product/user-interface/mobile-ui-template2021-10-22https://opentemplatehub.com/product/generator2021-10-22https://opentemplatehub.com/product/generator/server-generator2021-10-22https://opentemplatehub.com/product/generator/app-generator2021-10-22https://opentemplatehub.com/product/premium2021-10-22https://opentemplatehub.com/product/premium/orchestration-server2021-10-22https://opentemplatehub.com/product/services2021-10-22https://opentemplatehub.com/product/services/software-consultancy2021-10-22https://opentemplatehub.com/product/services/software-integration2021-10-22https://opentemplatehub.com/product/services/quality-assurance2021-10-22 + + + + https://opentemplatehub.com + 2021-10-22 + + + https://opentemplatehub.com/about + 2021-10-22 + + + https://opentemplatehub.com/contact-us + 2021-10-22 + + + https://opentemplatehub.com/branding + 2021-10-22 + + + https://opentemplatehub.com/blog + 2021-10-22 + + + https://opentemplatehub.com/docs + 2021-10-22 + + + https://opentemplatehub.com/partners + 2021-10-22 + + + https://opentemplatehub.com/customers + 2021-10-22 + + + https://opentemplatehub.com/terms + 2021-10-22 + + + https://opentemplatehub.com/sitemap + 2021-10-22 + + + https://opentemplatehub.com/product + 2021-10-22 + + + https://opentemplatehub.com/product/servers + 2021-10-22 + + + https://opentemplatehub.com/product/servers/auth-server-template + 2021-10-22 + + + https://opentemplatehub.com/product/servers/payment-server-template + 2021-10-22 + + + https://opentemplatehub.com/product/servers/file-storage-server-template + 2021-10-22 + + + https://opentemplatehub.com/product/servers/analytics-server-template + 2021-10-22 + + + https://opentemplatehub.com/product/servers/business-logic-server-template + 2021-10-22 + + + https://opentemplatehub.com/product/user-interface + 2021-10-22 + + + https://opentemplatehub.com/product/user-interface/company-profile-ui-template + 2021-10-22 + + + https://opentemplatehub.com/product/user-interface/web-ui-template + 2021-10-22 + + + https://opentemplatehub.com/product/user-interface/mobile-ui-template + 2021-10-22 + + + https://opentemplatehub.com/product/generator + 2021-10-22 + + + https://opentemplatehub.com/product/generator/server-generator + 2021-10-22 + + + https://opentemplatehub.com/product/generator/app-generator + 2021-10-22 + + + https://opentemplatehub.com/product/premium + 2021-10-22 + + + https://opentemplatehub.com/product/premium/orchestration-server + 2021-10-22 + + + https://opentemplatehub.com/product/services + 2021-10-22 + + + https://opentemplatehub.com/product/services/software-consultancy + 2021-10-22 + + + https://opentemplatehub.com/product/services/software-integration + 2021-10-22 + + + https://opentemplatehub.com/product/services/quality-assurance + 2021-10-22 + + diff --git a/server.js b/server.js index 4033a556..7d7e1056 100644 --- a/server.js +++ b/server.js @@ -18,16 +18,8 @@ app.disable( "x-powered-by" ); // directory that we will serve app.use( express.static( __dirname + "/dist/web-ui-template" ) ); -app.get( "*", function ( req, res, next ) { - - if ( "https" !== req.headers[ "x-forwarded-proto" ] && "production" === process.env.NODE_ENV ) { - res.redirect( "https://" + req.hostname + req.url ); - } else { - // Continue to other routes if we're not redirecting - next(); - } - -} ); +// If not using Cloudflare Flexible SSL configuration redirect all requests to https +// https://support.cloudflare.com/hc/en-us/articles/115000219871-Troubleshooting-redirect-loop-errors- // redirect all requests to index.html app.get( "/*", function ( req, res ) { @@ -41,7 +33,7 @@ app.get( "/*", function ( req, res ) { } ); // listen port -const port = process.env.PORT || 4200; +const port = process.env.PORT || 4201; app.listen( port, () => { console.info( "UI Server is running on port: ", port ); } ); diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index e43ea2a0..7df40be9 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -3,45 +3,67 @@ import { RouterModule, Routes } from '@angular/router'; import { environmentCommon } from '../environments/environment-common'; import { NAVIGATIONS } from './data/navigation/navigation.data'; import { AuthGuard } from './guard/auth/auth.guard'; -import { PublicProfileGuard } from './guard/public-profile/public-profile.guard'; import { NavigationInterceptor } from './interceptor/navigation/navigation.interceptor'; -import { CreateEventPageComponent } from './page/dashboard-layout/create-event-page/create-event-page.component'; import { DashboardLayoutComponent } from './page/dashboard-layout/dashboard-layout.component'; import { DashboardPageComponent } from './page/dashboard-layout/dashboard-page/dashboard-page.component'; -import { EventPageComponent } from './page/dashboard-layout/event-page/event-page.component'; -import { LearnPageComponent } from './page/dashboard-layout/learn-page/learn-page.component'; import { MyProfilePageComponent } from './page/dashboard-layout/my-profile-page/my-profile-page.component'; -import { PublicProfilePageComponent } from './page/dashboard-layout/public-profile-page/public-profile-page.component'; +import { NotificationsPageComponent } from './page/dashboard-layout/notifications-page/notifications-page.component'; +import { PremiumPageComponent } from './page/dashboard-layout/premium-page/premium-page.component'; import { AboutUsPageComponent } from './page/landing-layout/about-us-page/about-us-page.component'; -import { BlogContentPageComponent } from './page/landing-layout/blog-page/blog-content-page/blog-content-page.component'; +import { + BlogContentPageComponent +} from './page/landing-layout/blog-page/blog-content-page/blog-content-page.component'; import { BlogPageComponent } from './page/landing-layout/blog-page/blog-page.component'; import { BrandingPageComponent } from './page/landing-layout/branding-page/branding-page.component'; import { ContactUsPageComponent } from './page/landing-layout/contact-us-page/contact-us-page.component'; import { CustomersPageComponent } from './page/landing-layout/customers-page/customers-page.component'; -import { DocsContentPageComponent } from './page/landing-layout/docs-page/docs-content-page/docs-content-page.component'; +import { + DocsContentPageComponent +} from './page/landing-layout/docs-page/docs-content-page/docs-content-page.component'; import { DocsPageComponent } from './page/landing-layout/docs-page/docs-page.component'; -import { ForgetPasswordPageComponent } from './page/landing-layout/form-pages/forget-password-page/forget-password-page.component'; +import { + ForgetPasswordPageComponent +} from './page/landing-layout/form-pages/forget-password-page/forget-password-page.component'; import { LoginPageComponent } from './page/landing-layout/form-pages/login-page/login-page.component'; -import { ResetPasswordPageComponent } from './page/landing-layout/form-pages/reset-password-page/reset-password-page.component'; +import { + ResetPasswordPageComponent +} from './page/landing-layout/form-pages/reset-password-page/reset-password-page.component'; import { SignUpPageComponent } from './page/landing-layout/form-pages/sign-up-page/sign-up-page.component'; +import { + TwoFactorAuthenticationPageComponent +} from './page/landing-layout/form-pages/two-factor-authentication-page/two-factor-authentication-page.component'; import { HomePageComponent } from './page/landing-layout/home-page/home-page.component'; import { LandingLayoutComponent } from './page/landing-layout/landing-layout.component'; import { PartnersPageComponent } from './page/landing-layout/partners-page/partners-page.component'; -import { CookiePolicyPageComponent } from './page/landing-layout/policy-pages/cookie-policy-page/cookie-policy-page.component'; -import { PrivacyPolicyPageComponent } from './page/landing-layout/policy-pages/privacy-policy-page/privacy-policy-page.component'; +import { + CookiePolicyPageComponent +} from './page/landing-layout/policy-pages/cookie-policy-page/cookie-policy-page.component'; +import { + PrivacyPolicyPageComponent +} from './page/landing-layout/policy-pages/privacy-policy-page/privacy-policy-page.component'; import { TermsPageComponent } from './page/landing-layout/policy-pages/terms-page/terms-page.component'; import { PricingPageComponent } from './page/landing-layout/pricing-page/pricing-page.component'; import { ProductPageComponent } from './page/landing-layout/product-page/product-page.component'; -import { MaintenancePageComponent } from './page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component'; +import { + MaintenancePageComponent +} from './page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component'; import { NotFoundPageComponent } from './page/landing-layout/raw-content-pages/not-found-page/not-found-page.component'; -import { SignUpSuccessPageComponent } from './page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component'; -import { VerifyAccountPageComponent } from './page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component'; +import { + SignUpSuccessPageComponent +} from './page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component'; +import { + VerifyAccountPageComponent +} from './page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component'; import { SitemapPageComponent } from './page/landing-layout/sitemap-page/sitemap-page.component'; import { StatusPageComponent } from './page/landing-layout/status-page/status-page.component'; +import { EditProfilePageComponent } from './page/settings-layout/edit-profile-page/edit-profile-page.component'; +import { EditSecurityComponent } from './page/settings-layout/edit-security/edit-security.component'; import { EditThemePageComponent } from './page/settings-layout/edit-theme-page/edit-theme-page.component'; import { SettingsLayoutComponent } from './page/settings-layout/settings-layout.component'; import { CallbackPageComponent } from './page/splash-layout/callback-page/callback-page.component'; -import { ExternalRedirectPageComponent } from './page/splash-layout/external-redirect-page/external-redirect-page.component'; +import { + ExternalRedirectPageComponent +} from './page/splash-layout/external-redirect-page/external-redirect-page.component'; import { SplashLayoutComponent } from './page/splash-layout/splash-layout.component'; const routes: Routes = [ @@ -104,6 +126,11 @@ const routes: Routes = [ component: LoginPageComponent, canActivate: [ NavigationInterceptor ], }, + { + path: NAVIGATIONS.twoFactorVerification.url, + component: TwoFactorAuthenticationPageComponent, + canActivate: [ NavigationInterceptor ] + }, { path: NAVIGATIONS.branding.url, component: BrandingPageComponent, @@ -154,12 +181,6 @@ const routes: Routes = [ component: SitemapPageComponent, canActivate: [ NavigationInterceptor ], }, - { - path: NAVIGATIONS.u.url + '/' + ':username', - component: PublicProfilePageComponent, - data: { isPublic: true }, - canActivate: [ NavigationInterceptor ], - }, { path: NAVIGATIONS.pricing.url + '/' + ':productLine' + '/' + ':product', component: PricingPageComponent, @@ -242,42 +263,21 @@ const routes: Routes = [ path: NAVIGATIONS.dashboard.url, component: DashboardLayoutComponent, children: [ - { path: '', component: DashboardPageComponent, canActivate: [ AuthGuard ] }, + { path: '', component: DashboardPageComponent, canActivate: [ AuthGuard, NavigationInterceptor ] }, { path: NAVIGATIONS.myProfile.url, component: MyProfilePageComponent, - canActivate: [ AuthGuard ], - }, - { - path: NAVIGATIONS.createEvent.url, - component: CreateEventPageComponent, - canActivate: [ AuthGuard ], - }, - { - path: NAVIGATIONS.learn.url, - component: LearnPageComponent, - canActivate: [ AuthGuard ], - }, - { - path: NAVIGATIONS.event.url, - component: EventPageComponent, - canActivate: [ AuthGuard ], + canActivate: [ AuthGuard, NavigationInterceptor ], }, { - path: NAVIGATIONS.privacy.url, - component: MaintenancePageComponent, - canActivate: [ AuthGuard ], + path: NAVIGATIONS.premium.url, + component: PremiumPageComponent, + canActivate: [ AuthGuard, NavigationInterceptor ], }, - ], - }, - { - path: NAVIGATIONS.user.url, - component: DashboardLayoutComponent, - children: [ { - path: ':username', - component: PublicProfilePageComponent, - canActivate: [ PublicProfileGuard ], + path: NAVIGATIONS.notifications.url, + component: NotificationsPageComponent, + canActivate: [ AuthGuard, NavigationInterceptor ], }, ], }, @@ -288,11 +288,21 @@ const routes: Routes = [ { path: NAVIGATIONS.editTheme.url, component: EditThemePageComponent, - canActivate: [ AuthGuard ] + canActivate: [ AuthGuard, NavigationInterceptor ] }, + { + path: NAVIGATIONS.editProfile.url, + component: EditProfilePageComponent, + canActivate: [ AuthGuard, NavigationInterceptor ] + }, + { + path: NAVIGATIONS.editSecurity.url, + component: EditSecurityComponent, + canActivate: [ AuthGuard, NavigationInterceptor ] + } ], }, - // otherwise redirect to error + // otherwise, redirect to error { path: '**', redirectTo: NAVIGATIONS.notFound.url }, ]; diff --git a/src/app/oth/oth.component.html b/src/app/app.component.html similarity index 87% rename from src/app/oth/oth.component.html rename to src/app/app.component.html index cc05ddd0..962c8ceb 100644 --- a/src/app/oth/oth.component.html +++ b/src/app/app.component.html @@ -1,5 +1,5 @@
+ id="app-component">
diff --git a/src/app/component/button/brand-button/brand-button.component.scss b/src/app/app.component.scss similarity index 100% rename from src/app/component/button/brand-button/brand-button.component.scss rename to src/app/app.component.scss diff --git a/src/app/oth/oth.component.spec.ts b/src/app/app.component.spec.ts similarity index 78% rename from src/app/oth/oth.component.spec.ts rename to src/app/app.component.spec.ts index 5ebc86f8..91f85f55 100644 --- a/src/app/oth/oth.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,6 +1,6 @@ import { async, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { OthComponent } from './oth.component'; +import { AppComponent } from './app.component'; describe( 'OthComponent', () => { beforeEach( async( () => { @@ -9,25 +9,25 @@ describe( 'OthComponent', () => { RouterTestingModule ], declarations: [ - OthComponent + AppComponent ], } ).compileComponents(); } ) ); it( 'should create the app', () => { - const fixture = TestBed.createComponent( OthComponent ); + const fixture = TestBed.createComponent( AppComponent ); const app = fixture.debugElement.componentInstance; expect( app ).toBeTruthy(); } ); it( `should have as title 'web-ui-template'`, () => { - const fixture = TestBed.createComponent( OthComponent ); + const fixture = TestBed.createComponent( AppComponent ); const app = fixture.debugElement.componentInstance; expect( app.title ).toEqual( 'web-ui-template' ); } ); it( 'should render title', () => { - const fixture = TestBed.createComponent( OthComponent ); + const fixture = TestBed.createComponent( AppComponent ); fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; expect( compiled.querySelector( '.content span' ).textContent ).toContain( 'web-ui-template app is running!' ); diff --git a/src/app/oth/oth.component.ts b/src/app/app.component.ts similarity index 59% rename from src/app/oth/oth.component.ts rename to src/app/app.component.ts index 2b542889..f6c00cb5 100644 --- a/src/app/oth/oth.component.ts +++ b/src/app/app.component.ts @@ -1,14 +1,14 @@ import { Component } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; -import { GoogleTagManagerService } from 'angular-google-tag-manager'; -import { ThemeService } from '../service/theme/theme.service'; +import { Router } from '@angular/router'; +import { SocketService } from './service/socket/socket.service'; +import { ThemeService } from './service/theme/theme.service'; @Component( { selector: 'app-root', - templateUrl: './oth.component.html', - styleUrls: [ './oth.component.scss' ] + templateUrl: './app.component.html', + styleUrls: [ './app.component.scss' ] } ) -export class OthComponent { +export class AppComponent { darkLightSetting: string; themeColorSetting: string; @@ -16,21 +16,9 @@ export class OthComponent { constructor( private themeService: ThemeService, - private googleTagManagerService: GoogleTagManagerService, + private socketService: SocketService, private router: Router ) { - this.router.events.forEach( item => { - if ( item instanceof NavigationEnd ) { - - const googleTagManagerTag = { - event: 'page', - pageName: item.url - }; - - this.googleTagManagerService.pushTag( googleTagManagerTag ); - } - } ); - this.themeService.darkLightSetting.subscribe( darkLightSetting => { this.darkLightSetting = darkLightSetting; } ); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 16cd9953..6e70892d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -7,13 +7,12 @@ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { FullCalendarModule } from '@fullcalendar/angular'; // must go before plugins -import dayGridPlugin from '@fullcalendar/daygrid'; // a plugin! -import interactionPlugin from '@fullcalendar/interaction'; -import { NgxChartsModule } from '@swimlane/ngx-charts'; -import { GoogleTagManagerModule } from 'angular-google-tag-manager'; -import { DpDatePickerModule } from 'ng2-date-picker'; -import { TooltipModule } from 'ng2-tooltip-directive'; +import { AnimatedCodeEditorModule } from '@open-template-hub/animated-code-editor'; +import { ButtonModule } from '@open-template-hub/button'; +import { CardModule } from '@open-template-hub/card'; +import { CountdownModule } from '@open-template-hub/countdown'; +import { HeroModule } from '@open-template-hub/hero'; +import { LedModule } from '@open-template-hub/led'; import { ImageCropperModule } from 'ngx-image-cropper'; import { MarkdownModule } from 'ngx-markdown'; import { ToastrModule } from 'ngx-toastr'; @@ -21,114 +20,139 @@ import { SwiperModule } from 'swiper/angular'; import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; -import { AnimatedCodeEditorComponent } from './component/animated-code-editor/animated-code-editor.component'; -import { BrandButtonComponent } from './component/button/brand-button/brand-button.component'; -import { ButtonComponent } from './component/button/button.component'; -import { EventButtonComponent } from './component/button/event-button/event-button.component'; -import { InformationButtonComponent } from './component/button/information-button/information-button.component'; -import { CalendarComponent } from './component/calendar/calendar.component'; +import { AppComponent } from './app.component'; +import { ActivityCardComponent } from './component/card/activity-card/activity-card.component'; import { ActivityHistoryCardComponent } from './component/card/activity-history-card/activity-history-card.component'; -import { CardComponent } from './component/card/card.component'; +import { AnalyticsEventCardComponent } from './component/card/analytics-event-card/analytics-event-card.component'; +import { AssetCardComponent } from './component/card/asset-card/asset-card.component'; +import { BlogCardComponent } from './component/card/blog-card/blog-card.component'; +import { BlogHolderCardComponent } from './component/card/blog-holder-card/blog-holder-card.component'; +import { + ContactInformationCardComponent +} from './component/card/contact-information-card/contact-information-card.component'; +import { DocCardComponent } from './component/card/doc-card/doc-card.component'; +import { DocHolderCardComponent } from './component/card/doc-holder-card/doc-holder-cardcomponent'; import { EmployeeCardComponent } from './component/card/employee-card/employee-card.component'; -import { EventCardComponent } from './component/card/event-card/event-card.component'; import { FeatureCardComponent } from './component/card/feature-card/feature-card.component'; import { PolicyCardComponent } from './component/card/policy-card/policy-card.component'; import { PresentationCardComponent } from './component/card/presentation-card/presentation-card.component'; import { PricingCardComponent } from './component/card/pricing-card/pricing-card.component'; +import { ProfileCardComponent } from './component/card/profile-card/profile-card.component'; import { StatusCardComponent } from './component/card/status-card/status-card.component'; +import { TechStackCardComponent } from './component/card/tech-stack-card/tech-stack-card.component'; import { TestimonialCardComponent } from './component/card/testimonial-card/testimonial-card.component'; +import { + StepTimelineCardComponent +} from './component/card/timeline-card/step-timeline-card/step-timeline-card.component'; import { TimelineCardComponent } from './component/card/timeline-card/timeline-card.component'; import { ColorChartComponent } from './component/color-chart/color-chart.component'; -import { CommandLineComponent } from './component/command-line/command-line.component'; import { BoxContentLoaderComponent } from './component/content-loader/box-content-loader/box-content-loader.component'; import { ContentLoaderComponent } from './component/content-loader/content-loader.component'; -import { ImageContentLoaderComponent } from './component/content-loader/image-content-loader/image-content-loader.component'; -import { TextContentLoaderComponent } from './component/content-loader/text-content-loader/text-content-loader.component'; -import { CounterBordersTopSvgComponent } from './component/design/top-svg/counter-borders-top-svg/counter-borders-top-svg.component'; -import { DefaultTopSvgComponent } from './component/design/top-svg/default-top-svg/default-top-svg.component'; -import { LeafTopSvgComponent } from './component/design/top-svg/leaf-top-svg/leaf-top-svg.component'; -import { SharpTopSvgComponent } from './component/design/top-svg/sharp-top-svg/sharp-top-svg.component'; +import { + ImageContentLoaderComponent +} from './component/content-loader/image-content-loader/image-content-loader.component'; +import { + TextContentLoaderComponent +} from './component/content-loader/text-content-loader/text-content-loader.component'; +import { BottomSvgComponent } from './component/design/bottom-svg/bottom-svg.component'; import { TopSvgComponent } from './component/design/top-svg/top-svg.component'; -import { DropdownMenuComponent } from './component/dropdown-menu/dropdown-menu.component'; import { ExtLinkComponent } from './component/ext-link/ext-link.component'; -import { HeroComponent } from './component/hero/hero.component'; -import { EventDataComponent } from './component/label/deprecated/event-data/event-data.component'; -import { EventHamburgerMenuComponent } from './component/label/deprecated/event-hamburger-menu/event-hamburger-menu.component'; -import { LabelDataComponent } from './component/label/deprecated/label-data/label-data.component'; -import { LabelWithIconDataComponent } from './component/label/deprecated/label-with-icon-data/label-with-icon-data.component'; -import { LedComponent } from './component/led/led.component'; -import { BottomNavComponent } from './component/nav/bottom-nav/bottom-nav.component'; -import { DashboardLayoutSideNavComponent } from './component/nav/dashboard/dashboard-layout-side-nav/dashboard-layout-side-nav.component'; -import { DashboardLayoutTopNavComponent } from './component/nav/dashboard/dashboard-layout-top-nav/dashboard-layout-top-nav.component'; +import { + DashboardLayoutBottomNavComponent +} from './component/nav/dashboard/dashboard-layout-bottom-nav/dashboard-layout-bottom-nav.component'; +import { + DashboardLayoutSideNavComponent +} from './component/nav/dashboard/dashboard-layout-side-nav/dashboard-layout-side-nav.component'; +import { + DashboardLayoutTopNavComponent +} from './component/nav/dashboard/dashboard-layout-top-nav/dashboard-layout-top-nav.component'; import { FooterComponent } from './component/nav/footer/footer.component'; -import { LandingLayoutTopNavComponent } from './component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component'; +import { + LandingLayoutBottomNavComponent +} from './component/nav/landing/landing-layout-bottom-nav/landing-layout-bottom-nav.component'; +import { + LandingLayoutTopNavComponent +} from './component/nav/landing/landing-layout-top-nav/landing-layout-top-nav.component'; import { CookiePopupComponent } from './component/popup/cookie-popup/cookie-popup.component'; import { PricePlanComponent } from './component/price-plan/price-plan.component'; import { ProductPresentationComponent } from './component/product-represantation/product-presentation.component'; import { RateBarComponent } from './component/rate-bar/rate-bar.component'; import { SearchComponent } from './component/search/search.component'; +import { SettingsDropdownMenuComponent } from './component/settings-dropdown-menu/settings-dropdown-menu.component'; import { SideContentComponent } from './component/side-content/side-content.component'; -import { BusinessPartnerSwiperComponent } from './component/swiper/business-partner-swiper/business-partner-swiper.component'; +import { + BusinessPartnerSwiperComponent +} from './component/swiper/business-partner-swiper/business-partner-swiper.component'; import { PresentationSwiperComponent } from './component/swiper/presentation-swiper/presentation-swiper.component'; +import { ScreenshotSwiperComponent } from './component/swiper/screenshot-swiper/screenshot-swiper.component'; import { RequestInterceptor } from './interceptor/request/request.interceptor'; import { ResponseInterceptor } from './interceptor/response/response.interceptor'; -import { OthComponent } from './oth/oth.component'; -import { CreateEventPageComponent } from './page/dashboard-layout/create-event-page/create-event-page.component'; import { DashboardLayoutComponent } from './page/dashboard-layout/dashboard-layout.component'; import { DashboardPageComponent } from './page/dashboard-layout/dashboard-page/dashboard-page.component'; -import { EventPageComponent } from './page/dashboard-layout/event-page/event-page.component'; -import { LearnPageComponent } from './page/dashboard-layout/learn-page/learn-page.component'; import { MyProfilePageComponent } from './page/dashboard-layout/my-profile-page/my-profile-page.component'; -import { PublicProfilePageComponent } from './page/dashboard-layout/public-profile-page/public-profile-page.component'; +import { NotificationsPageComponent } from './page/dashboard-layout/notifications-page/notifications-page.component'; +import { PremiumPageComponent } from './page/dashboard-layout/premium-page/premium-page.component'; import { AboutUsPageComponent } from './page/landing-layout/about-us-page/about-us-page.component'; +import { + BlogContentPageComponent +} from './page/landing-layout/blog-page/blog-content-page/blog-content-page.component'; +import { BlogPageComponent } from './page/landing-layout/blog-page/blog-page.component'; import { BrandingPageComponent } from './page/landing-layout/branding-page/branding-page.component'; import { ContactUsPageComponent } from './page/landing-layout/contact-us-page/contact-us-page.component'; -import { ForgetPasswordPageComponent } from './page/landing-layout/form-pages/forget-password-page/forget-password-page.component'; +import { CustomersPageComponent } from './page/landing-layout/customers-page/customers-page.component'; +import { + DocsContentPageComponent +} from './page/landing-layout/docs-page/docs-content-page/docs-content-page.component'; +import { DocsPageComponent } from './page/landing-layout/docs-page/docs-page.component'; +import { + ForgetPasswordPageComponent +} from './page/landing-layout/form-pages/forget-password-page/forget-password-page.component'; import { LoginPageComponent } from './page/landing-layout/form-pages/login-page/login-page.component'; -import { ResetPasswordPageComponent } from './page/landing-layout/form-pages/reset-password-page/reset-password-page.component'; +import { + ResetPasswordPageComponent +} from './page/landing-layout/form-pages/reset-password-page/reset-password-page.component'; import { SignUpPageComponent } from './page/landing-layout/form-pages/sign-up-page/sign-up-page.component'; +import { + TwoFactorAuthenticationPageComponent +} from './page/landing-layout/form-pages/two-factor-authentication-page/two-factor-authentication-page.component'; import { HomePageComponent } from './page/landing-layout/home-page/home-page.component'; import { LandingLayoutComponent } from './page/landing-layout/landing-layout.component'; -import { CookiePolicyPageComponent } from './page/landing-layout/policy-pages/cookie-policy-page/cookie-policy-page.component'; -import { PrivacyPolicyPageComponent } from './page/landing-layout/policy-pages/privacy-policy-page/privacy-policy-page.component'; +import { PartnersPageComponent } from './page/landing-layout/partners-page/partners-page.component'; +import { + CookiePolicyPageComponent +} from './page/landing-layout/policy-pages/cookie-policy-page/cookie-policy-page.component'; +import { + PrivacyPolicyPageComponent +} from './page/landing-layout/policy-pages/privacy-policy-page/privacy-policy-page.component'; import { TermsPageComponent } from './page/landing-layout/policy-pages/terms-page/terms-page.component'; import { PricingPageComponent } from './page/landing-layout/pricing-page/pricing-page.component'; import { ProductPageComponent } from './page/landing-layout/product-page/product-page.component'; -import { MaintenancePageComponent } from './page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component'; +import { + MaintenancePageComponent +} from './page/landing-layout/raw-content-pages/maintenance-page/maintenance-page.component'; import { NotFoundPageComponent } from './page/landing-layout/raw-content-pages/not-found-page/not-found-page.component'; -import { SignUpSuccessPageComponent } from './page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component'; -import { VerifyAccountPageComponent } from './page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component'; +import { + SignUpSuccessPageComponent +} from './page/landing-layout/raw-content-pages/sign-up-success-page/sign-up-success-page.component'; +import { + VerifyAccountPageComponent +} from './page/landing-layout/raw-content-pages/verify-account-page/verify-account-page.component'; import { SitemapPageComponent } from './page/landing-layout/sitemap-page/sitemap-page.component'; import { StatusPageComponent } from './page/landing-layout/status-page/status-page.component'; +import { EditProfilePageComponent } from './page/settings-layout/edit-profile-page/edit-profile-page.component'; +import { EditSecurityComponent } from './page/settings-layout/edit-security/edit-security.component'; import { EditThemePageComponent } from './page/settings-layout/edit-theme-page/edit-theme-page.component'; import { SettingsLayoutComponent } from './page/settings-layout/settings-layout.component'; import { CallbackPageComponent } from './page/splash-layout/callback-page/callback-page.component'; -import { ExternalRedirectPageComponent } from './page/splash-layout/external-redirect-page/external-redirect-page.component'; +import { + ExternalRedirectPageComponent +} from './page/splash-layout/external-redirect-page/external-redirect-page.component'; import { SplashLayoutComponent } from './page/splash-layout/splash-layout.component'; -import { CustomersPageComponent } from './page/landing-layout/customers-page/customers-page.component'; -import { AssetCardComponent } from './component/card/asset-card/asset-card.component'; -import { BlogPageComponent } from './page/landing-layout/blog-page/blog-page.component'; -import { BlogCardComponent } from './component/card/blog-card/blog-card.component'; -import { DocsPageComponent } from './page/landing-layout/docs-page/docs-page.component'; -import { DocCardComponent } from './component/card/doc-card/doc-card.component'; -import { PartnersPageComponent } from './page/landing-layout/partners-page/partners-page.component'; -import { BlogHolderCardComponent } from './component/card/blog-holder-card/blog-holder-card.component'; -import { BlogContentPageComponent } from './page/landing-layout/blog-page/blog-content-page/blog-content-page.component'; -import { ScreenshotSwiperComponent } from './component/swiper/screenshot-swiper/screenshot-swiper.component'; -import { TechStackCardComponent } from './component/card/tech-stack-card/tech-stack-card.component'; -import { DocHolderCardComponent } from './component/card/doc-holder-card/doc-holder-cardcomponent'; -import { DocsContentPageComponent } from './page/landing-layout/docs-page/docs-content-page/docs-content-page.component'; -import { StepTimelineCardComponent } from './component/card/timeline-card/step-timeline-card/step-timeline-card.component'; - -FullCalendarModule.registerPlugins( [ - dayGridPlugin, - interactionPlugin -] ); @NgModule( { declarations: [ - OthComponent, + AppComponent, HomePageComponent, LoginPageComponent, DashboardPageComponent, @@ -141,36 +165,27 @@ FullCalendarModule.registerPlugins( [ ForgetPasswordPageComponent, LandingLayoutTopNavComponent, DashboardLayoutSideNavComponent, - BottomNavComponent, + LandingLayoutBottomNavComponent, FooterComponent, SplashLayoutComponent, CallbackPageComponent, - LabelDataComponent, DashboardLayoutTopNavComponent, - LabelWithIconDataComponent, NotFoundPageComponent, - LearnPageComponent, MaintenancePageComponent, CookiePopupComponent, - CreateEventPageComponent, CookiePolicyPageComponent, PrivacyPolicyPageComponent, TermsPageComponent, - PublicProfilePageComponent, - EventDataComponent, SettingsLayoutComponent, SideContentComponent, MyProfilePageComponent, - EventPageComponent, - EventHamburgerMenuComponent, - CalendarComponent, SearchComponent, RateBarComponent, EditThemePageComponent, PricingPageComponent, PricingCardComponent, TestimonialCardComponent, - DropdownMenuComponent, + SettingsDropdownMenuComponent, EditThemePageComponent, ColorChartComponent, ProductPageComponent, @@ -179,39 +194,25 @@ FullCalendarModule.registerPlugins( [ AboutUsPageComponent, PricePlanComponent, ContactUsPageComponent, - AnimatedCodeEditorComponent, - CommandLineComponent, StatusPageComponent, ProductPresentationComponent, - CardComponent, EmployeeCardComponent, ProductPresentationComponent, StatusCardComponent, PolicyCardComponent, TimelineCardComponent, - ButtonComponent, - BrandButtonComponent, - InformationButtonComponent, BrandingPageComponent, PresentationCardComponent, - HeroComponent, - EventButtonComponent, - EventCardComponent, ActivityHistoryCardComponent, ContentLoaderComponent, ImageContentLoaderComponent, TextContentLoaderComponent, BoxContentLoaderComponent, - LedComponent, BusinessPartnerSwiperComponent, PresentationSwiperComponent, SitemapPageComponent, FeatureCardComponent, - SharpTopSvgComponent, - DefaultTopSvgComponent, - CounterBordersTopSvgComponent, TopSvgComponent, - LeafTopSvgComponent, CustomersPageComponent, AssetCardComponent, BlogPageComponent, @@ -226,25 +227,37 @@ FullCalendarModule.registerPlugins( [ DocHolderCardComponent, DocsContentPageComponent, StepTimelineCardComponent, + BottomSvgComponent, + ActivityCardComponent, + ProfileCardComponent, + EditProfilePageComponent, + DashboardLayoutBottomNavComponent, + ContactInformationCardComponent, + EditSecurityComponent, + TwoFactorAuthenticationPageComponent, + AnalyticsEventCardComponent, + PremiumPageComponent, + NotificationsPageComponent, ], imports: [ BrowserModule, AppRoutingModule, ReactiveFormsModule, HttpClientModule, - NgxChartsModule, BrowserAnimationsModule, LayoutModule, ImageCropperModule, - TooltipModule, - DpDatePickerModule, FormsModule, BrowserModule, - FullCalendarModule, SwiperModule, + CardModule, + ButtonModule, + AnimatedCodeEditorModule, + LedModule, + HeroModule, + CountdownModule, ToastrModule.forRoot( { preventDuplicates: true } ), - MarkdownModule.forRoot( { loader: HttpClient }), - GoogleTagManagerModule.forRoot( { id: environment.analytics.googleAnalytics.tag } ), + MarkdownModule.forRoot( { loader: HttpClient } ), ServiceWorkerModule.register( 'ngsw-worker.js', { enabled: [ 'production', 'staging' ].includes( environment.identity ), // Register the ServiceWorker as soon as the app is stable @@ -258,7 +271,7 @@ FullCalendarModule.registerPlugins( [ { provide: HTTP_INTERCEPTORS, useClass: RequestInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: ResponseInterceptor, multi: true } ], - bootstrap: [ OthComponent ] + bootstrap: [ AppComponent ] } ) export class AppModule { } diff --git a/src/app/component/animated-code-editor/animated-code-editor.component.html b/src/app/component/animated-code-editor/animated-code-editor.component.html deleted file mode 100644 index 91a133f3..00000000 --- a/src/app/component/animated-code-editor/animated-code-editor.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-

Terminal

-
-
- -
- -
-
diff --git a/src/app/component/animated-code-editor/animated-code-editor.component.scss b/src/app/component/animated-code-editor/animated-code-editor.component.scss deleted file mode 100644 index 6bc26aaf..00000000 --- a/src/app/component/animated-code-editor/animated-code-editor.component.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use '../../../styles/util/util'; - -.code-editor { - @include util.default-border-radius; - @include util.default-shadow; - - background: var(--card-dark-mode); - width: 100%; - height: 400px; - overflow: auto; - text-align: left; - box-sizing: border-box; - - & .header { - background-color: var(--darker-light-mode); - box-shadow: 0 0 3px 2px var(--shadow-dark-mode); - display: flex; - flex-direction: row; - } - - & .content { - @include util.default-padding-line; - font-family: 'JetBrains Mono', monospace; - } - - & .title { - border-radius: 0; - font-size: 12px; - background: var(--theme-color-darker-3); - text-transform: uppercase; - box-sizing: border-box; - width: 100px; - color: var(--darker-contrast); - font-weight: 500; - text-align: center; - height: 25px; - line-height: 25px; - } - - & .arrow { - width: 8px; - border-top: 12px solid transparent; - border-bottom: 12px solid transparent; - border-left: 12px solid var(--theme-color-darker-3); - margin-left: -0.2px; - } -} diff --git a/src/app/component/animated-code-editor/animated-code-editor.component.spec.ts b/src/app/component/animated-code-editor/animated-code-editor.component.spec.ts deleted file mode 100644 index 292aeed2..00000000 --- a/src/app/component/animated-code-editor/animated-code-editor.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AnimatedCodeEditorComponent } from './animated-code-editor.component'; - -describe( 'AnimatedCodeEditorComponent', () => { - let component: AnimatedCodeEditorComponent; - let fixture: ComponentFixture; - - beforeEach( async () => { - await TestBed.configureTestingModule( { - declarations: [ AnimatedCodeEditorComponent ] - } ) - .compileComponents(); - } ); - - beforeEach( () => { - fixture = TestBed.createComponent( AnimatedCodeEditorComponent ); - component = fixture.componentInstance; - fixture.detectChanges(); - } ); - - it( 'should create', () => { - expect( component ).toBeTruthy(); - } ); -} ); diff --git a/src/app/component/animated-code-editor/animated-code-editor.component.ts b/src/app/component/animated-code-editor/animated-code-editor.component.ts deleted file mode 100644 index 70895937..00000000 --- a/src/app/component/animated-code-editor/animated-code-editor.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - AfterViewInit, - Component, - ComponentFactory, - ComponentFactoryResolver, - Input, - OnChanges, - OnInit, - ViewChild, - ViewContainerRef, -} from '@angular/core'; -import { CommandLine } from 'src/app/model/product/product.model'; -import { CommandLineComponent } from '../command-line/command-line.component'; - -@Component( { - selector: 'app-animated-code-editor', - templateUrl: './animated-code-editor.component.html', - styleUrls: [ './animated-code-editor.component.scss' ], -} ) -export class AnimatedCodeEditorComponent implements OnInit, OnChanges, AfterViewInit { - @ViewChild( 'codeEditorContent', { static: true, read: ViewContainerRef } ) - codeEditorContentRef: ViewContainerRef; - factory: ComponentFactory; - index = 0; - @Input() commandLines: CommandLine[]; - - constructor( private resolver: ComponentFactoryResolver ) { - } - - ngOnInit(): void { - this.initializeComponent(); - } - - initializeComponent = () => { - this.codeEditorContentRef.clear(); - this.index = 0; - this.factory = this.resolver.resolveComponentFactory( CommandLineComponent ); - }; - - ngAfterViewInit(): void { - this.animationTrigger(); - } - - ngOnChanges(): void { - this.initializeComponent(); - this.animationTrigger(); - } - - createComponent = ( commandLine: CommandLine ) => { - if ( this.index < this.commandLines.length ) { - this.index++; - const componentRef = this.codeEditorContentRef.createComponent( - this.factory - ); - componentRef.instance.commandLine = commandLine; - componentRef.instance.animationComplete = this.animationTrigger; - } - }; - - animationTrigger = () => { - console.log( 'Animation triggered with index: ', this.index ); - this.createComponent( this.commandLines[ this.index ] ); - }; -} diff --git a/src/app/component/button/brand-button/brand-button.component.html b/src/app/component/button/brand-button/brand-button.component.html deleted file mode 100644 index 4ad515f2..00000000 --- a/src/app/component/button/brand-button/brand-button.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/src/app/component/button/brand-button/brand-button.component.spec.ts b/src/app/component/button/brand-button/brand-button.component.spec.ts deleted file mode 100644 index f17ccc02..00000000 --- a/src/app/component/button/brand-button/brand-button.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BrandButtonComponent } from './brand-button.component'; - -describe( 'BrandButtonComponent', () => { - let component: BrandButtonComponent; - let fixture: ComponentFixture; - - beforeEach( async () => { - await TestBed.configureTestingModule( { - declarations: [ BrandButtonComponent ] - } ) - .compileComponents(); - } ); - - beforeEach( () => { - fixture = TestBed.createComponent( BrandButtonComponent ); - component = fixture.componentInstance; - fixture.detectChanges(); - } ); - - it( 'should create', () => { - expect( component ).toBeTruthy(); - } ); -} ); diff --git a/src/app/component/button/brand-button/brand-button.component.ts b/src/app/component/button/brand-button/brand-button.component.ts deleted file mode 100644 index 0a92ba3c..00000000 --- a/src/app/component/button/brand-button/brand-button.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component( { - selector: 'app-brand-button', - templateUrl: './brand-button.component.html', - styleUrls: [ './brand-button.component.scss' ] -} ) -export class BrandButtonComponent { - - @Input() icon: string; - @Input() text: string; - - constructor() { - // Intentionally blank - } -} diff --git a/src/app/component/button/button.component.html b/src/app/component/button/button.component.html deleted file mode 100644 index 429d8520..00000000 --- a/src/app/component/button/button.component.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/src/app/component/button/button.component.scss b/src/app/component/button/button.component.scss deleted file mode 100644 index 7490f745..00000000 --- a/src/app/component/button/button.component.scss +++ /dev/null @@ -1,138 +0,0 @@ -@use '../../../styles/util/util'; -@use '../../../styles/social/social'; -@use '../../../styles/information/information'; - -@mixin default-button { - @include util.flex-layout-row; - @include util.flex-center-center; - @include util.default-border-radius; - - padding: 12px; - - background-color: var(--theme-color); - - width: 100%; - min-width: 150px; -} - -@mixin default-icon { - margin-right: 5px; -} - -@mixin default-content { - color: var(--darker-contrast); - font-weight: 400; -} - -@mixin selected-button-shadow { - box-shadow: 0 0 3px 3px var(--theme-color-lighter-1); -} - -.button { - // Include - @include default-button; - - // Position - position: relative; - - // Design - border: none; - cursor: pointer; - - // Aligning - vertical-align: text-bottom; - - // Font - font-weight: 300; - font-size: 14px; - - & .content { - @include default-content; - - & .icon { - @include default-icon; - } - } - - &:hover { - @include util.default-shadow; - } - - &.information-button { - background-color: var(--info); - } - - &.brand-button { - background-color: var(--social); - - &.just-icon { - min-width: 50px; - } - - & .content { - color: white; - } - } - - &.transparent-button { - background-color: transparent; - } - - // Borders - $border-colors: ( - "theme-color": var(--theme-color), - "lighter-contrast": var(--lighter-contrast) - ); - @each $border-color-name, $border-color in $border-colors { - &.#{$border-color-name}-border-color { - border: 1px solid #{$border-color}; - } - } - - // Font Colors - $font-colors: ( - "theme-color": var(--theme-color), - "lighter-contrast": var(--lighter-contrast), - "whitesmoke": whitesmoke - ); - @each $font-color-name, $font-color in $font-colors { - &.#{$font-color-name}-font-color .content { - color: #{$font-color}; - } - } - - // Background Colors - $background-colors: ( - "theme-color-lighter-4": var(--theme-color-lighter-4) - ); - @each $background-color-name, $background-color in $background-colors { - &.#{$background-color-name}-background-color { - background-color: #{$background-color}; - } - } - - // Shadows - &.selected-button-shadow { - @include selected-button-shadow; - } - - &.no-shadow-box { - box-shadow: initial; - } - - // Cursor - &.cursor-not-allowed { - cursor: not-allowed; - } - - // Dark Light Themes - &.disable-dark-mode { - color: var(--contrast-light-mode); - background-color: var(--color-light-mode); - } - - &.disable-light-mode { - color: var(--contrast-dark-mode); - background-color: var(--color-dark-mode); - } -} diff --git a/src/app/component/button/button.component.ts b/src/app/component/button/button.component.ts deleted file mode 100644 index eb678782..00000000 --- a/src/app/component/button/button.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, Input, TemplateRef } from '@angular/core'; - -export const ButtonClasses = { - - roundedBox: 'button-rounded-box', - - transparent: 'transparent-button', - - // Borders - borderAndFontByDefaultTheme: 'border-and-font', - - // Dark Light Mode - disableLightMode: 'disable-light-mode', - disableDarkMode: 'disable-dark-mode' -}; - -@Component( { - selector: 'app-button', - templateUrl: './button.component.html', - styleUrls: [ './button.component.scss' ] -} ) -export class ButtonComponent { - @Input() iconTemplate: TemplateRef; - @Input() textTemplate: TemplateRef; - - @Input() buttonClasses: string[]; - - @Input() icon: string; - @Input() text: string; - - constructor() { - // Intentionally blank - } -} diff --git a/src/app/component/button/event-button/event-button.component.html b/src/app/component/button/event-button/event-button.component.html deleted file mode 100644 index 0981d90b..00000000 --- a/src/app/component/button/event-button/event-button.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/src/app/component/button/event-button/event-button.component.scss b/src/app/component/button/event-button/event-button.component.scss deleted file mode 100644 index 5e7c0d23..00000000 --- a/src/app/component/button/event-button/event-button.component.scss +++ /dev/null @@ -1 +0,0 @@ -/* Intentionally blank */ diff --git a/src/app/component/button/event-button/event-button.component.ts b/src/app/component/button/event-button/event-button.component.ts deleted file mode 100644 index 3530d241..00000000 --- a/src/app/component/button/event-button/event-button.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component( { - selector: 'app-event-button', - templateUrl: './event-button.component.html', - styleUrls: [ './event-button.component.scss' ] -} ) -export class EventButtonComponent { - eventTypes = { - drop: 'lighter-contrast-border-color lighter-contrast-font-color transparent-button', - attended: 'whitesmoke-font-color theme-color-lighter-4-background-color no-shadow-box', - completed: 'whitesmoke-font-color theme-color-lighter-4-background-color no-shadow-box cursor-not-allowed', - inProgress: 'whitesmoke-font-color cursor-not-allowed' - }; - - @Input() icon: string; - @Input() text: string; - @Input() eventType: string; - - constructor() { - // Intentionally blank - } -} diff --git a/src/app/component/button/information-button/information-button.component.html b/src/app/component/button/information-button/information-button.component.html deleted file mode 100644 index c10e876e..00000000 --- a/src/app/component/button/information-button/information-button.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/src/app/component/button/information-button/information-button.component.scss b/src/app/component/button/information-button/information-button.component.scss deleted file mode 100644 index 5e7c0d23..00000000 --- a/src/app/component/button/information-button/information-button.component.scss +++ /dev/null @@ -1 +0,0 @@ -/* Intentionally blank */ diff --git a/src/app/component/button/information-button/information-button.component.ts b/src/app/component/button/information-button/information-button.component.ts deleted file mode 100644 index 88ede7e9..00000000 --- a/src/app/component/button/information-button/information-button.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component( { - selector: 'app-information-button', - templateUrl: './information-button.component.html', - styleUrls: [ './information-button.component.scss' ] -} ) -export class InformationButtonComponent { - - @Input() informationType: any; - @Input() text: string; - - constructor() { - // Intentionally blank - } -} diff --git a/src/app/component/calendar/calendar.component.html b/src/app/component/calendar/calendar.component.html deleted file mode 100644 index c78954dd..00000000 --- a/src/app/component/calendar/calendar.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/component/calendar/calendar.component.scss b/src/app/component/calendar/calendar.component.scss deleted file mode 100644 index 3e2738ab..00000000 --- a/src/app/component/calendar/calendar.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -::ng-deep .fc-event { - cursor: pointer; -} diff --git a/src/app/component/calendar/calendar.component.ts b/src/app/component/calendar/calendar.component.ts deleted file mode 100644 index 392490b9..00000000 --- a/src/app/component/calendar/calendar.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; -import { CalendarOptions } from '@fullcalendar/angular'; - -export interface CalendarEvent { - id: string, - title: string, - backgroundColor: string, - start: string, - end: string -} - -@Component( { - selector: 'app-calendar', - templateUrl: './calendar.component.html', - styleUrls: [ './calendar.component.scss' ] -} ) -export class CalendarComponent implements OnChanges { - @Output() handleEventClick = new EventEmitter(); - @Output() handleDateClick = new EventEmitter(); - - // callback function runs when months are changed by user. - @Output() handleDatesSet = new EventEmitter(); - - @Input() calendarEvents: CalendarEvent[] = []; - - calendarOptions: CalendarOptions; - - ngOnChanges( changes: SimpleChanges ): void { - this.createCalendar(); - } - - public createCalendar() { - this.calendarOptions = { - initialView: 'dayGridMonth', - events: [ ...this.calendarEvents ], - dateClick: ( arg => { - this.handleDateClick.emit( arg ); - } ), - eventClick: ( arg => { - this.handleEventClick.emit( arg ); - } ), - datesSet: ( data => { - this.handleDatesSet.emit( data ); - } ) - }; - } -} diff --git a/src/app/component/card/activity-card/activity-card.component.html b/src/app/component/card/activity-card/activity-card.component.html new file mode 100644 index 00000000..4c59c09b --- /dev/null +++ b/src/app/component/card/activity-card/activity-card.component.html @@ -0,0 +1,21 @@ + + +
+

Recent Activities

+
+
+ +
+
+ activity icon +
+

{{ categories[ event.category ] }}

+

{{ timestampToString( event.timestamp ) }}

+
+
+
+
+
diff --git a/src/app/component/card/activity-card/activity-card.component.scss b/src/app/component/card/activity-card/activity-card.component.scss new file mode 100644 index 00000000..4ae78fbc --- /dev/null +++ b/src/app/component/card/activity-card/activity-card.component.scss @@ -0,0 +1,63 @@ +@use '../../../../styles/util/util'; + +.activity-card { + font-size: 18px; + + & .header { + text-align: left; + padding: 1em 1em 0; + + & i { + color: var(--theme-color); + } + + & p { + color: var(--lighter); + font-weight: 600; + margin-top: 10px; + padding-bottom: 10px; + border-bottom: 2px solid var(--theme-color-lighter-4); + text-align: center; + } + } + + & .body { + text-align: left; + padding: 0 1em 1em; + height: -webkit-fit-content; + + & .row { + @include util.flex-layout-row; + + padding: 10px 5px; + border-bottom: 2px solid var(--theme-color-lighter-8); + + & img { + width: 40px; + height: 40px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + } + + & .column { + @include util.flex-layout-column; + margin-left: 5px; + + padding: 0 10px; + + p { + color: var(--lighter); + font-weight: 300; + padding-bottom: 5px; + text-overflow: ellipsis; + overflow: auto; + } + + & .date { + font-size: 15px; + } + } + } + } +} diff --git a/src/app/component/button/button.component.spec.ts b/src/app/component/card/activity-card/activity-card.component.spec.ts similarity index 53% rename from src/app/component/button/button.component.spec.ts rename to src/app/component/card/activity-card/activity-card.component.spec.ts index 173fa09a..f4096388 100644 --- a/src/app/component/button/button.component.spec.ts +++ b/src/app/component/card/activity-card/activity-card.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ButtonComponent } from './button.component'; +import { ActivityCardComponent } from './activity-card.component'; -describe( 'ButtonComponent', () => { - let component: ButtonComponent; - let fixture: ComponentFixture; +describe( 'ActivityCardComponent', () => { + let component: ActivityCardComponent; + let fixture: ComponentFixture; beforeEach( async () => { await TestBed.configureTestingModule( { - declarations: [ ButtonComponent ] + declarations: [ ActivityCardComponent ] } ) .compileComponents(); } ); beforeEach( () => { - fixture = TestBed.createComponent( ButtonComponent ); + fixture = TestBed.createComponent( ActivityCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); } ); diff --git a/src/app/component/card/activity-card/activity-card.component.ts b/src/app/component/card/activity-card/activity-card.component.ts new file mode 100644 index 00000000..05bac779 --- /dev/null +++ b/src/app/component/card/activity-card/activity-card.component.ts @@ -0,0 +1,15 @@ +import { Component, Input } from '@angular/core'; + +@Component( { + selector: 'app-activity-card', + templateUrl: './activity-card.component.html', + styleUrls: [ './activity-card.component.scss' ] +} ) +export class ActivityCardComponent { + @Input() events: any[] = []; + @Input() categories: any = {}; + + timestampToString( timestamp: any ): string { + return new Date( timestamp ).toLocaleString(); + } +} diff --git a/src/app/component/card/activity-history-card/activity-history-card.component.html b/src/app/component/card/activity-history-card/activity-history-card.component.html index 40ea907a..45fae3a9 100644 --- a/src/app/component/card/activity-history-card/activity-history-card.component.html +++ b/src/app/component/card/activity-history-card/activity-history-card.component.html @@ -1,4 +1,4 @@ - @@ -25,4 +25,4 @@ - + diff --git a/src/app/component/card/activity-history-card/activity-history-card.component.scss b/src/app/component/card/activity-history-card/activity-history-card.component.scss index 6fa50cfc..aae6e5c6 100644 --- a/src/app/component/card/activity-history-card/activity-history-card.component.scss +++ b/src/app/component/card/activity-history-card/activity-history-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; @use '../../color-chart/color-chart.component'; .activity-history-card { diff --git a/src/app/component/card/activity-history-card/activity-history-card.component.ts b/src/app/component/card/activity-history-card/activity-history-card.component.ts index 229d968a..1c1af2c3 100644 --- a/src/app/component/card/activity-history-card/activity-history-card.component.ts +++ b/src/app/component/card/activity-history-card/activity-history-card.component.ts @@ -34,7 +34,7 @@ export class ActivityHistoryCardComponent implements OnChanges { } - ngOnChanges( changes: SimpleChanges ): void { + ngOnChanges( _changes: SimpleChanges ): void { this.activitySumByDate = new Map(); this.days = new Array( 365 ); diff --git a/src/app/component/card/analytics-event-card/analytics-event-card.component.html b/src/app/component/card/analytics-event-card/analytics-event-card.component.html new file mode 100644 index 00000000..24feb801 --- /dev/null +++ b/src/app/component/card/analytics-event-card/analytics-event-card.component.html @@ -0,0 +1,64 @@ + + +
+
+

Recent Activities

+
+
+
+ + +
+
+ + + + +
+
+
+
+ +
+
+ activity icon +
+

{{ mappedCategories[ event.category ] }}

+

{{ timestampToString( event.timestamp ) }}

+
+
+

+ No results found. +

+
+
+ + + +
diff --git a/src/app/component/card/analytics-event-card/analytics-event-card.component.scss b/src/app/component/card/analytics-event-card/analytics-event-card.component.scss new file mode 100644 index 00000000..25302d8c --- /dev/null +++ b/src/app/component/card/analytics-event-card/analytics-event-card.component.scss @@ -0,0 +1,219 @@ +@use '../../../../styles/util/util'; + +.analytics-event-card { + + font-size: 18px; + + & .header { + display: flex; + flex-direction: column; + text-align: left; + padding: 1em 1em 0; + + & .upper-header-wrapper { + display: flex; + justify-content: space-between; + align-items: center; + + & i { + color: var(--theme-color); + } + + & h3 { + color: var(--lighter); + font-weight: 600; + font-size: 19px; + margin-top: 10px; + padding-bottom: 10px; + border-bottom: 2px solid var(--theme-color-lighter-4); + text-align: center; + width: 100%; + } + } + + & .filters-wrapper { + padding: 15px; + display: flex; + justify-content: space-around; + height: 50px; + + & .category-filter-wrapper, & .date-filter-wrapper { + @include util.default-border-radius; + @include util.default-shadow; + // border: 1px solid var(--lighter-contrast); + + & i { + color: var(--color); + } + } + + & .category-filter-wrapper { + display: flex; + align-items: center; + padding-left: 25px; + + & select { + border: initial; + -webkit-appearance: borderless-attachment; + -moz-appearance: none; + -o-appearance: none; + appearance: none; + } + + & select::-ms-expand { + display: none; + } + + & i { + padding-right: 7px; + } + } + + & .date-filter-wrapper { + display: flex; + align-items: center; + margin-left: 25px; + padding-left: 25px; + + & p { + white-space: nowrap; + } + + & input { + border-bottom: initial; + } + + } + } + } + + & .body { + @include util.flex-layout-row; + + flex-wrap: wrap; + text-align: left; + padding: 0 2em 1em; + height: -webkit-fit-content; + margin-top: 40px; + + & .row { + @include util.flex-layout-row; + width: 33.333%; + + box-sizing: border-box; + padding: 10px 15px; + border-bottom: 2px solid var(--theme-color-lighter-8); + align-items: center; + + & img { + width: 40px; + height: 40px; + margin-top: auto; + margin-bottom: auto; + } + + & .column { + @include util.flex-layout-column; + margin-left: 5px; + margin-right: auto; + padding: 0 10px; + + p { + color: var(--lighter); + font-weight: 300; + padding-bottom: 5px; + text-overflow: ellipsis; + overflow: auto; + } + + & .date { + font-size: 15px; + } + } + } + + & .empty-body { + margin-left: auto; + margin-right: auto; + color: var(--lighter-contrast); + padding-top: 20px; + padding-bottom: 20px; + } + } + + & .footer { + @include util.flex-layout-row; + + justify-content: space-between; + align-items: center; + + box-sizing: border-box; + + padding: 1em 2.5em 2em; + width: 100%; + margin-left: auto; + color: var(--lighter-contrast); + + & .page-routing-wrapper { + display: flex; + font-size: 20px; + align-items: center; + width: -webkit-fit-content; + + & * { + padding: 5px; + } + + & span { + color: var(--lighter); + } + + & i { + cursor: initial; + color: var(--lighter-contrast); + + &.active-routing-item { + color: var(--theme-color); + cursor: pointer; + } + } + } + } +} + +@media only screen and (max-width: 999px) { + .analytics-event-card { + & .header { + & .filters-wrapper { + flex-direction: column; + height: -webkit-fit-content; + padding: 0; + margin-top: 20px; + + & .category-filter-wrapper { + & select { + white-space: break-spaces; + } + } + + & .date-filter-wrapper { + flex-wrap: wrap; + margin-top: 20px; + margin-left: 0; + + & input { + width: -webkit-fit-content; + } + } + } + } + + & .body { + & .row { + width: 100%; + padding-left: 0; + padding-right: 0; + } + } + } +} diff --git a/src/app/component/label/deprecated/event-hamburger-menu/event-hamburger-menu.component.spec.ts b/src/app/component/card/analytics-event-card/analytics-event-card.component.spec.ts similarity index 51% rename from src/app/component/label/deprecated/event-hamburger-menu/event-hamburger-menu.component.spec.ts rename to src/app/component/card/analytics-event-card/analytics-event-card.component.spec.ts index 88409d57..6c5ec7ea 100644 --- a/src/app/component/label/deprecated/event-hamburger-menu/event-hamburger-menu.component.spec.ts +++ b/src/app/component/card/analytics-event-card/analytics-event-card.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { EventHamburgerMenuComponent } from './event-hamburger-menu.component'; +import { AnalyticsEventCardComponent } from './analytics-event-card.component'; -describe( 'EventHamburgerMenuComponent', () => { - let component: EventHamburgerMenuComponent; - let fixture: ComponentFixture; +describe( 'AnalyticsEventCardComponent', () => { + let component: AnalyticsEventCardComponent; + let fixture: ComponentFixture; beforeEach( async () => { await TestBed.configureTestingModule( { - declarations: [ EventHamburgerMenuComponent ] + declarations: [ AnalyticsEventCardComponent ] } ) .compileComponents(); } ); beforeEach( () => { - fixture = TestBed.createComponent( EventHamburgerMenuComponent ); + fixture = TestBed.createComponent( AnalyticsEventCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); } ); diff --git a/src/app/component/card/analytics-event-card/analytics-event-card.component.ts b/src/app/component/card/analytics-event-card/analytics-event-card.component.ts new file mode 100644 index 00000000..91eb56c1 --- /dev/null +++ b/src/app/component/card/analytics-event-card/analytics-event-card.component.ts @@ -0,0 +1,138 @@ +import { Component, OnInit } from '@angular/core'; +import { AnalyticsService } from 'src/app/service/analytics/analytics.service'; + +@Component( { + selector: 'app-analytics-event-card', + templateUrl: './analytics-event-card.component.html', + styleUrls: [ './analytics-event-card.component.scss' ] +} ) +export class AnalyticsEventCardComponent implements OnInit { + + paginationConfig = { + skip: 0, + totalEventCount: undefined, + currentPageCount: 1, + limit: this.analyticsService.configs.editSecurityLimit, + shouldShowNavigationBars: false, + hasNextPage: false, + hasPreviousPage: false + }; + + selectedCategory: any; + selectedStartDate: Date; + selectedEndDate: Date; + + categories: []; + mappedCategories: any; + + currentDate = new Date(); + + events: any[]; + + constructor( + // private scrollService: InfiniteScrollingService, + private analyticsService: AnalyticsService + ) { + const startDate = new Date(); + startDate.setDate( startDate.getDate() - 7 ); + + this.selectedStartDate = startDate; + this.selectedEndDate = new Date(); + } + + ngOnInit(): void { + + this.analyticsService.getCategories().subscribe( response => { + this.categories = response; + this.mappedCategories = this.analyticsService.convertCategoriesToMappedObject( response ); + + if ( response?.length > 0 ) { + this.selectedCategory = response[ 0 ]; + } + + this.fetchAnalyticsEvent( this.paginationConfig.skip, this.paginationConfig.limit, () => { + // Intentionally blank + } ); + } ); + } + + fetchAnalyticsEvent( skip: number, limit: number, callback: ( _: void ) => void ) { + this.analyticsService.getEvents( + this.selectedCategory.key, + this.selectedStartDate?.getTime(), + this.selectedEndDate?.getTime(), + skip, + limit + ).subscribe( response => { + this.paginationConfig.totalEventCount = response.meta.count; + if ( response.meta.limit ) { + this.paginationConfig.limit = response.meta.limit; + } else { + this.paginationConfig.limit = this.analyticsService.configs.editSecurityLimit; + } + + this.paginationConfig.skip = skip; + this.setShouldShowNextAndPrevious(); + + this.events = response.data; + callback(); + } ); + } + + timestampToString( timestamp: any ): string { + return new Date( timestamp ).toLocaleString(); + } + + goToNextPage() { + if ( !this.paginationConfig.hasNextPage ) { + return; + } + + this.fetchAnalyticsEvent( this.paginationConfig.skip + this.paginationConfig.limit, this.paginationConfig.limit, () => { + this.paginationConfig.currentPageCount += 1; + } ); + } + + goToPreviousPage() { + if ( !this.paginationConfig.hasPreviousPage ) { + return; + } + + this.fetchAnalyticsEvent( this.paginationConfig.skip - this.paginationConfig.limit, this.paginationConfig.limit, () => { + this.paginationConfig.currentPageCount -= 1; + } ); + } + + setShouldShowNextAndPrevious(): void { + this.paginationConfig.hasNextPage = this.paginationConfig.skip + this.paginationConfig.limit < this.paginationConfig.totalEventCount; + this.paginationConfig.hasPreviousPage = this.paginationConfig.skip - this.paginationConfig.limit >= 0; + + this.paginationConfig.shouldShowNavigationBars = this.paginationConfig.hasNextPage || this.paginationConfig.hasPreviousPage; + } + + changeCategory( event: any ): void { + const selectedIndex = event.srcElement.selectedIndex; + this.selectedCategory = this.categories[ selectedIndex ]; + this.fetchAnalyticsEvent( 0, this.paginationConfig.limit, () => { + this.paginationConfig.currentPageCount = 1; + } ); + } + + changeStartDate( event: any ): void { + const selectedDate = event.srcElement.valueAsDate; + console.log( 'startDate: ', selectedDate ); + this.selectedStartDate = selectedDate; + this.fetchAnalyticsEvent( 0, this.paginationConfig.limit, () => { + this.paginationConfig.currentPageCount = 1; + } ); + } + + changeEndDate( event: any ): void { + const selectedDate = event.srcElement.valueAsDate; + console.log( 'endDate: ', selectedDate ); + this.selectedEndDate = selectedDate; + this.fetchAnalyticsEvent( 0, this.paginationConfig.limit, () => { + this.paginationConfig.currentPageCount = 1; + } ); + } +} diff --git a/src/app/component/card/asset-card/asset-card.component.html b/src/app/component/card/asset-card/asset-card.component.html index 600aa55b..5260390f 100644 --- a/src/app/component/card/asset-card/asset-card.component.html +++ b/src/app/component/card/asset-card/asset-card.component.html @@ -1,4 +1,4 @@ - @@ -16,5 +16,4 @@ - - + diff --git a/src/app/component/card/asset-card/asset-card.component.scss b/src/app/component/card/asset-card/asset-card.component.scss index 13927279..a7a9a6a5 100644 --- a/src/app/component/card/asset-card/asset-card.component.scss +++ b/src/app/component/card/asset-card/asset-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .asset-card { diff --git a/src/app/component/card/asset-card/asset-card.component.spec.ts b/src/app/component/card/asset-card/asset-card.component.spec.ts index 1132b069..71c9f4dc 100644 --- a/src/app/component/card/asset-card/asset-card.component.spec.ts +++ b/src/app/component/card/asset-card/asset-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AssetCardComponent } from './asset-card.component'; -describe('AssetCardComponent', () => { +describe( 'AssetCardComponent', () => { let component: AssetCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ AssetCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(AssetCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( AssetCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/blog-card/blog-card.component.html b/src/app/component/card/blog-card/blog-card.component.html index 72aaf56e..b9ecae17 100644 --- a/src/app/component/card/blog-card/blog-card.component.html +++ b/src/app/component/card/blog-card/blog-card.component.html @@ -1,4 +1,4 @@ - @@ -16,7 +16,7 @@
- +

{{ date }}

@@ -25,7 +25,7 @@ -
+ diff --git a/src/app/component/card/blog-card/blog-card.component.scss b/src/app/component/card/blog-card/blog-card.component.scss index 34da666e..ea4b5b5e 100644 --- a/src/app/component/card/blog-card/blog-card.component.scss +++ b/src/app/component/card/blog-card/blog-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .blog-card { diff --git a/src/app/component/card/blog-card/blog-card.component.spec.ts b/src/app/component/card/blog-card/blog-card.component.spec.ts index 700da4b5..54af70c5 100644 --- a/src/app/component/card/blog-card/blog-card.component.spec.ts +++ b/src/app/component/card/blog-card/blog-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BlogCardComponent } from './blog-card.component'; -describe('BlogCardComponent', () => { +describe( 'BlogCardComponent', () => { let component: BlogCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ BlogCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(BlogCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( BlogCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/blog-holder-card/blog-holder-card.component.html b/src/app/component/card/blog-holder-card/blog-holder-card.component.html index fbb2ce03..6dc34a86 100644 --- a/src/app/component/card/blog-holder-card/blog-holder-card.component.html +++ b/src/app/component/card/blog-holder-card/blog-holder-card.component.html @@ -1,9 +1,9 @@ -
- author + author

{{ blog.title }}

@@ -19,10 +19,10 @@ -
+ diff --git a/src/app/component/card/blog-holder-card/blog-holder-card.component.scss b/src/app/component/card/blog-holder-card/blog-holder-card.component.scss index b1632300..cb80a18e 100644 --- a/src/app/component/card/blog-holder-card/blog-holder-card.component.scss +++ b/src/app/component/card/blog-holder-card/blog-holder-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .blog-holder-card { & .header { @@ -20,10 +20,8 @@ & img { @include util.default-border-radius-image; - // Color background-color: var(--card); - // Design border: 2px solid var(--shadow-lighter); box-shadow: 0 -6px 15px -7px var(--shadow); } diff --git a/src/app/component/card/blog-holder-card/blog-holder-card.component.spec.ts b/src/app/component/card/blog-holder-card/blog-holder-card.component.spec.ts index acdfbc15..3fc391e3 100644 --- a/src/app/component/card/blog-holder-card/blog-holder-card.component.spec.ts +++ b/src/app/component/card/blog-holder-card/blog-holder-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BlogHolderCardComponent } from './blog-holder-card.component'; -describe('BlogHolderCardComponent', () => { +describe( 'BlogHolderCardComponent', () => { let component: BlogHolderCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ BlogHolderCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(BlogHolderCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( BlogHolderCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/blog-holder-card/blog-holder-card.component.ts b/src/app/component/card/blog-holder-card/blog-holder-card.component.ts index b5c7b84a..b71effda 100644 --- a/src/app/component/card/blog-holder-card/blog-holder-card.component.ts +++ b/src/app/component/card/blog-holder-card/blog-holder-card.component.ts @@ -1,11 +1,11 @@ import { Component, Input } from '@angular/core'; import { Blog } from 'src/app/model/blog/blog.model'; -@Component({ +@Component( { selector: 'app-blog-holder-card', templateUrl: './blog-holder-card.component.html', - styleUrls: ['./blog-holder-card.component.scss'], -}) + styleUrls: [ './blog-holder-card.component.scss' ], +} ) export class BlogHolderCardComponent { @Input() blog: Blog = { title: '', diff --git a/src/app/component/card/card.component.html b/src/app/component/card/card.component.html deleted file mode 100644 index 27034de8..00000000 --- a/src/app/component/card/card.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
- - - - - - - - -
- {{ header }} -
-
- - - - - -
- {{ body }} -
-
- - - - - - - - - - - - -
-
-
diff --git a/src/app/component/card/card.component.scss b/src/app/component/card/card.component.scss deleted file mode 100644 index 00b74e9f..00000000 --- a/src/app/component/card/card.component.scss +++ /dev/null @@ -1,184 +0,0 @@ -@use '../../../styles/util/util'; -@use '../../../styles/ribbon/ribbon'; - -@mixin card-header-width-sm { - max-width: 92%; - min-width: 92%; - width: 92%; -} - -@mixin default-card { - @include util.default-shadow; - - box-sizing: border-box; - background-color: var(--card); -} - -@mixin default-header { - // Include - @include util.flex-center-center; - @include util.flex-layout-column; - @include util.margin-x-auto; - @include util.default-shadow; - @include util.default-border-radius; - - box-sizing: border-box; - - // Position - z-index: 10; - - // Design - overflow: hidden; - width: 100%; - padding: 15px 0; -} - -@mixin default-body { - // Include - @include util.flex-center-center; - @include util.flex-layout-column; - @include util.margin-x-auto; - - // Design - box-sizing: border-box; - min-height: 180px; -} - -@mixin default-footer { - @include util.flex-center-center; - @include util.flex-layout-column; - @include util.margin-x-auto; - - // Design - box-sizing: border-box; - width: 100%; - min-height: 70px; - border-top: { - width: 2px; - style: solid; - } -} - -@mixin default-footer-border-color { - border-color: var(--darker-contrast); -} - -@mixin default-bottom-wrapper { - @include util.default-border-radius; - @include util.default-height-bottom-line; - - // Position - position: absolute; - z-index: 9; - bottom: 0; - right: 0; - - // Color - background-color: var(--darker-contrast); - - // Design - overflow: hidden; - width: 100%; -} - -.card { - // Include - @include util.flex-layout-column; - @include default-card; - @include util.default-border-radius; - - // Position - position: relative; - - // Color - color: var(--contrast); - - & .header { - @include default-header; - } - - & .body { - @include default-body; - } - - & .footer { - @include default-footer; - @include default-footer-border-color; - } - - & .bottom-wrapper { - @include default-bottom-wrapper; - } - - &.transparent-card { - background-color: transparent; - box-shadow: initial; - } -} - -.cards-wrapper, .flexible-cards-wrapper { - @include util.flex-center-center; - @include util.margin-x-auto; - - padding-bottom: 120px; - box-sizing: border-box; - text-align: center; - - & > * { - margin-top: 80px; - } -} - -.cards-wrapper { - width: 100%; -} - -@media only screen and (max-width: 999px) { - - .cards-wrapper, .flexible-cards-wrapper { - @include util.flex-layout-column; - - padding: 50px 0; - - font-size: 18px; - - & > * { - width: 94vw; - - &:first-child { - margin-top: 0; - } - } - } -} - -@media only screen and (min-width: 1000px) { - .cards-wrapper, .flexible-cards-wrapper { - @include util.flex-layout-row; - - flex-wrap: wrap; - font-size: 18px; - padding-top: 20px; - - & > * { - width: 300px; - - margin: { - left: 15px; - right: 15px; - } - } - } - - .cards-wrapper { - width: 1000px; - } - - .flexible-cards-wrapper { - @include util.flex-layout-row; - - justify-content: center; - - width: 85vw; - } -} diff --git a/src/app/component/card/card.component.ts b/src/app/component/card/card.component.ts deleted file mode 100644 index 9d618108..00000000 --- a/src/app/component/card/card.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, TemplateRef } from '@angular/core'; -import { Ribbon } from '../../model/ribbon/ribbon.model'; - -@Component( { - selector: 'app-card', - templateUrl: './card.component.html', - styleUrls: [ './card.component.scss' ] -} ) -export class CardComponent { - @Input() headerTemplate: TemplateRef; - @Input() bodyTemplate: TemplateRef; - @Input() footerTemplate: TemplateRef; - @Input() bottomWrapperTemplate: TemplateRef; - - @Input() cardClass: string; - - @Input() header: string; - @Input() body: string; - @Input() footer: string; - - @Input() ribbon: Ribbon; - - constructor() { - // Intentionally blank - } -} diff --git a/src/app/component/card/contact-information-card/contact-information-card.component.html b/src/app/component/card/contact-information-card/contact-information-card.component.html new file mode 100644 index 00000000..eb98b35b --- /dev/null +++ b/src/app/component/card/contact-information-card/contact-information-card.component.html @@ -0,0 +1,40 @@ + + + + + + diff --git a/src/app/component/card/contact-information-card/contact-information-card.component.scss b/src/app/component/card/contact-information-card/contact-information-card.component.scss new file mode 100644 index 00000000..899e6ec6 --- /dev/null +++ b/src/app/component/card/contact-information-card/contact-information-card.component.scss @@ -0,0 +1,55 @@ +@use '../../../../styles/util/util'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; + +.contact-information-card { + & .body { + @include util.default-padding-line; + @include card.default-body; + + text-align: center; + width: 100%; + + & .info-line { + @include util.flex-layout-row; + align-self: flex-start; + margin-top: 10px; + + & .title { + font-weight: 500; + text-align: right; + min-width: 20px; + } + + & .info { + text-align: left; + } + } + + & p { + color: var(--color); + font-size: 18px; + margin-left: 15px; + + & i { + color: var(--theme-color); + size: 16px; + } + } + + & a { + font-size: 18px; + margin-left: 15px; + color: var(--theme-color); + } + + & .map { + margin-top: 20px; + width: 90%; + + & iframe { + @include util.default-border-radius; + @include util.default-shadow; + } + } + } +} diff --git a/src/app/component/card/contact-information-card/contact-information-card.component.spec.ts b/src/app/component/card/contact-information-card/contact-information-card.component.spec.ts new file mode 100644 index 00000000..5c343a92 --- /dev/null +++ b/src/app/component/card/contact-information-card/contact-information-card.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContactInformationCardComponent } from './contact-information-card.component'; + +describe( 'ContactInformationCardComponent', () => { + let component: ContactInformationCardComponent; + let fixture: ComponentFixture; + + beforeEach( async () => { + await TestBed.configureTestingModule( { + declarations: [ ContactInformationCardComponent ] + } ) + .compileComponents(); + } ); + + beforeEach( () => { + fixture = TestBed.createComponent( ContactInformationCardComponent ); + component = fixture.componentInstance; + fixture.detectChanges(); + } ); + + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/contact-information-card/contact-information-card.component.ts b/src/app/component/card/contact-information-card/contact-information-card.component.ts new file mode 100644 index 00000000..1bda8102 --- /dev/null +++ b/src/app/component/card/contact-information-card/contact-information-card.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { CONTACT_INFO } from 'src/app/data/contact-info/contact-info.data'; + +@Component( { + selector: 'app-contact-information-card', + templateUrl: './contact-information-card.component.html', + styleUrls: [ './contact-information-card.component.scss' ] +} ) +export class ContactInformationCardComponent { + CONTACT_INFO = CONTACT_INFO; + + constructor() { + // Intentionally blank + } +} diff --git a/src/app/component/card/doc-card/doc-card.component.html b/src/app/component/card/doc-card/doc-card.component.html index d4b05808..1ccc7f9d 100644 --- a/src/app/component/card/doc-card/doc-card.component.html +++ b/src/app/component/card/doc-card/doc-card.component.html @@ -1,4 +1,4 @@ - @@ -16,7 +16,7 @@
- +

{{ date }}

@@ -25,7 +25,7 @@ -
+ diff --git a/src/app/component/card/doc-card/doc-card.component.scss b/src/app/component/card/doc-card/doc-card.component.scss index 7e2fd61e..20826739 100644 --- a/src/app/component/card/doc-card/doc-card.component.scss +++ b/src/app/component/card/doc-card/doc-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .doc-card { diff --git a/src/app/component/card/doc-card/doc-card.component.spec.ts b/src/app/component/card/doc-card/doc-card.component.spec.ts index bb4cf7c8..fd766dce 100644 --- a/src/app/component/card/doc-card/doc-card.component.spec.ts +++ b/src/app/component/card/doc-card/doc-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DocCardComponent } from './doc-card.component'; -describe('DocCardComponent', () => { +describe( 'DocCardComponent', () => { let component: DocCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ DocCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(DocCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( DocCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/doc-holder-card/doc-holder-card.component.html b/src/app/component/card/doc-holder-card/doc-holder-card.component.html index d5d27277..fe5ce5ea 100644 --- a/src/app/component/card/doc-holder-card/doc-holder-card.component.html +++ b/src/app/component/card/doc-holder-card/doc-holder-card.component.html @@ -1,9 +1,9 @@ -
- doc + doc

{{ doc.title }}

@@ -19,10 +19,10 @@ -
+ diff --git a/src/app/component/card/doc-holder-card/doc-holder-card.component.scss b/src/app/component/card/doc-holder-card/doc-holder-card.component.scss index 3d52f66f..68bd1291 100644 --- a/src/app/component/card/doc-holder-card/doc-holder-card.component.scss +++ b/src/app/component/card/doc-holder-card/doc-holder-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .doc-holder-card { & .header { @@ -20,10 +20,8 @@ & img { @include util.default-border-radius-image; - // Color background-color: var(--card); - // Design border: 2px solid var(--shadow-lighter); box-shadow: 0 -6px 15px -7px var(--shadow); } diff --git a/src/app/component/card/doc-holder-card/doc-holder-card.component.spec.ts b/src/app/component/card/doc-holder-card/doc-holder-card.component.spec.ts index ac8dc08f..c6424acc 100644 --- a/src/app/component/card/doc-holder-card/doc-holder-card.component.spec.ts +++ b/src/app/component/card/doc-holder-card/doc-holder-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DocHolderCardComponent } from './doc-holder-cardcomponent'; -describe('DocCardHolderComponent', () => { +describe( 'DocCardHolderComponent', () => { let component: DocHolderCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ DocHolderCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(DocHolderCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( DocHolderCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/doc-holder-card/doc-holder-cardcomponent.ts b/src/app/component/card/doc-holder-card/doc-holder-cardcomponent.ts index f828ff33..d4b95c88 100644 --- a/src/app/component/card/doc-holder-card/doc-holder-cardcomponent.ts +++ b/src/app/component/card/doc-holder-card/doc-holder-cardcomponent.ts @@ -1,11 +1,11 @@ import { Component, Input } from '@angular/core'; import { Doc } from 'src/app/model/doc/doc.model'; -@Component({ +@Component( { selector: 'app-doc-holder-card', templateUrl: './doc-holder-card.component.html', - styleUrls: ['./doc-holder-card.component.scss'], -}) + styleUrls: [ './doc-holder-card.component.scss' ], +} ) export class DocHolderCardComponent { @Input() doc: Doc = { title: '', diff --git a/src/app/component/card/employee-card/employee-card.component.html b/src/app/component/card/employee-card/employee-card.component.html index 25d7cf9e..c6c3fed5 100644 --- a/src/app/component/card/employee-card/employee-card.component.html +++ b/src/app/component/card/employee-card/employee-card.component.html @@ -1,4 +1,4 @@ - @@ -50,4 +50,4 @@ - + diff --git a/src/app/component/card/employee-card/employee-card.component.scss b/src/app/component/card/employee-card/employee-card.component.scss index e9c71c25..5ab843ba 100644 --- a/src/app/component/card/employee-card/employee-card.component.scss +++ b/src/app/component/card/employee-card/employee-card.component.scss @@ -1,27 +1,11 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .employee-card { & .header { - // Design margin-top: -50px; text-align: center; align-self: center; - - & .profile-image { - @include util.margin-x-auto; - @include util.default-border-radius-image; - - // Color - background-color: var(--card); - - // Design - border: 2px solid var(--shadow-lighter); - box-shadow: 0 -6px 15px -7px var(--shadow); - width: 120px; - height: 120px; - padding: 5px; - } } & .body { @@ -29,12 +13,10 @@ justify-content: flex-start; - // Design min-height: 265px; padding: 10px 20px 20px; & .name { - // Design font: { size: 21px; weight: 500; @@ -42,18 +24,14 @@ } & .title { - // Color color: var(--lighter-contrast); - // Design font-size: 18px; } & .bio { - // Color color: var(--lighter); - // Design font-size: 17px; margin-top: 10px; text-overflow: ellipsis; @@ -67,15 +45,12 @@ @include util.flex-layout-row; & i { - // Color color: var(--theme-color-lighter-6); - // Design margin: 0 3px; font-size: 27px; &:hover { - // Color color: var(--theme-color); } } diff --git a/src/app/component/card/event-card/event-card.component.html b/src/app/component/card/event-card/event-card.component.html deleted file mode 100644 index bce4c6e9..00000000 --- a/src/app/component/card/event-card/event-card.component.html +++ /dev/null @@ -1,1650 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
diff --git a/src/app/component/card/event-card/event-card.component.scss b/src/app/component/card/event-card/event-card.component.scss deleted file mode 100644 index c3eabb2d..00000000 --- a/src/app/component/card/event-card/event-card.component.scss +++ /dev/null @@ -1,43 +0,0 @@ -.event-card { - & .header { - filter: opacity(70%); - cursor: pointer; - - &:hover { - filter: opacity(100%); - } - - &.no-hover:hover { - transform: initial; - transition: initial; - filter: initial; - } - } - - &:hover { - transform: scale(1.03); - transition: transform .5s; - } - - &.no-hover:hover { - transform: initial; - transition: initial; - filter: initial; - } -} - -@media only screen and (max-width: 999px) { - .event-card { - & .header { - width: 75%; - } - } -} - -@media only screen and (min-width: 1000px) { - .event-card { - & .header { - width: 90%; - } - } -} diff --git a/src/app/component/card/event-card/event-card.component.spec.ts b/src/app/component/card/event-card/event-card.component.spec.ts deleted file mode 100644 index f46eef50..00000000 --- a/src/app/component/card/event-card/event-card.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { EventCardComponent } from './event-card.component'; - -describe( 'NewEventCardComponent', () => { - let component: EventCardComponent; - let fixture: ComponentFixture; - - beforeEach( async () => { - await TestBed.configureTestingModule( { - declarations: [ EventCardComponent ] - } ) - .compileComponents(); - } ); - - beforeEach( () => { - fixture = TestBed.createComponent( EventCardComponent ); - component = fixture.componentInstance; - fixture.detectChanges(); - } ); - - it( 'should create', () => { - expect( component ).toBeTruthy(); - } ); -} ); diff --git a/src/app/component/card/event-card/event-card.component.ts b/src/app/component/card/event-card/event-card.component.ts deleted file mode 100644 index 14900739..00000000 --- a/src/app/component/card/event-card/event-card.component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { Router } from '@angular/router'; -import { DEFAULT_RIBBON, EVENT_RIBBONS } from 'src/app/data/ribbon/ribbon.data'; -import { URLS } from '../../../data/navigation/navigation.data'; -import { BusinessLogicService } from '../../../service/business-logic/business-logic.service'; - -@Component( { - selector: 'app-event-card', - templateUrl: './event-card.component.html', - styleUrls: [ './event-card.component.scss' ] -} ) -export class EventCardComponent implements OnInit { - DEFAULT_RIBBON = DEFAULT_RIBBON; - EVENT_RIBBONS = EVENT_RIBBONS; - - username: string; - - @Input() event: any; - @Input() isPublicPage = false; - @Input() isEditable = false; - @Input() fillLayout = false; - @Input() maxHeight = false; - @Input() addMarginToDescription = false; - @Input() profileImg; - @Input() centeredTitle = false; - @Input() showCalendar = true; - @Input() markAsCompleted = false; - @Input() inProgress = false; - @Input() showHamburgerMenu = true; - @Input() showRateBar = false; - @Input() completed = false; - - @Output() itemIdForFillingForm = new EventEmitter(); - @Output() markAsCompletedButtonClicked = new EventEmitter(); - @Output() rateButtonClicked = new EventEmitter(); - - constructor( - private router: Router, - private businessLogicService: BusinessLogicService - ) { - } - - ngOnInit(): void { - this.businessLogicService.userInfo.subscribe( userInfo => { - this.username = userInfo?.username; - } ); - } - - routeToEvent() { - this.router.navigate( [ URLS.dashboard.event ], { queryParams: { event_id: this.event._id } } ); - } - - emitIdForFillingForm( event ): void { - this.itemIdForFillingForm.emit( event ); - } - - emitIdForCompletedButton( event ): void { - this.markAsCompletedButtonClicked.emit( event ); - } -} diff --git a/src/app/component/card/feature-card/feature-card.component.html b/src/app/component/card/feature-card/feature-card.component.html index d1dafbb5..810aa82f 100644 --- a/src/app/component/card/feature-card/feature-card.component.html +++ b/src/app/component/card/feature-card/feature-card.component.html @@ -1,4 +1,4 @@ -{{ feature.description }}

-
+ diff --git a/src/app/component/card/policy-card/policy-card.component.html b/src/app/component/card/policy-card/policy-card.component.html index 7d0e3dc9..8b36ab5f 100644 --- a/src/app/component/card/policy-card/policy-card.component.html +++ b/src/app/component/card/policy-card/policy-card.component.html @@ -1,4 +1,4 @@ - @@ -30,7 +30,7 @@ - + diff --git a/src/app/component/card/policy-card/policy-card.component.scss b/src/app/component/card/policy-card/policy-card.component.scss index 71724952..610070f3 100644 --- a/src/app/component/card/policy-card/policy-card.component.scss +++ b/src/app/component/card/policy-card/policy-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .policy-content a { color: var(--theme-color); diff --git a/src/app/component/card/presentation-card/presentation-card.component.html b/src/app/component/card/presentation-card/presentation-card.component.html index 4ced1d5d..0bfeeda7 100644 --- a/src/app/component/card/presentation-card/presentation-card.component.html +++ b/src/app/component/card/presentation-card/presentation-card.component.html @@ -1,10 +1,12 @@ - +
- logo + logo

{{ title }}

@@ -15,9 +17,10 @@

{{ secondaryText }}

- - + +
@@ -27,5 +30,4 @@

{{ footerText }}

- -
+ diff --git a/src/app/component/card/presentation-card/presentation-card.component.scss b/src/app/component/card/presentation-card/presentation-card.component.scss index 795f1488..d3245e01 100644 --- a/src/app/component/card/presentation-card/presentation-card.component.scss +++ b/src/app/component/card/presentation-card/presentation-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .presentation-card { cursor: pointer; diff --git a/src/app/component/card/presentation-card/presentation-card.component.ts b/src/app/component/card/presentation-card/presentation-card.component.ts index 15f2612a..3cd927c5 100644 --- a/src/app/component/card/presentation-card/presentation-card.component.ts +++ b/src/app/component/card/presentation-card/presentation-card.component.ts @@ -14,6 +14,7 @@ export class PresentationCardComponent { @Input() secondaryText: string; @Input() footerText: string; @Input() imgHeight: number; + @Input() maintenance = false; constructor( private router: Router ) { // Intentionally blank diff --git a/src/app/component/card/pricing-card/pricing-card.component.html b/src/app/component/card/pricing-card/pricing-card.component.html index c185152a..06a5c4d4 100644 --- a/src/app/component/card/pricing-card/pricing-card.component.html +++ b/src/app/component/card/pricing-card/pricing-card.component.html @@ -1,4 +1,4 @@ - @@ -25,7 +25,7 @@

{{ pricingOption.title | uppercase }}

- + {{ pricingFeatures[ i ].details[ j ].name }}

@@ -37,14 +37,14 @@

{{ pricingOption.title | uppercase }}

-
+ diff --git a/src/app/component/card/pricing-card/pricing-card.component.scss b/src/app/component/card/pricing-card/pricing-card.component.scss index dc0a9079..0cf64dd8 100644 --- a/src/app/component/card/pricing-card/pricing-card.component.scss +++ b/src/app/component/card/pricing-card/pricing-card.component.scss @@ -1,18 +1,16 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .pricing-card { font-size: 0.85rem; & .header { - // Design padding-top: 35px; & h4 { letter-spacing: 0.6em; - // Design text-align: center; } @@ -65,7 +63,6 @@ & .body { @include card.default-body; - // Design min-height: 140px; margin-top: 20px; margin-bottom: 40px; @@ -78,6 +75,10 @@ align-items: center; height: 22px; + & i { + color: var(--theme-color); + } + & span { padding-left: 1em; } @@ -90,7 +91,7 @@ border: 0; padding-bottom: 35px; - & app-brand-button { + & oth-brand-button { @include util.flex-layout-column; @include util.flex-center-center; diff --git a/src/app/component/card/pricing-card/pricing-card.component.ts b/src/app/component/card/pricing-card/pricing-card.component.ts index f5bce073..d7350ff6 100644 --- a/src/app/component/card/pricing-card/pricing-card.component.ts +++ b/src/app/component/card/pricing-card/pricing-card.component.ts @@ -1,8 +1,11 @@ import { Component, Input } from '@angular/core'; import { Router } from '@angular/router'; +import { environment } from '../../../../environments/environment'; import { URLS } from '../../../data/navigation/navigation.data'; +import { PremiumProducts } from '../../../data/premium-products/premium-product.data'; import { PricingOption } from '../../../model/pricing/pricing.model'; import { PricingFeature } from '../../../model/product/product.model'; +import { PaymentService } from '../../../service/payment/payment.service'; @Component( { selector: 'app-pricing-card', @@ -19,7 +22,7 @@ export class PricingCardComponent { @Input() pricingOption: PricingOption; - constructor( private router: Router ) { + constructor( private router: Router, private paymentService: PaymentService ) { // Intentionally blank } @@ -29,7 +32,7 @@ export class PricingCardComponent { } else if ( this.pricingOption.link ) { this.redirect( this.pricingOption.link ); } else { - this.redirect( URLS.maintenance ); + this.buy(); } } @@ -40,4 +43,8 @@ export class PricingCardComponent { window.location.href = href; } } + + buy() { + this.paymentService.initPayment( environment.payment.stripe, PremiumProducts.premiumAccount, 1 ); + } } diff --git a/src/app/component/card/profile-card/profile-card.component.html b/src/app/component/card/profile-card/profile-card.component.html new file mode 100644 index 00000000..6b7cb44b --- /dev/null +++ b/src/app/component/card/profile-card/profile-card.component.html @@ -0,0 +1,95 @@ + + + +
+ + profile-img +

(premium)

+

@{{ user.username }}

+
+
+ + + +
+
+

First Name

+

{{ user.payload?.firstName }}

+
+ +
+

Last Name

+

{{ user.payload?.lastName }}

+
+ +
+

Bio

+

{{ user.payload?.bio }}

+
+ +
+

Location

+

{{ user.payload?.location }}

+
+ +
+

Phone

+

{{ user.payload?.phone }}

+
+ +
+

Website

+ +
+
+
+ + + + + +
diff --git a/src/app/component/card/profile-card/profile-card.component.scss b/src/app/component/card/profile-card/profile-card.component.scss new file mode 100644 index 00000000..ccdb130c --- /dev/null +++ b/src/app/component/card/profile-card/profile-card.component.scss @@ -0,0 +1,117 @@ +@use '../../../../styles/util/util'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; + +.profile-card { + + & .header { + + margin-top: -50px; + margin-left: auto; + margin-right: auto; + padding: 10px; + + text-align: center; + + & p { + font-size: 18px; + + margin-top: 10px; + + &:last-child { + margin-bottom: 30px; + } + } + } + + & .body { + + justify-content: flex-start; + + padding: 0px 20px 50px; + + & .key-value-area { + display: flex; + margin-top: 30px; + + & .key { + width: -webkit-fill-available; + text-align: right; + color: var(--lighter-contrast); + font: { + size: 20px; + } + } + + & .value { + margin-top: auto; + margin-bottom: auto; + margin-left: 30px; + width: 100%; + text-align: left; + + font: { + size: 18px; + } + + & .website { + color: var(--theme-color-lighter-4); + } + } + } + } + + & .footer { + @include card.default-footer; + @include card.default-footer-border-color; + @include util.flex-layout-row; + + & .social-area { + display: flex; + + & i { + color: var(--theme-color-lighter-6); + + margin: 0 3px; + font-size: 27px; + + &:hover { + color: var(--theme-color); + } + } + + & p { + color: var(--lighter-contrast); + margin-right: 20px; + font-size: 17px; + margin-top: 5px; + } + } + } +} + +@media only screen and (max-width: 999px) { + .profile-card { + & .body { + & .key-value-area { + flex-direction: column; + + & .key { + text-align: center; + } + + & .value { + text-align: center; + margin-left: 0; + } + } + } + + & .footer { + & .social-area { + & p { + display: none; + } + } + } + } +} diff --git a/src/app/component/button/event-button/event-button.component.spec.ts b/src/app/component/card/profile-card/profile-card.component.spec.ts similarity index 54% rename from src/app/component/button/event-button/event-button.component.spec.ts rename to src/app/component/card/profile-card/profile-card.component.spec.ts index 121a14f0..5a217040 100644 --- a/src/app/component/button/event-button/event-button.component.spec.ts +++ b/src/app/component/card/profile-card/profile-card.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { EventButtonComponent } from './event-button.component'; +import { ProfileCardComponent } from './profile-card.component'; -describe( 'EventButtonComponent', () => { - let component: EventButtonComponent; - let fixture: ComponentFixture; +describe( 'ProfileCardComponent', () => { + let component: ProfileCardComponent; + let fixture: ComponentFixture; beforeEach( async () => { await TestBed.configureTestingModule( { - declarations: [ EventButtonComponent ] + declarations: [ ProfileCardComponent ] } ) .compileComponents(); } ); beforeEach( () => { - fixture = TestBed.createComponent( EventButtonComponent ); + fixture = TestBed.createComponent( ProfileCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); } ); diff --git a/src/app/component/card/profile-card/profile-card.component.ts b/src/app/component/card/profile-card/profile-card.component.ts new file mode 100644 index 00000000..a42d9473 --- /dev/null +++ b/src/app/component/card/profile-card/profile-card.component.ts @@ -0,0 +1,43 @@ +import { Component, Input } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { environmentCommon } from 'src/environments/environment-common'; + +@Component( { + selector: 'app-profile-card', + templateUrl: './profile-card.component.html', + styleUrls: [ './profile-card.component.scss' ], +} ) +export class ProfileCardComponent { + environment = environment; + environmentCommon = environmentCommon; + employeePhotoLoaded = false; + + @Input() user: any = { + username: '', + name: '', + title: '', + bio: '', + social: { + linkedIn: '', + twitter: '', + github: '', + }, + }; + + @Input() photoUri: string = undefined; + + @Input() userIsPremium; + + constructor() { + // Intentionally blank + } + + setEmployeePhotoLoaded = () => { + this.employeePhotoLoaded = true; + }; + + parseSocialUrl( url: string ): string { + const directories = url.split( '/' ); + return directories[ ( directories.length - 1 ) ]; + } +} diff --git a/src/app/component/card/status-card/status-card.component.html b/src/app/component/card/status-card/status-card.component.html index 0d73f163..51d8c67b 100644 --- a/src/app/component/card/status-card/status-card.component.html +++ b/src/app/component/card/status-card/status-card.component.html @@ -1,33 +1,30 @@ - +
- +

{{ systemStatus.name | titlecase }}

- +

{{ status.name | titlecase}}

-
- +

{{ status.name | titlecase}}

-
@@ -40,8 +37,8 @@

{{ status.name | titlecase}} {{ overallSystemStatus.checkDate ? 'Last check ' + ( overallSystemStatus.checkDate | date: 'dd MMM, HH:mm:ss' ) : '' }}
Overall Status: - +

-
+ diff --git a/src/app/component/card/status-card/status-card.component.scss b/src/app/component/card/status-card/status-card.component.scss index 81a3148f..d5c51a60 100644 --- a/src/app/component/card/status-card/status-card.component.scss +++ b/src/app/component/card/status-card/status-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .status-card { & .header { @@ -16,7 +16,7 @@ color: var(--color); padding: 15px; - & app-led { + & oth-led { margin-right: 12px; } } @@ -24,7 +24,6 @@ & .body { - // Design min-height: 120px; display: flex; flex-wrap: wrap; @@ -58,7 +57,7 @@ color: var(--lighter-contrast); } - & app-led { + & oth-led { margin-right: 14px; } diff --git a/src/app/component/card/status-card/status-card.component.ts b/src/app/component/card/status-card/status-card.component.ts index 89217dca..681b3ba1 100644 --- a/src/app/component/card/status-card/status-card.component.ts +++ b/src/app/component/card/status-card/status-card.component.ts @@ -1,6 +1,4 @@ import { Component, Input } from '@angular/core'; -import { Router } from '@angular/router'; -import { URLS } from '../../../data/navigation/navigation.data'; import { PRODUCT_LINES } from '../../../data/product/product.data'; import { DEFAULT_SYSTEM_STATUS } from '../../../data/status/status.data'; @@ -14,23 +12,10 @@ export class StatusCardComponent { PRODUCT_LINES = PRODUCT_LINES; - constructor( private router: Router ) { + constructor() { // Intentionally blank } - navigate( overallStatusName: string, statusName: string ) { - for ( const product of PRODUCT_LINES ) { - if ( product.name.toLowerCase() === overallStatusName.toLowerCase() ) { - for ( const subProduct of product.products ) { - if ( statusName.toLowerCase() === subProduct.name.toLowerCase() ) { - this.router.navigate( [ URLS.product + '/' + product.key + '/' + subProduct.key ] ); - break; - } - } - } - } - } - setStatusLed( status: string ) { switch ( status ) { case 'UP': { diff --git a/src/app/component/card/tech-stack-card/tech-stack-card.component.html b/src/app/component/card/tech-stack-card/tech-stack-card.component.html index 4145c828..e92e54b2 100644 --- a/src/app/component/card/tech-stack-card/tech-stack-card.component.html +++ b/src/app/component/card/tech-stack-card/tech-stack-card.component.html @@ -1,12 +1,12 @@ - +
-
- +
+

{{ tech.description }}

- + diff --git a/src/app/component/card/tech-stack-card/tech-stack-card.component.scss b/src/app/component/card/tech-stack-card/tech-stack-card.component.scss index 694dda95..ba2c927d 100644 --- a/src/app/component/card/tech-stack-card/tech-stack-card.component.scss +++ b/src/app/component/card/tech-stack-card/tech-stack-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .tech-stack-card { & .body { diff --git a/src/app/component/card/tech-stack-card/tech-stack-card.component.spec.ts b/src/app/component/card/tech-stack-card/tech-stack-card.component.spec.ts index 4ed937cd..27501955 100644 --- a/src/app/component/card/tech-stack-card/tech-stack-card.component.spec.ts +++ b/src/app/component/card/tech-stack-card/tech-stack-card.component.spec.ts @@ -2,24 +2,24 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { TechStackCardComponent } from './tech-stack-card.component'; -describe('TechStackCardComponent', () => { +describe( 'TechStackCardComponent', () => { let component: TechStackCardComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach( async () => { + await TestBed.configureTestingModule( { declarations: [ TechStackCardComponent ] - }) + } ) .compileComponents(); - }); + } ); - beforeEach(() => { - fixture = TestBed.createComponent(TechStackCardComponent); + beforeEach( () => { + fixture = TestBed.createComponent( TechStackCardComponent ); component = fixture.componentInstance; fixture.detectChanges(); - }); + } ); - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); + it( 'should create', () => { + expect( component ).toBeTruthy(); + } ); +} ); diff --git a/src/app/component/card/testimonial-card/testimonial-card.component.html b/src/app/component/card/testimonial-card/testimonial-card.component.html index be59789c..eba36eb1 100644 --- a/src/app/component/card/testimonial-card/testimonial-card.component.html +++ b/src/app/component/card/testimonial-card/testimonial-card.component.html @@ -1,4 +1,4 @@ - @@ -22,8 +22,8 @@ fill-opacity="0.4" transform="translate(100 100)"> logo + alt="logo" class="profile-img" height="100" onerror="this.src='./assets/common/profile-img.png'" + width="100"/> - + diff --git a/src/app/component/card/testimonial-card/testimonial-card.component.scss b/src/app/component/card/testimonial-card/testimonial-card.component.scss index aa37edc6..9e9d353c 100644 --- a/src/app/component/card/testimonial-card/testimonial-card.component.scss +++ b/src/app/component/card/testimonial-card/testimonial-card.component.scss @@ -1,5 +1,5 @@ @use '../../../../styles/util/util'; -@use '../../card/card.component'; +@use 'node_modules/@open-template-hub/card/styles/card/card'; .testimonial-card { @@ -18,7 +18,6 @@ align-items: flex-end; justify-content: flex-end; - // Design padding: 25px; text-align: center; @@ -69,6 +68,7 @@ background-color: var(--card); height: 100px; + width: 100px; margin-top: 30px; border-bottom: 2px solid var(--theme-color); z-index: 2; diff --git a/src/app/component/card/timeline-card/step-timeline-card/step-timeline-card.component.html b/src/app/component/card/timeline-card/step-timeline-card/step-timeline-card.component.html index 1cb6aa2c..a0b31086 100644 --- a/src/app/component/card/timeline-card/step-timeline-card/step-timeline-card.component.html +++ b/src/app/component/card/timeline-card/step-timeline-card/step-timeline-card.component.html @@ -1,24 +1,15 @@ - +