feat: implement project-level XSD registration and refactor base package

- Schema Validation (XSD):
  - Added new configuration UI for DynamicForm Tools to manage XSD schemas.
  - Implemented DynFormXsdScanner to automatically map local .xsd files to the ExternalResourceManager using a custom URI prefix.
  - Ensured XSD registration is properly scoped at the Project-level (rather than Application-level) using write-actions to comply with IDE threading policies.

- Architecture & Refactoring:
  - Renamed base package from com.sdk.dynformTools to com.sdk.dynform across the entire project for structural consistency.
  - Converted Application-level settings/configurables to Project-level services.
  - Extracted and restored complex I18n folding and inlay hint logic that was previously overwritten, adapting it to use the new Project-level settings.

- UI & Metadata:
  - Bumped plugin version to 3.2.0.
  - Rebranded settings page to "DynamicForm Tools".
  - Organized settings into logical "Internationalization" and "Schema Validation" groups.
This commit is contained in:
2026-04-10 22:51:47 +07:00
parent c76ca9a293
commit 660c7a058c
22 changed files with 2094 additions and 179 deletions

View File

@@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="ApplicationType"/>
<xs:simpleType name="YesNoType">
<xs:restriction base="xs:string">
<xs:enumeration value="Y"/>
<xs:enumeration value="N"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="LocaleType">
<xs:restriction base="xs:string">
<xs:enumeration value="th"/>
<xs:enumeration value="en"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FormReloadType">
<xs:restriction base="xs:string">
<xs:enumeration value="AUTO"/>
<xs:enumeration value="FORCE"/>
<xs:enumeration value="OFF"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DBProviderType">
<xs:restriction base="xs:string">
<xs:enumeration value="ORACLE"/>
<xs:enumeration value="MYSQL"/>
<xs:enumeration value="MSSQL"/>
<xs:enumeration value="PGSQL"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="OracleConnectionMode">
<xs:restriction base="xs:string">
<xs:enumeration value="DIRECT"/>
<xs:enumeration value="TNS-STRING"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DBTimeZoneType">
<xs:restriction base="xs:string">
<xs:enumeration value="UTC"/>
<xs:enumeration value="Asia/Bangkok"/>
<xs:enumeration value="+1"/>
<xs:enumeration value="+2"/>
<xs:enumeration value="+3"/>
<xs:enumeration value="+4"/>
<xs:enumeration value="+5"/>
<xs:enumeration value="+6"/>
<xs:enumeration value="+7"/>
<xs:enumeration value="+8"/>
<xs:enumeration value="+9"/>
<xs:enumeration value="+10"/>
<xs:enumeration value="+11"/>
<xs:enumeration value="+12"/>
<xs:enumeration value="-1"/>
<xs:enumeration value="-2"/>
<xs:enumeration value="-3"/>
<xs:enumeration value="-4"/>
<xs:enumeration value="-5"/>
<xs:enumeration value="-6"/>
<xs:enumeration value="-7"/>
<xs:enumeration value="-8"/>
<xs:enumeration value="-9"/>
<xs:enumeration value="-10"/>
<xs:enumeration value="-11"/>
<xs:enumeration value="-12"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ConfigType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name"/>
<xs:attribute type="xs:string" name="Title"/>
<xs:attribute type="YesNoType" name="DevMode"/>
<xs:attribute type="xs:anyURI" name="RootUrl"/>
<xs:attribute type="xs:string" name="TokenKey"/>
<xs:attribute type="xs:string" name="SignOnPage"/>
<xs:attribute type="xs:string" name="LandingPage"/>
<xs:attribute type="FormReloadType" name="FormReload"/>
<xs:attribute type="LocaleType" name="DefaultLocale"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="ModuleType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" use="optional"/>
<xs:attribute type="YesNoType" name="NeedAuthen" use="optional"/>
<xs:attribute type="xs:string" name="Renderer" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="ModulesType">
<xs:sequence>
<xs:element type="ModuleType" name="Module" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ConnectorType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" use="required"/>
<xs:attribute type="xs:string" name="Schema" use="required"/>
<xs:attribute type="YesNoType" name="UsePools"/>
<xs:attribute type="xs:byte" name="Size"/>
<xs:attribute type="xs:byte" name="Preserv"/>
<xs:attribute type="xs:byte" name="Timeout"/>
<xs:attribute type="YesNoType" name="SendHeartBeat"/>
<xs:attribute type="xs:string" name="Username"/>
<xs:attribute type="xs:string" name="Password"/>
<xs:attribute type="YesNoType" name="Debug"/>
<xs:attribute type="YesNoType" name="PoolDebug"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DatabaseType">
<xs:sequence>
<xs:element type="xs:string" name="TNS-String" minOccurs="0"/>
<xs:element type="ConnectorType" name="Connector" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute type="xs:string" name="Name"/>
<xs:attribute type="xs:string" name="Server"/>
<xs:attribute type="DBTimeZoneType" name="TimeZone"/>
<xs:attribute type="DBProviderType" name="Provider"/>
<xs:attribute type="OracleConnectionMode" name="Mode"/>
<xs:attribute type="xs:string" name="Database"/>
<xs:attribute type="xs:short" name="Port"/>
<xs:attribute type="xs:string" name="Username"/>
<xs:attribute type="xs:string" name="Password"/>
</xs:complexType>
<xs:complexType name="DatabasesType">
<xs:sequence>
<xs:element type="DatabaseType" name="Database" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ParameterType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="APIType">
<xs:sequence>
<xs:element type="ParameterType" name="Parameter" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="Name" use="optional"/>
</xs:complexType>
<xs:complexType name="APISType">
<xs:sequence>
<xs:element type="APIType" name="API" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="UploadFileType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" use="required"/>
<xs:attribute type="xs:string" name="Path" use="required"/>
<xs:attribute type="xs:string" name="MaxPixel" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="UploadsType">
<xs:sequence>
<xs:element type="UploadFileType" name="FileType" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ApplicationType">
<xs:sequence >
<xs:element type="ConfigType" name="Config"/>
<xs:element type="ModulesType" name="Modules"/>
<xs:element type="DatabasesType" name="Databases"/>
<xs:element type="UploadsType" name="Uploads"/>
<xs:element type="APISType" name="APIs"/>
</xs:sequence>
</xs:complexType>
</xs:schema>