AdvBar.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <el-container class="adv-bar">
  3. <el-header style="display:flex;height:35px;line-height:35px;padding:0px;">
  4. <el-button type="text" :icon="controlStatus" @click="control.show=!control.show"></el-button>
  5. <template v-if="control.show">
  6. <el-input placeholder="搜索实体、活动关键字" class="input" disabled></el-input>
  7. <el-button type="text" @click="$emit('toggle-view','SearchBar')">
  8. <span class="el-icon-close" style="font-size:14px;font-weight: 900;"></span>
  9. </el-button>
  10. <el-button type="success" class="search" :loading="search.loading" @click="onSearch">
  11. <span class="el-icon-search"></span>
  12. </el-button>
  13. </template>
  14. </el-header>
  15. <el-main class="adv-main" v-show="control.show">
  16. <Editor
  17. v-model="editor.data"
  18. @init="onEditorInit"
  19. :lang="editor.lang.value"
  20. :theme="editor.theme.value"
  21. width="100%"
  22. height="100%"
  23. ref="editorRef">
  24. </Editor>
  25. </el-main>
  26. </el-container>
  27. </template>
  28. <script>
  29. import _ from 'lodash';
  30. import toggleBarMixin from '../../mixins/index.js';
  31. export default {
  32. name: "AdvBar",
  33. mixins: [toggleBarMixin],
  34. components:{
  35. Editor:require("vue2-ace-editor"),
  36. },
  37. data(){
  38. return {
  39. control: {
  40. show: true
  41. },
  42. search: {
  43. loading: false,
  44. term: "",
  45. result: null
  46. },
  47. selected: null,
  48. editor: {
  49. data: null,
  50. loading: false,
  51. lang: {
  52. value: "sql",
  53. list: []
  54. },
  55. theme: {
  56. value: "chrome",
  57. list: this.m3.EDITOR_THEME
  58. }
  59. }
  60. }
  61. },
  62. watch: {
  63. 'search.term':function(val){
  64. if(_.isEmpty(val)){
  65. this.onClear();
  66. }
  67. }
  68. },
  69. computed:{
  70. controlStatus(){
  71. if(this.control.show){
  72. return 'el-icon-arrow-left';
  73. } else {
  74. return 'el-icon-arrow-right';
  75. }
  76. },
  77. searchResultStatus(){
  78. return this.control.show && this.entity.search.result && this.entity.search.result.length > 0;
  79. }
  80. },
  81. filters: {
  82. pickIcon(item){
  83. let icon = item.icon;
  84. return `/static/assets/images/entity/png/${icon}.png`;
  85. }
  86. },
  87. created(){
  88. this.onLoadHistory();
  89. },
  90. methods: {
  91. onToggleBar(){
  92. this.control.show = !this.control.show;
  93. },
  94. onEditorInit(){
  95. require("brace/ext/language_tools"); //language extension prerequsite...
  96. require(`brace/mode/${this.editor.lang.value}`); //language
  97. require(`brace/snippets/${this.editor.lang.value}`); //snippet
  98. require(`brace/theme/${this.editor.theme.value}`); //language
  99. let editor = this.$refs.editorRef.editor;
  100. editor.on('change', _.debounce(()=> {
  101. this.onSaveAsHistory();
  102. }),1000);
  103. },
  104. onLoadHistory(){
  105. let param = encodeURIComponent(JSON.stringify({action:'load',value:null}));
  106. this.m3.callFS("/matrix/m3graph/history.js", param).then(res=>{
  107. this.editor.data = res.message;
  108. })
  109. },
  110. onSaveAsHistory(){
  111. let param = encodeURIComponent(JSON.stringify({action:'save',value: this.editor.data}));
  112. this.m3.callFS("/matrix/m3graph/history.js", param).then(res=>{
  113. console.log(res)
  114. })
  115. },
  116. onEntityTreeSelected(data){
  117. this.search.term = data.alias;
  118. this.onSearch();
  119. },
  120. onClear(){
  121. this.search.selected = null;
  122. this.search.result = null;
  123. },
  124. onSearch() {
  125. let editor = this.$refs.editorRef.editor;
  126. this.search.term = editor.getSelectedText() || editor.getValue();
  127. this.search.loading = true;
  128. if(_.isEmpty(this.search.term)){
  129. this.search.loading = false;
  130. return false;
  131. }
  132. this.m3.callFS("/matrix/m3graph/graphService.js", encodeURIComponent(this.search.term)).then( res=>{
  133. this.$emit("graph-data",res.message[0].graph);
  134. this.search.loading = false;
  135. this.control.show = false;
  136. }).catch(()=>{
  137. this.search.loading = false;
  138. });
  139. }
  140. }
  141. }
  142. </script>
  143. <style scoped>
  144. .adv-bar.el-container{
  145. position: absolute;
  146. left: 10px;
  147. top: 10px;
  148. z-index: 1000;
  149. background: #f2f2f2;
  150. }
  151. .adv-bar .el-header{
  152. text-align: center;
  153. border: 1px solid #f2f2f2;
  154. }
  155. .adv-bar .el-button+.el-button {
  156. margin-left: 0px;
  157. }
  158. .adv-bar .el-button{
  159. color: #777777;
  160. width: 50px;
  161. border-radius: 0px!important;
  162. }
  163. .adv-bar .input{
  164. width: auto;
  165. min-width: 83vw;
  166. }
  167. .adv-bar .search span{
  168. color: #ffffff;
  169. }
  170. .adv-bar .el-divider__text {
  171. background-color: transparent;
  172. color: #777777;
  173. }
  174. .adv-bar .adv-main{
  175. width:100%;
  176. height:30vh;
  177. border-top:1px solid #409EFF;
  178. }
  179. </style>
  180. <style>
  181. .adv-bar .el-input-group__append, .el-input-group__prepend{
  182. border: unset!important;
  183. }
  184. .adv-bar .el-input--mini .el-input__inner {
  185. height: 33px!important;
  186. line-height: 33px!important;
  187. border: transparent!important;
  188. background: transparent!important;
  189. border-radius: 0px!important;
  190. }
  191. </style>