LayerManageSplit.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <template>
  2. <div class="sm-panel" v-show="LayerManageShow" v-drag>
  3. <div class="sm-panel-header">
  4. <span>{{ Resource.LayerManage }}</span>
  5. <span class="closeBtn" @click="toggleVisibility">&times;</span>
  6. </div>
  7. <Tabs value="">
  8. <TabPane :label="Resource.Resource" name="zyml">
  9. <div class="zyml" :class="$props.splitId >= 0 ? `zymlsplit` : ''">
  10. <div class="searchDiv">
  11. <el-input :placeholder="Resource.InputPlaceholder" prefix-icon="el-icon-search" v-model="treeSearchText"
  12. size="small">
  13. </el-input>
  14. <div
  15. class="eicon"
  16. :class="isshowNum ? 'eyes' : 'close_eyes'"
  17. @click="isshowNum = !isshowNum"
  18. ></div>
  19. </div>
  20. <div class="treeDiv">
  21. <el-tree @check="handleCheckChange" class="filter-tree" :data="TreeDatas" show-checkbox :props="defaultProps"
  22. :filter-node-method="filterNode" :default-checked-keys="checkedKeys" node-key="id" ref="tree">
  23. <span class="custom-tree-node" slot-scope="{ node, data }">
  24. <span>{{ !isshowNum && !data.url && node.label ? node.label.replace(/\[.*$/, '') : node.label }}</span>
  25. <span>
  26. <Icon :type="!data.favorite ? 'ios-star-outline' : 'ios-star'" color="green" size="18" class="opBtn"
  27. :title="data.favorite ? Resource.DelCollect : Resource.AddCollect
  28. " @click="favoriteHandle(data)" v-if="data.url != ''" />
  29. </span>
  30. </span>
  31. </el-tree>
  32. </div>
  33. </div>
  34. </TabPane>
  35. <TabPane :label="Resource.LayerOptions" name="tckz" v-if="$props.splitId == -1">
  36. <div class="tckz">
  37. <List split size="large">
  38. <ListItem v-for="(item, index) in addlayerdata" :key="index">
  39. {{ item.title }}
  40. <div class="listBtn">
  41. <i-switch v-model="item.visible" size="small" @on-change="visibleChange(item, $event)">
  42. <template #open>
  43. <span></span>
  44. </template>
  45. <template #close>
  46. <span></span>
  47. </template>
  48. </i-switch>
  49. <Icon type="md-arrow-round-up" color="green" size="18" class="opBtn" :title="Resource.MoveUpOneLevel"
  50. @click="raise(item)" v-if="index > 0 && (item.type == 'Vector' || item.type == 'IMG')
  51. " />
  52. <Icon type="md-arrow-round-down" color="green" size="18" class="opBtn" :title="Resource.MoveDownOneLevel"
  53. @click="lower(item)" v-if="index < addlayerdata.length - 1 &&
  54. (item.type == 'Vector' || item.type == 'IMG')
  55. " />
  56. <Icon type="md-locate" color="green" size="18" class="opBtn" :title="Resource.location"
  57. @click="location(item)" />
  58. </div>
  59. <div class="sliderBtn" v-if="item.type != 'Terrain'">
  60. <Slider v-model="item.trans" @on-change="transSliderChange(item, $event)"></Slider>
  61. </div>
  62. </ListItem>
  63. </List>
  64. </div>
  65. </TabPane>
  66. <TabPane :label="Resource.Favorite" name="collect">
  67. <div class="collect" :class="$props.splitId >= 0 ? `collectsplit` : ''">
  68. <List split>
  69. <ListItem v-for="(item, index) in favoriteLayerList" :key="index" class="layerlist">
  70. <Checkbox @on-change="checkboxChange(item, $event)">{{
  71. item.title
  72. }}</Checkbox>
  73. <div class="listBtn">
  74. <Icon type="ios-star" color="green" size="18" class="opBtn" :title="Resource.DelCollect"
  75. @click="favoriteHandle(item)" />
  76. </div>
  77. </ListItem>
  78. </List>
  79. </div>
  80. </TabPane>
  81. </Tabs>
  82. </div>
  83. </template>
  84. <script>
  85. import { Collect, GetResourceTree, GetMyCollect } from "@/api/map";
  86. export default {
  87. name: "LayerManageSplit",
  88. props: {
  89. type: {
  90. type: String,
  91. },
  92. splitId: {
  93. type: Number,
  94. default: -1,
  95. },
  96. isshow: {
  97. type: Boolean,
  98. default: false,
  99. },
  100. checkedKeys: {
  101. type: Object,
  102. },
  103. addlayerdata: {
  104. type: Array,
  105. },
  106. },
  107. data() {
  108. return {
  109. defaultProps: {
  110. children: "children",
  111. label: "label",
  112. },
  113. treeSearchText: "",
  114. favoriteLayerList: [],
  115. sharedState: store.state,
  116. TreeDatas: [
  117. {
  118. title: Resource.layerList,
  119. expand: true,
  120. // selected: true,
  121. // contextmenu: true,
  122. children: [],
  123. type: "ROOT",
  124. },
  125. ],
  126. isshowNum: false,
  127. };
  128. },
  129. computed: {
  130. LayerManageShow: function () {
  131. return this.$props.splitId != -1
  132. ? this.$props.isshow
  133. : this.sharedState.toolBar[0];
  134. },
  135. },
  136. methods: {
  137. toggleVisibility() {
  138. this.$props.splitId != -1
  139. ? this.$emit("close")
  140. : store.setToolBarAction(0);
  141. },
  142. setCheckedKeys(keys) {
  143. this.$refs.tree.setCheckedKeys(keys);
  144. },
  145. filterNode(value, data) {
  146. let addjudge = true;
  147. if (this.$props.type == "split") {
  148. addjudge = data.type !== "Terrain";
  149. } else if (this.$props.type == "roller") {
  150. addjudge = data.type == "IMG" || data.type == "Vector";
  151. }
  152. if (!value) return addjudge;
  153. return data.label.indexOf(value) >= 0 && addjudge;
  154. },
  155. favoriteHandle(data) {
  156. // this.$emit("favoriteHandle", data);
  157. if (data.favorite) {
  158. data.favorite = null;
  159. for (let i = 0; i < this.favoriteLayerList.length; i++) {
  160. if (this.favoriteLayerList[i].id == data.id) {
  161. this.favoriteLayerList.splice(i, 1);
  162. }
  163. }
  164. } else {
  165. data.favorite = this.username;
  166. this.favoriteLayerList.push(data);
  167. }
  168. Collect(this.username, data.id).then((res) => {
  169. if (res.statuscode == 200) {
  170. this.$message({
  171. message: "操作成功",
  172. type: "success",
  173. });
  174. } else {
  175. this.$message.error(res.message);
  176. }
  177. });
  178. },
  179. favorite(data) {
  180. console.log(data);
  181. },
  182. checkboxChange(obj, checked, a) {
  183. obj.checked = checked;
  184. this.handleCheckChange(obj, checked);
  185. },
  186. visibleChange(obj, visible, a) {
  187. this.$emit("visibleChange", obj, visible, a);
  188. },
  189. transSliderChange(obj, v, a) {
  190. this.$emit("transSliderChange", obj, v, a);
  191. },
  192. getCheckedNodes() {
  193. if (this.$props.splitId < 0) {
  194. //是否只是叶子节点
  195. let checks = this.$refs.tree.getCheckedNodes(true);
  196. store.setcheckedTreeNode(checks);
  197. }
  198. },
  199. // 复选框改变
  200. handleCheckChange(obj, checked) {
  201. this.getCheckedNodes();
  202. console.log(obj, checked);
  203. if (typeof checked == "boolean") {
  204. obj.checked = checked;
  205. } else {
  206. obj.checked = !obj.checked;
  207. }
  208. this.$emit("handleCheckChange", obj, checked, this.$props.splitId);
  209. },
  210. setDisabledIfChildrenExist(node) {
  211. if (node.children && node.children.length > 0) {
  212. node.disabled = true;
  213. }
  214. // 递归遍历子节点
  215. if (node.children) {
  216. node.children.forEach(child => {
  217. this.setDisabledIfChildrenExist(child);
  218. });
  219. }
  220. },
  221. //获取后台资源目录树结构
  222. getResourceTree() {
  223. GetResourceTree().then((res) => {
  224. if (res.statuscode == 200) {
  225. // 从根节点开始递归
  226. res.data.forEach(rootNode => {
  227. this.setDisabledIfChildrenExist(rootNode);
  228. });
  229. this.TreeDatas = res.data;
  230. store.state.tempResourceTree = res.data;
  231. } else {
  232. console.log(e);
  233. }
  234. });
  235. },
  236. //获取后台资源目录树结构
  237. getFavoriteLayers() {
  238. GetMyCollect().then((res) => {
  239. if (res.statuscode == 200) {
  240. this.favoriteLayerList = res.data;
  241. } else {
  242. console.log(e);
  243. }
  244. });
  245. },
  246. //图层定位
  247. location(obj) {
  248. this.$emit("location", obj);
  249. },
  250. //影像图层操作
  251. raise(obj) {
  252. this.$emit("raise", obj);
  253. },
  254. lower(obj) {
  255. this.$emit("lower", obj);
  256. },
  257. },
  258. mounted() {
  259. this.getResourceTree();
  260. this.getFavoriteLayers();
  261. },
  262. watch: {
  263. treeSearchText(val) {
  264. this.$refs.tree.filter(val);
  265. },
  266. LayerManageShow: {
  267. handler() {
  268. if (this.LayerManageShow && this.$props.type) {
  269. setTimeout(() => {
  270. if (this.$refs.tree) this.$refs.tree.filter("");
  271. }, 500);
  272. // this.$nextTick(() => {
  273. // if (this.$refs.tree) this.$refs.tree.filter("");
  274. // });
  275. }
  276. },
  277. immediate: true,
  278. },
  279. },
  280. };
  281. </script>
  282. <style lang="scss" scoped>
  283. @import "./LayerManage.scss";
  284. .searchDiv {
  285. display: flex;
  286. justify-content: space-between;
  287. margin-right: 10px;
  288. .el-input {
  289. width: calc(100% - 30px);
  290. }
  291. }
  292. </style>