Skip to content

Commit c4f5568

Browse files
author
silinmykola
committed
966 add context action to create layout xml file
1 parent e4be0b9 commit c4f5568

File tree

15 files changed

+708
-28
lines changed

15 files changed

+708
-28
lines changed

resources/META-INF/plugin.xml

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<action id="MagentoCreateViewFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewViewXmlAction"/>
7676
<action id="MagentoCreateWebapiFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewWebapiXmlAction"/>
7777
<action id="MagentoCreateWidgetFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewWidgetXmlAction"/>
78+
<action id="MagentoCreateLayoutFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewLayoutXmlAction"/>
7879
<!-- Context dependent actions -->
7980
<separator/>
8081
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewXml"/>
@@ -578,16 +579,6 @@
578579
<internalFileTemplate name="Magento Entity Delete Controller Class"/>
579580
<internalFileTemplate name="Magento Web API XML"/>
580581
<internalFileTemplate name="Web API Interface"/>
581-
<internalFileTemplate name="Magento Config XML"/>
582-
<internalFileTemplate name="Magento Extension Attributes XML"/>
583-
<internalFileTemplate name="Magento Widget XML"/>
584-
<internalFileTemplate name="Magento Mview XML"/>
585-
<internalFileTemplate name="Magento Indexer XML"/>
586-
<internalFileTemplate name="Magento View XML"/>
587-
<internalFileTemplate name="Magento Fieldset XML"/>
588-
<internalFileTemplate name="Magento Sections XML"/>
589-
<internalFileTemplate name="Magento Module Email Templates Xml"/>
590-
<internalFileTemplate name="Magento Page Types XML"/>
591582

592583
<defaultLiveTemplates file="/liveTemplates/MagentoPWA.xml"/>
593584

resources/magento2/common.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,5 @@ common.template.type=Email Type
7272
common.diagnostic.reportButtonText=Report Me
7373
common.diagnostic.reportSubmittedTitle=The report is successfully submitted!
7474
common.diagnostic.reportSubmittedMessage=Thank you for submitting your report! We will check it as soon as possible.
75+
common.layout.filename=Layout File Name
7576
common.targetMethod=Target Method

resources/magento2/validation.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ validator.lowerSnakeCase=The {0} field must be of the lower snake case format
4141
validator.menuIdentifierInvalid=The menu identifier is invalid
4242
validator.someFieldsHaveErrors=Please, check the dialog. Some fields have errors
4343
validator.dbSchema.invalidColumnType=Invalid ''{0}'' column type specified
44+
validator.layoutNameRuleInvalid=The layout name is invalid
45+
validator.layoutNameUnderscoreQtyInvalid=Wrong layout name, please check
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.context.xml;
7+
8+
import com.intellij.ide.fileTemplates.actions.AttributesDefaults;
9+
import com.intellij.openapi.actionSystem.AnAction;
10+
import com.intellij.openapi.actionSystem.AnActionEvent;
11+
import com.intellij.openapi.actionSystem.DataContext;
12+
import com.intellij.openapi.actionSystem.LangDataKeys;
13+
import com.intellij.openapi.project.Project;
14+
import com.intellij.psi.PsiDirectory;
15+
import com.intellij.psi.PsiElement;
16+
import com.intellij.psi.PsiFile;
17+
import com.magento.idea.magento2plugin.MagentoIcons;
18+
import com.magento.idea.magento2plugin.actions.generation.dialog.NewLayoutTemplateDialog;
19+
import com.magento.idea.magento2plugin.magento.packages.Areas;
20+
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
21+
import com.magento.idea.magento2plugin.magento.packages.Package;
22+
import com.magento.idea.magento2plugin.project.Settings;
23+
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
24+
import java.util.Arrays;
25+
import java.util.List;
26+
import org.jetbrains.annotations.NotNull;
27+
28+
public class NewLayoutXmlAction extends AnAction {
29+
30+
public static final String ACTION_NAME = "Magento 2 Layout File";
31+
public static final String ACTION_DESCRIPTION = "Create a new Magento 2 layout.xml file";
32+
private PsiDirectory targetDirectory;
33+
34+
/**
35+
* New layout.xml file generation action constructor.
36+
*/
37+
public NewLayoutXmlAction() {
38+
super(ACTION_NAME, ACTION_DESCRIPTION, MagentoIcons.MODULE);
39+
}
40+
41+
@Override
42+
public void update(final @NotNull AnActionEvent event) {
43+
setIsAvailableForEvent(event, false);
44+
final Project project = event.getProject();
45+
46+
if (project == null || !Settings.isEnabled(project)) {
47+
return;
48+
}
49+
final DataContext context = event.getDataContext();
50+
final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(context);
51+
52+
if (!(targetElement instanceof PsiDirectory)) {
53+
return;
54+
}
55+
final PsiDirectory targetDirectoryCandidate = (PsiDirectory) targetElement;
56+
final GetMagentoModuleUtil.MagentoModuleData moduleData = GetMagentoModuleUtil
57+
.getByContext(targetDirectoryCandidate, project);
58+
59+
if (moduleData == null) {
60+
return;
61+
}
62+
final PsiDirectory viewDir = moduleData.getViewDir();
63+
64+
if (viewDir == null) {
65+
return;
66+
}
67+
final List<String> allowedDirectories = Arrays.asList(
68+
Package.moduleViewDir,
69+
Areas.adminhtml.toString(),
70+
Areas.frontend.toString()
71+
);
72+
if (!allowedDirectories.contains(targetDirectoryCandidate.getName())
73+
|| !moduleData.getType().equals(ComponentType.module)) {
74+
return;
75+
}
76+
final PsiDirectory parentDir = targetDirectoryCandidate.getParentDirectory();
77+
78+
if (parentDir == null
79+
|| !targetDirectoryCandidate.equals(viewDir) && !parentDir.equals(viewDir)) {
80+
return;
81+
}
82+
targetDirectory = targetDirectoryCandidate;
83+
setIsAvailableForEvent(event, true);
84+
}
85+
86+
@Override
87+
public void actionPerformed(final @NotNull AnActionEvent event) {
88+
if (event.getProject() == null || targetDirectory == null) {
89+
return;
90+
}
91+
92+
NewLayoutTemplateDialog.open(event.getProject(), targetDirectory);
93+
}
94+
95+
/**
96+
* Set is action available for event.
97+
*
98+
* @param event AnActionEvent
99+
* @param isAvailable boolean
100+
*/
101+
private void setIsAvailableForEvent(
102+
final @NotNull AnActionEvent event,
103+
final boolean isAvailable
104+
) {
105+
event.getPresentation().setVisible(isAvailable);
106+
event.getPresentation().setEnabled(isAvailable);
107+
}
108+
109+
protected AttributesDefaults getProperties(
110+
final @NotNull AttributesDefaults defaults,
111+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
112+
final PsiDirectory targetDirectory,
113+
final PsiFile targetFile
114+
) {
115+
return null;
116+
}
117+
}

src/com/magento/idea/magento2plugin/actions/generation/data/LayoutXmlData.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,30 @@ public LayoutXmlData(
3939
this.uiComponentName = uiComponentName;
4040
}
4141

42+
/**
43+
* Layout XML data.
44+
*
45+
* @param area String
46+
* @param route String
47+
* @param moduleName String
48+
* @param controllerName String
49+
* @param actionName String
50+
*/
51+
public LayoutXmlData(
52+
final String area,
53+
final String route,
54+
final String moduleName,
55+
final String controllerName,
56+
final String actionName
57+
) {
58+
this.area = area;
59+
this.route = route;
60+
this.moduleName = moduleName;
61+
this.controllerName = controllerName;
62+
this.actionName = actionName;
63+
this.uiComponentName = "";
64+
}
65+
4266
public String getArea() {
4367
return area;
4468
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.magento.idea.magento2plugin.actions.generation.dialog.NewLayoutTemplateDialog">
3+
<grid id="7afc" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
4+
<margin top="10" left="10" bottom="10" right="10"/>
5+
<constraints>
6+
<xy x="136" y="92" width="545" height="340"/>
7+
</constraints>
8+
<properties>
9+
<preferredSize width="360" height="170"/>
10+
</properties>
11+
<border type="none"/>
12+
<children>
13+
<grid id="72800" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
14+
<margin top="0" left="0" bottom="0" right="0"/>
15+
<constraints>
16+
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
17+
</constraints>
18+
<properties/>
19+
<border type="none"/>
20+
<children>
21+
<hspacer id="9d205">
22+
<constraints>
23+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
24+
</constraints>
25+
</hspacer>
26+
<grid id="f08e3" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="true" same-size-vertically="false" hgap="-1" vgap="-1">
27+
<margin top="0" left="0" bottom="0" right="0"/>
28+
<constraints>
29+
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
30+
</constraints>
31+
<properties/>
32+
<border type="none"/>
33+
<children>
34+
<component id="4f53d" class="javax.swing.JButton" binding="buttonOK">
35+
<constraints>
36+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
37+
</constraints>
38+
<properties>
39+
<text value="OK"/>
40+
</properties>
41+
</component>
42+
<component id="80459" class="javax.swing.JButton" binding="buttonCancel">
43+
<constraints>
44+
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
45+
</constraints>
46+
<properties>
47+
<text value="Cancel"/>
48+
</properties>
49+
</component>
50+
</children>
51+
</grid>
52+
</children>
53+
</grid>
54+
<grid id="c5548" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
55+
<margin top="0" left="0" bottom="0" right="0"/>
56+
<constraints>
57+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
58+
</constraints>
59+
<properties/>
60+
<border type="none"/>
61+
<children>
62+
<vspacer id="668b9">
63+
<constraints>
64+
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
65+
</constraints>
66+
</vspacer>
67+
<component id="89b74" class="javax.swing.JComboBox" binding="area" custom-create="true">
68+
<constraints>
69+
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
70+
</constraints>
71+
<properties/>
72+
</component>
73+
<component id="765fc" class="javax.swing.JLabel" binding="areaLabel">
74+
<constraints>
75+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
76+
</constraints>
77+
<properties>
78+
<text value="Layout Area"/>
79+
</properties>
80+
</component>
81+
<component id="ccfdf" class="javax.swing.JTextField" binding="layoutName">
82+
<constraints>
83+
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
84+
<preferred-size width="150" height="-1"/>
85+
</grid>
86+
</constraints>
87+
<properties/>
88+
<clientProperties>
89+
<promptText class="java.lang.String" value="routeId_controller_action"/>
90+
</clientProperties>
91+
</component>
92+
<component id="4cd93" class="javax.swing.JLabel" binding="layoutNameLabel">
93+
<constraints>
94+
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
95+
</constraints>
96+
<properties>
97+
<labelFor value="ccfdf"/>
98+
<text value="Layout Name"/>
99+
</properties>
100+
</component>
101+
<component id="6cf67" class="javax.swing.JLabel" binding="layoutNameErrorMessage">
102+
<constraints>
103+
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
104+
</constraints>
105+
<properties>
106+
<text value=""/>
107+
</properties>
108+
</component>
109+
</children>
110+
</grid>
111+
</children>
112+
</grid>
113+
</form>

0 commit comments

Comments
 (0)