├── .browserslistrc ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── babel.config.js ├── build ├── icons │ ├── 1024x1024.png │ ├── 128x128.png │ ├── 16x16.png │ ├── 24x24.png │ ├── 256x256.png │ ├── 32x32.png │ ├── 48x48.png │ ├── 512x512.png │ ├── 64x64.png │ ├── icon.icns │ └── icon.ico └── webpack.config.js ├── jest.config.js ├── package-lock.json ├── package.json ├── projectConfig.json ├── public ├── favicon.ico ├── icon.png └── index.html ├── src ├── App.vue ├── assets │ ├── authorGuide │ │ ├── MK-folders.jpg │ │ ├── MK-metafiles.jpg │ │ ├── MKmethod-brushes-unpack.png │ │ ├── MKmethod-brushes.png │ │ ├── MKmethod-package-unpack.png │ │ ├── MKmethod-package.png │ │ ├── MKmethod1-unpack.jpg │ │ ├── MKmethod1.jpg │ │ ├── MKmethod2-unpack.jpg │ │ ├── MKmethod2.jpg │ │ ├── MKmethod3-unpack.jpg │ │ ├── MKmethod3.jpg │ │ ├── configfiledifference.jpg │ │ └── mkConfigFile.png │ ├── fonts │ │ ├── Friz Quadrata Std Medium.otf │ │ ├── Frozito.ttf │ │ ├── MaterialIcons.woff2 │ │ ├── OpenSans-Bold.ttf │ │ ├── OpenSans-BoldItalic.ttf │ │ ├── OpenSans-ExtraBold.ttf │ │ ├── OpenSans-ExtraBoldItalic.ttf │ │ ├── OpenSans-Italic.ttf │ │ ├── OpenSans-Light.ttf │ │ ├── OpenSans-LightItalic.ttf │ │ ├── OpenSans-Regular.ttf │ │ ├── OpenSans-Semibold.ttf │ │ └── OpenSans-SemiboldItalic.ttf │ ├── images │ │ ├── MK_pin.png │ │ ├── MKbackgroundElements.png │ │ ├── MKbackgroundElementsAlt.png │ │ ├── MKbackgroundIntroScreen.png │ │ ├── MKlogo.png │ │ ├── assetMiniatureBackground.png │ │ ├── iconCaClient.svg │ │ ├── lightboxBackground.png │ │ ├── logoCaClient.svg │ │ ├── mkDragonIcon.png │ │ ├── moduleAssets.png │ │ ├── moduleMapping.png │ │ ├── moduleProfiles.png │ │ ├── moduleThemes.png │ │ ├── moduleWorldbuilding.png │ │ ├── placeholderSymbol.png │ │ ├── starRating.png │ │ ├── utilityDevTools.png │ │ ├── utilityForceRefresh.png │ │ └── utilitySettings.png │ ├── logo.png │ ├── moduleGuides │ │ ├── module_assets.png │ │ ├── module_caclient.png │ │ ├── module_profiles.png │ │ ├── module_themes.png │ │ └── module_welcome.png │ ├── psdGuides │ │ ├── module_assets.psd │ │ ├── module_caclient.psd │ │ ├── module_profiles.psd │ │ ├── module_themes.psd │ │ ├── module_welcome.psd │ │ ├── psdGuides.zip │ │ └── template_mythKeeperSettings.json │ ├── quasar │ │ ├── quasar.styl │ │ └── quasar.variables.styl │ └── sass │ │ ├── globalStyles │ │ └── moduleStyles.sass │ │ ├── globals.sass │ │ ├── globals │ │ ├── _MKmixins.sass │ │ ├── _animations.sass │ │ ├── _colors.sass │ │ ├── _fonts.sass │ │ ├── _masterMixins.sass │ │ └── _mediaQueries.sass │ │ ├── globalsStyles.sass │ │ └── vendorTweaks │ │ ├── quasar.sass │ │ ├── vue-awesome-notifications │ │ ├── animations.scss │ │ ├── popups.scss │ │ ├── style.scss │ │ ├── toasts.scss │ │ └── variables.scss │ │ └── vueAwesomeNotification.sass ├── background.ts ├── main.ts ├── pageparts │ ├── components │ │ ├── AssetMiniature.vue │ │ ├── AssetsFilter.vue │ │ ├── CAAssetMiniature.vue │ │ ├── CAclientFilter.vue │ │ ├── DragonSpinner.vue │ │ ├── Gallery.vue │ │ └── VideoPreview.vue │ ├── guides │ │ ├── AuthorGuide.vue │ │ ├── ConfigFileGuide.vue │ │ └── UserGuide.vue │ ├── layout │ │ ├── ModuleTopBar.vue │ │ ├── Sidebar.vue │ │ ├── SidebarButton.vue │ │ ├── SupportUs.vue │ │ ├── TaskList.vue │ │ └── WindowButtons.vue │ ├── modules │ │ ├── assets.vue │ │ ├── caclient.vue │ │ ├── profiles.vue │ │ ├── themes.vue │ │ └── welcome.vue │ └── overlays │ │ ├── choiceDialog.vue │ │ ├── downloadChoiceDialog.vue │ │ ├── gallerySlider.vue │ │ ├── guide.vue │ │ ├── installDialog.vue │ │ └── settings.vue ├── quasar.js ├── scripts │ ├── classes │ │ ├── classBase.ts │ │ └── moduleTemplate.ts │ ├── fileManagers │ │ ├── backupManagerMK.ts │ │ ├── deleteManagerMK.ts │ │ ├── downloadManagerMK.ts │ │ ├── iniManager.ts │ │ └── installManagerMK.ts │ ├── interfaces │ │ ├── _interfaceAsseFilterContent.ts │ │ ├── _interfaceAssetObject.ts │ │ ├── _interfaceAssetProcessed.ts │ │ ├── _interfaceBackgroundRenderWork.ts │ │ ├── _interfaceCAFilterContent.ts │ │ ├── _interfaceInstaller.ts │ │ ├── _interfaceInstallerQueueMember.ts │ │ ├── _interfaceMKAsssetSettings.ts │ │ ├── _interfaceMKPaths.ts │ │ ├── _interfaceOverlayActions.ts │ │ ├── _interfaceTask.ts │ │ ├── _interfaceUnpackInstaller.ts │ │ └── _typeInstallerPackageVariations.ts │ ├── uncategorized │ │ ├── pathChecker.ts │ │ └── sortingAndFilterHelpers.ts │ └── workWindowTasks │ │ ├── workBackupAsset.ts │ │ ├── workDeleteAsset.ts │ │ ├── workDeleteBackupAsset.ts │ │ ├── workDownloadFile.ts │ │ ├── workInstallFile.ts │ │ ├── workRestoreBackupAsset.ts │ │ └── workUnpackFile.ts ├── shims-tsx.d.ts ├── shims-vue.d.ts ├── store │ ├── _appSettings │ │ ├── _allowanceDisabledModulesVisibility.ts │ │ ├── _allowanceExpertMode.ts │ │ ├── _allowanceProfile.ts │ │ ├── _allowanceRichTooltips.ts │ │ ├── _allowanceSafeDeletion.ts │ │ ├── _allowanceStartUpTooltips.ts │ │ ├── _pathCustomAssetsFolder.ts │ │ ├── _pathProfileBase.ts │ │ └── _pathUserFolder.ts │ ├── _appUI │ │ └── _appUI.ts │ ├── _componentLock │ │ └── _componentLock.ts │ ├── _installQueue │ │ └── _installQueue.ts │ ├── _profiles │ │ └── _profiles.ts │ ├── _tasks │ │ └── _tasks.ts │ ├── store.ts │ └── translations │ │ └── _translations.ts └── translations │ └── translations.ts ├── tests └── unit │ └── App.spec.ts ├── tsconfig.json ├── vue.config.js ├── webpack.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | plugins: ["@typescript-eslint"], 7 | extends: [ 8 | "plugin:vue/essential", 9 | "plugin:vue/recommended", 10 | "plugin:vue/strongly-recommended", 11 | "@vue/typescript", 12 | //'plugin:@typescript-eslint/recommended' 13 | ], 14 | rules: { 15 | "no-console": process.env.NODE_ENV === "production" ? "error" : "off", 16 | "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", 17 | "quotes": [1, "double"], 18 | "semi": [1, "never"], 19 | "curly": [1, "all"], 20 | "no-trailing-spaces": [1], 21 | //"indent": [2, 2], 22 | "@typescript-eslint/indent": [1, 2], 23 | "vue/no-v-html": [0], 24 | "vue/max-attributes-per-line": [ 25 | 1, 26 | { 27 | singleline: 2, 28 | multiline: { 29 | max: 2, 30 | allowFirstLine: false 31 | } 32 | } 33 | ] 34 | }, 35 | parserOptions: { 36 | parser: "@typescript-eslint/parser" 37 | }, 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | 23 | #Electron-builder output 24 | /dist_electron 25 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mythkeeper 2 | 3 | ## Project setup 4 | ``` 5 | yarn install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | yarn run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | yarn run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | yarn run lint 21 | ``` 22 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/app"] 3 | } 4 | -------------------------------------------------------------------------------- /build/icons/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/1024x1024.png -------------------------------------------------------------------------------- /build/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/128x128.png -------------------------------------------------------------------------------- /build/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/16x16.png -------------------------------------------------------------------------------- /build/icons/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/24x24.png -------------------------------------------------------------------------------- /build/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/256x256.png -------------------------------------------------------------------------------- /build/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/32x32.png -------------------------------------------------------------------------------- /build/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/48x48.png -------------------------------------------------------------------------------- /build/icons/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/512x512.png -------------------------------------------------------------------------------- /build/icons/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/64x64.png -------------------------------------------------------------------------------- /build/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/icon.icns -------------------------------------------------------------------------------- /build/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/build/icons/icon.ico -------------------------------------------------------------------------------- /build/webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | resolve: { 3 | alias: { 4 | "@": path.join(__dirname, "../src"), 5 | "vue$": "vue/dist/vue.esm.js" 6 | }, 7 | extensions: [".js", ".vue", ".json"] 8 | }, 9 | } 10 | 11 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: [ 3 | "js", 4 | "jsx", 5 | "json", 6 | "vue", 7 | "ts", 8 | "tsx" 9 | ], 10 | transform: { 11 | "^.+\\.vue$": "vue-jest", 12 | ".+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$": "jest-transform-stub", 13 | "^.+\\.tsx?$": "ts-jest" 14 | }, 15 | transformIgnorePatterns: [ 16 | "/node_modules/" 17 | ], 18 | moduleNameMapper: { 19 | "^@/(.*)$": "/src/$1" 20 | }, 21 | snapshotSerializers: [ 22 | "jest-serializer-vue" 23 | ], 24 | testMatch: [ 25 | "**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)" 26 | ], 27 | testURL: "http://localhost/", 28 | watchPlugins: [ 29 | "jest-watch-typeahead/filename", 30 | "jest-watch-typeahead/testname" 31 | ], 32 | globals: { 33 | "ts-jest": { 34 | babelConfig: true 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mythkeeper", 3 | "version": "0.7.5", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint", 9 | "test:unit": "vue-cli-service test:unit", 10 | "test:e2e": "vue-cli-service test:e2e", 11 | "electron:serve": "vue-cli-service electron:serve", 12 | "electron:build": "vue-cli-service electron:build", 13 | "electron:generate-icons": "electron-icon-builder --input=./public/icon.png --output=build --flatten", 14 | "postinstall": "electron-builder install-app-deps", 15 | "postuninstall": "electron-builder install-app-deps" 16 | }, 17 | "dependencies": { 18 | "@elvanos/download": "https://github.com/Elvanos/download.git", 19 | "@quasar/extras": "^1.3.1", 20 | "@types/fs-extra": "^8.0.0", 21 | "animate.css": "^3.7.2", 22 | "axios": "^0.19.0", 23 | "cheerio": "^1.0.0-rc.3", 24 | "core-js": "^2.6.5", 25 | "du": "^1.0.0", 26 | "fs-extra": "^8.1.0", 27 | "ini": "^1.3.5", 28 | "is-valid-path": "^0.1.1", 29 | "klaw": "^3.0.0", 30 | "moment": "^2.24.0", 31 | "node-stream-zip": "^1.8.2", 32 | "oauth-1.0a": "^2.2.6", 33 | "onezip": "4.0.1", 34 | "progress-stream": "^2.0.0", 35 | "quasar": "^1.1.1", 36 | "raw-loader": "^3.1.0", 37 | "recursive-copy-progress": "^1.0.0", 38 | "through2": "^3.0.1", 39 | "vue": "^2.6.10", 40 | "vue-awesome-notifications": "^3.0.3", 41 | "vue-axios": "^2.1.5", 42 | "vue-class-component": "^7.0.2", 43 | "vue-codemirror": "^4.0.6", 44 | "vue-property-decorator": "^8.1.0", 45 | "vue-router": "^3.1.3", 46 | "vuex": "^3.0.1", 47 | "vuex-class": "^0.3.2", 48 | "vuex-electron": "^1.0.3", 49 | "vuex-module-decorators": "^0.10.1", 50 | "woocommerce-api": "^1.5.0" 51 | }, 52 | "devDependencies": { 53 | "@types/jest": "23.1.4", 54 | "@types/klaw": "^3.0.0", 55 | "@typescript-eslint/eslint-plugin": "^2.0.0", 56 | "@typescript-eslint/parser": "^2.0.0", 57 | "@vue/cli-plugin-babel": "^3.10.0", 58 | "@vue/cli-plugin-eslint": "^3.10.0", 59 | "@vue/cli-plugin-typescript": "^3.10.0", 60 | "@vue/cli-plugin-unit-jest": "^3.10.0", 61 | "@vue/cli-service": "^3.10.0", 62 | "@vue/eslint-config-prettier": "^5.0.0", 63 | "@vue/eslint-config-typescript": "^4.0.0", 64 | "@vue/test-utils": "^1.0.0-beta.29", 65 | "babel-core": "7.0.0-bridge.0", 66 | "babel-eslint": "^10.0.1", 67 | "babel-plugin-transform-imports": "1.5.0", 68 | "electron": "^5.0.0", 69 | "electron-icon-builder": "^1.0.1", 70 | "eslint": "^5.16.0", 71 | "eslint-plugin-typescript": "^0.14.0", 72 | "eslint-plugin-vue": "^5.0.0", 73 | "jsdoc": "^3.6.3", 74 | "node-sass": "^4.12.0", 75 | "prettier": "^1.18.2", 76 | "sass-loader": "^7.2.0", 77 | "stylus": "^0.54.5", 78 | "stylus-loader": "^3.0.2", 79 | "ts-jest": "23.0.0", 80 | "typescript": "^3.4.3", 81 | "vue-cli-plugin-electron-builder": "^1.4.0", 82 | "vue-cli-plugin-pug": "^1.0.7", 83 | "vue-cli-plugin-quasar": "^1.0.0", 84 | "vue-template-compiler": "^2.6.10" 85 | }, 86 | "productName": "Mythkeeper", 87 | "main": "background.js" 88 | } -------------------------------------------------------------------------------- /projectConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "mythkeeper", 3 | "status": "finished", 4 | "isCategory": false, 5 | "paths": { 6 | "srcFolder": "src", 7 | "distFolder": "dist" 8 | }, 9 | "modules": { 10 | "compilers": { 11 | "javaScript": { 12 | "support": true, 13 | "sourceMaps": false, 14 | "outputToRoot": false, 15 | "distName": "layout", 16 | "reporting": { 17 | "notification": true, 18 | "console": true 19 | }, 20 | "allowMinify": { 21 | "support": true, 22 | "allowMain": true, 23 | "separateFiles": true 24 | }, 25 | "buildHelper": { 26 | "support": true, 27 | "autoFix": { 28 | "support": true, 29 | "modules": { 30 | "fixNewFiles": true 31 | } 32 | }, 33 | "autoBuild": { 34 | "support": true 35 | } 36 | }, 37 | "additionalFiles": { 38 | "support": true, 39 | "overWriteOriginal": false, 40 | "onlyAdditional": false, 41 | "srcFolder": "_additionalFiles", 42 | "reporting": { 43 | "notification": true, 44 | "console": true 45 | }, 46 | "allowMinify": { 47 | "support": true 48 | } 49 | }, 50 | "modules": { 51 | "coffeeScript": { 52 | "support": true 53 | }, 54 | "typeScript": { 55 | "support": true 56 | }, 57 | "jsx": { 58 | "support": true 59 | }, 60 | "babel": { 61 | "support": true 62 | } 63 | } 64 | }, 65 | "cssPreprocessors": { 66 | "support": true, 67 | "modules": { 68 | "nodeSass": { 69 | "support": true, 70 | "distName": "layout_nodeSass", 71 | "sourceMaps": true, 72 | "reporting": { 73 | "notification": true, 74 | "console": true 75 | }, 76 | "allowMinify": { 77 | "support": true, 78 | "allowMain": true, 79 | "separateFiles": true, 80 | "level": 2 81 | }, 82 | "additionalFiles": { 83 | "support": true, 84 | "srcFolder": "_additionalFiles", 85 | "ignoreFolder": "_ignore", 86 | "reporting": { 87 | "notification": true, 88 | "console": true 89 | } 90 | }, 91 | "modules": { 92 | "autoPrefix": true 93 | } 94 | }, 95 | "rubySass": { 96 | "support": true, 97 | "distName": "layout_rubySass", 98 | "sourceMaps": true, 99 | "reporting": { 100 | "notification": true, 101 | "console": true 102 | }, 103 | "allowMinify": { 104 | "support": true, 105 | "allowMain": true, 106 | "separateFiles": true, 107 | "level": 2 108 | }, 109 | "additionalFiles": { 110 | "support": true, 111 | "srcFolder": "_additionalFiles", 112 | "ignoreFolder": "_ignore", 113 | "reporting": { 114 | "notification": true, 115 | "console": true 116 | } 117 | }, 118 | "modules": { 119 | "autoPrefix": true 120 | } 121 | }, 122 | "less": { 123 | "support": false, 124 | "distName": "layout_less", 125 | "sourceMaps": true, 126 | "reporting": { 127 | "notification": true, 128 | "console": true 129 | }, 130 | "allowMinify": { 131 | "support": true, 132 | "allowMain": true, 133 | "separateFiles": true, 134 | "level": 2 135 | }, 136 | "additionalFiles": { 137 | "support": true, 138 | "srcFolder": "_additionalFiles", 139 | "ignoreFolder": "_ignore", 140 | "reporting": { 141 | "notification": true, 142 | "console": true 143 | } 144 | }, 145 | "modules": { 146 | "autoPrefix": true 147 | } 148 | }, 149 | "stylus": { 150 | "support": false, 151 | "distName": "layout_stylus", 152 | "sourceMaps": true, 153 | "reporting": { 154 | "notification": true, 155 | "console": true 156 | }, 157 | "allowMinify": { 158 | "support": true, 159 | "allowMain": true, 160 | "separateFiles": true, 161 | "level": 2 162 | }, 163 | "additionalFiles": { 164 | "support": true, 165 | "srcFolder": "_additionalFiles", 166 | "ignoreFolder": "_ignore", 167 | "reporting": { 168 | "notification": true, 169 | "console": true 170 | } 171 | }, 172 | "modules": { 173 | "autoPrefix": true 174 | } 175 | } 176 | } 177 | } 178 | } 179 | } 180 | } -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/public/favicon.ico -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/public/icon.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Mythkeeper 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/authorGuide/MK-folders.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MK-folders.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MK-metafiles.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MK-metafiles.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod-brushes-unpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod-brushes-unpack.png -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod-brushes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod-brushes.png -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod-package-unpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod-package-unpack.png -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod-package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod-package.png -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod1-unpack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod1-unpack.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod1.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod2-unpack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod2-unpack.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod2.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod3-unpack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod3-unpack.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/MKmethod3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/MKmethod3.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/configfiledifference.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/configfiledifference.jpg -------------------------------------------------------------------------------- /src/assets/authorGuide/mkConfigFile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/authorGuide/mkConfigFile.png -------------------------------------------------------------------------------- /src/assets/fonts/Friz Quadrata Std Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/Friz Quadrata Std Medium.otf -------------------------------------------------------------------------------- /src/assets/fonts/Frozito.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/Frozito.ttf -------------------------------------------------------------------------------- /src/assets/fonts/MaterialIcons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/MaterialIcons.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-Bold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-BoldItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-ExtraBold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-Italic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-LightItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/OpenSans-SemiboldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/fonts/OpenSans-SemiboldItalic.ttf -------------------------------------------------------------------------------- /src/assets/images/MK_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/MK_pin.png -------------------------------------------------------------------------------- /src/assets/images/MKbackgroundElements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/MKbackgroundElements.png -------------------------------------------------------------------------------- /src/assets/images/MKbackgroundElementsAlt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/MKbackgroundElementsAlt.png -------------------------------------------------------------------------------- /src/assets/images/MKbackgroundIntroScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/MKbackgroundIntroScreen.png -------------------------------------------------------------------------------- /src/assets/images/MKlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/MKlogo.png -------------------------------------------------------------------------------- /src/assets/images/assetMiniatureBackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/assetMiniatureBackground.png -------------------------------------------------------------------------------- /src/assets/images/iconCaClient.svg: -------------------------------------------------------------------------------- 1 | Asset 4 -------------------------------------------------------------------------------- /src/assets/images/lightboxBackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/lightboxBackground.png -------------------------------------------------------------------------------- /src/assets/images/logoCaClient.svg: -------------------------------------------------------------------------------- 1 | CA White transparent 2 | -------------------------------------------------------------------------------- /src/assets/images/mkDragonIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/mkDragonIcon.png -------------------------------------------------------------------------------- /src/assets/images/moduleAssets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/moduleAssets.png -------------------------------------------------------------------------------- /src/assets/images/moduleMapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/moduleMapping.png -------------------------------------------------------------------------------- /src/assets/images/moduleProfiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/moduleProfiles.png -------------------------------------------------------------------------------- /src/assets/images/moduleThemes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/moduleThemes.png -------------------------------------------------------------------------------- /src/assets/images/moduleWorldbuilding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/moduleWorldbuilding.png -------------------------------------------------------------------------------- /src/assets/images/placeholderSymbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/placeholderSymbol.png -------------------------------------------------------------------------------- /src/assets/images/starRating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/starRating.png -------------------------------------------------------------------------------- /src/assets/images/utilityDevTools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/utilityDevTools.png -------------------------------------------------------------------------------- /src/assets/images/utilityForceRefresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/utilityForceRefresh.png -------------------------------------------------------------------------------- /src/assets/images/utilitySettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/images/utilitySettings.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/moduleGuides/module_assets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/moduleGuides/module_assets.png -------------------------------------------------------------------------------- /src/assets/moduleGuides/module_caclient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/moduleGuides/module_caclient.png -------------------------------------------------------------------------------- /src/assets/moduleGuides/module_profiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/moduleGuides/module_profiles.png -------------------------------------------------------------------------------- /src/assets/moduleGuides/module_themes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/moduleGuides/module_themes.png -------------------------------------------------------------------------------- /src/assets/moduleGuides/module_welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/moduleGuides/module_welcome.png -------------------------------------------------------------------------------- /src/assets/psdGuides/module_assets.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/module_assets.psd -------------------------------------------------------------------------------- /src/assets/psdGuides/module_caclient.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/module_caclient.psd -------------------------------------------------------------------------------- /src/assets/psdGuides/module_profiles.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/module_profiles.psd -------------------------------------------------------------------------------- /src/assets/psdGuides/module_themes.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/module_themes.psd -------------------------------------------------------------------------------- /src/assets/psdGuides/module_welcome.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/module_welcome.psd -------------------------------------------------------------------------------- /src/assets/psdGuides/psdGuides.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/src/assets/psdGuides/psdGuides.zip -------------------------------------------------------------------------------- /src/assets/psdGuides/template_mythKeeperSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "basicInformation": { 3 | 4 | // Name of your asset. We suggest filling this. 5 | "name": "Elvanos - Cliffs", 6 | 7 | // A version number enclosed in quotes. Can be any number you desire. Mostly to help both you and the user to figure out which version of your asset they have installed. 8 | "version": "2.0", 9 | 10 | "author": { 11 | 12 | // Can be either false or true, depending on if the author is known or not. This option does not use quotes. 13 | "exists": true, 14 | 15 | // Name of the author. 16 | "name": "Elvanos", 17 | 18 | // E-mail of the author. Can be set to false if no email is provided; in which case, quotes are to be omitted. 19 | "mail": "elvanos@testerino.com", 20 | 21 | // Website of the author. Can be set to false if no url is provided; in which case, quotes are to be omitted. 22 | "url": "https://www.patreon.com/elvanos", 23 | 24 | // Donation website of the author. Can be set to false if no url is provided; in which case, quotes are to be omitted. 25 | "donationURL": "https://www.patreon.com/elvanos" 26 | }, 27 | "distributor": { 28 | // Can be either false or true, depending on if the distributor is known or not. This option does not use quotes. 29 | "exists": true, 30 | 31 | // Name of the distributor. 32 | "name": "Elvanos", 33 | 34 | // E-mail of the distributor. Can be set to false if no email is provided; in which case, quotes are to be omitted. 35 | "mail": "elvanos@testerino.com", 36 | 37 | // Website of the distributor. Can be set to false if no url is provided; in which case, quotes are to be omitted. 38 | "url": "https://www.patreon.com/elvanos", 39 | 40 | // Donation website of the distributor. Can be set to false if no url is provided; in which case, quotes are to be omitted. 41 | "donationURL": "https://www.patreon.com/elvanos" 42 | }, 43 | 44 | // Can be either ture or false depending if the item can be used commercially or not. 45 | "commercialUse": true, 46 | 47 | // If the author/distributor offers a paid version of the items, the url can be provided here. Otherwise should be set to false if no url is provided; in which case, quotes are to be omitted. 48 | "commercialURL": false, 49 | 50 | "license": { 51 | 52 | // Can be either true or false based on if the item has any license provided or not. This option does not use quotes. 53 | "hasLicense": true, 54 | 55 | // Type of license provided for the item. 56 | // List of currenbtly supported automatic license: 57 | // CC BY 4.0 58 | // CC BY-SA 4.0 59 | // CC BY-ND 4.0 60 | // CC BY-NC 4.0 61 | // CC BY-NC-SA 4.0 62 | // CC BY-NC-ND 4.0 63 | // Any other types Can be also included, but Mythkeeper will be unable to automatically match them to the proper web licenses, in which case the author/distributor either needs Google search for it or a local version of the license needs to be packed with the item. 64 | // Otherwise should be set to false if no url is provided; in which case, quotes are to be omitted. 65 | "type": "CC BY 4.0", 66 | 67 | // Can be either true or false based on if the item has a license file packed with it or not. This option does not use quotes. 68 | // "localFile" and "externalLink" CAN NOT be set to true at the same time! 69 | "localFile": false, 70 | 71 | // Can be either true or false based on if a web version of the license should be provided instead. This option does not use quotes. 72 | // "localFile" and "externalLink" CAN NOT be set to true at the same time! 73 | "externalLink": true, 74 | 75 | // Can be either true or false based on if the item has a commentary file packed with it or not. This option does not use quotes. 76 | "commentary": true 77 | }, 78 | 79 | // A list of tags belonging to the items; any number is allowed, but we don't suggest over 6-10. 80 | // The last tag is not to have the "," symbol behind it! 81 | // If NO tags are provided, please just fill in "[]" and leave it empty. DO NOT delete the whole thing! 82 | "tags": [ 83 | "terrain", 84 | "cliffs", 85 | "texture", 86 | "tints", 87 | "stylized", 88 | "colorable", 89 | "non-colorable" 90 | ], 91 | 92 | // A description of the item. Accepts HTML tags like
. 93 | // Please keep in mind that the text has to minimized - you MAY NOT use line breaks for the purposes of the config file! 94 | "description": "A cliff pack with hand-drawn outlines and textured backgrounds; mostly made for Wonderdraft (comes packed via the Wonderdraft system), but usable anywhere else (all files come as PNGs).

Comes in 6 color tints:
- Default
- Default Bleak
- Arctic
- Arctic Bleak
- Sandy
- Vegetation

On top of it, also contains a black/white version for custom Wonderdraft coloring - fully functional!

Created in mind to best work with the following theme: https://www.cartographyassets.com/assets/elvanoss-wonderdraft-theme-ralia.50/" 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/assets/quasar/quasar.styl: -------------------------------------------------------------------------------- 1 | @import './quasar.variables' 2 | @import '~quasar-styl' 3 | // @import '~quasar-addon-styl' 4 | -------------------------------------------------------------------------------- /src/assets/quasar/quasar.variables.styl: -------------------------------------------------------------------------------- 1 | // It's highly recommended to change the default colors 2 | // to match your app's branding. 3 | 4 | $primary = #fdda8b 5 | $secondary = #fff5c6 6 | $accent = #670000 7 | 8 | $positive = #21BA45 9 | $negative = #C10015 10 | $info = #31CCEC 11 | $warning = #F2C037 12 | 13 | @import '~quasar-variables-styl' 14 | -------------------------------------------------------------------------------- /src/assets/sass/globalStyles/moduleStyles.sass: -------------------------------------------------------------------------------- 1 | .moduleTitle 2 | color: $themeCol-titles 3 | font-family: Frozito, sans-serif 4 | font-size: 95px 5 | text-align: center 6 | 7 | +Q_customMax(1366px) 8 | font-size: 55px 9 | 10 | 11 | .moduleSubTitle 12 | color: $themeCol-titles 13 | font-family: Frozito, sans-serif 14 | font-size: 23px 15 | font-weight: 400 16 | text-align: center 17 | margin-top: 50px 18 | line-height: 1.4 19 | 20 | +Q_customMax(1366px) 21 | font-size: 35px 22 | margin-top: 30px 23 | 24 | .moduleContent 25 | margin-top: 50px 26 | 27 | +Q_customMax(1366px) 28 | margin-top: 30px 29 | 30 | .overlayContainer 31 | &__title 32 | +M_HorizontalCenterAbsolute 33 | position: fixed 34 | top: -160px 35 | color: $themeCol-titles 36 | font-family: Frozito, sans-serif 37 | font-size: 95px 38 | 39 | +Q_customMax(1366px) 40 | font-size: 55px 41 | top: -85px 42 | -------------------------------------------------------------------------------- /src/assets/sass/globals.sass: -------------------------------------------------------------------------------- 1 | @import "globals/mediaQueries" 2 | @import "globals/fonts" 3 | @import "globals/masterMixins" 4 | @import "globals/colors" 5 | @import "globals/animations" 6 | 7 | @import "globals/MKmixins" 8 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_MKmixins.sass: -------------------------------------------------------------------------------- 1 | =MK_elementBackground($bgPath) 2 | &:before 3 | +M_AbsoluteFullCover 4 | content: '' 5 | z-index: 0 6 | background-image: url(#{$bgPath}) 7 | background-color: rgba(#121420, 0.95) 8 | background-blend-mode: multiply 9 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_animations.sass: -------------------------------------------------------------------------------- 1 | $transition-DefaultType: cubic-bezier(0.33, 0, 0.2, 1) 2 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_colors.sass: -------------------------------------------------------------------------------- 1 | // Text colors 2 | $themeCol-titles: #fdda8b 3 | $themeCol-titlesGlow: #fff5c6 4 | $themeCol-text: #fefefe 5 | $themeCol-textInvert: #171101 6 | 7 | // Tasks 8 | $themeCol-taskText: #f3f3f3 9 | $themeCol-taskBG: #171101 10 | $themeCol-taskSingleBG: #ffffff 11 | $themeCol-taskSingleBGProgress: #61b833 12 | 13 | // Icon colors 14 | $themeCol-iconActive: #fdda8b 15 | $themeCol-iconGlow: #fff5c6 16 | $themeCol-iconGood: #61b833 17 | $themeCol-iconBad: #dc4242 18 | $themeCol-iconNeutral: #eaa408 19 | 20 | 21 | // General elements 22 | $themeCol-ElementSuccessHightlight: #61b833 23 | $themeCol-ElementHightlightSecondary: #30a5b8 24 | $themeCol-elementBorder: #756b48 25 | $themeCol-ElementBackgroundAlt: #670000 26 | $themeCol-ElementBackground: rgba(18, 20, 32, 0.98) 27 | $themeCol-genericBackground: #424242 28 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_fonts.sass: -------------------------------------------------------------------------------- 1 | // Open Sans 2 | @font-face 3 | font-family: 'Open Sans' 4 | font-style: normal 5 | font-weight: 400 6 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(~@/assets/fonts/OpenSans-Regular.ttf) format('truetype') 7 | 8 | @font-face 9 | font-family: 'Open Sans' 10 | font-style: normal 11 | font-weight: 700 12 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url(~@/assets/fonts/OpenSans-Bold.ttf) format('truetype') 13 | 14 | 15 | // Friz Quadrata 16 | @font-face 17 | font-family: 'Friz Quadrata' 18 | font-style: normal 19 | font-weight: 400 20 | src: local('Friz Quadrata Std'), local('FrizQuadrata-Std'), url('~@/assets/fonts/Friz Quadrata Std Medium.otf') format("opentype") 21 | 22 | 23 | // Frozito 24 | @font-face 25 | font-family: 'Frozito' 26 | font-style: normal 27 | font-weight: 400 28 | src: local('Frozito'), local('Frozito'), url('~@/assets/fonts/Frozito.ttf') format("truetype") 29 | 30 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_masterMixins.sass: -------------------------------------------------------------------------------- 1 | //MASTER - MIXINS 2 | 3 | // Full cover for absolute position 4 | =M_AbsoluteFullCover 5 | position: absolute 6 | top: 0 7 | bottom: 0 8 | right: 0 9 | left: 0 10 | 11 | =M_VerticalCenterAbsolute 12 | position: absolute 13 | bottom: 50% 14 | transform: translateY(50%) 15 | 16 | =M_HorizontalCenterAbsolute 17 | position: absolute 18 | right: 50% 19 | transform: translateX(50%) 20 | 21 | =M_CenterAbsolute 22 | position: absolute 23 | bottom: 50% 24 | right: 50% 25 | transform: translate(50%,50%) 26 | 27 | =M_LinkMods 28 | &:hover, 29 | &:focus, 30 | &:active 31 | @content 32 | 33 | =M_ElipsisOneline 34 | display: inline-block 35 | text-overflow: ellipsis 36 | width: 100% 37 | overflow: hidden 38 | white-space: nowrap 39 | 40 | =M_scrollbars($size, $foreground-color, $background-color: mix($foreground-color, white, 50%)) 41 | // For Google Chrome 42 | 43 | &::-webkit-scrollbar-track 44 | border-radius: 10px 45 | background-color: $background-color 46 | 47 | &::-webkit-scrollbar 48 | width: $size 49 | 50 | &::-webkit-scrollbar-thumb 51 | border-radius: 10px 52 | background-color: $foreground-color 53 | 54 | 55 | =M_clearfix 56 | &:after 57 | content: "" 58 | display: table 59 | clear: both 60 | 61 | =M_placeholder 62 | &::-webkit-input-placeholder 63 | @content 64 | &:-moz-placeholder 65 | @content 66 | &::-moz-placeholder 67 | @content 68 | &:-ms-input-placeholder 69 | @content 70 | -------------------------------------------------------------------------------- /src/assets/sass/globals/_mediaQueries.sass: -------------------------------------------------------------------------------- 1 | =Q_customMax($resolution) 2 | @media (max-width: $resolution) 3 | @content 4 | 5 | =Q_customMin($resolution) 6 | @media (min-width: $resolution) 7 | @content 8 | 9 | =Q_customMaxHeight($resolution) 10 | @media (max-height: $resolution) 11 | @content 12 | 13 | =Q_customMinHeight($resolution) 14 | @media (min-height: $resolution) 15 | @content 16 | -------------------------------------------------------------------------------- /src/assets/sass/globalsStyles.sass: -------------------------------------------------------------------------------- 1 | @import "globals" 2 | 3 | @import "globalStyles/moduleStyles" 4 | 5 | @import "./vendorTweaks/vueAwesomeNotification" 6 | 7 | @import "./vendorTweaks/quasar" 8 | 9 | * 10 | font-family: 'Open Sans', sans-serif 11 | -webkit-font-smoothing: antialiased 12 | -moz-osx-font-smoothing: grayscale 13 | font-smooth: always 14 | 15 | *, :after, :before 16 | box-sizing: inherit 17 | user-select: none 18 | 19 | html, 20 | body 21 | margin: 0 22 | overflow: visible 23 | 24 | img 25 | max-width: 100% 26 | max-height: 100% 27 | 28 | h3 29 | font-family: Frozito, sans-serif 30 | font-size: 24px !important 31 | font-weight: 500 !important 32 | color: $themeCol-titles !important 33 | margin: 20px 0 -17.5px 5px !important 34 | 35 | 36 | p 37 | font-size: 15px 38 | line-height: 1.5 39 | 40 | .CodeMirror-vscrollbar 41 | +M_scrollbars(5px, $themeCol-titles,rgba($themeCol-text, 0.5)) 42 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vue-awesome-notifications/animations.scss: -------------------------------------------------------------------------------- 1 | @keyframes awn-fade-in { 2 | from { 3 | opacity: 0; 4 | } 5 | 6 | to { 7 | opacity: 1; 8 | } 9 | } 10 | 11 | @keyframes awn-fade-out { 12 | from { 13 | opacity: 1; 14 | } 15 | 16 | to { 17 | opacity: 0; 18 | } 19 | } 20 | 21 | @keyframes awn-slide-right { 22 | from { 23 | opacity: 0; 24 | left: 100%; 25 | } 26 | 27 | to { 28 | opacity: 1; 29 | left: 0; 30 | } 31 | } 32 | 33 | @keyframes awn-slide-left { 34 | from { 35 | opacity: 0; 36 | right: 100%; 37 | } 38 | 39 | to { 40 | opacity: 1; 41 | right: 0; 42 | } 43 | } 44 | 45 | @keyframes awn-bar { 46 | from { 47 | right: 100%; 48 | } 49 | 50 | to { 51 | right: 0; 52 | } 53 | } 54 | 55 | .awn-popup-loading-dots, 56 | .awn-popup-loading-dots:before, 57 | .awn-popup-loading-dots:after { 58 | border-radius: 50%; 59 | width: 6px; 60 | height: 6px; 61 | animation-fill-mode: both; 62 | background: #fff; 63 | animation: awn-loading-dots 1s infinite ease-in-out; 64 | } 65 | 66 | .awn-popup-loading-dots { 67 | position: relative; 68 | margin-left: 24px; 69 | display: inline-block; 70 | color: #fff; 71 | animation-delay: -0.16s; 72 | } 73 | 74 | .awn-popup-loading-dots:before, 75 | .awn-popup-loading-dots:after { 76 | content: ""; 77 | position: absolute; 78 | top: 0; 79 | } 80 | 81 | .awn-popup-loading-dots:before { 82 | left: -16px; 83 | animation-delay: -0.32s; 84 | } 85 | 86 | .awn-popup-loading-dots:after { 87 | left: 16px; 88 | } 89 | 90 | @keyframes awn-loading-dots { 91 | 92 | 0%, 93 | 80%, 94 | 100% { 95 | box-shadow: 0 0 0 0; 96 | } 97 | 98 | 40% { 99 | box-shadow: 0 0 0 2px; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vue-awesome-notifications/popups.scss: -------------------------------------------------------------------------------- 1 | #awn-popup-wrapper { 2 | position: fixed; 3 | left: 0; 4 | right: 0; 5 | bottom: 0; 6 | top: 0; 7 | display: flex; 8 | align-items: center; 9 | justify-content: center; 10 | background: $awn-popup-wrapper-bg; 11 | z-index: $awn-popup-wrapper-z-index; 12 | opacity: 0; 13 | animation-name: $awn-popup-show-animation; 14 | animation-timing-function: $awn-popup-animation-timing; 15 | animation-fill-mode: both; 16 | 17 | &.awn-hiding { 18 | animation-name: $awn-popup-hide-animation; 19 | } 20 | 21 | .awn-popup-body { 22 | position: relative; 23 | border-radius: $awn-popup-border-radius; 24 | word-break: break-word; 25 | background: $awn-popup-bg; 26 | padding: $awn-popup-padding; 27 | min-width: $awn-popup-min-width; 28 | font-size: $awn-popup-font-size; 29 | max-width: $awn-popup-max-width; 30 | 31 | &.awn-popup-confirm { 32 | display: flex; 33 | flex-direction: column; 34 | align-items: center; 35 | 36 | .fa { 37 | font-size: $awn-popup-icon-size; 38 | color: $awn-warning-color; 39 | } 40 | } 41 | 42 | &.awn-popup-async-block { 43 | background: transparent; 44 | font-size: 32px; 45 | font-weight: bold; 46 | color: #fff; 47 | text-align: center; 48 | } 49 | } 50 | 51 | .awn-popup-title { 52 | font-size: $awn-popup-font-size; 53 | font-weight: bold; 54 | text-transform: uppercase; 55 | margin-top: 8px; 56 | } 57 | 58 | .awn-buttons { 59 | width: 100%; 60 | display: flex; 61 | justify-content: space-between; 62 | margin-top: $awn-popup-padding; 63 | 64 | .awn-btn { 65 | border-radius: $awn-popup-btn-border-radius; 66 | border: 0; 67 | font-weight: bold; 68 | transition: background 0.2s linear; 69 | font-size: $awn-popup-font-size; 70 | width: 45%; 71 | line-height: $awn-popup-btn-height; 72 | color: $awn-popup-btn-color; 73 | } 74 | 75 | &-1 { 76 | .awn-btn { 77 | width: 100%; 78 | } 79 | } 80 | 81 | .awn-btn-success { 82 | background: $awn-success-color; 83 | 84 | &:hover { 85 | background: darken($awn-success-color, 5%); 86 | } 87 | } 88 | 89 | .awn-btn-cancel { 90 | background: $awn-info-color; 91 | 92 | &:hover { 93 | background: darken($awn-info-color, 5%); 94 | } 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vue-awesome-notifications/style.scss: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | @import "animations"; 3 | @import "popups"; 4 | @import "toasts"; 5 | 6 | [class^="awn-"] { 7 | box-sizing: border-box; 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vue-awesome-notifications/toasts.scss: -------------------------------------------------------------------------------- 1 | #awn-toast-container { 2 | position: fixed; 3 | z-index: $awn-container-z-index; 4 | bottom: $awn-container-padding; 5 | right: $awn-container-padding; 6 | box-sizing: border-box; 7 | 8 | bottom: 45px !important; 9 | 10 | &.awn-top-left, 11 | &.awn-top-right { 12 | top: $awn-container-padding; 13 | bottom: auto; 14 | 15 | .awn-toast:first-child { 16 | margin-top: $awn-toast-margin; 17 | } 18 | } 19 | 20 | &.awn-top-left, 21 | &.awn-bottom-left { 22 | left: $awn-container-padding; 23 | right: auto; 24 | 25 | .awn-toast { 26 | right: 100%; 27 | animation-name: $awn-toast-left-show-animation; 28 | 29 | &.awn-hiding { 30 | right: 0; 31 | } 32 | } 33 | } 34 | 35 | &.awn-top-right, 36 | &.awn-bottom-right { 37 | .awn-toast { 38 | left: 100%; 39 | animation-name: $awn-toast-right-show-animation; 40 | 41 | &.awn-hiding { 42 | left: 0; 43 | } 44 | } 45 | } 46 | } 47 | 48 | .awn-toast { 49 | position: relative; 50 | cursor: pointer; 51 | overflow: hidden; 52 | opacity: 0; 53 | width: $awn-toast-width; 54 | background: $awn-primary-background; 55 | margin-top: $awn-toast-margin; 56 | border-radius: $awn-toast-border-radius; 57 | color: $awn-primary-color; 58 | font-size: $awn-toast-font-size; 59 | animation-timing-function: $awn-toast-animation-timing; 60 | animation-fill-mode: both; 61 | line-height: 1.8; 62 | 63 | &-content { 64 | word-break: break-word; 65 | } 66 | 67 | &-label { 68 | display: block; 69 | text-transform: uppercase; 70 | color: $awn-primary-color; 71 | font-size: $awn-toast-title-font-size; 72 | } 73 | 74 | &-icon { 75 | position: absolute; 76 | right: $awn-toast-padding; 77 | top: $awn-progress-bar-height; 78 | bottom: 0; 79 | display: flex; 80 | align-items: center; 81 | justify-content: flex-end; 82 | 83 | .fa { 84 | font-size: $awn-toast-icon-size; 85 | color: $awn-primary-color; 86 | } 87 | } 88 | 89 | &-wrapper { 90 | padding: $awn-progress-bar-height + $awn-toast-padding 88px $awn-toast-padding $awn-toast-padding; 91 | 92 | border: $awn-border; 93 | border-radius: $awn-toast-border-radius; 94 | } 95 | 96 | &-progress-bar { 97 | position: absolute; 98 | top: 0; 99 | left: 0; 100 | right: 0; 101 | height: $awn-progress-bar-height; 102 | 103 | &:after { 104 | content: " "; 105 | background: $awn-primary-color; 106 | position: absolute; 107 | width: 100%; 108 | right: 100%; 109 | top: 0; 110 | border-radius: 50px; 111 | height: $awn-progress-bar-height; 112 | animation-name: awn-bar; 113 | animation-duration: inherit; 114 | animation-timing-function: linear; 115 | animation-fill-mode: both; 116 | opacity: 0.6; 117 | } 118 | 119 | &:before { 120 | content: " "; 121 | background: $themeCol-iconActive; 122 | position: absolute; 123 | width: 100%; 124 | right: 100%; 125 | top: 0; 126 | border-radius: 50px; 127 | height: $awn-progress-bar-height; 128 | animation-name: awn-bar; 129 | animation-duration: inherit; 130 | animation-timing-function: linear; 131 | animation-fill-mode: both; 132 | } 133 | } 134 | 135 | &.awn-toast-progress-bar-paused .awn-toast-progress-bar:after { 136 | animation-play-state: paused; 137 | } 138 | 139 | &.awn-toast-progress-bar-paused .awn-toast-progress-bar:before { 140 | animation-play-state: paused; 141 | } 142 | 143 | &.awn-hiding { 144 | animation-name: $awn-toast-hide-animation !important; 145 | } 146 | 147 | &.awn-toast-success { 148 | background: $awn-success-background; 149 | color: $awn-success-color; 150 | 151 | .awn-toast-wrapper { 152 | border-color: $awn-success-border-color; 153 | } 154 | 155 | b, 156 | .fa { 157 | color: $awn-success-color; 158 | } 159 | 160 | .awn-toast-progress-bar:after { 161 | background: $awn-success-color; 162 | } 163 | } 164 | 165 | &.awn-toast-info { 166 | background: $awn-info-background; 167 | color: $awn-info-color; 168 | 169 | .awn-toast-wrapper { 170 | border-color: $awn-info-border-color; 171 | } 172 | 173 | b, 174 | .fa { 175 | color: $awn-info-color; 176 | } 177 | 178 | .awn-toast-progress-bar:after { 179 | background: $awn-info-color; 180 | } 181 | } 182 | 183 | &.awn-toast-alert { 184 | background: $awn-alert-background; 185 | color: $awn-alert-color; 186 | 187 | .awn-toast-wrapper { 188 | border-color: $awn-alert-border-color; 189 | } 190 | 191 | b, 192 | .fa { 193 | color: $awn-alert-color; 194 | } 195 | 196 | .awn-toast-progress-bar:after { 197 | background: $awn-alert-color; 198 | } 199 | } 200 | 201 | &.awn-toast-warning { 202 | background: $awn-warning-background; 203 | color: $awn-warning-color; 204 | 205 | .awn-toast-wrapper { 206 | border-color: $awn-warning-border-color; 207 | } 208 | 209 | b, 210 | .fa { 211 | color: $awn-warning-color; 212 | } 213 | 214 | .awn-toast-progress-bar:after { 215 | background: $awn-warning-color; 216 | } 217 | } 218 | 219 | .awn-toast-wrapper{ 220 | padding: 10px 15px 8px 15px; 221 | } 222 | 223 | 224 | .awn-toast-content{ 225 | color: $themeCol-titles 226 | } 227 | 228 | .awn-toast-label{ 229 | text-transform: capitalize; 230 | margin-bottom: 5px; 231 | font-family: Frozito, sans-serif; 232 | letter-spacing: 1px; 233 | } 234 | 235 | } 236 | .awn-toast{ 237 | box-shadow: 3px 3px 19px rgba(0, 0, 0, 0.68) !important; 238 | } 239 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vue-awesome-notifications/variables.scss: -------------------------------------------------------------------------------- 1 | // Container 2 | $awn-container-z-index: 99998 !default; 3 | $awn-container-padding: 24px !default; 4 | 5 | // Colors 6 | $awn-primary-color: $themeCol-titlesGlow !default; 7 | $awn-primary-background: rgba(18, 20, 32, 1) !default; 8 | $awn-primary-border-color: $themeCol-elementBorder !default; 9 | 10 | $awn-success-color: #61b833 !default; 11 | $awn-success-background: rgba(18, 20, 32, 1) !default; 12 | $awn-success-border-color: $themeCol-elementBorder !default; 13 | 14 | $awn-info-color: #4ea6ce !default; 15 | $awn-info-background: rgba(18, 20, 32, 1) !default; 16 | $awn-info-border-color: $themeCol-elementBorder !default; 17 | 18 | $awn-alert-color: #dc4242 !default; 19 | $awn-alert-background: rgba(18, 20, 32, 1) !default; 20 | $awn-alert-border-color: $themeCol-elementBorder !default; 21 | 22 | $awn-warning-color: #eaa408 !default; 23 | $awn-warning-background: rgba(18, 20, 32, 1) !default; 24 | $awn-warning-border-color: $themeCol-elementBorder !default; 25 | 26 | // Notifications 27 | $awn-toast-width: 400px !default; 28 | $awn-toast-padding: 16px !default; 29 | $awn-toast-margin: 16px !default; 30 | $awn-toast-border-width: 1px !default; 31 | $awn-toast-border-style: solid !default; 32 | $awn-toast-border-color: $awn-primary-border-color !default; 33 | $awn-toast-border-radius: 7px !default; 34 | $awn-border: $awn-toast-border-width $awn-toast-border-style $awn-toast-border-color !default; 35 | $awn-progress-bar-height: 3px !default; 36 | $awn-toast-font-size: 14px !default; 37 | $awn-toast-title-font-size: 18px !default; 38 | $awn-toast-icon-size: 30px !default; 39 | 40 | // Popups 41 | $awn-popup-wrapper-bg: rgba(0, 0, 0, 0.7) !default; 42 | $awn-popup-wrapper-z-index: 99999 !default; 43 | $awn-popup-bg: #fff !default; 44 | $awn-popup-min-width: 320px !default; 45 | $awn-popup-max-width: 500px !default; 46 | $awn-popup-font-size: 14px !default; 47 | $awn-popup-icon-size: 44px !default; 48 | $awn-popup-padding: 24px !default; 49 | $awn-popup-border-radius: 6px !default; 50 | $awn-popup-btn-height: 32px !default; 51 | $awn-popup-btn-color: #fff !default; 52 | $awn-popup-btn-border-radius: 4px !default; 53 | 54 | // Animations 55 | $awn-popup-show-animation: awn-fade-in; 56 | $awn-popup-hide-animation: awn-fade-out; 57 | $awn-popup-animation-timing: ease-out; 58 | 59 | $awn-toast-left-show-animation: awn-slide-left; 60 | $awn-toast-right-show-animation: awn-slide-right; 61 | $awn-toast-hide-animation: awn-fade-out; 62 | $awn-toast-animation-timing: linear; 63 | -------------------------------------------------------------------------------- /src/assets/sass/vendorTweaks/vueAwesomeNotification.sass: -------------------------------------------------------------------------------- 1 | @import "../globals" 2 | @import "vue-awesome-notifications/style" 3 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------------ */ 2 | /* --------------IMPORTS-------------- */ 3 | /* ------------------------------------ */ 4 | 5 | 6 | // Import all background windows we might use 7 | import workBackupAsset from "@/scripts/workWindowTasks/workBackupAsset" 8 | import workDeleteAsset from "@/scripts/workWindowTasks/workDeleteAsset" 9 | import workDeleteBackupAsset from "@/scripts/workWindowTasks/workDeleteBackupAsset" 10 | import workRestoreBackupAsset from "@/scripts/workWindowTasks/workRestoreBackupAsset" 11 | import workUnpackFile from "@/scripts/workWindowTasks/workUnpackFile" 12 | import workInstallFile from "@/scripts/workWindowTasks/workInstallFile" 13 | import workDownloadFile from "@/scripts/workWindowTasks/workDownloadFile" 14 | 15 | 16 | 17 | // Import electron 18 | import {remote, webContents, app, ipcRenderer} from "electron" 19 | 20 | // Import VUE, store and base APP component 21 | import Vue from "vue" 22 | import store from "./store/store" 23 | import axios from "axios" 24 | import VueAxios from "vue-axios" 25 | import App from "./App.vue" 26 | 27 | import VueCodemirror from "vue-codemirror" 28 | import "codemirror/mode/javascript/javascript.js" 29 | 30 | 31 | // require styles 32 | import "codemirror/lib/codemirror.css" 33 | import "codemirror/theme/monokai.css" 34 | 35 | // Animate css 36 | import "animate.css/animate.css" 37 | 38 | // @ts-ignore 39 | import VueAWN from "vue-awesome-notifications" 40 | 41 | // Quasar 42 | import "./quasar" 43 | 44 | // Interfaces 45 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 46 | 47 | 48 | /* --------------------------------- */ 49 | /* --------------SETUP-------------- */ 50 | /* --------------------------------- */ 51 | 52 | const isDevelopment = process.env.NODE_ENV !== "production" 53 | 54 | 55 | const windowType = remote.getCurrentWindow()["windowType"] 56 | 57 | 58 | /* --------------------------------- */ 59 | /* ------------APP WINDOW---------- */ 60 | /* --------------------------------- */ 61 | 62 | 63 | if (windowType === "appWindow") { 64 | 65 | Vue.use(VueAxios, axios) 66 | 67 | Vue.use(VueCodemirror) 68 | 69 | Vue.use(VueAWN, { 70 | icons: { 71 | enabled: false 72 | } 73 | }) 74 | 75 | 76 | // Disable tips 77 | Vue.config.productionTip = false 78 | 79 | Vue.filter("capitalize", function (value:string) { 80 | if (!value) {return ""} 81 | value = value.toString() 82 | return value.charAt(0).toUpperCase() + value.slice(1) 83 | }) 84 | 85 | Vue.filter("uppercase", function (value:string) { 86 | if (!value) {return ""} 87 | return value.toUpperCase() 88 | }) 89 | 90 | // Run app 91 | new Vue({ 92 | store, 93 | render: h => h(App) 94 | }).$mount("#app") 95 | 96 | } 97 | 98 | 99 | /* --------------------------------- */ 100 | /* ------------WORK WINDOW---------- */ 101 | /* --------------------------------- */ 102 | 103 | 104 | if (windowType === "workWindow") { 105 | 106 | 107 | // Set the communication channel 108 | setInterval(()=>{ 109 | processWorkload() 110 | },1000) 111 | 112 | const processWorkload = () => { 113 | const workCommands : interfaceBackgroundRenderWork[] = remote.getCurrentWindow()["workList"] 114 | console.log(workCommands) 115 | 116 | workCommands.forEach((singleCommand: interfaceBackgroundRenderWork ) => { 117 | 118 | // Process only active commands... in case non-active somehow sneak in 119 | if (singleCommand.status === "active") { 120 | 121 | // Handle backupAsset-work 122 | if (singleCommand.command === "backupAsset-work" ) { 123 | workBackupAsset(singleCommand) 124 | } 125 | 126 | // Handle deleteBackupAsset-work 127 | if (singleCommand.command === "deleteBackupAsset-work" ) { 128 | workDeleteBackupAsset(singleCommand) 129 | } 130 | // Handle deleteBackupAsset-work 131 | if (singleCommand.command === "deleteAsset-work" ) { 132 | workDeleteAsset(singleCommand) 133 | } 134 | 135 | // Handle restoreBackupAsset-work 136 | if (singleCommand.command === "restoreBackupAsset-work" ) { 137 | workRestoreBackupAsset(singleCommand) 138 | } 139 | 140 | // Handle unpackFile-work 141 | if (singleCommand.command === "unpackFile-work" ) { 142 | workUnpackFile(singleCommand) 143 | } 144 | 145 | // Handle installFile-work 146 | if (singleCommand.command === "installFile-work" ) { 147 | workInstallFile(singleCommand) 148 | } 149 | 150 | // Handle installFile-work 151 | if (singleCommand.command === "downloadItem-work" ) { 152 | workDownloadFile(singleCommand) 153 | } 154 | 155 | 156 | // Let the server know this specific command is being taken care off 157 | const reply: interfaceBackgroundRenderWork = singleCommand 158 | reply.status = "accepted" 159 | ipcRenderer.send("asynchronous-message", reply) 160 | } 161 | 162 | }) 163 | 164 | } 165 | 166 | 167 | } 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /src/pageparts/components/DragonSpinner.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 31 | 32 | 69 | -------------------------------------------------------------------------------- /src/pageparts/components/Gallery.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 79 | 80 | 123 | -------------------------------------------------------------------------------- /src/pageparts/components/VideoPreview.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 55 | 56 | 107 | -------------------------------------------------------------------------------- /src/pageparts/layout/ModuleTopBar.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | 160 | 161 | 210 | -------------------------------------------------------------------------------- /src/pageparts/layout/SidebarButton.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 105 | 106 | 210 | -------------------------------------------------------------------------------- /src/pageparts/layout/SupportUs.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 43 | 44 | 79 | -------------------------------------------------------------------------------- /src/pageparts/layout/TaskList.vue: -------------------------------------------------------------------------------- 1 | 81 | 82 | 127 | 128 | 257 | -------------------------------------------------------------------------------- /src/pageparts/layout/WindowButtons.vue: -------------------------------------------------------------------------------- 1 | 74 | 75 | 126 | 127 | 168 | -------------------------------------------------------------------------------- /src/pageparts/modules/profiles.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 98 | 99 | 142 | -------------------------------------------------------------------------------- /src/pageparts/modules/themes.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | 102 | 103 | 146 | -------------------------------------------------------------------------------- /src/pageparts/modules/welcome.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 84 | 85 | 163 | -------------------------------------------------------------------------------- /src/pageparts/overlays/choiceDialog.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 63 | 64 | 75 | -------------------------------------------------------------------------------- /src/pageparts/overlays/downloadChoiceDialog.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 116 | 117 | 144 | -------------------------------------------------------------------------------- /src/pageparts/overlays/gallerySlider.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 33 | 34 | 39 | 40 | 44 | -------------------------------------------------------------------------------- /src/pageparts/overlays/installDialog.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 129 | 130 | 141 | 142 | 168 | -------------------------------------------------------------------------------- /src/quasar.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue" 2 | 3 | import "./assets/quasar/quasar.styl" 4 | import "@quasar/extras/material-icons/material-icons.css" 5 | import "@quasar/extras/mdi-v4/mdi-v4.css" 6 | import Quasar from "quasar" 7 | 8 | Vue.use(Quasar, { 9 | config: { 10 | animations: "all" 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/scripts/fileManagers/deleteManagerMK.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import fs from "fs-extra" 8 | import oneZip from "onezip" 9 | import klaw from "klaw" 10 | // @ts-ignore 11 | import getSize from "du" 12 | // @ts-ignore 13 | import through2 from "through2" 14 | 15 | // Interfaces 16 | import interfaceMKPaths from "@/scripts/interfaces/_interfaceMKPaths" 17 | 18 | 19 | /* ------------------------------ */ 20 | /* ------------CLASS------------ */ 21 | /* ------------------------------ */ 22 | 23 | 24 | /** 25 | * Manages deleting up of assets/themes/etc. 26 | * The class expects the existence of proper Mythkeeper folder structure for deleting 27 | */ 28 | export default class DeleteManagerMK { 29 | 30 | 31 | /* ---------------------------------------- */ 32 | /* ------------SECTION: DELETE------------ */ 33 | /* ---------------------------------------- */ 34 | 35 | 36 | /** 37 | * Delete progress % that gets update from "deleteSingle". 38 | * @see deleteSingle 39 | */ 40 | private deleteProgress : number = 0 41 | 42 | /** 43 | * Gets the value of "deleteProgress". 44 | * @see deleteProgress 45 | * @returns - Floored percentage 46 | */ 47 | getDeleteProgress(){ 48 | return this.deleteProgress 49 | } 50 | 51 | /** 52 | * Deletes an asset. 53 | * @param singleName - Name of the folder without any "\\" 54 | * @param MKPaths - List ok Mythkeeper paths 55 | * @param safeDeleteAllowed - A true/false setting of the app if safe delete mode is allowed or not 56 | */ 57 | async deleteSingle(singleName: string, MKPaths: interfaceMKPaths, safeDeleteAllowed: boolean){ 58 | const activePath: string = MKPaths.wdAssets+"\\"+singleName 59 | const activePathZip: string = MKPaths.wdAssets 60 | const deletePath: string = MKPaths.mkDeletedAssets+"\\"+singleName+".zip" 61 | 62 | // Read max asset size 63 | const assetSize = await getSize(activePath) 64 | 65 | // Set variable for additive processed size from the max size 66 | let remainingSize = 0 67 | 68 | // Backup asset only if the safe mode is up 69 | if (safeDeleteAllowed) { 70 | 71 | // Zip files and wait for the zip to finish 72 | await new Promise((resolve) => { 73 | 74 | const pack = oneZip.pack(activePathZip, deletePath, [singleName]) 75 | 76 | pack.on("progress", (percent) => { 77 | this.deleteProgress = Math.floor(percent / 100 * 90) 78 | }) 79 | 80 | pack.on("end", () => { 81 | resolve() 82 | }) 83 | 84 | }) 85 | } 86 | 87 | // Delete files and wait before moving on 88 | await new Promise((resolve, reject) => { 89 | 90 | // Grab files from the stream and delete them one by one if they are files. 91 | // Leave them be if they are directories, we will delete them later. 92 | const deleteAction = through2.obj(function (item: any, enc: any, next: any) { 93 | //@ts-ignore 94 | this.push(item) 95 | 96 | if (!fs.lstatSync(item.path).isDirectory() ) { 97 | fs.unlink(item.path, next) 98 | } else { 99 | next() 100 | } 101 | }) 102 | 103 | // Run thought the asset folder 104 | klaw(activePath,{depthLimit: -1}) 105 | 106 | // Delete each file 107 | .pipe(deleteAction) 108 | 109 | // On each file deleted, calculate how much we have remaining of the size 110 | .on("data", (item:any) => { 111 | remainingSize = remainingSize + item.stats.size 112 | 113 | // Start at 90% if safe delete mode is allowed 114 | if (safeDeleteAllowed) { 115 | this.deleteProgress = Math.floor(remainingSize / assetSize * 10 + 90) 116 | } 117 | 118 | // Start at 0% if safe delete mode NOT allowed 119 | else{ 120 | this.deleteProgress = Math.floor(remainingSize / assetSize * 100) 121 | } 122 | 123 | }) 124 | 125 | // When we done, finish up and clean up 126 | .on("end", async() => { 127 | 128 | // Upon delete all files, delete all empty folders too, then set the progress to 50% since we did half the job 129 | await fs.remove(activePath) 130 | this.deleteProgress = 100 131 | 132 | // Wait 100ms before resetting the timer, since we want to report those 50% one more time 133 | setTimeout(() => { 134 | resolve() 135 | }, 1000) 136 | 137 | }) 138 | }) 139 | 140 | // Finally finish! 141 | return 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/scripts/fileManagers/downloadManagerMK.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | // Libs 6 | import downloader from "@elvanos/download" 7 | import fs from "fs-extra" 8 | 9 | 10 | /* ------------------------------ */ 11 | /* ------------CLASS------------ */ 12 | /* ------------------------------ */ 13 | 14 | 15 | /** 16 | * Manages downloading of assets/themes/etc. 17 | * The class expects the existence of proper Mythkeeper folder structure for the installation! 18 | */ 19 | export default class downloadManagerMK { 20 | 21 | 22 | /* ----------------------------------------------- */ 23 | /* ------------SECTION: DOWNLOAD FILE------------ */ 24 | /* ----------------------------------------------- */ 25 | 26 | 27 | /** 28 | * Unpacking progress % that gets update from "unpackFile" 29 | * @see unpackFile 30 | */ 31 | private downloadProgress : number|string = 0 32 | 33 | /** 34 | * Gets the value of "unpackProgress" 35 | * @see unpackProgress 36 | * @returns - Floored percentage 37 | */ 38 | getDownloadProgress(){ 39 | return this.downloadProgress 40 | } 41 | 42 | /** 43 | * Unpacks a zip file (or a single .wonderdraft_theme in edge cases) 44 | * @param downloadData - Data batch for the installer 45 | * @see unpackProgress 46 | */ 47 | public async downloadFile(downloadData){ 48 | 49 | return await new Promise(async (resolve) => { 50 | 51 | const runDownload = () => { 52 | // Set input URL 53 | let itemLink = `https://cartographyassets.com/mythkeeper-download/?product_id=${downloadData.itemRecourseId}&file_path=${encodeURIComponent(downloadData.inputUrl)}` 54 | 55 | console.log(itemLink) 56 | 57 | if (!fs.existsSync(downloadData.tempFolder)) { 58 | fs.mkdirSync(downloadData.tempFolder) 59 | } 60 | 61 | downloader(itemLink, downloadData.tempFolder) 62 | .on("response", res => { 63 | 64 | // Get normal CA file size 65 | let maxSize = res.headers["content-length"] 66 | let currentDownloadSize:number = 0 67 | 68 | // Update on received data 69 | res.on("data", (data) => { 70 | 71 | currentDownloadSize += data.length 72 | 73 | // If normal size 74 | if (maxSize) { 75 | this.downloadProgress = (Math.floor(currentDownloadSize / maxSize * 100) > 100)? 100: Math.floor(currentDownloadSize / maxSize * 100) 76 | 77 | } 78 | 79 | // If lacking max size 80 | else{ 81 | this.downloadProgress = (currentDownloadSize / 1024 / 1024).toFixed(1) + " MB" 82 | } 83 | }) 84 | }) 85 | .then(({data, filename}) => { 86 | 87 | resolve() 88 | 89 | }).catch(e => console.log(e)) 90 | 91 | } 92 | runDownload() 93 | 94 | }) 95 | 96 | } 97 | 98 | 99 | 100 | } 101 | -------------------------------------------------------------------------------- /src/scripts/fileManagers/iniManager.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import fs from "fs-extra" 8 | //@ts-ignore 9 | import iniReader from "ini" 10 | 11 | 12 | /* ---------------------------------------- */ 13 | /* ------------INI MANAGER CLASS---------- */ 14 | /* ---------------------------------------- */ 15 | 16 | /** 17 | * Class used to read and write INI files. 18 | */ 19 | export default class iniManager { 20 | 21 | /** 22 | * Read and parses an ini file 23 | * @param iniPath - An absolute path to the ini file 24 | * @returns any - The ini contents in JSON format OR a "false" if nothing was found 25 | */ 26 | static readIni(iniPath: string){ 27 | 28 | if (fs.existsSync(iniPath)){ 29 | return iniReader.parse(fs.readFileSync(iniPath, "utf-8")) 30 | } 31 | else{ 32 | return false 33 | } 34 | 35 | } 36 | 37 | /** 38 | * Writes an INI file 39 | * @param iniPath - An absolute path to the ini file 40 | * @param iniContent - JSON input of the INI contents 41 | */ 42 | static writeIni(iniPath: string,iniContent: any){ 43 | fs.writeFileSync(iniPath,iniReader.stringify(iniContent)) 44 | } 45 | 46 | /** 47 | * Writes INI specifically for Wonderdraft 48 | * @param iniPath - An absolute path to the ini file 49 | * @param iniContent - JSON input of the INI contents 50 | */ 51 | static modifyIniWDCustomAssetFolder(iniPath: string,iniContent: any){ 52 | 53 | // Replace all "\" with "\\" since WD wont read it otherwise 54 | const profilePath = iniContent.Preferences.custom_assets_directory.replace(/\\/g,"\\\\") 55 | 56 | // Read currently set INI settings 57 | let returnString = fs.readFileSync(iniPath, "utf-8") 58 | 59 | // If Custom asset Directory is set in the ini 60 | if (returnString.includes("custom_assets_directory=")){ 61 | 62 | // Replace everything after "custom_assets_directory=" with the "profilePath" 63 | returnString = returnString.replace(/(?<=custom_assets_directory=\")(.*)(?=\")/, profilePath) 64 | } 65 | 66 | // If Custom asset Directory is NOT set in the ini 67 | else{ 68 | 69 | // Add a whole new line after "[Preferences]" 70 | returnString = returnString.replace( 71 | "[Preferences]",`[Preferences]\n\ncustom_assets_directory="${profilePath}"`) 72 | } 73 | 74 | // Reset default theme and symbols set so we won't get errors in WD for switching profiles 75 | returnString = returnString.replace(/default_symbol_set="[a-zA-Z0-9:;\.\s\(\)\-\,]*"/, "") 76 | returnString = returnString.replace(/default_theme="[a-zA-Z0-9:;\.\s\(\)\-\,]*"/, "") 77 | 78 | // Finally write the INI file 79 | fs.writeFileSync(iniPath, returnString) 80 | 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceAsseFilterContent.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A structure of the filter data object 3 | * 4 | * @param names - A list of names of the object. This can either be the actual folder name or the name specified in the config file. 5 | * @param commercialUses - A list of commercial uses. Allowed, Forbidden or Non specified. 6 | * @param status - A lost of statuses. Active, Backup, Has config or No config. 7 | * @param authors - A list of authors and distributor. 8 | * @param licenses - A list of licenses. 9 | * @param tags - A list of tags. 10 | * @param filtersActive - A boolean representing the checkbox in the top menu that determines if the filters are being respected or not. 11 | * @param allSearch - The current value in the quick/all search. 12 | * @param sortingDirection - The sorting direction of the list. Ascending or Descending. 13 | */ 14 | interface assetFilterContentInterface{ 15 | names: string[] 16 | commercialUses: string[] 17 | status: string[] 18 | authors: string[] 19 | licenses: string[] 20 | tags: string[] 21 | filtersActive?: boolean 22 | allSearch?: any 23 | sortingDirection?: string 24 | } 25 | 26 | export default assetFilterContentInterface 27 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceAssetObject.ts: -------------------------------------------------------------------------------- 1 | // Imports 2 | import MKAssetsSettingsInterface from "@/scripts/interfaces/_interfaceMKAsssetSettings" 3 | 4 | /** 5 | * @param folderName - A name of the folder. 6 | * @param folderPath - A full folder path 7 | * @param hasBackup - Determines if the asset has backup or not. 8 | * @param status - Determines the status of the asset. Backup or Active. 9 | */ 10 | interface assetObjectInterface extends MKAssetsSettingsInterface{ 11 | folderName: string, 12 | folderPath: string, 13 | hasBackup: boolean, 14 | status: "active" | "backup" 15 | } 16 | 17 | export default assetObjectInterface 18 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceAssetProcessed.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Data structure for the author inside the overlayActionsInterface 3 | * 4 | * @param exists - Determines if the author exists or not. 5 | * @param name - Name of the author. 6 | * @param mail - Can be "false" if not included. Email address of the author. 7 | * @param url - Can be "false" if not included. URL website address of the author. 8 | * @param donationURL - Can be "false" if not included. URL donation address of the author. 9 | * 10 | * @see interfaceAssetProcessed 11 | */ 12 | interface interfaceAuthor{ 13 | exists: boolean 14 | name: string 15 | mail: boolean | string 16 | url: boolean | string 17 | donationURL: boolean | string 18 | } 19 | 20 | /** 21 | * Data structure for the author inside the overlayActionsInterface 22 | * 23 | * @param exists - Determines if the distributor exists or not. 24 | * @param name - Name of the distributor. 25 | * @param mail - Can be "false" if not included. Email address of the distributor. 26 | * @param url - Can be "false" if not included. URL website address of the distributor. 27 | * @param donationURL - Can be "false" if not included. URL donation address of the distributor. 28 | * 29 | * @see interfaceAssetProcessed 30 | */ 31 | interface interfaceDistributor{ 32 | exists: boolean 33 | name: string 34 | mail: boolean | string 35 | url: boolean | string 36 | donationURL: boolean | string 37 | } 38 | 39 | /** 40 | * Data structure for the author inside the overlayActionsInterface 41 | * 42 | * @param hasLicense - Determines if the license exists or not. 43 | * @param type - Name and type of the license. 44 | * @param localFile - Can be "false" if not included. Path to the local license file. 45 | * @param externalLink - Can be "false" if not included. URL website address to the license. 46 | * @param commentary - Can be "false" if not included. Path to the local commentary file. 47 | * @see interfaceAssetProcessed 48 | * 49 | */ 50 | interface interfaceLicense { 51 | hasLicense: boolean 52 | type: string 53 | localFile: boolean | string 54 | externalLink: boolean | string 55 | commentary: boolean | string 56 | } 57 | 58 | /** 59 | * Data structure for processed and properly formatted data from mkConfig.json 60 | * 61 | * @param title - Name of the asset. 62 | * @param imagePreview - Absolute path to the preview image. 63 | * @param gallery - Either set as "false" if the gallery is not allowed OR a list of absolute paths to gallery images. 64 | * @param version - Either "false" if not added or a string for the version. 65 | * @param description - Either "false" if not added or a string for description. 66 | * @param downloadURL - Either "false" if not added or a string for the URL. 67 | * @param tags - Either "false" if not added or a list of string for tags. 68 | * @param license - Either "false" if not added or "interfaceLicense" for details. 69 | * @param author - Either "false" if not added or "author" for details. 70 | * @param distributor - Either "false" if not added or "distributor" for details. 71 | * @param vendors - Can be undefined if not added or false if someone filled it in or a list of data vendors... this can be pretty much anything, so careful! 72 | * 73 | * @see interfaceAuthor 74 | * @see interfaceLicense 75 | * @see interfaceDistributor 76 | */ 77 | interface interfaceAssetProcessed{ 78 | title: string 79 | imagePreview: string 80 | gallery: boolean | string[] 81 | version: boolean | string 82 | description: boolean | string 83 | downloadURL: boolean | string 84 | tags: boolean | string[] 85 | license: boolean | interfaceLicense 86 | author: boolean | interfaceAuthor 87 | distributor: boolean | interfaceDistributor 88 | vendors?: boolean | { 89 | [key: string]: any 90 | } 91 | } 92 | 93 | export default interfaceAssetProcessed 94 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceBackgroundRenderWork.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A data structure for the background window worker process. 3 | * 4 | * @param command - A command for the backend work window. A list of available commands can be found in "main.ts" file at the core project level. 5 | * @param status - Determines the status of the request. Mostly used in "background.ts" file at the core project level. 6 | * @param taskID - Unique ID of the task. Automatically generates in "baseClass.ts" 7 | * @param progress - Numerical progress of the task being processed. Goes from 0 to 100. 8 | * @param data - Custom data for individual tasks. Can vary depending on each individual task. 9 | */ 10 | interface interfaceBackgroundRenderWork{ 11 | command: string 12 | status: "active" | "finished" | "accepted" | "update" 13 | taskID: string 14 | progress: number|string 15 | data?: { 16 | [key: string]: any 17 | } 18 | } 19 | 20 | export default interfaceBackgroundRenderWork 21 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceCAFilterContent.ts: -------------------------------------------------------------------------------- 1 | interface CAFilterContentInterface{ 2 | names: string[] 3 | authors: string[] 4 | prefixes: string[] 5 | categories: string[] 6 | commercialUses: string[] 7 | licenses: string[] 8 | tags: string[] 9 | compatibleMK:string[] 10 | installationState: string[] 11 | filtersActive?: boolean 12 | allSearch?: any 13 | sorting?: string 14 | } 15 | 16 | export default CAFilterContentInterface 17 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceInstaller.ts: -------------------------------------------------------------------------------- 1 | import typeInstallerPackageVariations from "@/scripts/interfaces/_typeInstallerPackageVariations" 2 | 3 | /** 4 | * Data structure for installer object 5 | * 6 | */ 7 | interface interfaceInstaller { 8 | installerFilePath: string, 9 | installerName: string | false, 10 | installerType: typeInstallerPackageVariations, 11 | hasOverWrapper: boolean, 12 | lacksWrapper: boolean, 13 | } 14 | 15 | export default interfaceInstaller 16 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceInstallerQueueMember.ts: -------------------------------------------------------------------------------- 1 | import interfaceUnpackInstaller from "@/scripts/interfaces/_interfaceUnpackInstaller" 2 | 3 | interface interfaceInstallerQueueMember{ 4 | timestamp: number 5 | masterPath: string 6 | name: string | false, 7 | sourceComponentData: interfaceUnpackInstaller 8 | extractionQueue: { 9 | folderPath: string 10 | folderToCopyPath: string, 11 | name: string, 12 | type: string, 13 | alreadyExists: boolean 14 | willInstall: boolean 15 | installedVersion: string 16 | newVersion: string 17 | }[] 18 | } 19 | 20 | export default interfaceInstallerQueueMember 21 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceMKAsssetSettings.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A ROUGH data structure of the JSON that MK uses for input 3 | * 4 | * @description Don't bother reading too much into this. Any of these things can be there or not, since this file is filled in by people who aren't very tech-savy most of the time. There is a HEAVY checking on the input to make sure nothing gets skipped or malformed. 5 | */ 6 | interface MKAssetsSettingsInterface { 7 | mkSettings?: { 8 | basicInformation?: any | { 9 | name?: any, 10 | version?: any, 11 | description?: any 12 | downloadURL?: any, 13 | tags?: any[], 14 | commercialUse?: any 15 | commercialURL?: any 16 | author?: any | { 17 | exists?: any, 18 | name?: any, 19 | mail?: any, 20 | url?: any 21 | donationURL?: any 22 | }, 23 | distributor?: any | { 24 | exists?: any, 25 | name?: any, 26 | mail?: any, 27 | url?: any 28 | donationURL?: any 29 | }, 30 | license?: { 31 | hasLicense?: any, 32 | type?: any, 33 | localFile?: any, 34 | externalLink?: any, 35 | commentary?: any 36 | }, 37 | }, 38 | vendors ?: { 39 | cartographyassetsID: number, 40 | cartographyassetsVersion: number 41 | } 42 | } 43 | } 44 | 45 | export default MKAssetsSettingsInterface 46 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceMKPaths.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * An array with all important Wonderdraft and Mythkeeper file paths 3 | * 4 | * @param - wdAssets - Base Wonderdraft path to the assets folder 5 | * @param - wdThemes - Base Wonderdraft path to the themes folder 6 | * @param - mkBase - Base Mythkeeper folder 7 | * @param - mkProfiles - Mythkeeper profiles folder 8 | * @param - mkBackup - Mythkeeper backup folder 9 | * @param - mkBackupAssets - Mythkeeper backup assets sub-folder 10 | * @param - mkBackupThemes - Mythkeeper backup themes sub-folder 11 | * @param - mkDeleted - Mythkeeper deleted folder 12 | * @param - mkDeletedAssets - Mythkeeper deleted assets sub-folder 13 | * @param - mkDeletedThemes - Mythkeeper deleted themes sub-folder 14 | * @param - mkTemp - Mythkeeper temporary folder (used to download/unpack stuff in) 15 | */ 16 | interface MKPathsInterface { 17 | wdBase: string 18 | wdAssets: string 19 | wdThemes: string 20 | wdBrushes: string 21 | mkBase: string 22 | mkProfiles: string 23 | mkBackup: string 24 | mkBackupAssets: string 25 | mkBackupThemes: string 26 | mkBackupBrushes: string 27 | mkDeleted: string 28 | mkDeletedAssets: string 29 | mkDeletedThemes: string 30 | mkDeletedBrushes: string 31 | mkTemp: string 32 | } 33 | 34 | export default MKPathsInterface 35 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceOverlayActions.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Data structure for the individual action inside the overlayActionsInterface 3 | * 4 | * @param title - Text content on the button 5 | * @param classes - A list of classes used on the button. Pass empty string for normal button. For empty button pass "q-btn--outline -noBG" 6 | * @param action - The action the button should trigger. Generally is "closeModal" for closing the overlay or "storeSetOverLayTriggerAction" if we want to trigger something via "param" (bellow) 7 | * @param param - A function name to be called on the component that originally called for the opening of the overlay upon clicking on the particular button. 8 | * @see overlayActionsInterface 9 | */ 10 | interface overlayActionsSubInterface{ 11 | title: string 12 | classes: string 13 | action: string 14 | param?: { 15 | functionName: string, 16 | data: any 17 | } 18 | } 19 | 20 | /** 21 | * Data structure for sending requests to the overlay actions 22 | * 23 | * @param componentID - A unique ID of the component the action was sent from. 24 | * @param title - Text title for the overlay. 25 | * @param contents - Text content for the overlay 26 | * @param actions - A list of actions with their attribututes 27 | * @see overlayActionsSubInterface 28 | */ 29 | interface overlayActionsInterface{ 30 | componentID: string, 31 | title: string, 32 | contents: string, 33 | downloadItems?: any[] 34 | actions: overlayActionsSubInterface[] 35 | } 36 | 37 | export default overlayActionsInterface 38 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceTask.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Data structure for a task object 3 | * 4 | * @param taskDescription - Generic, short description of what the task does (displays as label in the Tasklist) 5 | * @param taskName - The individual name of the task (eg: Elvanos Mountains) 6 | * @param uniqueComponentID - Passed from the component the task gets created from. 7 | * @param uniqueTaskID - Auto-generates from the baseClass. 8 | * @param progress - 1-100 value showing how much of the task is done. Gets updated via the background worker processes. 9 | */ 10 | interface taskInterface { 11 | taskDescription: string, 12 | taskName: string, 13 | uniqueComponentID: string, 14 | uniqueTaskID: string, 15 | progress: number|string 16 | } 17 | 18 | export default taskInterface 19 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_interfaceUnpackInstaller.ts: -------------------------------------------------------------------------------- 1 | interface interfaceUnpackInstaller{ 2 | askForOverwrite: boolean | null 3 | tempJSON: { 4 | vendors:{ 5 | cartographyassetsID: number 6 | cartographyassetsVersion: number 7 | } 8 | } 9 | unpackPath: string 10 | tempFolderPath: string 11 | componentLock: number 12 | } 13 | 14 | export default interfaceUnpackInstaller 15 | -------------------------------------------------------------------------------- /src/scripts/interfaces/_typeInstallerPackageVariations.ts: -------------------------------------------------------------------------------- 1 | type typeInstallerPackageVariations = "asset" | "theme" | "singleTheme" | "brush" | "specialBrush" | "package" | false 2 | 3 | export default typeInstallerPackageVariations 4 | -------------------------------------------------------------------------------- /src/scripts/uncategorized/pathChecker.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import fs from "fs-extra" 8 | import {remote} from "electron" 9 | 10 | 11 | /* ------------------------------ */ 12 | /* ------------CLASS------------ */ 13 | /* ------------------------------ */ 14 | 15 | 16 | export default class pathChecker { 17 | 18 | 19 | /* --------------------------------------------------- */ 20 | /* ------------SECTION: STATIC UTILITIES------------ */ 21 | /* --------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Sets the very, most default Wonderdraft path from Electron into the "AppData" folder on different devices 26 | */ 27 | static PATH_wdUserFolder = remote.app.getPath("appData") + "\\Wonderdraft" 28 | 29 | /** 30 | * Checks if a path exists and logs into console if it doesn't. 31 | * Essentially a pimped-up "fs.existSync". 32 | * @param folderPath - Absolute path to check. 33 | * @param suppressWarning - Determines if we want to suppress a console warning or not. Default on. 34 | * @returns True or False. 35 | */ 36 | static checkExist(folderPath: string, suppressWarning: boolean = false){ 37 | 38 | // If path exists 39 | if (fs.existsSync(folderPath)){ 40 | return true 41 | } 42 | 43 | // If path doesnt exist 44 | else { 45 | if(!suppressWarning){ 46 | console.warn(`Folder: "${folderPath}" doesn't exist.`) 47 | } 48 | return false 49 | } 50 | 51 | } 52 | 53 | /** 54 | * Quick check if Wondedrdraft user folder exists or not. 55 | * @returns True or False 56 | */ 57 | static existsWdUserFolder(){ 58 | return this.checkExist(this.PATH_wdUserFolder) 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/scripts/uncategorized/sortingAndFilterHelpers.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import assetObjectInterface from "@/scripts/interfaces/_interfaceAssetObject" 8 | 9 | 10 | /* ------------------------------ */ 11 | /* ------------CLASS------------ */ 12 | /* ------------------------------ */ 13 | 14 | 15 | export default class sortingAndFilterHelpers { 16 | 17 | 18 | /* --------------------------------------------- */ 19 | /* ------------SECTION: SORT ASSETS------------ */ 20 | /* --------------------------------------------- */ 21 | 22 | 23 | /** 24 | * Sorts a list of assets alphabetically. 25 | * Can sort from A to Z or from Z to A. 26 | * @param assetList - The list of assets. 27 | * @param reverse - Determines the sorting order. 28 | * @returns A sorted asset list. 29 | */ 30 | static sortAssetsAlphabetically(assetList: assetObjectInterface[], reverse : boolean = false){ 31 | assetList.sort((a: assetObjectInterface, b: assetObjectInterface) => { 32 | const textA = a.folderName.toUpperCase() 33 | const textB = b.folderName.toUpperCase() 34 | if (!reverse){ 35 | return (textA < textB) ? -1 : (textA > textB) ? 1 : 0 36 | } 37 | else{ 38 | return (textA > textB) ? -1 : (textA < textB) ? 1 : 0 39 | } 40 | }) 41 | return assetList 42 | } 43 | 44 | /** 45 | * Sorts a list of assets based on their status. 46 | * @param assetList - The list of assets. 47 | * @param reverse - Determines the sorting order. 48 | * @returns A sorted asset list. 49 | */ 50 | static sortAssetsByStatus(assetList: assetObjectInterface[], reverse : boolean = false){ 51 | assetList.sort((a: assetObjectInterface, b: assetObjectInterface) => { 52 | const statusA = (a.status === "active") ? 0 : (a.status === "backup") ? 1 : 10 53 | const statusB = (b.status === "active") ? 0 : (b.status === "backup") ? 1 : 10 54 | if (!reverse){ 55 | return (statusA < statusB) ? -1 : (statusA > statusB) ? 1 : 0 56 | } 57 | else{ 58 | return (statusA > statusB) ? -1 : (statusA < statusB) ? 1 : 0 59 | } 60 | }) 61 | return assetList 62 | } 63 | 64 | 65 | /* ------------------------------------------------------ */ 66 | /* ------------SECTION: SORT DOWNLOAD ITEMS------------ */ 67 | /* ------------------------------------------------------ */ 68 | 69 | static sortDownloadItemsByAlphabetical(list: any[], reverse: boolean = false): any[]{ 70 | list.sort((a: any, b: any) => { 71 | const textA = a.title.toUpperCase() 72 | const textB = b.title.toUpperCase() 73 | if (!reverse){ 74 | return (textA < textB) ? -1 : (textA > textB) ? 1 : 0 75 | } 76 | else{ 77 | return (textA > textB) ? -1 : (textA < textB) ? 1 : 0 78 | } 79 | }) 80 | return list 81 | } 82 | 83 | static sortDownloadItemsByRating(list: any[], reverse: boolean = false): any[]{ 84 | list.sort((a: any, b: any) => { 85 | const valueA = a.rating_avg 86 | const valueB = b.rating_avg 87 | if (!reverse){ 88 | return (valueA < valueB) ? -1 : (valueA > valueB) ? 1 : 0 89 | } 90 | else{ 91 | return (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0 92 | } 93 | }) 94 | return list 95 | } 96 | 97 | static sortDownloadItemsByLastUpdate(list: any[], reverse: boolean = false){ 98 | list.sort((a: any, b: any) => { 99 | const valueA = a.last_update 100 | const valueB = b.last_update 101 | if (!reverse){ 102 | return (valueA < valueB) ? -1 : (valueA > valueB) ? 1 : 0 103 | } 104 | else{ 105 | return (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0 106 | } 107 | }) 108 | return list 109 | 110 | } 111 | 112 | static sortDownloadItemsByUploaded(list: any[], reverse: boolean = false){ 113 | list.sort((a: any, b: any) => { 114 | const valueA = a.resource_date 115 | const valueB = b.resource_date 116 | if (!reverse){ 117 | return (valueA < valueB) ? -1 : (valueA > valueB) ? 1 : 0 118 | } 119 | else{ 120 | return (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0 121 | } 122 | }) 123 | return list 124 | 125 | } 126 | 127 | static sortDownloadItemsByDownloads(list: any[], reverse: boolean = false){ 128 | list.sort((a: any, b: any) => { 129 | const valueA = a.download_count 130 | const valueB = b.download_count 131 | if (!reverse){ 132 | return (valueA < valueB) ? -1 : (valueA > valueB) ? 1 : 0 133 | } 134 | else{ 135 | return (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0 136 | } 137 | }) 138 | return list 139 | 140 | } 141 | 142 | } 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workBackupAsset.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import BackupManagerMK from "@/scripts/fileManagers/backupManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workBackupAsset = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Make new instance 24 | const backupManager = new BackupManagerMK() 25 | 26 | // Backup the actual files 27 | if(workData.data){ 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = backupManager.getBackupProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the backup to finish 37 | await backupManager.backupSingle(workData.data.folderName, workData.data.mkPaths) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | workData.progress = 100 42 | workData.status = "finished" 43 | 44 | // Signal the main background process that we are done 45 | ipcRenderer.send("asynchronous-message", workData) 46 | 47 | } 48 | 49 | // If the data isn't set for some reason, terminate and throw an orderly error. 50 | else{ 51 | const newCommand: interfaceBackgroundRenderWork = { 52 | taskID: workData.taskID, 53 | status: "finished", 54 | progress: 0, 55 | command: "ERROR IN: backupAsset-work" 56 | } 57 | 58 | // Signal the main background process that we are done 59 | ipcRenderer.send("asynchronous-message", newCommand) 60 | } 61 | 62 | } 63 | export default workBackupAsset 64 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workDeleteAsset.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import DeleteManagerMK from "@/scripts/fileManagers/deleteManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workDeleteAsset = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Make new instance 24 | const deleteManager = new DeleteManagerMK() 25 | 26 | // Backup the actual files 27 | if(workData.data){ 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = deleteManager.getDeleteProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the delete to finish 37 | await deleteManager.deleteSingle(workData.data.folderName, workData.data.mkPaths, workData.data.safeDelete) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | workData.progress = 100 42 | workData.status = "finished" 43 | 44 | // Signal the main background process that we are done 45 | ipcRenderer.send("asynchronous-message", workData) 46 | 47 | } 48 | 49 | // If the data isn't set for some reason, terminate and throw an orderly error. 50 | else{ 51 | const newCommand: interfaceBackgroundRenderWork = { 52 | taskID: workData.taskID, 53 | status: "finished", 54 | progress: 0, 55 | command: "ERROR IN: deleteAsset-work" 56 | } 57 | 58 | // Signal the main background process that we are done 59 | ipcRenderer.send("asynchronous-message", newCommand) 60 | } 61 | 62 | } 63 | export default workDeleteAsset 64 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workDeleteBackupAsset.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import BackupManagerMK from "@/scripts/fileManagers/backupManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workDeleteBackupAsset = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Make new instance 24 | const backupManager = new BackupManagerMK() 25 | 26 | // Backup the actual files 27 | if(workData.data){ 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = backupManager.getDeleteProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the backup delete to finish 37 | await backupManager.deleteSingleBackup(workData.data.folderName, workData.data.mkPaths, workData.data.safeDelete) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | 42 | workData.progress = 100 43 | workData.status = "finished" 44 | 45 | // Signal the main background process that we are done 46 | ipcRenderer.send("asynchronous-message", workData) 47 | 48 | } 49 | 50 | // If the data isn't set for some reason, terminate and throw an orderly error. 51 | else{ 52 | const newCommand: interfaceBackgroundRenderWork = { 53 | taskID: workData.taskID, 54 | status: "finished", 55 | progress: 0, 56 | command: "ERROR IN: deleteBackupAsset-work" 57 | } 58 | 59 | // Signal the main background process that we are done 60 | ipcRenderer.send("asynchronous-message", newCommand) 61 | } 62 | 63 | 64 | } 65 | 66 | export default workDeleteBackupAsset 67 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workDownloadFile.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import DownloadManagerMK from "@/scripts/fileManagers/downloadManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workDownloadFile = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Backup the actual files 24 | if(workData.data){ 25 | 26 | // Make new instance 27 | const downloadManager = new DownloadManagerMK() 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = downloadManager.getDownloadProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the unpacker to finish 37 | const downloadResult = await downloadManager.downloadFile(workData.data) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | 42 | workData.progress = 100 43 | workData.status = "finished" 44 | workData.data.response = downloadResult 45 | 46 | // Signal the main background process that we are done 47 | ipcRenderer.send("asynchronous-message", workData) 48 | 49 | } 50 | 51 | // If the data isn't set for some reason, terminate and throw an orderly error. 52 | else{ 53 | const newCommand: interfaceBackgroundRenderWork = { 54 | taskID: workData.taskID, 55 | status: "finished", 56 | progress: 0, 57 | command: "ERROR IN: downloadItem-work" 58 | } 59 | 60 | // Signal the main background process that we are done 61 | ipcRenderer.send("asynchronous-message", newCommand) 62 | } 63 | 64 | 65 | } 66 | 67 | export default workDownloadFile 68 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workInstallFile.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import InstallManagerMK from "@/scripts/fileManagers/installManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workInstallFile = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Backup the actual files 24 | if(workData.data){ 25 | 26 | // Make new instance 27 | const unpackManager = new InstallManagerMK(workData.data.mkPaths, workData.data.timestamp ) 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = unpackManager.getInstallationProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the unpacker to finish 37 | await unpackManager.installSingle(workData.data.installationItem.folderPath,workData.data.installationItem.folderToCopyPath) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | 42 | workData.progress = 100 43 | workData.status = "finished" 44 | 45 | // Signal the main background process that we are done 46 | ipcRenderer.send("asynchronous-message", workData) 47 | 48 | } 49 | 50 | // If the data isn't set for some reason, terminate and throw an orderly error. 51 | else{ 52 | const newCommand: interfaceBackgroundRenderWork = { 53 | taskID: workData.taskID, 54 | status: "finished", 55 | progress: 0, 56 | command: "ERROR IN: installFile-work" 57 | } 58 | 59 | // Signal the main background process that we are done 60 | ipcRenderer.send("asynchronous-message", newCommand) 61 | } 62 | 63 | 64 | } 65 | 66 | export default workInstallFile 67 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workRestoreBackupAsset.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import BackupManagerMK from "@/scripts/fileManagers/backupManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workRestoreBackupAsset = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Make new instance 24 | const backupManager = new BackupManagerMK() 25 | 26 | // Backup the actual files 27 | if(workData.data){ 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = backupManager.getRestoreProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the restore to finish 37 | await backupManager.restoreSingle(workData.data.folderName, workData.data.mkPaths) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | 42 | workData.progress = 100 43 | workData.status = "finished" 44 | 45 | // Signal the main background process that we are done 46 | ipcRenderer.send("asynchronous-message", workData) 47 | 48 | } 49 | 50 | // If the data isn't set for some reason, terminate and throw an orderly error. 51 | else{ 52 | const newCommand: interfaceBackgroundRenderWork = { 53 | taskID: workData.taskID, 54 | status: "finished", 55 | progress: 0, 56 | command: "ERROR IN: restoreBackupAsset-work" 57 | } 58 | 59 | // Signal the main background process that we are done 60 | ipcRenderer.send("asynchronous-message", newCommand) 61 | } 62 | 63 | } 64 | export default workRestoreBackupAsset 65 | -------------------------------------------------------------------------------- /src/scripts/workWindowTasks/workUnpackFile.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import {ipcRenderer} from "electron" 8 | 9 | // Interfaces 10 | import interfaceBackgroundRenderWork from "@/scripts/interfaces/_interfaceBackgroundRenderWork" 11 | 12 | // Scripts 13 | import InstallManagerMK from "@/scripts/fileManagers/installManagerMK" 14 | 15 | 16 | /* ------------------------------------ */ 17 | /* ------------MAIN FUNCTION---------- */ 18 | /* ------------------------------------ */ 19 | 20 | 21 | const workUnpackFile = async (workData: interfaceBackgroundRenderWork) => { 22 | 23 | // Backup the actual files 24 | if(workData.data){ 25 | 26 | // Make new instance 27 | const unpackManager = new InstallManagerMK(workData.data.mkPaths, workData.data.timestamp ) 28 | 29 | // Set timer for reporting 30 | const reportTimer = setInterval(() => { 31 | workData.status = "update" 32 | workData.progress = unpackManager.getUnpackProgress() 33 | ipcRenderer.send("asynchronous-message", workData) 34 | }, 1000) 35 | 36 | // Wait for the unpacker to finish 37 | await unpackManager.unpackFile(workData.data.installationType) 38 | 39 | // Cleanup and removal of the task from the tasklist 40 | clearInterval(reportTimer) 41 | 42 | workData.progress = 100 43 | workData.status = "finished" 44 | 45 | // Signal the main background process that we are done 46 | ipcRenderer.send("asynchronous-message", workData) 47 | 48 | } 49 | 50 | // If the data isn't set for some reason, terminate and throw an orderly error. 51 | else{ 52 | const newCommand: interfaceBackgroundRenderWork = { 53 | taskID: workData.taskID, 54 | status: "finished", 55 | progress: 0, 56 | command: "ERROR IN: unpackFile-work" 57 | } 58 | 59 | // Signal the main background process that we are done 60 | ipcRenderer.send("asynchronous-message", newCommand) 61 | } 62 | 63 | 64 | } 65 | 66 | export default workUnpackFile 67 | -------------------------------------------------------------------------------- /src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from "vue" 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.vue" { 2 | import Vue from "vue" 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceDisabledModulesVisibility.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceDisabledModulesVisibility extends VuexModule { 17 | 18 | 19 | /* -------------------------------------------------------------- */ 20 | /* ------------SECTION: DISABLED MODULES VISIBILITY------------ */ 21 | /* -------------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Disabled modules are currently allowed to show or not. 26 | * They show by default, but can be turned off manually. 27 | */ 28 | areDisabledModulesShowing: boolean = true 29 | 30 | /** 31 | * Retrieves the Disabled modules visibility allowance. 32 | * Returns true/false. 33 | * @returns areDisabledModulesShowing 34 | */ 35 | get storeGetAreDisabledModulesShowing() { 36 | return this.areDisabledModulesShowing 37 | } 38 | 39 | /** 40 | * Sets the Disabled modules visibility allowance to true or false. 41 | * @param areShown - Determines if the Disabled modules visibility allowance is on or off. 42 | * @see isProfilesModuleAllowed 43 | */ 44 | @Mutation 45 | SET_ARE_DISABLED_MODULES_SHOWING(areShown: boolean) { 46 | this.areDisabledModulesShowing = areShown 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Disabled modules visibility allowance. 51 | * @param areShown - Determines if the Disabled modules visibility allowance is on or off. 52 | * @see SET_ARE_DISABLED_MODULES_SHOWING 53 | */ 54 | @Action 55 | async storeSetAreDisabledModulesShowing(areShown: boolean) { 56 | this.context.commit("SET_ARE_DISABLED_MODULES_SHOWING", areShown) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceExpertMode.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceExpertMode extends VuexModule { 17 | 18 | 19 | /* -------------------------------------------------------- */ 20 | /* ------------SECTION: EXPERT MODE ALLOWANCE------------ */ 21 | /* -------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Expert mode is currently allowed or not. 26 | * Disabled by default, can be turned on from the settings. 27 | */ 28 | isExpertModeAllowed: boolean = false 29 | 30 | /** 31 | * Retrieves the Expert mode allowance. 32 | * Returns true/false. 33 | * @returns isExpertModeAllowed 34 | */ 35 | get storeGetIsExpertModeAllowed() { 36 | return this.isExpertModeAllowed 37 | } 38 | 39 | /** 40 | * Sets the Expert mode allowance to true or false. 41 | * @param expertMode - Determines if the Expert mode allowance is on or off. 42 | * @see isExpertModeAllowed 43 | */ 44 | @Mutation 45 | SET_IS_EXPERT_MODE_ALLOWED(expertMode: boolean) { 46 | this.isExpertModeAllowed = expertMode 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Expert mode allowance. 51 | * @param expertMode - Determines if the Expert mode allowance is on or off. 52 | * @see SET_IS_EXPERT_MODE_ALLOWED 53 | */ 54 | @Action 55 | async storeSetIsExpertModeAllowed(expertMode: boolean) { 56 | this.context.commit("SET_IS_EXPERT_MODE_ALLOWED", expertMode) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceProfile.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceProfile extends VuexModule { 17 | 18 | 19 | /* ---------------------------------------------------- */ 20 | /* ------------SECTION: PROFILE ALLOWANCE------------ */ 21 | /* ---------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Profiles module is currently allowed or not. 26 | * It is disabled by default, but can be turned on manually. 27 | */ 28 | isProfilesModuleAllowed: boolean = false 29 | 30 | /** 31 | * Retrieves the Profile module allowance. 32 | * Returns true/false. 33 | * @returns isProfilesModuleAllowed 34 | */ 35 | get storeGetIsProfilesModuleAllowed() { 36 | return this.isProfilesModuleAllowed 37 | } 38 | 39 | /** 40 | * Sets the Profile module allowance to either true or false. 41 | * @param isAllowed - Determines if the Profiles module is turned on or not. 42 | * @see isProfilesModuleAllowed 43 | */ 44 | @Mutation 45 | SET_IS_PROFILE_MODULE_ALLOWED(isAllowed: boolean) { 46 | this.isProfilesModuleAllowed = isAllowed 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Profile module allowance. 51 | * @param isAllowed - Determines if the Profiles module is turned on or not. 52 | * @see SET_IS_PROFILE_MODULE_ALLOWED 53 | */ 54 | @Action 55 | async storeSetIsProfilesModuleAllowed(isAllowed: boolean) { 56 | this.context.commit("SET_IS_PROFILE_MODULE_ALLOWED", isAllowed) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceRichTooltips.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceRichTooltips extends VuexModule { 17 | 18 | 19 | /* ---------------------------------------------------------- */ 20 | /* ------------SECTION: RICH TOOLTIPS ALLOWANCE------------ */ 21 | /* ---------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Rich tooltips are currently allowed or not. 26 | * Enabled by default, can be turned off from the settings. 27 | */ 28 | isRichTooltipsAllowed: boolean = true 29 | 30 | /** 31 | * Retrieves the Rich tooltips allowance. 32 | * Returns true/false. 33 | * @returns isRichTooltipsAllowed 34 | */ 35 | get storeGetIsRichTooltipsAllowed() { 36 | return this.isRichTooltipsAllowed 37 | } 38 | 39 | /** 40 | * Sets the Rich tooltips allowance to true or false. 41 | * @param richTooltips - Determines if the Rich tooltips allowance is on or off. 42 | * @see isRichTooltipsAllowed 43 | */ 44 | @Mutation 45 | SET_IS_RICH_TOOLTIPS_ALLOWED(richTooltips: boolean) { 46 | this.isRichTooltipsAllowed = richTooltips 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Rich tooltips allowance. 51 | * @param richTooltips - Determines if the Rich tooltips allowance is on or off. 52 | * @see SET_IS_RICH_TOOLTIPS_ALLOWED 53 | */ 54 | @Action 55 | async storeSetIsRichTooltipsAllowed(richTooltips: boolean) { 56 | this.context.commit("SET_IS_RICH_TOOLTIPS_ALLOWED", richTooltips) 57 | } 58 | 59 | } 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceSafeDeletion.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceSafeDeletion extends VuexModule { 17 | 18 | 19 | /* ---------------------------------------------------------------- */ 20 | /* ------------SECTION: SAFE DELETION MODE ALLOWANCE------------ */ 21 | /* ---------------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Safe deletion mode is currently allowed or not. 26 | * Enabled by default, can be turned off from the settings. 27 | */ 28 | isSafeDeleteAllowed: boolean = true 29 | 30 | /** 31 | * Retrieves the Safe deletion mode allowance. 32 | * Returns true/false. 33 | * @returns isSafeDeleteAllowed 34 | */ 35 | get storeGetIsSafeDeleteAllowed() { 36 | return this.isSafeDeleteAllowed 37 | } 38 | 39 | /** 40 | * Sets the Safe deletion mode allowance to true or false. 41 | * @param safeDelete - Determines if the Safe deletion mode allowance is on or off. 42 | * @see isSafeDeleteAllowed 43 | */ 44 | @Mutation 45 | SET_IS_SAFE_DELETE_ALLOWED(safeDelete: boolean) { 46 | this.isSafeDeleteAllowed = safeDelete 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Safe deletion mode allowance. 51 | * @param safeDelete - Determines if the Safe deletion mode allowance is on or off. 52 | * @see SET_IS_SAFE_DELETE_ALLOWED 53 | */ 54 | @Action 55 | async storeSetIsSafeDeleteAllowed(safeDelete: boolean) { 56 | this.context.commit("SET_IS_SAFE_DELETE_ALLOWED", safeDelete) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/store/_appSettings/_allowanceStartUpTooltips.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class allowanceStartUpTooltips extends VuexModule { 17 | 18 | 19 | /* --------------------------------------------------------- */ 20 | /* ------------SECTION: STARTUP TIPS ALLOWANCE------------ */ 21 | /* --------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines if the Startup tips are currently allowed or not. 26 | * Enabled by default, can be turned off from the settings. 27 | */ 28 | isStartupTipsAllowed: boolean = true 29 | 30 | /** 31 | * Retrieves the Startup tips allowance. 32 | * Returns true/false. 33 | * @returns isStartupTipsAllowed 34 | */ 35 | get storeGetIsStartupTipsAllowed() { 36 | return this.isStartupTipsAllowed 37 | } 38 | 39 | /** 40 | * Sets the Startup tips allowance to true or false. 41 | * @param startupTips - Determines if the Startup tips allowance is on or off. 42 | * @see isStartupTipsAllowed 43 | */ 44 | @Mutation 45 | SET_IS_STARTUP_TIPS_ALLOWED(startupTips: boolean) { 46 | this.isStartupTipsAllowed = startupTips 47 | } 48 | 49 | /** 50 | * Commits a mutation to modify the Startup tips allowance. 51 | * @param startupTips - Determines if the Startup tips allowance is on or off. 52 | * @see SET_IS_STARTUP_TIPS_ALLOWED 53 | */ 54 | @Action 55 | async storeSetIsStartupTipsAllowed(startupTips: boolean) { 56 | this.context.commit("SET_IS_STARTUP_TIPS_ALLOWED", startupTips) 57 | } 58 | 59 | } 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/store/_appSettings/_pathCustomAssetsFolder.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class pathCustomAssetsFolder extends VuexModule { 17 | 18 | 19 | /* ------------------------------------------------------- */ 20 | /* ------------SECTION: CUSTOM ASSETS FOLDER------------ */ 21 | /* ------------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * An absolute path leading to the Wonderdraft custom assets folder 26 | */ 27 | PATH_customAssetFolder: string = "" 28 | 29 | /** 30 | * Retrieves the Wonderdraft user custom assets folder 31 | * @returns PATH_customAssetFolder 32 | */ 33 | get storeGet_PATH_customAssetFolder() { 34 | return this.PATH_customAssetFolder 35 | } 36 | 37 | /** 38 | * Modifies the custom assets folder state with a new path. 39 | * @param pathInput - The new absolute path to modify the state with. 40 | * @see PATH_customAssetFolder 41 | */ 42 | @Mutation 43 | SET_PATH_CUSTOM_ASSET_FOLDER(pathInput: string) { 44 | this.PATH_customAssetFolder = pathInput 45 | } 46 | 47 | /** 48 | * Commits a mutation to modify the custom assets folder. 49 | * @param pathInput - The new absolute path to modify the state with. 50 | * @see SET_PATH_CUSTOM_ASSET_FOLDER 51 | */ 52 | @Action 53 | async storeSet_PATH_customAssetFolder(pathInput: string) { 54 | this.context.commit("SET_PATH_CUSTOM_ASSET_FOLDER", pathInput) 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/store/_appSettings/_pathProfileBase.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class pathProfileBase extends VuexModule { 17 | 18 | 19 | /* ---------------------------------------------------- */ 20 | /* ------------SECTION: PROFILE BASE PATH------------ */ 21 | /* ---------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * An absolute path leading the Mythkeeper profiles base folder 26 | * This is generally the same as either Wonderdraft custom assets folder or Wonderdraft base path. 27 | * @see PATH_userFolder 28 | * @see PATH_customAssetFolder 29 | */ 30 | PATH_profileBasePath: string = "" 31 | 32 | /** 33 | * Retrieves the Mythkeeper profiles base folder 34 | * @returns PATH_profileBasePath 35 | */ 36 | get storeGet_PATH_profileBasePath() { 37 | return this.PATH_profileBasePath 38 | } 39 | 40 | /** 41 | * Modifies the custom profiles base folder state with a new path. 42 | * @param pathInput - The new absolute path to modify the state with. 43 | * @see PATH_profileBasePath 44 | */ 45 | @Mutation 46 | SET_PATH_PATH_PROFILE_BASE_PATH(pathInput: string) { 47 | this.PATH_profileBasePath = pathInput 48 | } 49 | 50 | /** 51 | * Commits a mutation to modify the profiles base folder. 52 | * @param pathInput - The new absolute path to modify the state with. 53 | * @see SET_PATH_PATH_PROFILE_BASE_PATH 54 | */ 55 | @Action 56 | async storeSet_PATH_profileBasePath(pathInput: string) { 57 | this.context.commit("SET_PATH_PATH_PROFILE_BASE_PATH", pathInput) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/store/_appSettings/_pathUserFolder.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class pathUserFolder extends VuexModule { 17 | 18 | 19 | /* ---------------------------------------------- */ 20 | /* ------------SECTION: USER FOLDER------------ */ 21 | /* ---------------------------------------------- */ 22 | 23 | 24 | /** 25 | * An absolute path leading to the Wonderdraft user folder 26 | */ 27 | PATH_userFolder: string = "" 28 | 29 | /** 30 | * Retrieves the Wonderdraft user folder path 31 | * @returns PATH_userFolder 32 | */ 33 | get storeGet_PATH_userFolder() { 34 | return this.PATH_userFolder 35 | } 36 | 37 | /** 38 | * Modifies the user folder state with a new path. 39 | * @param pathInput - The new absolute path to modify the state with. 40 | * @see PATH_userFolder 41 | */ 42 | @Mutation 43 | SET_PATH_USERFOLDER(pathInput: string) { 44 | this.PATH_userFolder = pathInput 45 | } 46 | 47 | /** 48 | * Commits a mutation to modify the user folder. 49 | * @param pathInput - The new absolute path to modify the state with. 50 | * @see SET_PATH_USERFOLDER 51 | */ 52 | @Action 53 | async storeSet_PATH_userFolder(pathInput: string) { 54 | this.context.commit("SET_PATH_USERFOLDER", pathInput) 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/store/_componentLock/_componentLock.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class componentLock extends VuexModule { 17 | 18 | 19 | /* -------------------------------------------------- */ 20 | /* ------------SECTION: COMPONENT LOCK ------------ */ 21 | /* -------------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines the list of current locked components based on absolute path string for each component. 26 | */ 27 | componentLocks: string[] = [] 28 | 29 | /** 30 | * Retrieves the current list of currently locked components 31 | * @returns componentLocks 32 | */ 33 | get storeGetComponentLocks() { 34 | return this.componentLocks 35 | } 36 | 37 | 38 | /* ------------Sub-section: ADD LOCK ------------ */ 39 | 40 | /** 41 | * Adds a component lock to the list. 42 | * @param lockPath - An absolute path of whatever component is getting locked. 43 | * @see componentLocks 44 | */ 45 | @Mutation 46 | ADD_COMPONENT_LOCK(lockPath: string) { 47 | this.componentLocks.push(lockPath) 48 | } 49 | 50 | /** 51 | * Commits a component lock to be added into the list 52 | * @param lockPath - An absolute path of whatever component is getting locked. 53 | * @see ADD_COMPONENT_LOCK 54 | */ 55 | @Action 56 | async storeAddComponentLock(lockPath: string) { 57 | this.context.commit("ADD_COMPONENT_LOCK", lockPath) 58 | } 59 | 60 | 61 | /* ------------Sub-section: REMOVE LOCK ------------ */ 62 | 63 | /** 64 | * Removes a component lock from the list. 65 | * @param lockPath - An absolute path of whatever component is being removed. 66 | * @see componentLocks 67 | */ 68 | @Mutation 69 | REMOVE_COMPONENT_LOCK(lockPath: string) { 70 | // Filter out the lock we need from the lock list based on the path of the current lock being removed. 71 | let lockIndex: number = -1 72 | this.componentLocks.forEach((singleLock, index)=> { 73 | 74 | // When we find one, set the index to it 75 | if (singleLock === lockPath){ 76 | lockIndex = index 77 | } 78 | }) 79 | 80 | // Remove the lock 81 | this.componentLocks.splice( lockIndex, 1) 82 | } 83 | 84 | /** 85 | * Commits a component lock to be removed from the list 86 | * @param lockPath - An absolute path of whatever component is being removed. 87 | * @see REMOVE_COMPONENT_LOCK 88 | */ 89 | @Action 90 | async storeRemoveComponentLock(lockPath: string) { 91 | this.context.commit("REMOVE_COMPONENT_LOCK", lockPath) 92 | } 93 | 94 | 95 | /* ------------------------------------------------------- */ 96 | /* ------------SECTION: COMPONENT LOCK RESET------------ */ 97 | /* ------------------------------------------------------- */ 98 | 99 | 100 | /** 101 | * Sets the component locks to empty state. 102 | * @see componentLocks 103 | */ 104 | @Mutation 105 | RESET_COMPONENT_LOCKS() { 106 | this.componentLocks = [] 107 | } 108 | 109 | /** 110 | * Commits the component locks reset. 111 | * @see RESET_COMPONENT_LOCKS 112 | */ 113 | @Action 114 | async storeResetComponentLocks() { 115 | this.context.commit("RESET_COMPONENT_LOCKS") 116 | } 117 | 118 | 119 | 120 | } 121 | 122 | 123 | -------------------------------------------------------------------------------- /src/store/_installQueue/_installQueue.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | import interfaceOverlayActions from "@/scripts/interfaces/_interfaceOverlayActions" 9 | import interfaceInstallerQueueMember from "@/scripts/interfaces/_interfaceInstallerQueueMember" 10 | import interfaceTask from "@/scripts/interfaces/_interfaceTask" 11 | import {extend as qExtend} from "quasar" 12 | 13 | 14 | /* ---------------------------- */ 15 | /* ------------MODULE---------- */ 16 | /* ---------------------------- */ 17 | 18 | 19 | @Module 20 | export default class installQueue extends VuexModule { 21 | 22 | 23 | /* ------------------------------------------------ */ 24 | /* ------------SECTION: ACTIVE MODULE------------ */ 25 | /* ------------------------------------------------ */ 26 | 27 | 28 | /** 29 | * Determines the current active module component. 30 | */ 31 | installationQueue: interfaceInstallerQueueMember[] = [] 32 | 33 | /** 34 | * Retrieves the current active module component name. 35 | * @returns installationQueue 36 | */ 37 | get storeGetInstallationQueue() { 38 | return this.installationQueue 39 | } 40 | 41 | 42 | /* ------------Sub-section: ADD TO INSTALLATION QUEUE ------------ */ 43 | 44 | /** 45 | * Adds new task to the task list. 46 | * @param newInstallationQueue - A new task to be added to the list. 47 | * @see taskList 48 | */ 49 | @Mutation 50 | ADD_TO_INSTALLATION_QUEUE(newInstallationQueue: interfaceInstallerQueueMember) { 51 | this.installationQueue.push(newInstallationQueue) 52 | } 53 | 54 | /** 55 | * Commits a new task to be added to the list. 56 | * @param newInstallationQueue - A new task to be added to the list. 57 | * @see ADD_TO_INSTALLATION_QUEUE 58 | */ 59 | @Action 60 | async storeAddToInstallationQueue(newInstallationQueue: interfaceInstallerQueueMember) { 61 | this.context.commit("ADD_TO_INSTALLATION_QUEUE", newInstallationQueue) 62 | } 63 | 64 | 65 | /* ------------Sub-section: REMOVE FROM INSTALLATION QUEUE ------------ */ 66 | 67 | /** 68 | * Removes a task from the list 69 | * @param removeQueue - Task to be removed 70 | * @see taskList 71 | */ 72 | @Mutation 73 | REMOVE_FROM_INSTALLATION_QUEUE(removeQueue: interfaceInstallerQueueMember) { 74 | 75 | // Filter out the queue from the list global list based on the timestamp 76 | let queueIndex: number = -1 77 | this.installationQueue.forEach((singleTask, index)=> { 78 | const queueObject : any = {} 79 | qExtend(true, queueObject, singleTask) 80 | 81 | if (queueObject.uniqueTaskID === removeQueue.timestamp) {queueIndex = index} 82 | }) 83 | 84 | // Remove the queue 85 | this.installationQueue.splice( queueIndex, 1) 86 | 87 | } 88 | 89 | /** 90 | * Commits a task to be removed from the list. 91 | * @param taskToRemove - Task to be removed 92 | */ 93 | @Action 94 | async storeRemoveFromInstallationQueue(taskToRemove: interfaceInstallerQueueMember) { 95 | this.context.commit("REMOVE_FROM_INSTALLATION_QUEUE", taskToRemove) 96 | } 97 | 98 | 99 | /* --------------------------------------------------------------- */ 100 | /* ------------SECTION: RESET INSTALLATION QUEUE---------------- */ 101 | /* --------------------------------------------------------------- */ 102 | 103 | 104 | /** 105 | * Cleans the installation queue 106 | * @see installationQueue 107 | */ 108 | @Mutation 109 | RESET_INSTALLATION_QUEUE() { 110 | 111 | this.installationQueue = [] 112 | 113 | } 114 | 115 | /** 116 | * Commits an installation queue reset. 117 | * @see RESET_INSTALLATION_QUEUE 118 | */ 119 | @Action 120 | async storeResetInstallationQueue() { 121 | this.context.commit("RESET_INSTALLATION_QUEUE") 122 | } 123 | 124 | } 125 | -------------------------------------------------------------------------------- /src/store/_profiles/_profiles.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 8 | 9 | 10 | /* ---------------------------- */ 11 | /* ------------MODULE---------- */ 12 | /* ---------------------------- */ 13 | 14 | 15 | @Module 16 | export default class profiles extends VuexModule { 17 | 18 | 19 | /* ------------------------------------------- */ 20 | /* ------------SECTION: PROFILES ------------ */ 21 | /* ------------------------------------------- */ 22 | 23 | 24 | /** 25 | * Determines the current active profile name. 26 | * Matches the name of the directory the profile is in. 27 | */ 28 | activeProfile: string = "Default" 29 | 30 | /** 31 | * Retrieves the name of the current active profile. 32 | * @returns activeProfile 33 | */ 34 | get storeGetActiveProfile() { 35 | return this.activeProfile 36 | } 37 | 38 | /** 39 | * Sets the currently active profile. 40 | * @param profile - A string name of the current active profile matching the directory on the hard disk. 41 | * @see activeProfile 42 | */ 43 | @Mutation 44 | SET_ACTIVE_PROFILE(profile: string) { 45 | this.activeProfile = profile 46 | } 47 | 48 | /** 49 | * Commits the currently active profile. 50 | * @param profile - A string name of the current active profile matching the directory on the hard disk. 51 | * @see SET_ACTIVE_PROFILE 52 | */ 53 | @Action 54 | async storeSetActiveProfile(profile: string) { 55 | this.context.commit("SET_ACTIVE_PROFILE", profile) 56 | } 57 | 58 | 59 | /* ------------------------------------------------ */ 60 | /* ------------SECTION: PROFILES RESET------------ */ 61 | /* ------------------------------------------------ */ 62 | 63 | 64 | /** 65 | * Resets the currently active profile to default. 66 | * @see activeProfile 67 | */ 68 | @Mutation 69 | RESET_PROFILES() { 70 | this.activeProfile = "Default" 71 | } 72 | 73 | /** 74 | * Commits the the reset of currently active profile to default. 75 | * @see RESET_PROFILES 76 | */ 77 | @Action 78 | async storeResetProfiles() { 79 | this.context.commit("RESET_PROFILES") 80 | } 81 | 82 | } 83 | 84 | 85 | -------------------------------------------------------------------------------- /src/store/_tasks/_tasks.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // Libs 7 | import { extend as qExtend} from "quasar" 8 | 9 | // VUEX Decorators 10 | import { Action, Mutation, Module, VuexModule } from "vuex-module-decorators" 11 | 12 | // Interfaces 13 | import interfaceTask from "@/scripts/interfaces/_interfaceTask" 14 | 15 | 16 | /* ---------------------------- */ 17 | /* ------------MODULE---------- */ 18 | /* ---------------------------- */ 19 | 20 | 21 | @Module 22 | export default class moduleTasks extends VuexModule { 23 | 24 | 25 | /* ------------------------------------------------- */ 26 | /* ------------ SECTION: TASK MANAGER ------------ */ 27 | /* ------------------------------------------------- */ 28 | 29 | 30 | /** 31 | * Hosts the list of currently active tasks being processed via the background worker window. 32 | */ 33 | taskList: interfaceTask[] = [] 34 | 35 | /** 36 | * Retrieves the current task list. 37 | * @returns taskList 38 | */ 39 | get storeGetTaskList() { 40 | return this.taskList 41 | } 42 | 43 | 44 | /* ------------Sub-section: ADD TASK ------------ */ 45 | 46 | /** 47 | * Adds new task to the task list. 48 | * @param newTask - A new task to be added to the list. 49 | * @see taskList 50 | */ 51 | @Mutation 52 | ADD_TASK(newTask: interfaceTask) { 53 | this.taskList.push(newTask) 54 | } 55 | 56 | /** 57 | * Commits a new task to be added to the list. 58 | * @param newTask - A new task to be added to the list. 59 | * @see ADD_TASK 60 | */ 61 | @Action 62 | async storeAddTask(newTask: interfaceTask) { 63 | this.context.commit("ADD_TASK", newTask) 64 | } 65 | 66 | 67 | /* ------------Sub-section: REMOVE TASK ------------ */ 68 | 69 | /** 70 | * Removes a task from the list 71 | * @param taskToRemove - Task to be removed 72 | * @see taskList 73 | */ 74 | @Mutation 75 | REMOVE_TASK(taskToRemove: interfaceTask) { 76 | 77 | // Filter out the task we need from the global list based on the task ID 78 | let taskIndex: number = -1 79 | this.taskList.forEach((singleTask, index)=> { 80 | const taskObject : any = {} 81 | qExtend(true, taskObject, singleTask) 82 | 83 | if (taskObject.uniqueTaskID === taskToRemove.uniqueTaskID) {taskIndex = index} 84 | }) 85 | 86 | // Remove the task 87 | this.taskList.splice( taskIndex, 1) 88 | 89 | } 90 | 91 | /** 92 | * Commits a task to be removed from the list. 93 | * @param taskToRemove - Task to be removed 94 | */ 95 | @Action 96 | async storeRemoveTask(taskToRemove: interfaceTask) { 97 | this.context.commit("REMOVE_TASK", taskToRemove) 98 | } 99 | 100 | 101 | /* ------------Sub-section: UPDATE TASK ------------ */ 102 | 103 | /** 104 | * Updates a task with new data. 105 | * Mostly meant for updating progress, but can update anything else on the task object as well. 106 | * @param taskToUpdate - Task to be updated. 107 | */ 108 | @Mutation 109 | UPDATE_TASK(taskToUpdate: interfaceTask) { 110 | 111 | // Filter out the task we need from the global list based on the task ID 112 | let taskIndex: number = -1 113 | this.taskList.forEach((singleTask, index)=> { 114 | 115 | const taskObject : any = {} 116 | qExtend(true, taskObject, singleTask) 117 | 118 | if (taskObject.uniqueTaskID === taskToUpdate.uniqueTaskID) {taskIndex = index} 119 | }) 120 | 121 | // Apply the changes to the proper task based on array 122 | this.taskList[taskIndex].progress = taskToUpdate.progress 123 | this.taskList[taskIndex].taskDescription = taskToUpdate.taskDescription 124 | this.taskList[taskIndex].taskName = taskToUpdate.taskName 125 | 126 | 127 | } 128 | 129 | /** 130 | * Commit an update for a task with new data. 131 | * Mostly meant for updating progress, but can update anything else on the task object as well. 132 | * @param taskToUpdate - Task to be updated. 133 | */ 134 | @Action 135 | async storeUpdateTask(taskToUpdate: object) { 136 | this.context.commit("UPDATE_TASK", taskToUpdate) 137 | } 138 | 139 | 140 | /* ---------------------------------------------- */ 141 | /* ------------ SECTION: TASK RESET ------------ */ 142 | /* ---------------------------------------------- */ 143 | 144 | 145 | /** 146 | * Clears the task list. 147 | * @see taskList 148 | */ 149 | @Mutation 150 | RESET_TASKLIST() { 151 | this.taskList = [] 152 | } 153 | 154 | /** 155 | * Commits the clear of a task list. 156 | * @see RESET_TASKLIST 157 | */ 158 | @Action 159 | async storeResetTaskList() { 160 | this.context.commit("RESET_TASKLIST") 161 | } 162 | 163 | } 164 | 165 | 166 | -------------------------------------------------------------------------------- /src/store/store.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | /* ---------- Sub-Section: LIBS ---------- */ 7 | 8 | import Vue from "vue" 9 | import Vuex from "vuex" 10 | import * as vuexElectron from "vuex-electron" 11 | 12 | 13 | /* ---------- VUEX Module: APP SETTINGS ---------- */ 14 | 15 | // Paths 16 | import pathProfileBase from "@/store/_appSettings/_pathProfileBase" 17 | import pathUserFolder from "@/store/_appSettings/_pathUserFolder" 18 | import pathCustomAssetsFolder from "@/store/_appSettings/_pathCustomAssetsFolder" 19 | 20 | // Allowances 21 | import allowanceStartUpTooltips from "@/store/_appSettings/_allowanceStartUpTooltips" 22 | import allowanceSafeDeletion from "@/store/_appSettings/_allowanceSafeDeletion" 23 | import allowanceRichTooltips from "@/store/_appSettings/_allowanceRichTooltips" 24 | import allowanceProfile from "@/store/_appSettings/_allowanceProfile" 25 | import allowanceExpertMode from "@/store/_appSettings/_allowanceExpertMode" 26 | import allowanceDisabledModulesVisibility from "@/store/_appSettings/_allowanceDisabledModulesVisibility" 27 | 28 | 29 | /* ---------- VUEX Module: APP UI ---------- */ 30 | 31 | import appUI from "@/store/_appUI/_appUI" 32 | 33 | 34 | /* ---------- VUEX Module: COMPONENT LOCK ---------- */ 35 | 36 | import componentLock from "@/store/_componentLock/_componentLock" 37 | 38 | 39 | /* ---------- VUEX Module: PROFILES ---------- */ 40 | 41 | import profiles from "@/store/_profiles/_profiles" 42 | 43 | 44 | /* ---------- VUEX Module: TASKS ---------- */ 45 | 46 | import tasks from "@/store/_tasks/_tasks" 47 | 48 | /* ---------- VUEX Module: INSTALLATION QUEUE ---------- */ 49 | 50 | import installQueue from "@/store/_installQueue/_installQueue" 51 | 52 | 53 | /* ---------- VUEX Module: TRANSLATIONS ---------- */ 54 | 55 | import translations from "@/store/translations/_translations" 56 | 57 | 58 | /* --------------------------------- */ 59 | /* ------------VUEX STORE---------- */ 60 | /* --------------------------------- */ 61 | let vuexStore: any = null 62 | 63 | const addVuex = () => { 64 | try { 65 | Vue.use(Vuex) 66 | vuexStore = new Vuex.Store({ 67 | 68 | plugins: [ 69 | vuexElectron.createPersistedState(), 70 | //vuexElectron.createSharedMutations() 71 | ], 72 | 73 | modules:{ 74 | 75 | // App settings 76 | pathProfileBase, 77 | pathUserFolder, 78 | pathCustomAssetsFolder, 79 | allowanceStartUpTooltips, 80 | allowanceSafeDeletion, 81 | allowanceRichTooltips, 82 | allowanceProfile, 83 | allowanceExpertMode, 84 | allowanceDisabledModulesVisibility, 85 | 86 | // App UI 87 | appUI, 88 | 89 | // Component lock 90 | componentLock, 91 | 92 | // Profiles 93 | profiles, 94 | 95 | // Tasks 96 | tasks, 97 | 98 | // Installation queue 99 | installQueue, 100 | 101 | // Translations 102 | translations 103 | 104 | } 105 | 106 | }) 107 | }catch(e){ 108 | addVuex() 109 | } 110 | 111 | } 112 | 113 | addVuex() 114 | 115 | export default vuexStore 116 | 117 | -------------------------------------------------------------------------------- /src/store/translations/_translations.ts: -------------------------------------------------------------------------------- 1 | /* ------------------------------ */ 2 | /* ------------IMPORTS---------- */ 3 | /* ------------------------------ */ 4 | 5 | 6 | // VUEX Decorators 7 | import { Module, VuexModule } from "vuex-module-decorators" 8 | 9 | // The actual translation file 10 | import translationsFile from "@/translations/translations" 11 | 12 | 13 | /* ---------------------------- */ 14 | /* ------------MODULE---------- */ 15 | /* ---------------------------- */ 16 | 17 | 18 | @Module 19 | export default class translations extends VuexModule { 20 | 21 | 22 | /* -------------------------------------------------- */ 23 | /* ------------SECTION: TRANSLATIONS -------------- */ 24 | /* -------------------------------------------------- */ 25 | 26 | 27 | /** 28 | * An imported translations files. 29 | * For more information see the source file. 30 | */ 31 | translationList: any = translationsFile 32 | 33 | /** 34 | * Retrieves the translation object. 35 | * @see translationList 36 | */ 37 | get $t() { 38 | return this.translationList 39 | } 40 | 41 | } 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/translations/translations.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | globals: { 3 | licenseStatuses: { 4 | allowed: "Allowed", 5 | notAllowed: "Forbidden", 6 | notSpecified: "Not specified" 7 | }, 8 | statusStatuses: { 9 | hasConfig: "Has config", 10 | noConfig: "No config" 11 | } 12 | }, 13 | moduleTemplate: { 14 | awn: { 15 | checkMKFoldersWarning: (path) => { 16 | return /*html*/` 17 | Profile not found - reseted to "Default". 18 |
19 | Wondedraft INI reseted to default as well. 20 |
21 |
22 | Attempted to load directory: 23 |
24 | ${path} 25 | ` 26 | }, 27 | updateProfileIniWDWarning: /*html*/` 28 | Mythkeeper could not load the Wonderdraft configuration file (config.ini): 29 |
30 | 1. Please check settings if the Wonderdraft user folder path is set properly. 31 |
32 | 2. If your path is set properly, then please check if the config file exists in the directory. 33 |
34 | 3. If it doesn't, start Wonderdraft once to generate it.`, 35 | updateProfileIniWDSuccess: (path) => { 36 | return ` 37 | Profile successfully set. 38 |
39 | Currently used directory: 40 |
41 | ${path}` 42 | } 43 | } 44 | }, 45 | installer: { 46 | taskTexts: { 47 | asset: "Installing asset", 48 | theme: "Installing theme", 49 | brush: "Installing brush" 50 | }, 51 | awn: { 52 | success: { 53 | assetInstalled: (assetTitle) => { return `Asset ${assetTitle} has been successfully installed.` }, 54 | brushInstalled: (assetTitle) => { return `Brush ${assetTitle} has been successfully installed.` }, 55 | themeInstalled: (assetTitle) => { return `Theme ${assetTitle} has been successfully installed.` } 56 | } 57 | } 58 | }, 59 | assetMiniature: { 60 | placeholders: { 61 | folderSize: "Calculating...", 62 | assetVersion: "N/A" 63 | }, 64 | actions: { 65 | backupAsset: "Backup asset", 66 | deleteAsset: "Delete asset", 67 | deleteAssetBackup: "Delete backup of the asset", 68 | filterByAuthor: "Filter by author & distributor:", 69 | filterByCommercialUse: "Filter by commercial use:", 70 | filterByDistributor: "Filter by author & distributor:", 71 | filterByLicense: "Filter by license:", 72 | filterByTag: "Filter by tag:", 73 | openGallery: "Open asset showcase gallery.", 74 | restoreAssetBackup: "Restore asset from a backup" 75 | }, 76 | titles: { 77 | author: "Author:", 78 | authorAndDistributor: "Author & Distributor:", 79 | commercialUseTitle: "Commercial use:", 80 | description: "Description:", 81 | distributor: "Distributor:", 82 | license: "License & Use:", 83 | tags: "Tags:" 84 | }, 85 | smallIconActions: { 86 | commentary: "Read the commentary containing important details on the license:", 87 | commercialURL: "Obtain proper commercial use license at following address:", 88 | donateUrlAuthor: "Consider donating to the author at following address:", 89 | donateUrlDistributor: "Consider donating to the distributor at following address:", 90 | licenseOffline: "Read license offline by opening a following file:", 91 | licenseOnline: "Read license online at following address:", 92 | "licenseUnknown:": "Try looking up the following license on Google:", 93 | openUrlAuthor: "Visit author's website:", 94 | openUrlDistributor: "Visit distributor's website:", 95 | sendEmailAuthor: "Send the author an email to:", 96 | sendEmailDistributor: "Send the distributor an email to:" 97 | }, 98 | overlayTexts: { 99 | deleteAsset: { 100 | title: "Delete asset: ", 101 | contents: ` 102 | You are about to delete and asset that isn't backup up! 103 |
104 |
105 | How do you wish to proceed?`, 106 | actions: { 107 | close: "Close", 108 | backupAndDelete: "Backup & Delete", 109 | delete: "Delete" 110 | } 111 | }, 112 | backupAsset: { 113 | title: "Backup asset: ", 114 | contents: (currentVersion, backupVersion) => { 115 | return ` 116 | The asset seems to be backup up already. 117 |
118 |
119 | Active asset version: ${currentVersion} 120 |
121 | Backup asset version: ${backupVersion} 122 |
123 |
124 |
125 | Proceed?`}, 126 | actions: { 127 | close: "Close", 128 | overwrite: "Overwrite old version", 129 | } 130 | }, 131 | deleteBackupAsset: { 132 | title: "Delete backup of asset: ", 133 | contents: ` 134 | Mythkeeper is about to delete a backup of an asset. 135 |
136 | The asset will still be recoverable by using the "Restore a previously deleted asset" in the top bar. 137 |
138 | Unless "Safe Delete" is disabled in the settings. 139 |
140 |
141 | Proceed with deletion?`, 142 | actions: { 143 | close: "Close", 144 | deleteBackup: "Delete backup" 145 | } 146 | } 147 | }, 148 | taskTexts: { 149 | deleteAsset: "Deleting", 150 | deleteBackupAsset: "Deleting backup", 151 | restoreBackupAsset: "Restoring", 152 | backupAsset: "Backing up", 153 | 154 | }, 155 | awn: { 156 | success: { 157 | assetDeleteBackup: (assetTitle) => { return `Backup of asset ${assetTitle} has been successfully deleted.` }, 158 | assetRecover: (assetTitle) => { return `Asset ${(assetTitle)} has been successfully recovered.` }, 159 | assetBackup: (assetTitle) => { return `Asset ${assetTitle} has been successfully backed up.` }, 160 | assetDelete: (assetTitle) => { return `Asset ${assetTitle} has been successfully deleted.` }, 161 | } 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /tests/unit/App.spec.ts: -------------------------------------------------------------------------------- 1 | import DragonSpinner from "../../src/pageparts/components/DragonSpinner.vue" 2 | import { createLocalVue,shallowMount } from "@vue/test-utils" 3 | 4 | 5 | const localVue = createLocalVue() 6 | 7 | describe("DragonSpinner.vue", () => { 8 | 9 | it("Expect it to exist?", () => { 10 | const msg = "new message" 11 | const wrapper = shallowMount(DragonSpinner, { 12 | propsData: { msg } 13 | }) 14 | expect(wrapper.text()).toMatch(msg) 15 | }) 16 | 17 | 18 | }) 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "strict": true, 6 | "jsx": "preserve", 7 | "importHelpers": true, 8 | "moduleResolution": "node", 9 | "experimentalDecorators": true, 10 | "esModuleInterop": true, 11 | "allowSyntheticDefaultImports": true, 12 | "sourceMap": true, 13 | "baseUrl": ".", 14 | "noImplicitAny": false, 15 | "types": [ 16 | "webpack-env", 17 | "jest" 18 | ], 19 | "paths": { 20 | "@/*": [ 21 | "src/*" 22 | ] 23 | }, 24 | "lib": [ 25 | "esnext", 26 | "dom", 27 | "dom.iterable", 28 | "scripthost" 29 | ] 30 | }, 31 | "include": [ 32 | "src/**/*.ts", 33 | "src/**/*.tsx", 34 | "src/**/*.vue", 35 | "tests/**/*.ts", 36 | "tests/**/*.tsx" 37 | ], 38 | "exclude": [ 39 | "node_modules" 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | pluginOptions: { 3 | quasar: {} 4 | }, 5 | transpileDependencies: [ 6 | /[\\\/]node_modules[\\\/]quasar[\\\/]/ 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vishiri/mythkeeper/a356b6cc1f3d5d1e6d28063740175ad552582922/webpack.config.js --------------------------------------------------------------------------------