mirror of
https://gitee.com/eolink_admin/postcat.git
synced 2024-12-01 19:28:14 +08:00
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:
parent
a4e6fa0399
commit
136c3485b0
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "postcat",
|
||||
"version": "0.5.0",
|
||||
"version": "0.5.1",
|
||||
"main": "out/app/electron-main/main.js",
|
||||
"description": "A lightweight, extensible API tool",
|
||||
"homepage": "https://github.com/Postcatlab/postcat.git",
|
||||
|
@ -77,49 +77,49 @@
|
||||
<source> Close Other Tags (excluding current tabs) </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="4540787302079589597" datatype="html">
|
||||
<source>Close All Tabs</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="5555596397221201782" datatype="html">
|
||||
<source> Close Tabs To the Left </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="974792392187340268" datatype="html">
|
||||
<source> Close Tabs to the Right </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="7762169316697380309" datatype="html">
|
||||
<source>Do you want to save the changes?</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="7711937097933765278" datatype="html">
|
||||
<source>Your changes will be lost if you don't save them.</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="2159130950882492111" datatype="html">
|
||||
<source>Cancel</source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context>
|
||||
@ -158,14 +158,18 @@
|
||||
<source>Don't Save</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="3768927257183755959" datatype="html">
|
||||
<source>Save</source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="7022070615528435141" datatype="html">
|
||||
@ -278,15 +282,15 @@
|
||||
</context-group>
|
||||
<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="linenumber">346</context>
|
||||
<context context-type="linenumber">350</context>
|
||||
</context-group>
|
||||
<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="linenumber">365</context>
|
||||
<context context-type="linenumber">369</context>
|
||||
</context-group>
|
||||
<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="linenumber">381</context>
|
||||
<context context-type="linenumber">385</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8894930472238002227" datatype="html">
|
||||
<source>Save Success</source>
|
||||
<trans-unit id="3022316336875255085" datatype="html">
|
||||
<source>Saved successfully</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
|
||||
<context context-type="linenumber">34</context>
|
||||
@ -1692,7 +1696,7 @@
|
||||
</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">135</context>
|
||||
<context context-type="linenumber">141</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
|
||||
@ -1707,7 +1711,7 @@
|
||||
</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">138</context>
|
||||
<context context-type="linenumber">144</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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="linenumber">257</context>
|
||||
</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 id="1075865176616456400" datatype="html">
|
||||
<source>Edit workspace failed</source>
|
||||
@ -1926,7 +1934,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="5460129479464091648" datatype="html">
|
||||
@ -1973,7 +1981,7 @@
|
||||
</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">111</context>
|
||||
<context context-type="linenumber">113</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5968366500418000730" datatype="html">
|
||||
@ -2101,7 +2109,7 @@
|
||||
</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">122</context>
|
||||
<context context-type="linenumber">124</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5719912962272225542" datatype="html">
|
||||
@ -2120,7 +2128,7 @@
|
||||
</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">125</context>
|
||||
<context context-type="linenumber">127</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6112087277983123757" datatype="html">
|
||||
@ -2373,7 +2381,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<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="linenumber">59</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3422431955792686027" datatype="html">
|
||||
<source>Import From File</source>
|
||||
<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="linenumber">60</context>
|
||||
<context context-type="linenumber">61</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="392331585970686754" datatype="html">
|
||||
<source>Sync API from URL</source>
|
||||
<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="linenumber">65</context>
|
||||
<context context-type="linenumber">66</context>
|
||||
</context-group>
|
||||
<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="linenumber">66</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context>
|
||||
@ -2431,47 +2439,47 @@
|
||||
<source>Case</source>
|
||||
<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="linenumber">252</context>
|
||||
<context context-type="linenumber">256</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<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>
|
||||
<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="linenumber">255</context>
|
||||
<context context-type="linenumber">259</context>
|
||||
</context-group>
|
||||
<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="linenumber">259</context>
|
||||
<context context-type="linenumber">263</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3464737374195885967" datatype="html">
|
||||
<source>Add Mock</source>
|
||||
<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="linenumber">334</context>
|
||||
<context context-type="linenumber">338</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="1250980317493747355" datatype="html">
|
||||
<source>Add Case</source>
|
||||
<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="linenumber">338</context>
|
||||
<context context-type="linenumber">342</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4323470180912194028" datatype="html">
|
||||
<source>Copy</source>
|
||||
<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="linenumber">342</context>
|
||||
<context context-type="linenumber">346</context>
|
||||
</context-group>
|
||||
<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="linenumber">361</context>
|
||||
<context context-type="linenumber">365</context>
|
||||
</context-group>
|
||||
<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="linenumber">377</context>
|
||||
<context context-type="linenumber">381</context>
|
||||
</context-group>
|
||||
<note priority="1" from="description">@Copy</note>
|
||||
</trans-unit>
|
||||
@ -2479,21 +2487,21 @@
|
||||
<source>Add API</source>
|
||||
<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="linenumber">389</context>
|
||||
<context context-type="linenumber">393</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6661660398413994526" datatype="html">
|
||||
<source>Add Subgroup</source>
|
||||
<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="linenumber">393</context>
|
||||
<context context-type="linenumber">397</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete" datatype="html">
|
||||
<source>Delete</source>
|
||||
<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="linenumber">401</context>
|
||||
<context context-type="linenumber">405</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<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="linenumber">38</context>
|
||||
</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 context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="3620188369327429839" datatype="html">
|
||||
<source> Save </source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="6813985602529136070" datatype="html">
|
||||
<source>Edited Group Name successfully</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="4370151464182295191" datatype="html">
|
||||
<source>Created Group successfully</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="7219712648243615821" datatype="html">
|
||||
@ -3082,6 +3094,13 @@
|
||||
<context context-type="linenumber">84</context>
|
||||
</context-group>
|
||||
</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">
|
||||
<source>Please input mock name</source>
|
||||
<context-group purpose="location">
|
||||
@ -3210,11 +3229,11 @@
|
||||
<context context-type="linenumber">218</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7836823057834334243" datatype="html">
|
||||
<source>Please input case name</source>
|
||||
<trans-unit id="989307631559859284" datatype="html">
|
||||
<source>Curl text error: <x id="PH" equiv-text="err"/></source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test.component.html</context>
|
||||
<context context-type="linenumber">5</context>
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.ts</context>
|
||||
<context context-type="linenumber">486</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="1153957724275241408" datatype="html">
|
||||
@ -3457,7 +3476,7 @@
|
||||
<source>The test service connection failed, Request Body Too Large</source>
|
||||
<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="linenumber">46</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<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>
|
||||
<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="linenumber">150</context>
|
||||
<context context-type="linenumber">154</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="1555979633549170381" datatype="html">
|
||||
|
@ -86,7 +86,7 @@
|
||||
<source> Close Other Tags (excluding current tabs) </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated"> 关闭其它标签(不包括当前标签) </target>
|
||||
</trans-unit>
|
||||
@ -94,7 +94,7 @@
|
||||
<source>Close All Tabs</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">关闭所有标签</target>
|
||||
</trans-unit>
|
||||
@ -102,7 +102,7 @@
|
||||
<source> Close Tabs To the Left </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated"> 关闭左侧标签页 </target>
|
||||
</trans-unit>
|
||||
@ -110,7 +110,7 @@
|
||||
<source> Close Tabs to the Right </source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated"> 关闭右边的标签 </target>
|
||||
</trans-unit>
|
||||
@ -118,7 +118,7 @@
|
||||
<source>Do you want to save the changes?</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">您要保存这些更改吗?</target>
|
||||
</trans-unit>
|
||||
@ -126,7 +126,7 @@
|
||||
<source>Your changes will be lost if you don't save them.</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">如未保存,所有更改将会被丢弃。</target>
|
||||
</trans-unit>
|
||||
@ -134,7 +134,7 @@
|
||||
<source>Cancel</source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/components/user-modal/user-modal.component.ts</context>
|
||||
@ -174,7 +174,7 @@
|
||||
<source>Don't Save</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">放弃保存</target>
|
||||
</trans-unit>
|
||||
@ -182,7 +182,11 @@
|
||||
<source>Save</source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<target state="translated">编辑</target>
|
||||
</trans-unit>
|
||||
@ -302,15 +306,15 @@
|
||||
</context-group>
|
||||
<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="linenumber">346</context>
|
||||
<context context-type="linenumber">350</context>
|
||||
</context-group>
|
||||
<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="linenumber">365</context>
|
||||
<context context-type="linenumber">369</context>
|
||||
</context-group>
|
||||
<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="linenumber">381</context>
|
||||
<context context-type="linenumber">385</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/components/history/eo-history.component.html</context>
|
||||
@ -1230,8 +1234,8 @@
|
||||
</context-group>
|
||||
<target state="translated">游客</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="8894930472238002227" datatype="html">
|
||||
<source>Save Success</source>
|
||||
<trans-unit id="3022316336875255085" datatype="html">
|
||||
<source>Saved successfully</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/components/extension/detail/components/extensions-settings.component.ts</context>
|
||||
<context context-type="linenumber">34</context>
|
||||
@ -1884,7 +1888,7 @@
|
||||
</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">135</context>
|
||||
<context context-type="linenumber">141</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/store/api-effect.service.ts</context>
|
||||
@ -1900,7 +1904,7 @@
|
||||
</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">138</context>
|
||||
<context context-type="linenumber">144</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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="linenumber">257</context>
|
||||
</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>
|
||||
</trans-unit>
|
||||
<trans-unit id="1075865176616456400" datatype="html">
|
||||
@ -2140,7 +2148,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">新建分组</target>
|
||||
</trans-unit>
|
||||
@ -2192,7 +2200,7 @@
|
||||
</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">111</context>
|
||||
<context context-type="linenumber">113</context>
|
||||
</context-group>
|
||||
<target state="translated">新建 Mock</target>
|
||||
</trans-unit>
|
||||
@ -2332,7 +2340,7 @@
|
||||
</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">122</context>
|
||||
<context context-type="linenumber">124</context>
|
||||
</context-group>
|
||||
<target state="translated">添加失败</target>
|
||||
</trans-unit>
|
||||
@ -2352,7 +2360,7 @@
|
||||
</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">125</context>
|
||||
<context context-type="linenumber">127</context>
|
||||
</context-group>
|
||||
<target state="translated">添加成功</target>
|
||||
</trans-unit>
|
||||
@ -2636,7 +2644,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<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="linenumber">59</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
</context-group>
|
||||
<target state="translated">导入 API</target>
|
||||
</trans-unit>
|
||||
@ -2672,7 +2680,7 @@
|
||||
<source>Import From File</source>
|
||||
<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="linenumber">60</context>
|
||||
<context context-type="linenumber">61</context>
|
||||
</context-group>
|
||||
<target state="translated">从文件导入 API</target>
|
||||
</trans-unit>
|
||||
@ -2680,11 +2688,11 @@
|
||||
<source>Sync API from URL</source>
|
||||
<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="linenumber">65</context>
|
||||
<context context-type="linenumber">66</context>
|
||||
</context-group>
|
||||
<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="linenumber">66</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/setting/project-setting.component.ts</context>
|
||||
@ -2700,7 +2708,7 @@
|
||||
<source>Case</source>
|
||||
<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="linenumber">252</context>
|
||||
<context context-type="linenumber">256</context>
|
||||
</context-group>
|
||||
<target state="translated">用例</target>
|
||||
</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>
|
||||
<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="linenumber">255</context>
|
||||
<context context-type="linenumber">259</context>
|
||||
</context-group>
|
||||
<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="linenumber">259</context>
|
||||
<context context-type="linenumber">263</context>
|
||||
</context-group>
|
||||
<target state="translated"><x id="PH" equiv-text="tips[dragItem.module]"/> 目前不支持排序,请反馈到 Github Issue</target>
|
||||
</trans-unit>
|
||||
@ -2720,7 +2728,7 @@
|
||||
<source>Add Mock</source>
|
||||
<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="linenumber">334</context>
|
||||
<context context-type="linenumber">338</context>
|
||||
</context-group>
|
||||
<target state="translated">添加 Mock</target>
|
||||
</trans-unit>
|
||||
@ -2728,7 +2736,7 @@
|
||||
<source>Add Case</source>
|
||||
<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="linenumber">338</context>
|
||||
<context context-type="linenumber">342</context>
|
||||
</context-group>
|
||||
<target state="translated">添加用例</target>
|
||||
</trans-unit>
|
||||
@ -2736,15 +2744,15 @@
|
||||
<source>Copy</source>
|
||||
<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="linenumber">342</context>
|
||||
<context context-type="linenumber">346</context>
|
||||
</context-group>
|
||||
<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="linenumber">361</context>
|
||||
<context context-type="linenumber">365</context>
|
||||
</context-group>
|
||||
<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="linenumber">377</context>
|
||||
<context context-type="linenumber">381</context>
|
||||
</context-group>
|
||||
<note priority="1" from="description">@Copy</note>
|
||||
<target state="translated">复制</target>
|
||||
@ -2753,7 +2761,7 @@
|
||||
<source>Add API</source>
|
||||
<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="linenumber">389</context>
|
||||
<context context-type="linenumber">393</context>
|
||||
</context-group>
|
||||
<target state="translated">添加 API</target>
|
||||
</trans-unit>
|
||||
@ -2761,7 +2769,7 @@
|
||||
<source>Add Subgroup</source>
|
||||
<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="linenumber">393</context>
|
||||
<context context-type="linenumber">397</context>
|
||||
</context-group>
|
||||
<target state="translated">添加子分组</target>
|
||||
</trans-unit>
|
||||
@ -2769,7 +2777,7 @@
|
||||
<source>Delete</source>
|
||||
<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="linenumber">401</context>
|
||||
<context context-type="linenumber">405</context>
|
||||
</context-group>
|
||||
<target state="translated">删除</target>
|
||||
</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="linenumber">38</context>
|
||||
</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 context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-case.service.ts</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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated"> 在测试过程中,鉴权将当前分组下的所有 API 生效,您也可以在 API 测试中覆盖鉴权。 </target>
|
||||
</trans-unit>
|
||||
@ -3105,7 +3117,7 @@
|
||||
<source> Save </source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">修改分组信息成功</target>
|
||||
</trans-unit>
|
||||
@ -3125,7 +3137,7 @@
|
||||
<source>Edited Group Name successfully</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">修改分组名称成功</target>
|
||||
</trans-unit>
|
||||
@ -3133,7 +3145,7 @@
|
||||
<source>Created Group successfully</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<target state="translated">新建分组成功</target>
|
||||
</trans-unit>
|
||||
@ -3425,6 +3437,13 @@
|
||||
</context-group>
|
||||
<target state="translated">必填</target>
|
||||
</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">
|
||||
<source>Please input mock name</source>
|
||||
<context-group purpose="location">
|
||||
@ -3569,13 +3588,13 @@
|
||||
</context-group>
|
||||
<target state="translated">保存为文件</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7836823057834334243" datatype="html">
|
||||
<source>Please input case name</source>
|
||||
<trans-unit id="989307631559859284" datatype="html">
|
||||
<source>Curl text error: <x id="PH" equiv-text="err"/></source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test.component.html</context>
|
||||
<context context-type="linenumber">5</context>
|
||||
<context context-type="sourcefile">src/app/pages/workspace/project/api/http/test/api-test-ui.component.ts</context>
|
||||
<context context-type="linenumber">486</context>
|
||||
</context-group>
|
||||
<target state="translated">请输入用例名称</target>
|
||||
<target state="translated">Curl 文本错误: <x id="PH" equiv-text="err"/></target>
|
||||
</trans-unit>
|
||||
<trans-unit id="1153957724275241408" datatype="html">
|
||||
<source>Save as API</source>
|
||||
@ -3845,7 +3864,7 @@
|
||||
<source>The test service connection failed, Request Body Too Large</source>
|
||||
<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="linenumber">46</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
<target state="translated">测试服务连接失败,请求体太大</target>
|
||||
</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>
|
||||
<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="linenumber">150</context>
|
||||
<context context-type="linenumber">154</context>
|
||||
</context-group>
|
||||
<target state="translated">服务连接失败。
|
||||
当前正在使用服务器测试,如果当前测试 URL 为 本地 API,请下载桌面端后重新发起测试。</target>
|
||||
|
@ -339,8 +339,7 @@ export class TabOperateService {
|
||||
getCurrentTab() {
|
||||
return this.getTabByIndex(this.selectedIndex);
|
||||
}
|
||||
closeTabByOperate(action: string | TabOperate) {
|
||||
const currentTabID = this.tabStorage.tabOrder[this.selectedIndex];
|
||||
closeTabByOperate(action: string | TabOperate, currentTabID = this.tabStorage.tabOrder[this.selectedIndex]) {
|
||||
let tabsObj = {
|
||||
//Close tab has hasChanged tab
|
||||
needTips: false,
|
||||
|
@ -6,7 +6,25 @@
|
||||
(nzSelectChange)="selectChange($event)"
|
||||
[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>
|
||||
<div
|
||||
(dblclick)="doubleClickTab($event, uuid)"
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { KeyValue } from '@angular/common';
|
||||
import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, TemplateRef } from '@angular/core';
|
||||
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 { 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';
|
||||
@ -35,8 +35,12 @@ export class EoTabComponent implements OnInit, OnDestroy {
|
||||
private modal: ModalService,
|
||||
private router: Router,
|
||||
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 {
|
||||
this.watchRouterChange();
|
||||
this.watchPageLeave();
|
||||
@ -49,6 +53,7 @@ export class EoTabComponent implements OnInit, OnDestroy {
|
||||
handleDataBeforeGetCache: this.handleDataBeforeGetCache
|
||||
});
|
||||
}
|
||||
|
||||
async newTab(key = undefined) {
|
||||
if (this.checkTabCanLeave && !(await this.checkTabCanLeave())) {
|
||||
return false;
|
||||
@ -200,13 +205,19 @@ export class EoTabComponent implements OnInit, OnDestroy {
|
||||
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
|
||||
*
|
||||
* @param action
|
||||
*/
|
||||
closeTabByOperate(action: TabOperate | string) {
|
||||
this.tabOperate.closeTabByOperate(action);
|
||||
closeTabByOperate(action: TabOperate | string, uuid?) {
|
||||
this.tabOperate.closeTabByOperate(action, uuid);
|
||||
}
|
||||
private watchRouterChange() {
|
||||
this.routerSubscribe = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((res: NavigationEnd) => {
|
||||
|
@ -68,7 +68,16 @@ export class ThemeService {
|
||||
|
||||
queryExtensionThemes() {
|
||||
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')) {
|
||||
const editorTheme = this.getEditorTheme(currentTheme);
|
||||
|
@ -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]"
|
||||
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>
|
||||
|
||||
<eo-schema-form [model]="localSettings" [configuration]="configuration" />
|
||||
@ -31,6 +31,6 @@ export class ExtensionSettingComponent implements OnInit {
|
||||
}
|
||||
handleSave = () => {
|
||||
this.settingService.saveSetting(this.localSettings);
|
||||
this.feedback.success($localize`Save Success`);
|
||||
this.feedback.success($localize`Saved successfully`);
|
||||
};
|
||||
}
|
||||
|
@ -64,7 +64,7 @@
|
||||
<ng-template #nzTreeTemplate let-node let-origin="origin">
|
||||
<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" [style.width]="'calc(100% - 30px)'">
|
||||
<div class="flex items-center" (contextmenu)="contextMenu($event, groupMenu)" [style.width]="'calc(100% - 30px)'">
|
||||
<!-- Folder -->
|
||||
<ng-container *ngSwitchDefault>
|
||||
<eo-iconpark-icon
|
||||
@ -91,6 +91,15 @@
|
||||
<span class="text-[12px] truncate">{{ origin.title }}</span>
|
||||
</ng-container>
|
||||
</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
|
||||
class="flex tree-node-operate"
|
||||
*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">
|
||||
<eo-iconpark-icon name="more" size="16px"></eo-iconpark-icon>
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -2,6 +2,7 @@ import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
|
||||
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 { 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';
|
||||
@ -93,11 +94,14 @@ export class ApiGroupTreeComponent implements OnInit, OnDestroy {
|
||||
private feedback: EoNgFeedbackMessageService,
|
||||
private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private nzContextMenuService: NzContextMenuService,
|
||||
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
|
||||
) {
|
||||
this.operateByModule = this.getGroupOperate();
|
||||
}
|
||||
|
||||
contextMenu($event: MouseEvent, menu: NzDropdownMenuComponent): void {
|
||||
this.nzContextMenuService.create($event, menu);
|
||||
}
|
||||
searchFunc = (node: NzTreeNodeOptions) => {
|
||||
const { title } = node;
|
||||
const uri = node.relationInfo?.uri;
|
||||
|
@ -20,6 +20,9 @@
|
||||
<button eo-ng-button nzType="text" class="ml-[5px]" (click)="startEditGroupName()">
|
||||
<eo-iconpark-icon name="edit"></eo-iconpark-icon>
|
||||
</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>
|
||||
</div>
|
||||
</nz-form-control>
|
||||
|
@ -4,6 +4,7 @@ import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
|
||||
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 { 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 { ApiService } from 'pc/browser/src/app/services/storage/api.service';
|
||||
import { Group } from 'pc/browser/src/app/services/storage/db/models';
|
||||
@ -39,6 +40,7 @@ export class GroupComponent implements OnDestroy, EditTabViewComponent {
|
||||
private effect: ApiEffectService,
|
||||
public globalStore: StoreService,
|
||||
private fb: FormBuilder,
|
||||
public group: ApiGroupService,
|
||||
private feedback: EoNgFeedbackMessageService,
|
||||
private route: ActivatedRoute,
|
||||
private router: Router,
|
||||
|
@ -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 { 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 { ModalService } from 'pc/browser/src/app/services/modal.service';
|
||||
import { ApiService } from 'pc/browser/src/app/services/storage/api.service';
|
||||
import { MockCreateWay } from 'pc/browser/src/app/services/storage/db/models';
|
||||
import { ApiData } from 'pc/browser/src/app/services/storage/db/models/apiData';
|
||||
@ -27,6 +28,7 @@ export class ApiMockService {
|
||||
private message: EoNgFeedbackMessageService,
|
||||
private apiEffect: ApiEffectService,
|
||||
private projectApi: ProjectApiService,
|
||||
private modalService: ModalService,
|
||||
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
|
||||
) {
|
||||
this.mockOperateUrl = this.tabsConfig.pathByName[PageUniqueName.HttpMock];
|
||||
@ -130,13 +132,19 @@ export class ApiMockService {
|
||||
});
|
||||
}
|
||||
async toDelete(id: number) {
|
||||
const data = await this.deleteMock(id);
|
||||
if (!data) {
|
||||
this.message.error($localize`Failed to delete`);
|
||||
return;
|
||||
}
|
||||
this.message.success($localize`Successfully deleted`);
|
||||
this.apiEffect.deleteMockDetail();
|
||||
const modelRef = this.modalService.confirm({
|
||||
nzTitle: $localize`Deletion Confirmation?`,
|
||||
nzContent: $localize``,
|
||||
nzOnOk: async () => {
|
||||
const data = await this.deleteMock(id);
|
||||
if (!data) {
|
||||
this.message.error($localize`Failed to delete`);
|
||||
return;
|
||||
}
|
||||
this.message.success($localize`Successfully deleted`);
|
||||
this.apiEffect.deleteMockDetail();
|
||||
}
|
||||
});
|
||||
}
|
||||
async copy(mock_id: string) {
|
||||
const [res] = await this.api.api_mockDetail({ id: mock_id });
|
||||
|
@ -1,6 +1,5 @@
|
||||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
ChangeDetectorRef,
|
||||
Input,
|
||||
@ -9,13 +8,13 @@ import {
|
||||
ViewChild,
|
||||
ElementRef,
|
||||
AfterViewInit,
|
||||
HostListener,
|
||||
OnChanges,
|
||||
Inject,
|
||||
TemplateRef
|
||||
} from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { EoNgFeedbackMessageService } from 'eo-ng-feedback';
|
||||
import { isEmpty, isEqual } from 'lodash-es';
|
||||
import { autorun, reaction } from 'mobx';
|
||||
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 { enumsToArr, JSONParse } from '../../../../../../shared/utils/index.utils';
|
||||
import {
|
||||
ApiBodyType,
|
||||
ApiParamsType,
|
||||
BASIC_TABS_INFO,
|
||||
BodyContentType as ContentTypeEnum,
|
||||
RequestMethod,
|
||||
TabsConfig
|
||||
} from '../../constants/api.model';
|
||||
import { ApiBodyType, ApiParamsType, BASIC_TABS_INFO, RequestMethod, TabsConfig } from '../../constants/api.model';
|
||||
import { ApiParamsNumPipe } from '../../pipe/api-param-num.pipe';
|
||||
import { ApiTestUtilService } from '../../service/api-test-util.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 elementRef: ElementRef,
|
||||
private apiEdit: ApiEditUtilService,
|
||||
private feedback: EoNgFeedbackMessageService,
|
||||
private trace: TraceService,
|
||||
@Inject(BASIC_TABS_INFO) public tabsConfig: TabsConfig
|
||||
) {
|
||||
@ -275,12 +268,24 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
|
||||
private fixedHeaderAndContentType() {
|
||||
const bodyType = this.model.request?.apiAttrInfo?.contentType;
|
||||
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();
|
||||
this.model.request.requestParams.headerParams = this.apiTestUtil.addOrReplaceContentType(
|
||||
contentType,
|
||||
this.model.request.requestParams.headerParams
|
||||
);
|
||||
this.model.userSelectedContentType ??= contentType as ContentType;
|
||||
this.model.userSelectedContentType = contentType as ContentType;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -294,6 +299,7 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
|
||||
}
|
||||
changeBodyType($event) {
|
||||
StorageUtil.set('api_test_body_type', $event);
|
||||
this.fixedHeaderAndContentType();
|
||||
}
|
||||
handleBottomTabSelect(tab) {
|
||||
if (tab.index === 2) {
|
||||
@ -474,9 +480,14 @@ export class ApiTestUiComponent implements AfterViewInit, OnDestroy, OnChanges {
|
||||
this.validateForm = this.fb.group(controls);
|
||||
|
||||
this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(x => {
|
||||
//Watch uri changes
|
||||
//Import curl when uri match
|
||||
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({
|
||||
uri: this.model.request.uri,
|
||||
method: this.model.request.apiAttrInfo?.requestMethod
|
||||
|
@ -1,8 +1,8 @@
|
||||
<div class="h-full flex flex-col test-page-{{ currentPage }}">
|
||||
<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-control i18n-nzErrorTip nzErrorTip="Please input case name" *ngIf="isNameEdit">
|
||||
<nz-form-control *ngIf="isNameEdit">
|
||||
<input
|
||||
nz-input
|
||||
[(ngModel)]="name"
|
||||
|
@ -5,8 +5,10 @@ import {
|
||||
IGNORE_HEADERS,
|
||||
JsonRootType,
|
||||
Protocol,
|
||||
RequestMethod
|
||||
RequestMethod,
|
||||
requestMethodMap
|
||||
} 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 { 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';
|
||||
@ -50,7 +52,7 @@ export class ApiTestUtilService {
|
||||
*/
|
||||
formatUIApiDataToStorage(inData: { request: Partial<ApiData>; response: ApiTestResData }): ApiData {
|
||||
inData = eoDeepCopy(inData);
|
||||
pcConsole.log('formatUIApiDataToStorage', inData);
|
||||
// pcConsole.log('formatUIApiDataToStorage', inData);
|
||||
const result = {
|
||||
...inData.request,
|
||||
protocol: Protocol.HTTP,
|
||||
@ -192,52 +194,73 @@ export class ApiTestUtilService {
|
||||
/**
|
||||
* Parse curl to test formdata
|
||||
*/
|
||||
getTestDataFromCurl(text, originModel: testViewModel): testViewModel {
|
||||
getTestDataFromCurl(text, originModel: testViewModel): [testViewModel, string?] {
|
||||
const result: testViewModel = eoDeepCopy(originModel);
|
||||
let requestObj;
|
||||
try {
|
||||
const requestObj = parseCurl(text || '');
|
||||
console.log(requestObj);
|
||||
requestObj = parseCurl(text || '');
|
||||
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;
|
||||
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,
|
||||
//Set Header
|
||||
result.request.requestParams.headerParams = Object.keys(requestObj.header)
|
||||
.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
|
||||
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,
|
||||
paramAttr: {
|
||||
example: val.value
|
||||
example: val
|
||||
}
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
//Set Header
|
||||
result.request.requestParams.headerParams = Object.keys(requestObj.header)
|
||||
.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
|
||||
result.request.requestParams.bodyParams = formArr;
|
||||
} else {
|
||||
//Multipart-formdata
|
||||
const formArr: BodyParam[] = [];
|
||||
const nameReg = /name=\"(.+?)\"/;
|
||||
requestObj.body
|
||||
@ -247,6 +270,7 @@ export class ApiTestUtilService {
|
||||
const fIndex = Math.floor(index / 2);
|
||||
//FormName
|
||||
if (!formArr[fIndex]) {
|
||||
debugger;
|
||||
const name = val.match(nameReg)[1];
|
||||
formArr[fIndex] = {
|
||||
name: name,
|
||||
@ -260,19 +284,17 @@ export class ApiTestUtilService {
|
||||
formArr[fIndex].paramAttr.example = val;
|
||||
});
|
||||
result.request.requestParams.bodyParams = formArr;
|
||||
} else {
|
||||
result.request.apiAttrInfo.contentType = ApiBodyType.Raw;
|
||||
result.request.requestParams.bodyParams = [
|
||||
{
|
||||
binaryRawData: requestObj.body
|
||||
}
|
||||
];
|
||||
}
|
||||
} catch (e) {
|
||||
pcConsole.error(`parseCurl error: ${e}`);
|
||||
} else {
|
||||
result.request.apiAttrInfo.contentType = ApiBodyType.Raw;
|
||||
result.request.requestParams.bodyParams = [
|
||||
{
|
||||
binaryRawData: requestObj.body
|
||||
}
|
||||
];
|
||||
}
|
||||
console.log('getTestDataFromCurl', result);
|
||||
return result;
|
||||
return [result];
|
||||
}
|
||||
getContentType(headers = []) {
|
||||
const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type');
|
||||
@ -287,7 +309,7 @@ export class ApiTestUtilService {
|
||||
*/
|
||||
addOrReplaceContentType(contentType: ContentType | string, headers: HeaderParam[] | any = []) {
|
||||
const existHeader = headers.find(val => val.name.toLowerCase() === 'content-type');
|
||||
if (existHeader?.paramAttr) {
|
||||
if (existHeader?.paramAttr && existHeader.disableEdit) {
|
||||
existHeader.paramAttr.example = contentType;
|
||||
return headers;
|
||||
}
|
||||
@ -297,7 +319,8 @@ export class ApiTestUtilService {
|
||||
name: 'content-type',
|
||||
paramAttr: {
|
||||
example: contentType
|
||||
}
|
||||
},
|
||||
disableEdit: true
|
||||
},
|
||||
...headers
|
||||
];
|
||||
|
@ -32,7 +32,6 @@ export class TestServerRemoteService extends TestServerService {
|
||||
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
|
||||
xhr.onreadystatechange = e => {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
console.log(xhr.status);
|
||||
switch (xhr.status) {
|
||||
case 200: {
|
||||
this.receiveMessage(this.formatResponseData(JSON.parse(xhr.responseText).data));
|
||||
|
@ -145,8 +145,12 @@ export abstract class TestServerService implements TestServer {
|
||||
contentType: ['formData', 'raw', 'json', 'xml', 'binary'][history.requestInfo.requestType] || 'raw'
|
||||
}
|
||||
};
|
||||
|
||||
if (response.statusCode === 0 && !this.electron.isElectron) {
|
||||
console.log(response.body);
|
||||
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.`;
|
||||
}
|
||||
result = {
|
||||
|
@ -281,6 +281,7 @@ export class ApiEffectService {
|
||||
if (err) {
|
||||
return;
|
||||
}
|
||||
this.feedback.success($localize`Successfully deleted`);
|
||||
const envList = this.store.getEnvList.filter(it => it.id !== id);
|
||||
this.store.setEnvList(envList);
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ export const parseCurl = function (s) {
|
||||
args.forEach(function (arg) {
|
||||
switch (true) {
|
||||
case isURL(arg):
|
||||
out.url = arg.split('?')[0];
|
||||
out.url = arg;
|
||||
out.query = getQueryFromURL(arg);
|
||||
break;
|
||||
|
||||
@ -115,7 +115,10 @@ export const parseCurl = function (s) {
|
||||
break;
|
||||
case 'data':
|
||||
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;
|
||||
state = '';
|
||||
break;
|
||||
@ -135,6 +138,6 @@ export const parseCurl = function (s) {
|
||||
break;
|
||||
}
|
||||
});
|
||||
out.contentType = out.header['Content-Type'];
|
||||
out.contentType = out.header['Content-Type'] || out.header['content-type'];
|
||||
return out;
|
||||
};
|
||||
|
@ -79,10 +79,12 @@ export const whatTextType = (tmpText): 'xml' | 'json' | 'html' | 'text' => {
|
||||
* @param enum
|
||||
*/
|
||||
export const enumsToObject = tEnum =>
|
||||
Object.entries<any>(tEnum).reduce((acc, [key, value]) => {
|
||||
acc[value] = key;
|
||||
return acc;
|
||||
}, {});
|
||||
Object.values<any>(tEnum)
|
||||
.filter(val => !isNumber(val))
|
||||
.reduce((acc, val) => {
|
||||
acc[tEnum[val]] = val;
|
||||
return acc;
|
||||
}, {});
|
||||
/**
|
||||
* Reverse Typescript enums key and value
|
||||
*
|
||||
|
@ -439,6 +439,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
|
||||
|
||||
//Get runtime instance
|
||||
const ctx = await pmRuntime.createContextAsync({ timeout: 10000, disableLegacyAPIs: true });
|
||||
let tmpEnvGlobals = Object.assign({}, global.eoTestGlobals || {}, tmpBasicEnv.envParam || {});
|
||||
const context = {
|
||||
enviroment: [],
|
||||
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] }))
|
||||
},
|
||||
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) {
|
||||
case '0': {
|
||||
@ -751,6 +752,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
|
||||
}
|
||||
}
|
||||
let tmpEnvGlobals = Object.assign({}, global.eoTestGlobals || {}, tmpEnviroments || {});
|
||||
tmpOutput.url = tmpTargetTypeData.apiUrl.split('?')[0];
|
||||
for (let key in tmpEnvGlobals) {
|
||||
let val = tmpEnvGlobals[key];
|
||||
let templateParamObject = {};
|
||||
@ -760,7 +762,7 @@ privateFun.parseBeforeCode = async function (scritEngines = 'pm', inputData, inp
|
||||
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;
|
||||
}
|
||||
tmpOutput.url = _LibsCommon.replaceAll('{{' + key + '}}', val || '', tmpTargetTypeData.apiUrl.split('?')[0]);
|
||||
tmpOutput.url = _LibsCommon.replaceAll('{{' + key + '}}', val || '', tmpOutput.url);
|
||||
for (let childKey in tmpHeaders) {
|
||||
tmpHeaders[childKey] = _LibsCommon.replaceAll('{{' + key + '}}', val, tmpHeaders[childKey]);
|
||||
if (childKey.indexOf('{{' + key + '}}') > -1) {
|
||||
|
@ -208,14 +208,14 @@
|
||||
errObj: /getaddrinfo enotfound/i.test(tmpInputErr.message)
|
||||
? {
|
||||
name: 'API请求地址有误',
|
||||
message: '请检查是否正确填写URL以及URL是否允许访问'
|
||||
message: `请检查是否正确填写URL以及URL是否允许访问,${tmpInputErr.message}`
|
||||
}
|
||||
: /socket hang up/i.test(tmpInputErr.message)
|
||||
? {
|
||||
name: '请求错误',
|
||||
message:
|
||||
SOCKET_HANG_UP_TIP_TEXT_OBJ['SAAS_SERVER'] ||
|
||||
'无法访问目标地址,请检查接口是否能被正常访问,是否存在网络隔离或防火墙。'
|
||||
`无法访问目标地址,请检查接口是否能被正常访问,是否存在网络隔离或防火墙,${tmpInputErr.message}`
|
||||
}
|
||||
: tmpInputErr
|
||||
},
|
||||
|
@ -62,9 +62,9 @@ test('Basic Operate', async ({ page }) => {
|
||||
|
||||
test('Check All Param Operate', async ({ page }) => {
|
||||
await page.getByRole('banner').getByRole('button').click();
|
||||
// //Url
|
||||
//Url
|
||||
await page.locator('input[name="uri"]').fill('/?json');
|
||||
// //Name
|
||||
//Name
|
||||
await page.locator('input[name="name"]').click();
|
||||
await page.locator('input[name="name"]').fill('JSON');
|
||||
//?example descript isRequire addChild delete
|
||||
@ -155,9 +155,6 @@ test('Save Form Data API', async ({ page }) => {
|
||||
//Save API
|
||||
await page.locator('input[name="uri"]').press('Meta+s');
|
||||
await ifTipsExist(page, 'Added successfully');
|
||||
|
||||
//XML
|
||||
//Raw
|
||||
});
|
||||
|
||||
test('Save XML API', async ({ page }) => {
|
||||
@ -182,9 +179,6 @@ test('Save XML API', async ({ page }) => {
|
||||
//Save API
|
||||
await page.locator('input[name="uri"]').press('Meta+s');
|
||||
await ifTipsExist(page, 'Added successfully');
|
||||
|
||||
//XML
|
||||
//Raw
|
||||
});
|
||||
|
||||
test('Save Raw API', async ({ page }) => {
|
||||
@ -204,12 +198,7 @@ test('Save Raw API', async ({ page }) => {
|
||||
Example: 'value'
|
||||
}
|
||||
});
|
||||
//Import
|
||||
|
||||
//Save API
|
||||
await page.locator('input[name="uri"]').press('Meta+s');
|
||||
await ifTipsExist(page, 'Added successfully');
|
||||
|
||||
//XML
|
||||
//Raw
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 }) => {
|
||||
await page.goto('/');
|
||||
await page.getByRole('button', { name: 'Got it' }).click();
|
||||
@ -18,21 +18,26 @@ test.beforeEach(async ({ page }) => {
|
||||
await page.getByPlaceholder('Group Name').press('Enter');
|
||||
|
||||
//Close group tab
|
||||
await page.getByRole('tab').getByText(subGroupName).hover();
|
||||
await page.getByRole('button', { name: 'Close tab' }).click();
|
||||
await closeTab(page, subGroupName);
|
||||
});
|
||||
|
||||
test('Basic Operate', async ({ page }) => {
|
||||
//Edit group
|
||||
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').press('Enter');
|
||||
|
||||
//Delete group
|
||||
//Delete group from tree
|
||||
await operateGroup(page, 'Sub Group', 'Delete');
|
||||
await page.getByRole('button', { name: 'Ok' }).click();
|
||||
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 }) => {
|
||||
//Search Group
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 responsePromise = page.waitForResponse('**/api/unit');
|
||||
await page.getByRole('button', { name: 'Send' }).click();
|
||||
@ -75,7 +75,7 @@ test('Unit Test', async ({ page }) => {
|
||||
*/
|
||||
test('Import Data Unit Test', async ({ page }) => {
|
||||
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
|
||||
await page.getByText('Headers').click();
|
||||
await adaTabledRow(page, {
|
||||
@ -167,3 +167,101 @@ test('Raw Test', async ({ page }) => {
|
||||
const res1 = await testAndWaitForResponse(page);
|
||||
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`);
|
||||
});
|
||||
|
@ -1,43 +1,28 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
import { ECHO_API_URL, ifTipsExist } from '../utils/commom.util';
|
||||
const url = new URL(ECHO_API_URL);
|
||||
import { adaTabledRow, addEnv, ECHO_API_URL, ifTipsExist } from '../utils/commom.util';
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
//Add env
|
||||
await page.locator('a').filter({ hasText: 'Environment' }).click();
|
||||
await page.getByRole('banner').getByRole('button').click();
|
||||
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');
|
||||
await page.getByRole('button', { name: 'Got it' }).click();
|
||||
await addEnv(page, {
|
||||
name: 'DEV'
|
||||
});
|
||||
});
|
||||
test('Env Basic', async ({ page }) => {
|
||||
//Add first env will choose it
|
||||
await page.locator('nz-tree-node-title div').first().click();
|
||||
|
||||
//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 ifTipsExist(page, 'Edited successfully');
|
||||
|
||||
//Delete env
|
||||
});
|
||||
|
||||
test('Env Delete', async ({ page }) => {
|
||||
await page.locator('nz-tree-node-title div').first().hover();
|
||||
await page.locator('nz-tree-node-title').getByRole('button').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
|
||||
// //Global variable
|
||||
// //Change env will change host uri
|
||||
|
@ -2,24 +2,25 @@ import { test, expect } from '@playwright/test';
|
||||
const installExtension = async () => {};
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await page.getByRole('button', { name: 'Got it' }).click();
|
||||
});
|
||||
|
||||
test('Basic Operate', async ({ page }) => {
|
||||
//Install Extension
|
||||
//Close Extension
|
||||
//Open Extension
|
||||
//Uninstall Extension
|
||||
//Switch Extension Type
|
||||
//Search Extension
|
||||
});
|
||||
test('Sync URL From TEST', 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' })
|
||||
.setInputFiles('Postcat-Export-0403.json');
|
||||
});
|
||||
test('APISpace Extension', async ({ page }) => {});
|
||||
// test('Basic Operate', async ({ page }) => {
|
||||
// //Install Extension
|
||||
// //Close Extension
|
||||
// //Open Extension
|
||||
// //Uninstall Extension
|
||||
// //Switch Extension Type
|
||||
// //Search Extension
|
||||
// });
|
||||
// test('Sync URL From TEST', 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' })
|
||||
// .setInputFiles('Postcat-Export-0403.json');
|
||||
// });
|
||||
// test('APISpace Extension', async ({ page }) => {});
|
||||
test('Export API', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await page.locator('a:has-text("Setting")').click();
|
||||
|
@ -1,21 +1,21 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
import { login } from '../utils/commom.util';
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
});
|
||||
test('Workspace Member', async ({ page }) => {
|
||||
//Login
|
||||
await login(page);
|
||||
//Switch to cloud workspace
|
||||
//Add member to workspace
|
||||
//Change role,default
|
||||
//Remove member
|
||||
//Add Member
|
||||
//Login with new member
|
||||
//Quit workspace
|
||||
});
|
||||
test('Project Member', async ({ page }) => {
|
||||
//Add member to workspace
|
||||
//Add member to project
|
||||
});
|
||||
// test.beforeEach(async ({ page }) => {
|
||||
// await page.goto('/');
|
||||
// });
|
||||
// test('Workspace Member', async ({ page }) => {
|
||||
// //Login
|
||||
// await login(page);
|
||||
// //Switch to cloud workspace
|
||||
// //Add member to workspace
|
||||
// //Change role,default
|
||||
// //Remove member
|
||||
// //Add Member
|
||||
// //Login with new member
|
||||
// //Quit workspace
|
||||
// });
|
||||
// test('Project Member', async ({ page }) => {
|
||||
// //Add member to workspace
|
||||
// //Add member to project
|
||||
// });
|
||||
|
@ -1,12 +1,12 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await page.getByRole('button', { name: 'Got it' }).click();
|
||||
});
|
||||
test('Basic Operate', async ({ page }) => {
|
||||
//Back to Project List
|
||||
//Add project
|
||||
//Edit project
|
||||
//Delete project
|
||||
});
|
||||
//Share Project
|
||||
// test.beforeEach(async ({ page }) => {
|
||||
// await page.goto('/');
|
||||
// await page.getByRole('button', { name: 'Got it' }).click();
|
||||
// });
|
||||
// test('Basic Operate', async ({ page }) => {
|
||||
// //Back to Project List
|
||||
// //Add project
|
||||
// //Edit project
|
||||
// //Delete project
|
||||
// });
|
||||
// //Share Project
|
||||
|
@ -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¬ify_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');
|
||||
});
|
@ -1,10 +1,13 @@
|
||||
import { expect } from '@playwright/test';
|
||||
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()) => {
|
||||
const isExist = await monacoEditor.count();
|
||||
const isExist = await monacoEditor.isVisible();
|
||||
monacoEditor = isExist ? monacoEditor : await page.locator('.monaco-editor').first();
|
||||
//? some times monaco editor not ready
|
||||
await page.waitForTimeout(500);
|
||||
await monacoEditor.click();
|
||||
await page.keyboard.press('Meta+KeyA');
|
||||
await page.keyboard.press('Delete');
|
||||
await page.keyboard.type(text);
|
||||
};
|
||||
export const clickButtonByIconName = async (page, name) => {
|
||||
@ -27,9 +30,43 @@ export const operateGroup = async (page, groupName, operateName) => {
|
||||
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) => {
|
||||
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 => {
|
||||
await page.getByRole('button', { name: 'Sign in/Up' }).click();
|
||||
|
Loading…
Reference in New Issue
Block a user