diff --git a/package.json b/package.json index b73f83240..92bdf9805 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "automa", - "version": "0.17.0", + "version": "0.17.2", "description": "An extension for automating your browser by connecting blocks", "license": "MIT", "repository": { @@ -23,7 +23,7 @@ }, "dependencies": { "@codemirror/basic-setup": "^0.19.1", - "@codemirror/lang-javascript": "^0.19.3", + "@codemirror/lang-javascript": "0.19.1", "@codemirror/lang-json": "^0.19.1", "@codemirror/theme-one-dark": "^0.19.1", "@medv/finder": "^2.1.0", diff --git a/src/background/workflow-engine/blocks-handler/handler-conditions.js b/src/background/workflow-engine/blocks-handler/handler-conditions.js index 4fd22f429..9ae9fd0b9 100644 --- a/src/background/workflow-engine/blocks-handler/handler-conditions.js +++ b/src/background/workflow-engine/blocks-handler/handler-conditions.js @@ -19,11 +19,8 @@ function conditions({ data, outputs }, { prevBlockData, refData }) { data.conditions.forEach(({ type, value, compareValue }, index) => { if (isConditionMatch) return; - const firstValue = mustacheReplacer({ - str: compareValue ?? prevData, - data: refData, - }); - const secondValue = mustacheReplacer({ str: value, data: refData }); + const firstValue = mustacheReplacer(compareValue ?? prevData, refData); + const secondValue = mustacheReplacer(value, refData); const isMatch = compareBlockValue(type, firstValue, secondValue); diff --git a/src/background/workflow-engine/blocks-handler/handler-new-tab.js b/src/background/workflow-engine/blocks-handler/handler-new-tab.js index 48c521f87..cb35e3f1e 100644 --- a/src/background/workflow-engine/blocks-handler/handler-new-tab.js +++ b/src/background/workflow-engine/blocks-handler/handler-new-tab.js @@ -1,5 +1,6 @@ import browser from 'webextension-polyfill'; import { getBlockConnection } from '../helper'; +import { isWhitespace } from '@/utils/helper'; async function newTab(block) { if (this.windowId) { @@ -14,6 +15,16 @@ async function newTab(block) { try { const { updatePrevTab, url, active, inGroup } = block.data; + const isInvalidUrl = !/^https?/.test(url); + + if (isInvalidUrl) { + const error = new Error( + isWhitespace(url) ? 'url-empty' : 'invalid-active-tab' + ); + error.data = { url }; + + throw error; + } if (updatePrevTab && this.activeTab.id) { await browser.tabs.update(this.activeTab.id, { url, active }); @@ -54,6 +65,7 @@ async function newTab(block) { }; } catch (error) { console.error(error); + console.dir(error); error.nextBlockId = nextBlockId; throw error; diff --git a/src/background/workflow-engine/blocks-handler/handler-new-window.js b/src/background/workflow-engine/blocks-handler/handler-new-window.js index b2f83b90d..1b1ef34a1 100644 --- a/src/background/workflow-engine/blocks-handler/handler-new-window.js +++ b/src/background/workflow-engine/blocks-handler/handler-new-window.js @@ -6,11 +6,17 @@ export async function newWindow(block) { try { const { incognito, windowState } = block.data; - const { id } = await browser.windows.create({ - incognito, - state: windowState, - }); + const windowOptions = { incognito, state: windowState }; + if (windowState === 'normal') { + ['top', 'left', 'height', 'width'].forEach((key) => { + if (block.data[key] <= 0) return; + + windowOptions[key] = block.data[key]; + }); + } + + const { id } = await browser.windows.create(windowOptions); this.windowId = id; return { diff --git a/src/components/block/BlockBasic.vue b/src/components/block/BlockBasic.vue index 9b45ae982..7db45516f 100644 --- a/src/components/block/BlockBasic.vue +++ b/src/components/block/BlockBasic.vue @@ -80,6 +80,7 @@ function handleStartDrag(event) { data: block.data, id: block.details.id, blockId: block.id, + fromBlockBasic: true, }; event.dataTransfer.setData('block', JSON.stringify(payload)); diff --git a/src/components/newtab/app/AppSidebar.vue b/src/components/newtab/app/AppSidebar.vue index 39694245f..d81ffcfc8 100644 --- a/src/components/newtab/app/AppSidebar.vue +++ b/src/components/newtab/app/AppSidebar.vue @@ -2,7 +2,11 @@ diff --git a/src/content/element-selector/AppElementList.vue b/src/content/element-selector/AppElementList.vue new file mode 100644 index 000000000..45e4ed2e3 --- /dev/null +++ b/src/content/element-selector/AppElementList.vue @@ -0,0 +1,34 @@ + + diff --git a/src/locales/en/blocks.json b/src/locales/en/blocks.json index 2826d04b5..b22bc3489 100644 --- a/src/locales/en/blocks.json +++ b/src/locales/en/blocks.json @@ -32,7 +32,9 @@ "name": "Upload file", "description": "Upload file into element", "filePath": "File path", - "addFile": "Add file" + "addFile": "Add file", + "requirement": "See the requirement before using this block", + "noFileAccess": "Automa doesn't have file access" }, "browser-event": { "name": "Browser event", @@ -146,6 +148,11 @@ "new-window": { "name": "New window", "description": "Create a new window", + "top": "Top", + "left": "Left", + "height": "Height", + "width": "Width", + "note": "Note: use 0 to disable", "windowState": { "placeholder": "Window state", "options": { diff --git a/src/locales/en/newtab.json b/src/locales/en/newtab.json index d14403b3f..14202a04f 100644 --- a/src/locales/en/newtab.json +++ b/src/locales/en/newtab.json @@ -18,7 +18,8 @@ "reloadPage": "Reload the page to take effect" }, "menu": { - "general": "General" + "general": "General", + "about": "About" }, }, "workflow": { diff --git a/src/newtab/App.vue b/src/newtab/App.vue index 896f79bba..401306cfe 100644 --- a/src/newtab/App.vue +++ b/src/newtab/App.vue @@ -15,6 +15,8 @@

{{ t('updateMessage.text2') }} diff --git a/src/newtab/pages/Settings.vue b/src/newtab/pages/Settings.vue index 929860000..277fa53c7 100644 --- a/src/newtab/pages/Settings.vue +++ b/src/newtab/pages/Settings.vue @@ -6,14 +6,14 @@ diff --git a/src/newtab/pages/collections/[id].vue b/src/newtab/pages/collections/[id].vue index bb6e319ab..ed27f774e 100644 --- a/src/newtab/pages/collections/[id].vue +++ b/src/newtab/pages/collections/[id].vue @@ -194,7 +194,13 @@ diff --git a/src/newtab/router.js b/src/newtab/router.js index 37bbdfba7..83abc1add 100644 --- a/src/newtab/router.js +++ b/src/newtab/router.js @@ -9,6 +9,7 @@ import Logs from './pages/Logs.vue'; import LogsDetails from './pages/logs/[id].vue'; import Settings from './pages/Settings.vue'; import SettingsIndex from './pages/settings/index.vue'; +import SettingsAbout from './pages/settings/About.vue'; const routes = [ { @@ -54,7 +55,10 @@ const routes = [ { path: '/settings', component: Settings, - children: [{ path: '', component: SettingsIndex }], + children: [ + { path: '', component: SettingsIndex }, + { path: '/about', component: SettingsAbout }, + ], }, ]; diff --git a/src/store/index.js b/src/store/index.js index 429b7c668..fcdaffbda 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -7,6 +7,7 @@ import { firstWorkflows } from '@/utils/shared'; const store = createStore({ plugins: [vuexORM(models)], state: () => ({ + contributors: null, workflowState: [], settings: { locale: 'en', diff --git a/src/utils/reference-data/mustache-replacer.js b/src/utils/reference-data/mustache-replacer.js index bb4315c4d..42df91363 100644 --- a/src/utils/reference-data/mustache-replacer.js +++ b/src/utils/reference-data/mustache-replacer.js @@ -18,6 +18,8 @@ export function extractStrFunction(str) { } export default function (str, data) { + if (!str || typeof str !== 'string') return ''; + const replacedStr = str.replace(/\{\{(.*?)\}\}/g, (match) => { const key = match.slice(2, -2).trim(); diff --git a/src/utils/shared.js b/src/utils/shared.js index 0ca3b78e6..a1e3cd9db 100644 --- a/src/utils/shared.js +++ b/src/utils/shared.js @@ -93,6 +93,10 @@ export const tasks = { maxConnection: 1, data: { description: '', + top: 0, + left: 0, + width: 0, + height: 0, incognito: false, windowState: 'normal', }, diff --git a/yarn.lock b/yarn.lock index 229bf2bd2..74662ce82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1016,18 +1016,6 @@ "@lezer/common" "^0.15.0" style-mod "^4.0.0" -"@codemirror/highlight@^0.19.7": - version "0.19.7" - resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.19.7.tgz#91a0c9994c759f5f153861e3aae74ff9e7c7c35b" - integrity sha512-3W32hBCY0pbbv/xidismw+RDMKuIag+fo4kZIbD7WoRj+Ttcaxjf+vP6RttRHXLaaqbWh031lTeON8kMlDhMYw== - dependencies: - "@codemirror/language" "^0.19.0" - "@codemirror/rangeset" "^0.19.0" - "@codemirror/state" "^0.19.3" - "@codemirror/view" "^0.19.0" - "@lezer/common" "^0.15.0" - style-mod "^4.0.0" - "@codemirror/history@^0.19.0": version "0.19.0" resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.19.0.tgz#cc8095c927c9566f7b69fa404074edde4c54d39c" @@ -1036,18 +1024,18 @@ "@codemirror/state" "^0.19.0" "@codemirror/view" "^0.19.0" -"@codemirror/lang-javascript@^0.19.3": - version "0.19.6" - resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-0.19.6.tgz#bab4ea9ba65189e4bd77c9496275c82e2b6814e7" - integrity sha512-NgkoCIc3hdTNTBRIRuPqfUJ0WB798qEgwAgtjwYy6yoiK5CzbDS2z5CFW17h9RmaAx6t1m64iY2CZ3tC7r15Gw== +"@codemirror/lang-javascript@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-0.19.1.tgz#157a145a3413c9774573956555c111e353640113" + integrity sha512-fFAP4nkfU36c14K8f6ytVYYeuX/2E7dJ+bD7UCZPWavXYjwdHAgDCJGH84MjhBSh0lMc908We80vyYg1j3MnRQ== dependencies: "@codemirror/autocomplete" "^0.19.0" - "@codemirror/highlight" "^0.19.7" + "@codemirror/highlight" "^0.19.0" "@codemirror/language" "^0.19.0" "@codemirror/lint" "^0.19.0" "@codemirror/state" "^0.19.0" "@codemirror/view" "^0.19.0" - "@lezer/javascript" "^0.15.1" + "@lezer/javascript" "^0.15.0" "@codemirror/lang-json@^0.19.1": version "0.19.1" @@ -1296,10 +1284,10 @@ resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.11.tgz#965b5067036305f12e8a3efc344076850be1d3a8" integrity sha512-vv0nSdIaVCRcJ8rPuDdsrNVfBOYe/4Szr/LhF929XyDmBndLDuWiCCHooGlGlJfzELyO608AyDhVsuX/ZG36NA== -"@lezer/javascript@^0.15.1": - version "0.15.2" - resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-0.15.2.tgz#50b70a02561b047947e050e0619b1aea7131dc5f" - integrity sha512-ytWvdJ1NAc0pfrNipGQs8otJVfjVibpIiFKH0fl99rKSA6cVlyQN/XTj/dEAQCfBfCBPAFdc30cuUe5CGZ0odA== +"@lezer/javascript@^0.15.0": + version "0.15.3" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-0.15.3.tgz#833a4c5650bae07805b9af88de6706368844dc55" + integrity sha512-8jA2NpOfpWwSPZxRhd9BxK2ZPvGd7nLE3LFTJ5AbMhXAzMHeMjneV6GEVd7dAIee85dtap0jdb6bgOSO0+lfwA== dependencies: "@lezer/lr" "^0.15.0"