Skip to content

Commit 5ec2234

Browse files
authored
Merge pull request #73 from neo-garaix/add-qgis-logo
Updated structure, Logo for projects and fix bugs
2 parents df6bf33 + 733954a commit 5ec2234

11 files changed

Lines changed: 317 additions & 129 deletions

File tree

mapBuilder/www/css/main.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,19 @@ ul .layer-store-layer:last-child {
442442
.info-layer-selected {
443443
display: flex;
444444
flex-direction: column;
445+
max-width: 140px;
446+
overflow: hidden;
445447
}
446448

447449
.repository-layer-selected {
448450
font-size: 11px;
449451
color: #464646;
452+
white-space: nowrap;
453+
}
454+
455+
.layer-store-folder.project {
456+
content: url("./svg/project.svg");
457+
width: 30px;
450458
}
451459

452460
custom-slider .slider {

mapBuilder/www/css/svg/project.svg

Lines changed: 55 additions & 0 deletions
Loading

mapBuilder/www/js/components/LayerSelected.js

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ export class LayerSelected extends HTMLElement {
2020
super();
2121
this._element = element;
2222
this.setAttribute("class", "container-layer-selected");
23-
this.setAttribute("id", element.getUid());
23+
this.setAttribute("id", "layer_" + element.getUid());
2424
this.setAttribute("draggable", "true");
25+
this.setAttribute("data-ol-uid", element.getUid());
26+
this.isCSSProjectNameSet = false;
2527
this.render()
2628
}
2729

@@ -87,7 +89,7 @@ export class LayerSelected extends HTMLElement {
8789
<div class="upper-line">
8890
<div class="info-layer-selected">
8991
<span class="title-layer-selected">${this._element.getLayer().getProperties().title}</span>
90-
<span class="repository-layer-selected">${this._element.getLayer().getProperties().repositoryId}</span>
92+
<span class="repository-layer-selected">${this._element.getLayer().getProperties().projectName}</span>
9193
</div>
9294
<div class="layer-buttons-div">
9395
${attributeTableShow}
@@ -108,12 +110,23 @@ export class LayerSelected extends HTMLElement {
108110
render(tpl, this);
109111
}
110112

113+
connectedCallback() {
114+
if (!this.isCSSProjectNameSet) {
115+
const infoElementSelector = `#${this.id} .info-layer-selected`;
116+
const infoElement = document.querySelector(infoElementSelector);
117+
118+
infoElement.addEventListener("mouseenter", () => {
119+
this.handleProjectNameCSS();
120+
});
121+
}
122+
}
123+
111124
/**
112125
* Delete the component and the layer associated to it.
113126
* @param {PointerEvent} event Event occurring.
114127
*/
115128
actionDeleteLayerButton(event) {
116-
getLayerSelectionArray().removeElement(event.target.closest(".container-layer-selected").id);
129+
getLayerSelectionArray().removeElement(event.target.closest(".container-layer-selected").dataset.olUid);
117130
document.getElementById("layer-selected-holder").removeChild(this);
118131
}
119132

@@ -412,6 +425,33 @@ export class LayerSelected extends HTMLElement {
412425
document.getElementById("bottom-dock").style.display = 'block';
413426
});
414427
}
428+
429+
handleProjectNameCSS() {
430+
if (this.isCSSProjectNameSet) return;
431+
432+
this.isCSSProjectNameSet = true;
433+
434+
const projectNameElement = document.querySelector(`#${this.id} .info-layer-selected .repository-layer-selected`);
435+
const diffWidth = projectNameElement.scrollWidth - projectNameElement.clientWidth;
436+
437+
if (diffWidth > 0) {
438+
const transitionTime = Math.round((diffWidth / 80) * 10) / 10;
439+
const css = `
440+
#${this.id} .info-layer-selected:hover .repository-layer-selected {
441+
transform: translateX(calc(0px - ${diffWidth}px));
442+
transition: ${transitionTime}s ease-in-out;
443+
}
444+
`;
445+
this.addDynamicStyle(css);
446+
}
447+
}
448+
449+
addDynamicStyle(css) {
450+
const style = document.createElement('style');
451+
style.appendChild(document.createTextNode(css));
452+
document.head.appendChild(style);
453+
}
454+
415455
}
416456

417457
customElements.define('lizmap-layer-selected', LayerSelected);

mapBuilder/www/js/components/LayerStore.js

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {html, render, nothing} from 'lit-html';
22
import {LayerTreeFolder} from "../modules/LayerTree/LayerTreeFolder";
33
import {WMSCapabilities} from "ol/format";
44
import {LayerTreeLayer} from "../modules/LayerTree/LayerTreeLayer";
5+
import {LayerTreeProject} from "../modules/LayerTree/LayerTreeProject";
56

67
/**
78
* Class representing the layer store.
@@ -44,22 +45,23 @@ export class LayerStore extends HTMLElement {
4445
*/
4546
folderTemplate(element) {
4647
//Check if the folder will have to load children from a project.
47-
let tagLazy = element.isLazy() ? "lazy" : "";
48-
49-
let icoSpan;
50-
51-
//Check if the folder is loading, opened or closed.
52-
if (element.isLoading()) {
53-
icoSpan = "fa-spinner fa-pulse";
54-
} else {
55-
icoSpan = element.isOpened() ? "fa-folder-open" : "fa-folder";
56-
}
57-
58-
//Check if the folder is failed to load children.
59-
//It occurs when the project can't be loaded.
60-
if (element.isFailed()) {
61-
icoSpan = "fa-window-close";
62-
tagLazy = "failed";
48+
let icoSpan = element.isOpened() ? "fa-folder-open" : "fa-folder";
49+
let tagLazy = "";
50+
51+
if (element instanceof LayerTreeProject) {
52+
tagLazy = element.isLazy() ? "lazy" : "";
53+
54+
//Check if the folder is loading, opened or closed.
55+
if (element.isLoading()) {
56+
icoSpan = "fa-spinner fa-pulse";
57+
} else if (element.isFailed()) {
58+
//Check if the folder is failed to load children.
59+
//It occurs when the project can't be loaded.
60+
icoSpan = "fa-window-close";
61+
tagLazy = "failed";
62+
} else {
63+
icoSpan = "project";
64+
}
6365
}
6466

6567
//Template of a folder.
@@ -162,35 +164,49 @@ export class LayerStore extends HTMLElement {
162164
* Action when a folder is clicked.
163165
* It can open or close the folder.
164166
* It can decide to load the project and put children in the folder.
165-
* @param {LayerTreeFolder} element The folder clicked.
167+
* @param {LayerTreeFolder|LayerTreeProject} element The folder clicked.
166168
* @param {Event} e Event occurring.
167169
*/
168170
async action(element, e) {
169-
if (element.isLazy()) {
171+
const handleLazyLoading = async () => {
170172
element.setLoading(true);
171173
this.render();
172-
//Prevent from multiple request
174+
175+
// Prevent multiple requests
173176
element.setLazy(false);
174177
e.target.closest('.lazy').children[0].className = "layer-store-folder fas fa-spinner fa-pulse";
175-
//After loaded
176-
let child = await this.loadTree(element);
177-
element.setLazy(false);
178+
179+
// Load folder content
180+
let children = await this.loadTree(element);
178181
element.setLoading(false);
179-
if (child.length > 0) {
180-
child.forEach((el) => {
181-
el.repository = element.getRepository();
182-
el.project = element.getProject();
183-
});
184-
element.createChildren(child);
182+
183+
if (children.length > 0) {
184+
updateChildrenAttributes(children, element);
185+
element.createChildren(children);
185186
element.changeStatusFolder();
186187
} else {
187188
element.setFailed();
188189
}
190+
};
191+
192+
const updateChildrenAttributes = (children, element) => {
193+
children.forEach((child) => {
194+
child.repository = element.getRepository();
195+
child.project = element.getProject();
196+
});
197+
};
198+
199+
if (element instanceof LayerTreeProject) {
200+
if (element.isLazy()) {
201+
await handleLazyLoading();
202+
} else {
203+
element.changeStatusFolder();
204+
}
189205
} else {
190206
element.changeStatusFolder();
191207
}
192-
this.render();
193208

209+
this.render();
194210
};
195211

196212
/**

mapBuilder/www/js/main.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ $(function() {
464464
serverType: 'qgis'
465465
})
466466
});
467+
newLayer.setProperties({"projectName": node.getProjectName()});
467468

468469
// Set min/max resolution if min/max scale are defined in getCapabilities
469470
if (node.getMinScale()) {
@@ -542,6 +543,10 @@ $(function() {
542543
document.getElementById('legend-content').innerHTML = legendsDiv;
543544
}
544545

546+
document.addEventListener('layerSelectedChanges', function () {
547+
loadLegend();
548+
});
549+
545550
// Open/Close dock behaviour
546551
$('#dock-close > button').on("click", function(){
547552
$('#mapmenu .dock').removeClass('active');

mapBuilder/www/js/modules/LayerSelection/LayerSelection.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,16 @@ export function addElementToLayerArray(value, color) {
4343
e.preventDefault();
4444
const data = e.dataTransfer.getData('text/plain');
4545
const draggedElement = document.getElementById(data);
46+
const draggedElementId = draggedElement.dataset.olUid;
4647

4748
let index = getIndexOfDrop(dropZone, e.clientY);
4849

49-
while (layerArray.getIndexOf(draggedElement.id) !== index) {
50-
let currentIndex = layerArray.getIndexOf(draggedElement.id);
50+
while (layerArray.getIndexOf(draggedElementId) !== index) {
51+
let currentIndex = layerArray.getIndexOf(draggedElementId);
5152
if (currentIndex > index) {
52-
changeList(draggedElement.id, "up");
53+
changeList(draggedElementId, "up");
5354
} else {
54-
changeList(draggedElement.id, "down");
55+
changeList(draggedElementId, "down");
5556
}
5657
}
5758
});
@@ -90,20 +91,22 @@ export function getLayerSelectionArray() {
9091
* @param {string} direction Which direction to go : 'up' or 'down'.
9192
*/
9293
export function changeList(uid, direction) {
94+
let element = document.getElementById(`layer_${uid}`);
9395
if (direction === "up") {
94-
changeOrderUp(uid);
96+
changeOrderUp(uid, element);
9597
} else {
96-
changeOrderDown(uid);
98+
changeOrderDown(uid, element);
9799
}
100+
document.dispatchEvent(new CustomEvent('layerSelectedChanges'));
98101
}
99102

100103
/**
101104
* Change the order of the layer with the one above.
102105
* @param {string} uid layer's uid
106+
* @param {HTMLElement} element layer to switch
103107
*/
104-
function changeOrderUp(uid) {
108+
function changeOrderUp(uid, element) {
105109
layerArray.changeOrder(uid, "up");
106-
let element = document.getElementById(`${uid}`);
107110
switchVisualLayers(
108111
element,
109112
element.previousElementSibling
@@ -113,10 +116,10 @@ function changeOrderUp(uid) {
113116
/**
114117
* Change the order of the layer with the one below.
115118
* @param {string} uid layer's uid
119+
* @param {HTMLElement} element layer to switch
116120
*/
117-
function changeOrderDown(uid) {
121+
function changeOrderDown(uid, element) {
118122
layerArray.changeOrder(uid, "down");
119-
let element = document.getElementById(`${uid}`);
120123
switchVisualLayers(
121124
element,
122125
element.nextElementSibling

mapBuilder/www/js/modules/LayerTree/LayerTreeElement.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* @property {Array} _bbox Bbox.
55
* @property {boolean} _popup Popup.
66
* @property {string} _project Project id.
7+
* @property {string} _projectName Project name.
78
* @property {string} _repository Repository id.
89
* @property {string} _color Color of the layer in the CSS sheet.
910
*/
@@ -21,6 +22,8 @@ export class LayerTreeElement {
2122

2223
this._project = options.project !== undefined ? options.project : undefined;
2324

25+
this._projectName = options.projectName !== undefined ? options.projectName : undefined;
26+
2427
this._repository = options.repository !== undefined ? options.repository : undefined;
2528

2629
this._color = options.color !== undefined ? options.color : undefined;
@@ -111,6 +114,14 @@ export class LayerTreeElement {
111114
return this._project;
112115
}
113116

117+
/**
118+
* Get the project name.
119+
* @returns {string} Project name.
120+
*/
121+
getProjectName() {
122+
return this._projectName;
123+
}
124+
114125
/**
115126
* Get the repository id.
116127
* @returns {string} Repository id.

0 commit comments

Comments
 (0)