-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCopy a Layer to New Layout.js
149 lines (134 loc) · 4.31 KB
/
Copy a Layer to New Layout.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
File: Copy a layer to new layout.js
Description: This JavaScript copies a layer and all components on this layer to a new layout
*/
//import basic checks
if(typeof(isLayoutOpen) == "undefined")
{
//import basic checks
app.importScript(app.getAppScriptsFolder() + "/Dependencies/qx_validations.js");
console.log("Loaded library for basic validation checks from application.");
}
if(isLayoutOpen()){
var sourceLayoutDOM, targetLayoutDOM
//Get DOM from the source Layout
sourceLayoutDOM = app.activeLayoutDOM();
//get the layer name to be copied
var userLayerName = getValidLayerName(sourceLayoutDOM);
if(userLayerName != null)
{
//copy the layer contents to new layout
copyLayerToNewLayout(userLayerName);
}
}
/*======================Functions used in the JavaScript=============================*/
//get valid layer name input
function getValidLayerName(sourceLayoutDOM){
var flag=0;
while(flag ==0)
{
var strPromptLayerName = "Which layer do you want to copy? (Cancel to Exit) \r\n" ;
//Append the prompt with names of available Layers
strPromptLayerName += getLayerNamesAsString(sourceLayoutDOM);
//set "Default" as default layer name
var userLayerName = "Default";
//Prompt with Default value
userLayerName = prompt(strPromptLayerName, userLayerName);
if(userLayerName == null)
return null;
else
{
userLayerName = userLayerName.trim();
if (!userLayerName)
{
console.log("Invalid Layer name: '" + userLayerName + "'");
}
else
{
var sourceLayerNode = getLayerWithName(sourceLayoutDOM, userLayerName);
//Check if the user Layer Exists
if(null == sourceLayerNode)
{
alert("Layer '" + userLayerName + "' does not exist!");
}
else
{
console.log("Layer " + userLayerName + " EXISTS!");
return userLayerName;
}
}
}
}
}
//gets the names as strings of layers present on the layout
function getLayerNamesAsString(layoutDOM)
{
//Get all the Layers
var currentLayoutLayers = layoutDOM.getElementsByTagName("qx-layer");
if(null == currentLayoutLayers)
{
return ""; //Blank String
}
else
{
var arrLayersNames = new Array();
//Get the Layers Name in an Array
for (var i = 0; i < currentLayoutLayers.length; i++){
arrLayersNames.push(currentLayoutLayers[i].getAttribute("layer-name"));
}
return arrLayersNames.join(", "); //Comma Separated List of Items
}
}
//copies the layer and constituents to new layout
function copyLayerToNewLayout(userLayerName)
{
//Query all boxes on selected layer
var strSelectorQuery = "qx-box[style*='--qx-layer-name:" + userLayerName + "']"
var boxesOnSourceLayer = sourceLayoutDOM.querySelectorAll(strSelectorQuery);
//check if some boxes exist on layer entered
if( (null == boxesOnSourceLayer) || (boxesOnSourceLayer.length <=0) )
{
alert("No boxes found on layer " + userLayerName);
}
else
{
console.log(boxesOnSourceLayer.length + " boxes found on layer " + userLayerName);
//Create a new Layout
var srcLayout= app.activeLayout();
var duplicatedLayout= srcLayout.duplicate();
//Get DOM from the target Layout
targetLayoutDOM = duplicatedLayout.getDOM();
//get all boxes on the target DOM
var allboxes= targetLayoutDOM.getElementsByTagName("qx-box");
//get all layers on the target DOM
var alllayers= targetLayoutDOM.getElementsByTagName("qx-layer");
//delete the boxes that are not on layer required
var boxestoDelete=[];
for(var i=0; i< allboxes.length; i++)
{
if(allboxes[i].style.qxLayerName.toLowerCase() != userLayerName.toLowerCase())
boxestoDelete.push(allboxes[i]);
}
var layerstoDelete= [];
for(var i=0; i< alllayers.length; i++)
{
if(alllayers[i].getAttribute("layer-name") != userLayerName)
layerstoDelete.push(alllayers[i]);
}
deleteEntries(boxestoDelete);
deleteEntries(layerstoDelete);
}
}
function deleteEntries(arr){
var i=0;
while(arr[i] != null)// to traverse through all the entities of array
{
arr[i].remove();
i++;
}
}
function getLayerWithName(layoutDOM, layerName)
{
//Return first element of the query selector results [Since there can only be one layer with a unique name
return layoutDOM.querySelectorAll("qx-layer[layer-name='" + layerName + "'")[0];
}