fix: 0.5.1 (#294)

* feat: modal tips when delete mock

* fix: Fixes #293

* fix: curl import error and style error

* fix: variable query multiple times

---------

Co-authored-by: scarqin <1054139596@qq.com>
This commit is contained in:
yZaio 2023-04-06 22:16:57 +08:00 committed by GitHub
parent a4e6fa0399
commit 136c3485b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 586 additions and 303 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "postcat", "name": "postcat",
"version": "0.5.0", "version": "0.5.1",
"main": "out/app/electron-main/main.js", "main": "out/app/electron-main/main.js",
"description": "A lightweight, extensible API tool", "description": "A lightweight, extensible API tool",
"homepage": "https://github.com/Postcatlab/postcat.git", "homepage": "https://github.com/Postcatlab/postcat.git",

View File

@ -77,49 +77,49 @@
<source> Close Other Tags (excluding current tabs) </source> <source> Close Other Tags (excluding current tabs) </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">74,75</context> <context context-type="linenumber">17,18</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4540787302079589597" datatype="html"> <trans-unit id="4540787302079589597" datatype="html">
<source>Close All Tabs</source> <source>Close All Tabs</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">76</context> <context context-type="linenumber">19</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5555596397221201782" datatype="html"> <trans-unit id="5555596397221201782" datatype="html">
<source> Close Tabs To the Left </source> <source> Close Tabs To the Left </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">78,79</context> <context context-type="linenumber">21,22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="974792392187340268" datatype="html"> <trans-unit id="974792392187340268" datatype="html">
<source> Close Tabs to the Right </source> <source> Close Tabs to the Right </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">86,87</context> <context context-type="linenumber">24,25</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7762169316697380309" datatype="html"> <trans-unit id="7762169316697380309" datatype="html">
<source>Do you want to save the changes?</source> <source>Do you want to save the changes?</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">93</context> <context context-type="linenumber">98</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7711937097933765278" datatype="html"> <trans-unit id="7711937097933765278" datatype="html">
<source>Your changes will be lost if you don&apos;t save them.</source> <source>Your changes will be lost if you don&apos;t save them.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">99</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2159130950882492111" datatype="html"> <trans-unit id="2159130950882492111" datatype="html">
<source>Cancel</source> <source>Cancel</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">99</context> <context context-type="linenumber">104</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context> <context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context>
@ -158,14 +158,18 @@
<source>Don&apos;t Save</source> <source>Don&apos;t Save</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">106</context> <context context-type="linenumber">111</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3768927257183755959" datatype="html"> <trans-unit id="3768927257183755959" datatype="html">
<source>Save</source> <source>Save</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">114</context> <context context-type="linenumber">119</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
<context context-type="linenumber">12</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/env/env-edit/env-edit.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/env/env-edit/env-edit.component.html</context>
@ -239,19 +243,19 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">330</context> <context context-type="linenumber">334</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">361</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">377</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">397</context> <context context-type="linenumber">401</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7022070615528435141" datatype="html"> <trans-unit id="7022070615528435141" datatype="html">
@ -278,15 +282,15 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">346</context> <context context-type="linenumber">350</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">369</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">381</context> <context context-type="linenumber">385</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/history/eo-history.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/history/eo-history.component.html</context>
@ -1103,8 +1107,8 @@
<context context-type="linenumber">225</context> <context context-type="linenumber">225</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8894930472238002227" datatype="html"> <trans-unit id="3022316336875255085" datatype="html">
<source>Save Success</source> <source>Saved successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context> <context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">34</context>
@ -1692,7 +1696,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">135</context> <context context-type="linenumber">141</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
@ -1707,7 +1711,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">138</context> <context context-type="linenumber">144</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
@ -1717,6 +1721,10 @@
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
<context context-type="linenumber">257</context> <context context-type="linenumber">257</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit> </trans-unit>
<trans-unit id="1075865176616456400" datatype="html"> <trans-unit id="1075865176616456400" datatype="html">
<source>Edit workspace failed</source> <source>Edit workspace failed</source>
@ -1926,7 +1934,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">96</context> <context context-type="linenumber">98</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5460129479464091648" datatype="html"> <trans-unit id="5460129479464091648" datatype="html">
@ -1973,7 +1981,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">111</context> <context context-type="linenumber">113</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5968366500418000730" datatype="html"> <trans-unit id="5968366500418000730" datatype="html">
@ -2101,7 +2109,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">122</context> <context context-type="linenumber">124</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5719912962272225542" datatype="html"> <trans-unit id="5719912962272225542" datatype="html">
@ -2120,7 +2128,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">125</context> <context context-type="linenumber">127</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6112087277983123757" datatype="html"> <trans-unit id="6112087277983123757" datatype="html">
@ -2373,7 +2381,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">31</context> <context context-type="linenumber">34</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.html</context>
@ -2398,25 +2406,25 @@
<source>Import API</source> <source>Import API</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">59</context> <context context-type="linenumber">60</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3422431955792686027" datatype="html"> <trans-unit id="3422431955792686027" datatype="html">
<source>Import From File</source> <source>Import From File</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">60</context> <context context-type="linenumber">61</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="392331585970686754" datatype="html"> <trans-unit id="392331585970686754" datatype="html">
<source>Sync API from URL</source> <source>Sync API from URL</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">65</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">66</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context>
@ -2431,47 +2439,47 @@
<source>Case</source> <source>Case</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">252</context> <context context-type="linenumber">256</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5140115132095091817" datatype="html"> <trans-unit id="5140115132095091817" datatype="html">
<source><x id="PH" equiv-text="tips[dragItem.module]"/> does not support sorting at the moment, please report to Github Issue</source> <source><x id="PH" equiv-text="tips[dragItem.module]"/> does not support sorting at the moment, please report to Github Issue</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">255</context> <context context-type="linenumber">259</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">259</context> <context context-type="linenumber">263</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3464737374195885967" datatype="html"> <trans-unit id="3464737374195885967" datatype="html">
<source>Add Mock</source> <source>Add Mock</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">334</context> <context context-type="linenumber">338</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1250980317493747355" datatype="html"> <trans-unit id="1250980317493747355" datatype="html">
<source>Add Case</source> <source>Add Case</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">338</context> <context context-type="linenumber">342</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4323470180912194028" datatype="html"> <trans-unit id="4323470180912194028" datatype="html">
<source>Copy</source> <source>Copy</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">342</context> <context context-type="linenumber">346</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">381</context>
</context-group> </context-group>
<note priority="1" from="description">@Copy</note> <note priority="1" from="description">@Copy</note>
</trans-unit> </trans-unit>
@ -2479,21 +2487,21 @@
<source>Add API</source> <source>Add API</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">389</context> <context context-type="linenumber">393</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6661660398413994526" datatype="html"> <trans-unit id="6661660398413994526" datatype="html">
<source>Add Subgroup</source> <source>Add Subgroup</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">393</context> <context context-type="linenumber">397</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="Delete" datatype="html"> <trans-unit id="Delete" datatype="html">
<source>Delete</source> <source>Delete</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">405</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1623775429516238560" datatype="html"> <trans-unit id="1623775429516238560" datatype="html">
@ -2502,6 +2510,10 @@
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group.service.ts</context>
<context context-type="linenumber">38</context> <context context-type="linenumber">38</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">136</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">41</context>
@ -2786,14 +2798,14 @@
<source> Authorzation will take effect for each API under the group during testing, and you can also override the authorization in the API. </source> <source> Authorzation will take effect for each API under the group during testing, and you can also override the authorization in the API. </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">33,34</context> <context context-type="linenumber">36,37</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3620188369327429839" datatype="html"> <trans-unit id="3620188369327429839" datatype="html">
<source> Save </source> <source> Save </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">45,46</context> <context context-type="linenumber">48,49</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/mock.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/mock.component.html</context>
@ -2804,21 +2816,21 @@
<source>Edited Group Info successfully</source> <source>Edited Group Info successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">81</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6813985602529136070" datatype="html"> <trans-unit id="6813985602529136070" datatype="html">
<source>Edited Group Name successfully</source> <source>Edited Group Name successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">157</context> <context context-type="linenumber">159</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4370151464182295191" datatype="html"> <trans-unit id="4370151464182295191" datatype="html">
<source>Created Group successfully</source> <source>Created Group successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">163</context> <context context-type="linenumber">165</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7219712648243615821" datatype="html"> <trans-unit id="7219712648243615821" datatype="html">
@ -3082,6 +3094,13 @@
<context context-type="linenumber">84</context> <context context-type="linenumber">84</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4416290763660062288" datatype="html">
<source></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">137</context>
</context-group>
</trans-unit>
<trans-unit id="666710856997912735" datatype="html"> <trans-unit id="666710856997912735" datatype="html">
<source>Please input mock name</source> <source>Please input mock name</source>
<context-group purpose="location"> <context-group purpose="location">
@ -3210,11 +3229,11 @@
<context context-type="linenumber">218</context> <context context-type="linenumber">218</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7836823057834334243" datatype="html"> <trans-unit id="989307631559859284" datatype="html">
<source>Please input case name</source> <source>Curl text error: <x id="PH" equiv-text="err"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.ts</context>
<context context-type="linenumber">5</context> <context context-type="linenumber">486</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1153957724275241408" datatype="html"> <trans-unit id="1153957724275241408" datatype="html">
@ -3457,7 +3476,7 @@
<source>The test service connection failed, Request Body Too Large</source> <source>The test service connection failed, Request Body Too Large</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/remote-node/test-connect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/remote-node/test-connect.service.ts</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">45</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7457479821534733584" datatype="html"> <trans-unit id="7457479821534733584" datatype="html">
@ -3465,7 +3484,7 @@
If the current test URL is a local API, please download the desktop and re-initiate the test.</source> If the current test URL is a local API, please download the desktop and re-initiate the test.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/test-server.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/test-server.service.ts</context>
<context context-type="linenumber">150</context> <context context-type="linenumber">154</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1555979633549170381" datatype="html"> <trans-unit id="1555979633549170381" datatype="html">

View File

@ -86,7 +86,7 @@
<source> Close Other Tags (excluding current tabs) </source> <source> Close Other Tags (excluding current tabs) </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">74,75</context> <context context-type="linenumber">17,18</context>
</context-group> </context-group>
<target state="translated"> 关闭其它标签(不包括当前标签) </target> <target state="translated"> 关闭其它标签(不包括当前标签) </target>
</trans-unit> </trans-unit>
@ -94,7 +94,7 @@
<source>Close All Tabs</source> <source>Close All Tabs</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">76</context> <context context-type="linenumber">19</context>
</context-group> </context-group>
<target state="translated">关闭所有标签</target> <target state="translated">关闭所有标签</target>
</trans-unit> </trans-unit>
@ -102,7 +102,7 @@
<source> Close Tabs To the Left </source> <source> Close Tabs To the Left </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">78,79</context> <context context-type="linenumber">21,22</context>
</context-group> </context-group>
<target state="translated"> 关闭左侧标签页 </target> <target state="translated"> 关闭左侧标签页 </target>
</trans-unit> </trans-unit>
@ -110,7 +110,7 @@
<source> Close Tabs to the Right </source> <source> Close Tabs to the Right </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.html</context>
<context context-type="linenumber">86,87</context> <context context-type="linenumber">24,25</context>
</context-group> </context-group>
<target state="translated"> 关闭右边的标签 </target> <target state="translated"> 关闭右边的标签 </target>
</trans-unit> </trans-unit>
@ -118,7 +118,7 @@
<source>Do you want to save the changes?</source> <source>Do you want to save the changes?</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">93</context> <context context-type="linenumber">98</context>
</context-group> </context-group>
<target state="translated">您要保存这些更改吗?</target> <target state="translated">您要保存这些更改吗?</target>
</trans-unit> </trans-unit>
@ -126,7 +126,7 @@
<source>Your changes will be lost if you don&apos;t save them.</source> <source>Your changes will be lost if you don&apos;t save them.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">99</context>
</context-group> </context-group>
<target state="translated">如未保存,所有更改将会被丢弃。</target> <target state="translated">如未保存,所有更改将会被丢弃。</target>
</trans-unit> </trans-unit>
@ -134,7 +134,7 @@
<source>Cancel</source> <source>Cancel</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">99</context> <context context-type="linenumber">104</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context> <context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context>
@ -174,7 +174,7 @@
<source>Don&apos;t Save</source> <source>Don&apos;t Save</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">106</context> <context context-type="linenumber">111</context>
</context-group> </context-group>
<target state="translated">放弃保存</target> <target state="translated">放弃保存</target>
</trans-unit> </trans-unit>
@ -182,7 +182,11 @@
<source>Save</source> <source>Save</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context> <context context-type="sourcefile">src/app/components/eo-ui/tab/tab.component.ts</context>
<context context-type="linenumber">114</context> <context context-type="linenumber">119</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
<context context-type="linenumber">12</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/env/env-edit/env-edit.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/env/env-edit/env-edit.component.html</context>
@ -262,19 +266,19 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">330</context> <context context-type="linenumber">334</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">361</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">377</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">397</context> <context context-type="linenumber">401</context>
</context-group> </context-group>
<target state="translated">编辑</target> <target state="translated">编辑</target>
</trans-unit> </trans-unit>
@ -302,15 +306,15 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">346</context> <context context-type="linenumber">350</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">369</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">381</context> <context context-type="linenumber">385</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/history/eo-history.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/history/eo-history.component.html</context>
@ -1230,8 +1234,8 @@
</context-group> </context-group>
<target state="translated">游客</target> <target state="translated">游客</target>
</trans-unit> </trans-unit>
<trans-unit id="8894930472238002227" datatype="html"> <trans-unit id="3022316336875255085" datatype="html">
<source>Save Success</source> <source>Saved successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context> <context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">34</context>
@ -1884,7 +1888,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">135</context> <context context-type="linenumber">141</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
@ -1900,7 +1904,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">138</context> <context context-type="linenumber">144</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
@ -1910,6 +1914,10 @@
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
<context context-type="linenumber">257</context> <context context-type="linenumber">257</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
<context context-type="linenumber">284</context>
</context-group>
<target state="translated">删除成功</target> <target state="translated">删除成功</target>
</trans-unit> </trans-unit>
<trans-unit id="1075865176616456400" datatype="html"> <trans-unit id="1075865176616456400" datatype="html">
@ -2140,7 +2148,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">96</context> <context context-type="linenumber">98</context>
</context-group> </context-group>
<target state="translated">新建分组</target> <target state="translated">新建分组</target>
</trans-unit> </trans-unit>
@ -2192,7 +2200,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">111</context> <context context-type="linenumber">113</context>
</context-group> </context-group>
<target state="translated">新建 Mock</target> <target state="translated">新建 Mock</target>
</trans-unit> </trans-unit>
@ -2332,7 +2340,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">122</context> <context context-type="linenumber">124</context>
</context-group> </context-group>
<target state="translated">添加失败</target> <target state="translated">添加失败</target>
</trans-unit> </trans-unit>
@ -2352,7 +2360,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">125</context> <context context-type="linenumber">127</context>
</context-group> </context-group>
<target state="translated">添加成功</target> <target state="translated">添加成功</target>
</trans-unit> </trans-unit>
@ -2636,7 +2644,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">31</context> <context context-type="linenumber">34</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.html</context>
@ -2664,7 +2672,7 @@
<source>Import API</source> <source>Import API</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">59</context> <context context-type="linenumber">60</context>
</context-group> </context-group>
<target state="translated">导入 API</target> <target state="translated">导入 API</target>
</trans-unit> </trans-unit>
@ -2672,7 +2680,7 @@
<source>Import From File</source> <source>Import From File</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">60</context> <context context-type="linenumber">61</context>
</context-group> </context-group>
<target state="translated">从文件导入 API</target> <target state="translated">从文件导入 API</target>
</trans-unit> </trans-unit>
@ -2680,11 +2688,11 @@
<source>Sync API from URL</source> <source>Sync API from URL</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">65</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">66</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context>
@ -2700,7 +2708,7 @@
<source>Case</source> <source>Case</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">252</context> <context context-type="linenumber">256</context>
</context-group> </context-group>
<target state="translated">用例</target> <target state="translated">用例</target>
</trans-unit> </trans-unit>
@ -2708,11 +2716,11 @@
<source><x id="PH" equiv-text="tips[dragItem.module]"/> does not support sorting at the moment, please report to Github Issue</source> <source><x id="PH" equiv-text="tips[dragItem.module]"/> does not support sorting at the moment, please report to Github Issue</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">255</context> <context context-type="linenumber">259</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">259</context> <context context-type="linenumber">263</context>
</context-group> </context-group>
<target state="translated"><x id="PH" equiv-text="tips[dragItem.module]"/> 目前不支持排序,请反馈到 Github Issue</target> <target state="translated"><x id="PH" equiv-text="tips[dragItem.module]"/> 目前不支持排序,请反馈到 Github Issue</target>
</trans-unit> </trans-unit>
@ -2720,7 +2728,7 @@
<source>Add Mock</source> <source>Add Mock</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">334</context> <context context-type="linenumber">338</context>
</context-group> </context-group>
<target state="translated">添加 Mock</target> <target state="translated">添加 Mock</target>
</trans-unit> </trans-unit>
@ -2728,7 +2736,7 @@
<source>Add Case</source> <source>Add Case</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">338</context> <context context-type="linenumber">342</context>
</context-group> </context-group>
<target state="translated">添加用例</target> <target state="translated">添加用例</target>
</trans-unit> </trans-unit>
@ -2736,15 +2744,15 @@
<source>Copy</source> <source>Copy</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">342</context> <context context-type="linenumber">346</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">381</context>
</context-group> </context-group>
<note priority="1" from="description">@Copy</note> <note priority="1" from="description">@Copy</note>
<target state="translated">复制</target> <target state="translated">复制</target>
@ -2753,7 +2761,7 @@
<source>Add API</source> <source>Add API</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">389</context> <context context-type="linenumber">393</context>
</context-group> </context-group>
<target state="translated">添加 API</target> <target state="translated">添加 API</target>
</trans-unit> </trans-unit>
@ -2761,7 +2769,7 @@
<source>Add Subgroup</source> <source>Add Subgroup</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">393</context> <context context-type="linenumber">397</context>
</context-group> </context-group>
<target state="translated">添加子分组</target> <target state="translated">添加子分组</target>
</trans-unit> </trans-unit>
@ -2769,7 +2777,7 @@
<source>Delete</source> <source>Delete</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group-tree.component.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">405</context>
</context-group> </context-group>
<target state="translated">删除</target> <target state="translated">删除</target>
</trans-unit> </trans-unit>
@ -2779,6 +2787,10 @@
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/components/group/api-group.service.ts</context>
<context context-type="linenumber">38</context> <context context-type="linenumber">38</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">136</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">41</context>
@ -3097,7 +3109,7 @@
<source> Authorzation will take effect for each API under the group during testing, and you can also override the authorization in the API. </source> <source> Authorzation will take effect for each API under the group during testing, and you can also override the authorization in the API. </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">33,34</context> <context context-type="linenumber">36,37</context>
</context-group> </context-group>
<target state="translated"> 在测试过程中,鉴权将当前分组下的所有 API 生效,您也可以在 API 测试中覆盖鉴权。 </target> <target state="translated"> 在测试过程中,鉴权将当前分组下的所有 API 生效,您也可以在 API 测试中覆盖鉴权。 </target>
</trans-unit> </trans-unit>
@ -3105,7 +3117,7 @@
<source> Save </source> <source> Save </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.html</context>
<context context-type="linenumber">45,46</context> <context context-type="linenumber">48,49</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/mock.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/mock.component.html</context>
@ -3117,7 +3129,7 @@
<source>Edited Group Info successfully</source> <source>Edited Group Info successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">81</context>
</context-group> </context-group>
<target state="translated">修改分组信息成功</target> <target state="translated">修改分组信息成功</target>
</trans-unit> </trans-unit>
@ -3125,7 +3137,7 @@
<source>Edited Group Name successfully</source> <source>Edited Group Name successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">157</context> <context context-type="linenumber">159</context>
</context-group> </context-group>
<target state="translated">修改分组名称成功</target> <target state="translated">修改分组名称成功</target>
</trans-unit> </trans-unit>
@ -3133,7 +3145,7 @@
<source>Created Group successfully</source> <source>Created Group successfully</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/group-edit/group.component.ts</context>
<context context-type="linenumber">163</context> <context context-type="linenumber">165</context>
</context-group> </context-group>
<target state="translated">新建分组成功</target> <target state="translated">新建分组成功</target>
</trans-unit> </trans-unit>
@ -3425,6 +3437,13 @@
</context-group> </context-group>
<target state="translated">必填</target> <target state="translated">必填</target>
</trans-unit> </trans-unit>
<trans-unit id="4416290763660062288" datatype="html">
<source/>
<context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/mock/api-mock.service.ts</context>
<context context-type="linenumber">137</context>
</context-group>
</trans-unit>
<trans-unit id="666710856997912735" datatype="html"> <trans-unit id="666710856997912735" datatype="html">
<source>Please input mock name</source> <source>Please input mock name</source>
<context-group purpose="location"> <context-group purpose="location">
@ -3569,13 +3588,13 @@
</context-group> </context-group>
<target state="translated">保存为文件</target> <target state="translated">保存为文件</target>
</trans-unit> </trans-unit>
<trans-unit id="7836823057834334243" datatype="html"> <trans-unit id="989307631559859284" datatype="html">
<source>Please input case name</source> <source>Curl text error: <x id="PH" equiv-text="err"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test.component.html</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.ts</context>
<context context-type="linenumber">5</context> <context context-type="linenumber">486</context>
</context-group> </context-group>
<target state="translated">请输入用例名称</target> <target state="translated">Curl 文本错误: <x id="PH" equiv-text="err"/></target>
</trans-unit> </trans-unit>
<trans-unit id="1153957724275241408" datatype="html"> <trans-unit id="1153957724275241408" datatype="html">
<source>Save as API</source> <source>Save as API</source>
@ -3845,7 +3864,7 @@
<source>The test service connection failed, Request Body Too Large</source> <source>The test service connection failed, Request Body Too Large</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/remote-node/test-connect.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/remote-node/test-connect.service.ts</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">45</context>
</context-group> </context-group>
<target state="translated">测试服务连接失败,请求体太大</target> <target state="translated">测试服务连接失败,请求体太大</target>
</trans-unit> </trans-unit>
@ -3854,7 +3873,7 @@
If the current test URL is a local API, please download the desktop and re-initiate the test.</source> If the current test URL is a local API, please download the desktop and re-initiate the test.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/test-server.service.ts</context> <context context-type="sourcefile">src/app/pages/workspace/project/api/service/test-server/test-server.service.ts</context>
<context context-type="linenumber">150</context> <context context-type="linenumber">154</context>
</context-group> </context-group>
<target state="translated">服务连接失败。 <target state="translated">服务连接失败。
当前正在使用服务器测试,如果当前测试 URL 为 本地 API请下载桌面端后重新发起测试。</target> 当前正在使用服务器测试,如果当前测试 URL 为 本地 API请下载桌面端后重新发起测试。</target>

View File

@ -339,8 +339,7 @@ export class TabOperateService {
getCurrentTab() { getCurrentTab() {
return this.getTabByIndex(this.selectedIndex); return this.getTabByIndex(this.selectedIndex);
} }
closeTabByOperate(action: string | TabOperate) { closeTabByOperate(action: string | TabOperate, currentTabID = this.tabStorage.tabOrder[this.selectedIndex]) {
const currentTabID = this.tabStorage.tabOrder[this.selectedIndex];
let tabsObj = { let tabsObj = {
//Close tab has hasChanged tab //Close tab has hasChanged tab
needTips: false, needTips: false,

View File

@ -6,7 +6,25 @@
(nzSelectChange)="selectChange($event)" (nzSelectChange)="selectChange($event)"
[nzTabBarExtraContent]="extraTemplate" [nzTabBarExtraContent]="extraTemplate"
> >
<eo-ng-tab *ngFor="let uuid of tabStorage.tabOrder; let i = index" [nzTitle]="titleTemplate"> <eo-ng-tab
*ngFor="let uuid of tabStorage.tabOrder; let i = index"
(nzContextmenu)="contextMenu($event, menu, uuid)"
[nzTitle]="titleTemplate"
>
<eo-ng-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu>
<li nz-menu-item (click)="closeTabByOperate('closeOther', uuid)" [nzDisabled]="tabStorage.tabOrder.length === 1" i18n>
Close Other Tags (excluding current tabs)
</li>
<li nz-menu-item (click)="closeTabByOperate('closeAll', uuid)" i18n>Close All Tabs</li>
<li nz-menu-item (click)="closeTabByOperate('closeLeft', uuid)" [nzDisabled]="checkIsFirstTab(uuid)" i18n>
Close Tabs To the Left
</li>
<li nz-menu-item [nzDisabled]="checkIsLastTab(uuid)" (click)="closeTabByOperate('closeRight', uuid)" i18n>
Close Tabs to the Right
</li>
</ul>
</eo-ng-dropdown-menu>
<ng-template #titleTemplate> <ng-template #titleTemplate>
<div <div
(dblclick)="doubleClickTab($event, uuid)" (dblclick)="doubleClickTab($event, uuid)"

View File

@ -1,7 +1,7 @@
import { KeyValue } from '@angular/common'; import { KeyValue } from '@angular/common';
import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, TemplateRef } from '@angular/core'; import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, TemplateRef } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router'; import { NavigationEnd, Router } from '@angular/router';
import { NzDropdownMenuComponent } from 'ng-zorro-antd/dropdown'; import { NzContextMenuService, NzDropdownMenuComponent } from 'ng-zorro-antd/dropdown';
import { NzTabsCanDeactivateFn } from 'ng-zorro-antd/tabs'; import { NzTabsCanDeactivateFn } from 'ng-zorro-antd/tabs';
import { TabOperateService } from 'pc/browser/src/app/components/eo-ui/tab/tab-operate.service'; import { TabOperateService } from 'pc/browser/src/app/components/eo-ui/tab/tab-operate.service';
import { TabStorageService } from 'pc/browser/src/app/components/eo-ui/tab/tab-storage.service'; import { TabStorageService } from 'pc/browser/src/app/components/eo-ui/tab/tab-storage.service';
@ -35,8 +35,12 @@ export class EoTabComponent implements OnInit, OnDestroy {
private modal: ModalService, private modal: ModalService,
private router: Router, private router: Router,
public store: StoreService, public store: StoreService,
private trace: TraceService private trace: TraceService,
private nzContextMenuService: NzContextMenuService
) {} ) {}
contextMenu($event: MouseEvent, menu: NzDropdownMenuComponent, tabID): void {
this.nzContextMenuService.create($event, menu);
}
ngOnInit(): void { ngOnInit(): void {
this.watchRouterChange(); this.watchRouterChange();
this.watchPageLeave(); this.watchPageLeave();
@ -49,6 +53,7 @@ export class EoTabComponent implements OnInit, OnDestroy {
handleDataBeforeGetCache: this.handleDataBeforeGetCache handleDataBeforeGetCache: this.handleDataBeforeGetCache
}); });
} }
async newTab(key = undefined) { async newTab(key = undefined) {
if (this.checkTabCanLeave && !(await this.checkTabCanLeave())) { if (this.checkTabCanLeave && !(await this.checkTabCanLeave())) {
return false; return false;
@ -200,13 +205,19 @@ export class EoTabComponent implements OnInit, OnDestroy {
handleDataBeforeCache: this.handleDataBeforeCache handleDataBeforeCache: this.handleDataBeforeCache
}); });
} }
checkIsFirstTab(uuid) {
return this.tabStorage.tabOrder.findIndex(val => val === uuid) === 0;
}
checkIsLastTab(uuid) {
return this.tabStorage.tabOrder.length - 1 === this.tabStorage.tabOrder.findIndex(val => val === uuid);
}
/** /**
* Tab Close Operate * Tab Close Operate
* *
* @param action * @param action
*/ */
closeTabByOperate(action: TabOperate | string) { closeTabByOperate(action: TabOperate | string, uuid?) {
this.tabOperate.closeTabByOperate(action); this.tabOperate.closeTabByOperate(action, uuid);
} }
private watchRouterChange() { private watchRouterChange() {
this.routerSubscribe = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((res: NavigationEnd) => { this.routerSubscribe = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((res: NavigationEnd) => {

View File

@ -68,7 +68,16 @@ export class ThemeService {
queryExtensionThemes() { queryExtensionThemes() {
const extensions = this.themeExtension.getExtensionThemes(this.coreThemes); const extensions = this.themeExtension.getExtensionThemes(this.coreThemes);
this.themes.push(...extensions); extensions.forEach(val => {
const index = this.themes.findIndex(val1 => val1.id === val.id);
//Not exsit
if (index === -1) {
this.themes.push(val);
return;
}
//Has exist
this.themes.splice(index, 1, val);
});
} }
changeEditorTheme(currentTheme = StorageUtil.get('pc_theme')) { changeEditorTheme(currentTheme = StorageUtil.get('pc_theme')) {
const editorTheme = this.getEditorTheme(currentTheme); const editorTheme = this.getEditorTheme(currentTheme);

View File

@ -9,7 +9,7 @@ import { SettingService } from 'pc/browser/src/app/components/system-setting/set
class="sticky top-0 py-[12px] border-solid border-0 border-b-[1px] z-10 mb-[3px]" class="sticky top-0 py-[12px] border-solid border-0 border-b-[1px] z-10 mb-[3px]"
style="border-color: var(--border-color); background-color: var(--background-color); border-bottom: 1px solid var(--system-border-color);" style="border-color: var(--border-color); background-color: var(--background-color); border-bottom: 1px solid var(--system-border-color);"
> >
<button eo-ng-button nzType="primary" (click)="handleSave()">Save</button> <button eo-ng-button nzType="primary" i18n (click)="handleSave()">Save</button>
</div> </div>
<eo-schema-form [model]="localSettings" [configuration]="configuration" /> <eo-schema-form [model]="localSettings" [configuration]="configuration" />
@ -31,6 +31,6 @@ export class ExtensionSettingComponent implements OnInit {
} }
handleSave = () => { handleSave = () => {
this.settingService.saveSetting(this.localSettings); this.settingService.saveSetting(this.localSettings);
this.feedback.success($localize`Save Success`); this.feedback.success($localize`Saved successfully`);
}; };
} }

View File

@ -64,7 +64,7 @@
<ng-template #nzTreeTemplate let-node let-origin="origin"> <ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="h-full" [style.--tree-level]="node.level" apiGroupTree [node]="node"> <div class="h-full" [style.--tree-level]="node.level" apiGroupTree [node]="node">
<div class="flex items-center justify-between tree-node" [ngSwitch]="origin.module"> <div class="flex items-center justify-between tree-node" [ngSwitch]="origin.module">
<div class="flex items-center" [style.width]="'calc(100% - 30px)'"> <div class="flex items-center" (contextmenu)="contextMenu($event, groupMenu)" [style.width]="'calc(100% - 30px)'">
<!-- Folder --> <!-- Folder -->
<ng-container *ngSwitchDefault> <ng-container *ngSwitchDefault>
<eo-iconpark-icon <eo-iconpark-icon
@ -91,6 +91,15 @@
<span class="text-[12px] truncate">{{ origin.title }}</span> <span class="text-[12px] truncate">{{ origin.title }}</span>
</ng-container> </ng-container>
</div> </div>
<eo-ng-dropdown-menu #groupMenu="nzDropdownMenu">
<ul nz-menu>
<ng-container *ngFor="let item of operateByModule[origin.module || groupModuleName].list">
<li nz-menu-item (click)="item.click(origin)">
{{ item.title }}
</li>
</ng-container>
</ul>
</eo-ng-dropdown-menu>
<span <span
class="flex tree-node-operate" class="flex tree-node-operate"
*ngIf="isEdit&&(!operateByModule[origin.module || groupModuleName].showFn||operateByModule[origin.module || groupModuleName].showFn?.(origin))" *ngIf="isEdit&&(!operateByModule[origin.module || groupModuleName].showFn||operateByModule[origin.module || groupModuleName].showFn?.(origin))"
@ -99,15 +108,6 @@
<button eo-ng-button nzType="text" class="tree-item-btn" nzTrigger="click" eo-ng-dropdown [nzDropdownMenu]="groupMenu"> <button eo-ng-button nzType="text" class="tree-item-btn" nzTrigger="click" eo-ng-dropdown [nzDropdownMenu]="groupMenu">
<eo-iconpark-icon name="more" size="16px"></eo-iconpark-icon> <eo-iconpark-icon name="more" size="16px"></eo-iconpark-icon>
</button> </button>
<eo-ng-dropdown-menu #groupMenu="nzDropdownMenu">
<ul nz-menu>
<ng-container *ngFor="let item of operateByModule[origin.module || groupModuleName].list">
<li nz-menu-item (click)="item.click(origin)">
{{ item.title }}
</li>
</ng-container>
</ul>
</eo-ng-dropdown-menu>
</span> </span>
</div> </div>
</div> </div>

View File

@ -2,6 +2,7 @@ import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { EoNgFeedbackMessageService } from 'eo-ng-feedback'; import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
import { action, autorun, reaction, toJS } from 'mobx'; import { action, autorun, reaction, toJS } from 'mobx';
import { NzContextMenuService, NzDropdownMenuComponent } from 'ng-zorro-antd/dropdown';
import { NzTreeComponent, NzFormatEmitEvent, NzTreeNodeOptions, NzTreeNode, NzFormatBeforeDropEvent } from 'ng-zorro-antd/tree'; import { NzTreeComponent, NzFormatEmitEvent, NzTreeNodeOptions, NzTreeNode, NzFormatBeforeDropEvent } from 'ng-zorro-antd/tree';
import { PageUniqueName } from 'pc/browser/src/app/pages/workspace/project/api/api-tab.service'; import { PageUniqueName } from 'pc/browser/src/app/pages/workspace/project/api/api-tab.service';
import { ApiGroupService } from 'pc/browser/src/app/pages/workspace/project/api/components/group/api-group.service'; import { ApiGroupService } from 'pc/browser/src/app/pages/workspace/project/api/components/group/api-group.service';
@ -93,11 +94,14 @@ export class ApiGroupTreeComponent implements OnInit, OnDestroy {
private feedback: EoNgFeedbackMessageService, private feedback: EoNgFeedbackMessageService,
private router: Router, private router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
private nzContextMenuService: NzContextMenuService,
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig @Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
) { ) {
this.operateByModule = this.getGroupOperate(); this.operateByModule = this.getGroupOperate();
} }
contextMenu($event: MouseEvent, menu: NzDropdownMenuComponent): void {
this.nzContextMenuService.create($event, menu);
}
searchFunc = (node: NzTreeNodeOptions) => { searchFunc = (node: NzTreeNodeOptions) => {
const { title } = node; const { title } = node;
const uri = node.relationInfo?.uri; const uri = node.relationInfo?.uri;

View File

@ -20,6 +20,9 @@
<button eo-ng-button nzType="text" class="ml-[5px]" (click)="startEditGroupName()"> <button eo-ng-button nzType="text" class="ml-[5px]" (click)="startEditGroupName()">
<eo-iconpark-icon name="edit"></eo-iconpark-icon> <eo-iconpark-icon name="edit"></eo-iconpark-icon>
</button> </button>
<button (click)="group.toDelete(model)" eo-ng-button nzType="text" class="ml-[5px]">
<eo-iconpark-icon name="delete"></eo-iconpark-icon>
</button>
</ng-container> </ng-container>
</div> </div>
</nz-form-control> </nz-form-control>

View File

@ -4,6 +4,7 @@ import { ActivatedRoute, Router } from '@angular/router';
import { EoNgFeedbackMessageService } from 'eo-ng-feedback'; import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
import { EditTabViewComponent } from 'pc/browser/src/app/components/eo-ui/tab/tab.model'; import { EditTabViewComponent } from 'pc/browser/src/app/components/eo-ui/tab/tab.model';
import { AuthorizationExtensionFormComponent } from 'pc/browser/src/app/pages/workspace/project/api/components/authorization-extension-form/authorization-extension-form.component'; import { AuthorizationExtensionFormComponent } from 'pc/browser/src/app/pages/workspace/project/api/components/authorization-extension-form/authorization-extension-form.component';
import { ApiGroupService } from 'pc/browser/src/app/pages/workspace/project/api/components/group/api-group.service';
import { AuthTypeValue } from 'pc/browser/src/app/pages/workspace/project/api/constants/auth.model'; import { AuthTypeValue } from 'pc/browser/src/app/pages/workspace/project/api/constants/auth.model';
import { ApiService } from 'pc/browser/src/app/services/storage/api.service'; import { ApiService } from 'pc/browser/src/app/services/storage/api.service';
import { Group } from 'pc/browser/src/app/services/storage/db/models'; import { Group } from 'pc/browser/src/app/services/storage/db/models';
@ -39,6 +40,7 @@ export class GroupComponent implements OnDestroy, EditTabViewComponent {
private effect: ApiEffectService, private effect: ApiEffectService,
public globalStore: StoreService, public globalStore: StoreService,
private fb: FormBuilder, private fb: FormBuilder,
public group: ApiGroupService,
private feedback: EoNgFeedbackMessageService, private feedback: EoNgFeedbackMessageService,
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router, private router: Router,

View File

@ -7,6 +7,7 @@ import { ApiTestUtilService } from 'pc/browser/src/app/pages/workspace/project/a
import { ProjectApiService } from 'pc/browser/src/app/pages/workspace/project/api/service/project-api.service'; import { ProjectApiService } from 'pc/browser/src/app/pages/workspace/project/api/service/project-api.service';
import { ApiEffectService } from 'pc/browser/src/app/pages/workspace/project/api/store/api-effect.service'; import { ApiEffectService } from 'pc/browser/src/app/pages/workspace/project/api/store/api-effect.service';
import { syncUrlAndQuery } from 'pc/browser/src/app/pages/workspace/project/api/utils/api.utils'; import { syncUrlAndQuery } from 'pc/browser/src/app/pages/workspace/project/api/utils/api.utils';
import { ModalService } from 'pc/browser/src/app/services/modal.service';
import { ApiService } from 'pc/browser/src/app/services/storage/api.service'; import { ApiService } from 'pc/browser/src/app/services/storage/api.service';
import { MockCreateWay } from 'pc/browser/src/app/services/storage/db/models'; import { MockCreateWay } from 'pc/browser/src/app/services/storage/db/models';
import { ApiData } from 'pc/browser/src/app/services/storage/db/models/apiData'; import { ApiData } from 'pc/browser/src/app/services/storage/db/models/apiData';
@ -27,6 +28,7 @@ export class ApiMockService {
private message: EoNgFeedbackMessageService, private message: EoNgFeedbackMessageService,
private apiEffect: ApiEffectService, private apiEffect: ApiEffectService,
private projectApi: ProjectApiService, private projectApi: ProjectApiService,
private modalService: ModalService,
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig @Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
) { ) {
this.mockOperateUrl = this.tabsConfig.pathByName[PageUniqueName.HttpMock]; this.mockOperateUrl = this.tabsConfig.pathByName[PageUniqueName.HttpMock];
@ -130,13 +132,19 @@ export class ApiMockService {
}); });
} }
async toDelete(id: number) { async toDelete(id: number) {
const data = await this.deleteMock(id); const modelRef = this.modalService.confirm({
if (!data) { nzTitle: $localize`Deletion Confirmation?`,
this.message.error($localize`Failed to delete`); nzContent: $localize``,
return; nzOnOk: async () => {
} const data = await this.deleteMock(id);
this.message.success($localize`Successfully deleted`); if (!data) {
this.apiEffect.deleteMockDetail(); this.message.error($localize`Failed to delete`);
return;
}
this.message.success($localize`Successfully deleted`);
this.apiEffect.deleteMockDetail();
}
});
} }
async copy(mock_id: string) { async copy(mock_id: string) {
const [res] = await this.api.api_mockDetail({ id: mock_id }); const [res] = await this.api.api_mockDetail({ id: mock_id });

View File

@ -1,6 +1,5 @@
import { import {
Component, Component,
OnInit,
OnDestroy, OnDestroy,
ChangeDetectorRef, ChangeDetectorRef,
Input, Input,
@ -9,13 +8,13 @@ import {
ViewChild, ViewChild,
ElementRef, ElementRef,
AfterViewInit, AfterViewInit,
HostListener,
OnChanges, OnChanges,
Inject, Inject,
TemplateRef TemplateRef
} from '@angular/core'; } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
import { isEmpty, isEqual } from 'lodash-es'; import { isEmpty, isEqual } from 'lodash-es';
import { autorun, reaction } from 'mobx'; import { autorun, reaction } from 'mobx';
import { NzResizeEvent } from 'ng-zorro-antd/resizable'; import { NzResizeEvent } from 'ng-zorro-antd/resizable';
@ -51,14 +50,7 @@ import { interval, Subscription, Subject } from 'rxjs';
import { takeUntil, distinctUntilChanged, takeWhile } from 'rxjs/operators'; import { takeUntil, distinctUntilChanged, takeWhile } from 'rxjs/operators';
import { enumsToArr, JSONParse } from '../../../../../../shared/utils/index.utils'; import { enumsToArr, JSONParse } from '../../../../../../shared/utils/index.utils';
import { import { ApiBodyType, ApiParamsType, BASIC_TABS_INFO, RequestMethod, TabsConfig } from '../../constants/api.model';
ApiBodyType,
ApiParamsType,
BASIC_TABS_INFO,
BodyContentType as ContentTypeEnum,
RequestMethod,
TabsConfig
} from '../../constants/api.model';
import { ApiParamsNumPipe } from '../../pipe/api-param-num.pipe'; import { ApiParamsNumPipe } from '../../pipe/api-param-num.pipe';
import { ApiTestUtilService } from '../../service/api-test-util.service'; import { ApiTestUtilService } from '../../service/api-test-util.service';
import { TestServerService } from '../../service/test-server/test-server.service'; import { TestServerService } from '../../service/test-server/test-server.service';
@ -144,6 +136,7 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
private project: ProjectApiService, private project: ProjectApiService,
private elementRef: ElementRef, private elementRef: ElementRef,
private apiEdit: ApiEditUtilService, private apiEdit: ApiEditUtilService,
private feedback: EoNgFeedbackMessageService,
private trace: TraceService, private trace: TraceService,
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig @Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
) { ) {
@ -275,12 +268,24 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
private fixedHeaderAndContentType() { private fixedHeaderAndContentType() {
const bodyType = this.model.request?.apiAttrInfo?.contentType; const bodyType = this.model.request?.apiAttrInfo?.contentType;
if (bodyType !== ApiBodyType.Binary) { if (bodyType !== ApiBodyType.Binary) {
//* User customer headers first
const userCustomerHeader = this.model.request.requestParams.headerParams.find(
//@ts-ignore
val => val.name.toLowerCase() === 'content-type' && !val.disableEdit
);
if (userCustomerHeader) {
const contentType = this.getContentTypeByBodyType();
this.model.userSelectedContentType = contentType as ContentType;
return;
}
//* app set header default
const contentType = this.getContentTypeByBodyType(); const contentType = this.getContentTypeByBodyType();
this.model.request.requestParams.headerParams = this.apiTestUtil.addOrReplaceContentType( this.model.request.requestParams.headerParams = this.apiTestUtil.addOrReplaceContentType(
contentType, contentType,
this.model.request.requestParams.headerParams this.model.request.requestParams.headerParams
); );
this.model.userSelectedContentType ??= contentType as ContentType; this.model.userSelectedContentType = contentType as ContentType;
return; return;
} }
@ -294,6 +299,7 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
} }
changeBodyType($event) { changeBodyType($event) {
StorageUtil.set('api_test_body_type', $event); StorageUtil.set('api_test_body_type', $event);
this.fixedHeaderAndContentType();
} }
handleBottomTabSelect(tab) { handleBottomTabSelect(tab) {
if (tab.index === 2) { if (tab.index === 2) {
@ -474,9 +480,14 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
this.validateForm = this.fb.group(controls); this.validateForm = this.fb.group(controls);
this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(x => { this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(x => {
//Watch uri changes //Import curl when uri match
if (x?.uri?.trim().startsWith('curl')) { if (x?.uri?.trim().startsWith('curl')) {
this.model = this.apiTestUtil.getTestDataFromCurl(x.uri, this.model); const [result, err] = this.apiTestUtil.getTestDataFromCurl(x.uri, this.model);
if (err) {
this.feedback.error($localize`Curl text error: ${err}`);
return;
}
this.model = result;
this.validateForm.patchValue({ this.validateForm.patchValue({
uri: this.model.request.uri, uri: this.model.request.uri,
method: this.model.request.apiAttrInfo?.requestMethod method: this.model.request.apiAttrInfo?.requestMethod

View File

@ -1,8 +1,8 @@
<div class="h-full flex flex-col test-page-{{ currentPage }}"> <div class="h-full flex flex-col test-page-{{ currentPage }}">
<ng-container *ngIf="currentPage === 'caseTest'"> <ng-container *ngIf="currentPage === 'caseTest'">
<form nz-form nzLayout="inline" class="px-[15px] py-[8px]" *ngIf="model?.request" (ngSubmit)="saveName()"> <form nz-form nzLayout="inline" class="px-[15px] min-h-[50px]" *ngIf="model?.request" (ngSubmit)="saveName()">
<nz-form-item class="flex items-center"> <nz-form-item class="flex items-center">
<nz-form-control i18n-nzErrorTip nzErrorTip="Please input case name" *ngIf="isNameEdit"> <nz-form-control *ngIf="isNameEdit">
<input <input
nz-input nz-input
[(ngModel)]="name" [(ngModel)]="name"

View File

@ -5,8 +5,10 @@ import {
IGNORE_HEADERS, IGNORE_HEADERS,
JsonRootType, JsonRootType,
Protocol, Protocol,
RequestMethod RequestMethod,
requestMethodMap
} from 'pc/browser/src/app/pages/workspace/project/api/constants/api.model'; } from 'pc/browser/src/app/pages/workspace/project/api/constants/api.model';
import { ContentTypeMap } from 'pc/browser/src/app/pages/workspace/project/api/http/test/api-test-ui.component';
import { syncUrlAndQuery } from 'pc/browser/src/app/pages/workspace/project/api/utils/api.utils'; import { syncUrlAndQuery } from 'pc/browser/src/app/pages/workspace/project/api/utils/api.utils';
import { parseCurl } from 'pc/browser/src/app/pages/workspace/project/api/utils/parse-curl.utils'; import { parseCurl } from 'pc/browser/src/app/pages/workspace/project/api/utils/parse-curl.utils';
import { ApiData, BodyParam, HeaderParam, RestParam } from 'pc/browser/src/app/services/storage/db/models/apiData'; import { ApiData, BodyParam, HeaderParam, RestParam } from 'pc/browser/src/app/services/storage/db/models/apiData';
@ -50,7 +52,7 @@ export class ApiTestUtilService {
*/ */
formatUIApiDataToStorage(inData: { request: Partial<ApiData>; response: ApiTestResData }): ApiData { formatUIApiDataToStorage(inData: { request: Partial<ApiData>; response: ApiTestResData }): ApiData {
inData = eoDeepCopy(inData); inData = eoDeepCopy(inData);
pcConsole.log('formatUIApiDataToStorage', inData); // pcConsole.log('formatUIApiDataToStorage', inData);
const result = { const result = {
...inData.request, ...inData.request,
protocol: Protocol.HTTP, protocol: Protocol.HTTP,
@ -192,52 +194,73 @@ export class ApiTestUtilService {
/** /**
* Parse curl to test formdata * Parse curl to test formdata
*/ */
getTestDataFromCurl(text, originModel: testViewModel): testViewModel { getTestDataFromCurl(text, originModel: testViewModel): [testViewModel, string?] {
const result: testViewModel = eoDeepCopy(originModel); const result: testViewModel = eoDeepCopy(originModel);
let requestObj;
try { try {
const requestObj = parseCurl(text || ''); requestObj = parseCurl(text || '');
console.log(requestObj); console.log('getTestDataFromCurl', requestObj);
} catch (e) {
pcConsole.error(`parseCurl error: ${e}`);
return [result, e.message];
}
result.request.uri = requestObj.url;
//@ts-ignore
result.request.apiAttrInfo.requestMethod = RequestMethod[requestObj.method];
//Set Query
result.request.requestParams.queryParams = Object.keys(requestObj.query)
.map(name => ({
name,
value: requestObj.query[name]
}))
.map(val => {
return {
name: val.name,
isRequired: 1,
paramAttr: {
example: val.value
}
};
});
result.request.uri = requestObj.url; //Set Header
result.request.apiAttrInfo.requestMethod = RequestMethod[requestObj.method]; result.request.requestParams.headerParams = Object.keys(requestObj.header)
//Set Query .map(name => ({
result.request.requestParams.queryParams = Object.keys(requestObj.query) name,
.map(name => ({ value: requestObj.header[name]
name, }))
value: requestObj.query[name] //Ignore some headers
})) .filter(val => !IGNORE_HEADERS.includes(val.name.toLowerCase()))
.map(val => { .map(val => {
return { return {
name: val.name, name: val.name,
isRequired: 1,
paramAttr: {
example: val.value
}
};
});
//Set body and contentType
const formDataContentType = FORMDATA_CONTENT_TYPE_BY_ABRIDGE.find(val => requestObj.contentType?.includes(val.value));
if (formDataContentType) {
result.request.apiAttrInfo.contentType = ApiBodyType.FormData;
if (formDataContentType.value === 'application/x-www-form-urlencoded') {
//Urlencode formdata
const formArr: BodyParam[] = [];
new URLSearchParams(requestObj.body).forEach((val, name) => {
formArr.push({
name,
dataType: ApiParamsType.string,
isRequired: 1, isRequired: 1,
paramAttr: { paramAttr: {
example: val.value example: val
} }
}; });
}); });
result.request.requestParams.bodyParams = formArr;
//Set Header } else {
result.request.requestParams.headerParams = Object.keys(requestObj.header) //Multipart-formdata
.map(name => ({
name,
value: requestObj.header[name]
}))
//Ignore some headers
.filter(val => !IGNORE_HEADERS.includes(val.name.toLowerCase()))
.map(val => {
return {
name: val.name,
isRequired: 1,
paramAttr: {
example: val.value
}
};
});
//Set body and contentType
if (FORMDATA_CONTENT_TYPE_BY_ABRIDGE.find(val => requestObj.contentType.includes(val.value))) {
result.request.apiAttrInfo.contentType = ApiBodyType.FormData;
//Get formdata
const formArr: BodyParam[] = []; const formArr: BodyParam[] = [];
const nameReg = /name=\"(.+?)\"/; const nameReg = /name=\"(.+?)\"/;
requestObj.body requestObj.body
@ -247,6 +270,7 @@ export class ApiTestUtilService {
const fIndex = Math.floor(index / 2); const fIndex = Math.floor(index / 2);
//FormName //FormName
if (!formArr[fIndex]) { if (!formArr[fIndex]) {
debugger;
const name = val.match(nameReg)[1]; const name = val.match(nameReg)[1];
formArr[fIndex] = { formArr[fIndex] = {
name: name, name: name,
@ -260,19 +284,17 @@ export class ApiTestUtilService {
formArr[fIndex].paramAttr.example = val; formArr[fIndex].paramAttr.example = val;
}); });
result.request.requestParams.bodyParams = formArr; result.request.requestParams.bodyParams = formArr;
} else {
result.request.apiAttrInfo.contentType = ApiBodyType.Raw;
result.request.requestParams.bodyParams = [
{
binaryRawData: requestObj.body
}
];
} }
} catch (e) { } else {
pcConsole.error(`parseCurl error: ${e}`); result.request.apiAttrInfo.contentType = ApiBodyType.Raw;
result.request.requestParams.bodyParams = [
{
binaryRawData: requestObj.body
}
];
} }
console.log('getTestDataFromCurl', result); console.log('getTestDataFromCurl', result);
return result; return [result];
} }
getContentType(headers = []) { getContentType(headers = []) {
const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type'); const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type');
@ -287,7 +309,7 @@ export class ApiTestUtilService {
*/ */
addOrReplaceContentType(contentType: ContentType | string, headers: HeaderParam[] | any = []) { addOrReplaceContentType(contentType: ContentType | string, headers: HeaderParam[] | any = []) {
const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type'); const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type');
if (existHeader?.paramAttr) { if (existHeader?.paramAttr && existHeader.disableEdit) {
existHeader.paramAttr.example = contentType; existHeader.paramAttr.example = contentType;
return headers; return headers;
} }
@ -297,7 +319,8 @@ export class ApiTestUtilService {
name: 'content-type', name: 'content-type',
paramAttr: { paramAttr: {
example: contentType example: contentType
} },
disableEdit: true
}, },
...headers ...headers
]; ];

View File

@ -32,7 +32,6 @@ export class TestServerRemoteService extends TestServerService {
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.onreadystatechange = e => { xhr.onreadystatechange = e => {
if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.readyState === XMLHttpRequest.DONE) {
console.log(xhr.status);
switch (xhr.status) { switch (xhr.status) {
case 200: { case 200: {
this.receiveMessage(this.formatResponseData(JSON.parse(xhr.responseText).data)); this.receiveMessage(this.formatResponseData(JSON.parse(xhr.responseText).data));

View File

@ -145,8 +145,12 @@ export abstract class TestServerService implements TestServer {
contentType: ['formData', 'raw', 'json', 'xml', 'binary'][history.requestInfo.requestType] || 'raw' contentType: ['formData', 'raw', 'json', 'xml', 'binary'][history.requestInfo.requestType] || 'raw'
} }
}; };
console.log(response.body);
if (response.statusCode === 0 && !this.electron.isElectron) { if (
response.statusCode === 0 &&
['getaddrinfo enotfound'].some(val => response.body.toLowerCase().includes(val)) &&
!this.electron.isElectron
) {
response.body = $localize`Service connection failed. The server test is currently being used.\nIf the current test URL is a local API, please download the desktop and re-initiate the test.`; response.body = $localize`Service connection failed. The server test is currently being used.\nIf the current test URL is a local API, please download the desktop and re-initiate the test.`;
} }
result = { result = {

View File

@ -281,6 +281,7 @@ export class ApiEffectService {
if (err) { if (err) {
return; return;
} }
this.feedback.success($localize`Successfully deleted`);
const envList = this.store.getEnvList.filter(it => it.id !== id); const envList = this.store.getEnvList.filter(it => it.id !== id);
this.store.setEnvList(envList); this.store.setEnvList(envList);
} }

View File

@ -63,7 +63,7 @@ export const parseCurl = function (s) {
args.forEach(function (arg) { args.forEach(function (arg) {
switch (true) { switch (true) {
case isURL(arg): case isURL(arg):
out.url = arg.split('?')[0]; out.url = arg;
out.query = getQueryFromURL(arg); out.query = getQueryFromURL(arg);
break; break;
@ -115,7 +115,10 @@ export const parseCurl = function (s) {
break; break;
case 'data': case 'data':
if (out.method === 'GET' || out.method === 'HEAD') out.method = 'POST'; if (out.method === 'GET' || out.method === 'HEAD') out.method = 'POST';
out.header['Content-Type'] ??= out.header['Content-Type'] || out.header['content-type'] || 'application/x-www-form-urlencoded'; if (!out.header['content-Type'] && !out.header['Content-Type']) {
out.header['content-type'] ??=
out.header['Content-Type'] || out.header['content-type'] || 'application/x-www-form-urlencoded';
}
out.body = out.body ? `${out.body}&${arg}` : arg; out.body = out.body ? `${out.body}&${arg}` : arg;
state = ''; state = '';
break; break;
@ -135,6 +138,6 @@ export const parseCurl = function (s) {
break; break;
} }
}); });
out.contentType = out.header['Content-Type']; out.contentType = out.header['Content-Type'] || out.header['content-type'];
return out; return out;
}; };

View File

@ -79,10 +79,12 @@ export const whatTextType = (tmpText): 'xml' | 'json' | 'html' | 'text' => {
* @param enum * @param enum
*/ */
export const enumsToObject = tEnum => export const enumsToObject = tEnum =>
Object.entries<any>(tEnum).reduce((acc, [key, value]) => { Object.values<any>(tEnum)
acc[value] = key; .filter(val => !isNumber(val))
return acc; .reduce((acc, val) => {
}, {}); acc[tEnum[val]] = val;
return acc;
}, {});
/** /**
* Reverse Typescript enums key and value * Reverse Typescript enums key and value
* *

View File

@ -439,6 +439,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
//Get runtime instance //Get runtime instance
const ctx = await pmRuntime.createContextAsync({ timeout: 10000, disableLegacyAPIs: true }); const ctx = await pmRuntime.createContextAsync({ timeout: 10000, disableLegacyAPIs: true });
let tmpEnvGlobals = Object.assign({}, global.eoTestGlobals || {}, tmpBasicEnv.envParam || {});
const context = { const context = {
enviroment: [], enviroment: [],
request: { request: {
@ -463,7 +464,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
}, },
header: Object.keys(inputData.headers).map(keyName => ({ key: keyName, value: inputData.headers[keyName] })) header: Object.keys(inputData.headers).map(keyName => ({ key: keyName, value: inputData.headers[keyName] }))
}, },
globals: Object.keys(global.eoTestGlobals).map(keyName => ({ key: keyName, type: 'any', value: global.eoTestGlobals[keyName] })) globals: Object.keys(tmpEnvGlobals).map(keyName => ({ key: keyName, type: 'any', value: tmpEnvGlobals[keyName] }))
}; };
switch (inputData.requestType) { switch (inputData.requestType) {
case '0': { case '0': {
@ -751,6 +752,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
} }
} }
let tmpEnvGlobals = Object.assign({}, global.eoTestGlobals || {}, tmpEnviroments || {}); let tmpEnvGlobals = Object.assign({}, global.eoTestGlobals || {}, tmpEnviroments || {});
tmpOutput.url = tmpTargetTypeData.apiUrl.split('?')[0];
for (let key in tmpEnvGlobals) { for (let key in tmpEnvGlobals) {
let val = tmpEnvGlobals[key]; let val = tmpEnvGlobals[key];
let templateParamObject = {}; let templateParamObject = {};
@ -760,7 +762,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
delete tmp_query_param_obj[tmp_query_param_key]; delete tmp_query_param_obj[tmp_query_param_key];
tmp_query_param_obj[_LibsCommon.replaceAll('{{' + key + '}}', val || '', tmp_query_param_key)] = tmp_query_param_val; tmp_query_param_obj[_LibsCommon.replaceAll('{{' + key + '}}', val || '', tmp_query_param_key)] = tmp_query_param_val;
} }
tmpOutput.url = _LibsCommon.replaceAll('{{' + key + '}}', val || '', tmpTargetTypeData.apiUrl.split('?')[0]); tmpOutput.url = _LibsCommon.replaceAll('{{' + key + '}}', val || '', tmpOutput.url);
for (let childKey in tmpHeaders) { for (let childKey in tmpHeaders) {
tmpHeaders[childKey] = _LibsCommon.replaceAll('{{' + key + '}}', val, tmpHeaders[childKey]); tmpHeaders[childKey] = _LibsCommon.replaceAll('{{' + key + '}}', val, tmpHeaders[childKey]);
if (childKey.indexOf('{{' + key + '}}') > -1) { if (childKey.indexOf('{{' + key + '}}') > -1) {

View File

@ -208,14 +208,14 @@
errObj: /getaddrinfo enotfound/i.test(tmpInputErr.message) errObj: /getaddrinfo enotfound/i.test(tmpInputErr.message)
? { ? {
name: 'API请求地址有误', name: 'API请求地址有误',
message: '请检查是否正确填写URL以及URL是否允许访问' message: `请检查是否正确填写URL以及URL是否允许访问${tmpInputErr.message}`
} }
: /socket hang up/i.test(tmpInputErr.message) : /socket hang up/i.test(tmpInputErr.message)
? { ? {
name: '请求错误', name: '请求错误',
message: message:
SOCKET_HANG_UP_TIP_TEXT_OBJ['SAAS_SERVER'] || SOCKET_HANG_UP_TIP_TEXT_OBJ['SAAS_SERVER'] ||
'无法访问目标地址,请检查接口是否能被正常访问,是否存在网络隔离或防火墙。' `无法访问目标地址,请检查接口是否能被正常访问,是否存在网络隔离或防火墙${tmpInputErr.message}`
} }
: tmpInputErr : tmpInputErr
}, },

View File

@ -62,9 +62,9 @@ test('Basic Operate', async ({ page }) => {
test('Check All Param Operate', async ({ page }) => { test('Check All Param Operate', async ({ page }) => {
await page.getByRole('banner').getByRole('button').click(); await page.getByRole('banner').getByRole('button').click();
// //Url //Url
await page.locator('input[name="uri"]').fill('/?json'); await page.locator('input[name="uri"]').fill('/?json');
// //Name //Name
await page.locator('input[name="name"]').click(); await page.locator('input[name="name"]').click();
await page.locator('input[name="name"]').fill('JSON'); await page.locator('input[name="name"]').fill('JSON');
//?example descript isRequire addChild delete //?example descript isRequire addChild delete
@ -155,9 +155,6 @@ test('Save Form Data API', async ({ page }) => {
//Save API //Save API
await page.locator('input[name="uri"]').press('Meta+s'); await page.locator('input[name="uri"]').press('Meta+s');
await ifTipsExist(page, 'Added successfully'); await ifTipsExist(page, 'Added successfully');
//XML
//Raw
}); });
test('Save XML API', async ({ page }) => { test('Save XML API', async ({ page }) => {
@ -182,9 +179,6 @@ test('Save XML API', async ({ page }) => {
//Save API //Save API
await page.locator('input[name="uri"]').press('Meta+s'); await page.locator('input[name="uri"]').press('Meta+s');
await ifTipsExist(page, 'Added successfully'); await ifTipsExist(page, 'Added successfully');
//XML
//Raw
}); });
test('Save Raw API', async ({ page }) => { test('Save Raw API', async ({ page }) => {
@ -204,12 +198,7 @@ test('Save Raw API', async ({ page }) => {
Example: 'value' Example: 'value'
} }
}); });
//Import
//Save API //Save API
await page.locator('input[name="uri"]').press('Meta+s'); await page.locator('input[name="uri"]').press('Meta+s');
await ifTipsExist(page, 'Added successfully'); await ifTipsExist(page, 'Added successfully');
//XML
//Raw
}); });

View File

@ -1,6 +1,6 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
import { ifTipsExist, operateGroup, seletGroup } from '../utils/commom.util'; import { clickButtonByIconName, closeTab, ifTipsExist, operateGroup, seletGroup } from '../utils/commom.util';
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto('/'); await page.goto('/');
await page.getByRole('button', { name: 'Got it' }).click(); await page.getByRole('button', { name: 'Got it' }).click();
@ -18,21 +18,26 @@ test.beforeEach(async ({ page }) => {
await page.getByPlaceholder('Group Name').press('Enter'); await page.getByPlaceholder('Group Name').press('Enter');
//Close group tab //Close group tab
await page.getByRole('tab').getByText(subGroupName).hover(); await closeTab(page, subGroupName);
await page.getByRole('button', { name: 'Close tab' }).click();
}); });
test('Basic Operate', async ({ page }) => { test('Basic Operate', async ({ page }) => {
//Edit group //Edit group
await operateGroup(page, 'Sub Group', 'Edit'); await operateGroup(page, 'Sub Group', 'Edit');
await page.locator('nz-form-control').filter({ hasText: 'Sub Group' }).getByRole('button').click(); await clickButtonByIconName(page, 'edit');
await page.getByPlaceholder('Group Name').fill('Sub Group after'); await page.getByPlaceholder('Group Name').fill('Sub Group after');
await page.getByPlaceholder('Group Name').press('Enter'); await page.getByPlaceholder('Group Name').press('Enter');
//Delete group //Delete group from tree
await operateGroup(page, 'Sub Group', 'Delete'); await operateGroup(page, 'Sub Group', 'Delete');
await page.getByRole('button', { name: 'Ok' }).click(); await page.getByRole('button', { name: 'Ok' }).click();
await ifTipsExist(page, 'Successfully deleted'); await ifTipsExist(page, 'Successfully deleted');
//Delete group from edit page
await page.locator('nz-tree-node-title div').first().click();
await clickButtonByIconName(page, 'delete');
await page.getByRole('button', { name: 'OK' }).click();
await ifTipsExist(page, 'Successfully deleted');
}); });
test('Search', async ({ page }) => { test('Search', async ({ page }) => {
//Search Group //Search Group

View File

@ -1,6 +1,6 @@
import { test, expect, chromium } from '@playwright/test'; import { test, expect, chromium } from '@playwright/test';
import { adaTabledRow, addTextToEditor, ECHO_API_URL, ifTipsExist } from '../utils/commom.util'; import { adaTabledRow, addEnv, addTextToEditor, ECHO_API_URL, ifTipsExist } from '../utils/commom.util';
const testAndWaitForResponse = async page => { const testAndWaitForResponse = async page => {
const responsePromise = page.waitForResponse('**/api/unit'); const responsePromise = page.waitForResponse('**/api/unit');
await page.getByRole('button', { name: 'Send' }).click(); await page.getByRole('button', { name: 'Send' }).click();
@ -75,7 +75,7 @@ test('Unit Test', async ({ page }) => {
*/ */
test('Import Data Unit Test', async ({ page }) => { test('Import Data Unit Test', async ({ page }) => {
await page.getByPlaceholder('Enter URL').click(); await page.getByPlaceholder('Enter URL').click();
await page.getByPlaceholder('Enter URL').fill('http://demo.gokuapi.com:8280/Web/Test/all/print'); await page.getByPlaceholder('Enter URL').fill(ECHO_API_URL);
//Header //Header
await page.getByText('Headers').click(); await page.getByText('Headers').click();
await adaTabledRow(page, { await adaTabledRow(page, {
@ -167,3 +167,101 @@ test('Raw Test', async ({ page }) => {
const res1 = await testAndWaitForResponse(page); const res1 = await testAndWaitForResponse(page);
expect(res1.body).toEqual(`{"test":1,"test1":2}`); expect(res1.body).toEqual(`{"test":1,"test1":2}`);
}); });
/**
* Global Varibale Test
*/
test('Global Variable Test', async ({ page }) => {
//Env Globals
await addEnv(page);
await page.getByPlaceholder('Enter URL').click();
await page.getByPlaceholder('Enter URL').fill('/Web/Test/all/{{pathVariable}}');
//JSON Body
await addTextToEditor(page, `{"{{globalName}}":"{{globalName}}"}`);
//Header
await page.getByText('Headers').click();
//First row is content-type
await adaTabledRow(page, {
index: 1,
valueByKey: {
Name: '{{globalName}}',
Value: '{{globalName}}'
}
});
//Query
await page.getByText('Query').click();
await adaTabledRow(page, {
index: 0,
valueByKey: {
Name: '{{globalName}}',
Value: '{{globalName}}'
}
});
const res = await testAndWaitForResponse(page);
expect(res.path).toEqual('/Web/Test/all/print');
expect(res.body).toEqual(`{"globalVariable":"globalVariable"}`);
expect(res.query.globalVariable[0]).toEqual('globalVariable');
expect(res.header.Globalvariable[0]).toEqual('globalVariable');
//Script Globals
await page.getByText('Script Action').click();
await addTextToEditor(page, `pc.globals.set("scriptVariable","scriptVariable");`);
await page.getByText('Body').first().click();
await addTextToEditor(page, `{"{{globalName}}":"{{globalName}}","{{scriptVariable}}":"{{scriptVariable}}"}`);
const res1 = await testAndWaitForResponse(page);
expect(res1.body).toEqual(`{"globalVariable":"globalVariable","scriptVariable":"scriptVariable"}`);
//Form-data
await page.getByText('Form-Data').click();
await adaTabledRow(page, {
index: 0,
valueByKey: {
Name: '{{globalName}}',
Value: '{{globalName}}'
}
});
const res2 = await testAndWaitForResponse(page);
expect(res2.body).toEqual(`globalVariable=globalVariable`);
});
test('Import Curl Test', async ({ page }) => {
await page.getByPlaceholder('Enter URL').click();
//Form-Data application/x-www-form-urlencoded
await page.getByPlaceholder('Enter URL').fill(`curl 'http://demo.gokuapi.com:8280/Web/Test/all/print?query=query' \
-H 'Accept: */*' \
-H 'Accept-Language: en,zh-CN;q=0.9,zh;q=0.8' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Cookie: uid=1' \
-H 'Eo-Token: 85f3cfbb-e185-48d9-8dc0-f5da86177329' \
-H 'Origin: chrome-extension://plecpgbpgkbmgigendedfaahcajeaimi' \
-H 'Proxy-Connection: keep-alive' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36' \
-H 'header: header' \
--data-raw 'form=value&form2=value' \
--compressed \
--insecure`);
const res = await testAndWaitForResponse(page);
expect(res.body).toEqual(`form=value&form2=value`);
expect(res.query.query[0]).toEqual('query');
expect(res.header.Header[0]).toEqual('header');
//Form-Dara
// await page.getByPlaceholder('Enter URL').click();
// await page.getByPlaceholder('Enter URL').fill(`curl 'http://demo.gokuapi.com:8280/Web/Test/all/print?query=query' \
// -H 'Accept: */*' \
// -H 'Accept-Language: en,zh-CN;q=0.9,zh;q=0.8' \
// -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVBz1dMCpoC5JE3xx' \
// -H 'Cookie: uid=1' \
// -H 'Eo-Token: 5815ecc4-20ab-40ba-a943-f5e7c3624274' \
// -H 'Origin: chrome-extension://plecpgbpgkbmgigendedfaahcajeaimi' \
// -H 'Proxy-Connection: keep-alive' \
// -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36' \
// -H 'header: header' \
// --data-raw $'------WebKitFormBoundaryVBz1dMCpoC5JE3xx\r\nContent-Disposition: form-data; name="form"\r\n\r\nvalue\r\n------WebKitFormBoundaryVBz1dMCpoC5JE3xx\r\nContent-Disposition: form-data; name="file"; filename="latest.yml"\r\nContent-Type: application/x-yaml\r\n\r\nversion: 0.5.0\nfiles:\n - url: Postcat-Setup-0.5.0.exe\n sha512: Hu07AiOfO9xGuddFfvP9BItyWjylYi5Kc2BLbGTj22P4damBk8oR+2yacaW4t/M0fMdHnmyXMXGRYLN/u6PhAQ==\n size: 90365912\npath: Postcat-Setup-0.5.0.exe\nsha512: Hu07AiOfO9xGuddFfvP9BItyWjylYi5Kc2BLbGTj22P4damBk8oR+2yacaW4t/M0fMdHnmyXMXGRYLN/u6PhAQ==\nreleaseDate: \'2023-04-04T12:03:57.000Z\'\n\r\n------WebKitFormBoundaryVBz1dMCpoC5JE3xx--\r\n' \
// --compressed \
// --insecure`);
// const res1 = await testAndWaitForResponse(page);
// expect(res1.body).toEqual(`form=value&f1orm2=value`);
});

View File

@ -1,43 +1,28 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
import { ECHO_API_URL, ifTipsExist } from '../utils/commom.util'; import { adaTabledRow, addEnv, ECHO_API_URL, ifTipsExist } from '../utils/commom.util';
const url = new URL(ECHO_API_URL);
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto('/'); await page.goto('/');
//Add env await page.getByRole('button', { name: 'Got it' }).click();
await page.locator('a').filter({ hasText: 'Environment' }).click(); await addEnv(page, {
await page.getByRole('banner').getByRole('button').click(); name: 'DEV'
await page.getByLabel('Name').fill('DEV'); });
await page.getByLabel('Host').click({ timeout: 1000 });
await page.getByLabel('Host').fill(url.host);
await page.getByPlaceholder('Name').click({ timeout: 1000 });
await page.getByPlaceholder('Name').fill('globalName');
await page.getByPlaceholder('Value').first().dblclick();
await page.getByPlaceholder('Value').first().fill('globalVariable');
await page.getByPlaceholder('Description').first().click();
await page.getByPlaceholder('Description').first().fill('globalDescription');
await page.getByRole('button', { name: 'Save' }).click();
await ifTipsExist(page, 'Added successfully');
}); });
test('Env Basic', async ({ page }) => { test('Env Basic', async ({ page }) => {
//Add first env will choose it //Add first env will choose it
await page.locator('nz-tree-node-title div').first().click();
//Edit env //Edit env
await page.getByRole('tablist').locator('div').filter({ hasText: 'DEV' }).nth(2).hover();
await page.getByRole('button', { name: 'Close tab' }).click();
await page.locator('div').filter({ hasText: 'DEV' }).click();
await page.getByLabel('Name').press('Meta+s'); await page.getByLabel('Name').press('Meta+s');
await ifTipsExist(page, 'Edited successfully'); await ifTipsExist(page, 'Edited successfully');
//Delete env //Delete env
});
test('Env Delete', async ({ page }) => {
await page.locator('nz-tree-node-title div').first().hover(); await page.locator('nz-tree-node-title div').first().hover();
await page.locator('nz-tree-node-title').getByRole('button').click(); await page.locator('nz-tree-node-title').getByRole('button').click();
await page.getByRole('button', { name: 'Delete' }).click(); await page.getByRole('button', { name: 'Delete' }).click();
await ifTipsExist(page, 'Successfully deleted');
}); });
// test('Use Env', async ({ page }) => { // test('Preview Env', async ({ page }) => {
// //Host uri // //Host uri
// //Global variable // //Global variable
// //Change env will change host uri // //Change env will change host uri

View File

@ -2,24 +2,25 @@ import { test, expect } from '@playwright/test';
const installExtension = async () => {}; const installExtension = async () => {};
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto('/'); await page.goto('/');
await page.getByRole('button', { name: 'Got it' }).click();
}); });
test('Basic Operate', async ({ page }) => { // test('Basic Operate', async ({ page }) => {
//Install Extension // //Install Extension
//Close Extension // //Close Extension
//Open Extension // //Open Extension
//Uninstall Extension // //Uninstall Extension
//Switch Extension Type // //Switch Extension Type
//Search Extension // //Search Extension
}); // });
test('Sync URL From TEST', async ({ page }) => {}); // test('Sync URL From TEST', async ({ page }) => {});
test('Import Swagger', async ({ page }) => { // test('Import Swagger', async ({ page }) => {
await page.getByRole('button', { name: 'Tap or drag files directly to this area Only supports importing a single file' }).click(); // await page.getByRole('button', { name: 'Tap or drag files directly to this area Only supports importing a single file' }).click();
await page // await page
.getByRole('button', { name: 'Tap or drag files directly to this area Only supports importing a single file' }) // .getByRole('button', { name: 'Tap or drag files directly to this area Only supports importing a single file' })
.setInputFiles('Postcat-Export-0403.json'); // .setInputFiles('Postcat-Export-0403.json');
}); // });
test('APISpace Extension', async ({ page }) => {}); // test('APISpace Extension', async ({ page }) => {});
test('Export API', async ({ page }) => { test('Export API', async ({ page }) => {
await page.goto('/'); await page.goto('/');
await page.locator('a:has-text("Setting")').click(); await page.locator('a:has-text("Setting")').click();

View File

@ -1,21 +1,21 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
import { login } from '../utils/commom.util'; import { login } from '../utils/commom.util';
test.beforeEach(async ({ page }) => { // test.beforeEach(async ({ page }) => {
await page.goto('/'); // await page.goto('/');
}); // });
test('Workspace Member', async ({ page }) => { // test('Workspace Member', async ({ page }) => {
//Login // //Login
await login(page); // await login(page);
//Switch to cloud workspace // //Switch to cloud workspace
//Add member to workspace // //Add member to workspace
//Change role,default // //Change role,default
//Remove member // //Remove member
//Add Member // //Add Member
//Login with new member // //Login with new member
//Quit workspace // //Quit workspace
}); // });
test('Project Member', async ({ page }) => { // test('Project Member', async ({ page }) => {
//Add member to workspace // //Add member to workspace
//Add member to project // //Add member to project
}); // });

View File

@ -1,12 +1,12 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
test.beforeEach(async ({ page }) => { // test.beforeEach(async ({ page }) => {
await page.goto('/'); // await page.goto('/');
await page.getByRole('button', { name: 'Got it' }).click(); // await page.getByRole('button', { name: 'Got it' }).click();
}); // });
test('Basic Operate', async ({ page }) => { // test('Basic Operate', async ({ page }) => {
//Back to Project List // //Back to Project List
//Add project // //Add project
//Edit project // //Edit project
//Delete project // //Delete project
}); // });
//Share Project // //Share Project

View File

@ -0,0 +1,31 @@
import { test, expect, chromium } from '@playwright/test';
import { adaTabledRow, addEnv, addTextToEditor, ECHO_API_URL, ifTipsExist } from '../utils/commom.util';
test.beforeEach(async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Got it' }).click();
});
/**
* Basic Test
*/
test('Websocekt Test', async ({ page }) => {
await page.locator('eo-tab').getByRole('button').first().hover();
await page.getByText('Websocket').click();
//Connect
await page.getByPlaceholder('Enter URL').click();
await page
.getByPlaceholder('Enter URL')
.fill('wss://demo.piesocket.com/v3/channel_1?api_key=VCXCEuvhGcBDP7XhiJJUDvR1e1D3eiVjgZ9VRiaV&notify_self=');
await page.getByRole('button', { name: 'Connect' }).click();
await ifTipsExist(page, 'Connected to');
//Send Body
await addTextToEditor(page, 'i am a body');
await page.getByRole('button', { name: 'Send' }).click();
await page.getByRole('list').getByText('i am a body').isVisible();
//Disconnect
await page.getByRole('button', { name: 'Disconnect' }).click();
await ifTipsExist(page, 'Disconnect from');
});

View File

@ -1,10 +1,13 @@
import { expect } from '@playwright/test'; import { expect } from '@playwright/test';
export const ECHO_API_URL = 'http://demo.gokuapi.com:8280/Web/Test/all/print'; export const ECHO_API_URL = 'http://demo.gokuapi.com:8280/Web/Test/all/print';
export const addTextToEditor = async (page, text, monacoEditor = page.locator('.ant-modal-body .monaco-editor').first()) => { export const addTextToEditor = async (page, text, monacoEditor = page.locator('.ant-modal-body .monaco-editor').first()) => {
const isExist = await monacoEditor.count(); const isExist = await monacoEditor.isVisible();
monacoEditor = isExist ? monacoEditor : await page.locator('.monaco-editor').first(); monacoEditor = isExist ? monacoEditor : await page.locator('.monaco-editor').first();
//? some times monaco editor not ready
await page.waitForTimeout(500);
await monacoEditor.click(); await monacoEditor.click();
await page.keyboard.press('Meta+KeyA'); await page.keyboard.press('Meta+KeyA');
await page.keyboard.press('Delete');
await page.keyboard.type(text); await page.keyboard.type(text);
}; };
export const clickButtonByIconName = async (page, name) => { export const clickButtonByIconName = async (page, name) => {
@ -27,9 +30,43 @@ export const operateGroup = async (page, groupName, operateName) => {
await page.getByText(operateName, { exact: true }).click(); await page.getByText(operateName, { exact: true }).click();
} }
}; };
export const closeTab = async (page, tabName) => {
await page.getByRole('tab').getByText(tabName).hover();
await page.getByRole('button', { name: 'Close tab' }).click();
};
export const ifTipsExist = async (page, tips) => { export const ifTipsExist = async (page, tips) => {
await expect(page.locator(`text=${tips}`)).toBeVisible(); await expect(page.locator(`text=${tips}`)).toBeVisible();
}; };
export const addEnv = async (page, env?) => {
env = {
name: 'DEV',
host: 'http://demo.gokuapi.com:8280',
globalVariable: [
{
Name: 'globalName',
Value: 'globalVariable',
Description: 'globalDescription'
},
{
Name: 'pathVariable',
Value: 'print'
}
],
...env
};
//Add env
await page.locator('a').filter({ hasText: 'Environment' }).click();
await page.getByRole('banner').getByRole('button').click();
await page.getByLabel('Name').fill(env.name);
await page.getByLabel('Host').click({ timeout: 1000 });
await page.getByLabel('Host').fill(env.host);
await adaTabledRow(page, {
enums: env.globalVariable
});
await page.getByRole('button', { name: 'Save' }).click();
await ifTipsExist(page, 'Added successfully');
await closeTab(page, env.name);
};
export const login = async page => { export const login = async page => {
await page.getByRole('button', { name: 'Sign in/Up' }).click(); await page.getByRole('button', { name: 'Sign in/Up' }).click();