├── .browserslistrc
├── .env.example
├── .eslintrc.js
├── .firebaserc
├── .github
├── FUNDING.yml
└── workflows
│ └── deploy.yaml
├── .gitignore
├── .npmrc
├── .nvmrc
├── .prettierrc.js
├── .vercelignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── cypress.json
├── firebase.json
├── index.html
├── jest.config.js
├── package-lock.json
├── package.json
├── public
├── assets
│ └── img
│ │ ├── default-profile.png
│ │ └── logo.png
├── favicon.ico
└── version.json
├── src
├── app
│ ├── app.html
│ ├── app.scss
│ ├── app.ts
│ └── app.vue
├── components
│ ├── input
│ │ ├── input.html
│ │ ├── input.scss
│ │ ├── input.ts
│ │ └── input.vue
│ ├── menu-item
│ │ ├── menu-item.html
│ │ ├── menu-item.scss
│ │ ├── menu-item.ts
│ │ └── menu-item.vue
│ └── sidebar-search
│ │ ├── sidebar-search.html
│ │ ├── sidebar-search.scss
│ │ ├── sidebar-search.ts
│ │ └── sidebar-search.vue
├── firebase
│ └── index.ts
├── index.scss
├── interfaces
│ ├── payload.ts
│ └── state.ts
├── main.ts
├── modules
│ ├── forgot-password
│ │ ├── forgot-password.html
│ │ ├── forgot-password.scss
│ │ ├── forgot-password.ts
│ │ └── forgot-password.vue
│ ├── login
│ │ ├── login.html
│ │ ├── login.scss
│ │ ├── login.ts
│ │ └── login.vue
│ ├── main
│ │ ├── control-sidebar
│ │ │ ├── control-sidebar.html
│ │ │ ├── control-sidebar.scss
│ │ │ ├── control-sidebar.ts
│ │ │ └── control-sidebar.vue
│ │ ├── footer
│ │ │ ├── footer.html
│ │ │ ├── footer.scss
│ │ │ ├── footer.ts
│ │ │ └── footer.vue
│ │ ├── header
│ │ │ ├── header.html
│ │ │ ├── header.scss
│ │ │ ├── header.ts
│ │ │ ├── header.vue
│ │ │ ├── languages
│ │ │ │ ├── languages.html
│ │ │ │ ├── languages.scss
│ │ │ │ ├── languages.ts
│ │ │ │ └── languages.vue
│ │ │ ├── messages
│ │ │ │ ├── messages.html
│ │ │ │ ├── messages.scss
│ │ │ │ ├── messages.ts
│ │ │ │ └── messages.vue
│ │ │ ├── notifications
│ │ │ │ ├── notifications.html
│ │ │ │ ├── notifications.scss
│ │ │ │ ├── notifications.ts
│ │ │ │ └── notifications.vue
│ │ │ └── user
│ │ │ │ ├── user.html
│ │ │ │ ├── user.scss
│ │ │ │ ├── user.ts
│ │ │ │ └── user.vue
│ │ ├── main.html
│ │ ├── main.scss
│ │ ├── main.ts
│ │ ├── main.vue
│ │ └── menu-sidebar
│ │ │ ├── menu-sidebar.html
│ │ │ ├── menu-sidebar.scss
│ │ │ ├── menu-sidebar.ts
│ │ │ └── menu-sidebar.vue
│ ├── recover-password
│ │ ├── recover-password.html
│ │ ├── recover-password.scss
│ │ ├── recover-password.ts
│ │ └── recover-password.vue
│ └── register
│ │ ├── register.html
│ │ ├── register.scss
│ │ ├── register.ts
│ │ └── register.vue
├── pages
│ ├── blank
│ │ ├── blank.html
│ │ ├── blank.scss
│ │ ├── blank.ts
│ │ └── blank.vue
│ ├── dashboard
│ │ ├── dashboard.html
│ │ ├── dashboard.scss
│ │ ├── dashboard.ts
│ │ └── dashboard.vue
│ ├── main-menu
│ │ ├── main-menu.html
│ │ ├── main-menu.scss
│ │ ├── main-menu.ts
│ │ ├── main-menu.vue
│ │ └── sub-menu
│ │ │ ├── sub-menu.html
│ │ │ ├── sub-menu.scss
│ │ │ ├── sub-menu.ts
│ │ │ └── sub-menu.vue
│ └── profile
│ │ ├── profile.html
│ │ ├── profile.scss
│ │ ├── profile.ts
│ │ └── profile.vue
├── router
│ └── index.ts
├── services
│ └── auth.ts
├── shims-vue.d.ts
├── shims-vuex.d.ts
├── store
│ ├── auth
│ │ ├── actions.ts
│ │ ├── getters.ts
│ │ ├── index.ts
│ │ └── mutations.ts
│ ├── index.ts
│ └── ui
│ │ ├── actions.ts
│ │ ├── getters.ts
│ │ ├── index.ts
│ │ └── mutations.ts
├── translation
│ ├── en.json
│ ├── es.json
│ ├── index.ts
│ └── tr.json
├── types
│ └── user.ts
├── utils
│ ├── axios.ts
│ ├── helpers.ts
│ └── themes.ts
└── vite-env.d.ts
├── summernote
└── package.json
├── tests
├── e2e
│ ├── .eslintrc.js
│ ├── plugins
│ │ └── index.js
│ ├── specs
│ │ └── test.js
│ └── support
│ │ ├── commands.js
│ │ └── index.js
└── unit
│ ├── example.spec.js
│ ├── example.spec.js.map
│ └── example.spec.ts
├── tsconfig.json
├── vercel.json
└── vite.config.ts
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not dead
4 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | VITE_NODE_ENV=
2 | VITE_FIREBASE_CONFIG=
3 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true
5 | },
6 | extends: [
7 | 'plugin:vue/vue3-essential',
8 | 'eslint:recommended',
9 | '@vue/typescript/recommended',
10 | '@vue/prettier'
11 | ],
12 | parserOptions: {
13 | ecmaVersion: 2020
14 | },
15 | rules: {
16 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
17 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
18 | 'no-useless-catch': 'off',
19 | '@typescript-eslint/no-explicit-any': 'off',
20 | '@typescript-eslint/explicit-module-boundary-types': 'off',
21 | '@typescript-eslint/no-inferrable-types': 'off',
22 | 'vue/script-setup-uses-vars': 'off',
23 | 'vue/multi-word-component-names': 'off'
24 | },
25 | overrides: [
26 | {
27 | files: [
28 | '**/__tests__/*.{j,t}s?(x)',
29 | '**/tests/unit/**/*.spec.{j,t}s?(x)'
30 | ],
31 | env: {
32 | jest: true
33 | }
34 | }
35 | ]
36 | };
37 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "admin-lte-3"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: [erdkse]
2 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yaml:
--------------------------------------------------------------------------------
1 | name: Production Tag Deployment
2 | env:
3 | VITE_NODE_ENV: ${{ secrets.VITE_NODE_ENV }}
4 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
5 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
6 | VITE_FIREBASE_CONFIG: ${{ secrets.VITE_FIREBASE_CONFIG }}
7 | VITE_GA_ID: ${{ secrets.VITE_GA_ID }}
8 | on:
9 | workflow_dispatch:
10 | push:
11 | tags:
12 | - '*'
13 | jobs:
14 | Deploy-Production:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - uses: actions/checkout@v3
18 | - name: Install Vercel CLI
19 | run: npm install --global vercel@latest
20 | - name: Pull Vercel Environment Information
21 | run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}
22 | - name: Build Project Artifacts
23 | run: |
24 | export NODE_OPTIONS="--max_old_space_size=4096"
25 | vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}
26 | - name: Deploy Project Artifacts to Vercel
27 | run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}
28 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | /tests/e2e/videos/
6 | /tests/e2e/screenshots/
7 |
8 | # local env files
9 | .env.local
10 | .env.*.local
11 |
12 | # Log files
13 | npm-debug.log*
14 | yarn-debug.log*
15 | yarn-error.log*
16 | pnpm-debug.log*
17 |
18 | # Editor directories and files
19 | .idea
20 | .vscode
21 | *.suo
22 | *.ntvs*
23 | *.njsproj
24 | *.sln
25 | *.sw?
26 |
27 | .env
28 |
29 | firebase-debug.log
30 | ui-debug.log
31 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | # Supress wall of text on 'npm install'
2 | audit = false
3 | fund = false
4 | update-notifier = true
5 | # Lock versions of node and npm, when looking up engines.
6 | node-version = 18.7.0
7 | npm-version = 8.15.0
8 | # Default options for package-lock - package-lock=true package-lock-only=false
9 | # If set to false, then ignore package-lock.json files when installing. This will also prevent writing package-lock.json if save is true.
10 | # When package package-locks are disabled, automatic pruning of extraneous modules will also be disabled.
11 | package-lock = true
12 | package-lock-only = false
13 | legacy-peer-deps = true
14 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | v18.7.0
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | trailingComma: 'none',
3 | tabWidth: 4,
4 | singleQuote: true,
5 | printWidth: 80,
6 | semi: true,
7 | bracketSpacing: false,
8 | };
9 |
--------------------------------------------------------------------------------
/.vercelignore:
--------------------------------------------------------------------------------
1 | dist
2 | node_modules
3 |
4 | .env
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4 |
5 | ### [0.2.18](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.17...v0.2.18) (2024-05-28)
6 |
7 |
8 | ### Bug Fixes
9 |
10 | * change all styles to scoped ([bdb647c](https://github.com/erdkse/adminlte-3-vue/commit/bdb647cca14aa36df9e486104a5e8b23c9eecf7d))
11 |
12 | ### [0.2.17](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.16...v0.2.17) (2024-05-25)
13 |
14 | ### [0.2.16](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.15...v0.2.16) (2024-05-24)
15 |
16 | ### [0.2.15](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.14...v0.2.15) (2024-05-24)
17 |
18 |
19 | ### Bug Fixes
20 |
21 | * handle social sigin issues ([9443901](https://github.com/erdkse/adminlte-3-vue/commit/9443901f7a5dd9d59e99f5037e4caea6ddaa8ff3))
22 | * setting user to state ([b5b5aec](https://github.com/erdkse/adminlte-3-vue/commit/b5b5aecc124a17480ac9766a717c1c9bfa732c1c))
23 |
24 | ### [0.2.14](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.13...v0.2.14) (2024-05-14)
25 |
26 | ### [0.2.13](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.12...v0.2.13) (2024-05-13)
27 |
28 | ### [0.2.12](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.11...v0.2.12) (2024-05-13)
29 |
30 | ### [0.2.11](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.10...v0.2.11) (2024-05-13)
31 |
32 |
33 | ### Features
34 |
35 | * add firebase as backend service ([bf72858](https://github.com/erdkse/adminlte-3-vue/commit/bf728588f9869ee02d9778fc93bcc4dbd7561f2c))
36 | * update packages ([10929e8](https://github.com/erdkse/adminlte-3-vue/commit/10929e8ad5b9da0e859645e559c79513b379d1b3))
37 |
38 | ### [0.2.10](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.9...v0.2.10) (2024-05-12)
39 |
40 |
41 | ### Features
42 |
43 | * update vercel rewrite rule ([5029f50](https://github.com/erdkse/adminlte-3-vue/commit/5029f50163e5898c61c9cc68ff4111a832dd4952))
44 |
45 | ### [0.2.9](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.8...v0.2.9) (2024-02-16)
46 |
47 | ### [0.2.8](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.7...v0.2.8) (2024-02-16)
48 |
49 | ### [0.2.7](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.6...v0.2.7) (2024-02-16)
50 |
51 | ### [0.2.6](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.5...v0.2.6) (2024-02-16)
52 |
53 | ### [0.2.5](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.4...v0.2.5) (2024-02-16)
54 |
55 | ### [0.2.4](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.3...v0.2.4) (2024-02-16)
56 |
57 | ### [0.2.3](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.2...v0.2.3) (2024-02-16)
58 |
59 | ### [0.2.2](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.1...v0.2.2) (2024-02-16)
60 |
61 | ### [0.2.1](https://github.com/erdkse/adminlte-3-vue/compare/v0.2.0...v0.2.1) (2024-02-16)
62 |
63 |
64 | ### Bug Fixes
65 |
66 | * change vite build command ([5ad1857](https://github.com/erdkse/adminlte-3-vue/commit/5ad1857d4f4042668d312c8f30f0c82f9d82d5d5))
67 |
68 | ## 0.2.0 (2024-01-21)
69 |
70 |
71 | ### Features
72 |
73 | * add ability of changing navbar theme ([62d3dd1](https://github.com/erdkse/adminlte-3-vue/commit/62d3dd1fd2b0f06d705dbda98d2e832be3794063))
74 | * add ability to change sidebar skin ([b159580](https://github.com/erdkse/adminlte-3-vue/commit/b159580aa9557467f8e946329b168fb32c2fc128))
75 | * add control sidebar to handle ui related things ([de2a17e](https://github.com/erdkse/adminlte-3-vue/commit/de2a17ed7f328811e556652b7e21c85655b3b4df))
76 | * Add custom components ([3136b84](https://github.com/erdkse/adminlte-3-vue/commit/3136b8470d024155a95e0d8401d246d571152f54))
77 | * add dark mode ([c54a7db](https://github.com/erdkse/adminlte-3-vue/commit/c54a7db0202f58751f9ccd8ca2287bd5ef3c87f1))
78 | * Add dropdowns ([eaf8867](https://github.com/erdkse/adminlte-3-vue/commit/eaf8867e1d605fdbc4d024102202cd8e957f4bfb))
79 | * Add multilevel menu support ([5c6ee06](https://github.com/erdkse/adminlte-3-vue/commit/5c6ee060d99f11f833e70f47aa0a7b63ab9dc4c1))
80 | * Add navigation ([6908ecc](https://github.com/erdkse/adminlte-3-vue/commit/6908ecc776c7daf94d52dd5ccb12cfd1d5057408))
81 | * Add new pages ([8c5b65d](https://github.com/erdkse/adminlte-3-vue/commit/8c5b65db1971d0bbc8bd6184f2e79d822807fd1f))
82 | * add notifications upon sucessful login and register ([4719578](https://github.com/erdkse/adminlte-3-vue/commit/471957892b2753ff91baa92727f1baafff56d9c3))
83 | * Add routing ([45d1de6](https://github.com/erdkse/adminlte-3-vue/commit/45d1de62256d95c901c92e54a859f4c150b4cad7))
84 | * Add screenSize management ([522afac](https://github.com/erdkse/adminlte-3-vue/commit/522afac80cbf129db05937a448b6e15aaf44f71f))
85 | * add selection component ([56ac97d](https://github.com/erdkse/adminlte-3-vue/commit/56ac97d039e7e319edcd945a7186eb96def1729c))
86 | * add serve.jsü ([824ec94](https://github.com/erdkse/adminlte-3-vue/commit/824ec941f7ba5f18b66bf49a268de312effae691))
87 | * add sidebar-search component ([4568eb6](https://github.com/erdkse/adminlte-3-vue/commit/4568eb656cb631ba81277de0564d89d736adb937))
88 | * Add small screen overlay ([d53d46d](https://github.com/erdkse/adminlte-3-vue/commit/d53d46dab8537dbf830583719717960cda8f6d60))
89 | * Add store ([e90721d](https://github.com/erdkse/adminlte-3-vue/commit/e90721d63cb3257cb06ad73aa279730eca5e430b))
90 | * Add Turkish language support ([04b1b7f](https://github.com/erdkse/adminlte-3-vue/commit/04b1b7ff487b77dc350aa20933b96deaead571cc))
91 | * Add window size listener ([c501352](https://github.com/erdkse/adminlte-3-vue/commit/c501352e7eeff1bbd4120accde2ea17c741303a3))
92 | * Authentication ([1c8fb92](https://github.com/erdkse/adminlte-3-vue/commit/1c8fb923730ac4f2de746f73f5d449cbdc434fd1))
93 | * Change facebook App id ([1534a5c](https://github.com/erdkse/adminlte-3-vue/commit/1534a5c23eb0ba7eef8b2e974355121345726dad))
94 | * enable dark mode toggling ([40e2de6](https://github.com/erdkse/adminlte-3-vue/commit/40e2de6be74e731e6f86228135e60a2805a7dde5))
95 | * Handle actions ([33ed6cf](https://github.com/erdkse/adminlte-3-vue/commit/33ed6cfe09f7058670dd2b00482e82979d4bd44d))
96 | * Make language dropdown functional ([757fc53](https://github.com/erdkse/adminlte-3-vue/commit/757fc53817823c2164a27e1d4a2dba042d61229d))
97 | * Redefine login and register pages ([40e5685](https://github.com/erdkse/adminlte-3-vue/commit/40e568544b92e6d3c995a54f42762e3a3cc19dcc))
98 | * Split main store ([8b09dd6](https://github.com/erdkse/adminlte-3-vue/commit/8b09dd678d63e306428ead1c3eaf60d39fd2840f))
99 | * switch dark mode gracefully ([3c2fc30](https://github.com/erdkse/adminlte-3-vue/commit/3c2fc303ceccf9b1d30bda063bc07876a411f7cf))
100 | * update application dependecies ([f3d86c1](https://github.com/erdkse/adminlte-3-vue/commit/f3d86c14113f8dd45362b41437ecd9fc9eb33177))
101 | * update checkbox component ([cc2395e](https://github.com/erdkse/adminlte-3-vue/commit/cc2395ec7f003a9d001983275acfc0da0ee6c4de))
102 | * Update dependecies ([d062330](https://github.com/erdkse/adminlte-3-vue/commit/d06233089586bfb26655eb4ab5f8383154f77fbb))
103 | * Update login form ([6b30384](https://github.com/erdkse/adminlte-3-vue/commit/6b303840aca35cf46d54ac18c1c9fb01ccab68c9))
104 | * update packages ([0c6b903](https://github.com/erdkse/adminlte-3-vue/commit/0c6b903dba8b9f891f07cf9fa726673e1e0913ac))
105 | * update packages ([eff36c0](https://github.com/erdkse/adminlte-3-vue/commit/eff36c0c4dee6f19cc30f1a210ea7c909cce7841))
106 | * update packages ([9fd7530](https://github.com/erdkse/adminlte-3-vue/commit/9fd753046b43d44d5d88bce50959f1325f4e4ea1))
107 | * update vue version ([f340b5b](https://github.com/erdkse/adminlte-3-vue/commit/f340b5b887889e8668d7e70c03c0f6d17fe92e61))
108 | * update Vue version to 3.4.15 ([84db602](https://github.com/erdkse/adminlte-3-vue/commit/84db602ddafb6d4512752e450590e2fe670b7619))
109 | * Upgrade Vue version to 3.2.18 ([5aab772](https://github.com/erdkse/adminlte-3-vue/commit/5aab7728c5efccf681797e5b34345aeef520e893))
110 |
111 |
112 | ### Bug Fixes
113 |
114 | * add member since value ([a9eb115](https://github.com/erdkse/adminlte-3-vue/commit/a9eb115dcf9e9695d2f149b5eaa51b0fb93ad274))
115 | * Change facebook app secret ([37921ac](https://github.com/erdkse/adminlte-3-vue/commit/37921acb508c8912a89b9072285042bd4cec1d8f))
116 | * checkbox padding issue ([d44bcaf](https://github.com/erdkse/adminlte-3-vue/commit/d44bcaffdcc93e43e1ae93291b1f0daa72fff616))
117 | * Dependecy errors ([0092ce0](https://github.com/erdkse/adminlte-3-vue/commit/0092ce08ca0bb2bf966a083927861ae65ca3ccf1))
118 | * Dropdown style issue ([683d5d3](https://github.com/erdkse/adminlte-3-vue/commit/683d5d3267e4ed84be17b9dd1d5e3e12421e9fd0))
119 | * dropdown styles ([835cc56](https://github.com/erdkse/adminlte-3-vue/commit/835cc568828688179b60f4a73e2669b641dfe987))
120 | * Fix circleci ([ec6119c](https://github.com/erdkse/adminlte-3-vue/commit/ec6119c244ebd4bb44ee293be4d479723175d9fc))
121 | * rearrange styles ([8ad76e7](https://github.com/erdkse/adminlte-3-vue/commit/8ad76e706b0353b25c57169c14062ceae9b4bff7))
122 | * Update eslint file ([ef00d53](https://github.com/erdkse/adminlte-3-vue/commit/ef00d53eaedf470390228a073379cd0d1613a151))
123 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Erdi Köse
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Admin LTE 3.2.0 - Vue 3.4.27
8 |
9 |
10 | This repository is a form of original AdminLTE project. It is aim to use AdminLTE template with Vue.
11 |
12 |
13 |
14 |
15 |
16 | 
17 | 
18 | 
19 | [](#contributors-)
20 | 
21 | [](LICENSE)
22 | 
23 |
24 |
25 |
26 | ## Demo
27 |
28 | Online demo: https://www.erdkse.com/projects/preview/adminlte-vue
29 |
30 | To login website you can `create` a user. All authenication related features are `working` and `live`!
31 |
32 | `Firebase` is added as backend provider to increase better user experince.
33 |
34 | ## Development
35 |
36 | First, install the dependencies with `npm install` command.
37 |
38 | You need to run `npm run firebase:start` on a different terminal and keep it running.
39 |
40 | Then, in the project directory, you can run: `npm run dev`
41 |
42 | Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
43 |
44 | ## License
45 |
46 | [](/LICENSE)
47 |
48 | Released 2021 by [Erdi Köse](https://erdkse.com)
49 |
50 | ## Support for more
51 |
52 | If you liked my work and would like to support for my expenses like server costs, please; (ie. `Firebase`)
53 |
54 | [](https://www.buymeacoffee.com/erdkse)
55 |
--------------------------------------------------------------------------------
/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "pluginsFile": "tests/e2e/plugins/index.js"
3 | }
4 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "emulators": {
3 | "auth": {
4 | "port": 9099
5 | },
6 | "ui": {
7 | "enabled": false
8 | },
9 | "singleProjectMode": true
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | AdminLTE 3
10 |
22 |
23 |
24 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | preset: '@vue/cli-plugin-unit-jest/presets/typescript',
3 | transform: {
4 | '^.+\\.vue$': 'vue-jest'
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "adminlte-3-vue",
3 | "version": "0.2.18",
4 | "private": true,
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "test:unit": "vue-cli-service test:unit",
11 | "test:e2e": "vue-cli-service test:e2e",
12 | "lint": "vue-cli-service lint",
13 | "firebase:start": "firebase emulators:start",
14 | "release:patch": "standard-version --release-as patch",
15 | "release:minor": "standard-version --release-as minor",
16 | "release:major": "standard-version --release-as major"
17 | },
18 | "dependencies": {
19 | "@fortawesome/fontawesome-svg-core": "6.5.2",
20 | "@fortawesome/free-brands-svg-icons": "6.5.2",
21 | "@fortawesome/free-solid-svg-icons": "6.5.2",
22 | "@fortawesome/vue-fontawesome": "3.0.8",
23 | "@profabric/vue-components": "0.2.5-beta.5",
24 | "@vueuse/core": "10.9.0",
25 | "axios": "1.7.2",
26 | "firebase": "10.12.1",
27 | "luxon": "3.4.4",
28 | "summernote": "./summernote",
29 | "uuid": "9.0.1",
30 | "vue": "3.4.27",
31 | "vue-facing-decorator": "3.0.4",
32 | "vue-gtag": "2.0.1",
33 | "vue-i18n": "9.13.1",
34 | "vue-router": "4.3.2",
35 | "vue-toastification": "2.0.0-rc.5",
36 | "vue-window-size": "2.0.0",
37 | "vuex": "4.1.0",
38 | "yup": "1.4.0"
39 | },
40 | "devDependencies": {
41 | "@types/jest": "29.5.12",
42 | "@types/luxon": "3.4.2",
43 | "@types/uuid": "9.0.8",
44 | "@typescript-eslint/eslint-plugin": "7.10.0",
45 | "@typescript-eslint/parser": "7.10.0",
46 | "@vitejs/plugin-vue": "5.0.4",
47 | "@vue/cli-plugin-e2e-cypress": "~5.0.8",
48 | "@vue/cli-plugin-eslint": "~5.0.8",
49 | "@vue/cli-plugin-router": "~5.0.8",
50 | "@vue/cli-plugin-typescript": "~5.0.8",
51 | "@vue/cli-plugin-unit-jest": "~5.0.8",
52 | "@vue/cli-plugin-vuex": "~5.0.8",
53 | "@vue/cli-service": "~5.0.8",
54 | "@vue/compiler-sfc": "3.4.27",
55 | "@vue/eslint-config-prettier": "9.0.0",
56 | "@vue/eslint-config-typescript": "13.0.0",
57 | "@vue/test-utils": "2.4.6",
58 | "admin-lte": "3.2.0",
59 | "dotenv": "16.4.5",
60 | "eslint": "9.3.0",
61 | "eslint-plugin-prettier": "5.1.3",
62 | "eslint-plugin-vue": "9.26.0",
63 | "firebase-tools": "^13.11.2",
64 | "prettier": "3.2.5",
65 | "sass": "1.77.2",
66 | "standard-version": "9.5.0",
67 | "typescript": "~5.4.5",
68 | "vite": "5.2.11",
69 | "vue-jest": "3.0.7"
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/public/assets/img/default-profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erdkse/adminlte-3-vue/056f9e4c2437b9b23eec30cd2f53e65df17fab43/public/assets/img/default-profile.png
--------------------------------------------------------------------------------
/public/assets/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erdkse/adminlte-3-vue/056f9e4c2437b9b23eec30cd2f53e65df17fab43/public/assets/img/logo.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erdkse/adminlte-3-vue/056f9e4c2437b9b23eec30cd2f53e65df17fab43/public/favicon.ico
--------------------------------------------------------------------------------
/public/version.json:
--------------------------------------------------------------------------------
1 | {"version" : "0.2.14"}
2 |
--------------------------------------------------------------------------------
/src/app/app.html:
--------------------------------------------------------------------------------
1 |
2 | Loading
3 |
--------------------------------------------------------------------------------
/src/app/app.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erdkse/adminlte-3-vue/056f9e4c2437b9b23eec30cd2f53e65df17fab43/src/app/app.scss
--------------------------------------------------------------------------------
/src/app/app.ts:
--------------------------------------------------------------------------------
1 | import {calculateWindowSize} from '@/utils/helpers';
2 | import {Component, Vue, Watch} from 'vue-facing-decorator';
3 | import {useWindowSize} from '@vueuse/core';
4 | import {onAuthStateChanged} from 'firebase/auth';
5 | import {firebaseAuth} from '@/firebase';
6 | import {IUser} from '@/interfaces/user';
7 |
8 | @Component({})
9 | export default class App extends Vue {
10 | isAppLoading: boolean = true;
11 |
12 | async mounted() {
13 | await this.checkSession();
14 | }
15 |
16 | get authentication(): IUser {
17 | console.log(this.$store.getters);
18 | return this.$store.getters['auth/currentUser'];
19 | }
20 |
21 | async checkSession() {
22 | this.isAppLoading = true;
23 | onAuthStateChanged(
24 | firebaseAuth,
25 | (user) => {
26 | if (user) {
27 | this.$store.dispatch('auth/setCurrentUser', user);
28 | } else {
29 | this.$store.dispatch('auth/setCurrentUser', undefined);
30 | }
31 | this.isAppLoading = false;
32 | },
33 | (e) => {
34 | console.log(e);
35 | this.$store.dispatch('auth/setCurrentUser', undefined);
36 | this.isAppLoading = false;
37 | }
38 | );
39 | }
40 |
41 | @Watch('windowSize')
42 | watchWindowSize(newValue: any) {
43 | if (this.$store.getters['ui/screenSize'] !== newValue) {
44 | this.$store.dispatch('ui/setWindowSize', newValue);
45 | }
46 | }
47 |
48 | get windowSize() {
49 | const {width} = useWindowSize();
50 | return calculateWindowSize(width.value);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/app/app.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/input/input.html:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/src/components/input/input.scss:
--------------------------------------------------------------------------------
1 | .input-group-text {
2 | margin: inherit auto;
3 | padding: inherit auto;
4 | width: 48px;
5 | }
6 |
--------------------------------------------------------------------------------
/src/components/input/input.ts:
--------------------------------------------------------------------------------
1 | import {Component, Prop, Vue} from 'vue-facing-decorator';
2 |
3 | @Component({
4 | name: 'app-input',
5 | emits: ['update:modelValue']
6 | })
7 | export default class Input extends Vue {
8 | @Prop() modelValue: string;
9 | @Prop() icon: string;
10 | @Prop() type: string;
11 | @Prop() placeholder: string;
12 | @Prop() autocomplete: string;
13 |
14 | public onValueChange(event: any) {
15 | this.$emit('update:modelValue', event.target.value);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/components/input/input.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/menu-item/menu-item.html:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 | {{ $t(menuItem.name) }}
10 |
11 |
12 |
13 |
14 | -
15 |
21 |
22 |
{{ $t(item.name) }}
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/components/menu-item/menu-item.scss:
--------------------------------------------------------------------------------
1 | .nav-item {
2 | cursor: pointer;
3 | }
4 |
--------------------------------------------------------------------------------
/src/components/menu-item/menu-item.ts:
--------------------------------------------------------------------------------
1 | import {Component, Prop, Vue} from 'vue-facing-decorator';
2 |
3 | @Component({
4 | name: 'app-menu-item'
5 | })
6 | export default class MenuItem extends Vue {
7 | @Prop() menuItem: any;
8 | private isMenuExtended: boolean = false;
9 | private isExpandable: boolean = false;
10 | private isMainActive: boolean = false;
11 | private isOneOfChildrenActive: boolean = false;
12 |
13 | public mounted(): void {
14 | this.isExpandable =
15 | this.menuItem &&
16 | this.menuItem.children &&
17 | this.menuItem.children.length > 0;
18 | if (this.$router.currentRoute && this.$router.currentRoute.value) {
19 | this.calculateIsActive(this.$router.currentRoute.value.path);
20 | }
21 | this.$router.afterEach((to) => {
22 | this.calculateIsActive(to.path);
23 | });
24 | }
25 |
26 | public handleMainMenuAction() {
27 | if (this.isExpandable) {
28 | this.toggleMenu();
29 | return;
30 | }
31 | this.$router.replace(this.menuItem.path);
32 | }
33 |
34 | public toggleMenu() {
35 | this.isMenuExtended = !this.isMenuExtended;
36 | }
37 |
38 | public calculateIsActive(url: string) {
39 | this.isMainActive = false;
40 | this.isOneOfChildrenActive = false;
41 | if (this.isExpandable) {
42 | this.menuItem.children.forEach((item: any) => {
43 | if (item.path === url) {
44 | this.isOneOfChildrenActive = true;
45 | this.isMenuExtended = true;
46 | }
47 | });
48 | } else if (this.menuItem?.path === url) {
49 | this.isMainActive = true;
50 | }
51 | if (!this.isMainActive && !this.isOneOfChildrenActive) {
52 | this.isMenuExtended = false;
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/components/menu-item/menu-item.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/sidebar-search/sidebar-search.html:
--------------------------------------------------------------------------------
1 |
2 |
26 |
46 |
47 |
--------------------------------------------------------------------------------
/src/components/sidebar-search/sidebar-search.scss:
--------------------------------------------------------------------------------
1 | pf-dropdown {
2 | width: calc(100% - 12px);
3 | --pf-dropdown-border: none;
4 | --pf-dropdown-menu-min-width: 100%;
5 | --pf-dropdown-menu-margin-top: 0px;
6 |
7 | .menu {
8 | background-color: #454d55;
9 | }
10 |
11 | .dropdown-item {
12 | padding: 0.5rem 1rem;
13 | }
14 | }
15 |
16 | .nothing-found {
17 | color: #c2c7d0;
18 | padding: 0.25rem 0.5rem;
19 | }
20 |
21 | .list-group {
22 | .list-group-item {
23 | padding: 0.5rem 0.75rem;
24 | cursor: pointer;
25 | }
26 |
27 | .search-path {
28 | font-size: 80%;
29 | color: #adb5bd;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/components/sidebar-search/sidebar-search.ts:
--------------------------------------------------------------------------------
1 | import {Component, Prop, Vue} from 'vue-facing-decorator';
2 | // import {MENU} from '@/modules/main/menu-sidebar/menu-sidebar';
3 | import {Dropdown} from '@profabric/vue-components';
4 |
5 | @Component({
6 | name: 'app-sidebar-search',
7 | components: {
8 | 'pf-dropdown': Dropdown
9 | }
10 | })
11 | export default class SidebarSearch extends Vue {
12 | @Prop() menu: any = [];
13 | private searchText: string = '';
14 | public foundMenuItems: any[] = [];
15 | public isDropdownOpen: boolean = false;
16 |
17 | public handleSearchTextChange(event: any) {
18 | this.foundMenuItems = [];
19 |
20 | if (event && event.target && event.target.value) {
21 | this.searchText = event.target.value;
22 | this.findMenuItems(this.menu);
23 | return;
24 | } else {
25 | this.searchText = '';
26 | this.isDropdownOpen = false;
27 | }
28 | }
29 |
30 | public handleIconClick() {
31 | this.searchText = '';
32 | this.isDropdownOpen = false;
33 | }
34 |
35 | public handleMenuItemClick() {
36 | this.searchText = '';
37 | this.isDropdownOpen = false;
38 | }
39 |
40 | public findMenuItems(menu: any) {
41 | if (!this.searchText) {
42 | return;
43 | }
44 |
45 | menu.forEach((menuItem: any) => {
46 | if (
47 | menuItem.name
48 | .toLowerCase()
49 | .includes(this.searchText.toLowerCase()) &&
50 | menuItem.path
51 | ) {
52 | this.foundMenuItems.push(menuItem);
53 | }
54 | if (menuItem.children) {
55 | return this.findMenuItems(menuItem.children);
56 | }
57 | });
58 |
59 | if (this.foundMenuItems.length > 0) {
60 | this.isDropdownOpen = true;
61 | }
62 | }
63 |
64 | public boldString(str: string, substr: string) {
65 | return str.replaceAll(
66 | this.capitalizeFirstLetter(substr),
67 | `${this.capitalizeFirstLetter(
68 | substr
69 | )}`
70 | );
71 | }
72 |
73 | private capitalizeFirstLetter(string: string) {
74 | return string.charAt(0).toUpperCase() + string.slice(1);
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/components/sidebar-search/sidebar-search.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/firebase/index.ts:
--------------------------------------------------------------------------------
1 | import {FirebaseOptions, initializeApp} from 'firebase/app';
2 | import {connectAuthEmulator, getAuth} from 'firebase/auth';
3 |
4 | let {VITE_FIREBASE_CONFIG, PROD} = import.meta.env;
5 |
6 | const firebaseConfig: FirebaseOptions = VITE_FIREBASE_CONFIG
7 | ? JSON.parse(VITE_FIREBASE_CONFIG)
8 | : {apiKey: 'MOCK_KEY'};
9 |
10 | const app = initializeApp(firebaseConfig);
11 |
12 | export const firebaseAuth = getAuth(app);
13 |
14 | if (!PROD) {
15 | connectAuthEmulator(firebaseAuth, 'http://localhost:9099');
16 | }
17 |
--------------------------------------------------------------------------------
/src/index.scss:
--------------------------------------------------------------------------------
1 | @import url('https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css');
2 | @import url('https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.3.0/css/flag-icon.min.css');
3 | @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700');
4 |
5 | @import 'admin-lte/plugins/fontawesome-free/css/all.min.css';
6 | @import 'admin-lte/plugins/icheck-bootstrap/icheck-bootstrap.min.css';
7 | @import 'admin-lte/dist/css/adminlte.min.css';
8 | @import 'vue-toastification/dist/index.css';
9 |
10 | #app {
11 | width: 100vw;
12 | height: 100vh;
13 | }
14 |
15 | .main-header .navbar-nav .nav-item .nav-link {
16 | background: transparent;
17 | border: none;
18 | outline: none;
19 | cursor: pointer;
20 | }
21 |
--------------------------------------------------------------------------------
/src/interfaces/payload.ts:
--------------------------------------------------------------------------------
1 | import {IUser} from './user';
2 | export interface IPayload {
3 | token: string;
4 | user: IUser;
5 | }
6 |
--------------------------------------------------------------------------------
/src/interfaces/state.ts:
--------------------------------------------------------------------------------
1 | import {IUser} from '@/types/user';
2 |
3 | export interface IAuthState {
4 | currentUser?: IUser | null;
5 | }
6 |
7 | export interface IAuthModule {
8 | namespaced: boolean;
9 | state: IAuthState;
10 | mutations: any;
11 | actions: any;
12 | getters: any;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import {createApp} from 'vue';
2 | import App from './app/app.vue';
3 | import router from './router';
4 | import store from './store';
5 | import {i18n} from './translation';
6 |
7 | import {library} from '@fortawesome/fontawesome-svg-core';
8 | import {FontAwesomeIcon} from '@fortawesome/vue-fontawesome';
9 |
10 | import Toast, {PluginOptions} from 'vue-toastification';
11 | import {ProfabricComponents} from '@profabric/vue-components';
12 | import VueGtag from 'vue-gtag';
13 |
14 | import './index.scss';
15 | import {faEnvelope, faLock} from '@fortawesome/free-solid-svg-icons';
16 |
17 | const {VITE_NODE_ENV, VITE_GA_ID} = import.meta.env;
18 |
19 | library.add(faEnvelope, faLock);
20 |
21 | const options: PluginOptions = {
22 | timeout: 3000,
23 | closeOnClick: true,
24 | pauseOnFocusLoss: true,
25 | pauseOnHover: true,
26 | draggable: true,
27 | draggablePercent: 0.6,
28 | showCloseButtonOnHover: false,
29 | hideProgressBar: false,
30 | closeButton: 'button',
31 | icon: true,
32 | rtl: false
33 | };
34 |
35 | const app = createApp(App);
36 | app.component('font-awesome-icon', FontAwesomeIcon)
37 | .use(store)
38 | .use(router)
39 | .use(Toast, options)
40 | .use(i18n as any)
41 | .use(ProfabricComponents);
42 |
43 | if (VITE_NODE_ENV === 'production' && VITE_GA_ID) {
44 | app.use(
45 | VueGtag,
46 | {
47 | config: {id: VITE_GA_ID}
48 | },
49 | router
50 | );
51 | }
52 |
53 | app.mount('#app');
54 |
--------------------------------------------------------------------------------
/src/modules/forgot-password/forgot-password.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 | {{ $t("messages.retrieveNewPassword") }}
11 |
12 |
34 |
35 | {{ $t("labels.login") }}
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/modules/forgot-password/forgot-password.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erdkse/adminlte-3-vue/056f9e4c2437b9b23eec30cd2f53e65df17fab43/src/modules/forgot-password/forgot-password.scss
--------------------------------------------------------------------------------
/src/modules/forgot-password/forgot-password.ts:
--------------------------------------------------------------------------------
1 | import {Component, Vue} from 'vue-facing-decorator';
2 |
3 | @Component({})
4 | export default class ForgotPassword extends Vue {
5 | private appElement: HTMLElement | null = null;
6 |
7 | public mounted(): void {
8 | this.appElement = document.getElementById('app') as HTMLElement;
9 | this.appElement.classList.add('login-page');
10 | }
11 |
12 | public unmounted(): void {
13 | (this.appElement as HTMLElement).classList.remove('login-page');
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/modules/forgot-password/forgot-password.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/modules/login/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
{{ $t("labels.signInToStart") }}
12 |
13 |
56 |
57 |
58 |
65 |
66 | {{ $t("labels.signInUsingFB") }}
67 |
68 |
74 |
75 | {{ $t("labels.signInUsingGoogle") }}
76 |
77 |
78 |
79 |
80 |
81 |
82 | {{ $t("labels.forgotPassword") }}
83 |
84 |
85 |
86 |
87 | {{ $t("labels.registerMembership") }}
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
--------------------------------------------------------------------------------
/src/modules/login/login.scss:
--------------------------------------------------------------------------------
1 | pf-button {
2 | --pf-display: block;
3 | --pf-width: 100%;
4 | }
5 |
--------------------------------------------------------------------------------
/src/modules/login/login.ts:
--------------------------------------------------------------------------------
1 | import {Component, Vue} from 'vue-facing-decorator';
2 |
3 | import Input from '@/components/input/input.vue';
4 | import {useToast} from 'vue-toastification';
5 | import {Button, Checkbox} from '@profabric/vue-components';
6 | import {loginWithEmail, signInByGoogle} from '@/services/auth';
7 |
8 | @Component({
9 | components: {
10 | 'app-input': Input,
11 | 'pf-checkbox': Checkbox,
12 | 'pf-button': Button
13 | }
14 | })
15 | export default class Login extends Vue {
16 | private appElement: HTMLElement | null = null;
17 | public email: string = '';
18 | public password: string = '';
19 | public rememberMe: boolean = false;
20 | public isAuthLoading: boolean = false;
21 | public isGoogleLoading: boolean = false;
22 | public isFacebookLoading: boolean = false;
23 | private toast = useToast();
24 |
25 | public mounted(): void {
26 | this.appElement = document.getElementById('app') as HTMLElement;
27 | this.appElement.classList.add('login-page');
28 | }
29 |
30 | public unmounted(): void {
31 | (this.appElement as HTMLElement).classList.remove('login-page');
32 | }
33 |
34 | public async loginByAuth(): Promise {
35 | try {
36 | this.isAuthLoading = true;
37 | const {user} = await loginWithEmail(this.email, this.password);
38 | this.$store.dispatch('auth/setCurrentUser', user);
39 | this.toast.success('Login succeeded');
40 | this.isAuthLoading = false;
41 | this.$router.replace('/');
42 | } catch (error: any) {
43 | this.toast.error(error.message);
44 | this.isAuthLoading = false;
45 | }
46 | }
47 |
48 | public async loginByGoogle(): Promise {
49 | try {
50 | this.isGoogleLoading = true;
51 | const {user} = await signInByGoogle();
52 | this.$store.dispatch('auth/setCurrentUser', user);
53 | this.toast.success('Login succeeded');
54 | this.isGoogleLoading = false;
55 | this.$router.replace('/');
56 | } catch (error: any) {
57 | this.toast.error(error.message);
58 | this.isGoogleLoading = false;
59 | }
60 | }
61 |
62 | public async loginByFacebook(): Promise {
63 | try {
64 | this.isFacebookLoading = true;
65 | throw new Error('Not implemented');
66 | } catch (error: any) {
67 | this.toast.error(error.message);
68 | this.isFacebookLoading = false;
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/modules/login/login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/modules/main/control-sidebar/control-sidebar.html:
--------------------------------------------------------------------------------
1 |
75 |
--------------------------------------------------------------------------------
/src/modules/main/control-sidebar/control-sidebar.scss:
--------------------------------------------------------------------------------
1 | :host {
2 | padding: 16px;
3 | padding-top: 73px;
4 | }
5 |
6 | pf-select {
7 | --pf-width: 100%;
8 | --pf-display: block;
9 | }
10 |
11 | pf-checkbox {
12 | --pf-display: block;
13 | }
14 |
--------------------------------------------------------------------------------
/src/modules/main/control-sidebar/control-sidebar.ts:
--------------------------------------------------------------------------------
1 | import {Component, Vue} from 'vue-facing-decorator';
2 | import {
3 | Option,
4 | NAVBAR_DARK_VARIANTS,
5 | NAVBAR_LIGHT_VARIANTS,
6 | SIDEBAR_DARK_SKINS,
7 | SIDEBAR_LIGHT_SKINS
8 | } from '@/utils/themes';
9 | import {Checkbox, Select} from '@profabric/vue-components';
10 |
11 | @Component({
12 | name: 'app-control-sidebar',
13 | components: {
14 | 'pf-checkbox': Checkbox,
15 | 'pf-select': Select
16 | }
17 | })
18 | export default class ControlSidebar extends Vue {
19 | private navbarLightVariants: Array